@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,469 @@
1
+ /**
2
+ * TypeScript wrapper for the WASM allocator.
3
+ *
4
+ * Implements spec 01q: WASM Memory Architecture for SpanBuffer Storage
5
+ *
6
+ * The allocator provides O(1) alloc/free via freelists with memory reuse.
7
+ * Each OpContext may have a different capacity - capacity is passed to each call.
8
+ *
9
+ * Buddy Allocation:
10
+ * - Blocks are organized by tier (capacity 8, 16, 32, 64, 128, 256, 512)
11
+ * - When freelist is empty, splits from larger tier
12
+ * - When freeing, merges with adjacent blocks if both are free (address-based buddy merge)
13
+ */
14
+
15
+ // =============================================================================
16
+ // Types
17
+ // =============================================================================
18
+
19
+ export interface WasmAllocator {
20
+ /** The underlying WASM memory */
21
+ readonly memory: WebAssembly.Memory;
22
+
23
+ /** WASM exports for direct function calls (hot path optimization) */
24
+ readonly exports: {
25
+ write_col_f64: (colOffset: number, rowIdx: number, value: number, capacity: number) => number;
26
+ write_col_u32: (colOffset: number, rowIdx: number, value: number, capacity: number) => number;
27
+ write_col_u8: (colOffset: number, rowIdx: number, value: number, capacity: number) => number;
28
+ write_log_entry: (
29
+ systemPtr: number,
30
+ identityPtr: number,
31
+ traceRootPtr: number,
32
+ entryType: number,
33
+ capacity: number,
34
+ ) => number;
35
+ };
36
+
37
+ /** Cached views (recreated after grow, but pre-sized to avoid grow for benchmarks) */
38
+ readonly u8: Uint8Array;
39
+ readonly u32: Uint32Array;
40
+ readonly i64: BigInt64Array;
41
+ readonly f64: Float64Array;
42
+
43
+ /** Default capacity for convenience methods */
44
+ readonly capacity: number;
45
+
46
+ /** Initialize allocator header (call once) */
47
+ init(): void;
48
+
49
+ /** Reset all freelists (for testing/benchmarking) */
50
+ reset(): void;
51
+
52
+ // Block allocation - capacity determines tier and block size
53
+ allocSpanSystem(capacity?: number): number;
54
+ alloc1B(capacity?: number): number;
55
+ alloc4B(capacity?: number): number;
56
+ alloc8B(capacity?: number): number;
57
+
58
+ // Block deallocation - returns block to freelist, may trigger buddy merge
59
+ freeSpanSystem(offset: number, capacity?: number): void;
60
+ free1B(offset: number, capacity?: number): void;
61
+ free4B(offset: number, capacity?: number): void;
62
+ free8B(offset: number, capacity?: number): void;
63
+
64
+ // Span lifecycle (writes timestamp + entry_type)
65
+ spanStart(systemPtr: number, identityPtr: number, traceRootPtr: number, capacity?: number): void;
66
+ spanEndOk(systemPtr: number, traceRootPtr: number, capacity?: number): void;
67
+ spanEndErr(systemPtr: number, traceRootPtr: number, capacity?: number): void;
68
+ /** Write log entry, bump writeIndex, return idx written to */
69
+ writeLogEntry(
70
+ systemPtr: number,
71
+ identityPtr: number,
72
+ traceRootPtr: number,
73
+ entryType: number,
74
+ capacity?: number,
75
+ ): number;
76
+
77
+ // Column writes (auto-allocate if offset is 0)
78
+ writeColF64(colOffset: number, rowIdx: number, value: number, capacity?: number): number;
79
+ writeColU32(colOffset: number, rowIdx: number, value: number, capacity?: number): number;
80
+ writeColU8(colOffset: number, rowIdx: number, value: number, capacity?: number): number;
81
+
82
+ // TraceRoot initialization
83
+ initTraceRoot(traceRootPtr: number): void;
84
+
85
+ // Debug/introspection
86
+ getBumpPtr(): number;
87
+ getAllocCount(): number;
88
+ getFreeCount(): number;
89
+ getSpanSystemSize(capacity?: number): number;
90
+ getCol1BSize(capacity?: number): number;
91
+ getCol4BSize(capacity?: number): number;
92
+ getCol8BSize(capacity?: number): number;
93
+
94
+ // Reading (for Arrow conversion)
95
+ readTimestamp(systemPtr: number, rowIdx: number): bigint;
96
+ readEntryType(systemPtr: number, rowIdx: number, capacity?: number): number;
97
+ readWriteIndex(identityPtr: number): number;
98
+ readColF64(colOffset: number, rowIdx: number, capacity?: number): number;
99
+ readColIsValid(colOffset: number, rowIdx: number): number;
100
+
101
+ // Thread ID management
102
+ setThreadId(high: number, low: number): void;
103
+ getThreadIdHigh(): number;
104
+ getThreadIdLow(): number;
105
+ isThreadIdSet(): number;
106
+ getSpanIdCounter(): number;
107
+
108
+ // Identity block operations (thread_id is global in header, use getThreadIdHigh/Low)
109
+ allocIdentityRootForJsWrite(traceIdLen: number): bigint;
110
+ allocIdentityChild(): number;
111
+ freeIdentity(offset: number): void;
112
+ readIdentitySpanId(identityPtr: number): number;
113
+ readIdentityTraceIdLen(identityPtr: number): number;
114
+ getIdentityTraceIdPtr(identityPtr: number): number;
115
+
116
+ // Freelist statistics (O(1) - cascading stats stored in HEAD block)
117
+ getFreelistLen(sizeClass: SizeClass, capacity?: number): number;
118
+ getFreelistReuseCount(sizeClass: SizeClass, capacity?: number): number;
119
+ getFreelistSplitCount(sizeClass: SizeClass, capacity?: number): number;
120
+ getFreelistMergeCount(sizeClass: SizeClass, capacity?: number): number;
121
+ }
122
+
123
+ /**
124
+ * Size class enum matching Zig's SizeClass
125
+ */
126
+ export enum SizeClass {
127
+ SpanSystem = 0,
128
+ Col1B = 1,
129
+ Col4B = 2,
130
+ Col8B = 3,
131
+ Identity = 4,
132
+ }
133
+
134
+ export interface WasmAllocatorOptions {
135
+ /** Initial memory pages (64KB each). Default: 17 (~1MB) */
136
+ initialPages?: number;
137
+ /** Maximum memory pages. Default: 16384 (1GB) */
138
+ maxPages?: number;
139
+ /** Default capacity (rows per span buffer). Default: 64 */
140
+ capacity?: number;
141
+ }
142
+
143
+ // =============================================================================
144
+ // WASM Exports Interface (matches Zig export names)
145
+ // =============================================================================
146
+
147
+ interface WasmExports {
148
+ init(): void;
149
+ reset(): void;
150
+
151
+ alloc_span_system(capacity: number): number;
152
+ alloc_col_1b(capacity: number): number;
153
+ alloc_col_4b(capacity: number): number;
154
+ alloc_col_8b(capacity: number): number;
155
+
156
+ free_span_system(offset: number, capacity: number): void;
157
+ free_col_1b(offset: number, capacity: number): void;
158
+ free_col_4b(offset: number, capacity: number): void;
159
+ free_col_8b(offset: number, capacity: number): void;
160
+
161
+ span_start(systemPtr: number, identityPtr: number, traceRootPtr: number, capacity: number): void;
162
+ span_end_ok(systemPtr: number, traceRootPtr: number, capacity: number): void;
163
+ span_end_err(systemPtr: number, traceRootPtr: number, capacity: number): void;
164
+ write_log_entry(
165
+ systemPtr: number,
166
+ identityPtr: number,
167
+ traceRootPtr: number,
168
+ entryType: number,
169
+ capacity: number,
170
+ ): number;
171
+
172
+ write_col_f64(colOffset: number, rowIdx: number, value: number, capacity: number): number;
173
+ write_col_u32(colOffset: number, rowIdx: number, value: number, capacity: number): number;
174
+ write_col_u8(colOffset: number, rowIdx: number, value: number, capacity: number): number;
175
+
176
+ init_trace_root(traceRootPtr: number): void;
177
+
178
+ get_bump_ptr(): number;
179
+ get_alloc_count(): number;
180
+ get_free_count(): number;
181
+ get_span_system_size(capacity: number): number;
182
+ get_col_1b_size(capacity: number): number;
183
+ get_col_4b_size(capacity: number): number;
184
+ get_col_8b_size(capacity: number): number;
185
+
186
+ read_timestamp(systemPtr: number, rowIdx: number): bigint;
187
+ read_entry_type(systemPtr: number, rowIdx: number, capacity: number): number;
188
+ read_write_index(identityPtr: number): number;
189
+ read_col_f64(colOffset: number, rowIdx: number, capacity: number): number;
190
+ read_col_is_valid(colOffset: number, rowIdx: number): number;
191
+
192
+ // Thread ID management
193
+ set_thread_id(high: number, low: number): void;
194
+ get_thread_id_high(): number;
195
+ get_thread_id_low(): number;
196
+ is_thread_id_set(): number;
197
+ get_span_id_counter(): number;
198
+
199
+ // Identity block operations (thread_id is global, use get_thread_id_high/low)
200
+ alloc_identity_root_for_js_write(traceIdLen: number): bigint;
201
+ alloc_identity_child(): number;
202
+ free_identity(offset: number): void;
203
+ read_identity_span_id(identityPtr: number): number;
204
+ read_identity_trace_id_len(identityPtr: number): number;
205
+ get_identity_trace_id_ptr(identityPtr: number): number;
206
+
207
+ // Freelist statistics (O(1) - cascading stats stored in HEAD block)
208
+ get_freelist_len(sizeClass: number, capacity: number): number;
209
+ get_freelist_reuse_count(sizeClass: number, capacity: number): number;
210
+ get_freelist_split_count(sizeClass: number, capacity: number): number;
211
+ get_freelist_merge_count(sizeClass: number, capacity: number): number;
212
+ }
213
+
214
+ function isWasmExports(value: unknown): value is WasmExports {
215
+ if (typeof value !== 'object' || value === null) {
216
+ return false;
217
+ }
218
+
219
+ return (
220
+ typeof Reflect.get(value, 'init') === 'function' && typeof Reflect.get(value, 'alloc_span_system') === 'function'
221
+ );
222
+ }
223
+
224
+ // =============================================================================
225
+ // Implementation
226
+ // =============================================================================
227
+
228
+ const DEFAULT_INITIAL_PAGES = 17; // ~1MB - matches WASM module minimum
229
+ const DEFAULT_MAX_PAGES = 16384; // 1GB max (can grow up to this)
230
+ const DEFAULT_CAPACITY = 64;
231
+
232
+ /**
233
+ * Create typed views over WASM memory.
234
+ * Must be called after memory creation and after any grow().
235
+ */
236
+ function createViews(memory: WebAssembly.Memory) {
237
+ return {
238
+ u8: new Uint8Array(memory.buffer),
239
+ u32: new Uint32Array(memory.buffer),
240
+ i64: new BigInt64Array(memory.buffer),
241
+ f64: new Float64Array(memory.buffer),
242
+ };
243
+ }
244
+
245
+ /**
246
+ * Create WasmAllocator from instantiated WASM module.
247
+ */
248
+ function wrapWasmInstance(instance: WebAssembly.Instance, memory: WebAssembly.Memory, capacity: number): WasmAllocator {
249
+ if (!isWasmExports(instance.exports)) {
250
+ throw new Error('allocator.wasm exports did not match the expected ABI');
251
+ }
252
+ const exports = instance.exports;
253
+ let views = createViews(memory);
254
+ let currentBuffer = memory.buffer;
255
+
256
+ // Initialize the allocator header
257
+ exports.init();
258
+
259
+ return {
260
+ memory,
261
+ capacity,
262
+ exports: {
263
+ write_col_f64: exports.write_col_f64,
264
+ write_col_u32: exports.write_col_u32,
265
+ write_col_u8: exports.write_col_u8,
266
+ write_log_entry: exports.write_log_entry,
267
+ },
268
+
269
+ get u8() {
270
+ // Check if memory grew since last access
271
+ if (memory.buffer !== currentBuffer) {
272
+ currentBuffer = memory.buffer;
273
+ views = createViews(memory);
274
+ }
275
+ return views.u8;
276
+ },
277
+ get u32() {
278
+ if (memory.buffer !== currentBuffer) {
279
+ currentBuffer = memory.buffer;
280
+ views = createViews(memory);
281
+ }
282
+ return views.u32;
283
+ },
284
+ get i64() {
285
+ if (memory.buffer !== currentBuffer) {
286
+ currentBuffer = memory.buffer;
287
+ views = createViews(memory);
288
+ }
289
+ return views.i64;
290
+ },
291
+ get f64() {
292
+ if (memory.buffer !== currentBuffer) {
293
+ currentBuffer = memory.buffer;
294
+ views = createViews(memory);
295
+ }
296
+ return views.f64;
297
+ },
298
+
299
+ init: exports.init,
300
+ reset: exports.reset,
301
+
302
+ // Allocation with optional capacity (defaults to instance capacity)
303
+ allocSpanSystem: (cap = capacity) => exports.alloc_span_system(cap),
304
+ alloc1B: (cap = capacity) => exports.alloc_col_1b(cap),
305
+ alloc4B: (cap = capacity) => exports.alloc_col_4b(cap),
306
+ alloc8B: (cap = capacity) => exports.alloc_col_8b(cap),
307
+
308
+ // Deallocation with optional capacity
309
+ freeSpanSystem: (offset, cap = capacity) => exports.free_span_system(offset, cap),
310
+ free1B: (offset, cap = capacity) => exports.free_col_1b(offset, cap),
311
+ free4B: (offset, cap = capacity) => exports.free_col_4b(offset, cap),
312
+ free8B: (offset, cap = capacity) => exports.free_col_8b(offset, cap),
313
+
314
+ // Span lifecycle with optional capacity
315
+ spanStart: (systemPtr, identityPtr, traceRootPtr, cap = capacity) =>
316
+ exports.span_start(systemPtr, identityPtr, traceRootPtr, cap),
317
+ spanEndOk: (systemPtr, traceRootPtr, cap = capacity) => exports.span_end_ok(systemPtr, traceRootPtr, cap),
318
+ spanEndErr: (systemPtr, traceRootPtr, cap = capacity) => exports.span_end_err(systemPtr, traceRootPtr, cap),
319
+ writeLogEntry: (systemPtr, traceRootPtr, idx, entryType, cap = capacity) =>
320
+ exports.write_log_entry(systemPtr, traceRootPtr, idx, entryType, cap),
321
+
322
+ // Column writes with optional capacity
323
+ writeColF64: (colOffset, rowIdx, value, cap = capacity) => exports.write_col_f64(colOffset, rowIdx, value, cap),
324
+ writeColU32: (colOffset, rowIdx, value, cap = capacity) => exports.write_col_u32(colOffset, rowIdx, value, cap),
325
+ writeColU8: (colOffset, rowIdx, value, cap = capacity) => exports.write_col_u8(colOffset, rowIdx, value, cap),
326
+
327
+ initTraceRoot: exports.init_trace_root,
328
+
329
+ getBumpPtr: exports.get_bump_ptr,
330
+ getAllocCount: exports.get_alloc_count,
331
+ getFreeCount: exports.get_free_count,
332
+ getSpanSystemSize: (cap = capacity) => exports.get_span_system_size(cap),
333
+ getCol1BSize: (cap = capacity) => exports.get_col_1b_size(cap),
334
+ getCol4BSize: (cap = capacity) => exports.get_col_4b_size(cap),
335
+ getCol8BSize: (cap = capacity) => exports.get_col_8b_size(cap),
336
+
337
+ readTimestamp: exports.read_timestamp,
338
+ readEntryType: (systemPtr, rowIdx, cap = capacity) => exports.read_entry_type(systemPtr, rowIdx, cap),
339
+ readWriteIndex: exports.read_write_index,
340
+ readColF64: (colOffset, rowIdx, cap = capacity) => exports.read_col_f64(colOffset, rowIdx, cap),
341
+ readColIsValid: exports.read_col_is_valid,
342
+
343
+ // Thread ID management
344
+ setThreadId: exports.set_thread_id,
345
+ getThreadIdHigh: exports.get_thread_id_high,
346
+ getThreadIdLow: exports.get_thread_id_low,
347
+ isThreadIdSet: exports.is_thread_id_set,
348
+ getSpanIdCounter: exports.get_span_id_counter,
349
+
350
+ // Identity block operations (thread_id is global, use getThreadIdHigh/Low)
351
+ allocIdentityRootForJsWrite: exports.alloc_identity_root_for_js_write,
352
+ allocIdentityChild: exports.alloc_identity_child,
353
+ freeIdentity: exports.free_identity,
354
+ readIdentitySpanId: exports.read_identity_span_id,
355
+ readIdentityTraceIdLen: exports.read_identity_trace_id_len,
356
+ getIdentityTraceIdPtr: exports.get_identity_trace_id_ptr,
357
+
358
+ // Freelist statistics with optional capacity
359
+ getFreelistLen: (sizeClass, cap = capacity) => exports.get_freelist_len(sizeClass, cap),
360
+ getFreelistReuseCount: (sizeClass, cap = capacity) => exports.get_freelist_reuse_count(sizeClass, cap),
361
+ getFreelistSplitCount: (sizeClass, cap = capacity) => exports.get_freelist_split_count(sizeClass, cap),
362
+ getFreelistMergeCount: (sizeClass, cap = capacity) => exports.get_freelist_merge_count(sizeClass, cap),
363
+ };
364
+ }
365
+
366
+ /**
367
+ * Create imports object for WASM instantiation.
368
+ */
369
+ function createImports(memory: WebAssembly.Memory) {
370
+ return {
371
+ env: {
372
+ memory,
373
+ performanceNow: () => performance.now(),
374
+ dateNow: () => Date.now(),
375
+ },
376
+ };
377
+ }
378
+
379
+ // Cache for compiled WASM module (shared across all allocators)
380
+ // This eliminates recompilation cost in benchmarks and production
381
+ let cachedWasmModule: WebAssembly.Module | null = null;
382
+
383
+ /**
384
+ * Load WASM bytes - handles both Node.js and browser environments.
385
+ */
386
+ async function loadWasmBytes(): Promise<ArrayBuffer> {
387
+ // Try Node.js first
388
+ if (typeof process !== 'undefined' && process.versions?.node) {
389
+ const { readFile } = await import('node:fs/promises');
390
+ const { fileURLToPath } = await import('node:url');
391
+ const { dirname, join } = await import('node:path');
392
+
393
+ // __dirname equivalent for ESM
394
+ const currentFile = fileURLToPath(import.meta.url);
395
+ const currentDir = dirname(currentFile);
396
+ const wasmPath = join(currentDir, '../../../dist/allocator.wasm');
397
+
398
+ const buffer = await readFile(wasmPath);
399
+ // Create a proper ArrayBuffer from the Node.js Buffer
400
+ const arrayBuffer = new ArrayBuffer(buffer.byteLength);
401
+ new Uint8Array(arrayBuffer).set(buffer);
402
+ return arrayBuffer;
403
+ }
404
+
405
+ // Browser: fetch from relative path
406
+ const response = await fetch(new URL('../../../dist/allocator.wasm', import.meta.url));
407
+ return response.arrayBuffer();
408
+ }
409
+
410
+ /**
411
+ * Get compiled WASM module (cached after first load).
412
+ */
413
+ async function getWasmModule(): Promise<WebAssembly.Module> {
414
+ if (cachedWasmModule) {
415
+ return cachedWasmModule;
416
+ }
417
+
418
+ const wasmBytes = await loadWasmBytes();
419
+ cachedWasmModule = await WebAssembly.compile(wasmBytes);
420
+ return cachedWasmModule;
421
+ }
422
+
423
+ /**
424
+ * Create a WASM allocator instance.
425
+ *
426
+ * The allocator uses freelist for O(1) alloc/free with memory reuse.
427
+ * Buddy allocation enables efficient memory management across different capacities.
428
+ */
429
+ export async function createWasmAllocator(options?: WasmAllocatorOptions): Promise<WasmAllocator> {
430
+ const initialPages = options?.initialPages ?? DEFAULT_INITIAL_PAGES;
431
+ const maxPages = options?.maxPages ?? DEFAULT_MAX_PAGES;
432
+ const capacity = options?.capacity ?? DEFAULT_CAPACITY;
433
+
434
+ // Create memory
435
+ const memory = new WebAssembly.Memory({
436
+ initial: initialPages,
437
+ maximum: maxPages,
438
+ });
439
+
440
+ // Get cached compiled module (only compiles once)
441
+ const module = await getWasmModule();
442
+
443
+ // Instantiate with our memory
444
+ const imports = createImports(memory);
445
+ const instance = await WebAssembly.instantiate(module, imports);
446
+
447
+ return wrapWasmInstance(instance, memory, capacity);
448
+ }
449
+
450
+ /**
451
+ * Synchronous version for when WASM is pre-loaded.
452
+ */
453
+ export function createWasmAllocatorSync(wasmModule: WebAssembly.Module, options?: WasmAllocatorOptions): WasmAllocator {
454
+ const initialPages = options?.initialPages ?? DEFAULT_INITIAL_PAGES;
455
+ const maxPages = options?.maxPages ?? DEFAULT_MAX_PAGES;
456
+ const capacity = options?.capacity ?? DEFAULT_CAPACITY;
457
+
458
+ // Create memory
459
+ const memory = new WebAssembly.Memory({
460
+ initial: initialPages,
461
+ maximum: maxPages,
462
+ });
463
+
464
+ // Instantiate with our memory
465
+ const imports = createImports(memory);
466
+ const instance = new WebAssembly.Instance(wasmModule, imports);
467
+
468
+ return wrapWasmInstance(instance, memory, capacity);
469
+ }