@smoothbricks/lmao 0.1.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 (447) hide show
  1. package/README.md +269 -0
  2. package/dist/allocator.wasm +0 -0
  3. package/dist/bun/preload.d.ts +11 -0
  4. package/dist/bun/preload.d.ts.map +1 -0
  5. package/dist/bun/preload.js +10 -0
  6. package/dist/bun/trace-preload.d.ts +8 -0
  7. package/dist/bun/trace-preload.d.ts.map +1 -0
  8. package/dist/bun/trace-preload.js +12 -0
  9. package/dist/es.d.ts +8 -0
  10. package/dist/es.d.ts.map +1 -0
  11. package/dist/es.js +9 -0
  12. package/dist/index.d.ts +41 -0
  13. package/dist/index.d.ts.map +1 -0
  14. package/dist/index.js +84 -0
  15. package/dist/lib/JsBufferStrategy.d.ts +49 -0
  16. package/dist/lib/JsBufferStrategy.d.ts.map +1 -0
  17. package/dist/lib/JsBufferStrategy.js +60 -0
  18. package/dist/lib/archive/chunkCompaction.d.ts +15 -0
  19. package/dist/lib/archive/chunkCompaction.d.ts.map +1 -0
  20. package/dist/lib/archive/chunkCompaction.js +24 -0
  21. package/dist/lib/archive/chunkEnvelope.d.ts +21 -0
  22. package/dist/lib/archive/chunkEnvelope.d.ts.map +1 -0
  23. package/dist/lib/archive/chunkEnvelope.js +55 -0
  24. package/dist/lib/archive/chunkRouting.d.ts +10 -0
  25. package/dist/lib/archive/chunkRouting.d.ts.map +1 -0
  26. package/dist/lib/archive/chunkRouting.js +47 -0
  27. package/dist/lib/archive/chunkStats.d.ts +12 -0
  28. package/dist/lib/archive/chunkStats.d.ts.map +1 -0
  29. package/dist/lib/archive/chunkStats.js +10 -0
  30. package/dist/lib/archive/index.d.ts +5 -0
  31. package/dist/lib/archive/index.d.ts.map +1 -0
  32. package/dist/lib/archive/index.js +4 -0
  33. package/dist/lib/arrow/capacityStats.d.ts +9 -0
  34. package/dist/lib/arrow/capacityStats.d.ts.map +1 -0
  35. package/dist/lib/arrow/capacityStats.js +231 -0
  36. package/dist/lib/arrow/dictionaries.d.ts +27 -0
  37. package/dist/lib/arrow/dictionaries.d.ts.map +1 -0
  38. package/dist/lib/arrow/dictionaries.js +135 -0
  39. package/dist/lib/arrow/flechette.d.ts +40 -0
  40. package/dist/lib/arrow/flechette.d.ts.map +1 -0
  41. package/dist/lib/arrow/flechette.js +67 -0
  42. package/dist/lib/arrow/utils.d.ts +38 -0
  43. package/dist/lib/arrow/utils.d.ts.map +1 -0
  44. package/dist/lib/arrow/utils.js +112 -0
  45. package/dist/lib/buffer/Nanoseconds.d.ts +109 -0
  46. package/dist/lib/buffer/Nanoseconds.d.ts.map +1 -0
  47. package/dist/lib/buffer/Nanoseconds.js +86 -0
  48. package/dist/lib/bufferStrategy.d.ts +95 -0
  49. package/dist/lib/bufferStrategy.d.ts.map +1 -0
  50. package/dist/lib/bufferStrategy.js +1 -0
  51. package/dist/lib/capacityTuning.d.ts +50 -0
  52. package/dist/lib/capacityTuning.d.ts.map +1 -0
  53. package/dist/lib/capacityTuning.js +65 -0
  54. package/dist/lib/codegen/evaluatorGenerator.d.ts +35 -0
  55. package/dist/lib/codegen/evaluatorGenerator.d.ts.map +1 -0
  56. package/dist/lib/codegen/evaluatorGenerator.js +199 -0
  57. package/dist/lib/codegen/fixedPositionWriterGenerator.d.ts +139 -0
  58. package/dist/lib/codegen/fixedPositionWriterGenerator.d.ts.map +1 -0
  59. package/dist/lib/codegen/fixedPositionWriterGenerator.js +289 -0
  60. package/dist/lib/codegen/spanLoggerGenerator.d.ts +115 -0
  61. package/dist/lib/codegen/spanLoggerGenerator.d.ts.map +1 -0
  62. package/dist/lib/codegen/spanLoggerGenerator.js +575 -0
  63. package/dist/lib/convertToArrow.d.ts +40 -0
  64. package/dist/lib/convertToArrow.d.ts.map +1 -0
  65. package/dist/lib/convertToArrow.js +1467 -0
  66. package/dist/lib/defineOpContext.d.ts +96 -0
  67. package/dist/lib/defineOpContext.d.ts.map +1 -0
  68. package/dist/lib/defineOpContext.js +227 -0
  69. package/dist/lib/errors/Blocked.d.ts +113 -0
  70. package/dist/lib/errors/Blocked.d.ts.map +1 -0
  71. package/dist/lib/errors/Blocked.js +68 -0
  72. package/dist/lib/errors/CodeError.d.ts +101 -0
  73. package/dist/lib/errors/CodeError.d.ts.map +1 -0
  74. package/dist/lib/errors/CodeError.js +42 -0
  75. package/dist/lib/errors/RetriesExhausted.d.ts +67 -0
  76. package/dist/lib/errors/RetriesExhausted.d.ts.map +1 -0
  77. package/dist/lib/errors/RetriesExhausted.js +31 -0
  78. package/dist/lib/errors/Transient.d.ts +115 -0
  79. package/dist/lib/errors/Transient.d.ts.map +1 -0
  80. package/dist/lib/errors/Transient.js +54 -0
  81. package/dist/lib/errors/index.d.ts +14 -0
  82. package/dist/lib/errors/index.d.ts.map +1 -0
  83. package/dist/lib/errors/index.js +16 -0
  84. package/dist/lib/errors/retry-policy.d.ts +60 -0
  85. package/dist/lib/errors/retry-policy.d.ts.map +1 -0
  86. package/dist/lib/errors/retry-policy.js +54 -0
  87. package/dist/lib/flushScheduler.d.ts +162 -0
  88. package/dist/lib/flushScheduler.d.ts.map +1 -0
  89. package/dist/lib/flushScheduler.js +388 -0
  90. package/dist/lib/library.d.ts +149 -0
  91. package/dist/lib/library.d.ts.map +1 -0
  92. package/dist/lib/library.js +588 -0
  93. package/dist/lib/logApi.d.ts +61 -0
  94. package/dist/lib/logApi.d.ts.map +1 -0
  95. package/dist/lib/logApi.js +12 -0
  96. package/dist/lib/logBinding.d.ts +63 -0
  97. package/dist/lib/logBinding.d.ts.map +1 -0
  98. package/dist/lib/logBinding.js +1 -0
  99. package/dist/lib/op.d.ts +105 -0
  100. package/dist/lib/op.d.ts.map +1 -0
  101. package/dist/lib/op.js +59 -0
  102. package/dist/lib/opContext/contextTypes.d.ts +88 -0
  103. package/dist/lib/opContext/contextTypes.d.ts.map +1 -0
  104. package/dist/lib/opContext/contextTypes.js +34 -0
  105. package/dist/lib/opContext/createOpGroup.d.ts +57 -0
  106. package/dist/lib/opContext/createOpGroup.d.ts.map +1 -0
  107. package/dist/lib/opContext/createOpGroup.js +341 -0
  108. package/dist/lib/opContext/defineOp.d.ts +83 -0
  109. package/dist/lib/opContext/defineOp.d.ts.map +1 -0
  110. package/dist/lib/opContext/defineOp.js +197 -0
  111. package/dist/lib/opContext/featureFlagTypes.d.ts +58 -0
  112. package/dist/lib/opContext/featureFlagTypes.d.ts.map +1 -0
  113. package/dist/lib/opContext/featureFlagTypes.js +1 -0
  114. package/dist/lib/opContext/index.d.ts +13 -0
  115. package/dist/lib/opContext/index.d.ts.map +1 -0
  116. package/dist/lib/opContext/index.js +15 -0
  117. package/dist/lib/opContext/opGroupTypes.d.ts +250 -0
  118. package/dist/lib/opContext/opGroupTypes.d.ts.map +1 -0
  119. package/dist/lib/opContext/opGroupTypes.js +31 -0
  120. package/dist/lib/opContext/opTypes.d.ts +48 -0
  121. package/dist/lib/opContext/opTypes.d.ts.map +1 -0
  122. package/dist/lib/opContext/opTypes.js +7 -0
  123. package/dist/lib/opContext/spanContextTypes.d.ts +347 -0
  124. package/dist/lib/opContext/spanContextTypes.d.ts.map +1 -0
  125. package/dist/lib/opContext/spanContextTypes.js +1 -0
  126. package/dist/lib/opContext/types.d.ts +297 -0
  127. package/dist/lib/opContext/types.d.ts.map +1 -0
  128. package/dist/lib/opContext/types.js +16 -0
  129. package/dist/lib/result.d.ts +308 -0
  130. package/dist/lib/result.d.ts.map +1 -0
  131. package/dist/lib/result.js +359 -0
  132. package/dist/lib/schema/LogSchema.d.ts +62 -0
  133. package/dist/lib/schema/LogSchema.d.ts.map +1 -0
  134. package/dist/lib/schema/LogSchema.js +134 -0
  135. package/dist/lib/schema/builder.d.ts +12 -0
  136. package/dist/lib/schema/builder.d.ts.map +1 -0
  137. package/dist/lib/schema/builder.js +169 -0
  138. package/dist/lib/schema/defineFeatureFlags.d.ts +60 -0
  139. package/dist/lib/schema/defineFeatureFlags.d.ts.map +1 -0
  140. package/dist/lib/schema/defineFeatureFlags.js +29 -0
  141. package/dist/lib/schema/defineLogSchema.d.ts +87 -0
  142. package/dist/lib/schema/defineLogSchema.d.ts.map +1 -0
  143. package/dist/lib/schema/defineLogSchema.js +171 -0
  144. package/dist/lib/schema/evaluator.d.ts +267 -0
  145. package/dist/lib/schema/evaluator.d.ts.map +1 -0
  146. package/dist/lib/schema/evaluator.js +169 -0
  147. package/dist/lib/schema/extend.d.ts +14 -0
  148. package/dist/lib/schema/extend.d.ts.map +1 -0
  149. package/dist/lib/schema/extend.js +51 -0
  150. package/dist/lib/schema/systemSchema.d.ts +112 -0
  151. package/dist/lib/schema/systemSchema.d.ts.map +1 -0
  152. package/dist/lib/schema/systemSchema.js +260 -0
  153. package/dist/lib/schema/typeGuards.d.ts +52 -0
  154. package/dist/lib/schema/typeGuards.d.ts.map +1 -0
  155. package/dist/lib/schema/typeGuards.js +127 -0
  156. package/dist/lib/schema/types.d.ts +156 -0
  157. package/dist/lib/schema/types.d.ts.map +1 -0
  158. package/dist/lib/schema/types.js +4 -0
  159. package/dist/lib/spanBuffer.d.ts +133 -0
  160. package/dist/lib/spanBuffer.d.ts.map +1 -0
  161. package/dist/lib/spanBuffer.js +442 -0
  162. package/dist/lib/spanBufferHelpers.d.ts +53 -0
  163. package/dist/lib/spanBufferHelpers.d.ts.map +1 -0
  164. package/dist/lib/spanBufferHelpers.js +65 -0
  165. package/dist/lib/spanBufferStats.d.ts +38 -0
  166. package/dist/lib/spanBufferStats.d.ts.map +1 -0
  167. package/dist/lib/spanBufferStats.js +1 -0
  168. package/dist/lib/spanContext.d.ts +141 -0
  169. package/dist/lib/spanContext.d.ts.map +1 -0
  170. package/dist/lib/spanContext.js +763 -0
  171. package/dist/lib/sqlite/index.d.ts +14 -0
  172. package/dist/lib/sqlite/index.d.ts.map +1 -0
  173. package/dist/lib/sqlite/index.js +12 -0
  174. package/dist/lib/sqlite/sqlite-async-writer.d.ts +24 -0
  175. package/dist/lib/sqlite/sqlite-async-writer.d.ts.map +1 -0
  176. package/dist/lib/sqlite/sqlite-async-writer.js +65 -0
  177. package/dist/lib/sqlite/sqlite-common.d.ts +37 -0
  178. package/dist/lib/sqlite/sqlite-common.d.ts.map +1 -0
  179. package/dist/lib/sqlite/sqlite-common.js +207 -0
  180. package/dist/lib/sqlite/sqlite-d1.d.ts +25 -0
  181. package/dist/lib/sqlite/sqlite-d1.d.ts.map +1 -0
  182. package/dist/lib/sqlite/sqlite-d1.js +67 -0
  183. package/dist/lib/sqlite/sqlite-db.d.ts +29 -0
  184. package/dist/lib/sqlite/sqlite-db.d.ts.map +1 -0
  185. package/dist/lib/sqlite/sqlite-db.js +1 -0
  186. package/dist/lib/sqlite/sqlite-node.d.ts +16 -0
  187. package/dist/lib/sqlite/sqlite-node.d.ts.map +1 -0
  188. package/dist/lib/sqlite/sqlite-node.js +68 -0
  189. package/dist/lib/sqlite/sqlite-writer.d.ts +39 -0
  190. package/dist/lib/sqlite/sqlite-writer.d.ts.map +1 -0
  191. package/dist/lib/sqlite/sqlite-writer.js +78 -0
  192. package/dist/lib/testing/bun-harness.d.ts +150 -0
  193. package/dist/lib/testing/bun-harness.d.ts.map +1 -0
  194. package/dist/lib/testing/bun-harness.js +729 -0
  195. package/dist/lib/testing/extractFacts.d.ts +73 -0
  196. package/dist/lib/testing/extractFacts.d.ts.map +1 -0
  197. package/dist/lib/testing/extractFacts.js +237 -0
  198. package/dist/lib/testing/facts.d.ts +235 -0
  199. package/dist/lib/testing/facts.d.ts.map +1 -0
  200. package/dist/lib/testing/facts.js +209 -0
  201. package/dist/lib/testing/index.d.ts +58 -0
  202. package/dist/lib/testing/index.d.ts.map +1 -0
  203. package/dist/lib/testing/index.js +74 -0
  204. package/dist/lib/testing/queryable-span.d.ts +39 -0
  205. package/dist/lib/testing/queryable-span.d.ts.map +1 -0
  206. package/dist/lib/testing/queryable-span.js +58 -0
  207. package/dist/lib/testing/span-query.d.ts +21 -0
  208. package/dist/lib/testing/span-query.d.ts.map +1 -0
  209. package/dist/lib/testing/span-query.js +47 -0
  210. package/dist/lib/testing/stdio-replay.d.ts +4 -0
  211. package/dist/lib/testing/stdio-replay.d.ts.map +1 -0
  212. package/dist/lib/testing/stdio-replay.js +42 -0
  213. package/dist/lib/testing/trace-query.d.ts +59 -0
  214. package/dist/lib/testing/trace-query.d.ts.map +1 -0
  215. package/dist/lib/testing/trace-query.js +462 -0
  216. package/dist/lib/testing/vitest-harness.d.ts +135 -0
  217. package/dist/lib/testing/vitest-harness.d.ts.map +1 -0
  218. package/dist/lib/testing/vitest-harness.js +486 -0
  219. package/dist/lib/threadId.d.ts +58 -0
  220. package/dist/lib/threadId.d.ts.map +1 -0
  221. package/dist/lib/threadId.js +123 -0
  222. package/dist/lib/traceContext.d.ts +116 -0
  223. package/dist/lib/traceContext.d.ts.map +1 -0
  224. package/dist/lib/traceContext.js +37 -0
  225. package/dist/lib/traceId.d.ts +78 -0
  226. package/dist/lib/traceId.d.ts.map +1 -0
  227. package/dist/lib/traceId.js +87 -0
  228. package/dist/lib/traceRoot.d.ts +133 -0
  229. package/dist/lib/traceRoot.d.ts.map +1 -0
  230. package/dist/lib/traceRoot.es.d.ts +75 -0
  231. package/dist/lib/traceRoot.es.d.ts.map +1 -0
  232. package/dist/lib/traceRoot.es.js +129 -0
  233. package/dist/lib/traceRoot.js +19 -0
  234. package/dist/lib/traceRoot.node.d.ts +77 -0
  235. package/dist/lib/traceRoot.node.d.ts.map +1 -0
  236. package/dist/lib/traceRoot.node.js +133 -0
  237. package/dist/lib/traceRoot.universal.d.ts +3 -0
  238. package/dist/lib/traceRoot.universal.d.ts.map +1 -0
  239. package/dist/lib/traceRoot.universal.js +17 -0
  240. package/dist/lib/tracer.d.ts +296 -0
  241. package/dist/lib/tracer.d.ts.map +1 -0
  242. package/dist/lib/tracer.js +346 -0
  243. package/dist/lib/tracers/ArrayQueueTracer.d.ts +56 -0
  244. package/dist/lib/tracers/ArrayQueueTracer.d.ts.map +1 -0
  245. package/dist/lib/tracers/ArrayQueueTracer.js +67 -0
  246. package/dist/lib/tracers/CompositeTracer.d.ts +24 -0
  247. package/dist/lib/tracers/CompositeTracer.d.ts.map +1 -0
  248. package/dist/lib/tracers/CompositeTracer.js +57 -0
  249. package/dist/lib/tracers/NoOpTracer.d.ts +58 -0
  250. package/dist/lib/tracers/NoOpTracer.d.ts.map +1 -0
  251. package/dist/lib/tracers/NoOpTracer.js +41 -0
  252. package/dist/lib/tracers/SQLiteTracer.d.ts +42 -0
  253. package/dist/lib/tracers/SQLiteTracer.d.ts.map +1 -0
  254. package/dist/lib/tracers/SQLiteTracer.js +84 -0
  255. package/dist/lib/tracers/StdioTracer.d.ts +83 -0
  256. package/dist/lib/tracers/StdioTracer.d.ts.map +1 -0
  257. package/dist/lib/tracers/StdioTracer.js +270 -0
  258. package/dist/lib/tracers/TestTracer.d.ts +95 -0
  259. package/dist/lib/tracers/TestTracer.d.ts.map +1 -0
  260. package/dist/lib/tracers/TestTracer.js +87 -0
  261. package/dist/lib/tracers/index.d.ts +12 -0
  262. package/dist/lib/tracers/index.d.ts.map +1 -0
  263. package/dist/lib/tracers/index.js +11 -0
  264. package/dist/lib/types.d.ts +366 -0
  265. package/dist/lib/types.d.ts.map +1 -0
  266. package/dist/lib/types.js +1 -0
  267. package/dist/lib/utf8Cache.d.ts +111 -0
  268. package/dist/lib/utf8Cache.d.ts.map +1 -0
  269. package/dist/lib/utf8Cache.js +177 -0
  270. package/dist/lib/wasm/WasmBufferStrategy.d.ts +88 -0
  271. package/dist/lib/wasm/WasmBufferStrategy.d.ts.map +1 -0
  272. package/dist/lib/wasm/WasmBufferStrategy.js +138 -0
  273. package/dist/lib/wasm/wasmAllocator.d.ts +109 -0
  274. package/dist/lib/wasm/wasmAllocator.d.ts.map +1 -0
  275. package/dist/lib/wasm/wasmAllocator.js +227 -0
  276. package/dist/lib/wasm/wasmSpanBuffer.d.ts +123 -0
  277. package/dist/lib/wasm/wasmSpanBuffer.d.ts.map +1 -0
  278. package/dist/lib/wasm/wasmSpanBuffer.js +772 -0
  279. package/dist/lib/wasm/wasmTraceRoot.d.ts +167 -0
  280. package/dist/lib/wasm/wasmTraceRoot.d.ts.map +1 -0
  281. package/dist/lib/wasm/wasmTraceRoot.js +264 -0
  282. package/dist/node.d.ts +7 -0
  283. package/dist/node.d.ts.map +1 -0
  284. package/dist/node.js +8 -0
  285. package/dist/testing.d.ts +18 -0
  286. package/dist/testing.d.ts.map +1 -0
  287. package/dist/testing.js +17 -0
  288. package/package.json +193 -0
  289. package/src/bun/preload.ts +11 -0
  290. package/src/bun/trace-preload.ts +14 -0
  291. package/src/es.ts +11 -0
  292. package/src/index.ts +194 -0
  293. package/src/lib/JsBufferStrategy.ts +102 -0
  294. package/src/lib/__tests__/arrow-builder-integration/arrow-conversion.test.ts +485 -0
  295. package/src/lib/__tests__/arrow-builder-integration/binary-arrow-conversion.test.ts +390 -0
  296. package/src/lib/__tests__/arrow-builder-integration/binary-comparison.test.ts +647 -0
  297. package/src/lib/__tests__/arrow-builder-integration/binary-format-compliance.test.ts +292 -0
  298. package/src/lib/__tests__/arrow-builder-integration/buffer-chaining.test.ts +354 -0
  299. package/src/lib/__tests__/arrow-builder-integration/foundation.test.ts +127 -0
  300. package/src/lib/__tests__/arrow-builder-integration/integration.test.ts +392 -0
  301. package/src/lib/__tests__/arrow-builder-integration/lazy-columns.test.ts +389 -0
  302. package/src/lib/__tests__/arrow-conversion-algorithms.test.ts +54 -0
  303. package/src/lib/__tests__/arrow-test-helpers.ts +71 -0
  304. package/src/lib/__tests__/binary-e2e.test.ts +203 -0
  305. package/src/lib/__tests__/buffer-overflow-op-api.test.ts +608 -0
  306. package/src/lib/__tests__/buffer-overflow.test.ts +612 -0
  307. package/src/lib/__tests__/capacity-tuning.test.ts +544 -0
  308. package/src/lib/__tests__/effective-schema.test.ts +439 -0
  309. package/src/lib/__tests__/flechette.test.ts +42 -0
  310. package/src/lib/__tests__/flushScheduler.test.ts +537 -0
  311. package/src/lib/__tests__/integration.test.ts +600 -0
  312. package/src/lib/__tests__/library.test.ts +934 -0
  313. package/src/lib/__tests__/nested-library-tasks.test.ts +849 -0
  314. package/src/lib/__tests__/op-context-binding.test.ts +135 -0
  315. package/src/lib/__tests__/op-metadata.test.ts +198 -0
  316. package/src/lib/__tests__/op-type-safety.test.ts +71 -0
  317. package/src/lib/__tests__/package-exports.test.ts +57 -0
  318. package/src/lib/__tests__/remapped-buffer-view-integration.test.ts +319 -0
  319. package/src/lib/__tests__/remapped-buffer-view.test.ts +635 -0
  320. package/src/lib/__tests__/scope-attributes.test.ts +348 -0
  321. package/src/lib/__tests__/span-lifecycle.test.ts +680 -0
  322. package/src/lib/__tests__/sync-async-trace.test.ts +435 -0
  323. package/src/lib/__tests__/test-helpers.ts +318 -0
  324. package/src/lib/__tests__/timestamp.test.ts +259 -0
  325. package/src/lib/__tests__/trace-archive-primitives.test.ts +98 -0
  326. package/src/lib/__tests__/traceContext-type-enforcement.test.ts +271 -0
  327. package/src/lib/__tests__/tracer.test.ts +211 -0
  328. package/src/lib/__tests__/type-narrowing.test.ts +137 -0
  329. package/src/lib/archive/chunkCompaction.ts +44 -0
  330. package/src/lib/archive/chunkEnvelope.ts +79 -0
  331. package/src/lib/archive/chunkRouting.ts +70 -0
  332. package/src/lib/archive/chunkStats.ts +25 -0
  333. package/src/lib/archive/index.ts +4 -0
  334. package/src/lib/arrow/capacityStats.ts +340 -0
  335. package/src/lib/arrow/dictionaries.ts +159 -0
  336. package/src/lib/arrow/flechette.ts +114 -0
  337. package/src/lib/arrow/utils.ts +126 -0
  338. package/src/lib/buffer/Nanoseconds.ts +131 -0
  339. package/src/lib/bufferStrategy.ts +106 -0
  340. package/src/lib/capacityTuning.ts +102 -0
  341. package/src/lib/codegen/__tests__/__snapshots__/evaluatorGenerator.test.ts.snap +160 -0
  342. package/src/lib/codegen/__tests__/__snapshots__/scopeGenerator.test.ts.snap +196 -0
  343. package/src/lib/codegen/__tests__/__snapshots__/spanLoggerGenerator.test.ts.snap +1965 -0
  344. package/src/lib/codegen/__tests__/evaluatorGenerator.test.ts +516 -0
  345. package/src/lib/codegen/__tests__/nullBitmap.test.ts +207 -0
  346. package/src/lib/codegen/__tests__/spanLoggerGenerator.test.ts +237 -0
  347. package/src/lib/codegen/evaluatorGenerator.ts +309 -0
  348. package/src/lib/codegen/fixedPositionWriterGenerator.ts +444 -0
  349. package/src/lib/codegen/spanLoggerGenerator.ts +715 -0
  350. package/src/lib/convertToArrow.ts +1805 -0
  351. package/src/lib/defineOpContext.ts +398 -0
  352. package/src/lib/errors/Blocked.ts +165 -0
  353. package/src/lib/errors/CodeError.ts +132 -0
  354. package/src/lib/errors/RetriesExhausted.ts +78 -0
  355. package/src/lib/errors/Transient.ts +168 -0
  356. package/src/lib/errors/__tests__/Blocked-config.test.ts +152 -0
  357. package/src/lib/errors/__tests__/Transient.test.ts +129 -0
  358. package/src/lib/errors/__tests__/retry-policy.test.ts +85 -0
  359. package/src/lib/errors/index.ts +24 -0
  360. package/src/lib/errors/retry-policy.ts +87 -0
  361. package/src/lib/flushScheduler.ts +509 -0
  362. package/src/lib/library.ts +682 -0
  363. package/src/lib/logApi.ts +70 -0
  364. package/src/lib/logBinding.ts +67 -0
  365. package/src/lib/op.ts +103 -0
  366. package/src/lib/opContext/__tests__/retry.test.ts +764 -0
  367. package/src/lib/opContext/contextTypes.ts +130 -0
  368. package/src/lib/opContext/createOpGroup.ts +456 -0
  369. package/src/lib/opContext/defineOp.ts +281 -0
  370. package/src/lib/opContext/featureFlagTypes.ts +54 -0
  371. package/src/lib/opContext/index.ts +16 -0
  372. package/src/lib/opContext/opGroupTypes.ts +342 -0
  373. package/src/lib/opContext/opTypes.ts +80 -0
  374. package/src/lib/opContext/spanContextTypes.ts +398 -0
  375. package/src/lib/opContext/types.ts +403 -0
  376. package/src/lib/result.ts +550 -0
  377. package/src/lib/schema/LogSchema.ts +153 -0
  378. package/src/lib/schema/__tests__/defineLogSchema.test.ts +342 -0
  379. package/src/lib/schema/__tests__/featureFlags.test.ts +443 -0
  380. package/src/lib/schema/builder.ts +201 -0
  381. package/src/lib/schema/defineFeatureFlags.ts +91 -0
  382. package/src/lib/schema/defineLogSchema.ts +291 -0
  383. package/src/lib/schema/evaluator.ts +404 -0
  384. package/src/lib/schema/extend.ts +69 -0
  385. package/src/lib/schema/systemSchema.ts +339 -0
  386. package/src/lib/schema/typeGuards.ts +163 -0
  387. package/src/lib/schema/types.ts +265 -0
  388. package/src/lib/spanBuffer.ts +571 -0
  389. package/src/lib/spanBufferHelpers.ts +73 -0
  390. package/src/lib/spanBufferStats.ts +40 -0
  391. package/src/lib/spanContext.ts +1566 -0
  392. package/src/lib/sqlite/__tests__/sqlite-common.test.ts +89 -0
  393. package/src/lib/sqlite/index.ts +26 -0
  394. package/src/lib/sqlite/sqlite-async-writer.ts +101 -0
  395. package/src/lib/sqlite/sqlite-common.ts +309 -0
  396. package/src/lib/sqlite/sqlite-d1.ts +104 -0
  397. package/src/lib/sqlite/sqlite-db.ts +32 -0
  398. package/src/lib/sqlite/sqlite-node.ts +83 -0
  399. package/src/lib/sqlite/sqlite-writer.ts +128 -0
  400. package/src/lib/testing/TRACE-TESTING.md +100 -0
  401. package/src/lib/testing/__tests__/bun-harness.test.ts +108 -0
  402. package/src/lib/testing/__tests__/extractFacts.test.ts +279 -0
  403. package/src/lib/testing/__tests__/facts.test.ts +324 -0
  404. package/src/lib/testing/__tests__/vitest-harness.test.ts +32 -0
  405. package/src/lib/testing/bun-harness.ts +990 -0
  406. package/src/lib/testing/extractFacts.ts +362 -0
  407. package/src/lib/testing/facts.ts +470 -0
  408. package/src/lib/testing/index.ts +141 -0
  409. package/src/lib/testing/queryable-span.ts +108 -0
  410. package/src/lib/testing/span-query.ts +65 -0
  411. package/src/lib/testing/stdio-replay.ts +50 -0
  412. package/src/lib/testing/trace-query.ts +329 -0
  413. package/src/lib/testing/vitest-harness.ts +691 -0
  414. package/src/lib/threadId.ts +135 -0
  415. package/src/lib/traceContext.ts +182 -0
  416. package/src/lib/traceId.ts +142 -0
  417. package/src/lib/traceRoot.es.ts +157 -0
  418. package/src/lib/traceRoot.node.ts +170 -0
  419. package/src/lib/traceRoot.ts +154 -0
  420. package/src/lib/traceRoot.universal.ts +22 -0
  421. package/src/lib/tracer.ts +896 -0
  422. package/src/lib/tracers/ArrayQueueTracer.ts +76 -0
  423. package/src/lib/tracers/CompositeTracer.ts +76 -0
  424. package/src/lib/tracers/NoOpTracer.ts +73 -0
  425. package/src/lib/tracers/SQLiteTracer.ts +115 -0
  426. package/src/lib/tracers/StdioTracer.ts +380 -0
  427. package/src/lib/tracers/TestTracer.ts +146 -0
  428. package/src/lib/tracers/__tests__/ArrayQueueTracer.test.ts +184 -0
  429. package/src/lib/tracers/__tests__/NoOpTracer.test.ts +204 -0
  430. package/src/lib/tracers/__tests__/StdioTracer.test.ts +313 -0
  431. package/src/lib/tracers/__tests__/TestTracer.test.ts +200 -0
  432. package/src/lib/tracers/index.ts +12 -0
  433. package/src/lib/types.ts +498 -0
  434. package/src/lib/utf8Cache.ts +201 -0
  435. package/src/lib/wasm/WasmBufferStrategy.ts +219 -0
  436. package/src/lib/wasm/__tests__/WasmBufferStrategy.test.ts +256 -0
  437. package/src/lib/wasm/__tests__/wasm-integration.test.ts +476 -0
  438. package/src/lib/wasm/__tests__/wasmAllocator.test.ts +699 -0
  439. package/src/lib/wasm/__tests__/wasmSpanBuffer.test.ts +449 -0
  440. package/src/lib/wasm/__tests__/wasmTraceRoot.test.ts +390 -0
  441. package/src/lib/wasm/__tests__/wasmTracer.test.ts.disabled +444 -0
  442. package/src/lib/wasm/allocator.zig +945 -0
  443. package/src/lib/wasm/wasmAllocator.ts +469 -0
  444. package/src/lib/wasm/wasmSpanBuffer.ts +1014 -0
  445. package/src/lib/wasm/wasmTraceRoot.ts +315 -0
  446. package/src/node.ts +10 -0
  447. package/src/testing.ts +18 -0
@@ -0,0 +1,116 @@
1
+ /**
2
+ * TraceContext Types and Prototype System
3
+ *
4
+ * Per specs/lmao/01c_context_flow_and_op_wrappers.md and specs/lmao/01l_op_context_pattern.md:
5
+ * - TraceContext is created via module.traceContext() at request entry
6
+ * - Uses prototype-based inheritance for V8 hidden class optimization
7
+ * - Contains system properties (traceId, timestamps, threadId) + user Extra
8
+ */
9
+ import type { OpContext } from './opContext/types.js';
10
+ import type { Result } from './result.js';
11
+ import type { FeatureFlagSchema } from './schema/defineFeatureFlags.js';
12
+ import type { FlagEvaluator } from './schema/evaluator.js';
13
+ import type { LogSchema } from './schema/types.js';
14
+ import type { TraceId } from './traceId.js';
15
+ /**
16
+ * Reserved keys that Extra cannot contain (compile-time enforcement)
17
+ *
18
+ * Per spec 01l lines 379-386
19
+ */
20
+ export type ReservedTraceContextKeys = 'traceId' | 'anchorEpochMicros' | 'anchorPerfNow' | 'threadId' | 'ff' | 'span';
21
+ /**
22
+ * Op type - traced operation
23
+ *
24
+ * Imported from op.ts to break circular dependency.
25
+ * The actual Op class is defined in op.ts.
26
+ */
27
+ import type { Op } from './op.js';
28
+ export type { Op } from './op.js';
29
+ /**
30
+ * Function type for ctx.span() at the root level
31
+ *
32
+ * Per spec 01c lines 243-244 and experiment exp7-full-ctx.ts lines 253-259:
33
+ * Supports both with and without line number (transformer injects line number)
34
+ *
35
+ * The first argument (lineNumber) is injected by the transformer.
36
+ */
37
+ export type RootSpanFn = {
38
+ <Ctx extends OpContext, Args extends unknown[], S, E>(line: number, name: string, op: Op<Ctx, Args, S, E>, ...args: Args): Promise<Result<S, E>>;
39
+ <Ctx extends OpContext, Args extends unknown[], S, E>(name: string, op: Op<Ctx, Args, S, E>, ...args: Args): Promise<Result<S, E>>;
40
+ };
41
+ /**
42
+ * TraceContext system properties - root context created via module.traceContext()
43
+ *
44
+ * Per spec 01c lines 206-216 and 01l lines 369-377:
45
+ * - System properties are auto-generated and cannot be overridden via Extra
46
+ *
47
+ * @typeParam FF - Feature flag schema type
48
+ * @typeParam T - LogSchema type (for typed evaluation context)
49
+ * @typeParam Env - Environment type
50
+ */
51
+ export interface TraceContextSystem<FF extends FeatureFlagSchema, T extends LogSchema = LogSchema, Env extends Record<string, unknown> = Record<string, unknown>> {
52
+ readonly anchorEpochMicros: number;
53
+ readonly anchorPerfNow: number;
54
+ /** Root flag evaluator - use forContext(spanCtx) to get span-bound evaluator */
55
+ readonly ff: FlagEvaluator<OpContext<T, FF, Record<string, never>, Env>>;
56
+ readonly span: RootSpanFn;
57
+ }
58
+ /**
59
+ * TraceContext - system properties + user Extra
60
+ *
61
+ * Per spec 01c lines 215-216:
62
+ * ```typescript
63
+ * interface TraceContext<FF, Extra> { ... } & Extra;
64
+ * ```
65
+ *
66
+ * Extra properties are spread via intersection at usage site.
67
+ *
68
+ * @typeParam FF - Feature flag schema type
69
+ * @typeParam Extra - User-defined properties (e.g., requestId, userId, env)
70
+ */
71
+ export type TraceContext<FF extends FeatureFlagSchema, Extra extends Record<string, unknown>> = TraceContextSystem<FF> & Extra;
72
+ /**
73
+ * Internal symbol to mark contexts as prototype-based
74
+ * Used for type guards and instanceof-like checks
75
+ */
76
+ export declare const TRACE_CONTEXT_MARKER: unique symbol;
77
+ /**
78
+ * Base prototype interface for all trace contexts.
79
+ *
80
+ * Per specs/lmao/01c_context_flow_and_op_wrappers.md:
81
+ * - Methods are defined ONCE on a shared prototype
82
+ * - Object.create() is used for inheritance (no object spreads)
83
+ * - Properties are assigned directly for stable hidden classes
84
+ *
85
+ * This is used internally and should not be accessed directly.
86
+ */
87
+ export interface TraceContextBase {
88
+ /** Marker for prototype chain detection */
89
+ readonly [TRACE_CONTEXT_MARKER]: true;
90
+ /** Trace ID for this context */
91
+ trace_id: TraceId | undefined;
92
+ /** Epoch microseconds when trace started */
93
+ anchorEpochMicros: number | undefined;
94
+ /** performance.now() when trace started */
95
+ anchorPerfNow: number | undefined;
96
+ /** Feature flag evaluator */
97
+ ff: unknown;
98
+ /** Root span function */
99
+ span: unknown;
100
+ /** Pre-computed Extra keys for V8 optimization (avoid Object.keys in hot path) */
101
+ _extraKeys?: string[];
102
+ }
103
+ /**
104
+ * The shared prototype object for TraceContext.
105
+ *
106
+ * Per V8 optimization guidelines:
107
+ * - Define methods ONCE on prototype, not per-instance
108
+ * - Use Object.create() for inheritance chains
109
+ * - Avoid object spreads which break hidden classes
110
+ */
111
+ export declare const TraceContextProto: TraceContextBase;
112
+ /**
113
+ * Type guard to check if a value is a TraceContext
114
+ */
115
+ export declare function isTraceContext(value: unknown): value is TraceContext<FeatureFlagSchema, Record<string, unknown>>;
116
+ //# sourceMappingURL=traceContext.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"traceContext.d.ts","sourceRoot":"","sources":["../../src/lib/traceContext.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AACxE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAM5C;;;;GAIG;AACH,MAAM,MAAM,wBAAwB,GAAG,SAAS,GAAG,mBAAmB,GAAG,eAAe,GAAG,UAAU,GAAG,IAAI,GAAG,MAAM,CAAC;AAMtH;;;;;GAKG;AACH,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,SAAS,CAAC;AAElC,YAAY,EAAE,EAAE,EAAE,MAAM,SAAS,CAAC;AAMlC;;;;;;;GAOG;AACH,MAAM,MAAM,UAAU,GAAG;IAEvB,CAAC,GAAG,SAAS,SAAS,EAAE,IAAI,SAAS,OAAO,EAAE,EAAE,CAAC,EAAE,CAAC,EAClD,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,EAAE,EAAE,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,EACvB,GAAG,IAAI,EAAE,IAAI,GACZ,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAEzB,CAAC,GAAG,SAAS,SAAS,EAAE,IAAI,SAAS,OAAO,EAAE,EAAE,CAAC,EAAE,CAAC,EAClD,IAAI,EAAE,MAAM,EACZ,EAAE,EAAE,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,EACvB,GAAG,IAAI,EAAE,IAAI,GACZ,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;CAC1B,CAAC;AAMF;;;;;;;;;GASG;AACH,MAAM,WAAW,kBAAkB,CACjC,EAAE,SAAS,iBAAiB,EAC5B,CAAC,SAAS,SAAS,GAAG,SAAS,EAC/B,GAAG,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAG7D,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,gFAAgF;IAChF,QAAQ,CAAC,EAAE,EAAE,aAAa,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;IACzE,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;CAC3B;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,MAAM,YAAY,CAAC,EAAE,SAAS,iBAAiB,EAAE,KAAK,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,kBAAkB,CAAC,EAAE,CAAC,GACpH,KAAK,CAAC;AAMR;;;GAGG;AACH,eAAO,MAAM,oBAAoB,eAAkC,CAAC;AAEpE;;;;;;;;;GASG;AACH,MAAM,WAAW,gBAAgB;IAC/B,2CAA2C;IAC3C,QAAQ,CAAC,CAAC,oBAAoB,CAAC,EAAE,IAAI,CAAC;IACtC,gCAAgC;IAChC,QAAQ,EAAE,OAAO,GAAG,SAAS,CAAC;IAC9B,4CAA4C;IAC5C,iBAAiB,EAAE,MAAM,GAAG,SAAS,CAAC;IACtC,2CAA2C;IAC3C,aAAa,EAAE,MAAM,GAAG,SAAS,CAAC;IAClC,6BAA6B;IAC7B,EAAE,EAAE,OAAO,CAAC;IACZ,yBAAyB;IACzB,IAAI,EAAE,OAAO,CAAC;IACd,kFAAkF;IAClF,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;CACvB;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,iBAAiB,EAAE,gBAQ/B,CAAC;AAMF;;GAEG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,YAAY,CAAC,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAOhH"}
@@ -0,0 +1,37 @@
1
+ // =============================================================================
2
+ // Prototype System for V8 Hidden Class Optimization
3
+ // =============================================================================
4
+ /**
5
+ * Internal symbol to mark contexts as prototype-based
6
+ * Used for type guards and instanceof-like checks
7
+ */
8
+ export const TRACE_CONTEXT_MARKER = Symbol.for('lmao.TraceContext');
9
+ /**
10
+ * The shared prototype object for TraceContext.
11
+ *
12
+ * Per V8 optimization guidelines:
13
+ * - Define methods ONCE on prototype, not per-instance
14
+ * - Use Object.create() for inheritance chains
15
+ * - Avoid object spreads which break hidden classes
16
+ */
17
+ export const TraceContextProto = {
18
+ [TRACE_CONTEXT_MARKER]: true,
19
+ trace_id: undefined,
20
+ anchorEpochMicros: undefined,
21
+ anchorPerfNow: undefined,
22
+ ff: undefined,
23
+ span: undefined,
24
+ _extraKeys: undefined,
25
+ };
26
+ // =============================================================================
27
+ // Type Guard
28
+ // =============================================================================
29
+ /**
30
+ * Type guard to check if a value is a TraceContext
31
+ */
32
+ export function isTraceContext(value) {
33
+ return (typeof value === 'object' &&
34
+ value !== null &&
35
+ TRACE_CONTEXT_MARKER in value &&
36
+ value[TRACE_CONTEXT_MARKER] === true);
37
+ }
@@ -0,0 +1,78 @@
1
+ /**
2
+ * TraceId - Branded string type for trace identification
3
+ *
4
+ * A TraceId is a string that uniquely identifies a distributed trace.
5
+ * It's validated to be non-empty and at most 128 characters (ASCII).
6
+ *
7
+ * Common formats:
8
+ * - W3C Trace Context: 32 hex chars (e.g., "0af7651916cd43dd8448eb211c80319c")
9
+ * - OpenTelemetry: same as W3C
10
+ * - Custom: any string up to 128 chars
11
+ *
12
+ * @module traceId
13
+ */
14
+ /** Maximum length for a trace ID */
15
+ export declare const MAX_TRACE_ID_LENGTH = 128;
16
+ /** Branded type for validated trace IDs */
17
+ export type TraceId = string & {
18
+ readonly __brand: 'TraceId';
19
+ };
20
+ /**
21
+ * Validate and create a TraceId from a string.
22
+ * @throws Error if validation fails
23
+ */
24
+ export declare function createTraceId(value: string): TraceId;
25
+ /**
26
+ * Check if a value is a valid TraceId without throwing.
27
+ */
28
+ export declare function isValidTraceId(value: unknown): value is TraceId;
29
+ /**
30
+ * Generate a new random TraceId (W3C format: 32 hex chars).
31
+ */
32
+ export declare function generateTraceId(): TraceId;
33
+ /**
34
+ * SpanIdentity - Identifies a specific span for external correlation.
35
+ *
36
+ * distributed tracing headers, error reporting). Contains the minimal fields needed
37
+ * to uniquely identify a span within a trace.
38
+ *
39
+ * **Usage:**
40
+ * ```typescript
41
+ * // Extract from buffer
42
+ * const identity: SpanIdentity = {
43
+ * trace_id: buffer.trace_id,
44
+ * span_id: buffer.span_id,
45
+ * thread_id: buffer.thread_id,
46
+ * };
47
+ *
48
+ * // Use in signals/messages
49
+ * signalReportDown({ service, reporter, span: identity });
50
+ * ```
51
+ *
52
+ * **Fields:**
53
+ * - `trace_id`: 128-bit UUID identifying the entire trace (branded string)
54
+ * - `span_id`: 32-bit counter unique within the trace
55
+ * - `thread_id`: 64-bit identifier for execution thread/context
56
+ *
57
+ * @see specs/lmao/01b4_span_identity.md for full identity design
58
+ */
59
+ export interface SpanIdentity {
60
+ /** Trace ID - 128-bit UUID identifying the entire trace */
61
+ readonly trace_id: TraceId;
62
+ /** Span ID - 32-bit counter unique within this trace */
63
+ readonly span_id: number;
64
+ /** Thread ID - 64-bit identifier for execution thread/context */
65
+ readonly thread_id: bigint;
66
+ }
67
+ /**
68
+ * Extract SpanIdentity from a span buffer.
69
+ *
70
+ * @param buffer - Any object with trace_id, span_id, thread_id properties
71
+ * @returns SpanIdentity for external correlation
72
+ */
73
+ export declare function extractSpanIdentity(buffer: {
74
+ trace_id: TraceId;
75
+ span_id: number;
76
+ thread_id: bigint;
77
+ }): SpanIdentity;
78
+ //# sourceMappingURL=traceId.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"traceId.d.ts","sourceRoot":"","sources":["../../src/lib/traceId.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,oCAAoC;AACpC,eAAO,MAAM,mBAAmB,MAAM,CAAC;AAEvC,2CAA2C;AAC3C,MAAM,MAAM,OAAO,GAAG,MAAM,GAAG;IAAE,QAAQ,CAAC,OAAO,EAAE,SAAS,CAAA;CAAE,CAAC;AAU/D;;;GAGG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAcpD;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,OAAO,CAI/D;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,OAAO,CA0BzC;AAMD;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,MAAM,WAAW,YAAY;IAC3B,2DAA2D;IAC3D,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAE3B,wDAAwD;IACxD,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IAEzB,iEAAiE;IACjE,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE;IAAE,QAAQ,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GAAG,YAAY,CAMnH"}
@@ -0,0 +1,87 @@
1
+ /**
2
+ * TraceId - Branded string type for trace identification
3
+ *
4
+ * A TraceId is a string that uniquely identifies a distributed trace.
5
+ * It's validated to be non-empty and at most 128 characters (ASCII).
6
+ *
7
+ * Common formats:
8
+ * - W3C Trace Context: 32 hex chars (e.g., "0af7651916cd43dd8448eb211c80319c")
9
+ * - OpenTelemetry: same as W3C
10
+ * - Custom: any string up to 128 chars
11
+ *
12
+ * @module traceId
13
+ */
14
+ /** Maximum length for a trace ID */
15
+ export const MAX_TRACE_ID_LENGTH = 128;
16
+ function brandTraceId(value) {
17
+ return value;
18
+ }
19
+ /** Precompiled regex for non-ASCII detection (2x faster than loop) */
20
+ const NON_ASCII_REGEX = /[^\x20-\x7E]/;
21
+ /**
22
+ * Validate and create a TraceId from a string.
23
+ * @throws Error if validation fails
24
+ */
25
+ export function createTraceId(value) {
26
+ if (typeof value !== 'string') {
27
+ throw new Error('TraceId must be a string');
28
+ }
29
+ if (value.length === 0) {
30
+ throw new Error('TraceId cannot be empty');
31
+ }
32
+ if (value.length > MAX_TRACE_ID_LENGTH) {
33
+ throw new Error(`TraceId cannot exceed ${MAX_TRACE_ID_LENGTH} characters`);
34
+ }
35
+ if (NON_ASCII_REGEX.test(value)) {
36
+ throw new Error('TraceId must be ASCII printable characters only');
37
+ }
38
+ return brandTraceId(value);
39
+ }
40
+ /**
41
+ * Check if a value is a valid TraceId without throwing.
42
+ */
43
+ export function isValidTraceId(value) {
44
+ return (typeof value === 'string' && value.length > 0 && value.length <= MAX_TRACE_ID_LENGTH && !NON_ASCII_REGEX.test(value));
45
+ }
46
+ /**
47
+ * Generate a new random TraceId (W3C format: 32 hex chars).
48
+ */
49
+ export function generateTraceId() {
50
+ const bytes = new Uint8Array(16);
51
+ if (typeof crypto !== 'undefined' && typeof crypto.getRandomValues === 'function') {
52
+ crypto.getRandomValues(bytes);
53
+ }
54
+ else {
55
+ try {
56
+ const nodeCrypto = require('node:crypto');
57
+ if (nodeCrypto?.randomFillSync) {
58
+ nodeCrypto.randomFillSync(bytes);
59
+ }
60
+ }
61
+ catch {
62
+ // Fallback to Math.random (not ideal but works)
63
+ for (let i = 0; i < 16; i++) {
64
+ bytes[i] = Math.floor(Math.random() * 256);
65
+ }
66
+ }
67
+ }
68
+ // Convert to hex string
69
+ let hex = '';
70
+ for (let i = 0; i < 16; i++) {
71
+ hex += bytes[i].toString(16).padStart(2, '0');
72
+ }
73
+ return brandTraceId(hex);
74
+ }
75
+ /**
76
+ * Extract SpanIdentity from a span buffer.
77
+ *
78
+ * @param buffer - Any object with trace_id, span_id, thread_id properties
79
+ * @returns SpanIdentity for external correlation
80
+ */
81
+ export function extractSpanIdentity(buffer) {
82
+ return {
83
+ trace_id: buffer.trace_id,
84
+ span_id: buffer.span_id,
85
+ thread_id: buffer.thread_id,
86
+ };
87
+ }
@@ -0,0 +1,133 @@
1
+ /**
2
+ * TraceRoot - Platform-agnostic interface for trace anchoring and timestamp writes.
3
+ *
4
+ * TraceRoot manages:
5
+ * - Trace ID storage
6
+ * - Timestamp anchoring (epoch + high-res timer reference)
7
+ * - Writing span-start/span-end to SpanBuffer's _system columns
8
+ *
9
+ * Platform-specific implementations:
10
+ * - TraceRoot.es.ts: Browser - uses performance.now() for timing
11
+ * - TraceRoot.node.ts: Node.js - delegates to NAPI addon for optimized writes
12
+ *
13
+ * @module traceRoot
14
+ */
15
+ import type { Nanoseconds } from '@smoothbricks/arrow-builder';
16
+ import type { AnySpanBuffer } from './types.js';
17
+ export type { SpanIdentity, TraceId } from './traceId.js';
18
+ export { createTraceId, extractSpanIdentity, generateTraceId, isValidTraceId, MAX_TRACE_ID_LENGTH } from './traceId.js';
19
+ /**
20
+ * Tracer lifecycle hooks interface.
21
+ * Extracted to avoid circular dependency - Tracer implements this.
22
+ */
23
+ export interface TracerLifecycleHooks {
24
+ onTraceStart(buffer: unknown): void;
25
+ onTraceEnd(buffer: unknown): void;
26
+ onSpanStart(buffer: unknown): void;
27
+ onSpanEnd(buffer: unknown): void;
28
+ onStatsWillResetFor(buffer: unknown): void;
29
+ /**
30
+ * Buffer strategy for creating child and overflow buffers.
31
+ * SpanContext uses this to create child spans with the correct strategy (JS or WASM).
32
+ * Note: Caller must call writeSpanStart() after createChildSpanBuffer() to set span name.
33
+ */
34
+ readonly bufferStrategy: {
35
+ createChildSpanBuffer(parentBuffer: AnySpanBuffer, callsiteMetadata: unknown, opMetadata: unknown, capacity?: number, schema?: unknown): AnySpanBuffer;
36
+ createOverflowBuffer(buffer: AnySpanBuffer): AnySpanBuffer;
37
+ };
38
+ }
39
+ /**
40
+ * TraceRoot._system memory layout (little-endian):
41
+ *
42
+ * Offset Size Field
43
+ * 0 8 anchorEpochNanos (i64) - epoch time in nanoseconds
44
+ * 8 8 anchorPerfNow (f64) - high-res timer anchor
45
+ * 16 1 trace_id_len (u8) - length of trace_id UTF-8 bytes
46
+ * 17 N trace_id (UTF-8 bytes)
47
+ *
48
+ * Total: 17 + trace_id.length bytes
49
+ *
50
+ * This layout enables NAPI/WASM to read anchors directly without BigInt extraction.
51
+ */
52
+ export declare const TRACE_ROOT_ANCHOR_EPOCH_OFFSET = 0;
53
+ export declare const TRACE_ROOT_ANCHOR_PERF_OFFSET = 8;
54
+ export declare const TRACE_ROOT_TRACE_ID_LEN_OFFSET = 16;
55
+ export declare const TRACE_ROOT_TRACE_ID_OFFSET = 17;
56
+ /**
57
+ * TraceRoot interface - implemented by platform-specific classes.
58
+ *
59
+ * Each implementation handles timestamp calculation and span writes differently:
60
+ * - Browser: Pure JS with performance.now()
61
+ * - Node.js: NAPI addon with mach_absolute_time() / clock_gettime()
62
+ */
63
+ /**
64
+ * Factory function type for creating platform-specific TraceRoot instances.
65
+ * Passed to Tracer constructor to enable tree-shaking of unused platform code.
66
+ *
67
+ * The factory creates anchor timestamps internally using platform-specific APIs.
68
+ */
69
+ export type TraceRootFactory = (trace_id: string, tracer: TracerLifecycleHooks) => ITraceRoot;
70
+ export interface ITraceRoot {
71
+ /**
72
+ * Raw backing buffer containing anchor timestamps and trace_id.
73
+ * NAPI/WASM can read this directly without BigInt extraction.
74
+ */
75
+ readonly _system: ArrayBuffer;
76
+ /**
77
+ * Tracer reference for lifecycle hooks and event callbacks.
78
+ */
79
+ readonly tracer: TracerLifecycleHooks;
80
+ /**
81
+ * Trace ID for this trace.
82
+ */
83
+ readonly trace_id: string;
84
+ /**
85
+ * Epoch time in nanoseconds when trace was created.
86
+ * Used by SpanLogger for log entry timestamps.
87
+ */
88
+ readonly anchorEpochNanos: bigint;
89
+ /**
90
+ * High-resolution timer anchor when trace was created.
91
+ * Browser: performance.now() value (number)
92
+ * Node.js: stored as number for NAPI compatibility, but represents hrtime
93
+ */
94
+ readonly anchorPerfNow: number;
95
+ /**
96
+ * Get current timestamp in nanoseconds since Unix epoch.
97
+ * Platform-specific implementation.
98
+ */
99
+ getTimestampNanos(): Nanoseconds;
100
+ /**
101
+ * Write span-start entry to buffer at row 0.
102
+ *
103
+ * Writes:
104
+ * - timestamp[0] = current time
105
+ * - entry_type[0] = SPAN_START
106
+ * - entry_type[1] = SPAN_EXCEPTION (pre-initialized for crash safety)
107
+ * - timestamp[1] = 0 (will be set on completion)
108
+ * - message[0] = spanName
109
+ * - _writeIndex = 2
110
+ *
111
+ * @param buffer - SpanBuffer to write to
112
+ * @param spanName - Name for this span
113
+ */
114
+ writeSpanStart(buffer: AnySpanBuffer, spanName: string): void;
115
+ /**
116
+ * Write span-end entry to buffer at row 1.
117
+ * Writes both timestamp and entry_type.
118
+ *
119
+ * @param buffer - SpanBuffer to write to
120
+ * @param entryType - Entry type (SPAN_OK, SPAN_ERR, or SPAN_EXCEPTION)
121
+ */
122
+ writeSpanEnd(buffer: AnySpanBuffer, entryType: number): void;
123
+ /**
124
+ * Write log entry: bump writeIndex, write timestamp + entry_type, return idx.
125
+ * SpanLogger uses returned idx for string column writes.
126
+ *
127
+ * @param buffer - SpanBuffer to write to
128
+ * @param entryType - Entry type (INFO, DEBUG, WARN, ERROR, TRACE, FF_ACCESS, FF_USAGE)
129
+ * @returns The row index where entry was written
130
+ */
131
+ writeLogEntry(buffer: AnySpanBuffer, entryType: number): number;
132
+ }
133
+ //# sourceMappingURL=traceRoot.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"traceRoot.d.ts","sourceRoot":"","sources":["../../src/lib/traceRoot.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAC/D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD,YAAY,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAE1D,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,eAAe,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAExH;;;GAGG;AACH,MAAM,WAAW,oBAAoB;IACnC,YAAY,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI,CAAC;IACpC,UAAU,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI,CAAC;IAClC,WAAW,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI,CAAC;IACnC,SAAS,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI,CAAC;IACjC,mBAAmB,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI,CAAC;IAE3C;;;;OAIG;IACH,QAAQ,CAAC,cAAc,EAAE;QACvB,qBAAqB,CACnB,YAAY,EAAE,aAAa,EAC3B,gBAAgB,EAAE,OAAO,EACzB,UAAU,EAAE,OAAO,EACnB,QAAQ,CAAC,EAAE,MAAM,EACjB,MAAM,CAAC,EAAE,OAAO,GACf,aAAa,CAAC;QACjB,oBAAoB,CAAC,MAAM,EAAE,aAAa,GAAG,aAAa,CAAC;KAC5D,CAAC;CACH;AAED;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,8BAA8B,IAAI,CAAC;AAChD,eAAO,MAAM,6BAA6B,IAAI,CAAC;AAC/C,eAAO,MAAM,8BAA8B,KAAK,CAAC;AACjD,eAAO,MAAM,0BAA0B,KAAK,CAAC;AAE7C;;;;;;GAMG;AACH;;;;;GAKG;AACH,MAAM,MAAM,gBAAgB,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,oBAAoB,KAAK,UAAU,CAAC;AAE9F,MAAM,WAAW,UAAU;IACzB;;;OAGG;IACH,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAC;IAE9B;;OAEG;IACH,QAAQ,CAAC,MAAM,EAAE,oBAAoB,CAAC;IAEtC;;OAEG;IACH,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAE1B;;;OAGG;IACH,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAElC;;;;OAIG;IACH,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAE/B;;;OAGG;IACH,iBAAiB,IAAI,WAAW,CAAC;IAEjC;;;;;;;;;;;;;OAaG;IACH,cAAc,CAAC,MAAM,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IAE9D;;;;;;OAMG;IACH,YAAY,CAAC,MAAM,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IAE7D;;;;;;;OAOG;IACH,aAAa,CAAC,MAAM,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAAC;CACjE"}
@@ -0,0 +1,75 @@
1
+ /**
2
+ * TraceRoot - Browser/ES implementation.
3
+ *
4
+ * Uses performance.now() for timing with microsecond precision (~5-20μs).
5
+ * Last 3 digits of nanoseconds are always 000.
6
+ *
7
+ * For Node.js with NAPI-optimized writes, use traceRoot.node.ts instead.
8
+ *
9
+ * @module traceRoot.es
10
+ */
11
+ import { Nanoseconds } from '@smoothbricks/arrow-builder';
12
+ import { type TraceId } from './traceId.js';
13
+ import { type ITraceRoot, type TracerLifecycleHooks } from './traceRoot.js';
14
+ import type { AnySpanBuffer } from './types.js';
15
+ /**
16
+ * TraceRoot - Browser implementation with performance.now() timing.
17
+ *
18
+ * Stores anchor data in _system ArrayBuffer for consistency with Node.js layout,
19
+ * but all timestamp calculations are done in pure JS.
20
+ */
21
+ export declare class TraceRoot implements ITraceRoot {
22
+ /**
23
+ * Raw backing buffer containing anchor timestamps and trace_id.
24
+ */
25
+ readonly _system: ArrayBuffer;
26
+ /**
27
+ * Tracer reference for lifecycle hooks and event callbacks.
28
+ */
29
+ readonly tracer: TracerLifecycleHooks;
30
+ /**
31
+ * Cached TypedArray views for fast JS access.
32
+ */
33
+ private readonly _epochView;
34
+ private readonly _perfView;
35
+ constructor(trace_id: TraceId, anchorEpochNanos: bigint, anchorPerfNow: number, tracer: TracerLifecycleHooks);
36
+ /**
37
+ * Epoch time in nanoseconds when trace was created.
38
+ */
39
+ get anchorEpochNanos(): bigint;
40
+ /**
41
+ * High-resolution timer anchor when trace was created (performance.now() value).
42
+ */
43
+ get anchorPerfNow(): number;
44
+ /**
45
+ * Trace ID for this trace.
46
+ */
47
+ get trace_id(): TraceId;
48
+ /**
49
+ * Get current timestamp in nanoseconds since Unix epoch.
50
+ * Uses performance.now() - microsecond precision (last 3 digits = 000).
51
+ */
52
+ getTimestampNanos(): Nanoseconds;
53
+ /**
54
+ * Write span-start entry to buffer at row 0.
55
+ *
56
+ * Pure JS implementation - writes timestamp, entry_type, message, and sets _writeIndex.
57
+ */
58
+ writeSpanStart(buffer: AnySpanBuffer, spanName: string): void;
59
+ /**
60
+ * Write span-end entry to buffer at row 1.
61
+ * Writes both timestamp and entry_type.
62
+ */
63
+ writeSpanEnd(buffer: AnySpanBuffer, entryType: number): void;
64
+ /**
65
+ * Write log entry: bump writeIndex, write timestamp + entry_type, return idx.
66
+ * SpanLogger uses returned idx for string column writes.
67
+ */
68
+ writeLogEntry(buffer: AnySpanBuffer, entryType: number): number;
69
+ }
70
+ /**
71
+ * Factory function for creating browser TraceRoot instances.
72
+ * Pass this to Tracer constructor for browser/ES environments.
73
+ */
74
+ export declare function createTraceRoot(trace_id: string, tracer: TracerLifecycleHooks): TraceRoot;
75
+ //# sourceMappingURL=traceRoot.es.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"traceRoot.es.d.ts","sourceRoot":"","sources":["../../src/lib/traceRoot.es.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAE1D,OAAO,EAAiB,KAAK,OAAO,EAAE,MAAM,cAAc,CAAC;AAC3D,OAAO,EACL,KAAK,UAAU,EAKf,KAAK,oBAAoB,EAC1B,MAAM,gBAAgB,CAAC;AACxB,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAQhD;;;;;GAKG;AACH,qBAAa,SAAU,YAAW,UAAU;IAC1C;;OAEG;IACH,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAC;IAE9B;;OAEG;IACH,QAAQ,CAAC,MAAM,EAAE,oBAAoB,CAAC;IAEtC;;OAEG;IACH,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAgB;IAC3C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAe;gBAE7B,QAAQ,EAAE,OAAO,EAAE,gBAAgB,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,EAAE,oBAAoB;IAqB5G;;OAEG;IACH,IAAI,gBAAgB,IAAI,MAAM,CAE7B;IAED;;OAEG;IACH,IAAI,aAAa,IAAI,MAAM,CAE1B;IAED;;OAEG;IACH,IAAI,QAAQ,IAAI,OAAO,CAGtB;IAED;;;OAGG;IACH,iBAAiB,IAAI,WAAW;IAOhC;;;;OAIG;IACH,cAAc,CAAC,MAAM,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI;IAc7D;;;OAGG;IACH,YAAY,CAAC,MAAM,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI;IAK5D;;;OAGG;IACH,aAAa,CAAC,MAAM,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM;CAOhE;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,oBAAoB,GAAG,SAAS,CAIzF"}
@@ -0,0 +1,129 @@
1
+ /**
2
+ * TraceRoot - Browser/ES implementation.
3
+ *
4
+ * Uses performance.now() for timing with microsecond precision (~5-20μs).
5
+ * Last 3 digits of nanoseconds are always 000.
6
+ *
7
+ * For Node.js with NAPI-optimized writes, use traceRoot.node.ts instead.
8
+ *
9
+ * @module traceRoot.es
10
+ */
11
+ import { Nanoseconds } from '@smoothbricks/arrow-builder';
12
+ import { ENTRY_TYPE_SPAN_EXCEPTION, ENTRY_TYPE_SPAN_START } from './schema/systemSchema.js';
13
+ import { createTraceId } from './traceId.js';
14
+ import { TRACE_ROOT_ANCHOR_EPOCH_OFFSET, TRACE_ROOT_ANCHOR_PERF_OFFSET, TRACE_ROOT_TRACE_ID_LEN_OFFSET, TRACE_ROOT_TRACE_ID_OFFSET, } from './traceRoot.js';
15
+ /** Shared TextEncoder for trace_id encoding (stateless, reusable) */
16
+ const textEncoder = new TextEncoder();
17
+ /** Shared TextDecoder for trace_id decoding (stateless, reusable) */
18
+ const textDecoder = new TextDecoder();
19
+ /**
20
+ * TraceRoot - Browser implementation with performance.now() timing.
21
+ *
22
+ * Stores anchor data in _system ArrayBuffer for consistency with Node.js layout,
23
+ * but all timestamp calculations are done in pure JS.
24
+ */
25
+ export class TraceRoot {
26
+ /**
27
+ * Raw backing buffer containing anchor timestamps and trace_id.
28
+ */
29
+ _system;
30
+ /**
31
+ * Tracer reference for lifecycle hooks and event callbacks.
32
+ */
33
+ tracer;
34
+ /**
35
+ * Cached TypedArray views for fast JS access.
36
+ */
37
+ _epochView;
38
+ _perfView;
39
+ constructor(trace_id, anchorEpochNanos, anchorPerfNow, tracer) {
40
+ // Allocate buffer: 17 bytes header + trace_id length
41
+ // trace_id is validated to be ASCII (1 byte per char) so length === byte length
42
+ this._system = new ArrayBuffer(TRACE_ROOT_TRACE_ID_OFFSET + trace_id.length);
43
+ this.tracer = tracer;
44
+ // Create cached views (one-time allocation)
45
+ this._epochView = new BigInt64Array(this._system, TRACE_ROOT_ANCHOR_EPOCH_OFFSET, 1);
46
+ this._perfView = new Float64Array(this._system, TRACE_ROOT_ANCHOR_PERF_OFFSET, 1);
47
+ // Write anchor data directly
48
+ this._epochView[0] = anchorEpochNanos;
49
+ this._perfView[0] = anchorPerfNow;
50
+ // Encode trace_id directly into buffer (no intermediate allocation)
51
+ const u8View = new Uint8Array(this._system, TRACE_ROOT_TRACE_ID_LEN_OFFSET);
52
+ const traceIdDest = new Uint8Array(this._system, TRACE_ROOT_TRACE_ID_OFFSET, trace_id.length);
53
+ const { written } = textEncoder.encodeInto(trace_id, traceIdDest);
54
+ u8View[0] = written;
55
+ }
56
+ /**
57
+ * Epoch time in nanoseconds when trace was created.
58
+ */
59
+ get anchorEpochNanos() {
60
+ return this._epochView[0];
61
+ }
62
+ /**
63
+ * High-resolution timer anchor when trace was created (performance.now() value).
64
+ */
65
+ get anchorPerfNow() {
66
+ return this._perfView[0];
67
+ }
68
+ /**
69
+ * Trace ID for this trace.
70
+ */
71
+ get trace_id() {
72
+ const len = new Uint8Array(this._system, TRACE_ROOT_TRACE_ID_LEN_OFFSET, 1)[0];
73
+ return createTraceId(textDecoder.decode(new Uint8Array(this._system, TRACE_ROOT_TRACE_ID_OFFSET, len)));
74
+ }
75
+ /**
76
+ * Get current timestamp in nanoseconds since Unix epoch.
77
+ * Uses performance.now() - microsecond precision (last 3 digits = 000).
78
+ */
79
+ getTimestampNanos() {
80
+ const elapsedMs = performance.now() - this._perfView[0];
81
+ // Convert to nanoseconds (last 3 digits = 000 due to microsecond precision)
82
+ const elapsedNanos = BigInt(Math.floor(elapsedMs * 1000)) * 1000n;
83
+ return Nanoseconds.unsafe(this._epochView[0] + elapsedNanos);
84
+ }
85
+ /**
86
+ * Write span-start entry to buffer at row 0.
87
+ *
88
+ * Pure JS implementation - writes timestamp, entry_type, message, and sets _writeIndex.
89
+ */
90
+ writeSpanStart(buffer, spanName) {
91
+ // Row 0: span-start
92
+ buffer.timestamp[0] = this.getTimestampNanos();
93
+ buffer.entry_type[0] = ENTRY_TYPE_SPAN_START;
94
+ buffer.message(0, spanName);
95
+ // Row 1: pre-initialize as span-exception (will be overwritten on ok/err)
96
+ buffer.entry_type[1] = ENTRY_TYPE_SPAN_EXCEPTION;
97
+ buffer.timestamp[1] = 0n;
98
+ // Events start at row 2
99
+ buffer._writeIndex = 2;
100
+ }
101
+ /**
102
+ * Write span-end entry to buffer at row 1.
103
+ * Writes both timestamp and entry_type.
104
+ */
105
+ writeSpanEnd(buffer, entryType) {
106
+ buffer.timestamp[1] = this.getTimestampNanos();
107
+ buffer.entry_type[1] = entryType;
108
+ }
109
+ /**
110
+ * Write log entry: bump writeIndex, write timestamp + entry_type, return idx.
111
+ * SpanLogger uses returned idx for string column writes.
112
+ */
113
+ writeLogEntry(buffer, entryType) {
114
+ const idx = buffer._writeIndex;
115
+ buffer.timestamp[idx] = this.getTimestampNanos();
116
+ buffer.entry_type[idx] = entryType;
117
+ buffer._writeIndex = idx + 1;
118
+ return idx;
119
+ }
120
+ }
121
+ /**
122
+ * Factory function for creating browser TraceRoot instances.
123
+ * Pass this to Tracer constructor for browser/ES environments.
124
+ */
125
+ export function createTraceRoot(trace_id, tracer) {
126
+ const anchorEpochNanos = BigInt(Date.now()) * 1000000n;
127
+ const anchorPerfNow = performance.now();
128
+ return new TraceRoot(createTraceId(trace_id), anchorEpochNanos, anchorPerfNow, tracer);
129
+ }