Files
pubsub/tasks/012-worker-adapter-implementation.md
glm-5.1 1306716897 Decompose architecture into atomic, dependency-ordered tasks
19 tasks covering core testing, Redis hardening, WebSocket client/server
adapters, Worker adapter, and final review gates. Iroh adapters are tracked
as a deferred placeholder blocked on the @alkdev/iroh fork.

Phases: core validation → Redis hardening → review gate → WebSocket
adapters → review gate → Worker adapter → review gate → final validation.
2026-05-08 05:50:43 +00:00

57 lines
2.5 KiB
Markdown

---
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<TEvent>` — wraps a Worker instance on the main thread side
- `createWorkerThreadEventTarget(): TypedEventTarget<TEvent>` — 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