@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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","names":["createBaseContext"],"sources":["../../../src/adapters/webworkers/index.ts"],"sourcesContent":["import type { EventContext } from '../../context'\nimport type { DirectionalEventa, Eventa } from '../../eventa'\n\nimport { createContext as createBaseContext } from '../../context'\nimport { registerInvokeAbortEventListeners } from '../../context-extension-invoke-internal'\nimport { and, defineInboundEventa, defineOutboundEventa, EventaFlowDirection, matchBy } from '../../eventa'\nimport { generateWorkerPayload, parseWorkerPayload } from './internal'\nimport { isWorkerEventa, normalizeOnListenerParameters, workerErrorEvent } from './shared'\n\nexport function createContext(worker: Worker) {\n const ctx = createBaseContext() as EventContext<\n {\n invokeRequest?: { transfer?: Transferable[] }\n invokeResponse?: { transfer?: Transferable[] }\n },\n { raw: { message?: MessageEvent, error?: ErrorEvent, messageError?: MessageEvent }, transfer?: Transferable[] }\n >\n // Configure invoke to fail fast on fatal worker errors (load/syntax/runtime).\n registerInvokeAbortEventListeners(ctx, workerErrorEvent)\n\n ctx.on(and(\n matchBy((e: DirectionalEventa<any>) => e._flowDirection === EventaFlowDirection.Outbound || !e._flowDirection),\n matchBy('*'),\n ), (event, options) => {\n const { body, transfer } = normalizeOnListenerParameters(event, options)\n const data = generateWorkerPayload(event.id, { ...defineOutboundEventa(event.type), ...event, body })\n if (transfer != null) {\n worker.postMessage(data, { transfer })\n return\n }\n\n worker.postMessage(data)\n })\n\n worker.onmessage = (event) => {\n try {\n const { type, payload } = parseWorkerPayload<Eventa<any>>(event.data)\n if (!isWorkerEventa(payload)) {\n ctx.emit(defineInboundEventa(type), payload.body, { raw: { message: event } })\n }\n else {\n ctx.emit(defineInboundEventa(type), { message: payload.body }, { raw: { message: event } })\n }\n }\n catch (error) {\n console.error('Failed to parse WebWorker message:', error)\n ctx.emit(workerErrorEvent, { error }, { raw: { message: event } })\n }\n }\n\n worker.onerror = (error) => {\n ctx.emit(workerErrorEvent, { error }, { raw: { error } })\n }\n\n worker.onmessageerror = (error) => {\n ctx.emit(workerErrorEvent, { error }, { raw: { messageError: error } })\n }\n\n return {\n context: ctx,\n }\n}\n\nexport { defineOutboundWorkerEventa, defineWorkerEventa, isWorkerEventa } from './shared'\nexport type * from './shared'\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.mjs","names":["createBaseContext"],"sources":["../../../src/adapters/webworkers/index.ts"],"sourcesContent":["import type { EventContext } from '../../context'\nimport type { DirectionalEventa, Eventa } from '../../eventa'\n\nimport { createContext as createBaseContext } from '../../context'\nimport { registerInvokeAbortEventListeners } from '../../context-extension-invoke-internal'\nimport { and, defineInboundEventa, defineOutboundEventa, EventaFlowDirection, matchBy } from '../../eventa'\nimport { generateWorkerPayload, parseWorkerPayload } from './internal'\nimport { isWorkerEventa, normalizeOnListenerParameters, workerErrorEvent } from './shared'\n\nexport function createContext(worker: Worker) {\n const ctx = createBaseContext() as EventContext<\n {\n invokeRequest?: { transfer?: Transferable[] }\n invokeResponse?: { transfer?: Transferable[] }\n },\n { raw: { message?: MessageEvent, error?: ErrorEvent, messageError?: MessageEvent }, transfer?: Transferable[] }\n >\n // Configure invoke to fail fast on fatal worker errors (load/syntax/runtime).\n registerInvokeAbortEventListeners(ctx, workerErrorEvent)\n\n ctx.on(and(\n matchBy((e: DirectionalEventa<any>) => e._flowDirection === EventaFlowDirection.Outbound || !e._flowDirection),\n matchBy('*'),\n ), (event, options) => {\n const { body, transfer } = normalizeOnListenerParameters(event, options)\n const data = generateWorkerPayload(event.id, { ...defineOutboundEventa(event.type), ...event, body })\n if (transfer != null) {\n worker.postMessage(data, { transfer })\n return\n }\n\n worker.postMessage(data)\n })\n\n worker.onmessage = (event) => {\n try {\n const { type, payload } = parseWorkerPayload<Eventa<any>>(event.data)\n if (!isWorkerEventa(payload)) {\n ctx.emit(defineInboundEventa(type), payload.body, { raw: { message: event } })\n }\n else {\n ctx.emit(defineInboundEventa(type), { message: payload.body }, { raw: { message: event } })\n }\n }\n catch (error) {\n console.error('Failed to parse WebWorker message:', error)\n ctx.emit(workerErrorEvent, { error }, { raw: { message: event } })\n }\n }\n\n worker.onerror = (error) => {\n ctx.emit(workerErrorEvent, { error }, { raw: { error } })\n }\n\n worker.onmessageerror = (error) => {\n ctx.emit(workerErrorEvent, { error }, { raw: { messageError: error } })\n }\n\n return {\n context: ctx,\n }\n}\n\nexport { defineOutboundWorkerEventa, defineWorkerEventa, isWorkerEventa } from './shared'\nexport type * from './shared'\n"],"mappings":";;;;AASA,SAAgB,cAAc,QAAgB;CAC5C,MAAM,MAAMA,iBAAmB;AAQ/B,mCAAkC,KAAK,iBAAiB;AAExD,KAAI,GAAG,IACL,SAAS,MAA8B,EAAE,mBAAA,cAAmD,CAAC,EAAE,eAAe,EAC9G,QAAQ,IAAI,CACb,GAAG,OAAO,YAAY;EACrB,MAAM,EAAE,MAAM,aAAa,8BAA8B,OAAO,QAAQ;EACxE,MAAM,OAAO,sBAAsB,MAAM,IAAI;GAAE,GAAG,qBAAqB,MAAM,KAAK;GAAE,GAAG;GAAO;GAAM,CAAC;AACrG,MAAI,YAAY,MAAM;AACpB,UAAO,YAAY,MAAM,EAAE,UAAU,CAAC;AACtC;;AAGF,SAAO,YAAY,KAAK;GACxB;AAEF,QAAO,aAAa,UAAU;AAC5B,MAAI;GACF,MAAM,EAAE,MAAM,YAAY,mBAAgC,MAAM,KAAK;AACrE,OAAI,CAAC,eAAe,QAAQ,CAC1B,KAAI,KAAK,oBAAoB,KAAK,EAAE,QAAQ,MAAM,EAAE,KAAK,EAAE,SAAS,OAAO,EAAE,CAAC;OAG9E,KAAI,KAAK,oBAAoB,KAAK,EAAE,EAAE,SAAS,QAAQ,MAAM,EAAE,EAAE,KAAK,EAAE,SAAS,OAAO,EAAE,CAAC;WAGxF,OAAO;AACZ,WAAQ,MAAM,sCAAsC,MAAM;AAC1D,OAAI,KAAK,kBAAkB,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,SAAS,OAAO,EAAE,CAAC;;;AAItE,QAAO,WAAW,UAAU;AAC1B,MAAI,KAAK,kBAAkB,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;;AAG3D,QAAO,kBAAkB,UAAU;AACjC,MAAI,KAAK,kBAAkB,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,cAAc,OAAO,EAAE,CAAC;;AAGzE,QAAO,EACL,SAAS,KACV"}
|
|
@@ -1,14 +1,13 @@
|
|
|
1
|
-
import { c as matchBy, i as and,
|
|
2
|
-
import { E as registerInvokeAbortEventListeners } from "../../../src-
|
|
3
|
-
import { a as workerErrorEvent, i as normalizeOnListenerParameters, o as generateWorkerPayload, r as isWorkerEventa, s as parseWorkerPayload } from "../../../shared-
|
|
4
|
-
|
|
1
|
+
import { c as matchBy, i as and, o as defineInboundEventa, s as defineOutboundEventa, t as createContext$1 } from "../../../context-Dht_IZMb.mjs";
|
|
2
|
+
import { E as registerInvokeAbortEventListeners } from "../../../src-CTs6h4Ci.mjs";
|
|
3
|
+
import { a as workerErrorEvent, i as normalizeOnListenerParameters, o as generateWorkerPayload, r as isWorkerEventa, s as parseWorkerPayload } from "../../../shared-CA5MGwv0.mjs";
|
|
5
4
|
//#region src/adapters/webworkers/worker/index.ts
|
|
6
5
|
function createContext(options) {
|
|
7
6
|
const { messagePort = self } = options || {};
|
|
8
7
|
const ctx = createContext$1();
|
|
9
8
|
registerInvokeAbortEventListeners(ctx, workerErrorEvent);
|
|
10
|
-
ctx.on(and(matchBy((e) => e._flowDirection ===
|
|
11
|
-
const { body, transfer } = normalizeOnListenerParameters(event, options
|
|
9
|
+
ctx.on(and(matchBy((e) => e._flowDirection === "outbound" || !e._flowDirection), matchBy("*")), (event, options) => {
|
|
10
|
+
const { body, transfer } = normalizeOnListenerParameters(event, options);
|
|
12
11
|
const data = generateWorkerPayload(event.id, {
|
|
13
12
|
...defineOutboundEventa(event.type),
|
|
14
13
|
...event,
|
|
@@ -35,7 +34,7 @@ function createContext(options) {
|
|
|
35
34
|
};
|
|
36
35
|
return { context: ctx };
|
|
37
36
|
}
|
|
38
|
-
|
|
39
37
|
//#endregion
|
|
40
38
|
export { createContext };
|
|
39
|
+
|
|
41
40
|
//# sourceMappingURL=index.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","names":["createBaseContext"
|
|
1
|
+
{"version":3,"file":"index.mjs","names":["createBaseContext"],"sources":["../../../../src/adapters/webworkers/worker/index.ts"],"sourcesContent":["/* eslint-disable no-restricted-globals */\nimport type { EventContext } from '../../../context'\nimport type { DirectionalEventa, Eventa } from '../../../eventa'\n\nimport { createContext as createBaseContext } from '../../../context'\nimport { registerInvokeAbortEventListeners } from '../../../context-extension-invoke-internal'\nimport { and, defineInboundEventa, defineOutboundEventa, EventaFlowDirection, matchBy } from '../../../eventa'\nimport { generateWorkerPayload, parseWorkerPayload } from '../internal'\nimport { isWorkerEventa, normalizeOnListenerParameters, workerErrorEvent } from '../shared'\n\nexport function createContext(options?: {\n messagePort?: Omit<Worker, 'close' | 'start'>\n}) {\n const {\n messagePort = self,\n } = options || {}\n\n const ctx = createBaseContext() as EventContext<\n {\n invokeRequest?: { transfer?: Transferable[] }\n invokeResponse?: { transfer?: Transferable[] }\n },\n {\n raw: { event?: any, error?: string | Event }\n transfer?: Transferable[]\n }\n >\n // Configure invoke to fail fast on fatal worker errors (load/syntax/runtime).\n registerInvokeAbortEventListeners(ctx, workerErrorEvent)\n\n ctx.on(and(\n matchBy((e: DirectionalEventa<any>) => e._flowDirection === EventaFlowDirection.Outbound || !e._flowDirection),\n matchBy('*'),\n ), (event, options) => {\n const { body, transfer } = normalizeOnListenerParameters(event, options)\n const data = generateWorkerPayload(event.id, { ...defineOutboundEventa(event.type), ...event, body })\n if (transfer != null) {\n messagePort.postMessage(data, { transfer })\n return\n }\n\n messagePort.postMessage(data)\n })\n\n self.onerror = (error) => {\n ctx.emit(workerErrorEvent, { error }, { raw: { error } })\n }\n\n self.onmessage = (event) => {\n try {\n const { type, payload } = parseWorkerPayload<Eventa<any>>(event.data)\n if (!isWorkerEventa(payload)) {\n ctx.emit(defineInboundEventa(type), payload.body, { raw: { event } })\n }\n else {\n ctx.emit(defineInboundEventa(type), { message: payload.body }, { raw: { event } })\n }\n }\n catch (error) {\n console.error('Failed to parse WebWorker message:', error)\n ctx.emit(workerErrorEvent, { error }, { raw: { event } })\n }\n }\n\n return {\n context: ctx,\n }\n}\n"],"mappings":";;;;AAUA,SAAgB,cAAc,SAE3B;CACD,MAAM,EACJ,cAAc,SACZ,WAAW,EAAE;CAEjB,MAAM,MAAMA,iBAAmB;AAW/B,mCAAkC,KAAK,iBAAiB;AAExD,KAAI,GAAG,IACL,SAAS,MAA8B,EAAE,mBAAA,cAAmD,CAAC,EAAE,eAAe,EAC9G,QAAQ,IAAI,CACb,GAAG,OAAO,YAAY;EACrB,MAAM,EAAE,MAAM,aAAa,8BAA8B,OAAO,QAAQ;EACxE,MAAM,OAAO,sBAAsB,MAAM,IAAI;GAAE,GAAG,qBAAqB,MAAM,KAAK;GAAE,GAAG;GAAO;GAAM,CAAC;AACrG,MAAI,YAAY,MAAM;AACpB,eAAY,YAAY,MAAM,EAAE,UAAU,CAAC;AAC3C;;AAGF,cAAY,YAAY,KAAK;GAC7B;AAEF,MAAK,WAAW,UAAU;AACxB,MAAI,KAAK,kBAAkB,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;;AAG3D,MAAK,aAAa,UAAU;AAC1B,MAAI;GACF,MAAM,EAAE,MAAM,YAAY,mBAAgC,MAAM,KAAK;AACrE,OAAI,CAAC,eAAe,QAAQ,CAC1B,KAAI,KAAK,oBAAoB,KAAK,EAAE,QAAQ,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;OAGrE,KAAI,KAAK,oBAAoB,KAAK,EAAE,EAAE,SAAS,QAAQ,MAAM,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;WAG/E,OAAO;AACZ,WAAQ,MAAM,sCAAsC,MAAM;AAC1D,OAAI,KAAK,kBAAkB,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;;;AAI7D,QAAO,EACL,SAAS,KACV"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { n as EventTag, s as EventaType } from "../../eventa-DSnoBa1O.mjs";
|
|
2
|
+
import { t as EventContext } from "../../context-BsqFeoer.mjs";
|
|
3
|
+
|
|
4
|
+
//#region src/adapters/window-message/shared.d.ts
|
|
5
|
+
interface Payload<T> {
|
|
6
|
+
id: string;
|
|
7
|
+
type: EventTag<any, any>;
|
|
8
|
+
payload: T;
|
|
9
|
+
}
|
|
10
|
+
interface WindowMessageEnvelope<T> {
|
|
11
|
+
__eventa: true;
|
|
12
|
+
channel: string;
|
|
13
|
+
sourceId: string;
|
|
14
|
+
payload: Payload<T>;
|
|
15
|
+
}
|
|
16
|
+
declare const errorEvent: {
|
|
17
|
+
body?: {
|
|
18
|
+
error: unknown;
|
|
19
|
+
} | undefined;
|
|
20
|
+
metadata?: undefined;
|
|
21
|
+
invokeMetadata?: undefined;
|
|
22
|
+
id: string;
|
|
23
|
+
type?: EventaType.Event | undefined;
|
|
24
|
+
};
|
|
25
|
+
//#endregion
|
|
26
|
+
//#region src/adapters/window-message/index.d.ts
|
|
27
|
+
interface WindowMessageAdapterOptions {
|
|
28
|
+
channel: string;
|
|
29
|
+
currentWindow: Window;
|
|
30
|
+
targetWindow: () => Window | null | undefined;
|
|
31
|
+
expectedSource?: () => MessageEventSource | null | undefined;
|
|
32
|
+
targetOrigin?: string;
|
|
33
|
+
expectedOrigin?: string | ((origin: string) => boolean);
|
|
34
|
+
acceptMessage?: (event: MessageEvent<unknown>) => boolean;
|
|
35
|
+
messageEvents?: boolean;
|
|
36
|
+
messageErrorEvents?: boolean;
|
|
37
|
+
}
|
|
38
|
+
declare function createContext(options: WindowMessageAdapterOptions): {
|
|
39
|
+
context: EventContext<any, {
|
|
40
|
+
raw: {
|
|
41
|
+
message?: MessageEvent;
|
|
42
|
+
messageError?: MessageEvent;
|
|
43
|
+
error?: unknown;
|
|
44
|
+
};
|
|
45
|
+
}>;
|
|
46
|
+
dispose: () => void;
|
|
47
|
+
};
|
|
48
|
+
//#endregion
|
|
49
|
+
export { Payload, WindowMessageAdapterOptions, WindowMessageEnvelope, createContext, errorEvent };
|
|
50
|
+
//# sourceMappingURL=index.d.mts.map
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { a as defineEventa, c as matchBy, i as and, l as nanoid, o as defineInboundEventa, s as defineOutboundEventa, t as createContext$1 } from "../../context-Dht_IZMb.mjs";
|
|
2
|
+
import "../../src-CTs6h4Ci.mjs";
|
|
3
|
+
//#region src/adapters/window-message/internal.ts
|
|
4
|
+
function generatePayload(type, payload) {
|
|
5
|
+
return {
|
|
6
|
+
id: nanoid(),
|
|
7
|
+
type,
|
|
8
|
+
payload
|
|
9
|
+
};
|
|
10
|
+
}
|
|
11
|
+
function parsePayload(data) {
|
|
12
|
+
return data;
|
|
13
|
+
}
|
|
14
|
+
//#endregion
|
|
15
|
+
//#region src/adapters/window-message/shared.ts
|
|
16
|
+
const errorEvent = { ...defineEventa() };
|
|
17
|
+
//#endregion
|
|
18
|
+
//#region src/adapters/window-message/index.ts
|
|
19
|
+
function withRemoval(currentWindow, type, listener) {
|
|
20
|
+
currentWindow.addEventListener(type, listener);
|
|
21
|
+
return { remove: () => {
|
|
22
|
+
currentWindow.removeEventListener(type, listener);
|
|
23
|
+
} };
|
|
24
|
+
}
|
|
25
|
+
function isEnvelope(value, channel) {
|
|
26
|
+
return typeof value === "object" && value !== null && "__eventa" in value && value.__eventa === true && "channel" in value && value.channel === channel && "sourceId" in value && typeof value.sourceId === "string" && "payload" in value && typeof value.payload === "object" && value.payload !== null;
|
|
27
|
+
}
|
|
28
|
+
function matchOrigin(expectedOrigin, origin) {
|
|
29
|
+
if (typeof expectedOrigin === "function") return expectedOrigin(origin);
|
|
30
|
+
return expectedOrigin === origin;
|
|
31
|
+
}
|
|
32
|
+
function createContext(options) {
|
|
33
|
+
const ctx = createContext$1();
|
|
34
|
+
const sourceId = crypto.randomUUID();
|
|
35
|
+
const { messageEvents: message = true, messageErrorEvents: messageError = true } = options;
|
|
36
|
+
const cleanupRemoval = [];
|
|
37
|
+
ctx.on(and(matchBy((e) => e._flowDirection === "outbound" || !e._flowDirection), matchBy("*")), (event) => {
|
|
38
|
+
const targetWindow = options.targetWindow();
|
|
39
|
+
if (!targetWindow) return;
|
|
40
|
+
const payload = generatePayload(event.id, {
|
|
41
|
+
...defineOutboundEventa(event.type),
|
|
42
|
+
...event
|
|
43
|
+
});
|
|
44
|
+
targetWindow.postMessage({
|
|
45
|
+
__eventa: true,
|
|
46
|
+
channel: options.channel,
|
|
47
|
+
sourceId,
|
|
48
|
+
payload
|
|
49
|
+
}, options.targetOrigin ?? "*");
|
|
50
|
+
});
|
|
51
|
+
if (message) cleanupRemoval.push(withRemoval(options.currentWindow, "message", (event) => {
|
|
52
|
+
if (!isEnvelope(event.data, options.channel)) return;
|
|
53
|
+
const expectedSource = options.expectedSource?.();
|
|
54
|
+
if (expectedSource && event.source !== expectedSource) return;
|
|
55
|
+
if (options.expectedOrigin && !matchOrigin(options.expectedOrigin, event.origin)) return;
|
|
56
|
+
if (event.data.sourceId === sourceId) return;
|
|
57
|
+
if (options.acceptMessage && !options.acceptMessage(event)) return;
|
|
58
|
+
try {
|
|
59
|
+
const { type, payload } = parsePayload(event.data.payload);
|
|
60
|
+
ctx.emit(defineInboundEventa(type), payload.body, { raw: { message: event } });
|
|
61
|
+
} catch (error) {
|
|
62
|
+
console.error("Failed to parse window message:", error);
|
|
63
|
+
ctx.emit(errorEvent, { error }, { raw: { error } });
|
|
64
|
+
}
|
|
65
|
+
}));
|
|
66
|
+
if (messageError) cleanupRemoval.push(withRemoval(options.currentWindow, "messageerror", (event) => {
|
|
67
|
+
ctx.emit(errorEvent, { error: event }, { raw: { messageError: event } });
|
|
68
|
+
}));
|
|
69
|
+
return {
|
|
70
|
+
context: ctx,
|
|
71
|
+
dispose: () => {
|
|
72
|
+
cleanupRemoval.forEach((removal) => removal.remove());
|
|
73
|
+
}
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
//#endregion
|
|
77
|
+
export { createContext };
|
|
78
|
+
|
|
79
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.mjs","names":["createBaseContext"],"sources":["../../../src/adapters/window-message/internal.ts","../../../src/adapters/window-message/shared.ts","../../../src/adapters/window-message/index.ts"],"sourcesContent":["import type { EventTag } from '../..'\nimport type { Payload } from './shared'\n\nimport { nanoid } from '../..'\n\nexport function generatePayload<T>(type: EventTag<any, any>, payload: T): Payload<T> {\n return {\n id: nanoid(),\n type,\n payload,\n }\n}\n\nexport function parsePayload<T>(data: unknown): Payload<T> {\n return data as Payload<T>\n}\n","import type { EventTag } from '../../eventa'\n\nimport { defineEventa } from '../../eventa'\n\nexport interface Payload<T> {\n id: string\n type: EventTag<any, any>\n payload: T\n}\n\nexport interface WindowMessageEnvelope<T> {\n __eventa: true\n channel: string\n sourceId: string\n payload: Payload<T>\n}\n\nexport const errorEvent = { ...defineEventa<{ error: unknown }>() }\n","import type { EventContext } from '../../context'\nimport type { DirectionalEventa, Eventa } from '../../eventa'\nimport type { WindowMessageEnvelope } from './shared'\n\nimport { createContext as createBaseContext } from '../../context'\nimport { and, defineInboundEventa, defineOutboundEventa, EventaFlowDirection, matchBy } from '../../eventa'\nimport { generatePayload, parsePayload } from './internal'\nimport { errorEvent } from './shared'\n\nfunction withRemoval<K extends keyof WindowEventMap>(currentWindow: Window, type: K, listener: (event: WindowEventMap[K]) => void) {\n currentWindow.addEventListener(type, listener)\n\n return {\n remove: () => {\n currentWindow.removeEventListener(type, listener)\n },\n }\n}\n\nfunction isEnvelope(value: unknown, channel: string): value is WindowMessageEnvelope<Eventa<any>> {\n return typeof value === 'object'\n && value !== null\n && '__eventa' in value\n && value.__eventa === true\n && 'channel' in value\n && value.channel === channel\n && 'sourceId' in value\n && typeof value.sourceId === 'string'\n && 'payload' in value\n && typeof value.payload === 'object'\n && value.payload !== null\n}\n\nfunction matchOrigin(expectedOrigin: string | ((origin: string) => boolean), origin: string) {\n if (typeof expectedOrigin === 'function') {\n return expectedOrigin(origin)\n }\n\n return expectedOrigin === origin\n}\n\nexport interface WindowMessageAdapterOptions {\n channel: string\n currentWindow: Window\n targetWindow: () => Window | null | undefined\n expectedSource?: () => MessageEventSource | null | undefined\n targetOrigin?: string\n expectedOrigin?: string | ((origin: string) => boolean)\n acceptMessage?: (event: MessageEvent<unknown>) => boolean\n messageEvents?: boolean\n messageErrorEvents?: boolean\n}\n\nexport function createContext(options: WindowMessageAdapterOptions) {\n const ctx = createBaseContext() as EventContext<any, { raw: { message?: MessageEvent, messageError?: MessageEvent, error?: unknown } }>\n const sourceId = crypto.randomUUID()\n\n const {\n messageEvents: message = true,\n messageErrorEvents: messageError = true,\n } = options\n\n const cleanupRemoval: Array<{ remove: () => void }> = []\n\n ctx.on(and(\n matchBy((e: DirectionalEventa<any>) => e._flowDirection === EventaFlowDirection.Outbound || !e._flowDirection),\n matchBy('*'),\n ), (event) => {\n const targetWindow = options.targetWindow()\n if (!targetWindow) {\n return\n }\n\n const payload = generatePayload(event.id, { ...defineOutboundEventa(event.type), ...event })\n targetWindow.postMessage({\n __eventa: true,\n channel: options.channel,\n sourceId,\n payload,\n } satisfies WindowMessageEnvelope<Eventa<any>>, options.targetOrigin ?? '*')\n })\n\n if (message) {\n cleanupRemoval.push(withRemoval(options.currentWindow, 'message', (event) => {\n if (!isEnvelope(event.data, options.channel)) {\n return\n }\n\n const expectedSource = options.expectedSource?.()\n if (expectedSource && event.source !== expectedSource) {\n return\n }\n\n if (options.expectedOrigin && !matchOrigin(options.expectedOrigin, event.origin)) {\n return\n }\n\n if (event.data.sourceId === sourceId) {\n return\n }\n\n if (options.acceptMessage && !options.acceptMessage(event)) {\n return\n }\n\n try {\n const { type, payload } = parsePayload<Eventa<any>>(event.data.payload)\n ctx.emit(defineInboundEventa(type), payload.body, { raw: { message: event } })\n }\n catch (error) {\n console.error('Failed to parse window message:', error)\n ctx.emit(errorEvent, { error }, { raw: { error } })\n }\n }))\n }\n\n if (messageError) {\n cleanupRemoval.push(withRemoval(options.currentWindow, 'messageerror', (event) => {\n ctx.emit(errorEvent, { error: event }, { raw: { messageError: event } })\n }))\n }\n\n return {\n context: ctx,\n dispose: () => {\n cleanupRemoval.forEach(removal => removal.remove())\n },\n }\n}\n\nexport type * from './shared'\n"],"mappings":";;;AAKA,SAAgB,gBAAmB,MAA0B,SAAwB;AACnF,QAAO;EACL,IAAI,QAAQ;EACZ;EACA;EACD;;AAGH,SAAgB,aAAgB,MAA2B;AACzD,QAAO;;;;ACGT,MAAa,aAAa,EAAE,GAAG,cAAkC,EAAE;;;ACRnE,SAAS,YAA4C,eAAuB,MAAS,UAA8C;AACjI,eAAc,iBAAiB,MAAM,SAAS;AAE9C,QAAO,EACL,cAAc;AACZ,gBAAc,oBAAoB,MAAM,SAAS;IAEpD;;AAGH,SAAS,WAAW,OAAgB,SAA8D;AAChG,QAAO,OAAO,UAAU,YACnB,UAAU,QACV,cAAc,SACd,MAAM,aAAa,QACnB,aAAa,SACb,MAAM,YAAY,WAClB,cAAc,SACd,OAAO,MAAM,aAAa,YAC1B,aAAa,SACb,OAAO,MAAM,YAAY,YACzB,MAAM,YAAY;;AAGzB,SAAS,YAAY,gBAAwD,QAAgB;AAC3F,KAAI,OAAO,mBAAmB,WAC5B,QAAO,eAAe,OAAO;AAG/B,QAAO,mBAAmB;;AAe5B,SAAgB,cAAc,SAAsC;CAClE,MAAM,MAAMA,iBAAmB;CAC/B,MAAM,WAAW,OAAO,YAAY;CAEpC,MAAM,EACJ,eAAe,UAAU,MACzB,oBAAoB,eAAe,SACjC;CAEJ,MAAM,iBAAgD,EAAE;AAExD,KAAI,GAAG,IACL,SAAS,MAA8B,EAAE,mBAAA,cAAmD,CAAC,EAAE,eAAe,EAC9G,QAAQ,IAAI,CACb,GAAG,UAAU;EACZ,MAAM,eAAe,QAAQ,cAAc;AAC3C,MAAI,CAAC,aACH;EAGF,MAAM,UAAU,gBAAgB,MAAM,IAAI;GAAE,GAAG,qBAAqB,MAAM,KAAK;GAAE,GAAG;GAAO,CAAC;AAC5F,eAAa,YAAY;GACvB,UAAU;GACV,SAAS,QAAQ;GACjB;GACA;GACD,EAA+C,QAAQ,gBAAgB,IAAI;GAC5E;AAEF,KAAI,QACF,gBAAe,KAAK,YAAY,QAAQ,eAAe,YAAY,UAAU;AAC3E,MAAI,CAAC,WAAW,MAAM,MAAM,QAAQ,QAAQ,CAC1C;EAGF,MAAM,iBAAiB,QAAQ,kBAAkB;AACjD,MAAI,kBAAkB,MAAM,WAAW,eACrC;AAGF,MAAI,QAAQ,kBAAkB,CAAC,YAAY,QAAQ,gBAAgB,MAAM,OAAO,CAC9E;AAGF,MAAI,MAAM,KAAK,aAAa,SAC1B;AAGF,MAAI,QAAQ,iBAAiB,CAAC,QAAQ,cAAc,MAAM,CACxD;AAGF,MAAI;GACF,MAAM,EAAE,MAAM,YAAY,aAA0B,MAAM,KAAK,QAAQ;AACvE,OAAI,KAAK,oBAAoB,KAAK,EAAE,QAAQ,MAAM,EAAE,KAAK,EAAE,SAAS,OAAO,EAAE,CAAC;WAEzE,OAAO;AACZ,WAAQ,MAAM,mCAAmC,MAAM;AACvD,OAAI,KAAK,YAAY,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;;GAErD,CAAC;AAGL,KAAI,aACF,gBAAe,KAAK,YAAY,QAAQ,eAAe,iBAAiB,UAAU;AAChF,MAAI,KAAK,YAAY,EAAE,OAAO,OAAO,EAAE,EAAE,KAAK,EAAE,cAAc,OAAO,EAAE,CAAC;GACxE,CAAC;AAGL,QAAO;EACL,SAAS;EACT,eAAe;AACb,kBAAe,SAAQ,YAAW,QAAQ,QAAQ,CAAC;;EAEtD"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { t as EventContext } from "../../context-
|
|
2
|
-
import { a as isWorkerEventa, c as workerMessageErrorEvent, i as defineWorkerEventa, n as WorkerPayload, o as normalizeOnListenerParameters, r as defineOutboundWorkerEventa, s as workerErrorEvent, t as WorkerEventa } from "../../shared-
|
|
1
|
+
import { t as EventContext } from "../../context-BsqFeoer.mjs";
|
|
2
|
+
import { a as isWorkerEventa, c as workerMessageErrorEvent, i as defineWorkerEventa, n as WorkerPayload, o as normalizeOnListenerParameters, r as defineOutboundWorkerEventa, s as workerErrorEvent, t as WorkerEventa } from "../../shared-CVTLm458.mjs";
|
|
3
3
|
import { Transferable, Worker } from "node:worker_threads";
|
|
4
4
|
|
|
5
5
|
//#region src/adapters/worker-threads/index.d.ts
|
|
@@ -1,12 +1,11 @@
|
|
|
1
|
-
import { c as matchBy, i as and,
|
|
2
|
-
import { E as registerInvokeAbortEventListeners } from "../../src-
|
|
3
|
-
import { a as workerErrorEvent, i as normalizeOnListenerParameters, n as defineWorkerEventa, o as generateWorkerPayload, r as isWorkerEventa, s as parseWorkerPayload, t as defineOutboundWorkerEventa } from "../../shared-
|
|
4
|
-
|
|
1
|
+
import { c as matchBy, i as and, o as defineInboundEventa, s as defineOutboundEventa, t as createContext$1 } from "../../context-Dht_IZMb.mjs";
|
|
2
|
+
import { E as registerInvokeAbortEventListeners } from "../../src-CTs6h4Ci.mjs";
|
|
3
|
+
import { a as workerErrorEvent, i as normalizeOnListenerParameters, n as defineWorkerEventa, o as generateWorkerPayload, r as isWorkerEventa, s as parseWorkerPayload, t as defineOutboundWorkerEventa } from "../../shared-CA5MGwv0.mjs";
|
|
5
4
|
//#region src/adapters/worker-threads/index.ts
|
|
6
5
|
function createContext(worker) {
|
|
7
6
|
const ctx = createContext$1();
|
|
8
7
|
registerInvokeAbortEventListeners(ctx, workerErrorEvent);
|
|
9
|
-
ctx.on(and(matchBy((e) => e._flowDirection ===
|
|
8
|
+
ctx.on(and(matchBy((e) => e._flowDirection === "outbound" || !e._flowDirection), matchBy("*")), (event, options) => {
|
|
10
9
|
const { body, transfer } = normalizeOnListenerParameters(event, options);
|
|
11
10
|
const data = generateWorkerPayload(event.id, {
|
|
12
11
|
...defineOutboundEventa(event.type),
|
|
@@ -37,7 +36,7 @@ function createContext(worker) {
|
|
|
37
36
|
});
|
|
38
37
|
return { context: ctx };
|
|
39
38
|
}
|
|
40
|
-
|
|
41
39
|
//#endregion
|
|
42
40
|
export { createContext, defineOutboundWorkerEventa, defineWorkerEventa, isWorkerEventa };
|
|
41
|
+
|
|
43
42
|
//# sourceMappingURL=index.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","names":["createBaseContext"],"sources":["../../../src/adapters/worker-threads/index.ts"],"sourcesContent":["import type { Transferable, Worker } from 'node:worker_threads'\n\nimport type { EventContext } from '../../context'\nimport type { DirectionalEventa, Eventa } from '../../eventa'\n\nimport { createContext as createBaseContext } from '../../context'\nimport { registerInvokeAbortEventListeners } from '../../context-extension-invoke-internal'\nimport { and, defineInboundEventa, defineOutboundEventa, EventaFlowDirection, matchBy } from '../../eventa'\nimport { generateWorkerPayload, parseWorkerPayload } from '../webworkers/internal'\nimport { isWorkerEventa, normalizeOnListenerParameters, workerErrorEvent } from '../webworkers/shared'\n\nexport function createContext(worker: Worker) {\n const ctx = createBaseContext() as EventContext<\n {\n invokeRequest?: { transfer?: Transferable[] }\n invokeResponse?: { transfer?: Transferable[] }\n },\n { raw: { message?: unknown, error?: unknown, messageError?: unknown }, transfer?: Transferable[] }\n >\n // Configure invoke to fail fast on fatal worker errors (load/syntax/runtime).\n registerInvokeAbortEventListeners(ctx, workerErrorEvent)\n\n ctx.on(and(\n matchBy((e: DirectionalEventa<any>) => e._flowDirection === EventaFlowDirection.Outbound || !e._flowDirection),\n matchBy('*'),\n ), (event, options) => {\n const { body, transfer } = normalizeOnListenerParameters(event, options)\n const data = generateWorkerPayload(event.id, { ...defineOutboundEventa(event.type), ...event, body })\n if (transfer != null) {\n worker.postMessage(data, transfer as unknown as Transferable[])\n return\n }\n\n worker.postMessage(data)\n })\n\n worker.on('message', (message) => {\n try {\n const { type, payload } = parseWorkerPayload<Eventa<any>>(message)\n if (!isWorkerEventa(payload)) {\n ctx.emit(defineInboundEventa(type), payload.body, { raw: { message } })\n }\n else {\n ctx.emit(defineInboundEventa(type), { message: payload.body }, { raw: { message } })\n }\n }\n catch (error) {\n console.error('Failed to parse Node worker message:', error)\n ctx.emit(workerErrorEvent, { error }, { raw: { message } })\n }\n })\n\n worker.on('error', (error) => {\n ctx.emit(workerErrorEvent, { error }, { raw: { error } })\n })\n\n worker.on('messageerror', (error) => {\n ctx.emit(workerErrorEvent, { error }, { raw: { messageError: error } })\n })\n\n return {\n context: ctx,\n }\n}\n\nexport { defineOutboundWorkerEventa, defineWorkerEventa, isWorkerEventa } from '../webworkers/shared'\nexport type * from '../webworkers/shared'\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.mjs","names":["createBaseContext"],"sources":["../../../src/adapters/worker-threads/index.ts"],"sourcesContent":["import type { Transferable, Worker } from 'node:worker_threads'\n\nimport type { EventContext } from '../../context'\nimport type { DirectionalEventa, Eventa } from '../../eventa'\n\nimport { createContext as createBaseContext } from '../../context'\nimport { registerInvokeAbortEventListeners } from '../../context-extension-invoke-internal'\nimport { and, defineInboundEventa, defineOutboundEventa, EventaFlowDirection, matchBy } from '../../eventa'\nimport { generateWorkerPayload, parseWorkerPayload } from '../webworkers/internal'\nimport { isWorkerEventa, normalizeOnListenerParameters, workerErrorEvent } from '../webworkers/shared'\n\nexport function createContext(worker: Worker) {\n const ctx = createBaseContext() as EventContext<\n {\n invokeRequest?: { transfer?: Transferable[] }\n invokeResponse?: { transfer?: Transferable[] }\n },\n { raw: { message?: unknown, error?: unknown, messageError?: unknown }, transfer?: Transferable[] }\n >\n // Configure invoke to fail fast on fatal worker errors (load/syntax/runtime).\n registerInvokeAbortEventListeners(ctx, workerErrorEvent)\n\n ctx.on(and(\n matchBy((e: DirectionalEventa<any>) => e._flowDirection === EventaFlowDirection.Outbound || !e._flowDirection),\n matchBy('*'),\n ), (event, options) => {\n const { body, transfer } = normalizeOnListenerParameters(event, options)\n const data = generateWorkerPayload(event.id, { ...defineOutboundEventa(event.type), ...event, body })\n if (transfer != null) {\n worker.postMessage(data, transfer as unknown as Transferable[])\n return\n }\n\n worker.postMessage(data)\n })\n\n worker.on('message', (message) => {\n try {\n const { type, payload } = parseWorkerPayload<Eventa<any>>(message)\n if (!isWorkerEventa(payload)) {\n ctx.emit(defineInboundEventa(type), payload.body, { raw: { message } })\n }\n else {\n ctx.emit(defineInboundEventa(type), { message: payload.body }, { raw: { message } })\n }\n }\n catch (error) {\n console.error('Failed to parse Node worker message:', error)\n ctx.emit(workerErrorEvent, { error }, { raw: { message } })\n }\n })\n\n worker.on('error', (error) => {\n ctx.emit(workerErrorEvent, { error }, { raw: { error } })\n })\n\n worker.on('messageerror', (error) => {\n ctx.emit(workerErrorEvent, { error }, { raw: { messageError: error } })\n })\n\n return {\n context: ctx,\n }\n}\n\nexport { defineOutboundWorkerEventa, defineWorkerEventa, isWorkerEventa } from '../webworkers/shared'\nexport type * from '../webworkers/shared'\n"],"mappings":";;;;AAWA,SAAgB,cAAc,QAAgB;CAC5C,MAAM,MAAMA,iBAAmB;AAQ/B,mCAAkC,KAAK,iBAAiB;AAExD,KAAI,GAAG,IACL,SAAS,MAA8B,EAAE,mBAAA,cAAmD,CAAC,EAAE,eAAe,EAC9G,QAAQ,IAAI,CACb,GAAG,OAAO,YAAY;EACrB,MAAM,EAAE,MAAM,aAAa,8BAA8B,OAAO,QAAQ;EACxE,MAAM,OAAO,sBAAsB,MAAM,IAAI;GAAE,GAAG,qBAAqB,MAAM,KAAK;GAAE,GAAG;GAAO;GAAM,CAAC;AACrG,MAAI,YAAY,MAAM;AACpB,UAAO,YAAY,MAAM,SAAsC;AAC/D;;AAGF,SAAO,YAAY,KAAK;GACxB;AAEF,QAAO,GAAG,YAAY,YAAY;AAChC,MAAI;GACF,MAAM,EAAE,MAAM,YAAY,mBAAgC,QAAQ;AAClE,OAAI,CAAC,eAAe,QAAQ,CAC1B,KAAI,KAAK,oBAAoB,KAAK,EAAE,QAAQ,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;OAGvE,KAAI,KAAK,oBAAoB,KAAK,EAAE,EAAE,SAAS,QAAQ,MAAM,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;WAGjF,OAAO;AACZ,WAAQ,MAAM,wCAAwC,MAAM;AAC5D,OAAI,KAAK,kBAAkB,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;;GAE7D;AAEF,QAAO,GAAG,UAAU,UAAU;AAC5B,MAAI,KAAK,kBAAkB,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;GACzD;AAEF,QAAO,GAAG,iBAAiB,UAAU;AACnC,MAAI,KAAK,kBAAkB,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,cAAc,OAAO,EAAE,CAAC;GACvE;AAEF,QAAO,EACL,SAAS,KACV"}
|
|
@@ -1,16 +1,15 @@
|
|
|
1
|
-
import { c as matchBy, i as and,
|
|
2
|
-
import { E as registerInvokeAbortEventListeners } from "../../../src-
|
|
3
|
-
import { a as workerErrorEvent, i as normalizeOnListenerParameters, o as generateWorkerPayload, r as isWorkerEventa, s as parseWorkerPayload } from "../../../shared-
|
|
1
|
+
import { c as matchBy, i as and, o as defineInboundEventa, s as defineOutboundEventa, t as createContext$1 } from "../../../context-Dht_IZMb.mjs";
|
|
2
|
+
import { E as registerInvokeAbortEventListeners } from "../../../src-CTs6h4Ci.mjs";
|
|
3
|
+
import { a as workerErrorEvent, i as normalizeOnListenerParameters, o as generateWorkerPayload, r as isWorkerEventa, s as parseWorkerPayload } from "../../../shared-CA5MGwv0.mjs";
|
|
4
4
|
import { parentPort } from "node:worker_threads";
|
|
5
|
-
|
|
6
5
|
//#region src/adapters/worker-threads/worker/index.ts
|
|
7
6
|
function createContext(options) {
|
|
8
7
|
const messagePort = options?.messagePort ?? parentPort;
|
|
9
8
|
if (!messagePort) throw new Error("Node worker context requires a MessagePort (parentPort is null).");
|
|
10
9
|
const ctx = createContext$1();
|
|
11
10
|
registerInvokeAbortEventListeners(ctx, workerErrorEvent);
|
|
12
|
-
ctx.on(and(matchBy((e) => e._flowDirection ===
|
|
13
|
-
const { body, transfer } = normalizeOnListenerParameters(event, options
|
|
11
|
+
ctx.on(and(matchBy((e) => e._flowDirection === "outbound" || !e._flowDirection), matchBy("*")), (event, options) => {
|
|
12
|
+
const { body, transfer } = normalizeOnListenerParameters(event, options);
|
|
14
13
|
const data = generateWorkerPayload(event.id, {
|
|
15
14
|
...defineOutboundEventa(event.type),
|
|
16
15
|
...event,
|
|
@@ -40,7 +39,7 @@ function createContext(options) {
|
|
|
40
39
|
});
|
|
41
40
|
return { context: ctx };
|
|
42
41
|
}
|
|
43
|
-
|
|
44
42
|
//#endregion
|
|
45
43
|
export { createContext };
|
|
44
|
+
|
|
46
45
|
//# sourceMappingURL=index.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","names":["createBaseContext"
|
|
1
|
+
{"version":3,"file":"index.mjs","names":["createBaseContext"],"sources":["../../../../src/adapters/worker-threads/worker/index.ts"],"sourcesContent":["import type { MessagePort, Transferable } from 'node:worker_threads'\n\nimport type { EventContext } from '../../../context'\nimport type { DirectionalEventa, Eventa } from '../../../eventa'\n\nimport { parentPort } from 'node:worker_threads'\n\nimport { createContext as createBaseContext } from '../../../context'\nimport { registerInvokeAbortEventListeners } from '../../../context-extension-invoke-internal'\nimport { and, defineInboundEventa, defineOutboundEventa, EventaFlowDirection, matchBy } from '../../../eventa'\nimport { generateWorkerPayload, parseWorkerPayload } from '../../webworkers/internal'\nimport { isWorkerEventa, normalizeOnListenerParameters, workerErrorEvent } from '../../webworkers/shared'\n\nexport function createContext(options?: {\n messagePort?: MessagePort\n}) {\n const messagePort = options?.messagePort ?? parentPort\n if (!messagePort) {\n throw new Error('Node worker context requires a MessagePort (parentPort is null).')\n }\n\n const ctx = createBaseContext() as EventContext<\n {\n invokeRequest?: { transfer?: Transferable[] }\n invokeResponse?: { transfer?: Transferable[] }\n },\n { raw: { message?: unknown, error?: unknown, messageError?: unknown }, transfer?: Transferable[] }\n >\n // Configure invoke to fail fast on fatal worker errors (load/syntax/runtime).\n registerInvokeAbortEventListeners(ctx, workerErrorEvent)\n\n ctx.on(and(\n matchBy((e: DirectionalEventa<any>) => e._flowDirection === EventaFlowDirection.Outbound || !e._flowDirection),\n matchBy('*'),\n ), (event, options) => {\n const { body, transfer } = normalizeOnListenerParameters(event, options)\n const data = generateWorkerPayload(event.id, { ...defineOutboundEventa(event.type), ...event, body })\n if (transfer != null) {\n messagePort.postMessage(data, transfer as unknown as Transferable[])\n return\n }\n\n messagePort.postMessage(data)\n })\n\n messagePort.on('message', (message) => {\n try {\n const { type, payload } = parseWorkerPayload<Eventa<any>>(message)\n if (!isWorkerEventa(payload)) {\n ctx.emit(defineInboundEventa(type), payload.body, { raw: { message } })\n }\n else {\n ctx.emit(defineInboundEventa(type), { message: payload.body }, { raw: { message } })\n }\n }\n catch (error) {\n console.error('Failed to parse Node worker message:', error)\n ctx.emit(workerErrorEvent, { error }, { raw: { message } })\n }\n })\n\n messagePort.on('error', (error) => {\n ctx.emit(workerErrorEvent, { error }, { raw: { error } })\n })\n\n messagePort.on('messageerror', (error) => {\n ctx.emit(workerErrorEvent, { error }, { raw: { messageError: error } })\n })\n\n return {\n context: ctx,\n }\n}\n"],"mappings":";;;;;AAaA,SAAgB,cAAc,SAE3B;CACD,MAAM,cAAc,SAAS,eAAe;AAC5C,KAAI,CAAC,YACH,OAAM,IAAI,MAAM,mEAAmE;CAGrF,MAAM,MAAMA,iBAAmB;AAQ/B,mCAAkC,KAAK,iBAAiB;AAExD,KAAI,GAAG,IACL,SAAS,MAA8B,EAAE,mBAAA,cAAmD,CAAC,EAAE,eAAe,EAC9G,QAAQ,IAAI,CACb,GAAG,OAAO,YAAY;EACrB,MAAM,EAAE,MAAM,aAAa,8BAA8B,OAAO,QAAQ;EACxE,MAAM,OAAO,sBAAsB,MAAM,IAAI;GAAE,GAAG,qBAAqB,MAAM,KAAK;GAAE,GAAG;GAAO;GAAM,CAAC;AACrG,MAAI,YAAY,MAAM;AACpB,eAAY,YAAY,MAAM,SAAsC;AACpE;;AAGF,cAAY,YAAY,KAAK;GAC7B;AAEF,aAAY,GAAG,YAAY,YAAY;AACrC,MAAI;GACF,MAAM,EAAE,MAAM,YAAY,mBAAgC,QAAQ;AAClE,OAAI,CAAC,eAAe,QAAQ,CAC1B,KAAI,KAAK,oBAAoB,KAAK,EAAE,QAAQ,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;OAGvE,KAAI,KAAK,oBAAoB,KAAK,EAAE,EAAE,SAAS,QAAQ,MAAM,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;WAGjF,OAAO;AACZ,WAAQ,MAAM,wCAAwC,MAAM;AAC5D,OAAI,KAAK,kBAAkB,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;;GAE7D;AAEF,aAAY,GAAG,UAAU,UAAU;AACjC,MAAI,KAAK,kBAAkB,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;GACzD;AAEF,aAAY,GAAG,iBAAiB,UAAU;AACxC,MAAI,KAAK,kBAAkB,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,cAAc,OAAO,EAAE,CAAC;GACvE;AAEF,QAAO,EACL,SAAS,KACV"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { n as EventTag, o as EventaMatchExpression, r as Eventa } from "./eventa-
|
|
1
|
+
import { n as EventTag, o as EventaMatchExpression, r as Eventa } from "./eventa-DSnoBa1O.mjs";
|
|
2
2
|
|
|
3
3
|
//#region src/context-hooks.d.ts
|
|
4
4
|
interface EventaAdapterProps<EmitOptions = any> {
|
|
@@ -41,4 +41,4 @@ interface EventContext<Extensions = undefined, EmitOptions = undefined> {
|
|
|
41
41
|
type EventContextEmitFn = EventContext['emit'];
|
|
42
42
|
//#endregion
|
|
43
43
|
export { EventContextEmitFn as n, createContext as r, EventContext as t };
|
|
44
|
-
//# sourceMappingURL=context-
|
|
44
|
+
//# sourceMappingURL=context-BsqFeoer.d.mts.map
|
|
@@ -1,37 +1,36 @@
|
|
|
1
1
|
import isGlobMatch from "picomatch";
|
|
2
2
|
import { customAlphabet } from "nanoid/non-secure";
|
|
3
|
-
|
|
4
3
|
//#region src/eventa.ts
|
|
5
4
|
function nanoid() {
|
|
6
5
|
return customAlphabet("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz", 16)();
|
|
7
6
|
}
|
|
8
|
-
let EventaType = /* @__PURE__ */ function(EventaType
|
|
9
|
-
EventaType
|
|
10
|
-
EventaType
|
|
11
|
-
return EventaType
|
|
7
|
+
let EventaType = /* @__PURE__ */ function(EventaType) {
|
|
8
|
+
EventaType["Event"] = "event";
|
|
9
|
+
EventaType["MatchExpression"] = "matchExpression";
|
|
10
|
+
return EventaType;
|
|
12
11
|
}({});
|
|
13
|
-
let EventaFlowDirection = /* @__PURE__ */ function(EventaFlowDirection
|
|
14
|
-
EventaFlowDirection
|
|
15
|
-
EventaFlowDirection
|
|
16
|
-
return EventaFlowDirection
|
|
12
|
+
let EventaFlowDirection = /* @__PURE__ */ function(EventaFlowDirection) {
|
|
13
|
+
EventaFlowDirection["Inbound"] = "inbound";
|
|
14
|
+
EventaFlowDirection["Outbound"] = "outbound";
|
|
15
|
+
return EventaFlowDirection;
|
|
17
16
|
}({});
|
|
18
17
|
function defineInboundEventa(id) {
|
|
19
18
|
return {
|
|
20
19
|
...defineEventa(id),
|
|
21
|
-
_flowDirection:
|
|
20
|
+
_flowDirection: "inbound"
|
|
22
21
|
};
|
|
23
22
|
}
|
|
24
23
|
function defineOutboundEventa(id) {
|
|
25
24
|
return {
|
|
26
25
|
...defineEventa(id),
|
|
27
|
-
_flowDirection:
|
|
26
|
+
_flowDirection: "outbound"
|
|
28
27
|
};
|
|
29
28
|
}
|
|
30
29
|
function defineEventa(id, options) {
|
|
31
30
|
if (!id) id = nanoid();
|
|
32
31
|
const eventaObj = {
|
|
33
32
|
id: options?.inheritFrom?.id || id,
|
|
34
|
-
type: options?.inheritFrom?.type ||
|
|
33
|
+
type: options?.inheritFrom?.type || "event"
|
|
35
34
|
};
|
|
36
35
|
const metadata = options?.inheritFrom?.metadata || options?.metadata;
|
|
37
36
|
if (metadata) eventaObj.metadata = metadata;
|
|
@@ -42,7 +41,7 @@ function defineEventa(id, options) {
|
|
|
42
41
|
function and(...matchExpression) {
|
|
43
42
|
return {
|
|
44
43
|
id: nanoid(),
|
|
45
|
-
type:
|
|
44
|
+
type: "matchExpression",
|
|
46
45
|
matcher: (event) => {
|
|
47
46
|
return matchExpression.every((m) => m.matcher ? m.matcher(event) : false);
|
|
48
47
|
}
|
|
@@ -51,7 +50,7 @@ function and(...matchExpression) {
|
|
|
51
50
|
function or(...matchExpression) {
|
|
52
51
|
return {
|
|
53
52
|
id: nanoid(),
|
|
54
|
-
type:
|
|
53
|
+
type: "matchExpression",
|
|
55
54
|
matcher: (event) => {
|
|
56
55
|
return matchExpression.some((m) => m.matcher ? m.matcher(event) : false);
|
|
57
56
|
}
|
|
@@ -84,11 +83,10 @@ function matchBy(matchExpressionPossibleValues, inverted) {
|
|
|
84
83
|
else if (typeof matchExpressionPossibleValues === "function") matcher = matchExpressionPossibleValues;
|
|
85
84
|
return {
|
|
86
85
|
id,
|
|
87
|
-
type:
|
|
86
|
+
type: "matchExpression",
|
|
88
87
|
matcher
|
|
89
88
|
};
|
|
90
89
|
}
|
|
91
|
-
|
|
92
90
|
//#endregion
|
|
93
91
|
//#region src/context.ts
|
|
94
92
|
function createContext(props = {}) {
|
|
@@ -135,13 +133,13 @@ function createContext(props = {}) {
|
|
|
135
133
|
},
|
|
136
134
|
emit,
|
|
137
135
|
on(eventOrMatchExpression, handler) {
|
|
138
|
-
if (eventOrMatchExpression.type ===
|
|
136
|
+
if (eventOrMatchExpression.type === "event") {
|
|
139
137
|
const event = eventOrMatchExpression;
|
|
140
138
|
if (!listeners.has(event.id)) listeners.set(event.id, /* @__PURE__ */ new Set());
|
|
141
139
|
listeners.get(event.id)?.add(handler);
|
|
142
140
|
return () => listeners.get(event.id)?.delete(handler);
|
|
143
141
|
}
|
|
144
|
-
if (eventOrMatchExpression.type ===
|
|
142
|
+
if (eventOrMatchExpression.type === "matchExpression") {
|
|
145
143
|
const matchExpression = eventOrMatchExpression;
|
|
146
144
|
if (!matchExpressions.has(matchExpression.id)) matchExpressions.set(matchExpression.id, matchExpression);
|
|
147
145
|
if (!matchExpressionListeners.has(matchExpression.id)) matchExpressionListeners.set(matchExpression.id, /* @__PURE__ */ new Set());
|
|
@@ -151,13 +149,13 @@ function createContext(props = {}) {
|
|
|
151
149
|
return () => void 0;
|
|
152
150
|
},
|
|
153
151
|
once(eventOrMatchExpression, handler) {
|
|
154
|
-
if (eventOrMatchExpression.type ===
|
|
152
|
+
if (eventOrMatchExpression.type === "event") {
|
|
155
153
|
const event = eventOrMatchExpression;
|
|
156
154
|
if (!onceListeners.has(event.id)) onceListeners.set(event.id, /* @__PURE__ */ new Set());
|
|
157
155
|
onceListeners.get(event.id)?.add(handler);
|
|
158
156
|
return () => onceListeners.get(event.id)?.delete(handler);
|
|
159
157
|
}
|
|
160
|
-
if (eventOrMatchExpression.type ===
|
|
158
|
+
if (eventOrMatchExpression.type === "matchExpression") {
|
|
161
159
|
const matchExpression = eventOrMatchExpression;
|
|
162
160
|
if (!matchExpressions.has(matchExpression.id)) matchExpressions.set(matchExpression.id, matchExpression);
|
|
163
161
|
if (!matchExpressionListeners.has(matchExpression.id)) matchExpressionListeners.set(matchExpression.id, /* @__PURE__ */ new Set());
|
|
@@ -168,7 +166,7 @@ function createContext(props = {}) {
|
|
|
168
166
|
},
|
|
169
167
|
off(eventOrMatchExpression, handler) {
|
|
170
168
|
switch (eventOrMatchExpression.type) {
|
|
171
|
-
case
|
|
169
|
+
case "event":
|
|
172
170
|
if (handler !== void 0) {
|
|
173
171
|
listeners.get(eventOrMatchExpression.id)?.delete(handler);
|
|
174
172
|
onceListeners.get(eventOrMatchExpression.id)?.delete(handler);
|
|
@@ -177,7 +175,7 @@ function createContext(props = {}) {
|
|
|
177
175
|
listeners.delete(eventOrMatchExpression.id);
|
|
178
176
|
onceListeners.delete(eventOrMatchExpression.id);
|
|
179
177
|
break;
|
|
180
|
-
case
|
|
178
|
+
case "matchExpression":
|
|
181
179
|
if (handler !== void 0) {
|
|
182
180
|
matchExpressionListeners.get(eventOrMatchExpression.id)?.delete(handler);
|
|
183
181
|
matchExpressionOnceListeners.get(eventOrMatchExpression.id)?.delete(handler);
|
|
@@ -190,7 +188,7 @@ function createContext(props = {}) {
|
|
|
190
188
|
}
|
|
191
189
|
};
|
|
192
190
|
}
|
|
193
|
-
|
|
194
191
|
//#endregion
|
|
195
192
|
export { defineEventa as a, matchBy as c, and as i, nanoid as l, EventaFlowDirection as n, defineInboundEventa as o, EventaType as r, defineOutboundEventa as s, createContext as t, or as u };
|
|
196
|
-
|
|
193
|
+
|
|
194
|
+
//# sourceMappingURL=context-Dht_IZMb.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context-Dht_IZMb.mjs","names":[],"sources":["../src/eventa.ts","../src/context.ts"],"sourcesContent":["import isGlobMatch from 'picomatch'\n\nimport { customAlphabet } from 'nanoid/non-secure'\n\nexport function nanoid() {\n return customAlphabet('0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz', 16)()\n}\n\nexport interface InvokeEventConstraint<_Req, _Res> {}\n\nexport type EventTag<Res, Req> = string & InvokeEventConstraint<Req, Res>\n\nexport enum EventaType {\n Event = 'event',\n MatchExpression = 'matchExpression',\n}\n\nexport enum EventaFlowDirection {\n Inbound = 'inbound',\n Outbound = 'outbound',\n}\n\nexport interface DirectionalEventa<P, T = undefined> extends Eventa<P> {\n _flowDirection: EventaFlowDirection | T\n}\n\nexport interface InboundEventa<T> extends DirectionalEventa<T> {\n _flowDirection: EventaFlowDirection.Inbound\n}\n\nexport interface OutboundEventa<T> extends DirectionalEventa<T> {\n _flowDirection: EventaFlowDirection.Outbound\n}\n\nexport function defineInboundEventa<T>(id?: string): InboundEventa<T> {\n return {\n ...defineEventa<T>(id),\n _flowDirection: EventaFlowDirection.Inbound,\n } as InboundEventa<T>\n}\n\nexport function defineOutboundEventa<T>(id?: string): OutboundEventa<T> {\n return {\n ...defineEventa<T>(id),\n _flowDirection: EventaFlowDirection.Outbound,\n } as OutboundEventa<T>\n}\n\n// type ServerInvokeHandlerEvent<Req, Res> = symbol & InvokeEventConstraint<Req, Res>\n// type ClientInvoke<Req> = symbol & InvokeEventConstraint<Req, null>\n\nexport interface EventaLike<_P = undefined, T extends EventaType = EventaType> {\n id: string\n type?: T\n}\n\nexport interface Eventa<P = unknown, M = unknown, IM = unknown> extends EventaLike<P, EventaType.Event> {\n body?: P\n /**\n * Optional runtime metadata that can be attached to the eventa.\n *\n * NOTICE: for defineInvoke, and defineInvokeHandler, the metadata will be omitted\n * for smaller chunk size, this means for metadata, the data contains will not be available in the defineInvokeHandler.\n *\n * This can be used for various purposes such as logging, debugging, or providing additional context about the eventa.\n * Allowing the event handler to be able to access this metadata can enable more flexible and powerful event handling logic.\n */\n metadata?: M\n /**\n * Optional runtime metadata that can be attached to the eventa when invoking it.\n *\n * Unlike the `metadata` field, the `invokeMetadata` is specifically designed to be used when invoking the eventa, and it\n * will be available in the defineInvokeHandler.\n *\n * This allows for a clear separation between the metadata that describes the eventa itself and the metadata that is relevant\n * to the invocation of the eventa, providing more flexibility in how metadata is used and accessed within the event\n * handling system.\n */\n invokeMetadata?: IM\n}\n\nexport type InferEventaPayload<E> = E extends Eventa<infer P> ? P : never\n\nexport function defineEventa<P = undefined, M = undefined, IM = undefined>(\n id?: string,\n options?: {\n /**\n * Optionally inherit many properties from another parent eventa.\n */\n inheritFrom?: Eventa<P, M, IM>\n /**\n * Optional runtime metadata that can be attached to the eventa.\n *\n * NOTICE: for defineInvoke, and defineInvokeHandler, the metadata will be omitted\n * for smaller chunk size, this means for metadata, the data contains will not be available in the defineInvokeHandler.\n *\n * This can be used for various purposes such as logging, debugging, or providing additional context about the eventa.\n * Allowing the event handler to be able to access this metadata can enable more flexible and powerful event handling logic.\n */\n metadata?: M\n /**\n * Optional runtime metadata that can be attached to the eventa when invoking it.\n *\n * Unlike the `metadata` field, the `invokeMetadata` is specifically designed to be used when invoking the eventa, and it\n * will be available in the defineInvokeHandler.\n *\n * This allows for a clear separation between the metadata that describes the eventa itself and the metadata that is relevant\n * to the invocation of the eventa, providing more flexibility in how metadata is used and accessed within the event\n * handling system.\n */\n invokeMetadata?: IM\n },\n): Eventa<P, M, IM> {\n if (!id) {\n id = nanoid()\n }\n\n const eventaObj: Eventa<P, M, IM> = {\n id: options?.inheritFrom?.id || id,\n type: options?.inheritFrom?.type || EventaType.Event,\n }\n\n const metadata = options?.inheritFrom?.metadata || options?.metadata\n if (metadata) {\n eventaObj.metadata = metadata\n }\n\n const invokeMetadata = options?.inheritFrom?.invokeMetadata || options?.invokeMetadata\n if (invokeMetadata) {\n eventaObj.invokeMetadata = invokeMetadata\n }\n\n return eventaObj as Eventa<P, M, IM>\n}\n\nexport interface EventaMatchExpression<P = undefined> extends EventaLike<P, EventaType.MatchExpression> {\n matcher?: (event: Eventa<P>) => boolean | Promise<boolean>\n}\n\nexport function and<P>(...matchExpression: Array<EventaMatchExpression<P>>): EventaMatchExpression<P> {\n return {\n id: nanoid(),\n type: EventaType.MatchExpression,\n matcher: (event: Eventa<P>) => {\n return matchExpression.every(m => m.matcher ? m.matcher(event) : false)\n },\n }\n}\n\nexport function or<P>(...matchExpression: Array<EventaMatchExpression<P>>): EventaMatchExpression<P> {\n return {\n id: nanoid(),\n type: EventaType.MatchExpression,\n matcher: (event: Eventa<P>) => {\n return matchExpression.some(m => m.matcher ? m.matcher(event) : false)\n },\n }\n}\n\n/**\n * Match by is powerful utility function that allows you to create a match expression based on various criteria\n * when working with eventa (event system).\n *\n * Semantics like glob matching, RegExp, or even custom matcher function can be used to create complex match\n * expressions that can be used to filter and handle events in a flexible way.\n */\nexport function matchBy<P = undefined>(glob: string, inverted?: boolean): EventaMatchExpression<P>\nexport function matchBy<P = undefined>(options: { ids: string[] }, inverted?: boolean): EventaMatchExpression<P>\nexport function matchBy<P = undefined>(options: { eventa: Eventa<P>[] }, inverted?: boolean): EventaMatchExpression<P>\nexport function matchBy<P = undefined>(options: { types: EventaType[] }, inverted?: boolean): EventaMatchExpression<P>\nexport function matchBy<P = undefined>(regExp: RegExp, inverted?: boolean): EventaMatchExpression<P>\nexport function matchBy<P = undefined, E extends Eventa<P> = Eventa<P>>(matcher: (event: E) => boolean | Promise<boolean>): EventaMatchExpression<P>\nexport function matchBy<P = undefined, E extends Eventa<P> = Eventa<P>>(\n matchExpressionPossibleValues:\n | string\n | Eventa<any>\n | { ids: string[] }\n | { eventa: Eventa<P>[] }\n | { types: EventaType[] }\n | RegExp\n | ((event: E) => boolean | Promise<boolean>),\n inverted?: boolean,\n): EventaMatchExpression<P> {\n const id = nanoid()\n\n let matcher: (event: E) => boolean | Promise<boolean> = () => false\n if (typeof matchExpressionPossibleValues === 'string') {\n matcher = (eventa) => {\n return isGlobMatch(matchExpressionPossibleValues)(eventa.id)\n }\n }\n else if (typeof matchExpressionPossibleValues === 'object') {\n if ('ids' in matchExpressionPossibleValues) {\n matcher = (event: Eventa<P>) => {\n if (inverted) {\n return !matchExpressionPossibleValues.ids.includes(event.id)\n }\n\n return matchExpressionPossibleValues.ids.includes(event.id)\n }\n }\n else if ('eventa' in matchExpressionPossibleValues) {\n matcher = (event: Eventa<P>) => {\n if (inverted) {\n return !matchExpressionPossibleValues.eventa.some(e => e.id === event.id)\n }\n\n return matchExpressionPossibleValues.eventa.some(e => e.id === event.id)\n }\n }\n else if ('types' in matchExpressionPossibleValues) {\n matcher = (event: Eventa<P>) => {\n if (typeof event.type === 'undefined') {\n return false\n }\n if (inverted) {\n return !matchExpressionPossibleValues.types.includes(event.type)\n }\n\n return matchExpressionPossibleValues.types.includes(event.type)\n }\n }\n }\n else if (matchExpressionPossibleValues instanceof RegExp) {\n matcher = (event: Eventa<P>) => {\n if (inverted) {\n return !matchExpressionPossibleValues.test(event.id)\n }\n\n return matchExpressionPossibleValues.test(event.id)\n }\n }\n else if (typeof matchExpressionPossibleValues === 'function') {\n matcher = matchExpressionPossibleValues\n }\n\n return {\n id,\n type: EventaType.MatchExpression,\n matcher,\n } satisfies EventaMatchExpression<P>\n}\n","import type { EventaAdapter } from './context-hooks'\nimport type { Eventa, EventaMatchExpression, EventTag } from './eventa'\n\nimport { EventaType } from './eventa'\n\ninterface CreateContextProps<EmitOptions = any> {\n adapter?: EventaAdapter<EmitOptions>\n}\n\nexport function createContext<Extensions = any, Options = { raw?: any }>(props: CreateContextProps<Options> = {}): EventContext<Extensions, Options> {\n const listeners = new Map<EventTag<any, any>, Set<(params: any, options?: Options) => any>>()\n const onceListeners = new Map<EventTag<any, any>, Set<(params: any, options?: Options) => any>>()\n\n const matchExpressions = new Map<string, EventaMatchExpression<any>>()\n const matchExpressionListeners = new Map<string, Set<(params: any, options?: Options) => any>>()\n const matchExpressionOnceListeners = new Map<string, Set<(params: any, options?: Options) => any>>()\n\n const hooks = props.adapter?.(emit).hooks\n\n function emit<P>(event: Eventa<P>, payload: P, options?: Options) {\n const emittingPayload = { ...event, body: payload }\n\n for (const listener of listeners.get(event.id) || []) {\n listener(emittingPayload, options)\n hooks?.onReceived?.(event.id, emittingPayload)\n }\n\n for (const onceListener of onceListeners.get(event.id) || []) {\n onceListener(emittingPayload, options)\n hooks?.onReceived?.(event.id, emittingPayload)\n onceListeners.get(event.id)?.delete(onceListener)\n }\n\n for (const matchExpression of matchExpressions.values()) {\n if (matchExpression.matcher) {\n const match = matchExpression.matcher(emittingPayload)\n if (!match) {\n continue\n }\n\n for (const listener of matchExpressionListeners.get(matchExpression.id) || []) {\n listener(emittingPayload, options)\n hooks?.onReceived?.(matchExpression.id, emittingPayload)\n }\n for (const onceListener of matchExpressionOnceListeners.get(matchExpression.id) || []) {\n onceListener(emittingPayload, options)\n hooks?.onReceived?.(matchExpression.id, emittingPayload)\n matchExpressionOnceListeners.get(matchExpression.id)?.delete(onceListener)\n }\n }\n }\n\n hooks?.onSent(event.id, emittingPayload, options)\n }\n\n return {\n get listeners() {\n return listeners\n },\n\n get onceListeners() {\n return onceListeners\n },\n\n emit,\n\n on<P>(eventOrMatchExpression: Eventa<P> | EventaMatchExpression<P>, handler: (payload: Eventa<P>, options?: Options) => void): () => void {\n if (eventOrMatchExpression.type === EventaType.Event) {\n const event = eventOrMatchExpression as Eventa<P>\n if (!listeners.has(event.id)) {\n listeners.set(event.id, new Set())\n }\n\n listeners.get(event.id)?.add(handler)\n\n return () => listeners.get(event.id)?.delete(handler)\n }\n\n if (eventOrMatchExpression.type === EventaType.MatchExpression) {\n const matchExpression = eventOrMatchExpression as EventaMatchExpression<P>\n if (!matchExpressions.has(matchExpression.id)) {\n matchExpressions.set(matchExpression.id, matchExpression as EventaMatchExpression<P>)\n }\n if (!matchExpressionListeners.has(matchExpression.id)) {\n matchExpressionListeners.set(matchExpression.id, new Set())\n }\n\n matchExpressionListeners.get(matchExpression.id)?.add(handler)\n\n return () => matchExpressionListeners.get(matchExpression.id)?.delete(handler)\n }\n\n return () => void 0\n },\n\n once<P>(eventOrMatchExpression: Eventa<P> | EventaMatchExpression<P>, handler: (payload: Eventa<P>, options?: Options) => void): () => void {\n if (eventOrMatchExpression.type === EventaType.Event) {\n const event = eventOrMatchExpression as Eventa<P>\n if (!onceListeners.has(event.id)) {\n onceListeners.set(event.id, new Set())\n }\n\n onceListeners.get(event.id)?.add(handler)\n\n return () => onceListeners.get(event.id)?.delete(handler)\n }\n\n if (eventOrMatchExpression.type === EventaType.MatchExpression) {\n const matchExpression = eventOrMatchExpression as EventaMatchExpression<P>\n if (!matchExpressions.has(matchExpression.id)) {\n matchExpressions.set(matchExpression.id, matchExpression as EventaMatchExpression<P>)\n }\n if (!matchExpressionListeners.has(matchExpression.id)) {\n matchExpressionListeners.set(matchExpression.id, new Set())\n }\n\n matchExpressionOnceListeners.get(matchExpression.id)?.add(handler)\n\n return () => matchExpressionOnceListeners.get(matchExpression.id)?.delete(handler)\n }\n\n return () => void 0\n },\n\n off<P>(eventOrMatchExpression: Eventa<P> | EventaMatchExpression<P>, handler?: (payload: Eventa<P>, options?: Options) => void) {\n switch (eventOrMatchExpression.type) {\n case EventaType.Event:\n if (handler !== undefined) {\n listeners.get(eventOrMatchExpression.id)?.delete(handler)\n onceListeners.get(eventOrMatchExpression.id)?.delete(handler)\n break\n }\n\n listeners.delete(eventOrMatchExpression.id)\n onceListeners.delete(eventOrMatchExpression.id)\n break\n case EventaType.MatchExpression:\n if (handler !== undefined) {\n matchExpressionListeners.get(eventOrMatchExpression.id)?.delete(handler)\n matchExpressionOnceListeners.get(eventOrMatchExpression.id)?.delete(handler)\n break\n }\n\n matchExpressionListeners.delete(eventOrMatchExpression.id)\n matchExpressionOnceListeners.delete(eventOrMatchExpression.id)\n break\n }\n },\n }\n}\n\nexport interface EventContext<Extensions = undefined, EmitOptions = undefined> {\n listeners: Map<EventTag<any, any>, Set<(params: any) => any>>\n onceListeners: Map<EventTag<any, any>, Set<(params: any) => any>>\n\n emit: <P>(event: Eventa<P>, payload: P, options?: EmitOptions) => void\n on: <P>(eventOrMatchExpression: Eventa<P> | EventaMatchExpression<P>, handler: (payload: Eventa<P>, options?: EmitOptions) => void) => () => void\n once: <P>(eventOrMatchExpression: Eventa<P> | EventaMatchExpression<P>, handler: (payload: Eventa<P>, options?: EmitOptions) => void) => () => void\n off: <P>(eventOrMatchExpression: Eventa<P> | EventaMatchExpression<P>, handler?: (payload: Eventa<P>, options?: EmitOptions) => void) => void\n\n /**\n * Extensions (adapter-specific).\n *\n * Known usage: webworkers/worker-threads populate internal invoke config via\n * `extensions.__internal.invoke` to abort pending invokes on fatal errors.\n */\n extensions?: Extensions\n}\n\nexport type EventContextEmitFn = EventContext['emit']\n"],"mappings":"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"}
|
|
@@ -4,11 +4,11 @@ interface InvokeEventConstraint<_Req, _Res> {}
|
|
|
4
4
|
type EventTag<Res, Req> = string & InvokeEventConstraint<Req, Res>;
|
|
5
5
|
declare enum EventaType {
|
|
6
6
|
Event = "event",
|
|
7
|
-
MatchExpression = "matchExpression"
|
|
7
|
+
MatchExpression = "matchExpression"
|
|
8
8
|
}
|
|
9
9
|
declare enum EventaFlowDirection {
|
|
10
10
|
Inbound = "inbound",
|
|
11
|
-
Outbound = "outbound"
|
|
11
|
+
Outbound = "outbound"
|
|
12
12
|
}
|
|
13
13
|
interface DirectionalEventa<P, T = undefined> extends Eventa<P> {
|
|
14
14
|
_flowDirection: EventaFlowDirection | T;
|
|
@@ -103,4 +103,4 @@ declare function matchBy<P = undefined>(regExp: RegExp, inverted?: boolean): Eve
|
|
|
103
103
|
declare function matchBy<P = undefined, E extends Eventa<P> = Eventa<P>>(matcher: (event: E) => boolean | Promise<boolean>): EventaMatchExpression<P>;
|
|
104
104
|
//#endregion
|
|
105
105
|
export { nanoid as _, EventaLike as a, InboundEventa as c, OutboundEventa as d, and as f, matchBy as g, defineOutboundEventa as h, EventaFlowDirection as i, InferEventaPayload as l, defineInboundEventa as m, EventTag as n, EventaMatchExpression as o, defineEventa as p, Eventa as r, EventaType as s, DirectionalEventa as t, InvokeEventConstraint as u, or as v };
|
|
106
|
-
//# sourceMappingURL=eventa-
|
|
106
|
+
//# sourceMappingURL=eventa-DSnoBa1O.d.mts.map
|