docs: protected void handlePacket(IncomingPacket incomingPacket) {
      String typeName = incomingPacket.unpackString();
      REQID rid = incomingPacket.unpackREQID();
      if (contextMap.containsKey(rid)) {
        // This incomingPacket contains the response of Request
        Object ctx = contextMap.get(rid);
        Message.Builder bldr = responseMessageMap.get(rid);
        contextMap.remove(rid);
        responseMessageMap.remove(rid);
        incomingPacket.unpackMessage(bldr);
        // Call onResponse to handle it
        if (bldr.isInitialized()) {
          Message response = bldr.build();
          onResponse(StatusCode.OK, ctx, response);
          return;
        } else {
          onResponse(StatusCode.INVALID_PACKET, ctx, null);
          return;
        }
      } else if (rid.equals(REQID.zeroREQID)) {
        // If rid is REQID.zeroREQID, this is a Message, e.g. no need send back response.
        // Convert it into message and call onIncomingMessage() to handle it
        Message.Builder bldr = messageMap.get(typeName);
        if (bldr != null) {
          bldr.clear();
          incomingPacket.unpackMessage(bldr);
          if (bldr.isInitialized()) {
            onIncomingMessage(bldr.build());
          } else {
            // We just need to log here
            // TODO:- log
          }
        } else {
          // We got a message but we didn't register
          // TODO:- log here
        }
      } else {
        // This might be a timeout response
        // TODO:- log here
      }
    }