Skip to content

Streaming With Stream Worker

Problem

Worker output arrives incrementally and should not be buffered as one final result.

Solution

Register exposeStream() and consume createStreamWorker().runStream().

ts
// progress.worker.ts
import { exposeStream } from '@vielzeug/familiar/protocol';

exposeStream(async function* (count: number) {
  for (let value = 0; value < count; value++) yield value;
});
ts
import { createStreamWorker } from '@vielzeug/familiar';

const pool = createStreamWorker<number, number>(new URL('./progress.worker.ts', import.meta.url));

for await (const value of pool.runStream(3)) {
  console.log(value);
}
pool.dispose();

Pitfalls

  • Stream pools expose only stream work; use createWorker() for single-result tasks.
  • Abort signal cancellation stops queued, waiting, and active streams.