@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,476 @@
1
+ /**
2
+ * Integration tests for WASM-backed trace flow.
3
+ *
4
+ * These tests verify the full trace lifecycle works with WASM memory backing:
5
+ * - Span start/end with timestamps
6
+ * - Tag writes to WASM columns
7
+ * - Nested spans with parent/child linkage
8
+ * - Error handling (ctx.err() and exceptions)
9
+ * - Log entries (info/debug/warn/error)
10
+ * - Memory reuse via freelist
11
+ */
12
+
13
+ import { afterEach, beforeAll, describe, expect, it } from 'bun:test';
14
+ import { defineOpContext } from '../../defineOpContext.js';
15
+ import { S } from '../../schema/builder.js';
16
+ import { defineLogSchema } from '../../schema/defineLogSchema.js';
17
+ import {
18
+ ENTRY_TYPE_DEBUG,
19
+ ENTRY_TYPE_ERROR,
20
+ ENTRY_TYPE_INFO,
21
+ ENTRY_TYPE_SPAN_ERR,
22
+ ENTRY_TYPE_SPAN_EXCEPTION,
23
+ ENTRY_TYPE_SPAN_OK,
24
+ ENTRY_TYPE_SPAN_START,
25
+ ENTRY_TYPE_WARN,
26
+ } from '../../schema/systemSchema.js';
27
+ import { TestTracer } from '../../tracers/TestTracer.js';
28
+ import { WasmBufferStrategy } from '../WasmBufferStrategy.js';
29
+ import { createWasmTraceRootFactory } from '../wasmTraceRoot.js';
30
+
31
+ /**
32
+ * Type for accessing WASM-specific internal buffer properties.
33
+ * WASM buffers use different property names than standard SpanBuffer.
34
+ * We cast to this type to access WASM-specific properties in tests.
35
+ */
36
+ interface WasmBufferInternals {
37
+ // System columns (WASM uses _message array internally)
38
+ _message: string[];
39
+ // Schema columns (WASM uses name_values without underscore prefix)
40
+ userId_values?: string[];
41
+ latency_values?: Float64Array;
42
+ operation_values?: Uint8Array;
43
+ // System schema columns
44
+ exception_stack_values?: string[];
45
+ error_code_values?: string[];
46
+ }
47
+
48
+ /** Cast buffer to access WASM-specific internals */
49
+ function asWasm<T>(buffer: T): T & WasmBufferInternals {
50
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion -- test helper narrows to the generated WASM-only fields asserted below.
51
+ return buffer as T & WasmBufferInternals;
52
+ }
53
+
54
+ describe('WASM Integration Tests', () => {
55
+ // Test schema with various field types
56
+ const schema = defineLogSchema({
57
+ userId: S.category(),
58
+ latency: S.number(),
59
+ operation: S.enum(['CREATE', 'READ', 'UPDATE', 'DELETE']),
60
+ });
61
+
62
+ // Define op context - env is optional (undefined by default, not null-sentinel)
63
+ const opContext = defineOpContext({
64
+ logSchema: schema,
65
+ ctx: { env: undefined as { region: string } | undefined },
66
+ });
67
+
68
+ let strategy: WasmBufferStrategy<typeof schema>;
69
+ let tracer: TestTracer<typeof opContext>;
70
+
71
+ beforeAll(async () => {
72
+ strategy = await WasmBufferStrategy.create({
73
+ capacity: 64,
74
+ initialPages: 16,
75
+ maxPages: 16,
76
+ });
77
+
78
+ tracer = new TestTracer(opContext, {
79
+ bufferStrategy: strategy,
80
+ createTraceRoot: createWasmTraceRootFactory(strategy.allocator),
81
+ });
82
+ });
83
+
84
+ afterEach(() => {
85
+ // Release all WASM memory for buffers
86
+ for (const buffer of tracer.rootBuffers) {
87
+ strategy.releaseBuffer(buffer);
88
+ }
89
+ // Clear tracer state
90
+ tracer.clear();
91
+ // Reset allocator for next test
92
+ strategy.reset();
93
+
94
+ // Create fresh tracer for next test
95
+ tracer = new TestTracer(opContext, {
96
+ bufferStrategy: strategy,
97
+ createTraceRoot: createWasmTraceRootFactory(strategy.allocator),
98
+ });
99
+ });
100
+
101
+ describe('Simple trace', () => {
102
+ it('creates a simple trace with WASM backing', async () => {
103
+ await tracer.trace('test-op', async (ctx) => {
104
+ return ctx.ok('done');
105
+ });
106
+
107
+ expect(tracer.rootBuffers).toHaveLength(1);
108
+ const buffer = tracer.rootBuffers[0];
109
+
110
+ // Verify entry types
111
+ expect(buffer.entry_type[0]).toBe(ENTRY_TYPE_SPAN_START);
112
+ expect(buffer.entry_type[1]).toBe(ENTRY_TYPE_SPAN_OK);
113
+
114
+ // Verify timestamps are valid
115
+ expect(buffer.timestamp[0]).toBeGreaterThan(0n);
116
+ expect(buffer.timestamp[1]).toBeGreaterThanOrEqual(buffer.timestamp[0]);
117
+
118
+ // Verify span name is set
119
+ expect(buffer.message_values[0]).toBe('test-op');
120
+ });
121
+
122
+ it('writes trace_id correctly', async () => {
123
+ await tracer.trace('trace-id-test', async (ctx) => {
124
+ return ctx.ok('done');
125
+ });
126
+
127
+ const buffer = tracer.rootBuffers[0];
128
+ // trace_id should be a valid W3C format (32 hex chars)
129
+ expect(buffer.trace_id).toMatch(/^[a-f0-9]{32}$/);
130
+ });
131
+
132
+ it('writes span_id correctly', async () => {
133
+ await tracer.trace('span-id-test', async (ctx) => {
134
+ return ctx.ok('done');
135
+ });
136
+
137
+ const buffer = tracer.rootBuffers[0];
138
+ // span_id should be a positive number
139
+ expect(buffer.span_id).toBeGreaterThan(0);
140
+ });
141
+ });
142
+
143
+ describe('Tags', () => {
144
+ it('writes tags to WASM columns', async () => {
145
+ await tracer.trace('tag-test', async (ctx) => {
146
+ ctx.tag.userId('user-123');
147
+ ctx.tag.latency(42.5);
148
+ ctx.tag.operation('READ');
149
+ return ctx.ok('done');
150
+ });
151
+
152
+ const buffer = asWasm(tracer.rootBuffers[0]);
153
+
154
+ // Verify tag values were written (row 0 is span-start)
155
+ // Note: Tags write to row 0 by default for initial span attributes
156
+ expect(buffer.userId_values?.[0]).toBe('user-123');
157
+ expect(buffer.latency_values?.[0]).toBe(42.5);
158
+ // Enum values are stored as uint8 indices
159
+ expect(buffer.operation_values?.[0]).toBe(1); // 'READ' is index 1 in ['CREATE', 'READ', 'UPDATE', 'DELETE']
160
+ });
161
+
162
+ it('chains multiple tags fluently', async () => {
163
+ await tracer.trace('chain-test', async (ctx) => {
164
+ ctx.tag.userId('user-456').latency(100.25).operation('CREATE');
165
+ return ctx.ok('done');
166
+ });
167
+
168
+ const buffer = asWasm(tracer.rootBuffers[0]);
169
+ expect(buffer.userId_values?.[0]).toBe('user-456');
170
+ expect(buffer.latency_values?.[0]).toBe(100.25);
171
+ expect(buffer.operation_values?.[0]).toBe(0); // 'CREATE' is index 0
172
+ });
173
+ });
174
+
175
+ describe('Nested spans', () => {
176
+ it('creates nested spans with correct linkage', async () => {
177
+ await tracer.trace('parent', async (ctx) => {
178
+ await ctx.span('child', async (childCtx) => {
179
+ return childCtx.ok('child done');
180
+ });
181
+ return ctx.ok('parent done');
182
+ });
183
+
184
+ const parent = tracer.rootBuffers[0];
185
+ expect(parent._children).toHaveLength(1);
186
+
187
+ const child = parent._children[0];
188
+ // Child should share trace_id with parent
189
+ expect(child.trace_id).toBe(parent.trace_id);
190
+ // Child's parent_span_id should be parent's span_id
191
+ expect(child.parent_span_id).toBe(parent.span_id);
192
+ // Child should have its own span_id
193
+ expect(child.span_id).not.toBe(parent.span_id);
194
+ });
195
+
196
+ it('creates deeply nested spans', async () => {
197
+ await tracer.trace('level-0', async (ctx) => {
198
+ await ctx.span('level-1', async (ctx1) => {
199
+ await ctx1.span('level-2', async (ctx2) => {
200
+ return ctx2.ok('deepest');
201
+ });
202
+ return ctx1.ok('middle');
203
+ });
204
+ return ctx.ok('root');
205
+ });
206
+
207
+ const root = tracer.rootBuffers[0];
208
+ expect(root._children).toHaveLength(1);
209
+
210
+ const level1 = root._children[0];
211
+ expect(level1._children).toHaveLength(1);
212
+ expect(level1.parent_span_id).toBe(root.span_id);
213
+
214
+ const level2 = level1._children[0];
215
+ expect(level2.parent_span_id).toBe(level1.span_id);
216
+ expect(level2.trace_id).toBe(root.trace_id);
217
+ });
218
+
219
+ it('creates sibling spans correctly', async () => {
220
+ await tracer.trace('parent', async (ctx) => {
221
+ await ctx.span('child-1', async (c1) => c1.ok('first'));
222
+ await ctx.span('child-2', async (c2) => c2.ok('second'));
223
+ return ctx.ok('done');
224
+ });
225
+
226
+ const parent = tracer.rootBuffers[0];
227
+ expect(parent._children).toHaveLength(2);
228
+
229
+ const [child1, child2] = parent._children;
230
+ expect(child1.message_values[0]).toBe('child-1');
231
+ expect(child2.message_values[0]).toBe('child-2');
232
+ expect(child1.parent_span_id).toBe(parent.span_id);
233
+ expect(child2.parent_span_id).toBe(parent.span_id);
234
+ // Siblings should have different span IDs
235
+ expect(child1.span_id).not.toBe(child2.span_id);
236
+ });
237
+ });
238
+
239
+ describe('Error handling', () => {
240
+ it('handles errors correctly with span-exception', async () => {
241
+ try {
242
+ await tracer.trace('error-op', async (_ctx) => {
243
+ throw new Error('test error');
244
+ });
245
+ } catch (_e) {
246
+ // Expected
247
+ }
248
+
249
+ const buffer = asWasm(tracer.rootBuffers[0]);
250
+ expect(buffer.entry_type[0]).toBe(ENTRY_TYPE_SPAN_START);
251
+ expect(buffer.entry_type[1]).toBe(ENTRY_TYPE_SPAN_EXCEPTION);
252
+
253
+ // Verify error message was written - use message_values getter
254
+ const messageValues = buffer.message_values;
255
+ const messages = messageValues.slice(0, buffer._writeIndex).filter((m: string) => m !== undefined);
256
+ expect(messages).toContain('test error');
257
+ });
258
+
259
+ it('captures exception stack trace', async () => {
260
+ try {
261
+ await tracer.trace('stack-trace-op', async (_ctx) => {
262
+ throw new Error('stack test');
263
+ });
264
+ } catch (_e) {
265
+ // Expected
266
+ }
267
+
268
+ const buffer = asWasm(tracer.rootBuffers[0]);
269
+ // Stack trace should be written
270
+ expect(buffer.exception_stack_values?.[1]).toContain('stack test');
271
+ expect(buffer.exception_stack_values?.[1]).toContain('at'); // Stack trace has 'at' for call frames
272
+ });
273
+ });
274
+
275
+ describe('ctx.err()', () => {
276
+ it('writes span-err for ctx.err()', async () => {
277
+ await tracer.trace('err-op', async (ctx) => {
278
+ return ctx.err('something went wrong');
279
+ });
280
+
281
+ const buffer = tracer.rootBuffers[0];
282
+ expect(buffer.entry_type[0]).toBe(ENTRY_TYPE_SPAN_START);
283
+ expect(buffer.entry_type[1]).toBe(ENTRY_TYPE_SPAN_ERR);
284
+ });
285
+
286
+ it('writes error code for typed errors', async () => {
287
+ await tracer.trace('typed-err-op', async (ctx) => {
288
+ return ctx.err({ code: 'VALIDATION_ERROR', message: 'Invalid input' });
289
+ });
290
+
291
+ const buffer = asWasm(tracer.rootBuffers[0]);
292
+ expect(buffer.entry_type[1]).toBe(ENTRY_TYPE_SPAN_ERR);
293
+ // Error code should be written to error_code column
294
+ expect(buffer.error_code_values?.[1]).toBe('VALIDATION_ERROR');
295
+ });
296
+ });
297
+
298
+ describe('Log entries', () => {
299
+ it('writes log entries with correct entry types', async () => {
300
+ await tracer.trace('log-op', async (ctx) => {
301
+ ctx.log.info('info message');
302
+ ctx.log.debug('debug message');
303
+ ctx.log.warn('warn message');
304
+ return ctx.ok('done');
305
+ });
306
+
307
+ const buffer = asWasm(tracer.rootBuffers[0]);
308
+ // Should have: span-start (0), span-ok (1), log entries (2+)
309
+ // _writeIndex tells us how many rows were written
310
+ expect(buffer._writeIndex).toBeGreaterThan(2);
311
+
312
+ // Row 0 = span-start, Row 1 = span-ok (written at end)
313
+ expect(buffer.entry_type[0]).toBe(ENTRY_TYPE_SPAN_START);
314
+ expect(buffer.entry_type[1]).toBe(ENTRY_TYPE_SPAN_OK);
315
+
316
+ // Log entries are written at indices 2+
317
+ const entryTypes = Array.from(buffer.entry_type.slice(0, buffer._writeIndex));
318
+
319
+ // Use entry type constants from systemSchema
320
+ expect(entryTypes).toContain(ENTRY_TYPE_INFO);
321
+ expect(entryTypes).toContain(ENTRY_TYPE_DEBUG);
322
+ expect(entryTypes).toContain(ENTRY_TYPE_WARN);
323
+
324
+ // Messages are written via message_values getter (SpanLogger uses this)
325
+ // Access via the getter since that's what SpanLogger writes to
326
+ const messageValues = buffer.message_values;
327
+ const messages = messageValues.slice(0, buffer._writeIndex).filter((m: string) => m !== undefined);
328
+ expect(messages).toContain('info message');
329
+ expect(messages).toContain('debug message');
330
+ expect(messages).toContain('warn message');
331
+ });
332
+
333
+ it('writes error log entries', async () => {
334
+ await tracer.trace('error-log-op', async (ctx) => {
335
+ ctx.log.error('error message');
336
+ return ctx.ok('done');
337
+ });
338
+
339
+ const buffer = asWasm(tracer.rootBuffers[0]);
340
+ // Use entry type constant from systemSchema
341
+ const entryTypes = Array.from(buffer.entry_type.slice(0, buffer._writeIndex));
342
+ expect(entryTypes).toContain(ENTRY_TYPE_ERROR);
343
+ });
344
+ });
345
+
346
+ describe('Memory reuse', () => {
347
+ it('tracks allocation stats', async () => {
348
+ const statsBefore = strategy.getStats();
349
+
350
+ await tracer.trace('alloc-test', async (ctx) => ctx.ok('done'));
351
+
352
+ const statsAfter = strategy.getStats();
353
+ // Should have allocated memory for the buffer
354
+ expect(statsAfter.allocCount).toBeGreaterThan(statsBefore.allocCount);
355
+ });
356
+
357
+ it('reuses WASM memory across traces', async () => {
358
+ // Run multiple traces
359
+ for (let i = 0; i < 5; i++) {
360
+ await tracer.trace(`trace-${i}`, async (ctx) => ctx.ok('done'));
361
+ }
362
+
363
+ const statsBeforeClear = strategy.getStats();
364
+ const allocCountBefore = statsBeforeClear.allocCount;
365
+
366
+ // Release all buffers
367
+ for (const buffer of tracer.rootBuffers) {
368
+ strategy.releaseBuffer(buffer);
369
+ }
370
+
371
+ const statsAfterFree = strategy.getStats();
372
+ // Free count should have increased after releasing buffers
373
+ expect(statsAfterFree.freeCount).toBeGreaterThan(0);
374
+
375
+ // Clear tracer (this will reset the allocator)
376
+ tracer.clear();
377
+
378
+ // Run more traces - should reuse freed memory
379
+ for (let i = 0; i < 5; i++) {
380
+ await tracer.trace(`trace-reuse-${i}`, async (ctx) => ctx.ok('done'));
381
+ }
382
+
383
+ const statsAfterReuse = strategy.getStats();
384
+ // Alloc count should not have more than doubled (some memory reused from freelist)
385
+ // Note: Exact reuse depends on freelist implementation and allocation patterns
386
+ expect(statsAfterReuse.allocCount).toBeLessThanOrEqual(allocCountBefore * 2);
387
+ });
388
+
389
+ it('releases entire span tree', async () => {
390
+ // Create a trace with nested spans
391
+ await tracer.trace('parent', async (ctx) => {
392
+ await ctx.span('child-1', async (c1) => {
393
+ await c1.span('grandchild', async (gc) => gc.ok('deep'));
394
+ return c1.ok('c1');
395
+ });
396
+ await ctx.span('child-2', async (c2) => c2.ok('c2'));
397
+ return ctx.ok('parent');
398
+ });
399
+
400
+ const freeCountBefore = strategy.getStats().freeCount;
401
+
402
+ // Release the root buffer (should release entire tree)
403
+ strategy.releaseBuffer(tracer.rootBuffers[0]);
404
+
405
+ const freeCountAfter = strategy.getStats().freeCount;
406
+ // Should have freed memory for all 4 spans (parent + 2 children + 1 grandchild)
407
+ expect(freeCountAfter).toBeGreaterThan(freeCountBefore);
408
+ });
409
+ });
410
+
411
+ describe('Sync vs Async traces', () => {
412
+ it('handles sync functions correctly', async () => {
413
+ // Note: trace() always returns a Promise, but the function can be sync
414
+ const result = await tracer.trace('sync-op', (ctx) => {
415
+ ctx.tag.userId('sync-user');
416
+ return ctx.ok({ sync: true });
417
+ });
418
+
419
+ expect(result.success).toBe(true);
420
+ if (result.success) {
421
+ expect(result.value.sync).toBe(true);
422
+ }
423
+
424
+ const buffer = tracer.rootBuffers[0];
425
+ expect(buffer.entry_type[1]).toBe(ENTRY_TYPE_SPAN_OK);
426
+ });
427
+
428
+ it('handles async functions correctly', async () => {
429
+ const result = await tracer.trace('async-op', async (ctx) => {
430
+ await new Promise((resolve) => setTimeout(resolve, 1));
431
+ ctx.tag.userId('async-user');
432
+ return ctx.ok({ async: true });
433
+ });
434
+
435
+ expect(result.success).toBe(true);
436
+ if (result.success) {
437
+ expect(result.value.async).toBe(true);
438
+ }
439
+
440
+ const buffer = tracer.rootBuffers[0];
441
+ expect(buffer.entry_type[1]).toBe(ENTRY_TYPE_SPAN_OK);
442
+ // Timestamps should reflect the delay
443
+ expect(buffer.timestamp[1]).toBeGreaterThan(buffer.timestamp[0]);
444
+ });
445
+ });
446
+
447
+ describe('Multiple traces', () => {
448
+ it('maintains separate buffers for each trace', async () => {
449
+ await tracer.trace('trace-1', async (ctx) => {
450
+ ctx.tag.userId('user-1');
451
+ return ctx.ok('one');
452
+ });
453
+
454
+ await tracer.trace('trace-2', async (ctx) => {
455
+ ctx.tag.userId('user-2');
456
+ return ctx.ok('two');
457
+ });
458
+
459
+ expect(tracer.rootBuffers).toHaveLength(2);
460
+
461
+ const buffer1 = asWasm(tracer.rootBuffers[0]);
462
+ const buffer2 = asWasm(tracer.rootBuffers[1]);
463
+
464
+ // Different trace IDs
465
+ expect(buffer1.trace_id).not.toBe(buffer2.trace_id);
466
+
467
+ // Different span names
468
+ expect(buffer1.message_values[0]).toBe('trace-1');
469
+ expect(buffer2.message_values[0]).toBe('trace-2');
470
+
471
+ // Different user IDs
472
+ expect(buffer1.userId_values?.[0]).toBe('user-1');
473
+ expect(buffer2.userId_values?.[0]).toBe('user-2');
474
+ });
475
+ });
476
+ });