@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,485 @@
1
+ /**
2
+ * Tests for Arrow table conversion
3
+ *
4
+ * Per specs/lmao/01f_arrow_table_structure.md and 01b_columnar_buffer_architecture.md:
5
+ * - Zero-copy conversion from SpanBuffer to Arrow
6
+ * - Null bitmap handling
7
+ * - String type conversion (enum/category/text)
8
+ * - Buffer chaining
9
+ * - Span tree conversion
10
+ */
11
+
12
+ import { describe, expect, test } from 'bun:test';
13
+ import type { CapacityStatsEntry } from '../../arrow/capacityStats.js';
14
+ import { convertSpanTreeToArrowTable, convertToArrowTable } from '../../convertToArrow.js';
15
+ import { DEFAULT_METADATA } from '../../opContext/defineOp.js';
16
+ import { S } from '../../schema/builder.js';
17
+ import {
18
+ ENTRY_TYPE_DEBUG,
19
+ ENTRY_TYPE_ERROR,
20
+ ENTRY_TYPE_FF_ACCESS,
21
+ ENTRY_TYPE_FF_USAGE,
22
+ ENTRY_TYPE_INFO,
23
+ ENTRY_TYPE_SPAN_ERR,
24
+ ENTRY_TYPE_SPAN_EXCEPTION,
25
+ ENTRY_TYPE_SPAN_OK,
26
+ ENTRY_TYPE_SPAN_START,
27
+ ENTRY_TYPE_TRACE,
28
+ ENTRY_TYPE_WARN,
29
+ } from '../../schema/systemSchema.js';
30
+ import { createChildSpanBuffer, createOverflowBuffer, createSpanBuffer, getSpanBufferClass } from '../../spanBuffer.js';
31
+ import type { SpanBuffer } from '../../types.js';
32
+ import { getColumnValue, getRawTimestamp } from '../arrow-test-helpers.js';
33
+ import { createTestOpMetadata, createTestSchema, createTestTraceRoot } from '../test-helpers.js';
34
+
35
+ function toBigInt(value: unknown): bigint {
36
+ if (typeof value === 'bigint') {
37
+ return value;
38
+ }
39
+ if (typeof value === 'number') {
40
+ return BigInt(value);
41
+ }
42
+ throw new Error(`Expected numeric Arrow value, received ${typeof value}`);
43
+ }
44
+
45
+ describe('Arrow Table Conversion', () => {
46
+ describe('Single buffer conversion', () => {
47
+ test('converts basic span buffer to Arrow table', () => {
48
+ const schema = createTestSchema({
49
+ httpStatus: S.number(),
50
+ userId: S.category(),
51
+ });
52
+
53
+ const buffer = createSpanBuffer(schema, createTestTraceRoot('trace-123'), DEFAULT_METADATA, undefined);
54
+
55
+ // Write some test data
56
+ buffer.timestamp[0] = 1000n;
57
+ buffer.entry_type[0] = ENTRY_TYPE_SPAN_START;
58
+ buffer.message(0, 'test-span');
59
+ buffer.httpStatus(0, 200);
60
+ buffer.userId(0, 'user-123');
61
+ buffer._writeIndex = 1;
62
+
63
+ const table = convertToArrowTable(buffer);
64
+
65
+ expect(table.numRows).toBe(1);
66
+ expect(table.numCols).toBeGreaterThan(0);
67
+
68
+ // Check that columns exist
69
+ expect(getRawTimestamp(table, 0)).toBe(1000n);
70
+ expect(getColumnValue(table, 'entry_type', 0)).toBe('span-start');
71
+ expect(getColumnValue(table, 'message', 0)).toBe('test-span');
72
+ expect(getColumnValue(table, 'httpStatus', 0)).toBe(200);
73
+ expect(getColumnValue(table, 'userId', 0)).toBe('user-123');
74
+ });
75
+
76
+ test('handles multiple rows in buffer', () => {
77
+ const schema = createTestSchema({
78
+ level: S.enum(['DEBUG', 'INFO', 'WARN', 'ERROR'] as const),
79
+ });
80
+
81
+ const buffer = createSpanBuffer(schema, createTestTraceRoot('trace-456'), DEFAULT_METADATA, undefined);
82
+
83
+ // Write multiple rows
84
+ buffer.timestamp[0] = 1000n;
85
+ buffer.entry_type[0] = ENTRY_TYPE_SPAN_START;
86
+ buffer.message(0, 'span-1');
87
+ buffer.level(0, 1); // INFO
88
+
89
+ buffer.timestamp[1] = 2000n;
90
+ buffer.entry_type[1] = ENTRY_TYPE_INFO;
91
+ buffer.message(1, 'Log message');
92
+ buffer.level(1, 0); // DEBUG
93
+
94
+ buffer.timestamp[2] = 3000n;
95
+ buffer.entry_type[2] = ENTRY_TYPE_SPAN_OK;
96
+ buffer.message(2, 'span-1');
97
+ buffer.level(2, 2); // WARN
98
+
99
+ buffer._writeIndex = 3;
100
+
101
+ const table = convertToArrowTable(buffer);
102
+
103
+ expect(table.numRows).toBe(3);
104
+
105
+ expect(getRawTimestamp(table, 0)).toBe(1000n);
106
+ expect(getColumnValue(table, 'entry_type', 0)).toBe('span-start');
107
+ expect(getColumnValue(table, 'level', 0)).toBe('INFO');
108
+
109
+ expect(getRawTimestamp(table, 1)).toBe(2000n);
110
+ expect(getColumnValue(table, 'entry_type', 1)).toBe('info');
111
+ expect(getColumnValue(table, 'level', 1)).toBe('DEBUG');
112
+
113
+ expect(getRawTimestamp(table, 2)).toBe(3000n);
114
+ expect(getColumnValue(table, 'entry_type', 2)).toBe('span-ok');
115
+ expect(getColumnValue(table, 'level', 2)).toBe('WARN');
116
+ });
117
+
118
+ test('handles null values correctly', () => {
119
+ const schema = createTestSchema({
120
+ optionalField: S.category(),
121
+ requiredField: S.number(),
122
+ });
123
+
124
+ const buffer = createSpanBuffer(schema, createTestTraceRoot('trace-789'), DEFAULT_METADATA, undefined);
125
+
126
+ // Write row with only requiredField set
127
+ buffer.timestamp[0] = 1000n;
128
+ buffer.entry_type[0] = ENTRY_TYPE_SPAN_START;
129
+ buffer.message(0, 'test-span');
130
+ buffer.requiredField(0, 42);
131
+ // optionalField not set - should be null
132
+ buffer._writeIndex = 1;
133
+
134
+ const table = convertToArrowTable(buffer);
135
+
136
+ expect(table.numRows).toBe(1);
137
+
138
+ expect(getColumnValue(table, 'requiredField', 0)).toBe(42);
139
+ expect(getColumnValue(table, 'optionalField', 0)).toBeUndefined();
140
+ });
141
+ });
142
+
143
+ describe('Buffer chaining', () => {
144
+ test('converts chained buffers to single table', () => {
145
+ const schema = createTestSchema({
146
+ counter: S.number(),
147
+ });
148
+
149
+ const buffer1 = createSpanBuffer(schema, createTestTraceRoot('trace-chain'), DEFAULT_METADATA, undefined);
150
+
151
+ // Fill first buffer
152
+ buffer1.timestamp[0] = 1000n;
153
+ buffer1.entry_type[0] = ENTRY_TYPE_SPAN_START;
154
+ buffer1.message(0, 'test-span');
155
+ buffer1.counter(0, 1);
156
+ buffer1._writeIndex = 1;
157
+
158
+ // Create chained buffer
159
+ const buffer2 = createOverflowBuffer(buffer1);
160
+ buffer2.timestamp[0] = 2000n;
161
+ buffer2.entry_type[0] = ENTRY_TYPE_INFO;
162
+ buffer2.message(0, 'Log in chain');
163
+ buffer2.counter(0, 2);
164
+ buffer2._writeIndex = 1;
165
+
166
+ const table = convertToArrowTable(buffer1);
167
+
168
+ expect(table.numRows).toBe(2);
169
+
170
+ expect(getRawTimestamp(table, 0)).toBe(1000n);
171
+ expect(getColumnValue(table, 'counter', 0)).toBe(1);
172
+
173
+ expect(getRawTimestamp(table, 1)).toBe(2000n);
174
+ expect(getColumnValue(table, 'counter', 1)).toBe(2);
175
+ });
176
+
177
+ test('handles multiple chained buffers', () => {
178
+ const schema = createTestSchema({
179
+ value: S.number(),
180
+ });
181
+
182
+ const buffer1 = createSpanBuffer(schema, createTestTraceRoot('trace-multi-chain'), DEFAULT_METADATA, undefined);
183
+
184
+ buffer1.timestamp[0] = 1000n;
185
+ buffer1.entry_type[0] = ENTRY_TYPE_SPAN_START;
186
+ buffer1.message(0, 'test');
187
+ buffer1.value(0, 1);
188
+ buffer1._writeIndex = 1;
189
+
190
+ const buffer2 = createOverflowBuffer(buffer1);
191
+ buffer2.timestamp[0] = 2000n;
192
+ buffer2.entry_type[0] = ENTRY_TYPE_INFO;
193
+ buffer2.message(0, 'log-1');
194
+ buffer2.value(0, 2);
195
+ buffer2._writeIndex = 1;
196
+
197
+ const buffer3 = createOverflowBuffer(buffer2);
198
+ buffer3.timestamp[0] = 3000n;
199
+ buffer3.entry_type[0] = ENTRY_TYPE_SPAN_OK;
200
+ buffer3.message(0, 'test');
201
+ buffer3.value(0, 3);
202
+ buffer3._writeIndex = 1;
203
+
204
+ const table = convertToArrowTable(buffer1);
205
+
206
+ expect(table.numRows).toBe(3);
207
+
208
+ // Verify all values are present
209
+ const values = [
210
+ getColumnValue(table, 'value', 0),
211
+ getColumnValue(table, 'value', 1),
212
+ getColumnValue(table, 'value', 2),
213
+ ];
214
+ expect(values).toEqual([1, 2, 3]);
215
+ });
216
+ });
217
+
218
+ describe('Span tree conversion', () => {
219
+ test('stores compact identity bytes for child spans', () => {
220
+ const schema = createTestSchema({});
221
+ const SpanBufferClass = getSpanBufferClass(schema);
222
+
223
+ const parentBuffer = createSpanBuffer(
224
+ schema,
225
+ createTestTraceRoot('trace-identity-layout'),
226
+ DEFAULT_METADATA,
227
+ undefined,
228
+ );
229
+
230
+ const childBuffer = createChildSpanBuffer(parentBuffer, SpanBufferClass, DEFAULT_METADATA, DEFAULT_METADATA);
231
+
232
+ // Root identity stores thread_id + span_id + trace_id metadata.
233
+ expect(parentBuffer._identity.byteLength).toBeGreaterThan(12);
234
+ // Child identity stores only thread_id + span_id.
235
+ expect(childBuffer._identity.byteLength).toBe(12);
236
+ });
237
+
238
+ test('converts parent and child spans to single table', () => {
239
+ const schema = createTestSchema({
240
+ spanType: S.category(),
241
+ });
242
+
243
+ const SpanBufferClass = getSpanBufferClass(schema);
244
+ const parentBuffer = createSpanBuffer(schema, createTestTraceRoot('trace-tree'), DEFAULT_METADATA, undefined);
245
+
246
+ parentBuffer.timestamp[0] = 1000n;
247
+ parentBuffer.entry_type[0] = ENTRY_TYPE_SPAN_START;
248
+ parentBuffer.message(0, 'parent-span');
249
+ parentBuffer.spanType(0, 'parent');
250
+ parentBuffer._writeIndex = 1;
251
+
252
+ // Create child span and register with parent
253
+ const childBuffer = createChildSpanBuffer(
254
+ parentBuffer,
255
+ SpanBufferClass,
256
+ DEFAULT_METADATA,
257
+ DEFAULT_METADATA,
258
+ ) as SpanBuffer<typeof schema>;
259
+ parentBuffer._children.push(childBuffer); // Explicit registration per spanBuffer.ts
260
+
261
+ childBuffer.timestamp[0] = 1500n;
262
+ childBuffer.entry_type[0] = ENTRY_TYPE_SPAN_START;
263
+ childBuffer.message(0, 'child-span');
264
+ childBuffer.spanType(0, 'child');
265
+ childBuffer._writeIndex = 1;
266
+
267
+ // Complete child span
268
+ childBuffer.timestamp[1] = 1800n;
269
+ childBuffer.entry_type[1] = ENTRY_TYPE_SPAN_OK;
270
+ childBuffer.message(1, 'child-span');
271
+ childBuffer._writeIndex = 2;
272
+
273
+ // Complete parent span
274
+ parentBuffer.timestamp[1] = 2000n;
275
+ parentBuffer.entry_type[1] = ENTRY_TYPE_SPAN_OK;
276
+ parentBuffer.message(1, 'parent-span');
277
+ parentBuffer._writeIndex = 2;
278
+
279
+ const table = convertSpanTreeToArrowTable(parentBuffer);
280
+
281
+ // Should have 4 rows: parent start, parent end, child start, child end
282
+ // (walkSpanTree visits buffer rows first, then children recursively)
283
+ expect(table.numRows).toBe(4);
284
+
285
+ // Verify span hierarchy is preserved
286
+ // All should have same trace_id
287
+ const traceIds = [0, 1, 2, 3].map((rowIndex) => getColumnValue(table, 'trace_id', rowIndex));
288
+ expect(new Set(traceIds).size).toBe(1);
289
+
290
+ // Parent and child should have different span_ids
291
+ // Order: parent start (0), parent end (1), child start (2), child end (3)
292
+ const spanIds = [0, 1, 2, 3].map((rowIndex) => getColumnValue(table, 'span_id', rowIndex));
293
+ expect(spanIds[0]).toBe(spanIds[1]); // Parent start and end (both from parent buffer)
294
+ expect(spanIds[2]).toBe(spanIds[3]); // Child start and end (both from child buffer)
295
+ expect(spanIds[0]).not.toBe(spanIds[2]); // Parent != Child
296
+ });
297
+
298
+ test('handles multiple sibling child spans', () => {
299
+ const schema = createTestSchema({});
300
+
301
+ const SpanBufferClass = getSpanBufferClass(schema);
302
+ const parentBuffer = createSpanBuffer(schema, createTestTraceRoot('trace-siblings'), DEFAULT_METADATA, undefined);
303
+
304
+ parentBuffer.timestamp[0] = 1000n;
305
+ parentBuffer.entry_type[0] = ENTRY_TYPE_SPAN_START;
306
+ parentBuffer.message(0, 'parent');
307
+ parentBuffer._writeIndex = 1;
308
+
309
+ // Create first child and register with parent
310
+ const child1Buffer = createChildSpanBuffer(parentBuffer, SpanBufferClass, DEFAULT_METADATA, DEFAULT_METADATA);
311
+ parentBuffer._children.push(child1Buffer); // Explicit registration per spanBuffer.ts
312
+ child1Buffer.timestamp[0] = 1100n;
313
+ child1Buffer.entry_type[0] = ENTRY_TYPE_SPAN_START;
314
+ child1Buffer.message(0, 'child-1');
315
+ child1Buffer.timestamp[1] = 1200n;
316
+ child1Buffer.entry_type[1] = ENTRY_TYPE_SPAN_OK;
317
+ child1Buffer.message(1, 'child-1');
318
+ child1Buffer._writeIndex = 2;
319
+
320
+ // Create second child and register with parent
321
+ const child2Buffer = createChildSpanBuffer(parentBuffer, SpanBufferClass, DEFAULT_METADATA, DEFAULT_METADATA);
322
+ parentBuffer._children.push(child2Buffer); // Explicit registration per spanBuffer.ts
323
+ child2Buffer.timestamp[0] = 1300n;
324
+ child2Buffer.entry_type[0] = ENTRY_TYPE_SPAN_START;
325
+ child2Buffer.message(0, 'child-2');
326
+ child2Buffer.timestamp[1] = 1400n;
327
+ child2Buffer.entry_type[1] = ENTRY_TYPE_SPAN_OK;
328
+ child2Buffer.message(1, 'child-2');
329
+ child2Buffer._writeIndex = 2;
330
+
331
+ // Complete parent
332
+ parentBuffer.timestamp[1] = 1500n;
333
+ parentBuffer.entry_type[1] = ENTRY_TYPE_SPAN_OK;
334
+ parentBuffer.message(1, 'parent');
335
+ parentBuffer._writeIndex = 2;
336
+
337
+ const table = convertSpanTreeToArrowTable(parentBuffer);
338
+
339
+ // Should have 6 rows: parent + 2 children with start/end each
340
+ expect(table.numRows).toBe(6);
341
+ });
342
+ });
343
+
344
+ describe('Entry type handling', () => {
345
+ test('correctly converts all entry types', () => {
346
+ const schema = createTestSchema({});
347
+
348
+ // Use capacity of 16 to hold all 11 entry types
349
+ const buffer = createSpanBuffer(schema, createTestTraceRoot('trace-types'), DEFAULT_METADATA, 16);
350
+
351
+ const entryTypes = [
352
+ ENTRY_TYPE_SPAN_START,
353
+ ENTRY_TYPE_SPAN_OK,
354
+ ENTRY_TYPE_SPAN_ERR,
355
+ ENTRY_TYPE_SPAN_EXCEPTION,
356
+ ENTRY_TYPE_TRACE,
357
+ ENTRY_TYPE_DEBUG,
358
+ ENTRY_TYPE_INFO,
359
+ ENTRY_TYPE_WARN,
360
+ ENTRY_TYPE_ERROR,
361
+ ENTRY_TYPE_FF_ACCESS,
362
+ ENTRY_TYPE_FF_USAGE,
363
+ ];
364
+
365
+ const expectedNames = [
366
+ 'span-start',
367
+ 'span-ok',
368
+ 'span-err',
369
+ 'span-exception',
370
+ 'trace',
371
+ 'debug',
372
+ 'info',
373
+ 'warn',
374
+ 'error',
375
+ 'ff-access',
376
+ 'ff-usage',
377
+ ];
378
+
379
+ // Write one row for each entry type
380
+ for (let i = 0; i < entryTypes.length; i++) {
381
+ buffer.timestamp[i] = BigInt(1000 + i * 100);
382
+ buffer.entry_type[i] = entryTypes[i];
383
+ buffer.message(i, `entry-${i}`);
384
+ }
385
+ buffer._writeIndex = entryTypes.length;
386
+
387
+ const table = convertToArrowTable(buffer);
388
+
389
+ expect(table.numRows).toBe(entryTypes.length);
390
+
391
+ // Verify each entry type is correctly converted
392
+ for (let i = 0; i < entryTypes.length; i++) {
393
+ expect(getColumnValue(table, 'entry_type', i)).toBe(expectedNames[i]);
394
+ }
395
+ });
396
+ });
397
+
398
+ describe('Buffer metrics', () => {
399
+ test('includes both span entries and buffer metric entries in same table', () => {
400
+ const schema = createTestSchema({});
401
+ const SpanBufferClass = getSpanBufferClass(schema);
402
+ const metadata = createTestOpMetadata({ package_name: '@test/package' });
403
+ const buffer = createSpanBuffer(schema, createTestTraceRoot('trace-123'), metadata, undefined);
404
+
405
+ // Write some span entries
406
+ buffer.timestamp[0] = 1000n;
407
+ buffer.entry_type[0] = ENTRY_TYPE_SPAN_START;
408
+ buffer.message(0, 'test-span');
409
+ buffer._writeIndex = 1;
410
+
411
+ buffer.timestamp[1] = 2000n;
412
+ buffer.entry_type[1] = ENTRY_TYPE_INFO;
413
+ buffer.message(1, 'Test log message');
414
+ buffer._writeIndex = 2;
415
+
416
+ // Update capacity stats to have meaningful values (utilization-based tuning)
417
+ SpanBufferClass.stats.capacity = 128;
418
+ SpanBufferClass.stats.totalWrites = 50;
419
+ SpanBufferClass.stats.spansCreated = 5;
420
+
421
+ // Convert with statsToLog - now requires CapacityStatsEntry[] with both SpanBufferClass and metadata
422
+ const statsToLog: CapacityStatsEntry[] = [{ bufferClass: SpanBufferClass, metadata }];
423
+ const table = convertSpanTreeToArrowTable(buffer, undefined, statsToLog);
424
+
425
+ // Should have span entries (2) + buffer metric entries (4) = 6 rows total
426
+ expect(table.numRows).toBe(6);
427
+
428
+ // Verify span entries
429
+ expect(getColumnValue(table, 'entry_type', 0)).toBe('span-start');
430
+ expect(getColumnValue(table, 'message', 0)).toBe('test-span');
431
+
432
+ expect(getColumnValue(table, 'entry_type', 1)).toBe('info');
433
+ expect(getColumnValue(table, 'message', 1)).toBe('Test log message');
434
+
435
+ // Verify buffer metric entries (4 rows per module for utilization-based tuning)
436
+ // Per spec, buffer metrics use uint64_value column, NOT JSON in message
437
+ expect(getColumnValue(table, 'entry_type', 2)).toBe('period-start');
438
+ expect(getColumnValue(table, 'package_name', 2)).toBe('@test/package');
439
+ expect(toBigInt(getColumnValue(table, 'uint64_value', 2))).toBe(0n); // periodStartNs defaults to 0n
440
+
441
+ expect(getColumnValue(table, 'entry_type', 3)).toBe('buffer-writes');
442
+ expect(toBigInt(getColumnValue(table, 'uint64_value', 3))).toBe(50n); // totalWrites
443
+
444
+ expect(getColumnValue(table, 'entry_type', 4)).toBe('buffer-spans');
445
+ expect(toBigInt(getColumnValue(table, 'uint64_value', 4))).toBe(5n); // spansCreated
446
+
447
+ expect(getColumnValue(table, 'entry_type', 5)).toBe('buffer-capacity');
448
+ expect(toBigInt(getColumnValue(table, 'uint64_value', 5))).toBe(128n); // capacity
449
+ });
450
+
451
+ test('includes only buffer metrics when no span data', () => {
452
+ const schema = createTestSchema({});
453
+ const SpanBufferClass = getSpanBufferClass(schema);
454
+ const metadata = createTestOpMetadata();
455
+ const buffer = createSpanBuffer(schema, createTestTraceRoot('trace-123'), metadata, undefined);
456
+
457
+ // Buffer has no entries (writeIndex = 0)
458
+ buffer._writeIndex = 0;
459
+
460
+ // Update capacity stats (utilization-based tuning)
461
+ SpanBufferClass.stats.capacity = 64;
462
+ SpanBufferClass.stats.totalWrites = 10;
463
+ SpanBufferClass.stats.spansCreated = 2;
464
+
465
+ // Convert with statsToLog - now requires CapacityStatsEntry[] with both SpanBufferClass and metadata
466
+ const statsToLog: CapacityStatsEntry[] = [{ bufferClass: SpanBufferClass, metadata }];
467
+ const table = convertSpanTreeToArrowTable(buffer, undefined, statsToLog);
468
+
469
+ // Should have only buffer metric entries (4 rows)
470
+ expect(table.numRows).toBe(4);
471
+
472
+ expect(getColumnValue(table, 'entry_type', 0)).toBe('period-start');
473
+ expect(toBigInt(getColumnValue(table, 'uint64_value', 0))).toBe(0n);
474
+
475
+ expect(getColumnValue(table, 'entry_type', 1)).toBe('buffer-writes');
476
+ expect(toBigInt(getColumnValue(table, 'uint64_value', 1))).toBe(10n);
477
+
478
+ expect(getColumnValue(table, 'entry_type', 2)).toBe('buffer-spans');
479
+ expect(toBigInt(getColumnValue(table, 'uint64_value', 2))).toBe(2n); // spansCreated
480
+
481
+ expect(getColumnValue(table, 'entry_type', 3)).toBe('buffer-capacity');
482
+ expect(toBigInt(getColumnValue(table, 'uint64_value', 3))).toBe(64n); // capacity
483
+ });
484
+ });
485
+ });