iii-sdk 0.9.0 → 0.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +46 -39
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +4 -9
- package/dist/index.d.cts.map +1 -1
- package/dist/index.d.mts +4 -9
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +30 -24
- package/dist/index.mjs.map +1 -1
- package/dist/state.cjs +6 -5
- package/dist/state.cjs.map +1 -1
- package/dist/state.d.cts +13 -30
- package/dist/state.d.cts.map +1 -1
- package/dist/state.d.mts +13 -30
- package/dist/state.d.mts.map +1 -1
- package/dist/state.mjs +5 -5
- package/dist/state.mjs.map +1 -1
- package/dist/{stream-BAjVneSg.d.mts → stream-C1zUjhzk.d.mts} +25 -56
- package/dist/stream-C1zUjhzk.d.mts.map +1 -0
- package/dist/{stream-DUNsytJU.d.cts → stream-lxenNA3s.d.cts} +25 -56
- package/dist/stream-lxenNA3s.d.cts.map +1 -0
- package/dist/stream.d.cts +1 -1
- package/dist/stream.d.mts +1 -1
- package/dist/telemetry.cjs +6 -5
- package/dist/telemetry.d.cts +1 -1
- package/dist/telemetry.d.cts.map +1 -1
- package/dist/telemetry.d.mts +1 -1
- package/dist/telemetry.d.mts.map +1 -1
- package/dist/telemetry.mjs +1 -1
- package/dist/{utils-D6RPYBhs.d.cts → utils-BvWlFlLq.d.cts} +60 -121
- package/dist/utils-BvWlFlLq.d.cts.map +1 -0
- package/dist/{utils-bsZVduQi.cjs → utils-C6yTT4Js.cjs} +95 -95
- package/dist/utils-C6yTT4Js.cjs.map +1 -0
- package/dist/{utils-BRn3Iff5.d.mts → utils-_zSeatp1.d.mts} +60 -121
- package/dist/utils-_zSeatp1.d.mts.map +1 -0
- package/dist/{utils-5jD8F3OE.mjs → utils-xBUm8n1P.mjs} +28 -28
- package/dist/utils-xBUm8n1P.mjs.map +1 -0
- package/package.json +2 -2
- package/dist/stream-BAjVneSg.d.mts.map +0 -1
- package/dist/stream-DUNsytJU.d.cts.map +0 -1
- package/dist/utils-5jD8F3OE.mjs.map +0 -1
- package/dist/utils-BRn3Iff5.d.mts.map +0 -1
- package/dist/utils-D6RPYBhs.d.cts.map +0 -1
- package/dist/utils-bsZVduQi.cjs.map +0 -1
package/dist/index.cjs
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
|
|
1
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
2
|
+
//#region \0rolldown/runtime.js
|
|
2
3
|
var __create = Object.create;
|
|
3
4
|
var __defProp = Object.defineProperty;
|
|
4
5
|
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
@@ -25,14 +26,14 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
|
|
|
25
26
|
}) : target, mod));
|
|
26
27
|
|
|
27
28
|
//#endregion
|
|
28
|
-
const require_utils = require('./utils-
|
|
29
|
+
const require_utils = require('./utils-C6yTT4Js.cjs');
|
|
29
30
|
let node_stream = require("node:stream");
|
|
30
31
|
let ws = require("ws");
|
|
31
|
-
let
|
|
32
|
+
let _opentelemetry_api = require("@opentelemetry/api");
|
|
32
33
|
let node_module = require("node:module");
|
|
33
34
|
let node_os = require("node:os");
|
|
34
35
|
node_os = __toESM(node_os);
|
|
35
|
-
let
|
|
36
|
+
let _opentelemetry_api_logs = require("@opentelemetry/api-logs");
|
|
36
37
|
|
|
37
38
|
//#region src/channels.ts
|
|
38
39
|
/**
|
|
@@ -71,9 +72,12 @@ var ChannelWriter = class ChannelWriter {
|
|
|
71
72
|
callback();
|
|
72
73
|
return;
|
|
73
74
|
}
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
75
|
+
const doClose = () => {
|
|
76
|
+
if (this.ws) this.ws.close(1e3, "stream_complete");
|
|
77
|
+
callback();
|
|
78
|
+
};
|
|
79
|
+
if (this.wsReady) setTimeout(doClose, 10);
|
|
80
|
+
else this.ws.on("open", () => setTimeout(doClose, 10));
|
|
77
81
|
},
|
|
78
82
|
destroy: (err, callback) => {
|
|
79
83
|
if (this.ws) this.ws.terminate();
|
|
@@ -106,8 +110,11 @@ var ChannelWriter = class ChannelWriter {
|
|
|
106
110
|
/** Close the channel writer. */
|
|
107
111
|
close() {
|
|
108
112
|
if (!this.ws) return;
|
|
109
|
-
|
|
110
|
-
|
|
113
|
+
const doClose = () => {
|
|
114
|
+
if (this.ws) this.ws.close(1e3, "channel_close");
|
|
115
|
+
};
|
|
116
|
+
if (this.wsReady) doClose();
|
|
117
|
+
else this.ws.on("open", () => doClose());
|
|
111
118
|
}
|
|
112
119
|
sendChunked(data, callback) {
|
|
113
120
|
let offset = 0;
|
|
@@ -213,19 +220,19 @@ function buildChannelUrl(engineWsBase, channelId, accessKey, direction) {
|
|
|
213
220
|
|
|
214
221
|
//#endregion
|
|
215
222
|
//#region src/iii-types.ts
|
|
216
|
-
let MessageType = /* @__PURE__ */ function(MessageType
|
|
217
|
-
MessageType
|
|
218
|
-
MessageType
|
|
219
|
-
MessageType
|
|
220
|
-
MessageType
|
|
221
|
-
MessageType
|
|
222
|
-
MessageType
|
|
223
|
-
MessageType
|
|
224
|
-
MessageType
|
|
225
|
-
MessageType
|
|
226
|
-
MessageType
|
|
227
|
-
MessageType
|
|
228
|
-
return MessageType
|
|
223
|
+
let MessageType = /* @__PURE__ */ function(MessageType) {
|
|
224
|
+
MessageType["RegisterFunction"] = "registerfunction";
|
|
225
|
+
MessageType["UnregisterFunction"] = "unregisterfunction";
|
|
226
|
+
MessageType["RegisterService"] = "registerservice";
|
|
227
|
+
MessageType["InvokeFunction"] = "invokefunction";
|
|
228
|
+
MessageType["InvocationResult"] = "invocationresult";
|
|
229
|
+
MessageType["RegisterTriggerType"] = "registertriggertype";
|
|
230
|
+
MessageType["RegisterTrigger"] = "registertrigger";
|
|
231
|
+
MessageType["UnregisterTrigger"] = "unregistertrigger";
|
|
232
|
+
MessageType["UnregisterTriggerType"] = "unregistertriggertype";
|
|
233
|
+
MessageType["TriggerRegistrationResult"] = "triggerregistrationresult";
|
|
234
|
+
MessageType["WorkerRegistered"] = "workerregistered";
|
|
235
|
+
return MessageType;
|
|
229
236
|
}({});
|
|
230
237
|
|
|
231
238
|
//#endregion
|
|
@@ -309,16 +316,16 @@ var Sdk = class {
|
|
|
309
316
|
handler: async (input, traceparent, baggage) => {
|
|
310
317
|
if (require_utils.getTracer()) {
|
|
311
318
|
const parentContext = require_utils.extractContext(traceparent, baggage);
|
|
312
|
-
return
|
|
319
|
+
return _opentelemetry_api.context.with(parentContext, () => require_utils.withSpan(`call ${message.id}`, { kind: _opentelemetry_api.SpanKind.SERVER }, async () => await handler(input)));
|
|
313
320
|
}
|
|
314
321
|
const traceId = crypto.randomUUID().replace(/-/g, "");
|
|
315
322
|
const spanId = crypto.randomUUID().replace(/-/g, "").slice(0, 16);
|
|
316
|
-
const syntheticSpan =
|
|
323
|
+
const syntheticSpan = _opentelemetry_api.trace.wrapSpanContext({
|
|
317
324
|
traceId,
|
|
318
325
|
spanId,
|
|
319
326
|
traceFlags: 1
|
|
320
327
|
});
|
|
321
|
-
return
|
|
328
|
+
return _opentelemetry_api.context.with(_opentelemetry_api.trace.setSpan(_opentelemetry_api.context.active(), syntheticSpan), async () => await handler(input));
|
|
322
329
|
}
|
|
323
330
|
});
|
|
324
331
|
} else this.functions.set(message.id, { message: fullMessage });
|
|
@@ -357,13 +364,13 @@ var Sdk = class {
|
|
|
357
364
|
const { function_id, payload, action, timeoutMs } = request;
|
|
358
365
|
const effectiveTimeout = timeoutMs ?? this.invocationTimeoutMs;
|
|
359
366
|
if (action?.type === "void") {
|
|
360
|
-
const traceparent
|
|
361
|
-
const baggage
|
|
367
|
+
const traceparent = require_utils.injectTraceparent();
|
|
368
|
+
const baggage = require_utils.injectBaggage();
|
|
362
369
|
this.sendMessage(MessageType.InvokeFunction, {
|
|
363
370
|
function_id,
|
|
364
371
|
data: payload,
|
|
365
|
-
traceparent
|
|
366
|
-
baggage
|
|
372
|
+
traceparent,
|
|
373
|
+
baggage,
|
|
367
374
|
action
|
|
368
375
|
});
|
|
369
376
|
return;
|
|
@@ -468,7 +475,7 @@ var Sdk = class {
|
|
|
468
475
|
};
|
|
469
476
|
this.workerName = options?.workerName ?? getDefaultWorkerName();
|
|
470
477
|
this.metricsReportingEnabled = options?.enableMetricsReporting ?? true;
|
|
471
|
-
this.invocationTimeoutMs = options?.invocationTimeoutMs ??
|
|
478
|
+
this.invocationTimeoutMs = options?.invocationTimeoutMs ?? 3e4;
|
|
472
479
|
this.reconnectionConfig = {
|
|
473
480
|
...require_utils.DEFAULT_BRIDGE_RECONNECTION_CONFIG,
|
|
474
481
|
...options?.reconnectionConfig
|
|
@@ -641,7 +648,7 @@ var Sdk = class {
|
|
|
641
648
|
const otelLogger = require_utils.getLogger();
|
|
642
649
|
const errorMessage = error instanceof Error ? error.message : String(error ?? "");
|
|
643
650
|
if (otelLogger) otelLogger.emit({
|
|
644
|
-
severityNumber:
|
|
651
|
+
severityNumber: _opentelemetry_api_logs.SeverityNumber.ERROR,
|
|
645
652
|
body: `[iii] ${message}${errorMessage ? `: ${errorMessage}` : ""}`
|
|
646
653
|
});
|
|
647
654
|
else console.error(`[iii] ${message}`, error ?? "");
|
|
@@ -882,16 +889,16 @@ var Logger = class {
|
|
|
882
889
|
attributes: Object.keys(attributes).length > 0 ? attributes : void 0
|
|
883
890
|
});
|
|
884
891
|
else switch (severity) {
|
|
885
|
-
case
|
|
892
|
+
case _opentelemetry_api_logs.SeverityNumber.DEBUG:
|
|
886
893
|
console.debug(message, data);
|
|
887
894
|
break;
|
|
888
|
-
case
|
|
895
|
+
case _opentelemetry_api_logs.SeverityNumber.INFO:
|
|
889
896
|
console.info(message, data);
|
|
890
897
|
break;
|
|
891
|
-
case
|
|
898
|
+
case _opentelemetry_api_logs.SeverityNumber.WARN:
|
|
892
899
|
console.warn(message, data);
|
|
893
900
|
break;
|
|
894
|
-
case
|
|
901
|
+
case _opentelemetry_api_logs.SeverityNumber.ERROR:
|
|
895
902
|
console.error(message, data);
|
|
896
903
|
break;
|
|
897
904
|
default: console.log(message, data);
|
|
@@ -911,7 +918,7 @@ var Logger = class {
|
|
|
911
918
|
* ```
|
|
912
919
|
*/
|
|
913
920
|
info(message, data) {
|
|
914
|
-
this.emit(message,
|
|
921
|
+
this.emit(message, _opentelemetry_api_logs.SeverityNumber.INFO, data);
|
|
915
922
|
}
|
|
916
923
|
/**
|
|
917
924
|
* Log a warning-level message.
|
|
@@ -927,7 +934,7 @@ var Logger = class {
|
|
|
927
934
|
* ```
|
|
928
935
|
*/
|
|
929
936
|
warn(message, data) {
|
|
930
|
-
this.emit(message,
|
|
937
|
+
this.emit(message, _opentelemetry_api_logs.SeverityNumber.WARN, data);
|
|
931
938
|
}
|
|
932
939
|
/**
|
|
933
940
|
* Log an error-level message.
|
|
@@ -943,7 +950,7 @@ var Logger = class {
|
|
|
943
950
|
* ```
|
|
944
951
|
*/
|
|
945
952
|
error(message, data) {
|
|
946
|
-
this.emit(message,
|
|
953
|
+
this.emit(message, _opentelemetry_api_logs.SeverityNumber.ERROR, data);
|
|
947
954
|
}
|
|
948
955
|
/**
|
|
949
956
|
* Log a debug-level message.
|
|
@@ -959,7 +966,7 @@ var Logger = class {
|
|
|
959
966
|
* ```
|
|
960
967
|
*/
|
|
961
968
|
debug(message, data) {
|
|
962
|
-
this.emit(message,
|
|
969
|
+
this.emit(message, _opentelemetry_api_logs.SeverityNumber.DEBUG, data);
|
|
963
970
|
}
|
|
964
971
|
};
|
|
965
972
|
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","names":["Writable","WebSocket","Readable","chunks: Buffer[]","os","address: string","options?: InitOptions","fullTrigger: RegisterTriggerMessage","fullMessage: RegisterFunctionMessage","getTracer","extractContext","context","withSpan","SpanKind","trace","traceparent","injectTraceparent","baggage","injectBaggage","EngineFunctions","EngineTriggers","shutdownOtel","DEFAULT_INVOCATION_TIMEOUT_MS","DEFAULT_BRIDGE_RECONNECTION_CONFIG","WebSocket","getMeter","getLogger","SeverityNumber","isChannelRef","out: Record<string, unknown>","msgType: MessageType","message: Record<string, unknown>","getOtelLogger","traceId?: string","serviceName?: string","spanId?: string","attributes: AnyValueMap","currentTraceId","currentSpanId","SeverityNumber"],"sources":["../src/channels.ts","../src/iii-types.ts","../src/iii.ts","../src/logger.ts"],"sourcesContent":["import { Readable, Writable } from 'node:stream'\nimport { WebSocket } from 'ws'\nimport type { StreamChannelRef } from './iii-types'\n\n/**\n * Write end of a streaming channel. Provides both a Node.js `Writable` stream\n * and a `sendMessage` method for sending structured text messages.\n *\n * @example\n * ```typescript\n * const channel = await iii.createChannel()\n *\n * // Stream binary data\n * channel.writer.stream.write(Buffer.from('hello'))\n * channel.writer.stream.end()\n *\n * // Or send text messages\n * channel.writer.sendMessage(JSON.stringify({ type: 'event', data: 'test' }))\n * channel.writer.close()\n * ```\n */\nexport class ChannelWriter {\n private static readonly FRAME_SIZE = 64 * 1024\n private ws: WebSocket | null = null\n private wsReady = false\n private readonly pendingMessages: {\n data: Buffer | string\n callback: (err?: Error | null) => void\n }[] = []\n /** Node.js Writable stream for binary data. */\n public readonly stream: Writable\n private readonly url: string\n\n constructor(engineWsBase: string, ref: StreamChannelRef) {\n this.url = buildChannelUrl(engineWsBase, ref.channel_id, ref.access_key, 'write')\n\n this.stream = new Writable({\n write: (chunk: Buffer, _encoding, callback) => {\n const buf = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk)\n this.sendChunked(buf, callback)\n },\n final: (callback) => {\n if (!this.ws) {\n callback()\n return\n }\n if (this.wsReady) {\n this.ws.close(1000, 'stream_complete')\n } else {\n this.ws.on('open', () => this.ws?.close(1000, 'stream_complete'))\n }\n callback()\n },\n destroy: (err, callback) => {\n if (this.ws) this.ws.terminate()\n callback(err)\n },\n })\n }\n\n private ensureConnected(): void {\n if (this.ws) return\n this.ws = new WebSocket(this.url)\n\n this.ws.on('open', () => {\n this.wsReady = true\n for (const { data, callback } of this.pendingMessages) {\n this.ws?.send(data, callback)\n }\n this.pendingMessages.length = 0\n })\n\n this.ws.on('error', (err) => {\n this.stream.destroy(err)\n })\n\n this.ws.on('close', () => {\n if (!this.stream.destroyed) {\n this.stream.destroy()\n }\n })\n }\n\n /** Send a text message through the channel. */\n sendMessage(msg: string): void {\n this.ensureConnected()\n this.sendRaw(msg, (err) => {\n if (err) this.stream.destroy(err)\n })\n }\n\n /** Close the channel writer. */\n close(): void {\n if (!this.ws) return\n if (this.wsReady) {\n this.ws.close(1000, 'channel_close')\n } else {\n this.ws.on('open', () => this.ws?.close(1000, 'channel_close'))\n }\n }\n\n private sendChunked(data: Buffer, callback: (err?: Error | null) => void): void {\n let offset = 0\n const sendNext = (err?: Error | null): void => {\n if (err) {\n callback(err)\n return\n }\n\n if (offset >= data.length) {\n callback(null)\n return\n }\n\n const end = Math.min(offset + ChannelWriter.FRAME_SIZE, data.length)\n const part = data.subarray(offset, end)\n offset = end\n this.sendRaw(part, sendNext)\n }\n sendNext(null)\n }\n\n private sendRaw(data: Buffer | string, callback: (err?: Error | null) => void): void {\n this.ensureConnected()\n if (this.wsReady && this.ws) {\n this.ws.send(data, (err) => callback(err ?? null))\n } else {\n this.pendingMessages.push({ data, callback })\n }\n }\n}\n\n/**\n * Read end of a streaming channel. Provides both a Node.js `Readable` stream\n * for binary data and an `onMessage` callback for structured text messages.\n *\n * @example\n * ```typescript\n * const channel = await iii.createChannel()\n *\n * // Stream binary data\n * channel.reader.stream.on('data', (chunk) => console.log(chunk))\n *\n * // Or receive text messages\n * channel.reader.onMessage((msg) => console.log('Got:', msg))\n * ```\n */\nexport class ChannelReader {\n private ws: WebSocket | null = null\n private connected = false\n private readonly messageCallbacks: Array<(msg: string) => void> = []\n /** Node.js Readable stream for binary data. */\n public readonly stream: Readable\n private readonly url: string\n\n constructor(engineWsBase: string, ref: StreamChannelRef) {\n this.url = buildChannelUrl(engineWsBase, ref.channel_id, ref.access_key, 'read')\n\n const self = this\n this.stream = new Readable({\n read() {\n self.ensureConnected()\n if (self.ws) self.ws.resume()\n },\n destroy(err, callback) {\n if (self.ws && self.ws.readyState !== WebSocket.CLOSED) {\n self.ws.terminate()\n }\n self.ws = null\n callback(err)\n },\n })\n }\n\n private ensureConnected(): void {\n if (this.connected) return\n this.connected = true\n this.ws = new WebSocket(this.url)\n\n this.ws.on('open', () => {\n ;(this.ws as unknown as { binaryType: string }).binaryType = 'nodebuffer'\n })\n\n this.ws.on('message', (data: Buffer, isBinary: boolean) => {\n if (isBinary) {\n if (!this.stream.push(data)) {\n this.ws?.pause()\n }\n } else {\n const msg = data.toString('utf-8')\n for (const cb of this.messageCallbacks) {\n cb(msg)\n }\n }\n })\n\n this.ws.on('close', () => {\n this.ws = null\n if (!this.stream.destroyed) this.stream.push(null)\n })\n\n this.ws.on('error', (err) => {\n this.stream.destroy(err)\n })\n }\n\n /** Register a callback to receive text messages from the channel. */\n onMessage(callback: (msg: string) => void): void {\n this.messageCallbacks.push(callback)\n }\n\n async readAll(): Promise<Buffer> {\n this.ensureConnected()\n const chunks: Buffer[] = []\n\n for await (const chunk of this.stream) {\n chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk))\n }\n\n return Buffer.concat(chunks)\n }\n\n close(): void {\n if (this.ws && this.ws.readyState !== WebSocket.CLOSED) {\n this.ws.close(1000, 'channel_close')\n }\n }\n}\n\nfunction buildChannelUrl(\n engineWsBase: string,\n channelId: string,\n accessKey: string,\n direction: 'read' | 'write',\n): string {\n const base = engineWsBase.replace(/\\/$/, '')\n return `${base}/ws/channels/${channelId}?key=${encodeURIComponent(accessKey)}&dir=${direction}`\n}\n","export enum MessageType {\n RegisterFunction = 'registerfunction',\n UnregisterFunction = 'unregisterfunction',\n RegisterService = 'registerservice',\n InvokeFunction = 'invokefunction',\n InvocationResult = 'invocationresult',\n RegisterTriggerType = 'registertriggertype',\n RegisterTrigger = 'registertrigger',\n UnregisterTrigger = 'unregistertrigger',\n UnregisterTriggerType = 'unregistertriggertype',\n TriggerRegistrationResult = 'triggerregistrationresult',\n WorkerRegistered = 'workerregistered',\n}\n\nexport type RegisterTriggerTypeMessage = {\n message_type: MessageType.RegisterTriggerType\n id: string\n description: string\n}\n\nexport type UnregisterTriggerTypeMessage = {\n message_type: MessageType.UnregisterTriggerType\n id: string\n}\n\nexport type UnregisterTriggerMessage = {\n message_type: MessageType.UnregisterTrigger\n id: string\n type?: string\n}\n\nexport type TriggerRegistrationResultMessage = {\n message_type: MessageType.TriggerRegistrationResult\n id: string\n type: string\n function_id: string\n result?: unknown\n error?: unknown\n}\n\nexport type RegisterTriggerMessage = {\n message_type: MessageType.RegisterTrigger\n id: string\n type: string\n function_id: string\n config: unknown\n}\n\nexport type RegisterServiceMessage = {\n message_type: MessageType.RegisterService\n id: string\n name?: string\n description?: string\n parent_service_id?: string\n}\n\n/**\n * Authentication configuration for HTTP-invoked functions.\n *\n * - `hmac` -- HMAC signature verification using a shared secret.\n * - `bearer` -- Bearer token authentication.\n * - `api_key` -- API key sent via a custom header.\n */\nexport type HttpAuthConfig =\n | { type: 'hmac'; secret_key: string }\n | { type: 'bearer'; token_key: string }\n | { type: 'api_key'; header: string; value_key: string }\n\n/**\n * Configuration for registering an HTTP-invoked function (Lambda, Cloudflare\n * Workers, etc.) instead of a local handler.\n */\nexport type HttpInvocationConfig = {\n /** URL to invoke. */\n url: string\n /** HTTP method. Defaults to `POST`. */\n method?: 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE'\n /** Timeout in milliseconds. */\n timeout_ms?: number\n /** Custom headers to send with the request. */\n headers?: Record<string, string>\n /** Authentication configuration. */\n auth?: HttpAuthConfig\n}\n\nexport type RegisterFunctionFormat = {\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'\n /**\n * The body of the parameter\n */\n body?: RegisterFunctionFormat[]\n /**\n * The items of the parameter\n */\n items?: RegisterFunctionFormat\n /**\n * Whether the parameter is required\n */\n required?: boolean\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 * Result returned when a function is invoked with `TriggerAction.Enqueue`.\n */\nexport type EnqueueResult = {\n /** Unique receipt ID for the enqueued message. */\n messageReceiptId: string\n}\n\n/**\n * Request object passed to {@link ISdk.trigger}.\n *\n * @typeParam TInput - Type of the payload.\n */\nexport type TriggerRequest<TInput = unknown> = {\n /** ID of the function to invoke. */\n function_id: string\n /** Payload to pass to the function. */\n payload: TInput\n /** Routing action. Omit for synchronous request/response. */\n action?: TriggerAction\n /** Override the default invocation timeout in milliseconds. */\n timeoutMs?: number\n}\n\nexport type InvokeFunctionMessage = {\n message_type: MessageType.InvokeFunction\n /**\n * This is optional for async invocations\n */\n invocation_id?: string\n /**\n * The path of the function\n */\n function_id: string\n /**\n * The data to pass to the function\n */\n data: unknown\n /**\n * W3C trace-context traceparent header for distributed tracing\n */\n traceparent?: string\n /**\n * W3C baggage header for cross-cutting context propagation\n */\n baggage?: string\n /**\n * Trigger action for queue routing or fire-and-forget\n */\n action?: TriggerAction\n}\n\nexport type InvocationResultMessage = {\n message_type: MessageType.InvocationResult\n /**\n * The id of the invocation\n */\n invocation_id: string\n /**\n * The path of the function\n */\n function_id: string\n result?: unknown\n error?: unknown\n /**\n * W3C trace-context traceparent header for distributed tracing\n */\n traceparent?: string\n /**\n * W3C baggage header for cross-cutting context propagation\n */\n baggage?: string\n}\n\n/**\n * Metadata about a registered function, returned by `ISdk.listFunctions`.\n */\nexport type FunctionInfo = {\n /** Unique function identifier. */\n function_id: string\n /** Human-readable description. */\n description?: string\n /** Schema describing expected request format. */\n request_format?: RegisterFunctionFormat\n /** Schema describing expected response format. */\n response_format?: RegisterFunctionFormat\n /** Arbitrary metadata attached to the function. */\n metadata?: Record<string, unknown>\n}\n\n/**\n * Information about a registered trigger.\n */\nexport type TriggerInfo = {\n /** Unique trigger identifier. */\n id: string\n /** Type of the trigger (e.g. `http`, `cron`, `queue`). */\n trigger_type: string\n /** ID of the function this trigger is bound to. */\n function_id: string\n /** Trigger-specific configuration. */\n config?: unknown\n}\n\n/** Worker connection status. */\nexport type WorkerStatus = 'connected' | 'available' | 'busy' | 'disconnected'\n\n/**\n * Metadata about a connected worker, returned by `ISdk.listWorkers`.\n */\nexport type WorkerInfo = {\n /** Unique worker identifier assigned by the engine. */\n id: string\n /** Display name of the worker. */\n name?: string\n /** Runtime environment (e.g. `node`, `python`, `rust`). */\n runtime?: string\n /** SDK version. */\n version?: string\n /** Operating system info. */\n os?: string\n /** IP address of the worker. */\n ip_address?: string\n /** Current connection status. */\n status: WorkerStatus\n /** Timestamp (ms since epoch) when the worker connected. */\n connected_at_ms: number\n /** Number of functions registered by this worker. */\n function_count: number\n /** List of function IDs registered by this worker. */\n functions: string[]\n /** Number of currently active invocations. */\n active_invocations: number\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 | RegisterServiceMessage\n | RegisterTriggerMessage\n | RegisterTriggerTypeMessage\n | UnregisterTriggerMessage\n | UnregisterTriggerTypeMessage\n | TriggerRegistrationResultMessage\n | WorkerRegisteredMessage\n","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 {\n DEFAULT_BRIDGE_RECONNECTION_CONFIG,\n DEFAULT_INVOCATION_TIMEOUT_MS,\n EngineFunctions,\n EngineTriggers,\n type IIIConnectionState,\n type IIIReconnectionConfig,\n} from './iii-constants'\nimport {\n type FunctionInfo,\n type HttpInvocationConfig,\n type IIIMessage,\n type InvocationResultMessage,\n type InvokeFunctionMessage,\n MessageType,\n type RegisterFunctionMessage,\n type RegisterServiceMessage,\n type RegisterTriggerMessage,\n type RegisterTriggerTypeMessage,\n type StreamChannelRef,\n type TriggerAction as TriggerActionType,\n type TriggerInfo,\n type TriggerRegistrationResultMessage,\n type TriggerRequest,\n type WorkerInfo,\n type WorkerRegisteredMessage,\n} from './iii-types'\nimport { registerWorkerGauges, stopWorkerGauges } from './otel-worker-gauges'\nimport type { IStream } from './stream'\nimport {\n extractContext,\n getLogger,\n getMeter,\n getTracer,\n initOtel,\n injectBaggage,\n injectTraceparent,\n type OtelConfig,\n SeverityNumber,\n shutdownOtel,\n SpanKind,\n withSpan,\n} from './telemetry-system'\nimport type { TriggerHandler } from './triggers'\nimport type {\n FunctionRef,\n FunctionsAvailableCallback,\n Invocation,\n ISdk,\n RemoteFunctionData,\n RemoteFunctionHandler,\n RemoteTriggerTypeData,\n Trigger,\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/** @internal */\nexport type TelemetryOptions = {\n language?: string\n project_name?: string\n framework?: string\n amplitude_api_key?: string\n}\n\n/**\n * Configuration options passed to {@link registerWorker}.\n *\n * @example\n * ```typescript\n * const iii = registerWorker('ws://localhost: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 /** 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 /** @internal */\n telemetry?: TelemetryOptions\n}\n\nclass Sdk implements ISdk {\n private ws?: WebSocket\n private functions = new Map<string, RemoteFunctionData>()\n private services = new Map<string, Omit<RegisterServiceMessage, 'functions'>>()\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 functionsAvailableCallbacks = new Set<FunctionsAvailableCallback>()\n private functionsAvailableTrigger?: Trigger\n private functionsAvailableFunctionPath?: string\n private messagesToSend: Record<string, unknown>[] = []\n private workerName: 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.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 * iii.registerTriggerType(\n * { id: 'my-trigger', description: 'Custom trigger' },\n * {\n * async registerTrigger({ id, function_id, config }) { },\n * async unregisterTrigger({ id, function_id, config }) { },\n * },\n * )\n * ```\n */\n registerTriggerType = <TConfig>(\n triggerType: Omit<RegisterTriggerTypeMessage, 'message_type'>,\n handler: TriggerHandler<TConfig>,\n ): void => {\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\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`, `queue`, `cron`).\n * @param trigger.function_id - ID of the function to invoke.\n * @param trigger.config - Trigger-specific configuration.\n * @returns A {@link Trigger} handle with an `unregister()` method.\n *\n * @example\n * ```typescript\n * const trigger = iii.registerTrigger({\n * type: 'http',\n * function_id: 'greet',\n * config: { api_path: '/greet', http_method: 'GET' },\n * })\n *\n * // Later...\n * trigger.unregister()\n * ```\n */\n registerTrigger = (trigger: Omit<RegisterTriggerMessage, 'message_type' | 'id'>): Trigger => {\n const id = crypto.randomUUID()\n const fullTrigger: RegisterTriggerMessage = {\n ...trigger,\n id,\n message_type: MessageType.RegisterTrigger,\n }\n this.sendMessage(MessageType.RegisterTrigger, fullTrigger, true)\n this.triggers.set(id, fullTrigger)\n\n return {\n unregister: () => {\n this.sendMessage(MessageType.UnregisterTrigger, {\n id,\n message_type: MessageType.UnregisterTrigger,\n type: fullTrigger.type,\n })\n this.triggers.delete(id)\n },\n }\n }\n\n /**\n * Registers a function with the engine. The `id` 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 message - Function registration input.\n * @param message.id - Unique function identifier.\n * @param message.description - Human-readable description.\n * @param handlerOrInvocation - Async handler or HTTP invocation config.\n * @returns A {@link FunctionRef} with `id` and `unregister()`.\n *\n * @example\n * ```typescript\n * const fn = iii.registerFunction(\n * { id: 'greet', description: 'Greets a user' },\n * async (input: { name: string }) => {\n * return { message: `Hello, ${input.name}!` }\n * },\n * )\n * ```\n */\n registerFunction = (\n message: Omit<RegisterFunctionMessage, 'message_type'>,\n handlerOrInvocation: RemoteFunctionHandler | HttpInvocationConfig,\n ): FunctionRef => {\n if (!message.id || message.id.trim() === '') {\n throw new Error('id is required')\n }\n if (this.functions.has(message.id)) {\n throw new Error(`function id already registered: ${message.id}`)\n }\n\n const isHandler = typeof handlerOrInvocation === 'function'\n\n const fullMessage: RegisterFunctionMessage = isHandler\n ? { ...message, message_type: MessageType.RegisterFunction }\n : {\n ...message,\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(message.id, {\n message: fullMessage,\n handler: async (input, traceparent?: string, baggage?: string) => {\n if (getTracer()) {\n const parentContext = extractContext(traceparent, baggage)\n\n return context.with(parentContext, () =>\n withSpan(`call ${message.id}`, { kind: SpanKind.SERVER }, async () => await handler(input)),\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 handler(input))\n },\n })\n } else {\n this.functions.set(message.id, { message: fullMessage })\n }\n\n return {\n id: message.id,\n unregister: () => {\n this.sendMessage(MessageType.UnregisterFunction, { id: message.id }, true)\n this.functions.delete(message.id)\n },\n }\n }\n\n registerService = (message: Omit<RegisterServiceMessage, 'message_type'>): void => {\n const msg = { ...message, name: message.name ?? message.id }\n this.sendMessage(MessageType.RegisterService, msg, true)\n this.services.set(message.id, { ...msg, message_type: MessageType.RegisterService })\n }\n\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 * @param bufferSize - Optional buffer size for the channel (default: 64).\n * @returns A {@link Channel} with `writer`, `reader`, and their serializable refs.\n *\n * @example\n * ```typescript\n * const channel = await iii.createChannel()\n * channel.writer.stream.write(Buffer.from('hello'))\n * channel.writer.close()\n * ```\n */\n createChannel = 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 iii.trigger({ function_id: 'get-order', payload: { id: '123' } })\n *\n * // Enqueue\n * const { messageReceiptId } = await iii.trigger({\n * function_id: 'payments::charge',\n * payload: { orderId: '123', amount: 49.99 },\n * action: TriggerAction.Enqueue({ queue: 'payment' }),\n * })\n *\n * // Fire-and-forget\n * iii.trigger({\n * function_id: 'notifications::send',\n * payload: { userId: '123' },\n * action: TriggerAction.Void(),\n * })\n * ```\n */\n trigger = async <TInput, TOutput>(request: TriggerRequest<TInput>): Promise<TOutput> => {\n const { function_id, payload, action, timeoutMs } = request\n const effectiveTimeout = timeoutMs ?? this.invocationTimeoutMs\n\n // 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(new Error(`Invocation timeout after ${effectiveTimeout}ms: ${function_id}`))\n }\n }, effectiveTimeout)\n\n this.invocations.set(invocation_id, {\n resolve: (result: TOutput) => {\n clearTimeout(timeout)\n resolve(result)\n },\n reject: (error: unknown) => {\n clearTimeout(timeout)\n reject(error)\n },\n timeout,\n })\n\n this.sendMessage(MessageType.InvokeFunction, {\n invocation_id,\n function_id,\n data: payload,\n traceparent,\n baggage,\n action,\n })\n })\n }\n\n /**\n * Lists all functions registered with the engine across all connected workers.\n *\n * @returns An array of {@link FunctionInfo} objects.\n *\n * @example\n * ```typescript\n * const functions = await iii.listFunctions()\n * functions.forEach(fn => console.log(fn.function_id))\n * ```\n */\n listFunctions = async (): Promise<FunctionInfo[]> => {\n const result = await this.trigger<Record<string, never>, { functions: FunctionInfo[] }>({\n function_id: EngineFunctions.LIST_FUNCTIONS,\n payload: {},\n })\n return result.functions\n }\n\n /**\n * Lists all connected workers.\n *\n * @returns An array of {@link WorkerInfo} objects.\n */\n listWorkers = async (): Promise<WorkerInfo[]> => {\n const result = await this.trigger<Record<string, never>, { workers: WorkerInfo[] }>({\n function_id: EngineFunctions.LIST_WORKERS,\n payload: {},\n })\n return result.workers\n }\n\n listTriggers = async (includeInternal = false): Promise<TriggerInfo[]> => {\n const result = await this.trigger<{ include_internal: boolean }, { triggers: TriggerInfo[] }>({\n function_id: EngineFunctions.LIST_TRIGGERS,\n payload: { include_internal: includeInternal },\n })\n return result.triggers\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 os: getOsInfo(),\n pid: process.pid,\n telemetry: {\n language,\n project_name: telemetryOpts?.project_name,\n framework: telemetryOpts?.framework,\n amplitude_api_key: telemetryOpts?.amplitude_api_key,\n },\n },\n action: { type: 'void' },\n })\n }\n\n /**\n * Registers a custom stream implementation, overriding the engine default\n * for the given stream name.\n *\n * Registers 5 of the 6 `IStream` methods (`get`, `set`, `delete`, `list`,\n * `listGroups`). The `update` method is not registered -- atomic updates are\n * handled by the engine's built-in stream update logic.\n *\n * @param streamName - Name of the stream.\n * @param stream - Object implementing the {@link IStream} interface.\n *\n * @example\n * ```typescript\n * iii.createStream('my-stream', {\n * async get(input) { return null },\n * async set(input) { return null },\n * async delete(input) { return { old_value: undefined } },\n * async list(input) { return [] },\n * async listGroups(input) { return [] },\n * async update(input) { return null },\n * })\n * ```\n */\n createStream = <TData>(streamName: string, stream: IStream<TData>): void => {\n this.registerFunction({ id: `stream::get(${streamName})` }, stream.get.bind(stream))\n this.registerFunction({ id: `stream::set(${streamName})` }, stream.set.bind(stream))\n this.registerFunction({ id: `stream::delete(${streamName})` }, stream.delete.bind(stream))\n this.registerFunction({ id: `stream::list(${streamName})` }, stream.list.bind(stream))\n this.registerFunction({ id: `stream::list_groups(${streamName})` }, stream.listGroups.bind(stream))\n }\n\n /**\n * Subscribes to function availability events from the engine. The callback\n * fires whenever the set of available functions changes.\n *\n * @param callback - Receives the current list of {@link FunctionInfo} objects.\n * @returns An unsubscribe function.\n *\n * @example\n * ```typescript\n * const unsub = iii.onFunctionsAvailable((functions) => {\n * console.log('Available:', functions.map(f => f.function_id))\n * })\n *\n * // Later...\n * unsub()\n * ```\n */\n onFunctionsAvailable = (callback: FunctionsAvailableCallback): (() => void) => {\n this.functionsAvailableCallbacks.add(callback)\n\n if (!this.functionsAvailableTrigger) {\n if (!this.functionsAvailableFunctionPath) {\n this.functionsAvailableFunctionPath = `engine.on_functions_available.${crypto.randomUUID()}`\n }\n\n const function_id = this.functionsAvailableFunctionPath\n if (!this.functions.has(function_id)) {\n this.registerFunction({ id: function_id }, async ({ functions }: { functions: FunctionInfo[] }) => {\n this.functionsAvailableCallbacks.forEach((handler) => {\n handler(functions)\n })\n return null\n })\n }\n\n this.functionsAvailableTrigger = this.registerTrigger({\n type: EngineTriggers.FUNCTIONS_AVAILABLE,\n function_id,\n config: {},\n })\n }\n\n return () => {\n this.functionsAvailableCallbacks.delete(callback)\n if (this.functionsAvailableCallbacks.size === 0 && this.functionsAvailableTrigger) {\n this.functionsAvailableTrigger.unregister()\n this.functionsAvailableTrigger = undefined\n }\n }\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\n if (this.ws) {\n this.ws.removeAllListeners()\n this.ws.close()\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)\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.services.forEach((service) => {\n this.sendMessage(MessageType.RegisterService, service, 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 error ? invocation.reject(error) : invocation.resolve(result)\n }\n\n this.invocations.delete(invocation_id)\n }\n\n private resolveChannelValue(value: unknown): unknown {\n if (isChannelRef(value)) {\n return value.direction === 'read'\n ? new ChannelReader(this.address, value)\n : new ChannelWriter(this.address, value)\n }\n if (Array.isArray(value)) {\n return value.map((item) => this.resolveChannelValue(item))\n }\n if (value !== null && typeof value === 'object') {\n const out: Record<string, unknown> = {}\n for (const [k, v] of Object.entries(value as Record<string, unknown>)) {\n out[k] = this.resolveChannelValue(v)\n }\n return out\n }\n return value\n }\n\n private async onInvokeFunction<TInput>(\n invocation_id: string | undefined,\n function_id: string,\n input: TInput,\n traceparent?: string,\n baggage?: string,\n ): Promise<unknown> {\n const fn = this.functions.get(function_id)\n 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 }) {\n const { trigger_type, id, function_id, config } = message\n const triggerTypeData = this.triggerTypes.get(trigger_type)\n\n if (triggerTypeData) {\n try {\n await triggerTypeData.handler.registerTrigger({ id, function_id, config })\n this.sendMessage(MessageType.TriggerRegistrationResult, {\n id,\n message_type: MessageType.TriggerRegistrationResult,\n type: trigger_type,\n function_id,\n })\n } catch (error) {\n this.sendMessage(MessageType.TriggerRegistrationResult, {\n id,\n message_type: MessageType.TriggerRegistrationResult,\n type: trigger_type,\n function_id,\n error: { code: 'trigger_registration_failed', message: (error as Error).message },\n })\n }\n } else {\n this.sendMessage(MessageType.TriggerRegistrationResult, {\n id,\n message_type: MessageType.TriggerRegistrationResult,\n type: trigger_type,\n function_id,\n error: { code: 'trigger_type_not_found', message: 'Trigger type not found' },\n })\n }\n }\n\n private 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 })\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 ISdk.trigger}.\n *\n * @example\n * ```typescript\n * import { TriggerAction } from 'iii-sdk'\n *\n * // Enqueue to a named queue\n * iii.trigger({\n * function_id: 'process',\n * payload: { data: 'hello' },\n * action: TriggerAction.Enqueue({ queue: 'jobs' }),\n * })\n *\n * // Fire-and-forget\n * iii.trigger({\n * function_id: 'notify',\n * payload: {},\n * action: TriggerAction.Void(),\n * })\n * ```\n */\nexport const TriggerAction = {\n /**\n * Routes the invocation through a named queue. The engine enqueues the job,\n * acknowledges the caller with `{ messageReceiptId }`, and processes it\n * asynchronously.\n *\n * @param opts - Queue routing options.\n * @param opts.queue - Name of the target queue.\n */\n Enqueue: (opts: { queue: string }): TriggerActionType => ({ type: 'enqueue', ...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: (): TriggerActionType => ({ type: 'void' }),\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 ISdk} instance.\n *\n * @example\n * ```typescript\n * import { registerWorker } from 'iii-sdk'\n *\n * const iii = registerWorker(process.env.III_URL ?? 'ws://localhost:49134', {\n * workerName: 'my-worker',\n * })\n * ```\n */\nexport const registerWorker = (address: string, options?: InitOptions): ISdk => new Sdk(address, options)\n","import { AnyValue, AnyValueMap, SeverityNumber } from '@opentelemetry/api-logs'\nimport {\n currentSpanId,\n currentTraceId,\n getLogger as getOtelLogger,\n} from './telemetry-system'\n\n/** @internal */\nexport type LoggerParams = {\n message: string\n trace_id?: string\n span_id?: string\n service_name?: string\n data?: unknown\n /** @deprecated Use service_name instead */\n function_name?: string\n}\n\n/**\n * Structured logger that emits logs as OpenTelemetry LogRecords.\n *\n * Every log call automatically captures the active trace and span context,\n * correlating your logs with distributed traces without any manual wiring.\n * When OTel is not initialized, Logger gracefully falls back to `console.*`.\n *\n * Pass structured data as the second argument to any log method. Using an\n * object of key-value pairs (instead of string interpolation) lets you\n * filter, aggregate, and build dashboards in your observability backend.\n *\n * @example\n * ```typescript\n * import { Logger } from 'iii-sdk'\n *\n * const logger = new Logger()\n *\n * // Basic logging — trace context is injected automatically\n * logger.info('Worker connected')\n *\n * // Structured context for dashboards and alerting\n * logger.info('Order processed', { orderId: 'ord_123', amount: 49.99, currency: 'USD' })\n * logger.warn('Retry attempt', { attempt: 3, maxRetries: 5, endpoint: '/api/charge' })\n * logger.error('Payment failed', { orderId: 'ord_123', gateway: 'stripe', errorCode: 'card_declined' })\n * ```\n */\nexport class Logger {\n private _otelLogger: ReturnType<typeof getOtelLogger> | null = null\n\n private get otelLogger() {\n // Lazy initialization: re-fetch logger if not yet available\n if (!this._otelLogger) {\n this._otelLogger = getOtelLogger()\n }\n return this._otelLogger\n }\n\n constructor(\n private readonly traceId?: string,\n private readonly serviceName?: string,\n private readonly spanId?: string,\n ) {}\n\n private emit(message: string, severity: SeverityNumber, data?: unknown): void {\n const attributes: AnyValueMap = {}\n const traceId = this.traceId ?? currentTraceId()\n const spanId = this.spanId ?? currentSpanId()\n\n if (traceId) {\n attributes.trace_id = traceId\n }\n if (spanId) {\n attributes.span_id = spanId\n }\n if (this.serviceName) {\n attributes['service.name'] = this.serviceName\n }\n if (data !== undefined) {\n attributes['log.data'] = data as AnyValue\n }\n\n if (this.otelLogger) {\n this.otelLogger.emit({\n severityNumber: severity,\n body: message,\n attributes: Object.keys(attributes).length > 0 ? attributes : undefined,\n })\n } else {\n // Fallback to console when OTEL is not available\n switch (severity) {\n case SeverityNumber.DEBUG:\n console.debug(message, data)\n break\n case SeverityNumber.INFO:\n console.info(message, data)\n break\n case SeverityNumber.WARN:\n console.warn(message, data)\n break\n case SeverityNumber.ERROR:\n console.error(message, data)\n break\n default:\n console.log(message, data)\n }\n }\n }\n\n /**\n * Log an info-level message.\n *\n * @param message - Human-readable log message.\n * @param data - Structured context attached as OTel log attributes.\n * Use key-value objects to enable filtering and aggregation in your\n * observability backend (e.g. Grafana, Datadog, New Relic).\n *\n * @example\n * ```typescript\n * logger.info('Order processed', { orderId: 'ord_123', status: 'completed' })\n * ```\n */\n info(message: string, data?: unknown): void {\n this.emit(message, SeverityNumber.INFO, data)\n }\n\n /**\n * Log a warning-level message.\n *\n * @param message - Human-readable log message.\n * @param data - Structured context attached as OTel log attributes.\n * Use key-value objects to enable filtering and aggregation in your\n * observability backend (e.g. Grafana, Datadog, New Relic).\n *\n * @example\n * ```typescript\n * logger.warn('Retry attempt', { attempt: 3, maxRetries: 5, endpoint: '/api/charge' })\n * ```\n */\n warn(message: string, data?: unknown): void {\n this.emit(message, SeverityNumber.WARN, data)\n }\n\n /**\n * Log an error-level message.\n *\n * @param message - Human-readable log message.\n * @param data - Structured context attached as OTel log attributes.\n * Use key-value objects to enable filtering and aggregation in your\n * observability backend (e.g. Grafana, Datadog, New Relic).\n *\n * @example\n * ```typescript\n * logger.error('Payment failed', { orderId: 'ord_123', gateway: 'stripe', errorCode: 'card_declined' })\n * ```\n */\n error(message: string, data?: unknown): void {\n this.emit(message, SeverityNumber.ERROR, data)\n }\n\n /**\n * Log a debug-level message.\n *\n * @param message - Human-readable log message.\n * @param data - Structured context attached as OTel log attributes.\n * Use key-value objects to enable filtering and aggregation in your\n * observability backend (e.g. Grafana, Datadog, New Relic).\n *\n * @example\n * ```typescript\n * logger.debug('Cache lookup', { key: 'user:42', hit: false })\n * ```\n */\n debug(message: string, data?: unknown): void {\n this.emit(message, SeverityNumber.DEBUG, data)\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.cjs","names":["Writable","WebSocket","Readable","os","getTracer","extractContext","context","withSpan","SpanKind","trace","injectTraceparent","injectBaggage","EngineFunctions","EngineTriggers","shutdownOtel","DEFAULT_BRIDGE_RECONNECTION_CONFIG","WebSocket","getMeter","getLogger","SeverityNumber","isChannelRef","getOtelLogger","currentTraceId","currentSpanId","SeverityNumber"],"sources":["../src/channels.ts","../src/iii-types.ts","../src/iii.ts","../src/logger.ts"],"sourcesContent":["import { Readable, Writable } from 'node:stream'\nimport { WebSocket } from 'ws'\nimport type { StreamChannelRef } from './iii-types'\n\n/**\n * Write end of a streaming channel. Provides both a Node.js `Writable` stream\n * and a `sendMessage` method for sending structured text messages.\n *\n * @example\n * ```typescript\n * const channel = await iii.createChannel()\n *\n * // Stream binary data\n * channel.writer.stream.write(Buffer.from('hello'))\n * channel.writer.stream.end()\n *\n * // Or send text messages\n * channel.writer.sendMessage(JSON.stringify({ type: 'event', data: 'test' }))\n * channel.writer.close()\n * ```\n */\nexport class ChannelWriter {\n private static readonly FRAME_SIZE = 64 * 1024\n private ws: WebSocket | null = null\n private wsReady = false\n private readonly pendingMessages: {\n data: Buffer | string\n callback: (err?: Error | null) => void\n }[] = []\n /** Node.js Writable stream for binary data. */\n public readonly stream: Writable\n private readonly url: string\n\n constructor(engineWsBase: string, ref: StreamChannelRef) {\n this.url = buildChannelUrl(engineWsBase, ref.channel_id, ref.access_key, 'write')\n\n this.stream = new Writable({\n write: (chunk: Buffer, _encoding, callback) => {\n const buf = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk)\n this.sendChunked(buf, callback)\n },\n final: (callback) => {\n if (!this.ws) {\n callback()\n return\n }\n // Delay the close frame slightly to allow the TCP stack to flush\n // all buffered send() data. Without this, the close frame can arrive\n // at the engine before all data frames, causing data truncation.\n const doClose = () => {\n if (this.ws) {\n this.ws.close(1000, 'stream_complete')\n }\n callback()\n }\n if (this.wsReady) {\n setTimeout(doClose, 10)\n } else {\n this.ws.on('open', () => setTimeout(doClose, 10))\n }\n },\n destroy: (err, callback) => {\n if (this.ws) this.ws.terminate()\n callback(err)\n },\n })\n }\n\n private ensureConnected(): void {\n if (this.ws) return\n this.ws = new WebSocket(this.url)\n\n this.ws.on('open', () => {\n this.wsReady = true\n for (const { data, callback } of this.pendingMessages) {\n this.ws?.send(data, callback)\n }\n this.pendingMessages.length = 0\n })\n\n this.ws.on('error', (err) => {\n this.stream.destroy(err)\n })\n\n this.ws.on('close', () => {\n if (!this.stream.destroyed) {\n this.stream.destroy()\n }\n })\n }\n\n /** Send a text message through the channel. */\n sendMessage(msg: string): void {\n this.ensureConnected()\n this.sendRaw(msg, (err) => {\n if (err) this.stream.destroy(err)\n })\n }\n\n /** Close the channel writer. */\n close(): void {\n if (!this.ws) return\n const doClose = () => {\n if (this.ws) {\n this.ws.close(1000, 'channel_close')\n }\n }\n if (this.wsReady) {\n doClose()\n } else {\n this.ws.on('open', () => doClose())\n }\n }\n\n private sendChunked(data: Buffer, callback: (err?: Error | null) => void): void {\n let offset = 0\n const sendNext = (err?: Error | null): void => {\n if (err) {\n callback(err)\n return\n }\n\n if (offset >= data.length) {\n callback(null)\n return\n }\n\n const end = Math.min(offset + ChannelWriter.FRAME_SIZE, data.length)\n const part = data.subarray(offset, end)\n offset = end\n this.sendRaw(part, sendNext)\n }\n sendNext(null)\n }\n\n private sendRaw(data: Buffer | string, callback: (err?: Error | null) => void): void {\n this.ensureConnected()\n if (this.wsReady && this.ws) {\n this.ws.send(data, (err) => callback(err ?? null))\n } else {\n this.pendingMessages.push({ data, callback })\n }\n }\n}\n\n/**\n * Read end of a streaming channel. Provides both a Node.js `Readable` stream\n * for binary data and an `onMessage` callback for structured text messages.\n *\n * @example\n * ```typescript\n * const channel = await iii.createChannel()\n *\n * // Stream binary data\n * channel.reader.stream.on('data', (chunk) => console.log(chunk))\n *\n * // Or receive text messages\n * channel.reader.onMessage((msg) => console.log('Got:', msg))\n * ```\n */\nexport class ChannelReader {\n private ws: WebSocket | null = null\n private connected = false\n private readonly messageCallbacks: Array<(msg: string) => void> = []\n /** Node.js Readable stream for binary data. */\n public readonly stream: Readable\n private readonly url: string\n\n constructor(engineWsBase: string, ref: StreamChannelRef) {\n this.url = buildChannelUrl(engineWsBase, ref.channel_id, ref.access_key, 'read')\n\n const self = this\n this.stream = new Readable({\n read() {\n self.ensureConnected()\n if (self.ws) self.ws.resume()\n },\n destroy(err, callback) {\n if (self.ws && self.ws.readyState !== WebSocket.CLOSED) {\n self.ws.terminate()\n }\n self.ws = null\n callback(err)\n },\n })\n }\n\n private ensureConnected(): void {\n if (this.connected) return\n this.connected = true\n this.ws = new WebSocket(this.url)\n\n this.ws.on('open', () => {\n ;(this.ws as unknown as { binaryType: string }).binaryType = 'nodebuffer'\n })\n\n this.ws.on('message', (data: Buffer, isBinary: boolean) => {\n if (isBinary) {\n if (!this.stream.push(data)) {\n this.ws?.pause()\n }\n } else {\n const msg = data.toString('utf-8')\n for (const cb of this.messageCallbacks) {\n cb(msg)\n }\n }\n })\n\n this.ws.on('close', () => {\n this.ws = null\n if (!this.stream.destroyed) this.stream.push(null)\n })\n\n this.ws.on('error', (err) => {\n this.stream.destroy(err)\n })\n }\n\n /** Register a callback to receive text messages from the channel. */\n onMessage(callback: (msg: string) => void): void {\n this.messageCallbacks.push(callback)\n }\n\n async readAll(): Promise<Buffer> {\n this.ensureConnected()\n const chunks: Buffer[] = []\n\n for await (const chunk of this.stream) {\n chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk))\n }\n\n return Buffer.concat(chunks)\n }\n\n close(): void {\n if (this.ws && this.ws.readyState !== WebSocket.CLOSED) {\n this.ws.close(1000, 'channel_close')\n }\n }\n}\n\nfunction buildChannelUrl(\n engineWsBase: string,\n channelId: string,\n accessKey: string,\n direction: 'read' | 'write',\n): string {\n const base = engineWsBase.replace(/\\/$/, '')\n return `${base}/ws/channels/${channelId}?key=${encodeURIComponent(accessKey)}&dir=${direction}`\n}\n","export enum MessageType {\n RegisterFunction = 'registerfunction',\n UnregisterFunction = 'unregisterfunction',\n RegisterService = 'registerservice',\n InvokeFunction = 'invokefunction',\n InvocationResult = 'invocationresult',\n RegisterTriggerType = 'registertriggertype',\n RegisterTrigger = 'registertrigger',\n UnregisterTrigger = 'unregistertrigger',\n UnregisterTriggerType = 'unregistertriggertype',\n TriggerRegistrationResult = 'triggerregistrationresult',\n WorkerRegistered = 'workerregistered',\n}\n\nexport type RegisterTriggerTypeMessage = {\n message_type: MessageType.RegisterTriggerType\n id: string\n description: string\n}\n\nexport type UnregisterTriggerTypeMessage = {\n message_type: MessageType.UnregisterTriggerType\n id: string\n}\n\nexport type UnregisterTriggerMessage = {\n message_type: MessageType.UnregisterTrigger\n id: string\n type?: string\n}\n\nexport type TriggerRegistrationResultMessage = {\n message_type: MessageType.TriggerRegistrationResult\n id: string\n type: string\n function_id: string\n result?: unknown\n error?: unknown\n}\n\nexport type RegisterTriggerMessage = {\n message_type: MessageType.RegisterTrigger\n id: string\n type: string\n function_id: string\n config: unknown\n}\n\nexport type RegisterServiceMessage = {\n message_type: MessageType.RegisterService\n id: string\n name?: string\n description?: string\n parent_service_id?: string\n}\n\n/**\n * Authentication configuration for HTTP-invoked functions.\n *\n * - `hmac` -- HMAC signature verification using a shared secret.\n * - `bearer` -- Bearer token authentication.\n * - `api_key` -- API key sent via a custom header.\n */\nexport type HttpAuthConfig =\n | { type: 'hmac'; secret_key: string }\n | { type: 'bearer'; token_key: string }\n | { type: 'api_key'; header: string; value_key: string }\n\n/**\n * Configuration for registering an HTTP-invoked function (Lambda, Cloudflare\n * Workers, etc.) instead of a local handler.\n */\nexport type HttpInvocationConfig = {\n /** URL to invoke. */\n url: string\n /** HTTP method. Defaults to `POST`. */\n method?: 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE'\n /** Timeout in milliseconds. */\n timeout_ms?: number\n /** Custom headers to send with the request. */\n headers?: Record<string, string>\n /** Authentication configuration. */\n auth?: HttpAuthConfig\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'\n /**\n * The body of the parameter\n */\n properties?: Record<string, RegisterFunctionFormat>\n /**\n * The items of the parameter\n */\n items?: RegisterFunctionFormat\n /**\n * Whether the parameter is required\n */\n required?: string[]\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 * Result returned when a function is invoked with `TriggerAction.Enqueue`.\n */\nexport type EnqueueResult = {\n /** Unique receipt ID for the enqueued message. */\n messageReceiptId: string\n}\n\n/**\n * Request object passed to {@link ISdk.trigger}.\n *\n * @typeParam TInput - Type of the payload.\n */\nexport type TriggerRequest<TInput = unknown> = {\n /** ID of the function to invoke. */\n function_id: string\n /** Payload to pass to the function. */\n payload: TInput\n /** Routing action. Omit for synchronous request/response. */\n action?: TriggerAction\n /** Override the default invocation timeout in milliseconds. */\n timeoutMs?: number\n}\n\nexport type InvokeFunctionMessage = {\n message_type: MessageType.InvokeFunction\n /**\n * This is optional for async invocations\n */\n invocation_id?: string\n /**\n * The path of the function\n */\n function_id: string\n /**\n * The data to pass to the function\n */\n data: unknown\n /**\n * W3C trace-context traceparent header for distributed tracing\n */\n traceparent?: string\n /**\n * W3C baggage header for cross-cutting context propagation\n */\n baggage?: string\n /**\n * Trigger action for queue routing or fire-and-forget\n */\n action?: TriggerAction\n}\n\nexport type InvocationResultMessage = {\n message_type: MessageType.InvocationResult\n /**\n * The id of the invocation\n */\n invocation_id: string\n /**\n * The path of the function\n */\n function_id: string\n result?: unknown\n error?: unknown\n /**\n * W3C trace-context traceparent header for distributed tracing\n */\n traceparent?: string\n /**\n * W3C baggage header for cross-cutting context propagation\n */\n baggage?: string\n}\n\n/**\n * Metadata about a registered function, returned by `ISdk.listFunctions`.\n */\nexport type FunctionInfo = {\n /** Unique function identifier. */\n function_id: string\n /** Human-readable description. */\n description?: string\n /** Schema describing expected request format. */\n request_format?: RegisterFunctionFormat\n /** Schema describing expected response format. */\n response_format?: RegisterFunctionFormat\n /** Arbitrary metadata attached to the function. */\n metadata?: Record<string, unknown>\n}\n\n/**\n * Information about a registered trigger.\n */\nexport type TriggerInfo = {\n /** Unique trigger identifier. */\n id: string\n /** Type of the trigger (e.g. `http`, `cron`, `queue`). */\n trigger_type: string\n /** ID of the function this trigger is bound to. */\n function_id: string\n /** Trigger-specific configuration. */\n config?: unknown\n}\n\n/** Worker connection status. */\nexport type WorkerStatus = 'connected' | 'available' | 'busy' | 'disconnected'\n\n/**\n * Metadata about a connected worker, returned by `ISdk.listWorkers`.\n */\nexport type WorkerInfo = {\n /** Unique worker identifier assigned by the engine. */\n id: string\n /** Display name of the worker. */\n name?: string\n /** Runtime environment (e.g. `node`, `python`, `rust`). */\n runtime?: string\n /** SDK version. */\n version?: string\n /** Operating system info. */\n os?: string\n /** IP address of the worker. */\n ip_address?: string\n /** Current connection status. */\n status: WorkerStatus\n /** Timestamp (ms since epoch) when the worker connected. */\n connected_at_ms: number\n /** Number of functions registered by this worker. */\n function_count: number\n /** List of function IDs registered by this worker. */\n functions: string[]\n /** Number of currently active invocations. */\n active_invocations: number\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 | RegisterServiceMessage\n | RegisterTriggerMessage\n | RegisterTriggerTypeMessage\n | UnregisterTriggerMessage\n | UnregisterTriggerTypeMessage\n | TriggerRegistrationResultMessage\n | WorkerRegisteredMessage\n","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 {\n DEFAULT_BRIDGE_RECONNECTION_CONFIG,\n DEFAULT_INVOCATION_TIMEOUT_MS,\n EngineFunctions,\n EngineTriggers,\n type IIIConnectionState,\n type IIIReconnectionConfig,\n} from './iii-constants'\nimport {\n type FunctionInfo,\n type HttpInvocationConfig,\n type IIIMessage,\n type InvocationResultMessage,\n type InvokeFunctionMessage,\n MessageType,\n type RegisterFunctionMessage,\n type RegisterServiceMessage,\n type RegisterTriggerMessage,\n type RegisterTriggerTypeMessage,\n type StreamChannelRef,\n type TriggerAction as TriggerActionType,\n type TriggerInfo,\n type TriggerRegistrationResultMessage,\n type TriggerRequest,\n type WorkerInfo,\n type WorkerRegisteredMessage,\n} from './iii-types'\nimport { registerWorkerGauges, stopWorkerGauges } from './otel-worker-gauges'\nimport type { IStream } from './stream'\nimport {\n extractContext,\n getLogger,\n getMeter,\n getTracer,\n initOtel,\n injectBaggage,\n injectTraceparent,\n type OtelConfig,\n SeverityNumber,\n shutdownOtel,\n SpanKind,\n withSpan,\n} from './telemetry-system'\nimport type { TriggerHandler } from './triggers'\nimport type {\n FunctionRef,\n FunctionsAvailableCallback,\n Invocation,\n ISdk,\n RemoteFunctionData,\n RemoteFunctionHandler,\n RemoteTriggerTypeData,\n Trigger,\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/** @internal */\nexport type TelemetryOptions = {\n language?: string\n project_name?: string\n framework?: string\n amplitude_api_key?: string\n}\n\n/**\n * Configuration options passed to {@link registerWorker}.\n *\n * @example\n * ```typescript\n * const iii = registerWorker('ws://localhost: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 /** 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 /** @internal */\n telemetry?: TelemetryOptions\n}\n\nclass Sdk implements ISdk {\n private ws?: WebSocket\n private functions = new Map<string, RemoteFunctionData>()\n private services = new Map<string, Omit<RegisterServiceMessage, 'functions'>>()\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 functionsAvailableCallbacks = new Set<FunctionsAvailableCallback>()\n private functionsAvailableTrigger?: Trigger\n private functionsAvailableFunctionPath?: string\n private messagesToSend: Record<string, unknown>[] = []\n private workerName: 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.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 * iii.registerTriggerType(\n * { id: 'my-trigger', description: 'Custom trigger' },\n * {\n * async registerTrigger({ id, function_id, config }) { },\n * async unregisterTrigger({ id, function_id, config }) { },\n * },\n * )\n * ```\n */\n registerTriggerType = <TConfig>(\n triggerType: Omit<RegisterTriggerTypeMessage, 'message_type'>,\n handler: TriggerHandler<TConfig>,\n ): void => {\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\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`, `queue`, `cron`).\n * @param trigger.function_id - ID of the function to invoke.\n * @param trigger.config - Trigger-specific configuration.\n * @returns A {@link Trigger} handle with an `unregister()` method.\n *\n * @example\n * ```typescript\n * const trigger = iii.registerTrigger({\n * type: 'http',\n * function_id: 'greet',\n * config: { api_path: '/greet', http_method: 'GET' },\n * })\n *\n * // Later...\n * trigger.unregister()\n * ```\n */\n registerTrigger = (trigger: Omit<RegisterTriggerMessage, 'message_type' | 'id'>): Trigger => {\n const id = crypto.randomUUID()\n const fullTrigger: RegisterTriggerMessage = {\n ...trigger,\n id,\n message_type: MessageType.RegisterTrigger,\n }\n this.sendMessage(MessageType.RegisterTrigger, fullTrigger, true)\n this.triggers.set(id, fullTrigger)\n\n return {\n unregister: () => {\n this.sendMessage(MessageType.UnregisterTrigger, {\n id,\n message_type: MessageType.UnregisterTrigger,\n type: fullTrigger.type,\n })\n this.triggers.delete(id)\n },\n }\n }\n\n /**\n * Registers a function with the engine. The `id` 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 message - Function registration input.\n * @param message.id - Unique function identifier.\n * @param message.description - Human-readable description.\n * @param handlerOrInvocation - Async handler or HTTP invocation config.\n * @returns A {@link FunctionRef} with `id` and `unregister()`.\n *\n * @example\n * ```typescript\n * const fn = iii.registerFunction(\n * { id: 'greet', description: 'Greets a user' },\n * async (input: { name: string }) => {\n * return { message: `Hello, ${input.name}!` }\n * },\n * )\n * ```\n */\n registerFunction = (\n message: Omit<RegisterFunctionMessage, 'message_type'>,\n handlerOrInvocation: RemoteFunctionHandler | HttpInvocationConfig,\n ): FunctionRef => {\n if (!message.id || message.id.trim() === '') {\n throw new Error('id is required')\n }\n if (this.functions.has(message.id)) {\n throw new Error(`function id already registered: ${message.id}`)\n }\n\n const isHandler = typeof handlerOrInvocation === 'function'\n\n const fullMessage: RegisterFunctionMessage = isHandler\n ? { ...message, message_type: MessageType.RegisterFunction }\n : {\n ...message,\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(message.id, {\n message: fullMessage,\n handler: async (input, traceparent?: string, baggage?: string) => {\n if (getTracer()) {\n const parentContext = extractContext(traceparent, baggage)\n\n return context.with(parentContext, () =>\n withSpan(`call ${message.id}`, { kind: SpanKind.SERVER }, async () => await handler(input)),\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 handler(input))\n },\n })\n } else {\n this.functions.set(message.id, { message: fullMessage })\n }\n\n return {\n id: message.id,\n unregister: () => {\n this.sendMessage(MessageType.UnregisterFunction, { id: message.id }, true)\n this.functions.delete(message.id)\n },\n }\n }\n\n registerService = (message: Omit<RegisterServiceMessage, 'message_type'>): void => {\n const msg = { ...message, name: message.name ?? message.id }\n this.sendMessage(MessageType.RegisterService, msg, true)\n this.services.set(message.id, { ...msg, message_type: MessageType.RegisterService })\n }\n\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 * @param bufferSize - Optional buffer size for the channel (default: 64).\n * @returns A {@link Channel} with `writer`, `reader`, and their serializable refs.\n *\n * @example\n * ```typescript\n * const channel = await iii.createChannel()\n * channel.writer.stream.write(Buffer.from('hello'))\n * channel.writer.close()\n * ```\n */\n createChannel = 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 iii.trigger({ function_id: 'get-order', payload: { id: '123' } })\n *\n * // Enqueue\n * const { messageReceiptId } = await iii.trigger({\n * function_id: 'payments::charge',\n * payload: { orderId: '123', amount: 49.99 },\n * action: TriggerAction.Enqueue({ queue: 'payment' }),\n * })\n *\n * // Fire-and-forget\n * iii.trigger({\n * function_id: 'notifications::send',\n * payload: { userId: '123' },\n * action: TriggerAction.Void(),\n * })\n * ```\n */\n trigger = async <TInput, TOutput>(request: TriggerRequest<TInput>): Promise<TOutput> => {\n const { function_id, payload, action, timeoutMs } = request\n const effectiveTimeout = timeoutMs ?? this.invocationTimeoutMs\n\n // 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(new Error(`Invocation timeout after ${effectiveTimeout}ms: ${function_id}`))\n }\n }, effectiveTimeout)\n\n this.invocations.set(invocation_id, {\n resolve: (result: TOutput) => {\n clearTimeout(timeout)\n resolve(result)\n },\n reject: (error: unknown) => {\n clearTimeout(timeout)\n reject(error)\n },\n timeout,\n })\n\n this.sendMessage(MessageType.InvokeFunction, {\n invocation_id,\n function_id,\n data: payload,\n traceparent,\n baggage,\n action,\n })\n })\n }\n\n /**\n * Lists all functions registered with the engine across all connected workers.\n *\n * @returns An array of {@link FunctionInfo} objects.\n *\n * @example\n * ```typescript\n * const functions = await iii.listFunctions()\n * functions.forEach(fn => console.log(fn.function_id))\n * ```\n */\n listFunctions = async (): Promise<FunctionInfo[]> => {\n const result = await this.trigger<Record<string, never>, { functions: FunctionInfo[] }>({\n function_id: EngineFunctions.LIST_FUNCTIONS,\n payload: {},\n })\n return result.functions\n }\n\n /**\n * Lists all connected workers.\n *\n * @returns An array of {@link WorkerInfo} objects.\n */\n listWorkers = async (): Promise<WorkerInfo[]> => {\n const result = await this.trigger<Record<string, never>, { workers: WorkerInfo[] }>({\n function_id: EngineFunctions.LIST_WORKERS,\n payload: {},\n })\n return result.workers\n }\n\n listTriggers = async (includeInternal = false): Promise<TriggerInfo[]> => {\n const result = await this.trigger<{ include_internal: boolean }, { triggers: TriggerInfo[] }>({\n function_id: EngineFunctions.LIST_TRIGGERS,\n payload: { include_internal: includeInternal },\n })\n return result.triggers\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 os: getOsInfo(),\n pid: process.pid,\n telemetry: {\n language,\n project_name: telemetryOpts?.project_name,\n framework: telemetryOpts?.framework,\n amplitude_api_key: telemetryOpts?.amplitude_api_key,\n },\n },\n action: { type: 'void' },\n })\n }\n\n /**\n * Registers a custom stream implementation, overriding the engine default\n * for the given stream name.\n *\n * Registers 5 of the 6 `IStream` methods (`get`, `set`, `delete`, `list`,\n * `listGroups`). The `update` method is not registered -- atomic updates are\n * handled by the engine's built-in stream update logic.\n *\n * @param streamName - Name of the stream.\n * @param stream - Object implementing the {@link IStream} interface.\n *\n * @example\n * ```typescript\n * iii.createStream('my-stream', {\n * async get(input) { return null },\n * async set(input) { return null },\n * async delete(input) { return { old_value: undefined } },\n * async list(input) { return [] },\n * async listGroups(input) { return [] },\n * async update(input) { return null },\n * })\n * ```\n */\n createStream = <TData>(streamName: string, stream: IStream<TData>): void => {\n this.registerFunction({ id: `stream::get(${streamName})` }, stream.get.bind(stream))\n this.registerFunction({ id: `stream::set(${streamName})` }, stream.set.bind(stream))\n this.registerFunction({ id: `stream::delete(${streamName})` }, stream.delete.bind(stream))\n this.registerFunction({ id: `stream::list(${streamName})` }, stream.list.bind(stream))\n this.registerFunction({ id: `stream::list_groups(${streamName})` }, stream.listGroups.bind(stream))\n }\n\n /**\n * Subscribes to function availability events from the engine. The callback\n * fires whenever the set of available functions changes.\n *\n * @param callback - Receives the current list of {@link FunctionInfo} objects.\n * @returns An unsubscribe function.\n *\n * @example\n * ```typescript\n * const unsub = iii.onFunctionsAvailable((functions) => {\n * console.log('Available:', functions.map(f => f.function_id))\n * })\n *\n * // Later...\n * unsub()\n * ```\n */\n onFunctionsAvailable = (callback: FunctionsAvailableCallback): (() => void) => {\n this.functionsAvailableCallbacks.add(callback)\n\n if (!this.functionsAvailableTrigger) {\n if (!this.functionsAvailableFunctionPath) {\n this.functionsAvailableFunctionPath = `engine.on_functions_available.${crypto.randomUUID()}`\n }\n\n const function_id = this.functionsAvailableFunctionPath\n if (!this.functions.has(function_id)) {\n this.registerFunction({ id: function_id }, async ({ functions }: { functions: FunctionInfo[] }) => {\n this.functionsAvailableCallbacks.forEach((handler) => {\n handler(functions)\n })\n return null\n })\n }\n\n this.functionsAvailableTrigger = this.registerTrigger({\n type: EngineTriggers.FUNCTIONS_AVAILABLE,\n function_id,\n config: {},\n })\n }\n\n return () => {\n this.functionsAvailableCallbacks.delete(callback)\n if (this.functionsAvailableCallbacks.size === 0 && this.functionsAvailableTrigger) {\n this.functionsAvailableTrigger.unregister()\n this.functionsAvailableTrigger = undefined\n }\n }\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\n if (this.ws) {\n this.ws.removeAllListeners()\n this.ws.close()\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)\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.services.forEach((service) => {\n this.sendMessage(MessageType.RegisterService, service, 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 error ? invocation.reject(error) : invocation.resolve(result)\n }\n\n this.invocations.delete(invocation_id)\n }\n\n private resolveChannelValue(value: unknown): unknown {\n if (isChannelRef(value)) {\n return value.direction === 'read'\n ? new ChannelReader(this.address, value)\n : new ChannelWriter(this.address, value)\n }\n if (Array.isArray(value)) {\n return value.map((item) => this.resolveChannelValue(item))\n }\n if (value !== null && typeof value === 'object') {\n const out: Record<string, unknown> = {}\n for (const [k, v] of Object.entries(value as Record<string, unknown>)) {\n out[k] = this.resolveChannelValue(v)\n }\n return out\n }\n return value\n }\n\n private async onInvokeFunction<TInput>(\n invocation_id: string | undefined,\n function_id: string,\n input: TInput,\n traceparent?: string,\n baggage?: string,\n ): Promise<unknown> {\n const fn = this.functions.get(function_id)\n 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 }) {\n const { trigger_type, id, function_id, config } = message\n const triggerTypeData = this.triggerTypes.get(trigger_type)\n\n if (triggerTypeData) {\n try {\n await triggerTypeData.handler.registerTrigger({ id, function_id, config })\n this.sendMessage(MessageType.TriggerRegistrationResult, {\n id,\n message_type: MessageType.TriggerRegistrationResult,\n type: trigger_type,\n function_id,\n })\n } catch (error) {\n this.sendMessage(MessageType.TriggerRegistrationResult, {\n id,\n message_type: MessageType.TriggerRegistrationResult,\n type: trigger_type,\n function_id,\n error: { code: 'trigger_registration_failed', message: (error as Error).message },\n })\n }\n } else {\n this.sendMessage(MessageType.TriggerRegistrationResult, {\n id,\n message_type: MessageType.TriggerRegistrationResult,\n type: trigger_type,\n function_id,\n error: { code: 'trigger_type_not_found', message: 'Trigger type not found' },\n })\n }\n }\n\n private 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 })\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 ISdk.trigger}.\n *\n * @example\n * ```typescript\n * import { TriggerAction } from 'iii-sdk'\n *\n * // Enqueue to a named queue\n * iii.trigger({\n * function_id: 'process',\n * payload: { data: 'hello' },\n * action: TriggerAction.Enqueue({ queue: 'jobs' }),\n * })\n *\n * // Fire-and-forget\n * iii.trigger({\n * function_id: 'notify',\n * payload: {},\n * action: TriggerAction.Void(),\n * })\n * ```\n */\nexport const TriggerAction = {\n /**\n * Routes the invocation through a named queue. The engine enqueues the job,\n * acknowledges the caller with `{ messageReceiptId }`, and processes it\n * asynchronously.\n *\n * @param opts - Queue routing options.\n * @param opts.queue - Name of the target queue.\n */\n Enqueue: (opts: { queue: string }): TriggerActionType => ({ type: 'enqueue', ...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: (): TriggerActionType => ({ type: 'void' }),\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 ISdk} instance.\n *\n * @example\n * ```typescript\n * import { registerWorker } from 'iii-sdk'\n *\n * const iii = registerWorker(process.env.III_URL ?? 'ws://localhost:49134', {\n * workerName: 'my-worker',\n * })\n * ```\n */\nexport const registerWorker = (address: string, options?: InitOptions): ISdk => new Sdk(address, options)\n","import { AnyValue, AnyValueMap, SeverityNumber } from '@opentelemetry/api-logs'\nimport {\n currentSpanId,\n currentTraceId,\n getLogger as getOtelLogger,\n} from './telemetry-system'\n\n/** @internal */\nexport type LoggerParams = {\n message: string\n trace_id?: string\n span_id?: string\n service_name?: string\n data?: unknown\n /** @deprecated Use service_name instead */\n function_name?: string\n}\n\n/**\n * Structured logger that emits logs as OpenTelemetry LogRecords.\n *\n * Every log call automatically captures the active trace and span context,\n * correlating your logs with distributed traces without any manual wiring.\n * When OTel is not initialized, Logger gracefully falls back to `console.*`.\n *\n * Pass structured data as the second argument to any log method. Using an\n * object of key-value pairs (instead of string interpolation) lets you\n * filter, aggregate, and build dashboards in your observability backend.\n *\n * @example\n * ```typescript\n * import { Logger } from 'iii-sdk'\n *\n * const logger = new Logger()\n *\n * // Basic logging — trace context is injected automatically\n * logger.info('Worker connected')\n *\n * // Structured context for dashboards and alerting\n * logger.info('Order processed', { orderId: 'ord_123', amount: 49.99, currency: 'USD' })\n * logger.warn('Retry attempt', { attempt: 3, maxRetries: 5, endpoint: '/api/charge' })\n * logger.error('Payment failed', { orderId: 'ord_123', gateway: 'stripe', errorCode: 'card_declined' })\n * ```\n */\nexport class Logger {\n private _otelLogger: ReturnType<typeof getOtelLogger> | null = null\n\n private get otelLogger() {\n // Lazy initialization: re-fetch logger if not yet available\n if (!this._otelLogger) {\n this._otelLogger = getOtelLogger()\n }\n return this._otelLogger\n }\n\n constructor(\n private readonly traceId?: string,\n private readonly serviceName?: string,\n private readonly spanId?: string,\n ) {}\n\n private emit(message: string, severity: SeverityNumber, data?: unknown): void {\n const attributes: AnyValueMap = {}\n const traceId = this.traceId ?? currentTraceId()\n const spanId = this.spanId ?? currentSpanId()\n\n if (traceId) {\n attributes.trace_id = traceId\n }\n if (spanId) {\n attributes.span_id = spanId\n }\n if (this.serviceName) {\n attributes['service.name'] = this.serviceName\n }\n if (data !== undefined) {\n attributes['log.data'] = data as AnyValue\n }\n\n if (this.otelLogger) {\n this.otelLogger.emit({\n severityNumber: severity,\n body: message,\n attributes: Object.keys(attributes).length > 0 ? attributes : undefined,\n })\n } else {\n // Fallback to console when OTEL is not available\n switch (severity) {\n case SeverityNumber.DEBUG:\n console.debug(message, data)\n break\n case SeverityNumber.INFO:\n console.info(message, data)\n break\n case SeverityNumber.WARN:\n console.warn(message, data)\n break\n case SeverityNumber.ERROR:\n console.error(message, data)\n break\n default:\n console.log(message, data)\n }\n }\n }\n\n /**\n * Log an info-level message.\n *\n * @param message - Human-readable log message.\n * @param data - Structured context attached as OTel log attributes.\n * Use key-value objects to enable filtering and aggregation in your\n * observability backend (e.g. Grafana, Datadog, New Relic).\n *\n * @example\n * ```typescript\n * logger.info('Order processed', { orderId: 'ord_123', status: 'completed' })\n * ```\n */\n info(message: string, data?: unknown): void {\n this.emit(message, SeverityNumber.INFO, data)\n }\n\n /**\n * Log a warning-level message.\n *\n * @param message - Human-readable log message.\n * @param data - Structured context attached as OTel log attributes.\n * Use key-value objects to enable filtering and aggregation in your\n * observability backend (e.g. Grafana, Datadog, New Relic).\n *\n * @example\n * ```typescript\n * logger.warn('Retry attempt', { attempt: 3, maxRetries: 5, endpoint: '/api/charge' })\n * ```\n */\n warn(message: string, data?: unknown): void {\n this.emit(message, SeverityNumber.WARN, data)\n }\n\n /**\n * Log an error-level message.\n *\n * @param message - Human-readable log message.\n * @param data - Structured context attached as OTel log attributes.\n * Use key-value objects to enable filtering and aggregation in your\n * observability backend (e.g. Grafana, Datadog, New Relic).\n *\n * @example\n * ```typescript\n * logger.error('Payment failed', { orderId: 'ord_123', gateway: 'stripe', errorCode: 'card_declined' })\n * ```\n */\n error(message: string, data?: unknown): void {\n this.emit(message, SeverityNumber.ERROR, data)\n }\n\n /**\n * Log a debug-level message.\n *\n * @param message - Human-readable log message.\n * @param data - Structured context attached as OTel log attributes.\n * Use key-value objects to enable filtering and aggregation in your\n * observability backend (e.g. Grafana, Datadog, New Relic).\n *\n * @example\n * ```typescript\n * logger.debug('Cache lookup', { key: 'user:42', hit: false })\n * ```\n */\n debug(message: string, data?: unknown): void {\n this.emit(message, SeverityNumber.DEBUG, data)\n }\n}\n"],"mappings":"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"}
|
package/dist/index.d.cts
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
|
-
import { $ as ChannelWriter, Q as ChannelReader, U as OtelConfig, X as IIIReconnectionConfig, _ as RemoteFunctionHandler, a as Channel, b as TriggerHandler, c as HttpRequest, ct as RegisterTriggerTypeMessage, d as InternalHttpRequest, dt as TriggerInfo, et as EnqueueResult, ft as TriggerRequest, g as RegisterTriggerTypeInput, h as RegisterTriggerInput, i as ApiResponse, it as MessageType, l as HttpResponse, lt as StreamChannelRef, m as RegisterServiceInput, nt as HttpAuthConfig, o as FunctionRef, ot as RegisterFunctionMessage, p as RegisterFunctionInput, r as ApiRequest, rt as HttpInvocationConfig, st as RegisterTriggerMessage, t as http, u as ISdk, ut as TriggerAction$1, v as Trigger, y as TriggerConfig } from "./utils-
|
|
1
|
+
import { $ as ChannelWriter, Q as ChannelReader, U as OtelConfig, X as IIIReconnectionConfig, _ as RemoteFunctionHandler, a as Channel, b as TriggerHandler, c as HttpRequest, ct as RegisterTriggerTypeMessage, d as InternalHttpRequest, dt as TriggerInfo, et as EnqueueResult, ft as TriggerRequest, g as RegisterTriggerTypeInput, h as RegisterTriggerInput, i as ApiResponse, it as MessageType, l as HttpResponse, lt as StreamChannelRef, m as RegisterServiceInput, nt as HttpAuthConfig, o as FunctionRef, ot as RegisterFunctionMessage, p as RegisterFunctionInput, r as ApiRequest, rt as HttpInvocationConfig, st as RegisterTriggerMessage, t as http, u as ISdk, ut as TriggerAction$1, v as Trigger, y as TriggerConfig } from "./utils-BvWlFlLq.cjs";
|
|
2
2
|
|
|
3
3
|
//#region src/iii.d.ts
|
|
4
|
-
|
|
5
4
|
/** @internal */
|
|
6
5
|
type TelemetryOptions = {
|
|
7
6
|
language?: string;
|
|
@@ -22,11 +21,8 @@ type TelemetryOptions = {
|
|
|
22
21
|
* ```
|
|
23
22
|
*/
|
|
24
23
|
type InitOptions = {
|
|
25
|
-
/** Display name for this worker. Defaults to `hostname:pid`. */
|
|
26
|
-
|
|
27
|
-
/** Enable worker metrics via OpenTelemetry. Defaults to `true`. */
|
|
28
|
-
enableMetricsReporting?: boolean;
|
|
29
|
-
/** Default timeout for `trigger()` in milliseconds. Defaults to `30000`. */
|
|
24
|
+
/** Display name for this worker. Defaults to `hostname:pid`. */workerName?: string; /** Enable worker metrics via OpenTelemetry. Defaults to `true`. */
|
|
25
|
+
enableMetricsReporting?: boolean; /** Default timeout for `trigger()` in milliseconds. Defaults to `30000`. */
|
|
30
26
|
invocationTimeoutMs?: number;
|
|
31
27
|
/**
|
|
32
28
|
* WebSocket reconnection behavior.
|
|
@@ -39,8 +35,7 @@ type InitOptions = {
|
|
|
39
35
|
* Set `{ enabled: false }` or env `OTEL_ENABLED=false/0/no/off` to disable.
|
|
40
36
|
* The `engineWsUrl` is set automatically from the III address.
|
|
41
37
|
*/
|
|
42
|
-
otel?: Omit<OtelConfig, 'engineWsUrl'>;
|
|
43
|
-
/** @internal */
|
|
38
|
+
otel?: Omit<OtelConfig, 'engineWsUrl'>; /** @internal */
|
|
44
39
|
telemetry?: TelemetryOptions;
|
|
45
40
|
};
|
|
46
41
|
/**
|
package/dist/index.d.cts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.cts","names":[],"sources":["../src/iii.ts","../src/logger.ts"],"
|
|
1
|
+
{"version":3,"file":"index.d.cts","names":[],"sources":["../src/iii.ts","../src/logger.ts"],"mappings":";;;;KAyEY,gBAAA;EACV,QAAA;EACA,YAAA;EACA,SAAA;EACA,iBAAA;AAAA;;;AAeF;;;;;;;;;;KAAY,WAAA;EAIV,gEAFA,UAAA,WAUA;EARA,sBAAA,YAQ6B;EAN7B,mBAAA;EAYO;;;;;EANP,kBAAA,GAAqB,OAAA,CAAQ,qBAAA;EAi4BlB;;;;;EA33BX,IAAA,GAAO,IAAA,CAAK,UAAA;EAEZ,SAAA,GAAY,gBAAA;AAAA;;;;AA25Bd;;;;;;;;;;;;;AC/9BA;;;;;;cD67Ba,aAAA;EC57BH;;;;;;;;EAAA;IDq8BU,KAAA;EAAA,MAAkB,eAAA;EC12B/B;;;;EAAA,qBD+2BK,eAAA;AAAA;;;;;;;;;;;;;;;;;;cAoBC,cAAA,GAAkB,OAAA,UAAiB,OAAA,GAAU,WAAA,KAAc,IAAA;;;;;;AA/6BxE;;;;;;;;;;;;;;;;;;;;;;;cChDa,MAAA;EAAA,iBAYQ,OAAA;EAAA,iBACA,WAAA;EAAA,iBACA,MAAA;EAAA,QAbX,WAAA;EAAA,YAEI,UAAA,CAAA;cASO,OAAA,uBACA,WAAA,uBACA,MAAA;EAAA,QAGX,IAAA;;;;;AD88BV;;;;;;;;;ECp5BE,IAAA,CAAK,OAAA,UAAiB,IAAA;;;;AA3ExB;;;;;;;;;;EA4FE,IAAA,CAAK,OAAA,UAAiB,IAAA;EA/EH;;;;;;;;;;;;;EAgGnB,KAAA,CAAM,OAAA,UAAiB,IAAA;EAiBA;;;;;;;;;;;;;EAAvB,KAAA,CAAM,OAAA,UAAiB,IAAA;AAAA"}
|