@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,292 @@
1
+ import { describe, expect, it } from 'bun:test';
2
+ import { tableFromColumns, tableFromIPC, tableToIPC } from '@uwdata/flechette';
3
+ import { convertToArrowTable } from '../../convertToArrow.js';
4
+ import { DEFAULT_METADATA } from '../../opContext/defineOp.js';
5
+ import { S } from '../../schema/builder.js';
6
+ import { ENTRY_TYPE_SPAN_START } from '../../schema/systemSchema.js';
7
+ import { createSpanBuffer } from '../../spanBuffer.js';
8
+
9
+ import { createTestSchema, createTestTraceRoot, createTraceId } from '../test-helpers.js';
10
+
11
+ function serializeToIpcFile(table: ReturnType<typeof convertToArrowTable>, columnNames: string[]): Uint8Array {
12
+ if (columnNames.length === 0) {
13
+ const ipcBytes = tableToIPC(tableFromColumns({}), { format: 'file' });
14
+ if (!ipcBytes) {
15
+ throw new Error('Failed to serialize empty Arrow table');
16
+ }
17
+ return ipcBytes;
18
+ }
19
+
20
+ const ipcColumns: Record<string, NonNullable<ReturnType<typeof table.getChild>>> = {};
21
+ for (const columnName of columnNames) {
22
+ const column = table.getChild(columnName);
23
+ if (!column) {
24
+ throw new Error(`Column not found for IPC file serialization: ${columnName}`);
25
+ }
26
+ ipcColumns[columnName] = column;
27
+ }
28
+
29
+ const ipcTable = tableFromColumns(ipcColumns);
30
+ const ipcBytes = tableToIPC(ipcTable, { format: 'file' });
31
+ if (!ipcBytes) {
32
+ throw new Error('Failed to serialize Arrow table');
33
+ }
34
+ return ipcBytes;
35
+ }
36
+
37
+ describe('Arrow Binary Format Compliance', () => {
38
+ describe('IPC Message Structure', () => {
39
+ it('should write correct IPC continuation bytes', () => {
40
+ const schema = createTestSchema({
41
+ numberValue: S.number(),
42
+ });
43
+
44
+ const traceId = createTraceId('trace-123');
45
+ const buffer = createSpanBuffer(schema, createTestTraceRoot(traceId), DEFAULT_METADATA, undefined);
46
+ buffer._opMetadata = DEFAULT_METADATA;
47
+
48
+ // Donbuffer._opMetadata = DEFAULT_METADATA;
49
+
50
+ // Writebuffer.timestamp[0] = BigInt(Date.now()) * 1000000n;
51
+ buffer.entry_type[0] = ENTRY_TYPE_SPAN_START;
52
+ buffer.numberValue(0, 42);
53
+ buffer._writeIndex = 1;
54
+
55
+ const table = convertToArrowTable(buffer);
56
+ const ipcBytes = serializeToIpcFile(table, ['numberValue']);
57
+
58
+ // IPC file should start with ARROW1 magic bytes
59
+ const magic = new TextDecoder().decode(ipcBytes.slice(0, 6));
60
+ expect(magic).toBe('ARROW1');
61
+ });
62
+ });
63
+
64
+ describe('Endianness', () => {
65
+ it('should preserve number values through round-trip', () => {
66
+ const schema = createTestSchema({
67
+ uint32Value: S.number(),
68
+ });
69
+
70
+ const traceId = createTraceId('trace-123');
71
+ const buffer = createSpanBuffer(schema, createTestTraceRoot(traceId), DEFAULT_METADATA, undefined);
72
+ buffer._opMetadata = DEFAULT_METADATA;
73
+
74
+ // Write test data using generated methods
75
+ const testValue = 0x12345678;
76
+ buffer.timestamp[0] = BigInt(Date.now()) * 1000000n;
77
+ buffer.entry_type[0] = ENTRY_TYPE_SPAN_START;
78
+ buffer.uint32Value(0, testValue);
79
+ buffer._writeIndex = 1;
80
+
81
+ const table = convertToArrowTable(buffer);
82
+ const ipcBytes = serializeToIpcFile(table, ['uint32Value']);
83
+
84
+ // Round-trip test
85
+ const reader = tableFromIPC(ipcBytes);
86
+ expect(reader.numRows).toBe(1);
87
+
88
+ // Find our data column (skip system columns)
89
+ for (let i = 0; i < reader.schema.fields.length; i++) {
90
+ const field = reader.schema.fields[i];
91
+ if (field.name === 'uint32Value') {
92
+ const col = reader.getChildAt(i);
93
+ if (col) {
94
+ expect(col.get(0)).toBe(testValue);
95
+ }
96
+ break;
97
+ }
98
+ }
99
+ });
100
+ });
101
+
102
+ describe('Null Bitmaps', () => {
103
+ it('should handle null values correctly in round-trip', () => {
104
+ const schema = createTestSchema({
105
+ numberValue: S.number(),
106
+ });
107
+
108
+ const traceId = createTraceId('trace-123');
109
+ const buffer = createSpanBuffer(schema, createTestTraceRoot(traceId), DEFAULT_METADATA, undefined);
110
+ buffer._opMetadata = DEFAULT_METADATA;
111
+
112
+ // Write data with some nulls
113
+ const testData = [1, null, 3, null, 5];
114
+
115
+ for (let i = 0; i < testData.length; i++) {
116
+ const value = testData[i];
117
+ buffer.timestamp[i] = BigInt(Date.now()) * 1000000n;
118
+ buffer.entry_type[i] = ENTRY_TYPE_SPAN_START;
119
+
120
+ if (value === null) {
121
+ // Don't call the method for null values, just leave as default (null)
122
+ } else {
123
+ buffer.numberValue(i, value);
124
+ }
125
+ }
126
+ buffer._writeIndex = testData.length;
127
+
128
+ const table = convertToArrowTable(buffer);
129
+ const ipcBytes = serializeToIpcFile(table, ['numberValue']);
130
+
131
+ // Round-trip test
132
+ const reader = tableFromIPC(ipcBytes);
133
+ expect(reader.numRows).toBe(5);
134
+
135
+ // Find our data column and verify null handling
136
+ for (let i = 0; i < reader.schema.fields.length; i++) {
137
+ const field = reader.schema.fields[i];
138
+ if (field.name === 'numberValue') {
139
+ const col = reader.getChildAt(i);
140
+ if (col) {
141
+ expect(col.get(0)).toBe(1);
142
+ expect(col.get(1)).toBe(null);
143
+ expect(col.get(2)).toBe(3);
144
+ expect(col.get(3)).toBe(null);
145
+ expect(col.get(4)).toBe(5);
146
+ }
147
+ break;
148
+ }
149
+ }
150
+ });
151
+ });
152
+
153
+ describe('Dictionary Encoding', () => {
154
+ it('should handle enum values correctly in round-trip', () => {
155
+ const schema = createTestSchema({
156
+ enumValue: S.enum(['a', 'b', 'c']),
157
+ });
158
+
159
+ const traceId = createTraceId('trace-123');
160
+ const buffer = createSpanBuffer(schema, createTestTraceRoot(traceId), DEFAULT_METADATA, undefined);
161
+ buffer._opMetadata = DEFAULT_METADATA;
162
+
163
+ // Write test data using generated methods
164
+ // For enums, we pass the index, not the string value
165
+ const testValues = [0, 1, 2, 0]; // a=0, b=1, c=2, includes repeated value
166
+
167
+ for (let i = 0; i < testValues.length; i++) {
168
+ buffer.timestamp[i] = BigInt(Date.now()) * 1000000n;
169
+ buffer.entry_type[i] = ENTRY_TYPE_SPAN_START;
170
+ buffer.enumValue(i, testValues[i]);
171
+ }
172
+ buffer._writeIndex = testValues.length;
173
+
174
+ const table = convertToArrowTable(buffer);
175
+ const enumField = table.schema.fields.find((field) => field.name === 'enumValue');
176
+ expect(enumField).toBeDefined();
177
+ expect(enumField?.type.typeId).toBe(-1);
178
+
179
+ const enumColumn = table.getChild('enumValue');
180
+ if (!enumColumn) {
181
+ throw new Error('enumValue column not found');
182
+ }
183
+ expect(enumColumn.get(0)).toBe('a');
184
+ expect(enumColumn.get(1)).toBe('b');
185
+ expect(enumColumn.get(2)).toBe('c');
186
+ expect(enumColumn.get(3)).toBe('a');
187
+ });
188
+ });
189
+
190
+ describe('Variable Size Binary', () => {
191
+ it('should handle string values correctly in round-trip', () => {
192
+ const schema = createTestSchema({
193
+ textValue: S.text(),
194
+ });
195
+
196
+ const traceId = createTraceId('trace-123');
197
+ const buffer = createSpanBuffer(schema, createTestTraceRoot(traceId), DEFAULT_METADATA, undefined);
198
+ buffer._opMetadata = DEFAULT_METADATA;
199
+
200
+ // Write test data with various string lengths
201
+ const testValues = ['', 'hello', '', 'world!'];
202
+
203
+ for (let i = 0; i < testValues.length; i++) {
204
+ buffer.timestamp[i] = BigInt(Date.now()) * 1000000n;
205
+ buffer.entry_type[i] = ENTRY_TYPE_SPAN_START;
206
+ buffer.textValue(i, testValues[i]);
207
+ }
208
+ buffer._writeIndex = testValues.length;
209
+
210
+ const table = convertToArrowTable(buffer);
211
+ const textField = table.schema.fields.find((field) => field.name === 'textValue');
212
+ expect(textField).toBeDefined();
213
+ expect(textField?.type.typeId).toBe(-1);
214
+
215
+ const textColumn = table.getChild('textValue');
216
+ if (!textColumn) {
217
+ throw new Error('textValue column not found');
218
+ }
219
+ expect(textColumn.get(0)).toBe('');
220
+ expect(textColumn.get(1)).toBe('hello');
221
+ expect(textColumn.get(2)).toBe('');
222
+ expect(textColumn.get(3)).toBe('world!');
223
+ });
224
+ });
225
+
226
+ describe('Edge Cases', () => {
227
+ it('should handle empty buffers correctly', () => {
228
+ const schema = createTestSchema({
229
+ numberValue: S.number(),
230
+ });
231
+
232
+ const traceId = createTraceId('trace-123');
233
+ const buffer = createSpanBuffer(schema, createTestTraceRoot(traceId), DEFAULT_METADATA, undefined);
234
+ buffer._opMetadata = DEFAULT_METADATA;
235
+
236
+ // Don't write any data
237
+
238
+ const table = convertToArrowTable(buffer);
239
+ const ipcBytes = serializeToIpcFile(table, []);
240
+
241
+ // Should still produce valid IPC
242
+ expect(ipcBytes.length).toBeGreaterThan(0);
243
+
244
+ // Should round-trip
245
+ const reader = tableFromIPC(ipcBytes);
246
+ expect(reader.numRows).toBe(0);
247
+ });
248
+
249
+ it('should handle boolean values correctly', () => {
250
+ const schema = createTestSchema({
251
+ boolValue: S.boolean(),
252
+ });
253
+
254
+ const traceId = createTraceId('trace-123');
255
+ const buffer = createSpanBuffer(schema, createTestTraceRoot(traceId), DEFAULT_METADATA, undefined);
256
+ buffer._opMetadata = DEFAULT_METADATA;
257
+
258
+ // Write test data using generated methods
259
+ const testValues = [true, false, true, false, true];
260
+
261
+ for (let i = 0; i < testValues.length; i++) {
262
+ buffer.timestamp[i] = BigInt(Date.now()) * 1000000n;
263
+ buffer.entry_type[i] = ENTRY_TYPE_SPAN_START;
264
+ buffer.boolValue(i, testValues[i]);
265
+ }
266
+ buffer._writeIndex = testValues.length;
267
+
268
+ const table = convertToArrowTable(buffer);
269
+ const ipcBytes = serializeToIpcFile(table, ['boolValue']);
270
+
271
+ // Round-trip test
272
+ const reader = tableFromIPC(ipcBytes);
273
+ expect(reader.numRows).toBe(5);
274
+
275
+ // Find our data column and verify boolean handling
276
+ for (let i = 0; i < reader.schema.fields.length; i++) {
277
+ const field = reader.schema.fields[i];
278
+ if (field.name === 'boolValue') {
279
+ const col = reader.getChildAt(i);
280
+ if (col) {
281
+ expect(col.get(0)).toBe(true);
282
+ expect(col.get(1)).toBe(false);
283
+ expect(col.get(2)).toBe(true);
284
+ expect(col.get(3)).toBe(false);
285
+ expect(col.get(4)).toBe(true);
286
+ }
287
+ break;
288
+ }
289
+ }
290
+ });
291
+ });
292
+ });
@@ -0,0 +1,354 @@
1
+ import { beforeEach, describe, expect, it } from 'bun:test';
2
+ import { DEFAULT_BUFFER_CAPACITY } from '@smoothbricks/arrow-builder';
3
+ import { DEFAULT_METADATA } from '../../opContext/defineOp.js';
4
+ import { S } from '../../schema/builder.js';
5
+ import type { LogSchema } from '../../schema/LogSchema.js';
6
+ import {
7
+ createChildSpanBuffer,
8
+ createOverflowBuffer,
9
+ createSpanBuffer,
10
+ getSpanBufferClass,
11
+ type SpanBufferConstructor,
12
+ } from '../../spanBuffer.js';
13
+
14
+ import type { SpanBuffer } from '../../types.js';
15
+ import { createBuffer, createTestSchema, createTestTraceRoot, createTraceId } from '../test-helpers.js';
16
+
17
+ describe('Buffer Chaining', () => {
18
+ let schema: LogSchema;
19
+ let SpanBufferClass: SpanBufferConstructor;
20
+
21
+ beforeEach(() => {
22
+ // Use LogSchema directly - createSpanBuffer requires LogSchema, not plain object
23
+ schema = createTestSchema({
24
+ userId: S.category(),
25
+ requestId: S.category(),
26
+ operation: S.enum(['GET', 'POST', 'PUT', 'DELETE']),
27
+ duration: S.number(),
28
+ });
29
+
30
+ SpanBufferClass = getSpanBufferClass(schema);
31
+ });
32
+
33
+ describe('createOverflowBuffer', () => {
34
+ it('should create a chained buffer with same spanId and traceId', () => {
35
+ const buffer = createBuffer(schema);
36
+ const nextBuffer = createOverflowBuffer(buffer);
37
+
38
+ // Should inherit spanId and traceId
39
+ expect(nextBuffer.span_id).toBe(buffer.span_id);
40
+ expect(nextBuffer.trace_id).toBe(buffer.trace_id);
41
+
42
+ // Should be linked via next property
43
+ expect(buffer._overflow).toBe(nextBuffer);
44
+
45
+ // Should have same parent
46
+ expect(nextBuffer._parent).toBe(buffer._parent);
47
+ });
48
+
49
+ it('should create buffer with current capacity from stats', () => {
50
+ const buffer = createBuffer(schema);
51
+
52
+ // Update capacity stats
53
+ SpanBufferClass.stats.capacity = 128;
54
+
55
+ const nextBuffer = createOverflowBuffer(buffer);
56
+
57
+ // Should use updated capacity (rounded to multiple of 8)
58
+ expect(nextBuffer._capacity).toBe(128);
59
+ });
60
+
61
+ it('should create independent writeIndex for chained buffer', () => {
62
+ const buffer = createBuffer(schema);
63
+
64
+ // Write some data to original buffer
65
+ buffer._writeIndex = 50;
66
+
67
+ const nextBuffer = createOverflowBuffer(buffer);
68
+
69
+ // Chained buffer should start at 0
70
+ expect(nextBuffer._writeIndex).toBe(0);
71
+ // Uses currentCapacity from stats (default)
72
+ expect(nextBuffer._capacity).toBe(DEFAULT_BUFFER_CAPACITY);
73
+ });
74
+
75
+ it('should maintain schema structure in chained buffer', () => {
76
+ const buffer = createBuffer(schema);
77
+ const nextBuffer = createOverflowBuffer(buffer);
78
+
79
+ // Should have same attribute columns (use _values suffix to access storage)
80
+ expect(Array.isArray(nextBuffer.userId_values)).toBe(true); // category (raw strings)
81
+ expect(Array.isArray(nextBuffer.requestId_values)).toBe(true); // category (raw strings)
82
+ expect(nextBuffer.operation_values).toBeInstanceOf(Uint8Array);
83
+ expect(nextBuffer.duration_values).toBeInstanceOf(Float64Array);
84
+
85
+ // Should have core columns
86
+ expect(nextBuffer.timestamp).toBeInstanceOf(BigInt64Array);
87
+ expect(nextBuffer.entry_type).toBeInstanceOf(Uint8Array);
88
+ });
89
+
90
+ it('should handle multiple chained buffers', () => {
91
+ const buffer1 = createBuffer(schema);
92
+ const buffer2 = createOverflowBuffer(buffer1);
93
+ const buffer3 = createOverflowBuffer(buffer2);
94
+
95
+ // All should have same spanId and traceId
96
+ expect(buffer2.span_id).toBe(buffer1.span_id);
97
+ expect(buffer3.span_id).toBe(buffer1.span_id);
98
+ expect(buffer2.trace_id).toBe(buffer1.trace_id);
99
+ expect(buffer3.trace_id).toBe(buffer1.trace_id);
100
+
101
+ // Should be properly linked
102
+ expect(buffer1._overflow).toBe(buffer2);
103
+ expect(buffer2._overflow).toBe(buffer3);
104
+ });
105
+
106
+ it('should not affect spansCreated stat (overflow is continuation, not new span)', () => {
107
+ const buffer = createBuffer(schema);
108
+ const initialSpans = SpanBufferClass.stats.spansCreated;
109
+
110
+ createOverflowBuffer(buffer);
111
+
112
+ // Overflow buffers don't increment spansCreated - they're continuations, not new spans
113
+ expect(SpanBufferClass.stats.spansCreated).toBe(initialSpans);
114
+ });
115
+
116
+ it('should handle buffer with parent correctly', () => {
117
+ const parentBuffer = createBuffer(schema);
118
+
119
+ const childBuffer = createChildSpanBuffer(parentBuffer, SpanBufferClass, DEFAULT_METADATA, DEFAULT_METADATA);
120
+ parentBuffer._children.push(childBuffer);
121
+
122
+ const nextChildBuffer = createOverflowBuffer(childBuffer);
123
+
124
+ // Should maintain parent relationship
125
+ expect(nextChildBuffer._parent).toBe(parentBuffer);
126
+
127
+ // Should NOT be added to parent's children (it's a continuation, not a new span)
128
+ expect(parentBuffer._children).toHaveLength(1);
129
+ expect(parentBuffer._children[0]).toBe(childBuffer);
130
+ });
131
+
132
+ it('should create empty children array for chained buffer', () => {
133
+ const buffer = createBuffer(schema);
134
+
135
+ // Add a child to original buffer
136
+ const childBuffer = createChildSpanBuffer(buffer, SpanBufferClass, DEFAULT_METADATA, DEFAULT_METADATA);
137
+ buffer._children.push(childBuffer);
138
+
139
+ const nextBuffer = createOverflowBuffer(buffer);
140
+
141
+ // Chained buffer should have empty children array
142
+ expect(nextBuffer._children).toHaveLength(0);
143
+ });
144
+ });
145
+
146
+ describe('Buffer Chaining Edge Cases', () => {
147
+ it('should handle buffer at exact capacity', () => {
148
+ const buffer = createSpanBuffer(schema, createTestTraceRoot('test-trace'), DEFAULT_METADATA, 10);
149
+ buffer._writeIndex = 10; // At exact capacity
150
+
151
+ const nextBuffer = createOverflowBuffer(buffer);
152
+
153
+ expect(nextBuffer._writeIndex).toBe(0);
154
+ expect(nextBuffer._capacity).toBe(SpanBufferClass.stats.capacity);
155
+ });
156
+
157
+ it('should preserve null bitmaps structure in chained buffer', () => {
158
+ const buffer = createBuffer(schema);
159
+ const nextBuffer = createOverflowBuffer(buffer);
160
+
161
+ // Should have null bitmaps for each attribute (direct properties)
162
+ expect(nextBuffer.userId_nulls).toBeInstanceOf(Uint8Array);
163
+ expect(nextBuffer.requestId_nulls).toBeInstanceOf(Uint8Array);
164
+ expect(nextBuffer.operation_nulls).toBeInstanceOf(Uint8Array);
165
+ expect(nextBuffer.duration_nulls).toBeInstanceOf(Uint8Array);
166
+ });
167
+
168
+ it('should handle capacity changes between chained buffers', () => {
169
+ const buffer1 = createBuffer(schema);
170
+ expect(buffer1._capacity).toBe(DEFAULT_BUFFER_CAPACITY);
171
+
172
+ // Simulate capacity tuning - double it
173
+ SpanBufferClass.stats.capacity = DEFAULT_BUFFER_CAPACITY * 2;
174
+
175
+ const buffer2 = createOverflowBuffer(buffer1);
176
+ expect(buffer2._capacity).toBe(DEFAULT_BUFFER_CAPACITY * 2);
177
+
178
+ // Change capacity again - double again
179
+ SpanBufferClass.stats.capacity = DEFAULT_BUFFER_CAPACITY * 4;
180
+
181
+ const buffer3 = createOverflowBuffer(buffer2);
182
+ expect(buffer3._capacity).toBe(DEFAULT_BUFFER_CAPACITY * 4);
183
+ });
184
+ });
185
+
186
+ describe('Enhanced Buffer Chaining Tests', () => {
187
+ it('should preserve data integrity across multiple buffer overflows', () => {
188
+ const traceId = createTraceId('complex-trace');
189
+ const rootBuffer = createSpanBuffer(schema, createTestTraceRoot(traceId), DEFAULT_METADATA, 4); // Small capacity
190
+
191
+ // Write entries that will cause multiple overflows
192
+ const testEntries = Array.from({ length: 10 }, (_, i) => ({
193
+ userId: `user-${i % 3}`,
194
+ requestId: `req-${i % 2}`,
195
+ operation: (['GET', 'POST', 'PUT', 'DELETE'] as const)[i % 4],
196
+ duration: i * 1.5,
197
+ }));
198
+
199
+ const operationEnumValues = ['GET', 'POST', 'PUT', 'DELETE'] as const;
200
+ let currentBuffer = rootBuffer;
201
+ for (let i = 0; i < testEntries.length; i++) {
202
+ if (currentBuffer._writeIndex >= currentBuffer._capacity) {
203
+ currentBuffer = createOverflowBuffer(currentBuffer);
204
+ }
205
+
206
+ const pos = currentBuffer._writeIndex;
207
+ const entry = testEntries[i];
208
+
209
+ currentBuffer.userId(pos, entry.userId);
210
+ currentBuffer.requestId(pos, entry.requestId);
211
+ // Enum setter expects index, not string
212
+ currentBuffer.operation(pos, operationEnumValues.indexOf(entry.operation));
213
+ currentBuffer.duration(pos, entry.duration);
214
+ currentBuffer.timestamp[pos] = BigInt(Date.now() + i * 1000);
215
+ currentBuffer._writeIndex++;
216
+ }
217
+
218
+ // Verify all data is preserved across the chain
219
+ let verificationBuffer: SpanBuffer<typeof schema> | undefined = rootBuffer;
220
+ let verifiedCount = 0;
221
+
222
+ while (verificationBuffer && verifiedCount < testEntries.length) {
223
+ for (let i = 0; i < verificationBuffer._writeIndex && verifiedCount < testEntries.length; i++) {
224
+ const expected = testEntries[verifiedCount];
225
+
226
+ expect(verificationBuffer.userId_values[i]).toBe(expected.userId);
227
+ expect(verificationBuffer.requestId_values[i]).toBe(expected.requestId);
228
+ expect(verificationBuffer.operation_values[i]).toBe(
229
+ ['GET', 'POST', 'PUT', 'DELETE'].indexOf(expected.operation),
230
+ );
231
+ expect(verificationBuffer.duration_values[i]).toBe(expected.duration);
232
+
233
+ verifiedCount++;
234
+ }
235
+
236
+ verificationBuffer = verificationBuffer._overflow as SpanBuffer<typeof schema> | undefined;
237
+ }
238
+
239
+ expect(verifiedCount).toBe(testEntries.length);
240
+ });
241
+
242
+ it('should maintain buffer topology with mixed relationships', () => {
243
+ const traceId = createTraceId('topology-test');
244
+ const rootBuffer = createSpanBuffer(schema, createTestTraceRoot(traceId), DEFAULT_METADATA, undefined);
245
+
246
+ // Create first chained buffer with children
247
+ const buffer1 = createOverflowBuffer(rootBuffer);
248
+ const child1 = createChildSpanBuffer(buffer1, SpanBufferClass, DEFAULT_METADATA, DEFAULT_METADATA);
249
+ const child2 = createChildSpanBuffer(buffer1, SpanBufferClass, DEFAULT_METADATA, DEFAULT_METADATA);
250
+ buffer1._children.push(child1, child2);
251
+
252
+ // Create second chained buffer with children
253
+ const buffer2 = createOverflowBuffer(buffer1);
254
+ const child3 = createChildSpanBuffer(buffer2, SpanBufferClass, DEFAULT_METADATA, DEFAULT_METADATA);
255
+ buffer2._children.push(child3);
256
+
257
+ // Verify topology
258
+ // Overflow buffers inherit the logical parent (rootBuffer has no parent → undefined)
259
+ expect(rootBuffer._parent).toBeUndefined();
260
+ expect(rootBuffer._overflow).toBe(buffer1);
261
+ expect(rootBuffer._children).toHaveLength(0);
262
+
263
+ // buffer1 is an OVERFLOW of rootBuffer, so it inherits rootBuffer._parent (undefined)
264
+ expect(buffer1._parent).toBeUndefined();
265
+ expect(buffer1._overflow).toBe(buffer2);
266
+ expect(buffer1._children).toHaveLength(2);
267
+ expect(buffer1._children[0]).toBe(child1);
268
+ expect(buffer1._children[1]).toBe(child2);
269
+
270
+ // buffer2 is an OVERFLOW of buffer1, so it inherits buffer1._parent (undefined)
271
+ expect(buffer2._parent).toBeUndefined();
272
+ expect(buffer2._overflow).toBeUndefined();
273
+ expect(buffer2._children).toHaveLength(1);
274
+ expect(buffer2._children[0]).toBe(child3);
275
+
276
+ // Verify identity sharing
277
+ expect(rootBuffer.trace_id).toBe(traceId);
278
+ expect(buffer1.trace_id).toBe(traceId);
279
+ expect(buffer2.trace_id).toBe(traceId);
280
+ expect(child1.trace_id).toBe(traceId);
281
+ expect(child2.trace_id).toBe(traceId);
282
+ expect(child3.trace_id).toBe(traceId);
283
+
284
+ expect(rootBuffer.span_id).toBe(buffer1.span_id);
285
+ expect(buffer1.span_id).toBe(buffer2.span_id);
286
+ expect(child1.span_id).not.toBe(buffer1.span_id);
287
+ expect(child2.span_id).not.toBe(buffer1.span_id);
288
+ expect(child3.span_id).not.toBe(buffer2.span_id);
289
+
290
+ // Verify child relationships
291
+ expect(child1._parent).toBe(buffer1);
292
+ expect(child2._parent).toBe(buffer1);
293
+ expect(child3._parent).toBe(buffer2);
294
+ expect(child1._overflow).toBeUndefined();
295
+ expect(child2._overflow).toBeUndefined();
296
+ expect(child3._overflow).toBeUndefined();
297
+ });
298
+
299
+ it('should create overflow chain for many entries', () => {
300
+ // Use minimum capacity (8) to force overflow with fewer entries
301
+ const rootBuffer = createSpanBuffer(schema, createTestTraceRoot('test-trace'), DEFAULT_METADATA, 8);
302
+
303
+ // Write 20 entries to force multiple overflows
304
+ let currentBuffer = rootBuffer;
305
+ for (let i = 0; i < 20; i++) {
306
+ if (currentBuffer._writeIndex >= currentBuffer._capacity) {
307
+ currentBuffer = createOverflowBuffer(currentBuffer);
308
+ }
309
+
310
+ const pos = currentBuffer._writeIndex;
311
+ currentBuffer.userId(pos, `user-${i}`);
312
+ currentBuffer.operation(pos, 0); // GET
313
+ currentBuffer.duration(pos, 1.0);
314
+ currentBuffer._writeIndex++;
315
+ }
316
+
317
+ // Count actual buffers created
318
+ let bufferCount = 0;
319
+ let countBuffer: SpanBuffer<typeof schema> | undefined = rootBuffer;
320
+ while (countBuffer) {
321
+ bufferCount++;
322
+ countBuffer = countBuffer._overflow as SpanBuffer<typeof schema> | undefined;
323
+ }
324
+
325
+ // With capacity 8 and 20 entries, we need ceil(20/8) = 3 buffers
326
+ expect(bufferCount).toBe(3);
327
+ });
328
+
329
+ it('should preserve schema consistency across chain boundaries', () => {
330
+ const rootBuffer = createBuffer(schema);
331
+ const buffer1 = createOverflowBuffer(rootBuffer);
332
+ const buffer2 = createOverflowBuffer(buffer1);
333
+ const buffer3 = createOverflowBuffer(buffer2);
334
+
335
+ const buffers = [rootBuffer, buffer1, buffer2, buffer3];
336
+
337
+ // All buffers should have identical schema structure
338
+ for (const buf of buffers) {
339
+ expect(Array.isArray(buf.userId_values)).toBe(true);
340
+ expect(Array.isArray(buf.requestId_values)).toBe(true);
341
+ expect(buf.operation_values).toBeInstanceOf(Uint8Array);
342
+ expect(buf.duration_values).toBeInstanceOf(Float64Array);
343
+
344
+ expect(buf.userId_nulls).toBeInstanceOf(Uint8Array);
345
+ expect(buf.requestId_nulls).toBeInstanceOf(Uint8Array);
346
+ expect(buf.operation_nulls).toBeInstanceOf(Uint8Array);
347
+ expect(buf.duration_nulls).toBeInstanceOf(Uint8Array);
348
+
349
+ expect(buf.timestamp).toBeInstanceOf(BigInt64Array);
350
+ expect(buf.entry_type).toBeInstanceOf(Uint8Array);
351
+ }
352
+ });
353
+ });
354
+ });