获取 ReadableStream 的部分范围

Get partial range of ReadableStream

我想 return 给定 ReadableStream 的特定字节范围。这听起来很简单,但我找不到任何方法来跳过或从流中读取特定数量的字节,因为我们只能读取块。我宁愿不存储任何数据而只发送流。 听起来我可以用 TransformStream 和 PipeThrough() 来做到这一点。但我需要一些帮助来解决这个问题。

示例:给定 1000 字节的 ReadableStream,我想 return 另一个从字节 300 开始到字节 900 结束的流。

我知道这可以通过节点 createReadableStream() 轻松完成,但我需要 运行 在浏览器中这样做,所以它不能使用节点。

这里有一些框架代码可以帮助您入门:

function byteRangeTransform(start, end) {
  let bytesSeen = 0;
  return new TransformStream({
    transform(chunk, controller) {
      const chunkStart = bytesSeen;
      const chunkEnd = bytesSeen + chunk.byteLength;
      bytesSeen += chunk.byteLength;
      
      // Six cases:

      // 1. Chunk entirely before start
      if (chunkEnd < start) {
        return;
      }
      
      // 2. Chunk starts before start, ends between start and end
      if (chunkStart < start && chunkEnd >= start && chunkEnd <= end) {
        const slice = /* TODO */;
        controller.enqueue(slice);
        return;
      }
      
      // 3. Chunk starts before start, ends after end
      if (chunkStart < start && chunkEnd > end) {
        // TODO
      }

      // 4. Chunk starts after start, ends between start and end
      // 5. Chunk starts after start, ends after end
      // 6. Chunk starts after end
    }
  });
}

const onlyInRange = originalReadable.pipeThrough(byteRangeTransform(300, 900));