@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,772 @@
1
+ import { getSchemaType } from '@smoothbricks/arrow-builder';
2
+ import { checkCapacityTuning } from '../capacityTuning.js';
3
+ function getFieldEager(value) {
4
+ return typeof value === 'object' && value !== null && Reflect.get(value, '__eager') === true;
5
+ }
6
+ function getFieldEnumValues(value) {
7
+ if (typeof value !== 'object' || value === null) {
8
+ return undefined;
9
+ }
10
+ const enumValues = Reflect.get(value, '__enum_values');
11
+ return Array.isArray(enumValues) ? enumValues : undefined;
12
+ }
13
+ function isColumnValueType(value) {
14
+ return value === undefined || Array.isArray(value) || ArrayBuffer.isView(value);
15
+ }
16
+ function getFreeMethod(sizeClass) {
17
+ switch (sizeClass) {
18
+ case '1b':
19
+ return 'free1B';
20
+ case '4b':
21
+ return 'free4B';
22
+ case '8b':
23
+ return 'free8B';
24
+ }
25
+ }
26
+ function isWasmSpanBufferConstructor(value) {
27
+ return (typeof value === 'function' &&
28
+ typeof Reflect.get(value, 'schema') === 'object' &&
29
+ Reflect.get(value, 'schema') !== null &&
30
+ typeof Reflect.get(value, 'stats') === 'object' &&
31
+ Reflect.get(value, 'stats') !== null);
32
+ }
33
+ export function isWasmSpanBufferInstance(value) {
34
+ return typeof value === 'object' && value !== null && typeof Reflect.get(value, '_systemPtr') === 'number';
35
+ }
36
+ function getWasmSpanBufferConstructor(instance) {
37
+ if (!isWasmSpanBufferConstructor(instance.constructor)) {
38
+ throw new Error('Expected generated WasmSpanBuffer constructor');
39
+ }
40
+ return instance.constructor;
41
+ }
42
+ function isWasmSpanBufferFactory(value) {
43
+ return typeof value === 'function';
44
+ }
45
+ /**
46
+ * Build column metadata array from schema.
47
+ * Maps each schema field to its storage characteristics.
48
+ */
49
+ function buildColumnMeta(schema) {
50
+ const result = [];
51
+ const fields = schema.fields;
52
+ let columnIndex = 0;
53
+ for (const name of schema._columnNames) {
54
+ const field = fields[name];
55
+ const schemaType = getSchemaType(field);
56
+ const isEager = getFieldEager(field);
57
+ const enumValues = getFieldEnumValues(field);
58
+ let sizeClass;
59
+ switch (schemaType) {
60
+ case 'enum':
61
+ case 'boolean':
62
+ sizeClass = '1b';
63
+ break;
64
+ case 'number':
65
+ case 'bigUint64':
66
+ sizeClass = '8b';
67
+ break;
68
+ case 'category':
69
+ case 'text':
70
+ sizeClass = 'string';
71
+ break;
72
+ default:
73
+ sizeClass = '8b'; // Default to largest for unknown types
74
+ }
75
+ result.push({
76
+ name,
77
+ sizeClass,
78
+ schemaType: schemaType ?? 'unknown',
79
+ columnIndex,
80
+ isEager,
81
+ enumValues,
82
+ });
83
+ columnIndex++;
84
+ }
85
+ return result;
86
+ }
87
+ // =============================================================================
88
+ // Common WasmSpanBuffer Methods (shared via prototype)
89
+ // =============================================================================
90
+ /**
91
+ * Get timestamp column view from WASM memory.
92
+ * Assigned to prototype after class generation.
93
+ */
94
+ function wasmGetTimestamp() {
95
+ return new BigInt64Array(this._allocator.memory.buffer, this._systemPtr, this._capacity);
96
+ }
97
+ /**
98
+ * Get entry_type column view from WASM memory.
99
+ * Assigned to prototype after class generation.
100
+ */
101
+ function wasmGetEntryType() {
102
+ return new Uint8Array(this._allocator.memory.buffer, this._systemPtr + this._capacity * 8, this._capacity);
103
+ }
104
+ /**
105
+ * Get writeIndex from WASM identity block.
106
+ */
107
+ function wasmGetWriteIndex() {
108
+ return this._allocator.readWriteIndex(this._identityPtr);
109
+ }
110
+ /**
111
+ * Set writeIndex in WASM identity block.
112
+ */
113
+ function wasmSetWriteIndex(value) {
114
+ new DataView(this._allocator.memory.buffer).setUint32(this._identityPtr, value, true);
115
+ }
116
+ /**
117
+ * Get trace_id from WASM identity block.
118
+ */
119
+ function wasmGetTraceId() {
120
+ const len = this._allocator.readIdentityTraceIdLen(this._identityPtr);
121
+ if (len === 0) {
122
+ let p = this._parent;
123
+ while (p?._parent)
124
+ p = p._parent;
125
+ return p ? p.trace_id : '';
126
+ }
127
+ const traceIdPtr = this._allocator.getIdentityTraceIdPtr(this._identityPtr);
128
+ return new TextDecoder().decode(new Uint8Array(this._allocator.memory.buffer, traceIdPtr, len));
129
+ }
130
+ function wasmGetSpanStartTime() {
131
+ return this.timestamp[0];
132
+ }
133
+ function wasmGetLastLoggedTime() {
134
+ const chain = [];
135
+ let current = this;
136
+ while (current) {
137
+ chain.push(current);
138
+ current = current._overflow;
139
+ }
140
+ for (let i = chain.length - 1; i >= 0; i--) {
141
+ const buffer = chain[i];
142
+ for (let row = buffer._writeIndex - 1; row >= 0; row--) {
143
+ const ts = buffer.timestamp[row];
144
+ if (ts !== 0n) {
145
+ return ts;
146
+ }
147
+ }
148
+ }
149
+ return null;
150
+ }
151
+ /**
152
+ * Get thread_id from WASM identity block.
153
+ */
154
+ function wasmGetThreadId() {
155
+ const high = this._allocator.getThreadIdHigh();
156
+ const low = this._allocator.getThreadIdLow();
157
+ return (BigInt(high) << 32n) | BigInt(low);
158
+ }
159
+ /**
160
+ * Get span_id from WASM identity block.
161
+ */
162
+ function wasmGetSpanId() {
163
+ return this._allocator.readIdentitySpanId(this._identityPtr);
164
+ }
165
+ /**
166
+ * Get parent_thread_id.
167
+ */
168
+ function wasmGetParentThreadId() {
169
+ return this._parent ? this._parent.thread_id : 0n;
170
+ }
171
+ /**
172
+ * Get parent_span_id.
173
+ */
174
+ function wasmGetParentSpanId() {
175
+ return this._parent ? this._parent.span_id : 0;
176
+ }
177
+ /**
178
+ * Check if buffer has parent.
179
+ */
180
+ function wasmGetHasParent() {
181
+ return this._parent !== null;
182
+ }
183
+ /**
184
+ * Message column setter.
185
+ */
186
+ function wasmMessage(idx, value) {
187
+ this._message[idx] = value;
188
+ return this;
189
+ }
190
+ /**
191
+ * Get message column values.
192
+ */
193
+ function wasmGetMessageValues() {
194
+ return this._message;
195
+ }
196
+ /**
197
+ * Get message column nulls (always undefined for eager column).
198
+ */
199
+ function wasmGetMessageNulls() {
200
+ return undefined;
201
+ }
202
+ /**
203
+ * Free all WASM memory for this buffer.
204
+ */
205
+ function wasmFree() {
206
+ // Free identity block
207
+ this._allocator.freeIdentity(this._identityPtr);
208
+ // Free system block
209
+ this._allocator.freeSpanSystem(this._systemPtr);
210
+ // Free column blocks
211
+ const columnMeta = buildColumnMeta(this._logSchema);
212
+ for (const col of columnMeta) {
213
+ if (col.sizeClass !== 'string' && this._columnPtrs[col.columnIndex] >= 0) {
214
+ const freeMethod = getFreeMethod(col.sizeClass);
215
+ this._allocator[freeMethod](this._columnPtrs[col.columnIndex]);
216
+ }
217
+ }
218
+ }
219
+ /**
220
+ * Check if column is allocated.
221
+ */
222
+ function wasmIsColumnAllocated(columnIndex) {
223
+ return this._columnPtrs[columnIndex] >= 0;
224
+ }
225
+ /**
226
+ * Get column values if allocated.
227
+ */
228
+ function wasmGetColumnIfAllocated(columnName) {
229
+ const idx = this._logSchema._columnNames.indexOf(columnName);
230
+ if (idx === -1)
231
+ return undefined;
232
+ const getter = Object.getOwnPropertyDescriptor(Object.getPrototypeOf(this), `${columnName}_values`);
233
+ if (getter?.get) {
234
+ const value = getter.get.call(this);
235
+ return isColumnValueType(value) ? value : undefined;
236
+ }
237
+ return undefined;
238
+ }
239
+ /**
240
+ * Get column nulls if allocated.
241
+ */
242
+ function wasmGetNullsIfAllocated(columnName) {
243
+ const getter = Object.getOwnPropertyDescriptor(Object.getPrototypeOf(this), `${columnName}_nulls`);
244
+ if (getter?.get) {
245
+ return getter.get.call(this);
246
+ }
247
+ return undefined;
248
+ }
249
+ /**
250
+ * Get system ArrayBuffer for compatibility with AnySpanBuffer.
251
+ * WASM uses shared memory, so this returns the entire WASM memory buffer.
252
+ */
253
+ function wasmGetSystem() {
254
+ return this._allocator.memory.buffer;
255
+ }
256
+ /**
257
+ * Get identity Uint8Array for compatibility with AnySpanBuffer.
258
+ * Returns a view of the identity block (48 bytes) in WASM memory.
259
+ */
260
+ function wasmGetIdentity() {
261
+ // Identity block is 48 bytes: writeIndex(4) + reserved(4) + span_id(4) + trace_id_len(1) + trace_id(up to 35)
262
+ return new Uint8Array(this._allocator.memory.buffer, this._identityPtr, 48);
263
+ }
264
+ /**
265
+ * Get or create overflow buffer.
266
+ */
267
+ function wasmGetOrCreateOverflow() {
268
+ if (this._overflow)
269
+ return this._overflow;
270
+ const tracer = this._traceRoot.tracer;
271
+ tracer.onStatsWillResetFor(this);
272
+ checkCapacityTuning(getWasmSpanBufferConstructor(this).stats);
273
+ // WasmSpanBufferInstance extends AnySpanBuffer and has all SpanBuffer properties at runtime
274
+ const overflow = tracer.bufferStrategy.createOverflowBuffer(this);
275
+ if (!isWasmSpanBufferInstance(overflow)) {
276
+ throw new Error('Expected overflow buffer to be WASM-backed');
277
+ }
278
+ return overflow;
279
+ }
280
+ /**
281
+ * Get _stats property.
282
+ */
283
+ function wasmGetStats() {
284
+ return getWasmSpanBufferConstructor(this).stats;
285
+ }
286
+ /**
287
+ * Get _columns property.
288
+ */
289
+ function wasmGetColumns() {
290
+ return getWasmSpanBufferConstructor(this).schema._columns;
291
+ }
292
+ /**
293
+ * Custom inspect for debugging.
294
+ */
295
+ function wasmInspect() {
296
+ return `WasmSpanBuffer { _writeIndex: ${this._writeIndex}, _capacity: ${this._capacity}, trace_id: ${this.trace_id ?? 'N/A'}, _systemPtr: ${this._systemPtr} }`;
297
+ }
298
+ // =============================================================================
299
+ // Code Generation Helpers
300
+ // =============================================================================
301
+ /**
302
+ * Generate eager column initialization code for constructor.
303
+ * Eager columns are pre-allocated, lazy columns start as undefined/-1.
304
+ */
305
+ function generateEagerColumnInit(columnMeta) {
306
+ const lines = [];
307
+ for (const col of columnMeta) {
308
+ if (col.name === 'message')
309
+ continue; // Message handled separately
310
+ if (col.sizeClass === 'string') {
311
+ if (col.isEager) {
312
+ lines.push(`this._${col.name}_values = new Array(this._capacity);`);
313
+ }
314
+ else {
315
+ lines.push(`this._${col.name}_values = undefined;`);
316
+ lines.push(`this._${col.name}_nulls = undefined;`);
317
+ }
318
+ }
319
+ else if (col.isEager) {
320
+ lines.push(`this._columnPtrs[${col.columnIndex}] = this._allocator.alloc${col.sizeClass.toUpperCase()}();`);
321
+ }
322
+ }
323
+ return lines.join('\n ');
324
+ }
325
+ /**
326
+ * Generate setter method for a numeric column (stored in WASM).
327
+ * Calls WASM exports directly for hot path optimization.
328
+ */
329
+ function generateNumericSetter(col) {
330
+ const allocMethod = `alloc${col.sizeClass.toUpperCase()}`;
331
+ // Map to WASM export names
332
+ const writeExportName = col.schemaType === 'number' || col.schemaType === 'bigUint64'
333
+ ? 'write_col_f64'
334
+ : col.sizeClass === '1b'
335
+ ? 'write_col_u8'
336
+ : col.sizeClass === '4b'
337
+ ? 'write_col_u32'
338
+ : 'write_col_f64';
339
+ if (col.isEager) {
340
+ // Eager: column is pre-allocated, just write value (call WASM export directly)
341
+ return `${col.name}(idx, value) {
342
+ const ptr = this._columnPtrs[${col.columnIndex}];
343
+ this._allocator.exports.${writeExportName}(ptr, idx, value, this._capacity);
344
+ return this;
345
+ }`;
346
+ }
347
+ // Lazy: allocate on first write (call WASM export directly)
348
+ return `${col.name}(idx, value) {
349
+ let ptr = this._columnPtrs[${col.columnIndex}];
350
+ if (ptr < 0) {
351
+ ptr = this._allocator.${allocMethod}();
352
+ this._columnPtrs[${col.columnIndex}] = ptr;
353
+ }
354
+ this._allocator.exports.${writeExportName}(ptr, idx, value, this._capacity);
355
+ return this;
356
+ }`;
357
+ }
358
+ /**
359
+ * Generate getter for numeric column values (creates view on demand).
360
+ */
361
+ function generateNumericValuesGetter(col) {
362
+ const arrayType = col.schemaType === 'number'
363
+ ? 'Float64Array'
364
+ : col.schemaType === 'bigUint64'
365
+ ? 'BigUint64Array'
366
+ : col.sizeClass === '1b'
367
+ ? 'Uint8Array'
368
+ : col.sizeClass === '4b'
369
+ ? 'Uint32Array'
370
+ : 'Float64Array';
371
+ const bytesPerElement = col.sizeClass === '1b' ? 1 : col.sizeClass === '4b' ? 4 : 8;
372
+ return `get ${col.name}_values() {
373
+ const ptr = this._columnPtrs[${col.columnIndex}];
374
+ if (ptr < 0) return ${col.isEager ? 'null' : 'undefined'};
375
+ const nullBitmapSize = Math.ceil(this._capacity / 8);
376
+ const valueOffset = ptr + nullBitmapSize;
377
+ // Align offset for typed array
378
+ const alignedOffset = (valueOffset + ${bytesPerElement - 1}) & ~${bytesPerElement - 1};
379
+ return new ${arrayType}(
380
+ this._allocator.memory.buffer,
381
+ alignedOffset,
382
+ this._capacity
383
+ );
384
+ }`;
385
+ }
386
+ /**
387
+ * Generate getter for numeric column nulls bitmap.
388
+ */
389
+ function generateNumericNullsGetter(col) {
390
+ if (col.isEager) {
391
+ // Eager columns don't have null bitmaps
392
+ return `get ${col.name}_nulls() {
393
+ return undefined;
394
+ }`;
395
+ }
396
+ return `get ${col.name}_nulls() {
397
+ const ptr = this._columnPtrs[${col.columnIndex}];
398
+ if (ptr < 0) return undefined;
399
+ const nullBitmapSize = Math.ceil(this._capacity / 8);
400
+ return new Uint8Array(
401
+ this._allocator.memory.buffer,
402
+ ptr,
403
+ nullBitmapSize
404
+ );
405
+ }`;
406
+ }
407
+ /**
408
+ * Generate setter method for a string column (stored in JS).
409
+ */
410
+ function generateStringSetter(col) {
411
+ if (col.isEager) {
412
+ return `${col.name}(idx, value) {
413
+ this._${col.name}_values[idx] = value;
414
+ return this;
415
+ }`;
416
+ }
417
+ // Lazy string column: allocate arrays on first write
418
+ return `${col.name}(idx, value) {
419
+ if (this._${col.name}_values === undefined) {
420
+ this._${col.name}_values = new Array(this._capacity);
421
+ const nullBitmapSize = Math.ceil(this._capacity / 8);
422
+ this._${col.name}_nulls = new Uint8Array(nullBitmapSize);
423
+ }
424
+ if (value == null) {
425
+ // Clear validity bit
426
+ this._${col.name}_nulls[idx >>> 3] &= ~(1 << (idx & 7));
427
+ } else {
428
+ this._${col.name}_values[idx] = value;
429
+ // Set validity bit
430
+ this._${col.name}_nulls[idx >>> 3] |= (1 << (idx & 7));
431
+ }
432
+ return this;
433
+ }`;
434
+ }
435
+ /**
436
+ * Generate getter for string column values.
437
+ */
438
+ function generateStringValuesGetter(col) {
439
+ if (col.isEager) {
440
+ return `get ${col.name}_values() {
441
+ return this._${col.name}_values;
442
+ }`;
443
+ }
444
+ return `get ${col.name}_values() {
445
+ return this._${col.name}_values;
446
+ }`;
447
+ }
448
+ /**
449
+ * Generate getter for string column nulls.
450
+ */
451
+ function generateStringNullsGetter(col) {
452
+ if (col.isEager) {
453
+ return `get ${col.name}_nulls() {
454
+ return undefined;
455
+ }`;
456
+ }
457
+ return `get ${col.name}_nulls() {
458
+ return this._${col.name}_nulls;
459
+ }`;
460
+ }
461
+ /**
462
+ * Generate column methods for all schema columns.
463
+ * Note: 'message' column is handled specially by generateMessageMethods() and excluded here.
464
+ */
465
+ function generateColumnMethods(columnMeta) {
466
+ const methods = [];
467
+ for (const col of columnMeta) {
468
+ // Skip 'message' - handled specially by generateMessageMethods()
469
+ if (col.name === 'message') {
470
+ continue;
471
+ }
472
+ if (col.sizeClass === 'string') {
473
+ methods.push(generateStringSetter(col));
474
+ methods.push(generateStringValuesGetter(col));
475
+ methods.push(generateStringNullsGetter(col));
476
+ }
477
+ else {
478
+ methods.push(generateNumericSetter(col));
479
+ methods.push(generateNumericValuesGetter(col));
480
+ methods.push(generateNumericNullsGetter(col));
481
+ }
482
+ }
483
+ return methods.join('\n\n ');
484
+ }
485
+ // =============================================================================
486
+ // Class Cache and Generation
487
+ // =============================================================================
488
+ /**
489
+ * Cache for generated WASM SpanBuffer classes.
490
+ * Key is the schema object reference (WeakMap for GC).
491
+ */
492
+ const wasmSpanBufferClassCache = new WeakMap();
493
+ /**
494
+ * Generate a WASM SpanBuffer class for the given schema.
495
+ *
496
+ * Generates minimal constructor + column methods, then assigns common methods to prototype.
497
+ *
498
+ * @param schema - LogSchema defining the buffer structure
499
+ * @returns WasmSpanBufferConstructor for creating buffer instances
500
+ */
501
+ export function getWasmSpanBufferClass(schema) {
502
+ const cached = wasmSpanBufferClassCache.get(schema);
503
+ if (cached) {
504
+ return cached;
505
+ }
506
+ // Pre-compute column metadata
507
+ const columnMeta = buildColumnMeta(schema);
508
+ // Generate ONLY schema-specific code (constructor + column methods)
509
+ const classCode = `
510
+ class WasmSpanBuffer {
511
+ constructor(opts) {
512
+ // Store allocator and capacity
513
+ this._allocator = opts.allocator;
514
+ this._capacity = opts.capacity;
515
+ this._logSchema = opts.logSchema;
516
+
517
+ // Allocate identity block from WASM (root has trace_id, child does not)
518
+ if (opts.trace_id) {
519
+ const traceIdBytes = new TextEncoder().encode(opts.trace_id);
520
+ const packed = opts.allocator.allocIdentityRootForJsWrite(traceIdBytes.length);
521
+ this._identityPtr = Number(packed >> 32n);
522
+ const traceIdOffset = Number(packed & 0xFFFFFFFFn);
523
+ new Uint8Array(opts.allocator.memory.buffer).set(traceIdBytes, traceIdOffset);
524
+ } else {
525
+ this._identityPtr = opts.allocator.allocIdentityChild();
526
+ }
527
+
528
+ // Allocate system block from WASM
529
+ this._systemPtr = opts.allocator.allocSpanSystem();
530
+
531
+ // Initialize column pointers as unallocated (-1)
532
+ this._columnPtrs = new Int32Array(${columnMeta.length}).fill(-1);
533
+
534
+ // Tree structure
535
+ this._parent = null;
536
+ this._children = [];
537
+ this._overflow = null;
538
+
539
+ // Assign context properties from opts
540
+ this._traceRoot = opts._traceRoot;
541
+ this._scopeValues = opts._scopeValues;
542
+ this._opMetadata = opts._opMetadata;
543
+ this._callsiteMetadata = opts._callsiteMetadata;
544
+
545
+ // Initialize message array
546
+ this._message = new Array(opts.capacity);
547
+
548
+ // Initialize eager columns
549
+ ${generateEagerColumnInit(columnMeta)}
550
+ }
551
+
552
+ // Schema-specific column methods (ONLY part that differs per schema)
553
+ ${generateColumnMethods(columnMeta)}
554
+ }
555
+
556
+ return WasmSpanBuffer;
557
+ `;
558
+ // Create the class using Function constructor
559
+ const factory = new Function(classCode);
560
+ if (!isWasmSpanBufferFactory(factory)) {
561
+ throw new Error('Expected WasmSpanBuffer factory function');
562
+ }
563
+ const WasmSpanBufferClass = factory();
564
+ // Assign common methods to prototype (shared by all schemas)
565
+ Object.defineProperty(WasmSpanBufferClass.prototype, 'timestamp', {
566
+ get: wasmGetTimestamp,
567
+ enumerable: true,
568
+ configurable: true,
569
+ });
570
+ Object.defineProperty(WasmSpanBufferClass.prototype, 'entry_type', {
571
+ get: wasmGetEntryType,
572
+ enumerable: true,
573
+ configurable: true,
574
+ });
575
+ Object.defineProperty(WasmSpanBufferClass.prototype, '_writeIndex', {
576
+ get: wasmGetWriteIndex,
577
+ set: wasmSetWriteIndex,
578
+ enumerable: true,
579
+ configurable: true,
580
+ });
581
+ Object.defineProperty(WasmSpanBufferClass.prototype, 'trace_id', {
582
+ get: wasmGetTraceId,
583
+ enumerable: true,
584
+ configurable: true,
585
+ });
586
+ Object.defineProperty(WasmSpanBufferClass.prototype, 'thread_id', {
587
+ get: wasmGetThreadId,
588
+ enumerable: true,
589
+ configurable: true,
590
+ });
591
+ Object.defineProperty(WasmSpanBufferClass.prototype, 'span_id', {
592
+ get: wasmGetSpanId,
593
+ enumerable: true,
594
+ configurable: true,
595
+ });
596
+ Object.defineProperty(WasmSpanBufferClass.prototype, 'parent_thread_id', {
597
+ get: wasmGetParentThreadId,
598
+ enumerable: true,
599
+ configurable: true,
600
+ });
601
+ Object.defineProperty(WasmSpanBufferClass.prototype, 'parent_span_id', {
602
+ get: wasmGetParentSpanId,
603
+ enumerable: true,
604
+ configurable: true,
605
+ });
606
+ Object.defineProperty(WasmSpanBufferClass.prototype, '_hasParent', {
607
+ get: wasmGetHasParent,
608
+ enumerable: true,
609
+ configurable: true,
610
+ });
611
+ Object.defineProperty(WasmSpanBufferClass.prototype, 'message_values', {
612
+ get: wasmGetMessageValues,
613
+ enumerable: true,
614
+ configurable: true,
615
+ });
616
+ Object.defineProperty(WasmSpanBufferClass.prototype, 'message_nulls', {
617
+ get: wasmGetMessageNulls,
618
+ enumerable: true,
619
+ configurable: true,
620
+ });
621
+ Object.defineProperty(WasmSpanBufferClass.prototype, '_stats', {
622
+ get: wasmGetStats,
623
+ enumerable: true,
624
+ configurable: true,
625
+ });
626
+ Object.defineProperty(WasmSpanBufferClass.prototype, '_columns', {
627
+ get: wasmGetColumns,
628
+ enumerable: true,
629
+ configurable: true,
630
+ });
631
+ Object.defineProperty(WasmSpanBufferClass.prototype, '_spanStartTime', {
632
+ get: wasmGetSpanStartTime,
633
+ enumerable: true,
634
+ configurable: true,
635
+ });
636
+ Object.defineProperty(WasmSpanBufferClass.prototype, '_lastLoggedTime', {
637
+ get: wasmGetLastLoggedTime,
638
+ enumerable: true,
639
+ configurable: true,
640
+ });
641
+ // Assign compatibility getters for AnySpanBuffer interface
642
+ Object.defineProperty(WasmSpanBufferClass.prototype, '_system', {
643
+ get: wasmGetSystem,
644
+ enumerable: true,
645
+ configurable: true,
646
+ });
647
+ Object.defineProperty(WasmSpanBufferClass.prototype, '_identity', {
648
+ get: wasmGetIdentity,
649
+ enumerable: true,
650
+ configurable: true,
651
+ });
652
+ WasmSpanBufferClass.prototype.message = wasmMessage;
653
+ WasmSpanBufferClass.prototype.free = wasmFree;
654
+ WasmSpanBufferClass.prototype.isColumnAllocated = wasmIsColumnAllocated;
655
+ WasmSpanBufferClass.prototype.getColumnIfAllocated = wasmGetColumnIfAllocated;
656
+ WasmSpanBufferClass.prototype.getNullsIfAllocated = wasmGetNullsIfAllocated;
657
+ WasmSpanBufferClass.prototype.getOrCreateOverflow = wasmGetOrCreateOverflow;
658
+ WasmSpanBufferClass.prototype[Symbol.for('nodejs.util.inspect.custom')] = wasmInspect;
659
+ // Add static schema property
660
+ Object.defineProperty(WasmSpanBufferClass, 'schema', {
661
+ value: schema,
662
+ writable: false,
663
+ enumerable: true,
664
+ configurable: false,
665
+ });
666
+ // Add static stats property (required by SpanContext and arrow-builder's ColumnWriter)
667
+ // This matches the structure in spanBuffer.ts
668
+ // IMPORTANT: stats object itself must be writable so totalWrites++ and spansCreated++ can modify it
669
+ const statsObject = {
670
+ capacity: 64, // Default capacity, will be overridden by allocator
671
+ totalWrites: 0,
672
+ spansCreated: 0,
673
+ };
674
+ Object.defineProperty(WasmSpanBufferClass, 'stats', {
675
+ value: statsObject,
676
+ writable: true,
677
+ enumerable: true,
678
+ configurable: true,
679
+ });
680
+ // Cache the class
681
+ wasmSpanBufferClassCache.set(schema, WasmSpanBufferClass);
682
+ return WasmSpanBufferClass;
683
+ }
684
+ // =============================================================================
685
+ // Factory Functions
686
+ // =============================================================================
687
+ /**
688
+ * Create a WASM SpanBuffer instance.
689
+ *
690
+ * @param schema - LogSchema defining the buffer structure
691
+ * @param opts - Options for buffer creation
692
+ * @param _traceRoot - Trace root context
693
+ * @param _scopeValues - Scope values for this span
694
+ * @param _opMetadata - Op metadata for attribution
695
+ * @param _callsiteMetadata - Callsite metadata for attribution
696
+ * @returns WasmSpanBufferInstance
697
+ */
698
+ export function createWasmSpanBuffer(schema, opts, _traceRoot, _scopeValues, _opMetadata, _callsiteMetadata) {
699
+ const WasmSpanBufferClass = getWasmSpanBufferClass(schema);
700
+ return new WasmSpanBufferClass({
701
+ ...opts,
702
+ logSchema: schema,
703
+ _traceRoot,
704
+ _scopeValues,
705
+ _opMetadata,
706
+ _callsiteMetadata,
707
+ });
708
+ }
709
+ /**
710
+ * Create a child WASM SpanBuffer linked to a parent.
711
+ *
712
+ * For cross-library calls, the child buffer may use a different schema than the parent.
713
+ * Pass the schema option to use a different schema.
714
+ *
715
+ * @param parent - Parent WASM SpanBuffer
716
+ * @param opts - Options for child buffer creation (schema is optional, defaults to parent's)
717
+ * @param _traceRoot - Trace root context
718
+ * @param _scopeValues - Scope values for this span
719
+ * @param _opMetadata - Op metadata for attribution
720
+ * @param _callsiteMetadata - Callsite metadata for attribution
721
+ * @returns WasmSpanBufferInstance linked to parent
722
+ */
723
+ export function createWasmChildSpanBuffer(parent, opts, _traceRoot, _scopeValues, _opMetadata, _callsiteMetadata) {
724
+ // Use provided schema (for cross-library calls) or parent's schema
725
+ const childSchema = opts.schema ?? parent._logSchema;
726
+ const WasmSpanBufferClass = getWasmSpanBufferClass(childSchema);
727
+ const child = new WasmSpanBufferClass({
728
+ ...opts,
729
+ logSchema: childSchema, // Use the child's schema (may differ from parent)
730
+ trace_id: parent.trace_id,
731
+ parent_thread_id: parent.thread_id,
732
+ parent_span_id: parent.span_id,
733
+ _traceRoot,
734
+ _scopeValues,
735
+ _opMetadata,
736
+ _callsiteMetadata,
737
+ });
738
+ // Link to parent (SpanContext will push to parent._children with possible RemappedBufferView wrapper)
739
+ child._parent = parent;
740
+ return child;
741
+ }
742
+ /**
743
+ * Create an overflow WASM SpanBuffer for chaining.
744
+ *
745
+ * @param buffer - The full buffer that needs overflow handling
746
+ * @param _traceRoot - Trace root context
747
+ * @param _scopeValues - Scope values for this span
748
+ * @param _opMetadata - Op metadata for attribution
749
+ * @param _callsiteMetadata - Callsite metadata for attribution
750
+ * @returns WasmSpanBufferInstance linked as overflow
751
+ */
752
+ export function createWasmOverflowBuffer(buffer, _traceRoot, _scopeValues, _opMetadata, _callsiteMetadata) {
753
+ const WasmSpanBufferClass = getWasmSpanBufferClass(buffer._logSchema);
754
+ const overflow = new WasmSpanBufferClass({
755
+ allocator: buffer._allocator,
756
+ capacity: buffer._capacity,
757
+ trace_id: buffer.trace_id,
758
+ thread_id: buffer.thread_id,
759
+ span_id: buffer.span_id,
760
+ parent_thread_id: buffer.parent_thread_id,
761
+ parent_span_id: buffer.parent_span_id,
762
+ logSchema: buffer._logSchema,
763
+ _traceRoot,
764
+ _scopeValues,
765
+ _opMetadata,
766
+ _callsiteMetadata,
767
+ });
768
+ // Link as overflow (not child - same logical span)
769
+ overflow._parent = buffer._parent;
770
+ buffer._overflow = overflow;
771
+ return overflow;
772
+ }