I want to use ion-js but it a sync library over strings or ArrayBuffers, not a Stream or ReadableStream.
I thought to use worker_threads, SharedArrayBuffer, and Atomics to create a ArrayBuffer that is filled in a background thread and blocks waiting for bytes.
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);
  }
}
There's a worker thread not shown that reads the stream and updates the two shared array buffers backing dataBuffer and availableBytes.
This actually works when i call slice directly.
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.
However it doesn't work when I wrap the blocking array with a typed array
console.log(blocking.slice(0)); // prints  filled array
console.log(new Uint8Array(blocking).slice(0)); // Uint8Array(0) []