--- id: worker-adapter-implementation name: Implement Worker event target adapter(s) status: pending depends_on: [worker-adapter-rd, review-websocket-adapters] scope: moderate risk: medium impact: component level: implementation --- ## Description Implement the Worker event target adapter(s) based on the outcome of `worker-adapter-rd`. The architecture specifies two factory functions: - `createWorkerHostEventTarget(worker: Worker): TypedEventTarget` — wraps a Worker instance on the main thread side - `createWorkerThreadEventTarget(): TypedEventTarget` — wraps parent message port on the worker thread side The naming convention: `Host` is the side that owns the `Worker` object, `Thread` is the side that runs inside the worker. Key requirements from architecture: - Bidirectional — both sides can publish and subscribe - Per-worker — each worker gets its own event target on the main thread - Messages use `EventEnvelope` format over `postMessage` - Structured clone for serialization (but `EventEnvelope` is JSON-serializable for cross-platform) - No native deps — works in any environment with Worker support - `createWorkerHostEventTarget` wraps a `Worker` instance - `createWorkerThreadEventTarget` wraps `self.onmessage`/`self.postMessage` (Web) or `parentPort` (Node) The scope depends on `worker-adapter-rd` outcome. At minimum, implement Web Worker support. ## Acceptance Criteria - [ ] `src/event-target-worker.ts` (or split files) exists - [ ] `createWorkerHostEventTarget(worker)` creates event target for main thread side - [ ] `createWorkerThreadEventTarget()` creates event target for worker thread side - [ ] `dispatchEvent` on host side calls `worker.postMessage(event.detail)` - [ ] `dispatchEvent` on thread side calls `globalThis.postMessage(event.detail)` (Web) or `parentPort.postMessage(event.detail)` (Node, if supported) - [ ] Receiving on host side: `worker.onmessage` parses envelope, creates `CustomEvent` with `type:id` - [ ] Receiving on thread side: `globalThis.onmessage` (or `parentPort.on('message')`) parses envelope, creates `CustomEvent` - [ ] Both sides support `addEventListener` and `removeEventListener` - [ ] No comments in source code (project convention) - [ ] Sub-path export added to `package.json` and `tsup.config.ts` - [ ] Barrel re-export added to `src/index.ts` ## References - docs/architecture/event-targets/worker.md - src/types.ts ## Notes > To be filled by implementation agent ## Summary > To be filled on completion