提问人:emillime 提问时间:5/26/2020 更新时间:11/7/2022 访问量:660
获取 ReadableStream 的部分范围
Get partial range of ReadableStream
问:
我想返回给定 ReadableStream 的特定字节范围。这听起来很容易,但我找不到任何方法可以跳过或从流中读取特定数量的字节,因为我们只能读取块。我宁愿不存储任何数据,只发送流。 听起来我可以用 TransformStream 和 PipeThrough() 来做到这一点。但我需要一些帮助来解决这个问题。
示例:给定一个 1000 字节的 ReadableStream,我想返回另一个从字节 300 开始到字节 900 结束的流。
我知道这可以通过节点createReadableStream()轻松完成,但是我需要在浏览器中运行它,因此它不能使用node。
答:
2赞
Domenic
9/10/2020
#1
下面是一些入门的框架代码:
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));
0赞
Sơn Trần-Nguyễn
11/7/2022
#2
Deno 最近将这样的 TransformStream 添加到其库中:https://deno.land/[email protected]/streams/buffer.ts?source#L247std
class ByteSliceStream extends TransformStream<Uint8Array, Uint8Array> {
#offsetStart = 0;
#offsetEnd = 0;
constructor(start = 0, end = Infinity) {
super({
start: () => {
assert(start >= 0, "`start` must be greater than 0");
end += 1;
},
transform: (chunk, controller) => {
this.#offsetStart = this.#offsetEnd;
this.#offsetEnd += chunk.byteLength;
if (this.#offsetEnd > start) {
if (this.#offsetStart < start) {
chunk = chunk.slice(start - this.#offsetStart);
}
if (this.#offsetEnd >= end) {
chunk = chunk.slice(0, chunk.byteLength - this.#offsetEnd + end);
controller.enqueue(chunk);
controller.terminate();
} else {
controller.enqueue(chunk);
}
}
},
});
}
}
评论