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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event-_58ryBjh.js","names":[],"sources":["../src/circuit-breaker.ts","../src/events-config.ts","../src/event.ts"],"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"],"mappings":"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"}
@@ -0,0 +1,223 @@
1
+ //#region src/event-subscriber.d.ts
2
+ /**
3
+ * Event Subscriber Interface (Type-only)
4
+ *
5
+ * Import this interface to create custom subscribers without importing implementations.
6
+ * Keeps core package focused on OpenTelemetry with zero extra dependencies.
7
+ *
8
+ * For ready-made subscribers (PostHog, Mixpanel, Amplitude, Segment),
9
+ * see the separate `autotel-subscribers` package.
10
+ *
11
+ * @example Custom subscriber
12
+ * ```typescript
13
+ * import { EventSubscriber } from 'autotel/event-subscriber';
14
+ *
15
+ * class MyCustomSubscriber implements EventSubscriber {
16
+ * trackEvent(name: string, attributes?: Record<string, any>): void {
17
+ * // Send to your events platform
18
+ * }
19
+ * // ... implement other methods
20
+ * }
21
+ * ```
22
+ *
23
+ * @example Use pre-built subscribers
24
+ * ```typescript
25
+ * import { Events } from 'autotel/events';
26
+ * import { PostHogSubscriber } from 'autotel-subscribers/posthog';
27
+ * import { MixpanelSubscriber } from 'autotel-subscribers/mixpanel';
28
+ *
29
+ * const event =new Event('checkout', {
30
+ * subscribers: [
31
+ * new PostHogSubscriber({ apiKey: 'phc_...' }),
32
+ * new MixpanelSubscriber({ token: '...' })
33
+ * ]
34
+ * });
35
+ * ```
36
+ */
37
+ /**
38
+ * Event attributes (supports any JSON-serializable values)
39
+ *
40
+ * Allows primitive types for flat attributes and unknown for flexibility
41
+ * with nested objects when using subscribers that support JSON payloads
42
+ * (e.g., WebhookSubscriber).
43
+ */
44
+ type EventAttributes = Record<string, unknown>;
45
+ /**
46
+ * Permissive input type for event attributes
47
+ *
48
+ * Accepts undefined/null values which will be filtered out before sending.
49
+ * This improves DX when working with optional properties from objects.
50
+ *
51
+ * @example
52
+ * ```typescript
53
+ * // No need to filter out undefined values manually
54
+ * event.trackEvent('user.action', {
55
+ * userId: user.id,
56
+ * email: user.email, // might be undefined
57
+ * plan: user.subscription, // might be null
58
+ * });
59
+ * ```
60
+ */
61
+ type EventAttributesInput = Record<string, string | number | boolean | undefined | null>;
62
+ /**
63
+ * Funnel step status
64
+ */
65
+ type FunnelStatus = 'started' | 'completed' | 'abandoned' | 'failed';
66
+ /**
67
+ * Outcome status
68
+ */
69
+ type OutcomeStatus = 'success' | 'failure' | 'partial';
70
+ /**
71
+ * Autotel event context for trace correlation
72
+ *
73
+ * This structured object contains trace context and correlation IDs.
74
+ * Subscribers decide how to map/flatten these for their platform.
75
+ */
76
+ interface AutotelEventContext {
77
+ /** Trace ID (32 hex chars) - present when inside a trace */
78
+ trace_id?: string;
79
+ /** Span ID (16 hex chars) - present when inside a span */
80
+ span_id?: string;
81
+ /** Trace flags (2 hex chars, e.g., '01' for sampled) */
82
+ trace_flags?: string;
83
+ /** Raw tracestate string - present if tracestate exists */
84
+ trace_state?: string;
85
+ /** Clickable trace URL - present if traceUrl config is set */
86
+ trace_url?: string;
87
+ /** Correlation ID (always present, 16 hex chars) */
88
+ correlation_id: string;
89
+ /** Number of linked parent traces (batch/fan-in scenarios) */
90
+ linked_trace_id_count?: number;
91
+ /** Stable hash of linked trace IDs (default for batch/fan-in) */
92
+ linked_trace_id_hash?: string;
93
+ /** Full array of linked trace IDs (only if includeLinkedTraceIds: true) */
94
+ linked_trace_ids?: string[];
95
+ }
96
+ /**
97
+ * Optional machine-readable schema metadata attached to an event payload.
98
+ * Intended for contract-aware subscribers (e.g. architecture snapshot capture).
99
+ */
100
+ interface EventSchemaMetadata {
101
+ /** Schema source format used at the call site. */
102
+ source: 'zod';
103
+ /** JSON Schema representation of the payload contract. */
104
+ jsonSchema: unknown;
105
+ /** Stable schema hash for change detection and cache keys. */
106
+ hash: string;
107
+ }
108
+ /**
109
+ * Options for event tracking methods
110
+ */
111
+ interface EventTrackingOptions {
112
+ /** Autotel trace context to include in the event */
113
+ autotel?: AutotelEventContext;
114
+ /** Optional event payload schema metadata */
115
+ schema?: EventSchemaMetadata;
116
+ }
117
+ /**
118
+ * Event subscriber interface
119
+ *
120
+ * Implement this to send events to any platform.
121
+ * Zero runtime dependencies - just types.
122
+ *
123
+ * All tracking methods are async to support:
124
+ * - Backpressure signaling (buffer full)
125
+ * - Streaming platforms (Kafka, Kinesis, Pub/Sub)
126
+ * - Await delivery confirmation
127
+ * - Proper error propagation
128
+ */
129
+ interface EventSubscriber {
130
+ /**
131
+ * Track an event (e.g., "user.registered", "order.created")
132
+ *
133
+ * @param name - Event name
134
+ * @param attributes - Optional event attributes
135
+ * @param options - Optional tracking options including autotel context
136
+ * @returns Promise that resolves when event is sent (or buffered)
137
+ */
138
+ trackEvent(name: string, attributes?: EventAttributes, options?: EventTrackingOptions): Promise<void>;
139
+ /**
140
+ * Track a funnel step (e.g., checkout: started → completed)
141
+ *
142
+ * @param funnelName - Funnel name
143
+ * @param step - Funnel step status
144
+ * @param attributes - Optional event attributes
145
+ * @param options - Optional tracking options including autotel context
146
+ * @returns Promise that resolves when event is sent (or buffered)
147
+ */
148
+ trackFunnelStep(funnelName: string, step: FunnelStatus, attributes?: EventAttributes, options?: EventTrackingOptions): Promise<void>;
149
+ /**
150
+ * Track an outcome (e.g., "payment.processing" → success/failure)
151
+ *
152
+ * @param operationName - Operation name
153
+ * @param outcome - Outcome status
154
+ * @param attributes - Optional event attributes
155
+ * @param options - Optional tracking options including autotel context
156
+ * @returns Promise that resolves when event is sent (or buffered)
157
+ */
158
+ trackOutcome(operationName: string, outcome: OutcomeStatus, attributes?: EventAttributes, options?: EventTrackingOptions): Promise<void>;
159
+ /**
160
+ * Track a value/metric (e.g., revenue, cart value)
161
+ *
162
+ * @param name - Metric name
163
+ * @param value - Numeric value
164
+ * @param attributes - Optional event attributes
165
+ * @param options - Optional tracking options including autotel context
166
+ * @returns Promise that resolves when event is sent (or buffered)
167
+ */
168
+ trackValue(name: string, value: number, attributes?: EventAttributes, options?: EventTrackingOptions): Promise<void>;
169
+ /**
170
+ * Track funnel progression with custom step names
171
+ *
172
+ * Unlike trackFunnelStep which uses FunnelStatus enum values,
173
+ * this method allows any string as the step name for flexible funnel tracking.
174
+ *
175
+ * @param funnelName - Name of the funnel (e.g., "checkout", "onboarding")
176
+ * @param stepName - Custom step name (e.g., "cart_viewed", "payment_entered")
177
+ * @param stepNumber - Optional numeric position in the funnel
178
+ * @param attributes - Optional event attributes
179
+ * @param options - Optional tracking options including autotel context
180
+ *
181
+ * @example
182
+ * ```typescript
183
+ * // Track custom checkout steps
184
+ * await subscriber.trackFunnelProgression('checkout', 'cart_viewed', 1);
185
+ * await subscriber.trackFunnelProgression('checkout', 'shipping_selected', 2);
186
+ * await subscriber.trackFunnelProgression('checkout', 'payment_entered', 3);
187
+ * await subscriber.trackFunnelProgression('checkout', 'order_confirmed', 4);
188
+ * ```
189
+ */
190
+ trackFunnelProgression?(funnelName: string, stepName: string, stepNumber?: number, attributes?: EventAttributes, options?: EventTrackingOptions): Promise<void>;
191
+ /**
192
+ * Optional: Flush pending events and clean up resources
193
+ *
194
+ * Implement this if your subscriber buffers events, maintains connections,
195
+ * or needs cleanup before shutdown. Called during graceful shutdown.
196
+ *
197
+ * @example
198
+ * ```typescript
199
+ * class MySubscriber implements EventSubscriber {
200
+ * async shutdown(): Promise<void> {
201
+ * await this.flushBuffer();
202
+ * await this.closeConnections();
203
+ * }
204
+ * }
205
+ * ```
206
+ */
207
+ shutdown?(): Promise<void>;
208
+ /**
209
+ * Optional: Subscriber name for debugging and error reporting
210
+ *
211
+ * @example "PostHogSubscriber", "SnowflakeSubscriber", "CustomWebhookSubscriber"
212
+ */
213
+ readonly name?: string;
214
+ /**
215
+ * Optional: Subscriber version for debugging
216
+ *
217
+ * @example "1.0.0"
218
+ */
219
+ readonly version?: string;
220
+ }
221
+ //#endregion
222
+ export { EventSubscriber as a, OutcomeStatus as c, EventSchemaMetadata as i, EventAttributes as n, EventTrackingOptions as o, EventAttributesInput as r, FunnelStatus as s, AutotelEventContext as t };
223
+ //# sourceMappingURL=event-subscriber-D1XLkPzi.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event-subscriber-D1XLkPzi.d.cts","names":[],"sources":["../src/event-subscriber.ts"],"mappings":";;AA2CA;;;;AAAoC;AAkBpC;;;;AAAyC;AAQzC;;;;AAAwB;AAKxB;;;;AAAyB;AAQzB;;;;;;;;;;;;;;AAkBkB;AAOlB;;;;;;AAPkB,KAzDN,eAAA,GAAkB,MAAM;;AAsE9B;AAMN;;;;;;;;;AAI8B;AAe9B;;;;KA7EY,oBAAA,GAAuB,MAAM;;;;KAQ7B,YAAA;;;;KAKA,aAAA;;;;;;;UAQK,mBAAA;EAoKF;EAlKb,QAAA;EAkKoB;EAhKpB,OAAA;EA8DE;EA5DF,WAAA;EA6DE;EA3DF,WAAA;EA4DE;EA1DF,SAAA;EAsEA;EApEA,cAAA;EAsEQ;EApER,qBAAA;EAqEe;EAnEf,oBAAA;EAoEY;EAlEZ,gBAAA;AAAA;;;;;UAOe,mBAAA;EA0Eb;EAxEF,MAAA;EAyEE;EAvEF,UAAA;EAmFA;EAjFA,IAAA;AAAA;;;;UAMe,oBAAA;EAgFZ;EA9EH,OAAA,GAAU,mBAAA;EAsGR;EApGF,MAAA,GAAS,mBAAmB;AAAA;;;;;;;;;;;AAyIZ;;UA1HD,eAAA;;;;;;;;;EASf,UAAA,CACE,IAAA,UACA,UAAA,GAAa,eAAA,EACb,OAAA,GAAU,oBAAA,GACT,OAAA;;;;;;;;;;EAWH,eAAA,CACE,UAAA,UACA,IAAA,EAAM,YAAA,EACN,UAAA,GAAa,eAAA,EACb,OAAA,GAAU,oBAAA,GACT,OAAA;;;;;;;;;;EAWH,YAAA,CACE,aAAA,UACA,OAAA,EAAS,aAAA,EACT,UAAA,GAAa,eAAA,EACb,OAAA,GAAU,oBAAA,GACT,OAAA;;;;;;;;;;EAWH,UAAA,CACE,IAAA,UACA,KAAA,UACA,UAAA,GAAa,eAAA,EACb,OAAA,GAAU,oBAAA,GACT,OAAA;;;;;;;;;;;;;;;;;;;;;;EAuBH,sBAAA,EACE,UAAA,UACA,QAAA,UACA,UAAA,WACA,UAAA,GAAa,eAAA,EACb,OAAA,GAAU,oBAAA,GACT,OAAA;;;;;;;;;;;;;;;;;EAkBH,QAAA,KAAa,OAAA;;;;;;WAOJ,IAAA;;;;;;WAOA,OAAA;AAAA"}
@@ -0,0 +1,223 @@
1
+ //#region src/event-subscriber.d.ts
2
+ /**
3
+ * Event Subscriber Interface (Type-only)
4
+ *
5
+ * Import this interface to create custom subscribers without importing implementations.
6
+ * Keeps core package focused on OpenTelemetry with zero extra dependencies.
7
+ *
8
+ * For ready-made subscribers (PostHog, Mixpanel, Amplitude, Segment),
9
+ * see the separate `autotel-subscribers` package.
10
+ *
11
+ * @example Custom subscriber
12
+ * ```typescript
13
+ * import { EventSubscriber } from 'autotel/event-subscriber';
14
+ *
15
+ * class MyCustomSubscriber implements EventSubscriber {
16
+ * trackEvent(name: string, attributes?: Record<string, any>): void {
17
+ * // Send to your events platform
18
+ * }
19
+ * // ... implement other methods
20
+ * }
21
+ * ```
22
+ *
23
+ * @example Use pre-built subscribers
24
+ * ```typescript
25
+ * import { Events } from 'autotel/events';
26
+ * import { PostHogSubscriber } from 'autotel-subscribers/posthog';
27
+ * import { MixpanelSubscriber } from 'autotel-subscribers/mixpanel';
28
+ *
29
+ * const event =new Event('checkout', {
30
+ * subscribers: [
31
+ * new PostHogSubscriber({ apiKey: 'phc_...' }),
32
+ * new MixpanelSubscriber({ token: '...' })
33
+ * ]
34
+ * });
35
+ * ```
36
+ */
37
+ /**
38
+ * Event attributes (supports any JSON-serializable values)
39
+ *
40
+ * Allows primitive types for flat attributes and unknown for flexibility
41
+ * with nested objects when using subscribers that support JSON payloads
42
+ * (e.g., WebhookSubscriber).
43
+ */
44
+ type EventAttributes = Record<string, unknown>;
45
+ /**
46
+ * Permissive input type for event attributes
47
+ *
48
+ * Accepts undefined/null values which will be filtered out before sending.
49
+ * This improves DX when working with optional properties from objects.
50
+ *
51
+ * @example
52
+ * ```typescript
53
+ * // No need to filter out undefined values manually
54
+ * event.trackEvent('user.action', {
55
+ * userId: user.id,
56
+ * email: user.email, // might be undefined
57
+ * plan: user.subscription, // might be null
58
+ * });
59
+ * ```
60
+ */
61
+ type EventAttributesInput = Record<string, string | number | boolean | undefined | null>;
62
+ /**
63
+ * Funnel step status
64
+ */
65
+ type FunnelStatus = 'started' | 'completed' | 'abandoned' | 'failed';
66
+ /**
67
+ * Outcome status
68
+ */
69
+ type OutcomeStatus = 'success' | 'failure' | 'partial';
70
+ /**
71
+ * Autotel event context for trace correlation
72
+ *
73
+ * This structured object contains trace context and correlation IDs.
74
+ * Subscribers decide how to map/flatten these for their platform.
75
+ */
76
+ interface AutotelEventContext {
77
+ /** Trace ID (32 hex chars) - present when inside a trace */
78
+ trace_id?: string;
79
+ /** Span ID (16 hex chars) - present when inside a span */
80
+ span_id?: string;
81
+ /** Trace flags (2 hex chars, e.g., '01' for sampled) */
82
+ trace_flags?: string;
83
+ /** Raw tracestate string - present if tracestate exists */
84
+ trace_state?: string;
85
+ /** Clickable trace URL - present if traceUrl config is set */
86
+ trace_url?: string;
87
+ /** Correlation ID (always present, 16 hex chars) */
88
+ correlation_id: string;
89
+ /** Number of linked parent traces (batch/fan-in scenarios) */
90
+ linked_trace_id_count?: number;
91
+ /** Stable hash of linked trace IDs (default for batch/fan-in) */
92
+ linked_trace_id_hash?: string;
93
+ /** Full array of linked trace IDs (only if includeLinkedTraceIds: true) */
94
+ linked_trace_ids?: string[];
95
+ }
96
+ /**
97
+ * Optional machine-readable schema metadata attached to an event payload.
98
+ * Intended for contract-aware subscribers (e.g. architecture snapshot capture).
99
+ */
100
+ interface EventSchemaMetadata {
101
+ /** Schema source format used at the call site. */
102
+ source: 'zod';
103
+ /** JSON Schema representation of the payload contract. */
104
+ jsonSchema: unknown;
105
+ /** Stable schema hash for change detection and cache keys. */
106
+ hash: string;
107
+ }
108
+ /**
109
+ * Options for event tracking methods
110
+ */
111
+ interface EventTrackingOptions {
112
+ /** Autotel trace context to include in the event */
113
+ autotel?: AutotelEventContext;
114
+ /** Optional event payload schema metadata */
115
+ schema?: EventSchemaMetadata;
116
+ }
117
+ /**
118
+ * Event subscriber interface
119
+ *
120
+ * Implement this to send events to any platform.
121
+ * Zero runtime dependencies - just types.
122
+ *
123
+ * All tracking methods are async to support:
124
+ * - Backpressure signaling (buffer full)
125
+ * - Streaming platforms (Kafka, Kinesis, Pub/Sub)
126
+ * - Await delivery confirmation
127
+ * - Proper error propagation
128
+ */
129
+ interface EventSubscriber {
130
+ /**
131
+ * Track an event (e.g., "user.registered", "order.created")
132
+ *
133
+ * @param name - Event name
134
+ * @param attributes - Optional event attributes
135
+ * @param options - Optional tracking options including autotel context
136
+ * @returns Promise that resolves when event is sent (or buffered)
137
+ */
138
+ trackEvent(name: string, attributes?: EventAttributes, options?: EventTrackingOptions): Promise<void>;
139
+ /**
140
+ * Track a funnel step (e.g., checkout: started → completed)
141
+ *
142
+ * @param funnelName - Funnel name
143
+ * @param step - Funnel step status
144
+ * @param attributes - Optional event attributes
145
+ * @param options - Optional tracking options including autotel context
146
+ * @returns Promise that resolves when event is sent (or buffered)
147
+ */
148
+ trackFunnelStep(funnelName: string, step: FunnelStatus, attributes?: EventAttributes, options?: EventTrackingOptions): Promise<void>;
149
+ /**
150
+ * Track an outcome (e.g., "payment.processing" → success/failure)
151
+ *
152
+ * @param operationName - Operation name
153
+ * @param outcome - Outcome status
154
+ * @param attributes - Optional event attributes
155
+ * @param options - Optional tracking options including autotel context
156
+ * @returns Promise that resolves when event is sent (or buffered)
157
+ */
158
+ trackOutcome(operationName: string, outcome: OutcomeStatus, attributes?: EventAttributes, options?: EventTrackingOptions): Promise<void>;
159
+ /**
160
+ * Track a value/metric (e.g., revenue, cart value)
161
+ *
162
+ * @param name - Metric name
163
+ * @param value - Numeric value
164
+ * @param attributes - Optional event attributes
165
+ * @param options - Optional tracking options including autotel context
166
+ * @returns Promise that resolves when event is sent (or buffered)
167
+ */
168
+ trackValue(name: string, value: number, attributes?: EventAttributes, options?: EventTrackingOptions): Promise<void>;
169
+ /**
170
+ * Track funnel progression with custom step names
171
+ *
172
+ * Unlike trackFunnelStep which uses FunnelStatus enum values,
173
+ * this method allows any string as the step name for flexible funnel tracking.
174
+ *
175
+ * @param funnelName - Name of the funnel (e.g., "checkout", "onboarding")
176
+ * @param stepName - Custom step name (e.g., "cart_viewed", "payment_entered")
177
+ * @param stepNumber - Optional numeric position in the funnel
178
+ * @param attributes - Optional event attributes
179
+ * @param options - Optional tracking options including autotel context
180
+ *
181
+ * @example
182
+ * ```typescript
183
+ * // Track custom checkout steps
184
+ * await subscriber.trackFunnelProgression('checkout', 'cart_viewed', 1);
185
+ * await subscriber.trackFunnelProgression('checkout', 'shipping_selected', 2);
186
+ * await subscriber.trackFunnelProgression('checkout', 'payment_entered', 3);
187
+ * await subscriber.trackFunnelProgression('checkout', 'order_confirmed', 4);
188
+ * ```
189
+ */
190
+ trackFunnelProgression?(funnelName: string, stepName: string, stepNumber?: number, attributes?: EventAttributes, options?: EventTrackingOptions): Promise<void>;
191
+ /**
192
+ * Optional: Flush pending events and clean up resources
193
+ *
194
+ * Implement this if your subscriber buffers events, maintains connections,
195
+ * or needs cleanup before shutdown. Called during graceful shutdown.
196
+ *
197
+ * @example
198
+ * ```typescript
199
+ * class MySubscriber implements EventSubscriber {
200
+ * async shutdown(): Promise<void> {
201
+ * await this.flushBuffer();
202
+ * await this.closeConnections();
203
+ * }
204
+ * }
205
+ * ```
206
+ */
207
+ shutdown?(): Promise<void>;
208
+ /**
209
+ * Optional: Subscriber name for debugging and error reporting
210
+ *
211
+ * @example "PostHogSubscriber", "SnowflakeSubscriber", "CustomWebhookSubscriber"
212
+ */
213
+ readonly name?: string;
214
+ /**
215
+ * Optional: Subscriber version for debugging
216
+ *
217
+ * @example "1.0.0"
218
+ */
219
+ readonly version?: string;
220
+ }
221
+ //#endregion
222
+ export { EventSubscriber as a, OutcomeStatus as c, EventSchemaMetadata as i, EventAttributes as n, EventTrackingOptions as o, EventAttributesInput as r, FunnelStatus as s, AutotelEventContext as t };
223
+ //# sourceMappingURL=event-subscriber-D1XLkPzi.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event-subscriber-D1XLkPzi.d.ts","names":[],"sources":["../src/event-subscriber.ts"],"mappings":";;AA2CA;;;;AAAoC;AAkBpC;;;;AAAyC;AAQzC;;;;AAAwB;AAKxB;;;;AAAyB;AAQzB;;;;;;;;;;;;;;AAkBkB;AAOlB;;;;;;AAPkB,KAzDN,eAAA,GAAkB,MAAM;;AAsE9B;AAMN;;;;;;;;;AAI8B;AAe9B;;;;KA7EY,oBAAA,GAAuB,MAAM;;;;KAQ7B,YAAA;;;;KAKA,aAAA;;;;;;;UAQK,mBAAA;EAoKF;EAlKb,QAAA;EAkKoB;EAhKpB,OAAA;EA8DE;EA5DF,WAAA;EA6DE;EA3DF,WAAA;EA4DE;EA1DF,SAAA;EAsEA;EApEA,cAAA;EAsEQ;EApER,qBAAA;EAqEe;EAnEf,oBAAA;EAoEY;EAlEZ,gBAAA;AAAA;;;;;UAOe,mBAAA;EA0Eb;EAxEF,MAAA;EAyEE;EAvEF,UAAA;EAmFA;EAjFA,IAAA;AAAA;;;;UAMe,oBAAA;EAgFZ;EA9EH,OAAA,GAAU,mBAAA;EAsGR;EApGF,MAAA,GAAS,mBAAmB;AAAA;;;;;;;;;;;AAyIZ;;UA1HD,eAAA;;;;;;;;;EASf,UAAA,CACE,IAAA,UACA,UAAA,GAAa,eAAA,EACb,OAAA,GAAU,oBAAA,GACT,OAAA;;;;;;;;;;EAWH,eAAA,CACE,UAAA,UACA,IAAA,EAAM,YAAA,EACN,UAAA,GAAa,eAAA,EACb,OAAA,GAAU,oBAAA,GACT,OAAA;;;;;;;;;;EAWH,YAAA,CACE,aAAA,UACA,OAAA,EAAS,aAAA,EACT,UAAA,GAAa,eAAA,EACb,OAAA,GAAU,oBAAA,GACT,OAAA;;;;;;;;;;EAWH,UAAA,CACE,IAAA,UACA,KAAA,UACA,UAAA,GAAa,eAAA,EACb,OAAA,GAAU,oBAAA,GACT,OAAA;;;;;;;;;;;;;;;;;;;;;;EAuBH,sBAAA,EACE,UAAA,UACA,QAAA,UACA,UAAA,WACA,UAAA,GAAa,eAAA,EACb,OAAA,GAAU,oBAAA,GACT,OAAA;;;;;;;;;;;;;;;;;EAkBH,QAAA,KAAa,OAAA;;;;;;WAOJ,IAAA;;;;;;WAOA,OAAA;AAAA"}
@@ -1,6 +0,0 @@
1
- 'use strict';
2
-
3
- require('./chunk-NZ72VDNY.cjs');
4
-
5
- //# sourceMappingURL=event-subscriber.cjs.map
6
- //# sourceMappingURL=event-subscriber.cjs.map