@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/broker
Usage
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 });
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 full Broker<TMessage> (plus close()/flush()).
port — a Worker (main side), a MessagePort (from a MessageChannel), or self (inside a dedicated worker).
onError? — handler-error sink (default console.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