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.
57 lines
2.5 KiB
Markdown
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 |