@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.
- package/README.md +238 -1
- package/dist/adapters/broadcast-channel/index.d.mts +48 -0
- package/dist/adapters/broadcast-channel/index.mjs +62 -0
- package/dist/adapters/broadcast-channel/index.mjs.map +1 -0
- package/dist/adapters/electron/main.d.mts +10 -6
- package/dist/adapters/electron/main.mjs +3 -3
- package/dist/adapters/electron/main.mjs.map +1 -1
- package/dist/adapters/electron/renderer.d.mts +2 -5
- package/dist/adapters/electron/renderer.mjs +3 -3
- package/dist/adapters/event-emitter/index.d.mts +2 -4
- package/dist/adapters/event-emitter/index.mjs +2 -2
- package/dist/adapters/event-target/index.d.mts +2 -4
- package/dist/adapters/event-target/index.mjs +2 -2
- package/dist/adapters/websocket/h3/index.d.mts +2 -2
- package/dist/adapters/websocket/h3/index.mjs +2 -2
- package/dist/adapters/websocket/h3/index.mjs.map +1 -1
- package/dist/adapters/websocket/index.d.mts +1 -1
- package/dist/adapters/websocket/native/index.d.mts +2 -2
- package/dist/adapters/websocket/native/index.mjs +2 -2
- package/dist/adapters/webworkers/index.d.mts +4 -43
- package/dist/adapters/webworkers/index.mjs +5 -4
- package/dist/adapters/webworkers/index.mjs.map +1 -1
- package/dist/adapters/webworkers/worker/index.d.mts +2 -2
- package/dist/adapters/webworkers/worker/index.mjs +4 -3
- package/dist/adapters/webworkers/worker/index.mjs.map +1 -1
- package/dist/adapters/worker-threads/index.d.mts +25 -0
- package/dist/adapters/worker-threads/index.mjs +43 -0
- package/dist/adapters/worker-threads/index.mjs.map +1 -0
- package/dist/adapters/worker-threads/worker/index.d.mts +26 -0
- package/dist/adapters/worker-threads/worker/index.mjs +46 -0
- package/dist/adapters/worker-threads/worker/index.mjs.map +1 -0
- package/dist/{context-CvPT-awQ.d.mts → context-ZVv99bcM.d.mts} +7 -4
- package/dist/{context-Y8SMtoKx.mjs → context-ex8urwfs.mjs} +1 -1
- package/dist/context-ex8urwfs.mjs.map +1 -0
- package/dist/{eventa-DmQvmwYT.d.mts → eventa-AJyw28P8.d.mts} +3 -2
- package/dist/index-CI_gUGXg.d.mts +522 -0
- package/dist/index.d.mts +4 -5
- package/dist/index.mjs +3 -3
- package/dist/{internal-mfpOkMuE.mjs → internal-De3z6hO5.mjs} +2 -2
- package/dist/{internal-mfpOkMuE.mjs.map → internal-De3z6hO5.mjs.map} +1 -1
- package/dist/{shared-ZN4ksxrB.mjs → shared-BZOulnwC.mjs} +2 -2
- package/dist/{shared-ZN4ksxrB.mjs.map → shared-BZOulnwC.mjs.map} +1 -1
- package/dist/{shared-DQmSel5n.mjs → shared-BdqIf6iZ.mjs} +4 -10
- package/dist/shared-BdqIf6iZ.mjs.map +1 -0
- package/dist/{shared-5hbiyQt-.d.mts → shared-Cd4CLAdD.d.mts} +2 -2
- package/dist/shared-DgX1R_nY.d.mts +34 -0
- package/dist/src-DZ7si0kE.mjs +1169 -0
- package/dist/src-DZ7si0kE.mjs.map +1 -0
- package/package.json +28 -10
- package/dist/context-Y8SMtoKx.mjs.map +0 -1
- package/dist/index-NaTw0d4N.d.mts +0 -24
- package/dist/invoke-CBQuKH1-.d.mts +0 -137
- package/dist/shared-DQmSel5n.mjs.map +0 -1
- package/dist/src-CSnWn9Kk.mjs +0 -284
- 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 "../../
|
|
2
|
-
import { t as
|
|
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<
|
|
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-
|
|
2
|
-
import "../../src-
|
|
3
|
-
import { n as generatePayload, r as parsePayload, t as errorEvent } from "../../shared-
|
|
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
|
|
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 "../../
|
|
2
|
-
import { t as
|
|
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-
|
|
2
|
-
import "../../src-
|
|
3
|
-
import { n as generatePayload, r as parsePayload, t as errorEvent } from "../../shared-
|
|
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-
|
|
2
|
-
import { t as EventContext } from "../../context-
|
|
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-
|
|
2
|
-
import "../../src-
|
|
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-
|
|
2
|
-
import { t as EventContext } from "../../context-
|
|
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-
|
|
2
|
-
import "../../src-
|
|
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-
|
|
2
|
-
import { t as EventContext } from "../../../context-
|
|
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-
|
|
2
|
-
import { n as parseWebsocketPayload, t as generateWebsocketPayload } from "../../../internal-
|
|
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,
|
|
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,5 +1,5 @@
|
|
|
1
|
-
import { r as Eventa } from "../../../eventa-
|
|
2
|
-
import { t as EventContext } from "../../../context-
|
|
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-
|
|
2
|
-
import { n as parseWebsocketPayload, t as generateWebsocketPayload } from "../../../internal-
|
|
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();
|