docs: public H2StreamProcessor createNewInboundLink(Integer streamID) {
          if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled()) {
              Tr.debug(tc, "createNewInboundLink entry: stream-id: " + streamID);
          }
          if ((streamID % 2 == 0) && (streamID != 0)) {
              synchronized (streamOpenCloseSync) {
                  int maxPushStreams = getRemoteConnectionSettings().getMaxConcurrentStreams();
                  // if there are too many locally-open active streams, don't open a new one
                  if (maxPushStreams >= 0 && openPushStreams > maxPushStreams) {
                      if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled()) {
                          Tr.debug(tc, "createNewInboundLink cannot open a new push stream; maximum number of open push streams reached" + openPushStreams);
                      }
                      return null;
                  }
                  openPushStreams++;
  
              }
          }
          H2VirtualConnectionImpl h2VC = new H2VirtualConnectionImpl(initialVC);
          // remove the HttpDispatcherLink from the map, so a new one will be created and used by this new H2 stream
          h2VC.getStateMap().remove(HttpDispatcherLink.LINK_ID);
          H2HttpInboundLinkWrap link = new H2HttpInboundLinkWrap(httpInboundChannel, h2VC, streamID, this);
          H2StreamProcessor stream = new H2StreamProcessor(streamID, link, this);
  
          // for now, assume parent stream ID is root, need to change soon
          writeQ.addNewNodeToQ(streamID, Node.ROOT_STREAM_ID, Node.DEFAULT_NODE_PRIORITY, false);
          streamTable.put(streamID, stream);
          if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled()) {
              Tr.debug(tc, "createNewInboundLink exit: returning stream: " + streamID + " " + stream);
          }
          return stream;
      }