docs: void getBytes(byte[] output) {
          if (m_totalAvailable < output.length) {
              throw new IllegalStateException("Requested " + output.length + " bytes; only have "
                      + m_totalAvailable + " bytes; call tryRead() first");
          }
  
          int bytesCopied = 0;
          while (bytesCopied < output.length) {
              BBContainer firstC = m_readBBContainers.peekFirst();
              if (firstC == null) {
                  // Steal the write buffer
                  m_poolBBContainer.b().flip();
                  m_readBBContainers.add(m_poolBBContainer);
                  firstC = m_poolBBContainer;
                  m_poolBBContainer = null;
              }
              ByteBuffer first = firstC.b();
              assert first.remaining() > 0;
  
              // Copy bytes from first into output
              int bytesRemaining = first.remaining();
              int bytesToCopy = output.length - bytesCopied;
              if (bytesToCopy > bytesRemaining) bytesToCopy = bytesRemaining;
              first.get(output, bytesCopied, bytesToCopy);
              bytesCopied += bytesToCopy;
              m_totalAvailable -= bytesToCopy;
  
              if (first.remaining() == 0) {
                  // read an entire block: move it to the empty buffers list
                  m_readBBContainers.poll();
                  firstC.discard();
              }
          }
      }