iii-sdk 0.8.3 → 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.
Files changed (50) hide show
  1. package/README.md +15 -11
  2. package/dist/index.cjs +278 -142
  3. package/dist/index.cjs.map +1 -1
  4. package/dist/index.d.cts +177 -3
  5. package/dist/index.d.cts.map +1 -1
  6. package/dist/index.d.mts +177 -3
  7. package/dist/index.d.mts.map +1 -1
  8. package/dist/index.mjs +259 -125
  9. package/dist/index.mjs.map +1 -1
  10. package/dist/state.cjs +7 -5
  11. package/dist/state.cjs.map +1 -1
  12. package/dist/state.d.cts +38 -13
  13. package/dist/state.d.cts.map +1 -1
  14. package/dist/state.d.mts +38 -13
  15. package/dist/state.d.mts.map +1 -1
  16. package/dist/state.mjs +6 -5
  17. package/dist/state.mjs.map +1 -1
  18. package/dist/stream-C1zUjhzk.d.mts +145 -0
  19. package/dist/stream-C1zUjhzk.d.mts.map +1 -0
  20. package/dist/stream-lxenNA3s.d.cts +145 -0
  21. package/dist/stream-lxenNA3s.d.cts.map +1 -0
  22. package/dist/stream.d.cts +1 -1
  23. package/dist/stream.d.mts +1 -1
  24. package/dist/telemetry.cjs +6 -5
  25. package/dist/telemetry.d.cts +10 -11
  26. package/dist/telemetry.d.cts.map +1 -1
  27. package/dist/telemetry.d.mts +10 -11
  28. package/dist/telemetry.d.mts.map +1 -1
  29. package/dist/telemetry.mjs +1 -1
  30. package/dist/utils-BvWlFlLq.d.cts +839 -0
  31. package/dist/utils-BvWlFlLq.d.cts.map +1 -0
  32. package/dist/{utils-BJTjoUdq.cjs → utils-C6yTT4Js.cjs} +311 -282
  33. package/dist/utils-C6yTT4Js.cjs.map +1 -0
  34. package/dist/utils-_zSeatp1.d.mts +839 -0
  35. package/dist/utils-_zSeatp1.d.mts.map +1 -0
  36. package/dist/{utils-coGqiBHT.mjs → utils-xBUm8n1P.mjs} +246 -217
  37. package/dist/utils-xBUm8n1P.mjs.map +1 -0
  38. package/package.json +5 -3
  39. package/typedoc.json +8 -0
  40. package/vitest.config.ts +4 -4
  41. package/dist/stream-BEp3rjfm.d.cts +0 -97
  42. package/dist/stream-BEp3rjfm.d.cts.map +0 -1
  43. package/dist/stream-Bzpo5JNV.d.mts +0 -97
  44. package/dist/stream-Bzpo5JNV.d.mts.map +0 -1
  45. package/dist/utils-BJTjoUdq.cjs.map +0 -1
  46. package/dist/utils-BaGgUfjl.d.cts +0 -524
  47. package/dist/utils-BaGgUfjl.d.cts.map +0 -1
  48. package/dist/utils-CMrMD5Ij.d.mts +0 -524
  49. package/dist/utils-CMrMD5Ij.d.mts.map +0 -1
  50. package/dist/utils-coGqiBHT.mjs.map +0 -1
@@ -1,18 +1,18 @@
1
1
  const require_index = require('./index.cjs');
2
- let __opentelemetry_api = require("@opentelemetry/api");
3
2
  let ws = require("ws");
4
- let __opentelemetry_resources = require("@opentelemetry/resources");
5
- let __opentelemetry_semantic_conventions = require("@opentelemetry/semantic-conventions");
6
- let node_crypto = require("node:crypto");
7
- let __opentelemetry_sdk_trace_base = require("@opentelemetry/sdk-trace-base");
8
- let __opentelemetry_sdk_metrics = require("@opentelemetry/sdk-metrics");
9
- let __opentelemetry_core = require("@opentelemetry/core");
10
- let __opentelemetry_sdk_trace_node = require("@opentelemetry/sdk-trace-node");
11
- let __opentelemetry_instrumentation = require("@opentelemetry/instrumentation");
12
- let __opentelemetry_sdk_logs = require("@opentelemetry/sdk-logs");
13
- let __opentelemetry_api_logs = require("@opentelemetry/api-logs");
14
- let __opentelemetry_otlp_transformer = require("@opentelemetry/otlp-transformer");
3
+ let _opentelemetry_api = require("@opentelemetry/api");
15
4
  let node_perf_hooks = require("node:perf_hooks");
5
+ let _opentelemetry_resources = require("@opentelemetry/resources");
6
+ let _opentelemetry_semantic_conventions = require("@opentelemetry/semantic-conventions");
7
+ let node_crypto = require("node:crypto");
8
+ let _opentelemetry_sdk_trace_base = require("@opentelemetry/sdk-trace-base");
9
+ let _opentelemetry_sdk_metrics = require("@opentelemetry/sdk-metrics");
10
+ let _opentelemetry_core = require("@opentelemetry/core");
11
+ let _opentelemetry_sdk_trace_node = require("@opentelemetry/sdk-trace-node");
12
+ let _opentelemetry_instrumentation = require("@opentelemetry/instrumentation");
13
+ let _opentelemetry_sdk_logs = require("@opentelemetry/sdk-logs");
14
+ let _opentelemetry_api_logs = require("@opentelemetry/api-logs");
15
+ let _opentelemetry_otlp_transformer = require("@opentelemetry/otlp-transformer");
16
16
 
17
17
  //#region src/iii-constants.ts
18
18
  /**
@@ -22,6 +22,7 @@ let node_perf_hooks = require("node:perf_hooks");
22
22
  const EngineFunctions = {
23
23
  LIST_FUNCTIONS: "engine::functions::list",
24
24
  LIST_WORKERS: "engine::workers::list",
25
+ LIST_TRIGGERS: "engine::triggers::list",
25
26
  REGISTER_WORKER: "engine::workers::register"
26
27
  };
27
28
  /** Engine trigger types */
@@ -47,6 +48,213 @@ const DEFAULT_BRIDGE_RECONNECTION_CONFIG = {
47
48
  /** Default invocation timeout in milliseconds */
48
49
  const DEFAULT_INVOCATION_TIMEOUT_MS = 3e4;
49
50
 
51
+ //#endregion
52
+ //#region src/worker-metrics.ts
53
+ /**
54
+ * Worker metrics collection for the III Node SDK.
55
+ *
56
+ * Collects CPU, memory, and event loop metrics for worker health monitoring.
57
+ * Uses the Node.js built-in `monitorEventLoopDelay` API for accurate
58
+ * event loop lag measurements.
59
+ */
60
+ /**
61
+ * Collects worker resource metrics including CPU, memory, and event loop lag.
62
+ *
63
+ * Uses the Node.js `monitorEventLoopDelay` API for high-precision event loop
64
+ * delay measurements instead of manual `setImmediate` timing.
65
+ *
66
+ * @example
67
+ * ```typescript
68
+ * const collector = new WorkerMetricsCollector()
69
+ *
70
+ * // Collect metrics periodically
71
+ * setInterval(() => {
72
+ * const metrics = collector.collect()
73
+ * console.log('CPU:', metrics.cpu_percent, '%')
74
+ * console.log('Event Loop Lag:', metrics.event_loop_lag_ms, 'ms')
75
+ * }, 5000)
76
+ *
77
+ * // Clean up when done
78
+ * collector.stopMonitoring()
79
+ * ```
80
+ */
81
+ var WorkerMetricsCollector = class {
82
+ /**
83
+ * Creates a new WorkerMetricsCollector instance.
84
+ *
85
+ * @param options - Configuration options
86
+ */
87
+ constructor(options = {}) {
88
+ this.eventLoopHistogram = null;
89
+ this.startTime = Date.now();
90
+ this.lastCpuUsage = process.cpuUsage();
91
+ this.lastCpuTime = node_perf_hooks.performance.now();
92
+ this.startEventLoopMonitoring(options.eventLoopResolutionMs ?? 20);
93
+ }
94
+ /**
95
+ * Starts the event loop delay histogram monitoring.
96
+ *
97
+ * @param resolutionMs - Histogram resolution in milliseconds
98
+ */
99
+ startEventLoopMonitoring(resolutionMs) {
100
+ this.eventLoopHistogram = (0, node_perf_hooks.monitorEventLoopDelay)({ resolution: Number.isFinite(resolutionMs) && resolutionMs > 0 ? Math.max(1, Math.floor(resolutionMs)) : 20 });
101
+ this.eventLoopHistogram.enable();
102
+ }
103
+ /**
104
+ * Stops the event loop monitoring and releases resources.
105
+ * Should be called when the collector is no longer needed.
106
+ */
107
+ stopMonitoring() {
108
+ if (this.eventLoopHistogram) {
109
+ this.eventLoopHistogram.disable();
110
+ this.eventLoopHistogram = null;
111
+ }
112
+ }
113
+ /**
114
+ * Collects current worker metrics.
115
+ *
116
+ * This method calculates CPU usage since the last collection,
117
+ * reads memory usage, and gets event loop delay statistics.
118
+ * The event loop histogram is reset after each collection for
119
+ * accurate per-interval measurements.
120
+ *
121
+ * @returns Current worker metrics snapshot
122
+ */
123
+ collect() {
124
+ const memoryUsage = process.memoryUsage();
125
+ const cpuUsage = process.cpuUsage();
126
+ const now = node_perf_hooks.performance.now();
127
+ const cpuDelta = {
128
+ user: cpuUsage.user - this.lastCpuUsage.user,
129
+ system: cpuUsage.system - this.lastCpuUsage.system
130
+ };
131
+ const timeDelta = (now - this.lastCpuTime) * 1e3;
132
+ const cpuPercent = timeDelta > 0 ? (cpuDelta.user + cpuDelta.system) / timeDelta * 100 : 0;
133
+ this.lastCpuUsage = cpuUsage;
134
+ this.lastCpuTime = now;
135
+ let eventLoopLagMs = 0;
136
+ if (this.eventLoopHistogram) {
137
+ eventLoopLagMs = this.eventLoopHistogram.mean / 1e6;
138
+ this.eventLoopHistogram.reset();
139
+ }
140
+ return {
141
+ memory_heap_used: memoryUsage.heapUsed,
142
+ memory_heap_total: memoryUsage.heapTotal,
143
+ memory_rss: memoryUsage.rss,
144
+ memory_external: memoryUsage.external,
145
+ cpu_user_micros: cpuUsage.user,
146
+ cpu_system_micros: cpuUsage.system,
147
+ cpu_percent: Math.min(cpuPercent, 100),
148
+ event_loop_lag_ms: eventLoopLagMs,
149
+ uptime_seconds: Math.floor((Date.now() - this.startTime) / 1e3),
150
+ timestamp_ms: Date.now(),
151
+ runtime: "node"
152
+ };
153
+ }
154
+ };
155
+
156
+ //#endregion
157
+ //#region src/otel-worker-gauges.ts
158
+ let registeredGauges = false;
159
+ let metricsCollector = null;
160
+ let registeredMeter = null;
161
+ let registeredBatchCallback = null;
162
+ let registeredObservables = [];
163
+ function registerWorkerGauges(meter, options) {
164
+ if (registeredGauges) return;
165
+ const { workerId, workerName } = options;
166
+ const baseAttributes = {
167
+ "worker.id": workerId,
168
+ ...workerName && { "worker.name": workerName }
169
+ };
170
+ metricsCollector = new WorkerMetricsCollector();
171
+ const memoryHeapUsed = meter.createObservableGauge("iii.worker.memory.heap_used", {
172
+ description: "Worker heap memory used in bytes",
173
+ unit: "bytes"
174
+ });
175
+ const memoryHeapTotal = meter.createObservableGauge("iii.worker.memory.heap_total", {
176
+ description: "Worker total heap memory in bytes",
177
+ unit: "bytes"
178
+ });
179
+ const memoryRss = meter.createObservableGauge("iii.worker.memory.rss", {
180
+ description: "Worker resident set size in bytes",
181
+ unit: "bytes"
182
+ });
183
+ const memoryExternal = meter.createObservableGauge("iii.worker.memory.external", {
184
+ description: "Worker external memory in bytes",
185
+ unit: "bytes"
186
+ });
187
+ const cpuPercent = meter.createObservableGauge("iii.worker.cpu.percent", {
188
+ description: "Worker CPU usage percentage",
189
+ unit: "%"
190
+ });
191
+ const cpuUserMicros = meter.createObservableGauge("iii.worker.cpu.user_micros", {
192
+ description: "Worker CPU user time in microseconds",
193
+ unit: "us"
194
+ });
195
+ const cpuSystemMicros = meter.createObservableGauge("iii.worker.cpu.system_micros", {
196
+ description: "Worker CPU system time in microseconds",
197
+ unit: "us"
198
+ });
199
+ const eventLoopLag = meter.createObservableGauge("iii.worker.event_loop.lag_ms", {
200
+ description: "Worker event loop lag in milliseconds",
201
+ unit: "ms"
202
+ });
203
+ const uptimeSeconds = meter.createObservableGauge("iii.worker.uptime_seconds", {
204
+ description: "Worker uptime in seconds",
205
+ unit: "s"
206
+ });
207
+ const batchCallback = (observableResult) => {
208
+ if (!metricsCollector) return;
209
+ const metrics = metricsCollector.collect();
210
+ if (metrics.memory_heap_used !== void 0) observableResult.observe(memoryHeapUsed, metrics.memory_heap_used, baseAttributes);
211
+ if (metrics.memory_heap_total !== void 0) observableResult.observe(memoryHeapTotal, metrics.memory_heap_total, baseAttributes);
212
+ if (metrics.memory_rss !== void 0) observableResult.observe(memoryRss, metrics.memory_rss, baseAttributes);
213
+ if (metrics.memory_external !== void 0) observableResult.observe(memoryExternal, metrics.memory_external, baseAttributes);
214
+ if (metrics.cpu_percent !== void 0) observableResult.observe(cpuPercent, metrics.cpu_percent, baseAttributes);
215
+ if (metrics.cpu_user_micros !== void 0) observableResult.observe(cpuUserMicros, metrics.cpu_user_micros, baseAttributes);
216
+ if (metrics.cpu_system_micros !== void 0) observableResult.observe(cpuSystemMicros, metrics.cpu_system_micros, baseAttributes);
217
+ if (metrics.event_loop_lag_ms !== void 0) observableResult.observe(eventLoopLag, metrics.event_loop_lag_ms, baseAttributes);
218
+ if (metrics.uptime_seconds !== void 0) observableResult.observe(uptimeSeconds, metrics.uptime_seconds, baseAttributes);
219
+ };
220
+ meter.addBatchObservableCallback(batchCallback, [
221
+ memoryHeapUsed,
222
+ memoryHeapTotal,
223
+ memoryRss,
224
+ memoryExternal,
225
+ cpuPercent,
226
+ cpuUserMicros,
227
+ cpuSystemMicros,
228
+ eventLoopLag,
229
+ uptimeSeconds
230
+ ]);
231
+ registeredMeter = meter;
232
+ registeredBatchCallback = batchCallback;
233
+ registeredObservables = [
234
+ memoryHeapUsed,
235
+ memoryHeapTotal,
236
+ memoryRss,
237
+ memoryExternal,
238
+ cpuPercent,
239
+ cpuUserMicros,
240
+ cpuSystemMicros,
241
+ eventLoopLag,
242
+ uptimeSeconds
243
+ ];
244
+ registeredGauges = true;
245
+ }
246
+ function stopWorkerGauges() {
247
+ if (registeredMeter && registeredBatchCallback) registeredMeter.removeBatchObservableCallback(registeredBatchCallback, registeredObservables);
248
+ if (metricsCollector) {
249
+ metricsCollector.stopMonitoring();
250
+ metricsCollector = null;
251
+ }
252
+ registeredMeter = null;
253
+ registeredBatchCallback = null;
254
+ registeredObservables = [];
255
+ registeredGauges = false;
256
+ }
257
+
50
258
  //#endregion
51
259
  //#region src/telemetry-system/types.ts
52
260
  const ATTR_SERVICE_VERSION = "service.version";
@@ -253,24 +461,24 @@ var EngineSpanExporter = class EngineSpanExporter {
253
461
  }
254
462
  sendExport(spans, resultCallback) {
255
463
  try {
256
- const serialized = __opentelemetry_otlp_transformer.JsonTraceSerializer.serializeRequest(spans);
464
+ const serialized = _opentelemetry_otlp_transformer.JsonTraceSerializer.serializeRequest(spans);
257
465
  if (!serialized) {
258
- resultCallback?.({ code: __opentelemetry_core.ExportResultCode.SUCCESS });
466
+ resultCallback?.({ code: _opentelemetry_core.ExportResultCode.SUCCESS });
259
467
  return;
260
468
  }
261
469
  this.connection.send(PREFIX_TRACES, serialized, (err) => {
262
470
  if (err) {
263
471
  console.error("[OTel] Failed to send spans:", err.message);
264
472
  resultCallback?.({
265
- code: __opentelemetry_core.ExportResultCode.FAILED,
473
+ code: _opentelemetry_core.ExportResultCode.FAILED,
266
474
  error: err
267
475
  });
268
- } else resultCallback?.({ code: __opentelemetry_core.ExportResultCode.SUCCESS });
476
+ } else resultCallback?.({ code: _opentelemetry_core.ExportResultCode.SUCCESS });
269
477
  });
270
478
  } catch (err) {
271
479
  console.error("[OTel] Error exporting spans:", err);
272
480
  resultCallback?.({
273
- code: __opentelemetry_core.ExportResultCode.FAILED,
481
+ code: _opentelemetry_core.ExportResultCode.FAILED,
274
482
  error: err
275
483
  });
276
484
  }
@@ -279,7 +487,7 @@ var EngineSpanExporter = class EngineSpanExporter {
279
487
  if (this.connection.getState() !== "connected") {
280
488
  if (this.pendingExports.length >= EngineSpanExporter.MAX_PENDING_EXPORTS) {
281
489
  this.pendingExports.shift()?.resultCallback?.({
282
- code: __opentelemetry_core.ExportResultCode.FAILED,
490
+ code: _opentelemetry_core.ExportResultCode.FAILED,
283
491
  error: /* @__PURE__ */ new Error("Queue overflow")
284
492
  });
285
493
  console.warn("[OTel] Spans export queue full, dropped oldest entry");
@@ -299,7 +507,7 @@ var EngineSpanExporter = class EngineSpanExporter {
299
507
  const pending = this.pendingExports.splice(0, this.pendingExports.length);
300
508
  const shutdownError = /* @__PURE__ */ new Error("Exporter shutdown before export completed");
301
509
  for (const { resultCallback } of pending) resultCallback?.({
302
- code: __opentelemetry_core.ExportResultCode.FAILED,
510
+ code: _opentelemetry_core.ExportResultCode.FAILED,
303
511
  error: shutdownError
304
512
  });
305
513
  }
@@ -325,28 +533,28 @@ var EngineMetricsExporter = class EngineMetricsExporter {
325
533
  }
326
534
  flushPending() {
327
535
  const pending = this.pendingExports.splice(0, this.pendingExports.length);
328
- for (const { metrics: metrics$1, resultCallback } of pending) this.sendExport(metrics$1, resultCallback);
536
+ for (const { metrics, resultCallback } of pending) this.sendExport(metrics, resultCallback);
329
537
  }
330
538
  sendExport(metricsData, resultCallback) {
331
539
  try {
332
- const serialized = __opentelemetry_otlp_transformer.JsonMetricsSerializer.serializeRequest(metricsData);
540
+ const serialized = _opentelemetry_otlp_transformer.JsonMetricsSerializer.serializeRequest(metricsData);
333
541
  if (!serialized) {
334
- resultCallback?.({ code: __opentelemetry_core.ExportResultCode.SUCCESS });
542
+ resultCallback?.({ code: _opentelemetry_core.ExportResultCode.SUCCESS });
335
543
  return;
336
544
  }
337
545
  this.connection.send(PREFIX_METRICS, serialized, (err) => {
338
546
  if (err) {
339
547
  console.error("[OTel] Failed to send metrics:", err.message);
340
548
  resultCallback?.({
341
- code: __opentelemetry_core.ExportResultCode.FAILED,
549
+ code: _opentelemetry_core.ExportResultCode.FAILED,
342
550
  error: err
343
551
  });
344
- } else resultCallback?.({ code: __opentelemetry_core.ExportResultCode.SUCCESS });
552
+ } else resultCallback?.({ code: _opentelemetry_core.ExportResultCode.SUCCESS });
345
553
  });
346
554
  } catch (err) {
347
555
  console.error("[OTel] Error exporting metrics:", err);
348
556
  resultCallback?.({
349
- code: __opentelemetry_core.ExportResultCode.FAILED,
557
+ code: _opentelemetry_core.ExportResultCode.FAILED,
350
558
  error: err
351
559
  });
352
560
  }
@@ -355,7 +563,7 @@ var EngineMetricsExporter = class EngineMetricsExporter {
355
563
  if (this.connection.getState() !== "connected") {
356
564
  if (this.pendingExports.length >= EngineMetricsExporter.MAX_PENDING_EXPORTS) {
357
565
  this.pendingExports.shift()?.resultCallback?.({
358
- code: __opentelemetry_core.ExportResultCode.FAILED,
566
+ code: _opentelemetry_core.ExportResultCode.FAILED,
359
567
  error: /* @__PURE__ */ new Error("Queue overflow")
360
568
  });
361
569
  console.warn("[OTel] Metrics export queue full, dropped oldest entry");
@@ -368,14 +576,14 @@ var EngineMetricsExporter = class EngineMetricsExporter {
368
576
  }
369
577
  this.sendExport(metricsData, resultCallback);
370
578
  }
371
- export(metrics$1, resultCallback) {
372
- this.doExport(metrics$1, resultCallback);
579
+ export(metrics, resultCallback) {
580
+ this.doExport(metrics, resultCallback);
373
581
  }
374
582
  async shutdown() {
375
583
  const pending = this.pendingExports.splice(0, this.pendingExports.length);
376
584
  const shutdownError = /* @__PURE__ */ new Error("Exporter shutdown before export completed");
377
585
  for (const { resultCallback } of pending) resultCallback?.({
378
- code: __opentelemetry_core.ExportResultCode.FAILED,
586
+ code: _opentelemetry_core.ExportResultCode.FAILED,
379
587
  error: shutdownError
380
588
  });
381
589
  }
@@ -409,24 +617,24 @@ var EngineLogExporter = class {
409
617
  return;
410
618
  }
411
619
  try {
412
- const serialized = __opentelemetry_otlp_transformer.JsonLogsSerializer.serializeRequest(logs);
620
+ const serialized = _opentelemetry_otlp_transformer.JsonLogsSerializer.serializeRequest(logs);
413
621
  if (!serialized) {
414
- resultCallback({ code: __opentelemetry_core.ExportResultCode.SUCCESS });
622
+ resultCallback({ code: _opentelemetry_core.ExportResultCode.SUCCESS });
415
623
  return;
416
624
  }
417
625
  this.connection.send(PREFIX_LOGS, serialized, (err) => {
418
626
  if (err) {
419
627
  console.error("[OTel] Failed to send logs:", err.message);
420
628
  resultCallback({
421
- code: __opentelemetry_core.ExportResultCode.FAILED,
629
+ code: _opentelemetry_core.ExportResultCode.FAILED,
422
630
  error: err
423
631
  });
424
- } else resultCallback({ code: __opentelemetry_core.ExportResultCode.SUCCESS });
632
+ } else resultCallback({ code: _opentelemetry_core.ExportResultCode.SUCCESS });
425
633
  });
426
634
  } catch (err) {
427
635
  console.error("[OTel] Error exporting logs:", err);
428
636
  resultCallback({
429
- code: __opentelemetry_core.ExportResultCode.FAILED,
637
+ code: _opentelemetry_core.ExportResultCode.FAILED,
430
638
  error: err
431
639
  });
432
640
  }
@@ -436,7 +644,7 @@ var EngineLogExporter = class {
436
644
  }
437
645
  async shutdown() {
438
646
  for (const { callback } of this.pendingExports) callback({
439
- code: __opentelemetry_core.ExportResultCode.FAILED,
647
+ code: _opentelemetry_core.ExportResultCode.FAILED,
440
648
  error: /* @__PURE__ */ new Error("Exporter shutdown")
441
649
  });
442
650
  this.pendingExports = [];
@@ -452,7 +660,7 @@ var EngineLogExporter = class {
452
660
  * Extract the current trace ID from the active span context.
453
661
  */
454
662
  function currentTraceId() {
455
- const span = __opentelemetry_api.trace.getActiveSpan();
663
+ const span = _opentelemetry_api.trace.getActiveSpan();
456
664
  if (span) {
457
665
  const spanContext = span.spanContext();
458
666
  if (spanContext.traceId && spanContext.traceId !== "00000000000000000000000000000000") return spanContext.traceId;
@@ -462,7 +670,7 @@ function currentTraceId() {
462
670
  * Extract the current span ID from the active span context.
463
671
  */
464
672
  function currentSpanId() {
465
- const span = __opentelemetry_api.trace.getActiveSpan();
673
+ const span = _opentelemetry_api.trace.getActiveSpan();
466
674
  if (span) {
467
675
  const spanContext = span.spanContext();
468
676
  if (spanContext.spanId && spanContext.spanId !== "0000000000000000") return spanContext.spanId;
@@ -473,7 +681,7 @@ function currentSpanId() {
473
681
  */
474
682
  function injectTraceparent() {
475
683
  const carrier = {};
476
- __opentelemetry_api.propagation.inject(__opentelemetry_api.context.active(), carrier);
684
+ _opentelemetry_api.propagation.inject(_opentelemetry_api.context.active(), carrier);
477
685
  return carrier.traceparent;
478
686
  }
479
687
  /**
@@ -481,14 +689,14 @@ function injectTraceparent() {
481
689
  */
482
690
  function extractTraceparent(traceparent) {
483
691
  const carrier = { traceparent };
484
- return __opentelemetry_api.propagation.extract(__opentelemetry_api.context.active(), carrier);
692
+ return _opentelemetry_api.propagation.extract(_opentelemetry_api.context.active(), carrier);
485
693
  }
486
694
  /**
487
695
  * Inject the current baggage into a W3C baggage header string.
488
696
  */
489
697
  function injectBaggage() {
490
698
  const carrier = {};
491
- __opentelemetry_api.propagation.inject(__opentelemetry_api.context.active(), carrier);
699
+ _opentelemetry_api.propagation.inject(_opentelemetry_api.context.active(), carrier);
492
700
  return carrier.baggage;
493
701
  }
494
702
  /**
@@ -496,7 +704,7 @@ function injectBaggage() {
496
704
  */
497
705
  function extractBaggage(baggage) {
498
706
  const carrier = { baggage };
499
- return __opentelemetry_api.propagation.extract(__opentelemetry_api.context.active(), carrier);
707
+ return _opentelemetry_api.propagation.extract(_opentelemetry_api.context.active(), carrier);
500
708
  }
501
709
  /**
502
710
  * Extract both trace context and baggage from their respective headers.
@@ -505,36 +713,36 @@ function extractContext(traceparent, baggage) {
505
713
  const carrier = {};
506
714
  if (traceparent) carrier.traceparent = traceparent;
507
715
  if (baggage) carrier.baggage = baggage;
508
- return __opentelemetry_api.propagation.extract(__opentelemetry_api.context.active(), carrier);
716
+ return _opentelemetry_api.propagation.extract(_opentelemetry_api.context.active(), carrier);
509
717
  }
510
718
  /**
511
719
  * Get a baggage entry from the current context.
512
720
  */
513
721
  function getBaggageEntry(key) {
514
- return __opentelemetry_api.propagation.getBaggage(__opentelemetry_api.context.active())?.getEntry(key)?.value;
722
+ return _opentelemetry_api.propagation.getBaggage(_opentelemetry_api.context.active())?.getEntry(key)?.value;
515
723
  }
516
724
  /**
517
725
  * Set a baggage entry in the current context.
518
726
  */
519
727
  function setBaggageEntry(key, value) {
520
- let bag = __opentelemetry_api.propagation.getBaggage(__opentelemetry_api.context.active()) ?? __opentelemetry_api.propagation.createBaggage();
728
+ let bag = _opentelemetry_api.propagation.getBaggage(_opentelemetry_api.context.active()) ?? _opentelemetry_api.propagation.createBaggage();
521
729
  bag = bag.setEntry(key, { value });
522
- return __opentelemetry_api.propagation.setBaggage(__opentelemetry_api.context.active(), bag);
730
+ return _opentelemetry_api.propagation.setBaggage(_opentelemetry_api.context.active(), bag);
523
731
  }
524
732
  /**
525
733
  * Remove a baggage entry from the current context.
526
734
  */
527
735
  function removeBaggageEntry(key) {
528
- const bag = __opentelemetry_api.propagation.getBaggage(__opentelemetry_api.context.active());
529
- if (!bag) return __opentelemetry_api.context.active();
736
+ const bag = _opentelemetry_api.propagation.getBaggage(_opentelemetry_api.context.active());
737
+ if (!bag) return _opentelemetry_api.context.active();
530
738
  const newBag = bag.removeEntry(key);
531
- return __opentelemetry_api.propagation.setBaggage(__opentelemetry_api.context.active(), newBag);
739
+ return _opentelemetry_api.propagation.setBaggage(_opentelemetry_api.context.active(), newBag);
532
740
  }
533
741
  /**
534
742
  * Get all baggage entries from the current context.
535
743
  */
536
744
  function getAllBaggage() {
537
- const bag = __opentelemetry_api.propagation.getBaggage(__opentelemetry_api.context.active());
745
+ const bag = _opentelemetry_api.propagation.getBaggage(_opentelemetry_api.context.active());
538
746
  if (!bag) return {};
539
747
  const entries = {};
540
748
  for (const [key, entry] of bag.getAllEntries()) entries[key] = entry.value;
@@ -565,7 +773,7 @@ let originalFetch = null;
565
773
  /**
566
774
  * Patch globalThis.fetch to create OTel CLIENT spans for every HTTP request.
567
775
  */
568
- function patchGlobalFetch(tracer$1) {
776
+ function patchGlobalFetch(tracer) {
569
777
  if (originalFetch) return;
570
778
  originalFetch = globalThis.fetch;
571
779
  const capturedFetch = originalFetch;
@@ -598,13 +806,13 @@ function patchGlobalFetch(tracer$1) {
598
806
  if (port) spanAttributes["server.port"] = port;
599
807
  if (query) spanAttributes["url.query"] = query;
600
808
  const spanName = path ? `${method} ${path}` : method;
601
- return tracer$1.startActiveSpan(spanName, {
602
- kind: __opentelemetry_api.SpanKind.CLIENT,
809
+ return tracer.startActiveSpan(spanName, {
810
+ kind: _opentelemetry_api.SpanKind.CLIENT,
603
811
  attributes: spanAttributes
604
- }, __opentelemetry_api.context.active(), async (span) => {
812
+ }, _opentelemetry_api.context.active(), async (span) => {
605
813
  try {
606
814
  const carrier = {};
607
- __opentelemetry_api.propagation.inject(__opentelemetry_api.context.active(), carrier);
815
+ _opentelemetry_api.propagation.inject(_opentelemetry_api.context.active(), carrier);
608
816
  const headers = new Headers(init?.headers ?? (input instanceof Request ? input.headers : void 0));
609
817
  for (const [key, value] of Object.entries(carrier)) headers.set(key, value);
610
818
  for (const name of SAFE_REQUEST_HEADERS) {
@@ -629,13 +837,13 @@ function patchGlobalFetch(tracer$1) {
629
837
  }
630
838
  if (response.status >= 400) {
631
839
  span.setAttribute("error.type", String(response.status));
632
- span.setStatus({ code: __opentelemetry_api.SpanStatusCode.ERROR });
633
- } else span.setStatus({ code: __opentelemetry_api.SpanStatusCode.OK });
840
+ span.setStatus({ code: _opentelemetry_api.SpanStatusCode.ERROR });
841
+ } else span.setStatus({ code: _opentelemetry_api.SpanStatusCode.OK });
634
842
  return response;
635
843
  } catch (error) {
636
844
  span.setAttribute("error.type", error.name ?? "Error");
637
845
  span.setStatus({
638
- code: __opentelemetry_api.SpanStatusCode.ERROR,
846
+ code: _opentelemetry_api.SpanStatusCode.ERROR,
639
847
  message: error.message
640
848
  });
641
849
  span.recordException(error);
@@ -705,40 +913,40 @@ function initOtel(config = {}) {
705
913
  const serviceVersion = config.serviceVersion ?? process.env.SERVICE_VERSION ?? DEFAULT_OTEL_CONFIG.serviceVersion;
706
914
  const serviceNamespace = config.serviceNamespace ?? process.env.SERVICE_NAMESPACE;
707
915
  const serviceInstanceId = config.serviceInstanceId ?? process.env.SERVICE_INSTANCE_ID ?? (0, node_crypto.randomUUID)();
708
- const engineWsUrl = config.engineWsUrl ?? process.env.III_BRIDGE_URL ?? DEFAULT_OTEL_CONFIG.engineWsUrl;
916
+ const engineWsUrl = config.engineWsUrl ?? process.env.III_URL ?? DEFAULT_OTEL_CONFIG.engineWsUrl;
709
917
  const resourceAttributes = {
710
- [__opentelemetry_semantic_conventions.ATTR_SERVICE_NAME]: serviceName,
918
+ [_opentelemetry_semantic_conventions.ATTR_SERVICE_NAME]: serviceName,
711
919
  [ATTR_SERVICE_VERSION]: serviceVersion,
712
920
  [ATTR_SERVICE_INSTANCE_ID]: serviceInstanceId
713
921
  };
714
922
  if (serviceNamespace) resourceAttributes[ATTR_SERVICE_NAMESPACE] = serviceNamespace;
715
- const resource = new __opentelemetry_resources.Resource(resourceAttributes);
923
+ const resource = new _opentelemetry_resources.Resource(resourceAttributes);
716
924
  sharedConnection = new SharedEngineConnection(engineWsUrl, config.reconnectionConfig);
717
- tracerProvider = new __opentelemetry_sdk_trace_node.NodeTracerProvider({
925
+ tracerProvider = new _opentelemetry_sdk_trace_node.NodeTracerProvider({
718
926
  resource,
719
- spanProcessors: [new __opentelemetry_sdk_trace_base.BatchSpanProcessor(new EngineSpanExporter(sharedConnection))]
927
+ spanProcessors: [new _opentelemetry_sdk_trace_base.BatchSpanProcessor(new EngineSpanExporter(sharedConnection))]
720
928
  });
721
- __opentelemetry_api.propagation.setGlobalPropagator(new __opentelemetry_core.CompositePropagator({ propagators: [new __opentelemetry_core.W3CTraceContextPropagator(), new __opentelemetry_core.W3CBaggagePropagator()] }));
929
+ _opentelemetry_api.propagation.setGlobalPropagator(new _opentelemetry_core.CompositePropagator({ propagators: [new _opentelemetry_core.W3CTraceContextPropagator(), new _opentelemetry_core.W3CBaggagePropagator()] }));
722
930
  tracerProvider.register();
723
- tracer = __opentelemetry_api.trace.getTracer(serviceName);
931
+ tracer = _opentelemetry_api.trace.getTracer(serviceName);
724
932
  console.debug(`[OTel] Traces initialized: engine=${engineWsUrl}, service=${serviceName}`);
725
933
  if (config.metricsEnabled ?? parseBoolEnv(process.env.OTEL_METRICS_ENABLED, DEFAULT_OTEL_CONFIG.metricsEnabled)) {
726
934
  const metricsExporter = new EngineMetricsExporter(sharedConnection);
727
935
  const exportIntervalMs = config.metricsExportIntervalMs ?? DEFAULT_OTEL_CONFIG.metricsExportIntervalMs;
728
- meterProvider = new __opentelemetry_sdk_metrics.MeterProvider({
936
+ meterProvider = new _opentelemetry_sdk_metrics.MeterProvider({
729
937
  resource,
730
- readers: [new __opentelemetry_sdk_metrics.PeriodicExportingMetricReader({
938
+ readers: [new _opentelemetry_sdk_metrics.PeriodicExportingMetricReader({
731
939
  exporter: metricsExporter,
732
940
  exportIntervalMillis: exportIntervalMs
733
941
  })]
734
942
  });
735
- __opentelemetry_api.metrics.setGlobalMeterProvider(meterProvider);
943
+ _opentelemetry_api.metrics.setGlobalMeterProvider(meterProvider);
736
944
  meter = meterProvider.getMeter(serviceName);
737
945
  console.debug(`[OTel] Metrics initialized: interval=${exportIntervalMs}ms`);
738
946
  }
739
947
  const instrumentations = [...config.instrumentations ?? []];
740
948
  if (instrumentations.length > 0) {
741
- (0, __opentelemetry_instrumentation.registerInstrumentations)({
949
+ (0, _opentelemetry_instrumentation.registerInstrumentations)({
742
950
  instrumentations,
743
951
  tracerProvider,
744
952
  meterProvider: meterProvider ?? void 0
@@ -752,8 +960,8 @@ function initOtel(config = {}) {
752
960
  const logExporter = new EngineLogExporter(sharedConnection);
753
961
  const logsScheduledDelayMillis = config.logsFlushIntervalMs ?? parseNumberEnv(process.env.OTEL_LOGS_FLUSH_INTERVAL_MS, 0) ?? DEFAULT_OTEL_CONFIG.logsFlushIntervalMs;
754
962
  const logsMaxExportBatchSize = config.logsBatchSize ?? parseIntegerEnv(process.env.OTEL_LOGS_BATCH_SIZE, 1) ?? DEFAULT_OTEL_CONFIG.logsBatchSize;
755
- loggerProvider = new __opentelemetry_sdk_logs.LoggerProvider({ resource });
756
- loggerProvider.addLogRecordProcessor(new __opentelemetry_sdk_logs.BatchLogRecordProcessor(logExporter, {
963
+ loggerProvider = new _opentelemetry_sdk_logs.LoggerProvider({ resource });
964
+ loggerProvider.addLogRecordProcessor(new _opentelemetry_sdk_logs.BatchLogRecordProcessor(logExporter, {
757
965
  scheduledDelayMillis: logsScheduledDelayMillis,
758
966
  maxExportBatchSize: logsMaxExportBatchSize
759
967
  }));
@@ -830,15 +1038,15 @@ async function withSpan(name, options, fn) {
830
1038
  };
831
1039
  return fn(noopSpan);
832
1040
  }
833
- const parentContext = options.traceparent ? extractTraceparent(options.traceparent) : __opentelemetry_api.context.active();
834
- return tracer.startActiveSpan(name, { kind: options.kind ?? __opentelemetry_api.SpanKind.INTERNAL }, parentContext, async (span) => {
1041
+ const parentContext = options.traceparent ? extractTraceparent(options.traceparent) : _opentelemetry_api.context.active();
1042
+ return tracer.startActiveSpan(name, { kind: options.kind ?? _opentelemetry_api.SpanKind.INTERNAL }, parentContext, async (span) => {
835
1043
  try {
836
1044
  const result = await fn(span);
837
- span.setStatus({ code: __opentelemetry_api.SpanStatusCode.OK });
1045
+ span.setStatus({ code: _opentelemetry_api.SpanStatusCode.OK });
838
1046
  return result;
839
1047
  } catch (error) {
840
1048
  span.setStatus({
841
- code: __opentelemetry_api.SpanStatusCode.ERROR,
1049
+ code: _opentelemetry_api.SpanStatusCode.ERROR,
842
1050
  message: error.message
843
1051
  });
844
1052
  span.recordException(error);
@@ -849,213 +1057,6 @@ async function withSpan(name, options, fn) {
849
1057
  });
850
1058
  }
851
1059
 
852
- //#endregion
853
- //#region src/worker-metrics.ts
854
- /**
855
- * Worker metrics collection for the III Node SDK.
856
- *
857
- * Collects CPU, memory, and event loop metrics for worker health monitoring.
858
- * Uses the Node.js built-in `monitorEventLoopDelay` API for accurate
859
- * event loop lag measurements.
860
- */
861
- /**
862
- * Collects worker resource metrics including CPU, memory, and event loop lag.
863
- *
864
- * Uses the Node.js `monitorEventLoopDelay` API for high-precision event loop
865
- * delay measurements instead of manual `setImmediate` timing.
866
- *
867
- * @example
868
- * ```typescript
869
- * const collector = new WorkerMetricsCollector()
870
- *
871
- * // Collect metrics periodically
872
- * setInterval(() => {
873
- * const metrics = collector.collect()
874
- * console.log('CPU:', metrics.cpu_percent, '%')
875
- * console.log('Event Loop Lag:', metrics.event_loop_lag_ms, 'ms')
876
- * }, 5000)
877
- *
878
- * // Clean up when done
879
- * collector.stopMonitoring()
880
- * ```
881
- */
882
- var WorkerMetricsCollector = class {
883
- /**
884
- * Creates a new WorkerMetricsCollector instance.
885
- *
886
- * @param options - Configuration options
887
- */
888
- constructor(options = {}) {
889
- this.eventLoopHistogram = null;
890
- this.startTime = Date.now();
891
- this.lastCpuUsage = process.cpuUsage();
892
- this.lastCpuTime = node_perf_hooks.performance.now();
893
- this.startEventLoopMonitoring(options.eventLoopResolutionMs ?? 20);
894
- }
895
- /**
896
- * Starts the event loop delay histogram monitoring.
897
- *
898
- * @param resolutionMs - Histogram resolution in milliseconds
899
- */
900
- startEventLoopMonitoring(resolutionMs) {
901
- this.eventLoopHistogram = (0, node_perf_hooks.monitorEventLoopDelay)({ resolution: Number.isFinite(resolutionMs) && resolutionMs > 0 ? Math.max(1, Math.floor(resolutionMs)) : 20 });
902
- this.eventLoopHistogram.enable();
903
- }
904
- /**
905
- * Stops the event loop monitoring and releases resources.
906
- * Should be called when the collector is no longer needed.
907
- */
908
- stopMonitoring() {
909
- if (this.eventLoopHistogram) {
910
- this.eventLoopHistogram.disable();
911
- this.eventLoopHistogram = null;
912
- }
913
- }
914
- /**
915
- * Collects current worker metrics.
916
- *
917
- * This method calculates CPU usage since the last collection,
918
- * reads memory usage, and gets event loop delay statistics.
919
- * The event loop histogram is reset after each collection for
920
- * accurate per-interval measurements.
921
- *
922
- * @returns Current worker metrics snapshot
923
- */
924
- collect() {
925
- const memoryUsage = process.memoryUsage();
926
- const cpuUsage = process.cpuUsage();
927
- const now = node_perf_hooks.performance.now();
928
- const cpuDelta = {
929
- user: cpuUsage.user - this.lastCpuUsage.user,
930
- system: cpuUsage.system - this.lastCpuUsage.system
931
- };
932
- const timeDelta = (now - this.lastCpuTime) * 1e3;
933
- const cpuPercent = timeDelta > 0 ? (cpuDelta.user + cpuDelta.system) / timeDelta * 100 : 0;
934
- this.lastCpuUsage = cpuUsage;
935
- this.lastCpuTime = now;
936
- let eventLoopLagMs = 0;
937
- if (this.eventLoopHistogram) {
938
- eventLoopLagMs = this.eventLoopHistogram.mean / 1e6;
939
- this.eventLoopHistogram.reset();
940
- }
941
- return {
942
- memory_heap_used: memoryUsage.heapUsed,
943
- memory_heap_total: memoryUsage.heapTotal,
944
- memory_rss: memoryUsage.rss,
945
- memory_external: memoryUsage.external,
946
- cpu_user_micros: cpuUsage.user,
947
- cpu_system_micros: cpuUsage.system,
948
- cpu_percent: Math.min(cpuPercent, 100),
949
- event_loop_lag_ms: eventLoopLagMs,
950
- uptime_seconds: Math.floor((Date.now() - this.startTime) / 1e3),
951
- timestamp_ms: Date.now(),
952
- runtime: "node"
953
- };
954
- }
955
- };
956
-
957
- //#endregion
958
- //#region src/otel-worker-gauges.ts
959
- let registeredGauges = false;
960
- let metricsCollector = null;
961
- let registeredMeter = null;
962
- let registeredBatchCallback = null;
963
- let registeredObservables = [];
964
- function registerWorkerGauges(meter$1, options) {
965
- if (registeredGauges) return;
966
- const { workerId, workerName } = options;
967
- const baseAttributes = {
968
- "worker.id": workerId,
969
- ...workerName && { "worker.name": workerName }
970
- };
971
- metricsCollector = new WorkerMetricsCollector();
972
- const memoryHeapUsed = meter$1.createObservableGauge("iii.worker.memory.heap_used", {
973
- description: "Worker heap memory used in bytes",
974
- unit: "bytes"
975
- });
976
- const memoryHeapTotal = meter$1.createObservableGauge("iii.worker.memory.heap_total", {
977
- description: "Worker total heap memory in bytes",
978
- unit: "bytes"
979
- });
980
- const memoryRss = meter$1.createObservableGauge("iii.worker.memory.rss", {
981
- description: "Worker resident set size in bytes",
982
- unit: "bytes"
983
- });
984
- const memoryExternal = meter$1.createObservableGauge("iii.worker.memory.external", {
985
- description: "Worker external memory in bytes",
986
- unit: "bytes"
987
- });
988
- const cpuPercent = meter$1.createObservableGauge("iii.worker.cpu.percent", {
989
- description: "Worker CPU usage percentage",
990
- unit: "%"
991
- });
992
- const cpuUserMicros = meter$1.createObservableGauge("iii.worker.cpu.user_micros", {
993
- description: "Worker CPU user time in microseconds",
994
- unit: "us"
995
- });
996
- const cpuSystemMicros = meter$1.createObservableGauge("iii.worker.cpu.system_micros", {
997
- description: "Worker CPU system time in microseconds",
998
- unit: "us"
999
- });
1000
- const eventLoopLag = meter$1.createObservableGauge("iii.worker.event_loop.lag_ms", {
1001
- description: "Worker event loop lag in milliseconds",
1002
- unit: "ms"
1003
- });
1004
- const uptimeSeconds = meter$1.createObservableGauge("iii.worker.uptime_seconds", {
1005
- description: "Worker uptime in seconds",
1006
- unit: "s"
1007
- });
1008
- const batchCallback = (observableResult) => {
1009
- if (!metricsCollector) return;
1010
- const metrics$1 = metricsCollector.collect();
1011
- if (metrics$1.memory_heap_used !== void 0) observableResult.observe(memoryHeapUsed, metrics$1.memory_heap_used, baseAttributes);
1012
- if (metrics$1.memory_heap_total !== void 0) observableResult.observe(memoryHeapTotal, metrics$1.memory_heap_total, baseAttributes);
1013
- if (metrics$1.memory_rss !== void 0) observableResult.observe(memoryRss, metrics$1.memory_rss, baseAttributes);
1014
- if (metrics$1.memory_external !== void 0) observableResult.observe(memoryExternal, metrics$1.memory_external, baseAttributes);
1015
- if (metrics$1.cpu_percent !== void 0) observableResult.observe(cpuPercent, metrics$1.cpu_percent, baseAttributes);
1016
- if (metrics$1.cpu_user_micros !== void 0) observableResult.observe(cpuUserMicros, metrics$1.cpu_user_micros, baseAttributes);
1017
- if (metrics$1.cpu_system_micros !== void 0) observableResult.observe(cpuSystemMicros, metrics$1.cpu_system_micros, baseAttributes);
1018
- if (metrics$1.event_loop_lag_ms !== void 0) observableResult.observe(eventLoopLag, metrics$1.event_loop_lag_ms, baseAttributes);
1019
- if (metrics$1.uptime_seconds !== void 0) observableResult.observe(uptimeSeconds, metrics$1.uptime_seconds, baseAttributes);
1020
- };
1021
- meter$1.addBatchObservableCallback(batchCallback, [
1022
- memoryHeapUsed,
1023
- memoryHeapTotal,
1024
- memoryRss,
1025
- memoryExternal,
1026
- cpuPercent,
1027
- cpuUserMicros,
1028
- cpuSystemMicros,
1029
- eventLoopLag,
1030
- uptimeSeconds
1031
- ]);
1032
- registeredMeter = meter$1;
1033
- registeredBatchCallback = batchCallback;
1034
- registeredObservables = [
1035
- memoryHeapUsed,
1036
- memoryHeapTotal,
1037
- memoryRss,
1038
- memoryExternal,
1039
- cpuPercent,
1040
- cpuUserMicros,
1041
- cpuSystemMicros,
1042
- eventLoopLag,
1043
- uptimeSeconds
1044
- ];
1045
- registeredGauges = true;
1046
- }
1047
- function stopWorkerGauges() {
1048
- if (registeredMeter && registeredBatchCallback) registeredMeter.removeBatchObservableCallback(registeredBatchCallback, registeredObservables);
1049
- if (metricsCollector) {
1050
- metricsCollector.stopMonitoring();
1051
- metricsCollector = null;
1052
- }
1053
- registeredMeter = null;
1054
- registeredBatchCallback = null;
1055
- registeredObservables = [];
1056
- registeredGauges = false;
1057
- }
1058
-
1059
1060
  //#endregion
1060
1061
  //#region src/utils.ts
1061
1062
  /**
@@ -1077,6 +1078,28 @@ function safeStringify(value) {
1077
1078
  return "[unserializable]";
1078
1079
  }
1079
1080
  }
1081
+ /**
1082
+ * Helper that wraps an HTTP-style handler (with separate `req`/`res` arguments)
1083
+ * into the function handler format expected by the SDK.
1084
+ *
1085
+ * @param callback - Async handler receiving an {@link HttpRequest} and {@link HttpResponse}.
1086
+ * @returns A function handler compatible with {@link ISdk.registerFunction}.
1087
+ *
1088
+ * @example
1089
+ * ```typescript
1090
+ * import { http } from 'iii-sdk'
1091
+ *
1092
+ * iii.registerFunction(
1093
+ * { id: 'my-api' },
1094
+ * http(async (req, res) => {
1095
+ * res.status(200)
1096
+ * res.headers({ 'content-type': 'application/json' })
1097
+ * res.stream.end(JSON.stringify({ hello: 'world' }))
1098
+ * res.close()
1099
+ * }),
1100
+ * )
1101
+ * ```
1102
+ */
1080
1103
  const http = (callback) => {
1081
1104
  return async (req) => {
1082
1105
  const { response, ...request } = req;
@@ -1094,6 +1117,12 @@ const http = (callback) => {
1094
1117
  });
1095
1118
  };
1096
1119
  };
1120
+ /**
1121
+ * Type guard that checks if a value is a {@link StreamChannelRef}.
1122
+ *
1123
+ * @param value - Value to check.
1124
+ * @returns `true` if the value is a valid `StreamChannelRef`.
1125
+ */
1097
1126
  const isChannelRef = (value) => {
1098
1127
  if (typeof value !== "object" || value === null) return false;
1099
1128
  const maybe = value;
@@ -1269,4 +1298,4 @@ Object.defineProperty(exports, 'withSpan', {
1269
1298
  return withSpan;
1270
1299
  }
1271
1300
  });
1272
- //# sourceMappingURL=utils-BJTjoUdq.cjs.map
1301
+ //# sourceMappingURL=utils-C6yTT4Js.cjs.map