iii-sdk 0.12.0 → 0.13.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 +1 -17
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +2 -2
- package/dist/index.d.cts.map +1 -1
- package/dist/index.d.mts +2 -2
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +1 -17
- package/dist/index.mjs.map +1 -1
- package/dist/{telemetry-system-IPGWo6Uk.cjs → telemetry-system-BGZS9Vit.cjs} +15 -3
- package/dist/telemetry-system-BGZS9Vit.cjs.map +1 -0
- package/dist/{telemetry-system-CFshsuNv.mjs → telemetry-system-DMHiN8V9.mjs} +16 -4
- package/dist/telemetry-system-DMHiN8V9.mjs.map +1 -0
- package/dist/telemetry.cjs +1 -5
- package/dist/telemetry.d.cts +2 -2
- package/dist/telemetry.d.mts +2 -2
- package/dist/telemetry.mjs +2 -2
- package/dist/{utils-pbn8jUT-.d.cts → utils-DhgysSJS.d.cts} +17 -75
- package/dist/utils-DhgysSJS.d.cts.map +1 -0
- package/dist/{utils-CeudjtzM.d.mts → utils-oTg3ZAbD.d.mts} +17 -75
- package/dist/utils-oTg3ZAbD.d.mts.map +1 -0
- package/package.json +1 -1
- package/dist/telemetry-system-CFshsuNv.mjs.map +0 -1
- package/dist/telemetry-system-IPGWo6Uk.cjs.map +0 -1
- package/dist/utils-CeudjtzM.d.mts.map +0 -1
- package/dist/utils-pbn8jUT-.d.cts.map +0 -1
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { n as IStream } from "./stream-0aOn-1J0.cjs";
|
|
2
2
|
import { Readable, Writable } from "node:stream";
|
|
3
|
-
import { AttributeValue, Attributes, Context, Meter as Meter$1, Span as Span$1, SpanKind
|
|
3
|
+
import { AttributeValue, Attributes, Context, Meter as Meter$1, Span as Span$1, SpanKind } from "@opentelemetry/api";
|
|
4
4
|
import { Logger, SeverityNumber } from "@opentelemetry/api-logs";
|
|
5
5
|
import { Instrumentation } from "@opentelemetry/instrumentation";
|
|
6
6
|
import { ReadableSpan, Span, SpanProcessor } from "@opentelemetry/sdk-trace-base";
|
|
@@ -9,7 +9,6 @@ import { ReadableSpan, Span, SpanProcessor } from "@opentelemetry/sdk-trace-base
|
|
|
9
9
|
declare enum MessageType {
|
|
10
10
|
RegisterFunction = "registerfunction",
|
|
11
11
|
UnregisterFunction = "unregisterfunction",
|
|
12
|
-
RegisterService = "registerservice",
|
|
13
12
|
InvokeFunction = "invokefunction",
|
|
14
13
|
InvocationResult = "invocationresult",
|
|
15
14
|
RegisterTriggerType = "registertriggertype",
|
|
@@ -32,13 +31,6 @@ type RegisterTriggerMessage = {
|
|
|
32
31
|
config: unknown;
|
|
33
32
|
metadata?: Record<string, unknown>;
|
|
34
33
|
};
|
|
35
|
-
type RegisterServiceMessage = {
|
|
36
|
-
message_type: MessageType.RegisterService;
|
|
37
|
-
id: string;
|
|
38
|
-
name?: string;
|
|
39
|
-
description?: string;
|
|
40
|
-
parent_service_id?: string;
|
|
41
|
-
};
|
|
42
34
|
/**
|
|
43
35
|
* Authentication configuration for HTTP-invoked functions.
|
|
44
36
|
*
|
|
@@ -251,54 +243,6 @@ type TriggerRequest<TInput = unknown> = {
|
|
|
251
243
|
action?: TriggerAction; /** Override the default invocation timeout in milliseconds. */
|
|
252
244
|
timeoutMs?: number;
|
|
253
245
|
};
|
|
254
|
-
/**
|
|
255
|
-
* Metadata about a registered function, returned by the `engine::functions::list` trigger.
|
|
256
|
-
*/
|
|
257
|
-
type FunctionInfo = {
|
|
258
|
-
/** Unique function identifier. */function_id: string; /** Human-readable description. */
|
|
259
|
-
description?: string; /** Schema describing expected request format. */
|
|
260
|
-
request_format?: RegisterFunctionFormat; /** Schema describing expected response format. */
|
|
261
|
-
response_format?: RegisterFunctionFormat; /** Arbitrary metadata attached to the function. */
|
|
262
|
-
metadata?: Record<string, unknown>;
|
|
263
|
-
};
|
|
264
|
-
/**
|
|
265
|
-
* Information about a registered trigger.
|
|
266
|
-
*/
|
|
267
|
-
type TriggerInfo = {
|
|
268
|
-
/** Unique trigger identifier. */id: string; /** Type of the trigger (e.g. `http`, `cron`, `queue`). */
|
|
269
|
-
trigger_type: string; /** ID of the function this trigger is bound to. */
|
|
270
|
-
function_id: string; /** Trigger-specific configuration. */
|
|
271
|
-
config?: unknown; /** Arbitrary metadata attached to the trigger. */
|
|
272
|
-
metadata?: Record<string, unknown>;
|
|
273
|
-
};
|
|
274
|
-
/**
|
|
275
|
-
* Information about a registered trigger type, returned by the `engine::trigger-types::list` trigger.
|
|
276
|
-
*/
|
|
277
|
-
type TriggerTypeInfo = {
|
|
278
|
-
/** Trigger type identifier (e.g. `http`, `cron`, `queue`). */id: string; /** Human-readable description of the trigger type. */
|
|
279
|
-
description: string; /** JSON Schema for the trigger configuration. */
|
|
280
|
-
trigger_request_format?: unknown; /** JSON Schema for the call request payload. */
|
|
281
|
-
call_request_format?: unknown;
|
|
282
|
-
};
|
|
283
|
-
/** Worker connection status. */
|
|
284
|
-
type WorkerStatus = 'connected' | 'available' | 'busy' | 'disconnected';
|
|
285
|
-
/**
|
|
286
|
-
* Metadata about a connected worker, returned by the `engine::workers::list` trigger.
|
|
287
|
-
*/
|
|
288
|
-
type WorkerInfo = {
|
|
289
|
-
/** Unique worker identifier assigned by the engine. */id: string; /** Display name of the worker. */
|
|
290
|
-
name?: string; /** Runtime environment (e.g. `node`, `python`, `rust`). */
|
|
291
|
-
runtime?: string; /** SDK version. */
|
|
292
|
-
version?: string; /** Operating system info. */
|
|
293
|
-
os?: string; /** IP address of the worker. */
|
|
294
|
-
ip_address?: string; /** Current connection status. */
|
|
295
|
-
status: WorkerStatus; /** Timestamp (ms since epoch) when the worker connected. */
|
|
296
|
-
connected_at_ms: number; /** Number of functions registered by this worker. */
|
|
297
|
-
function_count: number; /** List of function IDs registered by this worker. */
|
|
298
|
-
functions: string[]; /** Number of currently active invocations. */
|
|
299
|
-
active_invocations: number; /** Self-reported isolation context (e.g. `libkrun`, `docker`, `k8s`). */
|
|
300
|
-
isolation?: string | null;
|
|
301
|
-
};
|
|
302
246
|
/**
|
|
303
247
|
* Serializable reference to one end of a streaming channel. Can be included
|
|
304
248
|
* in invocation payloads to pass channel endpoints between workers.
|
|
@@ -378,12 +322,24 @@ declare class ChannelReader {
|
|
|
378
322
|
/**
|
|
379
323
|
* Constants for the III module.
|
|
380
324
|
*/
|
|
381
|
-
/**
|
|
325
|
+
/**
|
|
326
|
+
* Engine function paths for internal operations.
|
|
327
|
+
*
|
|
328
|
+
* Naming note: `LIST_TRIGGERS` / `INFO_TRIGGERS` cover trigger TYPES
|
|
329
|
+
* (templates). `LIST_REGISTERED_TRIGGERS` / `INFO_REGISTERED_TRIGGERS`
|
|
330
|
+
* cover trigger INSTANCES (subscriber rows). The old
|
|
331
|
+
* `engine::trigger-types::list` builtin has been removed and is now
|
|
332
|
+
* served by `engine::triggers::list`.
|
|
333
|
+
*/
|
|
382
334
|
declare const EngineFunctions: {
|
|
383
335
|
readonly LIST_FUNCTIONS: "engine::functions::list";
|
|
336
|
+
readonly INFO_FUNCTIONS: "engine::functions::info";
|
|
384
337
|
readonly LIST_WORKERS: "engine::workers::list";
|
|
338
|
+
readonly INFO_WORKERS: "engine::workers::info";
|
|
385
339
|
readonly LIST_TRIGGERS: "engine::triggers::list";
|
|
386
|
-
readonly
|
|
340
|
+
readonly INFO_TRIGGERS: "engine::triggers::info";
|
|
341
|
+
readonly LIST_REGISTERED_TRIGGERS: "engine::registered-triggers::list";
|
|
342
|
+
readonly INFO_REGISTERED_TRIGGERS: "engine::registered-triggers::info";
|
|
387
343
|
readonly REGISTER_WORKER: "engine::workers::register";
|
|
388
344
|
};
|
|
389
345
|
/** Engine trigger types */
|
|
@@ -553,14 +509,6 @@ declare function initOtel(config?: OtelConfig): void;
|
|
|
553
509
|
* Shutdown OpenTelemetry, flushing any pending data.
|
|
554
510
|
*/
|
|
555
511
|
declare function shutdownOtel(): Promise<void>;
|
|
556
|
-
/**
|
|
557
|
-
* Get the OpenTelemetry tracer instance.
|
|
558
|
-
*/
|
|
559
|
-
declare function getTracer(): Tracer | null;
|
|
560
|
-
/**
|
|
561
|
-
* Get the OpenTelemetry meter instance.
|
|
562
|
-
*/
|
|
563
|
-
declare function getMeter(): Meter$1 | null;
|
|
564
512
|
/**
|
|
565
513
|
* Get the OpenTelemetry logger instance.
|
|
566
514
|
*/
|
|
@@ -640,7 +588,6 @@ type OtelLogEvent = {
|
|
|
640
588
|
instrumentation_scope_version?: string;
|
|
641
589
|
};
|
|
642
590
|
type RegisterTriggerInput = Omit<RegisterTriggerMessage, 'message_type' | 'id'>;
|
|
643
|
-
type RegisterServiceInput = Omit<RegisterServiceMessage, 'message_type'>;
|
|
644
591
|
type RegisterFunctionInput = Omit<RegisterFunctionMessage, 'message_type'>;
|
|
645
592
|
type RegisterFunctionOptions = Omit<RegisterFunctionMessage, 'message_type' | 'id'>;
|
|
646
593
|
type RegisterTriggerTypeInput = Omit<RegisterTriggerTypeMessage, 'message_type'>;
|
|
@@ -663,11 +610,6 @@ interface ISdk {
|
|
|
663
610
|
* ```
|
|
664
611
|
*/
|
|
665
612
|
registerTrigger(trigger: RegisterTriggerInput): Trigger;
|
|
666
|
-
/**
|
|
667
|
-
* Registers a new service.
|
|
668
|
-
* @param message - The service to register
|
|
669
|
-
*/
|
|
670
|
-
registerService(message: RegisterServiceInput): void;
|
|
671
613
|
/**
|
|
672
614
|
* Registers a new function with a local handler or an HTTP invocation config.
|
|
673
615
|
* @param functionId - Unique function identifier
|
|
@@ -1002,5 +944,5 @@ declare function safeStringify(value: unknown): string;
|
|
|
1002
944
|
*/
|
|
1003
945
|
declare const http: (callback: (req: HttpRequest, res: HttpResponse) => Promise<void | ApiResponse>) => (req: InternalHttpRequest) => Promise<void | ApiResponse>;
|
|
1004
946
|
//#endregion
|
|
1005
|
-
export {
|
|
1006
|
-
//# sourceMappingURL=utils-
|
|
947
|
+
export { DEFAULT_INVOCATION_TIMEOUT_MS as $, redact as A, currentTraceId as B, SeverityNumber as C, RegisterTriggerTypeMessage as Ct, shutdownOtel as D, initOtel as E, TriggerRequest as Et, setCurrentSpanAttribute as F, getBaggageEntry as G, extractContext as H, setCurrentSpanError as I, removeBaggageEntry as J, injectBaggage as K, BaggageSpanProcessor as L, resolveMaxBytesFromEnv as M, currentSpanIsRecording as N, withSpan as O, recordSpanEvent as P, DEFAULT_BRIDGE_RECONNECTION_CONFIG as Q, DEFAULT_ALLOWLIST as R, Meter$1 as S, RegisterTriggerMessage as St, getLogger as T, TriggerAction as Tt, extractTraceparent as U, extractBaggage as V, getAllBaggage as W, OtelConfig as X, setBaggageEntry as Y, ReconnectionConfig as Z, Trigger as _, OnTriggerRegistrationResult as _t, Channel as a, ChannelReader as at, TriggerHandler as b, RegisterFunctionFormat as bt, HttpResponse as c, AuthResult as ct, OtelLogEvent as d, HttpInvocationConfig as dt, EngineFunctions as et, RegisterFunctionInput as f, MessageType as ft, RemoteFunctionHandler as g, OnTriggerRegistrationInput as gt, RegisterTriggerTypeInput as h, OnFunctionRegistrationResult as ht, ApiResponse as i, LogFunctions as it, redactAndTruncate as j, REDACTED_PLACEHOLDER as k, ISdk as l, EnqueueResult as lt, RegisterTriggerInput as m, OnFunctionRegistrationInput as mt, safeStringify as n, IIIConnectionState as nt, FunctionRef as o, ChannelWriter as ot, RegisterFunctionOptions as p, MiddlewareFunctionInput as pt, injectTraceparent as q, ApiRequest as r, IIIReconnectionConfig as rt, HttpRequest as s, AuthInput as st, http as t, EngineTriggers as tt, InternalHttpRequest as u, HttpAuthConfig as ut, TriggerTypeRef as v, OnTriggerTypeRegistrationInput as vt, Span$1 as w, StreamChannelRef as wt, Logger as x, RegisterFunctionMessage as xt, TriggerConfig as y, OnTriggerTypeRegistrationResult as yt, currentSpanId as z };
|
|
948
|
+
//# sourceMappingURL=utils-DhgysSJS.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils-DhgysSJS.d.cts","names":[],"sources":["../src/iii-types.ts","../src/channels.ts","../src/iii-constants.ts","../src/telemetry-system/types.ts","../src/telemetry-system/context.ts","../src/telemetry-system/baggage-span-processor.ts","../src/telemetry-system/span-ops.ts","../src/telemetry-system/payload.ts","../src/telemetry-system/index.ts","../src/triggers.ts","../src/types.ts","../src/utils.ts"],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { n as IStream } from "./stream-R8MrPAf1.mjs";
|
|
2
2
|
import { Readable, Writable } from "node:stream";
|
|
3
|
-
import { AttributeValue, Attributes, Context, Meter as Meter$1, Span as Span$1, SpanKind as SpanKind$1
|
|
3
|
+
import { AttributeValue, Attributes, Context, Meter as Meter$1, Span as Span$1, SpanKind as SpanKind$1 } from "@opentelemetry/api";
|
|
4
4
|
import { ReadableSpan, Span, SpanProcessor } from "@opentelemetry/sdk-trace-base";
|
|
5
5
|
import { Instrumentation } from "@opentelemetry/instrumentation";
|
|
6
6
|
import { Logger, SeverityNumber as SeverityNumber$1 } from "@opentelemetry/api-logs";
|
|
@@ -9,7 +9,6 @@ import { Logger, SeverityNumber as SeverityNumber$1 } from "@opentelemetry/api-l
|
|
|
9
9
|
declare enum MessageType {
|
|
10
10
|
RegisterFunction = "registerfunction",
|
|
11
11
|
UnregisterFunction = "unregisterfunction",
|
|
12
|
-
RegisterService = "registerservice",
|
|
13
12
|
InvokeFunction = "invokefunction",
|
|
14
13
|
InvocationResult = "invocationresult",
|
|
15
14
|
RegisterTriggerType = "registertriggertype",
|
|
@@ -32,13 +31,6 @@ type RegisterTriggerMessage = {
|
|
|
32
31
|
config: unknown;
|
|
33
32
|
metadata?: Record<string, unknown>;
|
|
34
33
|
};
|
|
35
|
-
type RegisterServiceMessage = {
|
|
36
|
-
message_type: MessageType.RegisterService;
|
|
37
|
-
id: string;
|
|
38
|
-
name?: string;
|
|
39
|
-
description?: string;
|
|
40
|
-
parent_service_id?: string;
|
|
41
|
-
};
|
|
42
34
|
/**
|
|
43
35
|
* Authentication configuration for HTTP-invoked functions.
|
|
44
36
|
*
|
|
@@ -251,54 +243,6 @@ type TriggerRequest<TInput = unknown> = {
|
|
|
251
243
|
action?: TriggerAction; /** Override the default invocation timeout in milliseconds. */
|
|
252
244
|
timeoutMs?: number;
|
|
253
245
|
};
|
|
254
|
-
/**
|
|
255
|
-
* Metadata about a registered function, returned by the `engine::functions::list` trigger.
|
|
256
|
-
*/
|
|
257
|
-
type FunctionInfo = {
|
|
258
|
-
/** Unique function identifier. */function_id: string; /** Human-readable description. */
|
|
259
|
-
description?: string; /** Schema describing expected request format. */
|
|
260
|
-
request_format?: RegisterFunctionFormat; /** Schema describing expected response format. */
|
|
261
|
-
response_format?: RegisterFunctionFormat; /** Arbitrary metadata attached to the function. */
|
|
262
|
-
metadata?: Record<string, unknown>;
|
|
263
|
-
};
|
|
264
|
-
/**
|
|
265
|
-
* Information about a registered trigger.
|
|
266
|
-
*/
|
|
267
|
-
type TriggerInfo = {
|
|
268
|
-
/** Unique trigger identifier. */id: string; /** Type of the trigger (e.g. `http`, `cron`, `queue`). */
|
|
269
|
-
trigger_type: string; /** ID of the function this trigger is bound to. */
|
|
270
|
-
function_id: string; /** Trigger-specific configuration. */
|
|
271
|
-
config?: unknown; /** Arbitrary metadata attached to the trigger. */
|
|
272
|
-
metadata?: Record<string, unknown>;
|
|
273
|
-
};
|
|
274
|
-
/**
|
|
275
|
-
* Information about a registered trigger type, returned by the `engine::trigger-types::list` trigger.
|
|
276
|
-
*/
|
|
277
|
-
type TriggerTypeInfo = {
|
|
278
|
-
/** Trigger type identifier (e.g. `http`, `cron`, `queue`). */id: string; /** Human-readable description of the trigger type. */
|
|
279
|
-
description: string; /** JSON Schema for the trigger configuration. */
|
|
280
|
-
trigger_request_format?: unknown; /** JSON Schema for the call request payload. */
|
|
281
|
-
call_request_format?: unknown;
|
|
282
|
-
};
|
|
283
|
-
/** Worker connection status. */
|
|
284
|
-
type WorkerStatus = 'connected' | 'available' | 'busy' | 'disconnected';
|
|
285
|
-
/**
|
|
286
|
-
* Metadata about a connected worker, returned by the `engine::workers::list` trigger.
|
|
287
|
-
*/
|
|
288
|
-
type WorkerInfo = {
|
|
289
|
-
/** Unique worker identifier assigned by the engine. */id: string; /** Display name of the worker. */
|
|
290
|
-
name?: string; /** Runtime environment (e.g. `node`, `python`, `rust`). */
|
|
291
|
-
runtime?: string; /** SDK version. */
|
|
292
|
-
version?: string; /** Operating system info. */
|
|
293
|
-
os?: string; /** IP address of the worker. */
|
|
294
|
-
ip_address?: string; /** Current connection status. */
|
|
295
|
-
status: WorkerStatus; /** Timestamp (ms since epoch) when the worker connected. */
|
|
296
|
-
connected_at_ms: number; /** Number of functions registered by this worker. */
|
|
297
|
-
function_count: number; /** List of function IDs registered by this worker. */
|
|
298
|
-
functions: string[]; /** Number of currently active invocations. */
|
|
299
|
-
active_invocations: number; /** Self-reported isolation context (e.g. `libkrun`, `docker`, `k8s`). */
|
|
300
|
-
isolation?: string | null;
|
|
301
|
-
};
|
|
302
246
|
/**
|
|
303
247
|
* Serializable reference to one end of a streaming channel. Can be included
|
|
304
248
|
* in invocation payloads to pass channel endpoints between workers.
|
|
@@ -378,12 +322,24 @@ declare class ChannelReader {
|
|
|
378
322
|
/**
|
|
379
323
|
* Constants for the III module.
|
|
380
324
|
*/
|
|
381
|
-
/**
|
|
325
|
+
/**
|
|
326
|
+
* Engine function paths for internal operations.
|
|
327
|
+
*
|
|
328
|
+
* Naming note: `LIST_TRIGGERS` / `INFO_TRIGGERS` cover trigger TYPES
|
|
329
|
+
* (templates). `LIST_REGISTERED_TRIGGERS` / `INFO_REGISTERED_TRIGGERS`
|
|
330
|
+
* cover trigger INSTANCES (subscriber rows). The old
|
|
331
|
+
* `engine::trigger-types::list` builtin has been removed and is now
|
|
332
|
+
* served by `engine::triggers::list`.
|
|
333
|
+
*/
|
|
382
334
|
declare const EngineFunctions: {
|
|
383
335
|
readonly LIST_FUNCTIONS: "engine::functions::list";
|
|
336
|
+
readonly INFO_FUNCTIONS: "engine::functions::info";
|
|
384
337
|
readonly LIST_WORKERS: "engine::workers::list";
|
|
338
|
+
readonly INFO_WORKERS: "engine::workers::info";
|
|
385
339
|
readonly LIST_TRIGGERS: "engine::triggers::list";
|
|
386
|
-
readonly
|
|
340
|
+
readonly INFO_TRIGGERS: "engine::triggers::info";
|
|
341
|
+
readonly LIST_REGISTERED_TRIGGERS: "engine::registered-triggers::list";
|
|
342
|
+
readonly INFO_REGISTERED_TRIGGERS: "engine::registered-triggers::info";
|
|
387
343
|
readonly REGISTER_WORKER: "engine::workers::register";
|
|
388
344
|
};
|
|
389
345
|
/** Engine trigger types */
|
|
@@ -553,14 +509,6 @@ declare function initOtel(config?: OtelConfig): void;
|
|
|
553
509
|
* Shutdown OpenTelemetry, flushing any pending data.
|
|
554
510
|
*/
|
|
555
511
|
declare function shutdownOtel(): Promise<void>;
|
|
556
|
-
/**
|
|
557
|
-
* Get the OpenTelemetry tracer instance.
|
|
558
|
-
*/
|
|
559
|
-
declare function getTracer(): Tracer | null;
|
|
560
|
-
/**
|
|
561
|
-
* Get the OpenTelemetry meter instance.
|
|
562
|
-
*/
|
|
563
|
-
declare function getMeter(): Meter$1 | null;
|
|
564
512
|
/**
|
|
565
513
|
* Get the OpenTelemetry logger instance.
|
|
566
514
|
*/
|
|
@@ -640,7 +588,6 @@ type OtelLogEvent = {
|
|
|
640
588
|
instrumentation_scope_version?: string;
|
|
641
589
|
};
|
|
642
590
|
type RegisterTriggerInput = Omit<RegisterTriggerMessage, 'message_type' | 'id'>;
|
|
643
|
-
type RegisterServiceInput = Omit<RegisterServiceMessage, 'message_type'>;
|
|
644
591
|
type RegisterFunctionInput = Omit<RegisterFunctionMessage, 'message_type'>;
|
|
645
592
|
type RegisterFunctionOptions = Omit<RegisterFunctionMessage, 'message_type' | 'id'>;
|
|
646
593
|
type RegisterTriggerTypeInput = Omit<RegisterTriggerTypeMessage, 'message_type'>;
|
|
@@ -663,11 +610,6 @@ interface ISdk {
|
|
|
663
610
|
* ```
|
|
664
611
|
*/
|
|
665
612
|
registerTrigger(trigger: RegisterTriggerInput): Trigger;
|
|
666
|
-
/**
|
|
667
|
-
* Registers a new service.
|
|
668
|
-
* @param message - The service to register
|
|
669
|
-
*/
|
|
670
|
-
registerService(message: RegisterServiceInput): void;
|
|
671
613
|
/**
|
|
672
614
|
* Registers a new function with a local handler or an HTTP invocation config.
|
|
673
615
|
* @param functionId - Unique function identifier
|
|
@@ -1002,5 +944,5 @@ declare function safeStringify(value: unknown): string;
|
|
|
1002
944
|
*/
|
|
1003
945
|
declare const http: (callback: (req: HttpRequest, res: HttpResponse) => Promise<void | ApiResponse>) => (req: InternalHttpRequest) => Promise<void | ApiResponse>;
|
|
1004
946
|
//#endregion
|
|
1005
|
-
export {
|
|
1006
|
-
//# sourceMappingURL=utils-
|
|
947
|
+
export { DEFAULT_INVOCATION_TIMEOUT_MS as $, redact as A, currentTraceId as B, SeverityNumber$1 as C, RegisterTriggerTypeMessage as Ct, shutdownOtel as D, initOtel as E, TriggerRequest as Et, setCurrentSpanAttribute as F, getBaggageEntry as G, extractContext as H, setCurrentSpanError as I, removeBaggageEntry as J, injectBaggage as K, BaggageSpanProcessor as L, resolveMaxBytesFromEnv as M, currentSpanIsRecording as N, withSpan as O, recordSpanEvent as P, DEFAULT_BRIDGE_RECONNECTION_CONFIG as Q, DEFAULT_ALLOWLIST as R, Meter$1 as S, RegisterTriggerMessage as St, getLogger as T, TriggerAction as Tt, extractTraceparent as U, extractBaggage as V, getAllBaggage as W, OtelConfig as X, setBaggageEntry as Y, ReconnectionConfig as Z, Trigger as _, OnTriggerRegistrationResult as _t, Channel as a, ChannelReader as at, TriggerHandler as b, RegisterFunctionFormat as bt, HttpResponse as c, AuthResult as ct, OtelLogEvent as d, HttpInvocationConfig as dt, EngineFunctions as et, RegisterFunctionInput as f, MessageType as ft, RemoteFunctionHandler as g, OnTriggerRegistrationInput as gt, RegisterTriggerTypeInput as h, OnFunctionRegistrationResult as ht, ApiResponse as i, LogFunctions as it, redactAndTruncate as j, REDACTED_PLACEHOLDER as k, ISdk as l, EnqueueResult as lt, RegisterTriggerInput as m, OnFunctionRegistrationInput as mt, safeStringify as n, IIIConnectionState as nt, FunctionRef as o, ChannelWriter as ot, RegisterFunctionOptions as p, MiddlewareFunctionInput as pt, injectTraceparent as q, ApiRequest as r, IIIReconnectionConfig as rt, HttpRequest as s, AuthInput as st, http as t, EngineTriggers as tt, InternalHttpRequest as u, HttpAuthConfig as ut, TriggerTypeRef as v, OnTriggerTypeRegistrationInput as vt, Span$1 as w, StreamChannelRef as wt, Logger as x, RegisterFunctionMessage as xt, TriggerConfig as y, OnTriggerTypeRegistrationResult as yt, currentSpanId as z };
|
|
948
|
+
//# sourceMappingURL=utils-oTg3ZAbD.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils-oTg3ZAbD.d.mts","names":[],"sources":["../src/iii-types.ts","../src/channels.ts","../src/iii-constants.ts","../src/telemetry-system/types.ts","../src/telemetry-system/context.ts","../src/telemetry-system/baggage-span-processor.ts","../src/telemetry-system/span-ops.ts","../src/telemetry-system/payload.ts","../src/telemetry-system/index.ts","../src/triggers.ts","../src/types.ts","../src/utils.ts"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"telemetry-system-CFshsuNv.mjs","names":["SpanKind","SpanStatusCode"],"sources":["../src/iii-constants.ts","../src/worker-metrics.ts","../src/otel-worker-gauges.ts","../src/utils.ts","../src/telemetry-system/baggage-span-processor.ts","../src/telemetry-system/types.ts","../src/telemetry-system/connection.ts","../src/telemetry-system/span-exporter.ts","../src/telemetry-system/metrics-exporter.ts","../src/telemetry-system/log-exporter.ts","../src/telemetry-system/context.ts","../src/telemetry-system/fetch-instrumentation.ts","../src/telemetry-system/utils.ts","../src/telemetry-system/span-ops.ts","../src/telemetry-system/payload.ts","../src/telemetry-system/index.ts"],"sourcesContent":["/**\n * Constants for the III module.\n */\n\n/** Engine function paths for internal operations */\nexport const EngineFunctions = {\n LIST_FUNCTIONS: 'engine::functions::list',\n LIST_WORKERS: 'engine::workers::list',\n LIST_TRIGGERS: 'engine::triggers::list',\n LIST_TRIGGER_TYPES: 'engine::trigger-types::list',\n REGISTER_WORKER: 'engine::workers::register',\n} as const\n\n/** Engine trigger types */\nexport const EngineTriggers = {\n FUNCTIONS_AVAILABLE: 'engine::functions-available',\n LOG: 'log',\n} as const\n\n/** Log function paths */\nexport const LogFunctions = {\n INFO: 'engine::log::info',\n WARN: 'engine::log::warn',\n ERROR: 'engine::log::error',\n DEBUG: 'engine::log::debug',\n} as const\n\n/** Connection state for the III WebSocket */\nexport type IIIConnectionState =\n | 'disconnected'\n | 'connecting'\n | 'connected'\n | 'reconnecting'\n | 'failed'\n\n/** Configuration for WebSocket reconnection behavior */\nexport interface IIIReconnectionConfig {\n /** Starting delay in milliseconds (default: 1000ms) */\n initialDelayMs: number\n /** Maximum delay cap in milliseconds (default: 30000ms) */\n maxDelayMs: number\n /** Exponential backoff multiplier (default: 2) */\n backoffMultiplier: number\n /** Random jitter factor 0-1 (default: 0.3) */\n jitterFactor: number\n /** Maximum retry attempts, -1 for infinite (default: -1) */\n maxRetries: number\n}\n\n/** Default reconnection configuration */\nexport const DEFAULT_BRIDGE_RECONNECTION_CONFIG: IIIReconnectionConfig = {\n initialDelayMs: 1000,\n maxDelayMs: 30000,\n backoffMultiplier: 2,\n jitterFactor: 0.3,\n maxRetries: -1,\n}\n\n/** Default invocation timeout in milliseconds */\nexport const DEFAULT_INVOCATION_TIMEOUT_MS = 30000\n","/**\n * Worker metrics collection for the III Node SDK.\n *\n * Collects CPU, memory, and event loop metrics for worker health monitoring.\n * Uses the Node.js built-in `monitorEventLoopDelay` API for accurate\n * event loop lag measurements.\n */\n\nimport { type IntervalHistogram, monitorEventLoopDelay, performance } from 'node:perf_hooks'\n\n/**\n * Worker metrics data structure used internally for OTEL metric collection.\n */\nexport type WorkerMetrics = {\n memory_heap_used?: number\n memory_heap_total?: number\n memory_rss?: number\n memory_external?: number\n cpu_user_micros?: number\n cpu_system_micros?: number\n cpu_percent?: number\n event_loop_lag_ms?: number\n uptime_seconds?: number\n timestamp_ms: number\n runtime: string\n}\n\n/**\n * Configuration options for the WorkerMetricsCollector.\n */\nexport interface WorkerMetricsCollectorOptions {\n /**\n * Event loop delay histogram resolution in milliseconds.\n * Lower values provide more accurate measurements but use more resources.\n * @default 20\n */\n eventLoopResolutionMs?: number\n}\n\n/**\n * Collects worker resource metrics including CPU, memory, and event loop lag.\n *\n * Uses the Node.js `monitorEventLoopDelay` API for high-precision event loop\n * delay measurements instead of manual `setImmediate` timing.\n *\n * @example\n * ```typescript\n * const collector = new WorkerMetricsCollector()\n *\n * // Collect metrics periodically\n * setInterval(() => {\n * const metrics = collector.collect()\n * console.log('CPU:', metrics.cpu_percent, '%')\n * console.log('Event Loop Lag:', metrics.event_loop_lag_ms, 'ms')\n * }, 5000)\n *\n * // Clean up when done\n * collector.stopMonitoring()\n * ```\n */\nexport class WorkerMetricsCollector {\n private readonly startTime: number\n private lastCpuUsage: NodeJS.CpuUsage\n private lastCpuTime: number\n private eventLoopHistogram: IntervalHistogram | null = null\n\n /**\n * Creates a new WorkerMetricsCollector instance.\n *\n * @param options - Configuration options\n */\n constructor(options: WorkerMetricsCollectorOptions = {}) {\n this.startTime = Date.now()\n this.lastCpuUsage = process.cpuUsage()\n this.lastCpuTime = performance.now()\n this.startEventLoopMonitoring(options.eventLoopResolutionMs ?? 20)\n }\n\n /**\n * Starts the event loop delay histogram monitoring.\n *\n * @param resolutionMs - Histogram resolution in milliseconds\n */\n private startEventLoopMonitoring(resolutionMs: number): void {\n // Sanitize resolution: must be a positive finite number, minimum 1ms\n const safeResolutionMs =\n Number.isFinite(resolutionMs) && resolutionMs > 0 ? Math.max(1, Math.floor(resolutionMs)) : 20 // Default fallback\n\n this.eventLoopHistogram = monitorEventLoopDelay({ resolution: safeResolutionMs })\n this.eventLoopHistogram.enable()\n }\n\n /**\n * Stops the event loop monitoring and releases resources.\n * Should be called when the collector is no longer needed.\n */\n public stopMonitoring(): void {\n if (this.eventLoopHistogram) {\n this.eventLoopHistogram.disable()\n this.eventLoopHistogram = null\n }\n }\n\n /**\n * Collects current worker metrics.\n *\n * This method calculates CPU usage since the last collection,\n * reads memory usage, and gets event loop delay statistics.\n * The event loop histogram is reset after each collection for\n * accurate per-interval measurements.\n *\n * @returns Current worker metrics snapshot\n */\n collect(): WorkerMetrics {\n const memoryUsage = process.memoryUsage()\n const cpuUsage = process.cpuUsage()\n const now = performance.now()\n\n // Calculate CPU percentage since last collection\n const cpuDelta = {\n user: cpuUsage.user - this.lastCpuUsage.user,\n system: cpuUsage.system - this.lastCpuUsage.system,\n }\n const timeDelta = (now - this.lastCpuTime) * 1000 // Convert ms to microseconds\n const cpuPercent = timeDelta > 0 ? ((cpuDelta.user + cpuDelta.system) / timeDelta) * 100 : 0\n\n // Update state for next collection\n this.lastCpuUsage = cpuUsage\n this.lastCpuTime = now\n\n // Get event loop lag from histogram (in nanoseconds, convert to ms)\n let eventLoopLagMs = 0\n if (this.eventLoopHistogram) {\n // Mean is in nanoseconds, convert to milliseconds\n eventLoopLagMs = this.eventLoopHistogram.mean / 1_000_000\n // Reset histogram for next collection interval\n this.eventLoopHistogram.reset()\n }\n\n return {\n memory_heap_used: memoryUsage.heapUsed,\n memory_heap_total: memoryUsage.heapTotal,\n memory_rss: memoryUsage.rss,\n memory_external: memoryUsage.external,\n cpu_user_micros: cpuUsage.user,\n cpu_system_micros: cpuUsage.system,\n cpu_percent: Math.min(cpuPercent, 100), // Cap at 100%\n event_loop_lag_ms: eventLoopLagMs,\n uptime_seconds: Math.floor((Date.now() - this.startTime) / 1000),\n timestamp_ms: Date.now(),\n runtime: 'node',\n }\n }\n}\n","import type { Meter, BatchObservableResult, Observable } from '@opentelemetry/api'\nimport { WorkerMetricsCollector } from './worker-metrics'\n\nexport interface WorkerGaugesOptions {\n workerId: string\n workerName?: string\n}\n\nlet registeredGauges = false\nlet metricsCollector: WorkerMetricsCollector | null = null\nlet registeredMeter: Meter | null = null\nlet registeredBatchCallback: ((observableResult: BatchObservableResult) => void) | null = null\nlet registeredObservables: Observable[] = []\n\nexport function registerWorkerGauges(meter: Meter, options: WorkerGaugesOptions): void {\n if (registeredGauges) {\n return\n }\n\n const { workerId, workerName } = options\n const baseAttributes = {\n 'worker.id': workerId,\n ...(workerName && { 'worker.name': workerName }),\n }\n\n metricsCollector = new WorkerMetricsCollector()\n\n const memoryHeapUsed = meter.createObservableGauge('iii.worker.memory.heap_used', {\n description: 'Worker heap memory used in bytes',\n unit: 'bytes',\n })\n\n const memoryHeapTotal = meter.createObservableGauge('iii.worker.memory.heap_total', {\n description: 'Worker total heap memory in bytes',\n unit: 'bytes',\n })\n\n const memoryRss = meter.createObservableGauge('iii.worker.memory.rss', {\n description: 'Worker resident set size in bytes',\n unit: 'bytes',\n })\n\n const memoryExternal = meter.createObservableGauge('iii.worker.memory.external', {\n description: 'Worker external memory in bytes',\n unit: 'bytes',\n })\n\n const cpuPercent = meter.createObservableGauge('iii.worker.cpu.percent', {\n description: 'Worker CPU usage percentage',\n unit: '%',\n })\n\n const cpuUserMicros = meter.createObservableGauge('iii.worker.cpu.user_micros', {\n description: 'Worker CPU user time in microseconds',\n unit: 'us',\n })\n\n const cpuSystemMicros = meter.createObservableGauge('iii.worker.cpu.system_micros', {\n description: 'Worker CPU system time in microseconds',\n unit: 'us',\n })\n\n const eventLoopLag = meter.createObservableGauge('iii.worker.event_loop.lag_ms', {\n description: 'Worker event loop lag in milliseconds',\n unit: 'ms',\n })\n\n const uptimeSeconds = meter.createObservableGauge('iii.worker.uptime_seconds', {\n description: 'Worker uptime in seconds',\n unit: 's',\n })\n\n const batchCallback = (observableResult: BatchObservableResult) => {\n if (!metricsCollector) return\n\n const metrics = metricsCollector.collect()\n\n if (metrics.memory_heap_used !== undefined) {\n observableResult.observe(memoryHeapUsed, metrics.memory_heap_used, baseAttributes)\n }\n if (metrics.memory_heap_total !== undefined) {\n observableResult.observe(memoryHeapTotal, metrics.memory_heap_total, baseAttributes)\n }\n if (metrics.memory_rss !== undefined) {\n observableResult.observe(memoryRss, metrics.memory_rss, baseAttributes)\n }\n if (metrics.memory_external !== undefined) {\n observableResult.observe(memoryExternal, metrics.memory_external, baseAttributes)\n }\n if (metrics.cpu_percent !== undefined) {\n observableResult.observe(cpuPercent, metrics.cpu_percent, baseAttributes)\n }\n if (metrics.cpu_user_micros !== undefined) {\n observableResult.observe(cpuUserMicros, metrics.cpu_user_micros, baseAttributes)\n }\n if (metrics.cpu_system_micros !== undefined) {\n observableResult.observe(cpuSystemMicros, metrics.cpu_system_micros, baseAttributes)\n }\n if (metrics.event_loop_lag_ms !== undefined) {\n observableResult.observe(eventLoopLag, metrics.event_loop_lag_ms, baseAttributes)\n }\n if (metrics.uptime_seconds !== undefined) {\n observableResult.observe(uptimeSeconds, metrics.uptime_seconds, baseAttributes)\n }\n }\n\n meter.addBatchObservableCallback(batchCallback, [\n memoryHeapUsed,\n memoryHeapTotal,\n memoryRss,\n memoryExternal,\n cpuPercent,\n cpuUserMicros,\n cpuSystemMicros,\n eventLoopLag,\n uptimeSeconds,\n ])\n\n registeredMeter = meter\n registeredBatchCallback = batchCallback\n registeredObservables = [\n memoryHeapUsed,\n memoryHeapTotal,\n memoryRss,\n memoryExternal,\n cpuPercent,\n cpuUserMicros,\n cpuSystemMicros,\n eventLoopLag,\n uptimeSeconds,\n ]\n\n registeredGauges = true\n}\n\nexport function stopWorkerGauges(): void {\n // Remove the batch observable callback before stopping\n if (registeredMeter && registeredBatchCallback) {\n registeredMeter.removeBatchObservableCallback(registeredBatchCallback, registeredObservables)\n }\n\n if (metricsCollector) {\n metricsCollector.stopMonitoring()\n metricsCollector = null\n }\n\n registeredMeter = null\n registeredBatchCallback = null\n registeredObservables = []\n registeredGauges = false\n}\n","import * as fs from 'node:fs'\nimport * as path from 'node:path'\nimport type { StreamChannelRef } from './iii-types'\nimport type { ApiResponse, HttpRequest, HttpResponse, InternalHttpRequest } from './types'\n\n/**\n * Returns a project identifier for telemetry, derived from the current working\n * directory. Reads `package.json` `name` if present at `cwd`; otherwise falls\n * back to the basename of `cwd`. Returns `undefined` only when both signals\n * are unavailable (e.g. cwd is the filesystem root).\n *\n * No directory walking — only inspects `cwd` itself, so the SDK never reads\n * files outside the user's explicit working directory.\n */\nexport function detectProjectName(cwd: string = process.cwd()): string | undefined {\n try {\n const manifest = path.join(cwd, 'package.json')\n if (fs.existsSync(manifest)) {\n const parsed = JSON.parse(fs.readFileSync(manifest, 'utf8')) as { name?: unknown }\n if (typeof parsed.name === 'string') {\n const trimmed = parsed.name.trim()\n if (trimmed) return trimmed\n }\n }\n } catch {\n // fall through to directory-name fallback\n }\n\n const base = path.basename(cwd).trim()\n return base || undefined\n}\n\n/**\n * Safely stringify a value, handling circular references, BigInt, and other edge cases.\n * Returns \"[unserializable]\" if serialization fails for any reason.\n */\nexport function safeStringify(value: unknown): string {\n const seen = new WeakSet<object>()\n\n try {\n return JSON.stringify(value, (_key, val) => {\n // Handle BigInt\n if (typeof val === 'bigint') {\n return val.toString()\n }\n\n // Handle circular references\n if (val !== null && typeof val === 'object') {\n if (seen.has(val)) {\n return '[Circular]'\n }\n seen.add(val)\n }\n\n return val\n })\n } catch {\n return '[unserializable]'\n }\n}\n\n/**\n * Helper that wraps an HTTP-style handler (with separate `req`/`res` arguments)\n * into the function handler format expected by the SDK.\n *\n * @param callback - Async handler receiving an {@link HttpRequest} and {@link HttpResponse}.\n * @returns A function handler compatible with {@link ISdk.registerFunction}.\n *\n * @example\n * ```typescript\n * import { http } from 'iii-sdk'\n *\n * iii.registerFunction(\n * 'my-api',\n * http(async (req, res) => {\n * res.status(200)\n * res.headers({ 'content-type': 'application/json' })\n * res.stream.end(JSON.stringify({ hello: 'world' }))\n * res.close()\n * }),\n * )\n * ```\n */\nexport const http = (\n // biome-ignore lint/suspicious/noConfusingVoidType: void is necessary here\n callback: (req: HttpRequest, res: HttpResponse) => Promise<void | ApiResponse>,\n) => {\n return async (req: InternalHttpRequest) => {\n const { response, ...request } = req\n\n const httpResponse: HttpResponse = {\n status: (status_code: number) =>\n response.sendMessage(JSON.stringify({ type: 'set_status', status_code })),\n headers: (headers: Record<string, string>) =>\n response.sendMessage(JSON.stringify({ type: 'set_headers', headers })),\n stream: response.stream,\n close: () => response.close(),\n }\n\n return callback(request, httpResponse)\n }\n}\n\n/**\n * Type guard that checks if a value is a {@link StreamChannelRef}.\n *\n * @param value - Value to check.\n * @returns `true` if the value is a valid `StreamChannelRef`.\n */\nexport const isChannelRef = (value: unknown): value is StreamChannelRef => {\n if (typeof value !== 'object' || value === null) return false\n const maybe = value as Partial<StreamChannelRef>\n return (\n typeof maybe.channel_id === 'string' &&\n typeof maybe.access_key === 'string' &&\n (maybe.direction === 'read' || maybe.direction === 'write')\n )\n}\n","// Baggage -> span attribute processor.\n\nimport type { Context } from '@opentelemetry/api'\nimport { propagation } from '@opentelemetry/api'\nimport type { ReadableSpan, Span, SpanProcessor } from '@opentelemetry/sdk-trace-base'\n\n/** DEFAULT_ALLOWLIST drift across languages would break worker chains;\n * lockstep tests in each SDK pin this constant at CI time. */\nexport const DEFAULT_ALLOWLIST: readonly string[] = [\n 'iii.session.id',\n 'iii.message.id',\n 'iii.function.id',\n] as const\n\nexport class BaggageSpanProcessor implements SpanProcessor {\n private readonly allowlist: readonly string[]\n\n constructor(allowlist: readonly string[] = DEFAULT_ALLOWLIST) {\n this.allowlist = allowlist\n }\n\n onStart(span: Span, parentContext: Context): void {\n // NoOp guard: skip allocation when sampler drops the span.\n if (!span.isRecording()) {\n return\n }\n\n const baggage = propagation.getBaggage(parentContext)\n if (!baggage) {\n return\n }\n\n for (const key of this.allowlist) {\n const entry = baggage.getEntry(key)\n if (entry) {\n span.setAttribute(key, entry.value)\n }\n }\n }\n\n onEnd(_span: ReadableSpan): void {\n /* no-op */\n }\n\n async shutdown(): Promise<void> {\n /* no-op */\n }\n\n async forceFlush(): Promise<void> {\n /* no-op */\n }\n}\n","/**\n * Types, interfaces, and constants for the OpenTelemetry module.\n */\n\nimport type { Instrumentation } from '@opentelemetry/instrumentation'\n\n// Semantic convention constants for compatibility across versions\nexport const ATTR_SERVICE_VERSION = 'service.version'\nexport const ATTR_SERVICE_NAMESPACE = 'service.namespace'\nexport const ATTR_SERVICE_INSTANCE_ID = 'service.instance.id'\n\n/** Magic prefixes for binary frames over WebSocket */\nexport const PREFIX_TRACES = 'OTLP'\nexport const PREFIX_METRICS = 'MTRC'\nexport const PREFIX_LOGS = 'LOGS'\n\n/** Connection state for the shared WebSocket */\nexport type ConnectionState = 'disconnected' | 'connecting' | 'connected' | 'reconnecting' | 'failed'\n\n/** Configuration for WebSocket reconnection behavior */\nexport interface ReconnectionConfig {\n /** Starting delay in milliseconds (default: 1000ms) */\n initialDelayMs: number\n /** Maximum delay cap in milliseconds (default: 30000ms) */\n maxDelayMs: number\n /** Exponential backoff multiplier (default: 2) */\n backoffMultiplier: number\n /** Random jitter factor 0-1 (default: 0.3) */\n jitterFactor: number\n /** Maximum retry attempts, -1 for infinite (default: -1) */\n maxRetries: number\n}\n\n/** Default reconnection configuration */\nexport const DEFAULT_RECONNECTION_CONFIG: ReconnectionConfig = {\n initialDelayMs: 1000,\n maxDelayMs: 30000,\n backoffMultiplier: 2,\n jitterFactor: 0.3,\n maxRetries: -1,\n}\n\n/** Configuration for OpenTelemetry initialization. */\nexport interface OtelConfig {\n /** Whether OpenTelemetry export is enabled. Defaults to true. Set to false or OTEL_ENABLED=false/0/no/off to disable. */\n enabled?: boolean\n /** The service name to report. Defaults to OTEL_SERVICE_NAME or \"iii-node\". */\n serviceName?: string\n /** The service version to report. Defaults to SERVICE_VERSION env var or \"unknown\". */\n serviceVersion?: string\n /** The service namespace to report. Defaults to SERVICE_NAMESPACE env var. */\n serviceNamespace?: string\n /** The service instance ID to report. Defaults to SERVICE_INSTANCE_ID env var or auto-generated UUID. */\n serviceInstanceId?: string\n /** III Engine WebSocket URL. Defaults to III_URL or \"ws://localhost:49134\". */\n engineWsUrl?: string\n /** OpenTelemetry instrumentations to register (e.g., PrismaInstrumentation). */\n instrumentations?: Instrumentation[]\n /** Whether OpenTelemetry metrics export is enabled. Defaults to true. Set to false or OTEL_METRICS_ENABLED=false/0/no/off to disable. */\n metricsEnabled?: boolean\n /** Metrics export interval in milliseconds. Defaults to 60000 (60 seconds). */\n metricsExportIntervalMs?: number\n /** Log processor flush delay in milliseconds. Defaults to 100ms. */\n logsFlushIntervalMs?: number\n /** Maximum number of log records exported per batch. Defaults to 1. */\n logsBatchSize?: number\n /** Whether to auto-instrument globalThis.fetch calls. Defaults to true. Works on Node.js, Bun, and Deno. Set to false to disable. */\n fetchInstrumentationEnabled?: boolean\n /** Optional reconnection configuration for the WebSocket connection. */\n reconnectionConfig?: Partial<ReconnectionConfig>\n}\n\n/** Default configuration values for OpenTelemetry initialization. */\nexport const DEFAULT_OTEL_CONFIG = {\n enabled: true,\n serviceName: 'iii-node',\n serviceVersion: 'unknown',\n engineWsUrl: 'ws://localhost:49134',\n metricsEnabled: true,\n metricsExportIntervalMs: 60000,\n logsFlushIntervalMs: 100,\n logsBatchSize: 1,\n fetchInstrumentationEnabled: true,\n} as const satisfies Partial<OtelConfig>\n\n/** Parse a boolean environment variable, recognizing 'false', '0', 'no', 'off' as false. */\nexport function parseBoolEnv(value: string | undefined, defaultValue: boolean): boolean {\n if (value === undefined) return defaultValue\n const lower = value.toLowerCase()\n return lower !== 'false' && lower !== '0' && lower !== 'no' && lower !== 'off'\n}\n","/**\n * Shared WebSocket connection for OpenTelemetry exporters.\n */\n\nimport { WebSocket } from 'ws'\nimport { type ConnectionState, type ReconnectionConfig, DEFAULT_RECONNECTION_CONFIG } from './types'\n\n/**\n * Shared WebSocket connection for all OTEL exporters (traces, metrics, logs).\n * Uses a single connection with message prefixes to identify signal type.\n */\nexport class SharedEngineConnection {\n private static readonly MAX_PENDING_MESSAGES = 1000\n private ws: WebSocket | null = null\n private wsUrl: string\n private connecting = false\n private shuttingDown = false\n private pendingMessages: Array<{ frame: Buffer; callback?: (err?: Error) => void }> = []\n private reconnectAttempt = 0\n private reconnectTimeout: NodeJS.Timeout | null = null\n private config: ReconnectionConfig\n private state: ConnectionState = 'disconnected'\n private onConnectedCallbacks: Array<() => void> = []\n\n constructor(wsUrl: string, config: Partial<ReconnectionConfig> = {}) {\n this.wsUrl = wsUrl\n this.config = { ...DEFAULT_RECONNECTION_CONFIG, ...config }\n this.connect()\n }\n\n private connect(): void {\n if (this.connecting || (this.ws && this.ws.readyState === WebSocket.OPEN)) {\n return\n }\n\n this.connecting = true\n this.state = 'connecting'\n\n try {\n this.ws = new WebSocket(this.wsUrl)\n\n this.ws.on('open', () => {\n this.connecting = false\n this.state = 'connected'\n console.log(`[OTel] Connected to engine at ${this.wsUrl}`)\n\n // Reset reconnection state\n if (this.reconnectAttempt > 0) {\n console.log('[OTel] Successfully reconnected')\n }\n this.reconnectAttempt = 0\n\n // Clear any pending reconnect timer to prevent race conditions\n if (this.reconnectTimeout) {\n clearTimeout(this.reconnectTimeout)\n this.reconnectTimeout = null\n }\n\n // Flush pending messages\n const pending = this.pendingMessages.splice(0, this.pendingMessages.length)\n for (const { frame, callback } of pending) {\n this.ws?.send(frame, err => callback?.(err))\n }\n\n // Notify callbacks\n for (const cb of this.onConnectedCallbacks) {\n cb()\n }\n })\n\n this.ws.on('close', () => {\n this.connecting = false\n this.ws = null\n\n // Skip reconnection if we're shutting down intentionally\n if (this.shuttingDown) {\n this.state = 'disconnected'\n console.log('[OTel] Connection closed during shutdown')\n return\n }\n\n this.state = 'disconnected'\n console.log('[OTel] Disconnected from engine, will reconnect...')\n this.scheduleReconnect()\n })\n\n this.ws.on('error', err => {\n this.connecting = false\n\n // Skip error handling if we're shutting down intentionally\n if (this.shuttingDown) {\n return\n }\n\n console.error('[OTel] WebSocket error:', err.message)\n })\n } catch (err) {\n this.connecting = false\n console.error('[OTel] Connection failed:', err)\n this.scheduleReconnect()\n }\n }\n\n private scheduleReconnect(): void {\n if (this.config.maxRetries !== -1 && this.reconnectAttempt >= this.config.maxRetries) {\n this.state = 'failed'\n console.error(`[OTel] Max retries (${this.config.maxRetries}) reached, giving up`)\n\n // Notify pending message callbacks that they won't be delivered\n const pending = this.pendingMessages.splice(0, this.pendingMessages.length)\n const failedError = new Error('Connection failed after max retries')\n for (const { callback } of pending) {\n callback?.(failedError)\n }\n return\n }\n\n if (this.reconnectTimeout) {\n return // Already scheduled\n }\n\n const exponentialDelay =\n this.config.initialDelayMs * this.config.backoffMultiplier ** this.reconnectAttempt\n const cappedDelay = Math.min(exponentialDelay, this.config.maxDelayMs)\n const jitter = cappedDelay * this.config.jitterFactor * (2 * Math.random() - 1)\n const delay = Math.max(0, Math.floor(cappedDelay + jitter))\n\n this.state = 'reconnecting'\n console.log(`[OTel] Reconnecting in ${delay}ms (attempt ${this.reconnectAttempt + 1})...`)\n\n this.reconnectTimeout = setTimeout(() => {\n this.reconnectTimeout = null\n this.reconnectAttempt++\n this.connect()\n }, delay)\n }\n\n /**\n * Send a message with a signal prefix.\n */\n send(prefix: string, data: Uint8Array, callback?: (err?: Error) => void): void {\n const prefixBytes = Buffer.from(prefix, 'utf-8')\n const frame = Buffer.concat([prefixBytes, Buffer.from(data)])\n\n if (this.ws && this.ws.readyState === WebSocket.OPEN) {\n this.ws.send(frame, callback)\n } else {\n // Queue for later with bounded size to prevent memory exhaustion\n if (this.pendingMessages.length >= SharedEngineConnection.MAX_PENDING_MESSAGES) {\n console.warn('[OTel] Pending message queue full, dropping oldest message')\n const dropped = this.pendingMessages.shift()\n dropped?.callback?.(new Error('Message dropped due to queue overflow'))\n }\n this.pendingMessages.push({ frame, callback })\n this.connect()\n }\n }\n\n /**\n * Register a callback to be called when connected.\n */\n onConnected(callback: () => void): void {\n this.onConnectedCallbacks.push(callback)\n if (this.state === 'connected') {\n callback()\n }\n }\n\n /**\n * Get the current connection state.\n */\n getState(): ConnectionState {\n return this.state\n }\n\n /**\n * Shutdown the connection.\n */\n async shutdown(): Promise<void> {\n // Set shutdown flag to prevent reconnection attempts\n this.shuttingDown = true\n\n if (this.reconnectTimeout) {\n clearTimeout(this.reconnectTimeout)\n this.reconnectTimeout = null\n }\n\n if (this.ws) {\n this.ws.close()\n this.ws = null\n }\n\n // Notify pending message callbacks that they won't be delivered\n const pending = this.pendingMessages.splice(0, this.pendingMessages.length)\n const shutdownError = new Error('Connection shutdown before message could be sent')\n for (const { callback } of pending) {\n callback?.(shutdownError)\n }\n this.onConnectedCallbacks = []\n this.state = 'disconnected'\n }\n}\n","/**\n * Span exporter for the III Engine.\n */\n\nimport { ExportResultCode, type ExportResult } from '@opentelemetry/core'\nimport type { ReadableSpan, SpanExporter } from '@opentelemetry/sdk-trace-base'\nimport { JsonTraceSerializer } from '@opentelemetry/otlp-transformer'\n\nimport type { SharedEngineConnection } from './connection'\nimport { PREFIX_TRACES } from './types'\n\n/**\n * Span exporter using the shared WebSocket connection.\n */\nexport class EngineSpanExporter implements SpanExporter {\n private static readonly MAX_PENDING_EXPORTS = 100\n private connection: SharedEngineConnection\n private pendingExports: Array<{\n spans: ReadableSpan[]\n resultCallback?: (result: ExportResult) => void\n }> = []\n\n constructor(connection: SharedEngineConnection) {\n this.connection = connection\n this.connection.onConnected(() => this.flushPending())\n }\n\n private flushPending(): void {\n const pending = this.pendingExports.splice(0, this.pendingExports.length)\n for (const { spans, resultCallback } of pending) {\n this.sendExport(spans, resultCallback)\n }\n }\n\n private sendExport(spans: ReadableSpan[], resultCallback?: (result: ExportResult) => void): void {\n try {\n const serialized = JsonTraceSerializer.serializeRequest(spans)\n if (!serialized) {\n resultCallback?.({ code: ExportResultCode.SUCCESS })\n return\n }\n\n this.connection.send(PREFIX_TRACES, serialized, err => {\n if (err) {\n console.error('[OTel] Failed to send spans:', err.message)\n resultCallback?.({ code: ExportResultCode.FAILED, error: err })\n } else {\n resultCallback?.({ code: ExportResultCode.SUCCESS })\n }\n })\n } catch (err) {\n console.error('[OTel] Error exporting spans:', err)\n resultCallback?.({ code: ExportResultCode.FAILED, error: err as Error })\n }\n }\n\n private doExport(spans: ReadableSpan[], resultCallback: (result: ExportResult) => void): void {\n if (this.connection.getState() !== 'connected') {\n if (this.pendingExports.length >= EngineSpanExporter.MAX_PENDING_EXPORTS) {\n const dropped = this.pendingExports.shift()\n dropped?.resultCallback?.({\n code: ExportResultCode.FAILED,\n error: new Error('Queue overflow'),\n })\n console.warn('[OTel] Spans export queue full, dropped oldest entry')\n }\n this.pendingExports.push({ spans, resultCallback })\n // Don't call resultCallback here - it will be called when actually sent or on shutdown\n return\n }\n\n this.sendExport(spans, resultCallback)\n }\n\n export(spans: ReadableSpan[], resultCallback: (result: ExportResult) => void): void {\n this.doExport(spans, resultCallback)\n }\n\n async shutdown(): Promise<void> {\n const pending = this.pendingExports.splice(0, this.pendingExports.length)\n const shutdownError = new Error('Exporter shutdown before export completed')\n for (const { resultCallback } of pending) {\n resultCallback?.({ code: ExportResultCode.FAILED, error: shutdownError })\n }\n }\n\n async forceFlush(): Promise<void> {\n // No-op, spans are sent immediately\n }\n}\n","/**\n * Metrics exporter for the III Engine.\n */\n\nimport { ExportResultCode, type ExportResult } from '@opentelemetry/core'\nimport type { PushMetricExporter, ResourceMetrics } from '@opentelemetry/sdk-metrics'\nimport { JsonMetricsSerializer } from '@opentelemetry/otlp-transformer'\n\nimport type { SharedEngineConnection } from './connection'\nimport { PREFIX_METRICS } from './types'\n\n/**\n * Metrics exporter using the shared WebSocket connection.\n */\nexport class EngineMetricsExporter implements PushMetricExporter {\n private static readonly MAX_PENDING_EXPORTS = 100\n private connection: SharedEngineConnection\n private pendingExports: Array<{\n metrics: ResourceMetrics\n resultCallback?: (result: ExportResult) => void\n }> = []\n\n constructor(connection: SharedEngineConnection) {\n this.connection = connection\n this.connection.onConnected(() => this.flushPending())\n }\n\n private flushPending(): void {\n const pending = this.pendingExports.splice(0, this.pendingExports.length)\n for (const { metrics, resultCallback } of pending) {\n this.sendExport(metrics, resultCallback)\n }\n }\n\n private sendExport(\n metricsData: ResourceMetrics,\n resultCallback?: (result: ExportResult) => void,\n ): void {\n try {\n const serialized = JsonMetricsSerializer.serializeRequest(metricsData)\n if (!serialized) {\n resultCallback?.({ code: ExportResultCode.SUCCESS })\n return\n }\n\n this.connection.send(PREFIX_METRICS, serialized, err => {\n if (err) {\n console.error('[OTel] Failed to send metrics:', err.message)\n resultCallback?.({ code: ExportResultCode.FAILED, error: err })\n } else {\n resultCallback?.({ code: ExportResultCode.SUCCESS })\n }\n })\n } catch (err) {\n console.error('[OTel] Error exporting metrics:', err)\n resultCallback?.({ code: ExportResultCode.FAILED, error: err as Error })\n }\n }\n\n private doExport(\n metricsData: ResourceMetrics,\n resultCallback: (result: ExportResult) => void,\n ): void {\n if (this.connection.getState() !== 'connected') {\n if (this.pendingExports.length >= EngineMetricsExporter.MAX_PENDING_EXPORTS) {\n const dropped = this.pendingExports.shift()\n dropped?.resultCallback?.({\n code: ExportResultCode.FAILED,\n error: new Error('Queue overflow'),\n })\n console.warn('[OTel] Metrics export queue full, dropped oldest entry')\n }\n this.pendingExports.push({ metrics: metricsData, resultCallback })\n // Don't call resultCallback here - it will be called when actually sent or on shutdown\n return\n }\n\n this.sendExport(metricsData, resultCallback)\n }\n\n export(metrics: ResourceMetrics, resultCallback: (result: ExportResult) => void): void {\n this.doExport(metrics, resultCallback)\n }\n\n async shutdown(): Promise<void> {\n const pending = this.pendingExports.splice(0, this.pendingExports.length)\n const shutdownError = new Error('Exporter shutdown before export completed')\n for (const { resultCallback } of pending) {\n resultCallback?.({ code: ExportResultCode.FAILED, error: shutdownError })\n }\n }\n\n async forceFlush(): Promise<void> {\n // No-op\n }\n}\n","/**\n * Log exporter for the III Engine.\n */\n\nimport { ExportResultCode, type ExportResult } from '@opentelemetry/core'\nimport type { LogRecordExporter, ReadableLogRecord } from '@opentelemetry/sdk-logs'\nimport { JsonLogsSerializer } from '@opentelemetry/otlp-transformer'\n\nimport type { SharedEngineConnection } from './connection'\nimport { PREFIX_LOGS } from './types'\n\n/**\n * Log exporter using the shared WebSocket connection.\n */\nexport class EngineLogExporter implements LogRecordExporter {\n private connection: SharedEngineConnection\n private pendingExports: Array<{\n logs: ReadableLogRecord[]\n callback: (result: ExportResult) => void\n }> = []\n\n constructor(connection: SharedEngineConnection) {\n this.connection = connection\n this.connection.onConnected(() => this.flushPending())\n }\n\n private flushPending(): void {\n const pending = this.pendingExports.splice(0, this.pendingExports.length)\n for (const { logs, callback } of pending) {\n this.doExport(logs, callback)\n }\n }\n\n private doExport(\n logs: ReadableLogRecord[],\n resultCallback: (result: ExportResult) => void,\n ): void {\n if (this.connection.getState() !== 'connected') {\n this.pendingExports.push({ logs, callback: resultCallback })\n return\n }\n\n try {\n const serialized = JsonLogsSerializer.serializeRequest(logs)\n if (!serialized) {\n resultCallback({ code: ExportResultCode.SUCCESS })\n return\n }\n\n this.connection.send(PREFIX_LOGS, serialized, err => {\n if (err) {\n console.error('[OTel] Failed to send logs:', err.message)\n resultCallback({ code: ExportResultCode.FAILED, error: err })\n } else {\n resultCallback({ code: ExportResultCode.SUCCESS })\n }\n })\n } catch (err) {\n console.error('[OTel] Error exporting logs:', err)\n resultCallback({ code: ExportResultCode.FAILED, error: err as Error })\n }\n }\n\n export(logs: ReadableLogRecord[], resultCallback: (result: ExportResult) => void): void {\n this.doExport(logs, resultCallback)\n }\n\n async shutdown(): Promise<void> {\n for (const { callback } of this.pendingExports) {\n callback({ code: ExportResultCode.FAILED, error: new Error('Exporter shutdown') })\n }\n this.pendingExports = []\n }\n}\n","/**\n * Trace context and baggage propagation utilities.\n */\n\nimport { trace, context, propagation, type Context } from '@opentelemetry/api'\n\n/**\n * Extract the current trace ID from the active span context.\n */\nexport function currentTraceId(): string | undefined {\n const span = trace.getActiveSpan()\n if (span) {\n const spanContext = span.spanContext()\n if (spanContext.traceId && spanContext.traceId !== '00000000000000000000000000000000') {\n return spanContext.traceId\n }\n }\n return undefined\n}\n\n/**\n * Extract the current span ID from the active span context.\n */\nexport function currentSpanId(): string | undefined {\n const span = trace.getActiveSpan()\n if (span) {\n const spanContext = span.spanContext()\n if (spanContext.spanId && spanContext.spanId !== '0000000000000000') {\n return spanContext.spanId\n }\n }\n return undefined\n}\n\n/**\n * Inject the current trace context into a W3C traceparent header string.\n */\nexport function injectTraceparent(): string | undefined {\n const carrier: Record<string, string> = {}\n propagation.inject(context.active(), carrier)\n return carrier.traceparent\n}\n\n/**\n * Extract a trace context from a W3C traceparent header string.\n */\nexport function extractTraceparent(traceparent: string): Context {\n const carrier: Record<string, string> = { traceparent }\n return propagation.extract(context.active(), carrier)\n}\n\n/**\n * Inject the current baggage into a W3C baggage header string.\n */\nexport function injectBaggage(): string | undefined {\n const carrier: Record<string, string> = {}\n propagation.inject(context.active(), carrier)\n return carrier.baggage\n}\n\n/**\n * Extract baggage from a W3C baggage header string.\n */\nexport function extractBaggage(baggage: string): Context {\n const carrier: Record<string, string> = { baggage }\n return propagation.extract(context.active(), carrier)\n}\n\n/**\n * Extract both trace context and baggage from their respective headers.\n */\nexport function extractContext(traceparent?: string, baggage?: string): Context {\n const carrier: Record<string, string> = {}\n if (traceparent) {\n carrier.traceparent = traceparent\n }\n if (baggage) {\n carrier.baggage = baggage\n }\n return propagation.extract(context.active(), carrier)\n}\n\n/**\n * Get a baggage entry from the current context.\n */\nexport function getBaggageEntry(key: string): string | undefined {\n const bag = propagation.getBaggage(context.active())\n return bag?.getEntry(key)?.value\n}\n\n/**\n * Set a baggage entry in the current context.\n */\nexport function setBaggageEntry(key: string, value: string): Context {\n let bag = propagation.getBaggage(context.active()) ?? propagation.createBaggage()\n bag = bag.setEntry(key, { value })\n return propagation.setBaggage(context.active(), bag)\n}\n\n/**\n * Remove a baggage entry from the current context.\n */\nexport function removeBaggageEntry(key: string): Context {\n const bag = propagation.getBaggage(context.active())\n if (!bag) {\n return context.active()\n }\n const newBag = bag.removeEntry(key)\n return propagation.setBaggage(context.active(), newBag)\n}\n\n/**\n * Get all baggage entries from the current context.\n */\nexport function getAllBaggage(): Record<string, string> {\n const bag = propagation.getBaggage(context.active())\n if (!bag) {\n return {}\n }\n const entries: Record<string, string> = {}\n for (const [key, entry] of bag.getAllEntries()) {\n entries[key] = entry.value\n }\n return entries\n}\n","/**\n * Global fetch auto-instrumentation for the III Node SDK.\n *\n * Patches globalThis.fetch to create OTel CLIENT spans for every HTTP request.\n * Works on all runtimes (Bun, Node.js, Deno) unlike UndiciInstrumentation\n * which only works when fetch is backed by Node.js's undici.\n */\n\nimport { type Tracer, SpanKind, SpanStatusCode, context, propagation } from '@opentelemetry/api'\n\nconst textEncoder = new TextEncoder()\n\nfunction getBodyByteSize(body: unknown): number | undefined {\n if (body == null) return undefined\n if (typeof body === 'string') return textEncoder.encode(body).byteLength\n if (body instanceof ArrayBuffer) return body.byteLength\n if (ArrayBuffer.isView(body)) return body.byteLength\n if (body instanceof Blob) return body.size\n if (body instanceof URLSearchParams) return new TextEncoder().encode(body.toString()).byteLength\n return undefined\n}\n\nconst SAFE_REQUEST_HEADERS = ['content-type', 'accept'] as const\nconst SAFE_RESPONSE_HEADERS = ['content-type'] as const\n\nlet originalFetch: typeof globalThis.fetch | null = null\n\n/**\n * Patch globalThis.fetch to create OTel CLIENT spans for every HTTP request.\n */\nexport function patchGlobalFetch(tracer: Tracer): void {\n if (originalFetch) return\n\n originalFetch = globalThis.fetch\n const capturedFetch = originalFetch\n\n globalThis.fetch = async (\n input: string | URL | Request,\n init?: RequestInit,\n ): Promise<Response> => {\n const url = input instanceof Request ? input.url : String(input)\n const method = (init?.method ?? (input instanceof Request ? input.method : 'GET')).toUpperCase()\n\n let host: string | undefined\n let scheme: string | undefined\n let path: string | undefined\n let port: number | undefined\n let query: string | undefined\n try {\n const parsed = new URL(url)\n host = parsed.hostname\n scheme = parsed.protocol.replace(':', '')\n path = parsed.pathname\n port = parsed.port ? parseInt(parsed.port, 10) : undefined\n query = parsed.search ? parsed.search.slice(1) : undefined\n } catch {\n // relative URL or invalid — skip host/scheme/path attributes\n }\n\n const spanAttributes: Record<string, string | number> = {\n 'http.request.method': method,\n 'url.full': url,\n }\n if (host) spanAttributes['server.address'] = host\n if (scheme) {\n spanAttributes['url.scheme'] = scheme\n spanAttributes['network.protocol.name'] = 'http'\n }\n if (path) spanAttributes['url.path'] = path\n if (port) spanAttributes['server.port'] = port\n if (query) spanAttributes['url.query'] = query\n\n const spanName = path ? `${method} ${path}` : method\n\n return tracer.startActiveSpan(\n spanName,\n { kind: SpanKind.CLIENT, attributes: spanAttributes },\n context.active(),\n async span => {\n try {\n const carrier: Record<string, string> = {}\n propagation.inject(context.active(), carrier)\n\n const headers = new Headers(\n init?.headers ?? (input instanceof Request ? input.headers : undefined),\n )\n for (const [key, value] of Object.entries(carrier)) {\n headers.set(key, value)\n }\n\n for (const name of SAFE_REQUEST_HEADERS) {\n const value = headers.get(name)\n if (value !== null) {\n span.setAttribute(`http.request.header.${name}`, value)\n }\n }\n\n const requestBody = init?.body ?? (input instanceof Request ? input.body : undefined)\n const requestBodySize = getBodyByteSize(requestBody)\n if (requestBodySize !== undefined) {\n span.setAttribute('http.request.body.size', requestBodySize)\n }\n\n const response = await capturedFetch(input, { ...init, headers })\n\n span.setAttribute('http.response.status_code', response.status)\n\n const contentLength = response.headers.get('content-length')\n if (contentLength !== null) {\n const size = parseInt(contentLength, 10)\n if (!Number.isNaN(size)) {\n span.setAttribute('http.response.body.size', size)\n }\n }\n\n for (const name of SAFE_RESPONSE_HEADERS) {\n const value = response.headers.get(name)\n if (value !== null) {\n span.setAttribute(`http.response.header.${name}`, value)\n }\n }\n\n if (response.status >= 400) {\n span.setAttribute('error.type', String(response.status))\n span.setStatus({ code: SpanStatusCode.ERROR })\n } else {\n span.setStatus({ code: SpanStatusCode.OK })\n }\n\n return response\n } catch (error) {\n span.setAttribute('error.type', (error as Error).name ?? 'Error')\n span.setStatus({ code: SpanStatusCode.ERROR, message: (error as Error).message })\n span.recordException(error as Error)\n throw error\n } finally {\n span.end()\n }\n },\n )\n }\n}\n\n/**\n * Restore globalThis.fetch to its original implementation.\n */\nexport function unpatchGlobalFetch(): void {\n if (originalFetch) {\n globalThis.fetch = originalFetch\n originalFetch = null\n }\n}\n","/**\n * Parse a numeric environment variable with optional minimum bound.\n */\nexport function parseNumberEnv(value: string | undefined, minimum: number = 0): number | undefined {\n if (value === undefined) return undefined\n const parsed = Number(value)\n if (!Number.isFinite(parsed) || parsed < minimum) return undefined\n return parsed\n}\n\n/**\n * Parse an integer environment variable with optional minimum bound.\n */\nexport function parseIntegerEnv(\n value: string | undefined,\n minimum: number = 0,\n): number | undefined {\n const parsed = parseNumberEnv(value, minimum)\n if (parsed === undefined || !Number.isInteger(parsed)) return undefined\n return parsed\n}\n","/** High-level span operations so consumers don't need `@opentelemetry/api`. */\n\nimport { SpanStatusCode, trace, type AttributeValue, type Attributes } from '@opentelemetry/api'\n\n/** Returns `false` when there is no active span or the sampler dropped it. */\nexport function currentSpanIsRecording(): boolean {\n const span = trace.getActiveSpan()\n return span ? span.isRecording() : false\n}\n\n/** No-op when the current span is not recording. */\nexport function setCurrentSpanAttribute(key: string, value: AttributeValue): void {\n const span = trace.getActiveSpan()\n if (!span || !span.isRecording()) return\n span.setAttribute(key, value)\n}\n\n/** No-op when there is no active span. */\nexport function setCurrentSpanError(message: string): void {\n const span = trace.getActiveSpan()\n if (!span) return\n span.setStatus({ code: SpanStatusCode.ERROR, message })\n}\n\n/** No-op when the current span is not recording. */\nexport function recordSpanEvent(name: string, attrs?: Attributes): void {\n const span = trace.getActiveSpan()\n if (!span || !span.isRecording()) return\n span.addEvent(name, attrs)\n}\n","/** Payload redaction + truncation for invocation event capture. */\n\nexport const REDACTED_PLACEHOLDER = '[REDACTED]'\nconst TRUNCATION_MARKER = '...\"[TRUNCATED]\"'\n\nexport function resolveMaxBytesFromEnv(): number | null {\n const raw = process.env.III_TRACE_PAYLOAD_MAX_BYTES\n if (raw === undefined) return null\n const trimmed = raw.trim()\n if (trimmed === '' || trimmed.toLowerCase() === 'unlimited') return null\n // parseInt accepts partial parses like \"8192mb\" → 8192; Python int()\n // and Rust parse::<usize>() reject those. Match the strict semantics.\n if (!/^\\d+$/.test(trimmed)) return null\n const parsed = Number(trimmed)\n if (parsed <= 0) return null\n return parsed\n}\n\nconst SENSITIVE_FRAGMENTS = [\n 'api_key',\n 'apikey',\n 'api-key',\n 'password',\n 'secret',\n 'credential',\n 'authorization',\n 'auth_token',\n 'access_token',\n 'refresh_token',\n 'bearer',\n 'private_key',\n 'client_secret',\n]\n\nfunction isSensitiveKey(key: string): boolean {\n const lower = key.toLowerCase()\n if (SENSITIVE_FRAGMENTS.some((fragment) => lower.includes(fragment))) return true\n // `token` alone is too common a substring; require whole-key or suffix match.\n return lower === 'token' || lower.endsWith('_token') || lower.endsWith('-token')\n}\n\n/** Recursively redact values of sensitive keys. Returns a new value. */\nexport function redact(value: unknown): unknown {\n if (value === null || value === undefined) return value\n if (Array.isArray(value)) return value.map(redact)\n if (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] = isSensitiveKey(k) ? REDACTED_PLACEHOLDER : redact(v)\n }\n return out\n }\n return value\n}\n\n/** Redact then serialize to JSON, optionally capped at `maxBytes`. */\nexport function redactAndTruncate(\n value: unknown,\n maxBytes: number | null = null,\n): { json: string; truncated: boolean } {\n const redacted = redact(value)\n let serialized: string\n try {\n serialized = JSON.stringify(redacted) ?? 'null'\n } catch {\n serialized = 'null'\n }\n\n if (maxBytes === null || maxBytes === undefined || maxBytes <= 0) {\n return { json: serialized, truncated: false }\n }\n\n const byteLen = Buffer.byteLength(serialized, 'utf8')\n if (byteLen <= maxBytes) {\n return { json: serialized, truncated: false }\n }\n\n const markerLen = Buffer.byteLength(TRUNCATION_MARKER, 'utf8')\n // When maxBytes is smaller than the marker itself, emit only a\n // truncated marker so the result never exceeds the cap.\n if (maxBytes <= markerLen) {\n return { json: TRUNCATION_MARKER.slice(0, maxBytes), truncated: true }\n }\n\n const cap = maxBytes - markerLen\n const buf = Buffer.from(serialized, 'utf8')\n let cut = Math.min(cap, buf.length)\n // Walk back to a UTF-8 boundary so we don't emit half-codepoints.\n while (cut > 0 && (buf[cut] & 0xc0) === 0x80) {\n cut -= 1\n }\n const truncated = buf.subarray(0, cut).toString('utf8') + TRUNCATION_MARKER\n return { json: truncated, truncated: true }\n}\n","/**\n * OpenTelemetry initialization for the III Node SDK.\n *\n * This module provides trace, metrics, and log export to the III Engine\n * via a shared WebSocket connection using OTLP JSON format.\n */\n\nimport { Resource } from '@opentelemetry/resources'\nimport { ATTR_SERVICE_NAME } from '@opentelemetry/semantic-conventions'\nimport { randomUUID } from 'node:crypto'\nimport {\n trace,\n context,\n propagation,\n SpanKind,\n SpanStatusCode,\n metrics,\n type Span,\n type Context,\n type Tracer,\n type Meter,\n} from '@opentelemetry/api'\nimport { BatchSpanProcessor } from '@opentelemetry/sdk-trace-base'\nimport { BaggageSpanProcessor } from './baggage-span-processor'\nimport { MeterProvider, PeriodicExportingMetricReader } from '@opentelemetry/sdk-metrics'\nimport { CompositePropagator, W3CBaggagePropagator, W3CTraceContextPropagator } from '@opentelemetry/core'\nimport { NodeTracerProvider } from '@opentelemetry/sdk-trace-node'\nimport { registerInstrumentations } from '@opentelemetry/instrumentation'\nimport { LoggerProvider, BatchLogRecordProcessor } from '@opentelemetry/sdk-logs'\nimport { type Logger, SeverityNumber } from '@opentelemetry/api-logs'\n\nimport {\n type OtelConfig,\n DEFAULT_OTEL_CONFIG,\n parseBoolEnv,\n ATTR_SERVICE_VERSION,\n ATTR_SERVICE_NAMESPACE,\n ATTR_SERVICE_INSTANCE_ID,\n} from './types'\nimport { SharedEngineConnection } from './connection'\nimport { EngineSpanExporter, EngineMetricsExporter, EngineLogExporter } from './exporters'\nimport { extractTraceparent } from './context'\nimport { patchGlobalFetch, unpatchGlobalFetch } from './fetch-instrumentation'\nimport { parseIntegerEnv, parseNumberEnv } from './utils'\n\n// Re-export everything from submodules\nexport * from './types'\nexport * from './context'\nexport { BaggageSpanProcessor, DEFAULT_ALLOWLIST } from './baggage-span-processor'\nexport {\n currentSpanIsRecording,\n recordSpanEvent,\n setCurrentSpanAttribute,\n setCurrentSpanError,\n} from './span-ops'\nexport {\n REDACTED_PLACEHOLDER,\n redact,\n redactAndTruncate,\n resolveMaxBytesFromEnv,\n} from './payload'\n\n/**\n * Normalize an engine WebSocket URL into the dedicated OTEL endpoint.\n * The engine exposes `/otel` for telemetry-only WS connections; routing\n * there keeps this socket out of the worker registry (otherwise it shows\n * up as a ghost null-metadata worker).\n */\nfunction appendOtelPath(base: string): string {\n const url = new URL(base)\n const path = url.pathname.replace(/\\/+$/, '')\n url.pathname = path.endsWith('/otel') ? path : `${path}/otel`\n return url.toString()\n}\n\n// Module-level state\nlet sharedConnection: SharedEngineConnection | null = null\nlet tracerProvider: NodeTracerProvider | null = null\nlet meterProvider: MeterProvider | null = null\nlet loggerProvider: LoggerProvider | null = null\nlet tracer: Tracer | null = null\nlet meter: Meter | null = null\nlet logger: Logger | null = null\nlet serviceName: string = 'iii-node-iii'\n\n/**\n * Initialize OpenTelemetry with the given configuration.\n * This should be called once at application startup.\n */\nexport function initOtel(config: OtelConfig = {}): void {\n const enabled = config.enabled ?? parseBoolEnv(process.env.OTEL_ENABLED, DEFAULT_OTEL_CONFIG.enabled)\n\n if (!enabled) {\n console.debug(\n '[OTel] OpenTelemetry is disabled. To enable, remove OTEL_ENABLED=false or set enabled: true in config.',\n )\n return\n }\n\n // Configure service identity\n serviceName = config.serviceName ?? process.env.OTEL_SERVICE_NAME ?? DEFAULT_OTEL_CONFIG.serviceName\n const serviceVersion = config.serviceVersion ?? process.env.SERVICE_VERSION ?? DEFAULT_OTEL_CONFIG.serviceVersion\n const serviceNamespace = config.serviceNamespace ?? process.env.SERVICE_NAMESPACE\n const serviceInstanceId = config.serviceInstanceId ?? process.env.SERVICE_INSTANCE_ID ?? randomUUID()\n const engineWsUrl = config.engineWsUrl ?? process.env.III_URL ?? DEFAULT_OTEL_CONFIG.engineWsUrl\n\n // Build resource attributes\n const resourceAttributes: Record<string, string> = {\n [ATTR_SERVICE_NAME]: serviceName,\n [ATTR_SERVICE_VERSION]: serviceVersion,\n [ATTR_SERVICE_INSTANCE_ID]: serviceInstanceId,\n }\n if (serviceNamespace) {\n resourceAttributes[ATTR_SERVICE_NAMESPACE] = serviceNamespace\n }\n const resource = new Resource(resourceAttributes)\n\n // Create shared WebSocket connection.\n // OTEL always connects to the engine's dedicated `/otel` endpoint so\n // the telemetry socket doesn't get registered in `worker_registry` as\n // a ghost null-metadata worker alongside the real worker.\n sharedConnection = new SharedEngineConnection(appendOtelPath(engineWsUrl), config.reconnectionConfig)\n\n // BaggageSpanProcessor must register first: onStart fires in\n // registration order, so baggage entries are materialized as span\n // attributes before the batch exporter reads them.\n const spanExporter = new EngineSpanExporter(sharedConnection)\n tracerProvider = new NodeTracerProvider({\n resource,\n spanProcessors: [new BaggageSpanProcessor(), new BatchSpanProcessor(spanExporter)],\n })\n\n // Register W3C Trace Context and Baggage propagators\n propagation.setGlobalPropagator(\n new CompositePropagator({\n propagators: [new W3CTraceContextPropagator(), new W3CBaggagePropagator()],\n }),\n )\n\n tracerProvider.register()\n tracer = trace.getTracer(serviceName)\n\n console.debug(`[OTel] Traces initialized: engine=${engineWsUrl}, service=${serviceName}`)\n\n // Initialize metrics (enabled by default, opt-out via config or env)\n const metricsEnabled =\n config.metricsEnabled ?? parseBoolEnv(process.env.OTEL_METRICS_ENABLED, DEFAULT_OTEL_CONFIG.metricsEnabled)\n\n if (metricsEnabled) {\n const metricsExporter = new EngineMetricsExporter(sharedConnection)\n const exportIntervalMs = config.metricsExportIntervalMs ?? DEFAULT_OTEL_CONFIG.metricsExportIntervalMs\n\n const metricReader = new PeriodicExportingMetricReader({\n exporter: metricsExporter,\n exportIntervalMillis: exportIntervalMs,\n })\n\n meterProvider = new MeterProvider({\n resource,\n readers: [metricReader],\n })\n\n metrics.setGlobalMeterProvider(meterProvider)\n meter = meterProvider.getMeter(serviceName)\n\n console.debug(`[OTel] Metrics initialized: interval=${exportIntervalMs}ms`)\n }\n\n // Register user-provided instrumentations AFTER providers are set up\n const instrumentations = [...(config.instrumentations ?? [])]\n if (instrumentations.length > 0) {\n registerInstrumentations({\n instrumentations,\n tracerProvider,\n meterProvider: meterProvider ?? undefined,\n })\n console.debug(`[OTel] Instrumentations registered: ${instrumentations.length} total`)\n }\n\n // Patch global fetch for runtime-agnostic HTTP client tracing (works on Bun, Node.js, Deno)\n const fetchEnabled = config.fetchInstrumentationEnabled ?? DEFAULT_OTEL_CONFIG.fetchInstrumentationEnabled\n\n if (fetchEnabled) {\n patchGlobalFetch(tracer)\n console.debug('[OTel] Global fetch instrumentation enabled')\n }\n\n // Initialize logs (always enabled when OTEL is enabled)\n const logExporter = new EngineLogExporter(sharedConnection)\n const logsScheduledDelayMillis =\n config.logsFlushIntervalMs ??\n parseNumberEnv(process.env.OTEL_LOGS_FLUSH_INTERVAL_MS, 0) ??\n DEFAULT_OTEL_CONFIG.logsFlushIntervalMs\n const logsMaxExportBatchSize =\n config.logsBatchSize ?? parseIntegerEnv(process.env.OTEL_LOGS_BATCH_SIZE, 1) ?? DEFAULT_OTEL_CONFIG.logsBatchSize\n\n loggerProvider = new LoggerProvider({ resource })\n loggerProvider.addLogRecordProcessor(\n new BatchLogRecordProcessor(logExporter, {\n scheduledDelayMillis: logsScheduledDelayMillis,\n maxExportBatchSize: logsMaxExportBatchSize,\n }),\n )\n logger = loggerProvider.getLogger(serviceName)\n\n console.debug(`[OTel] Logs initialized: delay=${logsScheduledDelayMillis}ms, batch=${logsMaxExportBatchSize}`)\n}\n\n/**\n * Shutdown OpenTelemetry, flushing any pending data.\n */\nexport async function shutdownOtel(): Promise<void> {\n if (tracerProvider) {\n await tracerProvider.forceFlush()\n await tracerProvider.shutdown()\n tracerProvider = null\n }\n\n if (meterProvider) {\n await meterProvider.forceFlush()\n await meterProvider.shutdown()\n meterProvider = null\n }\n\n if (loggerProvider) {\n await loggerProvider.forceFlush()\n await loggerProvider.shutdown()\n loggerProvider = null\n }\n\n if (sharedConnection) {\n await sharedConnection.shutdown()\n sharedConnection = null\n }\n\n unpatchGlobalFetch()\n\n tracer = null\n meter = null\n logger = null\n}\n\n/**\n * Get the OpenTelemetry tracer instance.\n */\nexport function getTracer(): Tracer | null {\n return tracer\n}\n\n/**\n * Get the OpenTelemetry meter instance.\n */\nexport function getMeter(): Meter | null {\n return meter\n}\n\n/**\n * Get the OpenTelemetry logger instance.\n */\nexport function getLogger(): Logger | null {\n return logger\n}\n\n/**\n * Start a new span with the given name and run the callback within it.\n */\nexport async function withSpan<T>(\n name: string,\n options: { kind?: SpanKind; traceparent?: string },\n fn: (span: Span) => Promise<T>,\n): Promise<T> {\n if (!tracer) {\n // Execute without span context when tracer is not initialized\n // Provide a no-op span to avoid runtime errors if fn calls span methods\n const noopSpan: Span = {\n spanContext: () => ({ traceId: '', spanId: '', traceFlags: 0 }),\n setAttribute: () => noopSpan,\n setAttributes: () => noopSpan,\n addEvent: () => noopSpan,\n addLink: () => noopSpan,\n setStatus: () => noopSpan,\n updateName: () => noopSpan,\n end: () => {},\n isRecording: () => false,\n recordException: () => {},\n addLinks: () => noopSpan,\n }\n return fn(noopSpan)\n }\n\n const parentContext = options.traceparent ? extractTraceparent(options.traceparent) : context.active()\n\n return tracer.startActiveSpan(name, { kind: options.kind ?? SpanKind.INTERNAL }, parentContext, async (span) => {\n try {\n const result = await fn(span)\n span.setStatus({ code: SpanStatusCode.OK })\n return result\n } catch (error) {\n span.setStatus({ code: SpanStatusCode.ERROR, message: (error as Error).message })\n span.recordException(error as Error)\n throw error\n } finally {\n span.end()\n }\n })\n}\n\n// Re-export OTEL types for convenience\nexport { SpanKind, SpanStatusCode, SeverityNumber, type Span, type Context, type Tracer, type Meter, type Logger }\n"],"mappings":"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"}
|