{"version":3,"file":"index.cjs","names":["ChannelWriter","ChannelReader","isChannelRef"],"sources":["../src/iii-constants.ts","../src/iii-types.ts","../src/iii.ts"],"sourcesContent":["/**\n * Constants for the III module.\n */\n\n/**\n * Engine function paths for internal operations.\n *\n * Naming note: `LIST_TRIGGERS` / `INFO_TRIGGERS` cover trigger TYPES\n * (templates). `LIST_REGISTERED_TRIGGERS` / `INFO_REGISTERED_TRIGGERS`\n * cover trigger INSTANCES (subscriber rows). The old\n * `engine::trigger-types::list` builtin has been removed and is now\n * served by `engine::triggers::list`.\n */\nexport const EngineFunctions = {\n  LIST_FUNCTIONS: 'engine::functions::list',\n  INFO_FUNCTIONS: 'engine::functions::info',\n  LIST_WORKERS: 'engine::workers::list',\n  INFO_WORKERS: 'engine::workers::info',\n  LIST_TRIGGERS: 'engine::triggers::list',\n  INFO_TRIGGERS: 'engine::triggers::info',\n  LIST_REGISTERED_TRIGGERS: 'engine::registered-triggers::list',\n  INFO_REGISTERED_TRIGGERS: 'engine::registered-triggers::info',\n  REGISTER_WORKER: 'engine::workers::register',\n} as const\n\n/** Engine trigger types */\nexport const EngineTriggers = {\n  FUNCTIONS_AVAILABLE: 'engine::functions-available',\n} as const\n\n/** Connection state for the III WebSocket */\nexport type IIIConnectionState = 'disconnected' | 'connecting' | 'connected' | 'reconnecting' | 'failed'\n\n/** Configuration for WebSocket reconnection behavior */\nexport interface IIIReconnectionConfig {\n  /** Starting delay in milliseconds (default: 1000ms) */\n  initialDelayMs: number\n  /** Maximum delay cap in milliseconds (default: 30000ms) */\n  maxDelayMs: number\n  /** Exponential backoff multiplier (default: 2) */\n  backoffMultiplier: number\n  /** Random jitter factor 0-1 (default: 0.3) */\n  jitterFactor: number\n  /** Maximum retry attempts, -1 for infinite (default: -1) */\n  maxRetries: number\n}\n\n/** Default reconnection configuration */\nexport const DEFAULT_BRIDGE_RECONNECTION_CONFIG: IIIReconnectionConfig = {\n  initialDelayMs: 1000,\n  maxDelayMs: 30000,\n  backoffMultiplier: 2,\n  jitterFactor: 0.3,\n  maxRetries: -1,\n}\n\n/** Default invocation timeout in milliseconds */\nexport const DEFAULT_INVOCATION_TIMEOUT_MS = 30000\n","export enum MessageType {\n  RegisterFunction = 'registerfunction',\n  UnregisterFunction = 'unregisterfunction',\n  InvokeFunction = 'invokefunction',\n  InvocationResult = 'invocationresult',\n  RegisterTriggerType = 'registertriggertype',\n  RegisterTrigger = 'registertrigger',\n  UnregisterTrigger = 'unregistertrigger',\n  UnregisterTriggerType = 'unregistertriggertype',\n  TriggerRegistrationResult = 'triggerregistrationresult',\n  WorkerRegistered = 'workerregistered',\n}\n\nexport type RegisterTriggerTypeMessage = {\n  message_type: MessageType.RegisterTriggerType\n  id: string\n  description: string\n}\n\nexport type UnregisterTriggerTypeMessage = {\n  message_type: MessageType.UnregisterTriggerType\n  id: string\n}\n\nexport type UnregisterTriggerMessage = {\n  message_type: MessageType.UnregisterTrigger\n  id: string\n  type?: string\n}\n\nexport type TriggerRegistrationResultMessage = {\n  message_type: MessageType.TriggerRegistrationResult\n  id: string\n  type: string\n  function_id: string\n  result?: unknown\n  error?: unknown\n}\n\nexport type RegisterTriggerMessage = {\n  message_type: MessageType.RegisterTrigger\n  id: string\n  type: string\n  function_id: string\n  config: unknown\n}\n\nexport type RegisterFunctionFormat = {\n  /**\n   * The name of the parameter\n   */\n  name?: string\n  /**\n   * The description of the parameter\n   */\n  description?: string\n  /**\n   * The type of the parameter\n   */\n  type?: 'string' | 'number' | 'boolean' | 'object' | 'array' | 'null' | 'map' | 'integer'\n  /**\n   * The body of the parameter (for objects)\n   */\n  properties?: Record<string, unknown>\n  /**\n   * The items of the parameter (for arrays)\n   */\n  items?: unknown\n  /**\n   * Whether the parameter is required\n   */\n  required?: string[]\n  [key: string]: unknown\n}\n\nexport type RegisterFunctionMessage = {\n  message_type: MessageType.RegisterFunction\n  /**\n   * The path of the function (use :: for namespacing, e.g. external::my_lambda)\n   */\n  id: string\n  /**\n   * The description of the function\n   */\n  description?: string\n  /**\n   * The request format of the function\n   */\n  request_format?: RegisterFunctionFormat\n  /**\n   * The response format of the function\n   */\n  response_format?: RegisterFunctionFormat\n  metadata?: Record<string, unknown>\n}\n\n/**\n * Routing action for {@link TriggerRequest}. Determines how the engine\n * handles the invocation.\n *\n * - `enqueue` -- Routes through a named queue for async processing.\n * - `void` -- Fire-and-forget, no response.\n */\nexport type TriggerAction = { type: 'enqueue'; queue: string } | { type: 'void' }\n\n/**\n * Input passed to the RBAC auth function during WebSocket upgrade.\n * Contains the HTTP headers, query parameters, and client IP from the\n * connecting worker's upgrade request.\n */\nexport type AuthInput = {\n  /** HTTP headers from the WebSocket upgrade request. */\n  headers: Record<string, string>\n  /** Query parameters from the upgrade URL. Each key maps to an array of values to support repeated keys. */\n  query_params: Record<string, string[]>\n  /** IP address of the connecting client. */\n  ip_address: string\n}\n\n/**\n * Return value from the RBAC auth function. Controls which functions the\n * authenticated worker can invoke and what context is forwarded to the\n * middleware.\n */\nexport type AuthResult = {\n  /** Additional function IDs to allow beyond the `expose_functions` config. */\n  allowed_functions: string[]\n  /** Function IDs to deny even if they match `expose_functions`. Takes precedence over allowed. */\n  forbidden_functions: string[]\n  /** Trigger type IDs the worker may register triggers for. When omitted, all types are allowed. */\n  allowed_trigger_types?: string[]\n  /** Whether the worker may register new trigger types. */\n  allow_trigger_type_registration: boolean\n  /** Whether the worker may register new functions. Defaults to `true` if omitted. */\n  allow_function_registration?: boolean\n  /** Arbitrary context forwarded to the middleware function on every invocation. */\n  context: Record<string, unknown>\n  /** Optional prefix applied to all function IDs registered by this worker. */\n  function_registration_prefix?: string\n}\n\n/**\n * Input passed to the RBAC middleware function on every function invocation\n * through the RBAC port. The middleware can inspect, modify, or reject the\n * call before it reaches the target function.\n */\nexport type MiddlewareFunctionInput = {\n  /** ID of the function being invoked. */\n  function_id: string\n  /** Payload sent by the caller. */\n  payload: Record<string, unknown>\n  /** Routing action, if any. */\n  action?: TriggerAction\n  /** Auth context returned by the auth function for this session. */\n  context: Record<string, unknown>\n}\n\n/**\n * Input passed to the `on_trigger_type_registration_function_id` hook\n * when a worker attempts to register a new trigger type through the RBAC port.\n * Return an {@link OnTriggerTypeRegistrationResult} with the (possibly mapped)\n * fields, or throw to deny the registration.\n */\nexport type OnTriggerTypeRegistrationInput = {\n  /** ID of the trigger type being registered. */\n  trigger_type_id: string\n  /** Human-readable description of the trigger type. */\n  description: string\n  /** Auth context from `AuthResult.context` for this session. */\n  context: Record<string, unknown>\n}\n\n/**\n * Result returned from the `on_trigger_type_registration_function_id` hook.\n * All fields are optional -- omitted fields keep the original value from the\n * registration request.\n */\nexport type OnTriggerTypeRegistrationResult = {\n  /** Mapped trigger type ID. */\n  trigger_type_id?: string\n  /** Mapped description. */\n  description?: string\n}\n\n/**\n * Input passed to the `on_trigger_registration_function_id` hook\n * when a worker attempts to register a trigger through the RBAC port.\n * Return an {@link OnTriggerRegistrationResult} with the (possibly mapped)\n * fields, or throw to deny the registration.\n */\nexport type OnTriggerRegistrationInput = {\n  /** ID of the trigger being registered. */\n  trigger_id: string\n  /** Trigger type identifier. */\n  trigger_type: string\n  /** ID of the function this trigger is bound to. */\n  function_id: string\n  /** Trigger-specific configuration. */\n  config: unknown\n  /** Auth context from `AuthResult.context` for this session. */\n  context: Record<string, unknown>\n}\n\n/**\n * Result returned from the `on_trigger_registration_function_id` hook.\n * All fields are optional -- omitted fields keep the original value from the\n * registration request.\n */\nexport type OnTriggerRegistrationResult = {\n  /** Mapped trigger ID. */\n  trigger_id?: string\n  /** Mapped trigger type. */\n  trigger_type?: string\n  /** Mapped function ID. */\n  function_id?: string\n  /** Mapped trigger configuration. */\n  config?: unknown\n}\n\n/**\n * Input passed to the `on_function_registration_function_id` hook\n * when a worker attempts to register a function through the RBAC port.\n * Return an {@link OnFunctionRegistrationResult} with the (possibly mapped)\n * fields, or throw to deny the registration.\n */\nexport type OnFunctionRegistrationInput = {\n  /** ID of the function being registered. */\n  function_id: string\n  /** Human-readable description of the function. */\n  description?: string\n  /** Arbitrary metadata attached to the function. */\n  metadata?: Record<string, unknown>\n  /** Auth context from `AuthResult.context` for this session. */\n  context: Record<string, unknown>\n}\n\n/**\n * Result returned from the `on_function_registration_function_id` hook.\n * All fields are optional -- omitted fields keep the original value from the\n * registration request.\n */\nexport type OnFunctionRegistrationResult = {\n  /** Mapped function ID. */\n  function_id?: string\n  /** Mapped description. */\n  description?: string\n  /** Mapped metadata. */\n  metadata?: Record<string, unknown>\n}\n\n/**\n * Result returned when a function is invoked with `TriggerAction.Enqueue`.\n */\nexport type EnqueueResult = {\n  /** Unique receipt ID for the enqueued message. */\n  messageReceiptId: string\n}\n\n/**\n * Request object passed to {@link ISdk.trigger}.\n *\n * @typeParam TInput - Type of the payload.\n */\nexport type TriggerRequest<TInput = unknown> = {\n  /** ID of the function to invoke. */\n  function_id: string\n  /** Payload to pass to the function. */\n  payload: TInput\n  /** Routing action. Omit for synchronous request/response. */\n  action?: TriggerAction\n  /** Override the default invocation timeout in milliseconds. */\n  timeoutMs?: number\n}\n\nexport type InvokeFunctionMessage = {\n  message_type: MessageType.InvokeFunction\n  /**\n   * This is optional for async invocations\n   */\n  invocation_id?: string\n  /**\n   * The path of the function\n   */\n  function_id: string\n  /**\n   * The data to pass to the function\n   */\n  data: unknown\n  /**\n   * W3C trace-context traceparent header for distributed tracing\n   */\n  traceparent?: string\n  /**\n   * W3C baggage header for cross-cutting context propagation\n   */\n  baggage?: string\n  /**\n   * Trigger action for queue routing or fire-and-forget\n   */\n  action?: TriggerAction\n}\n\nexport type InvocationResultMessage = {\n  message_type: MessageType.InvocationResult\n  /**\n   * The id of the invocation\n   */\n  invocation_id: string\n  /**\n   * The path of the function\n   */\n  function_id: string\n  result?: unknown\n  error?: unknown\n  /**\n   * W3C trace-context traceparent header for distributed tracing\n   */\n  traceparent?: string\n  /**\n   * W3C baggage header for cross-cutting context propagation\n   */\n  baggage?: string\n}\n\nexport type UnregisterFunctionMessage = {\n  message_type: MessageType.UnregisterFunction\n  id: string\n}\n\n/**\n * Serializable reference to one end of a streaming channel. Can be included\n * in invocation payloads to pass channel endpoints between workers.\n */\nexport type StreamChannelRef = {\n  /** Unique channel identifier. */\n  channel_id: string\n  /** Access key for authentication. */\n  access_key: string\n  /** Whether this ref is for reading or writing. */\n  direction: 'read' | 'write'\n}\n\nexport type IIIMessage =\n  | RegisterFunctionMessage\n  | UnregisterFunctionMessage\n  | InvokeFunctionMessage\n  | InvocationResultMessage\n  | RegisterTriggerMessage\n  | RegisterTriggerTypeMessage\n  | UnregisterTriggerMessage\n  | UnregisterTriggerTypeMessage\n  | TriggerRegistrationResultMessage\n","import { ChannelReader, ChannelWriter } from './channels'\nimport {\n  DEFAULT_BRIDGE_RECONNECTION_CONFIG,\n  DEFAULT_INVOCATION_TIMEOUT_MS,\n  type IIIConnectionState,\n  type IIIReconnectionConfig,\n} from './iii-constants'\nimport {\n  type IIIMessage,\n  type InvocationResultMessage,\n  type InvokeFunctionMessage,\n  MessageType,\n  type RegisterFunctionMessage,\n  type RegisterTriggerMessage,\n  type RegisterTriggerTypeMessage,\n  type StreamChannelRef,\n  type TriggerRegistrationResultMessage,\n  type TriggerRequest,\n} from './iii-types'\nimport type { IStream } from './stream'\nimport type { TriggerHandler } from './triggers'\nimport type {\n  FunctionRef,\n  Invocation,\n  ISdk,\n  RegisterFunctionOptions,\n  RemoteFunctionData,\n  RemoteFunctionHandler,\n  RemoteTriggerTypeData,\n  Trigger,\n  TriggerTypeRef,\n} from './types'\nimport { isChannelRef } from './utils'\n\n/** @internal */\nexport type TelemetryOptions = {\n  language?: string\n  project_name?: string\n  framework?: string\n  amplitude_api_key?: string\n}\n\n/**\n * Configuration options passed to {@link registerWorker}.\n *\n * @example\n * ```typescript\n * const iii = registerWorker('ws://localhost:49135', {\n *   invocationTimeoutMs: 10000,\n *   reconnectionConfig: { maxRetries: 5 },\n * })\n * ```\n */\nexport type InitOptions = {\n  /** Default timeout for `trigger()` in milliseconds. Defaults to `30000`. */\n  invocationTimeoutMs?: number\n  /**\n   * WebSocket reconnection behavior.\n   *\n   * @see {@link IIIReconnectionConfig} for available fields and defaults.\n   */\n  reconnectionConfig?: Partial<IIIReconnectionConfig>\n  /** Custom headers are not supported by browser WebSocket. Use query parameters or cookies for auth. */\n  headers?: Record<string, string>\n}\n\nclass Sdk implements ISdk {\n  private ws?: WebSocket\n  private functions = new Map<string, RemoteFunctionData>()\n  private invocations = new Map<string, Invocation & { timeout?: ReturnType<typeof setTimeout> }>()\n  private triggers = new Map<string, RegisterTriggerMessage>()\n  private triggerTypes = new Map<string, RemoteTriggerTypeData>()\n  private messagesToSend: Record<string, unknown>[] = []\n  private reconnectTimeout?: ReturnType<typeof setTimeout>\n  private invocationTimeoutMs: number\n  private reconnectionConfig: IIIReconnectionConfig\n  private reconnectAttempt = 0\n  private connectionState: IIIConnectionState = 'disconnected'\n  private connectionListeners = new Set<(state: IIIConnectionState) => void>()\n  private isShuttingDown = false\n\n  constructor(\n    private readonly address: string,\n    private readonly options?: InitOptions,\n  ) {\n    this.invocationTimeoutMs = options?.invocationTimeoutMs ?? DEFAULT_INVOCATION_TIMEOUT_MS\n    this.reconnectionConfig = {\n      ...DEFAULT_BRIDGE_RECONNECTION_CONFIG,\n      ...options?.reconnectionConfig,\n    }\n\n    this.connect()\n  }\n\n  /**\n   * Registers a custom trigger type with the engine. A trigger type defines\n   * how external events (HTTP, cron, queue, etc.) map to function invocations.\n   *\n   * @param triggerType - Trigger type registration input.\n   * @param triggerType.id - Unique trigger type identifier.\n   * @param triggerType.description - Human-readable description.\n   * @param handler - Handler with `registerTrigger` / `unregisterTrigger` callbacks.\n   *\n   * @example\n   * ```typescript\n   * iii.registerTriggerType(\n   *   { id: 'my-trigger', description: 'Custom trigger' },\n   *   {\n   *     async registerTrigger({ id, function_id, config }) { },\n   *     async unregisterTrigger({ id, function_id, config }) { },\n   *   },\n   * )\n   * ```\n   */\n  registerTriggerType = <TConfig>(\n    triggerType: Omit<RegisterTriggerTypeMessage, 'message_type'>,\n    handler: TriggerHandler<TConfig>,\n  ): TriggerTypeRef<TConfig> => {\n    this.sendMessage(MessageType.RegisterTriggerType, triggerType, true)\n    this.triggerTypes.set(triggerType.id, {\n      message: { ...triggerType, message_type: MessageType.RegisterTriggerType },\n      handler,\n    })\n\n    return {\n      id: triggerType.id,\n      registerTrigger: (functionId: string, config: TConfig) => {\n        return this.registerTrigger({\n          type: triggerType.id,\n          function_id: functionId,\n          config,\n        })\n      },\n      registerFunction: (functionId, handler, config) => {\n        const ref = this.registerFunction(functionId, handler)\n        this.registerTrigger({\n          type: triggerType.id,\n          function_id: functionId,\n          config,\n        })\n        return ref\n      },\n      unregister: () => {\n        this.unregisterTriggerType(triggerType)\n      },\n    }\n  }\n\n  /**\n   * Unregisters a previously registered trigger type.\n   *\n   * @param triggerType - The trigger type to unregister (must match the `id` used during registration).\n   */\n  unregisterTriggerType = (triggerType: Omit<RegisterTriggerTypeMessage, 'message_type'>): void => {\n    this.sendMessage(MessageType.UnregisterTriggerType, triggerType, true)\n    this.triggerTypes.delete(triggerType.id)\n  }\n\n  /**\n   * Binds a trigger configuration to a registered function. When the trigger\n   * fires, the engine invokes the target function.\n   *\n   * @param trigger - Trigger registration input.\n   * @param trigger.type - Trigger type (e.g. `http`, `durable:subscriber`, `cron`).\n   * @param trigger.function_id - ID of the function to invoke.\n   * @param trigger.config - Trigger-specific configuration.\n   * @returns A {@link Trigger} handle with an `unregister()` method.\n   *\n   * @example\n   * ```typescript\n   * const trigger = iii.registerTrigger({\n   *   type: 'http',\n   *   function_id: 'greet',\n   *   config: { api_path: '/greet', http_method: 'GET' },\n   * })\n   *\n   * // Later...\n   * trigger.unregister()\n   * ```\n   */\n  registerTrigger = (trigger: Omit<RegisterTriggerMessage, 'message_type' | 'id'>): Trigger => {\n    const id = crypto.randomUUID()\n    const fullTrigger: RegisterTriggerMessage = {\n      ...trigger,\n      id,\n      message_type: MessageType.RegisterTrigger,\n    }\n    this.sendMessage(MessageType.RegisterTrigger, fullTrigger, true)\n    this.triggers.set(id, fullTrigger)\n\n    return {\n      unregister: () => {\n        this.sendMessage(MessageType.UnregisterTrigger, {\n          id,\n          message_type: MessageType.UnregisterTrigger,\n          type: fullTrigger.type,\n        })\n        this.triggers.delete(id)\n      },\n    }\n  }\n\n  /**\n   * Registers a function with the engine. The `functionId` is the unique identifier\n   * used by triggers and invocations.\n   *\n   * Pass a handler for local execution, or an {@link HttpInvocationConfig}\n   * for HTTP-invoked functions (Lambda, Cloudflare Workers, etc.).\n   *\n   * @param functionId - Unique function identifier.\n   * @param handlerOrInvocation - Async handler or HTTP invocation config.\n   * @param options - Optional function registration options (description, request/response formats, metadata).\n   * @returns A {@link FunctionRef} with `id` and `unregister()`.\n   *\n   * @example\n   * ```typescript\n   * const fn = iii.registerFunction(\n   *   'greet',\n   *   async (input: { name: string }) => {\n   *     return { message: `Hello, ${input.name}!` }\n   *   },\n   *   { description: 'Greets a user' },\n   * )\n   * ```\n   */\n  registerFunction = (\n    functionId: string,\n    handlerOrInvocation: RemoteFunctionHandler,\n    options?: RegisterFunctionOptions,\n  ): FunctionRef => {\n    if (!functionId || functionId.trim() === '') {\n      throw new Error('id is required')\n    }\n    if (this.functions.has(functionId)) {\n      throw new Error(`function id already registered: ${functionId}`)\n    }\n\n    const fullMessage: RegisterFunctionMessage = {\n      ...options,\n      id: functionId,\n      message_type: MessageType.RegisterFunction,\n    }\n\n    this.sendMessage(MessageType.RegisterFunction, fullMessage, true)\n\n    const handler = handlerOrInvocation as RemoteFunctionHandler\n    this.functions.set(functionId, {\n      message: fullMessage,\n      handler: async (input, _traceparent?: string, _baggage?: string) => {\n        return await handler(input)\n      },\n    })\n\n    return {\n      id: functionId,\n      unregister: () => {\n        this.sendMessage(MessageType.UnregisterFunction, { id: functionId }, true)\n        this.functions.delete(functionId)\n      },\n    }\n  }\n\n  /**\n   * @internal Implementation backing the `createChannel` helper in the\n   * `iii-browser-sdk/helpers` submodule. Not part of the public `ISdk` surface.\n   *\n   * Creates a streaming channel pair for worker-to-worker data transfer.\n   * Returns a {@link Channel} with a local writer/reader and serializable refs\n   * that can be passed as fields in invocation data to other functions.\n   */\n  __helpers_create_channel = async (bufferSize?: number): Promise<import('./types').Channel> => {\n    const result = await this.trigger<{ buffer_size?: number }, { writer: StreamChannelRef; reader: StreamChannelRef }>(\n      { function_id: 'engine::channels::create', payload: { buffer_size: bufferSize } },\n    )\n\n    return {\n      writer: new ChannelWriter(this.address, result.writer),\n      reader: new ChannelReader(this.address, result.reader),\n      writerRef: result.writer,\n      readerRef: result.reader,\n    }\n  }\n\n  /**\n   * Invokes a remote function. The routing behavior and return type depend\n   * on the `action` field of the request.\n   *\n   * | `action`                      | Behavior                                           | Return type              |\n   * |-------------------------------|----------------------------------------------------|-----------------------   |\n   * | _(none)_                      | Synchronous -- waits for the function to return     | `Promise<TOutput>`       |\n   * | `TriggerAction.Enqueue(...)` | Async via named queue -- engine acknowledges enqueue | `Promise<EnqueueResult>` |\n   * | `TriggerAction.Void()`       | Fire-and-forget -- no response                      | `Promise<undefined>`     |\n   *\n   * @param request - The trigger request.\n   * @param request.function_id - ID of the function to invoke.\n   * @param request.payload - Payload to pass to the function.\n   * @param request.action - Routing action. Omit for synchronous request/response.\n   * @param request.timeoutMs - Override the default invocation timeout.\n   * @returns The result of the function invocation.\n   *\n   * @example\n   * ```typescript\n   * import { TriggerAction } from 'iii-browser-sdk'\n   *\n   * // Synchronous\n   * const result = await iii.trigger({ function_id: 'get-order', payload: { id: '123' } })\n   *\n   * // Enqueue\n   * const { messageReceiptId } = await iii.trigger({\n   *   function_id: 'payments::charge',\n   *   payload: { orderId: '123', amount: 49.99 },\n   *   action: TriggerAction.Enqueue({ queue: 'payment' }),\n   * })\n   *\n   * // Fire-and-forget\n   * iii.trigger({\n   *   function_id: 'notifications::send',\n   *   payload: { userId: '123' },\n   *   action: TriggerAction.Void(),\n   * })\n   * ```\n   */\n  trigger = async <TInput, TOutput>(request: TriggerRequest<TInput>): Promise<TOutput> => {\n    const { function_id, payload, action, timeoutMs } = request\n    const effectiveTimeout = timeoutMs ?? this.invocationTimeoutMs\n\n    if (action?.type === 'void') {\n      this.sendMessage(MessageType.InvokeFunction, {\n        function_id,\n        data: payload,\n        action,\n      })\n      return undefined as TOutput\n    }\n\n    const invocation_id = crypto.randomUUID()\n\n    return new Promise<TOutput>((resolve, reject) => {\n      const timeout = setTimeout(() => {\n        const invocation = this.invocations.get(invocation_id)\n        if (invocation) {\n          this.invocations.delete(invocation_id)\n          reject(new Error(`Invocation timeout after ${effectiveTimeout}ms: ${function_id}`))\n        }\n      }, effectiveTimeout)\n\n      this.invocations.set(invocation_id, {\n        resolve: (result: TOutput) => {\n          clearTimeout(timeout)\n          resolve(result)\n        },\n        reject: (error: unknown) => {\n          clearTimeout(timeout)\n          reject(error)\n        },\n        timeout,\n      })\n\n      this.sendMessage(MessageType.InvokeFunction, {\n        invocation_id,\n        function_id,\n        data: payload,\n        action,\n      })\n    })\n  }\n\n  /**\n   * @internal Implementation backing the `createStream` helper in the\n   * `iii-browser-sdk/helpers` submodule. Not part of the public `ISdk` surface.\n   *\n   * Registers a custom stream implementation, overriding the engine default\n   * for the given stream name.\n   */\n  __helpers_create_stream = <TData>(streamName: string, stream: IStream<TData>): void => {\n    this.registerFunction(`stream::get(${streamName})`, stream.get.bind(stream))\n    this.registerFunction(`stream::set(${streamName})`, stream.set.bind(stream))\n    this.registerFunction(`stream::delete(${streamName})`, stream.delete.bind(stream))\n    this.registerFunction(`stream::list(${streamName})`, stream.list.bind(stream))\n    this.registerFunction(`stream::list_groups(${streamName})`, stream.listGroups.bind(stream))\n  }\n\n  /**\n   * Gracefully shutdown the SDK, cleaning up all resources.\n   */\n  shutdown = async (): Promise<void> => {\n    this.isShuttingDown = true\n\n    this.clearReconnectTimeout()\n\n    for (const [_id, invocation] of this.invocations) {\n      if (invocation.timeout) {\n        clearTimeout(invocation.timeout)\n      }\n      invocation.reject(new Error('iii is shutting down'))\n    }\n    this.invocations.clear()\n\n    if (this.ws) {\n      this.ws.onopen = null\n      this.ws.onclose = null\n      this.ws.onerror = null\n      this.ws.onmessage = null\n      this.ws.close()\n      this.ws = undefined\n    }\n\n    this.setConnectionState('disconnected')\n  }\n\n  /**\n   * Subscribe to connection-state transitions. The handler is fired immediately\n   * with the current state, then on every transition. Multiple listeners are\n   * supported. Returns an unsubscribe function.\n   */\n  addConnectionStateListener = (handler: (state: IIIConnectionState) => void): (() => void) => {\n    this.connectionListeners.add(handler)\n    try {\n      handler(this.connectionState)\n    } catch (e) {\n      console.error('[iii] connection listener threw on initial fire', e)\n    }\n    return () => {\n      this.connectionListeners.delete(handler)\n    }\n  }\n\n  // private methods\n\n  private setConnectionState(state: IIIConnectionState): void {\n    if (this.connectionState !== state) {\n      this.connectionState = state\n      for (const handler of this.connectionListeners) {\n        try {\n          handler(state)\n        } catch (e) {\n          console.error('[iii] connection listener threw', e)\n        }\n      }\n    }\n  }\n\n  private connect(): void {\n    if (this.isShuttingDown) {\n      return\n    }\n\n    this.setConnectionState('connecting')\n    this.ws = new WebSocket(this.address)\n    this.ws.onopen = this.onSocketOpen.bind(this)\n    this.ws.onclose = this.onSocketClose.bind(this)\n    this.ws.onerror = this.onSocketError.bind(this)\n  }\n\n  private clearReconnectTimeout(): void {\n    if (this.reconnectTimeout) {\n      clearTimeout(this.reconnectTimeout)\n      this.reconnectTimeout = undefined\n    }\n  }\n\n  private scheduleReconnect(): void {\n    if (this.isShuttingDown) {\n      return\n    }\n\n    const { maxRetries, initialDelayMs, backoffMultiplier, maxDelayMs, jitterFactor } = this.reconnectionConfig\n\n    if (maxRetries !== -1 && this.reconnectAttempt >= maxRetries) {\n      this.setConnectionState('failed')\n      console.error(`[iii] Max reconnection retries (${maxRetries}) reached, giving up`)\n      return\n    }\n\n    if (this.reconnectTimeout) {\n      return\n    }\n\n    const exponentialDelay = initialDelayMs * backoffMultiplier ** this.reconnectAttempt\n    const cappedDelay = Math.min(exponentialDelay, maxDelayMs)\n    const jitter = cappedDelay * jitterFactor * (2 * Math.random() - 1)\n    const delay = Math.floor(cappedDelay + jitter)\n\n    this.setConnectionState('reconnecting')\n    console.debug(`[iii] Reconnecting in ${delay}ms (attempt ${this.reconnectAttempt + 1})...`)\n\n    this.reconnectTimeout = setTimeout(() => {\n      this.reconnectTimeout = undefined\n      this.reconnectAttempt++\n      this.connect()\n    }, delay)\n  }\n\n  private onSocketError(): void {\n    console.error('[iii] WebSocket error')\n  }\n\n  private onSocketClose(): void {\n    if (this.ws) {\n      this.ws.onopen = null\n      this.ws.onclose = null\n      this.ws.onerror = null\n      this.ws.onmessage = null\n    }\n    this.ws = undefined\n\n    this.setConnectionState('disconnected')\n    this.scheduleReconnect()\n  }\n\n  private onSocketOpen(): void {\n    this.clearReconnectTimeout()\n    this.reconnectAttempt = 0\n    this.setConnectionState('connected')\n\n    if (this.ws) {\n      this.ws.onmessage = this.onMessage.bind(this)\n    }\n\n    this.triggerTypes.forEach(({ message }) => {\n      this.sendMessage(MessageType.RegisterTriggerType, message, true)\n    })\n    this.functions.forEach(({ message }) => {\n      this.sendMessage(MessageType.RegisterFunction, message, true)\n    })\n    this.triggers.forEach((trigger) => {\n      this.sendMessage(MessageType.RegisterTrigger, trigger, true)\n    })\n\n    const pending = this.messagesToSend\n    this.messagesToSend = []\n    for (const message of pending) {\n      if (\n        message.type === MessageType.InvokeFunction &&\n        typeof message.invocation_id === 'string' &&\n        !this.invocations.has(message.invocation_id)\n      ) {\n        continue\n      }\n      this.sendMessageRaw(JSON.stringify(message))\n    }\n  }\n\n  private isOpen(): boolean {\n    return this.ws?.readyState === WebSocket.OPEN\n  }\n\n  private sendMessageRaw(data: string): void {\n    if (this.ws && this.isOpen()) {\n      try {\n        this.ws.send(data)\n      } catch (error) {\n        console.error('[iii] Exception while sending message', error)\n      }\n    }\n  }\n\n  private toWireFormat(messageType: MessageType, message: Omit<IIIMessage, 'message_type'>): Record<string, unknown> {\n    const { message_type: _, ...rest } = message as Record<string, unknown>\n    if (messageType === MessageType.RegisterTrigger && 'type' in message) {\n      const { type: triggerType, ...triggerRest } = message as RegisterTriggerMessage\n      return { type: messageType, ...triggerRest, trigger_type: triggerType }\n    }\n    if (messageType === MessageType.UnregisterTrigger && 'type' in message) {\n      const { type: triggerType, ...triggerRest } = message as RegisterTriggerMessage\n      return { type: messageType, ...triggerRest, trigger_type: triggerType }\n    }\n    if (messageType === MessageType.TriggerRegistrationResult && 'type' in message) {\n      const { type: triggerType, ...resultRest } = message as TriggerRegistrationResultMessage\n      return { type: messageType, ...resultRest, trigger_type: triggerType }\n    }\n    return { type: messageType, ...rest } as Record<string, unknown>\n  }\n\n  private sendMessage(messageType: MessageType, message: Omit<IIIMessage, 'message_type'>, skipIfClosed = false): void {\n    const wireMessage = this.toWireFormat(messageType, message)\n    if (this.isOpen()) {\n      this.sendMessageRaw(JSON.stringify(wireMessage))\n    } else if (!skipIfClosed) {\n      this.messagesToSend.push(wireMessage)\n    }\n  }\n\n  private onInvocationResult(invocation_id: string, result: unknown, error: unknown): void {\n    const invocation = this.invocations.get(invocation_id)\n\n    if (invocation) {\n      if (invocation.timeout) {\n        clearTimeout(invocation.timeout)\n      }\n      error ? invocation.reject(error) : invocation.resolve(result)\n    }\n\n    this.invocations.delete(invocation_id)\n  }\n\n  private resolveChannelValue(value: unknown): unknown {\n    if (isChannelRef(value)) {\n      return value.direction === 'read'\n        ? new ChannelReader(this.address, value)\n        : new ChannelWriter(this.address, value)\n    }\n    if (Array.isArray(value)) {\n      return value.map((item) => this.resolveChannelValue(item))\n    }\n    if (value !== null && typeof value === 'object') {\n      const out: Record<string, unknown> = {}\n      for (const [k, v] of Object.entries(value as Record<string, unknown>)) {\n        out[k] = this.resolveChannelValue(v)\n      }\n      return out\n    }\n    return value\n  }\n\n  private async onInvokeFunction<TInput>(\n    invocation_id: string | undefined,\n    function_id: string,\n    input: TInput,\n    traceparent?: string,\n    baggage?: string,\n  ): Promise<unknown> {\n    const fn = this.functions.get(function_id)\n\n    const resolvedInput = this.resolveChannelValue(input) as TInput\n\n    if (fn?.handler) {\n      if (!invocation_id) {\n        try {\n          await fn.handler(resolvedInput, traceparent, baggage)\n        } catch (error) {\n          console.error(`[iii] Error invoking function ${function_id}`, error)\n        }\n        return\n      }\n\n      try {\n        const result = await fn.handler(resolvedInput, traceparent, baggage)\n        this.sendMessage(MessageType.InvocationResult, {\n          invocation_id,\n          function_id,\n          result,\n          traceparent,\n          baggage,\n        })\n      } catch (error) {\n        const isError = error instanceof Error\n        this.sendMessage(MessageType.InvocationResult, {\n          invocation_id,\n          function_id,\n          error: {\n            code: 'invocation_failed',\n            message: isError ? error.message : String(error),\n            stacktrace: isError ? error.stack : undefined,\n          },\n          traceparent,\n          baggage,\n        })\n      }\n    } else {\n      const errorCode = fn ? 'function_not_invokable' : 'function_not_found'\n      const errorMessage = fn ? 'Function is HTTP-invoked and cannot be invoked locally' : 'Function not found'\n      if (invocation_id) {\n        this.sendMessage(MessageType.InvocationResult, {\n          invocation_id,\n          function_id,\n          error: { code: errorCode, message: errorMessage },\n          traceparent,\n          baggage,\n        })\n      }\n    }\n  }\n\n  private async onRegisterTrigger(message: { trigger_type: string; id: string; function_id: string; config: unknown }) {\n    const { trigger_type, id, function_id, config } = message\n    const triggerTypeData = this.triggerTypes.get(trigger_type)\n\n    if (triggerTypeData) {\n      try {\n        await triggerTypeData.handler.registerTrigger({ id, function_id, config })\n        this.sendMessage(MessageType.TriggerRegistrationResult, {\n          id,\n          message_type: MessageType.TriggerRegistrationResult,\n          type: trigger_type,\n          function_id,\n        })\n      } catch (error) {\n        this.sendMessage(MessageType.TriggerRegistrationResult, {\n          id,\n          message_type: MessageType.TriggerRegistrationResult,\n          type: trigger_type,\n          function_id,\n          error: { code: 'trigger_registration_failed', message: (error as Error).message },\n        })\n      }\n    } else {\n      this.sendMessage(MessageType.TriggerRegistrationResult, {\n        id,\n        message_type: MessageType.TriggerRegistrationResult,\n        type: trigger_type,\n        function_id,\n        error: { code: 'trigger_type_not_found', message: 'Trigger type not found' },\n      })\n    }\n  }\n\n  private async onUnregisterTrigger(message: {\n    trigger_type?: string\n    id: string\n    function_id?: string\n    config?: unknown\n  }) {\n    const trigger_type = message.trigger_type\n    if (!trigger_type) return\n\n    const triggerTypeData = this.triggerTypes.get(trigger_type)\n    if (!triggerTypeData) return\n\n    const { id, function_id = '', config } = message\n    try {\n      await triggerTypeData.handler.unregisterTrigger({ id, function_id, config })\n    } catch (error) {\n      console.error(`[iii] Error unregistering trigger ${id}`, error)\n    }\n  }\n\n  private onMessage(event: MessageEvent): void {\n    let msgType: MessageType\n    let message: Record<string, unknown>\n\n    try {\n      const parsed = JSON.parse(typeof event.data === 'string' ? event.data : '') as Record<string, unknown>\n      msgType = parsed.type as MessageType\n      const { type: _, ...rest } = parsed\n      message = rest\n    } catch (error) {\n      console.error('[iii] Failed to parse incoming message', error)\n      return\n    }\n\n    if (msgType === MessageType.InvocationResult) {\n      const { invocation_id, result, error } = message as InvocationResultMessage\n      this.onInvocationResult(invocation_id, result, error)\n    } else if (msgType === MessageType.InvokeFunction) {\n      const { invocation_id, function_id, data, traceparent, baggage } = message as InvokeFunctionMessage\n      this.onInvokeFunction(invocation_id, function_id, data, traceparent, baggage)\n    } else if (msgType === MessageType.RegisterTrigger) {\n      this.onRegisterTrigger(message as { trigger_type: string; id: string; function_id: string; config: unknown })\n    } else if (msgType === MessageType.UnregisterTrigger) {\n      this.onUnregisterTrigger(\n        message as { trigger_type?: string; id: string; function_id?: string; config?: unknown },\n      )\n    }\n  }\n}\n\n/**\n * Factory object that constructs routing actions for {@link ISdk.trigger}.\n *\n * @example\n * ```typescript\n * import { TriggerAction } from 'iii-browser-sdk'\n *\n * // Enqueue to a named queue\n * iii.trigger({\n *   function_id: 'process',\n *   payload: { data: 'hello' },\n *   action: TriggerAction.Enqueue({ queue: 'jobs' }),\n * })\n *\n * // Fire-and-forget\n * iii.trigger({\n *   function_id: 'notify',\n *   payload: {},\n *   action: TriggerAction.Void(),\n * })\n * ```\n */\nexport const TriggerAction = {\n  /**\n   * Routes the invocation through a named queue. The engine enqueues the job,\n   * acknowledges the caller with `{ messageReceiptId }`, and processes it\n   * asynchronously.\n   *\n   * @param opts - Queue routing options.\n   * @param opts.queue - Name of the target queue.\n   */\n  Enqueue: (opts: { queue: string }) => ({ type: 'enqueue' as const, ...opts }),\n  /**\n   * Fire-and-forget routing. The engine forwards the invocation without\n   * waiting for a response or queuing the job.\n   */\n  Void: () => ({ type: 'void' as const }),\n} as const\n\n/**\n * Creates and returns a connected SDK instance. The WebSocket connection is\n * established automatically -- there is no separate `connect()` call.\n *\n * @param address - WebSocket URL of the III engine (e.g. `ws://localhost:49135`).\n * @param options - Optional {@link InitOptions} for worker name, timeouts, and reconnection.\n * @returns A connected {@link ISdk} instance.\n *\n * @example\n * ```typescript\n * import { registerWorker } from 'iii-browser-sdk'\n *\n * const iii = registerWorker('ws://localhost:49135')\n * ```\n */\nexport const registerWorker = (address: string, options?: InitOptions): ISdk => new Sdk(address, options)\n"],"mappings":"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"}