{"version":3,"file":"index.mjs","names":[],"sources":["../src/channel.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 { DirectionalEventa, Eventa } from './eventa'\n\nimport { and, defineInboundEventa, EventaFlowDirection, matchBy } from './eventa'\n\nexport type ChannelPluginResult\n  = | false\n    | void\n    | Eventa<any>\n    | Promise<false | void | Eventa<any>>\n\nexport interface ChannelPluginContext<\n  FromExtensions = any,\n  FromEmitOptions = any,\n  ToExtensions = any,\n  ToEmitOptions = any,\n> {\n  source: EventContext<FromExtensions, FromEmitOptions>\n  target: EventContext<ToExtensions, ToEmitOptions>\n  direction?: string\n}\n\nexport type ChannelPlugin<\n  FromExtensions = any,\n  FromEmitOptions = any,\n  ToExtensions = any,\n  ToEmitOptions = any,\n> = (\n  event: Eventa<any>,\n  context: ChannelPluginContext<FromExtensions, FromEmitOptions, ToExtensions, ToEmitOptions>,\n) => ChannelPluginResult\n\nexport interface ChannelLinkPluginContext<\n  LeftExtensions = any,\n  LeftEmitOptions = any,\n  RightExtensions = any,\n  RightEmitOptions = any,\n> {\n  source:\n    | EventContext<LeftExtensions, LeftEmitOptions>\n    | EventContext<RightExtensions, RightEmitOptions>\n  target:\n    | EventContext<LeftExtensions, LeftEmitOptions>\n    | EventContext<RightExtensions, RightEmitOptions>\n  direction?: string\n}\n\nexport type ChannelLinkPlugin<\n  LeftExtensions = any,\n  LeftEmitOptions = any,\n  RightExtensions = any,\n  RightEmitOptions = any,\n> = (\n  event: Eventa<any>,\n  context: ChannelLinkPluginContext<LeftExtensions, LeftEmitOptions, RightExtensions, RightEmitOptions>,\n) => ChannelPluginResult\n\nexport function defineChannelPlugin<\n  FromExtensions = any,\n  FromEmitOptions = any,\n  ToExtensions = any,\n  ToEmitOptions = any,\n>(plugin: ChannelPlugin<FromExtensions, FromEmitOptions, ToExtensions, ToEmitOptions>): ChannelPlugin<FromExtensions, FromEmitOptions, ToExtensions, ToEmitOptions> {\n  return plugin\n}\n\nexport interface ChannelPipe<\n  FromExtensions = any,\n  FromEmitOptions = any,\n  ToExtensions = any,\n  ToEmitOptions = any,\n> {\n  use: (plugin: ChannelPlugin<FromExtensions, FromEmitOptions, ToExtensions, ToEmitOptions>) => () => void\n  dispose: () => void\n}\n\nexport interface ChannelPipeGroup<\n  FromExtensions = any,\n  FromEmitOptions = any,\n  ToExtensions = any,\n  ToEmitOptions = any,\n> extends ChannelPipe<FromExtensions, FromEmitOptions, ToExtensions, ToEmitOptions> {\n  pipes: Array<ChannelPipe<FromExtensions, FromEmitOptions, ToExtensions, ToEmitOptions>>\n}\n\nexport interface ChannelPipeOptions<\n  FromExtensions = any,\n  FromEmitOptions = any,\n  ToExtensions = any,\n  ToEmitOptions = any,\n> {\n  plugins?:\n    | ChannelPlugin<FromExtensions, FromEmitOptions, ToExtensions, ToEmitOptions>\n    | Array<ChannelPlugin<FromExtensions, FromEmitOptions, ToExtensions, ToEmitOptions>>\n  direction?: string\n  /**\n   * Propagates source context abort to every target context by default.\n   *\n   * NOTICE: this is lifecycle propagation, not an event flowing through the\n   * plugin pipeline. Channel plugins and filters do not block it. Set false\n   * when contexts should share events but keep independent lifetimes.\n   */\n  propagateAbort?: boolean\n}\n\nexport interface ChannelLinkOptions<\n  LeftExtensions = any,\n  LeftEmitOptions = any,\n  RightExtensions = any,\n  RightEmitOptions = any,\n> {\n  plugins?:\n    | ChannelLinkPlugin<LeftExtensions, LeftEmitOptions, RightExtensions, RightEmitOptions>\n    | Array<ChannelLinkPlugin<LeftExtensions, LeftEmitOptions, RightExtensions, RightEmitOptions>>\n  /**\n   * Propagates abort across the linked mesh by default.\n   *\n   * NOTICE: this is lifecycle propagation, not an event flowing through the\n   * plugin pipeline. Link plugins and filters do not block it. Set false when\n   * contexts should share events but keep independent lifetimes.\n   */\n  propagateAbort?: boolean\n}\n\nexport interface ChannelLink<\n  LeftExtensions = any,\n  LeftEmitOptions = any,\n  RightExtensions = any,\n  RightEmitOptions = any,\n> {\n  pipes: Array<ChannelPipe<any, any, any, any>>\n  use: (plugin: ChannelLinkPlugin<LeftExtensions, LeftEmitOptions, RightExtensions, RightEmitOptions>) => () => void\n  dispose: () => void\n}\n\n// TODO: Add route selectors on top of the group model:\n// - pipeChannel(...).to(target).use(plugin) for target-specific fan-out rules.\n// - linkChannel(...).from(source).to(target).use(plugin) for one directed edge.\n// - linkChannel(...).between(left, right).use(plugin) for both directions.\n// Keep those as chainable selectors instead of widening options into a route\n// table; route behavior belongs to edges and should compose with group .use().\n//\n// NOTICE: linkChannel(...contexts) creates a fully-connected bidirectional\n// mesh. It is not a linear chain like a <-> b <-> c.\n\nexport type ChannelConnectionOptions<\n  LeftExtensions = any,\n  LeftEmitOptions = any,\n  RightExtensions = any,\n  RightEmitOptions = any,\n> = ChannelLinkOptions<LeftExtensions, LeftEmitOptions, RightExtensions, RightEmitOptions>\n\nexport type ChannelConnection<\n  LeftExtensions = any,\n  LeftEmitOptions = any,\n  RightExtensions = any,\n  RightEmitOptions = any,\n> = ChannelLink<LeftExtensions, LeftEmitOptions, RightExtensions, RightEmitOptions>\n\nfunction normalizePlugins<\n  FromExtensions,\n  FromEmitOptions,\n  ToExtensions,\n  ToEmitOptions,\n>(plugins?: ChannelPlugin<FromExtensions, FromEmitOptions, ToExtensions, ToEmitOptions> | Array<ChannelPlugin<FromExtensions, FromEmitOptions, ToExtensions, ToEmitOptions>>): Array<ChannelPlugin<FromExtensions, FromEmitOptions, ToExtensions, ToEmitOptions>> {\n  if (!plugins) {\n    return []\n  }\n\n  return Array.isArray(plugins) ? [...plugins] : [plugins]\n}\n\nfunction isPromiseLike<T>(value: T | PromiseLike<T>): value is PromiseLike<T> {\n  return typeof (value as PromiseLike<T>)?.then === 'function'\n}\n\nfunction toInboundEvent(event: Eventa<any>): Eventa<any> {\n  return {\n    ...defineInboundEventa(event.id),\n    ...event,\n    _flowDirection: EventaFlowDirection.Inbound,\n  } as Eventa<any>\n}\n\nfunction isEventContext(value: unknown): value is EventContext<any, any> {\n  return typeof value === 'object'\n    && value !== null\n    && typeof (value as EventContext<any, any>).emit === 'function'\n    && typeof (value as EventContext<any, any>).on === 'function'\n}\n\nfunction isPipeOptions(value: unknown): value is ChannelPipeOptions<any, any, any, any> {\n  return typeof value === 'object'\n    && value !== null\n    && !Array.isArray(value)\n    && !isEventContext(value)\n    && ('plugins' in value || 'direction' in value || 'propagateAbort' in value)\n}\n\ninterface CreateChannelPipeOptions<\n  FromExtensions = any,\n  FromEmitOptions = any,\n  ToExtensions = any,\n  ToEmitOptions = any,\n> {\n  plugins?: Array<ChannelPlugin<FromExtensions, FromEmitOptions, ToExtensions, ToEmitOptions>>\n  direction?: string\n  propagateAbort?: boolean\n}\n\nfunction createChannelPipe<\n  FromExtensions = undefined,\n  FromEmitOptions = undefined,\n  ToExtensions = undefined,\n  ToEmitOptions = undefined,\n>(\n  from: EventContext<FromExtensions, FromEmitOptions>,\n  to: EventContext<ToExtensions, ToEmitOptions>,\n  pipeOptions: CreateChannelPipeOptions<FromExtensions, FromEmitOptions, ToExtensions, ToEmitOptions> = {},\n): ChannelPipe<FromExtensions, FromEmitOptions, ToExtensions, ToEmitOptions> {\n  const plugins = pipeOptions.plugins ?? []\n  const localPluginList: Array<ChannelPlugin<FromExtensions, FromEmitOptions, ToExtensions, ToEmitOptions>> = []\n\n  const onSourceAbort = () => {\n    to.abort(from.signal.reason)\n  }\n\n  if (pipeOptions.propagateAbort ?? true) {\n    if (from.signal.aborted) {\n      onSourceAbort()\n    }\n    else {\n      from.signal.addEventListener('abort', onSourceAbort, { once: true })\n    }\n  }\n\n  const off = from.on(and(\n    matchBy((event: DirectionalEventa<any>) => event._flowDirection === EventaFlowDirection.Outbound || !event._flowDirection),\n    matchBy('*'),\n  ), async (event, options) => {\n    let current: Eventa<any> = event\n    const context: ChannelPluginContext<FromExtensions, FromEmitOptions, ToExtensions, ToEmitOptions> = { source: from, target: to, direction: pipeOptions.direction }\n\n    // Keep the two lists separate to avoid copying plugin arrays on every event;\n    // shared plugins still run before pipe-local plugins.\n    for (const pluginList of [plugins, localPluginList]) {\n      for (const plugin of pluginList) {\n        const pluginResult = plugin(current, context)\n        const result = isPromiseLike(pluginResult)\n          ? await pluginResult\n          : pluginResult\n\n        if (result === false) {\n          return\n        }\n        if (typeof result !== 'undefined') {\n          current = result\n        }\n      }\n    }\n\n    await to.emit(toInboundEvent(current), current.body, options as never)\n  })\n\n  let disposed = false\n\n  return {\n    use(plugin) {\n      if (disposed) {\n        throw new Error('Channel pipe disposed.')\n      }\n\n      localPluginList.push(plugin)\n\n      return () => {\n        const index = localPluginList.indexOf(plugin)\n\n        if (index >= 0) {\n          localPluginList.splice(index, 1)\n        }\n      }\n    },\n\n    dispose() {\n      if (disposed) {\n        return\n      }\n\n      disposed = true\n      off()\n      from.signal.removeEventListener('abort', onSourceAbort)\n      localPluginList.length = 0\n    },\n  }\n}\n\nexport function pipeChannel<\n  FromExtensions = undefined,\n  FromEmitOptions = undefined,\n  ToExtensions = undefined,\n  ToEmitOptions = undefined,\n>(\n  from: EventContext<FromExtensions, FromEmitOptions>,\n  to: EventContext<ToExtensions, ToEmitOptions>,\n  options?:\n    | ChannelPipeOptions<FromExtensions, FromEmitOptions, ToExtensions, ToEmitOptions>\n    | ChannelPlugin<FromExtensions, FromEmitOptions, ToExtensions, ToEmitOptions>\n    | Array<ChannelPlugin<FromExtensions, FromEmitOptions, ToExtensions, ToEmitOptions>>,\n): ChannelPipeGroup<FromExtensions, FromEmitOptions, ToExtensions, ToEmitOptions>\n\nexport function pipeChannel<\n  FromExtensions = undefined,\n  FromEmitOptions = undefined,\n  ToExtensions = undefined,\n  ToEmitOptions = undefined,\n>(\n  from: EventContext<FromExtensions, FromEmitOptions>,\n  firstTo: EventContext<ToExtensions, ToEmitOptions>,\n  ...targetsAndOptions: Array<\n    | EventContext<ToExtensions, ToEmitOptions>\n    | ChannelPipeOptions<FromExtensions, FromEmitOptions, ToExtensions, ToEmitOptions>\n    | ChannelPlugin<FromExtensions, FromEmitOptions, ToExtensions, ToEmitOptions>\n    | Array<ChannelPlugin<FromExtensions, FromEmitOptions, ToExtensions, ToEmitOptions>>\n  >\n): ChannelPipeGroup<FromExtensions, FromEmitOptions, ToExtensions, ToEmitOptions>\n\nexport function pipeChannel(\n  from: EventContext<any, any>,\n  firstTo: EventContext<any, any>,\n  ...targetsAndOptions: Array<\n    | EventContext<any, any>\n    | ChannelPipeOptions<any, any, any, any>\n    | ChannelPlugin<any, any, any, any>\n    | Array<ChannelPlugin<any, any, any, any>>\n    | undefined\n  >\n): ChannelPipeGroup<any, any, any, any> {\n  const targets: Array<EventContext<any, any>> = [firstTo]\n  let options: ChannelPipeOptions<any, any, any, any> = {}\n\n  for (const item of targetsAndOptions) {\n    if (!item) {\n      continue\n    }\n\n    if (isEventContext(item)) {\n      targets.push(item)\n      continue\n    }\n\n    if (isPipeOptions(item)) {\n      options = item\n      continue\n    }\n\n    options = {\n      ...options,\n      plugins: item,\n    }\n  }\n\n  const pluginList = normalizePlugins(options.plugins)\n  const pipes = targets.map(target => createChannelPipe(from, target, {\n    plugins: pluginList,\n    direction: options.direction,\n    propagateAbort: options.propagateAbort,\n  }))\n  let disposed = false\n\n  return {\n    pipes,\n    use(plugin) {\n      if (disposed) {\n        throw new Error('Channel pipe disposed.')\n      }\n\n      pluginList.push(plugin)\n\n      return () => {\n        const index = pluginList.indexOf(plugin)\n\n        if (index >= 0) {\n          pluginList.splice(index, 1)\n        }\n      }\n    },\n    dispose() {\n      if (disposed) {\n        return\n      }\n\n      disposed = true\n      for (const pipe of pipes) {\n        pipe.dispose()\n      }\n      pluginList.length = 0\n    },\n  }\n}\n\nfunction getLinkDirection(sourceIndex: number, targetIndex: number): string {\n  if (sourceIndex === 0 && targetIndex === 1) {\n    return 'left-to-right'\n  }\n  if (sourceIndex === 1 && targetIndex === 0) {\n    return 'right-to-left'\n  }\n\n  return `context-${sourceIndex}-to-${targetIndex}`\n}\n\nexport function linkChannel<\n  LeftExtensions = undefined,\n  LeftEmitOptions = undefined,\n  RightExtensions = undefined,\n  RightEmitOptions = undefined,\n>(\n  leftContext: EventContext<LeftExtensions, LeftEmitOptions>,\n  rightContext: EventContext<RightExtensions, RightEmitOptions>,\n  options?: ChannelLinkOptions<LeftExtensions, LeftEmitOptions, RightExtensions, RightEmitOptions>,\n): ChannelLink<LeftExtensions, LeftEmitOptions, RightExtensions, RightEmitOptions>\n\nexport function linkChannel(\n  ...contextsAndOptions: Array<EventContext<any, any> | ChannelLinkOptions<any, any, any, any>>\n): ChannelLink<any, any, any, any>\n\nexport function linkChannel(\n  ...contextsAndOptions: Array<EventContext<any, any> | ChannelLinkOptions<any, any, any, any> | undefined>\n): ChannelLink<any, any, any, any> {\n  const contexts: Array<EventContext<any, any>> = []\n  let options: ChannelLinkOptions<any, any, any, any> = {}\n\n  for (const item of contextsAndOptions) {\n    if (!item) {\n      continue\n    }\n\n    if (isEventContext(item)) {\n      contexts.push(item)\n      continue\n    }\n\n    options = item\n  }\n\n  const pluginList = normalizePlugins(options.plugins) as Array<ChannelPlugin<any, any, any, any>>\n  const pipes: Array<ChannelPipe<any, any, any, any>> = []\n\n  for (let sourceIndex = 0; sourceIndex < contexts.length; sourceIndex += 1) {\n    for (let targetIndex = 0; targetIndex < contexts.length; targetIndex += 1) {\n      if (sourceIndex === targetIndex) {\n        continue\n      }\n\n      pipes.push(createChannelPipe(contexts[sourceIndex], contexts[targetIndex], {\n        plugins: pluginList,\n        direction: getLinkDirection(sourceIndex, targetIndex),\n        propagateAbort: options.propagateAbort,\n      }))\n    }\n  }\n\n  let disposed = false\n\n  return {\n    pipes,\n    use(plugin) {\n      if (disposed) {\n        throw new Error('Channel link disposed.')\n      }\n\n      pluginList.push(plugin)\n\n      return () => {\n        const index = pluginList.indexOf(plugin)\n\n        if (index >= 0) {\n          pluginList.splice(index, 1)\n        }\n      }\n    },\n    dispose() {\n      if (disposed) {\n        return\n      }\n\n      disposed = true\n      for (const pipe of pipes) {\n        pipe.dispose()\n      }\n      pluginList.length = 0\n    },\n  }\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 { 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: Eventa<NonNullable<InvokeEventa<Res, Req, ResErr, ReqErr, M, IM>['sendEvent']['body']>>, eventOptions?: EO) => void\n  onSendStreamEnd: (params: Eventa<NonNullable<InvokeEventa<Res, Req, ResErr, ReqErr, M, IM>['sendEventStreamEnd']['body']>>, eventOptions?: EO) => void\n  onSendAbort: (params: Eventa<NonNullable<InvokeEventa<Res, Req, ResErr, ReqErr, M, IM>['sendEventAbort']['body']>>, eventOptions?: EO) => void\n  cleanup: () => 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, any, any, 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 ctx.signal so transport-death (ws close, worker error,\n      // broadcast-channel dispose, etc) cascades into a synchronous reject\n      // for every in-flight invoke. The reason passed to `ctx.abort(reason)`\n      // by the adapter flows straight through — we don't wrap it in\n      // createAbortError because adapters produce semantically-rich errors\n      // (\"eventa: ws disconnected (<url>)\") that callers want to see verbatim.\n      const ctxSignal: AbortSignal | undefined = (ctx as { signal?: AbortSignal }).signal\n      const onCtxAbort = () => {\n        // eslint-disable-next-line ts/no-use-before-define\n        finishReject(ctxSignal?.reason)\n      }\n\n      const cleanup = () => {\n        ctx.off(invokeReceiveEvent)\n        ctx.off(invokeReceiveEventError)\n        if (ctxSignal) {\n          ctxSignal.removeEventListener('abort', onCtxAbort)\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 (ctxSignal) {\n        if (ctxSignal.aborted) {\n          onCtxAbort()\n          return\n        }\n        ctxSignal.addEventListener('abort', onCtxAbort, { once: true })\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  const existingHandler = handlers.get(handler) as InternalInvokeHandler<Res, Req, ResErr, ReqErr, EOpts, M, IM> | undefined\n  if (existingHandler) {\n    return () => {\n      ctx.off(event.sendEvent, existingHandler.onSend)\n      ctx.off(event.sendEventStreamEnd, existingHandler.onSendStreamEnd)\n      ctx.off(event.sendEventAbort, existingHandler.onSendAbort)\n      existingHandler.cleanup()\n    }\n  }\n\n  const streamStates = new Map<string, ReadableStreamDefaultController<Req>>()\n  const abortControllers = new Map<string, AbortController>()\n  const abortReasons = new Map<string, unknown>()\n\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(() => {\n      return controller.abort(reason)\n    })\n  }\n\n  const ctxSignal = ctx.signal\n\n  const onCtxAbort = () => {\n    for (const controller of abortControllers.values()) {\n      scheduleAbort(controller, ctxSignal?.reason)\n    }\n\n    for (const controller of streamStates.values()) {\n      controller.error(createAbortError(ctxSignal?.reason))\n    }\n\n    streamStates.clear()\n  }\n\n  if (ctxSignal.aborted) {\n    onCtxAbort()\n  }\n  else {\n    ctxSignal.addEventListener('abort', onCtxAbort, { once: true })\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 (ctxSignal.aborted) {\n      scheduleAbort(abortController, ctxSignal.reason)\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: Eventa<NonNullable<SendEvent<Res, Req, ResErr, ReqErr, M, IM>['body']>>, 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: Eventa<NonNullable<SendEventStreamEnd<Res, Req, ResErr, ReqErr, M, IM>['body']>>, 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: Eventa<NonNullable<SendEventAbort<Res, Req, ResErr, ReqErr, M, IM>['body']>>, 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  const cleanup = () => {\n    ctxSignal.removeEventListener('abort', onCtxAbort)\n  }\n\n  const internalHandler = { onSend, onSendStreamEnd, onSendAbort, cleanup }\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  return () => {\n    ctx.off(event.sendEvent, internalHandler.onSend)\n    ctx.off(event.sendEventStreamEnd, internalHandler.onSendStreamEnd)\n    ctx.off(event.sendEventAbort, internalHandler.onSendAbort)\n    internalHandler.cleanup()\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\n  const handlers = ctx.invokeHandlers?.get(event.sendEvent.id)\n  if (!handlers) {\n    return false\n  }\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    internalHandler.cleanup()\n    ctx.invokeHandlers.delete(event.sendEvent.id)\n\n    return true\n  }\n\n  let returnValue = false\n\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    internalHandlers.cleanup()\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 { ExtractInvokeRequestOptions } from './invoke'\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?: ExtractInvokeRequestOptions<EventContext<E, EO>>) => {\n    const invokeId = nanoid()\n    const { signal, ...emitOptions } = (options ?? {}) as ExtractInvokeRequestOptions<EventContext<E, EO>> & 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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"}