@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.
- package/README.md +50 -1
- package/dist/adapters/broadcast-channel/index.d.mts +2 -2
- package/dist/adapters/broadcast-channel/index.mjs +6 -9
- package/dist/adapters/broadcast-channel/index.mjs.map +1 -1
- package/dist/adapters/electron/main.d.mts +2 -2
- package/dist/adapters/electron/main.mjs +7 -9
- package/dist/adapters/electron/main.mjs.map +1 -1
- package/dist/adapters/electron/renderer.d.mts +134 -3
- package/dist/adapters/electron/renderer.mjs +4 -6
- package/dist/adapters/electron/renderer.mjs.map +1 -1
- package/dist/adapters/event-emitter/index.d.mts +2 -2
- package/dist/adapters/event-emitter/index.mjs +4 -7
- package/dist/adapters/event-emitter/index.mjs.map +1 -1
- package/dist/adapters/event-target/index.d.mts +2 -2
- package/dist/adapters/event-target/index.mjs +5 -8
- package/dist/adapters/event-target/index.mjs.map +1 -1
- package/dist/adapters/websocket/h3/index.d.mts +442 -3
- package/dist/adapters/websocket/h3/index.mjs +7 -9
- package/dist/adapters/websocket/h3/index.mjs.map +1 -1
- package/dist/adapters/websocket/index.d.mts +1 -1
- package/dist/adapters/websocket/index.mjs +1 -1
- package/dist/adapters/websocket/native/index.d.mts +2 -2
- package/dist/adapters/websocket/native/index.mjs +4 -5
- package/dist/adapters/websocket/native/index.mjs.map +1 -1
- package/dist/adapters/webworkers/index.d.mts +2 -2
- package/dist/adapters/webworkers/index.mjs +5 -6
- package/dist/adapters/webworkers/index.mjs.map +1 -1
- package/dist/adapters/webworkers/worker/index.d.mts +1 -1
- package/dist/adapters/webworkers/worker/index.mjs +6 -7
- package/dist/adapters/webworkers/worker/index.mjs.map +1 -1
- package/dist/adapters/window-message/index.d.mts +50 -0
- package/dist/adapters/window-message/index.mjs +79 -0
- package/dist/adapters/window-message/index.mjs.map +1 -0
- package/dist/adapters/worker-threads/index.d.mts +2 -2
- package/dist/adapters/worker-threads/index.mjs +5 -6
- package/dist/adapters/worker-threads/index.mjs.map +1 -1
- package/dist/adapters/worker-threads/worker/index.d.mts +1 -1
- package/dist/adapters/worker-threads/worker/index.mjs +6 -7
- package/dist/adapters/worker-threads/worker/index.mjs.map +1 -1
- package/dist/{context-BNM9nsGp.d.mts → context-BsqFeoer.d.mts} +2 -2
- package/dist/{context-c10xPp3f.mjs → context-Dht_IZMb.mjs} +22 -24
- package/dist/context-Dht_IZMb.mjs.map +1 -0
- package/dist/{eventa-M1FMVrH1.d.mts → eventa-DSnoBa1O.d.mts} +3 -3
- package/dist/{index-giKJThn3.d.mts → index-g6DulgOI.d.mts} +88 -88
- package/dist/index.d.mts +3 -3
- package/dist/index.mjs +3 -4
- package/dist/{internal-C-4X8bpL.mjs → internal-CHUsXYiP.mjs} +3 -4
- package/dist/{internal-C-4X8bpL.mjs.map → internal-CHUsXYiP.mjs.map} +1 -1
- package/dist/{shared-eQ-hnVHv.mjs → shared-CA5MGwv0.mjs} +5 -7
- package/dist/shared-CA5MGwv0.mjs.map +1 -0
- package/dist/{shared-BcRXZZxh.d.mts → shared-CVTLm458.d.mts} +2 -2
- package/dist/{shared-NFMSqOPw.d.mts → shared-CfXZb-7K.d.mts} +2 -2
- package/dist/{shared-DeDRsHPI.mjs → shared-Dl0_bFq0.mjs} +4 -5
- package/dist/{shared-DeDRsHPI.mjs.map → shared-Dl0_bFq0.mjs.map} +1 -1
- package/dist/{src-CTkYOGiO.mjs → src-CTs6h4Ci.mjs} +56 -63
- package/dist/src-CTs6h4Ci.mjs.map +1 -0
- package/package.json +14 -7
- package/dist/context-c10xPp3f.mjs.map +0 -1
- package/dist/shared-eQ-hnVHv.mjs.map +0 -1
- package/dist/src-CTkYOGiO.mjs.map +0 -1
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
import { a as defineEventa, l as nanoid } from "./context-
|
|
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
|
|
37
|
-
InvokeEventType
|
|
38
|
-
InvokeEventType
|
|
39
|
-
InvokeEventType
|
|
40
|
-
InvokeEventType
|
|
41
|
-
InvokeEventType
|
|
42
|
-
InvokeEventType
|
|
43
|
-
InvokeEventType
|
|
44
|
-
return InvokeEventType
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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 ===
|
|
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 ===
|
|
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
|
|
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
|
|
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
|
|
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
|
|
286
|
-
ctx
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
348
|
+
ctx.emit(event.sendEventAbort, {
|
|
353
349
|
invokeId,
|
|
354
350
|
content: error
|
|
355
351
|
}, emitOptions);
|
|
356
352
|
return;
|
|
357
353
|
}
|
|
358
|
-
ctx
|
|
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
|
|
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
|
|
512
|
-
if (!streamController
|
|
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
|
|
518
|
-
streamStates.set(invokeId, streamController
|
|
513
|
+
streamController = localController;
|
|
514
|
+
streamStates.set(invokeId, streamController);
|
|
519
515
|
handleInvoke(invokeId, reqStream, options);
|
|
520
516
|
}
|
|
521
|
-
streamController
|
|
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
|
|
709
|
-
seen.set(input, output
|
|
710
|
-
for (let i = 0; i < input.length; i += 1) output
|
|
711
|
-
return output
|
|
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
|
|
746
|
-
seen.set(input, output
|
|
747
|
-
for (let i = 0; i < input.length; i += 1) output
|
|
748
|
-
return output
|
|
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
|
|
815
|
-
wrapped
|
|
816
|
-
return wrapped
|
|
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
|
|
1109
|
-
if (!controller
|
|
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
|
|
1115
|
-
streamStates.set(invokeId, controller
|
|
1107
|
+
controller = localController;
|
|
1108
|
+
streamStates.set(invokeId, controller);
|
|
1116
1109
|
handleInvoke(invokeId, reqStream);
|
|
1117
1110
|
}
|
|
1118
|
-
controller
|
|
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
|
-
|
|
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":"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"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@moeru/eventa",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "1.0.0-beta.
|
|
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": ">=
|
|
94
|
-
"h3": "2.0.
|
|
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/
|
|
118
|
-
"@vitest/
|
|
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.
|
|
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.
|
|
135
|
+
"vitest": "^4.1.5"
|
|
129
136
|
},
|
|
130
137
|
"scripts": {
|
|
131
138
|
"build": "tsdown",
|