autotel 3.5.0 → 3.7.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 (591) hide show
  1. package/dist/attribute-redacting-processor-DtTS9xxh.d.cts +175 -0
  2. package/dist/attribute-redacting-processor-DtTS9xxh.d.cts.map +1 -0
  3. package/dist/attribute-redacting-processor-DtTS9xxh.d.ts +175 -0
  4. package/dist/attribute-redacting-processor-DtTS9xxh.d.ts.map +1 -0
  5. package/dist/attribute-redacting-processor.cjs +374 -33
  6. package/dist/attribute-redacting-processor.cjs.map +1 -1
  7. package/dist/attribute-redacting-processor.d.cts +2 -207
  8. package/dist/attribute-redacting-processor.d.ts +2 -207
  9. package/dist/attribute-redacting-processor.js +368 -2
  10. package/dist/attribute-redacting-processor.js.map +1 -1
  11. package/dist/attributes-D3etyRVc.cjs +713 -0
  12. package/dist/attributes-D3etyRVc.cjs.map +1 -0
  13. package/dist/attributes-ksn4HVbd.js +600 -0
  14. package/dist/attributes-ksn4HVbd.js.map +1 -0
  15. package/dist/attributes.cjs +21 -85
  16. package/dist/attributes.d.cts +2 -20
  17. package/dist/attributes.d.ts +2 -20
  18. package/dist/attributes.js +3 -5
  19. package/dist/auto.cjs +50 -28
  20. package/dist/auto.cjs.map +1 -1
  21. package/dist/auto.d.cts +1 -2
  22. package/dist/auto.d.ts +1 -2
  23. package/dist/auto.js +49 -23
  24. package/dist/auto.js.map +1 -1
  25. package/dist/business-baggage.cjs +357 -13
  26. package/dist/business-baggage.cjs.map +1 -1
  27. package/dist/business-baggage.d.cts +106 -139
  28. package/dist/business-baggage.d.cts.map +1 -0
  29. package/dist/business-baggage.d.ts +106 -139
  30. package/dist/business-baggage.d.ts.map +1 -0
  31. package/dist/business-baggage.js +357 -2
  32. package/dist/business-baggage.js.map +1 -1
  33. package/dist/canonical-log-line-processor--RlFDHhm.cjs +377 -0
  34. package/dist/canonical-log-line-processor--RlFDHhm.cjs.map +1 -0
  35. package/dist/canonical-log-line-processor-BcRuAdRk.d.ts +147 -0
  36. package/dist/canonical-log-line-processor-BcRuAdRk.d.ts.map +1 -0
  37. package/dist/canonical-log-line-processor-DbBQT5vY.js +366 -0
  38. package/dist/canonical-log-line-processor-DbBQT5vY.js.map +1 -0
  39. package/dist/canonical-log-line-processor-xvjMgtpF.d.cts +147 -0
  40. package/dist/canonical-log-line-processor-xvjMgtpF.d.cts.map +1 -0
  41. package/dist/config.cjs +118 -22
  42. package/dist/config.cjs.map +1 -1
  43. package/dist/config.d.cts +33 -45
  44. package/dist/config.d.cts.map +1 -0
  45. package/dist/config.d.ts +33 -45
  46. package/dist/config.d.ts.map +1 -0
  47. package/dist/config.js +116 -3
  48. package/dist/config.js.map +1 -1
  49. package/dist/correlated-events-Bzh5y-UB.js +28 -0
  50. package/dist/correlated-events-Bzh5y-UB.js.map +1 -0
  51. package/dist/correlated-events-kSwLo3mi.cjs +34 -0
  52. package/dist/correlated-events-kSwLo3mi.cjs.map +1 -0
  53. package/dist/correlation-id.cjs +11 -53
  54. package/dist/correlation-id.d.cts +6 -5
  55. package/dist/correlation-id.d.cts.map +1 -0
  56. package/dist/correlation-id.d.ts +6 -5
  57. package/dist/correlation-id.d.ts.map +1 -0
  58. package/dist/correlation-id.js +3 -16
  59. package/dist/db.cjs +244 -209
  60. package/dist/db.cjs.map +1 -1
  61. package/dist/db.d.cts +28 -26
  62. package/dist/db.d.cts.map +1 -0
  63. package/dist/db.d.ts +28 -26
  64. package/dist/db.d.ts.map +1 -0
  65. package/dist/db.js +243 -207
  66. package/dist/db.js.map +1 -1
  67. package/dist/decorators.cjs +39 -65
  68. package/dist/decorators.cjs.map +1 -1
  69. package/dist/decorators.d.cts +10 -37
  70. package/dist/decorators.d.cts.map +1 -0
  71. package/dist/decorators.d.ts +10 -37
  72. package/dist/decorators.d.ts.map +1 -0
  73. package/dist/decorators.js +38 -63
  74. package/dist/decorators.js.map +1 -1
  75. package/dist/define-event-CreknLm3.d.ts +25 -0
  76. package/dist/define-event-CreknLm3.d.ts.map +1 -0
  77. package/dist/define-event-HZRizPwz.d.cts +25 -0
  78. package/dist/define-event-HZRizPwz.d.cts.map +1 -0
  79. package/dist/drain-pipeline.cjs +111 -9
  80. package/dist/drain-pipeline.cjs.map +1 -1
  81. package/dist/drain-pipeline.d.cts +27 -32
  82. package/dist/drain-pipeline.d.cts.map +1 -0
  83. package/dist/drain-pipeline.d.ts +27 -32
  84. package/dist/drain-pipeline.d.ts.map +1 -0
  85. package/dist/drain-pipeline.js +111 -2
  86. package/dist/drain-pipeline.js.map +1 -1
  87. package/dist/enrichers.cjs +59 -66
  88. package/dist/enrichers.cjs.map +1 -1
  89. package/dist/enrichers.d.cts +15 -13
  90. package/dist/enrichers.d.cts.map +1 -0
  91. package/dist/enrichers.d.ts +15 -13
  92. package/dist/enrichers.d.ts.map +1 -0
  93. package/dist/enrichers.js +58 -65
  94. package/dist/enrichers.js.map +1 -1
  95. package/dist/event-Dlqr4ZNL.cjs +778 -0
  96. package/dist/event-Dlqr4ZNL.cjs.map +1 -0
  97. package/dist/event-_58ryBjh.js +761 -0
  98. package/dist/event-_58ryBjh.js.map +1 -0
  99. package/dist/event-subscriber-D1XLkPzi.d.cts +223 -0
  100. package/dist/event-subscriber-D1XLkPzi.d.cts.map +1 -0
  101. package/dist/event-subscriber-D1XLkPzi.d.ts +223 -0
  102. package/dist/event-subscriber-D1XLkPzi.d.ts.map +1 -0
  103. package/dist/event-subscriber.cjs +0 -6
  104. package/dist/event-subscriber.d.cts +2 -221
  105. package/dist/event-subscriber.d.ts +2 -221
  106. package/dist/event-subscriber.js +1 -3
  107. package/dist/event-testing-BqRnI0z4.d.cts +106 -0
  108. package/dist/event-testing-BqRnI0z4.d.cts.map +1 -0
  109. package/dist/event-testing-CfFs3to2.d.ts +106 -0
  110. package/dist/event-testing-CfFs3to2.d.ts.map +1 -0
  111. package/dist/event-testing.cjs +93 -17
  112. package/dist/event-testing.cjs.map +1 -1
  113. package/dist/event-testing.d.cts +2 -110
  114. package/dist/event-testing.d.ts +2 -110
  115. package/dist/event-testing.js +91 -2
  116. package/dist/event-testing.js.map +1 -1
  117. package/dist/event.cjs +5 -36
  118. package/dist/event.d.cts +295 -340
  119. package/dist/event.d.cts.map +1 -0
  120. package/dist/event.d.ts +295 -340
  121. package/dist/event.d.ts.map +1 -0
  122. package/dist/event.js +3 -20
  123. package/dist/exporters.cjs +12 -16
  124. package/dist/exporters.d.cts +86 -111
  125. package/dist/exporters.d.cts.map +1 -0
  126. package/dist/exporters.d.ts +86 -111
  127. package/dist/exporters.d.ts.map +1 -0
  128. package/dist/exporters.js +4 -4
  129. package/dist/filtering-span-processor-B8R8B7Uk.d.cts +59 -0
  130. package/dist/filtering-span-processor-B8R8B7Uk.d.cts.map +1 -0
  131. package/dist/filtering-span-processor-B8R8B7Uk.d.ts +59 -0
  132. package/dist/filtering-span-processor-B8R8B7Uk.d.ts.map +1 -0
  133. package/dist/filtering-span-processor.cjs +49 -9
  134. package/dist/filtering-span-processor.cjs.map +1 -1
  135. package/dist/filtering-span-processor.d.cts +2 -80
  136. package/dist/filtering-span-processor.d.ts +2 -80
  137. package/dist/filtering-span-processor.js +49 -2
  138. package/dist/filtering-span-processor.js.map +1 -1
  139. package/dist/functional-BGkT8J-h.js +1265 -0
  140. package/dist/functional-BGkT8J-h.js.map +1 -0
  141. package/dist/functional-C4CzoVrX.cjs +1312 -0
  142. package/dist/functional-C4CzoVrX.cjs.map +1 -0
  143. package/dist/functional.cjs +11 -56
  144. package/dist/functional.d.cts +96 -97
  145. package/dist/functional.d.cts.map +1 -0
  146. package/dist/functional.d.ts +96 -97
  147. package/dist/functional.d.ts.map +1 -0
  148. package/dist/functional.js +3 -19
  149. package/dist/http.cjs +276 -175
  150. package/dist/http.cjs.map +1 -1
  151. package/dist/http.d.cts +17 -37
  152. package/dist/http.d.cts.map +1 -0
  153. package/dist/http.d.ts +17 -37
  154. package/dist/http.d.ts.map +1 -0
  155. package/dist/http.js +275 -173
  156. package/dist/http.js.map +1 -1
  157. package/dist/index-CX0aG1Uh.d.ts +708 -0
  158. package/dist/index-CX0aG1Uh.d.ts.map +1 -0
  159. package/dist/index-DIWZFKUS.d.cts +708 -0
  160. package/dist/index-DIWZFKUS.d.cts.map +1 -0
  161. package/dist/index.cjs +1050 -1184
  162. package/dist/index.cjs.map +1 -1
  163. package/dist/index.d.cts +401 -570
  164. package/dist/index.d.cts.map +1 -0
  165. package/dist/index.d.ts +401 -570
  166. package/dist/index.d.ts.map +1 -0
  167. package/dist/index.js +913 -725
  168. package/dist/index.js.map +1 -1
  169. package/dist/init-CNp-ee80.d.cts +1157 -0
  170. package/dist/init-CNp-ee80.d.cts.map +1 -0
  171. package/dist/init-Ch6t7MNI.js +1015 -0
  172. package/dist/init-Ch6t7MNI.js.map +1 -0
  173. package/dist/init-DJQOdVlN.d.ts +1157 -0
  174. package/dist/init-DJQOdVlN.d.ts.map +1 -0
  175. package/dist/init-DvapOXCc.cjs +1092 -0
  176. package/dist/init-DvapOXCc.cjs.map +1 -0
  177. package/dist/instrumentation.cjs +159 -185
  178. package/dist/instrumentation.cjs.map +1 -1
  179. package/dist/instrumentation.d.cts +42 -40
  180. package/dist/instrumentation.d.cts.map +1 -0
  181. package/dist/instrumentation.d.ts +42 -40
  182. package/dist/instrumentation.d.ts.map +1 -0
  183. package/dist/instrumentation.js +158 -183
  184. package/dist/instrumentation.js.map +1 -1
  185. package/dist/logger-BauSUhUv.d.cts +313 -0
  186. package/dist/logger-BauSUhUv.d.cts.map +1 -0
  187. package/dist/logger-BauSUhUv.d.ts +313 -0
  188. package/dist/logger-BauSUhUv.d.ts.map +1 -0
  189. package/dist/logger.cjs +225 -25
  190. package/dist/logger.cjs.map +1 -1
  191. package/dist/logger.d.cts +2 -348
  192. package/dist/logger.d.ts +2 -348
  193. package/dist/logger.js +204 -4
  194. package/dist/logger.js.map +1 -1
  195. package/dist/messaging-adapters.cjs +292 -187
  196. package/dist/messaging-adapters.cjs.map +1 -1
  197. package/dist/messaging-adapters.d.cts +28 -66
  198. package/dist/messaging-adapters.d.cts.map +1 -0
  199. package/dist/messaging-adapters.d.ts +28 -66
  200. package/dist/messaging-adapters.d.ts.map +1 -0
  201. package/dist/messaging-adapters.js +291 -185
  202. package/dist/messaging-adapters.js.map +1 -1
  203. package/dist/messaging-testing.cjs +306 -372
  204. package/dist/messaging-testing.cjs.map +1 -1
  205. package/dist/messaging-testing.d.cts +194 -223
  206. package/dist/messaging-testing.d.cts.map +1 -0
  207. package/dist/messaging-testing.d.ts +194 -223
  208. package/dist/messaging-testing.d.ts.map +1 -0
  209. package/dist/messaging-testing.js +305 -371
  210. package/dist/messaging-testing.js.map +1 -1
  211. package/dist/messaging.cjs +757 -35
  212. package/dist/messaging.cjs.map +1 -1
  213. package/dist/messaging.d.cts +603 -644
  214. package/dist/messaging.d.cts.map +1 -0
  215. package/dist/messaging.d.ts +603 -644
  216. package/dist/messaging.d.ts.map +1 -0
  217. package/dist/messaging.js +756 -20
  218. package/dist/messaging.js.map +1 -1
  219. package/dist/metric-helpers.cjs +27 -27
  220. package/dist/metric-helpers.cjs.map +1 -1
  221. package/dist/metric-helpers.d.cts +4 -2
  222. package/dist/metric-helpers.d.cts.map +1 -0
  223. package/dist/metric-helpers.d.ts +4 -2
  224. package/dist/metric-helpers.d.ts.map +1 -0
  225. package/dist/metric-helpers.js +24 -4
  226. package/dist/metric-helpers.js.map +1 -1
  227. package/dist/metric-testing-DXdK3-Q3.d.ts +106 -0
  228. package/dist/metric-testing-DXdK3-Q3.d.ts.map +1 -0
  229. package/dist/metric-testing-MxvzChDp.d.cts +106 -0
  230. package/dist/metric-testing-MxvzChDp.d.cts.map +1 -0
  231. package/dist/metric-testing.cjs +93 -17
  232. package/dist/metric-testing.cjs.map +1 -1
  233. package/dist/metric-testing.d.cts +2 -110
  234. package/dist/metric-testing.d.ts +2 -110
  235. package/dist/metric-testing.js +91 -2
  236. package/dist/metric-testing.js.map +1 -1
  237. package/dist/metric.cjs +306 -22
  238. package/dist/metric.cjs.map +1 -1
  239. package/dist/metric.d.cts +170 -198
  240. package/dist/metric.d.cts.map +1 -0
  241. package/dist/metric.d.ts +170 -198
  242. package/dist/metric.d.ts.map +1 -0
  243. package/dist/metric.js +277 -7
  244. package/dist/metric.js.map +1 -1
  245. package/dist/node-require-DF5QBX6z.cjs +99 -0
  246. package/dist/node-require-DF5QBX6z.cjs.map +1 -0
  247. package/dist/node-require-Db1oDpLj.js +88 -0
  248. package/dist/node-require-Db1oDpLj.js.map +1 -0
  249. package/dist/operation-context-C-2hmmtP.js +59 -0
  250. package/dist/operation-context-C-2hmmtP.js.map +1 -0
  251. package/dist/operation-context-n4_obUwq.cjs +70 -0
  252. package/dist/operation-context-n4_obUwq.cjs.map +1 -0
  253. package/dist/parse-error.cjs +55 -9
  254. package/dist/parse-error.cjs.map +1 -1
  255. package/dist/parse-error.d.cts +12 -10
  256. package/dist/parse-error.d.cts.map +1 -0
  257. package/dist/parse-error.d.ts +12 -10
  258. package/dist/parse-error.d.ts.map +1 -0
  259. package/dist/parse-error.js +55 -2
  260. package/dist/parse-error.js.map +1 -1
  261. package/dist/pretty-console-exporter-CMzlrRNg.cjs +232 -0
  262. package/dist/pretty-console-exporter-CMzlrRNg.cjs.map +1 -0
  263. package/dist/pretty-console-exporter-DqKl_q9z.js +227 -0
  264. package/dist/pretty-console-exporter-DqKl_q9z.js.map +1 -0
  265. package/dist/processors.cjs +13 -17
  266. package/dist/processors.d.cts +3 -171
  267. package/dist/processors.d.ts +3 -171
  268. package/dist/processors.js +4 -4
  269. package/dist/register.cjs +35 -6
  270. package/dist/register.cjs.map +1 -1
  271. package/dist/register.d.cts +1 -2
  272. package/dist/register.d.ts +1 -2
  273. package/dist/register.js +36 -3
  274. package/dist/register.js.map +1 -1
  275. package/dist/registry-DfXA3R1L.js +184 -0
  276. package/dist/registry-DfXA3R1L.js.map +1 -0
  277. package/dist/registry-JZg2J3RZ.cjs +334 -0
  278. package/dist/registry-JZg2J3RZ.cjs.map +1 -0
  279. package/dist/sampling-CR0Va1VB.d.ts +351 -0
  280. package/dist/sampling-CR0Va1VB.d.ts.map +1 -0
  281. package/dist/sampling-DfYhDJij.d.cts +351 -0
  282. package/dist/sampling-DfYhDJij.d.cts.map +1 -0
  283. package/dist/sampling.cjs +452 -60
  284. package/dist/sampling.cjs.map +1 -1
  285. package/dist/sampling.d.cts +2 -379
  286. package/dist/sampling.d.ts +2 -379
  287. package/dist/sampling.js +441 -5
  288. package/dist/sampling.js.map +1 -1
  289. package/dist/security-schema.cjs +65 -46
  290. package/dist/security-schema.cjs.map +1 -1
  291. package/dist/security-schema.d.cts +23 -26
  292. package/dist/security-schema.d.cts.map +1 -0
  293. package/dist/security-schema.d.ts +23 -26
  294. package/dist/security-schema.d.ts.map +1 -0
  295. package/dist/security-schema.js +64 -45
  296. package/dist/security-schema.js.map +1 -1
  297. package/dist/semantic-conventions-FhSxv-bK.d.cts +32 -0
  298. package/dist/semantic-conventions-FhSxv-bK.d.cts.map +1 -0
  299. package/dist/semantic-conventions-FhSxv-bK.d.ts +32 -0
  300. package/dist/semantic-conventions-FhSxv-bK.d.ts.map +1 -0
  301. package/dist/semantic-conventions.cjs +15 -26
  302. package/dist/semantic-conventions.cjs.map +1 -1
  303. package/dist/semantic-conventions.d.cts +2 -29
  304. package/dist/semantic-conventions.d.ts +2 -29
  305. package/dist/semantic-conventions.js +12 -3
  306. package/dist/semantic-conventions.js.map +1 -1
  307. package/dist/semantic-helpers.cjs +440 -38
  308. package/dist/semantic-helpers.cjs.map +1 -1
  309. package/dist/semantic-helpers.d.cts +38 -45
  310. package/dist/semantic-helpers.d.cts.map +1 -0
  311. package/dist/semantic-helpers.d.ts +38 -45
  312. package/dist/semantic-helpers.d.ts.map +1 -0
  313. package/dist/semantic-helpers.js +438 -19
  314. package/dist/semantic-helpers.js.map +1 -1
  315. package/dist/span-name-normalizer-8ZOGJuwv.d.cts +70 -0
  316. package/dist/span-name-normalizer-8ZOGJuwv.d.cts.map +1 -0
  317. package/dist/span-name-normalizer-8ZOGJuwv.d.ts +70 -0
  318. package/dist/span-name-normalizer-8ZOGJuwv.d.ts.map +1 -0
  319. package/dist/span-name-normalizer.cjs +95 -17
  320. package/dist/span-name-normalizer.cjs.map +1 -1
  321. package/dist/span-name-normalizer.d.cts +2 -94
  322. package/dist/span-name-normalizer.d.ts +2 -94
  323. package/dist/span-name-normalizer.js +93 -2
  324. package/dist/span-name-normalizer.js.map +1 -1
  325. package/dist/stable-hash-BNTMrmdB.cjs +28 -0
  326. package/dist/stable-hash-BNTMrmdB.cjs.map +1 -0
  327. package/dist/stable-hash-Cg5cT34Q.js +23 -0
  328. package/dist/stable-hash-Cg5cT34Q.js.map +1 -0
  329. package/dist/structured-error-9--cxBay.js +143 -0
  330. package/dist/structured-error-9--cxBay.js.map +1 -0
  331. package/dist/structured-error-CHg7DoIQ.cjs +178 -0
  332. package/dist/structured-error-CHg7DoIQ.cjs.map +1 -0
  333. package/dist/tail-sampling-processor.cjs +26 -13
  334. package/dist/tail-sampling-processor.cjs.map +1 -1
  335. package/dist/tail-sampling-processor.d.cts +11 -23
  336. package/dist/tail-sampling-processor.d.cts.map +1 -0
  337. package/dist/tail-sampling-processor.d.ts +11 -23
  338. package/dist/tail-sampling-processor.d.ts.map +1 -0
  339. package/dist/tail-sampling-processor.js +27 -6
  340. package/dist/tail-sampling-processor.js.map +1 -1
  341. package/dist/test-span-collector.cjs +70 -72
  342. package/dist/test-span-collector.cjs.map +1 -1
  343. package/dist/test-span-collector.d.cts +25 -43
  344. package/dist/test-span-collector.d.cts.map +1 -0
  345. package/dist/test-span-collector.d.ts +25 -43
  346. package/dist/test-span-collector.d.ts.map +1 -0
  347. package/dist/test-span-collector.js +69 -70
  348. package/dist/test-span-collector.js.map +1 -1
  349. package/dist/testing.cjs +389 -278
  350. package/dist/testing.cjs.map +1 -1
  351. package/dist/testing.d.cts +39 -62
  352. package/dist/testing.d.cts.map +1 -0
  353. package/dist/testing.d.ts +39 -62
  354. package/dist/testing.d.ts.map +1 -0
  355. package/dist/testing.js +386 -265
  356. package/dist/testing.js.map +1 -1
  357. package/dist/trace-context-Cijqoi6e.d.cts +212 -0
  358. package/dist/trace-context-Cijqoi6e.d.cts.map +1 -0
  359. package/dist/trace-context-Cijqoi6e.d.ts +212 -0
  360. package/dist/trace-context-Cijqoi6e.d.ts.map +1 -0
  361. package/dist/trace-helpers.cjs +634 -54
  362. package/dist/trace-helpers.cjs.map +1 -1
  363. package/dist/trace-helpers.d.cts +17 -49
  364. package/dist/trace-helpers.d.cts.map +1 -0
  365. package/dist/trace-helpers.d.ts +17 -49
  366. package/dist/trace-helpers.d.ts.map +1 -0
  367. package/dist/trace-helpers.js +624 -3
  368. package/dist/trace-helpers.js.map +1 -1
  369. package/dist/tracer-provider.cjs +227 -16
  370. package/dist/tracer-provider.cjs.map +1 -1
  371. package/dist/tracer-provider.d.cts +5 -4
  372. package/dist/tracer-provider.d.cts.map +1 -0
  373. package/dist/tracer-provider.d.ts +5 -4
  374. package/dist/tracer-provider.d.ts.map +1 -0
  375. package/dist/tracer-provider.js +227 -2
  376. package/dist/tracer-provider.js.map +1 -1
  377. package/dist/track-3HY4NGV-.cjs +1212 -0
  378. package/dist/track-3HY4NGV-.cjs.map +1 -0
  379. package/dist/track-nsKVy-pj.js +1111 -0
  380. package/dist/track-nsKVy-pj.js.map +1 -0
  381. package/dist/validate.cjs +201 -0
  382. package/dist/validate.cjs.map +1 -0
  383. package/dist/validate.d.cts +105 -0
  384. package/dist/validate.d.cts.map +1 -0
  385. package/dist/validate.d.ts +105 -0
  386. package/dist/validate.d.ts.map +1 -0
  387. package/dist/validate.js +197 -0
  388. package/dist/validate.js.map +1 -0
  389. package/dist/validation-attributes.cjs +45 -0
  390. package/dist/validation-attributes.cjs.map +1 -0
  391. package/dist/validation-attributes.d.cts +33 -0
  392. package/dist/validation-attributes.d.cts.map +1 -0
  393. package/dist/validation-attributes.d.ts +33 -0
  394. package/dist/validation-attributes.d.ts.map +1 -0
  395. package/dist/validation-attributes.js +41 -0
  396. package/dist/validation-attributes.js.map +1 -0
  397. package/dist/webhook.cjs +286 -255
  398. package/dist/webhook.cjs.map +1 -1
  399. package/dist/webhook.d.cts +157 -192
  400. package/dist/webhook.d.cts.map +1 -0
  401. package/dist/webhook.d.ts +157 -192
  402. package/dist/webhook.d.ts.map +1 -0
  403. package/dist/webhook.js +285 -253
  404. package/dist/webhook.js.map +1 -1
  405. package/dist/workflow-distributed.cjs +498 -411
  406. package/dist/workflow-distributed.cjs.map +1 -1
  407. package/dist/workflow-distributed.d.cts +163 -173
  408. package/dist/workflow-distributed.d.cts.map +1 -0
  409. package/dist/workflow-distributed.d.ts +163 -173
  410. package/dist/workflow-distributed.d.ts.map +1 -0
  411. package/dist/workflow-distributed.js +497 -409
  412. package/dist/workflow-distributed.js.map +1 -1
  413. package/dist/workflow.cjs +405 -39
  414. package/dist/workflow.cjs.map +1 -1
  415. package/dist/workflow.d.cts +78 -131
  416. package/dist/workflow.d.cts.map +1 -0
  417. package/dist/workflow.d.ts +78 -131
  418. package/dist/workflow.d.ts.map +1 -0
  419. package/dist/workflow.js +403 -20
  420. package/dist/workflow.js.map +1 -1
  421. package/dist/yaml-config-B3dQ82GR.cjs +272 -0
  422. package/dist/yaml-config-B3dQ82GR.cjs.map +1 -0
  423. package/dist/yaml-config.cjs +5 -24
  424. package/dist/yaml-config.d.cts +30 -64
  425. package/dist/yaml-config.d.cts.map +1 -0
  426. package/dist/yaml-config.d.ts +30 -64
  427. package/dist/yaml-config.d.ts.map +1 -0
  428. package/dist/yaml-config.js +226 -7
  429. package/dist/yaml-config.js.map +1 -1
  430. package/package.json +14 -4
  431. package/src/define-event.ts +2 -21
  432. package/src/index.ts +3 -0
  433. package/src/request-logger.test.ts +53 -1
  434. package/src/request-logger.ts +58 -0
  435. package/src/stable-hash.ts +27 -0
  436. package/src/validate.test.ts +287 -0
  437. package/src/validate.ts +307 -0
  438. package/src/validation-attributes.ts +43 -0
  439. package/dist/attributes.cjs.map +0 -1
  440. package/dist/attributes.js.map +0 -1
  441. package/dist/chunk-2ZKEORFN.cjs +0 -14
  442. package/dist/chunk-2ZKEORFN.cjs.map +0 -1
  443. package/dist/chunk-3QXBFGKP.js +0 -344
  444. package/dist/chunk-3QXBFGKP.js.map +0 -1
  445. package/dist/chunk-454CH4OV.js +0 -744
  446. package/dist/chunk-454CH4OV.js.map +0 -1
  447. package/dist/chunk-4A53YIAX.js +0 -180
  448. package/dist/chunk-4A53YIAX.js.map +0 -1
  449. package/dist/chunk-4IFSYQVX.js +0 -337
  450. package/dist/chunk-4IFSYQVX.js.map +0 -1
  451. package/dist/chunk-4P6ZOARG.cjs +0 -33
  452. package/dist/chunk-4P6ZOARG.cjs.map +0 -1
  453. package/dist/chunk-55ER2KD5.js +0 -228
  454. package/dist/chunk-55ER2KD5.js.map +0 -1
  455. package/dist/chunk-5ZN622AO.js +0 -73
  456. package/dist/chunk-5ZN622AO.js.map +0 -1
  457. package/dist/chunk-6S5RUKU3.cjs +0 -347
  458. package/dist/chunk-6S5RUKU3.cjs.map +0 -1
  459. package/dist/chunk-6UQRVUN3.js +0 -222
  460. package/dist/chunk-6UQRVUN3.js.map +0 -1
  461. package/dist/chunk-7552UTQW.js +0 -11
  462. package/dist/chunk-7552UTQW.js.map +0 -1
  463. package/dist/chunk-7EQ4G4SI.cjs +0 -146
  464. package/dist/chunk-7EQ4G4SI.cjs.map +0 -1
  465. package/dist/chunk-7SAWIN74.js +0 -285
  466. package/dist/chunk-7SAWIN74.js.map +0 -1
  467. package/dist/chunk-A4E5AQFK.js +0 -30
  468. package/dist/chunk-A4E5AQFK.js.map +0 -1
  469. package/dist/chunk-AC5GNZKB.cjs +0 -344
  470. package/dist/chunk-AC5GNZKB.cjs.map +0 -1
  471. package/dist/chunk-ALPYR2GC.js +0 -1061
  472. package/dist/chunk-ALPYR2GC.js.map +0 -1
  473. package/dist/chunk-BZHG5IZ4.js +0 -73
  474. package/dist/chunk-BZHG5IZ4.js.map +0 -1
  475. package/dist/chunk-CEAQK2QY.cjs +0 -32
  476. package/dist/chunk-CEAQK2QY.cjs.map +0 -1
  477. package/dist/chunk-CMHVQR6P.js +0 -170
  478. package/dist/chunk-CMHVQR6P.js.map +0 -1
  479. package/dist/chunk-CU6IDACR.cjs +0 -224
  480. package/dist/chunk-CU6IDACR.cjs.map +0 -1
  481. package/dist/chunk-DPSA4QLA.js +0 -344
  482. package/dist/chunk-DPSA4QLA.js.map +0 -1
  483. package/dist/chunk-DQEHQNQE.js +0 -795
  484. package/dist/chunk-DQEHQNQE.js.map +0 -1
  485. package/dist/chunk-ESLWRGAG.cjs +0 -92
  486. package/dist/chunk-ESLWRGAG.cjs.map +0 -1
  487. package/dist/chunk-ESMHTKLJ.cjs +0 -206
  488. package/dist/chunk-ESMHTKLJ.cjs.map +0 -1
  489. package/dist/chunk-FGNDN2FD.cjs +0 -1242
  490. package/dist/chunk-FGNDN2FD.cjs.map +0 -1
  491. package/dist/chunk-FU6R566Y.cjs +0 -236
  492. package/dist/chunk-FU6R566Y.cjs.map +0 -1
  493. package/dist/chunk-GBFTC7Q7.cjs +0 -837
  494. package/dist/chunk-GBFTC7Q7.cjs.map +0 -1
  495. package/dist/chunk-GYR5K654.js +0 -91
  496. package/dist/chunk-GYR5K654.js.map +0 -1
  497. package/dist/chunk-HA2WBOGQ.js +0 -57
  498. package/dist/chunk-HA2WBOGQ.js.map +0 -1
  499. package/dist/chunk-HT5JQKN2.js +0 -118
  500. package/dist/chunk-HT5JQKN2.js.map +0 -1
  501. package/dist/chunk-INJD3G4K.cjs +0 -340
  502. package/dist/chunk-INJD3G4K.cjs.map +0 -1
  503. package/dist/chunk-IOYFAFHJ.cjs +0 -95
  504. package/dist/chunk-IOYFAFHJ.cjs.map +0 -1
  505. package/dist/chunk-J5QENANM.js +0 -87
  506. package/dist/chunk-J5QENANM.js.map +0 -1
  507. package/dist/chunk-J7VGRIAJ.js +0 -64
  508. package/dist/chunk-J7VGRIAJ.js.map +0 -1
  509. package/dist/chunk-KFOHQK7X.js +0 -144
  510. package/dist/chunk-KFOHQK7X.js.map +0 -1
  511. package/dist/chunk-KIL5CUN6.js +0 -31
  512. package/dist/chunk-KIL5CUN6.js.map +0 -1
  513. package/dist/chunk-LITNXTTT.js +0 -3
  514. package/dist/chunk-LITNXTTT.js.map +0 -1
  515. package/dist/chunk-M3LFHHTN.cjs +0 -764
  516. package/dist/chunk-M3LFHHTN.cjs.map +0 -1
  517. package/dist/chunk-NEIB3TLD.cjs +0 -360
  518. package/dist/chunk-NEIB3TLD.cjs.map +0 -1
  519. package/dist/chunk-NVAI5CCN.cjs +0 -39
  520. package/dist/chunk-NVAI5CCN.cjs.map +0 -1
  521. package/dist/chunk-NVGPMGI4.js +0 -95
  522. package/dist/chunk-NVGPMGI4.js.map +0 -1
  523. package/dist/chunk-NZ72VDNY.cjs +0 -4
  524. package/dist/chunk-NZ72VDNY.cjs.map +0 -1
  525. package/dist/chunk-O4JZUCUE.js +0 -1174
  526. package/dist/chunk-O4JZUCUE.js.map +0 -1
  527. package/dist/chunk-O7JOKRN2.js +0 -833
  528. package/dist/chunk-O7JOKRN2.js.map +0 -1
  529. package/dist/chunk-OPPXYVEZ.cjs +0 -131
  530. package/dist/chunk-OPPXYVEZ.cjs.map +0 -1
  531. package/dist/chunk-Q4EULJQY.js +0 -35
  532. package/dist/chunk-Q4EULJQY.js.map +0 -1
  533. package/dist/chunk-QWW3E3JM.cjs +0 -178
  534. package/dist/chunk-QWW3E3JM.cjs.map +0 -1
  535. package/dist/chunk-R7QYGZUP.cjs +0 -1075
  536. package/dist/chunk-R7QYGZUP.cjs.map +0 -1
  537. package/dist/chunk-RUPKBKUF.js +0 -352
  538. package/dist/chunk-RUPKBKUF.js.map +0 -1
  539. package/dist/chunk-SEO6NAQT.js +0 -14
  540. package/dist/chunk-SEO6NAQT.js.map +0 -1
  541. package/dist/chunk-T4B5LB6E.cjs +0 -66
  542. package/dist/chunk-T4B5LB6E.cjs.map +0 -1
  543. package/dist/chunk-TC5ZPWM4.cjs +0 -289
  544. package/dist/chunk-TC5ZPWM4.cjs.map +0 -1
  545. package/dist/chunk-TQ5UWA7S.js +0 -26
  546. package/dist/chunk-TQ5UWA7S.js.map +0 -1
  547. package/dist/chunk-URHPSJW2.js +0 -339
  548. package/dist/chunk-URHPSJW2.js.map +0 -1
  549. package/dist/chunk-UY3UYPBZ.cjs +0 -77
  550. package/dist/chunk-UY3UYPBZ.cjs.map +0 -1
  551. package/dist/chunk-VG2ABKJX.cjs +0 -100
  552. package/dist/chunk-VG2ABKJX.cjs.map +0 -1
  553. package/dist/chunk-VH77IPJN.cjs +0 -358
  554. package/dist/chunk-VH77IPJN.cjs.map +0 -1
  555. package/dist/chunk-VQTCQKHQ.cjs +0 -17
  556. package/dist/chunk-VQTCQKHQ.cjs.map +0 -1
  557. package/dist/chunk-WGWSHJ2N.js +0 -38
  558. package/dist/chunk-WGWSHJ2N.js.map +0 -1
  559. package/dist/chunk-WJH6IYU2.cjs +0 -32
  560. package/dist/chunk-WJH6IYU2.cjs.map +0 -1
  561. package/dist/chunk-YREV3LGG.cjs +0 -61
  562. package/dist/chunk-YREV3LGG.cjs.map +0 -1
  563. package/dist/chunk-YTXEZ4SD.cjs +0 -77
  564. package/dist/chunk-YTXEZ4SD.cjs.map +0 -1
  565. package/dist/chunk-YWCESU4Y.js +0 -1233
  566. package/dist/chunk-YWCESU4Y.js.map +0 -1
  567. package/dist/chunk-Z6HRSM2Y.cjs +0 -799
  568. package/dist/chunk-Z6HRSM2Y.cjs.map +0 -1
  569. package/dist/chunk-Z7PW3KHL.cjs +0 -1198
  570. package/dist/chunk-Z7PW3KHL.cjs.map +0 -1
  571. package/dist/chunk-ZNMBW67B.cjs +0 -40
  572. package/dist/chunk-ZNMBW67B.cjs.map +0 -1
  573. package/dist/correlation-id.cjs.map +0 -1
  574. package/dist/correlation-id.js.map +0 -1
  575. package/dist/event-subscriber.cjs.map +0 -1
  576. package/dist/event-subscriber.js.map +0 -1
  577. package/dist/event.cjs.map +0 -1
  578. package/dist/event.js.map +0 -1
  579. package/dist/exporters.cjs.map +0 -1
  580. package/dist/exporters.js.map +0 -1
  581. package/dist/functional.cjs.map +0 -1
  582. package/dist/functional.js.map +0 -1
  583. package/dist/init-DIowiiCh.d.ts +0 -1167
  584. package/dist/init-j-A1zI16.d.cts +0 -1167
  585. package/dist/processors.cjs.map +0 -1
  586. package/dist/processors.js.map +0 -1
  587. package/dist/trace-context-DbGKd1Rn.d.cts +0 -213
  588. package/dist/trace-context-DbGKd1Rn.d.ts +0 -213
  589. package/dist/utils-BahBCFtJ.d.cts +0 -712
  590. package/dist/utils-CLKwaUlG.d.ts +0 -712
  591. package/dist/yaml-config.cjs.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/circuit-breaker.ts","../src/events-config.ts","../src/event.ts"],"names":["getConfig","trace","getOperationContext","getEventsConfig","getOrCreateCorrelationId","context","propagation","getValidationConfig","validateEvent","getLogger"],"mappings":"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","file":"chunk-GBFTC7Q7.cjs","sourcesContent":["/**\n * Circuit breaker for event subscribers\n *\n * Prevents cascading failures by fast-failing when an (subscriber) is unhealthy.\n * Uses the circuit breaker pattern with three states:\n * - CLOSED: Normal operation ((subscriber) working)\n * - OPEN: Fast-fail mode ((subscriber) down)\n * - HALF_OPEN: Testing if (subscriber) recovered\n */\n\nexport interface CircuitBreakerConfig {\n /** Number of failures before opening circuit (default: 5) */\n failureThreshold: number;\n /** Time to wait before trying again in ms (default: 30000 = 30s) */\n resetTimeout: number;\n /** Time window for counting failures in ms (default: 60000 = 1min) */\n windowSize: number;\n}\n\nconst DEFAULT_CONFIG: CircuitBreakerConfig = {\n failureThreshold: 5,\n resetTimeout: 30_000, // 30 seconds\n windowSize: 60_000, // 1 minute\n};\n\nexport type CircuitState = 'CLOSED' | 'OPEN' | 'HALF_OPEN';\n\nexport const CircuitState = {\n CLOSED: 'CLOSED' as const, // Normal operation\n OPEN: 'OPEN' as const, // Fast-fail mode\n HALF_OPEN: 'HALF_OPEN' as const, // Testing recovery\n} as const;\n\ninterface FailureRecord {\n timestamp: number;\n error: string;\n}\n\n/**\n * Circuit breaker implementation\n *\n * Tracks failures and automatically opens the circuit to prevent\n * overwhelming failing subscribers.\n */\nexport class CircuitBreaker {\n private state: CircuitState = CircuitState.CLOSED;\n private failures: FailureRecord[] = [];\n private lastFailureTime: number = 0;\n private readonly config: CircuitBreakerConfig;\n private readonly name: string;\n\n constructor(name: string, config?: Partial<CircuitBreakerConfig>) {\n this.name = name;\n this.config = { ...DEFAULT_CONFIG, ...config };\n }\n\n /**\n * Execute a function with circuit breaker protection\n * Throws CircuitOpenError if circuit is open\n */\n async execute<T>(fn: () => Promise<T>): Promise<T> {\n // Check if circuit is open\n if (this.state === CircuitState.OPEN) {\n // Check if we should transition to half-open\n const now = Date.now();\n if (now - this.lastFailureTime >= this.config.resetTimeout) {\n this.state = CircuitState.HALF_OPEN;\n } else {\n throw new CircuitOpenError(\n `Circuit breaker is OPEN for ${this.name}. ` +\n `Will retry in ${Math.ceil((this.config.resetTimeout - (now - this.lastFailureTime)) / 1000)}s`,\n );\n }\n }\n\n try {\n const result = await fn();\n\n // Success! Close circuit if it was half-open\n if (this.state === CircuitState.HALF_OPEN) {\n this.reset();\n }\n\n return result;\n } catch (error) {\n this.recordFailure(error);\n throw error;\n }\n }\n\n /**\n * Record a failure and potentially open the circuit\n */\n private recordFailure(error: unknown): void {\n const now = Date.now();\n\n // Remove old failures outside the time window\n this.failures = this.failures.filter(\n (f) => now - f.timestamp < this.config.windowSize,\n );\n\n // Record new failure\n this.failures.push({\n timestamp: now,\n error: error instanceof Error ? error.message : String(error),\n });\n\n this.lastFailureTime = now;\n\n // Check if we should open the circuit\n if (this.failures.length >= this.config.failureThreshold) {\n if (this.state === CircuitState.HALF_OPEN) {\n // Failed during test - reopen circuit\n this.state = CircuitState.OPEN;\n } else if (this.state === CircuitState.CLOSED) {\n // Too many failures - open circuit\n this.state = CircuitState.OPEN;\n }\n }\n }\n\n /**\n * Reset the circuit breaker (on success)\n */\n private reset(): void {\n this.state = CircuitState.CLOSED;\n this.failures = [];\n this.lastFailureTime = 0;\n }\n\n /**\n * Get current state (for monitoring)\n */\n getState(): CircuitState {\n return this.state;\n }\n\n /**\n * Get failure count in current window\n */\n getFailureCount(): number {\n const now = Date.now();\n // Clean up old failures\n this.failures = this.failures.filter(\n (f) => now - f.timestamp < this.config.windowSize,\n );\n return this.failures.length;\n }\n\n /**\n * Get recent failures (for debugging)\n */\n getRecentFailures(): FailureRecord[] {\n const now = Date.now();\n return this.failures.filter(\n (f) => now - f.timestamp < this.config.windowSize,\n );\n }\n\n /**\n * Manually reset the circuit breaker (for testing or manual intervention)\n */\n forceReset(): void {\n this.reset();\n }\n\n /**\n * Manually open the circuit (for testing or manual intervention)\n */\n forceOpen(): void {\n this.state = CircuitState.OPEN;\n this.lastFailureTime = Date.now();\n }\n}\n\n/**\n * Error thrown when circuit is open\n */\nexport class CircuitOpenError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'CircuitOpenError';\n }\n}\n","/**\n * Events configuration types for trace context, correlation IDs, and enrichment\n *\n * @example Basic usage\n * ```typescript\n * import { init } from 'autotel';\n *\n * init({\n * service: 'my-app',\n * events: {\n * includeTraceContext: true,\n * traceUrl: (ctx) => `https://grafana.internal/explore?traceId=${ctx.traceId}`\n * }\n * });\n * ```\n */\n\n/**\n * Context passed to the traceUrl function for generating clickable trace URLs\n */\nexport interface TraceUrlContext {\n /** Trace ID (32 hex chars) - may be undefined outside a trace */\n traceId?: string;\n /** Span ID (16 hex chars) - may be undefined outside a trace */\n spanId?: string;\n /** Correlation ID (always present, 16 hex chars) */\n correlationId: string;\n /** Service name from init config */\n serviceName: string;\n /** Environment from init config */\n environment?: string;\n}\n\n/**\n * Per-key transform options for baggage enrichment\n */\nexport type BaggageTransform = 'plain' | 'hash' | ((value: string) => string);\n\n/**\n * Baggage enrichment configuration with guardrails\n */\nexport interface EnrichFromBaggageConfig {\n /**\n * Allowlist of baggage keys to include in events\n * Supports exact matches and patterns (e.g., 'tenant.*')\n */\n allow: string[];\n\n /**\n * Optional denylist of baggage keys to exclude\n * Takes precedence over allow list\n */\n deny?: string[];\n\n /**\n * Optional prefix to add to all enriched keys\n * @example 'ctx.' results in 'ctx.tenant.id'\n */\n prefix?: string;\n\n /**\n * Maximum number of keys to include (default: 10)\n * Prevents payload bloat from excessive baggage\n */\n maxKeys?: number;\n\n /**\n * Maximum total bytes for enriched values (default: 1024)\n * Prevents payload bloat from large baggage values\n */\n maxBytes?: number;\n\n /**\n * Per-key transform options\n * - 'plain': Include value as-is\n * - 'hash': Hash the value (for PII protection)\n * - function: Custom transform function\n *\n * @example\n * ```typescript\n * transform: {\n * 'user.id': 'hash', // Hash user ID for privacy\n * 'tenant.id': 'plain', // Include tenant ID as-is\n * 'session.id': (v) => v.slice(0, 8) // Custom truncation\n * }\n * ```\n */\n transform?: Record<string, BaggageTransform>;\n}\n\n/**\n * Events configuration for trace context and enrichment\n */\nexport interface EventsConfig {\n /**\n * Include trace context in events (default: false)\n *\n * When enabled, events automatically include:\n * - autotel.trace_id (32 hex chars)\n * - autotel.span_id (16 hex chars)\n * - autotel.trace_flags (2 hex chars)\n * - autotel.trace_state (raw tracestate string, if present)\n * - autotel.correlation_id (always present, 16 hex chars)\n *\n * Subscribers map these to platform-specific names:\n * - PostHog: $trace_id, $span_id\n * - Mixpanel: trace_id, span_id\n */\n includeTraceContext?: boolean;\n\n /**\n * Include full array of linked trace IDs for batch/fan-in scenarios (default: false)\n *\n * When false (default), batch/fan-in events include:\n * - autotel.linked_trace_id_count: Number of linked parents\n * - autotel.linked_trace_id_hash: Stable hash of sorted IDs (keeps payload lean)\n *\n * When true, events also include:\n * - autotel.linked_trace_ids: Full array of linked trace IDs\n */\n includeLinkedTraceIds?: boolean;\n\n /**\n * Generate clickable trace URL from context\n *\n * @param ctx - Trace context with traceId, spanId, correlationId, serviceName, environment\n * @returns URL string or undefined to skip\n *\n * @example Grafana Tempo\n * ```typescript\n * traceUrl: (ctx) => ctx.traceId\n * ? `https://grafana.internal/explore?traceId=${ctx.traceId}`\n * : undefined\n * ```\n *\n * @example Datadog\n * ```typescript\n * traceUrl: (ctx) => ctx.traceId\n * ? `https://app.datadoghq.com/apm/traces?traceId=${ctx.traceId}`\n * : undefined\n * ```\n *\n * @example Jaeger\n * ```typescript\n * traceUrl: (ctx) => ctx.traceId\n * ? `https://jaeger.internal/trace/${ctx.traceId}`\n * : undefined\n * ```\n */\n traceUrl?: (ctx: TraceUrlContext) => string | undefined;\n\n /**\n * Auto-enrich events from baggage with guardrails\n *\n * Automatically includes baggage entries in events without manual code.\n * Apply allow/deny lists and per-key transforms for PII protection.\n *\n * @example Basic allowlist\n * ```typescript\n * enrichFromBaggage: {\n * allow: ['tenant.id', 'user.id', 'request.id']\n * }\n * // Events include: tenant.id, user.id, request.id from baggage\n * ```\n *\n * @example With prefix and transforms\n * ```typescript\n * enrichFromBaggage: {\n * allow: ['tenant.id', 'user.id', 'user.email'],\n * deny: ['user.ssn'],\n * prefix: 'ctx.',\n * transform: {\n * 'user.id': 'hash',\n * 'user.email': 'hash'\n * }\n * }\n * // Events include: ctx.tenant.id, ctx.user.id (hashed), ctx.user.email (hashed)\n * ```\n */\n enrichFromBaggage?: EnrichFromBaggageConfig;\n}\n\n/**\n * Autotel context object attached to event envelopes\n *\n * This structured object is attached to events and subscribers\n * decide how to map/flatten for their platform.\n */\nexport interface AutotelEventContext {\n /** Trace ID (32 hex chars) - present when inside a trace */\n trace_id?: string;\n /** Span ID (16 hex chars) - present when inside a span */\n span_id?: string;\n /** Trace flags (2 hex chars, e.g., '01' for sampled) */\n trace_flags?: string;\n /** Raw tracestate string - present if tracestate exists */\n trace_state?: string;\n /** Clickable trace URL - present if traceUrl config is set */\n trace_url?: string;\n /** Correlation ID (always present, 16 hex chars) */\n correlation_id: string;\n /** Number of linked parent traces (batch/fan-in scenarios) */\n linked_trace_id_count?: number;\n /** Stable hash of linked trace IDs (default for batch/fan-in) */\n linked_trace_id_hash?: string;\n /** Full array of linked trace IDs (only if includeLinkedTraceIds: true) */\n linked_trace_ids?: string[];\n}\n\n/**\n * Hash a string value for PII protection\n *\n * Uses a simple, fast hash function suitable for correlation.\n * NOT cryptographically secure - use for PII masking, not security.\n */\nexport function hashValue(value: string): string {\n let hash = 0;\n for (let i = 0; i < value.length; i++) {\n const char = value.charCodeAt(i);\n hash = (hash << 5) - hash + char;\n hash = hash & hash; // Convert to 32-bit integer\n }\n // Convert to positive hex string\n return (hash >>> 0).toString(16).padStart(8, '0');\n}\n\n/**\n * Create a stable hash of an array of trace IDs\n *\n * Sorts the array first to ensure deterministic output regardless of order.\n */\nexport function hashLinkedTraceIds(traceIds: string[]): string {\n const sorted = [...traceIds].sort();\n return hashValue(sorted.join(','));\n}\n","/**\n * Events API for product events platforms\n *\n * Track user behavior, business events, and critical actions.\n * Sends to product events platforms (PostHog, Mixpanel, Amplitude) via subscribers.\n * For business people who think in events/funnels.\n *\n * For OpenTelemetry metrics (Prometheus/Grafana), use the Metrics class instead.\n *\n * @example Recommended: Configure subscribers in init(), use track() function\n * ```typescript\n * import { init, track } from 'autotel';\n * import { PostHogSubscriber } from 'autotel-subscribers/posthog';\n *\n * init({\n * service: 'my-app',\n * subscribers: [new PostHogSubscriber({ apiKey: 'phc_...' })]\n * });\n *\n * // Track events - uses subscribers from init()\n * track('application.submitted', { jobId: '123', userId: '456' });\n * ```\n *\n * @example Create Event instance (inherits subscribers from init)\n * ```typescript\n * import { Event } from 'autotel/event';\n *\n * // Uses subscribers configured in init()\n * const event = new Event('job-application');\n * event.trackEvent('application.submitted', { jobId: '123' });\n * ```\n *\n * @example Override subscribers for specific Event instance\n * ```typescript\n * import { Event } from 'autotel/event';\n * import { PostHogSubscriber } from 'autotel-subscribers/posthog';\n *\n * // Override: use different subscribers for this instance\n * const event = new Event('job-application', {\n * subscribers: [new PostHogSubscriber({ apiKey: 'phc_different_project' })]\n * });\n *\n * event.trackEvent('application.submitted', { jobId: '123' });\n * ```\n */\n\nimport { trace, propagation, context, TraceFlags } from '@opentelemetry/api';\nimport { type Logger } from './logger';\nimport {\n getLogger,\n getValidationConfig,\n getConfig,\n getEventsConfig,\n} from './init';\nimport {\n type EventSubscriber,\n type EventAttributes,\n type EventAttributesInput,\n type FunnelStatus,\n type OutcomeStatus,\n type AutotelEventContext,\n} from './event-subscriber';\nimport { type EventCollector } from './event-testing';\nimport { CircuitBreaker, CircuitOpenError } from './circuit-breaker';\nimport { validateEvent } from './validation';\nimport { getOperationContext } from './operation-context';\nimport {\n type EnrichFromBaggageConfig,\n hashValue,\n hashLinkedTraceIds,\n} from './events-config';\nimport { getOrCreateCorrelationId } from './correlation-id';\n\n// Re-export types for convenience\nexport type {\n EventAttributes,\n EventAttributesInput,\n FunnelStatus,\n OutcomeStatus,\n} from './event-subscriber';\n\n/**\n * Events class for tracking user behavior and product events\n *\n * Track critical indicators such as:\n * - User events (signups, purchases, feature usage)\n * - Conversion funnels (signup → activation → purchase)\n * - Business outcomes (success/failure rates)\n * - Product metrics (revenue, engagement, retention)\n *\n * All events are sent to events platforms via subscribers (PostHog, Mixpanel, etc.).\n * For OpenTelemetry metrics, use the Metrics class instead.\n */\n/**\n * Events options\n */\nexport interface EventsOptions {\n /** Optional logger for audit trail */\n logger?: Logger;\n /** Optional collector for testing (captures events in memory) */\n collector?: EventCollector;\n /**\n * Optional subscribers to send events to other platforms\n * (e.g., PostHog, Mixpanel, Amplitude)\n *\n * **Subscriber Resolution**:\n * - If provided → uses these subscribers (instance override)\n * - If not provided → falls back to subscribers from `init()` (global config)\n * - If neither → no subscribers (events logged only)\n *\n * Install `autotel-subscribers` package for ready-made subscribers\n */\n subscribers?: EventSubscriber[];\n}\n\nexport class Event {\n private serviceName: string;\n private logger?: Logger;\n private collector?: EventCollector;\n private subscribers: EventSubscriber[];\n private hasSubscribers: boolean; // Cached for performance\n private circuitBreakers: Map<EventSubscriber, CircuitBreaker>; // One per subscriber\n\n /**\n * Create a new Event instance\n *\n * **Note**: Most users should use `init()` + `track()` instead of creating Event instances directly.\n *\n * **Subscriber Resolution**:\n * - If `subscribers` provided in options → uses those (instance override)\n * - If `subscribers` not provided → falls back to subscribers from `init()` (global config)\n * - If neither → no subscribers (events logged only)\n *\n * @param serviceName - Service name for identifying events\n * @param options - Optional configuration (logger, collector, subscribers)\n *\n * @example Recommended: Use track() with init()\n * ```typescript\n * import { init, track } from 'autotel';\n * import { PostHogSubscriber } from 'autotel-subscribers/posthog';\n *\n * init({\n * service: 'checkout',\n * subscribers: [new PostHogSubscriber({ apiKey: 'phc_...' })]\n * });\n *\n * track('purchase.completed', { amount: 99.99 });\n * ```\n *\n * @example Inherit subscribers from init()\n * ```typescript\n * // Uses subscribers configured in init()\n * const event = new Event('checkout');\n * event.trackEvent('purchase.completed', { amount: 99.99 });\n * ```\n *\n * @example Override subscribers for this instance\n * ```typescript\n * import { Event } from 'autotel/event';\n * import { PostHogSubscriber } from 'autotel-subscribers/posthog';\n *\n * // Override: use different subscribers for this instance only\n * const event = new Event('checkout', {\n * subscribers: [new PostHogSubscriber({ apiKey: 'phc_different_project' })]\n * });\n * ```\n */\n constructor(serviceName: string, options: EventsOptions = {}) {\n this.serviceName = serviceName;\n this.logger = options.logger;\n this.collector = options.collector;\n\n // Subscriber resolution: instance-level overrides global init() config\n // If subscribers provided to constructor, use those\n // Otherwise, fall back to subscribers from init()\n this.subscribers =\n options.subscribers === undefined\n ? getConfig()?.subscribers || []\n : options.subscribers;\n\n this.hasSubscribers = this.subscribers.length > 0; // Cache for hot path\n\n // Create circuit breaker for each subscriber\n this.circuitBreakers = new Map();\n for (const subscriber of this.subscribers) {\n const subscriberName = subscriber.name || 'Unknown';\n this.circuitBreakers.set(\n subscriber,\n new CircuitBreaker(subscriberName, {\n failureThreshold: 5,\n resetTimeout: 30_000, // 30s\n windowSize: 60_000, // 1min\n }),\n );\n }\n }\n\n /**\n * Automatically enrich attributes with all available telemetry context\n *\n * Auto-captures:\n * - Resource attributes: service.version, deployment.environment\n * - Trace context: traceId, spanId, correlationId\n * - Operation context: operation.name\n */\n private enrichWithTelemetryContext(\n attributes: EventAttributes = {},\n ): EventAttributes {\n const enriched: EventAttributes = {\n service: this.serviceName,\n ...attributes,\n };\n\n // 1. Resource attributes (service-level context)\n const config = getConfig();\n if (config) {\n if (config.version) {\n enriched['service.version'] = config.version;\n }\n if (config.environment) {\n enriched['deployment.environment'] = config.environment;\n }\n }\n\n // 2. Trace context (if inside a traced operation)\n const span = trace.getActiveSpan();\n const spanContext = span?.spanContext();\n if (spanContext) {\n enriched.traceId = spanContext.traceId;\n enriched.spanId = spanContext.spanId;\n // Add correlation ID (first 16 chars of trace ID) for easier log grouping\n enriched.correlationId = spanContext.traceId.slice(0, 16);\n }\n\n // 3. Operation context (if inside a trace/span)\n const operationContext = getOperationContext();\n if (operationContext) {\n enriched['operation.name'] = operationContext.name;\n }\n\n return enriched;\n }\n\n /**\n * Build autotel event context for trace correlation\n *\n * Works in 4 contexts:\n * 1. Inside a span → use current span's trace_id + span_id\n * 2. Outside span but in AsyncLocalStorage context → use trace_id + correlation_id\n * 3. Totally standalone → use correlation_id + service/env/version\n * 4. Batch/fan-in (multiple linked parents) → use count + hash or full array\n *\n * @returns AutotelEventContext or undefined if trace context is disabled\n */\n private buildAutotelContext(): AutotelEventContext | undefined {\n const eventsConfig = getEventsConfig();\n\n // Return undefined if trace context is not enabled\n if (!eventsConfig?.includeTraceContext) {\n // Still generate correlation_id even without full trace context\n // This provides a stable join key across events/logs/spans\n return {\n correlation_id: getOrCreateCorrelationId(),\n };\n }\n\n const config = getConfig();\n const span = trace.getActiveSpan();\n const spanContext = span?.spanContext();\n\n // Always generate a correlation_id\n const correlationId = getOrCreateCorrelationId();\n\n // Build base context\n const autotelContext: AutotelEventContext = {\n correlation_id: correlationId,\n };\n\n // Add trace context if inside a span\n if (spanContext) {\n autotelContext.trace_id = spanContext.traceId;\n autotelContext.span_id = spanContext.spanId;\n\n // Trace flags as 2-char hex string (canonical format)\n autotelContext.trace_flags = spanContext.traceFlags\n .toString(16)\n .padStart(2, '0');\n\n // Tracestate if present\n const traceState = spanContext.traceState;\n if (traceState) {\n // Convert TraceState to string representation safely\n let traceStateStr = '';\n try {\n if (typeof traceState.serialize === 'function') {\n traceStateStr = traceState.serialize();\n }\n } catch {\n // Silently ignore serialization errors - traceState is optional metadata\n }\n if (traceStateStr) {\n autotelContext.trace_state = traceStateStr;\n }\n }\n\n // Generate trace URL if configured\n if (eventsConfig.traceUrl) {\n const traceUrl = eventsConfig.traceUrl({\n traceId: spanContext.traceId,\n spanId: spanContext.spanId,\n correlationId,\n serviceName: config?.service || this.serviceName,\n environment: config?.environment,\n });\n if (traceUrl) {\n autotelContext.trace_url = traceUrl;\n }\n }\n\n // Handle linked spans (batch/fan-in scenarios)\n // Note: This would require access to span links which are not easily accessible\n // from the public OpenTelemetry API. For now, we skip this unless we have\n // explicit linked trace IDs passed in.\n } else {\n // Outside span but may still have trace URL generator\n if (eventsConfig.traceUrl && config) {\n const traceUrl = eventsConfig.traceUrl({\n correlationId,\n serviceName: config.service,\n environment: config.environment,\n });\n if (traceUrl) {\n autotelContext.trace_url = traceUrl;\n }\n }\n }\n\n return autotelContext;\n }\n\n /**\n * Enrich event attributes from baggage with guardrails\n *\n * @param attributes - Current event attributes\n * @returns Enriched attributes with baggage values\n */\n private enrichFromBaggage(attributes: EventAttributes): EventAttributes {\n const eventsConfig = getEventsConfig();\n const enrichConfig = eventsConfig?.enrichFromBaggage;\n\n if (!enrichConfig) {\n return attributes;\n }\n\n const enriched = { ...attributes };\n const activeContext = context.active();\n const baggage = propagation.getBaggage(activeContext);\n\n if (!baggage) {\n return enriched;\n }\n\n let keyCount = 0;\n let byteCount = 0;\n const maxKeys = enrichConfig.maxKeys ?? 10;\n const maxBytes = enrichConfig.maxBytes ?? 1024;\n const prefix = enrichConfig.prefix ?? '';\n\n // Get all baggage entries\n for (const [key, entry] of baggage.getAllEntries()) {\n // Check if key is allowed\n if (!this.isBaggageKeyAllowed(key, enrichConfig)) {\n continue;\n }\n\n // Check limits\n if (keyCount >= maxKeys) {\n break;\n }\n\n const value = entry.value;\n\n // Apply transform first so maxBytes is checked against transformed size (e.g. hash output)\n const transform = enrichConfig.transform?.[key];\n let transformedValue: string;\n\n if (transform === 'hash') {\n transformedValue = hashValue(value);\n } else if (transform === 'plain' || !transform) {\n transformedValue = value;\n } else if (typeof transform === 'function') {\n transformedValue = transform(value);\n } else {\n transformedValue = value;\n }\n\n const valueBytes = new TextEncoder().encode(transformedValue).length;\n\n if (byteCount + valueBytes > maxBytes) {\n continue; // Skip this entry if transformed value would exceed byte limit\n }\n\n // Add to enriched attributes with prefix\n const enrichedKey = `${prefix}${key}`;\n enriched[enrichedKey] = transformedValue;\n\n keyCount++;\n byteCount += valueBytes;\n }\n\n return enriched;\n }\n\n /**\n * Check if a baggage key is allowed based on config\n */\n private isBaggageKeyAllowed(\n key: string,\n config: EnrichFromBaggageConfig,\n ): boolean {\n // Check deny list first (takes precedence)\n if (config.deny) {\n for (const pattern of config.deny) {\n if (this.matchesBaggagePattern(key, pattern)) {\n return false;\n }\n }\n }\n\n // Check allow list\n for (const pattern of config.allow) {\n if (this.matchesBaggagePattern(key, pattern)) {\n return true;\n }\n }\n\n return false;\n }\n\n /**\n * Check if a key matches a baggage pattern\n * Supports exact matches and wildcard patterns (e.g., 'tenant.*')\n */\n private matchesBaggagePattern(key: string, pattern: string): boolean {\n if (pattern.endsWith('.*')) {\n const prefix = pattern.slice(0, -2);\n return key.startsWith(prefix + '.');\n }\n return key === pattern;\n }\n\n /**\n * Track a business event\n *\n * Use this for tracking user actions, business events, product usage:\n * - \"user.signup\"\n * - \"order.completed\"\n * - \"feature.used\"\n *\n * Events are sent to configured subscribers (PostHog, Mixpanel, etc.).\n *\n * @example\n * ```typescript\n * // Track user signup\n * events.trackEvent('user.signup', {\n * userId: '123',\n * plan: 'pro'\n * })\n *\n * // Track order\n * events.trackEvent('order.completed', {\n * orderId: 'ord_123',\n * amount: 99.99\n * })\n * ```\n */\n trackEvent(eventName: string, attributes?: EventAttributes): void {\n // Validate and sanitize input (with custom config if provided)\n const validationConfig = getValidationConfig();\n const validated = validateEvent(\n eventName,\n attributes,\n validationConfig || undefined,\n );\n\n // Auto-attach all available telemetry context\n const enrichedAttributes = this.enrichWithTelemetryContext(\n validated.attributes,\n );\n\n this.logger?.info(\n {\n event: validated.eventName,\n attributes: enrichedAttributes,\n },\n 'Event tracked',\n );\n\n // Record for testing\n this.collector?.recordEvent({\n event: validated.eventName,\n attributes: enrichedAttributes,\n service: this.serviceName,\n timestamp: Date.now(),\n });\n\n // Notify subscribers (zero overhead if no subscribers)\n // Run in background - don't block event recording\n if (this.hasSubscribers) {\n // Build autotel context for trace correlation\n const autotelContext = this.buildAutotelContext();\n\n // Enrich from baggage if configured\n const finalAttributes = this.enrichFromBaggage(enrichedAttributes);\n\n void this.notifySubscribers((subscriber) =>\n subscriber.trackEvent(validated.eventName, finalAttributes, {\n autotel: autotelContext,\n }),\n );\n }\n }\n\n /**\n * Notify all subscribers concurrently without blocking\n * Uses circuit breakers to protect against failing subscribers\n * Uses Promise.allSettled to prevent subscriber errors from affecting other subscribers\n */\n private async notifySubscribers(\n fn: (subscriber: EventSubscriber) => Promise<void>,\n ): Promise<void> {\n const promises = this.subscribers.map(async (subscriber) => {\n const circuitBreaker = this.circuitBreakers.get(subscriber);\n if (!circuitBreaker) return; // Should never happen\n\n try {\n // Execute with circuit breaker protection\n await circuitBreaker.execute(() => fn(subscriber));\n } catch (error) {\n // Handle circuit open errors (expected behavior when subscriber is down)\n if (error instanceof CircuitOpenError) {\n // Circuit is open - subscriber is down, log at warn level for visibility (same behavior in all environments)\n getLogger().warn(\n {\n subscriberName: subscriber.name || 'Unknown',\n },\n `[Events] ${error.message}`,\n );\n return;\n }\n\n // Log other subscriber errors but don't throw - event failures shouldn't break business logic\n getLogger().error(\n {\n err: error instanceof Error ? error : undefined,\n subscriberName: subscriber.name || 'Unknown',\n },\n `[Events] Subscriber ${subscriber.name || 'Unknown'} failed`,\n );\n }\n });\n\n // Wait for all subscribers (success or failure)\n await Promise.allSettled(promises);\n }\n\n /**\n * Track conversion funnel steps\n *\n * Monitor where users drop off in multi-step processes.\n *\n * @example\n * ```typescript\n * // Track signup funnel\n * events.trackFunnelStep('signup', 'started', { userId: '123' })\n * events.trackFunnelStep('signup', 'email_verified', { userId: '123' })\n * events.trackFunnelStep('signup', 'completed', { userId: '123' })\n *\n * // Track checkout flow\n * events.trackFunnelStep('checkout', 'started', { cartValue: 99.99 })\n * events.trackFunnelStep('checkout', 'payment_info', { cartValue: 99.99 })\n * events.trackFunnelStep('checkout', 'completed', { cartValue: 99.99 })\n * ```\n */\n trackFunnelStep(\n funnelName: string,\n status: FunnelStatus,\n attributes?: EventAttributes,\n ): void {\n // Auto-attach all available telemetry context\n const enrichedAttributes = this.enrichWithTelemetryContext(attributes);\n\n this.logger?.info(\n {\n funnel: funnelName,\n status,\n attributes: enrichedAttributes,\n },\n 'Funnel step tracked',\n );\n\n // Record for testing\n this.collector?.recordFunnelStep({\n funnel: funnelName,\n status,\n attributes: enrichedAttributes,\n service: this.serviceName,\n timestamp: Date.now(),\n });\n\n // Notify subscribers\n if (this.hasSubscribers) {\n const autotelContext = this.buildAutotelContext();\n const finalAttributes = this.enrichFromBaggage(enrichedAttributes);\n\n void this.notifySubscribers((subscriber) =>\n subscriber.trackFunnelStep(funnelName, status, finalAttributes, {\n autotel: autotelContext,\n }),\n );\n }\n }\n\n /**\n * Track outcomes (success/failure/partial)\n *\n * Monitor success rates of critical operations.\n *\n * @example\n * ```typescript\n * // Track email delivery\n * events.trackOutcome('email.delivery', 'success', {\n * recipientType: 'user',\n * emailType: 'welcome'\n * })\n *\n * events.trackOutcome('email.delivery', 'failure', {\n * recipientType: 'user',\n * errorCode: 'invalid_email'\n * })\n *\n * // Track payment processing\n * events.trackOutcome('payment.process', 'success', { amount: 99.99 })\n * events.trackOutcome('payment.process', 'failure', { error: 'insufficient_funds' })\n * ```\n */\n trackOutcome(\n operationName: string,\n status: OutcomeStatus,\n attributes?: EventAttributes,\n ): void {\n // Auto-attach all available telemetry context\n const enrichedAttributes = this.enrichWithTelemetryContext(attributes);\n\n this.logger?.info(\n {\n operation: operationName,\n status,\n attributes: enrichedAttributes,\n },\n 'Outcome tracked',\n );\n\n // Record for testing\n this.collector?.recordOutcome({\n operation: operationName,\n status,\n attributes: enrichedAttributes,\n service: this.serviceName,\n timestamp: Date.now(),\n });\n\n // Notify subscribers\n if (this.hasSubscribers) {\n const autotelContext = this.buildAutotelContext();\n const finalAttributes = this.enrichFromBaggage(enrichedAttributes);\n\n void this.notifySubscribers((subscriber) =>\n subscriber.trackOutcome(operationName, status, finalAttributes, {\n autotel: autotelContext,\n }),\n );\n }\n }\n\n /**\n * Track value metrics\n *\n * Record numerical values like revenue, transaction amounts,\n * item counts, processing times, engagement scores, etc.\n *\n * @example\n * ```typescript\n * // Track revenue\n * events.trackValue('order.revenue', 149.99, {\n * currency: 'USD',\n * productCategory: 'electronics'\n * })\n *\n * // Track items per cart\n * events.trackValue('cart.item_count', 5, {\n * userId: '123'\n * })\n *\n * // Track processing time\n * events.trackValue('api.response_time', 250, {\n * unit: 'ms',\n * endpoint: '/api/checkout'\n * })\n * ```\n */\n trackValue(\n metricName: string,\n value: number,\n attributes?: EventAttributes,\n ): void {\n // Auto-attach all available telemetry context\n const enrichedAttributes = this.enrichWithTelemetryContext({\n metric: metricName,\n ...attributes,\n });\n\n this.logger?.debug(\n {\n metric: metricName,\n value,\n attributes: enrichedAttributes,\n },\n 'Value tracked',\n );\n\n // Record for testing\n this.collector?.recordValue({\n metric: metricName,\n value,\n attributes: enrichedAttributes,\n service: this.serviceName,\n timestamp: Date.now(),\n });\n\n // Notify subscribers\n if (this.hasSubscribers) {\n const autotelContext = this.buildAutotelContext();\n const finalAttributes = this.enrichFromBaggage(enrichedAttributes);\n\n void this.notifySubscribers((subscriber) =>\n subscriber.trackValue(metricName, value, finalAttributes, {\n autotel: autotelContext,\n }),\n );\n }\n }\n\n /**\n * Flush all subscribers and wait for pending events\n *\n * Call this before shutdown to ensure all events are delivered.\n *\n * @example\n * ```typescript\n * const event =new Event('app', { subscribers: [...] });\n *\n * // Before shutdown\n * await events.flush();\n * ```\n */\n async flush(): Promise<void> {\n if (!this.hasSubscribers) return;\n\n const shutdownPromises = this.subscribers.map(async (subscriber) => {\n if (subscriber.shutdown) {\n try {\n await subscriber.shutdown();\n } catch (error) {\n getLogger().error(\n {\n err: error instanceof Error ? error : undefined,\n subscriberName: subscriber.name || 'Unknown',\n },\n `[Events] Failed to shutdown subscriber ${subscriber.name || 'Unknown'}`,\n );\n }\n }\n });\n\n await Promise.allSettled(shutdownPromises);\n }\n\n /**\n * Shutdown the Event instance and all subscribers\n *\n * Unlike `flush()`, this method:\n * - Shuts down all subscribers\n * - Prevents further event tracking (hasSubscribers becomes false)\n * - Should only be called once at application shutdown\n *\n * @example\n * ```typescript\n * // In Next.js API route with after()\n * import { after } from 'next/server';\n *\n * export async function POST(req: Request) {\n * const event = new Event('checkout', { subscribers: [...] });\n * event.trackEvent('order.completed', { orderId: '123' });\n *\n * after(async () => {\n * await event.shutdown();\n * });\n *\n * return Response.json({ success: true });\n * }\n * ```\n */\n async shutdown(): Promise<void> {\n if (!this.hasSubscribers) return;\n\n await Promise.allSettled(\n this.subscribers.map(async (subscriber) => {\n if (subscriber.shutdown) {\n try {\n await subscriber.shutdown();\n } catch (error) {\n getLogger().error(\n {\n err: error instanceof Error ? error : undefined,\n subscriberName: subscriber.name || 'Unknown',\n },\n `[Events] Failed to shutdown subscriber ${subscriber.name || 'Unknown'}`,\n );\n }\n }\n }),\n );\n\n // Prevent further tracking after shutdown\n this.hasSubscribers = false;\n }\n\n /**\n * Track funnel progression with custom step names\n *\n * Unlike trackFunnelStep which uses FunnelStatus enum values,\n * this method allows any string as the step name for flexible funnel tracking.\n *\n * @param funnelName - Name of the funnel (e.g., \"checkout\", \"onboarding\")\n * @param stepName - Custom step name (e.g., \"cart_viewed\", \"payment_entered\")\n * @param stepNumber - Optional numeric position in the funnel\n * @param attributes - Optional event attributes\n *\n * @example\n * ```typescript\n * // Track custom checkout steps\n * event.trackFunnelProgression('checkout', 'cart_viewed', 1);\n * event.trackFunnelProgression('checkout', 'shipping_selected', 2);\n * event.trackFunnelProgression('checkout', 'payment_entered', 3);\n * event.trackFunnelProgression('checkout', 'order_confirmed', 4);\n * ```\n */\n trackFunnelProgression(\n funnelName: string,\n stepName: string,\n stepNumber?: number,\n attributes?: EventAttributes,\n ): void {\n // Auto-attach all available telemetry context\n const enrichedAttributes = this.enrichWithTelemetryContext(attributes);\n\n this.logger?.info(\n {\n funnel: funnelName,\n stepName,\n stepNumber,\n attributes: enrichedAttributes,\n },\n 'Funnel progression tracked',\n );\n\n // Record for testing (as funnel step with custom name)\n this.collector?.recordFunnelStep({\n funnel: funnelName,\n status: stepName as FunnelStatus, // Cast for testing collector\n attributes: {\n ...enrichedAttributes,\n step_name: stepName,\n ...(stepNumber === undefined ? {} : { step_number: stepNumber }),\n },\n service: this.serviceName,\n timestamp: Date.now(),\n });\n\n // Notify subscribers that support trackFunnelProgression\n if (this.hasSubscribers) {\n const autotelContext = this.buildAutotelContext();\n const finalAttributes = this.enrichFromBaggage(enrichedAttributes);\n\n void this.notifySubscribers(async (subscriber) => {\n await (subscriber.trackFunnelProgression\n ? subscriber.trackFunnelProgression(\n funnelName,\n stepName,\n stepNumber,\n finalAttributes,\n { autotel: autotelContext },\n )\n : // Fall back to trackFunnelStep with step as custom name (cast)\n subscriber.trackFunnelStep(\n funnelName,\n stepName as FunnelStatus,\n {\n ...finalAttributes,\n step_name: stepName,\n ...(stepNumber === undefined\n ? {}\n : { step_number: stepNumber }),\n },\n { autotel: autotelContext },\n ));\n });\n }\n }\n\n /**\n * Track multiple events in a batch\n *\n * Useful for bulk event tracking with consistent timestamps.\n * Events are sent to subscribers individually but processed together.\n *\n * @param events - Array of events to track\n *\n * @example\n * ```typescript\n * event.trackBatch([\n * { name: 'item.viewed', attributes: { itemId: '1' } },\n * { name: 'item.viewed', attributes: { itemId: '2' } },\n * { name: 'cart.updated', attributes: { itemCount: 2 } },\n * ]);\n * ```\n */\n trackBatch(\n events: Array<{ name: string; attributes?: EventAttributesInput }>,\n ): void {\n // Filter attributes and track each event\n for (const event of events) {\n // Filter undefined/null values from attributes\n const filteredAttributes = event.attributes\n ? (Object.fromEntries(\n Object.entries(event.attributes).filter(\n ([, v]) => v !== undefined && v !== null,\n ),\n ) as EventAttributes)\n : undefined;\n\n this.trackEvent(event.name, filteredAttributes);\n }\n }\n}\n\n/**\n * Global events instances (singleton pattern)\n */\nconst eventsInstances = new Map<string, Event>();\n\n/**\n * Get or create an Events instance for a service\n *\n * @param serviceName - Service name for identifying events\n * @param logger - Optional logger\n * @returns Events instance\n *\n * @example\n * ```typescript\n * const event =getEvents('job-application')\n * events.trackEvent('application.submitted', { jobId: '123' })\n * ```\n */\nexport function getEvents(serviceName: string, logger?: Logger): Event {\n if (!eventsInstances.has(serviceName)) {\n eventsInstances.set(serviceName, new Event(serviceName, { logger }));\n }\n return eventsInstances.get(serviceName)!;\n}\n\n/**\n * Reset all events instances (mainly for testing)\n */\nexport function resetEvents(): void {\n eventsInstances.clear();\n}\n"]}
@@ -1,91 +0,0 @@
1
- // src/span-name-normalizer.ts
2
- var NORMALIZER_PATTERNS = {
3
- // Numeric IDs: /users/123 → /users/:id
4
- numericId: /\/\d+(?=\/|$)/g,
5
- // UUIDs: /users/550e8400-e29b-41d4-a716-446655440000 → /users/:uuid
6
- uuid: /\/[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}(?=\/|$)/gi,
7
- // Short UUIDs (without dashes): /users/550e8400e29b41d4a716446655440000 → /users/:uuid
8
- shortUuid: /\/[0-9a-f]{32}(?=\/|$)/gi,
9
- // MongoDB ObjectIds: /docs/507f1f77bcf86cd799439011 → /docs/:objectId
10
- objectId: /\/[0-9a-f]{24}(?=\/|$)/gi,
11
- // Hashes (6+ hex chars): /assets/abc123def.js → /assets/:hash.js
12
- hash: /\/[0-9a-f]{6,}(?=\.[a-z]+$)/gi,
13
- // ISO dates: /logs/2024-01-15 → /logs/:date
14
- isoDate: /\/\d{4}-\d{2}-\d{2}(?=\/|$)/g,
15
- // Timestamps: /events/1705334400 → /events/:timestamp
16
- timestamp: /\/1[0-9]{9}(?=\/|$)/g,
17
- // Email-like segments: /users/john@example.com → /users/:email
18
- email: /\/[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}(?=\/|$)/g
19
- };
20
- var NORMALIZER_PRESETS = {
21
- /**
22
- * REST API preset - normalizes common REST path patterns
23
- * Handles: numeric IDs, UUIDs, ObjectIds, dates, timestamps, emails
24
- */
25
- "rest-api": (name) => {
26
- return name.replaceAll(NORMALIZER_PATTERNS.uuid, "/:uuid").replaceAll(NORMALIZER_PATTERNS.shortUuid, "/:uuid").replaceAll(NORMALIZER_PATTERNS.objectId, "/:objectId").replaceAll(NORMALIZER_PATTERNS.isoDate, "/:date").replaceAll(NORMALIZER_PATTERNS.timestamp, "/:timestamp").replaceAll(NORMALIZER_PATTERNS.email, "/:email").replaceAll(NORMALIZER_PATTERNS.numericId, "/:id");
27
- },
28
- /**
29
- * GraphQL preset - normalizes GraphQL operation names and paths
30
- * Keeps query/mutation names but normalizes embedded IDs
31
- */
32
- graphql: (name) => {
33
- return name.replaceAll(NORMALIZER_PATTERNS.uuid, "/:uuid").replaceAll(NORMALIZER_PATTERNS.numericId, "/:id");
34
- },
35
- /**
36
- * Minimal preset - only normalizes numeric IDs and UUIDs
37
- */
38
- minimal: (name) => {
39
- return name.replaceAll(NORMALIZER_PATTERNS.uuid, "/:uuid").replaceAll(NORMALIZER_PATTERNS.numericId, "/:id");
40
- }
41
- };
42
- function resolveNormalizer(config) {
43
- if (typeof config === "function") {
44
- return config;
45
- }
46
- const preset = NORMALIZER_PRESETS[config];
47
- if (!preset) {
48
- throw new Error(
49
- `Unknown span name normalizer preset: "${config}". Available presets: ${Object.keys(NORMALIZER_PRESETS).join(", ")}`
50
- );
51
- }
52
- return preset;
53
- }
54
- var SpanNameNormalizingProcessor = class {
55
- wrappedProcessor;
56
- normalizer;
57
- constructor(wrappedProcessor, options) {
58
- this.wrappedProcessor = wrappedProcessor;
59
- this.normalizer = resolveNormalizer(options.normalizer);
60
- }
61
- /**
62
- * Normalize span name on start (when Span is mutable)
63
- */
64
- onStart(span, parentContext) {
65
- try {
66
- const originalName = span.name;
67
- const normalizedName = this.normalizer(originalName);
68
- if (normalizedName !== originalName) {
69
- span.updateName(normalizedName);
70
- }
71
- } catch {
72
- }
73
- this.wrappedProcessor.onStart(span, parentContext);
74
- }
75
- /**
76
- * Pass through onEnd unchanged
77
- */
78
- onEnd(span) {
79
- this.wrappedProcessor.onEnd(span);
80
- }
81
- forceFlush() {
82
- return this.wrappedProcessor.forceFlush();
83
- }
84
- shutdown() {
85
- return this.wrappedProcessor.shutdown();
86
- }
87
- };
88
-
89
- export { NORMALIZER_PATTERNS, NORMALIZER_PRESETS, SpanNameNormalizingProcessor };
90
- //# sourceMappingURL=chunk-GYR5K654.js.map
91
- //# sourceMappingURL=chunk-GYR5K654.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/span-name-normalizer.ts"],"names":[],"mappings":"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","file":"chunk-GYR5K654.js","sourcesContent":["/**\n * Span Name Normalizer\n *\n * Normalizes span names to reduce cardinality from dynamic path segments.\n * This is critical for observability backends that charge by unique span names\n * or have cardinality limits.\n *\n * @example Basic usage with custom function\n * ```typescript\n * init({\n * service: 'my-app',\n * spanNameNormalizer: (name) => {\n * return name.replace(/\\/[0-9]+/g, '/:id');\n * }\n * })\n * ```\n *\n * @example Using built-in preset\n * ```typescript\n * init({\n * service: 'my-app',\n * spanNameNormalizer: 'rest-api'\n * })\n * ```\n */\n\nimport type {\n SpanProcessor,\n ReadableSpan,\n} from '@opentelemetry/sdk-trace-base';\nimport type { Context } from '@opentelemetry/api';\nimport type { Span } from '@opentelemetry/sdk-trace-base';\n\n/**\n * Function to normalize a span name\n * @param name - The original span name\n * @returns The normalized span name\n */\nexport type SpanNameNormalizerFn = (name: string) => string;\n\n/**\n * Built-in normalizer preset names\n */\nexport type SpanNameNormalizerPreset = 'rest-api' | 'graphql' | 'minimal';\n\n/**\n * Normalizer config - either a function or a preset name\n */\nexport type SpanNameNormalizerConfig =\n | SpanNameNormalizerFn\n | SpanNameNormalizerPreset;\n\nexport interface SpanNameNormalizingProcessorOptions {\n /**\n * Normalizer function or preset name\n */\n normalizer: SpanNameNormalizerConfig;\n}\n\n/**\n * Built-in normalizer patterns\n */\nconst NORMALIZER_PATTERNS = {\n // Numeric IDs: /users/123 → /users/:id\n numericId: /\\/\\d+(?=\\/|$)/g,\n\n // UUIDs: /users/550e8400-e29b-41d4-a716-446655440000 → /users/:uuid\n uuid: /\\/[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}(?=\\/|$)/gi,\n\n // Short UUIDs (without dashes): /users/550e8400e29b41d4a716446655440000 → /users/:uuid\n shortUuid: /\\/[0-9a-f]{32}(?=\\/|$)/gi,\n\n // MongoDB ObjectIds: /docs/507f1f77bcf86cd799439011 → /docs/:objectId\n objectId: /\\/[0-9a-f]{24}(?=\\/|$)/gi,\n\n // Hashes (6+ hex chars): /assets/abc123def.js → /assets/:hash.js\n hash: /\\/[0-9a-f]{6,}(?=\\.[a-z]+$)/gi,\n\n // ISO dates: /logs/2024-01-15 → /logs/:date\n isoDate: /\\/\\d{4}-\\d{2}-\\d{2}(?=\\/|$)/g,\n\n // Timestamps: /events/1705334400 → /events/:timestamp\n timestamp: /\\/1[0-9]{9}(?=\\/|$)/g,\n\n // Email-like segments: /users/john@example.com → /users/:email\n email: /\\/[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}(?=\\/|$)/g,\n} as const;\n\n/**\n * Built-in normalizer presets\n */\nconst NORMALIZER_PRESETS: Record<\n SpanNameNormalizerPreset,\n SpanNameNormalizerFn\n> = {\n /**\n * REST API preset - normalizes common REST path patterns\n * Handles: numeric IDs, UUIDs, ObjectIds, dates, timestamps, emails\n */\n 'rest-api': (name: string): string => {\n return name\n .replaceAll(NORMALIZER_PATTERNS.uuid, '/:uuid')\n .replaceAll(NORMALIZER_PATTERNS.shortUuid, '/:uuid')\n .replaceAll(NORMALIZER_PATTERNS.objectId, '/:objectId')\n .replaceAll(NORMALIZER_PATTERNS.isoDate, '/:date')\n .replaceAll(NORMALIZER_PATTERNS.timestamp, '/:timestamp')\n .replaceAll(NORMALIZER_PATTERNS.email, '/:email')\n .replaceAll(NORMALIZER_PATTERNS.numericId, '/:id');\n },\n\n /**\n * GraphQL preset - normalizes GraphQL operation names and paths\n * Keeps query/mutation names but normalizes embedded IDs\n */\n graphql: (name: string): string => {\n // For GraphQL, normalize both path-style and embedded IDs\n return name\n .replaceAll(NORMALIZER_PATTERNS.uuid, '/:uuid')\n .replaceAll(NORMALIZER_PATTERNS.numericId, '/:id');\n },\n\n /**\n * Minimal preset - only normalizes numeric IDs and UUIDs\n */\n minimal: (name: string): string => {\n return name\n .replaceAll(NORMALIZER_PATTERNS.uuid, '/:uuid')\n .replaceAll(NORMALIZER_PATTERNS.numericId, '/:id');\n },\n};\n\n/**\n * Resolve normalizer config to a function\n */\nfunction resolveNormalizer(\n config: SpanNameNormalizerConfig,\n): SpanNameNormalizerFn {\n if (typeof config === 'function') {\n return config;\n }\n\n const preset = NORMALIZER_PRESETS[config];\n if (!preset) {\n throw new Error(\n `Unknown span name normalizer preset: \"${config}\". ` +\n `Available presets: ${Object.keys(NORMALIZER_PRESETS).join(', ')}`,\n );\n }\n\n return preset;\n}\n\n/**\n * Span processor that normalizes span names to reduce cardinality.\n *\n * Normalization happens in onStart() when we have access to the mutable Span.\n * This allows us to call span.updateName() before the span is finalized.\n *\n * Common use cases:\n * - REST APIs: /users/123/posts/456 → /users/:id/posts/:id\n * - UUIDs: /items/550e8400-e29b-41d4-a716-446655440000 → /items/:uuid\n * - Dates: /logs/2024-01-15 → /logs/:date\n */\nexport class SpanNameNormalizingProcessor implements SpanProcessor {\n private readonly wrappedProcessor: SpanProcessor;\n private readonly normalizer: SpanNameNormalizerFn;\n\n constructor(\n wrappedProcessor: SpanProcessor,\n options: SpanNameNormalizingProcessorOptions,\n ) {\n this.wrappedProcessor = wrappedProcessor;\n this.normalizer = resolveNormalizer(options.normalizer);\n }\n\n /**\n * Normalize span name on start (when Span is mutable)\n */\n onStart(span: Span, parentContext: Context): void {\n try {\n const originalName = span.name;\n const normalizedName = this.normalizer(originalName);\n\n if (normalizedName !== originalName) {\n span.updateName(normalizedName);\n }\n } catch {\n // If normalizer throws, keep original name (fail-open)\n }\n\n this.wrappedProcessor.onStart(span, parentContext);\n }\n\n /**\n * Pass through onEnd unchanged\n */\n onEnd(span: ReadableSpan): void {\n this.wrappedProcessor.onEnd(span);\n }\n\n forceFlush(): Promise<void> {\n return this.wrappedProcessor.forceFlush();\n }\n\n shutdown(): Promise<void> {\n return this.wrappedProcessor.shutdown();\n }\n}\n\n/**\n * Export built-in patterns for advanced users who want to compose their own normalizers\n */\nexport { NORMALIZER_PATTERNS, NORMALIZER_PRESETS };\n"]}
@@ -1,57 +0,0 @@
1
- import { trace } from '@opentelemetry/api';
2
-
3
- // src/tracer-provider.ts
4
- var AUTOTEL_GLOBAL_SYMBOL = /* @__PURE__ */ Symbol.for("autotel");
5
- function createState() {
6
- return {
7
- isolatedTracerProvider: null
8
- };
9
- }
10
- function getGlobalState() {
11
- const initialState = createState();
12
- try {
13
- const g = globalThis;
14
- if (typeof g !== "object" || g === null) {
15
- console.warn(
16
- "[autotel] globalThis is not available, using fallback state"
17
- );
18
- return initialState;
19
- }
20
- if (!g[AUTOTEL_GLOBAL_SYMBOL]) {
21
- Object.defineProperty(g, AUTOTEL_GLOBAL_SYMBOL, {
22
- value: initialState,
23
- writable: false,
24
- // Lock the slot (not the contents)
25
- configurable: false,
26
- enumerable: false
27
- });
28
- }
29
- return g[AUTOTEL_GLOBAL_SYMBOL];
30
- } catch (error) {
31
- if (error instanceof Error) {
32
- console.error(
33
- `[autotel] Failed to access global state: ${error.message}`
34
- );
35
- } else {
36
- console.error(
37
- `[autotel] Failed to access global state: ${String(error)}`
38
- );
39
- }
40
- return initialState;
41
- }
42
- }
43
- function setAutotelTracerProvider(provider) {
44
- getGlobalState().isolatedTracerProvider = provider;
45
- }
46
- function getAutotelTracerProvider() {
47
- const { isolatedTracerProvider } = getGlobalState();
48
- if (isolatedTracerProvider) return isolatedTracerProvider;
49
- return trace.getTracerProvider();
50
- }
51
- function getAutotelTracer(name = "autotel", version) {
52
- return getAutotelTracerProvider().getTracer(name, version);
53
- }
54
-
55
- export { getAutotelTracer, getAutotelTracerProvider, setAutotelTracerProvider };
56
- //# sourceMappingURL=chunk-HA2WBOGQ.js.map
57
- //# sourceMappingURL=chunk-HA2WBOGQ.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/tracer-provider.ts"],"names":[],"mappings":";;;AAqBA,IAAM,qBAAA,mBAAwB,MAAA,CAAO,GAAA,CAAI,SAAS,CAAA;AAYlD,SAAS,WAAA,GAAkC;AACzC,EAAA,OAAO;AAAA,IACL,sBAAA,EAAwB;AAAA,GAC1B;AACF;AAaA,SAAS,cAAA,GAAqC;AAC5C,EAAA,MAAM,eAAe,WAAA,EAAY;AAEjC,EAAA,IAAI;AACF,IAAA,MAAM,CAAA,GAAI,UAAA;AAEV,IAAA,IAAI,OAAO,CAAA,KAAM,QAAA,IAAY,CAAA,KAAM,IAAA,EAAM;AACvC,MAAA,OAAA,CAAQ,IAAA;AAAA,QACN;AAAA,OACF;AACA,MAAA,OAAO,YAAA;AAAA,IACT;AAEA,IAAA,IAAI,CAAC,CAAA,CAAE,qBAAqB,CAAA,EAAG;AAC7B,MAAA,MAAA,CAAO,cAAA,CAAe,GAAG,qBAAA,EAAuB;AAAA,QAC9C,KAAA,EAAO,YAAA;AAAA,QACP,QAAA,EAAU,KAAA;AAAA;AAAA,QACV,YAAA,EAAc,KAAA;AAAA,QACd,UAAA,EAAY;AAAA,OACb,CAAA;AAAA,IACH;AAEA,IAAA,OAAO,EAAE,qBAAqB,CAAA;AAAA,EAChC,SAAS,KAAA,EAAO;AACd,IAAA,IAAI,iBAAiB,KAAA,EAAO;AAC1B,MAAA,OAAA,CAAQ,KAAA;AAAA,QACN,CAAA,yCAAA,EAA4C,MAAM,OAAO,CAAA;AAAA,OAC3D;AAAA,IACF,CAAA,MAAO;AACL,MAAA,OAAA,CAAQ,KAAA;AAAA,QACN,CAAA,yCAAA,EAA4C,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,OAC3D;AAAA,IACF;AAEA,IAAA,OAAO,YAAA;AAAA,EACT;AACF;AA+FO,SAAS,yBACd,QAAA,EACM;AACN,EAAA,cAAA,GAAiB,sBAAA,GAAyB,QAAA;AAC5C;AAsCO,SAAS,wBAAA,GAA2C;AACzD,EAAA,MAAM,EAAE,sBAAA,EAAuB,GAAI,cAAA,EAAe;AAElD,EAAA,IAAI,wBAAwB,OAAO,sBAAA;AAEnC,EAAA,OAAO,MAAM,iBAAA,EAAkB;AACjC;AAkCO,SAAS,gBAAA,CAAiB,IAAA,GAAO,SAAA,EAAW,OAAA,EAAkB;AACnE,EAAA,OAAO,wBAAA,EAAyB,CAAE,SAAA,CAAU,IAAA,EAAM,OAAO,CAAA;AAC3D","file":"chunk-HA2WBOGQ.js","sourcesContent":["/**\n * Isolated tracer provider support for Autotel\n *\n * Allows Autotel to use a separate TracerProvider instance, avoiding conflicts\n * with other OpenTelemetry instrumentation in the application.\n *\n * **Use Case:** Library authors who want to use Autotel without interfering\n * with the application's global OpenTelemetry setup.\n *\n * **Limitation:** While this isolates span processing and export, OpenTelemetry\n * context (trace IDs, parent spans) is still shared globally. Spans created with\n * the isolated provider may inherit trace context from global spans.\n */\n\nimport { trace } from '@opentelemetry/api';\nimport type { TracerProvider } from '@opentelemetry/api';\n\n/**\n * Symbol for storing isolated tracer provider in global scope\n * Using Symbol.for() ensures the same symbol across module boundaries\n */\nconst AUTOTEL_GLOBAL_SYMBOL = Symbol.for('autotel');\n\n/**\n * Global state for Autotel\n */\ntype AutotelGlobalState = {\n isolatedTracerProvider: TracerProvider | null;\n};\n\n/**\n * Create initial state\n */\nfunction createState(): AutotelGlobalState {\n return {\n isolatedTracerProvider: null,\n };\n}\n\n/**\n * Extend globalThis to include our symbol\n */\ninterface GlobalThis {\n [AUTOTEL_GLOBAL_SYMBOL]?: AutotelGlobalState;\n}\n\n/**\n * Get the global state, creating it if it doesn't exist\n * Handles edge cases like missing globalThis\n */\nfunction getGlobalState(): AutotelGlobalState {\n const initialState = createState();\n\n try {\n const g = globalThis as typeof globalThis & GlobalThis;\n\n if (typeof g !== 'object' || g === null) {\n console.warn(\n '[autotel] globalThis is not available, using fallback state',\n );\n return initialState;\n }\n\n if (!g[AUTOTEL_GLOBAL_SYMBOL]) {\n Object.defineProperty(g, AUTOTEL_GLOBAL_SYMBOL, {\n value: initialState,\n writable: false, // Lock the slot (not the contents)\n configurable: false,\n enumerable: false,\n });\n }\n\n return g[AUTOTEL_GLOBAL_SYMBOL]!;\n } catch (error) {\n if (error instanceof Error) {\n console.error(\n `[autotel] Failed to access global state: ${error.message}`,\n );\n } else {\n console.error(\n `[autotel] Failed to access global state: ${String(error)}`,\n );\n }\n\n return initialState;\n }\n}\n\n/**\n * Sets an isolated TracerProvider for Autotel tracing operations.\n *\n * This allows Autotel to use its own TracerProvider instance, separate from\n * the global OpenTelemetry TracerProvider. This is useful for avoiding conflicts\n * with other OpenTelemetry instrumentation in the application.\n *\n * **Limitation: Span Context Sharing**\n *\n * While this function isolates span processing and export, it does NOT provide\n * complete trace isolation. OpenTelemetry context (trace IDs, parent spans) is\n * still shared between the global and isolated providers. This means:\n *\n * - Spans created with the isolated provider inherit trace IDs from global spans\n * - Spans created with the isolated provider inherit parent relationships from global spans\n * - This can result in spans from different providers being part of the same logical trace\n *\n * **Why this happens:**\n * OpenTelemetry uses a global context propagation mechanism that operates at the\n * JavaScript runtime level, independent of individual TracerProvider instances.\n * The context (containing trace ID, span ID) flows through async boundaries and\n * is inherited by all spans created within that context, regardless of which\n * TracerProvider creates them.\n *\n * **When to use this:**\n * - Library code that ships with embedded Autotel\n * - SDKs that want observability without requiring users to set up OpenTelemetry\n * - Applications that need separate span processing for different subsystems\n * - Testing scenarios where you want to isolate trace collection\n *\n * @param provider - The TracerProvider instance to use, or null to clear the isolated provider\n *\n * @example Library with embedded Autotel\n * ```typescript\n * import { NodeTracerProvider } from '@opentelemetry/sdk-trace-node'\n * import { BatchSpanProcessor } from '@opentelemetry/sdk-trace-base'\n * import { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-http'\n * import { setAutolem\n\netryTracerProvider } from 'autotel/tracer-provider'\n *\n * // Create provider with span processors in constructor\n * const exporter = new OTLPTraceExporter({\n * url: 'https://your-backend.com/v1/traces'\n * })\n *\n * const provider = new NodeTracerProvider()\n * provider.addSpanProcessor(new BatchSpanProcessor(exporter))\n *\n * // Set as Autotel's isolated provider (doesn't call provider.register())\n * setAutotelTracerProvider(provider)\n *\n * // Now all Autotel trace() calls use this provider\n * // But won't interfere with the application's global OpenTelemetry setup\n * ```\n *\n * @example Testing with isolated provider\n * ```typescript\n * import { NodeTracerProvider } from '@opentelemetry/sdk-trace-node'\n * import { InMemorySpanExporter } from '@opentelemetry/sdk-trace-base'\n * import { setAutotelTracerProvider } from 'autotel/tracer-provider'\n *\n * // Test setup\n * const exporter = new InMemorySpanExporter()\n * const provider = new NodeTracerProvider()\n * provider.addSpanProcessor(new SimpleSpanProcessor(exporter))\n *\n * setAutotelTracerProvider(provider)\n *\n * // Run tests...\n * const spans = exporter.getFinishedSpans()\n *\n * // Cleanup\n * setAutotelTracerProvider(null)\n * ```\n *\n * @example Multiple subsystems with different exporters\n * ```typescript\n * import { NodeTracerProvider } from '@opentelemetry/sdk-trace-node'\n * import { setAutotelTracerProvider } from 'autotel/tracer-provider'\n *\n * // Payment subsystem - send to payment team's backend\n * const paymentProvider = new NodeTracerProvider()\n * paymentProvider.addSpanProcessor(new BatchSpanProcessor(\n * new OTLPTraceExporter({ url: 'https://payment-team-backend.com/v1/traces' })\n * ))\n *\n * // In payment module initialization\n * setAutotelTracerProvider(paymentProvider)\n * ```\n *\n * @public\n */\nexport function setAutotelTracerProvider(\n provider: TracerProvider | null,\n): void {\n getGlobalState().isolatedTracerProvider = provider;\n}\n\n/**\n * Gets the TracerProvider for Autotel tracing operations.\n *\n * Returns the isolated TracerProvider if one has been set via setAutotelTracerProvider(),\n * otherwise falls back to the global OpenTelemetry TracerProvider.\n *\n * This function is used internally by Autotel's trace functions. Most users\n * will not need to call this directly.\n *\n * @returns The TracerProvider instance to use for Autotel tracing\n *\n * @example Getting the current provider\n * ```typescript\n * import { getAutotelTracerProvider } from 'autotel/tracer-provider'\n *\n * const provider = getAutotelTracerProvider()\n * const tracer = provider.getTracer('my-service', '1.0.0')\n * ```\n *\n * @example Checking if isolated provider is active\n * ```typescript\n * import { getAutotelTracerProvider, setAutotelTracerProvider } from 'autotel/tracer-provider'\n * import { trace } from '@opentelemetry/api'\n *\n * const currentProvider = getAutotelTracerProvider()\n * const globalProvider = trace.getTracerProvider()\n *\n * if (currentProvider === globalProvider) {\n * console.log('Using global provider')\n * } else {\n * console.log('Using isolated provider')\n * }\n * ```\n *\n * @public\n */\nexport function getAutotelTracerProvider(): TracerProvider {\n const { isolatedTracerProvider } = getGlobalState();\n\n if (isolatedTracerProvider) return isolatedTracerProvider;\n\n return trace.getTracerProvider();\n}\n\n/**\n * Gets the OpenTelemetry tracer instance for Autotel.\n *\n * This function returns a tracer specifically configured for Autotel\n * with the correct tracer name and version. Used internally by all\n * Autotel tracing functions to ensure consistent trace creation.\n *\n * Uses the isolated provider if set, otherwise uses the global provider.\n *\n * @param name - Tracer name (default: 'autotel')\n * @param version - Optional version string\n * @returns The Autotel OpenTelemetry tracer instance\n *\n * @example Basic usage\n * ```typescript\n * import { getAutotelTracer } from 'autotel/tracer-provider'\n *\n * const tracer = getAutotelTracer()\n * const span = tracer.startSpan('my-operation')\n * // ... use span\n * span.end()\n * ```\n *\n * @example Custom tracer name\n * ```typescript\n * import { getAutotelTracer } from 'autotel/tracer-provider'\n *\n * const tracer = getAutotelTracer('my-library', '2.1.0')\n * ```\n *\n * @public\n */\nexport function getAutotelTracer(name = 'autotel', version?: string) {\n return getAutotelTracerProvider().getTracer(name, version);\n}\n"]}
@@ -1,118 +0,0 @@
1
- import { requireModule } from './chunk-Q4EULJQY.js';
2
- import { trace, context, SpanStatusCode } from '@opentelemetry/api';
3
-
4
- var spanNameMap = /* @__PURE__ */ new WeakMap();
5
- function setSpanName(span, name) {
6
- spanNameMap.set(span, name);
7
- }
8
- function hexToDecimal(hex) {
9
- return BigInt("0x" + hex).toString(10);
10
- }
11
- function getTraceContext() {
12
- const span = trace.getActiveSpan();
13
- if (!span) return null;
14
- const spanContext = span.spanContext();
15
- const traceId = spanContext.traceId;
16
- const spanId = spanContext.spanId;
17
- const spanName = spanNameMap.get(span);
18
- const traceIdLower64 = traceId.slice(-16);
19
- const ddTraceId = hexToDecimal(traceIdLower64);
20
- const ddSpanId = hexToDecimal(spanId);
21
- return {
22
- traceId,
23
- spanId,
24
- correlationId: traceId.slice(0, 16),
25
- ...spanName && { "code.function": spanName },
26
- // Datadog-specific fields for log-trace correlation
27
- "dd.trace_id": ddTraceId,
28
- "dd.span_id": ddSpanId
29
- };
30
- }
31
- function enrichWithTraceContext(obj) {
32
- const context2 = getTraceContext();
33
- return context2 ? { ...obj, ...context2 } : obj;
34
- }
35
- function isTracing() {
36
- return trace.getActiveSpan() !== void 0;
37
- }
38
- function getTracer(name, version) {
39
- return trace.getTracer(name, version);
40
- }
41
- function getActiveSpan() {
42
- return trace.getActiveSpan();
43
- }
44
- function getActiveContext() {
45
- try {
46
- const { getActiveContextWithBaggage } = requireModule("./trace-context");
47
- return getActiveContextWithBaggage();
48
- } catch {
49
- return context.active();
50
- }
51
- }
52
- function runWithSpan(span, fn) {
53
- const ctx = trace.setSpan(context.active(), span);
54
- return context.with(ctx, fn);
55
- }
56
- function finalizeSpan(span, error) {
57
- if (error) {
58
- if (error instanceof Error) {
59
- span.recordException(error);
60
- } else {
61
- span.recordException(new Error(String(error)));
62
- }
63
- span.setStatus({ code: SpanStatusCode.ERROR });
64
- } else {
65
- span.setStatus({ code: SpanStatusCode.OK });
66
- }
67
- span.end();
68
- }
69
- async function createDeterministicTraceId(seed) {
70
- const encoder = new TextEncoder();
71
- const data = encoder.encode(seed);
72
- const hashBuffer = await crypto.subtle.digest("SHA-256", data);
73
- const hashArray = new Uint8Array(hashBuffer);
74
- return [...hashArray].map((byte) => byte.toString(16).padStart(2, "0")).join("").slice(0, 32);
75
- }
76
- function resolveTraceUrl(template, traceId) {
77
- const t = template ?? process.env.OTEL_TRACE_URL_TEMPLATE;
78
- if (!t) return void 0;
79
- return t.replace(/\{traceId\}/g, traceId);
80
- }
81
- function flattenMetadata(metadata, prefix = "metadata") {
82
- const flattened = {};
83
- const seen = /* @__PURE__ */ new WeakSet();
84
- function flatten(obj, currentPrefix) {
85
- for (const [key, value] of Object.entries(obj)) {
86
- if (value == null) continue;
87
- const attributeKey = `${currentPrefix}.${key}`;
88
- if (typeof value === "string") {
89
- flattened[attributeKey] = value;
90
- continue;
91
- }
92
- if (typeof value === "number" || typeof value === "boolean") {
93
- flattened[attributeKey] = String(value);
94
- continue;
95
- }
96
- if (typeof value === "object" && value !== null && value.constructor === Object) {
97
- if (seen.has(value)) {
98
- flattened[attributeKey] = "<circular-reference>";
99
- continue;
100
- }
101
- seen.add(value);
102
- flatten(value, attributeKey);
103
- continue;
104
- }
105
- try {
106
- flattened[attributeKey] = JSON.stringify(value);
107
- } catch {
108
- flattened[attributeKey] = "<serialization-failed>";
109
- }
110
- }
111
- }
112
- flatten(metadata, prefix);
113
- return flattened;
114
- }
115
-
116
- export { createDeterministicTraceId, enrichWithTraceContext, finalizeSpan, flattenMetadata, getActiveContext, getActiveSpan, getTraceContext, getTracer, isTracing, resolveTraceUrl, runWithSpan, setSpanName };
117
- //# sourceMappingURL=chunk-HT5JQKN2.js.map
118
- //# sourceMappingURL=chunk-HT5JQKN2.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/trace-helpers.ts"],"names":["context"],"mappings":"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","file":"chunk-HT5JQKN2.js","sourcesContent":["/**\n * Trace context helpers - Core primitives for trace correlation\n *\n * These are the building blocks that allow users to bring their own logger\n * (bunyan, log4js, custom, etc.) and add trace correlation.\n *\n * @example Using with bunyan\n * ```typescript\n * import bunyan from 'bunyan';\n * import { enrichWithTraceContext } from 'autotel/trace-helpers';\n *\n * const bunyanLogger = bunyan.createLogger({ name: 'myapp' });\n *\n * const logger = {\n * info: (msg: string, extra?: object) => {\n * bunyanLogger.info(enrichWithTraceContext(extra || {}), msg);\n * }\n * };\n * ```\n *\n * @example Using with log4js\n * ```typescript\n * import log4js from 'log4js';\n * import { getTraceContext } from 'autotel/trace-helpers';\n *\n * const log4jsLogger = log4js.getLogger();\n *\n * function logWithTrace(level: string, msg: string, extra?: object) {\n * const context = getTraceContext();\n * log4jsLogger[level](msg, { ...extra, ...context });\n * }\n * ```\n */\n\nimport { trace, context, SpanStatusCode } from '@opentelemetry/api';\nimport type { Span, Tracer, Context } from '@opentelemetry/api';\nimport { requireModule } from './node-require';\n\n/**\n * WeakMap to store span names for active spans\n * This allows us to retrieve the span name even though OpenTelemetry\n * doesn't expose it through the public API\n */\nconst spanNameMap = new WeakMap<Span, string>();\n\n/**\n * Store span name for a given span\n * Called internally when spans are created\n */\nexport function setSpanName(span: Span, name: string): void {\n spanNameMap.set(span, name);\n}\n\n/**\n * Trace context extracted from active span\n */\nexport interface TraceContext {\n /** Full 32-character hex trace ID */\n traceId: string;\n /** 16-character hex span ID */\n spanId: string;\n /** First 16 characters of trace ID (for log grouping/correlation) */\n correlationId: string;\n /** Function/operation name (OpenTelemetry semantic convention: code.function) */\n 'code.function'?: string;\n /** Datadog trace ID in decimal format (lower 64 bits) for log-trace correlation */\n 'dd.trace_id'?: string;\n /** Datadog span ID in decimal format for log-trace correlation */\n 'dd.span_id'?: string;\n}\n\n/**\n * Convert hex string to decimal string representation\n * Handles 64-bit unsigned integers for Datadog correlation\n *\n * @param hex - Hex string (up to 16 characters for 64-bit)\n * @returns Decimal string representation\n */\nfunction hexToDecimal(hex: string): string {\n // For 64-bit values, use BigInt to avoid precision loss\n return BigInt('0x' + hex).toString(10);\n}\n\n/**\n * Get current trace context from active span\n *\n * Returns null if no span is active (e.g., outside of trace operation)\n *\n * Includes both OpenTelemetry standard fields (hex) and Datadog-specific\n * fields (decimal) for maximum compatibility.\n *\n * @returns Trace context with traceId, spanId, correlationId, and Datadog decimal IDs, or null\n *\n * @example\n * ```typescript\n * import { getTraceContext } from 'autotel/trace-helpers';\n *\n * const context = getTraceContext();\n * if (context) {\n * console.log('Current trace:', context.traceId);\n * // Current trace: 4bf92f3577b34da6a3ce929d0e0e4736\n * console.log('Datadog trace ID:', context['dd.trace_id']);\n * // Datadog trace ID: 12007117331170166582 (decimal for log correlation)\n * }\n * ```\n */\nexport function getTraceContext(): TraceContext | null {\n const span = trace.getActiveSpan();\n if (!span) return null;\n\n const spanContext = span.spanContext();\n const traceId = spanContext.traceId;\n const spanId = spanContext.spanId;\n\n // Get span name from WeakMap (set when span is created)\n // Map to OpenTelemetry semantic convention: code.function\n const spanName = spanNameMap.get(span);\n\n // Datadog uses the lower 64 bits of the 128-bit OpenTelemetry trace ID\n // Convert from hex to decimal for Datadog's log-trace correlation\n const traceIdLower64 = traceId.slice(-16); // Last 16 hex chars = lower 64 bits\n const ddTraceId = hexToDecimal(traceIdLower64);\n const ddSpanId = hexToDecimal(spanId);\n\n return {\n traceId,\n spanId,\n correlationId: traceId.slice(0, 16),\n ...(spanName && { 'code.function': spanName }),\n // Datadog-specific fields for log-trace correlation\n 'dd.trace_id': ddTraceId,\n 'dd.span_id': ddSpanId,\n };\n}\n\n/**\n * Enrich object with trace context (traceId, spanId, correlationId, and Datadog fields)\n *\n * If no span is active, returns the object unchanged.\n * This prevents \"undefined\" or \"null\" values in logs.\n *\n * Automatically adds both OpenTelemetry standard fields (hex) and Datadog-specific\n * fields (decimal) for maximum compatibility with observability backends.\n *\n * @param obj - Object to enrich (e.g., log metadata)\n * @returns Object with trace context merged in, or unchanged if no active span\n *\n * @example\n * ```typescript\n * import { enrichWithTraceContext } from 'autotel/trace-helpers';\n *\n * // Inside a trace operation:\n * const enriched = enrichWithTraceContext({ userId: '123' });\n * // {\n * // userId: '123',\n * // traceId: '4bf92f3577b34da6a3ce929d0e0e4736',\n * // spanId: '00f067aa0ba902b7',\n * // correlationId: '4bf92f3577b34da6',\n * // 'dd.trace_id': '12007117331170166582', // Datadog decimal format\n * // 'dd.span_id': '67667974448284583' // Datadog decimal format\n * // }\n *\n * // Outside trace operation:\n * const unchanged = enrichWithTraceContext({ userId: '123' });\n * // { userId: '123' } - no trace fields added\n * ```\n */\nexport function enrichWithTraceContext<T extends Record<string, unknown>>(\n obj: T,\n): T {\n const context = getTraceContext();\n return context ? ({ ...obj, ...context } as T) : obj;\n}\n\n/**\n * Check if currently in a trace context\n *\n * Useful for conditional logic based on trace presence\n *\n * @returns true if active span exists, false otherwise\n *\n * @example\n * ```typescript\n * import { isTracing } from 'autotel/trace-helpers';\n *\n * if (isTracing()) {\n * // Add expensive debug metadata only when tracing\n * logger.debug('Detailed context', expensiveDebugData());\n * }\n * ```\n */\nexport function isTracing(): boolean {\n return trace.getActiveSpan() !== undefined;\n}\n\n/**\n * Get a tracer instance for creating custom spans\n *\n * Use this when you need low-level control over span lifecycle.\n * For most use cases, prefer trace(), span(), or instrument() instead.\n *\n * @param name - Tracer name (usually your service or module name)\n * @param version - Optional version string\n * @returns OpenTelemetry Tracer instance\n *\n * @example Basic usage\n * ```typescript\n * import { getTracer } from 'autotel';\n *\n * const tracer = getTracer('my-service');\n * const span = tracer.startSpan('custom.operation');\n * try {\n * // Your logic\n * span.setAttribute('key', 'value');\n * } finally {\n * span.end();\n * }\n * ```\n *\n * @example With AI SDK\n * ```typescript\n * import { getTracer } from 'autotel';\n * import { generateText } from 'ai';\n *\n * const tracer = getTracer('ai-agent');\n * const result = await generateText({\n * model: myModel,\n * prompt: 'Hello',\n * experimental_telemetry: {\n * isEnabled: true,\n * tracer,\n * },\n * });\n * ```\n */\nexport function getTracer(name: string, version?: string): Tracer {\n return trace.getTracer(name, version);\n}\n\n/**\n * Get the currently active span\n *\n * Returns undefined if no span is currently active.\n * Useful for adding attributes to the current span.\n *\n * @returns Active span or undefined\n *\n * @example Adding attributes to active span\n * ```typescript\n * import { getActiveSpan } from 'autotel';\n *\n * const span = getActiveSpan();\n * if (span) {\n * span.setAttribute('user.id', userId);\n * span.setAttribute('user.action', 'click');\n * }\n * ```\n *\n * @example Checking span status\n * ```typescript\n * import { getActiveSpan, SpanStatusCode } from 'autotel';\n *\n * const span = getActiveSpan();\n * if (span?.isRecording()) {\n * span.setStatus({ code: SpanStatusCode.OK });\n * }\n * ```\n */\nexport function getActiveSpan(): Span | undefined {\n return trace.getActiveSpan();\n}\n\n/**\n * Get the currently active OpenTelemetry context\n *\n * The context contains the active span and any baggage.\n * Useful for context propagation and custom instrumentation.\n *\n * @returns Current active context\n *\n * @example Propagating context\n * ```typescript\n * import { getActiveContext } from 'autotel';\n *\n * const currentContext = getActiveContext();\n * // Pass context to another function or service\n * ```\n *\n * @example With context injection\n * ```typescript\n * import { getActiveContext, injectTraceContext } from 'autotel';\n *\n * const headers = {};\n * injectTraceContext(headers);\n * // Headers now contain trace propagation data\n * ```\n */\nexport function getActiveContext(): Context {\n // Check stored context first (from baggage setters), then fall back to active context\n // This ensures ctx.setBaggage() changes are visible to OpenTelemetry operations\n try {\n const { getActiveContextWithBaggage } = requireModule<{\n getActiveContextWithBaggage: () => Context;\n }>('./trace-context');\n return getActiveContextWithBaggage();\n } catch {\n // Fallback if trace-context isn't available\n return context.active();\n }\n}\n\n/**\n * Run a function with a specific span set as active\n *\n * This is a convenience wrapper around the two-step process of\n * setting a span in context and running code within that context.\n *\n * @param span - The span to set as active\n * @param fn - Function to execute with the span active\n * @returns The return value of the function\n *\n * @example Running code with a custom span\n * ```typescript\n * import { getTracer, runWithSpan } from 'autotel';\n *\n * const tracer = getTracer('my-service');\n * const span = tracer.startSpan('background.job');\n *\n * try {\n * const result = await runWithSpan(span, async () => {\n * // Any spans created here will be children of 'background.job'\n * await processData();\n * return { success: true };\n * });\n * console.log(result);\n * } finally {\n * span.end();\n * }\n * ```\n *\n * @example Testing with custom spans\n * ```typescript\n * import { runWithSpan, otelTrace } from 'autotel';\n *\n * const tracer = otelTrace.getTracer('test');\n * const span = tracer.startSpan('test.operation');\n *\n * const result = runWithSpan(span, () => {\n * // Code under test runs with this span as active\n * return myFunction();\n * });\n *\n * span.end();\n * ```\n */\nexport function runWithSpan<T>(span: Span, fn: () => T): T {\n const ctx = trace.setSpan(context.active(), span);\n return context.with(ctx, fn);\n}\n\n/**\n * Finalize a span with appropriate status and optional error recording\n *\n * This is a convenience function that:\n * - Records exceptions if an error is provided\n * - Sets span status to ERROR if error exists, OK otherwise\n * - Ends the span\n *\n * @param span - The span to finalize\n * @param error - Optional error to record\n *\n * @example Without error (success case)\n * ```typescript\n * import { getTracer, finalizeSpan } from 'autotel';\n *\n * const tracer = getTracer('my-service');\n * const span = tracer.startSpan('operation');\n *\n * try {\n * await doWork();\n * finalizeSpan(span);\n * } catch (error) {\n * finalizeSpan(span, error);\n * throw error;\n * }\n * ```\n *\n * @example With error\n * ```typescript\n * import { getTracer, finalizeSpan } from 'autotel';\n *\n * const tracer = getTracer('my-service');\n * const span = tracer.startSpan('operation');\n *\n * try {\n * await riskyOperation();\n * finalizeSpan(span);\n * } catch (error) {\n * finalizeSpan(span, error); // Records exception and sets ERROR status\n * throw error;\n * }\n * ```\n *\n * @example In instrumentation\n * ```typescript\n * import { getTracer, runWithSpan, finalizeSpan } from 'autotel';\n *\n * function instrumentedQuery(query: string) {\n * const tracer = getTracer('db');\n * const span = tracer.startSpan('db.query');\n *\n * return runWithSpan(span, () => {\n * try {\n * const result = executeQuery(query);\n * finalizeSpan(span);\n * return result;\n * } catch (error) {\n * finalizeSpan(span, error);\n * throw error;\n * }\n * });\n * }\n * ```\n */\nexport function finalizeSpan(span: Span, error?: unknown): void {\n if (error) {\n if (error instanceof Error) {\n span.recordException(error);\n } else {\n span.recordException(new Error(String(error)));\n }\n span.setStatus({ code: SpanStatusCode.ERROR });\n } else {\n span.setStatus({ code: SpanStatusCode.OK });\n }\n span.end();\n}\n\n/**\n * Creates a deterministic trace ID from a seed string.\n *\n * Generates a consistent 128-bit trace ID (32 hex characters) from an input seed\n * using SHA-256 hashing. Useful for correlating external system IDs (request IDs,\n * order IDs, session IDs) with OpenTelemetry trace IDs.\n *\n * **Use Cases:**\n * - Correlate external request IDs with traces\n * - Link customer support tickets to trace data\n * - Associate business entities (orders, sessions) with observability data\n * - Debug specific user flows by deterministic trace lookup\n *\n * **Important:** Only use this when you need deterministic trace IDs for correlation.\n * For normal tracing, let OpenTelemetry generate random trace IDs automatically.\n *\n * **Runtime Support:**\n * - Node.js 15+ (native crypto.subtle)\n * - All modern browsers\n * - Edge runtimes (Cloudflare Workers, Deno, etc.)\n *\n * @param seed - Input string to generate trace ID from (e.g., request ID, order ID)\n * @returns Promise resolving to a 32-character hex trace ID (128 bits)\n *\n * @example Correlate external request ID with trace\n * ```typescript\n * import { createDeterministicTraceId } from 'autotel/trace-helpers'\n * import { trace, context } from '@opentelemetry/api'\n *\n * // In middleware or request handler\n * const requestId = req.headers['x-request-id']\n * const traceId = await createDeterministicTraceId(requestId)\n *\n * // Use with manual span creation (advanced - not needed with trace/span functions)\n * const tracer = trace.getTracer('my-service')\n * const spanContext = {\n * traceId,\n * spanId: '0123456789abcdef', // Still random\n * traceFlags: 1\n * }\n * ```\n *\n * @example Link customer support tickets to traces\n * ```typescript\n * import { createDeterministicTraceId } from 'autotel/trace-helpers'\n *\n * // Support dashboard integration\n * const ticketId = 'TICKET-12345'\n * const traceId = await createDeterministicTraceId(ticketId)\n *\n * // Generate direct link to traces in observability backend\n * const traceUrl = `https://your-otel-backend.com/traces/${traceId}`\n * console.log(`View related traces: ${traceUrl}`)\n * ```\n *\n * @example Session-based correlation\n * ```typescript\n * import { createDeterministicTraceId } from 'autotel/trace-helpers'\n *\n * // Track all operations for a user session\n * const sessionId = req.session.id\n * const traceId = await createDeterministicTraceId(sessionId)\n *\n * // All operations in this session share the same trace ID\n * // Makes it easy to find all activity for a specific session\n * ```\n *\n * @public\n */\nexport async function createDeterministicTraceId(\n seed: string,\n): Promise<string> {\n // Encode seed string to bytes\n const encoder = new TextEncoder();\n const data = encoder.encode(seed);\n\n // Generate SHA-256 hash (256 bits)\n const hashBuffer = await crypto.subtle.digest('SHA-256', data);\n\n // Convert to hex string and truncate to 32 characters (128 bits)\n // OpenTelemetry trace IDs are 128 bits (16 bytes, 32 hex characters)\n const hashArray = new Uint8Array(hashBuffer);\n return [...hashArray]\n .map((byte) => byte.toString(16).padStart(2, '0'))\n .join('')\n .slice(0, 32);\n}\n\n/**\n * Flattens nested metadata objects into dot-notation span attributes.\n *\n * Converts complex nested objects into flat key-value pairs suitable for\n * OpenTelemetry span attributes. Non-string values are JSON serialized.\n * Handles serialization failures gracefully with a fallback value.\n *\n * **Use Cases:**\n * - Structured metadata with nested objects\n * - User context with multiple properties\n * - Request/response metadata\n * - Business entity attributes\n *\n * **Note:** Filters out null/undefined values automatically to keep spans clean.\n *\n * @param metadata - Nested metadata object to flatten\n * @param prefix - Prefix for all attribute keys (default: 'metadata')\n * @returns Flattened attributes as { [key: string]: string }\n *\n * @example Basic metadata flattening\n * ```typescript\n * import { flattenMetadata } from 'autotel/trace-helpers'\n * import { trace } from 'autotel'\n *\n * export const processOrder = trace(ctx => async (orderId: string) => {\n * const order = await getOrder(orderId)\n *\n * // Flatten complex order metadata\n * const flattened = flattenMetadata({\n * user: { id: order.userId, tier: 'premium' },\n * payment: { method: 'card', processor: 'stripe' },\n * items: order.items.length\n * })\n *\n * ctx.setAttributes(flattened)\n * // Results in:\n * // {\n * // 'metadata.user.id': 'user-123',\n * // 'metadata.user.tier': 'premium',\n * // 'metadata.payment.method': 'card',\n * // 'metadata.payment.processor': 'stripe',\n * // 'metadata.items': '5'\n * // }\n * })\n * ```\n *\n * @example Custom prefix for semantic conventions\n * ```typescript\n * import { flattenMetadata } from 'autotel/trace-helpers'\n * import { trace } from 'autotel'\n *\n * export const fetchUser = trace(ctx => async (userId: string) => {\n * const user = await db.users.findOne({ id: userId })\n *\n * // Use semantic convention prefix\n * const userAttrs = flattenMetadata(\n * {\n * id: user.id,\n * email: user.email,\n * plan: user.subscription.plan\n * },\n * 'user' // Custom prefix\n * )\n *\n * ctx.setAttributes(userAttrs)\n * // Results in:\n * // {\n * // 'user.id': 'user-123',\n * // 'user.email': 'user@example.com',\n * // 'user.plan': 'enterprise'\n * // }\n * })\n * ```\n *\n * @example With complex objects (auto-serialized)\n * ```typescript\n * import { flattenMetadata } from 'autotel/trace-helpers'\n * import { trace } from 'autotel'\n *\n * export const analyzeRequest = trace(ctx => async (req: Request) => {\n * const metadata = flattenMetadata({\n * headers: req.headers, // Object - will be JSON serialized\n * query: req.query, // Object - will be JSON serialized\n * timestamp: new Date() // Non-string - will be JSON serialized\n * })\n *\n * ctx.setAttributes(metadata)\n * // Results in:\n * // {\n * // 'metadata.headers': '{\"accept\":\"application/json\",...}',\n * // 'metadata.query': '{\"page\":\"1\",\"limit\":\"10\"}',\n * // 'metadata.timestamp': '\"2024-01-15T12:00:00.000Z\"'\n * // }\n * })\n * ```\n *\n * @example Error handling\n * ```typescript\n * import { flattenMetadata } from 'autotel/trace-helpers'\n *\n * // Objects with circular references are handled gracefully\n * const circular: any = { a: 1 }\n * circular.self = circular\n *\n * const flattened = flattenMetadata({ data: circular })\n * // Results in:\n * // { 'metadata.data': '<serialization-failed>' }\n * ```\n *\n * @public\n */\n/**\n * Resolve a trace URL from a template string and trace ID.\n *\n * Templates use `{traceId}` as placeholder. Falls back to `OTEL_TRACE_URL_TEMPLATE` env var.\n *\n * @example\n * resolveTraceUrl('https://grafana.example.com/explore?traceId={traceId}', 'abc123')\n * // => 'https://grafana.example.com/explore?traceId=abc123'\n */\nexport function resolveTraceUrl(\n template: string | undefined,\n traceId: string,\n): string | undefined {\n const t = template ?? process.env.OTEL_TRACE_URL_TEMPLATE;\n if (!t) return undefined;\n return t.replace(/\\{traceId\\}/g, traceId);\n}\n\nexport function flattenMetadata(\n metadata: Record<string, unknown>,\n prefix = 'metadata',\n): Record<string, string> {\n const flattened: Record<string, string> = {};\n const seen = new WeakSet<object>(); // Track visited objects to detect cycles\n\n function flatten(obj: Record<string, unknown>, currentPrefix: string): void {\n for (const [key, value] of Object.entries(obj)) {\n // Skip null/undefined values\n if (value == null) continue;\n\n const attributeKey = `${currentPrefix}.${key}`;\n\n // Handle primitives directly (string, number, boolean)\n if (typeof value === 'string') {\n flattened[attributeKey] = value;\n continue;\n }\n if (typeof value === 'number' || typeof value === 'boolean') {\n flattened[attributeKey] = String(value);\n continue;\n }\n\n // Recursively flatten plain objects (with cycle detection)\n if (\n typeof value === 'object' &&\n value !== null &&\n value.constructor === Object\n ) {\n // Detect circular references\n if (seen.has(value)) {\n flattened[attributeKey] = '<circular-reference>';\n continue;\n }\n\n // Mark as visited and recursively flatten\n seen.add(value);\n flatten(value as Record<string, unknown>, attributeKey);\n continue;\n }\n\n // Serialize arrays and other non-plain objects to JSON\n try {\n flattened[attributeKey] = JSON.stringify(value);\n } catch {\n // Handle circular references or non-serializable objects\n flattened[attributeKey] = '<serialization-failed>';\n }\n }\n }\n\n flatten(metadata, prefix);\n return flattened;\n}\n"]}