@moeru/eventa 0.3.0
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/LICENSE +21 -0
- package/README.md +286 -0
- package/dist/adapters/electron/main.d.mts +26 -0
- package/dist/adapters/electron/main.mjs +67 -0
- package/dist/adapters/electron/main.mjs.map +1 -0
- package/dist/adapters/electron/renderer.d.mts +24 -0
- package/dist/adapters/electron/renderer.mjs +53 -0
- package/dist/adapters/electron/renderer.mjs.map +1 -0
- package/dist/adapters/event-emitter/index.d.mts +35 -0
- package/dist/adapters/event-emitter/index.mjs +62 -0
- package/dist/adapters/event-emitter/index.mjs.map +1 -0
- package/dist/adapters/event-target/index.d.mts +35 -0
- package/dist/adapters/event-target/index.mjs +67 -0
- package/dist/adapters/event-target/index.mjs.map +1 -0
- package/dist/adapters/websocket/h3/index.d.mts +57 -0
- package/dist/adapters/websocket/h3/index.mjs +100 -0
- package/dist/adapters/websocket/h3/index.mjs.map +1 -0
- package/dist/adapters/websocket/index.d.mts +12 -0
- package/dist/adapters/websocket/index.mjs +1 -0
- package/dist/adapters/websocket/native/index.d.mts +26 -0
- package/dist/adapters/websocket/native/index.mjs +40 -0
- package/dist/adapters/websocket/native/index.mjs.map +1 -0
- package/dist/adapters/webworkers/index.d.mts +63 -0
- package/dist/adapters/webworkers/index.mjs +42 -0
- package/dist/adapters/webworkers/index.mjs.map +1 -0
- package/dist/adapters/webworkers/worker/index.d.mts +24 -0
- package/dist/adapters/webworkers/worker/index.mjs +40 -0
- package/dist/adapters/webworkers/worker/index.mjs.map +1 -0
- package/dist/context-C35Qku9U.mjs +191 -0
- package/dist/context-C35Qku9U.mjs.map +1 -0
- package/dist/context-C_-MRU46.d.mts +41 -0
- package/dist/eventa-B2HPBK4S.d.mts +51 -0
- package/dist/index-BgaYNgPh.d.mts +24 -0
- package/dist/index.d.mts +5 -0
- package/dist/index.mjs +4 -0
- package/dist/internal-DjiAQtsa.mjs +18 -0
- package/dist/internal-DjiAQtsa.mjs.map +1 -0
- package/dist/invoke-LTUFMmHi.d.mts +137 -0
- package/dist/shared-Da41l-vp.mjs +21 -0
- package/dist/shared-Da41l-vp.mjs.map +1 -0
- package/dist/shared-DbO1rU2W.mjs +71 -0
- package/dist/shared-DbO1rU2W.mjs.map +1 -0
- package/dist/shared-DllZ3RPS.d.mts +18 -0
- package/dist/src-Bb-vxm5k.mjs +289 -0
- package/dist/src-Bb-vxm5k.mjs.map +1 -0
- package/package.json +121 -0
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { EventaFlowDirection, EventaType, and, createContext as createContext$1, defineEventa, defineInboundEventa, defineOutboundEventa, matchBy, nanoid } from "../../context-C35Qku9U.mjs";
|
|
2
|
+
import "../../src-Bb-vxm5k.mjs";
|
|
3
|
+
|
|
4
|
+
//#region src/adapters/event-target/internal.ts
|
|
5
|
+
function generateCustomEventDetail(type, payload) {
|
|
6
|
+
return {
|
|
7
|
+
id: nanoid(),
|
|
8
|
+
type,
|
|
9
|
+
payload
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
function parseCustomEventDetail(data) {
|
|
13
|
+
return data;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
//#endregion
|
|
17
|
+
//#region src/adapters/event-target/shared.ts
|
|
18
|
+
const workerErrorEvent = { ...defineEventa() };
|
|
19
|
+
|
|
20
|
+
//#endregion
|
|
21
|
+
//#region src/adapters/event-target/index.ts
|
|
22
|
+
function withRemoval(eventTarget, type, listener) {
|
|
23
|
+
eventTarget.addEventListener(type, listener);
|
|
24
|
+
return { remove: () => {
|
|
25
|
+
eventTarget.removeEventListener(type, listener);
|
|
26
|
+
} };
|
|
27
|
+
}
|
|
28
|
+
function createContext(eventTarget, options) {
|
|
29
|
+
const ctx = createContext$1();
|
|
30
|
+
const { messageEventName = "message", errorEventName = "error", extraListeners = {} } = options || {};
|
|
31
|
+
const cleanupRemoval = [];
|
|
32
|
+
ctx.on(and(matchBy((e) => e._flowDirection === EventaFlowDirection.Outbound || !e._flowDirection), matchBy("*")), (event) => {
|
|
33
|
+
const detail = generateCustomEventDetail(event.id, {
|
|
34
|
+
...defineOutboundEventa(event.type),
|
|
35
|
+
...event
|
|
36
|
+
});
|
|
37
|
+
const customEvent = new CustomEvent(messageEventName || EventaType.Event, {
|
|
38
|
+
detail,
|
|
39
|
+
bubbles: true,
|
|
40
|
+
cancelable: true
|
|
41
|
+
});
|
|
42
|
+
eventTarget.dispatchEvent(customEvent);
|
|
43
|
+
});
|
|
44
|
+
if (messageEventName) cleanupRemoval.push(withRemoval(eventTarget, messageEventName, (event) => {
|
|
45
|
+
try {
|
|
46
|
+
const { type, payload } = parseCustomEventDetail(event.detail);
|
|
47
|
+
ctx.emit(defineInboundEventa(type), payload.body, { raw: { event } });
|
|
48
|
+
} catch (error) {
|
|
49
|
+
console.error("Failed to parse WebSocket message:", error);
|
|
50
|
+
ctx.emit(workerErrorEvent, { error }, { raw: { event } });
|
|
51
|
+
}
|
|
52
|
+
}));
|
|
53
|
+
if (errorEventName) cleanupRemoval.push(withRemoval(eventTarget, errorEventName, (error) => {
|
|
54
|
+
ctx.emit(workerErrorEvent, { error }, { raw: { event: error } });
|
|
55
|
+
}));
|
|
56
|
+
for (const [eventName, listener] of Object.entries(extraListeners)) cleanupRemoval.push(withRemoval(eventTarget, eventName, listener));
|
|
57
|
+
return {
|
|
58
|
+
context: ctx,
|
|
59
|
+
dispose: () => {
|
|
60
|
+
cleanupRemoval.forEach((removal) => removal.remove());
|
|
61
|
+
}
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
//#endregion
|
|
66
|
+
export { createContext };
|
|
67
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.mjs","names":["createBaseContext","cleanupRemoval: Array<{ remove: () => void }>"],"sources":["../../../src/adapters/event-target/internal.ts","../../../src/adapters/event-target/shared.ts","../../../src/adapters/event-target/index.ts"],"sourcesContent":["import type { EventTag } from '../..'\nimport type { CustomEventDetail as CustomEventDetailDetail } from './shared'\n\nimport { nanoid } from '../..'\n\nexport function generateCustomEventDetail<T>(type: EventTag<any, any>, payload: T): CustomEventDetailDetail<T> {\n return {\n id: nanoid(),\n type,\n payload,\n }\n}\n\nexport function parseCustomEventDetail<T>(data: unknown): CustomEventDetailDetail<T> {\n return data as CustomEventDetailDetail<T>\n}\n","import type { EventTag } from '../../eventa'\n\nimport { defineEventa } from '../../eventa'\n\nexport interface CustomEventDetail<T> {\n id: string\n type: EventTag<any, any>\n payload: T\n}\n\nexport const workerErrorEvent = { ...defineEventa<{ error: unknown }>() }\n","import type { EventContext } from '../../context'\nimport type { DirectionalEventa, Eventa } from '../../eventa'\n\nimport { createContext as createBaseContext } from '../../context'\nimport { and, defineInboundEventa, defineOutboundEventa, EventaFlowDirection, EventaType, matchBy } from '../../eventa'\nimport { generateCustomEventDetail, parseCustomEventDetail } from './internal'\nimport { workerErrorEvent } from './shared'\n\nfunction withRemoval(eventTarget: EventTarget, type: string, listener: EventListenerOrEventListenerObject | null) {\n eventTarget.addEventListener(type, listener)\n\n return {\n remove: () => {\n eventTarget.removeEventListener(type, listener)\n },\n }\n}\n\nexport function createContext(eventTarget: EventTarget, options?: {\n messageEventName?: string | false\n errorEventName?: string | false\n extraListeners?: Record<string, (event: Event) => void | Promise<void>>\n}) {\n const ctx = createBaseContext() as EventContext<any, { raw: { event: CustomEvent | Event | unknown } }>\n\n const {\n messageEventName = 'message',\n errorEventName = 'error',\n extraListeners = {},\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 detail = generateCustomEventDetail(event.id, { ...defineOutboundEventa(event.type), ...event })\n\n const customEvent = new CustomEvent(messageEventName || EventaType.Event, {\n detail,\n bubbles: true,\n cancelable: true,\n })\n\n eventTarget.dispatchEvent(customEvent)\n })\n\n if (messageEventName) {\n cleanupRemoval.push(withRemoval(eventTarget, messageEventName, (event) => {\n try {\n const { type, payload } = parseCustomEventDetail<Eventa<any>>((event as CustomEvent).detail)\n ctx.emit(defineInboundEventa(type), payload.body, { raw: { event } })\n }\n catch (error) {\n console.error('Failed to parse WebSocket message:', error)\n ctx.emit(workerErrorEvent, { error }, { raw: { event } })\n }\n }))\n }\n\n if (errorEventName) {\n cleanupRemoval.push(withRemoval(eventTarget, errorEventName, (error) => {\n ctx.emit(workerErrorEvent, { error }, { raw: { event: error } })\n }))\n }\n\n for (const [eventName, listener] of Object.entries(extraListeners)) {\n cleanupRemoval.push(withRemoval(eventTarget, eventName, listener))\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,0BAA6B,MAA0B,SAAwC;AAC7G,QAAO;EACL,IAAI,QAAQ;EACZ;EACA;EACD;;AAGH,SAAgB,uBAA0B,MAA2C;AACnF,QAAO;;;;;ACJT,MAAa,mBAAmB,EAAE,GAAG,cAAkC,EAAE;;;;ACFzE,SAAS,YAAY,aAA0B,MAAc,UAAqD;AAChH,aAAY,iBAAiB,MAAM,SAAS;AAE5C,QAAO,EACL,cAAc;AACZ,cAAY,oBAAoB,MAAM,SAAS;IAElD;;AAGH,SAAgB,cAAc,aAA0B,SAIrD;CACD,MAAM,MAAMA,iBAAmB;CAE/B,MAAM,EACJ,mBAAmB,WACnB,iBAAiB,SACjB,iBAAiB,EAAE,KACjB,WAAW,EAAE;CAEjB,MAAMC,iBAAgD,EAAE;AAExD,KAAI,GAAG,IACL,SAAS,MAA8B,EAAE,mBAAmB,oBAAoB,YAAY,CAAC,EAAE,eAAe,EAC9G,QAAQ,IAAI,CACb,GAAG,UAAU;EACZ,MAAM,SAAS,0BAA0B,MAAM,IAAI;GAAE,GAAG,qBAAqB,MAAM,KAAK;GAAE,GAAG;GAAO,CAAC;EAErG,MAAM,cAAc,IAAI,YAAY,oBAAoB,WAAW,OAAO;GACxE;GACA,SAAS;GACT,YAAY;GACb,CAAC;AAEF,cAAY,cAAc,YAAY;GACtC;AAEF,KAAI,iBACF,gBAAe,KAAK,YAAY,aAAa,mBAAmB,UAAU;AACxE,MAAI;GACF,MAAM,EAAE,MAAM,YAAY,uBAAqC,MAAsB,OAAO;AAC5F,OAAI,KAAK,oBAAoB,KAAK,EAAE,QAAQ,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;WAEhE,OAAO;AACZ,WAAQ,MAAM,sCAAsC,MAAM;AAC1D,OAAI,KAAK,kBAAkB,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;;GAE3D,CAAC;AAGL,KAAI,eACF,gBAAe,KAAK,YAAY,aAAa,iBAAiB,UAAU;AACtE,MAAI,KAAK,kBAAkB,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,OAAO,OAAO,EAAE,CAAC;GAChE,CAAC;AAGL,MAAK,MAAM,CAAC,WAAW,aAAa,OAAO,QAAQ,eAAe,CAChE,gBAAe,KAAK,YAAY,aAAa,WAAW,SAAS,CAAC;AAGpE,QAAO;EACL,SAAS;EACT,eAAe;AACb,kBAAe,SAAQ,YAAW,QAAQ,QAAQ,CAAC;;EAEtD"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { Eventa } from "../../../eventa-B2HPBK4S.mjs";
|
|
2
|
+
import { EventContext } from "../../../context-C_-MRU46.mjs";
|
|
3
|
+
import { Hooks, Message, Peer, WSError } from "crossws";
|
|
4
|
+
|
|
5
|
+
//#region src/adapters/websocket/h3/global.d.ts
|
|
6
|
+
declare const wsConnectedEvent: Eventa<{
|
|
7
|
+
id: string;
|
|
8
|
+
}>;
|
|
9
|
+
declare const wsDisconnectedEvent: Eventa<{
|
|
10
|
+
id: string;
|
|
11
|
+
}>;
|
|
12
|
+
declare const wsErrorEvent: Eventa<{
|
|
13
|
+
error: unknown;
|
|
14
|
+
}>;
|
|
15
|
+
declare function createGlobalContext(): {
|
|
16
|
+
websocketHandlers: Omit<Hooks, 'upgrade'>;
|
|
17
|
+
context: EventContext<any, {
|
|
18
|
+
raw: {
|
|
19
|
+
error?: WSError;
|
|
20
|
+
message?: Message;
|
|
21
|
+
};
|
|
22
|
+
}>;
|
|
23
|
+
};
|
|
24
|
+
//#endregion
|
|
25
|
+
//#region src/adapters/websocket/h3/peer.d.ts
|
|
26
|
+
declare const wsConnectedEvent$1: Eventa<{
|
|
27
|
+
id: string;
|
|
28
|
+
}>;
|
|
29
|
+
declare const wsDisconnectedEvent$1: Eventa<{
|
|
30
|
+
id: string;
|
|
31
|
+
}>;
|
|
32
|
+
declare const wsErrorEvent$1: Eventa<{
|
|
33
|
+
error: unknown;
|
|
34
|
+
}>;
|
|
35
|
+
declare function createPeerContext(peer: Peer): {
|
|
36
|
+
hooks: Pick<Hooks, 'message'>;
|
|
37
|
+
context: EventContext<any, {
|
|
38
|
+
raw: {
|
|
39
|
+
message: Message;
|
|
40
|
+
};
|
|
41
|
+
}>;
|
|
42
|
+
};
|
|
43
|
+
interface PeerContext {
|
|
44
|
+
peer: Peer;
|
|
45
|
+
context: EventContext<any, {
|
|
46
|
+
raw: {
|
|
47
|
+
message: Message;
|
|
48
|
+
};
|
|
49
|
+
}>;
|
|
50
|
+
}
|
|
51
|
+
declare function createPeerHooks(): {
|
|
52
|
+
hooks: Partial<Hooks>;
|
|
53
|
+
untilLeastOneConnected: Promise<PeerContext>;
|
|
54
|
+
};
|
|
55
|
+
//#endregion
|
|
56
|
+
export { type PeerContext, createGlobalContext, createPeerContext, createPeerHooks, wsErrorEvent as global, wsConnectedEvent as globalWsConnectedEvent, wsDisconnectedEvent as globalWsDisconnectedEvent, wsConnectedEvent$1 as peerWsConnectedEvent, wsDisconnectedEvent$1 as peerWsDisconnectedEvent, wsErrorEvent$1 as peerWsErrorEvent };
|
|
57
|
+
//# sourceMappingURL=index.d.mts.map
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import { EventaFlowDirection, and, createContext, defineEventa, defineInboundEventa, defineOutboundEventa, matchBy } from "../../../context-C35Qku9U.mjs";
|
|
2
|
+
import { generateWebsocketPayload, parseWebsocketPayload } from "../../../internal-DjiAQtsa.mjs";
|
|
3
|
+
|
|
4
|
+
//#region src/adapters/websocket/h3/global.ts
|
|
5
|
+
const wsConnectedEvent = defineEventa("eventa:adapters:websocket-global:connected");
|
|
6
|
+
const wsDisconnectedEvent = defineEventa("eventa:adapters:websocket-global:disconnected");
|
|
7
|
+
const wsErrorEvent = defineEventa("eventa:adapters:websocket-global:error");
|
|
8
|
+
function createGlobalContext() {
|
|
9
|
+
const ctx = createContext();
|
|
10
|
+
const peers = /* @__PURE__ */ new Set();
|
|
11
|
+
ctx.on(and(matchBy((e) => e._flowDirection === EventaFlowDirection.Outbound || !e._flowDirection), matchBy("*")), (event) => {
|
|
12
|
+
const data = JSON.stringify(generateWebsocketPayload(event.id, {
|
|
13
|
+
...defineOutboundEventa(event.type),
|
|
14
|
+
...event
|
|
15
|
+
}));
|
|
16
|
+
for (const peer of peers) peer.send(data);
|
|
17
|
+
});
|
|
18
|
+
return {
|
|
19
|
+
websocketHandlers: {
|
|
20
|
+
open(peer) {
|
|
21
|
+
peers.add(peer);
|
|
22
|
+
ctx.emit(wsConnectedEvent, { id: peer.id }, { raw: {} });
|
|
23
|
+
},
|
|
24
|
+
close(peer) {
|
|
25
|
+
peers.delete(peer);
|
|
26
|
+
ctx.emit(wsDisconnectedEvent, { id: peer.id }, { raw: {} });
|
|
27
|
+
},
|
|
28
|
+
error(_, error) {
|
|
29
|
+
console.error("WebSocket error:", error);
|
|
30
|
+
ctx.emit(wsErrorEvent, { error }, { raw: { error } });
|
|
31
|
+
},
|
|
32
|
+
async message(_, message) {
|
|
33
|
+
try {
|
|
34
|
+
const { type, payload } = parseWebsocketPayload(message.text());
|
|
35
|
+
ctx.emit(defineInboundEventa(type), payload.body, { raw: { message } });
|
|
36
|
+
} catch (error) {
|
|
37
|
+
console.error("Failed to parse WebSocket message:", error);
|
|
38
|
+
ctx.emit(wsErrorEvent, { error }, { raw: { message } });
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
},
|
|
42
|
+
context: ctx
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
//#endregion
|
|
47
|
+
//#region src/adapters/websocket/h3/peer.ts
|
|
48
|
+
const wsConnectedEvent$1 = defineEventa("eventa:adapters:websocket-peer:connected");
|
|
49
|
+
const wsDisconnectedEvent$1 = defineEventa("eventa:adapters:websocket-peer:disconnected");
|
|
50
|
+
const wsErrorEvent$1 = defineEventa("eventa:adapters:websocket-peer:error");
|
|
51
|
+
function createPeerContext(peer) {
|
|
52
|
+
const peerId = peer.id;
|
|
53
|
+
const ctx = createContext();
|
|
54
|
+
ctx.on(and(matchBy((e) => e._flowDirection === EventaFlowDirection.Outbound || !e._flowDirection), matchBy("*")), (event) => {
|
|
55
|
+
const data = JSON.stringify(generateWebsocketPayload(event.id, {
|
|
56
|
+
...defineOutboundEventa(event.type),
|
|
57
|
+
...event
|
|
58
|
+
}));
|
|
59
|
+
peer.send(data);
|
|
60
|
+
});
|
|
61
|
+
return {
|
|
62
|
+
hooks: { message(peer$1, message) {
|
|
63
|
+
if (peer$1.id === peerId) try {
|
|
64
|
+
const { type, payload } = parseWebsocketPayload(message.text());
|
|
65
|
+
ctx.emit(defineInboundEventa(type), payload.body, { raw: { message } });
|
|
66
|
+
} catch (error) {
|
|
67
|
+
console.error("Failed to parse WebSocket message:", error);
|
|
68
|
+
ctx.emit(wsErrorEvent$1, { error }, { raw: { message } });
|
|
69
|
+
}
|
|
70
|
+
} },
|
|
71
|
+
context: ctx
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
function createPeerHooks() {
|
|
75
|
+
let resolve;
|
|
76
|
+
const untilLeastOneConnected = new Promise((r) => {
|
|
77
|
+
resolve = r;
|
|
78
|
+
});
|
|
79
|
+
let message;
|
|
80
|
+
return {
|
|
81
|
+
hooks: {
|
|
82
|
+
open: (peer) => {
|
|
83
|
+
const { context, hooks } = createPeerContext(peer);
|
|
84
|
+
message = hooks.message;
|
|
85
|
+
resolve({
|
|
86
|
+
peer,
|
|
87
|
+
context
|
|
88
|
+
});
|
|
89
|
+
},
|
|
90
|
+
message: (peer, msg) => {
|
|
91
|
+
if (message != null) message(peer, msg);
|
|
92
|
+
}
|
|
93
|
+
},
|
|
94
|
+
untilLeastOneConnected
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
//#endregion
|
|
99
|
+
export { createGlobalContext, createPeerContext, createPeerHooks, wsErrorEvent as global, wsConnectedEvent as globalWsConnectedEvent, wsDisconnectedEvent as globalWsDisconnectedEvent, wsConnectedEvent$1 as peerWsConnectedEvent, wsDisconnectedEvent$1 as peerWsDisconnectedEvent, wsErrorEvent$1 as peerWsErrorEvent };
|
|
100
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.mjs","names":["createBaseContext","wsConnectedEvent","wsDisconnectedEvent","wsErrorEvent","createBaseContext","peer","resolve: (value: PeerContext) => void","message: Hooks['message'] | undefined"],"sources":["../../../../src/adapters/websocket/h3/global.ts","../../../../src/adapters/websocket/h3/peer.ts"],"sourcesContent":["import type { Hooks, Message, Peer, WSError } from 'crossws'\n\nimport type { EventContext } from '../../../context'\nimport type { DirectionalEventa, Eventa } from '../../../eventa'\n\nimport { createContext as createBaseContext } from '../../../context'\nimport { and, defineEventa, defineInboundEventa, defineOutboundEventa, EventaFlowDirection, matchBy } from '../../../eventa'\nimport { generateWebsocketPayload, parseWebsocketPayload } from '../internal'\n\nexport const wsConnectedEvent = defineEventa<{ id: string }>('eventa:adapters:websocket-global:connected')\nexport const wsDisconnectedEvent = defineEventa<{ id: string }>('eventa:adapters:websocket-global:disconnected')\nexport const wsErrorEvent = defineEventa<{ error: unknown }>('eventa:adapters:websocket-global:error')\n\nexport function createGlobalContext(): {\n websocketHandlers: Omit<Hooks, 'upgrade'>\n context: EventContext<any, { raw: { error?: WSError, message?: Message } }>\n} {\n const ctx = createBaseContext()\n const peers = new Set<Peer>()\n\n ctx.on(and(\n matchBy((e: DirectionalEventa<any>) => e._flowDirection === EventaFlowDirection.Outbound || !e._flowDirection),\n matchBy('*'),\n ), (event) => {\n const data = JSON.stringify(generateWebsocketPayload(event.id, { ...defineOutboundEventa(event.type), ...event }))\n for (const peer of peers) {\n peer.send(data)\n }\n })\n\n return {\n websocketHandlers: {\n open(peer) {\n peers.add(peer)\n ctx.emit(wsConnectedEvent, { id: peer.id }, { raw: { } })\n },\n\n close(peer) {\n peers.delete(peer)\n ctx.emit(wsDisconnectedEvent, { id: peer.id }, { raw: { } })\n },\n\n error(_, error) {\n console.error('WebSocket error:', error)\n ctx.emit(wsErrorEvent, { error }, { raw: { error } })\n },\n\n async message(_, message) {\n try {\n const { type, payload } = parseWebsocketPayload<Eventa<any>>(message.text())\n ctx.emit(defineInboundEventa(type), payload.body, { raw: { message } })\n }\n catch (error) {\n console.error('Failed to parse WebSocket message:', error)\n ctx.emit(wsErrorEvent, { error }, { raw: { message } })\n }\n },\n },\n context: ctx,\n }\n}\n","import type { Hooks, Message, Peer } from 'crossws'\n\nimport type { EventContext } from '../../../context'\nimport type { DirectionalEventa, Eventa } from '../../../eventa'\n\nimport { createContext as createBaseContext } from '../../../context'\nimport { and, defineEventa, defineInboundEventa, defineOutboundEventa, EventaFlowDirection, matchBy } from '../../../eventa'\nimport { generateWebsocketPayload, parseWebsocketPayload } from '../internal'\n\nexport const wsConnectedEvent = defineEventa<{ id: string }>('eventa:adapters:websocket-peer:connected')\nexport const wsDisconnectedEvent = defineEventa<{ id: string }>('eventa:adapters:websocket-peer:disconnected')\nexport const wsErrorEvent = defineEventa<{ error: unknown }>('eventa:adapters:websocket-peer:error')\n\nexport function createPeerContext(peer: Peer): {\n hooks: Pick<Hooks, 'message'>\n context: EventContext<any, { raw: { message: Message } }>\n} {\n const peerId = peer.id\n const ctx = createBaseContext()\n\n ctx.on(and(\n matchBy((e: DirectionalEventa<any>) => e._flowDirection === EventaFlowDirection.Outbound || !e._flowDirection),\n matchBy('*'),\n ), (event) => {\n const data = JSON.stringify(generateWebsocketPayload(event.id, { ...defineOutboundEventa(event.type), ...event }))\n peer.send(data)\n })\n\n return {\n hooks: {\n message(peer, message) {\n if (peer.id === peerId) {\n try {\n const { type, payload } = parseWebsocketPayload<Eventa<any>>(message.text())\n ctx.emit(defineInboundEventa(type), payload.body, { raw: { message } })\n }\n catch (error) {\n console.error('Failed to parse WebSocket message:', error)\n ctx.emit(wsErrorEvent, { error }, { raw: { message } })\n }\n }\n },\n },\n context: ctx,\n }\n}\n\nexport interface PeerContext { peer: Peer, context: EventContext<any, { raw: { message: Message } }> }\n\nexport function createPeerHooks(): { hooks: Partial<Hooks>, untilLeastOneConnected: Promise<PeerContext> } {\n let resolve: (value: PeerContext) => void\n const untilLeastOneConnected = new Promise<PeerContext>((r) => {\n resolve = r\n })\n\n let message: Hooks['message'] | undefined\n\n const hooks: Pick<Hooks, 'open' | 'message'> = {\n open: (peer) => {\n const { context, hooks } = createPeerContext(peer)\n message = hooks.message\n resolve({ peer, context })\n },\n message: (peer, msg) => {\n if (message != null) {\n message(peer, msg)\n }\n },\n }\n\n return { hooks, untilLeastOneConnected }\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { EventTag } from "../../eventa-B2HPBK4S.mjs";
|
|
2
|
+
|
|
3
|
+
//#region src/adapters/websocket/shared.d.ts
|
|
4
|
+
interface WebsocketPayload<T> {
|
|
5
|
+
id: string;
|
|
6
|
+
type: EventTag<any, any>;
|
|
7
|
+
payload: T;
|
|
8
|
+
timestamp: number;
|
|
9
|
+
}
|
|
10
|
+
//#endregion
|
|
11
|
+
export { WebsocketPayload };
|
|
12
|
+
//# sourceMappingURL=index.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { };
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { Eventa } from "../../../eventa-B2HPBK4S.mjs";
|
|
2
|
+
import { EventContext } from "../../../context-C_-MRU46.mjs";
|
|
3
|
+
|
|
4
|
+
//#region src/adapters/websocket/native/index.d.ts
|
|
5
|
+
declare const wsConnectedEvent: Eventa<{
|
|
6
|
+
url: string;
|
|
7
|
+
}>;
|
|
8
|
+
declare const wsDisconnectedEvent: Eventa<{
|
|
9
|
+
url: string;
|
|
10
|
+
}>;
|
|
11
|
+
declare const wsErrorEvent: Eventa<{
|
|
12
|
+
error: unknown;
|
|
13
|
+
}>;
|
|
14
|
+
declare function createContext(wsConn: WebSocket): {
|
|
15
|
+
context: EventContext<any, {
|
|
16
|
+
raw: {
|
|
17
|
+
message?: any;
|
|
18
|
+
open?: Event;
|
|
19
|
+
error?: Event;
|
|
20
|
+
close?: CloseEvent;
|
|
21
|
+
};
|
|
22
|
+
}>;
|
|
23
|
+
};
|
|
24
|
+
//#endregion
|
|
25
|
+
export { createContext, wsConnectedEvent, wsDisconnectedEvent, wsErrorEvent };
|
|
26
|
+
//# sourceMappingURL=index.d.mts.map
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { EventaFlowDirection, and, createContext as createContext$1, defineEventa, defineInboundEventa, defineOutboundEventa, matchBy } from "../../../context-C35Qku9U.mjs";
|
|
2
|
+
import { generateWebsocketPayload, parseWebsocketPayload } from "../../../internal-DjiAQtsa.mjs";
|
|
3
|
+
|
|
4
|
+
//#region src/adapters/websocket/native/index.ts
|
|
5
|
+
const wsConnectedEvent = defineEventa();
|
|
6
|
+
const wsDisconnectedEvent = defineEventa();
|
|
7
|
+
const wsErrorEvent = defineEventa();
|
|
8
|
+
function createContext(wsConn) {
|
|
9
|
+
const ctx = createContext$1();
|
|
10
|
+
ctx.on(and(matchBy((e) => e._flowDirection === EventaFlowDirection.Outbound || !e._flowDirection), matchBy("*")), (event) => {
|
|
11
|
+
const data = JSON.stringify(generateWebsocketPayload(event.id, {
|
|
12
|
+
...defineOutboundEventa(event.type),
|
|
13
|
+
...event
|
|
14
|
+
}));
|
|
15
|
+
wsConn.send(data);
|
|
16
|
+
});
|
|
17
|
+
wsConn.onmessage = (event) => {
|
|
18
|
+
try {
|
|
19
|
+
const { type, payload } = parseWebsocketPayload(event.data);
|
|
20
|
+
ctx.emit(defineInboundEventa(type), payload.body, { raw: { message: event } });
|
|
21
|
+
} catch (error) {
|
|
22
|
+
console.error("Failed to parse WebSocket message:", error);
|
|
23
|
+
ctx.emit(wsErrorEvent, { error }, { raw: { message: event } });
|
|
24
|
+
}
|
|
25
|
+
};
|
|
26
|
+
wsConn.onopen = (event) => {
|
|
27
|
+
ctx.emit(wsConnectedEvent, { url: wsConn.url }, { raw: { open: event } });
|
|
28
|
+
};
|
|
29
|
+
wsConn.onerror = (error) => {
|
|
30
|
+
ctx.emit(wsErrorEvent, { error }, { raw: { error } });
|
|
31
|
+
};
|
|
32
|
+
wsConn.onclose = (close) => {
|
|
33
|
+
ctx.emit(wsDisconnectedEvent, { url: wsConn.url }, { raw: { close } });
|
|
34
|
+
};
|
|
35
|
+
return { context: ctx };
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
//#endregion
|
|
39
|
+
export { createContext, wsConnectedEvent, wsDisconnectedEvent, wsErrorEvent };
|
|
40
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.mjs","names":["createBaseContext"],"sources":["../../../../src/adapters/websocket/native/index.ts"],"sourcesContent":["import type { EventContext } from '../../../context'\nimport type { DirectionalEventa, Eventa } from '../../../eventa'\n\nimport { createContext as createBaseContext } from '../../../context'\nimport { and, defineEventa, defineInboundEventa, defineOutboundEventa, EventaFlowDirection, matchBy } from '../../../eventa'\nimport { generateWebsocketPayload, parseWebsocketPayload } from '../internal'\n\nexport const wsConnectedEvent = defineEventa<{ url: string }>()\nexport const wsDisconnectedEvent = defineEventa<{ url: string }>()\nexport const wsErrorEvent = defineEventa<{ error: unknown }>()\n\nexport function createContext(wsConn: WebSocket) {\n const ctx = createBaseContext() as EventContext<any, { raw: { message?: any, open?: Event, error?: Event, close?: CloseEvent } }>\n\n ctx.on(and(\n matchBy((e: DirectionalEventa<any>) => e._flowDirection === EventaFlowDirection.Outbound || !e._flowDirection),\n matchBy('*'),\n ), (event) => {\n const data = JSON.stringify(generateWebsocketPayload(event.id, { ...defineOutboundEventa(event.type), ...event }))\n wsConn.send(data)\n })\n\n wsConn.onmessage = (event) => {\n try {\n const { type, payload } = parseWebsocketPayload<Eventa<any>>(event.data)\n ctx.emit(defineInboundEventa(type), payload.body, { raw: { message: event } })\n }\n catch (error) {\n console.error('Failed to parse WebSocket message:', error)\n ctx.emit(wsErrorEvent, { error }, { raw: { message: event } })\n }\n }\n\n wsConn.onopen = (event) => {\n ctx.emit(wsConnectedEvent, { url: wsConn.url }, { raw: { open: event } })\n }\n\n wsConn.onerror = (error) => {\n ctx.emit(wsErrorEvent, { error }, { raw: { error } })\n }\n\n wsConn.onclose = (close) => {\n ctx.emit(wsDisconnectedEvent, { url: wsConn.url }, { raw: { close } })\n }\n\n return {\n context: ctx,\n }\n}\n"],"mappings":";;;;AAOA,MAAa,mBAAmB,cAA+B;AAC/D,MAAa,sBAAsB,cAA+B;AAClE,MAAa,eAAe,cAAkC;AAE9D,SAAgB,cAAc,QAAmB;CAC/C,MAAM,MAAMA,iBAAmB;AAE/B,KAAI,GAAG,IACL,SAAS,MAA8B,EAAE,mBAAmB,oBAAoB,YAAY,CAAC,EAAE,eAAe,EAC9G,QAAQ,IAAI,CACb,GAAG,UAAU;EACZ,MAAM,OAAO,KAAK,UAAU,yBAAyB,MAAM,IAAI;GAAE,GAAG,qBAAqB,MAAM,KAAK;GAAE,GAAG;GAAO,CAAC,CAAC;AAClH,SAAO,KAAK,KAAK;GACjB;AAEF,QAAO,aAAa,UAAU;AAC5B,MAAI;GACF,MAAM,EAAE,MAAM,YAAY,sBAAmC,MAAM,KAAK;AACxE,OAAI,KAAK,oBAAoB,KAAK,EAAE,QAAQ,MAAM,EAAE,KAAK,EAAE,SAAS,OAAO,EAAE,CAAC;WAEzE,OAAO;AACZ,WAAQ,MAAM,sCAAsC,MAAM;AAC1D,OAAI,KAAK,cAAc,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,SAAS,OAAO,EAAE,CAAC;;;AAIlE,QAAO,UAAU,UAAU;AACzB,MAAI,KAAK,kBAAkB,EAAE,KAAK,OAAO,KAAK,EAAE,EAAE,KAAK,EAAE,MAAM,OAAO,EAAE,CAAC;;AAG3E,QAAO,WAAW,UAAU;AAC1B,MAAI,KAAK,cAAc,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;;AAGvD,QAAO,WAAW,UAAU;AAC1B,MAAI,KAAK,qBAAqB,EAAE,KAAK,OAAO,KAAK,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;;AAGxE,QAAO,EACL,SAAS,KACV"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { EventTag, Eventa } from "../../eventa-B2HPBK4S.mjs";
|
|
2
|
+
import { EventContext } from "../../context-C_-MRU46.mjs";
|
|
3
|
+
import { ExtendableInvokeResponse } from "../../invoke-LTUFMmHi.mjs";
|
|
4
|
+
|
|
5
|
+
//#region src/adapters/webworkers/shared.d.ts
|
|
6
|
+
interface WorkerPayload<T> {
|
|
7
|
+
id: string;
|
|
8
|
+
type: EventTag<any, any>;
|
|
9
|
+
payload: T;
|
|
10
|
+
transfer?: Transferable[];
|
|
11
|
+
}
|
|
12
|
+
interface WorkerEventa<T> extends Eventa<{
|
|
13
|
+
message: T;
|
|
14
|
+
transfer?: Transferable[];
|
|
15
|
+
}> {
|
|
16
|
+
_workerTransfer: true;
|
|
17
|
+
}
|
|
18
|
+
declare function defineWorkerEventa<T>(id?: string): WorkerEventa<T>;
|
|
19
|
+
declare function defineOutboundWorkerEventa<T>(id?: string): WorkerEventa<T>;
|
|
20
|
+
declare function isWorkerEventa(event: Eventa<any>): event is WorkerEventa<any>;
|
|
21
|
+
declare const workerErrorEvent: Eventa<{
|
|
22
|
+
error: unknown;
|
|
23
|
+
}>;
|
|
24
|
+
declare const workerMessageErrorEvent: Eventa<{
|
|
25
|
+
error: unknown;
|
|
26
|
+
message: any;
|
|
27
|
+
}>;
|
|
28
|
+
declare function normalizeOnListenerParameters(event: Eventa<any>, options?: {
|
|
29
|
+
transfer?: Transferable[];
|
|
30
|
+
} | unknown): {
|
|
31
|
+
body: any;
|
|
32
|
+
transfer: Transferable[] | undefined;
|
|
33
|
+
};
|
|
34
|
+
interface WithTransfer<T> {
|
|
35
|
+
message: T;
|
|
36
|
+
_transfer?: Transferable[];
|
|
37
|
+
}
|
|
38
|
+
declare function withTransfer<T>(body: T, transfer?: Transferable[]): ExtendableInvokeResponse<T, EventContext<{
|
|
39
|
+
invokeResponse?: {
|
|
40
|
+
transfer?: Transferable[];
|
|
41
|
+
};
|
|
42
|
+
}, any>>;
|
|
43
|
+
//#endregion
|
|
44
|
+
//#region src/adapters/webworkers/index.d.ts
|
|
45
|
+
declare function createContext(worker: Worker): {
|
|
46
|
+
context: EventContext<{
|
|
47
|
+
invokeRequest?: {
|
|
48
|
+
transfer?: Transferable[];
|
|
49
|
+
};
|
|
50
|
+
invokeResponse?: {
|
|
51
|
+
transfer?: Transferable[];
|
|
52
|
+
};
|
|
53
|
+
}, {
|
|
54
|
+
raw: {
|
|
55
|
+
message?: MessageEvent;
|
|
56
|
+
error?: ErrorEvent;
|
|
57
|
+
messageError?: MessageEvent;
|
|
58
|
+
};
|
|
59
|
+
}>;
|
|
60
|
+
};
|
|
61
|
+
//#endregion
|
|
62
|
+
export { WithTransfer, WorkerEventa, WorkerPayload, createContext, defineOutboundWorkerEventa, defineWorkerEventa, isWorkerEventa, normalizeOnListenerParameters, withTransfer, workerErrorEvent, workerMessageErrorEvent };
|
|
63
|
+
//# sourceMappingURL=index.d.mts.map
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { EventaFlowDirection, and, createContext as createContext$1, defineInboundEventa, defineOutboundEventa, matchBy } from "../../context-C35Qku9U.mjs";
|
|
2
|
+
import "../../src-Bb-vxm5k.mjs";
|
|
3
|
+
import { defineOutboundWorkerEventa, defineWorkerEventa, generateWorkerPayload, isWorkerEventa, normalizeOnListenerParameters, parseWorkerPayload, withTransfer, workerErrorEvent } from "../../shared-DbO1rU2W.mjs";
|
|
4
|
+
|
|
5
|
+
//#region src/adapters/webworkers/index.ts
|
|
6
|
+
function createContext(worker) {
|
|
7
|
+
const ctx = createContext$1();
|
|
8
|
+
ctx.on(and(matchBy((e) => e._flowDirection === EventaFlowDirection.Outbound || !e._flowDirection), matchBy("*")), (event, options) => {
|
|
9
|
+
const { body, transfer } = normalizeOnListenerParameters(event, options);
|
|
10
|
+
const data = generateWorkerPayload(event.id, {
|
|
11
|
+
...defineOutboundEventa(event.type),
|
|
12
|
+
...event,
|
|
13
|
+
body
|
|
14
|
+
});
|
|
15
|
+
if (transfer != null) {
|
|
16
|
+
worker.postMessage(data, { transfer });
|
|
17
|
+
return;
|
|
18
|
+
}
|
|
19
|
+
worker.postMessage(data);
|
|
20
|
+
});
|
|
21
|
+
worker.onmessage = (event) => {
|
|
22
|
+
try {
|
|
23
|
+
const { type, payload } = parseWorkerPayload(event.data);
|
|
24
|
+
if (!isWorkerEventa(payload)) ctx.emit(defineInboundEventa(type), payload.body, { raw: { message: event } });
|
|
25
|
+
else ctx.emit(defineInboundEventa(type), { message: payload.body }, { raw: { message: event } });
|
|
26
|
+
} catch (error) {
|
|
27
|
+
console.error("Failed to parse WebWorker message:", error);
|
|
28
|
+
ctx.emit(workerErrorEvent, { error }, { raw: { message: event } });
|
|
29
|
+
}
|
|
30
|
+
};
|
|
31
|
+
worker.onerror = (error) => {
|
|
32
|
+
ctx.emit(workerErrorEvent, { error }, { raw: { error } });
|
|
33
|
+
};
|
|
34
|
+
worker.onmessageerror = (error) => {
|
|
35
|
+
ctx.emit(workerErrorEvent, { error }, { raw: { messageError: error } });
|
|
36
|
+
};
|
|
37
|
+
return { context: ctx };
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
//#endregion
|
|
41
|
+
export { createContext, defineOutboundWorkerEventa, defineWorkerEventa, isWorkerEventa, withTransfer };
|
|
42
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +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 { 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 } }\n >\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, withTransfer } from './shared'\nexport type * from './shared'\n"],"mappings":";;;;;AAQA,SAAgB,cAAc,QAAgB;CAC5C,MAAM,MAAMA,iBAAmB;AAQ/B,KAAI,GAAG,IACL,SAAS,MAA8B,EAAE,mBAAmB,oBAAoB,YAAY,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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import "../../../eventa-B2HPBK4S.mjs";
|
|
2
|
+
import { EventContext } from "../../../context-C_-MRU46.mjs";
|
|
3
|
+
|
|
4
|
+
//#region src/adapters/webworkers/worker/index.d.ts
|
|
5
|
+
declare function createContext(options?: {
|
|
6
|
+
messagePort?: Omit<Worker, 'close' | 'start'>;
|
|
7
|
+
}): {
|
|
8
|
+
context: EventContext<{
|
|
9
|
+
invokeRequest?: {
|
|
10
|
+
transfer?: Transferable[];
|
|
11
|
+
};
|
|
12
|
+
invokeResponse?: {
|
|
13
|
+
transfer?: Transferable[];
|
|
14
|
+
};
|
|
15
|
+
}, {
|
|
16
|
+
raw: {
|
|
17
|
+
event?: any;
|
|
18
|
+
error?: string | Event;
|
|
19
|
+
};
|
|
20
|
+
}>;
|
|
21
|
+
};
|
|
22
|
+
//#endregion
|
|
23
|
+
export { createContext };
|
|
24
|
+
//# sourceMappingURL=index.d.mts.map
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { EventaFlowDirection, and, createContext as createContext$1, defineInboundEventa, defineOutboundEventa, matchBy } from "../../../context-C35Qku9U.mjs";
|
|
2
|
+
import "../../../src-Bb-vxm5k.mjs";
|
|
3
|
+
import { generateWorkerPayload, isWorkerEventa, normalizeOnListenerParameters, parseWorkerPayload, workerErrorEvent } from "../../../shared-DbO1rU2W.mjs";
|
|
4
|
+
|
|
5
|
+
//#region src/adapters/webworkers/worker/index.ts
|
|
6
|
+
function createContext(options) {
|
|
7
|
+
const { messagePort = self } = options || {};
|
|
8
|
+
const ctx = createContext$1();
|
|
9
|
+
ctx.on(and(matchBy((e) => e._flowDirection === EventaFlowDirection.Outbound || !e._flowDirection), matchBy("*")), (event, options$1) => {
|
|
10
|
+
const { body, transfer } = normalizeOnListenerParameters(event, options$1);
|
|
11
|
+
const data = generateWorkerPayload(event.id, {
|
|
12
|
+
...defineOutboundEventa(event.type),
|
|
13
|
+
...event,
|
|
14
|
+
body
|
|
15
|
+
});
|
|
16
|
+
if (transfer != null) {
|
|
17
|
+
messagePort.postMessage(data, { transfer });
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
20
|
+
messagePort.postMessage(data);
|
|
21
|
+
});
|
|
22
|
+
self.onerror = (error) => {
|
|
23
|
+
ctx.emit(workerErrorEvent, { error }, { raw: { error } });
|
|
24
|
+
};
|
|
25
|
+
self.onmessage = (event) => {
|
|
26
|
+
try {
|
|
27
|
+
const { type, payload } = parseWorkerPayload(event.data);
|
|
28
|
+
if (!isWorkerEventa(payload)) ctx.emit(defineInboundEventa(type), payload.body, { raw: { event } });
|
|
29
|
+
else ctx.emit(defineInboundEventa(type), { message: payload.body }, { raw: { event } });
|
|
30
|
+
} catch (error) {
|
|
31
|
+
console.error("Failed to parse WebWorker message:", error);
|
|
32
|
+
ctx.emit(workerErrorEvent, { error }, { raw: { event } });
|
|
33
|
+
}
|
|
34
|
+
};
|
|
35
|
+
return { context: ctx };
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
//#endregion
|
|
39
|
+
export { createContext };
|
|
40
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.mjs","names":["createBaseContext","options"],"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 { 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 { raw: { event?: any, error?: string | Event } }\n >\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":";;;;;AASA,SAAgB,cAAc,SAE3B;CACD,MAAM,EACJ,cAAc,SACZ,WAAW,EAAE;CAEjB,MAAM,MAAMA,iBAAmB;AAQ/B,KAAI,GAAG,IACL,SAAS,MAA8B,EAAE,mBAAmB,oBAAoB,YAAY,CAAC,EAAE,eAAe,EAC9G,QAAQ,IAAI,CACb,GAAG,OAAO,cAAY;EACrB,MAAM,EAAE,MAAM,aAAa,8BAA8B,OAAOC,UAAQ;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"}
|