fix: add close() lifecycle methods to all adapters, fix WS client handler preservation, add Worker thread context guard
- Add close() to Redis, WS Client, WS Server, Worker Host, Worker Thread adapters for graceful teardown (cleanup subscriptions, restore handlers, clear maps) - WS Client now saves/restores original onmessage (consistent with WS Server) - WS Client dispatchEvent/addEventListener/removeEventListener are no-ops after close() - WS Server close() removes all connections and clears local listeners - Redis close() unsubscribes all channels and removes message listener - Worker Host/Thread close() restore original onmessage and clear callbacks - Worker Thread throws clear error if globalThis.postMessage is unavailable - Add double-call guard to WS Server removeConnection - Export new adapter interface types (RedisEventTarget, WebSocketClientEventTarget, etc.) - Add sideEffects: false to package.json for tree-shaking - Update architecture docs: lifecycle section, close() contract, adapter status updates - 22 new tests covering close(), handler restoration, idempotency, and context guard
This commit is contained in:
@@ -28,22 +28,25 @@ No logger dependency. No TypeBox dependency (call protocol and schemas moved to
|
||||
types.ts # TypedEvent, TypedEventTarget, EventEnvelope
|
||||
create_pubsub.ts # createPubSub factory (adapted from graphql-yoga)
|
||||
operators.ts # filter, map, pipe, take, reduce, toArray,
|
||||
# batch, dedupe, window, flat, groupBy, chain, join
|
||||
# batch, dedupe, window, flat, groupBy, chain, join
|
||||
repeater.ts # Inlined from @repeaterjs/repeater (MIT)
|
||||
event-target-redis.ts # createRedisEventTarget (peer dep: ioredis)
|
||||
# Future adapters (each is its own entry point + peer dep island):
|
||||
# event-target-websocket.ts # (peer dep: none, web standard)
|
||||
# event-target-worker.ts # (peer dep: none, web standard)
|
||||
event-target-websocket-client.ts # createWebSocketClientEventTarget
|
||||
event-target-websocket-server.ts # createWebSocketServerEventTarget, WebSocketLike, SpokeEventTarget
|
||||
event-target-worker.ts # createWorkerHostEventTarget, createWorkerThreadEventTarget
|
||||
# Future adapters:
|
||||
# event-target-iroh.ts # (peer dep: @rayhanadev/iroh)
|
||||
test/
|
||||
create_pubsub.test.ts
|
||||
operators.test.ts
|
||||
event-target-redis.test.ts
|
||||
# event-target-websocket.test.ts
|
||||
# event-target-worker.test.ts
|
||||
# event-target-iroh.test.ts
|
||||
event-target-websocket-client.test.ts
|
||||
event-target-websocket-server.test.ts
|
||||
event-target-worker.test.ts
|
||||
integration-pubsub-redis.test.ts
|
||||
integration-websocket.test.ts
|
||||
docs/
|
||||
architecture.md
|
||||
architecture/
|
||||
architecture/
|
||||
research/
|
||||
package.json
|
||||
@@ -61,7 +64,8 @@ We use explicit sub-path exports rather than barrel-only + tree-shaking. Each ad
|
||||
"exports": {
|
||||
".": { ... },
|
||||
"./event-target-redis": { ... },
|
||||
"./event-target-websocket": { ... },
|
||||
"./event-target-websocket-client": { ... },
|
||||
"./event-target-websocket-server": { ... },
|
||||
"./event-target-worker": { ... },
|
||||
"./event-target-iroh": { ... }
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user