5.8 KiB
5.8 KiB
Tasks: enterprise-browser-web-workers
Change ID: enterprise-browser-web-workers
Package: @suaveplan/web-workers
Target path: browser/platform/web-workers
Prerequisite packages on Verdaccio: @suaveplan/events, @suaveplan/error, @suaveplan/logger
0. Pre-flight (non-negotiable)
- 0.1 Confirm clean working tree (
git statusreports nothing) and no in-flight worktrees with uncommitted work (git worktree listthengit statusin each) - 0.2 If any worktrees exist under
.claude/worktrees/, account for each one: still-active agent, work-pending-merge, or stale-and-prune. Stale worktrees MUST be removed (git worktree remove) before opening a new one — code that has been lost twice on main is the failure mode this guards against. - 0.3 Confirm the package set in
MANIFEST.mdmatchesfind packages -maxdepth 3 -name package.jsoncount. Drift here means a prior change archived without regenerating the manifest.
1. Scaffold
- Create directory tree per
proposal.md. package.jsonv0.0.0,"sideEffects": false.dependencies:@suaveplan/events workspace:^,@suaveplan/error workspace:^,@suaveplan/types workspace:^,@suaveplan/logger workspace:^,@suaveplan/schema-registry workspace:^,zod catalog:forms,@opentelemetry/api catalog:observability,tslib catalog:builddevDependencies:vitest catalog:testing,@vitest/coverage-istanbul catalog:testing,happy-dom catalog:testing,@suaveplan/testing workspace:^- Subpath exports:
".","./worker-manager","./shared-worker-manager","./worker-pool","./message-bus","./helpers/vite-worker"
tsconfig.json,vitest.config.ts(pool: forks, happy-dom environment).
2. Error codes
WORKER_NOT_FOUND,WORKER_QUEUE_FULL,WORKER_REQUEST_TIMEOUT,WORKER_CIRCUIT_OPEN.registerWebWorkerErrorCodes()— call eagerly.
3. Types (src/types/web-workers.types.ts)
WorkerConfig,WorkerStatus,WorkerFactory,WorkerLike,WorkerMessage,WorkerPoolConfig,WorkerTask,PoolMetrics,MessageBusEventMap,WorkerManagerEventMap,RequestOptions,SharedWorkerFactory.- Write
web-workers.types.md.
4. BaseWorkerManager (src/core/base-manager/)
base-manager.ts— shared correlation-ID map, timeout logic, event emission,AbortSignalwiring.WorkerManagerandSharedWorkerManagerboth extend this.- Write
base-manager.md.
5. Circuit breaker (src/worker-manager/circuit-breaker/)
circuit-breaker.ts— state machine (closed → open → half-open); injectable clock;record(success),isOpen(),reset().- Write
circuit-breaker.test.ts(open on N failures, half-open after cooldown, reset on success). Writecircuit-breaker.md.
6. WorkerManager (src/worker-manager/worker-manager/)
worker-manager.ts— extendsBaseWorkerManager;create,postMessage(with transfer list),sendRequest(withAbortSignal+ backpressure ceiling),terminate,terminateAll,has,getStatus,getWorkerNames,onError.- Wire circuit breaker and OTel metrics.
- Wire
@suaveplan/eventsruntime emission. - Write
worker-manager.test.ts(create, postMessage, sendRequest, abort, backpressure, circuit open). Writeworker-manager.md.
7. SharedWorkerManager (src/shared-worker-manager/shared-worker-manager/)
shared-worker-manager.ts—new SharedWorker(url); oneMessagePortper named connection;connect,disconnect,sendRequest(AbortSignal).- Write
shared-worker-manager.test.ts(connect, message, disconnect). Writeshared-worker-manager.md.
8. WorkerPool (src/worker-pool/worker-pool/)
worker-pool.ts— FIFO task queue, round-robin dispatch,minIdle/maxIdle, health checks, per-task timeout, drain.getMetrics()returningPoolMetrics(size, idle, pending, completed, failed).- Write
worker-pool.test.ts(submit, saturation, backpressure, drain, health-check eviction). Writeworker-pool.md.
9. MessageBus (src/message-bus/message-bus/)
message-bus.ts— topic pub/sub,subscribeOnce,broadcast,request(AbortSignal),registerHandler, subscriber count, topic enumeration.- Wire
@suaveplan/eventsruntime emission viaMessageBusEventMap. - Write
message-bus.test.ts(subscribe, publish, request/response, abort, broadcast). Writemessage-bus.md.
10. Streaming RPC (src/streaming/stream/)
stream.ts—sendStream<T>(manager, name, type, payload): AsyncIterable<T>using correlation IDs andMessagePorttransfer.- Write
stream.test.ts. Writestream.md.
11. Vite worker helper (src/helpers/vite-worker/)
vite-worker.ts—defineWorker(url, options?)usingnew URL(url, import.meta.url); exports factory and type.- Write
vite-worker.test.ts. Writevite-worker.md.
12. Integration test (tests/integration.test.ts)
WorkerManager+MessageBustogether: publish from worker, subscribe in main.WorkerPoolsaturation test with 10 concurrent tasks andmaxIdle: 3.AbortSignalcancels in-flightsendRequest.- Transfer
ArrayBuffervia transfer list (verify zero-copy).
13. Docs + verify
- Write
.mdper module (≥200 words, API reference, examples). - Write
README.mdwith subpath table, pool guide, streaming RPC example, circuit-breaker reference. bunx turbo lint typecheck test --filter=@suaveplan/web-workers— green.bunx turbo test:coverage— 100%.- No
@ts-expect-errorinsrc/or tests. Novi.stubGlobal. SharedWorkerManagerandWorkerPoolfully implemented (no stubs).bun scripts/publish.ts --package @suaveplan/web-workers.- Archive to
openspec/archive/2026-04-24-enterprise-browser-web-workers/.