autotel 2.25.3 → 2.25.5

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 (68) hide show
  1. package/dist/{chunk-FXKB7EPR.cjs → chunk-A5ZUL2RZ.cjs} +5 -5
  2. package/dist/{chunk-FXKB7EPR.cjs.map → chunk-A5ZUL2RZ.cjs.map} +1 -1
  3. package/dist/{chunk-SR35DG5A.js → chunk-BBBWDIYQ.js} +27 -13
  4. package/dist/chunk-BBBWDIYQ.js.map +1 -0
  5. package/dist/{chunk-3ZLYWPMY.js → chunk-CMUM4JQI.js} +3 -3
  6. package/dist/{chunk-3ZLYWPMY.js.map → chunk-CMUM4JQI.js.map} +1 -1
  7. package/dist/{chunk-AQXPGGQK.cjs → chunk-EEJGUBWV.cjs} +5 -5
  8. package/dist/{chunk-AQXPGGQK.cjs.map → chunk-EEJGUBWV.cjs.map} +1 -1
  9. package/dist/{chunk-W4EUTSB2.cjs → chunk-HZ3FYBJG.cjs} +27 -12
  10. package/dist/chunk-HZ3FYBJG.cjs.map +1 -0
  11. package/dist/{chunk-WOWTZ4EB.cjs → chunk-I6JPSD4R.cjs} +5 -5
  12. package/dist/{chunk-WOWTZ4EB.cjs.map → chunk-I6JPSD4R.cjs.map} +1 -1
  13. package/dist/{chunk-XRKAL7WJ.cjs → chunk-JSNUWSBH.cjs} +6 -6
  14. package/dist/chunk-JSNUWSBH.cjs.map +1 -0
  15. package/dist/{chunk-OWXXS4JB.cjs → chunk-MN6PZ4AN.cjs} +7 -7
  16. package/dist/{chunk-OWXXS4JB.cjs.map → chunk-MN6PZ4AN.cjs.map} +1 -1
  17. package/dist/{chunk-JM63D22M.js → chunk-OPTGXEVN.js} +368 -349
  18. package/dist/chunk-OPTGXEVN.js.map +1 -0
  19. package/dist/{chunk-PKXD2RMI.js → chunk-QDREXAD7.js} +3 -3
  20. package/dist/{chunk-PKXD2RMI.js.map → chunk-QDREXAD7.js.map} +1 -1
  21. package/dist/{chunk-RMGSBMQF.cjs → chunk-QQLP4M6W.cjs} +372 -353
  22. package/dist/chunk-QQLP4M6W.cjs.map +1 -0
  23. package/dist/{chunk-USSL3D6L.js → chunk-S4OFEXLA.js} +6 -6
  24. package/dist/chunk-S4OFEXLA.js.map +1 -0
  25. package/dist/{chunk-VVYSQXQL.js → chunk-WYP6OOCT.js} +3 -3
  26. package/dist/{chunk-VVYSQXQL.js.map → chunk-WYP6OOCT.js.map} +1 -1
  27. package/dist/{chunk-IFKDBL65.js → chunk-XB2GITM5.js} +3 -3
  28. package/dist/{chunk-IFKDBL65.js.map → chunk-XB2GITM5.js.map} +1 -1
  29. package/dist/correlation-id.cjs +10 -9
  30. package/dist/correlation-id.d.cts +4 -1
  31. package/dist/correlation-id.d.ts +4 -1
  32. package/dist/correlation-id.js +2 -1
  33. package/dist/decorators.cjs +4 -4
  34. package/dist/decorators.js +3 -3
  35. package/dist/event.cjs +6 -5
  36. package/dist/event.js +3 -2
  37. package/dist/functional.cjs +10 -10
  38. package/dist/functional.js +3 -3
  39. package/dist/http.cjs +2 -2
  40. package/dist/http.js +1 -1
  41. package/dist/index.cjs +45 -45
  42. package/dist/index.js +10 -10
  43. package/dist/messaging.cjs +7 -7
  44. package/dist/messaging.js +4 -4
  45. package/dist/semantic-helpers.cjs +8 -8
  46. package/dist/semantic-helpers.js +4 -4
  47. package/dist/test-span-collector.cjs.map +1 -1
  48. package/dist/test-span-collector.d.cts +5 -2
  49. package/dist/test-span-collector.d.ts +5 -2
  50. package/dist/test-span-collector.js.map +1 -1
  51. package/dist/webhook.cjs +4 -4
  52. package/dist/webhook.js +3 -3
  53. package/dist/workflow-distributed.cjs +5 -5
  54. package/dist/workflow-distributed.js +3 -3
  55. package/dist/workflow.cjs +8 -8
  56. package/dist/workflow.js +4 -4
  57. package/package.json +1 -1
  58. package/src/correlation-id.ts +10 -5
  59. package/src/functional.ts +440 -420
  60. package/src/test-span-collector.ts +5 -2
  61. package/src/trace-context.test.ts +73 -0
  62. package/src/trace-context.ts +44 -12
  63. package/dist/chunk-JM63D22M.js.map +0 -1
  64. package/dist/chunk-RMGSBMQF.cjs.map +0 -1
  65. package/dist/chunk-SR35DG5A.js.map +0 -1
  66. package/dist/chunk-USSL3D6L.js.map +0 -1
  67. package/dist/chunk-W4EUTSB2.cjs.map +0 -1
  68. package/dist/chunk-XRKAL7WJ.cjs.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/test-span-collector.ts"],"names":[],"mappings":";;;AAwBA,IAAM,gBAAA,GAAmB,EAAE,OAAA,EAAS,CAAa,CAAA;AA0B1C,IAAM,oBAAN,MAAgD;AAAA,EAC7C,MAAA,uBAAa,GAAA,EAA4B;AAAA,EAEjD,MAAA,CACE,OACA,QAAA,EACM;AACN,IAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,MAAA,MAAM,OAAA,GAAU,IAAA,CAAK,WAAA,EAAY,CAAE,OAAA;AACnC,MAAA,IAAI,IAAA,GAAO,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,OAAO,CAAA;AAClC,MAAA,IAAI,CAAC,IAAA,EAAM;AACT,QAAA,IAAA,GAAO,EAAC;AACR,QAAA,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,OAAA,EAAS,IAAI,CAAA;AAAA,MAC/B;AACA,MAAA,IAAA,CAAK,KAAK,IAAI,CAAA;AAAA,IAChB;AACA,IAAA,QAAA,CAAS,EAAE,IAAA,EAAM,gBAAA,CAAiB,OAAA,EAAS,CAAA;AAAA,EAC7C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,UAAA,CAAW,SAAiB,UAAA,EAAsC;AAChE,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,OAAO,CAAA;AACxC,IAAA,IAAA,CAAK,MAAA,CAAO,OAAO,OAAO,CAAA;AAC1B,IAAA,IAAI,CAAC,QAAA,EAAU,MAAA,EAAQ,OAAO,EAAC;AAG/B,IAAA,MAAM,IAAA,uBAAW,GAAA,EAA0B;AAC3C,IAAA,KAAA,MAAW,CAAA,IAAK,UAAU,IAAA,CAAK,GAAA,CAAI,EAAE,WAAA,EAAY,CAAE,QAAQ,CAAC,CAAA;AAG5D,IAAA,MAAM,QAAA,GAAW,QAAA,CAAS,MAAA,CAAO,CAAC,CAAA,KAAM;AACtC,MAAA,IAAI,EAAA,GAAyB,CAAA,CAAE,WAAA,EAAY,CAAE,MAAA;AAC7C,MAAA,OAAO,EAAA,EAAI;AACT,QAAA,IAAI,EAAA,KAAO,YAAY,OAAO,IAAA;AAC9B,QAAA,MAAM,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,EAAE,CAAA;AAC1B,QAAA,MAAM,QAAA,GAAW,MAAA,EAAQ,iBAAA,EAAmB,MAAA,IAAU,MAAA;AACtD,QAAA,IAAI,aAAa,EAAA,EAAI;AACrB,QAAA,EAAA,GAAK,QAAA;AAAA,MACP;AACA,MAAA,OAAO,KAAA;AAAA,IACT,CAAC,CAAA;AAED,IAAA,OAAO,SAAS,GAAA,CAAI,CAAC,CAAA,KAAM,aAAA,CAAc,CAAC,CAAC,CAAA;AAAA,EAC7C;AAAA,EAEA,QAAA,GAA0B;AACxB,IAAA,IAAA,CAAK,OAAO,KAAA,EAAM;AAClB,IAAA,OAAO,QAAQ,OAAA,EAAQ;AAAA,EACzB;AAAA,EAEA,UAAA,GAA4B;AAC1B,IAAA,OAAO,QAAQ,OAAA,EAAQ;AAAA,EACzB;AACF;AAEA,SAAS,WAAW,EAAA,EAA8B;AAChD,EAAA,OAAO,GAAG,CAAC,CAAA,GAAI,GAAA,GAAO,EAAA,CAAG,CAAC,CAAA,GAAI,GAAA;AAChC;AAEA,SAAS,eAAe,CAAA,EAAoC;AAC1D,EAAA,IAAI,OAAO,CAAA,KAAM,QAAA,IAAY,OAAO,CAAA,KAAM,QAAA,IAAY,OAAO,CAAA,KAAM,SAAA;AACjE,IAAA,OAAO,IAAA;AACT,EAAA,IAAI,MAAM,OAAA,CAAQ,CAAC,CAAA,IAAK,CAAA,CAAE,SAAS,CAAA,EAAG;AACpC,IAAA,MAAM,CAAA,GAAI,OAAO,CAAA,CAAE,CAAC,CAAA;AACpB,IAAA,OAAA,CACG,CAAA,KAAM,QAAA,IAAY,CAAA,KAAM,QAAA,IAAY,CAAA,KAAM,SAAA,KAC3C,CAAA,CAAE,KAAA,CAAM,CAAC,CAAA,KAAM,OAAO,CAAA,KAAM,CAAC,CAAA;AAAA,EAEjC;AACA,EAAA,OAAO,KAAA;AACT;AAEO,SAAS,cAAc,IAAA,EAAoC;AAChE,EAAA,MAAM,QAA2C,EAAC;AAClD,EAAA,KAAA,MAAW,CAAC,GAAG,CAAC,CAAA,IAAK,OAAO,OAAA,CAAQ,IAAA,CAAK,UAAU,CAAA,EAAG;AACpD,IAAA,IAAI,cAAA,CAAe,CAAC,CAAA,EAAG,KAAA,CAAM,CAAC,CAAA,GAAI,CAAA;AAAA,EACpC;AACA,EAAA,OAAO;AAAA,IACL,MAAA,EAAQ,IAAA,CAAK,WAAA,EAAY,CAAE,MAAA;AAAA,IAC3B,YAAA,EAAc,IAAA,CAAK,iBAAA,EAAmB,MAAA,IAAU,MAAA;AAAA,IAChD,MAAM,IAAA,CAAK,IAAA;AAAA,IACX,WAAA,EAAa,UAAA,CAAW,IAAA,CAAK,SAA6B,CAAA;AAAA,IAC1D,UAAA,EAAY,UAAA,CAAW,IAAA,CAAK,QAA4B,CAAA;AAAA,IACxD,MAAA,EACE,IAAA,CAAK,MAAA,CAAO,IAAA,KAAS,cAAA,CAAe,KAAA,GAChC,OAAA,GACA,IAAA,CAAK,MAAA,CAAO,IAAA,KAAS,cAAA,CAAe,EAAA,GAClC,IAAA,GACA,OAAA;AAAA,IACR,aAAA,EAAe,IAAA,CAAK,MAAA,CAAO,OAAA,IAAW,MAAA;AAAA,IACtC,YAAY,MAAA,CAAO,IAAA,CAAK,KAAK,CAAA,CAAE,MAAA,GAAS,IAAI,KAAA,GAAQ;AAAA,GACtD;AACF","file":"test-span-collector.js","sourcesContent":["/**\n * TestSpanCollector — SpanExporter that groups finished spans by traceId\n * and drains per-trace for embedding in test metadata.\n *\n * @example\n * ```typescript\n * import { TestSpanCollector } from 'autotel/test-span-collector';\n * import { SimpleSpanProcessor } from 'autotel/processors';\n * import { getAutotelTracerProvider } from 'autotel';\n *\n * const collector = new TestSpanCollector();\n * const provider = getAutotelTracerProvider();\n * provider.addSpanProcessor(new SimpleSpanProcessor(collector));\n *\n * // After a test span ends:\n * const spans = collector.drainTrace(traceId, rootSpanId);\n * // spans contains only descendants of rootSpanId\n * ```\n */\n\nimport type { SpanExporter, ReadableSpan } from '@opentelemetry/sdk-trace-base';\nimport { SpanStatusCode } from '@opentelemetry/api';\n\n/** @see ExportResultCode from @opentelemetry/core */\nconst ExportResultCode = { SUCCESS: 0, FAILED: 1 } as const;\n\n/** Attribute value types that survive serialization */\ntype SerializableValue =\n | string\n | number\n | boolean\n | string[]\n | number[]\n | boolean[];\n\n/**\n * Portable serialized span for embedding in test metadata.\n * `startTimeMs` is derived from OTel HrTime — epoch-based wall-clock ms in the current SDK.\n */\nexport interface SerializedSpan {\n spanId: string;\n parentSpanId?: string;\n name: string;\n startTimeMs: number;\n durationMs: number;\n status: 'ok' | 'error' | 'unset';\n statusMessage?: string;\n attributes?: Record<string, SerializableValue>;\n}\n\nexport class TestSpanCollector implements SpanExporter {\n private traces = new Map<string, ReadableSpan[]>();\n\n export(\n spans: ReadableSpan[],\n callback: (result: { code: number }) => void,\n ): void {\n for (const span of spans) {\n const traceId = span.spanContext().traceId;\n let list = this.traces.get(traceId);\n if (!list) {\n list = [];\n this.traces.set(traceId, list);\n }\n list.push(span);\n }\n callback({ code: ExportResultCode.SUCCESS });\n }\n\n /**\n * Drain and serialize spans that are descendants of `rootSpanId` within `traceId`.\n * Filters to the subtree rooted at the test span to prevent cross-test mixing.\n * Removes the entire traceId entry from the collector.\n */\n drainTrace(traceId: string, rootSpanId: string): SerializedSpan[] {\n const allSpans = this.traces.get(traceId);\n this.traces.delete(traceId);\n if (!allSpans?.length) return [];\n\n // Build spanId → span index for efficient parent-chain walking\n const byId = new Map<string, ReadableSpan>();\n for (const s of allSpans) byId.set(s.spanContext().spanId, s);\n\n // Filter to spans that are the root or descendants of rootSpanId\n const included = allSpans.filter((s) => {\n let id: string | undefined = s.spanContext().spanId;\n while (id) {\n if (id === rootSpanId) return true;\n const parent = byId.get(id);\n const parentId = parent?.parentSpanContext?.spanId || undefined;\n if (parentId === id) break; // cycle guard\n id = parentId;\n }\n return false;\n });\n\n return included.map((s) => serializeSpan(s));\n }\n\n shutdown(): Promise<void> {\n this.traces.clear();\n return Promise.resolve();\n }\n\n forceFlush(): Promise<void> {\n return Promise.resolve();\n }\n}\n\nfunction hrTimeToMs(hr: [number, number]): number {\n return hr[0] * 1000 + hr[1] / 1_000_000;\n}\n\nfunction isSerializable(v: unknown): v is SerializableValue {\n if (typeof v === 'string' || typeof v === 'number' || typeof v === 'boolean')\n return true;\n if (Array.isArray(v) && v.length > 0) {\n const t = typeof v[0];\n return (\n (t === 'string' || t === 'number' || t === 'boolean') &&\n v.every((e) => typeof e === t)\n );\n }\n return false;\n}\n\nexport function serializeSpan(span: ReadableSpan): SerializedSpan {\n const attrs: Record<string, SerializableValue> = {};\n for (const [k, v] of Object.entries(span.attributes)) {\n if (isSerializable(v)) attrs[k] = v;\n }\n return {\n spanId: span.spanContext().spanId,\n parentSpanId: span.parentSpanContext?.spanId || undefined,\n name: span.name,\n startTimeMs: hrTimeToMs(span.startTime as [number, number]),\n durationMs: hrTimeToMs(span.duration as [number, number]),\n status:\n span.status.code === SpanStatusCode.ERROR\n ? 'error'\n : span.status.code === SpanStatusCode.OK\n ? 'ok'\n : 'unset',\n statusMessage: span.status.message || undefined,\n attributes: Object.keys(attrs).length > 0 ? attrs : undefined,\n };\n}\n"]}
1
+ {"version":3,"sources":["../src/test-span-collector.ts"],"names":[],"mappings":"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","file":"test-span-collector.js","sourcesContent":["/**\n * TestSpanCollector — SpanExporter that groups finished spans by traceId\n * and drains per-trace for embedding in test metadata.\n *\n * @example\n * ```typescript\n * import { TestSpanCollector } from 'autotel/test-span-collector';\n * import { SimpleSpanProcessor } from 'autotel/processors';\n * import { getAutotelTracerProvider } from 'autotel';\n *\n * const collector = new TestSpanCollector();\n * const provider = getAutotelTracerProvider();\n * provider.addSpanProcessor(new SimpleSpanProcessor(collector));\n *\n * // After a test span ends:\n * const spans = collector.drainTrace(traceId, rootSpanId);\n * // spans contains only descendants of rootSpanId\n * ```\n */\n\nimport type { SpanExporter, ReadableSpan } from '@opentelemetry/sdk-trace-base';\nimport { SpanStatusCode } from '@opentelemetry/api';\n\n/** @see ExportResultCode from @opentelemetry/core */\nconst ExportResultCode = { SUCCESS: 0, FAILED: 1 } as const;\n\n/** Attribute value types that survive serialization */\ntype SerializableValue =\n | string\n | number\n | boolean\n | string[]\n | number[]\n | boolean[];\n\n/**\n * Portable serialized span for embedding in test metadata.\n * `startTimeMs` is derived from OTel HrTime — epoch-based wall-clock ms in the current SDK.\n *\n * Defined as a `type` (not `interface`) so it is assignable to\n * `Record<string, unknown>` in TypeScript 6+ strict mode.\n */\nexport type SerializedSpan = {\n spanId: string;\n parentSpanId?: string;\n name: string;\n startTimeMs: number;\n durationMs: number;\n status: 'ok' | 'error' | 'unset';\n statusMessage?: string;\n attributes?: Record<string, SerializableValue>;\n};\n\nexport class TestSpanCollector implements SpanExporter {\n private traces = new Map<string, ReadableSpan[]>();\n\n export(\n spans: ReadableSpan[],\n callback: (result: { code: number }) => void,\n ): void {\n for (const span of spans) {\n const traceId = span.spanContext().traceId;\n let list = this.traces.get(traceId);\n if (!list) {\n list = [];\n this.traces.set(traceId, list);\n }\n list.push(span);\n }\n callback({ code: ExportResultCode.SUCCESS });\n }\n\n /**\n * Drain and serialize spans that are descendants of `rootSpanId` within `traceId`.\n * Filters to the subtree rooted at the test span to prevent cross-test mixing.\n * Removes the entire traceId entry from the collector.\n */\n drainTrace(traceId: string, rootSpanId: string): SerializedSpan[] {\n const allSpans = this.traces.get(traceId);\n this.traces.delete(traceId);\n if (!allSpans?.length) return [];\n\n // Build spanId → span index for efficient parent-chain walking\n const byId = new Map<string, ReadableSpan>();\n for (const s of allSpans) byId.set(s.spanContext().spanId, s);\n\n // Filter to spans that are the root or descendants of rootSpanId\n const included = allSpans.filter((s) => {\n let id: string | undefined = s.spanContext().spanId;\n while (id) {\n if (id === rootSpanId) return true;\n const parent = byId.get(id);\n const parentId = parent?.parentSpanContext?.spanId || undefined;\n if (parentId === id) break; // cycle guard\n id = parentId;\n }\n return false;\n });\n\n return included.map((s) => serializeSpan(s));\n }\n\n shutdown(): Promise<void> {\n this.traces.clear();\n return Promise.resolve();\n }\n\n forceFlush(): Promise<void> {\n return Promise.resolve();\n }\n}\n\nfunction hrTimeToMs(hr: [number, number]): number {\n return hr[0] * 1000 + hr[1] / 1_000_000;\n}\n\nfunction isSerializable(v: unknown): v is SerializableValue {\n if (typeof v === 'string' || typeof v === 'number' || typeof v === 'boolean')\n return true;\n if (Array.isArray(v) && v.length > 0) {\n const t = typeof v[0];\n return (\n (t === 'string' || t === 'number' || t === 'boolean') &&\n v.every((e) => typeof e === t)\n );\n }\n return false;\n}\n\nexport function serializeSpan(span: ReadableSpan): SerializedSpan {\n const attrs: Record<string, SerializableValue> = {};\n for (const [k, v] of Object.entries(span.attributes)) {\n if (isSerializable(v)) attrs[k] = v;\n }\n return {\n spanId: span.spanContext().spanId,\n parentSpanId: span.parentSpanContext?.spanId || undefined,\n name: span.name,\n startTimeMs: hrTimeToMs(span.startTime as [number, number]),\n durationMs: hrTimeToMs(span.duration as [number, number]),\n status:\n span.status.code === SpanStatusCode.ERROR\n ? 'error'\n : span.status.code === SpanStatusCode.OK\n ? 'ok'\n : 'unset',\n statusMessage: span.status.message || undefined,\n attributes: Object.keys(attrs).length > 0 ? attrs : undefined,\n };\n}\n"]}
package/dist/webhook.cjs CHANGED
@@ -1,10 +1,10 @@
1
1
  'use strict';
2
2
 
3
- var chunkRMGSBMQF_cjs = require('./chunk-RMGSBMQF.cjs');
4
- require('./chunk-W4EUTSB2.cjs');
3
+ var chunkQQLP4M6W_cjs = require('./chunk-QQLP4M6W.cjs');
5
4
  require('./chunk-GML3FBOT.cjs');
6
5
  require('./chunk-D5LMF53P.cjs');
7
- require('./chunk-XRKAL7WJ.cjs');
6
+ require('./chunk-JSNUWSBH.cjs');
7
+ require('./chunk-HZ3FYBJG.cjs');
8
8
  require('./chunk-ITYASFHQ.cjs');
9
9
  require('./chunk-OFPZULMQ.cjs');
10
10
  require('./chunk-KZEC4CHV.cjs');
@@ -148,7 +148,7 @@ function createParkingLot(config) {
148
148
  },
149
149
  traceCallback(callbackConfig) {
150
150
  return (fnFactory) => {
151
- return chunkRMGSBMQF_cjs.trace(
151
+ return chunkQQLP4M6W_cjs.trace(
152
152
  {
153
153
  name: callbackConfig.name,
154
154
  spanKind: api.SpanKind.SERVER
package/dist/webhook.js CHANGED
@@ -1,8 +1,8 @@
1
- import { trace } from './chunk-JM63D22M.js';
2
- import './chunk-SR35DG5A.js';
1
+ import { trace } from './chunk-OPTGXEVN.js';
3
2
  import './chunk-B3ZHLLMP.js';
4
3
  import './chunk-WD4RP6IV.js';
5
- import './chunk-USSL3D6L.js';
4
+ import './chunk-S4OFEXLA.js';
5
+ import './chunk-BBBWDIYQ.js';
6
6
  import './chunk-MNBAXRVG.js';
7
7
  import './chunk-RUD7KS4R.js';
8
8
  import './chunk-XDKK53OL.js';
@@ -1,11 +1,11 @@
1
1
  'use strict';
2
2
 
3
3
  var chunkINJD3G4K_cjs = require('./chunk-INJD3G4K.cjs');
4
- var chunkRMGSBMQF_cjs = require('./chunk-RMGSBMQF.cjs');
5
- require('./chunk-W4EUTSB2.cjs');
4
+ var chunkQQLP4M6W_cjs = require('./chunk-QQLP4M6W.cjs');
6
5
  require('./chunk-GML3FBOT.cjs');
7
6
  require('./chunk-D5LMF53P.cjs');
8
- require('./chunk-XRKAL7WJ.cjs');
7
+ require('./chunk-JSNUWSBH.cjs');
8
+ require('./chunk-HZ3FYBJG.cjs');
9
9
  require('./chunk-ITYASFHQ.cjs');
10
10
  require('./chunk-OFPZULMQ.cjs');
11
11
  require('./chunk-KZEC4CHV.cjs');
@@ -59,7 +59,7 @@ var WorkflowBaggage = chunkINJD3G4K_cjs.createSafeBaggageSchema(workflowBaggageF
59
59
  function traceDistributedWorkflow(config) {
60
60
  const spanName = `workflow.${config.name}`;
61
61
  return (fnFactory) => {
62
- return chunkRMGSBMQF_cjs.trace(
62
+ return chunkQQLP4M6W_cjs.trace(
63
63
  { name: spanName, spanKind: api.SpanKind.INTERNAL },
64
64
  (baseCtx) => {
65
65
  return async (...args) => {
@@ -158,7 +158,7 @@ function traceDistributedWorkflow(config) {
158
158
  function traceDistributedStep(config) {
159
159
  const spanName = `workflow.step.${config.name}`;
160
160
  return (fnFactory) => {
161
- return chunkRMGSBMQF_cjs.trace(
161
+ return chunkQQLP4M6W_cjs.trace(
162
162
  { name: spanName, spanKind: api.SpanKind.INTERNAL },
163
163
  (baseCtx) => {
164
164
  return async (...args) => {
@@ -1,9 +1,9 @@
1
1
  import { createSafeBaggageSchema } from './chunk-4IFSYQVX.js';
2
- import { trace } from './chunk-JM63D22M.js';
3
- import './chunk-SR35DG5A.js';
2
+ import { trace } from './chunk-OPTGXEVN.js';
4
3
  import './chunk-B3ZHLLMP.js';
5
4
  import './chunk-WD4RP6IV.js';
6
- import './chunk-USSL3D6L.js';
5
+ import './chunk-S4OFEXLA.js';
6
+ import './chunk-BBBWDIYQ.js';
7
7
  import './chunk-MNBAXRVG.js';
8
8
  import './chunk-RUD7KS4R.js';
9
9
  import './chunk-XDKK53OL.js';
package/dist/workflow.cjs CHANGED
@@ -1,11 +1,11 @@
1
1
  'use strict';
2
2
 
3
- var chunkAQXPGGQK_cjs = require('./chunk-AQXPGGQK.cjs');
4
- require('./chunk-RMGSBMQF.cjs');
5
- require('./chunk-W4EUTSB2.cjs');
3
+ var chunkEEJGUBWV_cjs = require('./chunk-EEJGUBWV.cjs');
4
+ require('./chunk-QQLP4M6W.cjs');
6
5
  require('./chunk-GML3FBOT.cjs');
7
6
  require('./chunk-D5LMF53P.cjs');
8
- require('./chunk-XRKAL7WJ.cjs');
7
+ require('./chunk-JSNUWSBH.cjs');
8
+ require('./chunk-HZ3FYBJG.cjs');
9
9
  require('./chunk-ITYASFHQ.cjs');
10
10
  require('./chunk-OFPZULMQ.cjs');
11
11
  require('./chunk-KZEC4CHV.cjs');
@@ -25,19 +25,19 @@ require('./chunk-JEQ2X3Z6.cjs');
25
25
 
26
26
  Object.defineProperty(exports, "getCurrentWorkflowContext", {
27
27
  enumerable: true,
28
- get: function () { return chunkAQXPGGQK_cjs.getCurrentWorkflowContext; }
28
+ get: function () { return chunkEEJGUBWV_cjs.getCurrentWorkflowContext; }
29
29
  });
30
30
  Object.defineProperty(exports, "isInWorkflow", {
31
31
  enumerable: true,
32
- get: function () { return chunkAQXPGGQK_cjs.isInWorkflow; }
32
+ get: function () { return chunkEEJGUBWV_cjs.isInWorkflow; }
33
33
  });
34
34
  Object.defineProperty(exports, "traceStep", {
35
35
  enumerable: true,
36
- get: function () { return chunkAQXPGGQK_cjs.traceStep; }
36
+ get: function () { return chunkEEJGUBWV_cjs.traceStep; }
37
37
  });
38
38
  Object.defineProperty(exports, "traceWorkflow", {
39
39
  enumerable: true,
40
- get: function () { return chunkAQXPGGQK_cjs.traceWorkflow; }
40
+ get: function () { return chunkEEJGUBWV_cjs.traceWorkflow; }
41
41
  });
42
42
  //# sourceMappingURL=workflow.cjs.map
43
43
  //# sourceMappingURL=workflow.cjs.map
package/dist/workflow.js CHANGED
@@ -1,9 +1,9 @@
1
- export { getCurrentWorkflowContext, isInWorkflow, traceStep, traceWorkflow } from './chunk-VVYSQXQL.js';
2
- import './chunk-JM63D22M.js';
3
- import './chunk-SR35DG5A.js';
1
+ export { getCurrentWorkflowContext, isInWorkflow, traceStep, traceWorkflow } from './chunk-WYP6OOCT.js';
2
+ import './chunk-OPTGXEVN.js';
4
3
  import './chunk-B3ZHLLMP.js';
5
4
  import './chunk-WD4RP6IV.js';
6
- import './chunk-USSL3D6L.js';
5
+ import './chunk-S4OFEXLA.js';
6
+ import './chunk-BBBWDIYQ.js';
7
7
  import './chunk-MNBAXRVG.js';
8
8
  import './chunk-RUD7KS4R.js';
9
9
  import './chunk-XDKK53OL.js';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "autotel",
3
- "version": "2.25.3",
3
+ "version": "2.25.5",
4
4
  "description": "Write Once, Observe Anywhere",
5
5
  "main": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",
@@ -24,12 +24,17 @@
24
24
 
25
25
  import { trace, propagation, context } from '@opentelemetry/api';
26
26
  import { AsyncLocalStorage } from 'node:async_hooks';
27
+ import { enterOrRun } from './trace-context';
28
+
29
+ type CorrelationStore = {
30
+ value: string;
31
+ };
27
32
 
28
33
  /**
29
34
  * AsyncLocalStorage for storing correlation ID
30
35
  * This allows correlation IDs to persist across async boundaries
31
36
  */
32
- const correlationStorage = new AsyncLocalStorage<string>();
37
+ const correlationStorage = new AsyncLocalStorage<CorrelationStore>();
33
38
 
34
39
  /**
35
40
  * Baggage key for correlation ID propagation
@@ -79,7 +84,7 @@ export function generateCorrelationId(): string {
79
84
  */
80
85
  export function getCorrelationId(): string | undefined {
81
86
  // 1. Check AsyncLocalStorage first (explicit correlation ID)
82
- const storedId = correlationStorage.getStore();
87
+ const storedId = correlationStorage.getStore()?.value;
83
88
  if (storedId) {
84
89
  return storedId;
85
90
  }
@@ -140,7 +145,7 @@ export function getOrCreateCorrelationId(): string {
140
145
  * ```
141
146
  */
142
147
  export function runWithCorrelationId<T>(correlationId: string, fn: () => T): T {
143
- return correlationStorage.run(correlationId, fn);
148
+ return correlationStorage.run({ value: correlationId }, fn);
144
149
  }
145
150
 
146
151
  /**
@@ -158,7 +163,7 @@ export function runWithCorrelationId<T>(correlationId: string, fn: () => T): T {
158
163
  * ```
159
164
  */
160
165
  export function setCorrelationId(correlationId: string): void {
161
- correlationStorage.enterWith(correlationId);
166
+ enterOrRun(correlationStorage, correlationId);
162
167
  }
163
168
 
164
169
  /**
@@ -196,6 +201,6 @@ export function setCorrelationIdInBaggage(
196
201
  /**
197
202
  * Get the correlation storage instance (for internal use in init/shutdown)
198
203
  */
199
- export function getCorrelationStorage(): AsyncLocalStorage<string> {
204
+ export function getCorrelationStorage(): AsyncLocalStorage<CorrelationStore> {
200
205
  return correlationStorage;
201
206
  }