我想使用ion-js,但它是字符串或 ArrayBuffers 上的同步库,而不是 Stream 或 ReadableStream。
我想使用 worker_threads、SharedArrayBuffer 和 Atomics 来创建一个填充在后台线程中并阻塞等待字节的 ArrayBuffer。
class BlockingArrayBuffer implements ArrayBuffer {
constructor(
private readonly dataBuffer: Uint8Array,
private readonly availableBytes: Int32Array,
) { }
get byteLength(): number {
return this.dataBuffer.byteLength;
}
slice(begin: number, end: number = this.byteLength): ArrayBuffer {
// calls Atomics.wait till availableBytes is greater than begin and end.
this.blockTillAvailable(Math.max(begin, end));
return this.dataBuffer.slice(begin, end);
}
}
有一个未显示的工作线程读取流并更新支持 dataBuffer 和 availableBytes 的两个共享数组缓冲区。
当我直接调用 slice 时,这实际上有效。
const {dataBuffer, availableBytes} = await makeWorker();
const blocking = new BlockingArrayBuffer(dataBuffer, availableBytes);
blocking.slice(0, 10); // completes quickly.
blocking.slice(0); // blocks till buffer is full.
但是,当我用类型化数组包装阻塞数组时它不起作用
console.log(blocking.slice(0)); // prints filled array
console.log(new Uint8Array(blocking).slice(0)); // Uint8Array(0) []