docs: void saveFrame(ByteBuf frame) {
      if (upstreamFrameRefCnt == 0) {
        upstreamFrameRefCnt = frame.refCnt();
      }
  
      int frameSize = frame.readableBytes();
      long availableSize = cacheLimit - cacheSize;
      while (availableSize < frameSize) {
        ByteBuf cachedFrame = cachedFrames.poll();
        if (cachedFrame != null) {
          availableSize += releaseTailFrame(cachedFrame);
        } else {
          break;
        }
      }
      if (availableSize >= frameSize) {
        cachedFrames.offer(frame.retain());
        cacheSize += frameSize;
      } else {
        position += frameSize;
      }
    }