@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,318 @@
1
+ /**
2
+ * Test helpers for creating test buffers using the new Op-centric API.
3
+ *
4
+ * These helpers create LogBinding instances and SpanBuffers for testing
5
+ * without requiring full Op/trace context setup.
6
+ */
7
+
8
+ import { DEFAULT_BUFFER_CAPACITY } from '@smoothbricks/arrow-builder';
9
+ import { createSpanLogger, type SpanLoggerImpl } from '../codegen/spanLoggerGenerator.js';
10
+ import { defineOpContext } from '../defineOpContext.js';
11
+ import { JsBufferStrategy } from '../JsBufferStrategy.js';
12
+ import { createOpMetadata, DEFAULT_METADATA } from '../opContext/defineOp.js';
13
+ import type {
14
+ ColumnMapping,
15
+ MappedOpGroup,
16
+ MappedOpGroupInternal,
17
+ OpGroup,
18
+ OpGroupInternal,
19
+ SchemaFieldsOf,
20
+ } from '../opContext/opGroupTypes.js';
21
+ import type { OpMetadata } from '../opContext/opTypes.js';
22
+ import type { OpContext } from '../opContext/types.js';
23
+ import { LogSchema } from '../schema/LogSchema.js';
24
+ import { mergeWithSystemSchema, type SystemSchemaFieldTypes } from '../schema/systemSchema.js';
25
+ import type { SchemaFields } from '../schema/types.js';
26
+ import { createSpanBuffer } from '../spanBuffer.js';
27
+ import { createTraceId, type TraceId } from '../traceId.js';
28
+ import type { ITraceRoot, TracerLifecycleHooks } from '../traceRoot.js';
29
+ import { createTraceRoot } from '../traceRoot.node.js';
30
+ import type { TracerOptions } from '../tracer.js';
31
+ import { TestTracer } from '../tracers/TestTracer.js';
32
+ import type { LogBinding, SpanBuffer } from '../types.js';
33
+
34
+ // Create a minimal OpContextBinding for shared test trace roots.
35
+ const minimalOpContext = defineOpContext({ logSchema: new LogSchema({}) });
36
+
37
+ function requireLogSchema(value: unknown, label: string): LogSchema {
38
+ if (!(value instanceof LogSchema)) {
39
+ throw new Error(`Expected ${label} to be a LogSchema`);
40
+ }
41
+ return value;
42
+ }
43
+
44
+ function assertColumnMapping<LibSchema extends SchemaFields>(
45
+ value: unknown,
46
+ label: string,
47
+ ): asserts value is ColumnMapping<LibSchema> {
48
+ if (typeof value !== 'object' || value === null || Array.isArray(value)) {
49
+ throw new Error(`Expected ${label} to be a column mapping record`);
50
+ }
51
+ for (const [key, mappingValue] of Object.entries(value)) {
52
+ if (typeof mappingValue !== 'string' && mappingValue !== null) {
53
+ throw new Error(`Expected column mapping '${key}' in ${label} to be a string or null`);
54
+ }
55
+ }
56
+ }
57
+
58
+ function assertOpGroupInternals<Ctx extends OpContext>(
59
+ opGroup: OpGroup<Ctx>,
60
+ label: string,
61
+ ): asserts opGroup is OpGroupInternal<Ctx> {
62
+ requireLogSchema(Reflect.get(opGroup, '_logSchema'), `${label}._logSchema`);
63
+ }
64
+
65
+ function assertMappedOpGroupInternals<Ctx extends OpContext, ContributedSchema extends SchemaFields>(
66
+ opGroup: MappedOpGroup<Ctx, ContributedSchema>,
67
+ label: string,
68
+ ): asserts opGroup is MappedOpGroupInternal<Ctx, ContributedSchema> {
69
+ requireLogSchema(Reflect.get(opGroup, '_logSchema'), `${label}._logSchema`);
70
+ const columnMapping = Reflect.get(opGroup, '_columnMapping');
71
+ assertColumnMapping<SchemaFieldsOf<Ctx['logSchema']>>(columnMapping, `${label}._columnMapping`);
72
+ }
73
+
74
+ export function requireStringArray(value: unknown, label: string): string[] {
75
+ if (!Array.isArray(value) || value.some((entry) => typeof entry !== 'string')) {
76
+ throw new Error(`Expected ${label} to be a string[]`);
77
+ }
78
+ return value;
79
+ }
80
+
81
+ export function requireFloat64Array(value: unknown, label: string): Float64Array {
82
+ if (!(value instanceof Float64Array)) {
83
+ throw new Error(`Expected ${label} to be a Float64Array`);
84
+ }
85
+ return value;
86
+ }
87
+
88
+ export function requireUint8Array(value: unknown, label: string): Uint8Array {
89
+ if (!(value instanceof Uint8Array)) {
90
+ throw new Error(`Expected ${label} to be a Uint8Array`);
91
+ }
92
+ return value;
93
+ }
94
+
95
+ /**
96
+ * Default TracerOptions for tests.
97
+ * Includes JsBufferStrategy and createTraceRoot.
98
+ */
99
+ export function createTestTracerOptions<T extends LogSchema>(): TracerOptions<T> {
100
+ return {
101
+ bufferStrategy: new JsBufferStrategy<T>(),
102
+ createTraceRoot,
103
+ };
104
+ }
105
+
106
+ /**
107
+ * Shared TestTracer instance for tests that create buffers directly.
108
+ * Typed as TracerLifecycleHooks because that's what TraceRoot expects.
109
+ */
110
+ export const TEST_TRACER: TracerLifecycleHooks = new TestTracer(minimalOpContext, createTestTracerOptions());
111
+
112
+ type TestSpanBufferBundle<T extends SchemaFields> = {
113
+ logBinding: LogBinding;
114
+ spanBuffer: SpanBuffer<LogSchema<T>>;
115
+ };
116
+
117
+ type TestLoggerBundle<T extends LogSchema> = {
118
+ buffer: SpanBuffer<T>;
119
+ logger: SpanLoggerImpl<T>;
120
+ logBinding: LogBinding;
121
+ };
122
+
123
+ /**
124
+ * Create a TraceRoot for testing.
125
+ *
126
+ * TraceRoot contains trace_id, timestamp anchors, and tracer reference.
127
+ * This helper creates one with sensible defaults for tests.
128
+ *
129
+ * @param traceId - Optional trace ID (defaults to 'test-trace')
130
+ * @param tracer - Optional tracer (defaults to TEST_TRACER)
131
+ */
132
+ export function createTestTraceRoot(traceId?: TraceId | string, tracer?: TracerLifecycleHooks): ITraceRoot {
133
+ // Accept string or TraceId - convert string to TraceId
134
+ const resolvedTraceId = traceId
135
+ ? typeof traceId === 'string'
136
+ ? createTraceId(traceId)
137
+ : traceId
138
+ : createTraceId('test-trace');
139
+
140
+ return createTraceRoot(resolvedTraceId, tracer ?? TEST_TRACER);
141
+ }
142
+
143
+ /**
144
+ * Create a test OpMetadata with pre-encoded entries.
145
+ * Uses createOpMetadata to ensure pre-encoded entries match the string values.
146
+ */
147
+ export function createTestOpMetadata(overrides: Partial<OpMetadata> = {}): OpMetadata {
148
+ const name = overrides.name ?? DEFAULT_METADATA.name;
149
+ const package_name = overrides.package_name ?? DEFAULT_METADATA.package_name;
150
+ const package_file = overrides.package_file ?? DEFAULT_METADATA.package_file;
151
+ const git_sha = overrides.git_sha ?? DEFAULT_METADATA.git_sha;
152
+ const line = overrides.line ?? DEFAULT_METADATA.line;
153
+ return createOpMetadata(name, package_name, package_file, git_sha, line);
154
+ }
155
+
156
+ /**
157
+ * Create a LogSchema with system fields merged for testing.
158
+ * Use this when calling createSpanBuffer directly in tests.
159
+ */
160
+ export function createTestSchema<T extends SchemaFields>(fields: T): LogSchema<SystemSchemaFieldTypes & T> {
161
+ const merged = mergeWithSystemSchema(fields);
162
+ return new LogSchema(merged);
163
+ }
164
+
165
+ /**
166
+ * Create a LogBinding for testing.
167
+ *
168
+ * LogBinding is the infrastructure object that ops use to create buffers.
169
+ * It contains the schema and optional remapping class.
170
+ *
171
+ * NOTE: Stats are NO LONGER on LogBinding - they are on SpanBufferClass.stats (static property).
172
+ * See agent-todo/opgroup-refactor.md lines 58-70, 525-547 for rationale.
173
+ *
174
+ * @param schema - LogSchema or SchemaFields to use (will be wrapped in LogSchema if needed)
175
+ * @returns LogBinding ready for use with createSpanBuffer
176
+ */
177
+ export function createTestLogBinding<T extends SchemaFields>(schema: LogSchema<T>): LogBinding;
178
+ export function createTestLogBinding<T extends SchemaFields>(schema: T): LogBinding;
179
+ export function createTestLogBinding<T extends SchemaFields>(schema: T | LogSchema<T>): LogBinding {
180
+ // Wrap in LogSchema if plain SchemaFields provided
181
+ const logSchema = schema instanceof LogSchema ? schema : createTestSchema(schema);
182
+
183
+ return {
184
+ logSchema,
185
+ remappedViewClass: undefined,
186
+ };
187
+ }
188
+
189
+ /**
190
+ * Test-only helper that creates a LogBinding and SpanBuffer in one call.
191
+ *
192
+ * This is a convenience helper for tests that need both objects.
193
+ * Creates a root span buffer (no parent).
194
+ *
195
+ * @param schema - LogSchema or SchemaFields to use
196
+ * @param options - Configuration for the buffer
197
+ * @returns Object with logBinding and spanBuffer
198
+ */
199
+ export function createTestSpanBuffer<T extends SchemaFields>(
200
+ schema: LogSchema<T>,
201
+ options?: {
202
+ trace_id?: TraceId;
203
+ capacity?: number;
204
+ },
205
+ ): TestSpanBufferBundle<T>;
206
+ export function createTestSpanBuffer<T extends SchemaFields>(
207
+ schema: T,
208
+ options?: {
209
+ trace_id?: TraceId;
210
+ capacity?: number;
211
+ },
212
+ ): TestSpanBufferBundle<SystemSchemaFieldTypes & T>;
213
+ export function createTestSpanBuffer<T extends SchemaFields>(
214
+ schema: T | LogSchema<T>,
215
+ options: {
216
+ trace_id?: TraceId;
217
+ capacity?: number;
218
+ } = {},
219
+ ) {
220
+ // Wrap in LogSchema if plain SchemaFields provided
221
+ const logSchema = schema instanceof LogSchema ? schema : createTestSchema(schema);
222
+
223
+ // Create LogBinding (stats are on SpanBufferClass.stats, not LogBinding)
224
+ const logBinding = createTestLogBinding(logSchema);
225
+
226
+ // Create TraceRoot with provided or default trace_id
227
+ const traceRoot = createTestTraceRoot(options.trace_id);
228
+
229
+ // Create SpanBuffer using the Phase 2 API (no LogBinding parameter)
230
+ const spanBuffer = createSpanBuffer(
231
+ logSchema,
232
+ traceRoot,
233
+ DEFAULT_METADATA,
234
+ options.capacity ?? DEFAULT_BUFFER_CAPACITY,
235
+ );
236
+
237
+ return { logBinding, spanBuffer };
238
+ }
239
+
240
+ /**
241
+ * Create a properly typed SpanLogger for testing.
242
+ *
243
+ * Returns buffer and logger so tests can verify buffer contents directly.
244
+ * Uses the real createSpanLogger API - no mocks.
245
+ *
246
+ * @param schema - LogSchema to use
247
+ * @returns Object with buffer and logger, both properly typed
248
+ */
249
+ export function createTestLogger<T extends LogSchema>(schema: T): TestLoggerBundle<T> {
250
+ const logBinding = createTestLogBinding(schema);
251
+ const traceRoot = createTestTraceRoot();
252
+ const buffer = createSpanBuffer(schema, traceRoot, DEFAULT_METADATA);
253
+ const logger = createSpanLogger(schema, buffer);
254
+ return { buffer, logger, logBinding };
255
+ }
256
+
257
+ // =============================================================================
258
+ // OPGROUP INTERNAL ACCESS HELPERS
259
+ // =============================================================================
260
+
261
+ /**
262
+ * Get internal properties from an OpGroup.
263
+ *
264
+ * OpGroup's internal properties (_logSchema, _flags) are hidden from
265
+ * intellisense but accessible at runtime. This helper provides typed
266
+ * access for tests that need to verify internal state.
267
+ *
268
+ * @param opGroup - The OpGroup to access
269
+ * @returns Internal interface with _logSchema and _flags
270
+ */
271
+ export function getOpGroupInternals<Ctx extends OpContext>(
272
+ opGroup: OpGroup<Ctx>,
273
+ ): Pick<OpGroupInternal<Ctx>, '_logSchema'> {
274
+ assertOpGroupInternals(opGroup, 'OpGroup');
275
+ return { _logSchema: opGroup._logSchema };
276
+ }
277
+
278
+ /**
279
+ * Get internal properties from a MappedOpGroup.
280
+ *
281
+ * MappedOpGroup's internal properties (_logSchema, _flags, _columnMapping,
282
+ * _contributedSchema) are hidden from intellisense but accessible at runtime.
283
+ * This helper provides typed access for tests.
284
+ *
285
+ * @param opGroup - The MappedOpGroup to access
286
+ * @returns Internal interface with all internal properties
287
+ */
288
+ export function getMappedOpGroupInternals<Ctx extends OpContext, ContributedSchema extends SchemaFields>(
289
+ opGroup: MappedOpGroup<Ctx, ContributedSchema>,
290
+ ): Pick<MappedOpGroupInternal<Ctx, ContributedSchema>, '_logSchema' | '_columnMapping'> {
291
+ assertMappedOpGroupInternals(opGroup, 'MappedOpGroup');
292
+ return {
293
+ _logSchema: opGroup._logSchema,
294
+ _columnMapping: opGroup._columnMapping,
295
+ };
296
+ }
297
+
298
+ /**
299
+ * Convenience type alias for accessing column mapping from a MappedOpGroup.
300
+ */
301
+ export type { ColumnMapping, SchemaFieldsOf };
302
+
303
+ // Re-export createTraceId for tests that need it
304
+ export { createTraceId };
305
+
306
+ /**
307
+ * Simple buffer creation helper for tests.
308
+ *
309
+ * This provides a simpler API than createSpanBuffer by using defaults for
310
+ * trace_id and opMetadata. Tests that need specific values should use
311
+ * createSpanBuffer directly.
312
+ *
313
+ * @param schema - LogSchema to use
314
+ * @param capacity - Buffer capacity (optional, uses default from class stats)
315
+ */
316
+ export function createBuffer<T extends LogSchema>(schema: T, capacity?: number): SpanBuffer<T> {
317
+ return createSpanBuffer(schema, createTestTraceRoot(), DEFAULT_METADATA, capacity);
318
+ }
@@ -0,0 +1,259 @@
1
+ import { describe, expect, it } from 'bun:test';
2
+
3
+ import { Nanoseconds } from '@smoothbricks/arrow-builder';
4
+ import { defineLogSchema } from '../schema/defineLogSchema.js';
5
+ import type { AnySpanBuffer } from '../types.js';
6
+ import { createBuffer } from './test-helpers.js';
7
+
8
+ function createMockSpanBuffer(): AnySpanBuffer {
9
+ return createBuffer(defineLogSchema({}));
10
+ }
11
+
12
+ describe('Node.js TraceRoot Timestamps (process.hrtime.bigint)', () => {
13
+ it('should return a bigint from getTimestampNanos()', async () => {
14
+ const { createTraceRoot } = await import('../traceRoot.node.js');
15
+ const mockTracer = {
16
+ onTraceStart: () => {},
17
+ onTraceEnd: () => {},
18
+ onSpanStart: () => {},
19
+ onSpanEnd: () => {},
20
+ onStatsWillResetFor: () => {},
21
+ bufferStrategy: {
22
+ createChildSpanBuffer: createMockSpanBuffer,
23
+ createOverflowBuffer: createMockSpanBuffer,
24
+ },
25
+ };
26
+ const traceRoot = createTraceRoot('test-trace', mockTracer);
27
+
28
+ const ts = traceRoot.getTimestampNanos();
29
+ expect(typeof ts).toBe('bigint');
30
+ });
31
+
32
+ it('should return increasing timestamps', async () => {
33
+ const { createTraceRoot } = await import('../traceRoot.node.js');
34
+ const mockTracer = {
35
+ onTraceStart: () => {},
36
+ onTraceEnd: () => {},
37
+ onSpanStart: () => {},
38
+ onSpanEnd: () => {},
39
+ onStatsWillResetFor: () => {},
40
+ bufferStrategy: {
41
+ createChildSpanBuffer: createMockSpanBuffer,
42
+ createOverflowBuffer: createMockSpanBuffer,
43
+ },
44
+ };
45
+ const traceRoot = createTraceRoot('test-trace', mockTracer);
46
+
47
+ const ts1 = traceRoot.getTimestampNanos();
48
+ await new Promise((r) => setTimeout(r, 10));
49
+ const ts2 = traceRoot.getTimestampNanos();
50
+
51
+ expect(ts2).toBeGreaterThan(ts1);
52
+ // Should be roughly 10ms apart
53
+ const diff = ts2 - ts1;
54
+ expect(diff).toBeGreaterThan(5_000_000n); // > 5ms
55
+ expect(diff).toBeLessThan(50_000_000n); // < 50ms
56
+ });
57
+
58
+ it('should be within 1ms of Date.now()', async () => {
59
+ const { createTraceRoot } = await import('../traceRoot.node.js');
60
+ const mockTracer = {
61
+ onTraceStart: () => {},
62
+ onTraceEnd: () => {},
63
+ onSpanStart: () => {},
64
+ onSpanEnd: () => {},
65
+ onStatsWillResetFor: () => {},
66
+ bufferStrategy: {
67
+ createChildSpanBuffer: createMockSpanBuffer,
68
+ createOverflowBuffer: createMockSpanBuffer,
69
+ },
70
+ };
71
+
72
+ // Sample multiple times and check they're all close
73
+ for (let i = 0; i < 10; i++) {
74
+ const traceRoot = createTraceRoot('test-trace', mockTracer);
75
+ const dateNowMs = Date.now();
76
+ const ts = traceRoot.getTimestampNanos();
77
+ const tsMs = Nanoseconds.toMillis(ts);
78
+
79
+ const diffMs = Math.abs(tsMs - dateNowMs);
80
+ expect(diffMs).toBeLessThanOrEqual(1);
81
+ }
82
+ });
83
+
84
+ it('should have sub-millisecond precision (true nanoseconds)', async () => {
85
+ const { createTraceRoot } = await import('../traceRoot.node.js');
86
+ const mockTracer = {
87
+ onTraceStart: () => {},
88
+ onTraceEnd: () => {},
89
+ onSpanStart: () => {},
90
+ onSpanEnd: () => {},
91
+ onStatsWillResetFor: () => {},
92
+ bufferStrategy: {
93
+ createChildSpanBuffer: createMockSpanBuffer,
94
+ createOverflowBuffer: createMockSpanBuffer,
95
+ },
96
+ };
97
+ const traceRoot = createTraceRoot('test-trace', mockTracer);
98
+ const timestamps: bigint[] = [];
99
+
100
+ // Rapid-fire timestamps
101
+ for (let i = 0; i < 100; i++) {
102
+ timestamps.push(traceRoot.getTimestampNanos());
103
+ }
104
+
105
+ // Should see sub-millisecond differences (< 1_000_000 nanoseconds)
106
+ let hasSubMillisecond = false;
107
+ for (let i = 1; i < timestamps.length; i++) {
108
+ const diff = timestamps[i] - timestamps[i - 1];
109
+ if (diff > 0n && diff < 1_000_000n) {
110
+ hasSubMillisecond = true;
111
+ break;
112
+ }
113
+ }
114
+ expect(hasSubMillisecond).toBe(true);
115
+ });
116
+
117
+ it('should preserve nanosecond deltas in JS fallback above Number.MAX_SAFE_INTEGER', async () => {
118
+ const originalHrtimeBigint = process.hrtime.bigint;
119
+ const base = 9_007_199_254_740_993n; // Number.MAX_SAFE_INTEGER + 2
120
+ const sequence = [base, base + 1n, base + 2n];
121
+ let idx = 0;
122
+
123
+ process.hrtime.bigint = () => sequence[idx++] ?? sequence[sequence.length - 1];
124
+
125
+ try {
126
+ const { createTraceRoot } = await import('../traceRoot.node.js');
127
+ const mockTracer = {
128
+ onTraceStart: () => {},
129
+ onTraceEnd: () => {},
130
+ onSpanStart: () => {},
131
+ onSpanEnd: () => {},
132
+ onStatsWillResetFor: () => {},
133
+ bufferStrategy: {
134
+ createChildSpanBuffer: createMockSpanBuffer,
135
+ createOverflowBuffer: createMockSpanBuffer,
136
+ },
137
+ };
138
+
139
+ const traceRoot = createTraceRoot('test-trace', mockTracer);
140
+ const ts0 = traceRoot.getTimestampNanos();
141
+ const ts1 = traceRoot.getTimestampNanos();
142
+
143
+ expect(ts1 - ts0).toBe(1n);
144
+ } finally {
145
+ process.hrtime.bigint = originalHrtimeBigint;
146
+ }
147
+ });
148
+ });
149
+
150
+ describe('Browser TraceRoot Timestamps (performance.now)', () => {
151
+ it('should return a bigint from getTimestampNanos()', async () => {
152
+ const { createTraceRoot } = await import('../traceRoot.es.js');
153
+ const mockTracer = {
154
+ onTraceStart: () => {},
155
+ onTraceEnd: () => {},
156
+ onSpanStart: () => {},
157
+ onSpanEnd: () => {},
158
+ onStatsWillResetFor: () => {},
159
+ bufferStrategy: {
160
+ createChildSpanBuffer: createMockSpanBuffer,
161
+ createOverflowBuffer: createMockSpanBuffer,
162
+ },
163
+ };
164
+ const traceRoot = createTraceRoot('test-trace', mockTracer);
165
+
166
+ const ts = traceRoot.getTimestampNanos();
167
+ expect(typeof ts).toBe('bigint');
168
+ });
169
+
170
+ it('should return increasing timestamps', async () => {
171
+ const { createTraceRoot } = await import('../traceRoot.es.js');
172
+ const mockTracer = {
173
+ onTraceStart: () => {},
174
+ onTraceEnd: () => {},
175
+ onSpanStart: () => {},
176
+ onSpanEnd: () => {},
177
+ onStatsWillResetFor: () => {},
178
+ bufferStrategy: {
179
+ createChildSpanBuffer: createMockSpanBuffer,
180
+ createOverflowBuffer: createMockSpanBuffer,
181
+ },
182
+ };
183
+ const traceRoot = createTraceRoot('test-trace', mockTracer);
184
+
185
+ const ts1 = traceRoot.getTimestampNanos();
186
+ await new Promise((r) => setTimeout(r, 10));
187
+ const ts2 = traceRoot.getTimestampNanos();
188
+
189
+ expect(ts2).toBeGreaterThan(ts1);
190
+ // Should be roughly 10ms apart
191
+ const diff = ts2 - ts1;
192
+ expect(diff).toBeGreaterThan(5_000_000n); // > 5ms
193
+ expect(diff).toBeLessThan(50_000_000n); // < 50ms
194
+ });
195
+
196
+ it('should be within 1ms of Date.now()', async () => {
197
+ const { createTraceRoot } = await import('../traceRoot.es.js');
198
+ const mockTracer = {
199
+ onTraceStart: () => {},
200
+ onTraceEnd: () => {},
201
+ onSpanStart: () => {},
202
+ onSpanEnd: () => {},
203
+ onStatsWillResetFor: () => {},
204
+ bufferStrategy: {
205
+ createChildSpanBuffer: createMockSpanBuffer,
206
+ createOverflowBuffer: createMockSpanBuffer,
207
+ },
208
+ };
209
+
210
+ // Sample multiple times and check they're all close
211
+ for (let i = 0; i < 10; i++) {
212
+ const traceRoot = createTraceRoot('test-trace', mockTracer);
213
+ const dateNowMs = Date.now();
214
+ const ts = traceRoot.getTimestampNanos();
215
+ const tsMs = Nanoseconds.toMillis(ts);
216
+
217
+ const diffMs = Math.abs(tsMs - dateNowMs);
218
+ // Browser performance API should be very close to Date.now()
219
+ expect(diffMs).toBeLessThanOrEqual(1);
220
+ }
221
+ });
222
+ });
223
+
224
+ describe('Nanoseconds utilities', () => {
225
+ it('fromMillis converts correctly', () => {
226
+ const ns = Nanoseconds.fromMillis(1000);
227
+ expect(ns).toBe(Nanoseconds.unsafe(1_000_000_000n));
228
+ });
229
+
230
+ it('toMillis converts correctly', () => {
231
+ const ns = Nanoseconds.fromMillis(1234);
232
+ expect(Nanoseconds.toMillis(ns)).toBe(1234);
233
+ });
234
+
235
+ it('toMicros converts correctly', () => {
236
+ const ns = Nanoseconds.fromMillis(1);
237
+ expect(Nanoseconds.toMicros(ns)).toBe(1000n);
238
+ });
239
+
240
+ it('unsafe casts bigint', () => {
241
+ const raw = 123456789n;
242
+ const ns = Nanoseconds.unsafe(raw);
243
+ expect(ns).toBe(Nanoseconds.unsafe(raw));
244
+ });
245
+ });
246
+
247
+ describe('Platform entry points export createTraceRoot', () => {
248
+ it('should export createTraceRoot from /node', async () => {
249
+ const nodeModule = await import('../../node.js');
250
+ expect(nodeModule.createTraceRoot).toBeDefined();
251
+ expect(typeof nodeModule.createTraceRoot).toBe('function');
252
+ });
253
+
254
+ it('should export createTraceRoot from /es', async () => {
255
+ const esModule = await import('../../es.js');
256
+ expect(esModule.createTraceRoot).toBeDefined();
257
+ expect(typeof esModule.createTraceRoot).toBe('function');
258
+ });
259
+ });
@@ -0,0 +1,98 @@
1
+ import { describe, expect, it } from 'bun:test';
2
+ import { compactTraceChunks } from '../archive/chunkCompaction.js';
3
+ import { buildTraceChunkEnvelope } from '../archive/chunkEnvelope.js';
4
+ import { inspectPartitionCardinality, splitChunkByPartition } from '../archive/chunkRouting.js';
5
+ import { extractChunkStats } from '../archive/chunkStats.js';
6
+
7
+ describe('trace archive primitives', () => {
8
+ it('buildTraceChunkEnvelope produces stable chunk_id', () => {
9
+ const a = buildTraceChunkEnvelope({
10
+ file_ref: 's3://bucket/trace.arrow',
11
+ chunk_ref: 'chunk-001',
12
+ row_count: 4,
13
+ started_at_ms: 100,
14
+ ended_at_ms: 240,
15
+ partition_keys: ['group_b', 'group_a'],
16
+ metadata: { z: 1, a: 'x' },
17
+ });
18
+
19
+ const b = buildTraceChunkEnvelope({
20
+ file_ref: 's3://bucket/trace.arrow',
21
+ chunk_ref: 'chunk-001',
22
+ row_count: 4,
23
+ started_at_ms: 100,
24
+ ended_at_ms: 240,
25
+ partition_keys: ['group_a', 'group_b'],
26
+ metadata: { a: 'x', z: 1 },
27
+ });
28
+
29
+ expect(a.chunk_id).toBe(b.chunk_id);
30
+ });
31
+
32
+ it('inspectPartitionCardinality returns single, mixed, unknown', () => {
33
+ const singleRows = [{ group: 'g1' }, { group: 'g1' }];
34
+ const mixedRows = [{ group: 'g1' }, { group: 'g2' }];
35
+ const unknownRows = [{ group: 'g1' }, { group: '' }];
36
+
37
+ expect(inspectPartitionCardinality(singleRows, (row) => row.group)).toBe('single');
38
+ expect(inspectPartitionCardinality(mixedRows, (row) => row.group)).toBe('mixed');
39
+ expect(inspectPartitionCardinality(unknownRows, (row) => row.group)).toBe('unknown');
40
+ });
41
+
42
+ it('splitChunkByPartition emits deterministic selectors', () => {
43
+ const rows = [
44
+ { id: 1, group: 'g2' },
45
+ { id: 2, group: 'g1' },
46
+ { id: 3, group: 'g2' },
47
+ { id: 4, group: 'g1' },
48
+ ];
49
+
50
+ const splits = splitChunkByPartition(rows, (row) => row.group, 'listener_group');
51
+
52
+ expect(splits.map((split) => split.partition)).toEqual(['g1', 'g2']);
53
+ expect(splits.map((split) => split.selector)).toEqual(['listener_group == "g1"', 'listener_group == "g2"']);
54
+ expect(splits[0].row_indexes).toEqual([1, 3]);
55
+ expect(splits[1].row_indexes).toEqual([0, 2]);
56
+ });
57
+
58
+ it('compactTraceChunks is idempotent for source order', () => {
59
+ const c1 = buildTraceChunkEnvelope({
60
+ file_ref: 'f',
61
+ chunk_ref: 'a',
62
+ row_count: 2,
63
+ started_at_ms: 10,
64
+ ended_at_ms: 20,
65
+ });
66
+ const c2 = buildTraceChunkEnvelope({
67
+ file_ref: 'f',
68
+ chunk_ref: 'b',
69
+ row_count: 3,
70
+ started_at_ms: 21,
71
+ ended_at_ms: 40,
72
+ });
73
+
74
+ const x = compactTraceChunks([c1, c2], { started_at_ms: 0, ended_at_ms: 100 });
75
+ const y = compactTraceChunks([c2, c1], { started_at_ms: 0, ended_at_ms: 100 });
76
+
77
+ expect(x.source_set_hash).toBe(y.source_set_hash);
78
+ expect(x.compaction_id).toBe(y.compaction_id);
79
+ expect(x.total_rows).toBe(5);
80
+ });
81
+
82
+ it('extractChunkStats reports chunk level metrics', () => {
83
+ const envelope = buildTraceChunkEnvelope({
84
+ file_ref: 'f',
85
+ chunk_ref: 'x',
86
+ row_count: 7,
87
+ started_at_ms: 100,
88
+ ended_at_ms: 190,
89
+ });
90
+
91
+ const splits = splitChunkByPartition([{ group: 'g1' }, { group: 'g1' }, { group: 'g2' }], (row) => row.group);
92
+
93
+ const stats = extractChunkStats(envelope, splits);
94
+ expect(stats.chunk_id).toBe(envelope.chunk_id);
95
+ expect(stats.partition_count).toBe(2);
96
+ expect(stats.duration_ms).toBe(90);
97
+ });
98
+ });