@moeru/eventa 1.0.0-alpha.7 → 1.0.0-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (55) hide show
  1. package/README.md +238 -1
  2. package/dist/adapters/broadcast-channel/index.d.mts +48 -0
  3. package/dist/adapters/broadcast-channel/index.mjs +62 -0
  4. package/dist/adapters/broadcast-channel/index.mjs.map +1 -0
  5. package/dist/adapters/electron/main.d.mts +10 -6
  6. package/dist/adapters/electron/main.mjs +3 -3
  7. package/dist/adapters/electron/main.mjs.map +1 -1
  8. package/dist/adapters/electron/renderer.d.mts +2 -5
  9. package/dist/adapters/electron/renderer.mjs +3 -3
  10. package/dist/adapters/event-emitter/index.d.mts +2 -4
  11. package/dist/adapters/event-emitter/index.mjs +2 -2
  12. package/dist/adapters/event-target/index.d.mts +2 -4
  13. package/dist/adapters/event-target/index.mjs +2 -2
  14. package/dist/adapters/websocket/h3/index.d.mts +2 -2
  15. package/dist/adapters/websocket/h3/index.mjs +2 -2
  16. package/dist/adapters/websocket/h3/index.mjs.map +1 -1
  17. package/dist/adapters/websocket/index.d.mts +1 -1
  18. package/dist/adapters/websocket/native/index.d.mts +2 -2
  19. package/dist/adapters/websocket/native/index.mjs +2 -2
  20. package/dist/adapters/webworkers/index.d.mts +4 -43
  21. package/dist/adapters/webworkers/index.mjs +5 -4
  22. package/dist/adapters/webworkers/index.mjs.map +1 -1
  23. package/dist/adapters/webworkers/worker/index.d.mts +2 -2
  24. package/dist/adapters/webworkers/worker/index.mjs +4 -3
  25. package/dist/adapters/webworkers/worker/index.mjs.map +1 -1
  26. package/dist/adapters/worker-threads/index.d.mts +25 -0
  27. package/dist/adapters/worker-threads/index.mjs +43 -0
  28. package/dist/adapters/worker-threads/index.mjs.map +1 -0
  29. package/dist/adapters/worker-threads/worker/index.d.mts +26 -0
  30. package/dist/adapters/worker-threads/worker/index.mjs +46 -0
  31. package/dist/adapters/worker-threads/worker/index.mjs.map +1 -0
  32. package/dist/{context-CvPT-awQ.d.mts → context-ZVv99bcM.d.mts} +7 -4
  33. package/dist/{context-Y8SMtoKx.mjs → context-ex8urwfs.mjs} +1 -1
  34. package/dist/context-ex8urwfs.mjs.map +1 -0
  35. package/dist/{eventa-DmQvmwYT.d.mts → eventa-AJyw28P8.d.mts} +3 -2
  36. package/dist/index-CI_gUGXg.d.mts +522 -0
  37. package/dist/index.d.mts +4 -5
  38. package/dist/index.mjs +3 -3
  39. package/dist/{internal-mfpOkMuE.mjs → internal-De3z6hO5.mjs} +2 -2
  40. package/dist/{internal-mfpOkMuE.mjs.map → internal-De3z6hO5.mjs.map} +1 -1
  41. package/dist/{shared-ZN4ksxrB.mjs → shared-BZOulnwC.mjs} +2 -2
  42. package/dist/{shared-ZN4ksxrB.mjs.map → shared-BZOulnwC.mjs.map} +1 -1
  43. package/dist/{shared-DQmSel5n.mjs → shared-BdqIf6iZ.mjs} +4 -10
  44. package/dist/shared-BdqIf6iZ.mjs.map +1 -0
  45. package/dist/{shared-5hbiyQt-.d.mts → shared-Cd4CLAdD.d.mts} +2 -2
  46. package/dist/shared-DgX1R_nY.d.mts +34 -0
  47. package/dist/src-DZ7si0kE.mjs +1169 -0
  48. package/dist/src-DZ7si0kE.mjs.map +1 -0
  49. package/package.json +28 -10
  50. package/dist/context-Y8SMtoKx.mjs.map +0 -1
  51. package/dist/index-NaTw0d4N.d.mts +0 -24
  52. package/dist/invoke-CBQuKH1-.d.mts +0 -137
  53. package/dist/shared-DQmSel5n.mjs.map +0 -1
  54. package/dist/src-CSnWn9Kk.mjs +0 -284
  55. package/dist/src-CSnWn9Kk.mjs.map +0 -1
package/README.md CHANGED
@@ -151,6 +151,90 @@ Eventa comes with various adapters for common use scenarios across browsers and
151
151
 
152
152
  </details>
153
153
 
154
+ <details>
155
+ <summary>BroadcastChannel</summary>
156
+
157
+ ```ts
158
+ import { defineEventa } from '@moeru/eventa'
159
+ import { createContext } from '@moeru/eventa/adapters/broadcast-channel'
160
+
161
+ const channel = new BroadcastChannel('eventa-demo')
162
+ const { context: ctx } = createContext(channel)
163
+
164
+ const ping = defineEventa<{ message: string }>('bc:ping')
165
+ ctx.on(ping, ({ body }) => {
166
+ console.log('received', body.message)
167
+ })
168
+
169
+ ctx.emit(ping, { message: 'Hello from BroadcastChannel' })
170
+ ```
171
+ </details>
172
+
173
+ <details>
174
+ <summary>EventTarget</summary>
175
+
176
+ ```ts
177
+ import { defineInvoke, defineInvokeEventa, defineInvokeHandler } from '@moeru/eventa'
178
+ import { createContext } from '@moeru/eventa/adapters/event-target'
179
+
180
+ const eventTarget = new EventTarget()
181
+ const { context: ctx } = createContext(eventTarget)
182
+
183
+ const echoEvents = defineInvokeEventa<{ output: string }, { input: string }>('et:echo')
184
+ defineInvokeHandler(ctx, echoEvents, ({ input }) => ({ output: input.toUpperCase() }))
185
+
186
+ const echo = defineInvoke(ctx, echoEvents)
187
+ console.log(await echo({ input: 'eventa' })) // => { output: 'EVENTA' }
188
+ ```
189
+ </details>
190
+
191
+ <details>
192
+ <summary>EventEmitter (Node.js)</summary>
193
+
194
+ ```ts
195
+ import { EventEmitter } from 'node:events'
196
+
197
+ import { defineEventa } from '@moeru/eventa'
198
+ import { createContext } from '@moeru/eventa/adapters/event-emitter'
199
+
200
+ const emitter = new EventEmitter()
201
+ const { context: ctx } = createContext(emitter)
202
+
203
+ const logEvent = defineEventa<{ message: string }>('emitter:log')
204
+ ctx.on(logEvent, ({ body }) => console.log(body.message))
205
+ ctx.emit(logEvent, { message: 'Hello from EventEmitter' })
206
+ ```
207
+ </details>
208
+
209
+ <details>
210
+ <summary>Worker Threads (Node.js)</summary>
211
+
212
+ 1. Main thread:
213
+ ```ts
214
+ import { Worker } from 'node:worker_threads'
215
+
216
+ import { defineInvoke, defineInvokeEventa } from '@moeru/eventa'
217
+ import { createContext } from '@moeru/eventa/adapters/worker-threads'
218
+
219
+ const worker = new Worker(new URL('./worker.ts', import.meta.url), { type: 'module' })
220
+ const { context: mainCtx } = createContext(worker)
221
+
222
+ const helloEvents = defineInvokeEventa<{ output: string }, { input: string }>('node-worker-hello')
223
+ const hello = defineInvoke(mainCtx, helloEvents)
224
+ console.log(await hello({ input: 'Eventa' })) // => { output: 'Hello, Eventa' }
225
+ ```
226
+ 2. Worker entry:
227
+ ```ts
228
+ import { defineInvokeEventa, defineInvokeHandler } from '@moeru/eventa'
229
+ import { createContext } from '@moeru/eventa/adapters/worker-threads/worker'
230
+
231
+ const helloEvents = defineInvokeEventa<{ output: string }, { input: string }>('node-worker-hello')
232
+
233
+ const { context: workerCtx } = createContext()
234
+ defineInvokeHandler(workerCtx, helloEvents, ({ input }) => ({ output: `Hello, ${input}` }))
235
+ ```
236
+ </details>
237
+
154
238
  <details>
155
239
  <summary>WebSocket (Client)</summary>
156
240
 
@@ -231,6 +315,159 @@ for await (const update of sync({ jobId: 'import' })) {
231
315
 
232
316
  Both generator-style and imperative handlers are exercised in `src/stream.spec.ts:7`.
233
317
 
318
+ #### Abort/Cancel
319
+
320
+ Eventa supports cancellation via `AbortSignal` on the client side and exposes an `AbortController` inside handlers so you can stop work early.
321
+
322
+ Client-side (unary invoke):
323
+
324
+ ```ts
325
+ import { createContext, defineInvoke, defineInvokeEventa } from '@moeru/eventa'
326
+
327
+ const ctx = createContext()
328
+ const slowEvents = defineInvokeEventa<{ output: string }, { input: string }>('rpc:slow')
329
+ const slow = defineInvoke(ctx, slowEvents)
330
+
331
+ const controller = new AbortController()
332
+ const promise = slow({ input: 'work' }, { signal: controller.signal })
333
+
334
+ controller.abort('user cancelled')
335
+ await promise // rejects with AbortError
336
+ ```
337
+
338
+ Server-side handler (unary):
339
+
340
+ ```ts
341
+ import { defineInvokeHandler } from '@moeru/eventa'
342
+
343
+ defineInvokeHandler(ctx, slowEvents, async ({ input }, options) => {
344
+ const signal = options?.abortController?.signal
345
+ if (signal?.aborted) {
346
+ return { output: 'aborted' }
347
+ }
348
+
349
+ signal?.addEventListener('abort', () => {
350
+ // clean up resources, cancel timers, close connections, etc.
351
+ }, { once: true })
352
+
353
+ // ... do work
354
+ return { output: `done: ${input}` }
355
+ })
356
+ ```
357
+
358
+ Client-side (stream invoke):
359
+
360
+ ```ts
361
+ import { defineInvokeEventa, defineStreamInvoke } from '@moeru/eventa'
362
+
363
+ const streamEvents = defineInvokeEventa<{ type: 'progress' | 'done', value: number }, { jobId: string }>('rpc:stream')
364
+ const stream = defineStreamInvoke(ctx, streamEvents)
365
+
366
+ const controller = new AbortController()
367
+ const results = stream({ jobId: 'import' }, { signal: controller.signal })
368
+
369
+ setTimeout(() => controller.abort('timeout'), 1000)
370
+ for await (const msg of results) {
371
+ console.log(msg)
372
+ }
373
+ ```
374
+
375
+ Server-side handler (streaming):
376
+
377
+ ```ts
378
+ import { defineStreamInvokeHandler } from '@moeru/eventa'
379
+
380
+ defineStreamInvokeHandler(ctx, streamEvents, async function* ({ jobId }, options) {
381
+ const signal = options?.abortController?.signal
382
+
383
+ for (let i = 0; i <= 5; i++) {
384
+ if (signal?.aborted) {
385
+ return
386
+ }
387
+ yield { type: 'progress', value: i * 20 }
388
+ await new Promise(r => setTimeout(r, 200))
389
+ }
390
+
391
+ yield { type: 'done', value: 100 }
392
+ })
393
+ ```
394
+
395
+ #### Streaming Input
396
+
397
+ Eventa supports stream inputs on unary invokes (client-streaming) and full bidirectional streaming. This mirrors the gRPC shapes:
398
+
399
+ ```proto
400
+ // Client-streaming request -> unary response
401
+ rpc RecordRoute(stream Point) returns (RouteSummary) {}
402
+
403
+ // Bidirectional streaming request/response
404
+ rpc RouteChat(stream RouteNote) returns (stream RouteNote) {}
405
+ ```
406
+
407
+ Client-streaming input with `defineInvoke` (stream in, single response out):
408
+
409
+ ```ts
410
+ import { createContext, defineInvoke, defineInvokeEventa, defineInvokeHandler } from '@moeru/eventa'
411
+
412
+ const ctx = createContext()
413
+
414
+ const recordRoute = defineInvokeEventa<
415
+ { distance: number, points: number },
416
+ ReadableStream<{ lat: number, lng: number }>
417
+ >('rpc:record-route')
418
+
419
+ defineInvokeHandler(ctx, recordRoute, async (stream) => {
420
+ let points = 0
421
+ for await (const _ of stream) {
422
+ points += 1
423
+ }
424
+ return { distance: points * 10, points }
425
+ })
426
+
427
+ const input = new ReadableStream({
428
+ start(controller) {
429
+ controller.enqueue({ lat: 0, lng: 0 })
430
+ controller.enqueue({ lat: 1, lng: 1 })
431
+ controller.close()
432
+ },
433
+ })
434
+
435
+ const invoke = defineInvoke(ctx, recordRoute)
436
+ console.log(await invoke(input))
437
+ ```
438
+
439
+ Bidirectional streaming with `defineStreamInvoke` (stream in, stream out):
440
+
441
+ ```ts
442
+ import { createContext, defineInvokeEventa, defineStreamInvoke, defineStreamInvokeHandler } from '@moeru/eventa'
443
+
444
+ const ctx = createContext()
445
+
446
+ const routeChat = defineInvokeEventa<
447
+ { message: string },
448
+ ReadableStream<{ message: string }>
449
+ >('rpc:route-chat')
450
+
451
+ defineStreamInvokeHandler(ctx, routeChat, async function* (incoming) {
452
+ for await (const note of incoming) {
453
+ yield { message: `echo: ${note.message}` }
454
+ }
455
+ })
456
+
457
+ const outgoing = new ReadableStream({
458
+ start(controller) {
459
+ controller.enqueue({ message: 'hello' })
460
+ controller.enqueue({ message: 'from stream' })
461
+ controller.close()
462
+ },
463
+ })
464
+
465
+ const stream = defineStreamInvoke(ctx, routeChat)
466
+ for await (const note of stream(outgoing)) {
467
+ console.log(note.message)
468
+ }
469
+ ```
470
+
234
471
  #### Shorthands for `defineInvokeHandler` and `defineInvoke`
235
472
 
236
473
  When you have multiple invoke events to register handlers for, or to create invoke functions for, you can use `defineInvokeHandlers` and `defineInvokes` to do so in bulk.
@@ -267,7 +504,7 @@ pnpm test
267
504
 
268
505
  ## Similar projects
269
506
 
270
- - [`birpc`](https://github.com/antfu-collective/birpc): We dislike the way the API designs, we want fully free sharable invok-able functions
507
+ - [`birpc`](https://github.com/antfu-collective/birpc): We dislike the way the API designs, we want fully free sharable invok-able functions, streaming input, streaming output, etc.
271
508
  - [`async-call-rpc`](https://github.com/Jack-Works/async-call-rpc): it only works with JSON-RPC, but the DX is similar
272
509
 
273
510
  ## License
@@ -0,0 +1,48 @@
1
+ import { n as EventTag, s as EventaType } from "../../eventa-AJyw28P8.mjs";
2
+ import { t as EventContext } from "../../context-ZVv99bcM.mjs";
3
+
4
+ //#region src/adapters/broadcast-channel/shared.d.ts
5
+ interface Payload<T> {
6
+ id: string;
7
+ type: EventTag<any, any>;
8
+ payload: T;
9
+ }
10
+ declare const errorEvent: {
11
+ body?: {
12
+ error: unknown;
13
+ } | undefined;
14
+ id: string;
15
+ type?: EventaType.Event | undefined;
16
+ };
17
+ //#endregion
18
+ //#region src/adapters/broadcast-channel/index.d.ts
19
+ interface BroadcastChannelAdapterOptions {
20
+ /**
21
+ * Whether to listen to `message` events.
22
+ * @default true
23
+ */
24
+ messageEvents?: boolean;
25
+ /**
26
+ * Whether to listen to `messageerror` events.
27
+ * @default true
28
+ */
29
+ messageErrorEvents?: boolean;
30
+ /**
31
+ * Whether to close the BroadcastChannel when disposing the context.
32
+ * @default false
33
+ */
34
+ closeOnDispose?: boolean;
35
+ }
36
+ declare function createContext(channel: BroadcastChannel, options?: BroadcastChannelAdapterOptions): {
37
+ context: EventContext<any, {
38
+ raw: {
39
+ message?: MessageEvent;
40
+ messageError?: MessageEvent;
41
+ error?: unknown;
42
+ };
43
+ }>;
44
+ dispose: () => void;
45
+ };
46
+ //#endregion
47
+ export { BroadcastChannelAdapterOptions, Payload, createContext, errorEvent };
48
+ //# sourceMappingURL=index.d.mts.map
@@ -0,0 +1,62 @@
1
+ import { a as defineEventa, c as matchBy, i as and, l as nanoid, n as EventaFlowDirection, o as defineInboundEventa, s as defineOutboundEventa, t as createContext$1 } from "../../context-ex8urwfs.mjs";
2
+ import "../../src-DZ7si0kE.mjs";
3
+
4
+ //#region src/adapters/broadcast-channel/internal.ts
5
+ function generatePayload(type, payload) {
6
+ return {
7
+ id: nanoid(),
8
+ type,
9
+ payload
10
+ };
11
+ }
12
+ function parsePayload(data) {
13
+ return data;
14
+ }
15
+
16
+ //#endregion
17
+ //#region src/adapters/broadcast-channel/shared.ts
18
+ const errorEvent = { ...defineEventa() };
19
+
20
+ //#endregion
21
+ //#region src/adapters/broadcast-channel/index.ts
22
+ function withRemoval(channel, type, listener) {
23
+ channel.addEventListener(type, listener);
24
+ return { remove: () => {
25
+ channel.removeEventListener(type, listener);
26
+ } };
27
+ }
28
+ function createContext(channel, options) {
29
+ const ctx = createContext$1();
30
+ const { messageEvents: message = true, messageErrorEvents: messageError = true, closeOnDispose = false } = options || {};
31
+ const cleanupRemoval = [];
32
+ ctx.on(and(matchBy((e) => e._flowDirection === EventaFlowDirection.Outbound || !e._flowDirection), matchBy("*")), (event) => {
33
+ const message$1 = generatePayload(event.id, {
34
+ ...defineOutboundEventa(event.type),
35
+ ...event
36
+ });
37
+ channel.postMessage(message$1);
38
+ });
39
+ if (message) cleanupRemoval.push(withRemoval(channel, "message", (event) => {
40
+ try {
41
+ const { type, payload } = parsePayload(event.data);
42
+ ctx.emit(defineInboundEventa(type), payload.body, { raw: { message: event } });
43
+ } catch (error) {
44
+ console.error("Failed to parse BroadcastChannel message:", error);
45
+ ctx.emit(errorEvent, { error }, { raw: { error } });
46
+ }
47
+ }));
48
+ if (messageError) cleanupRemoval.push(withRemoval(channel, "messageerror", (event) => {
49
+ ctx.emit(errorEvent, { error: event }, { raw: { messageError: event } });
50
+ }));
51
+ return {
52
+ context: ctx,
53
+ dispose: () => {
54
+ cleanupRemoval.forEach((removal) => removal.remove());
55
+ if (closeOnDispose) channel.close?.();
56
+ }
57
+ };
58
+ }
59
+
60
+ //#endregion
61
+ export { createContext };
62
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.mjs","names":["createBaseContext","cleanupRemoval: Array<{ remove: () => void }>","message"],"sources":["../../../src/adapters/broadcast-channel/internal.ts","../../../src/adapters/broadcast-channel/shared.ts","../../../src/adapters/broadcast-channel/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 const errorEvent = { ...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, matchBy } from '../../eventa'\nimport { generatePayload, parsePayload } from './internal'\nimport { errorEvent } from './shared'\n\nfunction withRemoval<K extends keyof BroadcastChannelEventMap>(channel: BroadcastChannel, type: K, listener: (event: BroadcastChannelEventMap[K]) => void) {\n channel.addEventListener(type, listener)\n\n return {\n remove: () => {\n channel.removeEventListener(type, listener)\n },\n }\n}\n\nexport interface BroadcastChannelAdapterOptions {\n /**\n * Whether to listen to `message` events.\n * @default true\n */\n messageEvents?: boolean\n /**\n * Whether to listen to `messageerror` events.\n * @default true\n */\n messageErrorEvents?: boolean\n /**\n * Whether to close the BroadcastChannel when disposing the context.\n * @default false\n */\n closeOnDispose?: boolean\n}\n\nexport function createContext(channel: BroadcastChannel, options?: BroadcastChannelAdapterOptions) {\n const ctx = createBaseContext() as EventContext<any, { raw: { message?: MessageEvent, messageError?: MessageEvent, error?: unknown } }>\n\n const {\n messageEvents: message = true,\n messageErrorEvents: messageError = true,\n closeOnDispose = false,\n } = options || {}\n\n const cleanupRemoval: Array<{ remove: () => void }> = []\n\n ctx.on(and(matchBy((e: DirectionalEventa<any>) => e._flowDirection === EventaFlowDirection.Outbound || !e._flowDirection), matchBy('*')), (event) => {\n const message = generatePayload(event.id, { ...defineOutboundEventa(event.type), ...event })\n channel.postMessage(message)\n })\n\n if (message) {\n cleanupRemoval.push(withRemoval(channel, 'message', (event) => {\n try {\n const { type, payload } = parsePayload<Eventa<any>>(event.data)\n ctx.emit(defineInboundEventa(type), payload.body, { raw: { message: event } })\n }\n catch (error) {\n console.error('Failed to parse BroadcastChannel message:', error)\n ctx.emit(errorEvent, { error }, { raw: { error } })\n }\n }))\n }\n\n if (messageError) {\n cleanupRemoval.push(withRemoval(channel, '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 if (closeOnDispose) {\n channel.close?.()\n }\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;;;;;ACJT,MAAa,aAAa,EAAE,GAAG,cAAkC,EAAE;;;;ACFnE,SAAS,YAAsD,SAA2B,MAAS,UAAwD;AACzJ,SAAQ,iBAAiB,MAAM,SAAS;AAExC,QAAO,EACL,cAAc;AACZ,UAAQ,oBAAoB,MAAM,SAAS;IAE9C;;AAqBH,SAAgB,cAAc,SAA2B,SAA0C;CACjG,MAAM,MAAMA,iBAAmB;CAE/B,MAAM,EACJ,eAAe,UAAU,MACzB,oBAAoB,eAAe,MACnC,iBAAiB,UACf,WAAW,EAAE;CAEjB,MAAMC,iBAAgD,EAAE;AAExD,KAAI,GAAG,IAAI,SAAS,MAA8B,EAAE,mBAAmB,oBAAoB,YAAY,CAAC,EAAE,eAAe,EAAE,QAAQ,IAAI,CAAC,GAAG,UAAU;EACnJ,MAAMC,YAAU,gBAAgB,MAAM,IAAI;GAAE,GAAG,qBAAqB,MAAM,KAAK;GAAE,GAAG;GAAO,CAAC;AAC5F,UAAQ,YAAYA,UAAQ;GAC5B;AAEF,KAAI,QACF,gBAAe,KAAK,YAAY,SAAS,YAAY,UAAU;AAC7D,MAAI;GACF,MAAM,EAAE,MAAM,YAAY,aAA0B,MAAM,KAAK;AAC/D,OAAI,KAAK,oBAAoB,KAAK,EAAE,QAAQ,MAAM,EAAE,KAAK,EAAE,SAAS,OAAO,EAAE,CAAC;WAEzE,OAAO;AACZ,WAAQ,MAAM,6CAA6C,MAAM;AACjE,OAAI,KAAK,YAAY,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;;GAErD,CAAC;AAGL,KAAI,aACF,gBAAe,KAAK,YAAY,SAAS,iBAAiB,UAAU;AAClE,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;AACnD,OAAI,eACF,SAAQ,SAAS;;EAGtB"}
@@ -1,8 +1,5 @@
1
- import "../../eventa-DmQvmwYT.mjs";
2
- import { t as EventContext } from "../../context-CvPT-awQ.mjs";
3
- import "../../invoke-CBQuKH1-.mjs";
4
- import "../../index-NaTw0d4N.mjs";
5
- import { n as errorEvent, t as Payload } from "../../shared-5hbiyQt-.mjs";
1
+ import { t as EventContext } from "../../context-ZVv99bcM.mjs";
2
+ import { n as errorEvent, t as Payload } from "../../shared-Cd4CLAdD.mjs";
6
3
  import { BrowserWindow, IpcMain, IpcMainEvent } from "electron";
7
4
 
8
5
  //#region src/adapters/electron/main.d.ts
@@ -13,7 +10,14 @@ declare function createContext(ipcMain: IpcMain, window?: BrowserWindow, options
13
10
  extraListeners?: Record<string, (_: any, event: Event) => void | Promise<void>>;
14
11
  throwIfFailedToSend?: boolean;
15
12
  }): {
16
- context: EventContext<any, {
13
+ context: EventContext<{
14
+ invokeRequest?: {
15
+ raw?: {
16
+ ipcMainEvent: IpcMainEvent;
17
+ event: Event | unknown;
18
+ };
19
+ };
20
+ }, {
17
21
  raw: {
18
22
  ipcMainEvent: IpcMainEvent;
19
23
  event: Event | unknown;
@@ -1,6 +1,6 @@
1
- import { c as matchBy, i as and, n as EventaFlowDirection, o as defineInboundEventa, s as defineOutboundEventa, t as createContext$1 } from "../../context-Y8SMtoKx.mjs";
2
- import "../../src-CSnWn9Kk.mjs";
3
- import { n as generatePayload, r as parsePayload, t as errorEvent } from "../../shared-ZN4ksxrB.mjs";
1
+ import { c as matchBy, i as and, n as EventaFlowDirection, o as defineInboundEventa, s as defineOutboundEventa, t as createContext$1 } from "../../context-ex8urwfs.mjs";
2
+ import "../../src-DZ7si0kE.mjs";
3
+ import { n as generatePayload, r as parsePayload, t as errorEvent } from "../../shared-BZOulnwC.mjs";
4
4
 
5
5
  //#region src/adapters/electron/main.ts
6
6
  function withRemoval(ipcMain, type, listener) {
@@ -1 +1 @@
1
- {"version":3,"file":"main.mjs","names":["createBaseContext","cleanupRemoval: Array<{ remove: () => void }>","options"],"sources":["../../../src/adapters/electron/main.ts"],"sourcesContent":["import type { BrowserWindow, IpcMain, IpcMainEvent } from 'electron'\n\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 { generatePayload, parsePayload } from './internal'\nimport { errorEvent } from './shared'\n\nfunction withRemoval(ipcMain: IpcMain, type: string, listener: Parameters<IpcMain['on']>[1]) {\n ipcMain.on(type, listener)\n\n return {\n remove: () => {\n ipcMain.off(type, listener)\n },\n }\n}\n\nexport function createContext(ipcMain: IpcMain, window?: BrowserWindow, options?: {\n onlySameWindow?: boolean\n messageEventName?: string | false\n errorEventName?: string | false\n extraListeners?: Record<string, (_, event: Event) => void | Promise<void>>\n throwIfFailedToSend?: boolean\n}) {\n const ctx = createBaseContext() as EventContext<any, { raw: { ipcMainEvent: IpcMainEvent, event: Event | unknown } }>\n\n const {\n messageEventName = 'eventa-message',\n errorEventName = 'eventa-error',\n extraListeners = {},\n onlySameWindow = false,\n } = options || {}\n\n const cleanupRemoval: Array<{ remove: () => void }> = []\n\n ctx.on(and(\n matchBy('*'),\n matchBy((e: DirectionalEventa<any>) => e._flowDirection === EventaFlowDirection.Outbound || !e._flowDirection),\n ), (event, options) => {\n const eventBody = generatePayload(event.id, { ...defineOutboundEventa(event.type), ...event })\n if (messageEventName !== false) {\n try {\n if (window != null) {\n if (window.isDestroyed()) {\n return\n }\n\n if (onlySameWindow) {\n if (window.webContents.id === options?.raw.ipcMainEvent.sender.id) {\n window?.webContents?.send(messageEventName, eventBody)\n }\n }\n else {\n window?.webContents?.send(messageEventName, eventBody)\n }\n }\n else {\n if (options?.raw.ipcMainEvent.sender.isDestroyed()) {\n return\n }\n\n options?.raw.ipcMainEvent.sender.send(messageEventName, eventBody)\n }\n }\n catch (error) {\n // NOTICE: Electron may throw if the window is closed before sending\n // ignore the error if it's about destroyed object\n if (!(error instanceof Error) || error?.message !== 'Object has been destroyed') {\n throw error\n }\n }\n }\n })\n\n if (messageEventName) {\n cleanupRemoval.push(withRemoval(ipcMain, messageEventName, (ipcMainEvent, event: Event | unknown) => {\n try {\n const { type, payload } = parsePayload<Eventa<any>>(event)\n ctx.emit(defineInboundEventa(type), payload.body, { raw: { ipcMainEvent, event } })\n }\n catch (error) {\n console.error('Failed to parse IpcMain message:', error)\n ctx.emit(errorEvent, { error }, { raw: { ipcMainEvent, event } })\n }\n }))\n }\n\n if (errorEventName) {\n cleanupRemoval.push(withRemoval(ipcMain, errorEventName, (ipcMainEvent, error: Event | unknown) => {\n ctx.emit(errorEvent, { error }, { raw: { ipcMainEvent, event: error } })\n }))\n }\n\n for (const [eventName, listener] of Object.entries(extraListeners)) {\n cleanupRemoval.push(withRemoval(ipcMain, 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":";;;;;AAUA,SAAS,YAAY,SAAkB,MAAc,UAAwC;AAC3F,SAAQ,GAAG,MAAM,SAAS;AAE1B,QAAO,EACL,cAAc;AACZ,UAAQ,IAAI,MAAM,SAAS;IAE9B;;AAGH,SAAgB,cAAc,SAAkB,QAAwB,SAMrE;CACD,MAAM,MAAMA,iBAAmB;CAE/B,MAAM,EACJ,mBAAmB,kBACnB,iBAAiB,gBACjB,iBAAiB,EAAE,EACnB,iBAAiB,UACf,WAAW,EAAE;CAEjB,MAAMC,iBAAgD,EAAE;AAExD,KAAI,GAAG,IACL,QAAQ,IAAI,EACZ,SAAS,MAA8B,EAAE,mBAAmB,oBAAoB,YAAY,CAAC,EAAE,eAAe,CAC/G,GAAG,OAAO,cAAY;EACrB,MAAM,YAAY,gBAAgB,MAAM,IAAI;GAAE,GAAG,qBAAqB,MAAM,KAAK;GAAE,GAAG;GAAO,CAAC;AAC9F,MAAI,qBAAqB,MACvB,KAAI;AACF,OAAI,UAAU,MAAM;AAClB,QAAI,OAAO,aAAa,CACtB;AAGF,QAAI,gBACF;SAAI,OAAO,YAAY,OAAOC,WAAS,IAAI,aAAa,OAAO,GAC7D,SAAQ,aAAa,KAAK,kBAAkB,UAAU;UAIxD,SAAQ,aAAa,KAAK,kBAAkB,UAAU;UAGrD;AACH,QAAIA,WAAS,IAAI,aAAa,OAAO,aAAa,CAChD;AAGF,eAAS,IAAI,aAAa,OAAO,KAAK,kBAAkB,UAAU;;WAG/D,OAAO;AAGZ,OAAI,EAAE,iBAAiB,UAAU,OAAO,YAAY,4BAClD,OAAM;;GAIZ;AAEF,KAAI,iBACF,gBAAe,KAAK,YAAY,SAAS,mBAAmB,cAAc,UAA2B;AACnG,MAAI;GACF,MAAM,EAAE,MAAM,YAAY,aAA0B,MAAM;AAC1D,OAAI,KAAK,oBAAoB,KAAK,EAAE,QAAQ,MAAM,EAAE,KAAK;IAAE;IAAc;IAAO,EAAE,CAAC;WAE9E,OAAO;AACZ,WAAQ,MAAM,oCAAoC,MAAM;AACxD,OAAI,KAAK,YAAY,EAAE,OAAO,EAAE,EAAE,KAAK;IAAE;IAAc;IAAO,EAAE,CAAC;;GAEnE,CAAC;AAGL,KAAI,eACF,gBAAe,KAAK,YAAY,SAAS,iBAAiB,cAAc,UAA2B;AACjG,MAAI,KAAK,YAAY,EAAE,OAAO,EAAE,EAAE,KAAK;GAAE;GAAc,OAAO;GAAO,EAAE,CAAC;GACxE,CAAC;AAGL,MAAK,MAAM,CAAC,WAAW,aAAa,OAAO,QAAQ,eAAe,CAChE,gBAAe,KAAK,YAAY,SAAS,WAAW,SAAS,CAAC;AAGhE,QAAO;EACL,SAAS;EACT,eAAe;AACb,kBAAe,SAAQ,YAAW,QAAQ,QAAQ,CAAC;;EAEtD"}
1
+ {"version":3,"file":"main.mjs","names":["createBaseContext","cleanupRemoval: Array<{ remove: () => void }>","options"],"sources":["../../../src/adapters/electron/main.ts"],"sourcesContent":["import type { BrowserWindow, IpcMain, IpcMainEvent } from 'electron'\n\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 { generatePayload, parsePayload } from './internal'\nimport { errorEvent } from './shared'\n\nfunction withRemoval(ipcMain: IpcMain, type: string, listener: Parameters<IpcMain['on']>[1]) {\n ipcMain.on(type, listener)\n\n return {\n remove: () => {\n ipcMain.off(type, listener)\n },\n }\n}\n\nexport function createContext(ipcMain: IpcMain, window?: BrowserWindow, options?: {\n onlySameWindow?: boolean\n messageEventName?: string | false\n errorEventName?: string | false\n extraListeners?: Record<string, (_, event: Event) => void | Promise<void>>\n throwIfFailedToSend?: boolean\n}) {\n const ctx = createBaseContext() as EventContext<\n { invokeRequest?: { raw?: { ipcMainEvent: IpcMainEvent, event: Event | unknown } } },\n { raw: { ipcMainEvent: IpcMainEvent, event: Event | unknown } }\n >\n\n const {\n messageEventName = 'eventa-message',\n errorEventName = 'eventa-error',\n extraListeners = {},\n onlySameWindow = false,\n } = options || {}\n\n const cleanupRemoval: Array<{ remove: () => void }> = []\n\n ctx.on(and(\n matchBy('*'),\n matchBy((e: DirectionalEventa<any>) => e._flowDirection === EventaFlowDirection.Outbound || !e._flowDirection),\n ), (event, options) => {\n const eventBody = generatePayload(event.id, { ...defineOutboundEventa(event.type), ...event })\n if (messageEventName !== false) {\n try {\n if (window != null) {\n if (window.isDestroyed()) {\n return\n }\n\n if (onlySameWindow) {\n if (window.webContents.id === options?.raw.ipcMainEvent.sender.id) {\n window?.webContents?.send(messageEventName, eventBody)\n }\n }\n else {\n window?.webContents?.send(messageEventName, eventBody)\n }\n }\n else {\n if (options?.raw.ipcMainEvent.sender.isDestroyed()) {\n return\n }\n\n options?.raw.ipcMainEvent.sender.send(messageEventName, eventBody)\n }\n }\n catch (error) {\n // NOTICE: Electron may throw if the window is closed before sending\n // ignore the error if it's about destroyed object\n if (!(error instanceof Error) || error?.message !== 'Object has been destroyed') {\n throw error\n }\n }\n }\n })\n\n if (messageEventName) {\n cleanupRemoval.push(withRemoval(ipcMain, messageEventName, (ipcMainEvent, event: Event | unknown) => {\n try {\n const { type, payload } = parsePayload<Eventa<any>>(event)\n ctx.emit(defineInboundEventa(type), payload.body, { raw: { ipcMainEvent, event } })\n }\n catch (error) {\n console.error('Failed to parse IpcMain message:', error)\n ctx.emit(errorEvent, { error }, { raw: { ipcMainEvent, event } })\n }\n }))\n }\n\n if (errorEventName) {\n cleanupRemoval.push(withRemoval(ipcMain, errorEventName, (ipcMainEvent, error: Event | unknown) => {\n ctx.emit(errorEvent, { error }, { raw: { ipcMainEvent, event: error } })\n }))\n }\n\n for (const [eventName, listener] of Object.entries(extraListeners)) {\n cleanupRemoval.push(withRemoval(ipcMain, 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":";;;;;AAUA,SAAS,YAAY,SAAkB,MAAc,UAAwC;AAC3F,SAAQ,GAAG,MAAM,SAAS;AAE1B,QAAO,EACL,cAAc;AACZ,UAAQ,IAAI,MAAM,SAAS;IAE9B;;AAGH,SAAgB,cAAc,SAAkB,QAAwB,SAMrE;CACD,MAAM,MAAMA,iBAAmB;CAK/B,MAAM,EACJ,mBAAmB,kBACnB,iBAAiB,gBACjB,iBAAiB,EAAE,EACnB,iBAAiB,UACf,WAAW,EAAE;CAEjB,MAAMC,iBAAgD,EAAE;AAExD,KAAI,GAAG,IACL,QAAQ,IAAI,EACZ,SAAS,MAA8B,EAAE,mBAAmB,oBAAoB,YAAY,CAAC,EAAE,eAAe,CAC/G,GAAG,OAAO,cAAY;EACrB,MAAM,YAAY,gBAAgB,MAAM,IAAI;GAAE,GAAG,qBAAqB,MAAM,KAAK;GAAE,GAAG;GAAO,CAAC;AAC9F,MAAI,qBAAqB,MACvB,KAAI;AACF,OAAI,UAAU,MAAM;AAClB,QAAI,OAAO,aAAa,CACtB;AAGF,QAAI,gBACF;SAAI,OAAO,YAAY,OAAOC,WAAS,IAAI,aAAa,OAAO,GAC7D,SAAQ,aAAa,KAAK,kBAAkB,UAAU;UAIxD,SAAQ,aAAa,KAAK,kBAAkB,UAAU;UAGrD;AACH,QAAIA,WAAS,IAAI,aAAa,OAAO,aAAa,CAChD;AAGF,eAAS,IAAI,aAAa,OAAO,KAAK,kBAAkB,UAAU;;WAG/D,OAAO;AAGZ,OAAI,EAAE,iBAAiB,UAAU,OAAO,YAAY,4BAClD,OAAM;;GAIZ;AAEF,KAAI,iBACF,gBAAe,KAAK,YAAY,SAAS,mBAAmB,cAAc,UAA2B;AACnG,MAAI;GACF,MAAM,EAAE,MAAM,YAAY,aAA0B,MAAM;AAC1D,OAAI,KAAK,oBAAoB,KAAK,EAAE,QAAQ,MAAM,EAAE,KAAK;IAAE;IAAc;IAAO,EAAE,CAAC;WAE9E,OAAO;AACZ,WAAQ,MAAM,oCAAoC,MAAM;AACxD,OAAI,KAAK,YAAY,EAAE,OAAO,EAAE,EAAE,KAAK;IAAE;IAAc;IAAO,EAAE,CAAC;;GAEnE,CAAC;AAGL,KAAI,eACF,gBAAe,KAAK,YAAY,SAAS,iBAAiB,cAAc,UAA2B;AACjG,MAAI,KAAK,YAAY,EAAE,OAAO,EAAE,EAAE,KAAK;GAAE;GAAc,OAAO;GAAO,EAAE,CAAC;GACxE,CAAC;AAGL,MAAK,MAAM,CAAC,WAAW,aAAa,OAAO,QAAQ,eAAe,CAChE,gBAAe,KAAK,YAAY,SAAS,WAAW,SAAS,CAAC;AAGhE,QAAO;EACL,SAAS;EACT,eAAe;AACb,kBAAe,SAAQ,YAAW,QAAQ,QAAQ,CAAC;;EAEtD"}
@@ -1,8 +1,5 @@
1
- import "../../eventa-DmQvmwYT.mjs";
2
- import { t as EventContext } from "../../context-CvPT-awQ.mjs";
3
- import "../../invoke-CBQuKH1-.mjs";
4
- import "../../index-NaTw0d4N.mjs";
5
- import { n as errorEvent, t as Payload } from "../../shared-5hbiyQt-.mjs";
1
+ import { t as EventContext } from "../../context-ZVv99bcM.mjs";
2
+ import { n as errorEvent, t as Payload } from "../../shared-Cd4CLAdD.mjs";
6
3
  import { IpcRenderer, IpcRendererListener } from "@electron-toolkit/preload";
7
4
 
8
5
  //#region src/adapters/electron/renderer.d.ts
@@ -1,6 +1,6 @@
1
- import { c as matchBy, i as and, n as EventaFlowDirection, o as defineInboundEventa, s as defineOutboundEventa, t as createContext$1 } from "../../context-Y8SMtoKx.mjs";
2
- import "../../src-CSnWn9Kk.mjs";
3
- import { n as generatePayload, r as parsePayload, t as errorEvent } from "../../shared-ZN4ksxrB.mjs";
1
+ import { c as matchBy, i as and, n as EventaFlowDirection, o as defineInboundEventa, s as defineOutboundEventa, t as createContext$1 } from "../../context-ex8urwfs.mjs";
2
+ import "../../src-DZ7si0kE.mjs";
3
+ import { n as generatePayload, r as parsePayload, t as errorEvent } from "../../shared-BZOulnwC.mjs";
4
4
 
5
5
  //#region src/adapters/electron/renderer.ts
6
6
  function createContext(ipcRenderer, options) {
@@ -1,7 +1,5 @@
1
- import { n as EventTag, s as EventaType } from "../../eventa-DmQvmwYT.mjs";
2
- import { t as EventContext } from "../../context-CvPT-awQ.mjs";
3
- import "../../invoke-CBQuKH1-.mjs";
4
- import "../../index-NaTw0d4N.mjs";
1
+ import { n as EventTag, s as EventaType } from "../../eventa-AJyw28P8.mjs";
2
+ import { t as EventContext } from "../../context-ZVv99bcM.mjs";
5
3
 
6
4
  //#region src/adapters/event-emitter/shared.d.ts
7
5
  interface Payload<T> {
@@ -1,5 +1,5 @@
1
- import { a as defineEventa, c as matchBy, i as and, l as nanoid, n as EventaFlowDirection, o as defineInboundEventa, s as defineOutboundEventa, t as createContext$1 } from "../../context-Y8SMtoKx.mjs";
2
- import "../../src-CSnWn9Kk.mjs";
1
+ import { a as defineEventa, c as matchBy, i as and, l as nanoid, n as EventaFlowDirection, o as defineInboundEventa, s as defineOutboundEventa, t as createContext$1 } from "../../context-ex8urwfs.mjs";
2
+ import "../../src-DZ7si0kE.mjs";
3
3
 
4
4
  //#region src/adapters/event-emitter/internal.ts
5
5
  function generatePayload(type, payload) {
@@ -1,7 +1,5 @@
1
- import { n as EventTag, s as EventaType } from "../../eventa-DmQvmwYT.mjs";
2
- import { t as EventContext } from "../../context-CvPT-awQ.mjs";
3
- import "../../invoke-CBQuKH1-.mjs";
4
- import "../../index-NaTw0d4N.mjs";
1
+ import { n as EventTag, s as EventaType } from "../../eventa-AJyw28P8.mjs";
2
+ import { t as EventContext } from "../../context-ZVv99bcM.mjs";
5
3
 
6
4
  //#region src/adapters/event-target/shared.d.ts
7
5
  interface CustomEventDetail<T> {
@@ -1,5 +1,5 @@
1
- import { a as defineEventa, c as matchBy, i as and, l as nanoid, n as EventaFlowDirection, o as defineInboundEventa, r as EventaType, s as defineOutboundEventa, t as createContext$1 } from "../../context-Y8SMtoKx.mjs";
2
- import "../../src-CSnWn9Kk.mjs";
1
+ import { a as defineEventa, c as matchBy, i as and, l as nanoid, n as EventaFlowDirection, o as defineInboundEventa, r as EventaType, s as defineOutboundEventa, t as createContext$1 } from "../../context-ex8urwfs.mjs";
2
+ import "../../src-DZ7si0kE.mjs";
3
3
 
4
4
  //#region src/adapters/event-target/internal.ts
5
5
  function generateCustomEventDetail(type, payload) {
@@ -1,5 +1,5 @@
1
- import { r as Eventa } from "../../../eventa-DmQvmwYT.mjs";
2
- import { t as EventContext } from "../../../context-CvPT-awQ.mjs";
1
+ import { r as Eventa } from "../../../eventa-AJyw28P8.mjs";
2
+ import { t as EventContext } from "../../../context-ZVv99bcM.mjs";
3
3
  import { Hooks, Message, Peer, WSError } from "crossws";
4
4
 
5
5
  //#region src/adapters/websocket/h3/global.d.ts
@@ -1,5 +1,5 @@
1
- import { a as defineEventa, c as matchBy, i as and, n as EventaFlowDirection, o as defineInboundEventa, s as defineOutboundEventa, t as createContext } from "../../../context-Y8SMtoKx.mjs";
2
- import { n as parseWebsocketPayload, t as generateWebsocketPayload } from "../../../internal-mfpOkMuE.mjs";
1
+ import { a as defineEventa, c as matchBy, i as and, n as EventaFlowDirection, o as defineInboundEventa, s as defineOutboundEventa, t as createContext } from "../../../context-ex8urwfs.mjs";
2
+ import { n as parseWebsocketPayload, t as generateWebsocketPayload } from "../../../internal-De3z6hO5.mjs";
3
3
 
4
4
  //#region src/adapters/websocket/h3/global.ts
5
5
  const wsConnectedEvent = defineEventa("eventa:adapters:websocket-global:connected");
@@ -1 +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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"}
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<any, { raw: { error?: WSError, message?: Message } }>()\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<any, { raw: { message: Message } }>()\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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"}
@@ -1,4 +1,4 @@
1
- import { n as EventTag } from "../../eventa-DmQvmwYT.mjs";
1
+ import { n as EventTag } from "../../eventa-AJyw28P8.mjs";
2
2
 
3
3
  //#region src/adapters/websocket/shared.d.ts
4
4
  interface WebsocketPayload<T> {
@@ -1,5 +1,5 @@
1
- import { r as Eventa } from "../../../eventa-DmQvmwYT.mjs";
2
- import { t as EventContext } from "../../../context-CvPT-awQ.mjs";
1
+ import { r as Eventa } from "../../../eventa-AJyw28P8.mjs";
2
+ import { t as EventContext } from "../../../context-ZVv99bcM.mjs";
3
3
 
4
4
  //#region src/adapters/websocket/native/index.d.ts
5
5
  declare const wsConnectedEvent: Eventa<{
@@ -1,5 +1,5 @@
1
- import { a as defineEventa, c as matchBy, i as and, n as EventaFlowDirection, o as defineInboundEventa, s as defineOutboundEventa, t as createContext$1 } from "../../../context-Y8SMtoKx.mjs";
2
- import { n as parseWebsocketPayload, t as generateWebsocketPayload } from "../../../internal-mfpOkMuE.mjs";
1
+ import { a as defineEventa, c as matchBy, i as and, n as EventaFlowDirection, o as defineInboundEventa, s as defineOutboundEventa, t as createContext$1 } from "../../../context-ex8urwfs.mjs";
2
+ import { n as parseWebsocketPayload, t as generateWebsocketPayload } from "../../../internal-De3z6hO5.mjs";
3
3
 
4
4
  //#region src/adapters/websocket/native/index.ts
5
5
  const wsConnectedEvent = defineEventa();