iii-sdk 0.19.7-next.2 → 0.20.0-alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,2 +1,2 @@
1
- import { D as StreamChannelRef, t as Channel, v as ChannelReader, y as ChannelWriter } from "./types-pzKubHk_.cjs";
1
+ import { D as StreamChannelRef, t as Channel, v as ChannelReader, y as ChannelWriter } from "./types-BZoO05vA.cjs";
2
2
  export { type Channel, ChannelReader, ChannelWriter, type StreamChannelRef };
@@ -1,2 +1,2 @@
1
- import { D as StreamChannelRef, t as Channel, v as ChannelReader, y as ChannelWriter } from "./types-ChnmRit-.mjs";
1
+ import { D as StreamChannelRef, t as Channel, v as ChannelReader, y as ChannelWriter } from "./types-BlFE8MZG.mjs";
2
2
  export { type Channel, ChannelReader, ChannelWriter, type StreamChannelRef };
package/dist/engine.d.cts CHANGED
@@ -1,3 +1,3 @@
1
- import { l as RemoteFunctionHandler } from "./types-pzKubHk_.cjs";
1
+ import { l as RemoteFunctionHandler } from "./types-BZoO05vA.cjs";
2
2
  import { n as EngineTriggers, t as EngineFunctions } from "./iii-constants-BqXp8xSN.cjs";
3
3
  export { EngineFunctions, EngineTriggers, type RemoteFunctionHandler };
package/dist/engine.d.mts CHANGED
@@ -1,3 +1,3 @@
1
- import { l as RemoteFunctionHandler } from "./types-ChnmRit-.mjs";
1
+ import { l as RemoteFunctionHandler } from "./types-BlFE8MZG.mjs";
2
2
  import { n as EngineTriggers, t as EngineFunctions } from "./iii-constants-Baptl8nm.mjs";
3
3
  export { EngineFunctions, EngineTriggers, type RemoteFunctionHandler };
@@ -1,4 +1,4 @@
1
- import { D as StreamChannelRef, _ as ChannelItem, g as ChannelDirection, r as IIIClient, t as Channel } from "./types-pzKubHk_.cjs";
1
+ import { D as StreamChannelRef, _ as ChannelItem, g as ChannelDirection, r as IIIClient, t as Channel } from "./types-BZoO05vA.cjs";
2
2
  import { IStream } from "./stream.cjs";
3
3
 
4
4
  //#region src/utils.d.ts
@@ -1,4 +1,4 @@
1
- import { D as StreamChannelRef, _ as ChannelItem, g as ChannelDirection, r as IIIClient, t as Channel } from "./types-ChnmRit-.mjs";
1
+ import { D as StreamChannelRef, _ as ChannelItem, g as ChannelDirection, r as IIIClient, t as Channel } from "./types-BlFE8MZG.mjs";
2
2
  import { IStream } from "./stream.mjs";
3
3
 
4
4
  //#region src/utils.d.ts
@@ -1 +1 @@
1
- {"version":3,"file":"iii-types-6aHBgy7l.cjs","names":[],"sources":["../src/iii-types.ts"],"sourcesContent":["import type { HttpInvocationConfig } from '@iii-dev/helpers/http'\n\nexport 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 ErrorBody = {\n code: string\n message: string\n stacktrace?: string\n}\n\nexport type TriggerRegistrationResultMessage = {\n message_type: MessageType.TriggerRegistrationResult\n id: string\n type: string\n function_id: string\n error?: ErrorBody\n}\n\nexport type RegisterTriggerMessage = {\n message_type: MessageType.RegisterTrigger\n id: string\n type: string\n function_id: string\n config: unknown\n metadata?: Record<string, 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 * HTTP invocation config for external HTTP functions (Lambda, Cloudflare Workers, etc.)\n */\n invocation?: HttpInvocationConfig\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 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 * Request object passed to {@link IIIClient.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 WorkerRegisteredMessage = {\n message_type: MessageType.WorkerRegistered\n worker_id: 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 | WorkerRegisteredMessage\n"],"mappings":";;AAEA,IAAY,cAAL;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;KACD"}
1
+ {"version":3,"file":"iii-types-6aHBgy7l.cjs","names":[],"sources":["../src/iii-types.ts"],"sourcesContent":["import type { HttpInvocationConfig } from '@iii-dev/helpers/http'\n\nexport 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 ErrorBody = {\n code: string\n message: string\n stacktrace?: string\n}\n\nexport type TriggerRegistrationResultMessage = {\n message_type: MessageType.TriggerRegistrationResult\n id: string\n type: string\n function_id: string\n error?: ErrorBody\n}\n\nexport type RegisterTriggerMessage = {\n message_type: MessageType.RegisterTrigger\n id: string\n type: string\n function_id: string\n config: unknown\n metadata?: Record<string, 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 * HTTP invocation config for external HTTP functions (Lambda, Cloudflare Workers, etc.)\n */\n invocation?: HttpInvocationConfig\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 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 * Request object passed to {@link IIIClient.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 * Optional per-invocation metadata (arbitrary JSON). Travels as a separate\n * channel from the payload and is surfaced to the target handler as a\n * dedicated argument. Omitted from the wire message when undefined.\n */\n metadata?: unknown\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 * Optional per-invocation metadata (arbitrary JSON). Travels as a separate\n * channel from `data`. Omitted from the JSON when undefined; absence on\n * inbound means \"no metadata\" (backward compatible with older engines).\n */\n metadata?: unknown\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 WorkerRegisteredMessage = {\n message_type: MessageType.WorkerRegistered\n worker_id: 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 | WorkerRegisteredMessage\n"],"mappings":";;AAEA,IAAY,cAAL;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;KACD"}
@@ -1 +1 @@
1
- {"version":3,"file":"iii-types-CRx2qAjB.mjs","names":[],"sources":["../src/iii-types.ts"],"sourcesContent":["import type { HttpInvocationConfig } from '@iii-dev/helpers/http'\n\nexport 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 ErrorBody = {\n code: string\n message: string\n stacktrace?: string\n}\n\nexport type TriggerRegistrationResultMessage = {\n message_type: MessageType.TriggerRegistrationResult\n id: string\n type: string\n function_id: string\n error?: ErrorBody\n}\n\nexport type RegisterTriggerMessage = {\n message_type: MessageType.RegisterTrigger\n id: string\n type: string\n function_id: string\n config: unknown\n metadata?: Record<string, 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 * HTTP invocation config for external HTTP functions (Lambda, Cloudflare Workers, etc.)\n */\n invocation?: HttpInvocationConfig\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 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 * Request object passed to {@link IIIClient.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 WorkerRegisteredMessage = {\n message_type: MessageType.WorkerRegistered\n worker_id: 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 | WorkerRegisteredMessage\n"],"mappings":";AAEA,IAAY,cAAL;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;KACD"}
1
+ {"version":3,"file":"iii-types-CRx2qAjB.mjs","names":[],"sources":["../src/iii-types.ts"],"sourcesContent":["import type { HttpInvocationConfig } from '@iii-dev/helpers/http'\n\nexport 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 ErrorBody = {\n code: string\n message: string\n stacktrace?: string\n}\n\nexport type TriggerRegistrationResultMessage = {\n message_type: MessageType.TriggerRegistrationResult\n id: string\n type: string\n function_id: string\n error?: ErrorBody\n}\n\nexport type RegisterTriggerMessage = {\n message_type: MessageType.RegisterTrigger\n id: string\n type: string\n function_id: string\n config: unknown\n metadata?: Record<string, 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 * HTTP invocation config for external HTTP functions (Lambda, Cloudflare Workers, etc.)\n */\n invocation?: HttpInvocationConfig\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 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 * Request object passed to {@link IIIClient.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 * Optional per-invocation metadata (arbitrary JSON). Travels as a separate\n * channel from the payload and is surfaced to the target handler as a\n * dedicated argument. Omitted from the wire message when undefined.\n */\n metadata?: unknown\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 * Optional per-invocation metadata (arbitrary JSON). Travels as a separate\n * channel from `data`. Omitted from the JSON when undefined; absence on\n * inbound means \"no metadata\" (backward compatible with older engines).\n */\n metadata?: unknown\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 WorkerRegisteredMessage = {\n message_type: MessageType.WorkerRegistered\n worker_id: 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 | WorkerRegisteredMessage\n"],"mappings":";AAEA,IAAY,cAAL;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;KACD"}
package/dist/index.cjs CHANGED
@@ -113,7 +113,7 @@ var Sdk = class {
113
113
  const handler = handlerOrInvocation;
114
114
  this.functions.set(functionId, {
115
115
  message: fullMessage,
116
- handler: async (input, traceparent, baggage) => {
116
+ handler: async (input, metadata, traceparent, baggage) => {
117
117
  const tracePayloads = !(process.env.III_DISABLE_TRACE_PAYLOADS === "1" || process.env.III_DISABLE_TRACE_PAYLOADS?.toLowerCase() === "true");
118
118
  const payloadMaxBytes = (0, _iii_dev_helpers_observability.resolveMaxBytesFromEnv)();
119
119
  const runHandler = async () => {
@@ -125,7 +125,7 @@ var Sdk = class {
125
125
  });
126
126
  }
127
127
  try {
128
- const result = await handler(input);
128
+ const result = await handler(input, metadata);
129
129
  if (tracePayloads) {
130
130
  const { json, truncated } = (0, _iii_dev_helpers_observability.redactAndTruncate)(result, payloadMaxBytes);
131
131
  (0, _iii_dev_helpers_observability.recordSpanEvent)("iii.invocation.output", {
@@ -183,7 +183,7 @@ var Sdk = class {
183
183
  };
184
184
  };
185
185
  this.trigger = async (request) => {
186
- const { function_id, payload, action, timeoutMs } = request;
186
+ const { function_id, payload, action, timeoutMs, metadata } = request;
187
187
  const effectiveTimeout = timeoutMs ?? this.invocationTimeoutMs;
188
188
  if (action?.type === "void") {
189
189
  const traceparent = (0, _iii_dev_helpers_observability.injectTraceparent)();
@@ -193,7 +193,8 @@ var Sdk = class {
193
193
  data: payload,
194
194
  traceparent,
195
195
  baggage,
196
- action
196
+ action,
197
+ metadata
197
198
  });
198
199
  return;
199
200
  }
@@ -229,7 +230,8 @@ var Sdk = class {
229
230
  data: payload,
230
231
  traceparent,
231
232
  baggage,
232
- action
233
+ action,
234
+ metadata
233
235
  });
234
236
  });
235
237
  };
@@ -480,7 +482,7 @@ var Sdk = class {
480
482
  }
481
483
  return value;
482
484
  }
483
- async onInvokeFunction(invocation_id, function_id, input, traceparent, baggage) {
485
+ async onInvokeFunction(invocation_id, function_id, input, metadata, traceparent, baggage) {
484
486
  const fn = this.functions.get(function_id);
485
487
  const getResponseTraceparent = () => (0, _iii_dev_helpers_observability.injectTraceparent)() ?? traceparent;
486
488
  const getResponseBaggage = () => (0, _iii_dev_helpers_observability.injectBaggage)() ?? baggage;
@@ -488,14 +490,14 @@ var Sdk = class {
488
490
  if (fn?.handler) {
489
491
  if (!invocation_id) {
490
492
  try {
491
- await fn.handler(resolvedInput, traceparent, baggage);
493
+ await fn.handler(resolvedInput, metadata, traceparent, baggage);
492
494
  } catch (error) {
493
495
  this.logError(`Error invoking function ${function_id}`, error);
494
496
  }
495
497
  return;
496
498
  }
497
499
  try {
498
- const result = await fn.handler(resolvedInput, traceparent, baggage);
500
+ const result = await fn.handler(resolvedInput, metadata, traceparent, baggage);
499
501
  this.sendMessage(require_iii_types.MessageType.InvocationResult, {
500
502
  invocation_id,
501
503
  function_id,
@@ -609,8 +611,8 @@ var Sdk = class {
609
611
  const { invocation_id, result, error } = message;
610
612
  this.onInvocationResult(invocation_id, result, error);
611
613
  } else if (msgType === require_iii_types.MessageType.InvokeFunction) {
612
- const { invocation_id, function_id, data, traceparent, baggage } = message;
613
- this.onInvokeFunction(invocation_id, function_id, data, traceparent, baggage);
614
+ const { invocation_id, function_id, data, metadata, traceparent, baggage } = message;
615
+ this.onInvokeFunction(invocation_id, function_id, data, metadata, traceparent, baggage);
614
616
  } else if (msgType === require_iii_types.MessageType.RegisterTrigger) this.onRegisterTrigger(message);
615
617
  else if (msgType === require_iii_types.MessageType.UnregisterTrigger) this.onUnregisterTrigger(message);
616
618
  else if (msgType === require_iii_types.MessageType.TriggerRegistrationResult) this.onTriggerRegistrationResult(message);
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","names":["os","MessageType","context","SpanKind","trace","ChannelWriter","ChannelReader","InvocationError","DEFAULT_BRIDGE_RECONNECTION_CONFIG","EngineFunctions","detectProjectName","WebSocket","SeverityNumber","isErrorBody","isChannelRef"],"sources":["../src/iii.ts"],"sourcesContent":["import { context, trace } from '@opentelemetry/api'\nimport { createRequire } from 'node:module'\nimport * as os from 'node:os'\nimport { type Data, WebSocket } from 'ws'\nimport { ChannelReader, ChannelWriter } from './channels'\nimport { InvocationError, isErrorBody } from './errors'\nimport {\n DEFAULT_BRIDGE_RECONNECTION_CONFIG,\n DEFAULT_INVOCATION_TIMEOUT_MS,\n EngineFunctions,\n type IIIConnectionState,\n type IIIReconnectionConfig,\n} from './iii-constants'\nimport type { HttpInvocationConfig } from '@iii-dev/helpers/http'\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 type WorkerRegisteredMessage,\n} from './iii-types'\nimport { registerWorkerGauges, stopWorkerGauges } from '@iii-dev/helpers/observability'\nimport { getMeter, getTracer } from '@iii-dev/helpers/observability/internal'\nimport { SpanKind } from '@opentelemetry/api'\nimport type { IStream } from './stream'\nimport { detectProjectName } from './utils'\nimport {\n extractContext,\n getLogger,\n initOtel,\n injectBaggage,\n injectTraceparent,\n type OtelConfig,\n recordSpanEvent,\n redactAndTruncate,\n resolveMaxBytesFromEnv,\n SeverityNumber,\n shutdownOtel,\n withSpan,\n} from '@iii-dev/helpers/observability'\nimport type { TriggerHandler } from './triggers'\nimport type {\n FunctionRef,\n IIIClient,\n Invocation,\n RegisterFunctionOptions,\n RemoteFunctionData,\n RemoteFunctionHandler,\n RemoteTriggerTypeData,\n Trigger,\n TriggerTypeRef,\n} from './types'\nimport { isChannelRef } from './utils'\n\nconst require = createRequire(import.meta.url)\nconst { version: SDK_VERSION } = require('../package.json')\n\nfunction getOsInfo(): string {\n return `${os.platform()} ${os.release()} (${os.arch()})`\n}\n\nfunction getDefaultWorkerName(): string {\n return `${os.hostname()}:${process.pid}`\n}\n\n/** Worker labels reported to the engine (language, framework, project). */\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 worker = registerWorker('ws://localhost:49134', {\n * workerName: 'my-worker',\n * invocationTimeoutMs: 10000,\n * reconnectionConfig: { maxRetries: 5 },\n * })\n * ```\n */\nexport type InitOptions = {\n /** Display name for this worker. Defaults to `hostname:pid`. */\n workerName?: string\n /**\n * One-line, human/LLM-readable summary of what this worker does.\n * Surfaces in `engine::workers::list` / `engine::workers::info`.\n */\n workerDescription?: string\n /** Enable worker metrics via OpenTelemetry. Defaults to `true`. */\n enableMetricsReporting?: boolean\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 /**\n * OpenTelemetry configuration. OTel is initialized automatically by default.\n * Set `{ enabled: false }` or env `OTEL_ENABLED=false/0/no/off` to disable.\n * The `engineWsUrl` is set automatically from the III address.\n */\n otel?: Omit<OtelConfig, 'engineWsUrl'>\n /** Custom HTTP headers sent during the WebSocket handshake. */\n headers?: Record<string, string>\n /** @internal */\n telemetry?: TelemetryOptions\n}\n\nclass Sdk implements IIIClient {\n private ws?: WebSocket\n private functions = new Map<string, RemoteFunctionData>()\n private invocations = new Map<string, Invocation & { timeout?: NodeJS.Timeout }>()\n private triggers = new Map<string, RegisterTriggerMessage>()\n private triggerTypes = new Map<string, RemoteTriggerTypeData>()\n private messagesToSend: Record<string, unknown>[] = []\n private workerName: string\n private workerDescription?: string\n private workerId?: string\n private reconnectTimeout?: NodeJS.Timeout\n private metricsReportingEnabled: boolean\n private invocationTimeoutMs: number\n private reconnectionConfig: IIIReconnectionConfig\n private reconnectAttempt = 0\n private connectionState: IIIConnectionState = 'disconnected'\n private isShuttingDown = false\n\n constructor(\n private readonly address: string,\n private readonly options?: InitOptions,\n ) {\n this.workerName = options?.workerName ?? getDefaultWorkerName()\n this.workerDescription = options?.workerDescription\n this.metricsReportingEnabled = options?.enableMetricsReporting ?? true\n this.invocationTimeoutMs = options?.invocationTimeoutMs ?? DEFAULT_INVOCATION_TIMEOUT_MS\n this.reconnectionConfig = {\n ...DEFAULT_BRIDGE_RECONNECTION_CONFIG,\n ...options?.reconnectionConfig,\n }\n\n // Initialize OpenTelemetry (enabled by default, opt-out via config or env)\n initOtel({ ...options?.otel, engineWsUrl: this.address })\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 * worker.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, metadata?: Record<string, unknown>) => {\n return this.registerTrigger({\n type: triggerType.id,\n function_id: functionId,\n config,\n metadata,\n })\n },\n registerFunction: (functionId, handler, config, metadata?) => {\n const ref = this.registerFunction(functionId, handler)\n this.registerTrigger({\n type: triggerType.id,\n function_id: functionId,\n config,\n metadata,\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 = worker.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 = worker.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 | HttpInvocationConfig,\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 isHandler = typeof handlerOrInvocation === 'function'\n\n const fullMessage: RegisterFunctionMessage = isHandler\n ? { ...options, id: functionId, message_type: MessageType.RegisterFunction }\n : {\n ...options,\n id: functionId,\n message_type: MessageType.RegisterFunction,\n invocation: {\n url: handlerOrInvocation.url,\n method: handlerOrInvocation.method ?? 'POST',\n timeout_ms: handlerOrInvocation.timeout_ms,\n headers: handlerOrInvocation.headers,\n auth: handlerOrInvocation.auth,\n },\n }\n\n this.sendMessage(MessageType.RegisterFunction, fullMessage, true)\n\n if (isHandler) {\n const handler = handlerOrInvocation as RemoteFunctionHandler\n this.functions.set(functionId, {\n message: fullMessage,\n handler: async (input, traceparent?: string, baggage?: string) => {\n const tracePayloads = !(\n process.env.III_DISABLE_TRACE_PAYLOADS === '1' ||\n process.env.III_DISABLE_TRACE_PAYLOADS?.toLowerCase() === 'true'\n )\n const payloadMaxBytes = resolveMaxBytesFromEnv()\n\n const runHandler = async () => {\n if (tracePayloads) {\n const { json, truncated } = redactAndTruncate(input, payloadMaxBytes)\n recordSpanEvent('iii.invocation.input', {\n 'iii.payload.json': json,\n 'iii.payload.truncated': truncated,\n })\n }\n try {\n const result = await handler(input)\n if (tracePayloads) {\n const { json, truncated } = redactAndTruncate(result, payloadMaxBytes)\n recordSpanEvent('iii.invocation.output', {\n 'iii.payload.json': json,\n 'iii.payload.truncated': truncated,\n 'iii.payload.ok': true,\n })\n }\n return result\n } catch (err) {\n if (tracePayloads) {\n const errMsg = err instanceof Error ? err.message : String(err)\n const { json, truncated } = redactAndTruncate(\n { error: errMsg },\n payloadMaxBytes,\n )\n recordSpanEvent('iii.invocation.output', {\n 'iii.payload.json': json,\n 'iii.payload.truncated': truncated,\n 'iii.payload.ok': false,\n })\n }\n throw err\n }\n }\n\n if (getTracer()) {\n const parentContext = extractContext(traceparent, baggage)\n\n // INTERNAL and named `execute` (not `call`/`trigger`): the engine\n // already emits the SERVER `call <fn>` span for this hop AND a\n // `trigger <fn>` span from fire_triggers. Reusing either name would\n // duplicate an engine span under the worker's service. `execute` is\n // unique, so the worker handler span reads as a clean internal child\n // of the engine's call span (and is collapsible by a single rule).\n return context.with(parentContext, () =>\n withSpan(`execute ${functionId}`, { kind: SpanKind.INTERNAL }, async () => await runHandler()),\n )\n }\n\n const traceId = crypto.randomUUID().replace(/-/g, '')\n const spanId = crypto.randomUUID().replace(/-/g, '').slice(0, 16)\n const syntheticSpan = trace.wrapSpanContext({ traceId, spanId, traceFlags: 1 })\n\n return context.with(trace.setSpan(context.active(), syntheticSpan), async () => await runHandler())\n },\n })\n } else {\n this.functions.set(functionId, { message: fullMessage })\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-sdk/helpers` submodule. Not part of the public `IIIClient` 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-sdk'\n *\n * // Synchronous\n * const result = await worker.trigger({ function_id: 'get-order', payload: { id: '123' } })\n *\n * // Enqueue\n * const { messageReceiptId } = await worker.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 * worker.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 // Void is fire-and-forget, no invocation_id, no response\n if (action?.type === 'void') {\n const traceparent = injectTraceparent()\n const baggage = injectBaggage()\n this.sendMessage(MessageType.InvokeFunction, {\n function_id,\n data: payload,\n traceparent,\n baggage,\n action,\n })\n return undefined as TOutput\n }\n\n // Enqueue and default: send invocation_id, await response\n const invocation_id = crypto.randomUUID()\n const traceparent = injectTraceparent()\n const baggage = injectBaggage()\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(\n new InvocationError({\n code: 'TIMEOUT',\n message: `invocation timed out after ${effectiveTimeout}ms`,\n function_id,\n }),\n )\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 function_id,\n timeout,\n })\n\n this.sendMessage(MessageType.InvokeFunction, {\n invocation_id,\n function_id,\n data: payload,\n traceparent,\n baggage,\n action,\n })\n })\n }\n\n private registerWorkerMetadata(): void {\n const telemetryOpts = this.options?.telemetry\n const language =\n telemetryOpts?.language ?? Intl.DateTimeFormat().resolvedOptions().locale ?? process.env.LANG?.split('.')[0]\n\n this.trigger({\n function_id: EngineFunctions.REGISTER_WORKER,\n payload: {\n runtime: 'node',\n version: SDK_VERSION,\n name: this.workerName,\n description: this.workerDescription,\n os: getOsInfo(),\n pid: process.pid,\n isolation: process.env.III_ISOLATION || null,\n telemetry: {\n language,\n project_name: telemetryOpts?.project_name ?? detectProjectName(),\n framework: telemetryOpts?.framework?.trim() || 'iii-node',\n amplitude_api_key: telemetryOpts?.amplitude_api_key,\n },\n },\n action: { type: 'void' },\n })\n }\n\n /**\n * @internal Implementation backing the `createStream` helper in the\n * `iii-sdk/helpers` submodule. Not part of the public `IIIClient` surface.\n *\n * Registers a custom stream implementation, overriding the engine default\n * for the given stream name. Registers 5 of the 6 `IStream` methods\n * (`get`, `set`, `delete`, `list`, `listGroups`). The `update` method is\n * not registered -- atomic updates are handled by the engine's built-in\n * stream update logic.\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 iii, cleaning up all resources.\n */\n shutdown = async (): Promise<void> => {\n this.isShuttingDown = true\n\n this.stopMetricsReporting()\n\n // Shutdown OpenTelemetry\n await shutdownOtel()\n\n // Clear reconnection timeout\n this.clearReconnectTimeout()\n\n // Reject all pending invocations\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 // Close WebSocket. Swallow any close-time errors (most commonly\n // \"WebSocket was closed before the connection was established\",\n // emitted when `close()` fires while still in CONNECTING state\n // and there's no error listener). Without a catch-all listener,\n // that event becomes an unhandled exception because we remove\n // every listener right above the close call.\n if (this.ws) {\n this.ws.removeAllListeners()\n this.ws.on('error', () => {})\n try {\n this.ws.close()\n } catch {\n // ignore, shutting down anyway\n }\n this.ws = undefined\n }\n\n this.setConnectionState('disconnected')\n }\n\n // private methods\n\n private setConnectionState(state: IIIConnectionState): void {\n if (this.connectionState !== state) {\n this.connectionState = state\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, { headers: this.options?.headers })\n this.ws.on('open', this.onSocketOpen.bind(this))\n this.ws.on('close', this.onSocketClose.bind(this))\n this.ws.on('error', 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 this.logError(`Max reconnection retries (${maxRetries}) reached, giving up`)\n return\n }\n\n if (this.reconnectTimeout) {\n return // Already scheduled\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(error: Error): void {\n this.logError('WebSocket error', error)\n }\n\n private startMetricsReporting(): void {\n if (!this.metricsReportingEnabled || !this.workerId) {\n return\n }\n\n const meter = getMeter()\n if (!meter) {\n console.warn(\n '[iii] Worker metrics disabled: OpenTelemetry not initialized. Call initOtel() with metricsEnabled: true before creating the iii.',\n )\n return\n }\n\n registerWorkerGauges(meter, {\n workerId: this.workerId,\n workerName: this.workerName,\n })\n }\n\n private stopMetricsReporting(): void {\n stopWorkerGauges()\n }\n\n private onSocketClose(): void {\n this.ws?.removeAllListeners()\n this.ws?.terminate()\n this.ws = undefined\n\n this.setConnectionState('disconnected')\n this.stopMetricsReporting()\n this.scheduleReconnect()\n }\n\n private onSocketOpen(): void {\n this.clearReconnectTimeout()\n this.reconnectAttempt = 0\n this.setConnectionState('connected')\n\n this.ws?.on('message', this.onMessage.bind(this))\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 // Optimized: swap with empty array instead of splice\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 this.registerWorkerMetadata()\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, (err) => {\n if (err) {\n this.logError('Failed to send message', err)\n }\n })\n } catch (error) {\n this.logError('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 logError(message: string, error?: unknown): void {\n const otelLogger = getLogger()\n const errorMessage = error instanceof Error ? error.message : String(error ?? '')\n\n if (otelLogger) {\n otelLogger.emit({\n severityNumber: SeverityNumber.ERROR,\n body: `[iii] ${message}${errorMessage ? `: ${errorMessage}` : ''}`,\n })\n } else {\n console.error(`[iii] ${message}`, error ?? '')\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 if (error) {\n invocation.reject(this.toInvocationError(error, invocation.function_id))\n } else {\n invocation.resolve(result)\n }\n }\n\n this.invocations.delete(invocation_id)\n }\n\n /**\n * Wrap a wire-format `ErrorBody` in {@link InvocationError} so callers get\n * a real `Error` with a readable `.message` and a typed `.code`. Pass-through\n * for values that are already `Error` subclasses. Everything else is wrapped\n * under an `UNKNOWN` code so `String(err) !== '[object Object]'` holds for\n * every rejection path.\n */\n private toInvocationError(error: unknown, function_id?: string): Error {\n if (error instanceof Error) {\n return error\n }\n if (isErrorBody(error)) {\n return new InvocationError({\n code: error.code,\n message: error.message,\n function_id,\n stacktrace: error.stacktrace,\n })\n }\n // JSON.stringify(undefined) returns undefined (not \"undefined\"), which\n // would set message to the literal string \"undefined\" after type coercion\n // and leak an uninformative rejection. Fall back through String(error)\n // so every path produces a concrete, readable string.\n const message =\n typeof error === 'string'\n ? error\n : (JSON.stringify(error) ?? String(error))\n return new InvocationError({\n code: 'UNKNOWN',\n message,\n function_id,\n })\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 const getResponseTraceparent = () => injectTraceparent() ?? traceparent\n const getResponseBaggage = () => injectBaggage() ?? baggage\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 this.logError(`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: getResponseTraceparent(),\n baggage: getResponseBaggage(),\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: getResponseTraceparent(),\n baggage: getResponseBaggage(),\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; metadata?: Record<string, unknown> }) {\n const { trigger_type, id, function_id, config, metadata } = message\n const triggerTypeData = this.triggerTypes.get(trigger_type)\n\n if (triggerTypeData) {\n try {\n await triggerTypeData.handler.registerTrigger({ id, function_id, config, metadata })\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 metadata?: Record<string, 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, metadata } = message\n try {\n await triggerTypeData.handler.unregisterTrigger({ id, function_id, config, metadata })\n } catch (error) {\n this.logError(`Error unregistering trigger ${id}`, error)\n }\n }\n\n private onTriggerRegistrationResult(\n message: { id: string; trigger_type?: string; type?: string; function_id: string; error?: { code: string; message: string; stacktrace?: string } },\n ): void {\n if (!message.error) return\n const triggerType = message.trigger_type ?? message.type ?? ''\n console.error(\n `[iii] Trigger registration failed for \"${message.id}\" (${triggerType}): ${message.error.message}`,\n )\n }\n\n private onMessage(socketMessage: Data): void {\n let msgType: MessageType\n let message: Record<string, unknown>\n\n try {\n const parsed = JSON.parse(socketMessage.toString()) as Record<string, unknown>\n msgType = parsed.type as MessageType\n const { type: _, ...rest } = parsed\n message = rest\n } catch (error) {\n this.logError('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; metadata?: Record<string, unknown> })\n } else if (msgType === MessageType.UnregisterTrigger) {\n this.onUnregisterTrigger(\n message as {\n trigger_type?: string\n id: string\n function_id?: string\n config?: unknown\n metadata?: Record<string, unknown>\n },\n )\n } else if (msgType === MessageType.TriggerRegistrationResult) {\n this.onTriggerRegistrationResult(\n message as { id: string; trigger_type?: string; type?: string; function_id: string; error?: { code: string; message: string; stacktrace?: string } },\n )\n } else if (msgType === MessageType.WorkerRegistered) {\n const { worker_id } = message as WorkerRegisteredMessage\n this.workerId = worker_id\n console.debug('[iii] Worker registered with ID:', worker_id)\n this.startMetricsReporting()\n }\n }\n}\n\n/**\n * Factory object that constructs routing actions for {@link IIIClient.trigger}.\n *\n * @example\n * ```typescript\n * import { TriggerAction } from 'iii-sdk'\n *\n * // Enqueue to a named queue\n * worker.trigger({\n * function_id: 'process',\n * payload: { data: 'hello' },\n * action: TriggerAction.Enqueue({ queue: 'jobs' }),\n * })\n *\n * // Fire-and-forget\n * worker.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:49134`).\n * @param options - Optional {@link InitOptions} for worker name, timeouts, reconnection, and OTel.\n * @returns A connected {@link IIIClient} instance.\n *\n * @example\n * ```typescript\n * import { registerWorker } from 'iii-sdk'\n *\n * const worker = registerWorker(process.env.III_URL ?? 'ws://localhost:49134', {\n * workerName: 'my-worker',\n * })\n * ```\n */\nexport const registerWorker = (address: string, options?: InitOptions): IIIClient => new Sdk(address, options)\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs","names":["os","MessageType","context","SpanKind","trace","ChannelWriter","ChannelReader","InvocationError","DEFAULT_BRIDGE_RECONNECTION_CONFIG","EngineFunctions","detectProjectName","WebSocket","SeverityNumber","isErrorBody","isChannelRef"],"sources":["../src/iii.ts"],"sourcesContent":["import { context, trace } from '@opentelemetry/api'\nimport { createRequire } from 'node:module'\nimport * as os from 'node:os'\nimport { type Data, WebSocket } from 'ws'\nimport { ChannelReader, ChannelWriter } from './channels'\nimport { InvocationError, isErrorBody } from './errors'\nimport {\n DEFAULT_BRIDGE_RECONNECTION_CONFIG,\n DEFAULT_INVOCATION_TIMEOUT_MS,\n EngineFunctions,\n type IIIConnectionState,\n type IIIReconnectionConfig,\n} from './iii-constants'\nimport type { HttpInvocationConfig } from '@iii-dev/helpers/http'\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 type WorkerRegisteredMessage,\n} from './iii-types'\nimport { registerWorkerGauges, stopWorkerGauges } from '@iii-dev/helpers/observability'\nimport { getMeter, getTracer } from '@iii-dev/helpers/observability/internal'\nimport { SpanKind } from '@opentelemetry/api'\nimport type { IStream } from './stream'\nimport { detectProjectName } from './utils'\nimport {\n extractContext,\n getLogger,\n initOtel,\n injectBaggage,\n injectTraceparent,\n type OtelConfig,\n recordSpanEvent,\n redactAndTruncate,\n resolveMaxBytesFromEnv,\n SeverityNumber,\n shutdownOtel,\n withSpan,\n} from '@iii-dev/helpers/observability'\nimport type { TriggerHandler } from './triggers'\nimport type {\n FunctionRef,\n IIIClient,\n Invocation,\n RegisterFunctionOptions,\n RemoteFunctionData,\n RemoteFunctionHandler,\n RemoteTriggerTypeData,\n Trigger,\n TriggerTypeRef,\n} from './types'\nimport { isChannelRef } from './utils'\n\nconst require = createRequire(import.meta.url)\nconst { version: SDK_VERSION } = require('../package.json')\n\nfunction getOsInfo(): string {\n return `${os.platform()} ${os.release()} (${os.arch()})`\n}\n\nfunction getDefaultWorkerName(): string {\n return `${os.hostname()}:${process.pid}`\n}\n\n/** Worker labels reported to the engine (language, framework, project). */\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 worker = registerWorker('ws://localhost:49134', {\n * workerName: 'my-worker',\n * invocationTimeoutMs: 10000,\n * reconnectionConfig: { maxRetries: 5 },\n * })\n * ```\n */\nexport type InitOptions = {\n /** Display name for this worker. Defaults to `hostname:pid`. */\n workerName?: string\n /**\n * One-line, human/LLM-readable summary of what this worker does.\n * Surfaces in `engine::workers::list` / `engine::workers::info`.\n */\n workerDescription?: string\n /** Enable worker metrics via OpenTelemetry. Defaults to `true`. */\n enableMetricsReporting?: boolean\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 /**\n * OpenTelemetry configuration. OTel is initialized automatically by default.\n * Set `{ enabled: false }` or env `OTEL_ENABLED=false/0/no/off` to disable.\n * The `engineWsUrl` is set automatically from the III address.\n */\n otel?: Omit<OtelConfig, 'engineWsUrl'>\n /** Custom HTTP headers sent during the WebSocket handshake. */\n headers?: Record<string, string>\n /** @internal */\n telemetry?: TelemetryOptions\n}\n\nclass Sdk implements IIIClient {\n private ws?: WebSocket\n private functions = new Map<string, RemoteFunctionData>()\n private invocations = new Map<string, Invocation & { timeout?: NodeJS.Timeout }>()\n private triggers = new Map<string, RegisterTriggerMessage>()\n private triggerTypes = new Map<string, RemoteTriggerTypeData>()\n private messagesToSend: Record<string, unknown>[] = []\n private workerName: string\n private workerDescription?: string\n private workerId?: string\n private reconnectTimeout?: NodeJS.Timeout\n private metricsReportingEnabled: boolean\n private invocationTimeoutMs: number\n private reconnectionConfig: IIIReconnectionConfig\n private reconnectAttempt = 0\n private connectionState: IIIConnectionState = 'disconnected'\n private isShuttingDown = false\n\n constructor(\n private readonly address: string,\n private readonly options?: InitOptions,\n ) {\n this.workerName = options?.workerName ?? getDefaultWorkerName()\n this.workerDescription = options?.workerDescription\n this.metricsReportingEnabled = options?.enableMetricsReporting ?? true\n this.invocationTimeoutMs = options?.invocationTimeoutMs ?? DEFAULT_INVOCATION_TIMEOUT_MS\n this.reconnectionConfig = {\n ...DEFAULT_BRIDGE_RECONNECTION_CONFIG,\n ...options?.reconnectionConfig,\n }\n\n // Initialize OpenTelemetry (enabled by default, opt-out via config or env)\n initOtel({ ...options?.otel, engineWsUrl: this.address })\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 * worker.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, metadata?: Record<string, unknown>) => {\n return this.registerTrigger({\n type: triggerType.id,\n function_id: functionId,\n config,\n metadata,\n })\n },\n registerFunction: (functionId, handler, config, metadata?) => {\n const ref = this.registerFunction(functionId, handler)\n this.registerTrigger({\n type: triggerType.id,\n function_id: functionId,\n config,\n metadata,\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 = worker.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 = worker.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 | HttpInvocationConfig,\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 isHandler = typeof handlerOrInvocation === 'function'\n\n const fullMessage: RegisterFunctionMessage = isHandler\n ? { ...options, id: functionId, message_type: MessageType.RegisterFunction }\n : {\n ...options,\n id: functionId,\n message_type: MessageType.RegisterFunction,\n invocation: {\n url: handlerOrInvocation.url,\n method: handlerOrInvocation.method ?? 'POST',\n timeout_ms: handlerOrInvocation.timeout_ms,\n headers: handlerOrInvocation.headers,\n auth: handlerOrInvocation.auth,\n },\n }\n\n this.sendMessage(MessageType.RegisterFunction, fullMessage, true)\n\n if (isHandler) {\n const handler = handlerOrInvocation as RemoteFunctionHandler\n this.functions.set(functionId, {\n message: fullMessage,\n handler: async (input, metadata?: unknown, traceparent?: string, baggage?: string) => {\n const tracePayloads = !(\n process.env.III_DISABLE_TRACE_PAYLOADS === '1' ||\n process.env.III_DISABLE_TRACE_PAYLOADS?.toLowerCase() === 'true'\n )\n const payloadMaxBytes = resolveMaxBytesFromEnv()\n\n const runHandler = async () => {\n if (tracePayloads) {\n const { json, truncated } = redactAndTruncate(input, payloadMaxBytes)\n recordSpanEvent('iii.invocation.input', {\n 'iii.payload.json': json,\n 'iii.payload.truncated': truncated,\n })\n }\n try {\n const result = await handler(input, metadata)\n if (tracePayloads) {\n const { json, truncated } = redactAndTruncate(result, payloadMaxBytes)\n recordSpanEvent('iii.invocation.output', {\n 'iii.payload.json': json,\n 'iii.payload.truncated': truncated,\n 'iii.payload.ok': true,\n })\n }\n return result\n } catch (err) {\n if (tracePayloads) {\n const errMsg = err instanceof Error ? err.message : String(err)\n const { json, truncated } = redactAndTruncate(\n { error: errMsg },\n payloadMaxBytes,\n )\n recordSpanEvent('iii.invocation.output', {\n 'iii.payload.json': json,\n 'iii.payload.truncated': truncated,\n 'iii.payload.ok': false,\n })\n }\n throw err\n }\n }\n\n if (getTracer()) {\n const parentContext = extractContext(traceparent, baggage)\n\n // INTERNAL and named `execute` (not `call`/`trigger`): the engine\n // already emits the SERVER `call <fn>` span for this hop AND a\n // `trigger <fn>` span from fire_triggers. Reusing either name would\n // duplicate an engine span under the worker's service. `execute` is\n // unique, so the worker handler span reads as a clean internal child\n // of the engine's call span (and is collapsible by a single rule).\n return context.with(parentContext, () =>\n withSpan(`execute ${functionId}`, { kind: SpanKind.INTERNAL }, async () => await runHandler()),\n )\n }\n\n const traceId = crypto.randomUUID().replace(/-/g, '')\n const spanId = crypto.randomUUID().replace(/-/g, '').slice(0, 16)\n const syntheticSpan = trace.wrapSpanContext({ traceId, spanId, traceFlags: 1 })\n\n return context.with(trace.setSpan(context.active(), syntheticSpan), async () => await runHandler())\n },\n })\n } else {\n this.functions.set(functionId, { message: fullMessage })\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-sdk/helpers` submodule. Not part of the public `IIIClient` 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 * @param request.metadata - Optional per-invocation metadata (arbitrary JSON)\n * surfaced to the target handler as its second argument.\n * @returns The result of the function invocation.\n *\n * @example\n * ```typescript\n * import { TriggerAction } from 'iii-sdk'\n *\n * // Synchronous\n * const result = await worker.trigger({ function_id: 'get-order', payload: { id: '123' } })\n *\n * // Enqueue\n * const { messageReceiptId } = await worker.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 * worker.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, metadata } = request\n const effectiveTimeout = timeoutMs ?? this.invocationTimeoutMs\n\n // Void is fire-and-forget, no invocation_id, no response\n if (action?.type === 'void') {\n const traceparent = injectTraceparent()\n const baggage = injectBaggage()\n this.sendMessage(MessageType.InvokeFunction, {\n function_id,\n data: payload,\n traceparent,\n baggage,\n action,\n metadata,\n })\n return undefined as TOutput\n }\n\n // Enqueue and default: send invocation_id, await response\n const invocation_id = crypto.randomUUID()\n const traceparent = injectTraceparent()\n const baggage = injectBaggage()\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(\n new InvocationError({\n code: 'TIMEOUT',\n message: `invocation timed out after ${effectiveTimeout}ms`,\n function_id,\n }),\n )\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 function_id,\n timeout,\n })\n\n this.sendMessage(MessageType.InvokeFunction, {\n invocation_id,\n function_id,\n data: payload,\n traceparent,\n baggage,\n action,\n metadata,\n })\n })\n }\n\n private registerWorkerMetadata(): void {\n const telemetryOpts = this.options?.telemetry\n const language =\n telemetryOpts?.language ?? Intl.DateTimeFormat().resolvedOptions().locale ?? process.env.LANG?.split('.')[0]\n\n this.trigger({\n function_id: EngineFunctions.REGISTER_WORKER,\n payload: {\n runtime: 'node',\n version: SDK_VERSION,\n name: this.workerName,\n description: this.workerDescription,\n os: getOsInfo(),\n pid: process.pid,\n isolation: process.env.III_ISOLATION || null,\n telemetry: {\n language,\n project_name: telemetryOpts?.project_name ?? detectProjectName(),\n framework: telemetryOpts?.framework?.trim() || 'iii-node',\n amplitude_api_key: telemetryOpts?.amplitude_api_key,\n },\n },\n action: { type: 'void' },\n })\n }\n\n /**\n * @internal Implementation backing the `createStream` helper in the\n * `iii-sdk/helpers` submodule. Not part of the public `IIIClient` surface.\n *\n * Registers a custom stream implementation, overriding the engine default\n * for the given stream name. Registers 5 of the 6 `IStream` methods\n * (`get`, `set`, `delete`, `list`, `listGroups`). The `update` method is\n * not registered -- atomic updates are handled by the engine's built-in\n * stream update logic.\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 iii, cleaning up all resources.\n */\n shutdown = async (): Promise<void> => {\n this.isShuttingDown = true\n\n this.stopMetricsReporting()\n\n // Shutdown OpenTelemetry\n await shutdownOtel()\n\n // Clear reconnection timeout\n this.clearReconnectTimeout()\n\n // Reject all pending invocations\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 // Close WebSocket. Swallow any close-time errors (most commonly\n // \"WebSocket was closed before the connection was established\",\n // emitted when `close()` fires while still in CONNECTING state\n // and there's no error listener). Without a catch-all listener,\n // that event becomes an unhandled exception because we remove\n // every listener right above the close call.\n if (this.ws) {\n this.ws.removeAllListeners()\n this.ws.on('error', () => {})\n try {\n this.ws.close()\n } catch {\n // ignore, shutting down anyway\n }\n this.ws = undefined\n }\n\n this.setConnectionState('disconnected')\n }\n\n // private methods\n\n private setConnectionState(state: IIIConnectionState): void {\n if (this.connectionState !== state) {\n this.connectionState = state\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, { headers: this.options?.headers })\n this.ws.on('open', this.onSocketOpen.bind(this))\n this.ws.on('close', this.onSocketClose.bind(this))\n this.ws.on('error', 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 this.logError(`Max reconnection retries (${maxRetries}) reached, giving up`)\n return\n }\n\n if (this.reconnectTimeout) {\n return // Already scheduled\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(error: Error): void {\n this.logError('WebSocket error', error)\n }\n\n private startMetricsReporting(): void {\n if (!this.metricsReportingEnabled || !this.workerId) {\n return\n }\n\n const meter = getMeter()\n if (!meter) {\n console.warn(\n '[iii] Worker metrics disabled: OpenTelemetry not initialized. Call initOtel() with metricsEnabled: true before creating the iii.',\n )\n return\n }\n\n registerWorkerGauges(meter, {\n workerId: this.workerId,\n workerName: this.workerName,\n })\n }\n\n private stopMetricsReporting(): void {\n stopWorkerGauges()\n }\n\n private onSocketClose(): void {\n this.ws?.removeAllListeners()\n this.ws?.terminate()\n this.ws = undefined\n\n this.setConnectionState('disconnected')\n this.stopMetricsReporting()\n this.scheduleReconnect()\n }\n\n private onSocketOpen(): void {\n this.clearReconnectTimeout()\n this.reconnectAttempt = 0\n this.setConnectionState('connected')\n\n this.ws?.on('message', this.onMessage.bind(this))\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 // Optimized: swap with empty array instead of splice\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 this.registerWorkerMetadata()\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, (err) => {\n if (err) {\n this.logError('Failed to send message', err)\n }\n })\n } catch (error) {\n this.logError('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 logError(message: string, error?: unknown): void {\n const otelLogger = getLogger()\n const errorMessage = error instanceof Error ? error.message : String(error ?? '')\n\n if (otelLogger) {\n otelLogger.emit({\n severityNumber: SeverityNumber.ERROR,\n body: `[iii] ${message}${errorMessage ? `: ${errorMessage}` : ''}`,\n })\n } else {\n console.error(`[iii] ${message}`, error ?? '')\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 if (error) {\n invocation.reject(this.toInvocationError(error, invocation.function_id))\n } else {\n invocation.resolve(result)\n }\n }\n\n this.invocations.delete(invocation_id)\n }\n\n /**\n * Wrap a wire-format `ErrorBody` in {@link InvocationError} so callers get\n * a real `Error` with a readable `.message` and a typed `.code`. Pass-through\n * for values that are already `Error` subclasses. Everything else is wrapped\n * under an `UNKNOWN` code so `String(err) !== '[object Object]'` holds for\n * every rejection path.\n */\n private toInvocationError(error: unknown, function_id?: string): Error {\n if (error instanceof Error) {\n return error\n }\n if (isErrorBody(error)) {\n return new InvocationError({\n code: error.code,\n message: error.message,\n function_id,\n stacktrace: error.stacktrace,\n })\n }\n // JSON.stringify(undefined) returns undefined (not \"undefined\"), which\n // would set message to the literal string \"undefined\" after type coercion\n // and leak an uninformative rejection. Fall back through String(error)\n // so every path produces a concrete, readable string.\n const message =\n typeof error === 'string'\n ? error\n : (JSON.stringify(error) ?? String(error))\n return new InvocationError({\n code: 'UNKNOWN',\n message,\n function_id,\n })\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 metadata?: unknown,\n traceparent?: string,\n baggage?: string,\n ): Promise<unknown> {\n const fn = this.functions.get(function_id)\n const getResponseTraceparent = () => injectTraceparent() ?? traceparent\n const getResponseBaggage = () => injectBaggage() ?? baggage\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, metadata, traceparent, baggage)\n } catch (error) {\n this.logError(`Error invoking function ${function_id}`, error)\n }\n return\n }\n\n try {\n const result = await fn.handler(resolvedInput, metadata, traceparent, baggage)\n this.sendMessage(MessageType.InvocationResult, {\n invocation_id,\n function_id,\n result,\n traceparent: getResponseTraceparent(),\n baggage: getResponseBaggage(),\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: getResponseTraceparent(),\n baggage: getResponseBaggage(),\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; metadata?: Record<string, unknown> }) {\n const { trigger_type, id, function_id, config, metadata } = message\n const triggerTypeData = this.triggerTypes.get(trigger_type)\n\n if (triggerTypeData) {\n try {\n await triggerTypeData.handler.registerTrigger({ id, function_id, config, metadata })\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 metadata?: Record<string, 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, metadata } = message\n try {\n await triggerTypeData.handler.unregisterTrigger({ id, function_id, config, metadata })\n } catch (error) {\n this.logError(`Error unregistering trigger ${id}`, error)\n }\n }\n\n private onTriggerRegistrationResult(\n message: { id: string; trigger_type?: string; type?: string; function_id: string; error?: { code: string; message: string; stacktrace?: string } },\n ): void {\n if (!message.error) return\n const triggerType = message.trigger_type ?? message.type ?? ''\n console.error(\n `[iii] Trigger registration failed for \"${message.id}\" (${triggerType}): ${message.error.message}`,\n )\n }\n\n private onMessage(socketMessage: Data): void {\n let msgType: MessageType\n let message: Record<string, unknown>\n\n try {\n const parsed = JSON.parse(socketMessage.toString()) as Record<string, unknown>\n msgType = parsed.type as MessageType\n const { type: _, ...rest } = parsed\n message = rest\n } catch (error) {\n this.logError('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, metadata, traceparent, baggage } = message as InvokeFunctionMessage\n this.onInvokeFunction(invocation_id, function_id, data, metadata, traceparent, baggage)\n } else if (msgType === MessageType.RegisterTrigger) {\n this.onRegisterTrigger(message as { trigger_type: string; id: string; function_id: string; config: unknown; metadata?: Record<string, unknown> })\n } else if (msgType === MessageType.UnregisterTrigger) {\n this.onUnregisterTrigger(\n message as {\n trigger_type?: string\n id: string\n function_id?: string\n config?: unknown\n metadata?: Record<string, unknown>\n },\n )\n } else if (msgType === MessageType.TriggerRegistrationResult) {\n this.onTriggerRegistrationResult(\n message as { id: string; trigger_type?: string; type?: string; function_id: string; error?: { code: string; message: string; stacktrace?: string } },\n )\n } else if (msgType === MessageType.WorkerRegistered) {\n const { worker_id } = message as WorkerRegisteredMessage\n this.workerId = worker_id\n console.debug('[iii] Worker registered with ID:', worker_id)\n this.startMetricsReporting()\n }\n }\n}\n\n/**\n * Factory object that constructs routing actions for {@link IIIClient.trigger}.\n *\n * @example\n * ```typescript\n * import { TriggerAction } from 'iii-sdk'\n *\n * // Enqueue to a named queue\n * worker.trigger({\n * function_id: 'process',\n * payload: { data: 'hello' },\n * action: TriggerAction.Enqueue({ queue: 'jobs' }),\n * })\n *\n * // Fire-and-forget\n * worker.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:49134`).\n * @param options - Optional {@link InitOptions} for worker name, timeouts, reconnection, and OTel.\n * @returns A connected {@link IIIClient} instance.\n *\n * @example\n * ```typescript\n * import { registerWorker } from 'iii-sdk'\n *\n * const worker = registerWorker(process.env.III_URL ?? 'ws://localhost:49134', {\n * workerName: 'my-worker',\n * })\n * ```\n */\nexport const registerWorker = (address: string, options?: InitOptions): IIIClient => new Sdk(address, options)\n"],"mappings":"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"}
package/dist/index.d.cts CHANGED
@@ -1,4 +1,4 @@
1
- import { S as MiddlewareFunctionInput, d as StreamResponse, r as IIIClient, u as StreamRequest } from "./types-pzKubHk_.cjs";
1
+ import { S as MiddlewareFunctionInput, d as StreamResponse, r as IIIClient, u as StreamRequest } from "./types-BZoO05vA.cjs";
2
2
  import { i as IIIReconnectionConfig } from "./iii-constants-BqXp8xSN.cjs";
3
3
  import { InvocationError, InvocationErrorInit } from "./errors.cjs";
4
4
  import { OtelConfig } from "@iii-dev/helpers/observability";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.cts","names":[],"sources":["../src/iii.ts"],"mappings":";;;;;;;;KAwEY,gBAAA;EACV,QAAA;EACA,YAAA;EACA,SAAA;EACA,iBAAA;AAAA;;;;;;;;AAeF;;;;;KAAY,WAAA;EAuBH,gEArBP,UAAA;EAyBY;;;;EApBZ,iBAAA,WAEA;EAAA,sBAAA,YAQA;EANA,mBAAA;EAM6B;;;;;EAA7B,kBAAA,GAAqB,OAAA,CAAQ,qBAAA;EAU7B;;;;AAg7BF;EAp7BE,IAAA,GAAO,IAAA,CAAK,UAAA;EAEZ,OAAA,GAAU,MAAA;EAEV,SAAA,GAAY,gBAAA;AAAA;;;;;;;AAk9Bd;;;;;;;;;;;;;;;;cAlCa,aAAA;;;;;;;;;;IASO,KAAA;EAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cAyBP,cAAA,GAAkB,OAAA,UAAiB,OAAA,GAAU,WAAA,KAAc,SAAA"}
1
+ {"version":3,"file":"index.d.cts","names":[],"sources":["../src/iii.ts"],"mappings":";;;;;;;;KAwEY,gBAAA;EACV,QAAA;EACA,YAAA;EACA,SAAA;EACA,iBAAA;AAAA;;;;;;;;AAeF;;;;;KAAY,WAAA;EAuBH,gEArBP,UAAA;EAyBY;;;;EApBZ,iBAAA,WAEA;EAAA,sBAAA,YAQA;EANA,mBAAA;EAM6B;;;;;EAA7B,kBAAA,GAAqB,OAAA,CAAQ,qBAAA;EAU7B;;;;AAq7BF;EAz7BE,IAAA,GAAO,IAAA,CAAK,UAAA;EAEZ,OAAA,GAAU,MAAA;EAEV,SAAA,GAAY,gBAAA;AAAA;;;;;;;AAu9Bd;;;;;;;;;;;;;;;;cAlCa,aAAA;;;;;;;;;;IASO,KAAA;EAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cAyBP,cAAA,GAAkB,OAAA,UAAiB,OAAA,GAAU,WAAA,KAAc,SAAA"}
package/dist/index.d.mts CHANGED
@@ -1,4 +1,4 @@
1
- import { S as MiddlewareFunctionInput, d as StreamResponse, r as IIIClient, u as StreamRequest } from "./types-ChnmRit-.mjs";
1
+ import { S as MiddlewareFunctionInput, d as StreamResponse, r as IIIClient, u as StreamRequest } from "./types-BlFE8MZG.mjs";
2
2
  import { i as IIIReconnectionConfig } from "./iii-constants-Baptl8nm.mjs";
3
3
  import { InvocationError, InvocationErrorInit } from "./errors.mjs";
4
4
  import { OtelConfig } from "@iii-dev/helpers/observability";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.mts","names":[],"sources":["../src/iii.ts"],"mappings":";;;;;;;;KAwEY,gBAAA;EACV,QAAA;EACA,YAAA;EACA,SAAA;EACA,iBAAA;AAAA;;;;;;;;AAeF;;;;;KAAY,WAAA;EAuBH,gEArBP,UAAA;EAyBY;;;;EApBZ,iBAAA,WAEA;EAAA,sBAAA,YAQA;EANA,mBAAA;EAM6B;;;;;EAA7B,kBAAA,GAAqB,OAAA,CAAQ,qBAAA;EAU7B;;;;AAg7BF;EAp7BE,IAAA,GAAO,IAAA,CAAK,UAAA;EAEZ,OAAA,GAAU,MAAA;EAEV,SAAA,GAAY,gBAAA;AAAA;;;;;;;AAk9Bd;;;;;;;;;;;;;;;;cAlCa,aAAA;;;;;;;;;;IASO,KAAA;EAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cAyBP,cAAA,GAAkB,OAAA,UAAiB,OAAA,GAAU,WAAA,KAAc,SAAA"}
1
+ {"version":3,"file":"index.d.mts","names":[],"sources":["../src/iii.ts"],"mappings":";;;;;;;;KAwEY,gBAAA;EACV,QAAA;EACA,YAAA;EACA,SAAA;EACA,iBAAA;AAAA;;;;;;;;AAeF;;;;;KAAY,WAAA;EAuBH,gEArBP,UAAA;EAyBY;;;;EApBZ,iBAAA,WAEA;EAAA,sBAAA,YAQA;EANA,mBAAA;EAM6B;;;;;EAA7B,kBAAA,GAAqB,OAAA,CAAQ,qBAAA;EAU7B;;;;AAq7BF;EAz7BE,IAAA,GAAO,IAAA,CAAK,UAAA;EAEZ,OAAA,GAAU,MAAA;EAEV,SAAA,GAAY,gBAAA;AAAA;;;;;;;AAu9Bd;;;;;;;;;;;;;;;;cAlCa,aAAA;;;;;;;;;;IASO,KAAA;EAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cAyBP,cAAA,GAAkB,OAAA,UAAiB,OAAA,GAAU,WAAA,KAAc,SAAA"}
package/dist/index.mjs CHANGED
@@ -111,7 +111,7 @@ var Sdk = class {
111
111
  const handler = handlerOrInvocation;
112
112
  this.functions.set(functionId, {
113
113
  message: fullMessage,
114
- handler: async (input, traceparent, baggage) => {
114
+ handler: async (input, metadata, traceparent, baggage) => {
115
115
  const tracePayloads = !(process.env.III_DISABLE_TRACE_PAYLOADS === "1" || process.env.III_DISABLE_TRACE_PAYLOADS?.toLowerCase() === "true");
116
116
  const payloadMaxBytes = resolveMaxBytesFromEnv();
117
117
  const runHandler = async () => {
@@ -123,7 +123,7 @@ var Sdk = class {
123
123
  });
124
124
  }
125
125
  try {
126
- const result = await handler(input);
126
+ const result = await handler(input, metadata);
127
127
  if (tracePayloads) {
128
128
  const { json, truncated } = redactAndTruncate(result, payloadMaxBytes);
129
129
  recordSpanEvent("iii.invocation.output", {
@@ -181,7 +181,7 @@ var Sdk = class {
181
181
  };
182
182
  };
183
183
  this.trigger = async (request) => {
184
- const { function_id, payload, action, timeoutMs } = request;
184
+ const { function_id, payload, action, timeoutMs, metadata } = request;
185
185
  const effectiveTimeout = timeoutMs ?? this.invocationTimeoutMs;
186
186
  if (action?.type === "void") {
187
187
  const traceparent = injectTraceparent();
@@ -191,7 +191,8 @@ var Sdk = class {
191
191
  data: payload,
192
192
  traceparent,
193
193
  baggage,
194
- action
194
+ action,
195
+ metadata
195
196
  });
196
197
  return;
197
198
  }
@@ -227,7 +228,8 @@ var Sdk = class {
227
228
  data: payload,
228
229
  traceparent,
229
230
  baggage,
230
- action
231
+ action,
232
+ metadata
231
233
  });
232
234
  });
233
235
  };
@@ -478,7 +480,7 @@ var Sdk = class {
478
480
  }
479
481
  return value;
480
482
  }
481
- async onInvokeFunction(invocation_id, function_id, input, traceparent, baggage) {
483
+ async onInvokeFunction(invocation_id, function_id, input, metadata, traceparent, baggage) {
482
484
  const fn = this.functions.get(function_id);
483
485
  const getResponseTraceparent = () => injectTraceparent() ?? traceparent;
484
486
  const getResponseBaggage = () => injectBaggage() ?? baggage;
@@ -486,14 +488,14 @@ var Sdk = class {
486
488
  if (fn?.handler) {
487
489
  if (!invocation_id) {
488
490
  try {
489
- await fn.handler(resolvedInput, traceparent, baggage);
491
+ await fn.handler(resolvedInput, metadata, traceparent, baggage);
490
492
  } catch (error) {
491
493
  this.logError(`Error invoking function ${function_id}`, error);
492
494
  }
493
495
  return;
494
496
  }
495
497
  try {
496
- const result = await fn.handler(resolvedInput, traceparent, baggage);
498
+ const result = await fn.handler(resolvedInput, metadata, traceparent, baggage);
497
499
  this.sendMessage(MessageType.InvocationResult, {
498
500
  invocation_id,
499
501
  function_id,
@@ -607,8 +609,8 @@ var Sdk = class {
607
609
  const { invocation_id, result, error } = message;
608
610
  this.onInvocationResult(invocation_id, result, error);
609
611
  } else if (msgType === MessageType.InvokeFunction) {
610
- const { invocation_id, function_id, data, traceparent, baggage } = message;
611
- this.onInvokeFunction(invocation_id, function_id, data, traceparent, baggage);
612
+ const { invocation_id, function_id, data, metadata, traceparent, baggage } = message;
613
+ this.onInvokeFunction(invocation_id, function_id, data, metadata, traceparent, baggage);
612
614
  } else if (msgType === MessageType.RegisterTrigger) this.onRegisterTrigger(message);
613
615
  else if (msgType === MessageType.UnregisterTrigger) this.onUnregisterTrigger(message);
614
616
  else if (msgType === MessageType.TriggerRegistrationResult) this.onTriggerRegistrationResult(message);
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":[],"sources":["../src/iii.ts"],"sourcesContent":["import { context, trace } from '@opentelemetry/api'\nimport { createRequire } from 'node:module'\nimport * as os from 'node:os'\nimport { type Data, WebSocket } from 'ws'\nimport { ChannelReader, ChannelWriter } from './channels'\nimport { InvocationError, isErrorBody } from './errors'\nimport {\n DEFAULT_BRIDGE_RECONNECTION_CONFIG,\n DEFAULT_INVOCATION_TIMEOUT_MS,\n EngineFunctions,\n type IIIConnectionState,\n type IIIReconnectionConfig,\n} from './iii-constants'\nimport type { HttpInvocationConfig } from '@iii-dev/helpers/http'\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 type WorkerRegisteredMessage,\n} from './iii-types'\nimport { registerWorkerGauges, stopWorkerGauges } from '@iii-dev/helpers/observability'\nimport { getMeter, getTracer } from '@iii-dev/helpers/observability/internal'\nimport { SpanKind } from '@opentelemetry/api'\nimport type { IStream } from './stream'\nimport { detectProjectName } from './utils'\nimport {\n extractContext,\n getLogger,\n initOtel,\n injectBaggage,\n injectTraceparent,\n type OtelConfig,\n recordSpanEvent,\n redactAndTruncate,\n resolveMaxBytesFromEnv,\n SeverityNumber,\n shutdownOtel,\n withSpan,\n} from '@iii-dev/helpers/observability'\nimport type { TriggerHandler } from './triggers'\nimport type {\n FunctionRef,\n IIIClient,\n Invocation,\n RegisterFunctionOptions,\n RemoteFunctionData,\n RemoteFunctionHandler,\n RemoteTriggerTypeData,\n Trigger,\n TriggerTypeRef,\n} from './types'\nimport { isChannelRef } from './utils'\n\nconst require = createRequire(import.meta.url)\nconst { version: SDK_VERSION } = require('../package.json')\n\nfunction getOsInfo(): string {\n return `${os.platform()} ${os.release()} (${os.arch()})`\n}\n\nfunction getDefaultWorkerName(): string {\n return `${os.hostname()}:${process.pid}`\n}\n\n/** Worker labels reported to the engine (language, framework, project). */\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 worker = registerWorker('ws://localhost:49134', {\n * workerName: 'my-worker',\n * invocationTimeoutMs: 10000,\n * reconnectionConfig: { maxRetries: 5 },\n * })\n * ```\n */\nexport type InitOptions = {\n /** Display name for this worker. Defaults to `hostname:pid`. */\n workerName?: string\n /**\n * One-line, human/LLM-readable summary of what this worker does.\n * Surfaces in `engine::workers::list` / `engine::workers::info`.\n */\n workerDescription?: string\n /** Enable worker metrics via OpenTelemetry. Defaults to `true`. */\n enableMetricsReporting?: boolean\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 /**\n * OpenTelemetry configuration. OTel is initialized automatically by default.\n * Set `{ enabled: false }` or env `OTEL_ENABLED=false/0/no/off` to disable.\n * The `engineWsUrl` is set automatically from the III address.\n */\n otel?: Omit<OtelConfig, 'engineWsUrl'>\n /** Custom HTTP headers sent during the WebSocket handshake. */\n headers?: Record<string, string>\n /** @internal */\n telemetry?: TelemetryOptions\n}\n\nclass Sdk implements IIIClient {\n private ws?: WebSocket\n private functions = new Map<string, RemoteFunctionData>()\n private invocations = new Map<string, Invocation & { timeout?: NodeJS.Timeout }>()\n private triggers = new Map<string, RegisterTriggerMessage>()\n private triggerTypes = new Map<string, RemoteTriggerTypeData>()\n private messagesToSend: Record<string, unknown>[] = []\n private workerName: string\n private workerDescription?: string\n private workerId?: string\n private reconnectTimeout?: NodeJS.Timeout\n private metricsReportingEnabled: boolean\n private invocationTimeoutMs: number\n private reconnectionConfig: IIIReconnectionConfig\n private reconnectAttempt = 0\n private connectionState: IIIConnectionState = 'disconnected'\n private isShuttingDown = false\n\n constructor(\n private readonly address: string,\n private readonly options?: InitOptions,\n ) {\n this.workerName = options?.workerName ?? getDefaultWorkerName()\n this.workerDescription = options?.workerDescription\n this.metricsReportingEnabled = options?.enableMetricsReporting ?? true\n this.invocationTimeoutMs = options?.invocationTimeoutMs ?? DEFAULT_INVOCATION_TIMEOUT_MS\n this.reconnectionConfig = {\n ...DEFAULT_BRIDGE_RECONNECTION_CONFIG,\n ...options?.reconnectionConfig,\n }\n\n // Initialize OpenTelemetry (enabled by default, opt-out via config or env)\n initOtel({ ...options?.otel, engineWsUrl: this.address })\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 * worker.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, metadata?: Record<string, unknown>) => {\n return this.registerTrigger({\n type: triggerType.id,\n function_id: functionId,\n config,\n metadata,\n })\n },\n registerFunction: (functionId, handler, config, metadata?) => {\n const ref = this.registerFunction(functionId, handler)\n this.registerTrigger({\n type: triggerType.id,\n function_id: functionId,\n config,\n metadata,\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 = worker.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 = worker.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 | HttpInvocationConfig,\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 isHandler = typeof handlerOrInvocation === 'function'\n\n const fullMessage: RegisterFunctionMessage = isHandler\n ? { ...options, id: functionId, message_type: MessageType.RegisterFunction }\n : {\n ...options,\n id: functionId,\n message_type: MessageType.RegisterFunction,\n invocation: {\n url: handlerOrInvocation.url,\n method: handlerOrInvocation.method ?? 'POST',\n timeout_ms: handlerOrInvocation.timeout_ms,\n headers: handlerOrInvocation.headers,\n auth: handlerOrInvocation.auth,\n },\n }\n\n this.sendMessage(MessageType.RegisterFunction, fullMessage, true)\n\n if (isHandler) {\n const handler = handlerOrInvocation as RemoteFunctionHandler\n this.functions.set(functionId, {\n message: fullMessage,\n handler: async (input, traceparent?: string, baggage?: string) => {\n const tracePayloads = !(\n process.env.III_DISABLE_TRACE_PAYLOADS === '1' ||\n process.env.III_DISABLE_TRACE_PAYLOADS?.toLowerCase() === 'true'\n )\n const payloadMaxBytes = resolveMaxBytesFromEnv()\n\n const runHandler = async () => {\n if (tracePayloads) {\n const { json, truncated } = redactAndTruncate(input, payloadMaxBytes)\n recordSpanEvent('iii.invocation.input', {\n 'iii.payload.json': json,\n 'iii.payload.truncated': truncated,\n })\n }\n try {\n const result = await handler(input)\n if (tracePayloads) {\n const { json, truncated } = redactAndTruncate(result, payloadMaxBytes)\n recordSpanEvent('iii.invocation.output', {\n 'iii.payload.json': json,\n 'iii.payload.truncated': truncated,\n 'iii.payload.ok': true,\n })\n }\n return result\n } catch (err) {\n if (tracePayloads) {\n const errMsg = err instanceof Error ? err.message : String(err)\n const { json, truncated } = redactAndTruncate(\n { error: errMsg },\n payloadMaxBytes,\n )\n recordSpanEvent('iii.invocation.output', {\n 'iii.payload.json': json,\n 'iii.payload.truncated': truncated,\n 'iii.payload.ok': false,\n })\n }\n throw err\n }\n }\n\n if (getTracer()) {\n const parentContext = extractContext(traceparent, baggage)\n\n // INTERNAL and named `execute` (not `call`/`trigger`): the engine\n // already emits the SERVER `call <fn>` span for this hop AND a\n // `trigger <fn>` span from fire_triggers. Reusing either name would\n // duplicate an engine span under the worker's service. `execute` is\n // unique, so the worker handler span reads as a clean internal child\n // of the engine's call span (and is collapsible by a single rule).\n return context.with(parentContext, () =>\n withSpan(`execute ${functionId}`, { kind: SpanKind.INTERNAL }, async () => await runHandler()),\n )\n }\n\n const traceId = crypto.randomUUID().replace(/-/g, '')\n const spanId = crypto.randomUUID().replace(/-/g, '').slice(0, 16)\n const syntheticSpan = trace.wrapSpanContext({ traceId, spanId, traceFlags: 1 })\n\n return context.with(trace.setSpan(context.active(), syntheticSpan), async () => await runHandler())\n },\n })\n } else {\n this.functions.set(functionId, { message: fullMessage })\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-sdk/helpers` submodule. Not part of the public `IIIClient` 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-sdk'\n *\n * // Synchronous\n * const result = await worker.trigger({ function_id: 'get-order', payload: { id: '123' } })\n *\n * // Enqueue\n * const { messageReceiptId } = await worker.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 * worker.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 // Void is fire-and-forget, no invocation_id, no response\n if (action?.type === 'void') {\n const traceparent = injectTraceparent()\n const baggage = injectBaggage()\n this.sendMessage(MessageType.InvokeFunction, {\n function_id,\n data: payload,\n traceparent,\n baggage,\n action,\n })\n return undefined as TOutput\n }\n\n // Enqueue and default: send invocation_id, await response\n const invocation_id = crypto.randomUUID()\n const traceparent = injectTraceparent()\n const baggage = injectBaggage()\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(\n new InvocationError({\n code: 'TIMEOUT',\n message: `invocation timed out after ${effectiveTimeout}ms`,\n function_id,\n }),\n )\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 function_id,\n timeout,\n })\n\n this.sendMessage(MessageType.InvokeFunction, {\n invocation_id,\n function_id,\n data: payload,\n traceparent,\n baggage,\n action,\n })\n })\n }\n\n private registerWorkerMetadata(): void {\n const telemetryOpts = this.options?.telemetry\n const language =\n telemetryOpts?.language ?? Intl.DateTimeFormat().resolvedOptions().locale ?? process.env.LANG?.split('.')[0]\n\n this.trigger({\n function_id: EngineFunctions.REGISTER_WORKER,\n payload: {\n runtime: 'node',\n version: SDK_VERSION,\n name: this.workerName,\n description: this.workerDescription,\n os: getOsInfo(),\n pid: process.pid,\n isolation: process.env.III_ISOLATION || null,\n telemetry: {\n language,\n project_name: telemetryOpts?.project_name ?? detectProjectName(),\n framework: telemetryOpts?.framework?.trim() || 'iii-node',\n amplitude_api_key: telemetryOpts?.amplitude_api_key,\n },\n },\n action: { type: 'void' },\n })\n }\n\n /**\n * @internal Implementation backing the `createStream` helper in the\n * `iii-sdk/helpers` submodule. Not part of the public `IIIClient` surface.\n *\n * Registers a custom stream implementation, overriding the engine default\n * for the given stream name. Registers 5 of the 6 `IStream` methods\n * (`get`, `set`, `delete`, `list`, `listGroups`). The `update` method is\n * not registered -- atomic updates are handled by the engine's built-in\n * stream update logic.\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 iii, cleaning up all resources.\n */\n shutdown = async (): Promise<void> => {\n this.isShuttingDown = true\n\n this.stopMetricsReporting()\n\n // Shutdown OpenTelemetry\n await shutdownOtel()\n\n // Clear reconnection timeout\n this.clearReconnectTimeout()\n\n // Reject all pending invocations\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 // Close WebSocket. Swallow any close-time errors (most commonly\n // \"WebSocket was closed before the connection was established\",\n // emitted when `close()` fires while still in CONNECTING state\n // and there's no error listener). Without a catch-all listener,\n // that event becomes an unhandled exception because we remove\n // every listener right above the close call.\n if (this.ws) {\n this.ws.removeAllListeners()\n this.ws.on('error', () => {})\n try {\n this.ws.close()\n } catch {\n // ignore, shutting down anyway\n }\n this.ws = undefined\n }\n\n this.setConnectionState('disconnected')\n }\n\n // private methods\n\n private setConnectionState(state: IIIConnectionState): void {\n if (this.connectionState !== state) {\n this.connectionState = state\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, { headers: this.options?.headers })\n this.ws.on('open', this.onSocketOpen.bind(this))\n this.ws.on('close', this.onSocketClose.bind(this))\n this.ws.on('error', 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 this.logError(`Max reconnection retries (${maxRetries}) reached, giving up`)\n return\n }\n\n if (this.reconnectTimeout) {\n return // Already scheduled\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(error: Error): void {\n this.logError('WebSocket error', error)\n }\n\n private startMetricsReporting(): void {\n if (!this.metricsReportingEnabled || !this.workerId) {\n return\n }\n\n const meter = getMeter()\n if (!meter) {\n console.warn(\n '[iii] Worker metrics disabled: OpenTelemetry not initialized. Call initOtel() with metricsEnabled: true before creating the iii.',\n )\n return\n }\n\n registerWorkerGauges(meter, {\n workerId: this.workerId,\n workerName: this.workerName,\n })\n }\n\n private stopMetricsReporting(): void {\n stopWorkerGauges()\n }\n\n private onSocketClose(): void {\n this.ws?.removeAllListeners()\n this.ws?.terminate()\n this.ws = undefined\n\n this.setConnectionState('disconnected')\n this.stopMetricsReporting()\n this.scheduleReconnect()\n }\n\n private onSocketOpen(): void {\n this.clearReconnectTimeout()\n this.reconnectAttempt = 0\n this.setConnectionState('connected')\n\n this.ws?.on('message', this.onMessage.bind(this))\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 // Optimized: swap with empty array instead of splice\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 this.registerWorkerMetadata()\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, (err) => {\n if (err) {\n this.logError('Failed to send message', err)\n }\n })\n } catch (error) {\n this.logError('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 logError(message: string, error?: unknown): void {\n const otelLogger = getLogger()\n const errorMessage = error instanceof Error ? error.message : String(error ?? '')\n\n if (otelLogger) {\n otelLogger.emit({\n severityNumber: SeverityNumber.ERROR,\n body: `[iii] ${message}${errorMessage ? `: ${errorMessage}` : ''}`,\n })\n } else {\n console.error(`[iii] ${message}`, error ?? '')\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 if (error) {\n invocation.reject(this.toInvocationError(error, invocation.function_id))\n } else {\n invocation.resolve(result)\n }\n }\n\n this.invocations.delete(invocation_id)\n }\n\n /**\n * Wrap a wire-format `ErrorBody` in {@link InvocationError} so callers get\n * a real `Error` with a readable `.message` and a typed `.code`. Pass-through\n * for values that are already `Error` subclasses. Everything else is wrapped\n * under an `UNKNOWN` code so `String(err) !== '[object Object]'` holds for\n * every rejection path.\n */\n private toInvocationError(error: unknown, function_id?: string): Error {\n if (error instanceof Error) {\n return error\n }\n if (isErrorBody(error)) {\n return new InvocationError({\n code: error.code,\n message: error.message,\n function_id,\n stacktrace: error.stacktrace,\n })\n }\n // JSON.stringify(undefined) returns undefined (not \"undefined\"), which\n // would set message to the literal string \"undefined\" after type coercion\n // and leak an uninformative rejection. Fall back through String(error)\n // so every path produces a concrete, readable string.\n const message =\n typeof error === 'string'\n ? error\n : (JSON.stringify(error) ?? String(error))\n return new InvocationError({\n code: 'UNKNOWN',\n message,\n function_id,\n })\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 const getResponseTraceparent = () => injectTraceparent() ?? traceparent\n const getResponseBaggage = () => injectBaggage() ?? baggage\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 this.logError(`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: getResponseTraceparent(),\n baggage: getResponseBaggage(),\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: getResponseTraceparent(),\n baggage: getResponseBaggage(),\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; metadata?: Record<string, unknown> }) {\n const { trigger_type, id, function_id, config, metadata } = message\n const triggerTypeData = this.triggerTypes.get(trigger_type)\n\n if (triggerTypeData) {\n try {\n await triggerTypeData.handler.registerTrigger({ id, function_id, config, metadata })\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 metadata?: Record<string, 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, metadata } = message\n try {\n await triggerTypeData.handler.unregisterTrigger({ id, function_id, config, metadata })\n } catch (error) {\n this.logError(`Error unregistering trigger ${id}`, error)\n }\n }\n\n private onTriggerRegistrationResult(\n message: { id: string; trigger_type?: string; type?: string; function_id: string; error?: { code: string; message: string; stacktrace?: string } },\n ): void {\n if (!message.error) return\n const triggerType = message.trigger_type ?? message.type ?? ''\n console.error(\n `[iii] Trigger registration failed for \"${message.id}\" (${triggerType}): ${message.error.message}`,\n )\n }\n\n private onMessage(socketMessage: Data): void {\n let msgType: MessageType\n let message: Record<string, unknown>\n\n try {\n const parsed = JSON.parse(socketMessage.toString()) as Record<string, unknown>\n msgType = parsed.type as MessageType\n const { type: _, ...rest } = parsed\n message = rest\n } catch (error) {\n this.logError('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; metadata?: Record<string, unknown> })\n } else if (msgType === MessageType.UnregisterTrigger) {\n this.onUnregisterTrigger(\n message as {\n trigger_type?: string\n id: string\n function_id?: string\n config?: unknown\n metadata?: Record<string, unknown>\n },\n )\n } else if (msgType === MessageType.TriggerRegistrationResult) {\n this.onTriggerRegistrationResult(\n message as { id: string; trigger_type?: string; type?: string; function_id: string; error?: { code: string; message: string; stacktrace?: string } },\n )\n } else if (msgType === MessageType.WorkerRegistered) {\n const { worker_id } = message as WorkerRegisteredMessage\n this.workerId = worker_id\n console.debug('[iii] Worker registered with ID:', worker_id)\n this.startMetricsReporting()\n }\n }\n}\n\n/**\n * Factory object that constructs routing actions for {@link IIIClient.trigger}.\n *\n * @example\n * ```typescript\n * import { TriggerAction } from 'iii-sdk'\n *\n * // Enqueue to a named queue\n * worker.trigger({\n * function_id: 'process',\n * payload: { data: 'hello' },\n * action: TriggerAction.Enqueue({ queue: 'jobs' }),\n * })\n *\n * // Fire-and-forget\n * worker.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:49134`).\n * @param options - Optional {@link InitOptions} for worker name, timeouts, reconnection, and OTel.\n * @returns A connected {@link IIIClient} instance.\n *\n * @example\n * ```typescript\n * import { registerWorker } from 'iii-sdk'\n *\n * const worker = registerWorker(process.env.III_URL ?? 'ws://localhost:49134', {\n * workerName: 'my-worker',\n * })\n * ```\n */\nexport const registerWorker = (address: string, options?: InitOptions): IIIClient => new Sdk(address, options)\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","names":[],"sources":["../src/iii.ts"],"sourcesContent":["import { context, trace } from '@opentelemetry/api'\nimport { createRequire } from 'node:module'\nimport * as os from 'node:os'\nimport { type Data, WebSocket } from 'ws'\nimport { ChannelReader, ChannelWriter } from './channels'\nimport { InvocationError, isErrorBody } from './errors'\nimport {\n DEFAULT_BRIDGE_RECONNECTION_CONFIG,\n DEFAULT_INVOCATION_TIMEOUT_MS,\n EngineFunctions,\n type IIIConnectionState,\n type IIIReconnectionConfig,\n} from './iii-constants'\nimport type { HttpInvocationConfig } from '@iii-dev/helpers/http'\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 type WorkerRegisteredMessage,\n} from './iii-types'\nimport { registerWorkerGauges, stopWorkerGauges } from '@iii-dev/helpers/observability'\nimport { getMeter, getTracer } from '@iii-dev/helpers/observability/internal'\nimport { SpanKind } from '@opentelemetry/api'\nimport type { IStream } from './stream'\nimport { detectProjectName } from './utils'\nimport {\n extractContext,\n getLogger,\n initOtel,\n injectBaggage,\n injectTraceparent,\n type OtelConfig,\n recordSpanEvent,\n redactAndTruncate,\n resolveMaxBytesFromEnv,\n SeverityNumber,\n shutdownOtel,\n withSpan,\n} from '@iii-dev/helpers/observability'\nimport type { TriggerHandler } from './triggers'\nimport type {\n FunctionRef,\n IIIClient,\n Invocation,\n RegisterFunctionOptions,\n RemoteFunctionData,\n RemoteFunctionHandler,\n RemoteTriggerTypeData,\n Trigger,\n TriggerTypeRef,\n} from './types'\nimport { isChannelRef } from './utils'\n\nconst require = createRequire(import.meta.url)\nconst { version: SDK_VERSION } = require('../package.json')\n\nfunction getOsInfo(): string {\n return `${os.platform()} ${os.release()} (${os.arch()})`\n}\n\nfunction getDefaultWorkerName(): string {\n return `${os.hostname()}:${process.pid}`\n}\n\n/** Worker labels reported to the engine (language, framework, project). */\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 worker = registerWorker('ws://localhost:49134', {\n * workerName: 'my-worker',\n * invocationTimeoutMs: 10000,\n * reconnectionConfig: { maxRetries: 5 },\n * })\n * ```\n */\nexport type InitOptions = {\n /** Display name for this worker. Defaults to `hostname:pid`. */\n workerName?: string\n /**\n * One-line, human/LLM-readable summary of what this worker does.\n * Surfaces in `engine::workers::list` / `engine::workers::info`.\n */\n workerDescription?: string\n /** Enable worker metrics via OpenTelemetry. Defaults to `true`. */\n enableMetricsReporting?: boolean\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 /**\n * OpenTelemetry configuration. OTel is initialized automatically by default.\n * Set `{ enabled: false }` or env `OTEL_ENABLED=false/0/no/off` to disable.\n * The `engineWsUrl` is set automatically from the III address.\n */\n otel?: Omit<OtelConfig, 'engineWsUrl'>\n /** Custom HTTP headers sent during the WebSocket handshake. */\n headers?: Record<string, string>\n /** @internal */\n telemetry?: TelemetryOptions\n}\n\nclass Sdk implements IIIClient {\n private ws?: WebSocket\n private functions = new Map<string, RemoteFunctionData>()\n private invocations = new Map<string, Invocation & { timeout?: NodeJS.Timeout }>()\n private triggers = new Map<string, RegisterTriggerMessage>()\n private triggerTypes = new Map<string, RemoteTriggerTypeData>()\n private messagesToSend: Record<string, unknown>[] = []\n private workerName: string\n private workerDescription?: string\n private workerId?: string\n private reconnectTimeout?: NodeJS.Timeout\n private metricsReportingEnabled: boolean\n private invocationTimeoutMs: number\n private reconnectionConfig: IIIReconnectionConfig\n private reconnectAttempt = 0\n private connectionState: IIIConnectionState = 'disconnected'\n private isShuttingDown = false\n\n constructor(\n private readonly address: string,\n private readonly options?: InitOptions,\n ) {\n this.workerName = options?.workerName ?? getDefaultWorkerName()\n this.workerDescription = options?.workerDescription\n this.metricsReportingEnabled = options?.enableMetricsReporting ?? true\n this.invocationTimeoutMs = options?.invocationTimeoutMs ?? DEFAULT_INVOCATION_TIMEOUT_MS\n this.reconnectionConfig = {\n ...DEFAULT_BRIDGE_RECONNECTION_CONFIG,\n ...options?.reconnectionConfig,\n }\n\n // Initialize OpenTelemetry (enabled by default, opt-out via config or env)\n initOtel({ ...options?.otel, engineWsUrl: this.address })\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 * worker.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, metadata?: Record<string, unknown>) => {\n return this.registerTrigger({\n type: triggerType.id,\n function_id: functionId,\n config,\n metadata,\n })\n },\n registerFunction: (functionId, handler, config, metadata?) => {\n const ref = this.registerFunction(functionId, handler)\n this.registerTrigger({\n type: triggerType.id,\n function_id: functionId,\n config,\n metadata,\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 = worker.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 = worker.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 | HttpInvocationConfig,\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 isHandler = typeof handlerOrInvocation === 'function'\n\n const fullMessage: RegisterFunctionMessage = isHandler\n ? { ...options, id: functionId, message_type: MessageType.RegisterFunction }\n : {\n ...options,\n id: functionId,\n message_type: MessageType.RegisterFunction,\n invocation: {\n url: handlerOrInvocation.url,\n method: handlerOrInvocation.method ?? 'POST',\n timeout_ms: handlerOrInvocation.timeout_ms,\n headers: handlerOrInvocation.headers,\n auth: handlerOrInvocation.auth,\n },\n }\n\n this.sendMessage(MessageType.RegisterFunction, fullMessage, true)\n\n if (isHandler) {\n const handler = handlerOrInvocation as RemoteFunctionHandler\n this.functions.set(functionId, {\n message: fullMessage,\n handler: async (input, metadata?: unknown, traceparent?: string, baggage?: string) => {\n const tracePayloads = !(\n process.env.III_DISABLE_TRACE_PAYLOADS === '1' ||\n process.env.III_DISABLE_TRACE_PAYLOADS?.toLowerCase() === 'true'\n )\n const payloadMaxBytes = resolveMaxBytesFromEnv()\n\n const runHandler = async () => {\n if (tracePayloads) {\n const { json, truncated } = redactAndTruncate(input, payloadMaxBytes)\n recordSpanEvent('iii.invocation.input', {\n 'iii.payload.json': json,\n 'iii.payload.truncated': truncated,\n })\n }\n try {\n const result = await handler(input, metadata)\n if (tracePayloads) {\n const { json, truncated } = redactAndTruncate(result, payloadMaxBytes)\n recordSpanEvent('iii.invocation.output', {\n 'iii.payload.json': json,\n 'iii.payload.truncated': truncated,\n 'iii.payload.ok': true,\n })\n }\n return result\n } catch (err) {\n if (tracePayloads) {\n const errMsg = err instanceof Error ? err.message : String(err)\n const { json, truncated } = redactAndTruncate(\n { error: errMsg },\n payloadMaxBytes,\n )\n recordSpanEvent('iii.invocation.output', {\n 'iii.payload.json': json,\n 'iii.payload.truncated': truncated,\n 'iii.payload.ok': false,\n })\n }\n throw err\n }\n }\n\n if (getTracer()) {\n const parentContext = extractContext(traceparent, baggage)\n\n // INTERNAL and named `execute` (not `call`/`trigger`): the engine\n // already emits the SERVER `call <fn>` span for this hop AND a\n // `trigger <fn>` span from fire_triggers. Reusing either name would\n // duplicate an engine span under the worker's service. `execute` is\n // unique, so the worker handler span reads as a clean internal child\n // of the engine's call span (and is collapsible by a single rule).\n return context.with(parentContext, () =>\n withSpan(`execute ${functionId}`, { kind: SpanKind.INTERNAL }, async () => await runHandler()),\n )\n }\n\n const traceId = crypto.randomUUID().replace(/-/g, '')\n const spanId = crypto.randomUUID().replace(/-/g, '').slice(0, 16)\n const syntheticSpan = trace.wrapSpanContext({ traceId, spanId, traceFlags: 1 })\n\n return context.with(trace.setSpan(context.active(), syntheticSpan), async () => await runHandler())\n },\n })\n } else {\n this.functions.set(functionId, { message: fullMessage })\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-sdk/helpers` submodule. Not part of the public `IIIClient` 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 * @param request.metadata - Optional per-invocation metadata (arbitrary JSON)\n * surfaced to the target handler as its second argument.\n * @returns The result of the function invocation.\n *\n * @example\n * ```typescript\n * import { TriggerAction } from 'iii-sdk'\n *\n * // Synchronous\n * const result = await worker.trigger({ function_id: 'get-order', payload: { id: '123' } })\n *\n * // Enqueue\n * const { messageReceiptId } = await worker.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 * worker.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, metadata } = request\n const effectiveTimeout = timeoutMs ?? this.invocationTimeoutMs\n\n // Void is fire-and-forget, no invocation_id, no response\n if (action?.type === 'void') {\n const traceparent = injectTraceparent()\n const baggage = injectBaggage()\n this.sendMessage(MessageType.InvokeFunction, {\n function_id,\n data: payload,\n traceparent,\n baggage,\n action,\n metadata,\n })\n return undefined as TOutput\n }\n\n // Enqueue and default: send invocation_id, await response\n const invocation_id = crypto.randomUUID()\n const traceparent = injectTraceparent()\n const baggage = injectBaggage()\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(\n new InvocationError({\n code: 'TIMEOUT',\n message: `invocation timed out after ${effectiveTimeout}ms`,\n function_id,\n }),\n )\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 function_id,\n timeout,\n })\n\n this.sendMessage(MessageType.InvokeFunction, {\n invocation_id,\n function_id,\n data: payload,\n traceparent,\n baggage,\n action,\n metadata,\n })\n })\n }\n\n private registerWorkerMetadata(): void {\n const telemetryOpts = this.options?.telemetry\n const language =\n telemetryOpts?.language ?? Intl.DateTimeFormat().resolvedOptions().locale ?? process.env.LANG?.split('.')[0]\n\n this.trigger({\n function_id: EngineFunctions.REGISTER_WORKER,\n payload: {\n runtime: 'node',\n version: SDK_VERSION,\n name: this.workerName,\n description: this.workerDescription,\n os: getOsInfo(),\n pid: process.pid,\n isolation: process.env.III_ISOLATION || null,\n telemetry: {\n language,\n project_name: telemetryOpts?.project_name ?? detectProjectName(),\n framework: telemetryOpts?.framework?.trim() || 'iii-node',\n amplitude_api_key: telemetryOpts?.amplitude_api_key,\n },\n },\n action: { type: 'void' },\n })\n }\n\n /**\n * @internal Implementation backing the `createStream` helper in the\n * `iii-sdk/helpers` submodule. Not part of the public `IIIClient` surface.\n *\n * Registers a custom stream implementation, overriding the engine default\n * for the given stream name. Registers 5 of the 6 `IStream` methods\n * (`get`, `set`, `delete`, `list`, `listGroups`). The `update` method is\n * not registered -- atomic updates are handled by the engine's built-in\n * stream update logic.\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 iii, cleaning up all resources.\n */\n shutdown = async (): Promise<void> => {\n this.isShuttingDown = true\n\n this.stopMetricsReporting()\n\n // Shutdown OpenTelemetry\n await shutdownOtel()\n\n // Clear reconnection timeout\n this.clearReconnectTimeout()\n\n // Reject all pending invocations\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 // Close WebSocket. Swallow any close-time errors (most commonly\n // \"WebSocket was closed before the connection was established\",\n // emitted when `close()` fires while still in CONNECTING state\n // and there's no error listener). Without a catch-all listener,\n // that event becomes an unhandled exception because we remove\n // every listener right above the close call.\n if (this.ws) {\n this.ws.removeAllListeners()\n this.ws.on('error', () => {})\n try {\n this.ws.close()\n } catch {\n // ignore, shutting down anyway\n }\n this.ws = undefined\n }\n\n this.setConnectionState('disconnected')\n }\n\n // private methods\n\n private setConnectionState(state: IIIConnectionState): void {\n if (this.connectionState !== state) {\n this.connectionState = state\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, { headers: this.options?.headers })\n this.ws.on('open', this.onSocketOpen.bind(this))\n this.ws.on('close', this.onSocketClose.bind(this))\n this.ws.on('error', 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 this.logError(`Max reconnection retries (${maxRetries}) reached, giving up`)\n return\n }\n\n if (this.reconnectTimeout) {\n return // Already scheduled\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(error: Error): void {\n this.logError('WebSocket error', error)\n }\n\n private startMetricsReporting(): void {\n if (!this.metricsReportingEnabled || !this.workerId) {\n return\n }\n\n const meter = getMeter()\n if (!meter) {\n console.warn(\n '[iii] Worker metrics disabled: OpenTelemetry not initialized. Call initOtel() with metricsEnabled: true before creating the iii.',\n )\n return\n }\n\n registerWorkerGauges(meter, {\n workerId: this.workerId,\n workerName: this.workerName,\n })\n }\n\n private stopMetricsReporting(): void {\n stopWorkerGauges()\n }\n\n private onSocketClose(): void {\n this.ws?.removeAllListeners()\n this.ws?.terminate()\n this.ws = undefined\n\n this.setConnectionState('disconnected')\n this.stopMetricsReporting()\n this.scheduleReconnect()\n }\n\n private onSocketOpen(): void {\n this.clearReconnectTimeout()\n this.reconnectAttempt = 0\n this.setConnectionState('connected')\n\n this.ws?.on('message', this.onMessage.bind(this))\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 // Optimized: swap with empty array instead of splice\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 this.registerWorkerMetadata()\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, (err) => {\n if (err) {\n this.logError('Failed to send message', err)\n }\n })\n } catch (error) {\n this.logError('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 logError(message: string, error?: unknown): void {\n const otelLogger = getLogger()\n const errorMessage = error instanceof Error ? error.message : String(error ?? '')\n\n if (otelLogger) {\n otelLogger.emit({\n severityNumber: SeverityNumber.ERROR,\n body: `[iii] ${message}${errorMessage ? `: ${errorMessage}` : ''}`,\n })\n } else {\n console.error(`[iii] ${message}`, error ?? '')\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 if (error) {\n invocation.reject(this.toInvocationError(error, invocation.function_id))\n } else {\n invocation.resolve(result)\n }\n }\n\n this.invocations.delete(invocation_id)\n }\n\n /**\n * Wrap a wire-format `ErrorBody` in {@link InvocationError} so callers get\n * a real `Error` with a readable `.message` and a typed `.code`. Pass-through\n * for values that are already `Error` subclasses. Everything else is wrapped\n * under an `UNKNOWN` code so `String(err) !== '[object Object]'` holds for\n * every rejection path.\n */\n private toInvocationError(error: unknown, function_id?: string): Error {\n if (error instanceof Error) {\n return error\n }\n if (isErrorBody(error)) {\n return new InvocationError({\n code: error.code,\n message: error.message,\n function_id,\n stacktrace: error.stacktrace,\n })\n }\n // JSON.stringify(undefined) returns undefined (not \"undefined\"), which\n // would set message to the literal string \"undefined\" after type coercion\n // and leak an uninformative rejection. Fall back through String(error)\n // so every path produces a concrete, readable string.\n const message =\n typeof error === 'string'\n ? error\n : (JSON.stringify(error) ?? String(error))\n return new InvocationError({\n code: 'UNKNOWN',\n message,\n function_id,\n })\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 metadata?: unknown,\n traceparent?: string,\n baggage?: string,\n ): Promise<unknown> {\n const fn = this.functions.get(function_id)\n const getResponseTraceparent = () => injectTraceparent() ?? traceparent\n const getResponseBaggage = () => injectBaggage() ?? baggage\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, metadata, traceparent, baggage)\n } catch (error) {\n this.logError(`Error invoking function ${function_id}`, error)\n }\n return\n }\n\n try {\n const result = await fn.handler(resolvedInput, metadata, traceparent, baggage)\n this.sendMessage(MessageType.InvocationResult, {\n invocation_id,\n function_id,\n result,\n traceparent: getResponseTraceparent(),\n baggage: getResponseBaggage(),\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: getResponseTraceparent(),\n baggage: getResponseBaggage(),\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; metadata?: Record<string, unknown> }) {\n const { trigger_type, id, function_id, config, metadata } = message\n const triggerTypeData = this.triggerTypes.get(trigger_type)\n\n if (triggerTypeData) {\n try {\n await triggerTypeData.handler.registerTrigger({ id, function_id, config, metadata })\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 metadata?: Record<string, 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, metadata } = message\n try {\n await triggerTypeData.handler.unregisterTrigger({ id, function_id, config, metadata })\n } catch (error) {\n this.logError(`Error unregistering trigger ${id}`, error)\n }\n }\n\n private onTriggerRegistrationResult(\n message: { id: string; trigger_type?: string; type?: string; function_id: string; error?: { code: string; message: string; stacktrace?: string } },\n ): void {\n if (!message.error) return\n const triggerType = message.trigger_type ?? message.type ?? ''\n console.error(\n `[iii] Trigger registration failed for \"${message.id}\" (${triggerType}): ${message.error.message}`,\n )\n }\n\n private onMessage(socketMessage: Data): void {\n let msgType: MessageType\n let message: Record<string, unknown>\n\n try {\n const parsed = JSON.parse(socketMessage.toString()) as Record<string, unknown>\n msgType = parsed.type as MessageType\n const { type: _, ...rest } = parsed\n message = rest\n } catch (error) {\n this.logError('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, metadata, traceparent, baggage } = message as InvokeFunctionMessage\n this.onInvokeFunction(invocation_id, function_id, data, metadata, traceparent, baggage)\n } else if (msgType === MessageType.RegisterTrigger) {\n this.onRegisterTrigger(message as { trigger_type: string; id: string; function_id: string; config: unknown; metadata?: Record<string, unknown> })\n } else if (msgType === MessageType.UnregisterTrigger) {\n this.onUnregisterTrigger(\n message as {\n trigger_type?: string\n id: string\n function_id?: string\n config?: unknown\n metadata?: Record<string, unknown>\n },\n )\n } else if (msgType === MessageType.TriggerRegistrationResult) {\n this.onTriggerRegistrationResult(\n message as { id: string; trigger_type?: string; type?: string; function_id: string; error?: { code: string; message: string; stacktrace?: string } },\n )\n } else if (msgType === MessageType.WorkerRegistered) {\n const { worker_id } = message as WorkerRegisteredMessage\n this.workerId = worker_id\n console.debug('[iii] Worker registered with ID:', worker_id)\n this.startMetricsReporting()\n }\n }\n}\n\n/**\n * Factory object that constructs routing actions for {@link IIIClient.trigger}.\n *\n * @example\n * ```typescript\n * import { TriggerAction } from 'iii-sdk'\n *\n * // Enqueue to a named queue\n * worker.trigger({\n * function_id: 'process',\n * payload: { data: 'hello' },\n * action: TriggerAction.Enqueue({ queue: 'jobs' }),\n * })\n *\n * // Fire-and-forget\n * worker.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:49134`).\n * @param options - Optional {@link InitOptions} for worker name, timeouts, reconnection, and OTel.\n * @returns A connected {@link IIIClient} instance.\n *\n * @example\n * ```typescript\n * import { registerWorker } from 'iii-sdk'\n *\n * const worker = registerWorker(process.env.III_URL ?? 'ws://localhost:49134', {\n * workerName: 'my-worker',\n * })\n * ```\n */\nexport const registerWorker = (address: string, options?: InitOptions): IIIClient => new Sdk(address, options)\n"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import { i as InternalHttpRequest } from "./types-pzKubHk_.cjs";
1
+ import { i as InternalHttpRequest } from "./types-BZoO05vA.cjs";
2
2
  export { type InternalHttpRequest };
@@ -1,2 +1,2 @@
1
- import { i as InternalHttpRequest } from "./types-ChnmRit-.mjs";
1
+ import { i as InternalHttpRequest } from "./types-BlFE8MZG.mjs";
2
2
  export { type InternalHttpRequest };
@@ -1,2 +1,2 @@
1
- import { C as RegisterFunctionFormat, E as RegisterTriggerTypeMessage, O as TriggerRequest, T as RegisterTriggerMessage, a as RegisterFunctionInput, b as ErrorBody, c as RegisterTriggerTypeInput, o as RegisterFunctionOptions, s as RegisterTriggerInput, w as RegisterFunctionMessage, x as MessageType } from "./types-pzKubHk_.cjs";
1
+ import { C as RegisterFunctionFormat, E as RegisterTriggerTypeMessage, O as TriggerRequest, T as RegisterTriggerMessage, a as RegisterFunctionInput, b as ErrorBody, c as RegisterTriggerTypeInput, o as RegisterFunctionOptions, s as RegisterTriggerInput, w as RegisterFunctionMessage, x as MessageType } from "./types-BZoO05vA.cjs";
2
2
  export { type ErrorBody, MessageType, type RegisterFunctionFormat, type RegisterFunctionInput, type RegisterFunctionMessage, type RegisterFunctionOptions, type RegisterTriggerInput, type RegisterTriggerMessage, type RegisterTriggerTypeInput, type RegisterTriggerTypeMessage, type TriggerRequest };
@@ -1,2 +1,2 @@
1
- import { C as RegisterFunctionFormat, E as RegisterTriggerTypeMessage, O as TriggerRequest, T as RegisterTriggerMessage, a as RegisterFunctionInput, b as ErrorBody, c as RegisterTriggerTypeInput, o as RegisterFunctionOptions, s as RegisterTriggerInput, w as RegisterFunctionMessage, x as MessageType } from "./types-ChnmRit-.mjs";
1
+ import { C as RegisterFunctionFormat, E as RegisterTriggerTypeMessage, O as TriggerRequest, T as RegisterTriggerMessage, a as RegisterFunctionInput, b as ErrorBody, c as RegisterTriggerTypeInput, o as RegisterFunctionOptions, s as RegisterTriggerInput, w as RegisterFunctionMessage, x as MessageType } from "./types-BlFE8MZG.mjs";
2
2
  export { type ErrorBody, MessageType, type RegisterFunctionFormat, type RegisterFunctionInput, type RegisterFunctionMessage, type RegisterFunctionOptions, type RegisterTriggerInput, type RegisterTriggerMessage, type RegisterTriggerTypeInput, type RegisterTriggerTypeMessage, type TriggerRequest };
@@ -1,3 +1,3 @@
1
- import { n as FunctionRef, p as TriggerTypeRef } from "./types-pzKubHk_.cjs";
1
+ import { n as FunctionRef, p as TriggerTypeRef } from "./types-BZoO05vA.cjs";
2
2
  import { r as IIIConnectionState } from "./iii-constants-BqXp8xSN.cjs";
3
3
  export { type FunctionRef, type IIIConnectionState, type TriggerTypeRef };
@@ -1,3 +1,3 @@
1
- import { n as FunctionRef, p as TriggerTypeRef } from "./types-ChnmRit-.mjs";
1
+ import { n as FunctionRef, p as TriggerTypeRef } from "./types-BlFE8MZG.mjs";
2
2
  import { r as IIIConnectionState } from "./iii-constants-Baptl8nm.mjs";
3
3
  export { type FunctionRef, type IIIConnectionState, type TriggerTypeRef };
@@ -1,2 +1,2 @@
1
- import { f as Trigger, h as TriggerHandler, m as TriggerConfig } from "./types-pzKubHk_.cjs";
1
+ import { f as Trigger, h as TriggerHandler, m as TriggerConfig } from "./types-BZoO05vA.cjs";
2
2
  export { type Trigger, type TriggerConfig, type TriggerHandler };
@@ -1,2 +1,2 @@
1
- import { f as Trigger, h as TriggerHandler, m as TriggerConfig } from "./types-ChnmRit-.mjs";
1
+ import { f as Trigger, h as TriggerHandler, m as TriggerConfig } from "./types-BlFE8MZG.mjs";
2
2
  export { type Trigger, type TriggerConfig, type TriggerHandler };
@@ -117,6 +117,12 @@ type TriggerRequest<TInput = unknown> = {
117
117
  payload: TInput; /** Routing action. Omit for synchronous request/response. */
118
118
  action?: TriggerAction; /** Override the default invocation timeout in milliseconds. */
119
119
  timeoutMs?: number;
120
+ /**
121
+ * Optional per-invocation metadata (arbitrary JSON). Travels as a separate
122
+ * channel from the payload and is surfaced to the target handler as a
123
+ * dedicated argument. Omitted from the wire message when undefined.
124
+ */
125
+ metadata?: unknown;
120
126
  };
121
127
  /**
122
128
  * Serializable reference to one end of a streaming channel. Can be included
@@ -261,7 +267,13 @@ type TriggerHandler<TConfig> = {
261
267
  //#region src/types.d.ts
262
268
  /**
263
269
  * Async function handler for a registered function. Receives the invocation
264
- * payload and returns the result.
270
+ * payload and an optional per-invocation `metadata` value, and returns the
271
+ * result.
272
+ *
273
+ * `metadata` is arbitrary JSON travelling on a separate channel from the
274
+ * payload. It is `undefined` when the caller did not attach any. Existing
275
+ * single-argument handlers keep working -- the extra argument is simply
276
+ * ignored by them.
265
277
  *
266
278
  * @typeParam TInput - Type of the invocation payload.
267
279
  * @typeParam TOutput - Type of the return value.
@@ -269,10 +281,10 @@ type TriggerHandler<TConfig> = {
269
281
  * @example
270
282
  * ```typescript
271
283
  * const handler: RemoteFunctionHandler<{ name: string }, { message: string }> =
272
- * async (data) => ({ message: `Hello, ${data.name}!` })
284
+ * async (data, metadata) => ({ message: `Hello, ${data.name}!` })
273
285
  * ```
274
286
  */
275
- type RemoteFunctionHandler<TInput = any, TOutput = any> = (data: TInput) => Promise<TOutput>;
287
+ type RemoteFunctionHandler<TInput = any, TOutput = any> = (data: TInput, metadata?: unknown) => Promise<TOutput>;
276
288
  type RegisterTriggerInput = Omit<RegisterTriggerMessage, 'message_type' | 'id'>;
277
289
  type RegisterFunctionInput = Omit<RegisterFunctionMessage, 'message_type'>;
278
290
  type RegisterFunctionOptions = Omit<RegisterFunctionMessage, 'message_type' | 'id'>;
@@ -517,4 +529,4 @@ type StreamResponse = {
517
529
  type StreamRequest<TBody = unknown> = Omit<InternalHttpRequest<TBody>, 'response'>;
518
530
  //#endregion
519
531
  export { RegisterFunctionFormat as C, StreamChannelRef as D, RegisterTriggerTypeMessage as E, TriggerRequest as O, MiddlewareFunctionInput as S, RegisterTriggerMessage as T, ChannelItem as _, RegisterFunctionInput as a, ErrorBody as b, RegisterTriggerTypeInput as c, StreamResponse as d, Trigger as f, ChannelDirection as g, TriggerHandler as h, InternalHttpRequest as i, RemoteFunctionHandler as l, TriggerConfig as m, FunctionRef as n, RegisterFunctionOptions as o, TriggerTypeRef as p, IIIClient as r, RegisterTriggerInput as s, Channel as t, StreamRequest as u, ChannelReader as v, RegisterFunctionMessage as w, MessageType as x, ChannelWriter as y };
520
- //# sourceMappingURL=types-ChnmRit-.d.mts.map
532
+ //# sourceMappingURL=types-BZoO05vA.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types-BZoO05vA.d.cts","names":[],"sources":["../src/iii-types.ts","../src/channels.ts","../src/triggers.ts","../src/types.ts"],"mappings":"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"}
@@ -117,6 +117,12 @@ type TriggerRequest<TInput = unknown> = {
117
117
  payload: TInput; /** Routing action. Omit for synchronous request/response. */
118
118
  action?: TriggerAction; /** Override the default invocation timeout in milliseconds. */
119
119
  timeoutMs?: number;
120
+ /**
121
+ * Optional per-invocation metadata (arbitrary JSON). Travels as a separate
122
+ * channel from the payload and is surfaced to the target handler as a
123
+ * dedicated argument. Omitted from the wire message when undefined.
124
+ */
125
+ metadata?: unknown;
120
126
  };
121
127
  /**
122
128
  * Serializable reference to one end of a streaming channel. Can be included
@@ -261,7 +267,13 @@ type TriggerHandler<TConfig> = {
261
267
  //#region src/types.d.ts
262
268
  /**
263
269
  * Async function handler for a registered function. Receives the invocation
264
- * payload and returns the result.
270
+ * payload and an optional per-invocation `metadata` value, and returns the
271
+ * result.
272
+ *
273
+ * `metadata` is arbitrary JSON travelling on a separate channel from the
274
+ * payload. It is `undefined` when the caller did not attach any. Existing
275
+ * single-argument handlers keep working -- the extra argument is simply
276
+ * ignored by them.
265
277
  *
266
278
  * @typeParam TInput - Type of the invocation payload.
267
279
  * @typeParam TOutput - Type of the return value.
@@ -269,10 +281,10 @@ type TriggerHandler<TConfig> = {
269
281
  * @example
270
282
  * ```typescript
271
283
  * const handler: RemoteFunctionHandler<{ name: string }, { message: string }> =
272
- * async (data) => ({ message: `Hello, ${data.name}!` })
284
+ * async (data, metadata) => ({ message: `Hello, ${data.name}!` })
273
285
  * ```
274
286
  */
275
- type RemoteFunctionHandler<TInput = any, TOutput = any> = (data: TInput) => Promise<TOutput>;
287
+ type RemoteFunctionHandler<TInput = any, TOutput = any> = (data: TInput, metadata?: unknown) => Promise<TOutput>;
276
288
  type RegisterTriggerInput = Omit<RegisterTriggerMessage, 'message_type' | 'id'>;
277
289
  type RegisterFunctionInput = Omit<RegisterFunctionMessage, 'message_type'>;
278
290
  type RegisterFunctionOptions = Omit<RegisterFunctionMessage, 'message_type' | 'id'>;
@@ -517,4 +529,4 @@ type StreamResponse = {
517
529
  type StreamRequest<TBody = unknown> = Omit<InternalHttpRequest<TBody>, 'response'>;
518
530
  //#endregion
519
531
  export { RegisterFunctionFormat as C, StreamChannelRef as D, RegisterTriggerTypeMessage as E, TriggerRequest as O, MiddlewareFunctionInput as S, RegisterTriggerMessage as T, ChannelItem as _, RegisterFunctionInput as a, ErrorBody as b, RegisterTriggerTypeInput as c, StreamResponse as d, Trigger as f, ChannelDirection as g, TriggerHandler as h, InternalHttpRequest as i, RemoteFunctionHandler as l, TriggerConfig as m, FunctionRef as n, RegisterFunctionOptions as o, TriggerTypeRef as p, IIIClient as r, RegisterTriggerInput as s, Channel as t, StreamRequest as u, ChannelReader as v, RegisterFunctionMessage as w, MessageType as x, ChannelWriter as y };
520
- //# sourceMappingURL=types-pzKubHk_.d.cts.map
532
+ //# sourceMappingURL=types-BlFE8MZG.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types-BlFE8MZG.d.mts","names":[],"sources":["../src/iii-types.ts","../src/channels.ts","../src/triggers.ts","../src/types.ts"],"mappings":";;;;aAEY,WAAA;EACV,gBAAA;EACA,kBAAA;EACA,cAAA;EACA,gBAAA;EACA,mBAAA;EACA,eAAA;EACA,iBAAA;EACA,qBAAA;EACA,yBAAA;EACA,gBAAA;AAAA;AAAA,KAGU,0BAAA;EACV,YAAA,EAAc,WAAA,CAAY,mBAAA;EAC1B,EAAA;EACA,WAAA;AAAA;AAAA,KAcU,SAAA;EACV,IAAA;EACA,OAAA;EACA,UAAA;AAAA;AAAA,KAWU,sBAAA;EACV,YAAA,EAAc,WAAA,CAAY,eAAA;EAC1B,EAAA;EACA,IAAA;EACA,WAAA;EACA,MAAA;EACA,QAAA,GAAW,MAAA;AAAA;AAAA,KAGD,sBAAA;EANV;;;EAUA,IAAA;EAPW;;;EAWX,WAAA;EARgC;;;EAYhC,IAAA;EAJA;;;EAQA,UAAA,GAAa,MAAA;EAIb;;;EAAA,KAAA;EAKY;AAGd;;EAJE,QAAA;EAAA,CACC,GAAA;AAAA;AAAA,KAGS,uBAAA;EACV,YAAA,EAAc,WAAA,CAAY,gBAAA;EAqBb;;;EAjBb,EAAA;EAJc;;;EAQd,WAAA;EAIA;;;EAAA,cAAA,GAAiB,sBAAA;EAKjB;;;EADA,eAAA,GAAkB,sBAAA;EAClB,QAAA,GAAW,MAAA;EAIsB;AAUnC;;EAVE,UAAA,GAAa,oBAAA;AAAA;;;;;;AAiBf;;KAPY,aAAA;EAAkB,IAAA;EAAiB,KAAA;AAAA;EAAoB,IAAA;AAAA;;;;;;KAOvD,uBAAA;EAQD,wCANT,WAAA,UAMe;EAJf,OAAA,EAAS,MAAA,mBAYe;EAVxB,MAAA,GAAS,aAAA,EAgBa;EAdtB,OAAA,EAAS,MAAA;AAAA;;;;;;KAQC,cAAA;EAcF,oCAZR,WAAA,UAqFU;EAnFV,OAAA,EAAS,MAAA;EAET,MAAA,GAAS,aAAA,EAmFT;EAjFA,SAAA;EAqFA;;;;;EA/EA,QAAA;AAAA;;;;;KAyEU,gBAAA;ECiCc,iCD/BxB,UAAA,UChCQ;EDkCR,UAAA,UChCiB;EDkCjB,SAAA;AAAA;;;;;AArOF;;;cCOa,gBAAA;EAAA,SAGH,IAAA;EAAA,SAAA,KAAA;AAAA;AAAA,KACE,gBAAA,WAA2B,gBAAA,eAA+B,gBAAA;;;;;;;KAQ1D,WAAA;EACN,IAAA;EAAc,KAAA;AAAA;EACd,IAAA;EAAgB,KAAA,EAAO,UAAA;AAAA;AAAA,cAEhB,WAAA;EDTe,uECWL,WAAA,EDTrB;EAAA,yBCac,UAAA,KAAa,WAAA;AAAA;ADC7B;;;;;;;;;AAcA;;;;;;;;;AAdA,cCsBa,aAAA;EAAA,wBACa,UAAA;EAAA,QAChB,EAAA;EAAA,QACA,OAAA;EAAA,iBACS,eAAA;EDNA;EAAA,SCWD,MAAA,EAAQ,QAAA;EAAA,iBACP,GAAA;cAEL,YAAA,UAAsB,GAAA,EAAK,gBAAA;EAAA,QAmC/B,eAAA;ED1CR;ECkEA,WAAA,CAAY,GAAA;ED1DZ;ECkEA,KAAA,CAAA;EAAA,QAcQ,WAAA;EAAA,QAqBA,OAAA;AAAA;;;;ADrFV;;;;;;;;;;;;;cC+Ga,aAAA;EAAA,QACH,EAAA;EAAA,QACA,SAAA;EAAA,iBACS,gBAAA;EDjGjB;EAAA,SCmGgB,MAAA,EAAQ,QAAA;EAAA,iBACP,GAAA;cAEL,YAAA,UAAsB,GAAA,EAAK,gBAAA;EAAA,QAmB/B,eAAA;EDpHK;ECqJb,SAAA,CAAU,QAAA,GAAW,GAAA;EAIf,OAAA,CAAA,GAAW,OAAA,CAAQ,MAAA;EAWzB,KAAA,CAAA;AAAA;;;;;;;AD3QF;;KEIY,aAAA;EFJW,2BEMrB,EAAA,UFJA;EEMA,WAAA,UFJA;EEMA,MAAA,EAAQ,OAAA,EFJR;EEMA,QAAA,GAAW,MAAA;AAAA;;;;;AFCb;;;;;;;;;;;AAiBA;;;KEGY,cAAA;EFFV,oDEIA,eAAA,CAAgB,MAAA,EAAQ,aAAA,CAAc,OAAA,IAAW,OAAA,QFFjD;EEIA,iBAAA,CAAkB,MAAA,EAAQ,aAAA,CAAc,OAAA,IAAW,OAAA;AAAA;;;AFrCrD;;;;;;;;;;;;;;;;AAaA;;;AAbA,KG6BY,qBAAA,iCACV,IAAA,EAAM,MAAA,EACN,QAAA,eACG,OAAA,CAAQ,OAAA;AAAA,KA6CD,oBAAA,GAAuB,IAAA,CAAK,sBAAA;AAAA,KAC5B,qBAAA,GAAwB,IAAA,CAAK,uBAAA;AAAA,KAC7B,uBAAA,GAA0B,IAAA,CAAK,uBAAA;AAAA,KAC/B,wBAAA,GAA2B,IAAA,CAAK,0BAAA;AAAA,UAE3B,SAAA;EHbI;;;;;;;;;;;AAYrB;;;;;;EGmBE,eAAA,CAAgB,OAAA,EAAS,oBAAA,GAAuB,OAAA;EHGnC;;;;;;;;;;;;;;;;;;AAUf;;;;;;;;;AAOA;;;;;EGcE,gBAAA,CACE,UAAA,UACA,OAAA,EAAS,qBAAA,GAAwB,oBAAA,EACjC,OAAA,GAAU,uBAAA,GACT,WAAA;EHVY;;;;;;;;;;;AAQjB;;;;;;;;;;;;;;AAuFA;;;;;;EGpDE,OAAA,kBAAyB,OAAA,EAAS,cAAA,CAAe,MAAA,IAAU,OAAA,CAAQ,OAAA;EH0D1D;;;;;AC9NX;;;;;AAIA;;;;;AAQA;;;;;;;;;;EEmLE,mBAAA,UACE,WAAA,EAAa,wBAAA,EACb,OAAA,EAAS,cAAA,CAAe,OAAA,IACvB,cAAA,CAAe,OAAA;EFlLP;;;;;;;;;EE6LX,qBAAA,CAAsB,WAAA,EAAa,wBAAA;EF3Ld;;;;;;;AA2BvB;;;;EE6KE,QAAA,IAAY,OAAA;AAAA;;;;;KAOF,OAAA;8CAEV,UAAA;AAAA;;;;;KAOU,WAAA;EFhGF,sCEkGR,EAAA,UF7Ee;EE+Ef,UAAA;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KA+BU,cAAA;qCAEV,EAAA;EDlRU;;;;;;;;EC2RV,eAAA,CAAgB,UAAA,UAAoB,MAAA,EAAQ,OAAA,EAAS,QAAA,GAAW,MAAA,oBAA0B,OAAA;EDnR1F;;;;AAqBF;;;;;ECwQE,gBAAA,CACE,UAAA,UACA,OAAA,EAAS,qBAAA,EACT,MAAA,EAAQ,OAAA,EACR,QAAA,GAAW,MAAA,oBACV,WAAA;EDzQqC;;;EC6QxC,UAAA;AAAA;;;;;KAOU,OAAA;EDtRuC,iCCwRjD,MAAA,EAAQ,aAAA,EDtRkB;ECwR1B,MAAA,EAAQ,aAAA,EDxRU;EC0RlB,SAAA,EAAW,gBAAA,ED1R+C;EC4R1D,SAAA,EAAW,gBAAA;AAAA;AAAA,KAGD,mBAAA;EACV,WAAA,EAAa,MAAA;EACb,YAAA,EAAc,MAAA;EACd,IAAA,EAAM,KAAA;EACN,OAAA,EAAS,MAAA;EACT,MAAA;EACA,QAAA,EAAU,aAAA;EACV,YAAA,EAAc,aAAA;AAAA;;;;;;KAQJ,cAAA;EAnTP,gCAqTH,MAAA,GAAS,UAAA,mBArTS;EAuTlB,OAAA,GAAU,OAAA,EAAS,MAAA,2BA1QT;EA4QV,MAAA,EAAQ,MAAA,CAAO,cAAA;EAEf,KAAA;AAAA;AA7QF;;;;;AAAA,KAqRY,aAAA,oBAAiC,IAAA,CAAK,mBAAA,CAAoB,KAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "iii-sdk",
3
- "version": "0.19.7-next.2",
3
+ "version": "0.20.0-alpha.1",
4
4
  "private": false,
5
5
  "publishConfig": {
6
6
  "access": "public"
@@ -74,7 +74,7 @@
74
74
  "dependencies": {
75
75
  "@opentelemetry/api": "^1.9.0",
76
76
  "ws": "^8.18.3",
77
- "@iii-dev/helpers": "0.19.7-next.2"
77
+ "@iii-dev/helpers": "0.20.0-alpha.1"
78
78
  },
79
79
  "devDependencies": {
80
80
  "@opentelemetry/context-async-hooks": "^2.7.1",
@@ -1 +0,0 @@
1
- {"version":3,"file":"types-ChnmRit-.d.mts","names":[],"sources":["../src/iii-types.ts","../src/channels.ts","../src/triggers.ts","../src/types.ts"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"types-pzKubHk_.d.cts","names":[],"sources":["../src/iii-types.ts","../src/channels.ts","../src/triggers.ts","../src/types.ts"],"mappings":"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"}