@moeru/eventa 1.0.0-beta.1 → 1.0.0-beta.2

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 CHANGED
@@ -23,6 +23,14 @@ ni @moeru/eventa
23
23
  yarn add @moeru/eventa
24
24
  ```
25
25
 
26
+ ### Agent Skills
27
+
28
+ Install the [eventa skill](https://skills.sh) to your AI coding agent:
29
+
30
+ ```sh
31
+ npx skills add moeru-ai/eventa
32
+ ```
33
+
26
34
  ## Getting Started
27
35
 
28
36
  ### Event
@@ -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-ex8urwfs.mjs";
2
- import "../../src-DZ7si0kE.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-BMDJMapI.mjs";
2
+ import "../../src-eMqISeHo.mjs";
3
3
 
4
4
  //#region src/adapters/broadcast-channel/internal.ts
5
5
  function generatePayload(type, payload) {
@@ -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-ex8urwfs.mjs";
2
- import "../../src-DZ7si0kE.mjs";
3
- import { n as generatePayload, r as parsePayload, t as errorEvent } from "../../shared-BZOulnwC.mjs";
1
+ import { c as matchBy, i as and, n as EventaFlowDirection, o as defineInboundEventa, s as defineOutboundEventa, t as createContext$1 } from "../../context-BMDJMapI.mjs";
2
+ import "../../src-eMqISeHo.mjs";
3
+ import { n as generatePayload, r as parsePayload, t as errorEvent } from "../../shared-CA_i_yfR.mjs";
4
4
 
5
5
  //#region src/adapters/electron/main.ts
6
6
  function withRemoval(ipcMain, type, listener) {
@@ -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-ex8urwfs.mjs";
2
- import "../../src-DZ7si0kE.mjs";
3
- import { n as generatePayload, r as parsePayload, t as errorEvent } from "../../shared-BZOulnwC.mjs";
1
+ import { c as matchBy, i as and, n as EventaFlowDirection, o as defineInboundEventa, s as defineOutboundEventa, t as createContext$1 } from "../../context-BMDJMapI.mjs";
2
+ import "../../src-eMqISeHo.mjs";
3
+ import { n as generatePayload, r as parsePayload, t as errorEvent } from "../../shared-CA_i_yfR.mjs";
4
4
 
5
5
  //#region src/adapters/electron/renderer.ts
6
6
  function createContext(ipcRenderer, options) {
@@ -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-ex8urwfs.mjs";
2
- import "../../src-DZ7si0kE.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-BMDJMapI.mjs";
2
+ import "../../src-eMqISeHo.mjs";
3
3
 
4
4
  //#region src/adapters/event-emitter/internal.ts
5
5
  function generatePayload(type, payload) {
@@ -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-ex8urwfs.mjs";
2
- import "../../src-DZ7si0kE.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-BMDJMapI.mjs";
2
+ import "../../src-eMqISeHo.mjs";
3
3
 
4
4
  //#region src/adapters/event-target/internal.ts
5
5
  function generateCustomEventDetail(type, payload) {
@@ -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-ex8urwfs.mjs";
2
- import { n as parseWebsocketPayload, t as generateWebsocketPayload } from "../../../internal-De3z6hO5.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-BMDJMapI.mjs";
2
+ import { n as parseWebsocketPayload, t as generateWebsocketPayload } from "../../../internal-ChLglF1N.mjs";
3
3
 
4
4
  //#region src/adapters/websocket/h3/global.ts
5
5
  const wsConnectedEvent = defineEventa("eventa:adapters:websocket-global:connected");
@@ -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-ex8urwfs.mjs";
2
- import { n as parseWebsocketPayload, t as generateWebsocketPayload } from "../../../internal-De3z6hO5.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-BMDJMapI.mjs";
2
+ import { n as parseWebsocketPayload, t as generateWebsocketPayload } from "../../../internal-ChLglF1N.mjs";
3
3
 
4
4
  //#region src/adapters/websocket/native/index.ts
5
5
  const wsConnectedEvent = defineEventa();
@@ -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-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";
1
+ import { c as matchBy, i as and, n as EventaFlowDirection, o as defineInboundEventa, s as defineOutboundEventa, t as createContext$1 } from "../../context-BMDJMapI.mjs";
2
+ import { E as registerInvokeAbortEventListeners } from "../../src-eMqISeHo.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-CRxfs1TC.mjs";
4
4
 
5
5
  //#region src/adapters/webworkers/index.ts
6
6
  function createContext(worker) {
@@ -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-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";
1
+ import { c as matchBy, i as and, n as EventaFlowDirection, o as defineInboundEventa, s as defineOutboundEventa, t as createContext$1 } from "../../../context-BMDJMapI.mjs";
2
+ import { E as registerInvokeAbortEventListeners } from "../../../src-eMqISeHo.mjs";
3
+ import { a as workerErrorEvent, i as normalizeOnListenerParameters, o as generateWorkerPayload, r as isWorkerEventa, s as parseWorkerPayload } from "../../../shared-CRxfs1TC.mjs";
4
4
 
5
5
  //#region src/adapters/webworkers/worker/index.ts
6
6
  function createContext(options) {
@@ -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-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";
1
+ import { c as matchBy, i as and, n as EventaFlowDirection, o as defineInboundEventa, s as defineOutboundEventa, t as createContext$1 } from "../../context-BMDJMapI.mjs";
2
+ import { E as registerInvokeAbortEventListeners } from "../../src-eMqISeHo.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-CRxfs1TC.mjs";
4
4
 
5
5
  //#region src/adapters/worker-threads/index.ts
6
6
  function createContext(worker) {
@@ -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-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";
1
+ import { c as matchBy, i as and, n as EventaFlowDirection, o as defineInboundEventa, s as defineOutboundEventa, t as createContext$1 } from "../../../context-BMDJMapI.mjs";
2
+ import { E as registerInvokeAbortEventListeners } from "../../../src-eMqISeHo.mjs";
3
+ import { a as workerErrorEvent, i as normalizeOnListenerParameters, o as generateWorkerPayload, r as isWorkerEventa, s as parseWorkerPayload } from "../../../shared-CRxfs1TC.mjs";
4
4
  import { parentPort } from "node:worker_threads";
5
5
 
6
6
  //#region src/adapters/worker-threads/worker/index.ts
@@ -1,5 +1,5 @@
1
1
  import isGlobMatch from "picomatch";
2
- import { customAlphabet } from "nanoid";
2
+ import { customAlphabet } from "nanoid/non-secure";
3
3
 
4
4
  //#region src/eventa.ts
5
5
  function nanoid() {
@@ -188,4 +188,4 @@ function createContext(props = {}) {
188
188
 
189
189
  //#endregion
190
190
  export { defineEventa as a, matchBy as c, and as i, nanoid as l, EventaFlowDirection as n, defineInboundEventa as o, EventaType as r, defineOutboundEventa as s, createContext as t, or as u };
191
- //# sourceMappingURL=context-ex8urwfs.mjs.map
191
+ //# sourceMappingURL=context-BMDJMapI.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-BMDJMapI.mjs","names":["matcher: (event: E) => boolean | Promise<boolean>"],"sources":["../src/eventa.ts","../src/context.ts"],"sourcesContent":["import isGlobMatch from 'picomatch'\n\nimport { customAlphabet } from 'nanoid/non-secure'\n\nexport function nanoid() {\n return customAlphabet('0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz', 16)()\n}\n\nexport interface InvokeEventConstraint<_Req, _Res> {}\n\nexport type EventTag<Res, Req> = string & InvokeEventConstraint<Req, Res>\n\nexport enum EventaType {\n Event = 'event',\n MatchExpression = 'matchExpression',\n}\n\nexport enum EventaFlowDirection {\n Inbound = 'inbound',\n Outbound = 'outbound',\n}\n\nexport interface DirectionalEventa<P, T = undefined> extends Eventa<P> {\n _flowDirection: EventaFlowDirection | T\n}\n\nexport interface InboundEventa<T> extends DirectionalEventa<T> {\n _flowDirection: EventaFlowDirection.Inbound\n}\n\nexport interface OutboundEventa<T> extends DirectionalEventa<T> {\n _flowDirection: EventaFlowDirection.Outbound\n}\n\nexport function defineInboundEventa<T>(id?: string): InboundEventa<T> {\n return {\n ...defineEventa<T>(id),\n _flowDirection: EventaFlowDirection.Inbound,\n } as InboundEventa<T>\n}\n\nexport function defineOutboundEventa<T>(id?: string): OutboundEventa<T> {\n return {\n ...defineEventa<T>(id),\n _flowDirection: EventaFlowDirection.Outbound,\n } as OutboundEventa<T>\n}\n\n// type ServerInvokeHandlerEvent<Req, Res> = symbol & InvokeEventConstraint<Req, Res>\n// type ClientInvoke<Req> = symbol & InvokeEventConstraint<Req, null>\n\nexport interface EventaLike<_P = undefined, T extends EventaType = EventaType> {\n id: string\n type?: T\n}\n\nexport interface Eventa<P = unknown> extends EventaLike<P, EventaType.Event> {\n body?: P\n}\n\nexport type InferEventaPayload<E> = E extends Eventa<infer P> ? P : never\n\nexport function defineEventa<P = undefined>(id?: string): Eventa<P> {\n if (!id) {\n id = nanoid()\n }\n\n return {\n id,\n type: EventaType.Event,\n }\n}\n\nexport interface EventaMatchExpression<P = undefined> extends EventaLike<P, EventaType.MatchExpression> {\n matcher?: (event: Eventa<P>) => boolean | Promise<boolean>\n}\n\nexport function and<P>(...matchExpression: Array<EventaMatchExpression<P>>): EventaMatchExpression<P> {\n return {\n id: nanoid(),\n type: EventaType.MatchExpression,\n matcher: (event: Eventa<P>) => {\n return matchExpression.every(m => m.matcher ? m.matcher(event) : false)\n },\n }\n}\n\nexport function or<P>(...matchExpression: Array<EventaMatchExpression<P>>): EventaMatchExpression<P> {\n return {\n id: nanoid(),\n type: EventaType.MatchExpression,\n matcher: (event: Eventa<P>) => {\n return matchExpression.some(m => m.matcher ? m.matcher(event) : false)\n },\n }\n}\n\nexport function matchBy<P = undefined>(glob: string, inverted?: boolean): EventaMatchExpression<P>\nexport function matchBy<P = undefined>(options: { ids: string[] }, inverted?: boolean): EventaMatchExpression<P>\nexport function matchBy<P = undefined>(options: { eventa: Eventa<P>[] }, inverted?: boolean): EventaMatchExpression<P>\nexport function matchBy<P = undefined>(options: { types: EventaType[] }, inverted?: boolean): EventaMatchExpression<P>\nexport function matchBy<P = undefined>(regExp: RegExp, inverted?: boolean): EventaMatchExpression<P>\nexport function matchBy<P = undefined, E extends Eventa<P> = Eventa<P>>(matcher: (event: E) => boolean | Promise<boolean>): EventaMatchExpression<P>\nexport function matchBy<P = undefined, E extends Eventa<P> = Eventa<P>>(\n matchExpressionPossibleValues:\n | string\n | Eventa<any>\n | { ids: string[] }\n | { eventa: Eventa<P>[] }\n | { types: EventaType[] }\n | RegExp\n | ((event: E) => boolean | Promise<boolean>),\n inverted?: boolean,\n): EventaMatchExpression<P> {\n const id = nanoid()\n\n let matcher: (event: E) => boolean | Promise<boolean> = () => false\n if (typeof matchExpressionPossibleValues === 'string') {\n matcher = (eventa) => {\n return isGlobMatch(matchExpressionPossibleValues)(eventa.id)\n }\n }\n else if (typeof matchExpressionPossibleValues === 'object') {\n if ('ids' in matchExpressionPossibleValues) {\n matcher = (event: Eventa<P>) => {\n if (inverted) {\n return !matchExpressionPossibleValues.ids.includes(event.id)\n }\n\n return matchExpressionPossibleValues.ids.includes(event.id)\n }\n }\n else if ('eventa' in matchExpressionPossibleValues) {\n matcher = (event: Eventa<P>) => {\n if (inverted) {\n return !matchExpressionPossibleValues.eventa.some(e => e.id === event.id)\n }\n\n return matchExpressionPossibleValues.eventa.some(e => e.id === event.id)\n }\n }\n else if ('types' in matchExpressionPossibleValues) {\n matcher = (event: Eventa<P>) => {\n if (typeof event.type === 'undefined') {\n return false\n }\n if (inverted) {\n return !matchExpressionPossibleValues.types.includes(event.type)\n }\n\n return matchExpressionPossibleValues.types.includes(event.type)\n }\n }\n }\n else if (matchExpressionPossibleValues instanceof RegExp) {\n matcher = (event: Eventa<P>) => {\n if (inverted) {\n return !matchExpressionPossibleValues.test(event.id)\n }\n\n return matchExpressionPossibleValues.test(event.id)\n }\n }\n else if (typeof matchExpressionPossibleValues === 'function') {\n matcher = matchExpressionPossibleValues\n }\n\n return {\n id,\n type: EventaType.MatchExpression,\n matcher,\n } satisfies EventaMatchExpression<P>\n}\n","import type { EventaAdapter } from './context-hooks'\nimport type { Eventa, EventaMatchExpression, EventTag } from './eventa'\n\nimport { EventaType } from './eventa'\n\ninterface CreateContextProps<EmitOptions = any> {\n adapter?: EventaAdapter<EmitOptions>\n}\n\nexport function createContext<Extensions = any, Options = { raw?: any }>(props: CreateContextProps<Options> = {}): EventContext<Extensions, Options> {\n const listeners = new Map<EventTag<any, any>, Set<(params: any, options?: Options) => any>>()\n const onceListeners = new Map<EventTag<any, any>, Set<(params: any, options?: Options) => any>>()\n\n const matchExpressions = new Map<string, EventaMatchExpression<any>>()\n const matchExpressionListeners = new Map<string, Set<(params: any, options?: Options) => any>>()\n const matchExpressionOnceListeners = new Map<string, Set<(params: any, options?: Options) => any>>()\n\n const hooks = props.adapter?.(emit).hooks\n\n function emit<P>(event: Eventa<P>, payload: P, options?: Options) {\n const emittingPayload = { ...event, body: payload }\n\n for (const listener of listeners.get(event.id) || []) {\n listener(emittingPayload, options)\n hooks?.onReceived?.(event.id, emittingPayload)\n }\n\n for (const onceListener of onceListeners.get(event.id) || []) {\n onceListener(emittingPayload, options)\n hooks?.onReceived?.(event.id, emittingPayload)\n onceListeners.get(event.id)?.delete(onceListener)\n }\n\n for (const matchExpression of matchExpressions.values()) {\n if (matchExpression.matcher) {\n const match = matchExpression.matcher(emittingPayload)\n if (!match) {\n continue\n }\n\n for (const listener of matchExpressionListeners.get(matchExpression.id) || []) {\n listener(emittingPayload, options)\n hooks?.onReceived?.(matchExpression.id, emittingPayload)\n }\n for (const onceListener of matchExpressionOnceListeners.get(matchExpression.id) || []) {\n onceListener(emittingPayload, options)\n hooks?.onReceived?.(matchExpression.id, emittingPayload)\n matchExpressionOnceListeners.get(matchExpression.id)?.delete(onceListener)\n }\n }\n }\n\n hooks?.onSent(event.id, emittingPayload, options)\n }\n\n return {\n get listeners() {\n return listeners\n },\n\n get onceListeners() {\n return onceListeners\n },\n\n emit,\n\n on<P>(eventOrMatchExpression: Eventa<P> | EventaMatchExpression<P>, handler: (payload: Eventa<P>, options?: Options) => void): () => void {\n if (eventOrMatchExpression.type === EventaType.Event) {\n const event = eventOrMatchExpression as Eventa<P>\n if (!listeners.has(event.id)) {\n listeners.set(event.id, new Set())\n }\n\n listeners.get(event.id)?.add(handler)\n\n return () => listeners.get(event.id)?.delete(handler)\n }\n\n if (eventOrMatchExpression.type === EventaType.MatchExpression) {\n const matchExpression = eventOrMatchExpression as EventaMatchExpression<P>\n if (!matchExpressions.has(matchExpression.id)) {\n matchExpressions.set(matchExpression.id, matchExpression as EventaMatchExpression<P>)\n }\n if (!matchExpressionListeners.has(matchExpression.id)) {\n matchExpressionListeners.set(matchExpression.id, new Set())\n }\n\n matchExpressionListeners.get(matchExpression.id)?.add(handler)\n\n return () => matchExpressionListeners.get(matchExpression.id)?.delete(handler)\n }\n\n return () => void 0\n },\n\n once<P>(eventOrMatchExpression: Eventa<P> | EventaMatchExpression<P>, handler: (payload: Eventa<P>, options?: Options) => void): () => void {\n if (eventOrMatchExpression.type === EventaType.Event) {\n const event = eventOrMatchExpression as Eventa<P>\n if (!onceListeners.has(event.id)) {\n onceListeners.set(event.id, new Set())\n }\n\n onceListeners.get(event.id)?.add(handler)\n\n return () => onceListeners.get(event.id)?.delete(handler)\n }\n\n if (eventOrMatchExpression.type === EventaType.MatchExpression) {\n const matchExpression = eventOrMatchExpression as EventaMatchExpression<P>\n if (!matchExpressions.has(matchExpression.id)) {\n matchExpressions.set(matchExpression.id, matchExpression as EventaMatchExpression<P>)\n }\n if (!matchExpressionListeners.has(matchExpression.id)) {\n matchExpressionListeners.set(matchExpression.id, new Set())\n }\n\n matchExpressionOnceListeners.get(matchExpression.id)?.add(handler)\n\n return () => matchExpressionOnceListeners.get(matchExpression.id)?.delete(handler)\n }\n\n return () => void 0\n },\n\n off<P>(eventOrMatchExpression: Eventa<P> | EventaMatchExpression<P>, handler?: (payload: Eventa<P>, options?: Options) => void) {\n switch (eventOrMatchExpression.type) {\n case EventaType.Event:\n if (handler !== undefined) {\n listeners.get(eventOrMatchExpression.id)?.delete(handler)\n onceListeners.get(eventOrMatchExpression.id)?.delete(handler)\n break\n }\n\n listeners.delete(eventOrMatchExpression.id)\n onceListeners.delete(eventOrMatchExpression.id)\n break\n case EventaType.MatchExpression:\n if (handler !== undefined) {\n matchExpressionListeners.get(eventOrMatchExpression.id)?.delete(handler)\n matchExpressionOnceListeners.get(eventOrMatchExpression.id)?.delete(handler)\n break\n }\n\n matchExpressionListeners.delete(eventOrMatchExpression.id)\n matchExpressionOnceListeners.delete(eventOrMatchExpression.id)\n break\n }\n },\n }\n}\n\nexport interface EventContext<Extensions = undefined, EmitOptions = undefined> {\n listeners: Map<EventTag<any, any>, Set<(params: any) => any>>\n onceListeners: Map<EventTag<any, any>, Set<(params: any) => any>>\n\n emit: <P>(event: Eventa<P>, payload: P, options?: EmitOptions) => void\n on: <P>(eventOrMatchExpression: Eventa<P> | EventaMatchExpression<P>, handler: (payload: Eventa<P>, options?: EmitOptions) => void) => () => void\n once: <P>(eventOrMatchExpression: Eventa<P> | EventaMatchExpression<P>, handler: (payload: Eventa<P>, options?: EmitOptions) => void) => () => void\n off: <P>(eventOrMatchExpression: Eventa<P> | EventaMatchExpression<P>, handler?: (payload: Eventa<P>, options?: EmitOptions) => void) => void\n\n /**\n * Extensions (adapter-specific).\n *\n * Known usage: webworkers/worker-threads populate internal invoke config via\n * `extensions.__internal.invoke` to abort pending invokes on fatal errors.\n */\n extensions?: Extensions\n}\n\nexport type EventContextEmitFn = EventContext['emit']\n"],"mappings":"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"}
package/dist/index.mjs CHANGED
@@ -1,4 +1,4 @@
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, u as or } from "./context-ex8urwfs.mjs";
2
- import { C as isInvokeEventa, S as defineInvokeEventa, T as isSendEvent, _ as isAbortError, a as withRemoteMethods, b as randomBetween, c as defineInvokeHandler, d as isExtendableInvokeResponseLike, f as undefineInvokeHandler, g as createUntilTriggeredOnce, h as createUntilTriggered, i as createRemoteMethodTagPrefix, l as defineInvokeHandlers, m as createUntil, n as defineStreamInvokeHandler, o as withTransfer, p as createAbortError, r as toStreamHandler, s as defineInvoke, t as defineStreamInvoke, u as defineInvokes, v as isAsyncIterable, w as isReceiveEvent, x as InvokeEventType, y as isReadableStream } from "./src-DZ7si0kE.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, u as or } from "./context-BMDJMapI.mjs";
2
+ import { C as isInvokeEventa, S as defineInvokeEventa, T as isSendEvent, _ as isAbortError, a as withRemoteMethods, b as randomBetween, c as defineInvokeHandler, d as isExtendableInvokeResponseLike, f as undefineInvokeHandler, g as createUntilTriggeredOnce, h as createUntilTriggered, i as createRemoteMethodTagPrefix, l as defineInvokeHandlers, m as createUntil, n as defineStreamInvokeHandler, o as withTransfer, p as createAbortError, r as toStreamHandler, s as defineInvoke, t as defineStreamInvoke, u as defineInvokes, v as isAsyncIterable, w as isReceiveEvent, x as InvokeEventType, y as isReadableStream } from "./src-eMqISeHo.mjs";
3
3
 
4
4
  export { EventaFlowDirection, EventaType, InvokeEventType, and, createAbortError, createContext, createRemoteMethodTagPrefix, createUntil, createUntilTriggered, createUntilTriggeredOnce, defineEventa, defineInboundEventa, defineInvoke, defineInvokeEventa, defineInvokeHandler, defineInvokeHandlers, defineInvokes, defineOutboundEventa, defineStreamInvoke, defineStreamInvokeHandler, isAbortError, isAsyncIterable, isExtendableInvokeResponseLike, isInvokeEventa, isReadableStream, isReceiveEvent, isSendEvent, matchBy, nanoid, or, randomBetween, toStreamHandler, undefineInvokeHandler, withRemoteMethods, withTransfer };
@@ -1,4 +1,4 @@
1
- import { l as nanoid } from "./context-ex8urwfs.mjs";
1
+ import { l as nanoid } from "./context-BMDJMapI.mjs";
2
2
 
3
3
  //#region src/adapters/websocket/internal.ts
4
4
  function generateWebsocketPayload(type, payload) {
@@ -15,4 +15,4 @@ function parseWebsocketPayload(data) {
15
15
 
16
16
  //#endregion
17
17
  export { parseWebsocketPayload as n, generateWebsocketPayload as t };
18
- //# sourceMappingURL=internal-De3z6hO5.mjs.map
18
+ //# sourceMappingURL=internal-ChLglF1N.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"internal-De3z6hO5.mjs","names":[],"sources":["../src/adapters/websocket/internal.ts"],"sourcesContent":["import type { EventTag } from '../../eventa'\nimport type { WebsocketPayload } from './shared'\n\nimport { nanoid } from '../../eventa'\n\nexport function generateWebsocketPayload<T>(type: EventTag<any, any>, payload: T): WebsocketPayload<T> {\n return {\n id: nanoid(),\n type,\n payload,\n timestamp: Date.now(),\n }\n}\n\nexport function parseWebsocketPayload<T>(data: string): WebsocketPayload<T> {\n return JSON.parse(data) as WebsocketPayload<T>\n}\n"],"mappings":";;;AAKA,SAAgB,yBAA4B,MAA0B,SAAiC;AACrG,QAAO;EACL,IAAI,QAAQ;EACZ;EACA;EACA,WAAW,KAAK,KAAK;EACtB;;AAGH,SAAgB,sBAAyB,MAAmC;AAC1E,QAAO,KAAK,MAAM,KAAK"}
1
+ {"version":3,"file":"internal-ChLglF1N.mjs","names":[],"sources":["../src/adapters/websocket/internal.ts"],"sourcesContent":["import type { EventTag } from '../../eventa'\nimport type { WebsocketPayload } from './shared'\n\nimport { nanoid } from '../../eventa'\n\nexport function generateWebsocketPayload<T>(type: EventTag<any, any>, payload: T): WebsocketPayload<T> {\n return {\n id: nanoid(),\n type,\n payload,\n timestamp: Date.now(),\n }\n}\n\nexport function parseWebsocketPayload<T>(data: string): WebsocketPayload<T> {\n return JSON.parse(data) as WebsocketPayload<T>\n}\n"],"mappings":";;;AAKA,SAAgB,yBAA4B,MAA0B,SAAiC;AACrG,QAAO;EACL,IAAI,QAAQ;EACZ;EACA;EACA,WAAW,KAAK,KAAK;EACtB;;AAGH,SAAgB,sBAAyB,MAAmC;AAC1E,QAAO,KAAK,MAAM,KAAK"}
@@ -1,4 +1,4 @@
1
- import { a as defineEventa, l as nanoid } from "./context-ex8urwfs.mjs";
1
+ import { a as defineEventa, l as nanoid } from "./context-BMDJMapI.mjs";
2
2
 
3
3
  //#region src/adapters/electron/internal.ts
4
4
  function generatePayload(type, payload) {
@@ -18,4 +18,4 @@ const errorEvent = { ...defineEventa() };
18
18
 
19
19
  //#endregion
20
20
  export { generatePayload as n, parsePayload as r, errorEvent as t };
21
- //# sourceMappingURL=shared-BZOulnwC.mjs.map
21
+ //# sourceMappingURL=shared-CA_i_yfR.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"shared-BZOulnwC.mjs","names":[],"sources":["../src/adapters/electron/internal.ts","../src/adapters/electron/shared.ts"],"sourcesContent":["import type { EventTag } from '../..'\nimport type { Payload as CustomEventDetailDetail } from './shared'\n\nimport { nanoid } from '../..'\n\nexport function generatePayload<T>(type: EventTag<any, any>, payload: T): CustomEventDetailDetail<T> {\n return {\n id: nanoid(),\n type,\n payload,\n }\n}\n\nexport function parsePayload<T>(data: unknown): CustomEventDetailDetail<T> {\n return data as CustomEventDetailDetail<T>\n}\n","import type { EventTag } from '../../eventa'\n\nimport { defineEventa } from '../../eventa'\n\nexport interface Payload<T> {\n id: string\n type: EventTag<any, any>\n payload: T\n}\n\nexport const errorEvent = { ...defineEventa<{ error: unknown }>() }\n"],"mappings":";;;AAKA,SAAgB,gBAAmB,MAA0B,SAAwC;AACnG,QAAO;EACL,IAAI,QAAQ;EACZ;EACA;EACD;;AAGH,SAAgB,aAAgB,MAA2C;AACzE,QAAO;;;;;ACJT,MAAa,aAAa,EAAE,GAAG,cAAkC,EAAE"}
1
+ {"version":3,"file":"shared-CA_i_yfR.mjs","names":[],"sources":["../src/adapters/electron/internal.ts","../src/adapters/electron/shared.ts"],"sourcesContent":["import type { EventTag } from '../..'\nimport type { Payload as CustomEventDetailDetail } from './shared'\n\nimport { nanoid } from '../..'\n\nexport function generatePayload<T>(type: EventTag<any, any>, payload: T): CustomEventDetailDetail<T> {\n return {\n id: nanoid(),\n type,\n payload,\n }\n}\n\nexport function parsePayload<T>(data: unknown): CustomEventDetailDetail<T> {\n return data as CustomEventDetailDetail<T>\n}\n","import type { EventTag } from '../../eventa'\n\nimport { defineEventa } from '../../eventa'\n\nexport interface Payload<T> {\n id: string\n type: EventTag<any, any>\n payload: T\n}\n\nexport const errorEvent = { ...defineEventa<{ error: unknown }>() }\n"],"mappings":";;;AAKA,SAAgB,gBAAmB,MAA0B,SAAwC;AACnG,QAAO;EACL,IAAI,QAAQ;EACZ;EACA;EACD;;AAGH,SAAgB,aAAgB,MAA2C;AACzE,QAAO;;;;;ACJT,MAAa,aAAa,EAAE,GAAG,cAAkC,EAAE"}
@@ -1,5 +1,5 @@
1
- import { a as defineEventa, l as nanoid, s as defineOutboundEventa } from "./context-ex8urwfs.mjs";
2
- import { d as isExtendableInvokeResponseLike } from "./src-DZ7si0kE.mjs";
1
+ import { a as defineEventa, l as nanoid, s as defineOutboundEventa } from "./context-BMDJMapI.mjs";
2
+ import { d as isExtendableInvokeResponseLike } from "./src-eMqISeHo.mjs";
3
3
 
4
4
  //#region src/adapters/webworkers/internal.ts
5
5
  function generateWorkerPayload(type, payload) {
@@ -62,4 +62,4 @@ function normalizeOnListenerParameters(event, options) {
62
62
 
63
63
  //#endregion
64
64
  export { workerErrorEvent as a, normalizeOnListenerParameters as i, defineWorkerEventa as n, generateWorkerPayload as o, isWorkerEventa as r, parseWorkerPayload as s, defineOutboundWorkerEventa as t };
65
- //# sourceMappingURL=shared-BdqIf6iZ.mjs.map
65
+ //# sourceMappingURL=shared-CRxfs1TC.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"shared-BdqIf6iZ.mjs","names":["eventPayload: any","transfer: Transferable[] | undefined"],"sources":["../src/adapters/webworkers/internal.ts","../src/adapters/webworkers/shared.ts"],"sourcesContent":["import type { EventTag } from '../..'\nimport type { WorkerPayload } from './shared'\n\nimport { nanoid } from '../..'\n\nexport function generateWorkerPayload<T>(type: EventTag<any, any>, payload: T): WorkerPayload<T> {\n return {\n id: nanoid(),\n type,\n payload,\n }\n}\n\nexport function parseWorkerPayload<T>(data: unknown): WorkerPayload<T> {\n return data as WorkerPayload<T>\n}\n","import type { EventContext } from '../../context'\nimport type { Eventa, EventTag } from '../../eventa'\n\nimport { defineEventa, defineOutboundEventa } from '../../eventa'\nimport { isExtendableInvokeResponseLike } from '../../invoke'\n\nexport interface WorkerPayload<T> {\n id: string\n type: EventTag<any, any>\n payload: T\n transfer?: Transferable[]\n}\n\nexport interface WorkerEventa<T> extends Eventa<{ message: T, transfer?: Transferable[] }> {\n _workerTransfer: true\n}\n\nexport function defineWorkerEventa<T>(id?: string): WorkerEventa<T> {\n return {\n ...defineEventa<{ message: T, transfer?: Transferable[] }>(id),\n _workerTransfer: true,\n }\n}\n\nexport function defineOutboundWorkerEventa<T>(id?: string): WorkerEventa<T> {\n return {\n ...defineOutboundEventa<{ message: T, transfer?: Transferable[] }>(id),\n _workerTransfer: true,\n }\n}\n\nexport function isWorkerEventa(event: Eventa<any>): event is WorkerEventa<any> {\n return typeof event === 'object'\n && '_workerTransfer' in event\n && typeof event._workerTransfer === 'boolean'\n && event._workerTransfer === true\n}\n\nexport const workerErrorEvent = defineEventa<{ error: unknown }>()\nexport const workerMessageErrorEvent = defineEventa<{ error: unknown, message: any }>()\n\nexport function normalizeOnListenerParameters(event: Eventa<any>, options?: { transfer?: Transferable[] } | unknown) {\n let eventPayload: any = event.body\n let transfer: Transferable[] | undefined\n\n if (isExtendableInvokeResponseLike<unknown, EventContext<{ invokeResponse?: { transfer?: Transferable[] } }>>(event)) {\n if (event.body!.content.invokeResponse?.transfer != null) {\n transfer = event.body!.content.invokeResponse!.transfer\n delete event.body!.content.invokeResponse\n }\n\n eventPayload = { ...event.body, content: event.body!.content.response }\n delete eventPayload.content.response\n }\n else if (isWorkerEventa(event)) {\n transfer = event.body?.transfer\n delete event.body?.transfer\n\n eventPayload = event.body?.message\n delete event.body?.message\n }\n\n // Override from options\n if (typeof options !== 'undefined' && options != null && typeof options === 'object' && 'transfer' in options) {\n if (Array.isArray(options.transfer)) {\n transfer = options.transfer\n }\n }\n\n return {\n body: eventPayload,\n transfer,\n }\n}\n"],"mappings":";;;;AAKA,SAAgB,sBAAyB,MAA0B,SAA8B;AAC/F,QAAO;EACL,IAAI,QAAQ;EACZ;EACA;EACD;;AAGH,SAAgB,mBAAsB,MAAiC;AACrE,QAAO;;;;;ACGT,SAAgB,mBAAsB,IAA8B;AAClE,QAAO;EACL,GAAG,aAAwD,GAAG;EAC9D,iBAAiB;EAClB;;AAGH,SAAgB,2BAA8B,IAA8B;AAC1E,QAAO;EACL,GAAG,qBAAgE,GAAG;EACtE,iBAAiB;EAClB;;AAGH,SAAgB,eAAe,OAAgD;AAC7E,QAAO,OAAO,UAAU,YACnB,qBAAqB,SACrB,OAAO,MAAM,oBAAoB,aACjC,MAAM,oBAAoB;;AAGjC,MAAa,mBAAmB,cAAkC;AAClE,MAAa,0BAA0B,cAAgD;AAEvF,SAAgB,8BAA8B,OAAoB,SAAmD;CACnH,IAAIA,eAAoB,MAAM;CAC9B,IAAIC;AAEJ,KAAI,+BAA0G,MAAM,EAAE;AACpH,MAAI,MAAM,KAAM,QAAQ,gBAAgB,YAAY,MAAM;AACxD,cAAW,MAAM,KAAM,QAAQ,eAAgB;AAC/C,UAAO,MAAM,KAAM,QAAQ;;AAG7B,iBAAe;GAAE,GAAG,MAAM;GAAM,SAAS,MAAM,KAAM,QAAQ;GAAU;AACvE,SAAO,aAAa,QAAQ;YAErB,eAAe,MAAM,EAAE;AAC9B,aAAW,MAAM,MAAM;AACvB,SAAO,MAAM,MAAM;AAEnB,iBAAe,MAAM,MAAM;AAC3B,SAAO,MAAM,MAAM;;AAIrB,KAAI,OAAO,YAAY,eAAe,WAAW,QAAQ,OAAO,YAAY,YAAY,cAAc,SACpG;MAAI,MAAM,QAAQ,QAAQ,SAAS,CACjC,YAAW,QAAQ;;AAIvB,QAAO;EACL,MAAM;EACN;EACD"}
1
+ {"version":3,"file":"shared-CRxfs1TC.mjs","names":["eventPayload: any","transfer: Transferable[] | undefined"],"sources":["../src/adapters/webworkers/internal.ts","../src/adapters/webworkers/shared.ts"],"sourcesContent":["import type { EventTag } from '../..'\nimport type { WorkerPayload } from './shared'\n\nimport { nanoid } from '../..'\n\nexport function generateWorkerPayload<T>(type: EventTag<any, any>, payload: T): WorkerPayload<T> {\n return {\n id: nanoid(),\n type,\n payload,\n }\n}\n\nexport function parseWorkerPayload<T>(data: unknown): WorkerPayload<T> {\n return data as WorkerPayload<T>\n}\n","import type { EventContext } from '../../context'\nimport type { Eventa, EventTag } from '../../eventa'\n\nimport { defineEventa, defineOutboundEventa } from '../../eventa'\nimport { isExtendableInvokeResponseLike } from '../../invoke'\n\nexport interface WorkerPayload<T> {\n id: string\n type: EventTag<any, any>\n payload: T\n transfer?: Transferable[]\n}\n\nexport interface WorkerEventa<T> extends Eventa<{ message: T, transfer?: Transferable[] }> {\n _workerTransfer: true\n}\n\nexport function defineWorkerEventa<T>(id?: string): WorkerEventa<T> {\n return {\n ...defineEventa<{ message: T, transfer?: Transferable[] }>(id),\n _workerTransfer: true,\n }\n}\n\nexport function defineOutboundWorkerEventa<T>(id?: string): WorkerEventa<T> {\n return {\n ...defineOutboundEventa<{ message: T, transfer?: Transferable[] }>(id),\n _workerTransfer: true,\n }\n}\n\nexport function isWorkerEventa(event: Eventa<any>): event is WorkerEventa<any> {\n return typeof event === 'object'\n && '_workerTransfer' in event\n && typeof event._workerTransfer === 'boolean'\n && event._workerTransfer === true\n}\n\nexport const workerErrorEvent = defineEventa<{ error: unknown }>()\nexport const workerMessageErrorEvent = defineEventa<{ error: unknown, message: any }>()\n\nexport function normalizeOnListenerParameters(event: Eventa<any>, options?: { transfer?: Transferable[] } | unknown) {\n let eventPayload: any = event.body\n let transfer: Transferable[] | undefined\n\n if (isExtendableInvokeResponseLike<unknown, EventContext<{ invokeResponse?: { transfer?: Transferable[] } }>>(event)) {\n if (event.body!.content.invokeResponse?.transfer != null) {\n transfer = event.body!.content.invokeResponse!.transfer\n delete event.body!.content.invokeResponse\n }\n\n eventPayload = { ...event.body, content: event.body!.content.response }\n delete eventPayload.content.response\n }\n else if (isWorkerEventa(event)) {\n transfer = event.body?.transfer\n delete event.body?.transfer\n\n eventPayload = event.body?.message\n delete event.body?.message\n }\n\n // Override from options\n if (typeof options !== 'undefined' && options != null && typeof options === 'object' && 'transfer' in options) {\n if (Array.isArray(options.transfer)) {\n transfer = options.transfer\n }\n }\n\n return {\n body: eventPayload,\n transfer,\n }\n}\n"],"mappings":";;;;AAKA,SAAgB,sBAAyB,MAA0B,SAA8B;AAC/F,QAAO;EACL,IAAI,QAAQ;EACZ;EACA;EACD;;AAGH,SAAgB,mBAAsB,MAAiC;AACrE,QAAO;;;;;ACGT,SAAgB,mBAAsB,IAA8B;AAClE,QAAO;EACL,GAAG,aAAwD,GAAG;EAC9D,iBAAiB;EAClB;;AAGH,SAAgB,2BAA8B,IAA8B;AAC1E,QAAO;EACL,GAAG,qBAAgE,GAAG;EACtE,iBAAiB;EAClB;;AAGH,SAAgB,eAAe,OAAgD;AAC7E,QAAO,OAAO,UAAU,YACnB,qBAAqB,SACrB,OAAO,MAAM,oBAAoB,aACjC,MAAM,oBAAoB;;AAGjC,MAAa,mBAAmB,cAAkC;AAClE,MAAa,0BAA0B,cAAgD;AAEvF,SAAgB,8BAA8B,OAAoB,SAAmD;CACnH,IAAIA,eAAoB,MAAM;CAC9B,IAAIC;AAEJ,KAAI,+BAA0G,MAAM,EAAE;AACpH,MAAI,MAAM,KAAM,QAAQ,gBAAgB,YAAY,MAAM;AACxD,cAAW,MAAM,KAAM,QAAQ,eAAgB;AAC/C,UAAO,MAAM,KAAM,QAAQ;;AAG7B,iBAAe;GAAE,GAAG,MAAM;GAAM,SAAS,MAAM,KAAM,QAAQ;GAAU;AACvE,SAAO,aAAa,QAAQ;YAErB,eAAe,MAAM,EAAE;AAC9B,aAAW,MAAM,MAAM;AACvB,SAAO,MAAM,MAAM;AAEnB,iBAAe,MAAM,MAAM;AAC3B,SAAO,MAAM,MAAM;;AAIrB,KAAI,OAAO,YAAY,eAAe,WAAW,QAAQ,OAAO,YAAY,YAAY,cAAc,SACpG;MAAI,MAAM,QAAQ,QAAQ,SAAS,CACjC,YAAW,QAAQ;;AAIvB,QAAO;EACL,MAAM;EACN;EACD"}
@@ -1,4 +1,4 @@
1
- import { a as defineEventa, l as nanoid } from "./context-ex8urwfs.mjs";
1
+ import { a as defineEventa, l as nanoid } from "./context-BMDJMapI.mjs";
2
2
 
3
3
  //#region src/context-extension-invoke-internal.ts
4
4
  /**
@@ -1166,4 +1166,4 @@ function toStreamHandler(handler) {
1166
1166
 
1167
1167
  //#endregion
1168
1168
  export { isInvokeEventa as C, registerInvokeAbortEventListeners as E, defineInvokeEventa as S, isSendEvent as T, isAbortError as _, withRemoteMethods as a, randomBetween as b, defineInvokeHandler as c, isExtendableInvokeResponseLike as d, undefineInvokeHandler as f, createUntilTriggeredOnce as g, createUntilTriggered as h, createRemoteMethodTagPrefix as i, defineInvokeHandlers as l, createUntil as m, defineStreamInvokeHandler as n, withTransfer as o, createAbortError as p, toStreamHandler as r, defineInvoke as s, defineStreamInvoke as t, defineInvokes as u, isAsyncIterable as v, isReceiveEvent as w, InvokeEventType as x, isReadableStream as y };
1169
- //# sourceMappingURL=src-DZ7si0kE.mjs.map
1169
+ //# sourceMappingURL=src-eMqISeHo.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"src-DZ7si0kE.mjs","names":["resolve!: (r: Awaited<R>) => void","resolve!: () => void","resolve!: (value: T) => void","ctx","abortOffs: Array<() => void>","body: any","localController: ReadableStreamDefaultController<Req>","streamController","DEFAULT_FUNCTION_STUB_OPTIONS: Required<Pick<InvokeFunctionStubOptions, 'maxDepth' | 'maxFunctions' | 'tagPrefix' | 'onDisallowedTag' | 'autoDisposeMs' | 'strict'>>","disposers: Array<() => void>","output: any[]","output","output: Record<string, any>","wrapped","serialized: ReturnType<typeof serializeInvokeFunctionPayload<Req>>","autoDisposeTimer: ReturnType<typeof setTimeout> | undefined","onAbort: (() => void) | undefined","localController: ReadableStreamDefaultController<Req>","controller","values: Promise<[Res, boolean]>[]","resolve: (x: [Res, boolean]) => void","handlerError: Error | null","val: Res"],"sources":["../src/context-extension-invoke-internal.ts","../src/invoke-shared.ts","../src/utils.ts","../src/invoke.ts","../src/invoke-extension-transfer.ts","../src/invoke-remote-methods.ts","../src/stream.ts"],"sourcesContent":["import type { EventContext } from './context'\nimport type { Eventa, EventaMatchExpression } from './eventa'\n\n/**\n * Internal invoke configuration carried on context extensions.\n *\n * Known usage: worker adapters (webworkers/worker-threads) use this to\n * abort pending invokes when the worker emits a fatal error event.\n */\nexport interface InvokeInternalConfig<EO = any> {\n abortOnEvents?: Array<Eventa<any> | EventaMatchExpression<any>>\n mapAbortError?: (payload: Eventa<any>, options?: EO) => unknown\n}\n\n/**\n * Read the internal invoke configuration from context extensions, if present.\n * This is used by defineInvoke to determine which events should abort inflight invokes.\n */\nexport function getContextExtensionInvokeInternalConfig<EO = any>(ctx: EventContext<any, EO>): InvokeInternalConfig<EO> | undefined {\n const extensions = (ctx as EventContext<any, EO> & { extensions?: any }).extensions\n if (!extensions || typeof extensions !== 'object') {\n return undefined\n }\n\n const internal = extensions.__internal\n if (!internal || typeof internal !== 'object') {\n return undefined\n }\n\n const invoke = internal.invoke\n if (!invoke || typeof invoke !== 'object') {\n return undefined\n }\n\n return invoke as InvokeInternalConfig<EO>\n}\n\n/**\n * Register a fatal event/match expression that should terminate pending invokes.\n * Adapters call this to wire their error events (e.g. worker error) into invoke.\n */\nexport function registerInvokeAbortEventListeners<EO = any>(\n ctx: EventContext<any, EO>,\n eventOrMatch: Eventa<any> | EventaMatchExpression<any>,\n): InvokeInternalConfig<EO> {\n const extensions = ((ctx as EventContext<any, EO> & { extensions?: any }).extensions ?? {}) as Record<string, any>\n const internal = (extensions.__internal ?? {}) as Record<string, any>\n const invokeInternal = (internal.invoke ?? {}) as Record<string, any>\n const abortOnEvents = Array.isArray(invokeInternal.abortOnEvents) ? invokeInternal.abortOnEvents : []\n\n if (!abortOnEvents.includes(eventOrMatch)) {\n abortOnEvents.push(eventOrMatch)\n }\n\n invokeInternal.abortOnEvents = abortOnEvents\n internal.invoke = invokeInternal\n extensions.__internal = internal\n ;(ctx as EventContext<any, EO> & { extensions?: any }).extensions = extensions\n\n return invokeInternal as InvokeInternalConfig<EO>\n}\n","import type { Eventa, EventTag } from './eventa'\n\nimport { defineEventa, nanoid } from './eventa'\n\nexport enum InvokeEventType {\n SendEvent,\n SendEventError,\n SendEventStreamEnd,\n SendEventAbort,\n ReceiveEvent,\n ReceiveEventError,\n ReceiveEventStreamEnd,\n}\n\nexport interface SendEvent<Res, Req = undefined, _ = undefined, __ = undefined> extends Eventa<{ invokeId: string, content: Req, isReqStream?: boolean }> {\n id: EventTag<Res, Req>\n invokeType: InvokeEventType.SendEvent\n}\nexport interface SendEventError<Res, Req = undefined, _ = undefined, ReqErr = Error> extends Eventa<{ invokeId: string, content: ReqErr }> {\n id: EventTag<Res, Req>\n invokeType: InvokeEventType.SendEventError\n}\nexport interface SendEventStreamEnd<Res, Req = undefined, _ = undefined, __ = undefined> extends Eventa<{ invokeId: string, content: undefined }> {\n id: EventTag<Res, Req>\n invokeType: InvokeEventType.SendEventStreamEnd\n}\nexport interface SendEventAbort<Res, Req = undefined, _ = undefined, __ = undefined> extends Eventa<{ invokeId: string, content?: unknown }> {\n id: EventTag<Res, Req>\n invokeType: InvokeEventType.SendEventAbort\n}\nexport interface ReceiveEvent<Res, Req = undefined, _ = undefined, __ = undefined> extends Eventa<{ invokeId: string, content: Res }> {\n id: EventTag<Res, Req>\n invokeType: InvokeEventType.ReceiveEvent\n}\nexport interface ReceiveEventError<Res, Req = undefined, ResErr = undefined, _ = undefined> extends Eventa<{ invokeId: string, content: { error: ResErr } }> {\n id: EventTag<Res, Req>\n invokeType: InvokeEventType.ReceiveEventError\n}\nexport interface ReceiveEventStreamEnd<Res, Req = undefined, _ = undefined, __ = undefined> extends Eventa<{ invokeId: string, content: undefined }> {\n id: EventTag<Res, Req>\n invokeType: InvokeEventType.ReceiveEventStreamEnd\n}\n\nexport interface InvokeEventa<Res, Req = undefined, ResErr = Error, ReqErr = Error> {\n sendEvent: SendEvent<Res, Req, ResErr, ReqErr>\n sendEventError: SendEventError<Res, Req, ResErr, ReqErr>\n sendEventStreamEnd: SendEventStreamEnd<Res, Req, ResErr, ReqErr>\n sendEventAbort: SendEventAbort<Res, Req, ResErr, ReqErr>\n receiveEvent: ReceiveEvent<Res, Req, ResErr, ReqErr>\n receiveEventError: ReceiveEventError<Res, Req, ResErr, ReqErr>\n receiveEventStreamEnd: ReceiveEventStreamEnd<Res, Req, ResErr, ReqErr>\n}\n\nexport type InferSendEvent<T> = T extends { sendEvent: SendEvent<infer Res, infer Req, infer ResErr, infer ReqErr> }\n ? SendEvent<Res, Req, ResErr, ReqErr>\n : never\n\nexport type InferSendEventError<T> = T extends { sendEventError: SendEventError<infer Res, infer Req, infer ResErr, infer ReqErr> }\n ? SendEventError<Res, Req, ResErr, ReqErr>\n : never\n\nexport type InferSendEventStreamEnd<T> = T extends { sendEventStreamEnd: SendEventStreamEnd<infer Res, infer Req, infer ResErr, infer ReqErr> }\n ? SendEventStreamEnd<Res, Req, ResErr, ReqErr>\n : never\n\nexport type InferSendEventAbort<T> = T extends { sendEventAbort: SendEventAbort<infer Res, infer Req, infer ResErr, infer ReqErr> }\n ? SendEventAbort<Res, Req, ResErr, ReqErr>\n : never\n\nexport type InferReceiveEvent<T> = T extends { receiveEvent: ReceiveEvent<infer Res, infer Req, infer ResErr, infer ReqErr> }\n ? ReceiveEvent<Res, Req, ResErr, ReqErr>\n : never\n\nexport type InferReceiveEventError<T> = T extends { receiveEventError: ReceiveEventError<infer Res, infer Req, infer ResErr, infer ReqErr> }\n ? ReceiveEventError<Res, Req, ResErr, ReqErr>\n : never\n\nexport type InferReceiveEventStreamEnd<T> = T extends { receiveEventStreamEnd: ReceiveEventStreamEnd<infer Res, infer Req, infer ResErr, infer ReqErr> }\n ? ReceiveEventStreamEnd<Res, Req, ResErr, ReqErr>\n : never\n\nexport function defineInvokeEventa<Res, Req = undefined, ResErr = Error, ReqErr = Error>(tag?: string) {\n if (!tag) {\n tag = nanoid()\n }\n\n const sendEvent = {\n ...defineEventa<InvokeEventType.SendEvent>(`${tag}-send`),\n invokeType: InvokeEventType.SendEvent,\n } as SendEvent<Res, Req, ResErr, ReqErr>\n const sendEventError = {\n ...defineEventa<InvokeEventType.SendEventError>(`${tag}-send-error`),\n invokeType: InvokeEventType.SendEventError,\n } as SendEventError<Res, Req, ResErr, ReqErr>\n const sendEventStreamEnd = {\n ...defineEventa<InvokeEventType.SendEventStreamEnd>(`${tag}-send-stream-end`),\n invokeType: InvokeEventType.SendEventStreamEnd,\n } as SendEventStreamEnd<Res, Req, ResErr, ReqErr>\n const sendEventAbort = {\n ...defineEventa<InvokeEventType.SendEventAbort>(`${tag}-send-abort`),\n invokeType: InvokeEventType.SendEventAbort,\n } as SendEventAbort<Res, Req, ResErr, ReqErr>\n const receiveEvent = {\n ...defineEventa<InvokeEventType.ReceiveEvent>(`${tag}-receive`),\n invokeType: InvokeEventType.ReceiveEvent,\n } as ReceiveEvent<Res, Req, ResErr, ReqErr>\n const receiveEventError = {\n ...defineEventa<InvokeEventType.ReceiveEventError>(`${tag}-receive-error`),\n invokeType: InvokeEventType.ReceiveEventError,\n } as ReceiveEventError<Res, Req, ResErr, ReqErr>\n const receiveEventStreamEnd = {\n ...defineEventa<InvokeEventType.ReceiveEventStreamEnd>(`${tag}-receive-stream-end`),\n invokeType: InvokeEventType.ReceiveEventStreamEnd,\n } as ReceiveEventStreamEnd<Res, Req, ResErr, ReqErr>\n\n return {\n sendEvent,\n sendEventError,\n sendEventStreamEnd,\n sendEventAbort,\n receiveEvent,\n receiveEventError,\n receiveEventStreamEnd,\n } satisfies InvokeEventa<Res, Req, ResErr, ReqErr>\n}\n\nexport function isInvokeEventa(event: Eventa<any>): event is\n | SendEvent<any, any, any, any>\n | SendEventError<any, any, any, any>\n | SendEventStreamEnd<any, any, any, any>\n | ReceiveEvent<any, any, any, any>\n | ReceiveEventError<any, any, any, any>\n | ReceiveEventStreamEnd<any, any, any, any>\n | SendEventAbort<any, any, any, any> {\n if (typeof event !== 'object') {\n return false\n }\n if ('invokeType' in event) {\n return true\n }\n\n return false\n}\n\nexport function isSendEvent(event: Eventa<any>): event is\n | SendEvent<any, any, any, any>\n | SendEventError<any, any, any, any>\n | SendEventStreamEnd<any, any, any, any>\n | SendEventAbort<any, any, any, any> {\n if (!isInvokeEventa(event)) {\n return false\n }\n\n return event.invokeType === InvokeEventType.SendEvent\n || event.invokeType === InvokeEventType.SendEventError\n || event.invokeType === InvokeEventType.SendEventStreamEnd\n || event.invokeType === InvokeEventType.SendEventAbort\n}\n\nexport function isReceiveEvent(event: Eventa<any>): event is\n | ReceiveEvent<any, any, any, any>\n | ReceiveEventError<any, any, any, any>\n | ReceiveEventStreamEnd<any, any, any, any> {\n if (!isInvokeEventa(event)) {\n return false\n }\n\n return event.invokeType === InvokeEventType.ReceiveEvent\n || event.invokeType === InvokeEventType.ReceiveEventError\n || event.invokeType === InvokeEventType.ReceiveEventStreamEnd\n}\n","export function randomBetween(min: number, max: number): number {\n return Math.floor(Math.random() * (max - min + 1)) + min\n}\n\n/**\n * Checks if a value is an AsyncIterable.\n *\n * @param value\n * @returns True if the value is an AsyncIterable.\n */\nexport function isAsyncIterable<T>(value: unknown): value is AsyncIterable<T> {\n return typeof value === 'object'\n && value !== null\n && Symbol.asyncIterator in value\n}\n\n/**\n * Checks if an object is a ReadableStream.\n *\n * @link https://github.com/cloudflare/workerd/blob/88e8696ce7a5f8969a7e02a2dcfb6504c17c9e8d/src/cloudflare/internal/streaming-forms.ts#L3\n * @param obj\n * @returns True if the object looks like a ReadableStream.\n */\nexport function isReadableStream<T>(obj?: unknown | null): obj is ReadableStream<T> {\n return !!(\n obj\n && typeof obj === 'object'\n && 'getReader' in obj\n && typeof obj.getReader === 'function'\n )\n}\n\nexport function createAbortError(reason?: unknown): Error {\n if (reason instanceof Error && reason.name === 'AbortError') {\n return reason\n }\n\n if (typeof DOMException !== 'undefined') {\n try {\n return new DOMException(reason ? String(reason) : 'Aborted', 'AbortError')\n }\n catch {\n // fall through\n }\n }\n\n const error = reason instanceof Error ? reason : new Error(reason ? String(reason) : 'Aborted')\n error.name = 'AbortError'\n return error\n}\n\nexport function isAbortError(error: unknown): error is Error {\n return error instanceof Error && error.name === 'AbortError'\n}\n\nexport function createUntilTriggeredOnce<F extends (...args: any[]) => any, P extends any[] = Parameters<F>, R = ReturnType<F>>(fn: F): {\n onceTriggered: Promise<Awaited<R>>\n wrapper: (...args: P) => Promise<Awaited<R>>\n} {\n let resolve!: (r: Awaited<R>) => void\n const promise = new Promise<Awaited<R>>((res) => {\n resolve = res\n })\n\n const handler = async (...args: P[]): Promise<Awaited<R>> => {\n const res = await fn(...args)\n resolve(res)\n return res\n }\n\n return {\n onceTriggered: promise,\n wrapper: handler,\n }\n}\n\nexport function createUntilTriggered<P, R>(fn: (...args: P[]) => R): {\n promise: Promise<void>\n handler: () => void\n} {\n let resolve!: () => void\n const promise = new Promise<void>((res) => {\n resolve = res\n })\n\n const handler = (...args: P[]): R => {\n resolve()\n return fn(...args)\n }\n\n return { promise, handler }\n}\n\nexport function createUntil<T>(options?: { intervalHandler?: () => Promise<boolean>, interval?: number }): {\n promise: Promise<T>\n handler: (value: T) => void\n} {\n let resolve!: (value: T) => void\n const promise = new Promise<T>((res) => {\n resolve = res\n })\n\n if (options?.intervalHandler) {\n setInterval(() => {\n options?.intervalHandler?.().then((shouldResolve) => {\n if (shouldResolve) {\n resolve(undefined as unknown as T)\n }\n })\n }, options.interval ?? 50)\n }\n\n return { promise, handler: resolve }\n}\n","import type { EventContext } from './context'\nimport type { Eventa } from './eventa'\nimport type { InvokeEventa, ReceiveEvent, ReceiveEventError, SendEvent, SendEventAbort, SendEventStreamEnd } from './invoke-shared'\n\nimport { getContextExtensionInvokeInternalConfig } from './context-extension-invoke-internal'\nimport { defineEventa, nanoid } from './eventa'\nimport { isReceiveEvent } from './invoke-shared'\nimport { createAbortError, isAbortError, isAsyncIterable, isReadableStream } from './utils'\n\ntype IsInvokeRequestOptional<EC extends EventContext<any, any>>\n = EC extends EventContext<infer E, any>\n ? E extends { invokeRequest: any }\n ? undefined extends E['invokeRequest']\n ? true\n : false\n : E extends { invokeRequest?: any }\n ? undefined extends E['invokeRequest']\n ? true\n : false\n : true\n : true\n\nexport type ExtractInvokeRequestOptions<EC extends EventContext<any, any>>\n = EC extends EventContext<infer E, any>\n ? E extends { invokeRequest: infer IR }\n ? IR & { signal?: AbortSignal }\n : E extends { invokeRequest?: infer IR }\n ? IR & { signal?: AbortSignal }\n : { signal?: AbortSignal }\n : { signal?: AbortSignal }\n\nexport type ExtractInvokeResponseOptions<EC extends EventContext<any, any>>\n = EC extends EventContext<infer E, any>\n ? E extends { invokeResponse: infer IR }\n ? IR\n : E extends { invokeResponse?: infer IR }\n ? IR\n : undefined\n : undefined\n\nexport type InvokeFunction<Res, Req, EC extends EventContext<any, any>>\n = [Req] extends [undefined]\n ? IsInvokeRequestOptional<EC> extends true\n ? (req?: Req, options?: ExtractInvokeRequestOptions<EC>) => Promise<Res>\n : (req: Req, options: ExtractInvokeRequestOptions<EC>) => Promise<Res>\n : IsInvokeRequestOptional<EC> extends true\n ? (req: Req, options?: ExtractInvokeRequestOptions<EC>) => Promise<Res>\n : (req: Req, options: ExtractInvokeRequestOptions<EC>) => Promise<Res>\n\nexport type InvokeFunctionMap<EventMap extends Record<string, InvokeEventa<any, any, any, any>>, EC extends EventContext<any, any>> = {\n [K in keyof EventMap]: EventMap[K] extends InvokeEventa<infer Res, infer Req, any, any> ? InvokeFunction<Res, Req, EC> : never\n}\n\nexport type ExtendableInvokeResponse<Res, EC extends EventContext<any, any>>\n = | Promise<Res>\n | Res\n | Promise<{ response: Res, invokeResponse?: ExtractInvokeResponseOptions<EC> }>\n | { response: Res, invokeResponse?: ExtractInvokeResponseOptions<EC> }\n\nexport function isExtendableInvokeResponseLike<Res, EC extends EventContext<any, any>>(value: Eventa<unknown> | ReceiveEvent<{ response: Res, invokeResponse?: unknown }>): value is ReceiveEvent<{ response: Res, invokeResponse?: ExtractInvokeResponseOptions<EC> }> {\n if (!isReceiveEvent(value)) {\n return false\n }\n\n return typeof value.body?.content === 'object'\n && value.body?.content != null\n && 'response' in value.body.content\n && (\n !('invokeResponse' in value.body.content)\n || (\n 'invokeResponse' in value.body.content\n && (\n typeof value.body.content.invokeResponse === 'object'\n || typeof value.body.content.invokeResponse === 'undefined'\n )\n )\n )\n}\n\nexport type Handler<Res, Req = any, EC extends EventContext<any, any> = EventContext<any, any>, RawEventOptions = unknown> = (\n payload: Req,\n options?: {\n abortController?: AbortController\n } & RawEventOptions,\n) => ExtendableInvokeResponse<Res, EC>\n\ninterface InternalInvokeHandler<\n Res,\n Req = any,\n ResErr = Error,\n ReqErr = Error,\n EO = any,\n> {\n onSend: (params: InvokeEventa<Res, Req, ResErr, ReqErr>['sendEvent'], eventOptions?: EO) => void\n onSendStreamEnd: (params: InvokeEventa<Res, Req, ResErr, ReqErr>['sendEventStreamEnd'], eventOptions?: EO) => void\n onSendAbort: (params: InvokeEventa<Res, Req, ResErr, ReqErr>['sendEventAbort'], eventOptions?: EO) => void\n}\n\nexport type HandlerMap<\n EventMap extends Record<string, InvokeEventa<any, any, any, any>>,\n EO = any,\n EC extends EventContext<any, any> = EventContext<any, any>,\n> = {\n [K in keyof EventMap]: EventMap[K] extends InvokeEventa<infer Res, infer Req, any, any>\n ? Handler<Res, Req, EC, EO>\n : never\n}\n\nexport interface InvocableEventContext<E, EO> extends EventContext<E, EO> {\n invokeHandlers?: Map<string, Map<Handler<any>, InternalInvokeHandler<any>>>\n}\n\n/**\n * Create a unary invoke function (client side).\n *\n * It supports unary or streaming requests, but returns a single response.\n * Use `defineStreamInvoke` when you expect a stream of responses.\n *\n * If you want stream input, set `Req` to `ReadableStream<T>` or `AsyncIterable<T>`\n * (or a union type like `T | ReadableStream<T>` for optional streaming).\n *\n * @example\n * ```ts\n * // 1) Define eventa once (shared by client/server)\n * const events = defineInvokeEventa<{ id: string }, { name: string }>()\n *\n * // 2) Client: define invoke function\n * const invoke = defineInvoke(clientCtx, events)\n *\n * // 3) Call\n * const res = await invoke({ name: 'alice' })\n * ```\n *\n * @example\n * ```ts\n * // Stream request -> unary response\n * const events = defineInvokeEventa<number, ReadableStream<number>>()\n *\n * defineInvokeHandler(serverCtx, events, async (payload) => {\n * let sum = 0\n * for await (const value of payload) {\n * sum += value\n * }\n *\n * return sum\n * })\n *\n * const invoke = defineInvoke(clientCtx, events)\n * const input = new ReadableStream<number>({\n * start(controller) {\n * controller.enqueue(1)\n * controller.enqueue(2)\n * controller.close()\n * },\n * })\n *\n * const total = await invoke(input)\n * ```\n *\n * @param ctx Event context on the caller/client side.\n * @param event Invoke event definition created by `defineInvokeEventa`.\n */\nexport function defineInvoke<\n Res,\n Req = undefined,\n ResErr = Error,\n ReqErr = Error,\n CtxExt = any,\n EOpts = any,\n ECtx extends EventContext<CtxExt, EOpts> = EventContext<CtxExt, EOpts>,\n>(ctx: ECtx | (() => ECtx | Promise<ECtx>), event: InvokeEventa<Res, Req, ResErr, ReqErr>): InvokeFunction<Res, Req, ECtx> {\n async function getContext(): Promise<ECtx> {\n if (typeof ctx === 'function') {\n const resolvedCtx = ctx()\n if (resolvedCtx instanceof Promise) {\n return await resolvedCtx\n }\n\n return resolvedCtx\n }\n\n return ctx\n }\n\n function _invoke(req?: Req, options?: ExtractInvokeRequestOptions<ECtx>): Promise<Res> {\n return new Promise<Res>((resolve, reject) => {\n getContext().then((ctx) => {\n const invokeId = nanoid()\n\n const invokeReceiveEvent = defineEventa(`${event.receiveEvent.id}-${invokeId}`) as ReceiveEvent<Res>\n const invokeReceiveEventError = defineEventa(`${event.receiveEventError.id}-${invokeId}`) as ReceiveEventError<Res, Req, ResErr, ReqErr>\n const { signal, ...emitOptions } = (options ?? {}) as ExtractInvokeRequestOptions<ECtx> & Record<string, any>\n let finished = false\n\n const onAbort = () => {\n ctx.emit(event.sendEventAbort, { invokeId, content: signal?.reason }, emitOptions as any)\n // eslint-disable-next-line ts/no-use-before-define\n finishReject(createAbortError(signal?.reason))\n }\n\n // Hook into adapter-level fatal events (e.g., worker error) so any pending invoke\n // is rejected immediately instead of waiting forever for a response.\n const invokeInternalConfig = getContextExtensionInvokeInternalConfig(ctx)\n const abortOffs: Array<() => void> = []\n const onAbortEvent = (payload: Eventa<any>, eventOptions?: any) => {\n // Workflow: adapter emits a fatal event -> we map it (if configured) -> reject this invoke.\n const mappedError = invokeInternalConfig?.mapAbortError?.(payload, eventOptions)\n if (typeof mappedError !== 'undefined') {\n // eslint-disable-next-line ts/no-use-before-define\n finishReject(mappedError)\n return\n }\n\n // Default extraction for common `{ error }` payloads, otherwise reject with payload/body.\n const body: any = payload?.body\n const error = body && typeof body === 'object' && 'error' in body\n ? body.error\n : (typeof body !== 'undefined' ? body : payload)\n // eslint-disable-next-line ts/no-use-before-define\n finishReject(error)\n }\n\n const cleanup = () => {\n ctx.off(invokeReceiveEvent)\n ctx.off(invokeReceiveEventError)\n for (const off of abortOffs) {\n off()\n }\n if (signal) {\n signal.removeEventListener('abort', onAbort)\n }\n }\n\n const finishReject = (error?: any) => {\n if (finished) {\n return\n }\n\n finished = true\n reject(error)\n cleanup()\n }\n\n const finishResolve = (value: Res) => {\n if (finished) {\n return\n }\n finished = true\n resolve(value)\n\n cleanup()\n }\n\n ctx.on(invokeReceiveEvent, (payload) => {\n if (!payload.body) {\n return\n }\n if (payload.body.invokeId !== invokeId) {\n return\n }\n\n const { content } = payload.body\n finishResolve(content as Res)\n })\n\n ctx.on(invokeReceiveEventError, (payload) => {\n if (!payload.body) {\n return\n }\n if (payload.body.invokeId !== invokeId) {\n return\n }\n\n const { error } = payload.body.content\n finishReject(error)\n })\n\n if (invokeInternalConfig?.abortOnEvents?.length) {\n for (const eventOrMatch of invokeInternalConfig.abortOnEvents) {\n abortOffs.push(ctx.on(eventOrMatch as any, onAbortEvent as any))\n }\n }\n\n if (signal) {\n if (signal.aborted) {\n onAbort()\n return\n }\n\n signal.addEventListener('abort', onAbort, { once: true })\n }\n\n if (!isReadableStream<Req>(req) && !isAsyncIterable<Req>(req)) {\n ctx.emit(event.sendEvent, { invokeId, content: req as Req }, emitOptions as any) // emit: event_trigger\n }\n else {\n const sendChunk = (chunk: Req) => {\n if (finished) {\n return\n }\n ctx.emit(event.sendEvent, { invokeId, content: chunk, isReqStream: true }, emitOptions as any) // emit: event_trigger\n }\n\n const sendEnd = () => {\n if (finished) {\n return\n }\n ctx.emit(event.sendEventStreamEnd, { invokeId, content: undefined }, emitOptions as any) // emit: event_stream_end\n }\n\n const pump = async () => {\n try {\n for await (const chunk of req) {\n // If aborted already, no further emits\n if (signal?.aborted) {\n return\n }\n\n sendChunk(chunk)\n }\n\n sendEnd()\n }\n catch (error) {\n // Make sure no further emits after abort\n if (signal?.aborted) {\n return\n }\n if (isAbortError(error)) {\n ctx.emit(event.sendEventAbort, { invokeId, content: error }, emitOptions as any)\n return\n }\n\n ctx.emit(event.sendEventError, { invokeId, content: error as ReqErr }, emitOptions as any) // emit: event_error\n }\n }\n\n pump()\n }\n })\n })\n }\n\n return _invoke as InvokeFunction<Res, Req, ECtx>\n}\n\n/**\n * Create a map of invoke functions from a map of invoke events (client side).\n *\n * @example\n * ```ts\n * const events = {\n * double: defineInvokeEventa<number, number>(),\n * greet: defineInvokeEventa<string, { name: string }>(),\n * }\n *\n * const invokes = defineInvokes(ctx, events)\n * const result = await invokes.double(2)\n * ```\n *\n * @param ctx Event context on the caller/client side.\n * @param events Map of invoke events created by `defineInvokeEventa`.\n */\nexport function defineInvokes<\n EK extends string,\n EventMap extends Record<EK, InvokeEventa<any, any, any, any>>,\n CtxExt = any,\n EOpts = any,\n ECtx extends EventContext<CtxExt, EOpts> = EventContext<CtxExt, EOpts>,\n>(ctx: ECtx | (() => ECtx | Promise<ECtx>), events: EventMap): InvokeFunctionMap<EventMap, ECtx> {\n const invokes = (Object.keys(events) as EK[]).reduce((invokes, key) => {\n invokes[key] = defineInvoke(ctx, events[key])\n return invokes\n }, {} as Record<EK, InvokeFunction<any, any, ECtx>>)\n\n return invokes as InvokeFunctionMap<EventMap, ECtx>\n}\n\n/**\n * Define a unary invoke handler (server side).\n *\n * The handler can accept a unary or streaming request; it must return\n * a single response (or an extendable response envelope).\n *\n * @example\n * ```ts\n * const events = defineInvokeEventa<{ id: string }, { name: string }>()\n *\n * defineInvokeHandler(serverCtx, events, ({ name }) => ({\n * id: `user-${name}`,\n * }))\n * ```\n *\n * @param ctx Event context on the handler/server side.\n * @param event Invoke event definition created by `defineInvokeEventa`.\n * @param handler Handler that returns a response (or response + metadata).\n */\nexport function defineInvokeHandler<\n Res,\n Req = undefined,\n ResErr = Error,\n ReqErr = Error,\n CtxExt = any,\n EOpts extends { raw?: any } = any,\n>(\n ctx: InvocableEventContext<CtxExt, EOpts>,\n event: InvokeEventa<Res, Req, ResErr, ReqErr>,\n handler: Handler<Res, Req, InvocableEventContext<CtxExt, EOpts>, EOpts>,\n): () => void {\n if (!ctx.invokeHandlers) {\n ctx.invokeHandlers = new Map()\n }\n\n let handlers = ctx.invokeHandlers?.get(event.sendEvent.id)\n if (!handlers) {\n handlers = new Map()\n ctx.invokeHandlers?.set(event.sendEvent.id, handlers)\n }\n\n let internalHandler = handlers.get(handler) as InternalInvokeHandler<Res, Req, ResErr, ReqErr, EOpts> | undefined\n if (!internalHandler) {\n const streamStates = new Map<string, ReadableStreamDefaultController<Req>>()\n const abortControllers = new Map<string, AbortController>()\n const abortReasons = new Map<string, unknown>()\n const scheduleAbort = (controller: AbortController, reason: unknown) => {\n // NOTICE: use microtask to avoid aborting before the handler starts.\n // This is important when the handler creates streams or async iterables\n if (typeof queueMicrotask !== 'undefined') {\n queueMicrotask(() => controller.abort(reason))\n return\n }\n\n Promise.resolve().then(() => controller.abort(reason))\n }\n\n const handleInvoke = async (invokeId: string, payload: Req, options?: EOpts) => {\n const abortController = new AbortController()\n abortControllers.set(invokeId, abortController)\n\n if (abortReasons.has(invokeId)) {\n scheduleAbort(abortController, abortReasons.get(invokeId))\n }\n\n const handlerOptions = options\n ? { ...options, abortController }\n : ({ abortController } as EOpts & { abortController: AbortController })\n\n try {\n const response = await handler(payload as Req, handlerOptions) // Call the handler function with the request payload\n ctx.emit(\n { ...defineEventa(`${event.receiveEvent.id}-${invokeId}`), invokeType: event.receiveEvent.invokeType } as ReceiveEvent<ExtendableInvokeResponse<Res, InvocableEventContext<CtxExt, EOpts>>>,\n { invokeId, content: response },\n options,\n ) // emit: event_response\n }\n catch (error) {\n // TODO: to error object\n ctx.emit(\n { ...defineEventa(`${event.receiveEventError.id}-${invokeId}`), invokeType: event.receiveEventError.invokeType } as ReceiveEventError<Res, Req, ResErr, ReqErr>,\n { invokeId, content: { error: error as ResErr } },\n options,\n )\n }\n finally {\n abortControllers.delete(invokeId)\n abortReasons.delete(invokeId)\n }\n }\n\n const onSend = async (payload: SendEvent<Res, Req, ResErr, ReqErr>, options: EOpts) => { // on: event_trigger\n if (!payload.body) {\n return\n }\n if (!payload.body.invokeId) {\n return\n }\n\n const invokeId = payload.body.invokeId\n if (payload.body.isReqStream) {\n let controller = streamStates.get(invokeId)\n if (!controller) {\n let localController: ReadableStreamDefaultController<Req>\n const reqStream = new ReadableStream<Req>({\n start(c) {\n localController = c\n },\n })\n\n controller = localController!\n streamStates.set(invokeId, controller)\n // TODO: perhaps, can we correctly write type Req here?\n handleInvoke(invokeId, reqStream as Req, options)\n }\n\n controller.enqueue(payload.body.content as Req)\n return\n }\n\n handleInvoke(invokeId, payload.body?.content as Req, options)\n }\n\n const onSendStreamEnd = (payload: SendEventStreamEnd<Res, Req, ResErr, ReqErr>, options: EOpts) => { // on: event_stream_end\n if (!payload.body) {\n return\n }\n if (!payload.body.invokeId) {\n return\n }\n\n const invokeId = payload.body.invokeId\n let controller = streamStates.get(invokeId)\n if (!controller) {\n let localController: ReadableStreamDefaultController<Req>\n const reqStream = new ReadableStream<Req>({\n start(c) {\n localController = c\n },\n })\n\n controller = localController!\n streamStates.set(invokeId, controller)\n // TODO: perhaps, can we correctly write type Req here?\n handleInvoke(invokeId, reqStream as Req, options)\n }\n\n controller.close()\n streamStates.delete(invokeId)\n }\n\n const onSendAbort = (payload: SendEventAbort<Res, Req, ResErr, ReqErr>, options: EOpts) => { // on: event_abort\n if (!payload.body) {\n return\n }\n if (!payload.body.invokeId) {\n return\n }\n\n const invokeId = payload.body.invokeId\n const reason = payload.body.content\n const abortController = abortControllers.get(invokeId)\n if (!abortController) {\n abortReasons.set(invokeId, reason)\n\n let streamController = streamStates.get(invokeId)\n if (!streamController) {\n let localController: ReadableStreamDefaultController<Req>\n const reqStream = new ReadableStream<Req>({\n start(c) {\n localController = c\n },\n })\n\n streamController = localController!\n streamStates.set(invokeId, streamController)\n handleInvoke(invokeId, reqStream as Req, options)\n }\n\n streamController.error(createAbortError(reason))\n streamStates.delete(invokeId)\n return\n }\n\n scheduleAbort(abortController, reason)\n\n const streamController = streamStates.get(invokeId)\n if (streamController) {\n streamController.error(createAbortError(reason))\n streamStates.delete(invokeId)\n }\n }\n\n internalHandler = { onSend, onSendStreamEnd, onSendAbort }\n handlers.set(handler, internalHandler)\n\n ctx.on(event.sendEvent, internalHandler.onSend)\n ctx.on(event.sendEventStreamEnd, internalHandler.onSendStreamEnd)\n ctx.on(event.sendEventAbort, internalHandler.onSendAbort)\n }\n\n return () => {\n ctx.off(event.sendEvent, internalHandler.onSend)\n ctx.off(event.sendEventStreamEnd, internalHandler.onSendStreamEnd)\n ctx.off(event.sendEventAbort, internalHandler.onSendAbort)\n }\n}\n\n/**\n * Define multiple invoke handlers in batch (server side).\n *\n * @example\n * ```ts\n * const events = {\n * double: defineInvokeEventa<number, number>(),\n * greet: defineInvokeEventa<string, { name: string }>(),\n * }\n *\n * defineInvokeHandlers(ctx, events, {\n * double: value => value * 2,\n * greet: ({ name }) => `hi ${name}`,\n * })\n * ```\n *\n * @param ctx Event context on the handler/server side.\n * @param events Map of invoke events created by `defineInvokeEventa`.\n * @param handlers Map of handlers keyed by event name.\n */\nexport function defineInvokeHandlers<\n EK extends string,\n EventMap extends Record<EK, InvokeEventa<any, any, any, any>>,\n CtxExt = any,\n EOpts extends { raw?: any } = any,\n>(\n ctx: InvocableEventContext<CtxExt, EOpts>,\n events: EventMap,\n handlers: HandlerMap<EventMap, EOpts>,\n): Record<EK, () => void> {\n const eventKeys = Object.keys(events) as EK[]\n const handlerKeys = new Set(Object.keys(handlers) as EK[])\n\n if (eventKeys.length !== handlerKeys.size || !eventKeys.every(key => handlerKeys.has(key))) {\n throw new Error('The keys of events and handlers must match.')\n }\n\n return eventKeys.reduce((returnValues, key) => {\n returnValues[key] = defineInvokeHandler(ctx, events[key], handlers[key])\n return returnValues\n }, {} as Record<EK, () => void>)\n}\n\n/**\n * Remove one or all invoke handlers for a specific invoke event (server side).\n *\n * @example\n * ```ts\n * const off = defineInvokeHandler(ctx, events, handler)\n * off() // remove one handler\n *\n * // or remove all handlers for the event:\n * undefineInvokeHandler(ctx, events)\n * ```\n *\n * @param ctx Event context on the handler/server side.\n * @param event Invoke event definition created by `defineInvokeEventa`.\n * @param handler Specific handler to remove (omit to remove all).\n * @returns `true` if at least one handler was removed, `false` otherwise\n */\nexport function undefineInvokeHandler<\n Res,\n Req = undefined,\n ResErr = Error,\n ReqErr = Error,\n CtxExt = any,\n EOpts = any,\n>(\n ctx: InvocableEventContext<CtxExt, EOpts>,\n event: InvokeEventa<Res, Req, ResErr, ReqErr>,\n handler?: Handler<Res, Req, InvocableEventContext<CtxExt, EOpts>, EOpts>,\n): boolean {\n if (!ctx.invokeHandlers)\n return false\n\n const handlers = ctx.invokeHandlers?.get(event.sendEvent.id)\n if (!handlers)\n return false\n\n if (handler) {\n const internalHandler = handlers.get(handler)\n if (!internalHandler)\n return false\n\n ctx.off(event.sendEvent, internalHandler.onSend)\n ctx.off(event.sendEventStreamEnd, internalHandler.onSendStreamEnd)\n ctx.off(event.sendEventAbort, internalHandler.onSendAbort)\n ctx.invokeHandlers.delete(event.sendEvent.id)\n\n return true\n }\n\n let returnValue = false\n for (const internalHandlers of handlers.values()) {\n ctx.off(event.sendEvent, internalHandlers.onSend)\n ctx.off(event.sendEventStreamEnd, internalHandlers.onSendStreamEnd)\n ctx.off(event.sendEventAbort, internalHandlers.onSendAbort)\n returnValue = true\n }\n\n ctx.invokeHandlers.delete(event.sendEvent.id)\n\n return returnValue\n}\n","import type { EventContext } from './context'\nimport type { ExtendableInvokeResponse } from './invoke'\n\nexport interface WithTransfer<T> {\n message: T\n _transfer?: Transferable[]\n}\n\nexport function withTransfer<T>(body: T, transfer?: Transferable[]): ExtendableInvokeResponse<T, EventContext<{ invokeResponse?: { transfer?: Transferable[] } }, any>> {\n return {\n response: body,\n invokeResponse: {\n transfer: transfer ?? [],\n },\n }\n}\n","import type { EventContext } from './context'\nimport type { ExtractInvokeRequestOptions, Handler, InvocableEventContext } from './invoke'\nimport type { InvokeEventa } from './invoke-shared'\n\nimport { nanoid } from './eventa'\nimport { defineInvoke, defineInvokeHandler } from './invoke'\nimport { defineInvokeEventa } from './invoke-shared'\n\nexport interface InvokeFunctionStubOptions {\n allow?: boolean\n maxDepth?: number\n maxFunctions?: number\n tagPrefix?: string\n onDisallowedTag?: 'ignore' | 'throw'\n autoDisposeMs?: number\n strict?: boolean\n}\n\nexport type RemoteInvokeOptions<EC extends EventContext<any, any>> = ExtractInvokeRequestOptions<EC> & {\n functionStubs?: boolean | InvokeFunctionStubOptions\n}\n\nexport interface RemoteInvokeResult<Res> extends Promise<Res> {\n dispose: () => void\n}\n\nexport type RemoteInvokeFunction<Res, Req, EC extends EventContext<any, any>>\n = [Req] extends [undefined]\n ? (req?: Req, options?: RemoteInvokeOptions<EC>) => RemoteInvokeResult<Res>\n : (req: Req, options?: RemoteInvokeOptions<EC>) => RemoteInvokeResult<Res>\n\nconst DEFAULT_FUNCTION_STUB_OPTIONS: Required<Pick<InvokeFunctionStubOptions, 'maxDepth' | 'maxFunctions' | 'tagPrefix' | 'onDisallowedTag' | 'autoDisposeMs' | 'strict'>> = {\n maxDepth: 32,\n maxFunctions: 32,\n tagPrefix: 'eventa-invoke-fn-',\n onDisallowedTag: 'ignore',\n autoDisposeMs: 0,\n strict: false,\n}\n\nexport function createRemoteMethodTagPrefix(prefix = DEFAULT_FUNCTION_STUB_OPTIONS.tagPrefix) {\n return `${prefix}${nanoid()}-`\n}\n\nfunction normalizeFunctionStubOptions(options?: boolean | InvokeFunctionStubOptions) {\n if (options === true) {\n return {\n allow: true,\n ...DEFAULT_FUNCTION_STUB_OPTIONS,\n }\n }\n if (!options) {\n return {\n allow: false,\n ...DEFAULT_FUNCTION_STUB_OPTIONS,\n }\n }\n\n return {\n allow: options.allow ?? true,\n maxDepth: options.maxDepth ?? DEFAULT_FUNCTION_STUB_OPTIONS.maxDepth,\n maxFunctions: options.maxFunctions ?? DEFAULT_FUNCTION_STUB_OPTIONS.maxFunctions,\n tagPrefix: options.tagPrefix ?? DEFAULT_FUNCTION_STUB_OPTIONS.tagPrefix,\n onDisallowedTag: options.onDisallowedTag ?? DEFAULT_FUNCTION_STUB_OPTIONS.onDisallowedTag,\n autoDisposeMs: options.autoDisposeMs ?? DEFAULT_FUNCTION_STUB_OPTIONS.autoDisposeMs,\n strict: options.strict ?? DEFAULT_FUNCTION_STUB_OPTIONS.strict,\n }\n}\n\nfunction resolveFunctionStubOptions(\n defaults?: boolean | InvokeFunctionStubOptions,\n override?: boolean | InvokeFunctionStubOptions,\n) {\n const base = normalizeFunctionStubOptions(defaults)\n\n if (typeof override === 'undefined') {\n return base\n }\n if (typeof override === 'boolean') {\n return {\n ...base,\n allow: override,\n }\n }\n\n return {\n ...base,\n ...normalizeFunctionStubOptions(override),\n }\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n if (value == null || typeof value !== 'object') {\n return false\n }\n\n const prototype = Object.getPrototypeOf(value)\n return prototype === Object.prototype || prototype === null\n}\n\ninterface InvokeFunctionStubPayload {\n __eventaInvoke?: {\n tag: string\n }\n}\n\nfunction isInvokeFunctionStubPayload(value: unknown): value is InvokeFunctionStubPayload {\n if (!isPlainObject(value)) {\n return false\n }\n if (!('__eventaInvoke' in value)) {\n return false\n }\n\n const stub = (value as InvokeFunctionStubPayload).__eventaInvoke\n return !!stub && typeof stub === 'object' && typeof stub.tag === 'string'\n}\n\nfunction hasInvokeFunctionStubKey(value: unknown): value is Record<string, unknown> {\n return isPlainObject(value) && '__eventaInvoke' in value\n}\n\nfunction serializeInvokeFunctionPayload<T>(\n value: T,\n ctx: InvocableEventContext<any, any>,\n options: ReturnType<typeof normalizeFunctionStubOptions>,\n) {\n if (!options.allow) {\n return { value, dispose: () => void 0 }\n }\n\n let functionCount = 0\n const seen = new WeakMap<object, any>()\n const disposers: Array<() => void> = []\n\n const walk = (input: any, depth: number): any => {\n if (typeof input === 'function') {\n if (functionCount >= options.maxFunctions) {\n throw new Error(`Too many function stubs in invoke payload (max ${options.maxFunctions}).`)\n }\n\n functionCount += 1\n const tag = `${options.tagPrefix}${nanoid()}`\n const event = defineInvokeEventa<any, any>(tag)\n const off = defineInvokeHandler(ctx, event, (payload, handlerOptions) => {\n return input(payload, handlerOptions)\n })\n disposers.push(off)\n\n return { __eventaInvoke: { tag } }\n }\n\n if (input == null || typeof input !== 'object') {\n return input\n }\n\n if (depth > options.maxDepth) {\n throw new Error(`Invoke payload is too deep (max ${options.maxDepth}).`)\n }\n\n if (seen.has(input)) {\n return seen.get(input)\n }\n\n if (Array.isArray(input)) {\n const output: any[] = Array.from({ length: input.length })\n seen.set(input, output)\n for (let i = 0; i < input.length; i += 1) {\n output[i] = walk(input[i], depth + 1)\n }\n return output\n }\n\n if (!isPlainObject(input)) {\n return input\n }\n\n // Use null-prototype object to mitigate prototype pollution attacks\n // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object#null-prototype_objects\n // https://github.com/OWASP/CheatSheetSeries/blob/38a2e501d345c710207b492a50f46e0f368578fe/cheatsheets/Prototype_Pollution_Prevention_Cheat_Sheet.md\n // https://cheatsheetseries.owasp.org/cheatsheets/Prototype_Pollution_Prevention_Cheat_Sheet.html#other-resources\n const output: Record<string, any> = Object.create(null)\n seen.set(input, output)\n for (const [key, child] of Object.entries(input)) {\n output[key] = walk(child, depth + 1)\n }\n return output\n }\n\n return {\n value: walk(value, 0) as T,\n dispose: () => {\n for (const off of disposers) {\n off()\n }\n },\n }\n}\n\nfunction deserializeInvokeFunctionPayload<T>(\n value: T,\n ctx: EventContext<any, any>,\n options: ReturnType<typeof normalizeFunctionStubOptions>,\n) {\n if (!options.allow) {\n return value\n }\n\n let functionCount = 0\n const seen = new WeakMap<object, any>()\n\n const walk = (input: any, depth: number): any => {\n if (input == null || typeof input !== 'object') {\n return input\n }\n\n if (depth > options.maxDepth) {\n throw new Error(`Invoke payload is too deep (max ${options.maxDepth}).`)\n }\n\n if (isInvokeFunctionStubPayload(input)) {\n if (functionCount >= options.maxFunctions) {\n throw new Error(`Too many function stubs in invoke payload (max ${options.maxFunctions}).`)\n }\n\n const tag = input.__eventaInvoke!.tag\n if (options.tagPrefix && !tag.startsWith(options.tagPrefix)) {\n if (options.onDisallowedTag === 'throw') {\n throw new Error(`Invoke function tag not allowed: ${tag}`)\n }\n\n return input\n }\n\n functionCount += 1\n const event = defineInvokeEventa<any, any>(tag)\n\n return defineInvoke(ctx as EventContext<any, any>, event)\n }\n else if (options.strict && hasInvokeFunctionStubKey(input)) {\n throw new Error('Invalid invoke function stub payload.')\n }\n\n if (seen.has(input)) {\n return seen.get(input)\n }\n\n if (Array.isArray(input)) {\n const output: any[] = Array.from({ length: input.length })\n seen.set(input, output)\n for (let i = 0; i < input.length; i += 1) {\n output[i] = walk(input[i], depth + 1)\n }\n return output\n }\n\n if (!isPlainObject(input)) {\n return input\n }\n\n // Use null-prototype object to mitigate prototype pollution attacks\n // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object#null-prototype_objects\n // https://github.com/OWASP/CheatSheetSeries/blob/38a2e501d345c710207b492a50f46e0f368578fe/cheatsheets/Prototype_Pollution_Prevention_Cheat_Sheet.md\n // https://cheatsheetseries.owasp.org/cheatsheets/Prototype_Pollution_Prevention_Cheat_Sheet.html#other-resources\n const output: Record<string, any> = Object.create(null)\n seen.set(input, output)\n for (const [key, child] of Object.entries(input)) {\n output[key] = walk(child, depth + 1)\n }\n\n return output\n }\n\n return walk(value, 0) as T\n}\n\n/**\n * Enable \"remote method\" payloads for invoke: functions in the request body are\n * serialized into stub descriptors and rehydrated into invoke callers on the\n * receiving side.\n *\n * This is an adapter around the plain-value RPC primitives `defineInvoke` and\n * `defineInvokeHandler`. It keeps the core invoke APIs clean while offering an\n * opt-in bridge for function values.\n *\n * @example\n * ```ts\n * const remote = withRemoteMethods({ allow: true })\n * const events = defineInvokeEventa<{ output: number }, { helper: (n: number) => Promise<number> }>()\n *\n * // server (handler)\n * remote.defineInvokeHandler(serverCtx, events, async ({ helper }) => {\n * const output = await helper(21)\n * return { output }\n * })\n *\n * // client (caller)\n * const invoke = remote.defineInvoke(clientCtx, events)\n * const result = await invoke({ helper: async n => n * 2 }, { functionStubs: true })\n * ```\n *\n * @example\n * ```ts\n * // Manual cleanup when you fire-and-forget or cancel midway:\n * const invoke = remote.defineInvoke(clientCtx, events)\n * const result = invoke({ helper: () => 'ok' }, { functionStubs: true })\n * result.dispose()\n * await result\n * ```\n *\n * Security notes:\n * - This feature is off by default. Enabling it allows the remote side to call\n * back into your process; only use with trusted peers.\n * - Function stubs are tagged; prefer a unique `tagPrefix` to avoid collisions\n * (see `createRemoteMethodTagPrefix`).\n * - `maxDepth`, `maxFunctions`, and `autoDisposeMs` limit attack surface and\n * resource usage. `autoDisposeMs` is useful for fire-and-forget calls.\n * - Objects are rebuilt with a null prototype to mitigate `__proto__` pollution.\n * - Enable `strict` to reject malformed `__eventaInvoke` payloads.\n *\n * @param defaultOptions Defaults for function stub behavior. Use `{ allow: true }`\n * to enable, or provide `maxDepth`, `maxFunctions`, `tagPrefix`,\n * `onDisallowedTag`, `autoDisposeMs`, and `strict` for stricter control.\n */\nexport function withRemoteMethods(defaultOptions?: boolean | InvokeFunctionStubOptions) {\n return {\n defineInvoke<\n Res,\n Req = undefined,\n ResErr = Error,\n ReqErr = Error,\n CtxExt = any,\n EOpts = any,\n ECtx extends EventContext<CtxExt, EOpts> = EventContext<CtxExt, EOpts>,\n >(ctx: ECtx,\n event: InvokeEventa<Res, Req, ResErr, ReqErr>,\n ): RemoteInvokeFunction<Res, Req, ECtx> {\n const baseInvoke = defineInvoke(ctx, event)\n\n const invoke = ((req?: Req, options?: RemoteInvokeOptions<ECtx>) => {\n const { functionStubs, ...invokeOptions } = (options ?? {}) as RemoteInvokeOptions<ECtx> & Record<string, any>\n const normalizedOptions = resolveFunctionStubOptions(defaultOptions, functionStubs)\n\n if (!normalizedOptions.allow) {\n const promise = baseInvoke(req as Req, invokeOptions as ExtractInvokeRequestOptions<ECtx>)\n const wrapped = promise as RemoteInvokeResult<Res>\n wrapped.dispose = () => void 0\n\n return wrapped\n }\n\n let serialized: ReturnType<typeof serializeInvokeFunctionPayload<Req>>\n try {\n serialized = serializeInvokeFunctionPayload(req as Req, ctx as InvocableEventContext<any, any>, normalizedOptions)\n }\n catch (error) {\n const rejected = Promise.reject(error) as RemoteInvokeResult<Res>\n rejected.dispose = () => void 0\n\n return rejected\n }\n\n let disposed = false\n const dispose = () => {\n if (disposed) {\n return\n }\n\n disposed = true\n serialized.dispose()\n }\n\n let autoDisposeTimer: ReturnType<typeof setTimeout> | undefined\n if (normalizedOptions.autoDisposeMs > 0) {\n autoDisposeTimer = setTimeout(() => {\n dispose()\n }, normalizedOptions.autoDisposeMs)\n }\n\n const finalize = () => {\n if (autoDisposeTimer) {\n clearTimeout(autoDisposeTimer)\n }\n dispose()\n }\n\n const promise = baseInvoke(serialized.value as Req, invokeOptions as ExtractInvokeRequestOptions<ECtx>)\n .finally(finalize)\n\n const wrapped = promise as RemoteInvokeResult<Res>\n wrapped.dispose = finalize\n\n return wrapped\n }) as RemoteInvokeFunction<Res, Req, ECtx>\n\n return invoke\n },\n\n defineInvokeHandler<\n Res,\n Req = undefined,\n ResErr = Error,\n ReqErr = Error,\n CtxExt = any,\n EOpts extends { raw?: any } = any,\n >(\n ctx: InvocableEventContext<CtxExt, EOpts>,\n event: InvokeEventa<Res, Req, ResErr, ReqErr>,\n handler: Handler<Res, Req, InvocableEventContext<CtxExt, EOpts>, EOpts>,\n ) {\n const normalizedOptions = resolveFunctionStubOptions(defaultOptions)\n\n return defineInvokeHandler(ctx, event, async (payload, options) => {\n const handlerPayload = normalizedOptions.allow\n ? deserializeInvokeFunctionPayload(payload as Req, ctx, normalizedOptions)\n : payload\n\n return handler(handlerPayload as Req, options)\n })\n },\n }\n}\n","import type { EventContext } from './context'\nimport type {\n InvokeEventa,\n ReceiveEvent,\n ReceiveEventError,\n ReceiveEventStreamEnd,\n} from './invoke-shared'\n\nimport { defineEventa, nanoid } from './eventa'\nimport { createAbortError, isAbortError, isAsyncIterable, isReadableStream } from './utils'\n\n/**\n * Create a stream invoke function (client side).\n *\n * Use when the response is streamed and the request may be unary or streaming.\n *\n * Common patterns:\n * - Unary request -> stream response (server-streaming)\n * - Stream request -> stream response (bi-directional streaming)\n *\n * @example\n * ```ts\n * // 1) Define eventa once (shared by client/server)\n * const events = defineInvokeEventa<Progress | Result, Params>()\n *\n * // 2) Client: define invoke function\n * const invoke = defineStreamInvoke(clientCtx, events)\n *\n * // 3) Call with unary request\n * for await (const msg of invoke({ name: 'alice' })) {\n * console.log(msg)\n * }\n * ```\n *\n * @example\n * ```ts\n * // Client-streaming request\n * const input = new ReadableStream<number>({\n * start(c) { c.enqueue(1); c.enqueue(2); c.close() },\n * })\n *\n * for await (const msg of invoke(input)) {\n * console.log(msg)\n * }\n * ```\n *\n * @param clientCtx Event context on the caller/client side.\n * @param event Invoke event definition created by `defineInvokeEventa`.\n */\nexport function defineStreamInvoke<\n Res,\n Req = undefined,\n ResErr = Error,\n ReqErr = Error,\n E = any,\n EO = any,\n>(clientCtx: EventContext<E, EO>, event: InvokeEventa<Res, Req, ResErr, ReqErr>) {\n return (req: Req | ReadableStream<Req> | AsyncIterable<Req>, options?: { signal?: AbortSignal } & EO) => {\n const invokeId = nanoid()\n const { signal, ...emitOptions } = (options ?? {}) as { signal?: AbortSignal } & Record<string, any>\n let onAbort: (() => void) | undefined\n\n const invokeReceiveEvent = defineEventa(`${event.receiveEvent.id}-${invokeId}`) as ReceiveEvent<Res>\n const invokeReceiveEventError = defineEventa(`${event.receiveEventError.id}-${invokeId}`) as ReceiveEventError<Res, Req, ResErr, ReqErr>\n const invokeReceiveEventStreamEnd = defineEventa(`${event.receiveEventStreamEnd.id}-${invokeId}`) as ReceiveEventStreamEnd<Res>\n\n const stream = new ReadableStream<Res>({\n start(controller) {\n const cleanup = () => {\n clientCtx.off(invokeReceiveEvent)\n clientCtx.off(invokeReceiveEventError)\n clientCtx.off(invokeReceiveEventStreamEnd)\n if (signal && onAbort) {\n signal.removeEventListener('abort', onAbort)\n }\n }\n\n onAbort = () => {\n clientCtx.emit(event.sendEventAbort, { invokeId, content: signal?.reason }, emitOptions as any)\n controller.error(createAbortError(signal?.reason))\n cleanup()\n }\n\n clientCtx.on(invokeReceiveEvent, (payload) => {\n if (!payload.body) {\n return\n }\n if (payload.body.invokeId !== invokeId) {\n return\n }\n\n controller.enqueue(payload.body.content as Res)\n })\n clientCtx.on(invokeReceiveEventError, (payload) => {\n if (!payload.body) {\n return\n }\n if (payload.body.invokeId !== invokeId) {\n return\n }\n\n controller.error(payload.body.content.error as ResErr)\n cleanup()\n })\n clientCtx.on(invokeReceiveEventStreamEnd, (payload) => {\n if (!payload.body) {\n return\n }\n if (payload.body.invokeId !== invokeId) {\n return\n }\n\n controller.close()\n cleanup()\n })\n\n if (signal && onAbort) {\n if (signal.aborted) {\n onAbort()\n return\n }\n signal.addEventListener('abort', onAbort as EventListener, { once: true })\n }\n },\n cancel(reason) {\n clientCtx.emit(event.sendEventAbort, { invokeId, content: reason }, emitOptions as any)\n clientCtx.off(invokeReceiveEvent)\n clientCtx.off(invokeReceiveEventError)\n clientCtx.off(invokeReceiveEventStreamEnd)\n if (signal && onAbort) {\n signal.removeEventListener('abort', onAbort as EventListener)\n }\n },\n })\n\n if (isReadableStream<Req>(req) || isAsyncIterable<Req>(req)) {\n const sendChunk = (chunk: Req) => {\n clientCtx.emit(event.sendEvent, { invokeId, content: chunk, isReqStream: true }, emitOptions as any) // emit: event_trigger\n }\n\n const sendEnd = () => {\n clientCtx.emit(event.sendEventStreamEnd, { invokeId, content: undefined }, emitOptions as any) // emit: event_stream_end\n }\n\n const pump = async () => {\n try {\n for await (const chunk of req) {\n // If aborted already, no further emits\n if (signal?.aborted) {\n return\n }\n\n sendChunk(chunk)\n }\n\n sendEnd()\n }\n catch (error) {\n // If aborted already, no further emits\n if (signal?.aborted) {\n return\n }\n if (isAbortError(error)) {\n clientCtx.emit(event.sendEventAbort, { invokeId, content: error }, emitOptions as any)\n return\n }\n\n clientCtx.emit(event.sendEventError, { invokeId, content: error as ReqErr }, emitOptions as any) // emit: event_error\n }\n }\n\n pump()\n }\n else {\n clientCtx.emit(event.sendEvent, { invokeId, content: req }, emitOptions as any) // emit: event_trigger\n }\n\n return stream\n }\n}\n\ntype StreamHandler<Res, Req = any, RawEventOptions = unknown> = (\n payload: Req,\n options?: {\n abortController?: AbortController\n } & RawEventOptions,\n) => AsyncGenerator<Res, void, unknown>\n\n/**\n * Define a stream invoke handler (server side).\n *\n * The handler can receive either:\n * - a unary request `Req`\n * - a streaming request `ReadableStream<Req>` / `AsyncIterable<Req>`\n *\n * It must return an async generator of response messages.\n *\n * @example\n * ```ts\n * const events = defineInvokeEventa<Progress | Result, Params>()\n *\n * defineStreamInvokeHandler(serverCtx, events, async function* (payload) {\n * if (isReadableStream<Params>(payload) || isAsyncIterable<Params>(payload)) {\n * for await (const item of payload) {\n * yield { type: 'progress', value: item }\n * }\n * }\n *\n * yield { type: 'result', ok: true }\n * })\n * ```\n *\n * @param serverCtx Event context on the handler/server side.\n * @param event Invoke event definition created by `defineInvokeEventa`.\n * @param fn Stream handler that yields response chunks.\n */\nexport function defineStreamInvokeHandler<\n Res,\n Req = undefined,\n ResErr = Error,\n ReqErr = Error,\n E = any,\n EO extends { raw?: any } = any,\n>(serverCtx: EventContext<E, EO>, event: InvokeEventa<Res, Req, ResErr, ReqErr>, fn: StreamHandler<Res, Req, EO>) {\n const invokeReceiveEvent = (invokeId: string) => defineEventa(`${event.receiveEvent.id}-${invokeId}`) as ReceiveEvent<Res>\n const invokeReceiveEventError = (invokeId: string) => defineEventa(`${event.receiveEventError.id}-${invokeId}`) as ReceiveEventError<Res, Req, ResErr, ReqErr>\n const invokeReceiveEventStreamEnd = (invokeId: string) => defineEventa(`${event.receiveEventStreamEnd.id}-${invokeId}`) as ReceiveEventStreamEnd<Res>\n const streamStates = new Map<string, ReadableStreamDefaultController<Req>>()\n const abortControllers = new Map<string, AbortController>()\n const abortReasons = new Map<string, unknown>()\n const scheduleAbort = (controller: AbortController, reason: unknown) => {\n if (typeof queueMicrotask !== 'undefined') {\n queueMicrotask(() => controller.abort(reason))\n return\n }\n Promise.resolve().then(() => controller.abort(reason))\n }\n\n const handleInvoke = async (invokeId: string, payload: Req, options?: EO) => {\n const receiveEvent = invokeReceiveEvent(invokeId)\n const receiveEventError = invokeReceiveEventError(invokeId)\n const receiveEventStreamEnd = invokeReceiveEventStreamEnd(invokeId)\n const abortController = new AbortController()\n abortControllers.set(invokeId, abortController)\n\n if (abortReasons.has(invokeId)) {\n scheduleAbort(abortController, abortReasons.get(invokeId))\n }\n\n const handlerOptions = options\n ? { ...options, abortController }\n : ({ abortController } as EO & { abortController: AbortController })\n\n try {\n const generator = fn(payload, handlerOptions) // Call the handler function with the request payload\n for await (const res of generator) {\n serverCtx.emit(receiveEvent, { invokeId, content: res }, options) // emit: event_response\n }\n\n serverCtx.emit(receiveEventStreamEnd, { invokeId, content: undefined }, options) // emit: event_stream_end\n }\n catch (error) {\n serverCtx.emit(receiveEventError, { invokeId, content: { error: error as ResErr } }, options) // emit: event_response with error\n }\n finally {\n abortControllers.delete(invokeId)\n abortReasons.delete(invokeId)\n }\n }\n\n serverCtx.on(event.sendEvent, async (payload, options) => { // on: event_trigger\n if (!payload.body) {\n return\n }\n if (!payload.body.invokeId) {\n return\n }\n\n const invokeId = payload.body.invokeId\n if (payload.body.isReqStream) {\n let controller = streamStates.get(invokeId)\n if (!controller) {\n let localController: ReadableStreamDefaultController<Req>\n const reqStream = new ReadableStream<Req>({\n start(c) {\n localController = c\n },\n })\n\n controller = localController!\n streamStates.set(invokeId, controller)\n // TODO: can we write type Req here correctly?\n handleInvoke(invokeId, reqStream as Req, options)\n }\n\n controller.enqueue(payload.body.content as Req)\n return\n }\n\n handleInvoke(invokeId, payload.body.content as Req, options)\n })\n\n serverCtx.on(event.sendEventStreamEnd, (payload) => { // on: event_stream_end\n if (!payload.body) {\n return\n }\n if (!payload.body.invokeId) {\n return\n }\n\n const controller = streamStates.get(payload.body.invokeId)\n if (!controller) {\n return\n }\n\n controller.close()\n streamStates.delete(payload.body.invokeId)\n })\n\n serverCtx.on(event.sendEventAbort, (payload) => { // on: event_abort\n if (!payload.body) {\n return\n }\n if (!payload.body.invokeId) {\n return\n }\n\n const invokeId = payload.body.invokeId\n const reason = payload.body.content\n const abortController = abortControllers.get(invokeId)\n if (!abortController) {\n abortReasons.set(invokeId, reason)\n\n let controller = streamStates.get(invokeId)\n if (!controller) {\n let localController: ReadableStreamDefaultController<Req>\n const reqStream = new ReadableStream<Req>({\n start(c) {\n localController = c\n },\n })\n\n controller = localController!\n streamStates.set(invokeId, controller)\n handleInvoke(invokeId, reqStream as Req)\n }\n\n controller.error(createAbortError(reason))\n streamStates.delete(invokeId)\n return\n }\n\n scheduleAbort(abortController, reason)\n\n const controller = streamStates.get(invokeId)\n if (controller) {\n controller.error(createAbortError(reason))\n streamStates.delete(invokeId)\n }\n })\n}\n\n/**\n * Convert a callback-style handler into a stream handler.\n *\n * Use `emit` to push response chunks, and return when done.\n * Works for unary or streaming requests.\n *\n * @example\n * ```ts\n * defineStreamInvokeHandler(ctx, events, toStreamHandler(async ({ payload, emit }) => {\n * if (isReadableStream<Params>(payload) || isAsyncIterable<Params>(payload)) {\n * for await (const item of payload) {\n * emit({ type: 'progress', value: item })\n * }\n *\n * emit({ type: 'result', ok: true })\n * return\n * }\n *\n * emit({ type: 'result', ok: true })\n * }))\n * ```\n *\n * @param handler Callback handler with `emit` for streaming responses.\n */\nexport function toStreamHandler<Req, Res, EO extends { raw?: any } = any>(handler: (context: { payload: Req, options?: EO, emit: (data: Res) => void }) => Promise<void>): StreamHandler<Res, Req, EO> {\n return (payload, options) => {\n const values: Promise<[Res, boolean]>[] = []\n let resolve: (x: [Res, boolean]) => void\n let handlerError: Error | null = null\n\n values.push(new Promise((r) => {\n resolve = r\n }))\n\n const emit = (data: Res) => {\n resolve([data, false])\n\n values.push(new Promise((r) => {\n resolve = r\n }))\n }\n\n // Start the handler and mark completion when done\n handler({ payload, options, emit })\n .then(() => {\n resolve([undefined as any, true])\n })\n .catch((err) => {\n handlerError = err\n resolve([undefined as any, true])\n })\n\n return (async function* () {\n let val: Res\n\n for (let i = 0, done = false; !done; i++) {\n [val, done] = await values[i]\n delete values[i] // Clean up memory\n\n if (handlerError) {\n throw handlerError\n }\n\n if (!done) {\n yield val\n }\n }\n }())\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"src-eMqISeHo.mjs","names":["resolve!: (r: Awaited<R>) => void","resolve!: () => void","resolve!: (value: T) => void","ctx","abortOffs: Array<() => void>","body: any","localController: ReadableStreamDefaultController<Req>","streamController","DEFAULT_FUNCTION_STUB_OPTIONS: Required<Pick<InvokeFunctionStubOptions, 'maxDepth' | 'maxFunctions' | 'tagPrefix' | 'onDisallowedTag' | 'autoDisposeMs' | 'strict'>>","disposers: Array<() => void>","output: any[]","output","output: Record<string, any>","wrapped","serialized: ReturnType<typeof serializeInvokeFunctionPayload<Req>>","autoDisposeTimer: ReturnType<typeof setTimeout> | undefined","onAbort: (() => void) | undefined","localController: ReadableStreamDefaultController<Req>","controller","values: Promise<[Res, boolean]>[]","resolve: (x: [Res, boolean]) => void","handlerError: Error | null","val: Res"],"sources":["../src/context-extension-invoke-internal.ts","../src/invoke-shared.ts","../src/utils.ts","../src/invoke.ts","../src/invoke-extension-transfer.ts","../src/invoke-remote-methods.ts","../src/stream.ts"],"sourcesContent":["import type { EventContext } from './context'\nimport type { Eventa, EventaMatchExpression } from './eventa'\n\n/**\n * Internal invoke configuration carried on context extensions.\n *\n * Known usage: worker adapters (webworkers/worker-threads) use this to\n * abort pending invokes when the worker emits a fatal error event.\n */\nexport interface InvokeInternalConfig<EO = any> {\n abortOnEvents?: Array<Eventa<any> | EventaMatchExpression<any>>\n mapAbortError?: (payload: Eventa<any>, options?: EO) => unknown\n}\n\n/**\n * Read the internal invoke configuration from context extensions, if present.\n * This is used by defineInvoke to determine which events should abort inflight invokes.\n */\nexport function getContextExtensionInvokeInternalConfig<EO = any>(ctx: EventContext<any, EO>): InvokeInternalConfig<EO> | undefined {\n const extensions = (ctx as EventContext<any, EO> & { extensions?: any }).extensions\n if (!extensions || typeof extensions !== 'object') {\n return undefined\n }\n\n const internal = extensions.__internal\n if (!internal || typeof internal !== 'object') {\n return undefined\n }\n\n const invoke = internal.invoke\n if (!invoke || typeof invoke !== 'object') {\n return undefined\n }\n\n return invoke as InvokeInternalConfig<EO>\n}\n\n/**\n * Register a fatal event/match expression that should terminate pending invokes.\n * Adapters call this to wire their error events (e.g. worker error) into invoke.\n */\nexport function registerInvokeAbortEventListeners<EO = any>(\n ctx: EventContext<any, EO>,\n eventOrMatch: Eventa<any> | EventaMatchExpression<any>,\n): InvokeInternalConfig<EO> {\n const extensions = ((ctx as EventContext<any, EO> & { extensions?: any }).extensions ?? {}) as Record<string, any>\n const internal = (extensions.__internal ?? {}) as Record<string, any>\n const invokeInternal = (internal.invoke ?? {}) as Record<string, any>\n const abortOnEvents = Array.isArray(invokeInternal.abortOnEvents) ? invokeInternal.abortOnEvents : []\n\n if (!abortOnEvents.includes(eventOrMatch)) {\n abortOnEvents.push(eventOrMatch)\n }\n\n invokeInternal.abortOnEvents = abortOnEvents\n internal.invoke = invokeInternal\n extensions.__internal = internal\n ;(ctx as EventContext<any, EO> & { extensions?: any }).extensions = extensions\n\n return invokeInternal as InvokeInternalConfig<EO>\n}\n","import type { Eventa, EventTag } from './eventa'\n\nimport { defineEventa, nanoid } from './eventa'\n\nexport enum InvokeEventType {\n SendEvent,\n SendEventError,\n SendEventStreamEnd,\n SendEventAbort,\n ReceiveEvent,\n ReceiveEventError,\n ReceiveEventStreamEnd,\n}\n\nexport interface SendEvent<Res, Req = undefined, _ = undefined, __ = undefined> extends Eventa<{ invokeId: string, content: Req, isReqStream?: boolean }> {\n id: EventTag<Res, Req>\n invokeType: InvokeEventType.SendEvent\n}\nexport interface SendEventError<Res, Req = undefined, _ = undefined, ReqErr = Error> extends Eventa<{ invokeId: string, content: ReqErr }> {\n id: EventTag<Res, Req>\n invokeType: InvokeEventType.SendEventError\n}\nexport interface SendEventStreamEnd<Res, Req = undefined, _ = undefined, __ = undefined> extends Eventa<{ invokeId: string, content: undefined }> {\n id: EventTag<Res, Req>\n invokeType: InvokeEventType.SendEventStreamEnd\n}\nexport interface SendEventAbort<Res, Req = undefined, _ = undefined, __ = undefined> extends Eventa<{ invokeId: string, content?: unknown }> {\n id: EventTag<Res, Req>\n invokeType: InvokeEventType.SendEventAbort\n}\nexport interface ReceiveEvent<Res, Req = undefined, _ = undefined, __ = undefined> extends Eventa<{ invokeId: string, content: Res }> {\n id: EventTag<Res, Req>\n invokeType: InvokeEventType.ReceiveEvent\n}\nexport interface ReceiveEventError<Res, Req = undefined, ResErr = undefined, _ = undefined> extends Eventa<{ invokeId: string, content: { error: ResErr } }> {\n id: EventTag<Res, Req>\n invokeType: InvokeEventType.ReceiveEventError\n}\nexport interface ReceiveEventStreamEnd<Res, Req = undefined, _ = undefined, __ = undefined> extends Eventa<{ invokeId: string, content: undefined }> {\n id: EventTag<Res, Req>\n invokeType: InvokeEventType.ReceiveEventStreamEnd\n}\n\nexport interface InvokeEventa<Res, Req = undefined, ResErr = Error, ReqErr = Error> {\n sendEvent: SendEvent<Res, Req, ResErr, ReqErr>\n sendEventError: SendEventError<Res, Req, ResErr, ReqErr>\n sendEventStreamEnd: SendEventStreamEnd<Res, Req, ResErr, ReqErr>\n sendEventAbort: SendEventAbort<Res, Req, ResErr, ReqErr>\n receiveEvent: ReceiveEvent<Res, Req, ResErr, ReqErr>\n receiveEventError: ReceiveEventError<Res, Req, ResErr, ReqErr>\n receiveEventStreamEnd: ReceiveEventStreamEnd<Res, Req, ResErr, ReqErr>\n}\n\nexport type InferSendEvent<T> = T extends { sendEvent: SendEvent<infer Res, infer Req, infer ResErr, infer ReqErr> }\n ? SendEvent<Res, Req, ResErr, ReqErr>\n : never\n\nexport type InferSendEventError<T> = T extends { sendEventError: SendEventError<infer Res, infer Req, infer ResErr, infer ReqErr> }\n ? SendEventError<Res, Req, ResErr, ReqErr>\n : never\n\nexport type InferSendEventStreamEnd<T> = T extends { sendEventStreamEnd: SendEventStreamEnd<infer Res, infer Req, infer ResErr, infer ReqErr> }\n ? SendEventStreamEnd<Res, Req, ResErr, ReqErr>\n : never\n\nexport type InferSendEventAbort<T> = T extends { sendEventAbort: SendEventAbort<infer Res, infer Req, infer ResErr, infer ReqErr> }\n ? SendEventAbort<Res, Req, ResErr, ReqErr>\n : never\n\nexport type InferReceiveEvent<T> = T extends { receiveEvent: ReceiveEvent<infer Res, infer Req, infer ResErr, infer ReqErr> }\n ? ReceiveEvent<Res, Req, ResErr, ReqErr>\n : never\n\nexport type InferReceiveEventError<T> = T extends { receiveEventError: ReceiveEventError<infer Res, infer Req, infer ResErr, infer ReqErr> }\n ? ReceiveEventError<Res, Req, ResErr, ReqErr>\n : never\n\nexport type InferReceiveEventStreamEnd<T> = T extends { receiveEventStreamEnd: ReceiveEventStreamEnd<infer Res, infer Req, infer ResErr, infer ReqErr> }\n ? ReceiveEventStreamEnd<Res, Req, ResErr, ReqErr>\n : never\n\nexport function defineInvokeEventa<Res, Req = undefined, ResErr = Error, ReqErr = Error>(tag?: string) {\n if (!tag) {\n tag = nanoid()\n }\n\n const sendEvent = {\n ...defineEventa<InvokeEventType.SendEvent>(`${tag}-send`),\n invokeType: InvokeEventType.SendEvent,\n } as SendEvent<Res, Req, ResErr, ReqErr>\n const sendEventError = {\n ...defineEventa<InvokeEventType.SendEventError>(`${tag}-send-error`),\n invokeType: InvokeEventType.SendEventError,\n } as SendEventError<Res, Req, ResErr, ReqErr>\n const sendEventStreamEnd = {\n ...defineEventa<InvokeEventType.SendEventStreamEnd>(`${tag}-send-stream-end`),\n invokeType: InvokeEventType.SendEventStreamEnd,\n } as SendEventStreamEnd<Res, Req, ResErr, ReqErr>\n const sendEventAbort = {\n ...defineEventa<InvokeEventType.SendEventAbort>(`${tag}-send-abort`),\n invokeType: InvokeEventType.SendEventAbort,\n } as SendEventAbort<Res, Req, ResErr, ReqErr>\n const receiveEvent = {\n ...defineEventa<InvokeEventType.ReceiveEvent>(`${tag}-receive`),\n invokeType: InvokeEventType.ReceiveEvent,\n } as ReceiveEvent<Res, Req, ResErr, ReqErr>\n const receiveEventError = {\n ...defineEventa<InvokeEventType.ReceiveEventError>(`${tag}-receive-error`),\n invokeType: InvokeEventType.ReceiveEventError,\n } as ReceiveEventError<Res, Req, ResErr, ReqErr>\n const receiveEventStreamEnd = {\n ...defineEventa<InvokeEventType.ReceiveEventStreamEnd>(`${tag}-receive-stream-end`),\n invokeType: InvokeEventType.ReceiveEventStreamEnd,\n } as ReceiveEventStreamEnd<Res, Req, ResErr, ReqErr>\n\n return {\n sendEvent,\n sendEventError,\n sendEventStreamEnd,\n sendEventAbort,\n receiveEvent,\n receiveEventError,\n receiveEventStreamEnd,\n } satisfies InvokeEventa<Res, Req, ResErr, ReqErr>\n}\n\nexport function isInvokeEventa(event: Eventa<any>): event is\n | SendEvent<any, any, any, any>\n | SendEventError<any, any, any, any>\n | SendEventStreamEnd<any, any, any, any>\n | ReceiveEvent<any, any, any, any>\n | ReceiveEventError<any, any, any, any>\n | ReceiveEventStreamEnd<any, any, any, any>\n | SendEventAbort<any, any, any, any> {\n if (typeof event !== 'object') {\n return false\n }\n if ('invokeType' in event) {\n return true\n }\n\n return false\n}\n\nexport function isSendEvent(event: Eventa<any>): event is\n | SendEvent<any, any, any, any>\n | SendEventError<any, any, any, any>\n | SendEventStreamEnd<any, any, any, any>\n | SendEventAbort<any, any, any, any> {\n if (!isInvokeEventa(event)) {\n return false\n }\n\n return event.invokeType === InvokeEventType.SendEvent\n || event.invokeType === InvokeEventType.SendEventError\n || event.invokeType === InvokeEventType.SendEventStreamEnd\n || event.invokeType === InvokeEventType.SendEventAbort\n}\n\nexport function isReceiveEvent(event: Eventa<any>): event is\n | ReceiveEvent<any, any, any, any>\n | ReceiveEventError<any, any, any, any>\n | ReceiveEventStreamEnd<any, any, any, any> {\n if (!isInvokeEventa(event)) {\n return false\n }\n\n return event.invokeType === InvokeEventType.ReceiveEvent\n || event.invokeType === InvokeEventType.ReceiveEventError\n || event.invokeType === InvokeEventType.ReceiveEventStreamEnd\n}\n","export function randomBetween(min: number, max: number): number {\n return Math.floor(Math.random() * (max - min + 1)) + min\n}\n\n/**\n * Checks if a value is an AsyncIterable.\n *\n * @param value\n * @returns True if the value is an AsyncIterable.\n */\nexport function isAsyncIterable<T>(value: unknown): value is AsyncIterable<T> {\n return typeof value === 'object'\n && value !== null\n && Symbol.asyncIterator in value\n}\n\n/**\n * Checks if an object is a ReadableStream.\n *\n * @link https://github.com/cloudflare/workerd/blob/88e8696ce7a5f8969a7e02a2dcfb6504c17c9e8d/src/cloudflare/internal/streaming-forms.ts#L3\n * @param obj\n * @returns True if the object looks like a ReadableStream.\n */\nexport function isReadableStream<T>(obj?: unknown | null): obj is ReadableStream<T> {\n return !!(\n obj\n && typeof obj === 'object'\n && 'getReader' in obj\n && typeof obj.getReader === 'function'\n )\n}\n\nexport function createAbortError(reason?: unknown): Error {\n if (reason instanceof Error && reason.name === 'AbortError') {\n return reason\n }\n\n if (typeof DOMException !== 'undefined') {\n try {\n return new DOMException(reason ? String(reason) : 'Aborted', 'AbortError')\n }\n catch {\n // fall through\n }\n }\n\n const error = reason instanceof Error ? reason : new Error(reason ? String(reason) : 'Aborted')\n error.name = 'AbortError'\n return error\n}\n\nexport function isAbortError(error: unknown): error is Error {\n return error instanceof Error && error.name === 'AbortError'\n}\n\nexport function createUntilTriggeredOnce<F extends (...args: any[]) => any, P extends any[] = Parameters<F>, R = ReturnType<F>>(fn: F): {\n onceTriggered: Promise<Awaited<R>>\n wrapper: (...args: P) => Promise<Awaited<R>>\n} {\n let resolve!: (r: Awaited<R>) => void\n const promise = new Promise<Awaited<R>>((res) => {\n resolve = res\n })\n\n const handler = async (...args: P[]): Promise<Awaited<R>> => {\n const res = await fn(...args)\n resolve(res)\n return res\n }\n\n return {\n onceTriggered: promise,\n wrapper: handler,\n }\n}\n\nexport function createUntilTriggered<P, R>(fn: (...args: P[]) => R): {\n promise: Promise<void>\n handler: () => void\n} {\n let resolve!: () => void\n const promise = new Promise<void>((res) => {\n resolve = res\n })\n\n const handler = (...args: P[]): R => {\n resolve()\n return fn(...args)\n }\n\n return { promise, handler }\n}\n\nexport function createUntil<T>(options?: { intervalHandler?: () => Promise<boolean>, interval?: number }): {\n promise: Promise<T>\n handler: (value: T) => void\n} {\n let resolve!: (value: T) => void\n const promise = new Promise<T>((res) => {\n resolve = res\n })\n\n if (options?.intervalHandler) {\n setInterval(() => {\n options?.intervalHandler?.().then((shouldResolve) => {\n if (shouldResolve) {\n resolve(undefined as unknown as T)\n }\n })\n }, options.interval ?? 50)\n }\n\n return { promise, handler: resolve }\n}\n","import type { EventContext } from './context'\nimport type { Eventa } from './eventa'\nimport type { InvokeEventa, ReceiveEvent, ReceiveEventError, SendEvent, SendEventAbort, SendEventStreamEnd } from './invoke-shared'\n\nimport { getContextExtensionInvokeInternalConfig } from './context-extension-invoke-internal'\nimport { defineEventa, nanoid } from './eventa'\nimport { isReceiveEvent } from './invoke-shared'\nimport { createAbortError, isAbortError, isAsyncIterable, isReadableStream } from './utils'\n\ntype IsInvokeRequestOptional<EC extends EventContext<any, any>>\n = EC extends EventContext<infer E, any>\n ? E extends { invokeRequest: any }\n ? undefined extends E['invokeRequest']\n ? true\n : false\n : E extends { invokeRequest?: any }\n ? undefined extends E['invokeRequest']\n ? true\n : false\n : true\n : true\n\nexport type ExtractInvokeRequestOptions<EC extends EventContext<any, any>>\n = EC extends EventContext<infer E, any>\n ? E extends { invokeRequest: infer IR }\n ? IR & { signal?: AbortSignal }\n : E extends { invokeRequest?: infer IR }\n ? IR & { signal?: AbortSignal }\n : { signal?: AbortSignal }\n : { signal?: AbortSignal }\n\nexport type ExtractInvokeResponseOptions<EC extends EventContext<any, any>>\n = EC extends EventContext<infer E, any>\n ? E extends { invokeResponse: infer IR }\n ? IR\n : E extends { invokeResponse?: infer IR }\n ? IR\n : undefined\n : undefined\n\nexport type InvokeFunction<Res, Req, EC extends EventContext<any, any>>\n = [Req] extends [undefined]\n ? IsInvokeRequestOptional<EC> extends true\n ? (req?: Req, options?: ExtractInvokeRequestOptions<EC>) => Promise<Res>\n : (req: Req, options: ExtractInvokeRequestOptions<EC>) => Promise<Res>\n : IsInvokeRequestOptional<EC> extends true\n ? (req: Req, options?: ExtractInvokeRequestOptions<EC>) => Promise<Res>\n : (req: Req, options: ExtractInvokeRequestOptions<EC>) => Promise<Res>\n\nexport type InvokeFunctionMap<EventMap extends Record<string, InvokeEventa<any, any, any, any>>, EC extends EventContext<any, any>> = {\n [K in keyof EventMap]: EventMap[K] extends InvokeEventa<infer Res, infer Req, any, any> ? InvokeFunction<Res, Req, EC> : never\n}\n\nexport type ExtendableInvokeResponse<Res, EC extends EventContext<any, any>>\n = | Promise<Res>\n | Res\n | Promise<{ response: Res, invokeResponse?: ExtractInvokeResponseOptions<EC> }>\n | { response: Res, invokeResponse?: ExtractInvokeResponseOptions<EC> }\n\nexport function isExtendableInvokeResponseLike<Res, EC extends EventContext<any, any>>(value: Eventa<unknown> | ReceiveEvent<{ response: Res, invokeResponse?: unknown }>): value is ReceiveEvent<{ response: Res, invokeResponse?: ExtractInvokeResponseOptions<EC> }> {\n if (!isReceiveEvent(value)) {\n return false\n }\n\n return typeof value.body?.content === 'object'\n && value.body?.content != null\n && 'response' in value.body.content\n && (\n !('invokeResponse' in value.body.content)\n || (\n 'invokeResponse' in value.body.content\n && (\n typeof value.body.content.invokeResponse === 'object'\n || typeof value.body.content.invokeResponse === 'undefined'\n )\n )\n )\n}\n\nexport type Handler<Res, Req = any, EC extends EventContext<any, any> = EventContext<any, any>, RawEventOptions = unknown> = (\n payload: Req,\n options?: {\n abortController?: AbortController\n } & RawEventOptions,\n) => ExtendableInvokeResponse<Res, EC>\n\ninterface InternalInvokeHandler<\n Res,\n Req = any,\n ResErr = Error,\n ReqErr = Error,\n EO = any,\n> {\n onSend: (params: InvokeEventa<Res, Req, ResErr, ReqErr>['sendEvent'], eventOptions?: EO) => void\n onSendStreamEnd: (params: InvokeEventa<Res, Req, ResErr, ReqErr>['sendEventStreamEnd'], eventOptions?: EO) => void\n onSendAbort: (params: InvokeEventa<Res, Req, ResErr, ReqErr>['sendEventAbort'], eventOptions?: EO) => void\n}\n\nexport type HandlerMap<\n EventMap extends Record<string, InvokeEventa<any, any, any, any>>,\n EO = any,\n EC extends EventContext<any, any> = EventContext<any, any>,\n> = {\n [K in keyof EventMap]: EventMap[K] extends InvokeEventa<infer Res, infer Req, any, any>\n ? Handler<Res, Req, EC, EO>\n : never\n}\n\nexport interface InvocableEventContext<E, EO> extends EventContext<E, EO> {\n invokeHandlers?: Map<string, Map<Handler<any>, InternalInvokeHandler<any>>>\n}\n\n/**\n * Create a unary invoke function (client side).\n *\n * It supports unary or streaming requests, but returns a single response.\n * Use `defineStreamInvoke` when you expect a stream of responses.\n *\n * If you want stream input, set `Req` to `ReadableStream<T>` or `AsyncIterable<T>`\n * (or a union type like `T | ReadableStream<T>` for optional streaming).\n *\n * @example\n * ```ts\n * // 1) Define eventa once (shared by client/server)\n * const events = defineInvokeEventa<{ id: string }, { name: string }>()\n *\n * // 2) Client: define invoke function\n * const invoke = defineInvoke(clientCtx, events)\n *\n * // 3) Call\n * const res = await invoke({ name: 'alice' })\n * ```\n *\n * @example\n * ```ts\n * // Stream request -> unary response\n * const events = defineInvokeEventa<number, ReadableStream<number>>()\n *\n * defineInvokeHandler(serverCtx, events, async (payload) => {\n * let sum = 0\n * for await (const value of payload) {\n * sum += value\n * }\n *\n * return sum\n * })\n *\n * const invoke = defineInvoke(clientCtx, events)\n * const input = new ReadableStream<number>({\n * start(controller) {\n * controller.enqueue(1)\n * controller.enqueue(2)\n * controller.close()\n * },\n * })\n *\n * const total = await invoke(input)\n * ```\n *\n * @param ctx Event context on the caller/client side.\n * @param event Invoke event definition created by `defineInvokeEventa`.\n */\nexport function defineInvoke<\n Res,\n Req = undefined,\n ResErr = Error,\n ReqErr = Error,\n CtxExt = any,\n EOpts = any,\n ECtx extends EventContext<CtxExt, EOpts> = EventContext<CtxExt, EOpts>,\n>(ctx: ECtx | (() => ECtx | Promise<ECtx>), event: InvokeEventa<Res, Req, ResErr, ReqErr>): InvokeFunction<Res, Req, ECtx> {\n async function getContext(): Promise<ECtx> {\n if (typeof ctx === 'function') {\n const resolvedCtx = ctx()\n if (resolvedCtx instanceof Promise) {\n return await resolvedCtx\n }\n\n return resolvedCtx\n }\n\n return ctx\n }\n\n function _invoke(req?: Req, options?: ExtractInvokeRequestOptions<ECtx>): Promise<Res> {\n return new Promise<Res>((resolve, reject) => {\n getContext().then((ctx) => {\n const invokeId = nanoid()\n\n const invokeReceiveEvent = defineEventa(`${event.receiveEvent.id}-${invokeId}`) as ReceiveEvent<Res>\n const invokeReceiveEventError = defineEventa(`${event.receiveEventError.id}-${invokeId}`) as ReceiveEventError<Res, Req, ResErr, ReqErr>\n const { signal, ...emitOptions } = (options ?? {}) as ExtractInvokeRequestOptions<ECtx> & Record<string, any>\n let finished = false\n\n const onAbort = () => {\n ctx.emit(event.sendEventAbort, { invokeId, content: signal?.reason }, emitOptions as any)\n // eslint-disable-next-line ts/no-use-before-define\n finishReject(createAbortError(signal?.reason))\n }\n\n // Hook into adapter-level fatal events (e.g., worker error) so any pending invoke\n // is rejected immediately instead of waiting forever for a response.\n const invokeInternalConfig = getContextExtensionInvokeInternalConfig(ctx)\n const abortOffs: Array<() => void> = []\n const onAbortEvent = (payload: Eventa<any>, eventOptions?: any) => {\n // Workflow: adapter emits a fatal event -> we map it (if configured) -> reject this invoke.\n const mappedError = invokeInternalConfig?.mapAbortError?.(payload, eventOptions)\n if (typeof mappedError !== 'undefined') {\n // eslint-disable-next-line ts/no-use-before-define\n finishReject(mappedError)\n return\n }\n\n // Default extraction for common `{ error }` payloads, otherwise reject with payload/body.\n const body: any = payload?.body\n const error = body && typeof body === 'object' && 'error' in body\n ? body.error\n : (typeof body !== 'undefined' ? body : payload)\n // eslint-disable-next-line ts/no-use-before-define\n finishReject(error)\n }\n\n const cleanup = () => {\n ctx.off(invokeReceiveEvent)\n ctx.off(invokeReceiveEventError)\n for (const off of abortOffs) {\n off()\n }\n if (signal) {\n signal.removeEventListener('abort', onAbort)\n }\n }\n\n const finishReject = (error?: any) => {\n if (finished) {\n return\n }\n\n finished = true\n reject(error)\n cleanup()\n }\n\n const finishResolve = (value: Res) => {\n if (finished) {\n return\n }\n finished = true\n resolve(value)\n\n cleanup()\n }\n\n ctx.on(invokeReceiveEvent, (payload) => {\n if (!payload.body) {\n return\n }\n if (payload.body.invokeId !== invokeId) {\n return\n }\n\n const { content } = payload.body\n finishResolve(content as Res)\n })\n\n ctx.on(invokeReceiveEventError, (payload) => {\n if (!payload.body) {\n return\n }\n if (payload.body.invokeId !== invokeId) {\n return\n }\n\n const { error } = payload.body.content\n finishReject(error)\n })\n\n if (invokeInternalConfig?.abortOnEvents?.length) {\n for (const eventOrMatch of invokeInternalConfig.abortOnEvents) {\n abortOffs.push(ctx.on(eventOrMatch as any, onAbortEvent as any))\n }\n }\n\n if (signal) {\n if (signal.aborted) {\n onAbort()\n return\n }\n\n signal.addEventListener('abort', onAbort, { once: true })\n }\n\n if (!isReadableStream<Req>(req) && !isAsyncIterable<Req>(req)) {\n ctx.emit(event.sendEvent, { invokeId, content: req as Req }, emitOptions as any) // emit: event_trigger\n }\n else {\n const sendChunk = (chunk: Req) => {\n if (finished) {\n return\n }\n ctx.emit(event.sendEvent, { invokeId, content: chunk, isReqStream: true }, emitOptions as any) // emit: event_trigger\n }\n\n const sendEnd = () => {\n if (finished) {\n return\n }\n ctx.emit(event.sendEventStreamEnd, { invokeId, content: undefined }, emitOptions as any) // emit: event_stream_end\n }\n\n const pump = async () => {\n try {\n for await (const chunk of req) {\n // If aborted already, no further emits\n if (signal?.aborted) {\n return\n }\n\n sendChunk(chunk)\n }\n\n sendEnd()\n }\n catch (error) {\n // Make sure no further emits after abort\n if (signal?.aborted) {\n return\n }\n if (isAbortError(error)) {\n ctx.emit(event.sendEventAbort, { invokeId, content: error }, emitOptions as any)\n return\n }\n\n ctx.emit(event.sendEventError, { invokeId, content: error as ReqErr }, emitOptions as any) // emit: event_error\n }\n }\n\n pump()\n }\n })\n })\n }\n\n return _invoke as InvokeFunction<Res, Req, ECtx>\n}\n\n/**\n * Create a map of invoke functions from a map of invoke events (client side).\n *\n * @example\n * ```ts\n * const events = {\n * double: defineInvokeEventa<number, number>(),\n * greet: defineInvokeEventa<string, { name: string }>(),\n * }\n *\n * const invokes = defineInvokes(ctx, events)\n * const result = await invokes.double(2)\n * ```\n *\n * @param ctx Event context on the caller/client side.\n * @param events Map of invoke events created by `defineInvokeEventa`.\n */\nexport function defineInvokes<\n EK extends string,\n EventMap extends Record<EK, InvokeEventa<any, any, any, any>>,\n CtxExt = any,\n EOpts = any,\n ECtx extends EventContext<CtxExt, EOpts> = EventContext<CtxExt, EOpts>,\n>(ctx: ECtx | (() => ECtx | Promise<ECtx>), events: EventMap): InvokeFunctionMap<EventMap, ECtx> {\n const invokes = (Object.keys(events) as EK[]).reduce((invokes, key) => {\n invokes[key] = defineInvoke(ctx, events[key])\n return invokes\n }, {} as Record<EK, InvokeFunction<any, any, ECtx>>)\n\n return invokes as InvokeFunctionMap<EventMap, ECtx>\n}\n\n/**\n * Define a unary invoke handler (server side).\n *\n * The handler can accept a unary or streaming request; it must return\n * a single response (or an extendable response envelope).\n *\n * @example\n * ```ts\n * const events = defineInvokeEventa<{ id: string }, { name: string }>()\n *\n * defineInvokeHandler(serverCtx, events, ({ name }) => ({\n * id: `user-${name}`,\n * }))\n * ```\n *\n * @param ctx Event context on the handler/server side.\n * @param event Invoke event definition created by `defineInvokeEventa`.\n * @param handler Handler that returns a response (or response + metadata).\n */\nexport function defineInvokeHandler<\n Res,\n Req = undefined,\n ResErr = Error,\n ReqErr = Error,\n CtxExt = any,\n EOpts extends { raw?: any } = any,\n>(\n ctx: InvocableEventContext<CtxExt, EOpts>,\n event: InvokeEventa<Res, Req, ResErr, ReqErr>,\n handler: Handler<Res, Req, InvocableEventContext<CtxExt, EOpts>, EOpts>,\n): () => void {\n if (!ctx.invokeHandlers) {\n ctx.invokeHandlers = new Map()\n }\n\n let handlers = ctx.invokeHandlers?.get(event.sendEvent.id)\n if (!handlers) {\n handlers = new Map()\n ctx.invokeHandlers?.set(event.sendEvent.id, handlers)\n }\n\n let internalHandler = handlers.get(handler) as InternalInvokeHandler<Res, Req, ResErr, ReqErr, EOpts> | undefined\n if (!internalHandler) {\n const streamStates = new Map<string, ReadableStreamDefaultController<Req>>()\n const abortControllers = new Map<string, AbortController>()\n const abortReasons = new Map<string, unknown>()\n const scheduleAbort = (controller: AbortController, reason: unknown) => {\n // NOTICE: use microtask to avoid aborting before the handler starts.\n // This is important when the handler creates streams or async iterables\n if (typeof queueMicrotask !== 'undefined') {\n queueMicrotask(() => controller.abort(reason))\n return\n }\n\n Promise.resolve().then(() => controller.abort(reason))\n }\n\n const handleInvoke = async (invokeId: string, payload: Req, options?: EOpts) => {\n const abortController = new AbortController()\n abortControllers.set(invokeId, abortController)\n\n if (abortReasons.has(invokeId)) {\n scheduleAbort(abortController, abortReasons.get(invokeId))\n }\n\n const handlerOptions = options\n ? { ...options, abortController }\n : ({ abortController } as EOpts & { abortController: AbortController })\n\n try {\n const response = await handler(payload as Req, handlerOptions) // Call the handler function with the request payload\n ctx.emit(\n { ...defineEventa(`${event.receiveEvent.id}-${invokeId}`), invokeType: event.receiveEvent.invokeType } as ReceiveEvent<ExtendableInvokeResponse<Res, InvocableEventContext<CtxExt, EOpts>>>,\n { invokeId, content: response },\n options,\n ) // emit: event_response\n }\n catch (error) {\n // TODO: to error object\n ctx.emit(\n { ...defineEventa(`${event.receiveEventError.id}-${invokeId}`), invokeType: event.receiveEventError.invokeType } as ReceiveEventError<Res, Req, ResErr, ReqErr>,\n { invokeId, content: { error: error as ResErr } },\n options,\n )\n }\n finally {\n abortControllers.delete(invokeId)\n abortReasons.delete(invokeId)\n }\n }\n\n const onSend = async (payload: SendEvent<Res, Req, ResErr, ReqErr>, options: EOpts) => { // on: event_trigger\n if (!payload.body) {\n return\n }\n if (!payload.body.invokeId) {\n return\n }\n\n const invokeId = payload.body.invokeId\n if (payload.body.isReqStream) {\n let controller = streamStates.get(invokeId)\n if (!controller) {\n let localController: ReadableStreamDefaultController<Req>\n const reqStream = new ReadableStream<Req>({\n start(c) {\n localController = c\n },\n })\n\n controller = localController!\n streamStates.set(invokeId, controller)\n // TODO: perhaps, can we correctly write type Req here?\n handleInvoke(invokeId, reqStream as Req, options)\n }\n\n controller.enqueue(payload.body.content as Req)\n return\n }\n\n handleInvoke(invokeId, payload.body?.content as Req, options)\n }\n\n const onSendStreamEnd = (payload: SendEventStreamEnd<Res, Req, ResErr, ReqErr>, options: EOpts) => { // on: event_stream_end\n if (!payload.body) {\n return\n }\n if (!payload.body.invokeId) {\n return\n }\n\n const invokeId = payload.body.invokeId\n let controller = streamStates.get(invokeId)\n if (!controller) {\n let localController: ReadableStreamDefaultController<Req>\n const reqStream = new ReadableStream<Req>({\n start(c) {\n localController = c\n },\n })\n\n controller = localController!\n streamStates.set(invokeId, controller)\n // TODO: perhaps, can we correctly write type Req here?\n handleInvoke(invokeId, reqStream as Req, options)\n }\n\n controller.close()\n streamStates.delete(invokeId)\n }\n\n const onSendAbort = (payload: SendEventAbort<Res, Req, ResErr, ReqErr>, options: EOpts) => { // on: event_abort\n if (!payload.body) {\n return\n }\n if (!payload.body.invokeId) {\n return\n }\n\n const invokeId = payload.body.invokeId\n const reason = payload.body.content\n const abortController = abortControllers.get(invokeId)\n if (!abortController) {\n abortReasons.set(invokeId, reason)\n\n let streamController = streamStates.get(invokeId)\n if (!streamController) {\n let localController: ReadableStreamDefaultController<Req>\n const reqStream = new ReadableStream<Req>({\n start(c) {\n localController = c\n },\n })\n\n streamController = localController!\n streamStates.set(invokeId, streamController)\n handleInvoke(invokeId, reqStream as Req, options)\n }\n\n streamController.error(createAbortError(reason))\n streamStates.delete(invokeId)\n return\n }\n\n scheduleAbort(abortController, reason)\n\n const streamController = streamStates.get(invokeId)\n if (streamController) {\n streamController.error(createAbortError(reason))\n streamStates.delete(invokeId)\n }\n }\n\n internalHandler = { onSend, onSendStreamEnd, onSendAbort }\n handlers.set(handler, internalHandler)\n\n ctx.on(event.sendEvent, internalHandler.onSend)\n ctx.on(event.sendEventStreamEnd, internalHandler.onSendStreamEnd)\n ctx.on(event.sendEventAbort, internalHandler.onSendAbort)\n }\n\n return () => {\n ctx.off(event.sendEvent, internalHandler.onSend)\n ctx.off(event.sendEventStreamEnd, internalHandler.onSendStreamEnd)\n ctx.off(event.sendEventAbort, internalHandler.onSendAbort)\n }\n}\n\n/**\n * Define multiple invoke handlers in batch (server side).\n *\n * @example\n * ```ts\n * const events = {\n * double: defineInvokeEventa<number, number>(),\n * greet: defineInvokeEventa<string, { name: string }>(),\n * }\n *\n * defineInvokeHandlers(ctx, events, {\n * double: value => value * 2,\n * greet: ({ name }) => `hi ${name}`,\n * })\n * ```\n *\n * @param ctx Event context on the handler/server side.\n * @param events Map of invoke events created by `defineInvokeEventa`.\n * @param handlers Map of handlers keyed by event name.\n */\nexport function defineInvokeHandlers<\n EK extends string,\n EventMap extends Record<EK, InvokeEventa<any, any, any, any>>,\n CtxExt = any,\n EOpts extends { raw?: any } = any,\n>(\n ctx: InvocableEventContext<CtxExt, EOpts>,\n events: EventMap,\n handlers: HandlerMap<EventMap, EOpts>,\n): Record<EK, () => void> {\n const eventKeys = Object.keys(events) as EK[]\n const handlerKeys = new Set(Object.keys(handlers) as EK[])\n\n if (eventKeys.length !== handlerKeys.size || !eventKeys.every(key => handlerKeys.has(key))) {\n throw new Error('The keys of events and handlers must match.')\n }\n\n return eventKeys.reduce((returnValues, key) => {\n returnValues[key] = defineInvokeHandler(ctx, events[key], handlers[key])\n return returnValues\n }, {} as Record<EK, () => void>)\n}\n\n/**\n * Remove one or all invoke handlers for a specific invoke event (server side).\n *\n * @example\n * ```ts\n * const off = defineInvokeHandler(ctx, events, handler)\n * off() // remove one handler\n *\n * // or remove all handlers for the event:\n * undefineInvokeHandler(ctx, events)\n * ```\n *\n * @param ctx Event context on the handler/server side.\n * @param event Invoke event definition created by `defineInvokeEventa`.\n * @param handler Specific handler to remove (omit to remove all).\n * @returns `true` if at least one handler was removed, `false` otherwise\n */\nexport function undefineInvokeHandler<\n Res,\n Req = undefined,\n ResErr = Error,\n ReqErr = Error,\n CtxExt = any,\n EOpts = any,\n>(\n ctx: InvocableEventContext<CtxExt, EOpts>,\n event: InvokeEventa<Res, Req, ResErr, ReqErr>,\n handler?: Handler<Res, Req, InvocableEventContext<CtxExt, EOpts>, EOpts>,\n): boolean {\n if (!ctx.invokeHandlers)\n return false\n\n const handlers = ctx.invokeHandlers?.get(event.sendEvent.id)\n if (!handlers)\n return false\n\n if (handler) {\n const internalHandler = handlers.get(handler)\n if (!internalHandler)\n return false\n\n ctx.off(event.sendEvent, internalHandler.onSend)\n ctx.off(event.sendEventStreamEnd, internalHandler.onSendStreamEnd)\n ctx.off(event.sendEventAbort, internalHandler.onSendAbort)\n ctx.invokeHandlers.delete(event.sendEvent.id)\n\n return true\n }\n\n let returnValue = false\n for (const internalHandlers of handlers.values()) {\n ctx.off(event.sendEvent, internalHandlers.onSend)\n ctx.off(event.sendEventStreamEnd, internalHandlers.onSendStreamEnd)\n ctx.off(event.sendEventAbort, internalHandlers.onSendAbort)\n returnValue = true\n }\n\n ctx.invokeHandlers.delete(event.sendEvent.id)\n\n return returnValue\n}\n","import type { EventContext } from './context'\nimport type { ExtendableInvokeResponse } from './invoke'\n\nexport interface WithTransfer<T> {\n message: T\n _transfer?: Transferable[]\n}\n\nexport function withTransfer<T>(body: T, transfer?: Transferable[]): ExtendableInvokeResponse<T, EventContext<{ invokeResponse?: { transfer?: Transferable[] } }, any>> {\n return {\n response: body,\n invokeResponse: {\n transfer: transfer ?? [],\n },\n }\n}\n","import type { EventContext } from './context'\nimport type { ExtractInvokeRequestOptions, Handler, InvocableEventContext } from './invoke'\nimport type { InvokeEventa } from './invoke-shared'\n\nimport { nanoid } from './eventa'\nimport { defineInvoke, defineInvokeHandler } from './invoke'\nimport { defineInvokeEventa } from './invoke-shared'\n\nexport interface InvokeFunctionStubOptions {\n allow?: boolean\n maxDepth?: number\n maxFunctions?: number\n tagPrefix?: string\n onDisallowedTag?: 'ignore' | 'throw'\n autoDisposeMs?: number\n strict?: boolean\n}\n\nexport type RemoteInvokeOptions<EC extends EventContext<any, any>> = ExtractInvokeRequestOptions<EC> & {\n functionStubs?: boolean | InvokeFunctionStubOptions\n}\n\nexport interface RemoteInvokeResult<Res> extends Promise<Res> {\n dispose: () => void\n}\n\nexport type RemoteInvokeFunction<Res, Req, EC extends EventContext<any, any>>\n = [Req] extends [undefined]\n ? (req?: Req, options?: RemoteInvokeOptions<EC>) => RemoteInvokeResult<Res>\n : (req: Req, options?: RemoteInvokeOptions<EC>) => RemoteInvokeResult<Res>\n\nconst DEFAULT_FUNCTION_STUB_OPTIONS: Required<Pick<InvokeFunctionStubOptions, 'maxDepth' | 'maxFunctions' | 'tagPrefix' | 'onDisallowedTag' | 'autoDisposeMs' | 'strict'>> = {\n maxDepth: 32,\n maxFunctions: 32,\n tagPrefix: 'eventa-invoke-fn-',\n onDisallowedTag: 'ignore',\n autoDisposeMs: 0,\n strict: false,\n}\n\nexport function createRemoteMethodTagPrefix(prefix = DEFAULT_FUNCTION_STUB_OPTIONS.tagPrefix) {\n return `${prefix}${nanoid()}-`\n}\n\nfunction normalizeFunctionStubOptions(options?: boolean | InvokeFunctionStubOptions) {\n if (options === true) {\n return {\n allow: true,\n ...DEFAULT_FUNCTION_STUB_OPTIONS,\n }\n }\n if (!options) {\n return {\n allow: false,\n ...DEFAULT_FUNCTION_STUB_OPTIONS,\n }\n }\n\n return {\n allow: options.allow ?? true,\n maxDepth: options.maxDepth ?? DEFAULT_FUNCTION_STUB_OPTIONS.maxDepth,\n maxFunctions: options.maxFunctions ?? DEFAULT_FUNCTION_STUB_OPTIONS.maxFunctions,\n tagPrefix: options.tagPrefix ?? DEFAULT_FUNCTION_STUB_OPTIONS.tagPrefix,\n onDisallowedTag: options.onDisallowedTag ?? DEFAULT_FUNCTION_STUB_OPTIONS.onDisallowedTag,\n autoDisposeMs: options.autoDisposeMs ?? DEFAULT_FUNCTION_STUB_OPTIONS.autoDisposeMs,\n strict: options.strict ?? DEFAULT_FUNCTION_STUB_OPTIONS.strict,\n }\n}\n\nfunction resolveFunctionStubOptions(\n defaults?: boolean | InvokeFunctionStubOptions,\n override?: boolean | InvokeFunctionStubOptions,\n) {\n const base = normalizeFunctionStubOptions(defaults)\n\n if (typeof override === 'undefined') {\n return base\n }\n if (typeof override === 'boolean') {\n return {\n ...base,\n allow: override,\n }\n }\n\n return {\n ...base,\n ...normalizeFunctionStubOptions(override),\n }\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n if (value == null || typeof value !== 'object') {\n return false\n }\n\n const prototype = Object.getPrototypeOf(value)\n return prototype === Object.prototype || prototype === null\n}\n\ninterface InvokeFunctionStubPayload {\n __eventaInvoke?: {\n tag: string\n }\n}\n\nfunction isInvokeFunctionStubPayload(value: unknown): value is InvokeFunctionStubPayload {\n if (!isPlainObject(value)) {\n return false\n }\n if (!('__eventaInvoke' in value)) {\n return false\n }\n\n const stub = (value as InvokeFunctionStubPayload).__eventaInvoke\n return !!stub && typeof stub === 'object' && typeof stub.tag === 'string'\n}\n\nfunction hasInvokeFunctionStubKey(value: unknown): value is Record<string, unknown> {\n return isPlainObject(value) && '__eventaInvoke' in value\n}\n\nfunction serializeInvokeFunctionPayload<T>(\n value: T,\n ctx: InvocableEventContext<any, any>,\n options: ReturnType<typeof normalizeFunctionStubOptions>,\n) {\n if (!options.allow) {\n return { value, dispose: () => void 0 }\n }\n\n let functionCount = 0\n const seen = new WeakMap<object, any>()\n const disposers: Array<() => void> = []\n\n const walk = (input: any, depth: number): any => {\n if (typeof input === 'function') {\n if (functionCount >= options.maxFunctions) {\n throw new Error(`Too many function stubs in invoke payload (max ${options.maxFunctions}).`)\n }\n\n functionCount += 1\n const tag = `${options.tagPrefix}${nanoid()}`\n const event = defineInvokeEventa<any, any>(tag)\n const off = defineInvokeHandler(ctx, event, (payload, handlerOptions) => {\n return input(payload, handlerOptions)\n })\n disposers.push(off)\n\n return { __eventaInvoke: { tag } }\n }\n\n if (input == null || typeof input !== 'object') {\n return input\n }\n\n if (depth > options.maxDepth) {\n throw new Error(`Invoke payload is too deep (max ${options.maxDepth}).`)\n }\n\n if (seen.has(input)) {\n return seen.get(input)\n }\n\n if (Array.isArray(input)) {\n const output: any[] = Array.from({ length: input.length })\n seen.set(input, output)\n for (let i = 0; i < input.length; i += 1) {\n output[i] = walk(input[i], depth + 1)\n }\n return output\n }\n\n if (!isPlainObject(input)) {\n return input\n }\n\n // Use null-prototype object to mitigate prototype pollution attacks\n // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object#null-prototype_objects\n // https://github.com/OWASP/CheatSheetSeries/blob/38a2e501d345c710207b492a50f46e0f368578fe/cheatsheets/Prototype_Pollution_Prevention_Cheat_Sheet.md\n // https://cheatsheetseries.owasp.org/cheatsheets/Prototype_Pollution_Prevention_Cheat_Sheet.html#other-resources\n const output: Record<string, any> = Object.create(null)\n seen.set(input, output)\n for (const [key, child] of Object.entries(input)) {\n output[key] = walk(child, depth + 1)\n }\n return output\n }\n\n return {\n value: walk(value, 0) as T,\n dispose: () => {\n for (const off of disposers) {\n off()\n }\n },\n }\n}\n\nfunction deserializeInvokeFunctionPayload<T>(\n value: T,\n ctx: EventContext<any, any>,\n options: ReturnType<typeof normalizeFunctionStubOptions>,\n) {\n if (!options.allow) {\n return value\n }\n\n let functionCount = 0\n const seen = new WeakMap<object, any>()\n\n const walk = (input: any, depth: number): any => {\n if (input == null || typeof input !== 'object') {\n return input\n }\n\n if (depth > options.maxDepth) {\n throw new Error(`Invoke payload is too deep (max ${options.maxDepth}).`)\n }\n\n if (isInvokeFunctionStubPayload(input)) {\n if (functionCount >= options.maxFunctions) {\n throw new Error(`Too many function stubs in invoke payload (max ${options.maxFunctions}).`)\n }\n\n const tag = input.__eventaInvoke!.tag\n if (options.tagPrefix && !tag.startsWith(options.tagPrefix)) {\n if (options.onDisallowedTag === 'throw') {\n throw new Error(`Invoke function tag not allowed: ${tag}`)\n }\n\n return input\n }\n\n functionCount += 1\n const event = defineInvokeEventa<any, any>(tag)\n\n return defineInvoke(ctx as EventContext<any, any>, event)\n }\n else if (options.strict && hasInvokeFunctionStubKey(input)) {\n throw new Error('Invalid invoke function stub payload.')\n }\n\n if (seen.has(input)) {\n return seen.get(input)\n }\n\n if (Array.isArray(input)) {\n const output: any[] = Array.from({ length: input.length })\n seen.set(input, output)\n for (let i = 0; i < input.length; i += 1) {\n output[i] = walk(input[i], depth + 1)\n }\n return output\n }\n\n if (!isPlainObject(input)) {\n return input\n }\n\n // Use null-prototype object to mitigate prototype pollution attacks\n // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object#null-prototype_objects\n // https://github.com/OWASP/CheatSheetSeries/blob/38a2e501d345c710207b492a50f46e0f368578fe/cheatsheets/Prototype_Pollution_Prevention_Cheat_Sheet.md\n // https://cheatsheetseries.owasp.org/cheatsheets/Prototype_Pollution_Prevention_Cheat_Sheet.html#other-resources\n const output: Record<string, any> = Object.create(null)\n seen.set(input, output)\n for (const [key, child] of Object.entries(input)) {\n output[key] = walk(child, depth + 1)\n }\n\n return output\n }\n\n return walk(value, 0) as T\n}\n\n/**\n * Enable \"remote method\" payloads for invoke: functions in the request body are\n * serialized into stub descriptors and rehydrated into invoke callers on the\n * receiving side.\n *\n * This is an adapter around the plain-value RPC primitives `defineInvoke` and\n * `defineInvokeHandler`. It keeps the core invoke APIs clean while offering an\n * opt-in bridge for function values.\n *\n * @example\n * ```ts\n * const remote = withRemoteMethods({ allow: true })\n * const events = defineInvokeEventa<{ output: number }, { helper: (n: number) => Promise<number> }>()\n *\n * // server (handler)\n * remote.defineInvokeHandler(serverCtx, events, async ({ helper }) => {\n * const output = await helper(21)\n * return { output }\n * })\n *\n * // client (caller)\n * const invoke = remote.defineInvoke(clientCtx, events)\n * const result = await invoke({ helper: async n => n * 2 }, { functionStubs: true })\n * ```\n *\n * @example\n * ```ts\n * // Manual cleanup when you fire-and-forget or cancel midway:\n * const invoke = remote.defineInvoke(clientCtx, events)\n * const result = invoke({ helper: () => 'ok' }, { functionStubs: true })\n * result.dispose()\n * await result\n * ```\n *\n * Security notes:\n * - This feature is off by default. Enabling it allows the remote side to call\n * back into your process; only use with trusted peers.\n * - Function stubs are tagged; prefer a unique `tagPrefix` to avoid collisions\n * (see `createRemoteMethodTagPrefix`).\n * - `maxDepth`, `maxFunctions`, and `autoDisposeMs` limit attack surface and\n * resource usage. `autoDisposeMs` is useful for fire-and-forget calls.\n * - Objects are rebuilt with a null prototype to mitigate `__proto__` pollution.\n * - Enable `strict` to reject malformed `__eventaInvoke` payloads.\n *\n * @param defaultOptions Defaults for function stub behavior. Use `{ allow: true }`\n * to enable, or provide `maxDepth`, `maxFunctions`, `tagPrefix`,\n * `onDisallowedTag`, `autoDisposeMs`, and `strict` for stricter control.\n */\nexport function withRemoteMethods(defaultOptions?: boolean | InvokeFunctionStubOptions) {\n return {\n defineInvoke<\n Res,\n Req = undefined,\n ResErr = Error,\n ReqErr = Error,\n CtxExt = any,\n EOpts = any,\n ECtx extends EventContext<CtxExt, EOpts> = EventContext<CtxExt, EOpts>,\n >(ctx: ECtx,\n event: InvokeEventa<Res, Req, ResErr, ReqErr>,\n ): RemoteInvokeFunction<Res, Req, ECtx> {\n const baseInvoke = defineInvoke(ctx, event)\n\n const invoke = ((req?: Req, options?: RemoteInvokeOptions<ECtx>) => {\n const { functionStubs, ...invokeOptions } = (options ?? {}) as RemoteInvokeOptions<ECtx> & Record<string, any>\n const normalizedOptions = resolveFunctionStubOptions(defaultOptions, functionStubs)\n\n if (!normalizedOptions.allow) {\n const promise = baseInvoke(req as Req, invokeOptions as ExtractInvokeRequestOptions<ECtx>)\n const wrapped = promise as RemoteInvokeResult<Res>\n wrapped.dispose = () => void 0\n\n return wrapped\n }\n\n let serialized: ReturnType<typeof serializeInvokeFunctionPayload<Req>>\n try {\n serialized = serializeInvokeFunctionPayload(req as Req, ctx as InvocableEventContext<any, any>, normalizedOptions)\n }\n catch (error) {\n const rejected = Promise.reject(error) as RemoteInvokeResult<Res>\n rejected.dispose = () => void 0\n\n return rejected\n }\n\n let disposed = false\n const dispose = () => {\n if (disposed) {\n return\n }\n\n disposed = true\n serialized.dispose()\n }\n\n let autoDisposeTimer: ReturnType<typeof setTimeout> | undefined\n if (normalizedOptions.autoDisposeMs > 0) {\n autoDisposeTimer = setTimeout(() => {\n dispose()\n }, normalizedOptions.autoDisposeMs)\n }\n\n const finalize = () => {\n if (autoDisposeTimer) {\n clearTimeout(autoDisposeTimer)\n }\n dispose()\n }\n\n const promise = baseInvoke(serialized.value as Req, invokeOptions as ExtractInvokeRequestOptions<ECtx>)\n .finally(finalize)\n\n const wrapped = promise as RemoteInvokeResult<Res>\n wrapped.dispose = finalize\n\n return wrapped\n }) as RemoteInvokeFunction<Res, Req, ECtx>\n\n return invoke\n },\n\n defineInvokeHandler<\n Res,\n Req = undefined,\n ResErr = Error,\n ReqErr = Error,\n CtxExt = any,\n EOpts extends { raw?: any } = any,\n >(\n ctx: InvocableEventContext<CtxExt, EOpts>,\n event: InvokeEventa<Res, Req, ResErr, ReqErr>,\n handler: Handler<Res, Req, InvocableEventContext<CtxExt, EOpts>, EOpts>,\n ) {\n const normalizedOptions = resolveFunctionStubOptions(defaultOptions)\n\n return defineInvokeHandler(ctx, event, async (payload, options) => {\n const handlerPayload = normalizedOptions.allow\n ? deserializeInvokeFunctionPayload(payload as Req, ctx, normalizedOptions)\n : payload\n\n return handler(handlerPayload as Req, options)\n })\n },\n }\n}\n","import type { EventContext } from './context'\nimport type {\n InvokeEventa,\n ReceiveEvent,\n ReceiveEventError,\n ReceiveEventStreamEnd,\n} from './invoke-shared'\n\nimport { defineEventa, nanoid } from './eventa'\nimport { createAbortError, isAbortError, isAsyncIterable, isReadableStream } from './utils'\n\n/**\n * Create a stream invoke function (client side).\n *\n * Use when the response is streamed and the request may be unary or streaming.\n *\n * Common patterns:\n * - Unary request -> stream response (server-streaming)\n * - Stream request -> stream response (bi-directional streaming)\n *\n * @example\n * ```ts\n * // 1) Define eventa once (shared by client/server)\n * const events = defineInvokeEventa<Progress | Result, Params>()\n *\n * // 2) Client: define invoke function\n * const invoke = defineStreamInvoke(clientCtx, events)\n *\n * // 3) Call with unary request\n * for await (const msg of invoke({ name: 'alice' })) {\n * console.log(msg)\n * }\n * ```\n *\n * @example\n * ```ts\n * // Client-streaming request\n * const input = new ReadableStream<number>({\n * start(c) { c.enqueue(1); c.enqueue(2); c.close() },\n * })\n *\n * for await (const msg of invoke(input)) {\n * console.log(msg)\n * }\n * ```\n *\n * @param clientCtx Event context on the caller/client side.\n * @param event Invoke event definition created by `defineInvokeEventa`.\n */\nexport function defineStreamInvoke<\n Res,\n Req = undefined,\n ResErr = Error,\n ReqErr = Error,\n E = any,\n EO = any,\n>(clientCtx: EventContext<E, EO>, event: InvokeEventa<Res, Req, ResErr, ReqErr>) {\n return (req: Req | ReadableStream<Req> | AsyncIterable<Req>, options?: { signal?: AbortSignal } & EO) => {\n const invokeId = nanoid()\n const { signal, ...emitOptions } = (options ?? {}) as { signal?: AbortSignal } & Record<string, any>\n let onAbort: (() => void) | undefined\n\n const invokeReceiveEvent = defineEventa(`${event.receiveEvent.id}-${invokeId}`) as ReceiveEvent<Res>\n const invokeReceiveEventError = defineEventa(`${event.receiveEventError.id}-${invokeId}`) as ReceiveEventError<Res, Req, ResErr, ReqErr>\n const invokeReceiveEventStreamEnd = defineEventa(`${event.receiveEventStreamEnd.id}-${invokeId}`) as ReceiveEventStreamEnd<Res>\n\n const stream = new ReadableStream<Res>({\n start(controller) {\n const cleanup = () => {\n clientCtx.off(invokeReceiveEvent)\n clientCtx.off(invokeReceiveEventError)\n clientCtx.off(invokeReceiveEventStreamEnd)\n if (signal && onAbort) {\n signal.removeEventListener('abort', onAbort)\n }\n }\n\n onAbort = () => {\n clientCtx.emit(event.sendEventAbort, { invokeId, content: signal?.reason }, emitOptions as any)\n controller.error(createAbortError(signal?.reason))\n cleanup()\n }\n\n clientCtx.on(invokeReceiveEvent, (payload) => {\n if (!payload.body) {\n return\n }\n if (payload.body.invokeId !== invokeId) {\n return\n }\n\n controller.enqueue(payload.body.content as Res)\n })\n clientCtx.on(invokeReceiveEventError, (payload) => {\n if (!payload.body) {\n return\n }\n if (payload.body.invokeId !== invokeId) {\n return\n }\n\n controller.error(payload.body.content.error as ResErr)\n cleanup()\n })\n clientCtx.on(invokeReceiveEventStreamEnd, (payload) => {\n if (!payload.body) {\n return\n }\n if (payload.body.invokeId !== invokeId) {\n return\n }\n\n controller.close()\n cleanup()\n })\n\n if (signal && onAbort) {\n if (signal.aborted) {\n onAbort()\n return\n }\n signal.addEventListener('abort', onAbort as EventListener, { once: true })\n }\n },\n cancel(reason) {\n clientCtx.emit(event.sendEventAbort, { invokeId, content: reason }, emitOptions as any)\n clientCtx.off(invokeReceiveEvent)\n clientCtx.off(invokeReceiveEventError)\n clientCtx.off(invokeReceiveEventStreamEnd)\n if (signal && onAbort) {\n signal.removeEventListener('abort', onAbort as EventListener)\n }\n },\n })\n\n if (isReadableStream<Req>(req) || isAsyncIterable<Req>(req)) {\n const sendChunk = (chunk: Req) => {\n clientCtx.emit(event.sendEvent, { invokeId, content: chunk, isReqStream: true }, emitOptions as any) // emit: event_trigger\n }\n\n const sendEnd = () => {\n clientCtx.emit(event.sendEventStreamEnd, { invokeId, content: undefined }, emitOptions as any) // emit: event_stream_end\n }\n\n const pump = async () => {\n try {\n for await (const chunk of req) {\n // If aborted already, no further emits\n if (signal?.aborted) {\n return\n }\n\n sendChunk(chunk)\n }\n\n sendEnd()\n }\n catch (error) {\n // If aborted already, no further emits\n if (signal?.aborted) {\n return\n }\n if (isAbortError(error)) {\n clientCtx.emit(event.sendEventAbort, { invokeId, content: error }, emitOptions as any)\n return\n }\n\n clientCtx.emit(event.sendEventError, { invokeId, content: error as ReqErr }, emitOptions as any) // emit: event_error\n }\n }\n\n pump()\n }\n else {\n clientCtx.emit(event.sendEvent, { invokeId, content: req }, emitOptions as any) // emit: event_trigger\n }\n\n return stream\n }\n}\n\ntype StreamHandler<Res, Req = any, RawEventOptions = unknown> = (\n payload: Req,\n options?: {\n abortController?: AbortController\n } & RawEventOptions,\n) => AsyncGenerator<Res, void, unknown>\n\n/**\n * Define a stream invoke handler (server side).\n *\n * The handler can receive either:\n * - a unary request `Req`\n * - a streaming request `ReadableStream<Req>` / `AsyncIterable<Req>`\n *\n * It must return an async generator of response messages.\n *\n * @example\n * ```ts\n * const events = defineInvokeEventa<Progress | Result, Params>()\n *\n * defineStreamInvokeHandler(serverCtx, events, async function* (payload) {\n * if (isReadableStream<Params>(payload) || isAsyncIterable<Params>(payload)) {\n * for await (const item of payload) {\n * yield { type: 'progress', value: item }\n * }\n * }\n *\n * yield { type: 'result', ok: true }\n * })\n * ```\n *\n * @param serverCtx Event context on the handler/server side.\n * @param event Invoke event definition created by `defineInvokeEventa`.\n * @param fn Stream handler that yields response chunks.\n */\nexport function defineStreamInvokeHandler<\n Res,\n Req = undefined,\n ResErr = Error,\n ReqErr = Error,\n E = any,\n EO extends { raw?: any } = any,\n>(serverCtx: EventContext<E, EO>, event: InvokeEventa<Res, Req, ResErr, ReqErr>, fn: StreamHandler<Res, Req, EO>) {\n const invokeReceiveEvent = (invokeId: string) => defineEventa(`${event.receiveEvent.id}-${invokeId}`) as ReceiveEvent<Res>\n const invokeReceiveEventError = (invokeId: string) => defineEventa(`${event.receiveEventError.id}-${invokeId}`) as ReceiveEventError<Res, Req, ResErr, ReqErr>\n const invokeReceiveEventStreamEnd = (invokeId: string) => defineEventa(`${event.receiveEventStreamEnd.id}-${invokeId}`) as ReceiveEventStreamEnd<Res>\n const streamStates = new Map<string, ReadableStreamDefaultController<Req>>()\n const abortControllers = new Map<string, AbortController>()\n const abortReasons = new Map<string, unknown>()\n const scheduleAbort = (controller: AbortController, reason: unknown) => {\n if (typeof queueMicrotask !== 'undefined') {\n queueMicrotask(() => controller.abort(reason))\n return\n }\n Promise.resolve().then(() => controller.abort(reason))\n }\n\n const handleInvoke = async (invokeId: string, payload: Req, options?: EO) => {\n const receiveEvent = invokeReceiveEvent(invokeId)\n const receiveEventError = invokeReceiveEventError(invokeId)\n const receiveEventStreamEnd = invokeReceiveEventStreamEnd(invokeId)\n const abortController = new AbortController()\n abortControllers.set(invokeId, abortController)\n\n if (abortReasons.has(invokeId)) {\n scheduleAbort(abortController, abortReasons.get(invokeId))\n }\n\n const handlerOptions = options\n ? { ...options, abortController }\n : ({ abortController } as EO & { abortController: AbortController })\n\n try {\n const generator = fn(payload, handlerOptions) // Call the handler function with the request payload\n for await (const res of generator) {\n serverCtx.emit(receiveEvent, { invokeId, content: res }, options) // emit: event_response\n }\n\n serverCtx.emit(receiveEventStreamEnd, { invokeId, content: undefined }, options) // emit: event_stream_end\n }\n catch (error) {\n serverCtx.emit(receiveEventError, { invokeId, content: { error: error as ResErr } }, options) // emit: event_response with error\n }\n finally {\n abortControllers.delete(invokeId)\n abortReasons.delete(invokeId)\n }\n }\n\n serverCtx.on(event.sendEvent, async (payload, options) => { // on: event_trigger\n if (!payload.body) {\n return\n }\n if (!payload.body.invokeId) {\n return\n }\n\n const invokeId = payload.body.invokeId\n if (payload.body.isReqStream) {\n let controller = streamStates.get(invokeId)\n if (!controller) {\n let localController: ReadableStreamDefaultController<Req>\n const reqStream = new ReadableStream<Req>({\n start(c) {\n localController = c\n },\n })\n\n controller = localController!\n streamStates.set(invokeId, controller)\n // TODO: can we write type Req here correctly?\n handleInvoke(invokeId, reqStream as Req, options)\n }\n\n controller.enqueue(payload.body.content as Req)\n return\n }\n\n handleInvoke(invokeId, payload.body.content as Req, options)\n })\n\n serverCtx.on(event.sendEventStreamEnd, (payload) => { // on: event_stream_end\n if (!payload.body) {\n return\n }\n if (!payload.body.invokeId) {\n return\n }\n\n const controller = streamStates.get(payload.body.invokeId)\n if (!controller) {\n return\n }\n\n controller.close()\n streamStates.delete(payload.body.invokeId)\n })\n\n serverCtx.on(event.sendEventAbort, (payload) => { // on: event_abort\n if (!payload.body) {\n return\n }\n if (!payload.body.invokeId) {\n return\n }\n\n const invokeId = payload.body.invokeId\n const reason = payload.body.content\n const abortController = abortControllers.get(invokeId)\n if (!abortController) {\n abortReasons.set(invokeId, reason)\n\n let controller = streamStates.get(invokeId)\n if (!controller) {\n let localController: ReadableStreamDefaultController<Req>\n const reqStream = new ReadableStream<Req>({\n start(c) {\n localController = c\n },\n })\n\n controller = localController!\n streamStates.set(invokeId, controller)\n handleInvoke(invokeId, reqStream as Req)\n }\n\n controller.error(createAbortError(reason))\n streamStates.delete(invokeId)\n return\n }\n\n scheduleAbort(abortController, reason)\n\n const controller = streamStates.get(invokeId)\n if (controller) {\n controller.error(createAbortError(reason))\n streamStates.delete(invokeId)\n }\n })\n}\n\n/**\n * Convert a callback-style handler into a stream handler.\n *\n * Use `emit` to push response chunks, and return when done.\n * Works for unary or streaming requests.\n *\n * @example\n * ```ts\n * defineStreamInvokeHandler(ctx, events, toStreamHandler(async ({ payload, emit }) => {\n * if (isReadableStream<Params>(payload) || isAsyncIterable<Params>(payload)) {\n * for await (const item of payload) {\n * emit({ type: 'progress', value: item })\n * }\n *\n * emit({ type: 'result', ok: true })\n * return\n * }\n *\n * emit({ type: 'result', ok: true })\n * }))\n * ```\n *\n * @param handler Callback handler with `emit` for streaming responses.\n */\nexport function toStreamHandler<Req, Res, EO extends { raw?: any } = any>(handler: (context: { payload: Req, options?: EO, emit: (data: Res) => void }) => Promise<void>): StreamHandler<Res, Req, EO> {\n return (payload, options) => {\n const values: Promise<[Res, boolean]>[] = []\n let resolve: (x: [Res, boolean]) => void\n let handlerError: Error | null = null\n\n values.push(new Promise((r) => {\n resolve = r\n }))\n\n const emit = (data: Res) => {\n resolve([data, false])\n\n values.push(new Promise((r) => {\n resolve = r\n }))\n }\n\n // Start the handler and mark completion when done\n handler({ payload, options, emit })\n .then(() => {\n resolve([undefined as any, true])\n })\n .catch((err) => {\n handlerError = err\n resolve([undefined as any, true])\n })\n\n return (async function* () {\n let val: Res\n\n for (let i = 0, done = false; !done; i++) {\n [val, done] = await values[i]\n delete values[i] // Clean up memory\n\n if (handlerError) {\n throw handlerError\n }\n\n if (!done) {\n yield val\n }\n }\n }())\n }\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@moeru/eventa",
3
3
  "type": "module",
4
- "version": "1.0.0-beta.1",
4
+ "version": "1.0.0-beta.2",
5
5
  "description": "Events are all you need",
6
6
  "author": {
7
7
  "name": "RainbowBird",
@@ -1 +0,0 @@
1
- {"version":3,"file":"context-ex8urwfs.mjs","names":["matcher: (event: E) => boolean | Promise<boolean>"],"sources":["../src/eventa.ts","../src/context.ts"],"sourcesContent":["import isGlobMatch from 'picomatch'\n\nimport { customAlphabet } from 'nanoid'\n\nexport function nanoid() {\n return customAlphabet('0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz', 16)()\n}\n\nexport interface InvokeEventConstraint<_Req, _Res> {}\n\nexport type EventTag<Res, Req> = string & InvokeEventConstraint<Req, Res>\n\nexport enum EventaType {\n Event = 'event',\n MatchExpression = 'matchExpression',\n}\n\nexport enum EventaFlowDirection {\n Inbound = 'inbound',\n Outbound = 'outbound',\n}\n\nexport interface DirectionalEventa<P, T = undefined> extends Eventa<P> {\n _flowDirection: EventaFlowDirection | T\n}\n\nexport interface InboundEventa<T> extends DirectionalEventa<T> {\n _flowDirection: EventaFlowDirection.Inbound\n}\n\nexport interface OutboundEventa<T> extends DirectionalEventa<T> {\n _flowDirection: EventaFlowDirection.Outbound\n}\n\nexport function defineInboundEventa<T>(id?: string): InboundEventa<T> {\n return {\n ...defineEventa<T>(id),\n _flowDirection: EventaFlowDirection.Inbound,\n } as InboundEventa<T>\n}\n\nexport function defineOutboundEventa<T>(id?: string): OutboundEventa<T> {\n return {\n ...defineEventa<T>(id),\n _flowDirection: EventaFlowDirection.Outbound,\n } as OutboundEventa<T>\n}\n\n// type ServerInvokeHandlerEvent<Req, Res> = symbol & InvokeEventConstraint<Req, Res>\n// type ClientInvoke<Req> = symbol & InvokeEventConstraint<Req, null>\n\nexport interface EventaLike<_P = undefined, T extends EventaType = EventaType> {\n id: string\n type?: T\n}\n\nexport interface Eventa<P = unknown> extends EventaLike<P, EventaType.Event> {\n body?: P\n}\n\nexport type InferEventaPayload<E> = E extends Eventa<infer P> ? P : never\n\nexport function defineEventa<P = undefined>(id?: string): Eventa<P> {\n if (!id) {\n id = nanoid()\n }\n\n return {\n id,\n type: EventaType.Event,\n }\n}\n\nexport interface EventaMatchExpression<P = undefined> extends EventaLike<P, EventaType.MatchExpression> {\n matcher?: (event: Eventa<P>) => boolean | Promise<boolean>\n}\n\nexport function and<P>(...matchExpression: Array<EventaMatchExpression<P>>): EventaMatchExpression<P> {\n return {\n id: nanoid(),\n type: EventaType.MatchExpression,\n matcher: (event: Eventa<P>) => {\n return matchExpression.every(m => m.matcher ? m.matcher(event) : false)\n },\n }\n}\n\nexport function or<P>(...matchExpression: Array<EventaMatchExpression<P>>): EventaMatchExpression<P> {\n return {\n id: nanoid(),\n type: EventaType.MatchExpression,\n matcher: (event: Eventa<P>) => {\n return matchExpression.some(m => m.matcher ? m.matcher(event) : false)\n },\n }\n}\n\nexport function matchBy<P = undefined>(glob: string, inverted?: boolean): EventaMatchExpression<P>\nexport function matchBy<P = undefined>(options: { ids: string[] }, inverted?: boolean): EventaMatchExpression<P>\nexport function matchBy<P = undefined>(options: { eventa: Eventa<P>[] }, inverted?: boolean): EventaMatchExpression<P>\nexport function matchBy<P = undefined>(options: { types: EventaType[] }, inverted?: boolean): EventaMatchExpression<P>\nexport function matchBy<P = undefined>(regExp: RegExp, inverted?: boolean): EventaMatchExpression<P>\nexport function matchBy<P = undefined, E extends Eventa<P> = Eventa<P>>(matcher: (event: E) => boolean | Promise<boolean>): EventaMatchExpression<P>\nexport function matchBy<P = undefined, E extends Eventa<P> = Eventa<P>>(\n matchExpressionPossibleValues:\n | string\n | Eventa<any>\n | { ids: string[] }\n | { eventa: Eventa<P>[] }\n | { types: EventaType[] }\n | RegExp\n | ((event: E) => boolean | Promise<boolean>),\n inverted?: boolean,\n): EventaMatchExpression<P> {\n const id = nanoid()\n\n let matcher: (event: E) => boolean | Promise<boolean> = () => false\n if (typeof matchExpressionPossibleValues === 'string') {\n matcher = (eventa) => {\n return isGlobMatch(matchExpressionPossibleValues)(eventa.id)\n }\n }\n else if (typeof matchExpressionPossibleValues === 'object') {\n if ('ids' in matchExpressionPossibleValues) {\n matcher = (event: Eventa<P>) => {\n if (inverted) {\n return !matchExpressionPossibleValues.ids.includes(event.id)\n }\n\n return matchExpressionPossibleValues.ids.includes(event.id)\n }\n }\n else if ('eventa' in matchExpressionPossibleValues) {\n matcher = (event: Eventa<P>) => {\n if (inverted) {\n return !matchExpressionPossibleValues.eventa.some(e => e.id === event.id)\n }\n\n return matchExpressionPossibleValues.eventa.some(e => e.id === event.id)\n }\n }\n else if ('types' in matchExpressionPossibleValues) {\n matcher = (event: Eventa<P>) => {\n if (typeof event.type === 'undefined') {\n return false\n }\n if (inverted) {\n return !matchExpressionPossibleValues.types.includes(event.type)\n }\n\n return matchExpressionPossibleValues.types.includes(event.type)\n }\n }\n }\n else if (matchExpressionPossibleValues instanceof RegExp) {\n matcher = (event: Eventa<P>) => {\n if (inverted) {\n return !matchExpressionPossibleValues.test(event.id)\n }\n\n return matchExpressionPossibleValues.test(event.id)\n }\n }\n else if (typeof matchExpressionPossibleValues === 'function') {\n matcher = matchExpressionPossibleValues\n }\n\n return {\n id,\n type: EventaType.MatchExpression,\n matcher,\n } satisfies EventaMatchExpression<P>\n}\n","import type { EventaAdapter } from './context-hooks'\nimport type { Eventa, EventaMatchExpression, EventTag } from './eventa'\n\nimport { EventaType } from './eventa'\n\ninterface CreateContextProps<EmitOptions = any> {\n adapter?: EventaAdapter<EmitOptions>\n}\n\nexport function createContext<Extensions = any, Options = { raw?: any }>(props: CreateContextProps<Options> = {}): EventContext<Extensions, Options> {\n const listeners = new Map<EventTag<any, any>, Set<(params: any, options?: Options) => any>>()\n const onceListeners = new Map<EventTag<any, any>, Set<(params: any, options?: Options) => any>>()\n\n const matchExpressions = new Map<string, EventaMatchExpression<any>>()\n const matchExpressionListeners = new Map<string, Set<(params: any, options?: Options) => any>>()\n const matchExpressionOnceListeners = new Map<string, Set<(params: any, options?: Options) => any>>()\n\n const hooks = props.adapter?.(emit).hooks\n\n function emit<P>(event: Eventa<P>, payload: P, options?: Options) {\n const emittingPayload = { ...event, body: payload }\n\n for (const listener of listeners.get(event.id) || []) {\n listener(emittingPayload, options)\n hooks?.onReceived?.(event.id, emittingPayload)\n }\n\n for (const onceListener of onceListeners.get(event.id) || []) {\n onceListener(emittingPayload, options)\n hooks?.onReceived?.(event.id, emittingPayload)\n onceListeners.get(event.id)?.delete(onceListener)\n }\n\n for (const matchExpression of matchExpressions.values()) {\n if (matchExpression.matcher) {\n const match = matchExpression.matcher(emittingPayload)\n if (!match) {\n continue\n }\n\n for (const listener of matchExpressionListeners.get(matchExpression.id) || []) {\n listener(emittingPayload, options)\n hooks?.onReceived?.(matchExpression.id, emittingPayload)\n }\n for (const onceListener of matchExpressionOnceListeners.get(matchExpression.id) || []) {\n onceListener(emittingPayload, options)\n hooks?.onReceived?.(matchExpression.id, emittingPayload)\n matchExpressionOnceListeners.get(matchExpression.id)?.delete(onceListener)\n }\n }\n }\n\n hooks?.onSent(event.id, emittingPayload, options)\n }\n\n return {\n get listeners() {\n return listeners\n },\n\n get onceListeners() {\n return onceListeners\n },\n\n emit,\n\n on<P>(eventOrMatchExpression: Eventa<P> | EventaMatchExpression<P>, handler: (payload: Eventa<P>, options?: Options) => void): () => void {\n if (eventOrMatchExpression.type === EventaType.Event) {\n const event = eventOrMatchExpression as Eventa<P>\n if (!listeners.has(event.id)) {\n listeners.set(event.id, new Set())\n }\n\n listeners.get(event.id)?.add(handler)\n\n return () => listeners.get(event.id)?.delete(handler)\n }\n\n if (eventOrMatchExpression.type === EventaType.MatchExpression) {\n const matchExpression = eventOrMatchExpression as EventaMatchExpression<P>\n if (!matchExpressions.has(matchExpression.id)) {\n matchExpressions.set(matchExpression.id, matchExpression as EventaMatchExpression<P>)\n }\n if (!matchExpressionListeners.has(matchExpression.id)) {\n matchExpressionListeners.set(matchExpression.id, new Set())\n }\n\n matchExpressionListeners.get(matchExpression.id)?.add(handler)\n\n return () => matchExpressionListeners.get(matchExpression.id)?.delete(handler)\n }\n\n return () => void 0\n },\n\n once<P>(eventOrMatchExpression: Eventa<P> | EventaMatchExpression<P>, handler: (payload: Eventa<P>, options?: Options) => void): () => void {\n if (eventOrMatchExpression.type === EventaType.Event) {\n const event = eventOrMatchExpression as Eventa<P>\n if (!onceListeners.has(event.id)) {\n onceListeners.set(event.id, new Set())\n }\n\n onceListeners.get(event.id)?.add(handler)\n\n return () => onceListeners.get(event.id)?.delete(handler)\n }\n\n if (eventOrMatchExpression.type === EventaType.MatchExpression) {\n const matchExpression = eventOrMatchExpression as EventaMatchExpression<P>\n if (!matchExpressions.has(matchExpression.id)) {\n matchExpressions.set(matchExpression.id, matchExpression as EventaMatchExpression<P>)\n }\n if (!matchExpressionListeners.has(matchExpression.id)) {\n matchExpressionListeners.set(matchExpression.id, new Set())\n }\n\n matchExpressionOnceListeners.get(matchExpression.id)?.add(handler)\n\n return () => matchExpressionOnceListeners.get(matchExpression.id)?.delete(handler)\n }\n\n return () => void 0\n },\n\n off<P>(eventOrMatchExpression: Eventa<P> | EventaMatchExpression<P>, handler?: (payload: Eventa<P>, options?: Options) => void) {\n switch (eventOrMatchExpression.type) {\n case EventaType.Event:\n if (handler !== undefined) {\n listeners.get(eventOrMatchExpression.id)?.delete(handler)\n onceListeners.get(eventOrMatchExpression.id)?.delete(handler)\n break\n }\n\n listeners.delete(eventOrMatchExpression.id)\n onceListeners.delete(eventOrMatchExpression.id)\n break\n case EventaType.MatchExpression:\n if (handler !== undefined) {\n matchExpressionListeners.get(eventOrMatchExpression.id)?.delete(handler)\n matchExpressionOnceListeners.get(eventOrMatchExpression.id)?.delete(handler)\n break\n }\n\n matchExpressionListeners.delete(eventOrMatchExpression.id)\n matchExpressionOnceListeners.delete(eventOrMatchExpression.id)\n break\n }\n },\n }\n}\n\nexport interface EventContext<Extensions = undefined, EmitOptions = undefined> {\n listeners: Map<EventTag<any, any>, Set<(params: any) => any>>\n onceListeners: Map<EventTag<any, any>, Set<(params: any) => any>>\n\n emit: <P>(event: Eventa<P>, payload: P, options?: EmitOptions) => void\n on: <P>(eventOrMatchExpression: Eventa<P> | EventaMatchExpression<P>, handler: (payload: Eventa<P>, options?: EmitOptions) => void) => () => void\n once: <P>(eventOrMatchExpression: Eventa<P> | EventaMatchExpression<P>, handler: (payload: Eventa<P>, options?: EmitOptions) => void) => () => void\n off: <P>(eventOrMatchExpression: Eventa<P> | EventaMatchExpression<P>, handler?: (payload: Eventa<P>, options?: EmitOptions) => void) => void\n\n /**\n * Extensions (adapter-specific).\n *\n * Known usage: webworkers/worker-threads populate internal invoke config via\n * `extensions.__internal.invoke` to abort pending invokes on fatal errors.\n */\n extensions?: Extensions\n}\n\nexport type EventContextEmitFn = EventContext['emit']\n"],"mappings":"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"}