@moeru/eventa 1.0.0-alpha.9 → 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 (54) hide show
  1. package/README.md +238 -1
  2. package/dist/adapters/broadcast-channel/index.d.mts +2 -2
  3. package/dist/adapters/broadcast-channel/index.mjs +2 -2
  4. package/dist/adapters/electron/main.d.mts +10 -3
  5. package/dist/adapters/electron/main.mjs +3 -3
  6. package/dist/adapters/electron/main.mjs.map +1 -1
  7. package/dist/adapters/electron/renderer.d.mts +2 -2
  8. package/dist/adapters/electron/renderer.mjs +3 -3
  9. package/dist/adapters/event-emitter/index.d.mts +2 -2
  10. package/dist/adapters/event-emitter/index.mjs +2 -2
  11. package/dist/adapters/event-target/index.d.mts +2 -2
  12. package/dist/adapters/event-target/index.mjs +2 -2
  13. package/dist/adapters/websocket/h3/index.d.mts +2 -2
  14. package/dist/adapters/websocket/h3/index.mjs +2 -2
  15. package/dist/adapters/websocket/h3/index.mjs.map +1 -1
  16. package/dist/adapters/websocket/index.d.mts +1 -1
  17. package/dist/adapters/websocket/native/index.d.mts +2 -2
  18. package/dist/adapters/websocket/native/index.mjs +2 -2
  19. package/dist/adapters/webworkers/index.d.mts +4 -43
  20. package/dist/adapters/webworkers/index.mjs +5 -4
  21. package/dist/adapters/webworkers/index.mjs.map +1 -1
  22. package/dist/adapters/webworkers/worker/index.d.mts +2 -1
  23. package/dist/adapters/webworkers/worker/index.mjs +4 -3
  24. package/dist/adapters/webworkers/worker/index.mjs.map +1 -1
  25. package/dist/adapters/worker-threads/index.d.mts +25 -0
  26. package/dist/adapters/worker-threads/index.mjs +43 -0
  27. package/dist/adapters/worker-threads/index.mjs.map +1 -0
  28. package/dist/adapters/worker-threads/worker/index.d.mts +26 -0
  29. package/dist/adapters/worker-threads/worker/index.mjs +46 -0
  30. package/dist/adapters/worker-threads/worker/index.mjs.map +1 -0
  31. package/dist/{context-C0RYgQg8.d.mts → context-ZVv99bcM.d.mts} +7 -4
  32. package/dist/{context-BygZzwvo.mjs → context-ex8urwfs.mjs} +1 -1
  33. package/dist/context-ex8urwfs.mjs.map +1 -0
  34. package/dist/{eventa-DWOtUOEf.d.mts → eventa-AJyw28P8.d.mts} +3 -2
  35. package/dist/index-CI_gUGXg.d.mts +522 -0
  36. package/dist/index.d.mts +4 -5
  37. package/dist/index.mjs +3 -3
  38. package/dist/{internal-C-bIJqJC.mjs → internal-De3z6hO5.mjs} +2 -2
  39. package/dist/{internal-C-bIJqJC.mjs.map → internal-De3z6hO5.mjs.map} +1 -1
  40. package/dist/{shared-BExRc0zC.mjs → shared-BZOulnwC.mjs} +2 -2
  41. package/dist/{shared-BExRc0zC.mjs.map → shared-BZOulnwC.mjs.map} +1 -1
  42. package/dist/{shared-DRAsaLuo.mjs → shared-BdqIf6iZ.mjs} +4 -10
  43. package/dist/shared-BdqIf6iZ.mjs.map +1 -0
  44. package/dist/{shared-Q10kRJA8.d.mts → shared-Cd4CLAdD.d.mts} +2 -2
  45. package/dist/shared-DgX1R_nY.d.mts +34 -0
  46. package/dist/src-DZ7si0kE.mjs +1169 -0
  47. package/dist/src-DZ7si0kE.mjs.map +1 -0
  48. package/package.json +19 -6
  49. package/dist/context-BygZzwvo.mjs.map +0 -1
  50. package/dist/index-DXQGU0bi.d.mts +0 -24
  51. package/dist/invoke-BB3tmZlr.d.mts +0 -137
  52. package/dist/shared-DRAsaLuo.mjs.map +0 -1
  53. package/dist/src-Bnf7MdlN.mjs +0 -284
  54. package/dist/src-Bnf7MdlN.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
@@ -1,5 +1,5 @@
1
- import { n as EventTag, s as EventaType } from "../../eventa-DWOtUOEf.mjs";
2
- import { t as EventContext } from "../../context-C0RYgQg8.mjs";
1
+ import { n as EventTag, s as EventaType } from "../../eventa-AJyw28P8.mjs";
2
+ import { t as EventContext } from "../../context-ZVv99bcM.mjs";
3
3
 
4
4
  //#region src/adapters/broadcast-channel/shared.d.ts
5
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-BygZzwvo.mjs";
2
- import "../../src-Bnf7MdlN.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/broadcast-channel/internal.ts
5
5
  function generatePayload(type, payload) {
@@ -1,5 +1,5 @@
1
- import { t as EventContext } from "../../context-C0RYgQg8.mjs";
2
- import { n as errorEvent, t as Payload } from "../../shared-Q10kRJA8.mjs";
1
+ import { t as EventContext } from "../../context-ZVv99bcM.mjs";
2
+ import { n as errorEvent, t as Payload } from "../../shared-Cd4CLAdD.mjs";
3
3
  import { BrowserWindow, IpcMain, IpcMainEvent } from "electron";
4
4
 
5
5
  //#region src/adapters/electron/main.d.ts
@@ -10,7 +10,14 @@ declare function createContext(ipcMain: IpcMain, window?: BrowserWindow, options
10
10
  extraListeners?: Record<string, (_: any, event: Event) => void | Promise<void>>;
11
11
  throwIfFailedToSend?: boolean;
12
12
  }): {
13
- context: EventContext<any, {
13
+ context: EventContext<{
14
+ invokeRequest?: {
15
+ raw?: {
16
+ ipcMainEvent: IpcMainEvent;
17
+ event: Event | unknown;
18
+ };
19
+ };
20
+ }, {
14
21
  raw: {
15
22
  ipcMainEvent: IpcMainEvent;
16
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-BygZzwvo.mjs";
2
- import "../../src-Bnf7MdlN.mjs";
3
- import { n as generatePayload, r as parsePayload, t as errorEvent } from "../../shared-BExRc0zC.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,5 +1,5 @@
1
- import { t as EventContext } from "../../context-C0RYgQg8.mjs";
2
- import { n as errorEvent, t as Payload } from "../../shared-Q10kRJA8.mjs";
1
+ import { t as EventContext } from "../../context-ZVv99bcM.mjs";
2
+ import { n as errorEvent, t as Payload } from "../../shared-Cd4CLAdD.mjs";
3
3
  import { IpcRenderer, IpcRendererListener } from "@electron-toolkit/preload";
4
4
 
5
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-BygZzwvo.mjs";
2
- import "../../src-Bnf7MdlN.mjs";
3
- import { n as generatePayload, r as parsePayload, t as errorEvent } from "../../shared-BExRc0zC.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,5 +1,5 @@
1
- import { n as EventTag, s as EventaType } from "../../eventa-DWOtUOEf.mjs";
2
- import { t as EventContext } from "../../context-C0RYgQg8.mjs";
1
+ import { n as EventTag, s as EventaType } from "../../eventa-AJyw28P8.mjs";
2
+ import { t as EventContext } from "../../context-ZVv99bcM.mjs";
3
3
 
4
4
  //#region src/adapters/event-emitter/shared.d.ts
5
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-BygZzwvo.mjs";
2
- import "../../src-Bnf7MdlN.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,5 +1,5 @@
1
- import { n as EventTag, s as EventaType } from "../../eventa-DWOtUOEf.mjs";
2
- import { t as EventContext } from "../../context-C0RYgQg8.mjs";
1
+ import { n as EventTag, s as EventaType } from "../../eventa-AJyw28P8.mjs";
2
+ import { t as EventContext } from "../../context-ZVv99bcM.mjs";
3
3
 
4
4
  //#region src/adapters/event-target/shared.d.ts
5
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-BygZzwvo.mjs";
2
- import "../../src-Bnf7MdlN.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-DWOtUOEf.mjs";
2
- import { t as EventContext } from "../../../context-C0RYgQg8.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-BygZzwvo.mjs";
2
- import { n as parseWebsocketPayload, t as generateWebsocketPayload } from "../../../internal-C-bIJqJC.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":";;;;AASA,MAAa,mBAAmB,aAA6B,6CAA6C;AAC1G,MAAa,sBAAsB,aAA6B,gDAAgD;AAChH,MAAa,eAAe,aAAiC,yCAAyC;AAEtG,SAAgB,sBAGd;CACA,MAAM,MAAMA,eAAmB;CAC/B,MAAM,wBAAQ,IAAI,KAAW;AAE7B,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,OAAK,MAAM,QAAQ,MACjB,MAAK,KAAK,KAAK;GAEjB;AAEF,QAAO;EACL,mBAAmB;GACjB,KAAK,MAAM;AACT,UAAM,IAAI,KAAK;AACf,QAAI,KAAK,kBAAkB,EAAE,IAAI,KAAK,IAAI,EAAE,EAAE,KAAK,EAAG,EAAE,CAAC;;GAG3D,MAAM,MAAM;AACV,UAAM,OAAO,KAAK;AAClB,QAAI,KAAK,qBAAqB,EAAE,IAAI,KAAK,IAAI,EAAE,EAAE,KAAK,EAAG,EAAE,CAAC;;GAG9D,MAAM,GAAG,OAAO;AACd,YAAQ,MAAM,oBAAoB,MAAM;AACxC,QAAI,KAAK,cAAc,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;;GAGvD,MAAM,QAAQ,GAAG,SAAS;AACxB,QAAI;KACF,MAAM,EAAE,MAAM,YAAY,sBAAmC,QAAQ,MAAM,CAAC;AAC5E,SAAI,KAAK,oBAAoB,KAAK,EAAE,QAAQ,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;aAElE,OAAO;AACZ,aAAQ,MAAM,sCAAsC,MAAM;AAC1D,SAAI,KAAK,cAAc,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;;;GAG5D;EACD,SAAS;EACV;;;;;AClDH,MAAaC,qBAAmB,aAA6B,2CAA2C;AACxG,MAAaC,wBAAsB,aAA6B,8CAA8C;AAC9G,MAAaC,iBAAe,aAAiC,uCAAuC;AAEpG,SAAgB,kBAAkB,MAGhC;CACA,MAAM,SAAS,KAAK;CACpB,MAAM,MAAMC,eAAmB;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,OAAK,KAAK,KAAK;GACf;AAEF,QAAO;EACL,OAAO,EACL,QAAQ,QAAM,SAAS;AACrB,OAAIC,OAAK,OAAO,OACd,KAAI;IACF,MAAM,EAAE,MAAM,YAAY,sBAAmC,QAAQ,MAAM,CAAC;AAC5E,QAAI,KAAK,oBAAoB,KAAK,EAAE,QAAQ,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;YAElE,OAAO;AACZ,YAAQ,MAAM,sCAAsC,MAAM;AAC1D,QAAI,KAAKF,gBAAc,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;;KAI9D;EACD,SAAS;EACV;;AAKH,SAAgB,kBAA2F;CACzG,IAAIG;CACJ,MAAM,yBAAyB,IAAI,SAAsB,MAAM;AAC7D,YAAU;GACV;CAEF,IAAIC;AAeJ,QAAO;EAAE,OAbsC;GAC7C,OAAO,SAAS;IACd,MAAM,EAAE,SAAS,UAAU,kBAAkB,KAAK;AAClD,cAAU,MAAM;AAChB,YAAQ;KAAE;KAAM;KAAS,CAAC;;GAE5B,UAAU,MAAM,QAAQ;AACtB,QAAI,WAAW,KACb,SAAQ,MAAM,IAAI;;GAGvB;EAEe;EAAwB"}
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-DWOtUOEf.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-DWOtUOEf.mjs";
2
- import { t as EventContext } from "../../../context-C0RYgQg8.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-BygZzwvo.mjs";
2
- import { n as parseWebsocketPayload, t as generateWebsocketPayload } from "../../../internal-C-bIJqJC.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();
@@ -1,46 +1,6 @@
1
- import { n as EventTag, r as Eventa } from "../../eventa-DWOtUOEf.mjs";
2
- import { t as EventContext } from "../../context-C0RYgQg8.mjs";
3
- import { t as ExtendableInvokeResponse } from "../../invoke-BB3tmZlr.mjs";
1
+ import { t as EventContext } from "../../context-ZVv99bcM.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-DgX1R_nY.mjs";
4
3
 
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
4
  //#region src/adapters/webworkers/index.d.ts
45
5
  declare function createContext(worker: Worker): {
46
6
  context: EventContext<{
@@ -56,8 +16,9 @@ declare function createContext(worker: Worker): {
56
16
  error?: ErrorEvent;
57
17
  messageError?: MessageEvent;
58
18
  };
19
+ transfer?: Transferable[];
59
20
  }>;
60
21
  };
61
22
  //#endregion
62
- export { WithTransfer, WorkerEventa, WorkerPayload, createContext, defineOutboundWorkerEventa, defineWorkerEventa, isWorkerEventa, normalizeOnListenerParameters, withTransfer, workerErrorEvent, workerMessageErrorEvent };
23
+ export { WorkerEventa, WorkerPayload, createContext, defineOutboundWorkerEventa, defineWorkerEventa, isWorkerEventa, normalizeOnListenerParameters, workerErrorEvent, workerMessageErrorEvent };
63
24
  //# sourceMappingURL=index.d.mts.map
@@ -1,10 +1,11 @@
1
- import { c as matchBy, i as and, n as EventaFlowDirection, o as defineInboundEventa, s as defineOutboundEventa, t as createContext$1 } from "../../context-BygZzwvo.mjs";
2
- import "../../src-Bnf7MdlN.mjs";
3
- import { a as withTransfer, c as parseWorkerPayload, i as normalizeOnListenerParameters, n as defineWorkerEventa, o as workerErrorEvent, r as isWorkerEventa, s as generateWorkerPayload, t as defineOutboundWorkerEventa } from "../../shared-DRAsaLuo.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 { E as registerInvokeAbortEventListeners } from "../../src-DZ7si0kE.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-BdqIf6iZ.mjs";
4
4
 
5
5
  //#region src/adapters/webworkers/index.ts
6
6
  function createContext(worker) {
7
7
  const ctx = createContext$1();
8
+ registerInvokeAbortEventListeners(ctx, workerErrorEvent);
8
9
  ctx.on(and(matchBy((e) => e._flowDirection === EventaFlowDirection.Outbound || !e._flowDirection), matchBy("*")), (event, options) => {
9
10
  const { body, transfer } = normalizeOnListenerParameters(event, options);
10
11
  const data = generateWorkerPayload(event.id, {
@@ -38,5 +39,5 @@ function createContext(worker) {
38
39
  }
39
40
 
40
41
  //#endregion
41
- export { createContext, defineOutboundWorkerEventa, defineWorkerEventa, isWorkerEventa, withTransfer };
42
+ export { createContext, defineOutboundWorkerEventa, defineWorkerEventa, isWorkerEventa };
42
43
  //# sourceMappingURL=index.mjs.map
@@ -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 { 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"}
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,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"}
@@ -1,4 +1,4 @@
1
- import { t as EventContext } from "../../../context-C0RYgQg8.mjs";
1
+ import { t as EventContext } from "../../../context-ZVv99bcM.mjs";
2
2
 
3
3
  //#region src/adapters/webworkers/worker/index.d.ts
4
4
  declare function createContext(options?: {
@@ -16,6 +16,7 @@ declare function createContext(options?: {
16
16
  event?: any;
17
17
  error?: string | Event;
18
18
  };
19
+ transfer?: Transferable[];
19
20
  }>;
20
21
  };
21
22
  //#endregion
@@ -1,11 +1,12 @@
1
- import { c as matchBy, i as and, n as EventaFlowDirection, o as defineInboundEventa, s as defineOutboundEventa, t as createContext$1 } from "../../../context-BygZzwvo.mjs";
2
- import "../../../src-Bnf7MdlN.mjs";
3
- import { c as parseWorkerPayload, i as normalizeOnListenerParameters, o as workerErrorEvent, r as isWorkerEventa, s as generateWorkerPayload } from "../../../shared-DRAsaLuo.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 { E as registerInvokeAbortEventListeners } from "../../../src-DZ7si0kE.mjs";
3
+ import { a as workerErrorEvent, i as normalizeOnListenerParameters, o as generateWorkerPayload, r as isWorkerEventa, s as parseWorkerPayload } from "../../../shared-BdqIf6iZ.mjs";
4
4
 
5
5
  //#region src/adapters/webworkers/worker/index.ts
6
6
  function createContext(options) {
7
7
  const { messagePort = self } = options || {};
8
8
  const ctx = createContext$1();
9
+ registerInvokeAbortEventListeners(ctx, workerErrorEvent);
9
10
  ctx.on(and(matchBy((e) => e._flowDirection === EventaFlowDirection.Outbound || !e._flowDirection), matchBy("*")), (event, options$1) => {
10
11
  const { body, transfer } = normalizeOnListenerParameters(event, options$1);
11
12
  const data = generateWorkerPayload(event.id, {