code: public synchronized NavigableMap<Short, T> receive(Packet<T> packet) {
          receivedDatas.clear();
  
          controller.consume(packet);
          Metadata<T> metadata = controller.receive(packet);
          while (metadata != null) {
              receivedDatas.put(metadata.getDataId(), controller.consume(metadata));
              metadata = controller.receive(packet);
          }
  
          return receivedDatasOut;
      }
docs: Unpackage the packaged user-data, in order to retrieve the user-data that was received, acknowledge sent data and
  receive retransmitted data (if {@link ProtocolConfig#setShouldRetransmit(boolean) retransmission is enabled}).
  <br>
  Zero or more {@link ProtocolListener#handleOrderedData(short, Object) orderedData},
  {@link ProtocolListener#handleUnorderedData(short, Object) unorderedData} or
  {@link ProtocolListener#handleAckedData(short, Object) ackedData} events may be fired before this method returns.
  
  @param packet the packaged-user data to unpackage
  @return a <code>NavigableMap</code> containing all received (directly received or received by retransmission)
  user-datas and their assigned <code>dataId</code>s;
  the returned object should not be saved by the user,
  as its contents are invalidated next time one of the <code>receive</code> methods is called