@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,571 @@
1
+ /**
2
+ * SpanBuffer - Unified memory layout for trace logging
3
+ *
4
+ * This module implements the unified SpanBuffer design from
5
+ * specs/lmao/01b_columnar_buffer_architecture.md "Unified SpanBuffer Memory Layout"
6
+ *
7
+ * **Memory Layout**
8
+ *
9
+ * Single `_system` ArrayBuffer contains:
10
+ * - timestamps (BigInt64Array) at offset 0
11
+ * - operations (Uint8Array) at offset capacity * 8
12
+ * - identity (Uint8Array) at offset capacity * 9 (for root/child, not chained)
13
+ *
14
+ * **Buffer Types**
15
+ * - ROOT: 13 + traceId.length bytes identity (threadId + spanId + len + traceId)
16
+ * - CHILD: 12 bytes identity (threadId + spanId only, parent via pointer)
17
+ * - CHAINED: 0 bytes identity (shares _identity reference from first buffer)
18
+ *
19
+ * **Key Design Decisions**
20
+ * - Parent ancestry via pointer (not copied bytes) - isParentOf is O(1)
21
+ * - traceId walks up parent chain to root
22
+ * - System columns at fixed offsets for all buffer types
23
+ * - arrow-builder used ONLY for lazy attribute columns (not system columns)
24
+ *
25
+ * @module spanBuffer
26
+ */
27
+
28
+ import { type ColumnBufferExtension, DEFAULT_BUFFER_CAPACITY, getColumnBufferClass } from '@smoothbricks/arrow-builder';
29
+ import { checkCapacityTuning } from './capacityTuning.js';
30
+ import type { OpMetadata } from './opContext/opTypes.js';
31
+ import type { LogSchema } from './schema/LogSchema.js';
32
+ import { textEncoder } from './spanBufferHelpers.js';
33
+ import type { SpanBufferStats } from './spanBufferStats.js';
34
+ import { writeThreadIdToUint64Array } from './threadId.js';
35
+ import type { ITraceRoot } from './traceRoot.js';
36
+ import type { AnySpanBuffer, SpanBuffer } from './types.js';
37
+
38
+ // Re-export ITraceRoot for external consumers (and to satisfy linter - it's used in generated code)
39
+ export type { ITraceRoot };
40
+
41
+ /**
42
+ * Empty frozen scope object - shared singleton to avoid allocations.
43
+ * Used as default _scopeValues for all buffers until setScope() is called.
44
+ */
45
+ export const EMPTY_SCOPE: Readonly<Record<string, unknown>> = Object.freeze({});
46
+
47
+ const traceIdDecoder = new TextDecoder();
48
+
49
+ // ============================================================================
50
+ // Thread-local state (generated once per process/worker)
51
+ // These are used by the generated class code via the constructorPreamble
52
+ // ============================================================================
53
+
54
+ /**
55
+ * Reset thread-local state (for testing only).
56
+ * Note: The actual state is in the generated class constructorPreamble.
57
+ * This function resets it by clearing the class cache.
58
+ * @internal
59
+ */
60
+ export function _resetSpanBufferState(): void {
61
+ // Clear the class cache to force regeneration with fresh state
62
+ // The generated constructorPreamble creates its own PROCESS_THREAD_ID and nextSpanId
63
+ // which are reset when the class is regenerated
64
+ // Note: WeakMap doesn't have a clear() method, but schemas are typically
65
+ // long-lived so this is mainly for testing where we create new schemas
66
+ }
67
+
68
+ /**
69
+ * Test utilities for accessing generated buffer properties
70
+ * Works directly with SpanBuffer type from this module
71
+ * @internal
72
+ */
73
+ export const SpanBufferTestUtils = {
74
+ /**
75
+ * Get a column's null bitmap (generated property)
76
+ */
77
+ getNullBitmap(buffer: AnySpanBuffer, columnName: string): Uint8Array | undefined {
78
+ return buffer.getNullsIfAllocated(columnName);
79
+ },
80
+
81
+ /**
82
+ * Set buffer capacity (for testing)
83
+ */
84
+ setCapacity(buffer: AnySpanBuffer, capacity: number): void {
85
+ // Cast to mutable for test manipulation
86
+ (buffer as { _capacity: number })._capacity = capacity;
87
+ },
88
+
89
+ /**
90
+ * Set buffer writeIndex (for testing)
91
+ */
92
+ setWriteIndex(buffer: AnySpanBuffer, writeIndex: number): void {
93
+ buffer._writeIndex = writeIndex;
94
+ },
95
+
96
+ /**
97
+ * Get buffer writeIndex (for testing)
98
+ * Accepts ColumnBuffer (from ColumnWriter._buffer) but casts to AnySpanBuffer
99
+ * since at runtime all buffers are AnySpanBuffer instances
100
+ */
101
+ getWriteIndex(buffer: AnySpanBuffer): number {
102
+ return buffer._writeIndex;
103
+ },
104
+ };
105
+
106
+ // ============================================================================
107
+ // SpanBuffer class generation
108
+ // ============================================================================
109
+
110
+ /**
111
+ * SpanBuffer constructor type - accepts all parameters for buffer creation.
112
+ * Exported for use in Op class and span context creation.
113
+ *
114
+ * The generated class has static properties:
115
+ * - schema: LogSchema - The schema used to generate this class
116
+ * - stats: SpanBufferStats - Shared mutable stats for all instances
117
+ *
118
+ * **Constructor cases:**
119
+ * - ROOT: traceRoot provided (freshly created), parent undefined
120
+ * - CHILD: traceRoot provided (from parent._traceRoot), parent provided, isChained=false
121
+ * - CHAINED: traceRoot provided (from parent._traceRoot), parent provided, isChained=true
122
+ *
123
+ * traceRoot is ALWAYS provided - factories extract it from parent when needed.
124
+ */
125
+ export interface SpanBufferConstructor<T extends LogSchema = LogSchema> {
126
+ new (
127
+ capacity: number,
128
+ stats: SpanBufferStats,
129
+ parent: AnySpanBuffer | undefined,
130
+ isChained: boolean,
131
+ callsiteMetadata: OpMetadata | undefined,
132
+ opMetadata: OpMetadata | undefined,
133
+ traceRoot: ITraceRoot,
134
+ ): SpanBuffer<T>;
135
+
136
+ // Static properties added after class generation
137
+ readonly schema: T;
138
+ readonly stats: SpanBufferStats;
139
+ }
140
+
141
+ type GeneratedSpanBufferClass<T extends LogSchema> = new (
142
+ capacity: number,
143
+ stats: SpanBufferStats,
144
+ parent: AnySpanBuffer | undefined,
145
+ isChained: boolean,
146
+ callsiteMetadata: OpMetadata | undefined,
147
+ opMetadata: OpMetadata | undefined,
148
+ traceRoot: ITraceRoot,
149
+ ) => SpanBuffer<T>;
150
+
151
+ function isGeneratedSpanBufferClass<T extends LogSchema>(
152
+ ctor: new (...args: never[]) => unknown,
153
+ ): ctor is GeneratedSpanBufferClass<T> {
154
+ const prototype = Reflect.get(ctor, 'prototype');
155
+ if (typeof prototype !== 'object' || prototype === null) {
156
+ return false;
157
+ }
158
+
159
+ return (
160
+ typeof Reflect.get(prototype, 'getOrCreateOverflow') === 'function' &&
161
+ typeof Reflect.get(prototype, 'isParentOf') === 'function' &&
162
+ typeof Reflect.get(prototype, 'isChildOf') === 'function'
163
+ );
164
+ }
165
+
166
+ function isSpanBufferConstructorForSchema<T extends LogSchema>(
167
+ ctor: unknown,
168
+ schema: T,
169
+ ): ctor is SpanBufferConstructor<T> {
170
+ return (
171
+ typeof ctor === 'function' &&
172
+ Reflect.get(ctor, 'schema') === schema &&
173
+ typeof Reflect.get(ctor, 'stats') === 'object'
174
+ );
175
+ }
176
+
177
+ function getSpanBufferConstructorForBuffer<T extends LogSchema>(buffer: SpanBuffer<T>): SpanBufferConstructor<T> {
178
+ const ctor = buffer.constructor;
179
+ if (!isSpanBufferConstructorForSchema(ctor, buffer._logSchema)) {
180
+ throw new TypeError('Buffer constructor does not match buffer schema');
181
+ }
182
+ return ctor;
183
+ }
184
+
185
+ function createSpanBufferConstructor<T extends LogSchema>(
186
+ schema: T,
187
+ generatedClass: GeneratedSpanBufferClass<T>,
188
+ ): SpanBufferConstructor<T> {
189
+ return Object.assign(generatedClass, {
190
+ schema,
191
+ stats: {
192
+ capacity: DEFAULT_BUFFER_CAPACITY,
193
+ totalWrites: 0,
194
+ spansCreated: 0,
195
+ } satisfies SpanBufferStats,
196
+ });
197
+ }
198
+
199
+ /**
200
+ * Cache for generated SpanBuffer classes per schema.
201
+ * Key is the schema object reference (WeakMap for GC).
202
+ */
203
+ const spanBufferClassCache = new WeakMap<LogSchema, SpanBufferConstructor>();
204
+
205
+ /**
206
+ * Get or create a SpanBuffer class for the given schema.
207
+ *
208
+ * The generated class has static `schema` and `stats` properties:
209
+ * - `schema`: The LogSchema used to generate this class
210
+ * - `stats`: Shared SpanBufferStats for all instances from same defineOpContext
211
+ *
212
+ * Classes are cached per schema (WeakMap keyed by schema object).
213
+ *
214
+ * @param schema - LogSchema defining the buffer structure
215
+ * @returns SpanBufferConstructor with static schema and stats properties
216
+ */
217
+ export function getSpanBufferClass<T extends LogSchema>(schema: T): SpanBufferConstructor<T> {
218
+ const cached = spanBufferClassCache.get(schema);
219
+ if (isSpanBufferConstructorForSchema(cached, schema)) {
220
+ return cached;
221
+ }
222
+
223
+ // ==========================================================================
224
+ // GENERATED CODE EXTENSION
225
+ // ==========================================================================
226
+ // The constructorPreamble and methods strings below are passed to new Function() by
227
+ // arrow-builder's columnBufferGenerator. They MUST be pure JavaScript:
228
+ // - NO TypeScript type annotations (: Type)
229
+ // - NO non-null assertions (!)
230
+ // - NO comments (waste of runtime parsing)
231
+ //
232
+ // V8 IN-OBJECT PROPERTY OPTIMIZATION:
233
+ // Property assignment order determines which properties get fast in-object slots.
234
+ // First ~10-12 properties are stored directly on the object (fastest access).
235
+ // Remaining properties go to backing store (extra indirection).
236
+ // Therefore: ASSIGN HOTTEST PROPERTIES FIRST!
237
+ //
238
+ // Hot path analysis (from buffer performance profiling):
239
+ // 1. _writeIndex - incremented on EVERY write
240
+ // 2. _capacity - compared on EVERY write (overflow check)
241
+ // 3. _overflow - checked when overflow occurs
242
+ // 4. timestamp/entry_type - TypedArray refs accessed on EVERY write
243
+ // 5. _children/_parent - modified/accessed during span creation
244
+ // 6. _traceRoot - accessed for timestamp anchors on EVERY write
245
+ // 7. _identity/_logBinding - accessed during span operations
246
+ // 8-N. Cold properties - only accessed during Arrow conversion
247
+ // ==========================================================================
248
+
249
+ // Define extension for arrow-builder's class generator
250
+ const extension: ColumnBufferExtension = {
251
+ constructorParams: 'stats, parent, isChained, callsiteMetadata, opMetadata, traceRoot',
252
+ dependencies: {
253
+ writeThreadIdToUint64Array,
254
+ textDecoder: traceIdDecoder,
255
+ textEncoder,
256
+ EMPTY_SCOPE,
257
+ checkCapacityTuning,
258
+ },
259
+ // ==========================================================================
260
+ // GENERATED CONSTRUCTOR PREAMBLE
261
+ // ==========================================================================
262
+ // The constructorPreamble below is passed to new Function() by arrow-builder's
263
+ // columnBufferGenerator. It MUST be pure JavaScript:
264
+ // - NO TypeScript type annotations (: Type)
265
+ // - NO non-null assertions (!)
266
+ // - NO comments (waste of runtime parsing)
267
+ //
268
+ // BUFFER TYPES (determined by constructor arguments):
269
+ // - ROOT: traceRoot provided, parent undefined
270
+ // → Creates identity with traceId: [threadId(8)][spanId(4)][traceIdLen(1)][traceId(N)]
271
+ // - CHILD: traceRoot undefined (uses parent._traceRoot), parent provided, isChained=false
272
+ // → Creates identity without traceId: [threadId(8)][spanId(4)]
273
+ // - CHAINED: traceRoot undefined (uses parent._traceRoot), parent provided, isChained=true
274
+ // → Shares parent._identity (no new identity allocation)
275
+ //
276
+ // MEMORY LAYOUT:
277
+ // - systemBuffer: timestamps (8 bytes * cap) + entry_type (1 byte * cap) + identity
278
+ // - System size aligned to 8 bytes so identity's BigUint64Array offset is aligned
279
+ // - Identity layout: [threadId(8)][spanId(4)][traceIdLen(1)?][traceId(N)?]
280
+ //
281
+ // V8 IN-OBJECT PROPERTY OPTIMIZATION:
282
+ // Property assignment order determines which properties get fast in-object slots.
283
+ // First ~10-12 properties are stored directly on the object (fastest access).
284
+ // Slots 1-3: HOTTEST (every log entry) - _writeIndex, _capacity, _overflow
285
+ // Slots 4-5: HOT (TypedArray refs) - timestamp, entry_type
286
+ // Slots 6-7: WARM (tree structure) - _children, _parent
287
+ // Slots 8-10: WARM (context) - _traceRoot, _scopeValues, _identity
288
+ // Slots 11: WARM (system) - _system
289
+ // Slots 12+: COLD (Arrow conversion only) - _callsiteMetadata, _opMetadata
290
+ // ==========================================================================
291
+ constructorPreamble:
292
+ // Thread-local span counter (per-process/worker, see threadId.ts docs)
293
+ `if (typeof globalThis.globalSpanCounter === 'undefined') {
294
+ globalThis.globalSpanCounter = 0;
295
+ }
296
+ const spanId = ++globalThis.globalSpanCounter;
297
+ ` +
298
+ // Calculate system buffer size: timestamps (8 bytes * cap) + entry_type (1 byte * cap)
299
+ // Align to 8 bytes so identity's BigUint64Array offset is aligned
300
+ `const rawSystemSize = requestedCapacity * 9;
301
+ const systemSize = (rawSystemSize + 7) & ~7;
302
+ let systemBuffer;
303
+ let identityView;
304
+ ` +
305
+ // CHAINED BUFFER: overflow storage for same logical span - shares parent identity
306
+ `if (isChained) {
307
+ systemBuffer = new ArrayBuffer(systemSize);
308
+ identityView = parent._identity;
309
+ }` +
310
+ // CHILD BUFFER: new span in existing trace - gets identity without traceId
311
+ // (traceId accessed via parent chain walk in trace_id getter)
312
+ ` else if (parent) {
313
+ const identitySize = 12;
314
+ systemBuffer = new ArrayBuffer(systemSize + identitySize);
315
+ identityView = new Uint8Array(systemBuffer, systemSize, identitySize);
316
+ const threadIdArray = new BigUint64Array(systemBuffer, systemSize, 1);
317
+ writeThreadIdToUint64Array(threadIdArray, 0);
318
+ new DataView(systemBuffer, systemSize).setUint32(8, spanId, true);
319
+ }` +
320
+ // ROOT BUFFER: new trace - gets identity with traceId from TraceRoot
321
+ ` else {
322
+ const traceIdUtf8 = textEncoder.encode(traceRoot.trace_id);
323
+ const identitySize = 13 + traceIdUtf8.length;
324
+ systemBuffer = new ArrayBuffer(systemSize + identitySize);
325
+ identityView = new Uint8Array(systemBuffer, systemSize, identitySize);
326
+ const view = new DataView(systemBuffer, systemSize);
327
+ const threadIdArray = new BigUint64Array(systemBuffer, systemSize, 1);
328
+ writeThreadIdToUint64Array(threadIdArray, 0);
329
+ view.setUint32(8, spanId, true);
330
+ identityView[12] = traceIdUtf8.length;
331
+ identityView.set(traceIdUtf8, 13);
332
+ }
333
+ ` +
334
+ // Create TypedArray views for timestamps and entry_type
335
+ `const timestampView = new BigInt64Array(systemBuffer, 0, requestedCapacity);
336
+ const entryTypeView = new Uint8Array(systemBuffer, requestedCapacity * 8, requestedCapacity);
337
+ timestampView.fill(0n);
338
+ entryTypeView.fill(0);
339
+ ` +
340
+ // Assign properties in optimal order for V8 in-object slots (see comment above)
341
+ `this._writeIndex = 0;
342
+ this._capacity = requestedCapacity;
343
+ this._overflow = undefined;
344
+ this.timestamp = timestampView;
345
+ this.entry_type = entryTypeView;
346
+ this._children = [];
347
+ this._parent = isChained ? parent._parent : parent;
348
+ this._traceRoot = traceRoot;
349
+ this._scopeValues = parent ? parent._scopeValues : EMPTY_SCOPE;
350
+ this._identity = identityView;
351
+ this._system = systemBuffer;
352
+ this._callsiteMetadata = callsiteMetadata;
353
+ this._opMetadata = opMetadata;
354
+ `,
355
+ // Generated methods for SpanBuffer - no comments in output
356
+ // span_id: extract from identity bytes [8:12]
357
+ // thread_id: extract from identity bytes [0:8]
358
+ // trace_id: walk up parent chain to root, decode trace_id from identity
359
+ // parent_span_id/parent_thread_id: delegate to parent
360
+ // isParentOf/isChildOf: pointer comparison
361
+ // copyThreadIdTo/copyParentThreadIdTo: copy thread_id bytes to destination
362
+ methods: `get span_id() {
363
+ return this._identity ? new DataView(this._identity.buffer, this._identity.byteOffset + 8).getUint32(0, true) : 0;
364
+ }
365
+ get thread_id() {
366
+ return this._identity ? new DataView(this._identity.buffer, this._identity.byteOffset).getBigUint64(0, true) : 0n;
367
+ }
368
+ get trace_id() {
369
+ let current = this;
370
+ while (current._parent) { current = current._parent; }
371
+ if (!current._identity) { return undefined; }
372
+ const len = current._identity[12];
373
+ const traceIdBytes = current._identity.subarray(13, 13 + len);
374
+ return textDecoder.decode(traceIdBytes);
375
+ }
376
+ get _spanStartTime() {
377
+ return this.timestamp[0];
378
+ }
379
+ get _lastLoggedTime() {
380
+ const chain = [];
381
+ let current = this;
382
+ while (current) {
383
+ chain.push(current);
384
+ current = current._overflow;
385
+ }
386
+ for (let i = chain.length - 1; i >= 0; i--) {
387
+ const buffer = chain[i];
388
+ for (let row = buffer._writeIndex - 1; row >= 0; row--) {
389
+ const ts = buffer.timestamp[row];
390
+ if (ts !== 0n) {
391
+ return ts;
392
+ }
393
+ }
394
+ }
395
+ return null;
396
+ }
397
+ get _hasParent() { return this._parent !== undefined; }
398
+ get parent_span_id() { return this._parent?.span_id ?? 0; }
399
+ get parent_thread_id() { return this._parent?.thread_id ?? 0n; }
400
+ isParentOf(other) { return this === other._parent; }
401
+ isChildOf(other) { return this._parent === other; }
402
+ copyThreadIdTo(dest, offset) {
403
+ if (this._identity) {
404
+ const view = new DataView(this._identity.buffer, this._identity.byteOffset);
405
+ const threadId = view.getBigUint64(0, true);
406
+ new DataView(dest.buffer, dest.byteOffset + offset).setBigUint64(0, threadId, true);
407
+ } else {
408
+ new DataView(dest.buffer, dest.byteOffset + offset).setBigUint64(0, 0n, true);
409
+ }
410
+ }
411
+ copyParentThreadIdTo(dest, offset) {
412
+ this._parent?.copyThreadIdTo(dest, offset) ?? new DataView(dest.buffer, dest.byteOffset + offset).setBigUint64(0, 0n, true);
413
+ }
414
+ get _logSchema() { return this.constructor.schema; }
415
+ get _columns() { return this.constructor.schema._columns; }
416
+ get _stats() { return this.constructor.stats; }
417
+ getOrCreateOverflow() {
418
+ if (this._overflow) return this._overflow;
419
+ const tracer = this._traceRoot.tracer;
420
+ tracer.onStatsWillResetFor(this);
421
+ checkCapacityTuning(this.constructor.stats);
422
+ return tracer.bufferStrategy.createOverflowBuffer(this);
423
+ }
424
+ `,
425
+ };
426
+
427
+ // Generate class with arrow-builder
428
+ const generatedClass = getColumnBufferClass(schema, extension);
429
+ if (!isGeneratedSpanBufferClass<T>(generatedClass)) {
430
+ throw new TypeError('Generated column buffer is missing SpanBuffer methods');
431
+ }
432
+
433
+ // Add static properties to the generated class
434
+ // These are shared across all instances from the same defineOpContext
435
+ const SpanBufferClass = createSpanBufferConstructor(schema, generatedClass);
436
+
437
+ // Cache for future use
438
+ spanBufferClassCache.set(schema, SpanBufferClass);
439
+
440
+ return SpanBufferClass;
441
+ }
442
+
443
+ // ============================================================================
444
+ // SpanBuffer factory functions
445
+ // ============================================================================
446
+
447
+ /**
448
+ * Creates a root SpanBuffer for a new trace.
449
+ *
450
+ * Root buffers have identity: [threadId(8)][spanId(4)][traceIdLen(1)][traceId(N)]
451
+ *
452
+ * @param schema - Tag attribute schema defining column types (must be LogSchema)
453
+ * @param traceRoot - Pre-built ITraceRoot with trace_id, anchors, and tracer
454
+ * @param opMetadata - Op metadata for attribution (package_name, package_file, git_sha, line)
455
+ * @param capacity - Buffer capacity (optional, uses class.stats.capacity if omitted)
456
+ *
457
+ * @returns SpanBuffer with typed setters for schema fields
458
+ */
459
+ const MIN_CAPACITY = 8;
460
+
461
+ export function createSpanBuffer<T extends LogSchema>(
462
+ schema: T,
463
+ traceRoot: ITraceRoot,
464
+ opMetadata: OpMetadata,
465
+ capacity?: number,
466
+ ): SpanBuffer<T> {
467
+ const SpanBufferClass = getSpanBufferClass(schema);
468
+ const stats = SpanBufferClass.stats;
469
+
470
+ // Use provided capacity or default from class stats, enforce minimum
471
+ const actualCapacity = Math.max(MIN_CAPACITY, capacity ?? stats.capacity);
472
+
473
+ // Track non-chained buffer creation for capacity tuning
474
+ stats.spansCreated++;
475
+
476
+ // Create root buffer (no parent)
477
+ // Root spans use same metadata for both callsite and op (no distinction at root)
478
+ return new SpanBufferClass(
479
+ actualCapacity,
480
+ stats,
481
+ undefined, // no parent
482
+ false, // not chained
483
+ opMetadata, // callsiteMetadata for row 0
484
+ opMetadata, // opMetadata for rows 1+ (same as callsite for root)
485
+ traceRoot, // pre-built TraceRoot with trace_id, anchors, tracer
486
+ );
487
+ }
488
+
489
+ /**
490
+ * Creates a continuation buffer when the current buffer overflows.
491
+ *
492
+ * Chained buffers SHARE the identity reference from the first buffer
493
+ * (they represent the SAME logical span, just additional storage).
494
+ *
495
+ * @param buffer - The full buffer that needs overflow handling
496
+ *
497
+ * @returns New SpanBuffer linked via `buffer._overflow`, with same schema type
498
+ */
499
+ export function createOverflowBuffer<T extends LogSchema>(buffer: SpanBuffer<T>): SpanBuffer<T> {
500
+ const SpanBufferClass = getSpanBufferConstructorForBuffer(buffer);
501
+ const stats = SpanBufferClass.stats;
502
+
503
+ // Ensure capacity is multiple of 8 for byte-aligned null bitmaps
504
+ const capacity = (stats.capacity + 7) & ~7;
505
+
506
+ // Chained buffers inherit callsiteMetadata and opMetadata from the original buffer
507
+ // Pass buffer as parent - used for identity sharing; _parent set to buffer._parent in constructor
508
+ const nextBuffer = new SpanBufferClass(
509
+ capacity,
510
+ stats,
511
+ buffer, // Used for identity sharing, _parent set to buffer._parent in constructor
512
+ true, // isChained
513
+ buffer._callsiteMetadata,
514
+ buffer._opMetadata,
515
+ buffer._traceRoot, // traceRoot from parent
516
+ );
517
+
518
+ // Link current buffer to next
519
+ buffer._overflow = nextBuffer;
520
+
521
+ return nextBuffer;
522
+ }
523
+
524
+ /**
525
+ * Creates a child span buffer with parent linkage.
526
+ *
527
+ * Child buffers have their own identity but reference their parent
528
+ * for trace hierarchy and scope inheritance.
529
+ *
530
+ * Note: Caller must call writeSpanStart() after this to set span name in message_values[0].
531
+ *
532
+ * @param parentBuffer - The parent span buffer
533
+ * @param SpanBufferClass - The SpanBuffer class to instantiate (has static schema + stats)
534
+ * @param callsiteMetadata - Caller's op metadata (for row 0 attribution)
535
+ * @param opMetadata - Op metadata for this span (for rows 1+ attribution)
536
+ * @param capacity - Optional capacity override (uses class.stats.capacity if omitted)
537
+ *
538
+ * @returns New SpanBuffer linked to parent
539
+ */
540
+ export function createChildSpanBuffer<T extends LogSchema>(
541
+ parentBuffer: AnySpanBuffer,
542
+ SpanBufferClass: SpanBufferConstructor<T>,
543
+ callsiteMetadata: OpMetadata,
544
+ opMetadata: OpMetadata,
545
+ capacity?: number,
546
+ ): SpanBuffer<T> {
547
+ const stats = SpanBufferClass.stats;
548
+ const actualCapacity = capacity ?? stats.capacity;
549
+
550
+ // Track non-chained buffer creation for capacity tuning
551
+ stats.spansCreated++;
552
+
553
+ // Create child buffer with parent reference
554
+ const childBuffer = new SpanBufferClass(
555
+ actualCapacity,
556
+ stats,
557
+ parentBuffer, // parent
558
+ false, // not chained
559
+ callsiteMetadata, // callsiteMetadata - CALLER's op metadata (for row 0)
560
+ opMetadata, // opMetadata - EXECUTING op metadata (for rows 1+)
561
+ parentBuffer._traceRoot, // traceRoot from parent
562
+ );
563
+
564
+ return childBuffer;
565
+ }
566
+
567
+ // ============================================================================
568
+ // Constants for Arrow conversion
569
+ // ============================================================================
570
+
571
+ export const THREAD_ID_BYTES = 8;
@@ -0,0 +1,73 @@
1
+ /**
2
+ * Helper utilities for generated SpanBuffer classes.
3
+ *
4
+ * These are injected into generated code via the `dependencies` mechanism
5
+ * to avoid regenerating identical code for every schema.
6
+ *
7
+ * Note: Generic null bitmap helpers (setNullBit, fillNullBitmapRange) are in
8
+ * @smoothbricks/arrow-builder's bufferHelpers - they're Arrow concepts, not span-specific.
9
+ */
10
+
11
+ import { copyThreadIdTo } from './threadId.js';
12
+
13
+ /**
14
+ * Shared TextEncoder instance for traceId encoding.
15
+ * TextEncoder is stateless and thread-safe, so one instance suffices.
16
+ */
17
+ export const textEncoder = new TextEncoder();
18
+
19
+ /**
20
+ * Write spanId bytes (4 bytes, little-endian) to identity buffer.
21
+ *
22
+ * @param identity - Target Uint8Array (identity bytes)
23
+ * @param offset - Byte offset to write at
24
+ * @param spanId - 32-bit span ID
25
+ */
26
+ export function writeSpanId(identity: Uint8Array, offset: number, span_id: number): void {
27
+ identity[offset] = span_id & 0xff;
28
+ identity[offset + 1] = (span_id >> 8) & 0xff;
29
+ identity[offset + 2] = (span_id >> 16) & 0xff;
30
+ identity[offset + 3] = (span_id >> 24) & 0xff;
31
+ }
32
+
33
+ /**
34
+ * Read spanId bytes (4 bytes, little-endian) from identity buffer.
35
+ *
36
+ * @param identity - Source Uint8Array (identity bytes)
37
+ * @param offset - Byte offset to read from
38
+ * @returns 32-bit span ID
39
+ */
40
+ export function readSpanId(identity: Uint8Array, offset: number): number {
41
+ return identity[offset] | (identity[offset + 1] << 8) | (identity[offset + 2] << 16) | (identity[offset + 3] << 24);
42
+ }
43
+
44
+ /**
45
+ * Decode traceId string from identity buffer (root spans only).
46
+ *
47
+ * Format: [length byte][traceId bytes...]
48
+ *
49
+ * @param identity - Source Uint8Array (identity bytes)
50
+ * @param offset - Byte offset where length byte starts
51
+ * @returns Decoded traceId string
52
+ */
53
+ export function decodeTraceId(identity: Uint8Array, offset: number): string {
54
+ const len = identity[offset];
55
+ let str = '';
56
+ for (let i = 0; i < len; i++) {
57
+ str += String.fromCharCode(identity[offset + 1 + i]);
58
+ }
59
+ return str;
60
+ }
61
+
62
+ /**
63
+ * Helpers object to inject into generated SpanBuffer code.
64
+ */
65
+ export const spanBufferHelpers = {
66
+ textEncoder,
67
+ writeSpanId,
68
+ readSpanId,
69
+ decodeTraceId,
70
+ copyThreadIdTo,
71
+ } as const;
72
+
73
+ export type SpanBufferHelpers = typeof spanBufferHelpers;
@@ -0,0 +1,40 @@
1
+ /**
2
+ * SpanBufferStats - Self-tuning buffer statistics
3
+ *
4
+ * Mutable stats shared across all SpanBuffer instances from the same defineOpContext.
5
+ * Stored as a static property on the generated SpanBuffer class for optimal memory usage.
6
+ *
7
+ * Per specs/lmao/01b2_buffer_self_tuning.md:
8
+ * - Track row utilization = totalWrites / (spansCreated * usableRowsPerSpan)
9
+ * - Capacity grows when utilization > 150% (regularly overflowing)
10
+ * - Capacity shrinks when utilization < 50% with enough spans (wasting space)
11
+ * - Stats reset after each adjustment to measure new capacity effectiveness
12
+ *
13
+ * ## Key Architectural Decision
14
+ *
15
+ * Stats are NO LONGER on LogBinding. They are static properties on the generated
16
+ * SpanBuffer class. This reduces per-instance memory (schema stored once per class,
17
+ * stats shared across all instances from same defineOpContext).
18
+ *
19
+ * **Property names have NO `sb_` prefix** (clean names for new architecture).
20
+ * The `sb_` prefix was only needed when these were on LogBinding to avoid conflicts.
21
+ *
22
+ * @module spanBufferStats
23
+ */
24
+
25
+ /**
26
+ * SpanBufferStats interface - mutable self-tuning statistics
27
+ *
28
+ * Created once per `defineOpContext`, stored as static property on generated
29
+ * SpanBuffer class. All buffers from same context share these stats.
30
+ */
31
+ export interface SpanBufferStats {
32
+ /** Current buffer capacity for new buffers (grows/shrinks based on utilization) */
33
+ capacity: number;
34
+
35
+ /** Total entries written across all buffers */
36
+ totalWrites: number;
37
+
38
+ /** Number of non-chained spans created (root + child spans, NOT overflow buffers) */
39
+ spansCreated: number;
40
+ }