@beignet/provider-event-bus-memory 0.0.49 → 0.0.51

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,20 @@
1
1
  # @beignet/provider-event-bus-memory
2
2
 
3
+ ## 0.0.51
4
+
5
+ ### Patch Changes
6
+
7
+ - 4f033a6: Forward canonical event payloads, expose framework error ownership through CORS, run focused-route misses through the fallback lifecycle, and inspect formatted route handlers with the TypeScript AST.
8
+
9
+ ## 0.0.50
10
+
11
+ ### Patch Changes
12
+
13
+ - 6fe026a: Expose event-subscription readiness and asynchronous cleanup, await listener
14
+ registries during provider startup with bounded rollback, diagnose unsafe app
15
+ wiring, and make Redis subscription lifecycle failures observable with bounded
16
+ provider shutdown and recoverable channel state.
17
+
3
18
  ## 0.0.49
4
19
 
5
20
  ### Patch Changes
package/README.md CHANGED
@@ -43,11 +43,13 @@ const UserRegistered = defineEvent("user.registered", {
43
43
  const eventBus = createMemoryEventBus();
44
44
 
45
45
  // Subscribe to events
46
- const unsubscribe = eventBus.subscribe(UserRegistered, (payload) => {
46
+ const subscription = eventBus.subscribe(UserRegistered, (payload) => {
47
47
  console.log(`User registered: ${payload.email}`);
48
48
  // Send welcome email, update analytics, etc.
49
49
  });
50
50
 
51
+ await subscription.ready;
52
+
51
53
  // Publish events
52
54
  await eventBus.publish(UserRegistered, {
53
55
  userId: "123",
@@ -55,7 +57,7 @@ await eventBus.publish(UserRegistered, {
55
57
  });
56
58
 
57
59
  // Unsubscribe when done
58
- unsubscribe();
60
+ await subscription.unsubscribe();
59
61
  ```
60
62
 
61
63
  ## Framework setup
@@ -116,14 +118,18 @@ const OrderPlaced = defineEvent("order.placed", {
116
118
  });
117
119
 
118
120
  // Subscribe to events in your application setup
119
- ctx.ports.eventBus.subscribe(OrderPlaced, async (payload) => {
120
- // Send order confirmation email
121
- await ctx.ports.mailer.send({
122
- to: customer.email,
123
- subject: "Order Confirmation",
124
- text: `Your order ${payload.orderId} has been placed!`,
125
- });
126
- });
121
+ const orderPlacedSubscription = ctx.ports.eventBus.subscribe(
122
+ OrderPlaced,
123
+ async (payload) => {
124
+ // Send order confirmation email
125
+ await ctx.ports.mailer.send({
126
+ to: customer.email,
127
+ subject: "Order Confirmation",
128
+ text: `Your order ${payload.orderId} has been placed!`,
129
+ });
130
+ },
131
+ );
132
+ await orderPlacedSubscription.ready;
127
133
 
128
134
  const placeOrder = useCase
129
135
  .command("orders.place")
@@ -142,6 +148,11 @@ const placeOrder = useCase
142
148
  return order;
143
149
  });
144
150
  });
151
+
152
+ // Call this from the application's shutdown hook.
153
+ export async function stopOrderListeners() {
154
+ await orderPlacedSubscription.unsubscribe();
155
+ }
145
156
  ```
146
157
 
147
158
  ## EventBus port API
@@ -168,18 +179,22 @@ The optional third `{ trace }` argument is transport metadata used by Beignet
168
179
  listeners. When `instrumentation` exposes a tracing port, the bus captures the
169
180
  active context automatically. Existing two-argument calls are unchanged.
170
181
 
171
- ### `subscribe<E>(event, handler): () => void`
182
+ ### `subscribe<E>(event, handler): EventSubscription`
172
183
 
173
- Subscribe to a domain event. Returns an unsubscribe function.
184
+ Subscribe to a domain event. The memory adapter is active synchronously, so
185
+ `ready` is already resolved. `unsubscribe()` is idempotent and removes local
186
+ delivery before its promise resolves.
174
187
 
175
188
  ```typescript
176
- const unsubscribe = eventBus.subscribe(UserRegistered, (payload, options) => {
189
+ const subscription = eventBus.subscribe(UserRegistered, (payload, options) => {
177
190
  console.log(`New user: ${payload.email}`);
178
191
  console.log(options?.trace?.traceparent);
179
192
  });
180
193
 
194
+ await subscription.ready;
195
+
181
196
  // Later, when you want to stop listening:
182
- unsubscribe();
197
+ await subscription.unsubscribe();
183
198
  ```
184
199
 
185
200
  ## TypeScript support
@@ -211,7 +226,8 @@ describe("User Registration", () => {
211
226
  const eventBus = createMemoryEventBus();
212
227
  const handler = mock(() => {});
213
228
 
214
- eventBus.subscribe(UserRegistered, handler);
229
+ const subscription = eventBus.subscribe(UserRegistered, handler);
230
+ await subscription.ready;
215
231
 
216
232
  // Perform registration
217
233
  await registerUser(ctx, { email: "test@example.com" });
@@ -220,6 +236,8 @@ describe("User Registration", () => {
220
236
  userId: expect.any(String),
221
237
  email: "test@example.com",
222
238
  });
239
+
240
+ await subscription.unsubscribe();
223
241
  });
224
242
  });
225
243
  ```
@@ -232,6 +250,9 @@ describe("User Registration", () => {
232
250
  - **Memory-only**: No persistence - events are lost if the process crashes
233
251
  - **Order**: Handlers are called in the order they were subscribed
234
252
  - **Multiple handlers**: Multiple handlers can subscribe to the same event
253
+ - **Canonical helper delivery**: `publishEvent(...)` and use-case event helpers
254
+ preserve parsed payload state through in-process delivery, so
255
+ `registerListeners(...)` does not apply schema transforms twice
235
256
  - **Error handling**: Handler errors reject `publish(...)` unless
236
257
  `onHandlerError` is configured
237
258
 
package/dist/index.d.ts CHANGED
@@ -14,15 +14,16 @@
14
14
  * const eventBus = createMemoryEventBus();
15
15
  *
16
16
  * // Subscribe to an event
17
- * const unsubscribe = eventBus.subscribe(UserRegistered, (payload) => {
17
+ * const subscription = eventBus.subscribe(UserRegistered, (payload) => {
18
18
  * console.log(`User registered: ${payload.email}`);
19
19
  * });
20
+ * await subscription.ready;
20
21
  *
21
22
  * // Publish an event
22
23
  * await eventBus.publish(UserRegistered, { userId: "123", email: "test@example.com" });
23
24
  *
24
25
  * // Unsubscribe when done
25
- * unsubscribe();
26
+ * await subscription.unsubscribe();
26
27
  * ```
27
28
  */
28
29
  import type { EventBusPort } from "@beignet/core/ports";
@@ -91,11 +92,13 @@ export interface MemoryEventBusProviderPorts {
91
92
  * ```ts
92
93
  * const eventBus = createMemoryEventBus();
93
94
  *
94
- * eventBus.subscribe(UserRegistered, (payload) => {
95
+ * const subscription = eventBus.subscribe(UserRegistered, (payload) => {
95
96
  * console.log(`User registered: ${payload.email}`);
96
97
  * });
98
+ * await subscription.ready;
97
99
  *
98
100
  * await eventBus.publish(UserRegistered, { userId: "123", email: "test@example.com" });
101
+ * await subscription.unsubscribe();
99
102
  * ```
100
103
  *
101
104
  * @example
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAGL,KAAK,6BAA6B,EACnC,MAAM,yBAAyB,CAAC;AAGjC;;GAEG;AACH,MAAM,MAAM,sBAAsB,GAAG,gBAAgB,GAAG,iBAAiB,CAAC;AAE1E;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC;;;OAGG;IACH,eAAe,CAAC,EAAE,6BAA6B,CAAC;IAEhD;;;;;;OAMG;IACH,QAAQ,CAAC,EAAE,sBAAsB,CAAC;IAElC;;;;;;;;;;;OAWG;IACH,cAAc,CAAC,EAAE,CACf,KAAK,EAAE,OAAO,EACd,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,OAAO,KACb,IAAI,CAAC;CACX;AAED;;GAEG;AACH,MAAM,WAAW,6BACf,SAAQ,IAAI,CAAC,qBAAqB,EAAE,iBAAiB,CAAC;IACtD;;OAEG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;GAEG;AACH,MAAM,WAAW,2BAA2B;IAC1C;;OAEG;IACH,QAAQ,EAAE,YAAY,CAAC;CACxB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,GAAE,qBAA0B,GAClC,YAAY,CAoGd;AAED;;GAEG;AACH,wBAAgB,4BAA4B,CAC1C,OAAO,GAAE,6BAAkC;;kBAiB5C"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAGL,KAAK,6BAA6B,EACnC,MAAM,yBAAyB,CAAC;AAGjC;;GAEG;AACH,MAAM,MAAM,sBAAsB,GAAG,gBAAgB,GAAG,iBAAiB,CAAC;AAE1E;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC;;;OAGG;IACH,eAAe,CAAC,EAAE,6BAA6B,CAAC;IAEhD;;;;;;OAMG;IACH,QAAQ,CAAC,EAAE,sBAAsB,CAAC;IAElC;;;;;;;;;;;OAWG;IACH,cAAc,CAAC,EAAE,CACf,KAAK,EAAE,OAAO,EACd,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,OAAO,KACb,IAAI,CAAC;CACX;AAED;;GAEG;AACH,MAAM,WAAW,6BACf,SAAQ,IAAI,CAAC,qBAAqB,EAAE,iBAAiB,CAAC;IACtD;;OAEG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;GAEG;AACH,MAAM,WAAW,2BAA2B;IAC1C;;OAEG;IACH,QAAQ,EAAE,YAAY,CAAC;CACxB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,GAAE,qBAA0B,GAClC,YAAY,CAsHd;AAED;;GAEG;AACH,wBAAgB,4BAA4B,CAC1C,OAAO,GAAE,6BAAkC;;kBAiB5C"}
package/dist/index.js CHANGED
@@ -14,15 +14,16 @@
14
14
  * const eventBus = createMemoryEventBus();
15
15
  *
16
16
  * // Subscribe to an event
17
- * const unsubscribe = eventBus.subscribe(UserRegistered, (payload) => {
17
+ * const subscription = eventBus.subscribe(UserRegistered, (payload) => {
18
18
  * console.log(`User registered: ${payload.email}`);
19
19
  * });
20
+ * await subscription.ready;
20
21
  *
21
22
  * // Publish an event
22
23
  * await eventBus.publish(UserRegistered, { userId: "123", email: "test@example.com" });
23
24
  *
24
25
  * // Unsubscribe when done
25
- * unsubscribe();
26
+ * await subscription.unsubscribe();
26
27
  * ```
27
28
  */
28
29
  import { createProvider, createProviderInstrumentation, } from "@beignet/core/providers";
@@ -38,11 +39,13 @@ import { captureTraceCarrier, parseTraceCarrier } from "@beignet/core/tracing";
38
39
  * ```ts
39
40
  * const eventBus = createMemoryEventBus();
40
41
  *
41
- * eventBus.subscribe(UserRegistered, (payload) => {
42
+ * const subscription = eventBus.subscribe(UserRegistered, (payload) => {
42
43
  * console.log(`User registered: ${payload.email}`);
43
44
  * });
45
+ * await subscription.ready;
44
46
  *
45
47
  * await eventBus.publish(UserRegistered, { userId: "123", email: "test@example.com" });
48
+ * await subscription.unsubscribe();
46
49
  * ```
47
50
  *
48
51
  * @example
@@ -83,7 +86,20 @@ export function createMemoryEventBus(options = {}) {
83
86
  const subscribers = [...subs];
84
87
  const trace = parseTraceCarrier(publishOptions?.trace) ??
85
88
  captureTraceCarrier(options.instrumentation);
86
- const deliveryOptions = trace ? { trace } : undefined;
89
+ let deliveryOptions;
90
+ if (publishOptions) {
91
+ const hasNonTraceMetadata = Reflect.ownKeys(publishOptions).some((key) => key !== "trace");
92
+ if (trace || hasNonTraceMetadata) {
93
+ deliveryOptions = { ...publishOptions };
94
+ if (trace)
95
+ deliveryOptions.trace = trace;
96
+ else
97
+ delete deliveryOptions.trace;
98
+ }
99
+ }
100
+ else if (trace) {
101
+ deliveryOptions = { trace };
102
+ }
87
103
  if (delivery === "fire-and-forget") {
88
104
  for (const handler of subscribers) {
89
105
  try {
@@ -118,11 +134,18 @@ export function createMemoryEventBus(options = {}) {
118
134
  handlers.set(event.name, subs);
119
135
  }
120
136
  subs.add(handler);
121
- return () => {
122
- subs.delete(handler);
123
- if (subs.size === 0) {
124
- handlers.delete(event.name);
125
- }
137
+ let unsubscribed = false;
138
+ return {
139
+ ready: Promise.resolve(),
140
+ async unsubscribe() {
141
+ if (unsubscribed)
142
+ return;
143
+ unsubscribed = true;
144
+ subs.delete(handler);
145
+ if (subs.size === 0) {
146
+ handlers.delete(event.name);
147
+ }
148
+ },
126
149
  };
127
150
  },
128
151
  };
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAIH,OAAO,EACL,cAAc,EACd,6BAA6B,GAE9B,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAkE/E;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,MAAM,UAAU,oBAAoB,CAClC,UAAiC,EAAE;IAEnC,MAAM,cAAc,GAAG,OAAO,EAAE,cAAc,CAAC;IAC/C,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,gBAAgB,CAAC;IACtD,MAAM,eAAe,GAAG,6BAA6B,CACnD,OAAO,CAAC,eAAe,EACvB;QACE,YAAY,EAAE,kBAAkB;QAChC,OAAO,EAAE,UAAU;KACpB,CACF,CAAC;IAEF,MAAM,QAAQ,GAAG,IAAI,GAAG,EAKrB,CAAC;IAEJ,MAAM,kBAAkB,GAAG,CACzB,KAAc,EACd,SAAiB,EACjB,OAAgB,EAChB,EAAE;QACF,IAAI,CAAC;YACH,cAAc,EAAE,CAAC,KAAK,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;QAC9C,CAAC;QAAC,MAAM,CAAC;YACP,wFAAwF;QAC1F,CAAC;IACH,CAAC,CAAC;IAEF,OAAO;QACL,OAAO,CAAC,KAAK,EAAE,OAAO,EAAE,cAAc;YACpC,eAAe,CAAC,MAAM,CAAC;gBACrB,IAAI,EAAE,UAAU;gBAChB,SAAS,EAAE,KAAK,CAAC,IAAI;aACtB,CAAC,CAAC;YAEH,MAAM,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACtC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,KAAK,CAAC;gBAAE,OAAO;YAErC,MAAM,WAAW,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC;YAC9B,MAAM,KAAK,GACT,iBAAiB,CAAC,cAAc,EAAE,KAAK,CAAC;gBACxC,mBAAmB,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;YAC/C,MAAM,eAAe,GAAG,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;YAEtD,IAAI,QAAQ,KAAK,iBAAiB,EAAE,CAAC;gBACnC,KAAK,MAAM,OAAO,IAAI,WAAW,EAAE,CAAC;oBAClC,IAAI,CAAC;wBACH,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC;wBACjD,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;4BAC/C,kBAAkB,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;wBACjD,CAAC,CAAC,CAAC;oBACL,CAAC;oBAAC,OAAO,KAAK,EAAE,CAAC;wBACf,kBAAkB,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;oBACjD,CAAC;gBACH,CAAC;gBAED,OAAO;YACT,CAAC;YAED,OAAO,CAAC,KAAK,IAAI,EAAE;gBACjB,KAAK,MAAM,OAAO,IAAI,WAAW,EAAE,CAAC;oBAClC,IAAI,CAAC;wBACH,MAAM,OAAO,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC;oBAC1C,CAAC;oBAAC,OAAO,KAAK,EAAE,CAAC;wBACf,kBAAkB,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;wBAC/C,IAAI,CAAC,cAAc;4BAAE,MAAM,KAAK,CAAC;oBACnC,CAAC;gBACH,CAAC;YACH,CAAC,CAAC,EAAE,CAAC;QACP,CAAC;QAED,SAAS,CAAC,KAAK,EAAE,OAAO;YACtB,IAAI,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACpC,IAAI,CAAC,IAAI,EAAE,CAAC;gBACV,IAAI,GAAG,IAAI,GAAG,EAAE,CAAC;gBACjB,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;YACjC,CAAC;YAED,IAAI,CAAC,GAAG,CACN,OAGyB,CAC1B,CAAC;YAEF,OAAO,GAAG,EAAE;gBACV,IAAI,CAAC,MAAM,CACT,OAGyB,CAC1B,CAAC;gBACF,IAAI,IAAI,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;oBACpB,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBAC9B,CAAC;YACH,CAAC,CAAC;QACJ,CAAC;KACF,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,4BAA4B,CAC1C,UAAyC,EAAE;IAE3C,MAAM,EAAE,IAAI,GAAG,kBAAkB,EAAE,GAAG,eAAe,EAAE,GAAG,OAAO,CAAC;IAElE,OAAO,cAAc,CAAC;QACpB,IAAI;QACJ,KAAK,CAAC,EAAE,KAAK,EAAE;YACb,OAAO;gBACL,KAAK,EAAE;oBACL,QAAQ,EAAE,oBAAoB,CAAC;wBAC7B,GAAG,eAAe;wBAClB,eAAe,EAAE,KAAK;qBACvB,CAAC;iBACmC;aACxC,CAAC;QACJ,CAAC;KACF,CAAC,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@beignet/provider-event-bus-memory",
3
- "version": "0.0.49",
3
+ "version": "0.0.51",
4
4
  "type": "module",
5
5
  "description": "In-memory event bus provider for Beignet - implements EventBusPort for single-process applications",
6
6
  "main": "./dist/index.js",
package/src/index.ts CHANGED
@@ -14,15 +14,16 @@
14
14
  * const eventBus = createMemoryEventBus();
15
15
  *
16
16
  * // Subscribe to an event
17
- * const unsubscribe = eventBus.subscribe(UserRegistered, (payload) => {
17
+ * const subscription = eventBus.subscribe(UserRegistered, (payload) => {
18
18
  * console.log(`User registered: ${payload.email}`);
19
19
  * });
20
+ * await subscription.ready;
20
21
  *
21
22
  * // Publish an event
22
23
  * await eventBus.publish(UserRegistered, { userId: "123", email: "test@example.com" });
23
24
  *
24
25
  * // Unsubscribe when done
25
- * unsubscribe();
26
+ * await subscription.unsubscribe();
26
27
  * ```
27
28
  */
28
29
 
@@ -110,11 +111,13 @@ export interface MemoryEventBusProviderPorts {
110
111
  * ```ts
111
112
  * const eventBus = createMemoryEventBus();
112
113
  *
113
- * eventBus.subscribe(UserRegistered, (payload) => {
114
+ * const subscription = eventBus.subscribe(UserRegistered, (payload) => {
114
115
  * console.log(`User registered: ${payload.email}`);
115
116
  * });
117
+ * await subscription.ready;
116
118
  *
117
119
  * await eventBus.publish(UserRegistered, { userId: "123", email: "test@example.com" });
120
+ * await subscription.unsubscribe();
118
121
  * ```
119
122
  *
120
123
  * @example
@@ -173,7 +176,19 @@ export function createMemoryEventBus(
173
176
  const trace =
174
177
  parseTraceCarrier(publishOptions?.trace) ??
175
178
  captureTraceCarrier(options.instrumentation);
176
- const deliveryOptions = trace ? { trace } : undefined;
179
+ let deliveryOptions: EventPublishOptions | undefined;
180
+ if (publishOptions) {
181
+ const hasNonTraceMetadata = Reflect.ownKeys(publishOptions).some(
182
+ (key) => key !== "trace",
183
+ );
184
+ if (trace || hasNonTraceMetadata) {
185
+ deliveryOptions = { ...publishOptions };
186
+ if (trace) deliveryOptions.trace = trace;
187
+ else delete deliveryOptions.trace;
188
+ }
189
+ } else if (trace) {
190
+ deliveryOptions = { trace };
191
+ }
177
192
 
178
193
  if (delivery === "fire-and-forget") {
179
194
  for (const handler of subscribers) {
@@ -216,16 +231,22 @@ export function createMemoryEventBus(
216
231
  ) => void | Promise<void>,
217
232
  );
218
233
 
219
- return () => {
220
- subs.delete(
221
- handler as unknown as (
222
- payload: unknown,
223
- options?: EventPublishOptions,
224
- ) => void | Promise<void>,
225
- );
226
- if (subs.size === 0) {
227
- handlers.delete(event.name);
228
- }
234
+ let unsubscribed = false;
235
+ return {
236
+ ready: Promise.resolve(),
237
+ async unsubscribe() {
238
+ if (unsubscribed) return;
239
+ unsubscribed = true;
240
+ subs.delete(
241
+ handler as unknown as (
242
+ payload: unknown,
243
+ options?: EventPublishOptions,
244
+ ) => void | Promise<void>,
245
+ );
246
+ if (subs.size === 0) {
247
+ handlers.delete(event.name);
248
+ }
249
+ },
229
250
  };
230
251
  },
231
252
  };