@moeru/eventa 1.0.0-beta.3 → 1.0.0-beta.4
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 +50 -1
- package/dist/adapters/broadcast-channel/index.d.mts +2 -2
- package/dist/adapters/broadcast-channel/index.mjs +6 -9
- package/dist/adapters/broadcast-channel/index.mjs.map +1 -1
- package/dist/adapters/electron/main.d.mts +2 -2
- package/dist/adapters/electron/main.mjs +7 -9
- package/dist/adapters/electron/main.mjs.map +1 -1
- package/dist/adapters/electron/renderer.d.mts +134 -3
- package/dist/adapters/electron/renderer.mjs +4 -6
- package/dist/adapters/electron/renderer.mjs.map +1 -1
- package/dist/adapters/event-emitter/index.d.mts +2 -2
- package/dist/adapters/event-emitter/index.mjs +4 -7
- package/dist/adapters/event-emitter/index.mjs.map +1 -1
- package/dist/adapters/event-target/index.d.mts +2 -2
- package/dist/adapters/event-target/index.mjs +5 -8
- package/dist/adapters/event-target/index.mjs.map +1 -1
- package/dist/adapters/websocket/h3/index.d.mts +442 -3
- package/dist/adapters/websocket/h3/index.mjs +7 -9
- package/dist/adapters/websocket/h3/index.mjs.map +1 -1
- package/dist/adapters/websocket/index.d.mts +1 -1
- package/dist/adapters/websocket/index.mjs +1 -1
- package/dist/adapters/websocket/native/index.d.mts +2 -2
- package/dist/adapters/websocket/native/index.mjs +4 -5
- package/dist/adapters/websocket/native/index.mjs.map +1 -1
- package/dist/adapters/webworkers/index.d.mts +2 -2
- package/dist/adapters/webworkers/index.mjs +5 -6
- package/dist/adapters/webworkers/index.mjs.map +1 -1
- package/dist/adapters/webworkers/worker/index.d.mts +1 -1
- package/dist/adapters/webworkers/worker/index.mjs +6 -7
- package/dist/adapters/webworkers/worker/index.mjs.map +1 -1
- package/dist/adapters/window-message/index.d.mts +50 -0
- package/dist/adapters/window-message/index.mjs +79 -0
- package/dist/adapters/window-message/index.mjs.map +1 -0
- package/dist/adapters/worker-threads/index.d.mts +2 -2
- package/dist/adapters/worker-threads/index.mjs +5 -6
- package/dist/adapters/worker-threads/index.mjs.map +1 -1
- package/dist/adapters/worker-threads/worker/index.d.mts +1 -1
- package/dist/adapters/worker-threads/worker/index.mjs +6 -7
- package/dist/adapters/worker-threads/worker/index.mjs.map +1 -1
- package/dist/{context-BNM9nsGp.d.mts → context-BsqFeoer.d.mts} +2 -2
- package/dist/{context-c10xPp3f.mjs → context-Dht_IZMb.mjs} +22 -24
- package/dist/context-Dht_IZMb.mjs.map +1 -0
- package/dist/{eventa-M1FMVrH1.d.mts → eventa-DSnoBa1O.d.mts} +3 -3
- package/dist/{index-giKJThn3.d.mts → index-g6DulgOI.d.mts} +88 -88
- package/dist/index.d.mts +3 -3
- package/dist/index.mjs +3 -4
- package/dist/{internal-C-4X8bpL.mjs → internal-CHUsXYiP.mjs} +3 -4
- package/dist/{internal-C-4X8bpL.mjs.map → internal-CHUsXYiP.mjs.map} +1 -1
- package/dist/{shared-eQ-hnVHv.mjs → shared-CA5MGwv0.mjs} +5 -7
- package/dist/shared-CA5MGwv0.mjs.map +1 -0
- package/dist/{shared-BcRXZZxh.d.mts → shared-CVTLm458.d.mts} +2 -2
- package/dist/{shared-NFMSqOPw.d.mts → shared-CfXZb-7K.d.mts} +2 -2
- package/dist/{shared-DeDRsHPI.mjs → shared-Dl0_bFq0.mjs} +4 -5
- package/dist/{shared-DeDRsHPI.mjs.map → shared-Dl0_bFq0.mjs.map} +1 -1
- package/dist/{src-CTkYOGiO.mjs → src-CTs6h4Ci.mjs} +56 -63
- package/dist/src-CTs6h4Ci.mjs.map +1 -0
- package/package.json +14 -7
- package/dist/context-c10xPp3f.mjs.map +0 -1
- package/dist/shared-eQ-hnVHv.mjs.map +0 -1
- package/dist/src-CTkYOGiO.mjs.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"context-c10xPp3f.mjs","names":["eventaObj: Eventa<P, M, IM>","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, M = unknown, IM = unknown> extends EventaLike<P, EventaType.Event> {\n body?: P\n /**\n * Optional runtime metadata that can be attached to the eventa.\n *\n * NOTICE: for defineInvoke, and defineInvokeHandler, the metadata will be omitted\n * for smaller chunk size, this means for metadata, the data contains will not be available in the defineInvokeHandler.\n *\n * This can be used for various purposes such as logging, debugging, or providing additional context about the eventa.\n * Allowing the event handler to be able to access this metadata can enable more flexible and powerful event handling logic.\n */\n metadata?: M\n /**\n * Optional runtime metadata that can be attached to the eventa when invoking it.\n *\n * Unlike the `metadata` field, the `invokeMetadata` is specifically designed to be used when invoking the eventa, and it\n * will be available in the defineInvokeHandler.\n *\n * This allows for a clear separation between the metadata that describes the eventa itself and the metadata that is relevant\n * to the invocation of the eventa, providing more flexibility in how metadata is used and accessed within the event\n * handling system.\n */\n invokeMetadata?: IM\n}\n\nexport type InferEventaPayload<E> = E extends Eventa<infer P> ? P : never\n\nexport function defineEventa<P = undefined, M = undefined, IM = undefined>(\n id?: string,\n options?: {\n /**\n * Optionally inherit many properties from another parent eventa.\n */\n inheritFrom?: Eventa<P, M, IM>\n /**\n * Optional runtime metadata that can be attached to the eventa.\n *\n * NOTICE: for defineInvoke, and defineInvokeHandler, the metadata will be omitted\n * for smaller chunk size, this means for metadata, the data contains will not be available in the defineInvokeHandler.\n *\n * This can be used for various purposes such as logging, debugging, or providing additional context about the eventa.\n * Allowing the event handler to be able to access this metadata can enable more flexible and powerful event handling logic.\n */\n metadata?: M\n /**\n * Optional runtime metadata that can be attached to the eventa when invoking it.\n *\n * Unlike the `metadata` field, the `invokeMetadata` is specifically designed to be used when invoking the eventa, and it\n * will be available in the defineInvokeHandler.\n *\n * This allows for a clear separation between the metadata that describes the eventa itself and the metadata that is relevant\n * to the invocation of the eventa, providing more flexibility in how metadata is used and accessed within the event\n * handling system.\n */\n invokeMetadata?: IM\n },\n): Eventa<P, M, IM> {\n if (!id) {\n id = nanoid()\n }\n\n const eventaObj: Eventa<P, M, IM> = {\n id: options?.inheritFrom?.id || id,\n type: options?.inheritFrom?.type || EventaType.Event,\n }\n\n const metadata = options?.inheritFrom?.metadata || options?.metadata\n if (metadata) {\n eventaObj.metadata = metadata\n }\n\n const invokeMetadata = options?.inheritFrom?.invokeMetadata || options?.invokeMetadata\n if (invokeMetadata) {\n eventaObj.invokeMetadata = invokeMetadata\n }\n\n return eventaObj as Eventa<P, M, IM>\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\n/**\n * Match by is powerful utility function that allows you to create a match expression based on various criteria\n * when working with eventa (event system).\n *\n * Semantics like glob matching, RegExp, or even custom matcher function can be used to create complex match\n * expressions that can be used to filter and handle events in a flexible way.\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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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"shared-eQ-hnVHv.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 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"src-CTkYOGiO.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, M = undefined, IM = undefined> extends Eventa<{ invokeId: string, content: Req, isReqStream?: boolean }, M, IM> {\n id: EventTag<Res, Req>\n invokeType: InvokeEventType.SendEvent\n}\n\nexport interface SendEventError<Res, Req = undefined, _ = undefined, ReqErr = Error, M = undefined, IM = undefined> extends Eventa<{ invokeId: string, content: ReqErr }, M, IM> {\n id: EventTag<Res, Req>\n invokeType: InvokeEventType.SendEventError\n}\n\nexport interface SendEventStreamEnd<Res, Req = undefined, _ = undefined, __ = undefined, M = undefined, IM = undefined> extends Eventa<{ invokeId: string, content: undefined }, M, IM> {\n id: EventTag<Res, Req>\n invokeType: InvokeEventType.SendEventStreamEnd\n}\n\nexport interface SendEventAbort<Res, Req = undefined, _ = undefined, __ = undefined, M = undefined, IM = undefined> extends Eventa<{ invokeId: string, content?: unknown }, M, IM> {\n id: EventTag<Res, Req>\n invokeType: InvokeEventType.SendEventAbort\n}\n\nexport interface ReceiveEvent<Res, Req = undefined, _ = undefined, __ = undefined, M = undefined, IM = undefined> extends Eventa<{ invokeId: string, content: Res }, M, IM> {\n id: EventTag<Res, Req>\n invokeType: InvokeEventType.ReceiveEvent\n}\n\nexport interface ReceiveEventError<Res, Req = undefined, ResErr = undefined, _ = undefined, M = undefined, IM = undefined> extends Eventa<{ invokeId: string, content: { error: ResErr } }, M, IM> {\n id: EventTag<Res, Req>\n invokeType: InvokeEventType.ReceiveEventError\n}\n\nexport interface ReceiveEventStreamEnd<Res, Req = undefined, _ = undefined, __ = undefined, M = undefined, IM = undefined> extends Eventa<{ invokeId: string, content: undefined }, M, IM> {\n id: EventTag<Res, Req>\n invokeType: InvokeEventType.ReceiveEventStreamEnd\n}\n\nexport interface InvokeEventa<Res, Req = undefined, ResErr = Error, ReqErr = Error, M = undefined, IM = undefined> {\n sendEvent: SendEvent<Res, Req, ResErr, ReqErr, M, IM>\n sendEventError: SendEventError<Res, Req, ResErr, ReqErr, M, IM>\n sendEventStreamEnd: SendEventStreamEnd<Res, Req, ResErr, ReqErr, M, IM>\n sendEventAbort: SendEventAbort<Res, Req, ResErr, ReqErr, M, IM>\n receiveEvent: ReceiveEvent<Res, Req, ResErr, ReqErr, M, IM>\n receiveEventError: ReceiveEventError<Res, Req, ResErr, ReqErr, M, IM>\n receiveEventStreamEnd: ReceiveEventStreamEnd<Res, Req, ResErr, ReqErr, M, IM>\n}\n\nexport interface InvokeHandlerEventa<Res, Req = undefined, ResErr = Error, ReqErr = Error, M = undefined, _IM = undefined> extends InvokeEventa<Res, Req, ResErr, ReqErr, M, undefined> {\n sendEvent: SendEvent<Res, Req, ResErr, ReqErr, M, undefined>\n sendEventError: SendEventError<Res, Req, ResErr, ReqErr, M, undefined>\n sendEventStreamEnd: SendEventStreamEnd<Res, Req, ResErr, ReqErr, M, undefined>\n sendEventAbort: SendEventAbort<Res, Req, ResErr, ReqErr, M, undefined>\n receiveEvent: ReceiveEvent<Res, Req, ResErr, ReqErr, M, undefined>\n receiveEventError: ReceiveEventError<Res, Req, ResErr, ReqErr, M, undefined>\n receiveEventStreamEnd: ReceiveEventStreamEnd<Res, Req, ResErr, ReqErr, M, undefined>\n}\n\nexport type InferSendEvent<T> = T extends { sendEvent: SendEvent<infer Res, infer Req, infer ResErr, infer ReqErr, infer M, infer IM> }\n ? SendEvent<Res, Req, ResErr, ReqErr, M, IM>\n : never\n\nexport type InferSendEventError<T> = T extends { sendEventError: SendEventError<infer Res, infer Req, infer ResErr, infer ReqErr, infer M, infer IM> }\n ? SendEventError<Res, Req, ResErr, ReqErr, M, IM>\n : never\n\nexport type InferSendEventStreamEnd<T> = T extends { sendEventStreamEnd: SendEventStreamEnd<infer Res, infer Req, infer ResErr, infer ReqErr, infer M, infer IM> }\n ? SendEventStreamEnd<Res, Req, ResErr, ReqErr, M, IM>\n : never\n\nexport type InferSendEventAbort<T> = T extends { sendEventAbort: SendEventAbort<infer Res, infer Req, infer ResErr, infer ReqErr, infer M, infer IM> }\n ? SendEventAbort<Res, Req, ResErr, ReqErr, M, IM>\n : never\n\nexport type InferReceiveEvent<T> = T extends { receiveEvent: ReceiveEvent<infer Res, infer Req, infer ResErr, infer ReqErr, infer M, infer IM> }\n ? ReceiveEvent<Res, Req, ResErr, ReqErr, M, IM>\n : never\n\nexport type InferReceiveEventError<T> = T extends { receiveEventError: ReceiveEventError<infer Res, infer Req, infer ResErr, infer ReqErr, infer M, infer IM> }\n ? ReceiveEventError<Res, Req, ResErr, ReqErr, M, IM>\n : never\n\nexport type InferReceiveEventStreamEnd<T> = T extends { receiveEventStreamEnd: ReceiveEventStreamEnd<infer Res, infer Req, infer ResErr, infer ReqErr, infer M, infer IM> }\n ? ReceiveEventStreamEnd<Res, Req, ResErr, ReqErr, M, IM>\n : never\n\nexport function defineInvokeEventa<Res, Req = undefined, ResErr = Error, ReqErr = Error, M = undefined, IM = undefined>(tag?: string, options?: { metadata?: M, invokeMetadata?: IM }) {\n if (!tag) {\n tag = nanoid()\n }\n\n const sendEvent = {\n ...defineEventa<InvokeEventType.SendEvent, M, IM>(`${tag}-send`, { metadata: options?.metadata, invokeMetadata: options?.invokeMetadata }),\n invokeType: InvokeEventType.SendEvent,\n } as SendEvent<Res, Req, ResErr, ReqErr, M, IM>\n const sendEventError = {\n ...defineEventa<InvokeEventType.SendEventError, M, IM>(`${tag}-send-error`, { metadata: options?.metadata, invokeMetadata: options?.invokeMetadata }),\n invokeType: InvokeEventType.SendEventError,\n } as SendEventError<Res, Req, ResErr, ReqErr, M, IM>\n const sendEventStreamEnd = {\n ...defineEventa<InvokeEventType.SendEventStreamEnd, M, IM>(`${tag}-send-stream-end`, { metadata: options?.metadata, invokeMetadata: options?.invokeMetadata }),\n invokeType: InvokeEventType.SendEventStreamEnd,\n } as SendEventStreamEnd<Res, Req, ResErr, ReqErr, M, IM>\n const sendEventAbort = {\n ...defineEventa<InvokeEventType.SendEventAbort, M, IM>(`${tag}-send-abort`, { metadata: options?.metadata, invokeMetadata: options?.invokeMetadata }),\n invokeType: InvokeEventType.SendEventAbort,\n } as SendEventAbort<Res, Req, ResErr, ReqErr, M, IM>\n const receiveEvent = {\n ...defineEventa<InvokeEventType.ReceiveEvent, M, IM>(`${tag}-receive`, { metadata: options?.metadata, invokeMetadata: options?.invokeMetadata }),\n invokeType: InvokeEventType.ReceiveEvent,\n } as ReceiveEvent<Res, Req, ResErr, ReqErr, M, IM>\n const receiveEventError = {\n ...defineEventa<InvokeEventType.ReceiveEventError, M, IM>(`${tag}-receive-error`, { metadata: options?.metadata, invokeMetadata: options?.invokeMetadata }),\n invokeType: InvokeEventType.ReceiveEventError,\n } as ReceiveEventError<Res, Req, ResErr, ReqErr, M, IM>\n const receiveEventStreamEnd = {\n ...defineEventa<InvokeEventType.ReceiveEventStreamEnd, M, IM>(`${tag}-receive-stream-end`, { metadata: options?.metadata, invokeMetadata: options?.invokeMetadata }),\n invokeType: InvokeEventType.ReceiveEventStreamEnd,\n } as ReceiveEventStreamEnd<Res, Req, ResErr, ReqErr, M, IM>\n\n return {\n sendEvent,\n sendEventError,\n sendEventStreamEnd,\n sendEventAbort,\n receiveEvent,\n receiveEventError,\n receiveEventStreamEnd,\n } satisfies InvokeEventa<Res, Req, ResErr, ReqErr, M, IM>\n}\n\nexport function isInvokeEventa(event: Eventa<any>): event is\n | SendEvent<any, any, any, any, any, any>\n | SendEventError<any, any, any, any, any, any>\n | SendEventStreamEnd<any, any, any, any, any, any>\n | ReceiveEvent<any, any, any, any, any, any>\n | ReceiveEventError<any, any, any, any, any, any>\n | ReceiveEventStreamEnd<any, any, any, any, any, any>\n | SendEventAbort<any, any, 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, any, any>\n | SendEventError<any, any, any, any, any, any>\n | SendEventStreamEnd<any, any, any, any, any, any>\n | SendEventAbort<any, any, 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, any, any>\n | ReceiveEventError<any, any, any, any, any, any>\n | ReceiveEventStreamEnd<any, any, 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, InvokeHandlerEventa, 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 M = undefined,\n IM = undefined,\n> {\n onSend: (params: InvokeEventa<Res, Req, ResErr, ReqErr, M, IM>['sendEvent'], eventOptions?: EO) => void\n onSendStreamEnd: (params: InvokeEventa<Res, Req, ResErr, ReqErr, M, IM>['sendEventStreamEnd'], eventOptions?: EO) => void\n onSendAbort: (params: InvokeEventa<Res, Req, ResErr, ReqErr, M, IM>['sendEventAbort'], eventOptions?: EO) => void\n}\n\nexport type HandlerMap<\n EventMap extends Record<string, InvokeEventa<any, any, 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, 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, any, any, any, any, any, 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 M = undefined,\n IM = undefined,\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, M, IM>): InvokeFunction<Res, Req, ECtx> {\n function getContext(): ECtx | Promise<ECtx> {\n if (typeof ctx === 'function') {\n return ctx()\n }\n\n return ctx\n }\n\n function createInvokePromise(resolvedCtx: ECtx, req?: Req, options?: ExtractInvokeRequestOptions<ECtx>): Promise<Res> {\n return new Promise<Res>((resolve, reject) => {\n const ctx = resolvedCtx\n const invokeId = nanoid()\n\n const invokeReceiveEvent = defineEventa(`${event.receiveEvent.id}-${invokeId}`) as ReceiveEvent<Res, Req, ResErr, ReqErr, M, IM>\n delete invokeReceiveEvent.metadata\n const invokeReceiveEventError = defineEventa(`${event.receiveEventError.id}-${invokeId}`) as ReceiveEventError<Res, Req, ResErr, ReqErr, M, IM>\n delete invokeReceiveEventError.metadata\n\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 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\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)\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 function _invoke(req?: Req, options?: ExtractInvokeRequestOptions<ECtx>): Promise<Res> {\n const resolvedCtx = getContext()\n if (resolvedCtx instanceof Promise) {\n return resolvedCtx.then(ctx => createInvokePromise(ctx, req, options))\n }\n\n return createInvokePromise(resolvedCtx, req, options)\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, 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 M = undefined,\n IM = undefined,\n CtxExt = any,\n EOpts extends { raw?: any } = any,\n>(\n ctx: InvocableEventContext<CtxExt, EOpts>,\n event: InvokeHandlerEventa<Res, Req, ResErr, ReqErr, M, IM>,\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, M, IM> | 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>>, M, IM>,\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, M, IM>,\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, M, IM>, 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, M, IM>, 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, M, IM>, 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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"}
|