阅读字节流的前n个字节(以AsyncIterable的形式)感觉很麻烦并且容易出错。
有没有更好的方法来实现这一点?
async function shift(
length: number,
stream: AsyncIterable<Uint8Array>
): Promise<[Uint8Array, AsyncIterable<Uint8Array>]> {
const prefix = new Uint8Array(length);
let offset = 0;
const iterator = stream[Symbol.asyncIterator]();
while (true) {
const { done, value } = await iterator.next();
if (done) {
throw new Error("Buffer underflow");
} else {
const chunk = value;
if (chunk.length < length - offset) {
prefix.set(chunk, offset);
offset += chunk.length;
} else {
const slice = chunk.slice(0, length - offset);
prefix.set(slice, offset);
return [prefix, prepend(chunk.slice(slice.length), stream)];
}
}
}
}
async function* prepend(
prefix: Uint8Array,
stream: AsyncIterable<Uint8Array>
) {
yield prefix;
yield* stream;
}
2条答案
按热度按时间vlju58qv1#
流原语
我们将从定义流原语开始-
班次
使用这些流原语,我们可以以一种舒适安全的方式编写
shift
-让我们创建一个mock
buffer
并测试它-demo
在typescript playground上运行并验证结果
tag5nh1u2#
我认为迭代器逻辑本身可以通过使用
notClosing
助手和普通迭代来简化:除非您想将流从块的迭代器转换为单个字节的效率低得多的迭代器,否则您无法进一步简化
offset
逻辑。