{"version":3,"file":"context-n_a5nvP_.mjs","names":[],"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: Eventa<P>) => 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 as (event: Eventa<P>) => boolean | Promise<boolean>\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  // Lifetime AbortController for this context. Adapters call `ctx.abort(reason)`\n  // when the underlying transport dies (ws close, broadcast-channel dispose,\n  // worker error, etc). `defineInvoke` hooks `ctx.signal` so every in-flight\n  // invoke promise rejects in one cascade. Modeled after Go's context.Context:\n  // a single cancellation signal that flows to every operation derived from it.\n  const lifetimeController = new AbortController()\n\n  const hooks = props.adapter?.(emit).hooks\n\n  function emit<P>(event: Eventa<P>, payload: P, options?: Options): Promise<void> {\n    const emittingPayload = { ...event, body: payload }\n    const pending: Array<Promise<void>> = []\n\n    function track(result: unknown | Promise<unknown>) {\n      if (typeof result === 'object' && result !== null && 'then' in result && typeof result.then === 'function') {\n        pending.push(result as unknown as Promise<void>)\n      }\n    }\n\n    for (const listener of listeners.get(event.id) || []) {\n      track(listener(emittingPayload, options))\n      hooks?.onReceived?.(event.id, emittingPayload)\n    }\n\n    for (const onceListener of onceListeners.get(event.id) || []) {\n      track(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          track(listener(emittingPayload, options))\n          hooks?.onReceived?.(matchExpression.id, emittingPayload)\n        }\n        for (const onceListener of matchExpressionOnceListeners.get(matchExpression.id) || []) {\n          track(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    return Promise.all(pending).then(() => void 0)\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) => any): () => 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) => any): () => 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) => any) {\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    signal: lifetimeController.signal,\n\n    abort(reason?: unknown) {\n      // Idempotent — repeated calls are no-ops, matching AbortController semantics.\n      if (lifetimeController.signal.aborted) {\n        return\n      }\n\n      lifetimeController.abort(reason)\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) => Promise<void>\n  on: <P>(eventOrMatchExpression: Eventa<P> | EventaMatchExpression<P>, handler: (payload: Eventa<P>, options?: EmitOptions) => any) => () => void\n  once: <P>(eventOrMatchExpression: Eventa<P> | EventaMatchExpression<P>, handler: (payload: Eventa<P>, options?: EmitOptions) => any) => () => void\n  off: <P>(eventOrMatchExpression: Eventa<P> | EventaMatchExpression<P>, handler?: (payload: Eventa<P>, options?: EmitOptions) => any) => void\n\n  /**\n   * Lifetime signal for this context. Aborts when `abort()` is called by an\n   * adapter (e.g. ws close, broadcast-channel dispose, worker error). Every\n   * `defineInvoke(...)` derived from this ctx hooks this signal so transport\n   * death cascades into a single synchronous reject of every in-flight invoke.\n   *\n   * Mirrors Go's `context.Context` lifetime semantics: one signal, many\n   * derived operations, one cancel cascades to all.\n   */\n  signal: AbortSignal\n\n  /**\n   * Abort this context's lifetime signal. Adapters call this at transport-death\n   * points; the `reason` flows through to `invoke()` promise rejections so\n   * callers see a meaningful Error rather than a generic AbortError.\n   *\n   * Idempotent — repeated calls are no-ops.\n   */\n  abort: (reason?: unknown) => 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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"}