@bimetal/broker-worker
v0.37.0
Published
Web Worker / MessagePort adapter for @bimetal/broker — main↔worker pub/sub. Zero external dependencies.
Maintainers
Readme
@bimetal/broker-worker
Web Worker / MessagePort adapter for @bimetal/broker — main↔worker pub/sub. Bridge a worker (or any two MessagePort ends) into one broker bus. Zero external dependencies; a thin wrapper over createPortBroker.
Installation
npm install @bimetal/broker-worker @bimetal/brokerUsage
// main thread
import { createWorkerBroker } from '@bimetal/broker-worker';
const worker = new Worker(new URL('./worker.ts', import.meta.url), { type: 'module' });
const broker = createWorkerBroker({ port: worker });
broker.subscribe('worker.progress', (msg) => { ... });
await broker.publish('job.start', { id: 1 });// inside worker.ts
import { createWorkerBroker } from '@bimetal/broker-worker';
const broker = createWorkerBroker({ port: self });
broker.subscribe('job.start', async (job) => {
await broker.publish('worker.progress', { id: job.id, pct: 50 });
});What's Inside
createWorkerBroker(options)→ a fullBroker<TMessage>(plusclose()/flush()).port— aWorker(main side), aMessagePort(from aMessageChannel), orself(inside a dedicated worker).onError?— handler-error sink (defaultconsole.error).
WorkerBrokerOptions,WorkerBroker<TMessage>,WorkerEndpointLike
Adapter properties
- Capabilities:
{ patterns: true, replay: false, ordering: 'per-topic' }. A single pipe is FIFO, so messages keep their order; pattern routing (*/#) is done locally on the receiving side. - Local + remote in one publish. A Worker/MessagePort never echoes to its own sender, so the relay fans a publish out to local subscribers AND posts across the pipe — both sides hear it, exactly once.
- Lifecycle is the host's.
close()only detaches the message listener; it does not terminate the Worker or close the MessagePort. Terminate/close the endpoint yourself. - Structured clone. Messages must be structured-cloneable. Foreign (non-broker) traffic on the port is ignored.
License
Apache License 2.0
