@moeru/eventa 1.0.0-beta.1 → 1.0.0-beta.3

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.
Files changed (45) hide show
  1. package/README.md +11 -0
  2. package/dist/adapters/broadcast-channel/index.d.mts +4 -2
  3. package/dist/adapters/broadcast-channel/index.mjs +2 -2
  4. package/dist/adapters/electron/main.d.mts +2 -2
  5. package/dist/adapters/electron/main.mjs +3 -3
  6. package/dist/adapters/electron/renderer.d.mts +2 -2
  7. package/dist/adapters/electron/renderer.mjs +3 -3
  8. package/dist/adapters/event-emitter/index.d.mts +4 -2
  9. package/dist/adapters/event-emitter/index.mjs +2 -2
  10. package/dist/adapters/event-target/index.d.mts +4 -2
  11. package/dist/adapters/event-target/index.mjs +2 -2
  12. package/dist/adapters/websocket/h3/index.d.mts +8 -8
  13. package/dist/adapters/websocket/h3/index.mjs +2 -2
  14. package/dist/adapters/websocket/index.d.mts +1 -1
  15. package/dist/adapters/websocket/native/index.d.mts +5 -5
  16. package/dist/adapters/websocket/native/index.mjs +2 -2
  17. package/dist/adapters/webworkers/index.d.mts +2 -2
  18. package/dist/adapters/webworkers/index.mjs +3 -3
  19. package/dist/adapters/webworkers/worker/index.d.mts +1 -1
  20. package/dist/adapters/webworkers/worker/index.mjs +3 -3
  21. package/dist/adapters/worker-threads/index.d.mts +2 -2
  22. package/dist/adapters/worker-threads/index.mjs +3 -3
  23. package/dist/adapters/worker-threads/worker/index.d.mts +1 -1
  24. package/dist/adapters/worker-threads/worker/index.mjs +3 -3
  25. package/dist/{context-ZVv99bcM.d.mts → context-BNM9nsGp.d.mts} +2 -2
  26. package/dist/{context-ex8urwfs.mjs → context-c10xPp3f.mjs} +11 -6
  27. package/dist/context-c10xPp3f.mjs.map +1 -0
  28. package/dist/eventa-M1FMVrH1.d.mts +106 -0
  29. package/dist/{index-CI_gUGXg.d.mts → index-giKJThn3.d.mts} +73 -61
  30. package/dist/index.d.mts +4 -4
  31. package/dist/index.mjs +2 -2
  32. package/dist/{internal-De3z6hO5.mjs → internal-C-4X8bpL.mjs} +2 -2
  33. package/dist/{internal-De3z6hO5.mjs.map → internal-C-4X8bpL.mjs.map} +1 -1
  34. package/dist/{shared-DgX1R_nY.d.mts → shared-BcRXZZxh.d.mts} +4 -4
  35. package/dist/{shared-BZOulnwC.mjs → shared-DeDRsHPI.mjs} +2 -2
  36. package/dist/{shared-BZOulnwC.mjs.map → shared-DeDRsHPI.mjs.map} +1 -1
  37. package/dist/{shared-Cd4CLAdD.d.mts → shared-NFMSqOPw.d.mts} +4 -2
  38. package/dist/{shared-BdqIf6iZ.mjs → shared-eQ-hnVHv.mjs} +3 -3
  39. package/dist/{shared-BdqIf6iZ.mjs.map → shared-eQ-hnVHv.mjs.map} +1 -1
  40. package/dist/{src-DZ7si0kE.mjs → src-CTkYOGiO.mjs} +137 -114
  41. package/dist/src-CTkYOGiO.mjs.map +1 -0
  42. package/package.json +1 -1
  43. package/dist/context-ex8urwfs.mjs.map +0 -1
  44. package/dist/eventa-AJyw28P8.d.mts +0 -52
  45. package/dist/src-DZ7si0kE.mjs.map +0 -1
@@ -1,4 +1,4 @@
1
- import { a as defineEventa, l as nanoid } from "./context-ex8urwfs.mjs";
1
+ import { a as defineEventa, l as nanoid } from "./context-c10xPp3f.mjs";
2
2
 
3
3
  //#region src/context-extension-invoke-internal.ts
4
4
  /**
@@ -43,35 +43,56 @@ let InvokeEventType = /* @__PURE__ */ function(InvokeEventType$1) {
43
43
  InvokeEventType$1[InvokeEventType$1["ReceiveEventStreamEnd"] = 6] = "ReceiveEventStreamEnd";
44
44
  return InvokeEventType$1;
45
45
  }({});
46
- function defineInvokeEventa(tag) {
46
+ function defineInvokeEventa(tag, options) {
47
47
  if (!tag) tag = nanoid();
48
48
  return {
49
49
  sendEvent: {
50
- ...defineEventa(`${tag}-send`),
50
+ ...defineEventa(`${tag}-send`, {
51
+ metadata: options?.metadata,
52
+ invokeMetadata: options?.invokeMetadata
53
+ }),
51
54
  invokeType: InvokeEventType.SendEvent
52
55
  },
53
56
  sendEventError: {
54
- ...defineEventa(`${tag}-send-error`),
57
+ ...defineEventa(`${tag}-send-error`, {
58
+ metadata: options?.metadata,
59
+ invokeMetadata: options?.invokeMetadata
60
+ }),
55
61
  invokeType: InvokeEventType.SendEventError
56
62
  },
57
63
  sendEventStreamEnd: {
58
- ...defineEventa(`${tag}-send-stream-end`),
64
+ ...defineEventa(`${tag}-send-stream-end`, {
65
+ metadata: options?.metadata,
66
+ invokeMetadata: options?.invokeMetadata
67
+ }),
59
68
  invokeType: InvokeEventType.SendEventStreamEnd
60
69
  },
61
70
  sendEventAbort: {
62
- ...defineEventa(`${tag}-send-abort`),
71
+ ...defineEventa(`${tag}-send-abort`, {
72
+ metadata: options?.metadata,
73
+ invokeMetadata: options?.invokeMetadata
74
+ }),
63
75
  invokeType: InvokeEventType.SendEventAbort
64
76
  },
65
77
  receiveEvent: {
66
- ...defineEventa(`${tag}-receive`),
78
+ ...defineEventa(`${tag}-receive`, {
79
+ metadata: options?.metadata,
80
+ invokeMetadata: options?.invokeMetadata
81
+ }),
67
82
  invokeType: InvokeEventType.ReceiveEvent
68
83
  },
69
84
  receiveEventError: {
70
- ...defineEventa(`${tag}-receive-error`),
85
+ ...defineEventa(`${tag}-receive-error`, {
86
+ metadata: options?.metadata,
87
+ invokeMetadata: options?.invokeMetadata
88
+ }),
71
89
  invokeType: InvokeEventType.ReceiveEventError
72
90
  },
73
91
  receiveEventStreamEnd: {
74
- ...defineEventa(`${tag}-receive-stream-end`),
92
+ ...defineEventa(`${tag}-receive-stream-end`, {
93
+ metadata: options?.metadata,
94
+ invokeMetadata: options?.invokeMetadata
95
+ }),
75
96
  invokeType: InvokeEventType.ReceiveEventStreamEnd
76
97
  }
77
98
  };
@@ -228,125 +249,127 @@ function isExtendableInvokeResponseLike(value) {
228
249
  * @param event Invoke event definition created by `defineInvokeEventa`.
229
250
  */
230
251
  function defineInvoke(ctx, event) {
231
- async function getContext() {
232
- if (typeof ctx === "function") {
233
- const resolvedCtx = ctx();
234
- if (resolvedCtx instanceof Promise) return await resolvedCtx;
235
- return resolvedCtx;
236
- }
252
+ function getContext() {
253
+ if (typeof ctx === "function") return ctx();
237
254
  return ctx;
238
255
  }
239
- function _invoke(req, options) {
256
+ function createInvokePromise(resolvedCtx, req, options) {
240
257
  return new Promise((resolve, reject) => {
241
- getContext().then((ctx$1) => {
242
- const invokeId = nanoid();
243
- const invokeReceiveEvent = defineEventa(`${event.receiveEvent.id}-${invokeId}`);
244
- const invokeReceiveEventError = defineEventa(`${event.receiveEventError.id}-${invokeId}`);
245
- const { signal, ...emitOptions } = options ?? {};
246
- let finished = false;
247
- const onAbort = () => {
248
- ctx$1.emit(event.sendEventAbort, {
258
+ const ctx$1 = resolvedCtx;
259
+ const invokeId = nanoid();
260
+ const invokeReceiveEvent = defineEventa(`${event.receiveEvent.id}-${invokeId}`);
261
+ delete invokeReceiveEvent.metadata;
262
+ const invokeReceiveEventError = defineEventa(`${event.receiveEventError.id}-${invokeId}`);
263
+ delete invokeReceiveEventError.metadata;
264
+ const { signal, ...emitOptions } = options ?? {};
265
+ let finished = false;
266
+ const onAbort = () => {
267
+ ctx$1.emit(event.sendEventAbort, {
268
+ invokeId,
269
+ content: signal?.reason
270
+ }, emitOptions);
271
+ finishReject(createAbortError(signal?.reason));
272
+ };
273
+ const invokeInternalConfig = getContextExtensionInvokeInternalConfig(ctx$1);
274
+ const abortOffs = [];
275
+ const onAbortEvent = (payload, eventOptions) => {
276
+ const mappedError = invokeInternalConfig?.mapAbortError?.(payload, eventOptions);
277
+ if (typeof mappedError !== "undefined") {
278
+ finishReject(mappedError);
279
+ return;
280
+ }
281
+ const body = payload?.body;
282
+ finishReject(body && typeof body === "object" && "error" in body ? body.error : typeof body !== "undefined" ? body : payload);
283
+ };
284
+ const cleanup = () => {
285
+ ctx$1.off(invokeReceiveEvent);
286
+ ctx$1.off(invokeReceiveEventError);
287
+ for (const off of abortOffs) off();
288
+ if (signal) signal.removeEventListener("abort", onAbort);
289
+ };
290
+ const finishReject = (error) => {
291
+ if (finished) return;
292
+ finished = true;
293
+ reject(error);
294
+ cleanup();
295
+ };
296
+ const finishResolve = (value) => {
297
+ if (finished) return;
298
+ finished = true;
299
+ resolve(value);
300
+ cleanup();
301
+ };
302
+ ctx$1.on(invokeReceiveEvent, (payload) => {
303
+ if (!payload.body) return;
304
+ if (payload.body.invokeId !== invokeId) return;
305
+ const { content } = payload.body;
306
+ finishResolve(content);
307
+ });
308
+ ctx$1.on(invokeReceiveEventError, (payload) => {
309
+ if (!payload.body) return;
310
+ if (payload.body.invokeId !== invokeId) return;
311
+ const { error } = payload.body.content;
312
+ finishReject(error);
313
+ });
314
+ if (invokeInternalConfig?.abortOnEvents?.length) for (const eventOrMatch of invokeInternalConfig.abortOnEvents) abortOffs.push(ctx$1.on(eventOrMatch, onAbortEvent));
315
+ if (signal) {
316
+ if (signal.aborted) {
317
+ onAbort();
318
+ return;
319
+ }
320
+ signal.addEventListener("abort", onAbort, { once: true });
321
+ }
322
+ if (!isReadableStream(req) && !isAsyncIterable(req)) ctx$1.emit(event.sendEvent, {
323
+ invokeId,
324
+ content: req
325
+ }, emitOptions);
326
+ else {
327
+ const sendChunk = (chunk) => {
328
+ if (finished) return;
329
+ ctx$1.emit(event.sendEvent, {
249
330
  invokeId,
250
- content: signal?.reason
331
+ content: chunk,
332
+ isReqStream: true
251
333
  }, emitOptions);
252
- finishReject(createAbortError(signal?.reason));
253
- };
254
- const invokeInternalConfig = getContextExtensionInvokeInternalConfig(ctx$1);
255
- const abortOffs = [];
256
- const onAbortEvent = (payload, eventOptions) => {
257
- const mappedError = invokeInternalConfig?.mapAbortError?.(payload, eventOptions);
258
- if (typeof mappedError !== "undefined") {
259
- finishReject(mappedError);
260
- return;
261
- }
262
- const body = payload?.body;
263
- finishReject(body && typeof body === "object" && "error" in body ? body.error : typeof body !== "undefined" ? body : payload);
264
- };
265
- const cleanup = () => {
266
- ctx$1.off(invokeReceiveEvent);
267
- ctx$1.off(invokeReceiveEventError);
268
- for (const off of abortOffs) off();
269
- if (signal) signal.removeEventListener("abort", onAbort);
270
334
  };
271
- const finishReject = (error) => {
335
+ const sendEnd = () => {
272
336
  if (finished) return;
273
- finished = true;
274
- reject(error);
275
- cleanup();
276
- };
277
- const finishResolve = (value) => {
278
- if (finished) return;
279
- finished = true;
280
- resolve(value);
281
- cleanup();
337
+ ctx$1.emit(event.sendEventStreamEnd, {
338
+ invokeId,
339
+ content: void 0
340
+ }, emitOptions);
282
341
  };
283
- ctx$1.on(invokeReceiveEvent, (payload) => {
284
- if (!payload.body) return;
285
- if (payload.body.invokeId !== invokeId) return;
286
- const { content } = payload.body;
287
- finishResolve(content);
288
- });
289
- ctx$1.on(invokeReceiveEventError, (payload) => {
290
- if (!payload.body) return;
291
- if (payload.body.invokeId !== invokeId) return;
292
- const { error } = payload.body.content;
293
- finishReject(error);
294
- });
295
- if (invokeInternalConfig?.abortOnEvents?.length) for (const eventOrMatch of invokeInternalConfig.abortOnEvents) abortOffs.push(ctx$1.on(eventOrMatch, onAbortEvent));
296
- if (signal) {
297
- if (signal.aborted) {
298
- onAbort();
299
- return;
300
- }
301
- signal.addEventListener("abort", onAbort, { once: true });
302
- }
303
- if (!isReadableStream(req) && !isAsyncIterable(req)) ctx$1.emit(event.sendEvent, {
304
- invokeId,
305
- content: req
306
- }, emitOptions);
307
- else {
308
- const sendChunk = (chunk) => {
309
- if (finished) return;
310
- ctx$1.emit(event.sendEvent, {
311
- invokeId,
312
- content: chunk,
313
- isReqStream: true
314
- }, emitOptions);
315
- };
316
- const sendEnd = () => {
317
- if (finished) return;
318
- ctx$1.emit(event.sendEventStreamEnd, {
319
- invokeId,
320
- content: void 0
321
- }, emitOptions);
322
- };
323
- const pump = async () => {
324
- try {
325
- for await (const chunk of req) {
326
- if (signal?.aborted) return;
327
- sendChunk(chunk);
328
- }
329
- sendEnd();
330
- } catch (error) {
342
+ const pump = async () => {
343
+ try {
344
+ for await (const chunk of req) {
331
345
  if (signal?.aborted) return;
332
- if (isAbortError(error)) {
333
- ctx$1.emit(event.sendEventAbort, {
334
- invokeId,
335
- content: error
336
- }, emitOptions);
337
- return;
338
- }
339
- ctx$1.emit(event.sendEventError, {
346
+ sendChunk(chunk);
347
+ }
348
+ sendEnd();
349
+ } catch (error) {
350
+ if (signal?.aborted) return;
351
+ if (isAbortError(error)) {
352
+ ctx$1.emit(event.sendEventAbort, {
340
353
  invokeId,
341
354
  content: error
342
355
  }, emitOptions);
356
+ return;
343
357
  }
344
- };
345
- pump();
346
- }
347
- });
358
+ ctx$1.emit(event.sendEventError, {
359
+ invokeId,
360
+ content: error
361
+ }, emitOptions);
362
+ }
363
+ };
364
+ pump();
365
+ }
348
366
  });
349
367
  }
368
+ function _invoke(req, options) {
369
+ const resolvedCtx = getContext();
370
+ if (resolvedCtx instanceof Promise) return resolvedCtx.then((ctx$1) => createInvokePromise(ctx$1, req, options));
371
+ return createInvokePromise(resolvedCtx, req, options);
372
+ }
350
373
  return _invoke;
351
374
  }
352
375
  /**
@@ -1166,4 +1189,4 @@ function toStreamHandler(handler) {
1166
1189
 
1167
1190
  //#endregion
1168
1191
  export { isInvokeEventa as C, registerInvokeAbortEventListeners as E, defineInvokeEventa as S, isSendEvent as T, isAbortError as _, withRemoteMethods as a, randomBetween as b, defineInvokeHandler as c, isExtendableInvokeResponseLike as d, undefineInvokeHandler as f, createUntilTriggeredOnce as g, createUntilTriggered as h, createRemoteMethodTagPrefix as i, defineInvokeHandlers as l, createUntil as m, defineStreamInvokeHandler as n, withTransfer as o, createAbortError as p, toStreamHandler as r, defineInvoke as s, defineStreamInvoke as t, defineInvokes as u, isAsyncIterable as v, isReceiveEvent as w, InvokeEventType as x, isReadableStream as y };
1169
- //# sourceMappingURL=src-DZ7si0kE.mjs.map
1192
+ //# sourceMappingURL=src-CTkYOGiO.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"src-CTkYOGiO.mjs","names":["resolve!: (r: Awaited<R>) => void","resolve!: () => void","resolve!: (value: T) => void","ctx","abortOffs: Array<() => void>","body: any","localController: ReadableStreamDefaultController<Req>","streamController","DEFAULT_FUNCTION_STUB_OPTIONS: Required<Pick<InvokeFunctionStubOptions, 'maxDepth' | 'maxFunctions' | 'tagPrefix' | 'onDisallowedTag' | 'autoDisposeMs' | 'strict'>>","disposers: Array<() => void>","output: any[]","output","output: Record<string, any>","wrapped","serialized: ReturnType<typeof serializeInvokeFunctionPayload<Req>>","autoDisposeTimer: ReturnType<typeof setTimeout> | undefined","onAbort: (() => void) | undefined","localController: ReadableStreamDefaultController<Req>","controller","values: Promise<[Res, boolean]>[]","resolve: (x: [Res, boolean]) => void","handlerError: Error | null","val: Res"],"sources":["../src/context-extension-invoke-internal.ts","../src/invoke-shared.ts","../src/utils.ts","../src/invoke.ts","../src/invoke-extension-transfer.ts","../src/invoke-remote-methods.ts","../src/stream.ts"],"sourcesContent":["import type { EventContext } from './context'\nimport type { Eventa, EventaMatchExpression } from './eventa'\n\n/**\n * Internal invoke configuration carried on context extensions.\n *\n * Known usage: worker adapters (webworkers/worker-threads) use this to\n * abort pending invokes when the worker emits a fatal error event.\n */\nexport interface InvokeInternalConfig<EO = any> {\n abortOnEvents?: Array<Eventa<any> | EventaMatchExpression<any>>\n mapAbortError?: (payload: Eventa<any>, options?: EO) => unknown\n}\n\n/**\n * Read the internal invoke configuration from context extensions, if present.\n * This is used by defineInvoke to determine which events should abort inflight invokes.\n */\nexport function getContextExtensionInvokeInternalConfig<EO = any>(ctx: EventContext<any, EO>): InvokeInternalConfig<EO> | undefined {\n const extensions = (ctx as EventContext<any, EO> & { extensions?: any }).extensions\n if (!extensions || typeof extensions !== 'object') {\n return undefined\n }\n\n const internal = extensions.__internal\n if (!internal || typeof internal !== 'object') {\n return undefined\n }\n\n const invoke = internal.invoke\n if (!invoke || typeof invoke !== 'object') {\n return undefined\n }\n\n return invoke as InvokeInternalConfig<EO>\n}\n\n/**\n * Register a fatal event/match expression that should terminate pending invokes.\n * Adapters call this to wire their error events (e.g. worker error) into invoke.\n */\nexport function registerInvokeAbortEventListeners<EO = any>(\n ctx: EventContext<any, EO>,\n eventOrMatch: Eventa<any> | EventaMatchExpression<any>,\n): InvokeInternalConfig<EO> {\n const extensions = ((ctx as EventContext<any, EO> & { extensions?: any }).extensions ?? {}) as Record<string, any>\n const internal = (extensions.__internal ?? {}) as Record<string, any>\n const invokeInternal = (internal.invoke ?? {}) as Record<string, any>\n const abortOnEvents = Array.isArray(invokeInternal.abortOnEvents) ? invokeInternal.abortOnEvents : []\n\n if (!abortOnEvents.includes(eventOrMatch)) {\n abortOnEvents.push(eventOrMatch)\n }\n\n invokeInternal.abortOnEvents = abortOnEvents\n internal.invoke = invokeInternal\n extensions.__internal = internal\n ;(ctx as EventContext<any, EO> & { extensions?: any }).extensions = extensions\n\n return invokeInternal as InvokeInternalConfig<EO>\n}\n","import type { Eventa, EventTag } from './eventa'\n\nimport { defineEventa, nanoid } from './eventa'\n\nexport enum InvokeEventType {\n SendEvent,\n SendEventError,\n SendEventStreamEnd,\n SendEventAbort,\n ReceiveEvent,\n ReceiveEventError,\n ReceiveEventStreamEnd,\n}\n\nexport interface SendEvent<Res, Req = undefined, _ = undefined, __ = undefined, M = undefined, IM = undefined> extends Eventa<{ invokeId: string, content: Req, isReqStream?: boolean }, M, IM> {\n id: EventTag<Res, Req>\n invokeType: InvokeEventType.SendEvent\n}\n\nexport interface SendEventError<Res, Req = undefined, _ = undefined, ReqErr = Error, M = undefined, IM = undefined> extends Eventa<{ invokeId: string, content: ReqErr }, M, IM> {\n id: EventTag<Res, Req>\n invokeType: InvokeEventType.SendEventError\n}\n\nexport interface SendEventStreamEnd<Res, Req = undefined, _ = undefined, __ = undefined, M = undefined, IM = undefined> extends Eventa<{ invokeId: string, content: undefined }, M, IM> {\n id: EventTag<Res, Req>\n invokeType: InvokeEventType.SendEventStreamEnd\n}\n\nexport interface SendEventAbort<Res, Req = undefined, _ = undefined, __ = undefined, M = undefined, IM = undefined> extends Eventa<{ invokeId: string, content?: unknown }, M, IM> {\n id: EventTag<Res, Req>\n invokeType: InvokeEventType.SendEventAbort\n}\n\nexport interface ReceiveEvent<Res, Req = undefined, _ = undefined, __ = undefined, M = undefined, IM = undefined> extends Eventa<{ invokeId: string, content: Res }, M, IM> {\n id: EventTag<Res, Req>\n invokeType: InvokeEventType.ReceiveEvent\n}\n\nexport interface ReceiveEventError<Res, Req = undefined, ResErr = undefined, _ = undefined, M = undefined, IM = undefined> extends Eventa<{ invokeId: string, content: { error: ResErr } }, M, IM> {\n id: EventTag<Res, Req>\n invokeType: InvokeEventType.ReceiveEventError\n}\n\nexport interface ReceiveEventStreamEnd<Res, Req = undefined, _ = undefined, __ = undefined, M = undefined, IM = undefined> extends Eventa<{ invokeId: string, content: undefined }, M, IM> {\n id: EventTag<Res, Req>\n invokeType: InvokeEventType.ReceiveEventStreamEnd\n}\n\nexport interface InvokeEventa<Res, Req = undefined, ResErr = Error, ReqErr = Error, M = undefined, IM = undefined> {\n sendEvent: SendEvent<Res, Req, ResErr, ReqErr, M, IM>\n sendEventError: SendEventError<Res, Req, ResErr, ReqErr, M, IM>\n sendEventStreamEnd: SendEventStreamEnd<Res, Req, ResErr, ReqErr, M, IM>\n sendEventAbort: SendEventAbort<Res, Req, ResErr, ReqErr, M, IM>\n receiveEvent: ReceiveEvent<Res, Req, ResErr, ReqErr, M, IM>\n receiveEventError: ReceiveEventError<Res, Req, ResErr, ReqErr, M, IM>\n receiveEventStreamEnd: ReceiveEventStreamEnd<Res, Req, ResErr, ReqErr, M, IM>\n}\n\nexport interface InvokeHandlerEventa<Res, Req = undefined, ResErr = Error, ReqErr = Error, M = undefined, _IM = undefined> extends InvokeEventa<Res, Req, ResErr, ReqErr, M, undefined> {\n sendEvent: SendEvent<Res, Req, ResErr, ReqErr, M, undefined>\n sendEventError: SendEventError<Res, Req, ResErr, ReqErr, M, undefined>\n sendEventStreamEnd: SendEventStreamEnd<Res, Req, ResErr, ReqErr, M, undefined>\n sendEventAbort: SendEventAbort<Res, Req, ResErr, ReqErr, M, undefined>\n receiveEvent: ReceiveEvent<Res, Req, ResErr, ReqErr, M, undefined>\n receiveEventError: ReceiveEventError<Res, Req, ResErr, ReqErr, M, undefined>\n receiveEventStreamEnd: ReceiveEventStreamEnd<Res, Req, ResErr, ReqErr, M, undefined>\n}\n\nexport type InferSendEvent<T> = T extends { sendEvent: SendEvent<infer Res, infer Req, infer ResErr, infer ReqErr, infer M, infer IM> }\n ? SendEvent<Res, Req, ResErr, ReqErr, M, IM>\n : never\n\nexport type InferSendEventError<T> = T extends { sendEventError: SendEventError<infer Res, infer Req, infer ResErr, infer ReqErr, infer M, infer IM> }\n ? SendEventError<Res, Req, ResErr, ReqErr, M, IM>\n : never\n\nexport type InferSendEventStreamEnd<T> = T extends { sendEventStreamEnd: SendEventStreamEnd<infer Res, infer Req, infer ResErr, infer ReqErr, infer M, infer IM> }\n ? SendEventStreamEnd<Res, Req, ResErr, ReqErr, M, IM>\n : never\n\nexport type InferSendEventAbort<T> = T extends { sendEventAbort: SendEventAbort<infer Res, infer Req, infer ResErr, infer ReqErr, infer M, infer IM> }\n ? SendEventAbort<Res, Req, ResErr, ReqErr, M, IM>\n : never\n\nexport type InferReceiveEvent<T> = T extends { receiveEvent: ReceiveEvent<infer Res, infer Req, infer ResErr, infer ReqErr, infer M, infer IM> }\n ? ReceiveEvent<Res, Req, ResErr, ReqErr, M, IM>\n : never\n\nexport type InferReceiveEventError<T> = T extends { receiveEventError: ReceiveEventError<infer Res, infer Req, infer ResErr, infer ReqErr, infer M, infer IM> }\n ? ReceiveEventError<Res, Req, ResErr, ReqErr, M, IM>\n : never\n\nexport type InferReceiveEventStreamEnd<T> = T extends { receiveEventStreamEnd: ReceiveEventStreamEnd<infer Res, infer Req, infer ResErr, infer ReqErr, infer M, infer IM> }\n ? ReceiveEventStreamEnd<Res, Req, ResErr, ReqErr, M, IM>\n : never\n\nexport function defineInvokeEventa<Res, Req = undefined, ResErr = Error, ReqErr = Error, M = undefined, IM = undefined>(tag?: string, options?: { metadata?: M, invokeMetadata?: IM }) {\n if (!tag) {\n tag = nanoid()\n }\n\n const sendEvent = {\n ...defineEventa<InvokeEventType.SendEvent, M, IM>(`${tag}-send`, { metadata: options?.metadata, invokeMetadata: options?.invokeMetadata }),\n invokeType: InvokeEventType.SendEvent,\n } as SendEvent<Res, Req, ResErr, ReqErr, M, IM>\n const sendEventError = {\n ...defineEventa<InvokeEventType.SendEventError, M, IM>(`${tag}-send-error`, { metadata: options?.metadata, invokeMetadata: options?.invokeMetadata }),\n invokeType: InvokeEventType.SendEventError,\n } as SendEventError<Res, Req, ResErr, ReqErr, M, IM>\n const sendEventStreamEnd = {\n ...defineEventa<InvokeEventType.SendEventStreamEnd, M, IM>(`${tag}-send-stream-end`, { metadata: options?.metadata, invokeMetadata: options?.invokeMetadata }),\n invokeType: InvokeEventType.SendEventStreamEnd,\n } as SendEventStreamEnd<Res, Req, ResErr, ReqErr, M, IM>\n const sendEventAbort = {\n ...defineEventa<InvokeEventType.SendEventAbort, M, IM>(`${tag}-send-abort`, { metadata: options?.metadata, invokeMetadata: options?.invokeMetadata }),\n invokeType: InvokeEventType.SendEventAbort,\n } as SendEventAbort<Res, Req, ResErr, ReqErr, M, IM>\n const receiveEvent = {\n ...defineEventa<InvokeEventType.ReceiveEvent, M, IM>(`${tag}-receive`, { metadata: options?.metadata, invokeMetadata: options?.invokeMetadata }),\n invokeType: InvokeEventType.ReceiveEvent,\n } as ReceiveEvent<Res, Req, ResErr, ReqErr, M, IM>\n const receiveEventError = {\n ...defineEventa<InvokeEventType.ReceiveEventError, M, IM>(`${tag}-receive-error`, { metadata: options?.metadata, invokeMetadata: options?.invokeMetadata }),\n invokeType: InvokeEventType.ReceiveEventError,\n } as ReceiveEventError<Res, Req, ResErr, ReqErr, M, IM>\n const receiveEventStreamEnd = {\n ...defineEventa<InvokeEventType.ReceiveEventStreamEnd, M, IM>(`${tag}-receive-stream-end`, { metadata: options?.metadata, invokeMetadata: options?.invokeMetadata }),\n invokeType: InvokeEventType.ReceiveEventStreamEnd,\n } as ReceiveEventStreamEnd<Res, Req, ResErr, ReqErr, M, IM>\n\n return {\n sendEvent,\n sendEventError,\n sendEventStreamEnd,\n sendEventAbort,\n receiveEvent,\n receiveEventError,\n receiveEventStreamEnd,\n } satisfies InvokeEventa<Res, Req, ResErr, ReqErr, M, IM>\n}\n\nexport function isInvokeEventa(event: Eventa<any>): event is\n | SendEvent<any, any, any, any, any, any>\n | SendEventError<any, any, any, any, any, any>\n | SendEventStreamEnd<any, any, any, any, any, any>\n | ReceiveEvent<any, any, any, any, any, any>\n | ReceiveEventError<any, any, any, any, any, any>\n | ReceiveEventStreamEnd<any, any, any, any, any, any>\n | SendEventAbort<any, any, any, any, any, any> {\n if (typeof event !== 'object') {\n return false\n }\n if ('invokeType' in event) {\n return true\n }\n\n return false\n}\n\nexport function isSendEvent(event: Eventa<any>): event is\n | SendEvent<any, any, any, any, any, any>\n | SendEventError<any, any, any, any, any, any>\n | SendEventStreamEnd<any, any, any, any, any, any>\n | SendEventAbort<any, any, any, any, any, any> {\n if (!isInvokeEventa(event)) {\n return false\n }\n\n return event.invokeType === InvokeEventType.SendEvent\n || event.invokeType === InvokeEventType.SendEventError\n || event.invokeType === InvokeEventType.SendEventStreamEnd\n || event.invokeType === InvokeEventType.SendEventAbort\n}\n\nexport function isReceiveEvent(event: Eventa<any>): event is\n | ReceiveEvent<any, any, any, any, any, any>\n | ReceiveEventError<any, any, any, any, any, any>\n | ReceiveEventStreamEnd<any, any, any, any, any, any> {\n if (!isInvokeEventa(event)) {\n return false\n }\n\n return event.invokeType === InvokeEventType.ReceiveEvent\n || event.invokeType === InvokeEventType.ReceiveEventError\n || event.invokeType === InvokeEventType.ReceiveEventStreamEnd\n}\n","export function randomBetween(min: number, max: number): number {\n return Math.floor(Math.random() * (max - min + 1)) + min\n}\n\n/**\n * Checks if a value is an AsyncIterable.\n *\n * @param value\n * @returns True if the value is an AsyncIterable.\n */\nexport function isAsyncIterable<T>(value: unknown): value is AsyncIterable<T> {\n return typeof value === 'object'\n && value !== null\n && Symbol.asyncIterator in value\n}\n\n/**\n * Checks if an object is a ReadableStream.\n *\n * @link https://github.com/cloudflare/workerd/blob/88e8696ce7a5f8969a7e02a2dcfb6504c17c9e8d/src/cloudflare/internal/streaming-forms.ts#L3\n * @param obj\n * @returns True if the object looks like a ReadableStream.\n */\nexport function isReadableStream<T>(obj?: unknown | null): obj is ReadableStream<T> {\n return !!(\n obj\n && typeof obj === 'object'\n && 'getReader' in obj\n && typeof obj.getReader === 'function'\n )\n}\n\nexport function createAbortError(reason?: unknown): Error {\n if (reason instanceof Error && reason.name === 'AbortError') {\n return reason\n }\n\n if (typeof DOMException !== 'undefined') {\n try {\n return new DOMException(reason ? String(reason) : 'Aborted', 'AbortError')\n }\n catch {\n // fall through\n }\n }\n\n const error = reason instanceof Error ? reason : new Error(reason ? String(reason) : 'Aborted')\n error.name = 'AbortError'\n return error\n}\n\nexport function isAbortError(error: unknown): error is Error {\n return error instanceof Error && error.name === 'AbortError'\n}\n\nexport function createUntilTriggeredOnce<F extends (...args: any[]) => any, P extends any[] = Parameters<F>, R = ReturnType<F>>(fn: F): {\n onceTriggered: Promise<Awaited<R>>\n wrapper: (...args: P) => Promise<Awaited<R>>\n} {\n let resolve!: (r: Awaited<R>) => void\n const promise = new Promise<Awaited<R>>((res) => {\n resolve = res\n })\n\n const handler = async (...args: P[]): Promise<Awaited<R>> => {\n const res = await fn(...args)\n resolve(res)\n return res\n }\n\n return {\n onceTriggered: promise,\n wrapper: handler,\n }\n}\n\nexport function createUntilTriggered<P, R>(fn: (...args: P[]) => R): {\n promise: Promise<void>\n handler: () => void\n} {\n let resolve!: () => void\n const promise = new Promise<void>((res) => {\n resolve = res\n })\n\n const handler = (...args: P[]): R => {\n resolve()\n return fn(...args)\n }\n\n return { promise, handler }\n}\n\nexport function createUntil<T>(options?: { intervalHandler?: () => Promise<boolean>, interval?: number }): {\n promise: Promise<T>\n handler: (value: T) => void\n} {\n let resolve!: (value: T) => void\n const promise = new Promise<T>((res) => {\n resolve = res\n })\n\n if (options?.intervalHandler) {\n setInterval(() => {\n options?.intervalHandler?.().then((shouldResolve) => {\n if (shouldResolve) {\n resolve(undefined as unknown as T)\n }\n })\n }, options.interval ?? 50)\n }\n\n return { promise, handler: resolve }\n}\n","import type { EventContext } from './context'\nimport type { Eventa } from './eventa'\nimport type { InvokeEventa, InvokeHandlerEventa, ReceiveEvent, ReceiveEventError, SendEvent, SendEventAbort, SendEventStreamEnd } from './invoke-shared'\n\nimport { getContextExtensionInvokeInternalConfig } from './context-extension-invoke-internal'\nimport { defineEventa, nanoid } from './eventa'\nimport { isReceiveEvent } from './invoke-shared'\nimport { createAbortError, isAbortError, isAsyncIterable, isReadableStream } from './utils'\n\ntype IsInvokeRequestOptional<EC extends EventContext<any, any>>\n = EC extends EventContext<infer E, any>\n ? E extends { invokeRequest: any }\n ? undefined extends E['invokeRequest']\n ? true\n : false\n : E extends { invokeRequest?: any }\n ? undefined extends E['invokeRequest']\n ? true\n : false\n : true\n : true\n\nexport type ExtractInvokeRequestOptions<EC extends EventContext<any, any>>\n = EC extends EventContext<infer E, any>\n ? E extends { invokeRequest: infer IR }\n ? IR & { signal?: AbortSignal }\n : E extends { invokeRequest?: infer IR }\n ? IR & { signal?: AbortSignal }\n : { signal?: AbortSignal }\n : { signal?: AbortSignal }\n\nexport type ExtractInvokeResponseOptions<EC extends EventContext<any, any>>\n = EC extends EventContext<infer E, any>\n ? E extends { invokeResponse: infer IR }\n ? IR\n : E extends { invokeResponse?: infer IR }\n ? IR\n : undefined\n : undefined\n\nexport type InvokeFunction<Res, Req, EC extends EventContext<any, any>>\n = [Req] extends [undefined]\n ? IsInvokeRequestOptional<EC> extends true\n ? (req?: Req, options?: ExtractInvokeRequestOptions<EC>) => Promise<Res>\n : (req: Req, options: ExtractInvokeRequestOptions<EC>) => Promise<Res>\n : IsInvokeRequestOptional<EC> extends true\n ? (req: Req, options?: ExtractInvokeRequestOptions<EC>) => Promise<Res>\n : (req: Req, options: ExtractInvokeRequestOptions<EC>) => Promise<Res>\n\nexport type InvokeFunctionMap<EventMap extends Record<string, InvokeEventa<any, any, any, any>>, EC extends EventContext<any, any>> = {\n [K in keyof EventMap]: EventMap[K] extends InvokeEventa<infer Res, infer Req, any, any> ? InvokeFunction<Res, Req, EC> : never\n}\n\nexport type ExtendableInvokeResponse<Res, EC extends EventContext<any, any>>\n = | Promise<Res>\n | Res\n | Promise<{ response: Res, invokeResponse?: ExtractInvokeResponseOptions<EC> }>\n | { response: Res, invokeResponse?: ExtractInvokeResponseOptions<EC> }\n\nexport function isExtendableInvokeResponseLike<Res, EC extends EventContext<any, any>>(value: Eventa<unknown> | ReceiveEvent<{ response: Res, invokeResponse?: unknown }>): value is ReceiveEvent<{ response: Res, invokeResponse?: ExtractInvokeResponseOptions<EC> }> {\n if (!isReceiveEvent(value)) {\n return false\n }\n\n return typeof value.body?.content === 'object'\n && value.body?.content != null\n && 'response' in value.body.content\n && (\n !('invokeResponse' in value.body.content)\n || (\n 'invokeResponse' in value.body.content\n && (\n typeof value.body.content.invokeResponse === 'object'\n || typeof value.body.content.invokeResponse === 'undefined'\n )\n )\n )\n}\n\nexport type Handler<Res, Req = any, EC extends EventContext<any, any> = EventContext<any, any>, RawEventOptions = unknown> = (\n payload: Req,\n options?: {\n abortController?: AbortController\n } & RawEventOptions,\n) => ExtendableInvokeResponse<Res, EC>\n\ninterface InternalInvokeHandler<\n Res,\n Req = any,\n ResErr = Error,\n ReqErr = Error,\n EO = any,\n M = undefined,\n IM = undefined,\n> {\n onSend: (params: InvokeEventa<Res, Req, ResErr, ReqErr, M, IM>['sendEvent'], eventOptions?: EO) => void\n onSendStreamEnd: (params: InvokeEventa<Res, Req, ResErr, ReqErr, M, IM>['sendEventStreamEnd'], eventOptions?: EO) => void\n onSendAbort: (params: InvokeEventa<Res, Req, ResErr, ReqErr, M, IM>['sendEventAbort'], eventOptions?: EO) => void\n}\n\nexport type HandlerMap<\n EventMap extends Record<string, InvokeEventa<any, any, any, any, any, any>>,\n EO = any,\n EC extends EventContext<any, any> = EventContext<any, any>,\n> = {\n [K in keyof EventMap]: EventMap[K] extends InvokeEventa<infer Res, infer Req, any, any, any, any>\n ? Handler<Res, Req, EC, EO>\n : never\n}\n\nexport interface InvocableEventContext<E, EO> extends EventContext<E, EO> {\n invokeHandlers?: Map<string, Map<Handler<any>, InternalInvokeHandler<any, any, any, any, any, any, any>>>\n}\n\n/**\n * Create a unary invoke function (client side).\n *\n * It supports unary or streaming requests, but returns a single response.\n * Use `defineStreamInvoke` when you expect a stream of responses.\n *\n * If you want stream input, set `Req` to `ReadableStream<T>` or `AsyncIterable<T>`\n * (or a union type like `T | ReadableStream<T>` for optional streaming).\n *\n * @example\n * ```ts\n * // 1) Define eventa once (shared by client/server)\n * const events = defineInvokeEventa<{ id: string }, { name: string }>()\n *\n * // 2) Client: define invoke function\n * const invoke = defineInvoke(clientCtx, events)\n *\n * // 3) Call\n * const res = await invoke({ name: 'alice' })\n * ```\n *\n * @example\n * ```ts\n * // Stream request -> unary response\n * const events = defineInvokeEventa<number, ReadableStream<number>>()\n *\n * defineInvokeHandler(serverCtx, events, async (payload) => {\n * let sum = 0\n * for await (const value of payload) {\n * sum += value\n * }\n *\n * return sum\n * })\n *\n * const invoke = defineInvoke(clientCtx, events)\n * const input = new ReadableStream<number>({\n * start(controller) {\n * controller.enqueue(1)\n * controller.enqueue(2)\n * controller.close()\n * },\n * })\n *\n * const total = await invoke(input)\n * ```\n *\n * @param ctx Event context on the caller/client side.\n * @param event Invoke event definition created by `defineInvokeEventa`.\n */\nexport function defineInvoke<\n Res,\n Req = undefined,\n ResErr = Error,\n ReqErr = Error,\n M = undefined,\n IM = undefined,\n CtxExt = any,\n EOpts = any,\n ECtx extends EventContext<CtxExt, EOpts> = EventContext<CtxExt, EOpts>,\n>(ctx: ECtx | (() => ECtx | Promise<ECtx>), event: InvokeEventa<Res, Req, ResErr, ReqErr, M, IM>): InvokeFunction<Res, Req, ECtx> {\n function getContext(): ECtx | Promise<ECtx> {\n if (typeof ctx === 'function') {\n return ctx()\n }\n\n return ctx\n }\n\n function createInvokePromise(resolvedCtx: ECtx, req?: Req, options?: ExtractInvokeRequestOptions<ECtx>): Promise<Res> {\n return new Promise<Res>((resolve, reject) => {\n const ctx = resolvedCtx\n const invokeId = nanoid()\n\n const invokeReceiveEvent = defineEventa(`${event.receiveEvent.id}-${invokeId}`) as ReceiveEvent<Res, Req, ResErr, ReqErr, M, IM>\n delete invokeReceiveEvent.metadata\n const invokeReceiveEventError = defineEventa(`${event.receiveEventError.id}-${invokeId}`) as ReceiveEventError<Res, Req, ResErr, ReqErr, M, IM>\n delete invokeReceiveEventError.metadata\n\n const { signal, ...emitOptions } = (options ?? {}) as ExtractInvokeRequestOptions<ECtx> & Record<string, any>\n let finished = false\n\n const onAbort = () => {\n ctx.emit(event.sendEventAbort, { invokeId, content: signal?.reason }, emitOptions as any)\n // eslint-disable-next-line ts/no-use-before-define\n finishReject(createAbortError(signal?.reason))\n }\n\n // Hook into adapter-level fatal events (e.g., worker error) so any pending invoke\n // is rejected immediately instead of waiting forever for a response.\n const invokeInternalConfig = getContextExtensionInvokeInternalConfig(ctx)\n const abortOffs: Array<() => void> = []\n const onAbortEvent = (payload: Eventa<any>, eventOptions?: any) => {\n // Workflow: adapter emits a fatal event -> we map it (if configured) -> reject this invoke.\n const mappedError = invokeInternalConfig?.mapAbortError?.(payload, eventOptions)\n if (typeof mappedError !== 'undefined') {\n // eslint-disable-next-line ts/no-use-before-define\n finishReject(mappedError)\n return\n }\n\n const body: any = payload?.body\n const error = body && typeof body === 'object' && 'error' in body\n ? body.error\n : (typeof body !== 'undefined' ? body : payload)\n\n // eslint-disable-next-line ts/no-use-before-define\n finishReject(error)\n }\n\n const cleanup = () => {\n ctx.off(invokeReceiveEvent)\n ctx.off(invokeReceiveEventError)\n for (const off of abortOffs) {\n off()\n }\n if (signal) {\n signal.removeEventListener('abort', onAbort)\n }\n }\n\n const finishReject = (error?: any) => {\n if (finished) {\n return\n }\n\n finished = true\n reject(error)\n cleanup()\n }\n\n const finishResolve = (value: Res) => {\n if (finished) {\n return\n }\n finished = true\n resolve(value)\n\n cleanup()\n }\n\n ctx.on(invokeReceiveEvent, (payload) => {\n if (!payload.body) {\n return\n }\n if (payload.body.invokeId !== invokeId) {\n return\n }\n\n const { content } = payload.body\n finishResolve(content as Res)\n })\n\n ctx.on(invokeReceiveEventError, (payload) => {\n if (!payload.body) {\n return\n }\n if (payload.body.invokeId !== invokeId) {\n return\n }\n\n const { error } = payload.body.content\n finishReject(error)\n })\n\n if (invokeInternalConfig?.abortOnEvents?.length) {\n for (const eventOrMatch of invokeInternalConfig.abortOnEvents) {\n abortOffs.push(ctx.on(eventOrMatch as any, onAbortEvent as any))\n }\n }\n\n if (signal) {\n if (signal.aborted) {\n onAbort()\n return\n }\n\n signal.addEventListener('abort', onAbort, { once: true })\n }\n\n if (!isReadableStream<Req>(req) && !isAsyncIterable<Req>(req)) {\n ctx.emit(event.sendEvent, { invokeId, content: req as Req }, emitOptions as any)\n }\n else {\n const sendChunk = (chunk: Req) => {\n if (finished) {\n return\n }\n ctx.emit(event.sendEvent, { invokeId, content: chunk, isReqStream: true }, emitOptions as any) // emit: event_trigger\n }\n\n const sendEnd = () => {\n if (finished) {\n return\n }\n ctx.emit(event.sendEventStreamEnd, { invokeId, content: undefined }, emitOptions as any) // emit: event_stream_end\n }\n\n const pump = async () => {\n try {\n for await (const chunk of req) {\n // If aborted already, no further emits\n if (signal?.aborted) {\n return\n }\n\n sendChunk(chunk)\n }\n\n sendEnd()\n }\n catch (error) {\n // Make sure no further emits after abort\n if (signal?.aborted) {\n return\n }\n if (isAbortError(error)) {\n ctx.emit(event.sendEventAbort, { invokeId, content: error }, emitOptions as any)\n return\n }\n\n ctx.emit(event.sendEventError, { invokeId, content: error as ReqErr }, emitOptions as any) // emit: event_error\n }\n }\n\n pump()\n }\n })\n }\n\n function _invoke(req?: Req, options?: ExtractInvokeRequestOptions<ECtx>): Promise<Res> {\n const resolvedCtx = getContext()\n if (resolvedCtx instanceof Promise) {\n return resolvedCtx.then(ctx => createInvokePromise(ctx, req, options))\n }\n\n return createInvokePromise(resolvedCtx, req, options)\n }\n\n return _invoke as InvokeFunction<Res, Req, ECtx>\n}\n\n/**\n * Create a map of invoke functions from a map of invoke events (client side).\n *\n * @example\n * ```ts\n * const events = {\n * double: defineInvokeEventa<number, number>(),\n * greet: defineInvokeEventa<string, { name: string }>(),\n * }\n *\n * const invokes = defineInvokes(ctx, events)\n * const result = await invokes.double(2)\n * ```\n *\n * @param ctx Event context on the caller/client side.\n * @param events Map of invoke events created by `defineInvokeEventa`.\n */\nexport function defineInvokes<\n EK extends string,\n EventMap extends Record<EK, InvokeEventa<any, any, any, any, any, any>>,\n CtxExt = any,\n EOpts = any,\n ECtx extends EventContext<CtxExt, EOpts> = EventContext<CtxExt, EOpts>,\n>(ctx: ECtx | (() => ECtx | Promise<ECtx>), events: EventMap): InvokeFunctionMap<EventMap, ECtx> {\n const invokes = (Object.keys(events) as EK[]).reduce((invokes, key) => {\n invokes[key] = defineInvoke(ctx, events[key])\n return invokes\n }, {} as Record<EK, InvokeFunction<any, any, ECtx>>)\n\n return invokes as InvokeFunctionMap<EventMap, ECtx>\n}\n\n/**\n * Define a unary invoke handler (server side).\n *\n * The handler can accept a unary or streaming request; it must return\n * a single response (or an extendable response envelope).\n *\n * @example\n * ```ts\n * const events = defineInvokeEventa<{ id: string }, { name: string }>()\n *\n * defineInvokeHandler(serverCtx, events, ({ name }) => ({\n * id: `user-${name}`,\n * }))\n * ```\n *\n * @param ctx Event context on the handler/server side.\n * @param event Invoke event definition created by `defineInvokeEventa`.\n * @param handler Handler that returns a response (or response + metadata).\n */\nexport function defineInvokeHandler<\n Res,\n Req = undefined,\n ResErr = Error,\n ReqErr = Error,\n M = undefined,\n IM = undefined,\n CtxExt = any,\n EOpts extends { raw?: any } = any,\n>(\n ctx: InvocableEventContext<CtxExt, EOpts>,\n event: InvokeHandlerEventa<Res, Req, ResErr, ReqErr, M, IM>,\n handler: Handler<Res, Req, InvocableEventContext<CtxExt, EOpts>, EOpts>,\n): () => void {\n if (!ctx.invokeHandlers) {\n ctx.invokeHandlers = new Map()\n }\n\n let handlers = ctx.invokeHandlers?.get(event.sendEvent.id)\n if (!handlers) {\n handlers = new Map()\n ctx.invokeHandlers?.set(event.sendEvent.id, handlers)\n }\n\n let internalHandler = handlers.get(handler) as InternalInvokeHandler<Res, Req, ResErr, ReqErr, EOpts, M, IM> | undefined\n if (!internalHandler) {\n const streamStates = new Map<string, ReadableStreamDefaultController<Req>>()\n const abortControllers = new Map<string, AbortController>()\n const abortReasons = new Map<string, unknown>()\n const scheduleAbort = (controller: AbortController, reason: unknown) => {\n // NOTICE: use microtask to avoid aborting before the handler starts.\n // This is important when the handler creates streams or async iterables\n if (typeof queueMicrotask !== 'undefined') {\n queueMicrotask(() => controller.abort(reason))\n return\n }\n\n Promise.resolve().then(() => controller.abort(reason))\n }\n\n const handleInvoke = async (invokeId: string, payload: Req, options?: EOpts) => {\n const abortController = new AbortController()\n abortControllers.set(invokeId, abortController)\n\n if (abortReasons.has(invokeId)) {\n scheduleAbort(abortController, abortReasons.get(invokeId))\n }\n\n const handlerOptions = options\n ? { ...options, abortController }\n : ({ abortController } as EOpts & { abortController: AbortController })\n\n try {\n const response = await handler(payload as Req, handlerOptions) // Call the handler function with the request payload\n ctx.emit(\n { ...defineEventa(`${event.receiveEvent.id}-${invokeId}`), invokeType: event.receiveEvent.invokeType } as ReceiveEvent<ExtendableInvokeResponse<Res, InvocableEventContext<CtxExt, EOpts>>, M, IM>,\n { invokeId, content: response },\n options,\n ) // emit: event_response\n }\n catch (error) {\n // TODO: to error object\n ctx.emit(\n { ...defineEventa(`${event.receiveEventError.id}-${invokeId}`), invokeType: event.receiveEventError.invokeType } as ReceiveEventError<Res, Req, ResErr, ReqErr, M, IM>,\n { invokeId, content: { error: error as ResErr } },\n options,\n )\n }\n finally {\n abortControllers.delete(invokeId)\n abortReasons.delete(invokeId)\n }\n }\n\n const onSend = async (payload: SendEvent<Res, Req, ResErr, ReqErr, M, IM>, options: EOpts) => { // on: event_trigger\n if (!payload.body) {\n return\n }\n if (!payload.body.invokeId) {\n return\n }\n\n const invokeId = payload.body.invokeId\n if (payload.body.isReqStream) {\n let controller = streamStates.get(invokeId)\n if (!controller) {\n let localController: ReadableStreamDefaultController<Req>\n const reqStream = new ReadableStream<Req>({\n start(c) {\n localController = c\n },\n })\n\n controller = localController!\n streamStates.set(invokeId, controller)\n // TODO: perhaps, can we correctly write type Req here?\n handleInvoke(invokeId, reqStream as Req, options)\n }\n\n controller.enqueue(payload.body.content as Req)\n return\n }\n\n handleInvoke(invokeId, payload.body?.content as Req, options)\n }\n\n const onSendStreamEnd = (payload: SendEventStreamEnd<Res, Req, ResErr, ReqErr, M, IM>, options: EOpts) => { // on: event_stream_end\n if (!payload.body) {\n return\n }\n if (!payload.body.invokeId) {\n return\n }\n\n const invokeId = payload.body.invokeId\n let controller = streamStates.get(invokeId)\n if (!controller) {\n let localController: ReadableStreamDefaultController<Req>\n const reqStream = new ReadableStream<Req>({\n start(c) {\n localController = c\n },\n })\n\n controller = localController!\n streamStates.set(invokeId, controller)\n // TODO: perhaps, can we correctly write type Req here?\n handleInvoke(invokeId, reqStream as Req, options)\n }\n\n controller.close()\n streamStates.delete(invokeId)\n }\n\n const onSendAbort = (payload: SendEventAbort<Res, Req, ResErr, ReqErr, M, IM>, options: EOpts) => { // on: event_abort\n if (!payload.body) {\n return\n }\n if (!payload.body.invokeId) {\n return\n }\n\n const invokeId = payload.body.invokeId\n const reason = payload.body.content\n const abortController = abortControllers.get(invokeId)\n if (!abortController) {\n abortReasons.set(invokeId, reason)\n\n let streamController = streamStates.get(invokeId)\n if (!streamController) {\n let localController: ReadableStreamDefaultController<Req>\n const reqStream = new ReadableStream<Req>({\n start(c) {\n localController = c\n },\n })\n\n streamController = localController!\n streamStates.set(invokeId, streamController)\n handleInvoke(invokeId, reqStream as Req, options)\n }\n\n streamController.error(createAbortError(reason))\n streamStates.delete(invokeId)\n return\n }\n\n scheduleAbort(abortController, reason)\n\n const streamController = streamStates.get(invokeId)\n if (streamController) {\n streamController.error(createAbortError(reason))\n streamStates.delete(invokeId)\n }\n }\n\n internalHandler = { onSend, onSendStreamEnd, onSendAbort }\n handlers.set(handler, internalHandler)\n\n ctx.on(event.sendEvent, internalHandler.onSend)\n ctx.on(event.sendEventStreamEnd, internalHandler.onSendStreamEnd)\n ctx.on(event.sendEventAbort, internalHandler.onSendAbort)\n }\n\n return () => {\n ctx.off(event.sendEvent, internalHandler.onSend)\n ctx.off(event.sendEventStreamEnd, internalHandler.onSendStreamEnd)\n ctx.off(event.sendEventAbort, internalHandler.onSendAbort)\n }\n}\n\n/**\n * Define multiple invoke handlers in batch (server side).\n *\n * @example\n * ```ts\n * const events = {\n * double: defineInvokeEventa<number, number>(),\n * greet: defineInvokeEventa<string, { name: string }>(),\n * }\n *\n * defineInvokeHandlers(ctx, events, {\n * double: value => value * 2,\n * greet: ({ name }) => `hi ${name}`,\n * })\n * ```\n *\n * @param ctx Event context on the handler/server side.\n * @param events Map of invoke events created by `defineInvokeEventa`.\n * @param handlers Map of handlers keyed by event name.\n */\nexport function defineInvokeHandlers<\n EK extends string,\n EventMap extends Record<EK, InvokeEventa<any, any, any, any>>,\n CtxExt = any,\n EOpts extends { raw?: any } = any,\n>(\n ctx: InvocableEventContext<CtxExt, EOpts>,\n events: EventMap,\n handlers: HandlerMap<EventMap, EOpts>,\n): Record<EK, () => void> {\n const eventKeys = Object.keys(events) as EK[]\n const handlerKeys = new Set(Object.keys(handlers) as EK[])\n\n if (eventKeys.length !== handlerKeys.size || !eventKeys.every(key => handlerKeys.has(key))) {\n throw new Error('The keys of events and handlers must match.')\n }\n\n return eventKeys.reduce((returnValues, key) => {\n returnValues[key] = defineInvokeHandler(ctx, events[key], handlers[key])\n return returnValues\n }, {} as Record<EK, () => void>)\n}\n\n/**\n * Remove one or all invoke handlers for a specific invoke event (server side).\n *\n * @example\n * ```ts\n * const off = defineInvokeHandler(ctx, events, handler)\n * off() // remove one handler\n *\n * // or remove all handlers for the event:\n * undefineInvokeHandler(ctx, events)\n * ```\n *\n * @param ctx Event context on the handler/server side.\n * @param event Invoke event definition created by `defineInvokeEventa`.\n * @param handler Specific handler to remove (omit to remove all).\n * @returns `true` if at least one handler was removed, `false` otherwise\n */\nexport function undefineInvokeHandler<\n Res,\n Req = undefined,\n ResErr = Error,\n ReqErr = Error,\n CtxExt = any,\n EOpts = any,\n>(\n ctx: InvocableEventContext<CtxExt, EOpts>,\n event: InvokeEventa<Res, Req, ResErr, ReqErr>,\n handler?: Handler<Res, Req, InvocableEventContext<CtxExt, EOpts>, EOpts>,\n): boolean {\n if (!ctx.invokeHandlers)\n return false\n\n const handlers = ctx.invokeHandlers?.get(event.sendEvent.id)\n if (!handlers)\n return false\n\n if (handler) {\n const internalHandler = handlers.get(handler)\n if (!internalHandler)\n return false\n\n ctx.off(event.sendEvent, internalHandler.onSend)\n ctx.off(event.sendEventStreamEnd, internalHandler.onSendStreamEnd)\n ctx.off(event.sendEventAbort, internalHandler.onSendAbort)\n ctx.invokeHandlers.delete(event.sendEvent.id)\n\n return true\n }\n\n let returnValue = false\n for (const internalHandlers of handlers.values()) {\n ctx.off(event.sendEvent, internalHandlers.onSend)\n ctx.off(event.sendEventStreamEnd, internalHandlers.onSendStreamEnd)\n ctx.off(event.sendEventAbort, internalHandlers.onSendAbort)\n returnValue = true\n }\n\n ctx.invokeHandlers.delete(event.sendEvent.id)\n\n return returnValue\n}\n","import type { EventContext } from './context'\nimport type { ExtendableInvokeResponse } from './invoke'\n\nexport interface WithTransfer<T> {\n message: T\n _transfer?: Transferable[]\n}\n\nexport function withTransfer<T>(body: T, transfer?: Transferable[]): ExtendableInvokeResponse<T, EventContext<{ invokeResponse?: { transfer?: Transferable[] } }, any>> {\n return {\n response: body,\n invokeResponse: {\n transfer: transfer ?? [],\n },\n }\n}\n","import type { EventContext } from './context'\nimport type { ExtractInvokeRequestOptions, Handler, InvocableEventContext } from './invoke'\nimport type { InvokeEventa } from './invoke-shared'\n\nimport { nanoid } from './eventa'\nimport { defineInvoke, defineInvokeHandler } from './invoke'\nimport { defineInvokeEventa } from './invoke-shared'\n\nexport interface InvokeFunctionStubOptions {\n allow?: boolean\n maxDepth?: number\n maxFunctions?: number\n tagPrefix?: string\n onDisallowedTag?: 'ignore' | 'throw'\n autoDisposeMs?: number\n strict?: boolean\n}\n\nexport type RemoteInvokeOptions<EC extends EventContext<any, any>> = ExtractInvokeRequestOptions<EC> & {\n functionStubs?: boolean | InvokeFunctionStubOptions\n}\n\nexport interface RemoteInvokeResult<Res> extends Promise<Res> {\n dispose: () => void\n}\n\nexport type RemoteInvokeFunction<Res, Req, EC extends EventContext<any, any>>\n = [Req] extends [undefined]\n ? (req?: Req, options?: RemoteInvokeOptions<EC>) => RemoteInvokeResult<Res>\n : (req: Req, options?: RemoteInvokeOptions<EC>) => RemoteInvokeResult<Res>\n\nconst DEFAULT_FUNCTION_STUB_OPTIONS: Required<Pick<InvokeFunctionStubOptions, 'maxDepth' | 'maxFunctions' | 'tagPrefix' | 'onDisallowedTag' | 'autoDisposeMs' | 'strict'>> = {\n maxDepth: 32,\n maxFunctions: 32,\n tagPrefix: 'eventa-invoke-fn-',\n onDisallowedTag: 'ignore',\n autoDisposeMs: 0,\n strict: false,\n}\n\nexport function createRemoteMethodTagPrefix(prefix = DEFAULT_FUNCTION_STUB_OPTIONS.tagPrefix) {\n return `${prefix}${nanoid()}-`\n}\n\nfunction normalizeFunctionStubOptions(options?: boolean | InvokeFunctionStubOptions) {\n if (options === true) {\n return {\n allow: true,\n ...DEFAULT_FUNCTION_STUB_OPTIONS,\n }\n }\n if (!options) {\n return {\n allow: false,\n ...DEFAULT_FUNCTION_STUB_OPTIONS,\n }\n }\n\n return {\n allow: options.allow ?? true,\n maxDepth: options.maxDepth ?? DEFAULT_FUNCTION_STUB_OPTIONS.maxDepth,\n maxFunctions: options.maxFunctions ?? DEFAULT_FUNCTION_STUB_OPTIONS.maxFunctions,\n tagPrefix: options.tagPrefix ?? DEFAULT_FUNCTION_STUB_OPTIONS.tagPrefix,\n onDisallowedTag: options.onDisallowedTag ?? DEFAULT_FUNCTION_STUB_OPTIONS.onDisallowedTag,\n autoDisposeMs: options.autoDisposeMs ?? DEFAULT_FUNCTION_STUB_OPTIONS.autoDisposeMs,\n strict: options.strict ?? DEFAULT_FUNCTION_STUB_OPTIONS.strict,\n }\n}\n\nfunction resolveFunctionStubOptions(\n defaults?: boolean | InvokeFunctionStubOptions,\n override?: boolean | InvokeFunctionStubOptions,\n) {\n const base = normalizeFunctionStubOptions(defaults)\n\n if (typeof override === 'undefined') {\n return base\n }\n if (typeof override === 'boolean') {\n return {\n ...base,\n allow: override,\n }\n }\n\n return {\n ...base,\n ...normalizeFunctionStubOptions(override),\n }\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n if (value == null || typeof value !== 'object') {\n return false\n }\n\n const prototype = Object.getPrototypeOf(value)\n return prototype === Object.prototype || prototype === null\n}\n\ninterface InvokeFunctionStubPayload {\n __eventaInvoke?: {\n tag: string\n }\n}\n\nfunction isInvokeFunctionStubPayload(value: unknown): value is InvokeFunctionStubPayload {\n if (!isPlainObject(value)) {\n return false\n }\n if (!('__eventaInvoke' in value)) {\n return false\n }\n\n const stub = (value as InvokeFunctionStubPayload).__eventaInvoke\n return !!stub && typeof stub === 'object' && typeof stub.tag === 'string'\n}\n\nfunction hasInvokeFunctionStubKey(value: unknown): value is Record<string, unknown> {\n return isPlainObject(value) && '__eventaInvoke' in value\n}\n\nfunction serializeInvokeFunctionPayload<T>(\n value: T,\n ctx: InvocableEventContext<any, any>,\n options: ReturnType<typeof normalizeFunctionStubOptions>,\n) {\n if (!options.allow) {\n return { value, dispose: () => void 0 }\n }\n\n let functionCount = 0\n const seen = new WeakMap<object, any>()\n const disposers: Array<() => void> = []\n\n const walk = (input: any, depth: number): any => {\n if (typeof input === 'function') {\n if (functionCount >= options.maxFunctions) {\n throw new Error(`Too many function stubs in invoke payload (max ${options.maxFunctions}).`)\n }\n\n functionCount += 1\n const tag = `${options.tagPrefix}${nanoid()}`\n const event = defineInvokeEventa<any, any>(tag)\n const off = defineInvokeHandler(ctx, event, (payload, handlerOptions) => {\n return input(payload, handlerOptions)\n })\n disposers.push(off)\n\n return { __eventaInvoke: { tag } }\n }\n\n if (input == null || typeof input !== 'object') {\n return input\n }\n\n if (depth > options.maxDepth) {\n throw new Error(`Invoke payload is too deep (max ${options.maxDepth}).`)\n }\n\n if (seen.has(input)) {\n return seen.get(input)\n }\n\n if (Array.isArray(input)) {\n const output: any[] = Array.from({ length: input.length })\n seen.set(input, output)\n for (let i = 0; i < input.length; i += 1) {\n output[i] = walk(input[i], depth + 1)\n }\n return output\n }\n\n if (!isPlainObject(input)) {\n return input\n }\n\n // Use null-prototype object to mitigate prototype pollution attacks\n // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object#null-prototype_objects\n // https://github.com/OWASP/CheatSheetSeries/blob/38a2e501d345c710207b492a50f46e0f368578fe/cheatsheets/Prototype_Pollution_Prevention_Cheat_Sheet.md\n // https://cheatsheetseries.owasp.org/cheatsheets/Prototype_Pollution_Prevention_Cheat_Sheet.html#other-resources\n const output: Record<string, any> = Object.create(null)\n seen.set(input, output)\n for (const [key, child] of Object.entries(input)) {\n output[key] = walk(child, depth + 1)\n }\n return output\n }\n\n return {\n value: walk(value, 0) as T,\n dispose: () => {\n for (const off of disposers) {\n off()\n }\n },\n }\n}\n\nfunction deserializeInvokeFunctionPayload<T>(\n value: T,\n ctx: EventContext<any, any>,\n options: ReturnType<typeof normalizeFunctionStubOptions>,\n) {\n if (!options.allow) {\n return value\n }\n\n let functionCount = 0\n const seen = new WeakMap<object, any>()\n\n const walk = (input: any, depth: number): any => {\n if (input == null || typeof input !== 'object') {\n return input\n }\n\n if (depth > options.maxDepth) {\n throw new Error(`Invoke payload is too deep (max ${options.maxDepth}).`)\n }\n\n if (isInvokeFunctionStubPayload(input)) {\n if (functionCount >= options.maxFunctions) {\n throw new Error(`Too many function stubs in invoke payload (max ${options.maxFunctions}).`)\n }\n\n const tag = input.__eventaInvoke!.tag\n if (options.tagPrefix && !tag.startsWith(options.tagPrefix)) {\n if (options.onDisallowedTag === 'throw') {\n throw new Error(`Invoke function tag not allowed: ${tag}`)\n }\n\n return input\n }\n\n functionCount += 1\n const event = defineInvokeEventa<any, any>(tag)\n\n return defineInvoke(ctx as EventContext<any, any>, event)\n }\n else if (options.strict && hasInvokeFunctionStubKey(input)) {\n throw new Error('Invalid invoke function stub payload.')\n }\n\n if (seen.has(input)) {\n return seen.get(input)\n }\n\n if (Array.isArray(input)) {\n const output: any[] = Array.from({ length: input.length })\n seen.set(input, output)\n for (let i = 0; i < input.length; i += 1) {\n output[i] = walk(input[i], depth + 1)\n }\n return output\n }\n\n if (!isPlainObject(input)) {\n return input\n }\n\n // Use null-prototype object to mitigate prototype pollution attacks\n // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object#null-prototype_objects\n // https://github.com/OWASP/CheatSheetSeries/blob/38a2e501d345c710207b492a50f46e0f368578fe/cheatsheets/Prototype_Pollution_Prevention_Cheat_Sheet.md\n // https://cheatsheetseries.owasp.org/cheatsheets/Prototype_Pollution_Prevention_Cheat_Sheet.html#other-resources\n const output: Record<string, any> = Object.create(null)\n seen.set(input, output)\n for (const [key, child] of Object.entries(input)) {\n output[key] = walk(child, depth + 1)\n }\n\n return output\n }\n\n return walk(value, 0) as T\n}\n\n/**\n * Enable \"remote method\" payloads for invoke: functions in the request body are\n * serialized into stub descriptors and rehydrated into invoke callers on the\n * receiving side.\n *\n * This is an adapter around the plain-value RPC primitives `defineInvoke` and\n * `defineInvokeHandler`. It keeps the core invoke APIs clean while offering an\n * opt-in bridge for function values.\n *\n * @example\n * ```ts\n * const remote = withRemoteMethods({ allow: true })\n * const events = defineInvokeEventa<{ output: number }, { helper: (n: number) => Promise<number> }>()\n *\n * // server (handler)\n * remote.defineInvokeHandler(serverCtx, events, async ({ helper }) => {\n * const output = await helper(21)\n * return { output }\n * })\n *\n * // client (caller)\n * const invoke = remote.defineInvoke(clientCtx, events)\n * const result = await invoke({ helper: async n => n * 2 }, { functionStubs: true })\n * ```\n *\n * @example\n * ```ts\n * // Manual cleanup when you fire-and-forget or cancel midway:\n * const invoke = remote.defineInvoke(clientCtx, events)\n * const result = invoke({ helper: () => 'ok' }, { functionStubs: true })\n * result.dispose()\n * await result\n * ```\n *\n * Security notes:\n * - This feature is off by default. Enabling it allows the remote side to call\n * back into your process; only use with trusted peers.\n * - Function stubs are tagged; prefer a unique `tagPrefix` to avoid collisions\n * (see `createRemoteMethodTagPrefix`).\n * - `maxDepth`, `maxFunctions`, and `autoDisposeMs` limit attack surface and\n * resource usage. `autoDisposeMs` is useful for fire-and-forget calls.\n * - Objects are rebuilt with a null prototype to mitigate `__proto__` pollution.\n * - Enable `strict` to reject malformed `__eventaInvoke` payloads.\n *\n * @param defaultOptions Defaults for function stub behavior. Use `{ allow: true }`\n * to enable, or provide `maxDepth`, `maxFunctions`, `tagPrefix`,\n * `onDisallowedTag`, `autoDisposeMs`, and `strict` for stricter control.\n */\nexport function withRemoteMethods(defaultOptions?: boolean | InvokeFunctionStubOptions) {\n return {\n defineInvoke<\n Res,\n Req = undefined,\n ResErr = Error,\n ReqErr = Error,\n CtxExt = any,\n EOpts = any,\n ECtx extends EventContext<CtxExt, EOpts> = EventContext<CtxExt, EOpts>,\n >(ctx: ECtx,\n event: InvokeEventa<Res, Req, ResErr, ReqErr>,\n ): RemoteInvokeFunction<Res, Req, ECtx> {\n const baseInvoke = defineInvoke(ctx, event)\n\n const invoke = ((req?: Req, options?: RemoteInvokeOptions<ECtx>) => {\n const { functionStubs, ...invokeOptions } = (options ?? {}) as RemoteInvokeOptions<ECtx> & Record<string, any>\n const normalizedOptions = resolveFunctionStubOptions(defaultOptions, functionStubs)\n\n if (!normalizedOptions.allow) {\n const promise = baseInvoke(req as Req, invokeOptions as ExtractInvokeRequestOptions<ECtx>)\n const wrapped = promise as RemoteInvokeResult<Res>\n wrapped.dispose = () => void 0\n\n return wrapped\n }\n\n let serialized: ReturnType<typeof serializeInvokeFunctionPayload<Req>>\n try {\n serialized = serializeInvokeFunctionPayload(req as Req, ctx as InvocableEventContext<any, any>, normalizedOptions)\n }\n catch (error) {\n const rejected = Promise.reject(error) as RemoteInvokeResult<Res>\n rejected.dispose = () => void 0\n\n return rejected\n }\n\n let disposed = false\n const dispose = () => {\n if (disposed) {\n return\n }\n\n disposed = true\n serialized.dispose()\n }\n\n let autoDisposeTimer: ReturnType<typeof setTimeout> | undefined\n if (normalizedOptions.autoDisposeMs > 0) {\n autoDisposeTimer = setTimeout(() => {\n dispose()\n }, normalizedOptions.autoDisposeMs)\n }\n\n const finalize = () => {\n if (autoDisposeTimer) {\n clearTimeout(autoDisposeTimer)\n }\n dispose()\n }\n\n const promise = baseInvoke(serialized.value as Req, invokeOptions as ExtractInvokeRequestOptions<ECtx>)\n .finally(finalize)\n\n const wrapped = promise as RemoteInvokeResult<Res>\n wrapped.dispose = finalize\n\n return wrapped\n }) as RemoteInvokeFunction<Res, Req, ECtx>\n\n return invoke\n },\n\n defineInvokeHandler<\n Res,\n Req = undefined,\n ResErr = Error,\n ReqErr = Error,\n CtxExt = any,\n EOpts extends { raw?: any } = any,\n >(\n ctx: InvocableEventContext<CtxExt, EOpts>,\n event: InvokeEventa<Res, Req, ResErr, ReqErr>,\n handler: Handler<Res, Req, InvocableEventContext<CtxExt, EOpts>, EOpts>,\n ) {\n const normalizedOptions = resolveFunctionStubOptions(defaultOptions)\n\n return defineInvokeHandler(ctx, event, async (payload, options) => {\n const handlerPayload = normalizedOptions.allow\n ? deserializeInvokeFunctionPayload(payload as Req, ctx, normalizedOptions)\n : payload\n\n return handler(handlerPayload as Req, options)\n })\n },\n }\n}\n","import type { EventContext } from './context'\nimport type {\n InvokeEventa,\n ReceiveEvent,\n ReceiveEventError,\n ReceiveEventStreamEnd,\n} from './invoke-shared'\n\nimport { defineEventa, nanoid } from './eventa'\nimport { createAbortError, isAbortError, isAsyncIterable, isReadableStream } from './utils'\n\n/**\n * Create a stream invoke function (client side).\n *\n * Use when the response is streamed and the request may be unary or streaming.\n *\n * Common patterns:\n * - Unary request -> stream response (server-streaming)\n * - Stream request -> stream response (bi-directional streaming)\n *\n * @example\n * ```ts\n * // 1) Define eventa once (shared by client/server)\n * const events = defineInvokeEventa<Progress | Result, Params>()\n *\n * // 2) Client: define invoke function\n * const invoke = defineStreamInvoke(clientCtx, events)\n *\n * // 3) Call with unary request\n * for await (const msg of invoke({ name: 'alice' })) {\n * console.log(msg)\n * }\n * ```\n *\n * @example\n * ```ts\n * // Client-streaming request\n * const input = new ReadableStream<number>({\n * start(c) { c.enqueue(1); c.enqueue(2); c.close() },\n * })\n *\n * for await (const msg of invoke(input)) {\n * console.log(msg)\n * }\n * ```\n *\n * @param clientCtx Event context on the caller/client side.\n * @param event Invoke event definition created by `defineInvokeEventa`.\n */\nexport function defineStreamInvoke<\n Res,\n Req = undefined,\n ResErr = Error,\n ReqErr = Error,\n E = any,\n EO = any,\n>(clientCtx: EventContext<E, EO>, event: InvokeEventa<Res, Req, ResErr, ReqErr>) {\n return (req: Req | ReadableStream<Req> | AsyncIterable<Req>, options?: { signal?: AbortSignal } & EO) => {\n const invokeId = nanoid()\n const { signal, ...emitOptions } = (options ?? {}) as { signal?: AbortSignal } & Record<string, any>\n let onAbort: (() => void) | undefined\n\n const invokeReceiveEvent = defineEventa(`${event.receiveEvent.id}-${invokeId}`) as ReceiveEvent<Res>\n const invokeReceiveEventError = defineEventa(`${event.receiveEventError.id}-${invokeId}`) as ReceiveEventError<Res, Req, ResErr, ReqErr>\n const invokeReceiveEventStreamEnd = defineEventa(`${event.receiveEventStreamEnd.id}-${invokeId}`) as ReceiveEventStreamEnd<Res>\n\n const stream = new ReadableStream<Res>({\n start(controller) {\n const cleanup = () => {\n clientCtx.off(invokeReceiveEvent)\n clientCtx.off(invokeReceiveEventError)\n clientCtx.off(invokeReceiveEventStreamEnd)\n if (signal && onAbort) {\n signal.removeEventListener('abort', onAbort)\n }\n }\n\n onAbort = () => {\n clientCtx.emit(event.sendEventAbort, { invokeId, content: signal?.reason }, emitOptions as any)\n controller.error(createAbortError(signal?.reason))\n cleanup()\n }\n\n clientCtx.on(invokeReceiveEvent, (payload) => {\n if (!payload.body) {\n return\n }\n if (payload.body.invokeId !== invokeId) {\n return\n }\n\n controller.enqueue(payload.body.content as Res)\n })\n clientCtx.on(invokeReceiveEventError, (payload) => {\n if (!payload.body) {\n return\n }\n if (payload.body.invokeId !== invokeId) {\n return\n }\n\n controller.error(payload.body.content.error as ResErr)\n cleanup()\n })\n clientCtx.on(invokeReceiveEventStreamEnd, (payload) => {\n if (!payload.body) {\n return\n }\n if (payload.body.invokeId !== invokeId) {\n return\n }\n\n controller.close()\n cleanup()\n })\n\n if (signal && onAbort) {\n if (signal.aborted) {\n onAbort()\n return\n }\n signal.addEventListener('abort', onAbort as EventListener, { once: true })\n }\n },\n cancel(reason) {\n clientCtx.emit(event.sendEventAbort, { invokeId, content: reason }, emitOptions as any)\n clientCtx.off(invokeReceiveEvent)\n clientCtx.off(invokeReceiveEventError)\n clientCtx.off(invokeReceiveEventStreamEnd)\n if (signal && onAbort) {\n signal.removeEventListener('abort', onAbort as EventListener)\n }\n },\n })\n\n if (isReadableStream<Req>(req) || isAsyncIterable<Req>(req)) {\n const sendChunk = (chunk: Req) => {\n clientCtx.emit(event.sendEvent, { invokeId, content: chunk, isReqStream: true }, emitOptions as any) // emit: event_trigger\n }\n\n const sendEnd = () => {\n clientCtx.emit(event.sendEventStreamEnd, { invokeId, content: undefined }, emitOptions as any) // emit: event_stream_end\n }\n\n const pump = async () => {\n try {\n for await (const chunk of req) {\n // If aborted already, no further emits\n if (signal?.aborted) {\n return\n }\n\n sendChunk(chunk)\n }\n\n sendEnd()\n }\n catch (error) {\n // If aborted already, no further emits\n if (signal?.aborted) {\n return\n }\n if (isAbortError(error)) {\n clientCtx.emit(event.sendEventAbort, { invokeId, content: error }, emitOptions as any)\n return\n }\n\n clientCtx.emit(event.sendEventError, { invokeId, content: error as ReqErr }, emitOptions as any) // emit: event_error\n }\n }\n\n pump()\n }\n else {\n clientCtx.emit(event.sendEvent, { invokeId, content: req }, emitOptions as any) // emit: event_trigger\n }\n\n return stream\n }\n}\n\ntype StreamHandler<Res, Req = any, RawEventOptions = unknown> = (\n payload: Req,\n options?: {\n abortController?: AbortController\n } & RawEventOptions,\n) => AsyncGenerator<Res, void, unknown>\n\n/**\n * Define a stream invoke handler (server side).\n *\n * The handler can receive either:\n * - a unary request `Req`\n * - a streaming request `ReadableStream<Req>` / `AsyncIterable<Req>`\n *\n * It must return an async generator of response messages.\n *\n * @example\n * ```ts\n * const events = defineInvokeEventa<Progress | Result, Params>()\n *\n * defineStreamInvokeHandler(serverCtx, events, async function* (payload) {\n * if (isReadableStream<Params>(payload) || isAsyncIterable<Params>(payload)) {\n * for await (const item of payload) {\n * yield { type: 'progress', value: item }\n * }\n * }\n *\n * yield { type: 'result', ok: true }\n * })\n * ```\n *\n * @param serverCtx Event context on the handler/server side.\n * @param event Invoke event definition created by `defineInvokeEventa`.\n * @param fn Stream handler that yields response chunks.\n */\nexport function defineStreamInvokeHandler<\n Res,\n Req = undefined,\n ResErr = Error,\n ReqErr = Error,\n E = any,\n EO extends { raw?: any } = any,\n>(serverCtx: EventContext<E, EO>, event: InvokeEventa<Res, Req, ResErr, ReqErr>, fn: StreamHandler<Res, Req, EO>) {\n const invokeReceiveEvent = (invokeId: string) => defineEventa(`${event.receiveEvent.id}-${invokeId}`) as ReceiveEvent<Res>\n const invokeReceiveEventError = (invokeId: string) => defineEventa(`${event.receiveEventError.id}-${invokeId}`) as ReceiveEventError<Res, Req, ResErr, ReqErr>\n const invokeReceiveEventStreamEnd = (invokeId: string) => defineEventa(`${event.receiveEventStreamEnd.id}-${invokeId}`) as ReceiveEventStreamEnd<Res>\n const streamStates = new Map<string, ReadableStreamDefaultController<Req>>()\n const abortControllers = new Map<string, AbortController>()\n const abortReasons = new Map<string, unknown>()\n const scheduleAbort = (controller: AbortController, reason: unknown) => {\n if (typeof queueMicrotask !== 'undefined') {\n queueMicrotask(() => controller.abort(reason))\n return\n }\n Promise.resolve().then(() => controller.abort(reason))\n }\n\n const handleInvoke = async (invokeId: string, payload: Req, options?: EO) => {\n const receiveEvent = invokeReceiveEvent(invokeId)\n const receiveEventError = invokeReceiveEventError(invokeId)\n const receiveEventStreamEnd = invokeReceiveEventStreamEnd(invokeId)\n const abortController = new AbortController()\n abortControllers.set(invokeId, abortController)\n\n if (abortReasons.has(invokeId)) {\n scheduleAbort(abortController, abortReasons.get(invokeId))\n }\n\n const handlerOptions = options\n ? { ...options, abortController }\n : ({ abortController } as EO & { abortController: AbortController })\n\n try {\n const generator = fn(payload, handlerOptions) // Call the handler function with the request payload\n for await (const res of generator) {\n serverCtx.emit(receiveEvent, { invokeId, content: res }, options) // emit: event_response\n }\n\n serverCtx.emit(receiveEventStreamEnd, { invokeId, content: undefined }, options) // emit: event_stream_end\n }\n catch (error) {\n serverCtx.emit(receiveEventError, { invokeId, content: { error: error as ResErr } }, options) // emit: event_response with error\n }\n finally {\n abortControllers.delete(invokeId)\n abortReasons.delete(invokeId)\n }\n }\n\n serverCtx.on(event.sendEvent, async (payload, options) => { // on: event_trigger\n if (!payload.body) {\n return\n }\n if (!payload.body.invokeId) {\n return\n }\n\n const invokeId = payload.body.invokeId\n if (payload.body.isReqStream) {\n let controller = streamStates.get(invokeId)\n if (!controller) {\n let localController: ReadableStreamDefaultController<Req>\n const reqStream = new ReadableStream<Req>({\n start(c) {\n localController = c\n },\n })\n\n controller = localController!\n streamStates.set(invokeId, controller)\n // TODO: can we write type Req here correctly?\n handleInvoke(invokeId, reqStream as Req, options)\n }\n\n controller.enqueue(payload.body.content as Req)\n return\n }\n\n handleInvoke(invokeId, payload.body.content as Req, options)\n })\n\n serverCtx.on(event.sendEventStreamEnd, (payload) => { // on: event_stream_end\n if (!payload.body) {\n return\n }\n if (!payload.body.invokeId) {\n return\n }\n\n const controller = streamStates.get(payload.body.invokeId)\n if (!controller) {\n return\n }\n\n controller.close()\n streamStates.delete(payload.body.invokeId)\n })\n\n serverCtx.on(event.sendEventAbort, (payload) => { // on: event_abort\n if (!payload.body) {\n return\n }\n if (!payload.body.invokeId) {\n return\n }\n\n const invokeId = payload.body.invokeId\n const reason = payload.body.content\n const abortController = abortControllers.get(invokeId)\n if (!abortController) {\n abortReasons.set(invokeId, reason)\n\n let controller = streamStates.get(invokeId)\n if (!controller) {\n let localController: ReadableStreamDefaultController<Req>\n const reqStream = new ReadableStream<Req>({\n start(c) {\n localController = c\n },\n })\n\n controller = localController!\n streamStates.set(invokeId, controller)\n handleInvoke(invokeId, reqStream as Req)\n }\n\n controller.error(createAbortError(reason))\n streamStates.delete(invokeId)\n return\n }\n\n scheduleAbort(abortController, reason)\n\n const controller = streamStates.get(invokeId)\n if (controller) {\n controller.error(createAbortError(reason))\n streamStates.delete(invokeId)\n }\n })\n}\n\n/**\n * Convert a callback-style handler into a stream handler.\n *\n * Use `emit` to push response chunks, and return when done.\n * Works for unary or streaming requests.\n *\n * @example\n * ```ts\n * defineStreamInvokeHandler(ctx, events, toStreamHandler(async ({ payload, emit }) => {\n * if (isReadableStream<Params>(payload) || isAsyncIterable<Params>(payload)) {\n * for await (const item of payload) {\n * emit({ type: 'progress', value: item })\n * }\n *\n * emit({ type: 'result', ok: true })\n * return\n * }\n *\n * emit({ type: 'result', ok: true })\n * }))\n * ```\n *\n * @param handler Callback handler with `emit` for streaming responses.\n */\nexport function toStreamHandler<Req, Res, EO extends { raw?: any } = any>(handler: (context: { payload: Req, options?: EO, emit: (data: Res) => void }) => Promise<void>): StreamHandler<Res, Req, EO> {\n return (payload, options) => {\n const values: Promise<[Res, boolean]>[] = []\n let resolve: (x: [Res, boolean]) => void\n let handlerError: Error | null = null\n\n values.push(new Promise((r) => {\n resolve = r\n }))\n\n const emit = (data: Res) => {\n resolve([data, false])\n\n values.push(new Promise((r) => {\n resolve = r\n }))\n }\n\n // Start the handler and mark completion when done\n handler({ payload, options, emit })\n .then(() => {\n resolve([undefined as any, true])\n })\n .catch((err) => {\n handlerError = err\n resolve([undefined as any, true])\n })\n\n return (async function* () {\n let val: Res\n\n for (let i = 0, done = false; !done; i++) {\n [val, done] = await values[i]\n delete values[i] // Clean up memory\n\n if (handlerError) {\n throw handlerError\n }\n\n if (!done) {\n yield val\n }\n }\n }())\n }\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@moeru/eventa",
3
3
  "type": "module",
4
- "version": "1.0.0-beta.1",
4
+ "version": "1.0.0-beta.3",
5
5
  "description": "Events are all you need",
6
6
  "author": {
7
7
  "name": "RainbowBird",
@@ -1 +0,0 @@
1
- {"version":3,"file":"context-ex8urwfs.mjs","names":["matcher: (event: E) => boolean | Promise<boolean>"],"sources":["../src/eventa.ts","../src/context.ts"],"sourcesContent":["import isGlobMatch from 'picomatch'\n\nimport { customAlphabet } from 'nanoid'\n\nexport function nanoid() {\n return customAlphabet('0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz', 16)()\n}\n\nexport interface InvokeEventConstraint<_Req, _Res> {}\n\nexport type EventTag<Res, Req> = string & InvokeEventConstraint<Req, Res>\n\nexport enum EventaType {\n Event = 'event',\n MatchExpression = 'matchExpression',\n}\n\nexport enum EventaFlowDirection {\n Inbound = 'inbound',\n Outbound = 'outbound',\n}\n\nexport interface DirectionalEventa<P, T = undefined> extends Eventa<P> {\n _flowDirection: EventaFlowDirection | T\n}\n\nexport interface InboundEventa<T> extends DirectionalEventa<T> {\n _flowDirection: EventaFlowDirection.Inbound\n}\n\nexport interface OutboundEventa<T> extends DirectionalEventa<T> {\n _flowDirection: EventaFlowDirection.Outbound\n}\n\nexport function defineInboundEventa<T>(id?: string): InboundEventa<T> {\n return {\n ...defineEventa<T>(id),\n _flowDirection: EventaFlowDirection.Inbound,\n } as InboundEventa<T>\n}\n\nexport function defineOutboundEventa<T>(id?: string): OutboundEventa<T> {\n return {\n ...defineEventa<T>(id),\n _flowDirection: EventaFlowDirection.Outbound,\n } as OutboundEventa<T>\n}\n\n// type ServerInvokeHandlerEvent<Req, Res> = symbol & InvokeEventConstraint<Req, Res>\n// type ClientInvoke<Req> = symbol & InvokeEventConstraint<Req, null>\n\nexport interface EventaLike<_P = undefined, T extends EventaType = EventaType> {\n id: string\n type?: T\n}\n\nexport interface Eventa<P = unknown> extends EventaLike<P, EventaType.Event> {\n body?: P\n}\n\nexport type InferEventaPayload<E> = E extends Eventa<infer P> ? P : never\n\nexport function defineEventa<P = undefined>(id?: string): Eventa<P> {\n if (!id) {\n id = nanoid()\n }\n\n return {\n id,\n type: EventaType.Event,\n }\n}\n\nexport interface EventaMatchExpression<P = undefined> extends EventaLike<P, EventaType.MatchExpression> {\n matcher?: (event: Eventa<P>) => boolean | Promise<boolean>\n}\n\nexport function and<P>(...matchExpression: Array<EventaMatchExpression<P>>): EventaMatchExpression<P> {\n return {\n id: nanoid(),\n type: EventaType.MatchExpression,\n matcher: (event: Eventa<P>) => {\n return matchExpression.every(m => m.matcher ? m.matcher(event) : false)\n },\n }\n}\n\nexport function or<P>(...matchExpression: Array<EventaMatchExpression<P>>): EventaMatchExpression<P> {\n return {\n id: nanoid(),\n type: EventaType.MatchExpression,\n matcher: (event: Eventa<P>) => {\n return matchExpression.some(m => m.matcher ? m.matcher(event) : false)\n },\n }\n}\n\nexport function matchBy<P = undefined>(glob: string, inverted?: boolean): EventaMatchExpression<P>\nexport function matchBy<P = undefined>(options: { ids: string[] }, inverted?: boolean): EventaMatchExpression<P>\nexport function matchBy<P = undefined>(options: { eventa: Eventa<P>[] }, inverted?: boolean): EventaMatchExpression<P>\nexport function matchBy<P = undefined>(options: { types: EventaType[] }, inverted?: boolean): EventaMatchExpression<P>\nexport function matchBy<P = undefined>(regExp: RegExp, inverted?: boolean): EventaMatchExpression<P>\nexport function matchBy<P = undefined, E extends Eventa<P> = Eventa<P>>(matcher: (event: E) => boolean | Promise<boolean>): EventaMatchExpression<P>\nexport function matchBy<P = undefined, E extends Eventa<P> = Eventa<P>>(\n matchExpressionPossibleValues:\n | string\n | Eventa<any>\n | { ids: string[] }\n | { eventa: Eventa<P>[] }\n | { types: EventaType[] }\n | RegExp\n | ((event: E) => boolean | Promise<boolean>),\n inverted?: boolean,\n): EventaMatchExpression<P> {\n const id = nanoid()\n\n let matcher: (event: E) => boolean | Promise<boolean> = () => false\n if (typeof matchExpressionPossibleValues === 'string') {\n matcher = (eventa) => {\n return isGlobMatch(matchExpressionPossibleValues)(eventa.id)\n }\n }\n else if (typeof matchExpressionPossibleValues === 'object') {\n if ('ids' in matchExpressionPossibleValues) {\n matcher = (event: Eventa<P>) => {\n if (inverted) {\n return !matchExpressionPossibleValues.ids.includes(event.id)\n }\n\n return matchExpressionPossibleValues.ids.includes(event.id)\n }\n }\n else if ('eventa' in matchExpressionPossibleValues) {\n matcher = (event: Eventa<P>) => {\n if (inverted) {\n return !matchExpressionPossibleValues.eventa.some(e => e.id === event.id)\n }\n\n return matchExpressionPossibleValues.eventa.some(e => e.id === event.id)\n }\n }\n else if ('types' in matchExpressionPossibleValues) {\n matcher = (event: Eventa<P>) => {\n if (typeof event.type === 'undefined') {\n return false\n }\n if (inverted) {\n return !matchExpressionPossibleValues.types.includes(event.type)\n }\n\n return matchExpressionPossibleValues.types.includes(event.type)\n }\n }\n }\n else if (matchExpressionPossibleValues instanceof RegExp) {\n matcher = (event: Eventa<P>) => {\n if (inverted) {\n return !matchExpressionPossibleValues.test(event.id)\n }\n\n return matchExpressionPossibleValues.test(event.id)\n }\n }\n else if (typeof matchExpressionPossibleValues === 'function') {\n matcher = matchExpressionPossibleValues\n }\n\n return {\n id,\n type: EventaType.MatchExpression,\n matcher,\n } satisfies EventaMatchExpression<P>\n}\n","import type { EventaAdapter } from './context-hooks'\nimport type { Eventa, EventaMatchExpression, EventTag } from './eventa'\n\nimport { EventaType } from './eventa'\n\ninterface CreateContextProps<EmitOptions = any> {\n adapter?: EventaAdapter<EmitOptions>\n}\n\nexport function createContext<Extensions = any, Options = { raw?: any }>(props: CreateContextProps<Options> = {}): EventContext<Extensions, Options> {\n const listeners = new Map<EventTag<any, any>, Set<(params: any, options?: Options) => any>>()\n const onceListeners = new Map<EventTag<any, any>, Set<(params: any, options?: Options) => any>>()\n\n const matchExpressions = new Map<string, EventaMatchExpression<any>>()\n const matchExpressionListeners = new Map<string, Set<(params: any, options?: Options) => any>>()\n const matchExpressionOnceListeners = new Map<string, Set<(params: any, options?: Options) => any>>()\n\n const hooks = props.adapter?.(emit).hooks\n\n function emit<P>(event: Eventa<P>, payload: P, options?: Options) {\n const emittingPayload = { ...event, body: payload }\n\n for (const listener of listeners.get(event.id) || []) {\n listener(emittingPayload, options)\n hooks?.onReceived?.(event.id, emittingPayload)\n }\n\n for (const onceListener of onceListeners.get(event.id) || []) {\n onceListener(emittingPayload, options)\n hooks?.onReceived?.(event.id, emittingPayload)\n onceListeners.get(event.id)?.delete(onceListener)\n }\n\n for (const matchExpression of matchExpressions.values()) {\n if (matchExpression.matcher) {\n const match = matchExpression.matcher(emittingPayload)\n if (!match) {\n continue\n }\n\n for (const listener of matchExpressionListeners.get(matchExpression.id) || []) {\n listener(emittingPayload, options)\n hooks?.onReceived?.(matchExpression.id, emittingPayload)\n }\n for (const onceListener of matchExpressionOnceListeners.get(matchExpression.id) || []) {\n onceListener(emittingPayload, options)\n hooks?.onReceived?.(matchExpression.id, emittingPayload)\n matchExpressionOnceListeners.get(matchExpression.id)?.delete(onceListener)\n }\n }\n }\n\n hooks?.onSent(event.id, emittingPayload, options)\n }\n\n return {\n get listeners() {\n return listeners\n },\n\n get onceListeners() {\n return onceListeners\n },\n\n emit,\n\n on<P>(eventOrMatchExpression: Eventa<P> | EventaMatchExpression<P>, handler: (payload: Eventa<P>, options?: Options) => void): () => void {\n if (eventOrMatchExpression.type === EventaType.Event) {\n const event = eventOrMatchExpression as Eventa<P>\n if (!listeners.has(event.id)) {\n listeners.set(event.id, new Set())\n }\n\n listeners.get(event.id)?.add(handler)\n\n return () => listeners.get(event.id)?.delete(handler)\n }\n\n if (eventOrMatchExpression.type === EventaType.MatchExpression) {\n const matchExpression = eventOrMatchExpression as EventaMatchExpression<P>\n if (!matchExpressions.has(matchExpression.id)) {\n matchExpressions.set(matchExpression.id, matchExpression as EventaMatchExpression<P>)\n }\n if (!matchExpressionListeners.has(matchExpression.id)) {\n matchExpressionListeners.set(matchExpression.id, new Set())\n }\n\n matchExpressionListeners.get(matchExpression.id)?.add(handler)\n\n return () => matchExpressionListeners.get(matchExpression.id)?.delete(handler)\n }\n\n return () => void 0\n },\n\n once<P>(eventOrMatchExpression: Eventa<P> | EventaMatchExpression<P>, handler: (payload: Eventa<P>, options?: Options) => void): () => void {\n if (eventOrMatchExpression.type === EventaType.Event) {\n const event = eventOrMatchExpression as Eventa<P>\n if (!onceListeners.has(event.id)) {\n onceListeners.set(event.id, new Set())\n }\n\n onceListeners.get(event.id)?.add(handler)\n\n return () => onceListeners.get(event.id)?.delete(handler)\n }\n\n if (eventOrMatchExpression.type === EventaType.MatchExpression) {\n const matchExpression = eventOrMatchExpression as EventaMatchExpression<P>\n if (!matchExpressions.has(matchExpression.id)) {\n matchExpressions.set(matchExpression.id, matchExpression as EventaMatchExpression<P>)\n }\n if (!matchExpressionListeners.has(matchExpression.id)) {\n matchExpressionListeners.set(matchExpression.id, new Set())\n }\n\n matchExpressionOnceListeners.get(matchExpression.id)?.add(handler)\n\n return () => matchExpressionOnceListeners.get(matchExpression.id)?.delete(handler)\n }\n\n return () => void 0\n },\n\n off<P>(eventOrMatchExpression: Eventa<P> | EventaMatchExpression<P>, handler?: (payload: Eventa<P>, options?: Options) => void) {\n switch (eventOrMatchExpression.type) {\n case EventaType.Event:\n if (handler !== undefined) {\n listeners.get(eventOrMatchExpression.id)?.delete(handler)\n onceListeners.get(eventOrMatchExpression.id)?.delete(handler)\n break\n }\n\n listeners.delete(eventOrMatchExpression.id)\n onceListeners.delete(eventOrMatchExpression.id)\n break\n case EventaType.MatchExpression:\n if (handler !== undefined) {\n matchExpressionListeners.get(eventOrMatchExpression.id)?.delete(handler)\n matchExpressionOnceListeners.get(eventOrMatchExpression.id)?.delete(handler)\n break\n }\n\n matchExpressionListeners.delete(eventOrMatchExpression.id)\n matchExpressionOnceListeners.delete(eventOrMatchExpression.id)\n break\n }\n },\n }\n}\n\nexport interface EventContext<Extensions = undefined, EmitOptions = undefined> {\n listeners: Map<EventTag<any, any>, Set<(params: any) => any>>\n onceListeners: Map<EventTag<any, any>, Set<(params: any) => any>>\n\n emit: <P>(event: Eventa<P>, payload: P, options?: EmitOptions) => void\n on: <P>(eventOrMatchExpression: Eventa<P> | EventaMatchExpression<P>, handler: (payload: Eventa<P>, options?: EmitOptions) => void) => () => void\n once: <P>(eventOrMatchExpression: Eventa<P> | EventaMatchExpression<P>, handler: (payload: Eventa<P>, options?: EmitOptions) => void) => () => void\n off: <P>(eventOrMatchExpression: Eventa<P> | EventaMatchExpression<P>, handler?: (payload: Eventa<P>, options?: EmitOptions) => void) => void\n\n /**\n * Extensions (adapter-specific).\n *\n * Known usage: webworkers/worker-threads populate internal invoke config via\n * `extensions.__internal.invoke` to abort pending invokes on fatal errors.\n */\n extensions?: Extensions\n}\n\nexport type EventContextEmitFn = EventContext['emit']\n"],"mappings":";;;;AAIA,SAAgB,SAAS;AACvB,QAAO,eAAe,kEAAkE,GAAG,EAAE;;AAO/F,IAAY,oDAAL;AACL;AACA;;;AAGF,IAAY,sEAAL;AACL;AACA;;;AAeF,SAAgB,oBAAuB,IAA+B;AACpE,QAAO;EACL,GAAG,aAAgB,GAAG;EACtB,gBAAgB,oBAAoB;EACrC;;AAGH,SAAgB,qBAAwB,IAAgC;AACtE,QAAO;EACL,GAAG,aAAgB,GAAG;EACtB,gBAAgB,oBAAoB;EACrC;;AAiBH,SAAgB,aAA4B,IAAwB;AAClE,KAAI,CAAC,GACH,MAAK,QAAQ;AAGf,QAAO;EACL;EACA,MAAM,WAAW;EAClB;;AAOH,SAAgB,IAAO,GAAG,iBAA4E;AACpG,QAAO;EACL,IAAI,QAAQ;EACZ,MAAM,WAAW;EACjB,UAAU,UAAqB;AAC7B,UAAO,gBAAgB,OAAM,MAAK,EAAE,UAAU,EAAE,QAAQ,MAAM,GAAG,MAAM;;EAE1E;;AAGH,SAAgB,GAAM,GAAG,iBAA4E;AACnG,QAAO;EACL,IAAI,QAAQ;EACZ,MAAM,WAAW;EACjB,UAAU,UAAqB;AAC7B,UAAO,gBAAgB,MAAK,MAAK,EAAE,UAAU,EAAE,QAAQ,MAAM,GAAG,MAAM;;EAEzE;;AASH,SAAgB,QACd,+BAQA,UAC0B;CAC1B,MAAM,KAAK,QAAQ;CAEnB,IAAIA,gBAA0D;AAC9D,KAAI,OAAO,kCAAkC,SAC3C,YAAW,WAAW;AACpB,SAAO,YAAY,8BAA8B,CAAC,OAAO,GAAG;;UAGvD,OAAO,kCAAkC,UAChD;MAAI,SAAS,8BACX,YAAW,UAAqB;AAC9B,OAAI,SACF,QAAO,CAAC,8BAA8B,IAAI,SAAS,MAAM,GAAG;AAG9D,UAAO,8BAA8B,IAAI,SAAS,MAAM,GAAG;;WAGtD,YAAY,8BACnB,YAAW,UAAqB;AAC9B,OAAI,SACF,QAAO,CAAC,8BAA8B,OAAO,MAAK,MAAK,EAAE,OAAO,MAAM,GAAG;AAG3E,UAAO,8BAA8B,OAAO,MAAK,MAAK,EAAE,OAAO,MAAM,GAAG;;WAGnE,WAAW,8BAClB,YAAW,UAAqB;AAC9B,OAAI,OAAO,MAAM,SAAS,YACxB,QAAO;AAET,OAAI,SACF,QAAO,CAAC,8BAA8B,MAAM,SAAS,MAAM,KAAK;AAGlE,UAAO,8BAA8B,MAAM,SAAS,MAAM,KAAK;;YAI5D,yCAAyC,OAChD,YAAW,UAAqB;AAC9B,MAAI,SACF,QAAO,CAAC,8BAA8B,KAAK,MAAM,GAAG;AAGtD,SAAO,8BAA8B,KAAK,MAAM,GAAG;;UAG9C,OAAO,kCAAkC,WAChD,WAAU;AAGZ,QAAO;EACL;EACA,MAAM,WAAW;EACjB;EACD;;;;;AClKH,SAAgB,cAAyD,QAAqC,EAAE,EAAqC;CACnJ,MAAM,4BAAY,IAAI,KAAuE;CAC7F,MAAM,gCAAgB,IAAI,KAAuE;CAEjG,MAAM,mCAAmB,IAAI,KAAyC;CACtE,MAAM,2CAA2B,IAAI,KAA2D;CAChG,MAAM,+CAA+B,IAAI,KAA2D;CAEpG,MAAM,QAAQ,MAAM,UAAU,KAAK,CAAC;CAEpC,SAAS,KAAQ,OAAkB,SAAY,SAAmB;EAChE,MAAM,kBAAkB;GAAE,GAAG;GAAO,MAAM;GAAS;AAEnD,OAAK,MAAM,YAAY,UAAU,IAAI,MAAM,GAAG,IAAI,EAAE,EAAE;AACpD,YAAS,iBAAiB,QAAQ;AAClC,UAAO,aAAa,MAAM,IAAI,gBAAgB;;AAGhD,OAAK,MAAM,gBAAgB,cAAc,IAAI,MAAM,GAAG,IAAI,EAAE,EAAE;AAC5D,gBAAa,iBAAiB,QAAQ;AACtC,UAAO,aAAa,MAAM,IAAI,gBAAgB;AAC9C,iBAAc,IAAI,MAAM,GAAG,EAAE,OAAO,aAAa;;AAGnD,OAAK,MAAM,mBAAmB,iBAAiB,QAAQ,CACrD,KAAI,gBAAgB,SAAS;AAE3B,OAAI,CADU,gBAAgB,QAAQ,gBAAgB,CAEpD;AAGF,QAAK,MAAM,YAAY,yBAAyB,IAAI,gBAAgB,GAAG,IAAI,EAAE,EAAE;AAC7E,aAAS,iBAAiB,QAAQ;AAClC,WAAO,aAAa,gBAAgB,IAAI,gBAAgB;;AAE1D,QAAK,MAAM,gBAAgB,6BAA6B,IAAI,gBAAgB,GAAG,IAAI,EAAE,EAAE;AACrF,iBAAa,iBAAiB,QAAQ;AACtC,WAAO,aAAa,gBAAgB,IAAI,gBAAgB;AACxD,iCAA6B,IAAI,gBAAgB,GAAG,EAAE,OAAO,aAAa;;;AAKhF,SAAO,OAAO,MAAM,IAAI,iBAAiB,QAAQ;;AAGnD,QAAO;EACL,IAAI,YAAY;AACd,UAAO;;EAGT,IAAI,gBAAgB;AAClB,UAAO;;EAGT;EAEA,GAAM,wBAA8D,SAAsE;AACxI,OAAI,uBAAuB,SAAS,WAAW,OAAO;IACpD,MAAM,QAAQ;AACd,QAAI,CAAC,UAAU,IAAI,MAAM,GAAG,CAC1B,WAAU,IAAI,MAAM,oBAAI,IAAI,KAAK,CAAC;AAGpC,cAAU,IAAI,MAAM,GAAG,EAAE,IAAI,QAAQ;AAErC,iBAAa,UAAU,IAAI,MAAM,GAAG,EAAE,OAAO,QAAQ;;AAGvD,OAAI,uBAAuB,SAAS,WAAW,iBAAiB;IAC9D,MAAM,kBAAkB;AACxB,QAAI,CAAC,iBAAiB,IAAI,gBAAgB,GAAG,CAC3C,kBAAiB,IAAI,gBAAgB,IAAI,gBAA4C;AAEvF,QAAI,CAAC,yBAAyB,IAAI,gBAAgB,GAAG,CACnD,0BAAyB,IAAI,gBAAgB,oBAAI,IAAI,KAAK,CAAC;AAG7D,6BAAyB,IAAI,gBAAgB,GAAG,EAAE,IAAI,QAAQ;AAE9D,iBAAa,yBAAyB,IAAI,gBAAgB,GAAG,EAAE,OAAO,QAAQ;;AAGhF,gBAAa,KAAK;;EAGpB,KAAQ,wBAA8D,SAAsE;AAC1I,OAAI,uBAAuB,SAAS,WAAW,OAAO;IACpD,MAAM,QAAQ;AACd,QAAI,CAAC,cAAc,IAAI,MAAM,GAAG,CAC9B,eAAc,IAAI,MAAM,oBAAI,IAAI,KAAK,CAAC;AAGxC,kBAAc,IAAI,MAAM,GAAG,EAAE,IAAI,QAAQ;AAEzC,iBAAa,cAAc,IAAI,MAAM,GAAG,EAAE,OAAO,QAAQ;;AAG3D,OAAI,uBAAuB,SAAS,WAAW,iBAAiB;IAC9D,MAAM,kBAAkB;AACxB,QAAI,CAAC,iBAAiB,IAAI,gBAAgB,GAAG,CAC3C,kBAAiB,IAAI,gBAAgB,IAAI,gBAA4C;AAEvF,QAAI,CAAC,yBAAyB,IAAI,gBAAgB,GAAG,CACnD,0BAAyB,IAAI,gBAAgB,oBAAI,IAAI,KAAK,CAAC;AAG7D,iCAA6B,IAAI,gBAAgB,GAAG,EAAE,IAAI,QAAQ;AAElE,iBAAa,6BAA6B,IAAI,gBAAgB,GAAG,EAAE,OAAO,QAAQ;;AAGpF,gBAAa,KAAK;;EAGpB,IAAO,wBAA8D,SAA2D;AAC9H,WAAQ,uBAAuB,MAA/B;IACE,KAAK,WAAW;AACd,SAAI,YAAY,QAAW;AACzB,gBAAU,IAAI,uBAAuB,GAAG,EAAE,OAAO,QAAQ;AACzD,oBAAc,IAAI,uBAAuB,GAAG,EAAE,OAAO,QAAQ;AAC7D;;AAGF,eAAU,OAAO,uBAAuB,GAAG;AAC3C,mBAAc,OAAO,uBAAuB,GAAG;AAC/C;IACF,KAAK,WAAW;AACd,SAAI,YAAY,QAAW;AACzB,+BAAyB,IAAI,uBAAuB,GAAG,EAAE,OAAO,QAAQ;AACxE,mCAA6B,IAAI,uBAAuB,GAAG,EAAE,OAAO,QAAQ;AAC5E;;AAGF,8BAAyB,OAAO,uBAAuB,GAAG;AAC1D,kCAA6B,OAAO,uBAAuB,GAAG;AAC9D;;;EAGP"}
@@ -1,52 +0,0 @@
1
- //#region src/eventa.d.ts
2
- declare function nanoid(): string;
3
- interface InvokeEventConstraint<_Req, _Res> {}
4
- type EventTag<Res, Req> = string & InvokeEventConstraint<Req, Res>;
5
- declare enum EventaType {
6
- Event = "event",
7
- MatchExpression = "matchExpression",
8
- }
9
- declare enum EventaFlowDirection {
10
- Inbound = "inbound",
11
- Outbound = "outbound",
12
- }
13
- interface DirectionalEventa<P, T = undefined> extends Eventa<P> {
14
- _flowDirection: EventaFlowDirection | T;
15
- }
16
- interface InboundEventa<T> extends DirectionalEventa<T> {
17
- _flowDirection: EventaFlowDirection.Inbound;
18
- }
19
- interface OutboundEventa<T> extends DirectionalEventa<T> {
20
- _flowDirection: EventaFlowDirection.Outbound;
21
- }
22
- declare function defineInboundEventa<T>(id?: string): InboundEventa<T>;
23
- declare function defineOutboundEventa<T>(id?: string): OutboundEventa<T>;
24
- interface EventaLike<_P = undefined, T extends EventaType = EventaType> {
25
- id: string;
26
- type?: T;
27
- }
28
- interface Eventa<P = unknown> extends EventaLike<P, EventaType.Event> {
29
- body?: P;
30
- }
31
- type InferEventaPayload<E> = E extends Eventa<infer P> ? P : never;
32
- declare function defineEventa<P = undefined>(id?: string): Eventa<P>;
33
- interface EventaMatchExpression<P = undefined> extends EventaLike<P, EventaType.MatchExpression> {
34
- matcher?: (event: Eventa<P>) => boolean | Promise<boolean>;
35
- }
36
- declare function and<P>(...matchExpression: Array<EventaMatchExpression<P>>): EventaMatchExpression<P>;
37
- declare function or<P>(...matchExpression: Array<EventaMatchExpression<P>>): EventaMatchExpression<P>;
38
- declare function matchBy<P = undefined>(glob: string, inverted?: boolean): EventaMatchExpression<P>;
39
- declare function matchBy<P = undefined>(options: {
40
- ids: string[];
41
- }, inverted?: boolean): EventaMatchExpression<P>;
42
- declare function matchBy<P = undefined>(options: {
43
- eventa: Eventa<P>[];
44
- }, inverted?: boolean): EventaMatchExpression<P>;
45
- declare function matchBy<P = undefined>(options: {
46
- types: EventaType[];
47
- }, inverted?: boolean): EventaMatchExpression<P>;
48
- declare function matchBy<P = undefined>(regExp: RegExp, inverted?: boolean): EventaMatchExpression<P>;
49
- declare function matchBy<P = undefined, E extends Eventa<P> = Eventa<P>>(matcher: (event: E) => boolean | Promise<boolean>): EventaMatchExpression<P>;
50
- //#endregion
51
- export { nanoid as _, EventaLike as a, InboundEventa as c, OutboundEventa as d, and as f, matchBy as g, defineOutboundEventa as h, EventaFlowDirection as i, InferEventaPayload as l, defineInboundEventa as m, EventTag as n, EventaMatchExpression as o, defineEventa as p, Eventa as r, EventaType as s, DirectionalEventa as t, InvokeEventConstraint as u, or as v };
52
- //# sourceMappingURL=eventa-AJyw28P8.d.mts.map