获取部分ReadableStream

时间:2020-05-25 22:54:11

标签: javascript stream web-standards

我想在给定ReadableStream的情况下返回特定的字节范围。听起来很简单,但由于只能读取块,因此我找不到任何方法可以跳过或读取流中特定数量的字节。我希望不存储任何数据,而只是发送流。 听起来我可以使用TransformStream和PipeThrough()做到这一点。但是我需要一些帮助来解决问题。

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

我知道可以使用节点createReadableStream()轻松完成此操作,但是我需要在浏览器中运行它,以使其无法使用节点。

1 个答案:

答案 0 :(得分:0)

下面是一些入门的基本代码:

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));