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

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 (60) hide show
  1. package/README.md +50 -1
  2. package/dist/adapters/broadcast-channel/index.d.mts +2 -2
  3. package/dist/adapters/broadcast-channel/index.mjs +6 -9
  4. package/dist/adapters/broadcast-channel/index.mjs.map +1 -1
  5. package/dist/adapters/electron/main.d.mts +2 -2
  6. package/dist/adapters/electron/main.mjs +7 -9
  7. package/dist/adapters/electron/main.mjs.map +1 -1
  8. package/dist/adapters/electron/renderer.d.mts +134 -3
  9. package/dist/adapters/electron/renderer.mjs +4 -6
  10. package/dist/adapters/electron/renderer.mjs.map +1 -1
  11. package/dist/adapters/event-emitter/index.d.mts +2 -2
  12. package/dist/adapters/event-emitter/index.mjs +4 -7
  13. package/dist/adapters/event-emitter/index.mjs.map +1 -1
  14. package/dist/adapters/event-target/index.d.mts +2 -2
  15. package/dist/adapters/event-target/index.mjs +5 -8
  16. package/dist/adapters/event-target/index.mjs.map +1 -1
  17. package/dist/adapters/websocket/h3/index.d.mts +442 -3
  18. package/dist/adapters/websocket/h3/index.mjs +7 -9
  19. package/dist/adapters/websocket/h3/index.mjs.map +1 -1
  20. package/dist/adapters/websocket/index.d.mts +1 -1
  21. package/dist/adapters/websocket/index.mjs +1 -1
  22. package/dist/adapters/websocket/native/index.d.mts +2 -2
  23. package/dist/adapters/websocket/native/index.mjs +4 -5
  24. package/dist/adapters/websocket/native/index.mjs.map +1 -1
  25. package/dist/adapters/webworkers/index.d.mts +2 -2
  26. package/dist/adapters/webworkers/index.mjs +5 -6
  27. package/dist/adapters/webworkers/index.mjs.map +1 -1
  28. package/dist/adapters/webworkers/worker/index.d.mts +1 -1
  29. package/dist/adapters/webworkers/worker/index.mjs +6 -7
  30. package/dist/adapters/webworkers/worker/index.mjs.map +1 -1
  31. package/dist/adapters/window-message/index.d.mts +50 -0
  32. package/dist/adapters/window-message/index.mjs +79 -0
  33. package/dist/adapters/window-message/index.mjs.map +1 -0
  34. package/dist/adapters/worker-threads/index.d.mts +2 -2
  35. package/dist/adapters/worker-threads/index.mjs +5 -6
  36. package/dist/adapters/worker-threads/index.mjs.map +1 -1
  37. package/dist/adapters/worker-threads/worker/index.d.mts +1 -1
  38. package/dist/adapters/worker-threads/worker/index.mjs +6 -7
  39. package/dist/adapters/worker-threads/worker/index.mjs.map +1 -1
  40. package/dist/{context-BNM9nsGp.d.mts → context-BsqFeoer.d.mts} +2 -2
  41. package/dist/{context-c10xPp3f.mjs → context-Dht_IZMb.mjs} +22 -24
  42. package/dist/context-Dht_IZMb.mjs.map +1 -0
  43. package/dist/{eventa-M1FMVrH1.d.mts → eventa-DSnoBa1O.d.mts} +3 -3
  44. package/dist/{index-giKJThn3.d.mts → index-g6DulgOI.d.mts} +88 -88
  45. package/dist/index.d.mts +3 -3
  46. package/dist/index.mjs +3 -4
  47. package/dist/{internal-C-4X8bpL.mjs → internal-CHUsXYiP.mjs} +3 -4
  48. package/dist/{internal-C-4X8bpL.mjs.map → internal-CHUsXYiP.mjs.map} +1 -1
  49. package/dist/{shared-eQ-hnVHv.mjs → shared-CA5MGwv0.mjs} +5 -7
  50. package/dist/shared-CA5MGwv0.mjs.map +1 -0
  51. package/dist/{shared-BcRXZZxh.d.mts → shared-CVTLm458.d.mts} +2 -2
  52. package/dist/{shared-NFMSqOPw.d.mts → shared-CfXZb-7K.d.mts} +2 -2
  53. package/dist/{shared-DeDRsHPI.mjs → shared-Dl0_bFq0.mjs} +4 -5
  54. package/dist/{shared-DeDRsHPI.mjs.map → shared-Dl0_bFq0.mjs.map} +1 -1
  55. package/dist/{src-CTkYOGiO.mjs → src-CTs6h4Ci.mjs} +56 -63
  56. package/dist/src-CTs6h4Ci.mjs.map +1 -0
  57. package/package.json +14 -7
  58. package/dist/context-c10xPp3f.mjs.map +0 -1
  59. package/dist/shared-eQ-hnVHv.mjs.map +0 -1
  60. package/dist/src-CTkYOGiO.mjs.map +0 -1
@@ -1,5 +1,4 @@
1
- import { a as defineEventa, l as nanoid } from "./context-c10xPp3f.mjs";
2
-
1
+ import { a as defineEventa, l as nanoid } from "./context-Dht_IZMb.mjs";
3
2
  //#region src/context-extension-invoke-internal.ts
4
3
  /**
5
4
  * Read the internal invoke configuration from context extensions, if present.
@@ -30,18 +29,17 @@ function registerInvokeAbortEventListeners(ctx, eventOrMatch) {
30
29
  ctx.extensions = extensions;
31
30
  return invokeInternal;
32
31
  }
33
-
34
32
  //#endregion
35
33
  //#region src/invoke-shared.ts
36
- let InvokeEventType = /* @__PURE__ */ function(InvokeEventType$1) {
37
- InvokeEventType$1[InvokeEventType$1["SendEvent"] = 0] = "SendEvent";
38
- InvokeEventType$1[InvokeEventType$1["SendEventError"] = 1] = "SendEventError";
39
- InvokeEventType$1[InvokeEventType$1["SendEventStreamEnd"] = 2] = "SendEventStreamEnd";
40
- InvokeEventType$1[InvokeEventType$1["SendEventAbort"] = 3] = "SendEventAbort";
41
- InvokeEventType$1[InvokeEventType$1["ReceiveEvent"] = 4] = "ReceiveEvent";
42
- InvokeEventType$1[InvokeEventType$1["ReceiveEventError"] = 5] = "ReceiveEventError";
43
- InvokeEventType$1[InvokeEventType$1["ReceiveEventStreamEnd"] = 6] = "ReceiveEventStreamEnd";
44
- return InvokeEventType$1;
34
+ let InvokeEventType = /* @__PURE__ */ function(InvokeEventType) {
35
+ InvokeEventType[InvokeEventType["SendEvent"] = 0] = "SendEvent";
36
+ InvokeEventType[InvokeEventType["SendEventError"] = 1] = "SendEventError";
37
+ InvokeEventType[InvokeEventType["SendEventStreamEnd"] = 2] = "SendEventStreamEnd";
38
+ InvokeEventType[InvokeEventType["SendEventAbort"] = 3] = "SendEventAbort";
39
+ InvokeEventType[InvokeEventType["ReceiveEvent"] = 4] = "ReceiveEvent";
40
+ InvokeEventType[InvokeEventType["ReceiveEventError"] = 5] = "ReceiveEventError";
41
+ InvokeEventType[InvokeEventType["ReceiveEventStreamEnd"] = 6] = "ReceiveEventStreamEnd";
42
+ return InvokeEventType;
45
43
  }({});
46
44
  function defineInvokeEventa(tag, options) {
47
45
  if (!tag) tag = nanoid();
@@ -51,49 +49,49 @@ function defineInvokeEventa(tag, options) {
51
49
  metadata: options?.metadata,
52
50
  invokeMetadata: options?.invokeMetadata
53
51
  }),
54
- invokeType: InvokeEventType.SendEvent
52
+ invokeType: 0
55
53
  },
56
54
  sendEventError: {
57
55
  ...defineEventa(`${tag}-send-error`, {
58
56
  metadata: options?.metadata,
59
57
  invokeMetadata: options?.invokeMetadata
60
58
  }),
61
- invokeType: InvokeEventType.SendEventError
59
+ invokeType: 1
62
60
  },
63
61
  sendEventStreamEnd: {
64
62
  ...defineEventa(`${tag}-send-stream-end`, {
65
63
  metadata: options?.metadata,
66
64
  invokeMetadata: options?.invokeMetadata
67
65
  }),
68
- invokeType: InvokeEventType.SendEventStreamEnd
66
+ invokeType: 2
69
67
  },
70
68
  sendEventAbort: {
71
69
  ...defineEventa(`${tag}-send-abort`, {
72
70
  metadata: options?.metadata,
73
71
  invokeMetadata: options?.invokeMetadata
74
72
  }),
75
- invokeType: InvokeEventType.SendEventAbort
73
+ invokeType: 3
76
74
  },
77
75
  receiveEvent: {
78
76
  ...defineEventa(`${tag}-receive`, {
79
77
  metadata: options?.metadata,
80
78
  invokeMetadata: options?.invokeMetadata
81
79
  }),
82
- invokeType: InvokeEventType.ReceiveEvent
80
+ invokeType: 4
83
81
  },
84
82
  receiveEventError: {
85
83
  ...defineEventa(`${tag}-receive-error`, {
86
84
  metadata: options?.metadata,
87
85
  invokeMetadata: options?.invokeMetadata
88
86
  }),
89
- invokeType: InvokeEventType.ReceiveEventError
87
+ invokeType: 5
90
88
  },
91
89
  receiveEventStreamEnd: {
92
90
  ...defineEventa(`${tag}-receive-stream-end`, {
93
91
  metadata: options?.metadata,
94
92
  invokeMetadata: options?.invokeMetadata
95
93
  }),
96
- invokeType: InvokeEventType.ReceiveEventStreamEnd
94
+ invokeType: 6
97
95
  }
98
96
  };
99
97
  }
@@ -104,13 +102,12 @@ function isInvokeEventa(event) {
104
102
  }
105
103
  function isSendEvent(event) {
106
104
  if (!isInvokeEventa(event)) return false;
107
- return event.invokeType === InvokeEventType.SendEvent || event.invokeType === InvokeEventType.SendEventError || event.invokeType === InvokeEventType.SendEventStreamEnd || event.invokeType === InvokeEventType.SendEventAbort;
105
+ return event.invokeType === 0 || event.invokeType === 1 || event.invokeType === 2 || event.invokeType === 3;
108
106
  }
109
107
  function isReceiveEvent(event) {
110
108
  if (!isInvokeEventa(event)) return false;
111
- return event.invokeType === InvokeEventType.ReceiveEvent || event.invokeType === InvokeEventType.ReceiveEventError || event.invokeType === InvokeEventType.ReceiveEventStreamEnd;
109
+ return event.invokeType === 4 || event.invokeType === 5 || event.invokeType === 6;
112
110
  }
113
-
114
111
  //#endregion
115
112
  //#region src/utils.ts
116
113
  function randomBetween(min, max) {
@@ -191,7 +188,6 @@ function createUntil(options) {
191
188
  handler: resolve
192
189
  };
193
190
  }
194
-
195
191
  //#endregion
196
192
  //#region src/invoke.ts
197
193
  function isExtendableInvokeResponseLike(value) {
@@ -255,7 +251,7 @@ function defineInvoke(ctx, event) {
255
251
  }
256
252
  function createInvokePromise(resolvedCtx, req, options) {
257
253
  return new Promise((resolve, reject) => {
258
- const ctx$1 = resolvedCtx;
254
+ const ctx = resolvedCtx;
259
255
  const invokeId = nanoid();
260
256
  const invokeReceiveEvent = defineEventa(`${event.receiveEvent.id}-${invokeId}`);
261
257
  delete invokeReceiveEvent.metadata;
@@ -264,13 +260,13 @@ function defineInvoke(ctx, event) {
264
260
  const { signal, ...emitOptions } = options ?? {};
265
261
  let finished = false;
266
262
  const onAbort = () => {
267
- ctx$1.emit(event.sendEventAbort, {
263
+ ctx.emit(event.sendEventAbort, {
268
264
  invokeId,
269
265
  content: signal?.reason
270
266
  }, emitOptions);
271
267
  finishReject(createAbortError(signal?.reason));
272
268
  };
273
- const invokeInternalConfig = getContextExtensionInvokeInternalConfig(ctx$1);
269
+ const invokeInternalConfig = getContextExtensionInvokeInternalConfig(ctx);
274
270
  const abortOffs = [];
275
271
  const onAbortEvent = (payload, eventOptions) => {
276
272
  const mappedError = invokeInternalConfig?.mapAbortError?.(payload, eventOptions);
@@ -282,8 +278,8 @@ function defineInvoke(ctx, event) {
282
278
  finishReject(body && typeof body === "object" && "error" in body ? body.error : typeof body !== "undefined" ? body : payload);
283
279
  };
284
280
  const cleanup = () => {
285
- ctx$1.off(invokeReceiveEvent);
286
- ctx$1.off(invokeReceiveEventError);
281
+ ctx.off(invokeReceiveEvent);
282
+ ctx.off(invokeReceiveEventError);
287
283
  for (const off of abortOffs) off();
288
284
  if (signal) signal.removeEventListener("abort", onAbort);
289
285
  };
@@ -299,19 +295,19 @@ function defineInvoke(ctx, event) {
299
295
  resolve(value);
300
296
  cleanup();
301
297
  };
302
- ctx$1.on(invokeReceiveEvent, (payload) => {
298
+ ctx.on(invokeReceiveEvent, (payload) => {
303
299
  if (!payload.body) return;
304
300
  if (payload.body.invokeId !== invokeId) return;
305
301
  const { content } = payload.body;
306
302
  finishResolve(content);
307
303
  });
308
- ctx$1.on(invokeReceiveEventError, (payload) => {
304
+ ctx.on(invokeReceiveEventError, (payload) => {
309
305
  if (!payload.body) return;
310
306
  if (payload.body.invokeId !== invokeId) return;
311
307
  const { error } = payload.body.content;
312
308
  finishReject(error);
313
309
  });
314
- if (invokeInternalConfig?.abortOnEvents?.length) for (const eventOrMatch of invokeInternalConfig.abortOnEvents) abortOffs.push(ctx$1.on(eventOrMatch, onAbortEvent));
310
+ if (invokeInternalConfig?.abortOnEvents?.length) for (const eventOrMatch of invokeInternalConfig.abortOnEvents) abortOffs.push(ctx.on(eventOrMatch, onAbortEvent));
315
311
  if (signal) {
316
312
  if (signal.aborted) {
317
313
  onAbort();
@@ -319,14 +315,14 @@ function defineInvoke(ctx, event) {
319
315
  }
320
316
  signal.addEventListener("abort", onAbort, { once: true });
321
317
  }
322
- if (!isReadableStream(req) && !isAsyncIterable(req)) ctx$1.emit(event.sendEvent, {
318
+ if (!isReadableStream(req) && !isAsyncIterable(req)) ctx.emit(event.sendEvent, {
323
319
  invokeId,
324
320
  content: req
325
321
  }, emitOptions);
326
322
  else {
327
323
  const sendChunk = (chunk) => {
328
324
  if (finished) return;
329
- ctx$1.emit(event.sendEvent, {
325
+ ctx.emit(event.sendEvent, {
330
326
  invokeId,
331
327
  content: chunk,
332
328
  isReqStream: true
@@ -334,7 +330,7 @@ function defineInvoke(ctx, event) {
334
330
  };
335
331
  const sendEnd = () => {
336
332
  if (finished) return;
337
- ctx$1.emit(event.sendEventStreamEnd, {
333
+ ctx.emit(event.sendEventStreamEnd, {
338
334
  invokeId,
339
335
  content: void 0
340
336
  }, emitOptions);
@@ -349,13 +345,13 @@ function defineInvoke(ctx, event) {
349
345
  } catch (error) {
350
346
  if (signal?.aborted) return;
351
347
  if (isAbortError(error)) {
352
- ctx$1.emit(event.sendEventAbort, {
348
+ ctx.emit(event.sendEventAbort, {
353
349
  invokeId,
354
350
  content: error
355
351
  }, emitOptions);
356
352
  return;
357
353
  }
358
- ctx$1.emit(event.sendEventError, {
354
+ ctx.emit(event.sendEventError, {
359
355
  invokeId,
360
356
  content: error
361
357
  }, emitOptions);
@@ -367,7 +363,7 @@ function defineInvoke(ctx, event) {
367
363
  }
368
364
  function _invoke(req, options) {
369
365
  const resolvedCtx = getContext();
370
- if (resolvedCtx instanceof Promise) return resolvedCtx.then((ctx$1) => createInvokePromise(ctx$1, req, options));
366
+ if (resolvedCtx instanceof Promise) return resolvedCtx.then((ctx) => createInvokePromise(ctx, req, options));
371
367
  return createInvokePromise(resolvedCtx, req, options);
372
368
  }
373
369
  return _invoke;
@@ -508,17 +504,17 @@ function defineInvokeHandler(ctx, event, handler) {
508
504
  const abortController = abortControllers.get(invokeId);
509
505
  if (!abortController) {
510
506
  abortReasons.set(invokeId, reason);
511
- let streamController$1 = streamStates.get(invokeId);
512
- if (!streamController$1) {
507
+ let streamController = streamStates.get(invokeId);
508
+ if (!streamController) {
513
509
  let localController;
514
510
  const reqStream = new ReadableStream({ start(c) {
515
511
  localController = c;
516
512
  } });
517
- streamController$1 = localController;
518
- streamStates.set(invokeId, streamController$1);
513
+ streamController = localController;
514
+ streamStates.set(invokeId, streamController);
519
515
  handleInvoke(invokeId, reqStream, options);
520
516
  }
521
- streamController$1.error(createAbortError(reason));
517
+ streamController.error(createAbortError(reason));
522
518
  streamStates.delete(invokeId);
523
519
  return;
524
520
  }
@@ -614,7 +610,6 @@ function undefineInvokeHandler(ctx, event, handler) {
614
610
  ctx.invokeHandlers.delete(event.sendEvent.id);
615
611
  return returnValue;
616
612
  }
617
-
618
613
  //#endregion
619
614
  //#region src/invoke-extension-transfer.ts
620
615
  function withTransfer(body, transfer) {
@@ -623,7 +618,6 @@ function withTransfer(body, transfer) {
623
618
  invokeResponse: { transfer: transfer ?? [] }
624
619
  };
625
620
  }
626
-
627
621
  //#endregion
628
622
  //#region src/invoke-remote-methods.ts
629
623
  const DEFAULT_FUNCTION_STUB_OPTIONS = {
@@ -705,10 +699,10 @@ function serializeInvokeFunctionPayload(value, ctx, options) {
705
699
  if (depth > options.maxDepth) throw new Error(`Invoke payload is too deep (max ${options.maxDepth}).`);
706
700
  if (seen.has(input)) return seen.get(input);
707
701
  if (Array.isArray(input)) {
708
- const output$1 = Array.from({ length: input.length });
709
- seen.set(input, output$1);
710
- for (let i = 0; i < input.length; i += 1) output$1[i] = walk(input[i], depth + 1);
711
- return output$1;
702
+ const output = Array.from({ length: input.length });
703
+ seen.set(input, output);
704
+ for (let i = 0; i < input.length; i += 1) output[i] = walk(input[i], depth + 1);
705
+ return output;
712
706
  }
713
707
  if (!isPlainObject(input)) return input;
714
708
  const output = Object.create(null);
@@ -742,10 +736,10 @@ function deserializeInvokeFunctionPayload(value, ctx, options) {
742
736
  } else if (options.strict && hasInvokeFunctionStubKey(input)) throw new Error("Invalid invoke function stub payload.");
743
737
  if (seen.has(input)) return seen.get(input);
744
738
  if (Array.isArray(input)) {
745
- const output$1 = Array.from({ length: input.length });
746
- seen.set(input, output$1);
747
- for (let i = 0; i < input.length; i += 1) output$1[i] = walk(input[i], depth + 1);
748
- return output$1;
739
+ const output = Array.from({ length: input.length });
740
+ seen.set(input, output);
741
+ for (let i = 0; i < input.length; i += 1) output[i] = walk(input[i], depth + 1);
742
+ return output;
749
743
  }
750
744
  if (!isPlainObject(input)) return input;
751
745
  const output = Object.create(null);
@@ -811,9 +805,9 @@ function withRemoteMethods(defaultOptions) {
811
805
  const { functionStubs, ...invokeOptions } = options ?? {};
812
806
  const normalizedOptions = resolveFunctionStubOptions(defaultOptions, functionStubs);
813
807
  if (!normalizedOptions.allow) {
814
- const wrapped$1 = baseInvoke(req, invokeOptions);
815
- wrapped$1.dispose = () => void 0;
816
- return wrapped$1;
808
+ const wrapped = baseInvoke(req, invokeOptions);
809
+ wrapped.dispose = () => void 0;
810
+ return wrapped;
817
811
  }
818
812
  let serialized;
819
813
  try {
@@ -851,7 +845,6 @@ function withRemoteMethods(defaultOptions) {
851
845
  }
852
846
  };
853
847
  }
854
-
855
848
  //#endregion
856
849
  //#region src/stream.ts
857
850
  /**
@@ -1105,17 +1098,17 @@ function defineStreamInvokeHandler(serverCtx, event, fn) {
1105
1098
  const abortController = abortControllers.get(invokeId);
1106
1099
  if (!abortController) {
1107
1100
  abortReasons.set(invokeId, reason);
1108
- let controller$1 = streamStates.get(invokeId);
1109
- if (!controller$1) {
1101
+ let controller = streamStates.get(invokeId);
1102
+ if (!controller) {
1110
1103
  let localController;
1111
1104
  const reqStream = new ReadableStream({ start(c) {
1112
1105
  localController = c;
1113
1106
  } });
1114
- controller$1 = localController;
1115
- streamStates.set(invokeId, controller$1);
1107
+ controller = localController;
1108
+ streamStates.set(invokeId, controller);
1116
1109
  handleInvoke(invokeId, reqStream);
1117
1110
  }
1118
- controller$1.error(createAbortError(reason));
1111
+ controller.error(createAbortError(reason));
1119
1112
  streamStates.delete(invokeId);
1120
1113
  return;
1121
1114
  }
@@ -1186,7 +1179,7 @@ function toStreamHandler(handler) {
1186
1179
  }();
1187
1180
  };
1188
1181
  }
1189
-
1190
1182
  //#endregion
1191
1183
  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 };
1192
- //# sourceMappingURL=src-CTkYOGiO.mjs.map
1184
+
1185
+ //# sourceMappingURL=src-CTs6h4Ci.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"src-CTs6h4Ci.mjs","names":[],"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":";;;;;;AAkBA,SAAgB,wCAAkD,KAAkE;CAClI,MAAM,aAAc,IAAqD;AACzE,KAAI,CAAC,cAAc,OAAO,eAAe,SACvC;CAGF,MAAM,WAAW,WAAW;AAC5B,KAAI,CAAC,YAAY,OAAO,aAAa,SACnC;CAGF,MAAM,SAAS,SAAS;AACxB,KAAI,CAAC,UAAU,OAAO,WAAW,SAC/B;AAGF,QAAO;;;;;;AAOT,SAAgB,kCACd,KACA,cAC0B;CAC1B,MAAM,aAAe,IAAqD,cAAc,EAAE;CAC1F,MAAM,WAAY,WAAW,cAAc,EAAE;CAC7C,MAAM,iBAAkB,SAAS,UAAU,EAAE;CAC7C,MAAM,gBAAgB,MAAM,QAAQ,eAAe,cAAc,GAAG,eAAe,gBAAgB,EAAE;AAErG,KAAI,CAAC,cAAc,SAAS,aAAa,CACvC,eAAc,KAAK,aAAa;AAGlC,gBAAe,gBAAgB;AAC/B,UAAS,SAAS;AAClB,YAAW,aAAa;AACtB,KAAqD,aAAa;AAEpE,QAAO;;;;ACvDT,IAAY,kBAAL,yBAAA,iBAAA;AACL,iBAAA,gBAAA,eAAA,KAAA;AACA,iBAAA,gBAAA,oBAAA,KAAA;AACA,iBAAA,gBAAA,wBAAA,KAAA;AACA,iBAAA,gBAAA,oBAAA,KAAA;AACA,iBAAA,gBAAA,kBAAA,KAAA;AACA,iBAAA,gBAAA,uBAAA,KAAA;AACA,iBAAA,gBAAA,2BAAA,KAAA;;KACD;AAqFD,SAAgB,mBAAwG,KAAc,SAAiD;AACrL,KAAI,CAAC,IACH,OAAM,QAAQ;AAgChB,QAAO;EACL,WAAA;GA7BA,GAAG,aAA+C,GAAG,IAAI,QAAQ;IAAE,UAAU,SAAS;IAAU,gBAAgB,SAAS;IAAgB,CAAC;GAC1I,YAAA;GA4BS;EACT,gBAAA;GA1BA,GAAG,aAAoD,GAAG,IAAI,cAAc;IAAE,UAAU,SAAS;IAAU,gBAAgB,SAAS;IAAgB,CAAC;GACrJ,YAAA;GAyBc;EACd,oBAAA;GAvBA,GAAG,aAAwD,GAAG,IAAI,mBAAmB;IAAE,UAAU,SAAS;IAAU,gBAAgB,SAAS;IAAgB,CAAC;GAC9J,YAAA;GAsBkB;EAClB,gBAAA;GApBA,GAAG,aAAoD,GAAG,IAAI,cAAc;IAAE,UAAU,SAAS;IAAU,gBAAgB,SAAS;IAAgB,CAAC;GACrJ,YAAA;GAmBc;EACd,cAAA;GAjBA,GAAG,aAAkD,GAAG,IAAI,WAAW;IAAE,UAAU,SAAS;IAAU,gBAAgB,SAAS;IAAgB,CAAC;GAChJ,YAAA;GAgBY;EACZ,mBAAA;GAdA,GAAG,aAAuD,GAAG,IAAI,iBAAiB;IAAE,UAAU,SAAS;IAAU,gBAAgB,SAAS;IAAgB,CAAC;GAC3J,YAAA;GAaiB;EACjB,uBAAA;GAXA,GAAG,aAA2D,GAAG,IAAI,sBAAsB;IAAE,UAAU,SAAS;IAAU,gBAAgB,SAAS;IAAgB,CAAC;GACpK,YAAA;GAUqB;EACtB;;AAGH,SAAgB,eAAe,OAOkB;AAC/C,KAAI,OAAO,UAAU,SACnB,QAAO;AAET,KAAI,gBAAgB,MAClB,QAAO;AAGT,QAAO;;AAGT,SAAgB,YAAY,OAIqB;AAC/C,KAAI,CAAC,eAAe,MAAM,CACxB,QAAO;AAGT,QAAO,MAAM,eAAA,KACR,MAAM,eAAA,KACN,MAAM,eAAA,KACN,MAAM,eAAA;;AAGb,SAAgB,eAAe,OAGyB;AACtD,KAAI,CAAC,eAAe,MAAM,CACxB,QAAO;AAGT,QAAO,MAAM,eAAA,KACR,MAAM,eAAA,KACN,MAAM,eAAA;;;;ACzLb,SAAgB,cAAc,KAAa,KAAqB;AAC9D,QAAO,KAAK,MAAM,KAAK,QAAQ,IAAI,MAAM,MAAM,GAAG,GAAG;;;;;;;;AASvD,SAAgB,gBAAmB,OAA2C;AAC5E,QAAO,OAAO,UAAU,YACnB,UAAU,QACV,OAAO,iBAAiB;;;;;;;;;AAU/B,SAAgB,iBAAoB,KAAgD;AAClF,QAAO,CAAC,EACN,OACG,OAAO,QAAQ,YACf,eAAe,OACf,OAAO,IAAI,cAAc;;AAIhC,SAAgB,iBAAiB,QAAyB;AACxD,KAAI,kBAAkB,SAAS,OAAO,SAAS,aAC7C,QAAO;AAGT,KAAI,OAAO,iBAAiB,YAC1B,KAAI;AACF,SAAO,IAAI,aAAa,SAAS,OAAO,OAAO,GAAG,WAAW,aAAa;SAEtE;CAKR,MAAM,QAAQ,kBAAkB,QAAQ,SAAS,IAAI,MAAM,SAAS,OAAO,OAAO,GAAG,UAAU;AAC/F,OAAM,OAAO;AACb,QAAO;;AAGT,SAAgB,aAAa,OAAgC;AAC3D,QAAO,iBAAiB,SAAS,MAAM,SAAS;;AAGlD,SAAgB,yBAAgH,IAG9H;CACA,IAAI;CACJ,MAAM,UAAU,IAAI,SAAqB,QAAQ;AAC/C,YAAU;GACV;CAEF,MAAM,UAAU,OAAO,GAAG,SAAmC;EAC3D,MAAM,MAAM,MAAM,GAAG,GAAG,KAAK;AAC7B,UAAQ,IAAI;AACZ,SAAO;;AAGT,QAAO;EACL,eAAe;EACf,SAAS;EACV;;AAGH,SAAgB,qBAA2B,IAGzC;CACA,IAAI;CACJ,MAAM,UAAU,IAAI,SAAe,QAAQ;AACzC,YAAU;GACV;CAEF,MAAM,WAAW,GAAG,SAAiB;AACnC,WAAS;AACT,SAAO,GAAG,GAAG,KAAK;;AAGpB,QAAO;EAAE;EAAS;EAAS;;AAG7B,SAAgB,YAAe,SAG7B;CACA,IAAI;CACJ,MAAM,UAAU,IAAI,SAAY,QAAQ;AACtC,YAAU;GACV;AAEF,KAAI,SAAS,gBACX,mBAAkB;AAChB,WAAS,mBAAmB,CAAC,MAAM,kBAAkB;AACnD,OAAI,cACF,SAAQ,KAAA,EAA0B;IAEpC;IACD,QAAQ,YAAY,GAAG;AAG5B,QAAO;EAAE;EAAS,SAAS;EAAS;;;;ACrDtC,SAAgB,+BAAuE,OAAiL;AACtQ,KAAI,CAAC,eAAe,MAAM,CACxB,QAAO;AAGT,QAAO,OAAO,MAAM,MAAM,YAAY,YACjC,MAAM,MAAM,WAAW,QACvB,cAAc,MAAM,KAAK,YAE1B,EAAE,oBAAoB,MAAM,KAAK,YAE/B,oBAAoB,MAAM,KAAK,YAE7B,OAAO,MAAM,KAAK,QAAQ,mBAAmB,YAC1C,OAAO,MAAM,KAAK,QAAQ,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA2F1D,SAAgB,aAUd,KAA0C,OAAsF;CAChI,SAAS,aAAmC;AAC1C,MAAI,OAAO,QAAQ,WACjB,QAAO,KAAK;AAGd,SAAO;;CAGT,SAAS,oBAAoB,aAAmB,KAAW,SAA2D;AACpH,SAAO,IAAI,SAAc,SAAS,WAAW;GAC3C,MAAM,MAAM;GACZ,MAAM,WAAW,QAAQ;GAEzB,MAAM,qBAAqB,aAAa,GAAG,MAAM,aAAa,GAAG,GAAG,WAAW;AAC/E,UAAO,mBAAmB;GAC1B,MAAM,0BAA0B,aAAa,GAAG,MAAM,kBAAkB,GAAG,GAAG,WAAW;AACzF,UAAO,wBAAwB;GAE/B,MAAM,EAAE,QAAQ,GAAG,gBAAiB,WAAW,EAAE;GACjD,IAAI,WAAW;GAEf,MAAM,gBAAgB;AACpB,QAAI,KAAK,MAAM,gBAAgB;KAAE;KAAU,SAAS,QAAQ;KAAQ,EAAE,YAAmB;AAEzF,iBAAa,iBAAiB,QAAQ,OAAO,CAAC;;GAKhD,MAAM,uBAAuB,wCAAwC,IAAI;GACzE,MAAM,YAA+B,EAAE;GACvC,MAAM,gBAAgB,SAAsB,iBAAuB;IAEjE,MAAM,cAAc,sBAAsB,gBAAgB,SAAS,aAAa;AAChF,QAAI,OAAO,gBAAgB,aAAa;AAEtC,kBAAa,YAAY;AACzB;;IAGF,MAAM,OAAY,SAAS;AAM3B,iBALc,QAAQ,OAAO,SAAS,YAAY,WAAW,OACzD,KAAK,QACJ,OAAO,SAAS,cAAc,OAAO,QAGvB;;GAGrB,MAAM,gBAAgB;AACpB,QAAI,IAAI,mBAAmB;AAC3B,QAAI,IAAI,wBAAwB;AAChC,SAAK,MAAM,OAAO,UAChB,MAAK;AAEP,QAAI,OACF,QAAO,oBAAoB,SAAS,QAAQ;;GAIhD,MAAM,gBAAgB,UAAgB;AACpC,QAAI,SACF;AAGF,eAAW;AACX,WAAO,MAAM;AACb,aAAS;;GAGX,MAAM,iBAAiB,UAAe;AACpC,QAAI,SACF;AAEF,eAAW;AACX,YAAQ,MAAM;AAEd,aAAS;;AAGX,OAAI,GAAG,qBAAqB,YAAY;AACtC,QAAI,CAAC,QAAQ,KACX;AAEF,QAAI,QAAQ,KAAK,aAAa,SAC5B;IAGF,MAAM,EAAE,YAAY,QAAQ;AAC5B,kBAAc,QAAe;KAC7B;AAEF,OAAI,GAAG,0BAA0B,YAAY;AAC3C,QAAI,CAAC,QAAQ,KACX;AAEF,QAAI,QAAQ,KAAK,aAAa,SAC5B;IAGF,MAAM,EAAE,UAAU,QAAQ,KAAK;AAC/B,iBAAa,MAAM;KACnB;AAEF,OAAI,sBAAsB,eAAe,OACvC,MAAK,MAAM,gBAAgB,qBAAqB,cAC9C,WAAU,KAAK,IAAI,GAAG,cAAqB,aAAoB,CAAC;AAIpE,OAAI,QAAQ;AACV,QAAI,OAAO,SAAS;AAClB,cAAS;AACT;;AAGF,WAAO,iBAAiB,SAAS,SAAS,EAAE,MAAM,MAAM,CAAC;;AAG3D,OAAI,CAAC,iBAAsB,IAAI,IAAI,CAAC,gBAAqB,IAAI,CAC3D,KAAI,KAAK,MAAM,WAAW;IAAE;IAAU,SAAS;IAAY,EAAE,YAAmB;QAE7E;IACH,MAAM,aAAa,UAAe;AAChC,SAAI,SACF;AAEF,SAAI,KAAK,MAAM,WAAW;MAAE;MAAU,SAAS;MAAO,aAAa;MAAM,EAAE,YAAmB;;IAGhG,MAAM,gBAAgB;AACpB,SAAI,SACF;AAEF,SAAI,KAAK,MAAM,oBAAoB;MAAE;MAAU,SAAS,KAAA;MAAW,EAAE,YAAmB;;IAG1F,MAAM,OAAO,YAAY;AACvB,SAAI;AACF,iBAAW,MAAM,SAAS,KAAK;AAE7B,WAAI,QAAQ,QACV;AAGF,iBAAU,MAAM;;AAGlB,eAAS;cAEJ,OAAO;AAEZ,UAAI,QAAQ,QACV;AAEF,UAAI,aAAa,MAAM,EAAE;AACvB,WAAI,KAAK,MAAM,gBAAgB;QAAE;QAAU,SAAS;QAAO,EAAE,YAAmB;AAChF;;AAGF,UAAI,KAAK,MAAM,gBAAgB;OAAE;OAAU,SAAS;OAAiB,EAAE,YAAmB;;;AAI9F,UAAM;;IAER;;CAGJ,SAAS,QAAQ,KAAW,SAA2D;EACrF,MAAM,cAAc,YAAY;AAChC,MAAI,uBAAuB,QACzB,QAAO,YAAY,MAAK,QAAO,oBAAoB,KAAK,KAAK,QAAQ,CAAC;AAGxE,SAAO,oBAAoB,aAAa,KAAK,QAAQ;;AAGvD,QAAO;;;;;;;;;;;;;;;;;;;AAoBT,SAAgB,cAMd,KAA0C,QAAqD;AAM/F,QALiB,OAAO,KAAK,OAAO,CAAU,QAAQ,SAAS,QAAQ;AACrE,UAAQ,OAAO,aAAa,KAAK,OAAO,KAAK;AAC7C,SAAO;IACN,EAAE,CAES;;;;;;;;;;;;;;;;;;;;;AAsBhB,SAAgB,oBAUd,KACA,OACA,SACY;AACZ,KAAI,CAAC,IAAI,eACP,KAAI,iCAAiB,IAAI,KAAK;CAGhC,IAAI,WAAW,IAAI,gBAAgB,IAAI,MAAM,UAAU,GAAG;AAC1D,KAAI,CAAC,UAAU;AACb,6BAAW,IAAI,KAAK;AACpB,MAAI,gBAAgB,IAAI,MAAM,UAAU,IAAI,SAAS;;CAGvD,IAAI,kBAAkB,SAAS,IAAI,QAAQ;AAC3C,KAAI,CAAC,iBAAiB;EACpB,MAAM,+BAAe,IAAI,KAAmD;EAC5E,MAAM,mCAAmB,IAAI,KAA8B;EAC3D,MAAM,+BAAe,IAAI,KAAsB;EAC/C,MAAM,iBAAiB,YAA6B,WAAoB;AAGtE,OAAI,OAAO,mBAAmB,aAAa;AACzC,yBAAqB,WAAW,MAAM,OAAO,CAAC;AAC9C;;AAGF,WAAQ,SAAS,CAAC,WAAW,WAAW,MAAM,OAAO,CAAC;;EAGxD,MAAM,eAAe,OAAO,UAAkB,SAAc,YAAoB;GAC9E,MAAM,kBAAkB,IAAI,iBAAiB;AAC7C,oBAAiB,IAAI,UAAU,gBAAgB;AAE/C,OAAI,aAAa,IAAI,SAAS,CAC5B,eAAc,iBAAiB,aAAa,IAAI,SAAS,CAAC;GAG5D,MAAM,iBAAiB,UACnB;IAAE,GAAG;IAAS;IAAiB,GAC9B,EAAE,iBAAiB;AAExB,OAAI;IACF,MAAM,WAAW,MAAM,QAAQ,SAAgB,eAAe;AAC9D,QAAI,KACF;KAAE,GAAG,aAAa,GAAG,MAAM,aAAa,GAAG,GAAG,WAAW;KAAE,YAAY,MAAM,aAAa;KAAY,EACtG;KAAE;KAAU,SAAS;KAAU,EAC/B,QACD;YAEI,OAAO;AAEZ,QAAI,KACF;KAAE,GAAG,aAAa,GAAG,MAAM,kBAAkB,GAAG,GAAG,WAAW;KAAE,YAAY,MAAM,kBAAkB;KAAY,EAChH;KAAE;KAAU,SAAS,EAAS,OAAiB;KAAE,EACjD,QACD;aAEK;AACN,qBAAiB,OAAO,SAAS;AACjC,iBAAa,OAAO,SAAS;;;EAIjC,MAAM,SAAS,OAAO,SAAqD,YAAmB;AAC5F,OAAI,CAAC,QAAQ,KACX;AAEF,OAAI,CAAC,QAAQ,KAAK,SAChB;GAGF,MAAM,WAAW,QAAQ,KAAK;AAC9B,OAAI,QAAQ,KAAK,aAAa;IAC5B,IAAI,aAAa,aAAa,IAAI,SAAS;AAC3C,QAAI,CAAC,YAAY;KACf,IAAI;KACJ,MAAM,YAAY,IAAI,eAAoB,EACxC,MAAM,GAAG;AACP,wBAAkB;QAErB,CAAC;AAEF,kBAAa;AACb,kBAAa,IAAI,UAAU,WAAW;AAEtC,kBAAa,UAAU,WAAkB,QAAQ;;AAGnD,eAAW,QAAQ,QAAQ,KAAK,QAAe;AAC/C;;AAGF,gBAAa,UAAU,QAAQ,MAAM,SAAgB,QAAQ;;EAG/D,MAAM,mBAAmB,SAA8D,YAAmB;AACxG,OAAI,CAAC,QAAQ,KACX;AAEF,OAAI,CAAC,QAAQ,KAAK,SAChB;GAGF,MAAM,WAAW,QAAQ,KAAK;GAC9B,IAAI,aAAa,aAAa,IAAI,SAAS;AAC3C,OAAI,CAAC,YAAY;IACf,IAAI;IACJ,MAAM,YAAY,IAAI,eAAoB,EACxC,MAAM,GAAG;AACP,uBAAkB;OAErB,CAAC;AAEF,iBAAa;AACb,iBAAa,IAAI,UAAU,WAAW;AAEtC,iBAAa,UAAU,WAAkB,QAAQ;;AAGnD,cAAW,OAAO;AAClB,gBAAa,OAAO,SAAS;;EAG/B,MAAM,eAAe,SAA0D,YAAmB;AAChG,OAAI,CAAC,QAAQ,KACX;AAEF,OAAI,CAAC,QAAQ,KAAK,SAChB;GAGF,MAAM,WAAW,QAAQ,KAAK;GAC9B,MAAM,SAAS,QAAQ,KAAK;GAC5B,MAAM,kBAAkB,iBAAiB,IAAI,SAAS;AACtD,OAAI,CAAC,iBAAiB;AACpB,iBAAa,IAAI,UAAU,OAAO;IAElC,IAAI,mBAAmB,aAAa,IAAI,SAAS;AACjD,QAAI,CAAC,kBAAkB;KACrB,IAAI;KACJ,MAAM,YAAY,IAAI,eAAoB,EACxC,MAAM,GAAG;AACP,wBAAkB;QAErB,CAAC;AAEF,wBAAmB;AACnB,kBAAa,IAAI,UAAU,iBAAiB;AAC5C,kBAAa,UAAU,WAAkB,QAAQ;;AAGnD,qBAAiB,MAAM,iBAAiB,OAAO,CAAC;AAChD,iBAAa,OAAO,SAAS;AAC7B;;AAGF,iBAAc,iBAAiB,OAAO;GAEtC,MAAM,mBAAmB,aAAa,IAAI,SAAS;AACnD,OAAI,kBAAkB;AACpB,qBAAiB,MAAM,iBAAiB,OAAO,CAAC;AAChD,iBAAa,OAAO,SAAS;;;AAIjC,oBAAkB;GAAE;GAAQ;GAAiB;GAAa;AAC1D,WAAS,IAAI,SAAS,gBAAgB;AAEtC,MAAI,GAAG,MAAM,WAAW,gBAAgB,OAAO;AAC/C,MAAI,GAAG,MAAM,oBAAoB,gBAAgB,gBAAgB;AACjE,MAAI,GAAG,MAAM,gBAAgB,gBAAgB,YAAY;;AAG3D,cAAa;AACX,MAAI,IAAI,MAAM,WAAW,gBAAgB,OAAO;AAChD,MAAI,IAAI,MAAM,oBAAoB,gBAAgB,gBAAgB;AAClE,MAAI,IAAI,MAAM,gBAAgB,gBAAgB,YAAY;;;;;;;;;;;;;;;;;;;;;;;AAwB9D,SAAgB,qBAMd,KACA,QACA,UACwB;CACxB,MAAM,YAAY,OAAO,KAAK,OAAO;CACrC,MAAM,cAAc,IAAI,IAAI,OAAO,KAAK,SAAS,CAAS;AAE1D,KAAI,UAAU,WAAW,YAAY,QAAQ,CAAC,UAAU,OAAM,QAAO,YAAY,IAAI,IAAI,CAAC,CACxF,OAAM,IAAI,MAAM,8CAA8C;AAGhE,QAAO,UAAU,QAAQ,cAAc,QAAQ;AAC7C,eAAa,OAAO,oBAAoB,KAAK,OAAO,MAAM,SAAS,KAAK;AACxE,SAAO;IACN,EAAE,CAA2B;;;;;;;;;;;;;;;;;;;AAoBlC,SAAgB,sBAQd,KACA,OACA,SACS;AACT,KAAI,CAAC,IAAI,eACP,QAAO;CAET,MAAM,WAAW,IAAI,gBAAgB,IAAI,MAAM,UAAU,GAAG;AAC5D,KAAI,CAAC,SACH,QAAO;AAET,KAAI,SAAS;EACX,MAAM,kBAAkB,SAAS,IAAI,QAAQ;AAC7C,MAAI,CAAC,gBACH,QAAO;AAET,MAAI,IAAI,MAAM,WAAW,gBAAgB,OAAO;AAChD,MAAI,IAAI,MAAM,oBAAoB,gBAAgB,gBAAgB;AAClE,MAAI,IAAI,MAAM,gBAAgB,gBAAgB,YAAY;AAC1D,MAAI,eAAe,OAAO,MAAM,UAAU,GAAG;AAE7C,SAAO;;CAGT,IAAI,cAAc;AAClB,MAAK,MAAM,oBAAoB,SAAS,QAAQ,EAAE;AAChD,MAAI,IAAI,MAAM,WAAW,iBAAiB,OAAO;AACjD,MAAI,IAAI,MAAM,oBAAoB,iBAAiB,gBAAgB;AACnE,MAAI,IAAI,MAAM,gBAAgB,iBAAiB,YAAY;AAC3D,gBAAc;;AAGhB,KAAI,eAAe,OAAO,MAAM,UAAU,GAAG;AAE7C,QAAO;;;;ACprBT,SAAgB,aAAgB,MAAS,UAA+H;AACtK,QAAO;EACL,UAAU;EACV,gBAAgB,EACd,UAAU,YAAY,EAAE,EACzB;EACF;;;;ACiBH,MAAM,gCAAuK;CAC3K,UAAU;CACV,cAAc;CACd,WAAW;CACX,iBAAiB;CACjB,eAAe;CACf,QAAQ;CACT;AAED,SAAgB,4BAA4B,SAAS,8BAA8B,WAAW;AAC5F,QAAO,GAAG,SAAS,QAAQ,CAAC;;AAG9B,SAAS,6BAA6B,SAA+C;AACnF,KAAI,YAAY,KACd,QAAO;EACL,OAAO;EACP,GAAG;EACJ;AAEH,KAAI,CAAC,QACH,QAAO;EACL,OAAO;EACP,GAAG;EACJ;AAGH,QAAO;EACL,OAAO,QAAQ,SAAS;EACxB,UAAU,QAAQ,YAAY,8BAA8B;EAC5D,cAAc,QAAQ,gBAAgB,8BAA8B;EACpE,WAAW,QAAQ,aAAa,8BAA8B;EAC9D,iBAAiB,QAAQ,mBAAmB,8BAA8B;EAC1E,eAAe,QAAQ,iBAAiB,8BAA8B;EACtE,QAAQ,QAAQ,UAAU,8BAA8B;EACzD;;AAGH,SAAS,2BACP,UACA,UACA;CACA,MAAM,OAAO,6BAA6B,SAAS;AAEnD,KAAI,OAAO,aAAa,YACtB,QAAO;AAET,KAAI,OAAO,aAAa,UACtB,QAAO;EACL,GAAG;EACH,OAAO;EACR;AAGH,QAAO;EACL,GAAG;EACH,GAAG,6BAA6B,SAAS;EAC1C;;AAGH,SAAS,cAAc,OAAkD;AACvE,KAAI,SAAS,QAAQ,OAAO,UAAU,SACpC,QAAO;CAGT,MAAM,YAAY,OAAO,eAAe,MAAM;AAC9C,QAAO,cAAc,OAAO,aAAa,cAAc;;AASzD,SAAS,4BAA4B,OAAoD;AACvF,KAAI,CAAC,cAAc,MAAM,CACvB,QAAO;AAET,KAAI,EAAE,oBAAoB,OACxB,QAAO;CAGT,MAAM,OAAQ,MAAoC;AAClD,QAAO,CAAC,CAAC,QAAQ,OAAO,SAAS,YAAY,OAAO,KAAK,QAAQ;;AAGnE,SAAS,yBAAyB,OAAkD;AAClF,QAAO,cAAc,MAAM,IAAI,oBAAoB;;AAGrD,SAAS,+BACP,OACA,KACA,SACA;AACA,KAAI,CAAC,QAAQ,MACX,QAAO;EAAE;EAAO,eAAe,KAAK;EAAG;CAGzC,IAAI,gBAAgB;CACpB,MAAM,uBAAO,IAAI,SAAsB;CACvC,MAAM,YAA+B,EAAE;CAEvC,MAAM,QAAQ,OAAY,UAAuB;AAC/C,MAAI,OAAO,UAAU,YAAY;AAC/B,OAAI,iBAAiB,QAAQ,aAC3B,OAAM,IAAI,MAAM,kDAAkD,QAAQ,aAAa,IAAI;AAG7F,oBAAiB;GACjB,MAAM,MAAM,GAAG,QAAQ,YAAY,QAAQ;GAE3C,MAAM,MAAM,oBAAoB,KADlB,mBAA6B,IACD,GAAG,SAAS,mBAAmB;AACvE,WAAO,MAAM,SAAS,eAAe;KACrC;AACF,aAAU,KAAK,IAAI;AAEnB,UAAO,EAAE,gBAAgB,EAAE,KAAK,EAAE;;AAGpC,MAAI,SAAS,QAAQ,OAAO,UAAU,SACpC,QAAO;AAGT,MAAI,QAAQ,QAAQ,SAClB,OAAM,IAAI,MAAM,mCAAmC,QAAQ,SAAS,IAAI;AAG1E,MAAI,KAAK,IAAI,MAAM,CACjB,QAAO,KAAK,IAAI,MAAM;AAGxB,MAAI,MAAM,QAAQ,MAAM,EAAE;GACxB,MAAM,SAAgB,MAAM,KAAK,EAAE,QAAQ,MAAM,QAAQ,CAAC;AAC1D,QAAK,IAAI,OAAO,OAAO;AACvB,QAAK,IAAI,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK,EACrC,QAAO,KAAK,KAAK,MAAM,IAAI,QAAQ,EAAE;AAEvC,UAAO;;AAGT,MAAI,CAAC,cAAc,MAAM,CACvB,QAAO;EAOT,MAAM,SAA8B,OAAO,OAAO,KAAK;AACvD,OAAK,IAAI,OAAO,OAAO;AACvB,OAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,MAAM,CAC9C,QAAO,OAAO,KAAK,OAAO,QAAQ,EAAE;AAEtC,SAAO;;AAGT,QAAO;EACL,OAAO,KAAK,OAAO,EAAE;EACrB,eAAe;AACb,QAAK,MAAM,OAAO,UAChB,MAAK;;EAGV;;AAGH,SAAS,iCACP,OACA,KACA,SACA;AACA,KAAI,CAAC,QAAQ,MACX,QAAO;CAGT,IAAI,gBAAgB;CACpB,MAAM,uBAAO,IAAI,SAAsB;CAEvC,MAAM,QAAQ,OAAY,UAAuB;AAC/C,MAAI,SAAS,QAAQ,OAAO,UAAU,SACpC,QAAO;AAGT,MAAI,QAAQ,QAAQ,SAClB,OAAM,IAAI,MAAM,mCAAmC,QAAQ,SAAS,IAAI;AAG1E,MAAI,4BAA4B,MAAM,EAAE;AACtC,OAAI,iBAAiB,QAAQ,aAC3B,OAAM,IAAI,MAAM,kDAAkD,QAAQ,aAAa,IAAI;GAG7F,MAAM,MAAM,MAAM,eAAgB;AAClC,OAAI,QAAQ,aAAa,CAAC,IAAI,WAAW,QAAQ,UAAU,EAAE;AAC3D,QAAI,QAAQ,oBAAoB,QAC9B,OAAM,IAAI,MAAM,oCAAoC,MAAM;AAG5D,WAAO;;AAGT,oBAAiB;AAGjB,UAAO,aAAa,KAFN,mBAA6B,IAEa,CAAC;aAElD,QAAQ,UAAU,yBAAyB,MAAM,CACxD,OAAM,IAAI,MAAM,wCAAwC;AAG1D,MAAI,KAAK,IAAI,MAAM,CACjB,QAAO,KAAK,IAAI,MAAM;AAGxB,MAAI,MAAM,QAAQ,MAAM,EAAE;GACxB,MAAM,SAAgB,MAAM,KAAK,EAAE,QAAQ,MAAM,QAAQ,CAAC;AAC1D,QAAK,IAAI,OAAO,OAAO;AACvB,QAAK,IAAI,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK,EACrC,QAAO,KAAK,KAAK,MAAM,IAAI,QAAQ,EAAE;AAEvC,UAAO;;AAGT,MAAI,CAAC,cAAc,MAAM,CACvB,QAAO;EAOT,MAAM,SAA8B,OAAO,OAAO,KAAK;AACvD,OAAK,IAAI,OAAO,OAAO;AACvB,OAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,MAAM,CAC9C,QAAO,OAAO,KAAK,OAAO,QAAQ,EAAE;AAGtC,SAAO;;AAGT,QAAO,KAAK,OAAO,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAmDvB,SAAgB,kBAAkB,gBAAsD;AACtF,QAAO;EACL,aAQE,KACA,OACsC;GACtC,MAAM,aAAa,aAAa,KAAK,MAAM;GAE3C,MAAM,WAAW,KAAW,YAAwC;IAClE,MAAM,EAAE,eAAe,GAAG,kBAAmB,WAAW,EAAE;IAC1D,MAAM,oBAAoB,2BAA2B,gBAAgB,cAAc;AAEnF,QAAI,CAAC,kBAAkB,OAAO;KAE5B,MAAM,UADU,WAAW,KAAY,cAChB;AACvB,aAAQ,gBAAgB,KAAK;AAE7B,YAAO;;IAGT,IAAI;AACJ,QAAI;AACF,kBAAa,+BAA+B,KAAY,KAAwC,kBAAkB;aAE7G,OAAO;KACZ,MAAM,WAAW,QAAQ,OAAO,MAAM;AACtC,cAAS,gBAAgB,KAAK;AAE9B,YAAO;;IAGT,IAAI,WAAW;IACf,MAAM,gBAAgB;AACpB,SAAI,SACF;AAGF,gBAAW;AACX,gBAAW,SAAS;;IAGtB,IAAI;AACJ,QAAI,kBAAkB,gBAAgB,EACpC,oBAAmB,iBAAiB;AAClC,cAAS;OACR,kBAAkB,cAAc;IAGrC,MAAM,iBAAiB;AACrB,SAAI,iBACF,cAAa,iBAAiB;AAEhC,cAAS;;IAMX,MAAM,UAHU,WAAW,WAAW,OAAc,cAAmD,CACpG,QAAQ,SAEY;AACvB,YAAQ,UAAU;AAElB,WAAO;;AAGT,UAAO;;EAGT,oBAQE,KACA,OACA,SACA;GACA,MAAM,oBAAoB,2BAA2B,eAAe;AAEpE,UAAO,oBAAoB,KAAK,OAAO,OAAO,SAAS,YAAY;AAKjE,WAAO,QAJgB,kBAAkB,QACrC,iCAAiC,SAAgB,KAAK,kBAAkB,GACxE,SAEkC,QAAQ;KAC9C;;EAEL;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACnXH,SAAgB,mBAOd,WAAgC,OAA+C;AAC/E,SAAQ,KAAqD,YAA4C;EACvG,MAAM,WAAW,QAAQ;EACzB,MAAM,EAAE,QAAQ,GAAG,gBAAiB,WAAW,EAAE;EACjD,IAAI;EAEJ,MAAM,qBAAqB,aAAa,GAAG,MAAM,aAAa,GAAG,GAAG,WAAW;EAC/E,MAAM,0BAA0B,aAAa,GAAG,MAAM,kBAAkB,GAAG,GAAG,WAAW;EACzF,MAAM,8BAA8B,aAAa,GAAG,MAAM,sBAAsB,GAAG,GAAG,WAAW;EAEjG,MAAM,SAAS,IAAI,eAAoB;GACrC,MAAM,YAAY;IAChB,MAAM,gBAAgB;AACpB,eAAU,IAAI,mBAAmB;AACjC,eAAU,IAAI,wBAAwB;AACtC,eAAU,IAAI,4BAA4B;AAC1C,SAAI,UAAU,QACZ,QAAO,oBAAoB,SAAS,QAAQ;;AAIhD,oBAAgB;AACd,eAAU,KAAK,MAAM,gBAAgB;MAAE;MAAU,SAAS,QAAQ;MAAQ,EAAE,YAAmB;AAC/F,gBAAW,MAAM,iBAAiB,QAAQ,OAAO,CAAC;AAClD,cAAS;;AAGX,cAAU,GAAG,qBAAqB,YAAY;AAC5C,SAAI,CAAC,QAAQ,KACX;AAEF,SAAI,QAAQ,KAAK,aAAa,SAC5B;AAGF,gBAAW,QAAQ,QAAQ,KAAK,QAAe;MAC/C;AACF,cAAU,GAAG,0BAA0B,YAAY;AACjD,SAAI,CAAC,QAAQ,KACX;AAEF,SAAI,QAAQ,KAAK,aAAa,SAC5B;AAGF,gBAAW,MAAM,QAAQ,KAAK,QAAQ,MAAgB;AACtD,cAAS;MACT;AACF,cAAU,GAAG,8BAA8B,YAAY;AACrD,SAAI,CAAC,QAAQ,KACX;AAEF,SAAI,QAAQ,KAAK,aAAa,SAC5B;AAGF,gBAAW,OAAO;AAClB,cAAS;MACT;AAEF,QAAI,UAAU,SAAS;AACrB,SAAI,OAAO,SAAS;AAClB,eAAS;AACT;;AAEF,YAAO,iBAAiB,SAAS,SAA0B,EAAE,MAAM,MAAM,CAAC;;;GAG9E,OAAO,QAAQ;AACb,cAAU,KAAK,MAAM,gBAAgB;KAAE;KAAU,SAAS;KAAQ,EAAE,YAAmB;AACvF,cAAU,IAAI,mBAAmB;AACjC,cAAU,IAAI,wBAAwB;AACtC,cAAU,IAAI,4BAA4B;AAC1C,QAAI,UAAU,QACZ,QAAO,oBAAoB,SAAS,QAAyB;;GAGlE,CAAC;AAEF,MAAI,iBAAsB,IAAI,IAAI,gBAAqB,IAAI,EAAE;GAC3D,MAAM,aAAa,UAAe;AAChC,cAAU,KAAK,MAAM,WAAW;KAAE;KAAU,SAAS;KAAO,aAAa;KAAM,EAAE,YAAmB;;GAGtG,MAAM,gBAAgB;AACpB,cAAU,KAAK,MAAM,oBAAoB;KAAE;KAAU,SAAS,KAAA;KAAW,EAAE,YAAmB;;GAGhG,MAAM,OAAO,YAAY;AACvB,QAAI;AACF,gBAAW,MAAM,SAAS,KAAK;AAE7B,UAAI,QAAQ,QACV;AAGF,gBAAU,MAAM;;AAGlB,cAAS;aAEJ,OAAO;AAEZ,SAAI,QAAQ,QACV;AAEF,SAAI,aAAa,MAAM,EAAE;AACvB,gBAAU,KAAK,MAAM,gBAAgB;OAAE;OAAU,SAAS;OAAO,EAAE,YAAmB;AACtF;;AAGF,eAAU,KAAK,MAAM,gBAAgB;MAAE;MAAU,SAAS;MAAiB,EAAE,YAAmB;;;AAIpG,SAAM;QAGN,WAAU,KAAK,MAAM,WAAW;GAAE;GAAU,SAAS;GAAK,EAAE,YAAmB;AAGjF,SAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAuCX,SAAgB,0BAOd,WAAgC,OAA+C,IAAiC;CAChH,MAAM,sBAAsB,aAAqB,aAAa,GAAG,MAAM,aAAa,GAAG,GAAG,WAAW;CACrG,MAAM,2BAA2B,aAAqB,aAAa,GAAG,MAAM,kBAAkB,GAAG,GAAG,WAAW;CAC/G,MAAM,+BAA+B,aAAqB,aAAa,GAAG,MAAM,sBAAsB,GAAG,GAAG,WAAW;CACvH,MAAM,+BAAe,IAAI,KAAmD;CAC5E,MAAM,mCAAmB,IAAI,KAA8B;CAC3D,MAAM,+BAAe,IAAI,KAAsB;CAC/C,MAAM,iBAAiB,YAA6B,WAAoB;AACtE,MAAI,OAAO,mBAAmB,aAAa;AACzC,wBAAqB,WAAW,MAAM,OAAO,CAAC;AAC9C;;AAEF,UAAQ,SAAS,CAAC,WAAW,WAAW,MAAM,OAAO,CAAC;;CAGxD,MAAM,eAAe,OAAO,UAAkB,SAAc,YAAiB;EAC3E,MAAM,eAAe,mBAAmB,SAAS;EACjD,MAAM,oBAAoB,wBAAwB,SAAS;EAC3D,MAAM,wBAAwB,4BAA4B,SAAS;EACnE,MAAM,kBAAkB,IAAI,iBAAiB;AAC7C,mBAAiB,IAAI,UAAU,gBAAgB;AAE/C,MAAI,aAAa,IAAI,SAAS,CAC5B,eAAc,iBAAiB,aAAa,IAAI,SAAS,CAAC;EAG5D,MAAM,iBAAiB,UACnB;GAAE,GAAG;GAAS;GAAiB,GAC9B,EAAE,iBAAiB;AAExB,MAAI;GACF,MAAM,YAAY,GAAG,SAAS,eAAe;AAC7C,cAAW,MAAM,OAAO,UACtB,WAAU,KAAK,cAAc;IAAE;IAAU,SAAS;IAAK,EAAE,QAAQ;AAGnE,aAAU,KAAK,uBAAuB;IAAE;IAAU,SAAS,KAAA;IAAW,EAAE,QAAQ;WAE3E,OAAO;AACZ,aAAU,KAAK,mBAAmB;IAAE;IAAU,SAAS,EAAS,OAAiB;IAAE,EAAE,QAAQ;YAEvF;AACN,oBAAiB,OAAO,SAAS;AACjC,gBAAa,OAAO,SAAS;;;AAIjC,WAAU,GAAG,MAAM,WAAW,OAAO,SAAS,YAAY;AACxD,MAAI,CAAC,QAAQ,KACX;AAEF,MAAI,CAAC,QAAQ,KAAK,SAChB;EAGF,MAAM,WAAW,QAAQ,KAAK;AAC9B,MAAI,QAAQ,KAAK,aAAa;GAC5B,IAAI,aAAa,aAAa,IAAI,SAAS;AAC3C,OAAI,CAAC,YAAY;IACf,IAAI;IACJ,MAAM,YAAY,IAAI,eAAoB,EACxC,MAAM,GAAG;AACP,uBAAkB;OAErB,CAAC;AAEF,iBAAa;AACb,iBAAa,IAAI,UAAU,WAAW;AAEtC,iBAAa,UAAU,WAAkB,QAAQ;;AAGnD,cAAW,QAAQ,QAAQ,KAAK,QAAe;AAC/C;;AAGF,eAAa,UAAU,QAAQ,KAAK,SAAgB,QAAQ;GAC5D;AAEF,WAAU,GAAG,MAAM,qBAAqB,YAAY;AAClD,MAAI,CAAC,QAAQ,KACX;AAEF,MAAI,CAAC,QAAQ,KAAK,SAChB;EAGF,MAAM,aAAa,aAAa,IAAI,QAAQ,KAAK,SAAS;AAC1D,MAAI,CAAC,WACH;AAGF,aAAW,OAAO;AAClB,eAAa,OAAO,QAAQ,KAAK,SAAS;GAC1C;AAEF,WAAU,GAAG,MAAM,iBAAiB,YAAY;AAC9C,MAAI,CAAC,QAAQ,KACX;AAEF,MAAI,CAAC,QAAQ,KAAK,SAChB;EAGF,MAAM,WAAW,QAAQ,KAAK;EAC9B,MAAM,SAAS,QAAQ,KAAK;EAC5B,MAAM,kBAAkB,iBAAiB,IAAI,SAAS;AACtD,MAAI,CAAC,iBAAiB;AACpB,gBAAa,IAAI,UAAU,OAAO;GAElC,IAAI,aAAa,aAAa,IAAI,SAAS;AAC3C,OAAI,CAAC,YAAY;IACf,IAAI;IACJ,MAAM,YAAY,IAAI,eAAoB,EACxC,MAAM,GAAG;AACP,uBAAkB;OAErB,CAAC;AAEF,iBAAa;AACb,iBAAa,IAAI,UAAU,WAAW;AACtC,iBAAa,UAAU,UAAiB;;AAG1C,cAAW,MAAM,iBAAiB,OAAO,CAAC;AAC1C,gBAAa,OAAO,SAAS;AAC7B;;AAGF,gBAAc,iBAAiB,OAAO;EAEtC,MAAM,aAAa,aAAa,IAAI,SAAS;AAC7C,MAAI,YAAY;AACd,cAAW,MAAM,iBAAiB,OAAO,CAAC;AAC1C,gBAAa,OAAO,SAAS;;GAE/B;;;;;;;;;;;;;;;;;;;;;;;;;;AA2BJ,SAAgB,gBAA0D,SAA6H;AACrM,SAAQ,SAAS,YAAY;EAC3B,MAAM,SAAoC,EAAE;EAC5C,IAAI;EACJ,IAAI,eAA6B;AAEjC,SAAO,KAAK,IAAI,SAAS,MAAM;AAC7B,aAAU;IACV,CAAC;EAEH,MAAM,QAAQ,SAAc;AAC1B,WAAQ,CAAC,MAAM,MAAM,CAAC;AAEtB,UAAO,KAAK,IAAI,SAAS,MAAM;AAC7B,cAAU;KACV,CAAC;;AAIL,UAAQ;GAAE;GAAS;GAAS;GAAM,CAAC,CAChC,WAAW;AACV,WAAQ,CAAC,KAAA,GAAkB,KAAK,CAAC;IACjC,CACD,OAAO,QAAQ;AACd,kBAAe;AACf,WAAQ,CAAC,KAAA,GAAkB,KAAK,CAAC;IACjC;AAEJ,SAAQ,mBAAmB;GACzB,IAAI;AAEJ,QAAK,IAAI,IAAI,GAAG,OAAO,OAAO,CAAC,MAAM,KAAK;AACxC,KAAC,KAAK,QAAQ,MAAM,OAAO;AAC3B,WAAO,OAAO;AAEd,QAAI,aACF,OAAM;AAGR,QAAI,CAAC,KACH,OAAM;;KAGT"}
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.3",
4
+ "version": "1.0.0-beta.4",
5
5
  "description": "Events are all you need",
6
6
  "author": {
7
7
  "name": "RainbowBird",
@@ -45,6 +45,11 @@
45
45
  "import": "./dist/adapters/event-target/index.mjs",
46
46
  "default": "./dist/adapters/event-target/index.mjs"
47
47
  },
48
+ "./adapters/window-message": {
49
+ "type": "./dist/adapters/window-message/index.mts",
50
+ "import": "./dist/adapters/window-message/index.mjs",
51
+ "default": "./dist/adapters/window-message/index.mjs"
52
+ },
48
53
  "./adapters/worker-threads": {
49
54
  "type": "./dist/adapters/worker-threads/index.mts",
50
55
  "import": "./dist/adapters/worker-threads/index.mjs",
@@ -90,8 +95,8 @@
90
95
  "package.json"
91
96
  ],
92
97
  "peerDependencies": {
93
- "electron": ">=30",
94
- "h3": "2.0.0-beta.1",
98
+ "electron": ">=39",
99
+ "h3": ">=2.0.1-rc.17",
95
100
  "web-worker": "^1.5.0"
96
101
  },
97
102
  "peerDependenciesMeta": {
@@ -114,18 +119,20 @@
114
119
  "@electron-toolkit/preload": "^3.0.2",
115
120
  "@moeru/std": "0.1.0-beta.15",
116
121
  "@types/node": "^25.0.2",
117
- "@vitest/coverage-v8": "^4.0.15",
118
- "@vitest/web-worker": "^4.0.15",
122
+ "@vitest/browser-playwright": "^4.1.5",
123
+ "@vitest/coverage-v8": "^4.1.5",
124
+ "@vitest/web-worker": "^4.1.5",
119
125
  "bumpp": "^10.3.2",
120
126
  "crossws": "^0.4.1",
121
127
  "eslint": "^9.39.2",
128
+ "playwright": "^1.59.1",
122
129
  "taze": "^19.9.2",
123
- "tsdown": "^0.17.4",
130
+ "tsdown": "^0.21.10",
124
131
  "tsx": "^4.21.0",
125
132
  "typescript": "^5.9.3",
126
133
  "unplugin-unused": "^0.5.6",
127
134
  "vite": "^7.2.7",
128
- "vitest": "^4.0.15"
135
+ "vitest": "^4.1.5"
129
136
  },
130
137
  "scripts": {
131
138
  "build": "tsdown",