@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,114 @@
1
+ import { batchType, bool, Column, type DataType, type dictionary, type IntType, type utf8 } from '@uwdata/flechette';
2
+
3
+ const EMPTY_VALIDITY = new Uint8Array(0);
4
+ const BOOL_TYPE_ID = bool().typeId;
5
+
6
+ export type ArrowIndexArray = Uint8Array | Uint16Array | Uint32Array;
7
+ export type ArrowIndexArrayConstructor = Uint8ArrayConstructor | Uint16ArrayConstructor | Uint32ArrayConstructor;
8
+ export type BoolType = ReturnType<typeof bool>;
9
+ export type DictionaryType = ReturnType<typeof dictionary>;
10
+ export type Utf8Type = ReturnType<typeof utf8>;
11
+
12
+ type ColumnDataBase<TType, TValues = unknown> = {
13
+ type: TType;
14
+ length: number;
15
+ nullCount: number;
16
+ values?: TValues;
17
+ validity?: Uint8Array;
18
+ };
19
+
20
+ export type DictionaryColumnData<TValues = unknown> = ColumnDataBase<DictionaryType, TValues> & {
21
+ dictionary: Column<unknown>;
22
+ };
23
+ export type Utf8ColumnData = ColumnDataBase<Utf8Type, Uint8Array> & { offsets: Int32Array };
24
+ export type BoolColumnData = ColumnDataBase<BoolType, Uint8Array>;
25
+ export type GenericColumnData<TType extends DataType = DataType, TValues = unknown> = ColumnDataBase<TType, TValues>;
26
+
27
+ export function hasTypeId(value: unknown): value is { readonly typeId: unknown } {
28
+ return typeof value === 'object' && value !== null && 'typeId' in value;
29
+ }
30
+
31
+ export function isBoolType(value: unknown): value is BoolType {
32
+ return hasTypeId(value) && value.typeId === BOOL_TYPE_ID;
33
+ }
34
+
35
+ function isArrowIndexArrayConstructor(value: unknown): value is ArrowIndexArrayConstructor {
36
+ return value === Uint8Array || value === Uint16Array || value === Uint32Array;
37
+ }
38
+
39
+ export function hasArrowIndexType(value: unknown): value is { readonly __arrow_index_type: IntType } {
40
+ return typeof value === 'object' && value !== null && '__arrow_index_type' in value;
41
+ }
42
+
43
+ export function hasArrowIndexMetadata(
44
+ value: unknown,
45
+ ): value is { readonly __arrow_index_type: IntType; readonly __index_array_ctor: ArrowIndexArrayConstructor } {
46
+ return (
47
+ hasArrowIndexType(value) && '__index_array_ctor' in value && isArrowIndexArrayConstructor(value.__index_array_ctor)
48
+ );
49
+ }
50
+
51
+ export function getArrowIndexTypeOr(value: unknown, fallback: IntType): IntType {
52
+ return hasArrowIndexType(value) ? value.__arrow_index_type : fallback;
53
+ }
54
+
55
+ export function getArrowIndexArrayConstructorOr(
56
+ value: unknown,
57
+ fallback: ArrowIndexArrayConstructor = Uint8Array,
58
+ ): ArrowIndexArrayConstructor {
59
+ return hasArrowIndexMetadata(value) ? value.__index_array_ctor : fallback;
60
+ }
61
+
62
+ export function makeArrowColumn(data: DictionaryColumnData): Column<unknown>;
63
+ export function makeArrowColumn(data: Utf8ColumnData): Column<unknown>;
64
+ export function makeArrowColumn(data: BoolColumnData): Column<unknown>;
65
+ export function makeArrowColumn(data: GenericColumnData): Column<unknown>;
66
+ export function makeArrowColumn(
67
+ data: DictionaryColumnData | Utf8ColumnData | BoolColumnData | GenericColumnData,
68
+ ): Column<unknown> {
69
+ const validity = data.validity ?? EMPTY_VALIDITY;
70
+
71
+ if ('dictionary' in data) {
72
+ const batch = new (batchType(data.type))({
73
+ type: data.type,
74
+ length: data.length,
75
+ nullCount: data.nullCount,
76
+ validity,
77
+ values: data.values,
78
+ });
79
+ batch.setDictionary(data.dictionary);
80
+ return new Column([batch]);
81
+ }
82
+
83
+ if ('offsets' in data) {
84
+ const batch = new (batchType(data.type))({
85
+ type: data.type,
86
+ length: data.length,
87
+ nullCount: data.nullCount,
88
+ validity,
89
+ offsets: data.offsets,
90
+ values: data.values,
91
+ });
92
+ return new Column([batch]);
93
+ }
94
+
95
+ if (isBoolType(data.type)) {
96
+ const batch = new (batchType(data.type))({
97
+ type: data.type,
98
+ length: data.length,
99
+ nullCount: data.nullCount,
100
+ validity,
101
+ values: data.values,
102
+ });
103
+ return new Column([batch]);
104
+ }
105
+
106
+ const batch = new (batchType(data.type))({
107
+ type: data.type,
108
+ length: data.length,
109
+ nullCount: data.nullCount,
110
+ validity,
111
+ values: data.values,
112
+ });
113
+ return new Column([batch]);
114
+ }
@@ -0,0 +1,126 @@
1
+ /**
2
+ * Utility functions for Arrow conversion
3
+ */
4
+
5
+ import { copyBits, countNulls } from '@smoothbricks/arrow-builder';
6
+ import type { AnySpanBuffer } from '../types.js';
7
+
8
+ const UTF8_ENCODER = new TextEncoder();
9
+
10
+ type ConcatenatedNullBitmaps = { nullBitmap: Uint8Array | undefined; nullCount: number };
11
+
12
+ /**
13
+ * Encode an array of strings into a single UTF-8 Uint8Array
14
+ */
15
+ export function encodeUtf8Strings(strings: readonly string[]): Uint8Array {
16
+ const encoded = strings.map((s) => UTF8_ENCODER.encode(s));
17
+ const totalLength = encoded.reduce((sum, arr) => sum + arr.length, 0);
18
+ const result = new Uint8Array(totalLength);
19
+ let offset = 0;
20
+ for (const arr of encoded) {
21
+ result.set(arr, offset);
22
+ offset += arr.length;
23
+ }
24
+ return result;
25
+ }
26
+
27
+ /**
28
+ * Calculate UTF-8 byte offsets for an array of strings
29
+ */
30
+ export function calculateUtf8Offsets(strings: readonly string[]): Int32Array {
31
+ const offsets = new Int32Array(strings.length + 1);
32
+ offsets[0] = 0;
33
+ for (let i = 0; i < strings.length; i++) {
34
+ const byteLength = UTF8_ENCODER.encode(strings[i]).length;
35
+ offsets[i + 1] = offsets[i] + byteLength;
36
+ }
37
+ return offsets;
38
+ }
39
+
40
+ /**
41
+ * Concatenate Uint8 arrays without type casting.
42
+ */
43
+ export function concatenateUint8Arrays(arrays: Uint8Array[]): Uint8Array {
44
+ if (arrays.length === 0) throw new Error('Cannot concatenate empty array list');
45
+ if (arrays.length === 1) return arrays[0];
46
+ const totalLength = arrays.reduce((sum, arr) => sum + arr.length, 0);
47
+ const result = new Uint8Array(totalLength);
48
+ let offset = 0;
49
+ for (const arr of arrays) {
50
+ result.set(arr, offset);
51
+ offset += arr.length;
52
+ }
53
+ return result;
54
+ }
55
+
56
+ /**
57
+ * Concatenate Float64 arrays without type casting.
58
+ */
59
+ export function concatenateFloat64Arrays(arrays: Float64Array[]): Float64Array {
60
+ if (arrays.length === 0) throw new Error('Cannot concatenate empty array list');
61
+ if (arrays.length === 1) return arrays[0];
62
+ const totalLength = arrays.reduce((sum, arr) => sum + arr.length, 0);
63
+ const result = new Float64Array(totalLength);
64
+ let offset = 0;
65
+ for (const arr of arrays) {
66
+ result.set(arr, offset);
67
+ offset += arr.length;
68
+ }
69
+ return result;
70
+ }
71
+
72
+ /**
73
+ * Concatenate null bitmaps from multiple buffers
74
+ */
75
+ export function concatenateNullBitmaps(buffers: AnySpanBuffer[], columnName: string): ConcatenatedNullBitmaps {
76
+ const hasAnyNulls = buffers.some((buf) => buf.getNullsIfAllocated(columnName) !== undefined);
77
+
78
+ if (!hasAnyNulls) return { nullBitmap: undefined, nullCount: 0 };
79
+
80
+ const totalRows = buffers.reduce((sum, buf) => sum + buf._writeIndex, 0);
81
+ const bitmapBytes = Math.ceil(totalRows / 8);
82
+ const nullBitmap = new Uint8Array(bitmapBytes);
83
+ nullBitmap.fill(0xff); // Default all valid
84
+
85
+ // Buffer chains: all buffers except the last are full (writeIndex == capacity).
86
+ // If capacity is a multiple of 8, each buffer starts at a byte boundary.
87
+ let rowOffset = 0;
88
+ let nullCount = 0;
89
+
90
+ for (const buf of buffers) {
91
+ const sourceBitmap = buf.getNullsIfAllocated(columnName);
92
+ const rowCount = buf._writeIndex;
93
+
94
+ if (sourceBitmap) {
95
+ copyBits(nullBitmap, rowOffset, sourceBitmap, 0, rowCount);
96
+ // Count nulls using countNulls from arrow-builder
97
+ nullCount += countNulls(sourceBitmap, rowCount);
98
+ }
99
+ // If no sourceBitmap, leave as 0xff (all valid)
100
+
101
+ rowOffset += rowCount;
102
+ }
103
+
104
+ return { nullBitmap, nullCount };
105
+ }
106
+
107
+ /**
108
+ * Get Arrow field name from LMAO field name
109
+ */
110
+ export function getArrowFieldName(fieldName: string): string {
111
+ return fieldName;
112
+ }
113
+
114
+ /**
115
+ * Walk a SpanBuffer tree (including overflow chains and children)
116
+ */
117
+ export function walkSpanTree(root: AnySpanBuffer, visitor: (buffer: AnySpanBuffer) => void): void {
118
+ let current: AnySpanBuffer | undefined = root;
119
+ while (current) {
120
+ visitor(current);
121
+ current = current._overflow;
122
+ }
123
+ for (const child of root._children) {
124
+ walkSpanTree(child, visitor);
125
+ }
126
+ }
@@ -0,0 +1,131 @@
1
+ /**
2
+ * Nanoseconds branded type for type-safe timestamp handling
3
+ *
4
+ * Prevents accidental unit mixing (milliseconds vs nanoseconds) and provides
5
+ * a centralized location for timestamp conversion utilities.
6
+ *
7
+ * This is a generic buffer concept used for high-precision time-series data.
8
+ *
9
+ * **Benefits:**
10
+ * - Type safety prevents mixing time units
11
+ * - Self-documenting code - units clear from type
12
+ * - Zero runtime overhead on hot path (BigInt operations are fast)
13
+ * - Conversion functions centralized and tested
14
+ * - Works with Arrow's TimestampNanosecond type
15
+ *
16
+ * **Precision:**
17
+ * - BigInt can represent arbitrarily large integers
18
+ * - Nanoseconds since epoch will never overflow
19
+ * - Node.js: Native nanosecond precision via process.hrtime.bigint()
20
+ * - Browser: Microsecond precision via performance.now() (last 3 digits are 000)
21
+ *
22
+ * @module nanoseconds
23
+ *
24
+ * @example
25
+ * ```typescript
26
+ * import { Nanoseconds } from '@smoothbricks/arrow-builder';
27
+ *
28
+ * // Node.js: Native nanoseconds
29
+ * const timestamp = Nanoseconds.now();
30
+ *
31
+ * // Store in buffer (BigInt64Array)
32
+ * buffer.timestamps[idx] = timestamp; // Type-safe!
33
+ * ```
34
+ */
35
+
36
+ /**
37
+ * Nanoseconds branded type
38
+ *
39
+ * A `bigint` with a compile-time brand that prevents accidental mixing of time units.
40
+ * The brand is erased at runtime, so there is zero overhead.
41
+ */
42
+ declare const nanosecondsBrand: unique symbol;
43
+
44
+ export type Nanoseconds = bigint & { readonly [nanosecondsBrand]: 'Nanoseconds' };
45
+
46
+ function toNanoseconds(value: bigint): Nanoseconds;
47
+ function toNanoseconds(value: bigint): bigint {
48
+ return value;
49
+ }
50
+
51
+ /**
52
+ * Utility functions for working with Nanoseconds
53
+ */
54
+ export namespace Nanoseconds {
55
+ /**
56
+ * Get current timestamp in nanoseconds since Unix epoch.
57
+ *
58
+ * Uses the most efficient method available:
59
+ * - Browser/generic: performance.timeOrigin + performance.now() (microsecond precision)
60
+ * - Browsers typically provide 5-20 microsecond precision
61
+ *
62
+ * For Node.js with true nanosecond precision, use the /node entry point.
63
+ *
64
+ * **Precision handling:**
65
+ * - Epoch milliseconds (~1.7 trillion) is safe as Number
66
+ * - Multiply by 1000 to get microseconds (~1.7 quadrillion) - still safe
67
+ * - Convert to BigInt, then multiply by 1000n for nanoseconds
68
+ *
69
+ * @returns Current timestamp in nanoseconds since Unix epoch
70
+ *
71
+ * @example
72
+ * ```typescript
73
+ * buffer.timestamps[idx] = Nanoseconds.now();
74
+ * ```
75
+ */
76
+ export function now(): Nanoseconds {
77
+ // performance.timeOrigin + performance.now() gives epoch time in milliseconds
78
+ // with sub-millisecond precision (e.g., 1702789123456.789)
79
+ // Convert to microseconds first (safe as Number), then to nanoseconds as BigInt
80
+ const epochMicros = Math.round((performance.timeOrigin + performance.now()) * 1000);
81
+ return toNanoseconds(BigInt(epochMicros) * 1000n);
82
+ }
83
+
84
+ /**
85
+ * Convert milliseconds to nanoseconds.
86
+ *
87
+ * @param millis - Time in milliseconds (e.g., from Date.now())
88
+ * @returns Time in nanoseconds
89
+ *
90
+ * @example
91
+ * ```typescript
92
+ * const epochNanos = Nanoseconds.fromMillis(Date.now());
93
+ * ```
94
+ */
95
+ export function fromMillis(millis: number): Nanoseconds {
96
+ return toNanoseconds(BigInt(Math.trunc(millis)) * 1_000_000n);
97
+ }
98
+
99
+ /**
100
+ * Cast a raw bigint to Nanoseconds (use with caution).
101
+ *
102
+ * **Warning:** This bypasses type safety. Only use when you're certain
103
+ * the value is already in nanoseconds.
104
+ *
105
+ * @param value - Raw bigint value in nanoseconds
106
+ * @returns Branded Nanoseconds value
107
+ */
108
+ export function unsafe(value: bigint): Nanoseconds {
109
+ return toNanoseconds(value);
110
+ }
111
+
112
+ /**
113
+ * Convert nanoseconds to milliseconds.
114
+ *
115
+ * @param nanos - Time in nanoseconds
116
+ * @returns Time in milliseconds (as number)
117
+ */
118
+ export function toMillis(nanos: Nanoseconds): number {
119
+ return Number(nanos / 1_000_000n);
120
+ }
121
+
122
+ /**
123
+ * Convert nanoseconds to microseconds.
124
+ *
125
+ * @param nanos - Time in nanoseconds
126
+ * @returns Time in microseconds (as bigint)
127
+ */
128
+ export function toMicros(nanos: Nanoseconds): bigint {
129
+ return nanos / 1_000n;
130
+ }
131
+ }
@@ -0,0 +1,106 @@
1
+ /**
2
+ * BufferStrategy - Abstraction for SpanBuffer memory management and Arrow conversion.
3
+ *
4
+ * This interface separates memory management concerns from sink concerns (Tracer):
5
+ * - BufferStrategy: HOW buffers are allocated and converted (JS TypedArrays vs WASM)
6
+ * - Tracer (sink): WHAT happens with completed buffers (stdio, queue, test accumulation)
7
+ *
8
+ * Key responsibilities:
9
+ * 1. Buffer creation (root, child, overflow)
10
+ * 2. Arrow conversion (strategy knows optimal path)
11
+ * 3. Buffer release (GC for JS, freelist for WASM)
12
+ *
13
+ * The sink (Tracer subclass) controls WHEN to convert and release:
14
+ * - StdioTracer: prints then releases immediately
15
+ * - TestTracer: holds buffers until clear()
16
+ * - SqsTracer: accumulates, converts on flush(), then releases
17
+ *
18
+ * @module bufferStrategy
19
+ */
20
+
21
+ import type { Table } from '@uwdata/flechette';
22
+ import type { OpMetadata } from './opContext/opTypes.js';
23
+ import type { LogSchema } from './schema/LogSchema.js';
24
+ import type { ITraceRoot } from './traceRoot.js';
25
+ import type { AnySpanBuffer, SpanBuffer } from './types.js';
26
+
27
+ /**
28
+ * BufferStrategy interface for memory management and Arrow conversion.
29
+ *
30
+ * Implementations:
31
+ * - JsBufferStrategy: GC-managed JS TypedArrays, zero-copy Arrow via flechette
32
+ * - WasmBufferStrategy: WASM memory with freelist, Arrow built in WASM
33
+ * - (future) NapiBufferStrategy: Native code with SharedArrayBuffer
34
+ *
35
+ * @typeParam T - LogSchema type for type-safe buffer access
36
+ */
37
+ export interface BufferStrategy<T extends LogSchema = LogSchema> {
38
+ /**
39
+ * Create a root SpanBuffer for a new trace.
40
+ *
41
+ * @param schema - LogSchema defining column types
42
+ * @param traceRoot - Platform-specific trace root with timestamp anchors
43
+ * @param opMetadata - Metadata for the executing op
44
+ * @param capacity - Optional capacity override
45
+ * @returns New SpanBuffer for the root span
46
+ */
47
+ createSpanBuffer(schema: T, traceRoot: ITraceRoot, opMetadata: OpMetadata, capacity?: number): SpanBuffer<T>;
48
+
49
+ /**
50
+ * Create a child span buffer linked to a parent.
51
+ *
52
+ * @param parentBuffer - Parent buffer for tree linkage
53
+ * Note: Caller must call writeSpanStart() after this to set span name in message_values[0].
54
+ *
55
+ * @param callsiteMetadata - Metadata for WHERE span() was called (row 0)
56
+ * @param opMetadata - Metadata for WHAT op is executing (rows 1+)
57
+ * @param capacity - Optional capacity override
58
+ * @param schema - Optional schema for the child (if different from parent, e.g., library ops)
59
+ * @returns New SpanBuffer linked to parent
60
+ */
61
+ createChildSpanBuffer(
62
+ parentBuffer: SpanBuffer<T>,
63
+ callsiteMetadata: OpMetadata,
64
+ opMetadata: OpMetadata,
65
+ capacity?: number,
66
+ schema?: T,
67
+ ): SpanBuffer<T>;
68
+
69
+ /**
70
+ * Create an overflow buffer when current buffer is full.
71
+ *
72
+ * @param buffer - Full buffer that needs overflow storage
73
+ * @returns New SpanBuffer linked via buffer._overflow
74
+ */
75
+ createOverflowBuffer(buffer: SpanBuffer<T>): SpanBuffer<T>;
76
+
77
+ /**
78
+ * Convert a SpanBuffer tree to Arrow Table.
79
+ *
80
+ * Each strategy knows the optimal conversion path:
81
+ * - JS: Zero-copy wrap TypedArrays via flechette
82
+ * - WASM: Build Arrow in WASM memory, return table
83
+ * - NAPI: Call into native code for parallel conversion
84
+ *
85
+ * @param buffer - Root buffer to convert (includes children and overflow chain)
86
+ * @returns Arrow Table (sync) or Promise<Table> (async)
87
+ */
88
+ toArrowTable(buffer: AnySpanBuffer): Table | Promise<Table>;
89
+
90
+ /**
91
+ * Release a SpanBuffer's memory resources.
92
+ *
93
+ * Called by the sink when it's done with a buffer.
94
+ *
95
+ * - JsBufferStrategy: No-op (GC handles it)
96
+ * - WasmBufferStrategy: Returns blocks to freelist
97
+ *
98
+ * The sink decides WHEN to release:
99
+ * - After printing (StdioTracer)
100
+ * - On clear() (TestTracer)
101
+ * - After Arrow conversion (SqsTracer)
102
+ *
103
+ * @param buffer - Buffer to release (and its entire tree)
104
+ */
105
+ releaseBuffer(buffer: AnySpanBuffer): void;
106
+ }
@@ -0,0 +1,102 @@
1
+ /**
2
+ * Capacity Tuning - Self-tuning buffer capacity based on utilization
3
+ *
4
+ * Per specs/lmao/01b2_buffer_self_tuning.md:
5
+ * - Track row utilization = totalWrites / (spansCreated * usableRowsPerSpan)
6
+ * - Increase capacity if utilization > 150% (regularly overflowing)
7
+ * - Decrease capacity if utilization < 50% (wasting space)
8
+ * - Maintain power-of-2 capacities between 8 and 1024
9
+ *
10
+ * ## Utilization Model
11
+ *
12
+ * - 100% = exactly filling first buffer per span (ideal)
13
+ * - 150% = filling 1.5x first buffer (some spans overflow)
14
+ * - 200% = filling 2x first buffer (every span overflows once)
15
+ * - 50% = only using half the first buffer (wasting space)
16
+ *
17
+ * The 3x gap between shrink (50%) and grow (150%) thresholds prevents flip-flopping:
18
+ * - After grow: utilization halves → lands in stable zone
19
+ * - After shrink: utilization doubles → lands in stable zone
20
+ *
21
+ * ## Architecture Note
22
+ *
23
+ * Stats are on SpanBufferClass.stats (static property), NOT on LogBinding.
24
+ * This reduces per-instance memory and avoids sync bugs from having two stat objects.
25
+ */
26
+
27
+ import type { SpanBufferStats } from './spanBufferStats.js';
28
+
29
+ /** Minimum spans needed before tuning decisions */
30
+ const MIN_SPANS_FOR_TUNING = 10;
31
+
32
+ /** Grow capacity when utilization exceeds this (150% = regularly overflowing) */
33
+ const GROW_THRESHOLD = 1.5;
34
+
35
+ /** Shrink capacity when utilization falls below this (50% = wasting space) */
36
+ const SHRINK_THRESHOLD = 0.5;
37
+
38
+ /** Minimum capacity (must be power of 2, >= 8 for alignment) */
39
+ const MIN_CAPACITY = 8;
40
+
41
+ /** Maximum capacity (must be power of 2) */
42
+ const MAX_CAPACITY = 1024;
43
+
44
+ /**
45
+ * Check if capacity should be tuned after an overflow event.
46
+ *
47
+ * Called when a buffer overflows and needs to chain to a new buffer.
48
+ *
49
+ * @param stats - SpanBufferStats from SpanBufferClass.stats
50
+ * @internal
51
+ */
52
+ export function checkCapacityTuning(stats: SpanBufferStats): void {
53
+ shouldTuneCapacity(stats);
54
+ }
55
+
56
+ /**
57
+ * Reset stats after capacity tuning.
58
+ *
59
+ * Called after a tuning decision to start fresh measurement window.
60
+ * This ensures the tuning algorithm responds to recent behavior, not cumulative history.
61
+ *
62
+ * Note: Tracer.onStatsWillResetFor() is called BEFORE this reset (in spanLoggerGenerator's
63
+ * _getNextBuffer method) to capture stats for observability before they're lost.
64
+ */
65
+ function resetStats(stats: SpanBufferStats): void {
66
+ stats.totalWrites = 0;
67
+ stats.spansCreated = 0;
68
+ }
69
+
70
+ /**
71
+ * Check if capacity should be tuned based on utilization.
72
+ *
73
+ * Algorithm:
74
+ * - Requires minimum 10 spans before tuning
75
+ * - Compute utilization = totalWrites / (spansCreated * usableRowsPerSpan)
76
+ * - Increase capacity (×2, max 1024) if utilization > 150%
77
+ * - Decrease capacity (÷2, min 8) if utilization < 50%
78
+ * - Reset stats after tuning to start fresh measurement window
79
+ *
80
+ * @param stats - SpanBufferStats from SpanBufferClass.stats
81
+ * @internal Exported for testing
82
+ */
83
+ export function shouldTuneCapacity(stats: SpanBufferStats): void {
84
+ if (stats.spansCreated < MIN_SPANS_FOR_TUNING) return;
85
+
86
+ // Usable rows per span = capacity - 2 (rows 0-1 reserved for span-start/end)
87
+ const usableRowsPerSpan = stats.capacity - 2;
88
+ const utilization = stats.totalWrites / (stats.spansCreated * usableRowsPerSpan);
89
+
90
+ // Grow if utilization > 150% (regularly overflowing)
91
+ if (utilization > GROW_THRESHOLD && stats.capacity < MAX_CAPACITY) {
92
+ stats.capacity = Math.min(stats.capacity * 2, MAX_CAPACITY);
93
+ resetStats(stats);
94
+ return;
95
+ }
96
+
97
+ // Shrink if utilization < 50% (wasting space)
98
+ if (utilization < SHRINK_THRESHOLD && stats.capacity > MIN_CAPACITY) {
99
+ stats.capacity = Math.max(MIN_CAPACITY, stats.capacity / 2);
100
+ resetStats(stats);
101
+ }
102
+ }