@smoothbricks/lmao 0.2.2 → 0.2.3

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 (276) hide show
  1. package/dist/allocator.wasm +0 -0
  2. package/dist/index.d.ts +1 -0
  3. package/dist/index.d.ts.map +1 -1
  4. package/dist/index.js +1 -0
  5. package/dist/lib/JsBufferStrategy.d.ts +4 -3
  6. package/dist/lib/JsBufferStrategy.d.ts.map +1 -1
  7. package/dist/lib/JsBufferStrategy.js +18 -11
  8. package/dist/lib/arrow/lease.d.ts +10 -0
  9. package/dist/lib/arrow/lease.d.ts.map +1 -0
  10. package/dist/lib/arrow/lease.js +33 -0
  11. package/dist/lib/arrow/utils.d.ts +3 -4
  12. package/dist/lib/arrow/utils.d.ts.map +1 -1
  13. package/dist/lib/arrow/utils.js +12 -13
  14. package/dist/lib/arrow/vocabularyDictionary.d.ts +21 -0
  15. package/dist/lib/arrow/vocabularyDictionary.d.ts.map +1 -0
  16. package/dist/lib/arrow/vocabularyDictionary.js +95 -0
  17. package/dist/lib/bufferStrategy.d.ts +3 -2
  18. package/dist/lib/bufferStrategy.d.ts.map +1 -1
  19. package/dist/lib/cloudflare/traceRows.d.ts.map +1 -1
  20. package/dist/lib/cloudflare/traceRows.js +3 -2
  21. package/dist/lib/codegen/evaluatorGenerator.d.ts.map +1 -1
  22. package/dist/lib/codegen/evaluatorGenerator.js +12 -11
  23. package/dist/lib/codegen/fixedPositionWriterGenerator.d.ts +44 -82
  24. package/dist/lib/codegen/fixedPositionWriterGenerator.d.ts.map +1 -1
  25. package/dist/lib/codegen/fixedPositionWriterGenerator.js +223 -162
  26. package/dist/lib/codegen/spanLoggerClosureMaterializer.d.ts +63 -0
  27. package/dist/lib/codegen/spanLoggerClosureMaterializer.d.ts.map +1 -0
  28. package/dist/lib/codegen/spanLoggerClosureMaterializer.js +447 -0
  29. package/dist/lib/codegen/spanLoggerGenerator.d.ts +36 -19
  30. package/dist/lib/codegen/spanLoggerGenerator.d.ts.map +1 -1
  31. package/dist/lib/codegen/spanLoggerGenerator.js +164 -158
  32. package/dist/lib/convertToArrow.d.ts +7 -2
  33. package/dist/lib/convertToArrow.d.ts.map +1 -1
  34. package/dist/lib/convertToArrow.js +499 -285
  35. package/dist/lib/defineOpContext.js +1 -1
  36. package/dist/lib/enumMetadata.d.ts +19 -0
  37. package/dist/lib/enumMetadata.d.ts.map +1 -0
  38. package/dist/lib/enumMetadata.js +86 -0
  39. package/dist/lib/flushScheduler.d.ts.map +1 -1
  40. package/dist/lib/flushScheduler.js +13 -4
  41. package/dist/lib/library.d.ts +16 -98
  42. package/dist/lib/library.d.ts.map +1 -1
  43. package/dist/lib/library.js +32 -525
  44. package/dist/lib/logBinding.d.ts +21 -27
  45. package/dist/lib/logBinding.d.ts.map +1 -1
  46. package/dist/lib/op.d.ts +30 -30
  47. package/dist/lib/op.d.ts.map +1 -1
  48. package/dist/lib/op.js +15 -22
  49. package/dist/lib/opContext/createOpGroup.d.ts +1 -1
  50. package/dist/lib/opContext/createOpGroup.d.ts.map +1 -1
  51. package/dist/lib/opContext/createOpGroup.js +22 -29
  52. package/dist/lib/opContext/defineOp.d.ts +4 -4
  53. package/dist/lib/opContext/defineOp.d.ts.map +1 -1
  54. package/dist/lib/opContext/defineOp.js +53 -10
  55. package/dist/lib/opContext/opGroupTypes.d.ts +2 -2
  56. package/dist/lib/opContext/opTypes.d.ts +1 -1
  57. package/dist/lib/opContext/opTypes.d.ts.map +1 -1
  58. package/dist/lib/opContext/spanContextTypes.d.ts +29 -14
  59. package/dist/lib/opContext/spanContextTypes.d.ts.map +1 -1
  60. package/dist/lib/opContext/types.d.ts +4 -4
  61. package/dist/lib/opContext/types.d.ts.map +1 -1
  62. package/dist/lib/physicalLayoutPlan.d.ts +89 -0
  63. package/dist/lib/physicalLayoutPlan.d.ts.map +1 -0
  64. package/dist/lib/physicalLayoutPlan.js +442 -0
  65. package/dist/lib/resolveMessage.d.ts +9 -0
  66. package/dist/lib/resolveMessage.d.ts.map +1 -0
  67. package/dist/lib/resolveMessage.js +63 -0
  68. package/dist/lib/result.d.ts +5 -7
  69. package/dist/lib/result.d.ts.map +1 -1
  70. package/dist/lib/result.js +19 -26
  71. package/dist/lib/runtimeHint.d.ts +35 -0
  72. package/dist/lib/runtimeHint.d.ts.map +1 -0
  73. package/dist/lib/runtimeHint.js +79 -0
  74. package/dist/lib/schema/types.d.ts +1 -1
  75. package/dist/lib/schema/types.d.ts.map +1 -1
  76. package/dist/lib/span-buffer/aot/v1.d.ts +2 -0
  77. package/dist/lib/span-buffer/aot/v1.d.ts.map +1 -0
  78. package/dist/lib/span-buffer/aot/v1.js +24 -0
  79. package/dist/lib/spanBuffer.d.ts +33 -4
  80. package/dist/lib/spanBuffer.d.ts.map +1 -1
  81. package/dist/lib/spanBuffer.js +583 -91
  82. package/dist/lib/spanBufferStats.d.ts +1 -1
  83. package/dist/lib/spanBufferStats.d.ts.map +1 -1
  84. package/dist/lib/spanContext.d.ts +27 -51
  85. package/dist/lib/spanContext.d.ts.map +1 -1
  86. package/dist/lib/spanContext.js +822 -344
  87. package/dist/lib/sqlite/sqlite-common.d.ts.map +1 -1
  88. package/dist/lib/sqlite/sqlite-common.js +20 -21
  89. package/dist/lib/testing/bun-harness.d.ts +8 -3
  90. package/dist/lib/testing/bun-harness.d.ts.map +1 -1
  91. package/dist/lib/testing/bun-harness.js +30 -18
  92. package/dist/lib/testing/extractFacts.d.ts +1 -1
  93. package/dist/lib/testing/extractFacts.d.ts.map +1 -1
  94. package/dist/lib/testing/extractFacts.js +55 -63
  95. package/dist/lib/testing/facts.d.ts +1 -1
  96. package/dist/lib/testing/facts.d.ts.map +1 -1
  97. package/dist/lib/testing/queryable-span.d.ts +1 -1
  98. package/dist/lib/testing/queryable-span.d.ts.map +1 -1
  99. package/dist/lib/testing/queryable-span.js +26 -28
  100. package/dist/lib/testing/span-query.d.ts.map +1 -1
  101. package/dist/lib/testing/span-query.js +19 -22
  102. package/dist/lib/testing/stdio-replay.d.ts.map +1 -1
  103. package/dist/lib/testing/stdio-replay.js +19 -8
  104. package/dist/lib/threadId.d.ts.map +1 -1
  105. package/dist/lib/threadId.js +6 -3
  106. package/dist/lib/traceRoot.d.ts +30 -8
  107. package/dist/lib/traceRoot.d.ts.map +1 -1
  108. package/dist/lib/traceRoot.es.d.ts +17 -15
  109. package/dist/lib/traceRoot.es.d.ts.map +1 -1
  110. package/dist/lib/traceRoot.es.js +68 -34
  111. package/dist/lib/traceRoot.js +11 -0
  112. package/dist/lib/traceRoot.node.d.ts +17 -19
  113. package/dist/lib/traceRoot.node.d.ts.map +1 -1
  114. package/dist/lib/traceRoot.node.js +66 -38
  115. package/dist/lib/traceTopology.d.ts +42 -0
  116. package/dist/lib/traceTopology.d.ts.map +1 -0
  117. package/dist/lib/traceTopology.js +260 -0
  118. package/dist/lib/tracer.d.ts +9 -5
  119. package/dist/lib/tracer.d.ts.map +1 -1
  120. package/dist/lib/tracer.js +65 -71
  121. package/dist/lib/tracers/ArrayQueueTracer.d.ts +1 -1
  122. package/dist/lib/tracers/ArrayQueueTracer.js +1 -1
  123. package/dist/lib/tracers/StdioTracer.d.ts.map +1 -1
  124. package/dist/lib/tracers/StdioTracer.js +15 -13
  125. package/dist/lib/tracers/TestTracer.d.ts +4 -6
  126. package/dist/lib/tracers/TestTracer.d.ts.map +1 -1
  127. package/dist/lib/tracers/TestTracer.js +6 -8
  128. package/dist/lib/types.d.ts +49 -32
  129. package/dist/lib/types.d.ts.map +1 -1
  130. package/dist/lib/vocabularyRegistry.d.ts +25 -0
  131. package/dist/lib/vocabularyRegistry.d.ts.map +1 -0
  132. package/dist/lib/vocabularyRegistry.js +372 -0
  133. package/dist/lib/wasm/WasmBufferStrategy.d.ts +6 -10
  134. package/dist/lib/wasm/WasmBufferStrategy.d.ts.map +1 -1
  135. package/dist/lib/wasm/WasmBufferStrategy.js +44 -37
  136. package/dist/lib/wasm/wasmAllocator.d.ts +27 -22
  137. package/dist/lib/wasm/wasmAllocator.d.ts.map +1 -1
  138. package/dist/lib/wasm/wasmAllocator.js +66 -44
  139. package/dist/lib/wasm/wasmPhysicalLayout.d.ts +67 -0
  140. package/dist/lib/wasm/wasmPhysicalLayout.d.ts.map +1 -0
  141. package/dist/lib/wasm/wasmPhysicalLayout.js +179 -0
  142. package/dist/lib/wasm/wasmSpanBuffer.d.ts +79 -31
  143. package/dist/lib/wasm/wasmSpanBuffer.d.ts.map +1 -1
  144. package/dist/lib/wasm/wasmSpanBuffer.js +442 -272
  145. package/dist/lib/wasm/wasmTraceRoot.d.ts +24 -22
  146. package/dist/lib/wasm/wasmTraceRoot.d.ts.map +1 -1
  147. package/dist/lib/wasm/wasmTraceRoot.js +110 -71
  148. package/dist/vocabulary/register/v1.d.ts +2 -0
  149. package/dist/vocabulary/register/v1.d.ts.map +1 -0
  150. package/dist/vocabulary/register/v1.js +1 -0
  151. package/dist/wasm.d.ts +5 -0
  152. package/dist/wasm.d.ts.map +1 -0
  153. package/dist/wasm.js +4 -0
  154. package/package.json +54 -6
  155. package/src/index.ts +1 -0
  156. package/src/lib/JsBufferStrategy.ts +27 -9
  157. package/src/lib/__tests__/arrow-builder-integration/arrow-conversion.test.ts +335 -37
  158. package/src/lib/__tests__/arrow-builder-integration/binary-arrow-conversion.test.ts +97 -26
  159. package/src/lib/__tests__/arrow-builder-integration/binary-comparison.test.ts +75 -15
  160. package/src/lib/__tests__/arrow-builder-integration/binary-format-compliance.test.ts +30 -6
  161. package/src/lib/__tests__/arrow-builder-integration/buffer-chaining.test.ts +18 -21
  162. package/src/lib/__tests__/arrow-builder-integration/foundation.test.ts +5 -2
  163. package/src/lib/__tests__/arrow-builder-integration/integration.test.ts +25 -7
  164. package/src/lib/__tests__/arrow-builder-integration/lazy-columns.test.ts +3 -2
  165. package/src/lib/__tests__/buffer-overflow.test.ts +24 -18
  166. package/src/lib/__tests__/capability-span-context.test.ts +505 -0
  167. package/src/lib/__tests__/capacity-tuning.test.ts +5 -3
  168. package/src/lib/__tests__/eager-columns.test.ts +345 -0
  169. package/src/lib/__tests__/enum-metadata-aot.test.ts +153 -0
  170. package/src/lib/__tests__/enum-metadata.test.ts +177 -0
  171. package/src/lib/__tests__/fixtures/empty-vocabulary-runtime.fixture.ts +15 -0
  172. package/src/lib/__tests__/flushScheduler.test.ts +5 -1
  173. package/src/lib/__tests__/identity-view.property.test.ts +179 -0
  174. package/src/lib/__tests__/library.test.ts +19 -235
  175. package/src/lib/__tests__/message-buffer-families.test.ts +878 -0
  176. package/src/lib/__tests__/nested-library-tasks.test.ts +14 -15
  177. package/src/lib/__tests__/op-metadata.test.ts +1 -1
  178. package/src/lib/__tests__/op-type-safety.test.ts +5 -16
  179. package/src/lib/__tests__/physical-layout-plan.test.ts +333 -0
  180. package/src/lib/__tests__/remap-descriptor-integration.test.ts +381 -0
  181. package/src/lib/__tests__/root-context-construction.test.ts +414 -0
  182. package/src/lib/__tests__/span-auto-runtime.test.ts +386 -0
  183. package/src/lib/__tests__/span-buffer-segment-stats.test.ts +221 -0
  184. package/src/lib/__tests__/span-lifecycle.test.ts +53 -25
  185. package/src/lib/__tests__/spanbuffer-materializer-parity.test.ts +266 -0
  186. package/src/lib/__tests__/sync-async-trace.test.ts +24 -23
  187. package/src/lib/__tests__/tag-writer-aot.test.ts +214 -0
  188. package/src/lib/__tests__/test-helpers.ts +67 -12
  189. package/src/lib/__tests__/threadId.test.ts +62 -0
  190. package/src/lib/__tests__/timestamp.test.ts +221 -93
  191. package/src/lib/__tests__/traceTopology.property.test.ts +383 -0
  192. package/src/lib/__tests__/type-narrowing.test.ts +63 -0
  193. package/src/lib/__tests__/vocabulary-dense-decoding.test.ts +405 -0
  194. package/src/lib/__tests__/vocabularyRegistry.test.ts +313 -0
  195. package/src/lib/arrow/lease.ts +43 -0
  196. package/src/lib/arrow/utils.ts +10 -14
  197. package/src/lib/arrow/vocabularyDictionary.ts +123 -0
  198. package/src/lib/bufferStrategy.ts +9 -1
  199. package/src/lib/cloudflare/traceRows.ts +3 -2
  200. package/src/lib/codegen/__tests__/evaluatorGenerator.test.ts +21 -141
  201. package/src/lib/codegen/__tests__/fixedPositionWriter-parity.test.ts +273 -0
  202. package/src/lib/codegen/__tests__/fixedPositionWriter-uint64.test.ts +61 -34
  203. package/src/lib/codegen/__tests__/nullBitmap.test.ts +33 -37
  204. package/src/lib/codegen/__tests__/spanLoggerGenerator.test.ts +34 -18
  205. package/src/lib/codegen/__tests__/spanLoggerMaterializerParity.test.ts +503 -0
  206. package/src/lib/codegen/evaluatorGenerator.ts +18 -13
  207. package/src/lib/codegen/fixedPositionWriterGenerator.ts +329 -245
  208. package/src/lib/codegen/spanLoggerClosureMaterializer.ts +598 -0
  209. package/src/lib/codegen/spanLoggerGenerator.ts +241 -177
  210. package/src/lib/convertToArrow.ts +598 -311
  211. package/src/lib/defineOpContext.ts +1 -1
  212. package/src/lib/enumMetadata.ts +121 -0
  213. package/src/lib/flushScheduler.ts +11 -5
  214. package/src/lib/library.ts +37 -595
  215. package/src/lib/logBinding.ts +21 -27
  216. package/src/lib/op.ts +75 -18
  217. package/src/lib/opContext/__tests__/retry.test.ts +27 -21
  218. package/src/lib/opContext/createOpGroup.ts +33 -31
  219. package/src/lib/opContext/defineOp.ts +88 -11
  220. package/src/lib/opContext/opGroupTypes.ts +2 -2
  221. package/src/lib/opContext/opTypes.ts +1 -1
  222. package/src/lib/opContext/spanContextTypes.ts +98 -17
  223. package/src/lib/opContext/types.ts +7 -3
  224. package/src/lib/physicalLayoutPlan.ts +598 -0
  225. package/src/lib/resolveMessage.ts +67 -0
  226. package/src/lib/result.ts +20 -33
  227. package/src/lib/runtimeHint.ts +98 -0
  228. package/src/lib/schema/__tests__/featureFlags.test.ts +2 -1
  229. package/src/lib/schema/builder.ts +1 -1
  230. package/src/lib/schema/types.ts +1 -1
  231. package/src/lib/span-buffer/aot/v1.ts +26 -0
  232. package/src/lib/spanBuffer.ts +658 -92
  233. package/src/lib/spanBufferStats.ts +1 -1
  234. package/src/lib/spanContext.ts +1350 -861
  235. package/src/lib/sqlite/sqlite-common.ts +20 -31
  236. package/src/lib/testing/__tests__/topology-traversal.test.ts +174 -0
  237. package/src/lib/testing/__tests__/vitest-harness.test.ts +2 -1
  238. package/src/lib/testing/bun-harness.ts +94 -43
  239. package/src/lib/testing/extractFacts.ts +64 -78
  240. package/src/lib/testing/facts.ts +1 -1
  241. package/src/lib/testing/queryable-span.ts +23 -30
  242. package/src/lib/testing/span-query.ts +16 -20
  243. package/src/lib/testing/stdio-replay.ts +25 -8
  244. package/src/lib/testing/vitest-harness.ts +1 -1
  245. package/src/lib/threadId.ts +6 -3
  246. package/src/lib/traceRoot.es.ts +77 -42
  247. package/src/lib/traceRoot.node.ts +75 -46
  248. package/src/lib/traceRoot.ts +41 -14
  249. package/src/lib/traceTopology.ts +279 -0
  250. package/src/lib/tracer.ts +109 -98
  251. package/src/lib/tracers/ArrayQueueTracer.ts +1 -1
  252. package/src/lib/tracers/StdioTracer.ts +15 -13
  253. package/src/lib/tracers/TestTracer.ts +6 -8
  254. package/src/lib/tracers/__tests__/ArrayQueueTracer.test.ts +15 -10
  255. package/src/lib/tracers/__tests__/TestTracer.test.ts +23 -13
  256. package/src/lib/types.ts +64 -33
  257. package/src/lib/vocabularyRegistry.ts +439 -0
  258. package/src/lib/wasm/WasmBufferStrategy.ts +56 -48
  259. package/src/lib/wasm/__tests__/WasmBufferStrategy.test.ts +215 -11
  260. package/src/lib/wasm/__tests__/allocatorFreeBlockClamp.test.ts +86 -0
  261. package/src/lib/wasm/__tests__/wasm-identity-view.test.ts +311 -0
  262. package/src/lib/wasm/__tests__/wasm-integration.test.ts +417 -44
  263. package/src/lib/wasm/__tests__/wasm-message-buffer-families.test.ts +588 -0
  264. package/src/lib/wasm/__tests__/wasmAllocator.test.ts +100 -668
  265. package/src/lib/wasm/__tests__/wasmSpanBuffer.test.ts +419 -63
  266. package/src/lib/wasm/__tests__/wasmTraceRoot.test.ts +24 -29
  267. package/src/lib/wasm/__tests__/wasmTracer.test.ts.disabled +2 -2
  268. package/src/lib/wasm/wasmAllocator.ts +131 -96
  269. package/src/lib/wasm/wasmPhysicalLayout.ts +309 -0
  270. package/src/lib/wasm/wasmSpanBuffer.ts +597 -341
  271. package/src/lib/wasm/wasmTraceRoot.ts +140 -78
  272. package/src/vocabulary/register/v1.ts +1 -0
  273. package/src/wasm.ts +19 -0
  274. package/src/lib/__tests__/remapped-buffer-view-integration.test.ts +0 -319
  275. package/src/lib/__tests__/remapped-buffer-view.test.ts +0 -635
  276. package/src/lib/wasm/allocator.zig +0 -948
@@ -1,5 +1,5 @@
1
1
  import { beforeEach, describe, expect, it } from 'bun:test';
2
- import { createBuffer } from '../../__tests__/test-helpers.js';
2
+ import { JsBufferStrategy } from '../../JsBufferStrategy.js';
3
3
  import { defineLogSchema } from '../../schema/defineLogSchema.js';
4
4
  import {
5
5
  ENTRY_TYPE_DEBUG,
@@ -12,27 +12,22 @@ import {
12
12
  } from '../../schema/systemSchema.js';
13
13
  import { createTraceId } from '../../traceId.js';
14
14
  import type { TracerLifecycleHooks } from '../../traceRoot.js';
15
- import type { AnySpanBuffer } from '../../types.js';
16
15
  import { createWasmAllocator, type WasmAllocator } from '../wasmAllocator.js';
17
16
  import { createWasmTraceRoot } from '../wasmTraceRoot.js';
18
17
 
19
- function createMockSpanBuffer(): AnySpanBuffer {
20
- return createBuffer(defineLogSchema({}));
21
- }
18
+ const mockSchema = defineLogSchema({});
22
19
 
23
20
  /**
24
21
  * Mock tracer that implements TracerLifecycleHooks for testing.
25
22
  */
26
- const mockTracer: TracerLifecycleHooks = {
23
+ const mockTracer: TracerLifecycleHooks<typeof mockSchema> = {
27
24
  onTraceStart: () => {},
28
25
  onTraceEnd: () => {},
29
26
  onSpanStart: () => {},
30
27
  onSpanEnd: () => {},
31
28
  onStatsWillResetFor: () => {},
32
- bufferStrategy: {
33
- createChildSpanBuffer: createMockSpanBuffer,
34
- createOverflowBuffer: createMockSpanBuffer,
35
- },
29
+ getFlagEvaluatorForContext: () => undefined,
30
+ bufferStrategy: new JsBufferStrategy<typeof mockSchema>(),
36
31
  };
37
32
 
38
33
  describe('WasmTraceRoot', () => {
@@ -111,7 +106,7 @@ describe('WasmTraceRoot', () => {
111
106
  describe('writeSpanStartPtr (low-level pointer API)', () => {
112
107
  it('sets entry_type[0] = SPAN_START (1)', () => {
113
108
  const traceRoot = createWasmTraceRoot(allocator, 'test-trace-id', mockTracer);
114
- const systemPtr = allocator.allocSpanSystem();
109
+ const systemPtr = allocator.allocExact(64 * 9, 8);
115
110
  const identityPtr = allocator.allocIdentityChild();
116
111
 
117
112
  traceRoot.writeSpanStartPtr(systemPtr, identityPtr);
@@ -121,7 +116,7 @@ describe('WasmTraceRoot', () => {
121
116
 
122
117
  it('sets entry_type[1] = SPAN_EXCEPTION (4) for crash safety', () => {
123
118
  const traceRoot = createWasmTraceRoot(allocator, 'test-trace-id', mockTracer);
124
- const systemPtr = allocator.allocSpanSystem();
119
+ const systemPtr = allocator.allocExact(64 * 9, 8);
125
120
  const identityPtr = allocator.allocIdentityChild();
126
121
 
127
122
  traceRoot.writeSpanStartPtr(systemPtr, identityPtr);
@@ -131,7 +126,7 @@ describe('WasmTraceRoot', () => {
131
126
 
132
127
  it('sets _writeIndex to 2', () => {
133
128
  const traceRoot = createWasmTraceRoot(allocator, 'test-trace-id', mockTracer);
134
- const systemPtr = allocator.allocSpanSystem();
129
+ const systemPtr = allocator.allocExact(64 * 9, 8);
135
130
  const identityPtr = allocator.allocIdentityChild();
136
131
 
137
132
  traceRoot.writeSpanStartPtr(systemPtr, identityPtr);
@@ -141,7 +136,7 @@ describe('WasmTraceRoot', () => {
141
136
 
142
137
  it('writes a valid timestamp at row 0', () => {
143
138
  const traceRoot = createWasmTraceRoot(allocator, 'test-trace-id', mockTracer);
144
- const systemPtr = allocator.allocSpanSystem();
139
+ const systemPtr = allocator.allocExact(64 * 9, 8);
145
140
  const identityPtr = allocator.allocIdentityChild();
146
141
 
147
142
  traceRoot.writeSpanStartPtr(systemPtr, identityPtr);
@@ -154,7 +149,7 @@ describe('WasmTraceRoot', () => {
154
149
  describe('writeSpanEndOkPtr (low-level pointer API)', () => {
155
150
  it('sets entry_type[1] = SPAN_OK (2)', () => {
156
151
  const traceRoot = createWasmTraceRoot(allocator, 'test-trace-id', mockTracer);
157
- const systemPtr = allocator.allocSpanSystem();
152
+ const systemPtr = allocator.allocExact(64 * 9, 8);
158
153
  const identityPtr = allocator.allocIdentityChild();
159
154
 
160
155
  traceRoot.writeSpanStartPtr(systemPtr, identityPtr);
@@ -165,7 +160,7 @@ describe('WasmTraceRoot', () => {
165
160
 
166
161
  it('writes a valid timestamp at row 1', () => {
167
162
  const traceRoot = createWasmTraceRoot(allocator, 'test-trace-id', mockTracer);
168
- const systemPtr = allocator.allocSpanSystem();
163
+ const systemPtr = allocator.allocExact(64 * 9, 8);
169
164
  const identityPtr = allocator.allocIdentityChild();
170
165
 
171
166
  traceRoot.writeSpanStartPtr(systemPtr, identityPtr);
@@ -177,7 +172,7 @@ describe('WasmTraceRoot', () => {
177
172
 
178
173
  it('writes timestamp >= span start timestamp', () => {
179
174
  const traceRoot = createWasmTraceRoot(allocator, 'test-trace-id', mockTracer);
180
- const systemPtr = allocator.allocSpanSystem();
175
+ const systemPtr = allocator.allocExact(64 * 9, 8);
181
176
  const identityPtr = allocator.allocIdentityChild();
182
177
 
183
178
  traceRoot.writeSpanStartPtr(systemPtr, identityPtr);
@@ -193,7 +188,7 @@ describe('WasmTraceRoot', () => {
193
188
  describe('writeSpanEndErrPtr (low-level pointer API)', () => {
194
189
  it('sets entry_type[1] = SPAN_ERR (3)', () => {
195
190
  const traceRoot = createWasmTraceRoot(allocator, 'test-trace-id', mockTracer);
196
- const systemPtr = allocator.allocSpanSystem();
191
+ const systemPtr = allocator.allocExact(64 * 9, 8);
197
192
  const identityPtr = allocator.allocIdentityChild();
198
193
 
199
194
  traceRoot.writeSpanStartPtr(systemPtr, identityPtr);
@@ -204,7 +199,7 @@ describe('WasmTraceRoot', () => {
204
199
 
205
200
  it('writes a valid timestamp at row 1', () => {
206
201
  const traceRoot = createWasmTraceRoot(allocator, 'test-trace-id', mockTracer);
207
- const systemPtr = allocator.allocSpanSystem();
202
+ const systemPtr = allocator.allocExact(64 * 9, 8);
208
203
  const identityPtr = allocator.allocIdentityChild();
209
204
 
210
205
  traceRoot.writeSpanStartPtr(systemPtr, identityPtr);
@@ -218,7 +213,7 @@ describe('WasmTraceRoot', () => {
218
213
  describe('writeLogEntryPtr (low-level pointer API)', () => {
219
214
  it('returns correct row index starting at 2', () => {
220
215
  const traceRoot = createWasmTraceRoot(allocator, 'test-trace-id', mockTracer);
221
- const systemPtr = allocator.allocSpanSystem();
216
+ const systemPtr = allocator.allocExact(64 * 9, 8);
222
217
  const identityPtr = allocator.allocIdentityChild();
223
218
 
224
219
  traceRoot.writeSpanStartPtr(systemPtr, identityPtr);
@@ -229,7 +224,7 @@ describe('WasmTraceRoot', () => {
229
224
 
230
225
  it('increments write index for each log entry', () => {
231
226
  const traceRoot = createWasmTraceRoot(allocator, 'test-trace-id', mockTracer);
232
- const systemPtr = allocator.allocSpanSystem();
227
+ const systemPtr = allocator.allocExact(64 * 9, 8);
233
228
  const identityPtr = allocator.allocIdentityChild();
234
229
 
235
230
  traceRoot.writeSpanStartPtr(systemPtr, identityPtr);
@@ -246,7 +241,7 @@ describe('WasmTraceRoot', () => {
246
241
 
247
242
  it('writes correct entry type', () => {
248
243
  const traceRoot = createWasmTraceRoot(allocator, 'test-trace-id', mockTracer);
249
- const systemPtr = allocator.allocSpanSystem();
244
+ const systemPtr = allocator.allocExact(64 * 9, 8);
250
245
  const identityPtr = allocator.allocIdentityChild();
251
246
 
252
247
  traceRoot.writeSpanStartPtr(systemPtr, identityPtr);
@@ -261,7 +256,7 @@ describe('WasmTraceRoot', () => {
261
256
 
262
257
  it('writes valid timestamps for log entries', () => {
263
258
  const traceRoot = createWasmTraceRoot(allocator, 'test-trace-id', mockTracer);
264
- const systemPtr = allocator.allocSpanSystem();
259
+ const systemPtr = allocator.allocExact(64 * 9, 8);
265
260
  const identityPtr = allocator.allocIdentityChild();
266
261
 
267
262
  traceRoot.writeSpanStartPtr(systemPtr, identityPtr);
@@ -275,7 +270,7 @@ describe('WasmTraceRoot', () => {
275
270
  describe('readWriteIndex', () => {
276
271
  it('returns 2 after writeSpanStartPtr', () => {
277
272
  const traceRoot = createWasmTraceRoot(allocator, 'test-trace-id', mockTracer);
278
- const systemPtr = allocator.allocSpanSystem();
273
+ const systemPtr = allocator.allocExact(64 * 9, 8);
279
274
  const identityPtr = allocator.allocIdentityChild();
280
275
 
281
276
  traceRoot.writeSpanStartPtr(systemPtr, identityPtr);
@@ -285,7 +280,7 @@ describe('WasmTraceRoot', () => {
285
280
 
286
281
  it('reflects log entries written', () => {
287
282
  const traceRoot = createWasmTraceRoot(allocator, 'test-trace-id', mockTracer);
288
- const systemPtr = allocator.allocSpanSystem();
283
+ const systemPtr = allocator.allocExact(64 * 9, 8);
289
284
  const identityPtr = allocator.allocIdentityChild();
290
285
 
291
286
  traceRoot.writeSpanStartPtr(systemPtr, identityPtr);
@@ -326,9 +321,9 @@ describe('WasmTraceRoot', () => {
326
321
  it('can write to multiple system blocks', () => {
327
322
  const traceRoot = createWasmTraceRoot(allocator, 'test-trace-id', mockTracer);
328
323
 
329
- const systemPtr1 = allocator.allocSpanSystem();
324
+ const systemPtr1 = allocator.allocExact(64 * 9, 8);
330
325
  const identityPtr1 = allocator.allocIdentityChild();
331
- const systemPtr2 = allocator.allocSpanSystem();
326
+ const systemPtr2 = allocator.allocExact(64 * 9, 8);
332
327
  const identityPtr2 = allocator.allocIdentityChild();
333
328
 
334
329
  traceRoot.writeSpanStartPtr(systemPtr1, identityPtr1);
@@ -343,9 +338,9 @@ describe('WasmTraceRoot', () => {
343
338
  it('maintains separate state for each span buffer', () => {
344
339
  const traceRoot = createWasmTraceRoot(allocator, 'test-trace-id', mockTracer);
345
340
 
346
- const systemPtr1 = allocator.allocSpanSystem();
341
+ const systemPtr1 = allocator.allocExact(64 * 9, 8);
347
342
  const identityPtr1 = allocator.allocIdentityChild();
348
- const systemPtr2 = allocator.allocSpanSystem();
343
+ const systemPtr2 = allocator.allocExact(64 * 9, 8);
349
344
  const identityPtr2 = allocator.allocIdentityChild();
350
345
 
351
346
  traceRoot.writeSpanStartPtr(systemPtr1, identityPtr1);
@@ -137,8 +137,8 @@ describe('WasmTracer', () => {
137
137
 
138
138
  // Allocator should have all the expected methods
139
139
  expect(tracer.allocator.memory).toBeInstanceOf(WebAssembly.Memory);
140
- expect(typeof tracer.allocator.allocSpanSystem).toBe('function');
141
- expect(typeof tracer.allocator.freeSpanSystem).toBe('function');
140
+ expect(typeof tracer.allocator.allocExact).toBe('function');
141
+ expect(typeof tracer.allocator.freeExact).toBe('function');
142
142
  expect(typeof tracer.allocator.getAllocCount).toBe('function');
143
143
  });
144
144
  });
@@ -20,23 +20,26 @@
20
20
  // Types
21
21
  // =============================================================================
22
22
 
23
+ export interface WasmMemoryEpochPin {
24
+ readonly buffer: ArrayBuffer;
25
+ readonly version: number;
26
+ readonly released: boolean;
27
+ release(): void;
28
+ }
29
+
30
+ export const WASM_SPAN_IDENTITY_ROOT = 0;
31
+ export const WASM_SPAN_IDENTITY_CHILD = 1;
32
+ export const WASM_NO_LAYOUT_OFFSET = 0xffffffff;
33
+
23
34
  export interface WasmAllocator {
24
35
  /** The underlying WASM memory */
25
36
  readonly memory: WebAssembly.Memory;
26
-
27
- /** WASM exports for direct function calls (hot path optimization) */
28
- readonly exports: {
29
- write_col_f64: (colOffset: number, rowIdx: number, value: number, capacity: number) => number;
30
- write_col_u32: (colOffset: number, rowIdx: number, value: number, capacity: number) => number;
31
- write_col_u8: (colOffset: number, rowIdx: number, value: number, capacity: number) => number;
32
- write_log_entry: (
33
- systemPtr: number,
34
- identityPtr: number,
35
- traceRootPtr: number,
36
- entryType: number,
37
- capacity: number,
38
- ) => number;
39
- };
37
+ /** Monotonic version of the current linear-memory ArrayBuffer. */
38
+ readonly memoryVersion: number;
39
+ /** Refresh canonical allocator views after growth and return memoryVersion. */
40
+ refreshViews(): number;
41
+ /** Pin the current linear-memory backing epoch for borrowed Arrow views. */
42
+ pinMemoryEpoch(): WasmMemoryEpochPin;
40
43
 
41
44
  /** Cached views (recreated after grow, but pre-sized to avoid grow for benchmarks) */
42
45
  readonly u8: Uint8Array;
@@ -53,17 +56,26 @@ export interface WasmAllocator {
53
56
  /** Reset all freelists (for testing/benchmarking) */
54
57
  reset(): void;
55
58
 
56
- // Block allocation - capacity determines tier and block size
57
- allocSpanSystem(capacity?: number): number;
58
- alloc1B(capacity?: number): number;
59
- alloc4B(capacity?: number): number;
60
- alloc8B(capacity?: number): number;
61
-
62
- // Block deallocation - returns block to freelist, may trigger buddy merge
63
- freeSpanSystem(offset: number, capacity?: number): void;
64
- free1B(offset: number, capacity?: number): void;
65
- free4B(offset: number, capacity?: number): void;
66
- free8B(offset: number, capacity?: number): void;
59
+ /** Allocate and release an exact logical byte extent with explicit alignment. */
60
+ allocExact(byteLength: number, alignment: number): number;
61
+ freeExact(offset: number, byteLength: number, alignment: number): void;
62
+ /**
63
+ * Allocate one root/child superblock and pre-arm its lifecycle rows in one
64
+ * WASM call. All offsets are immutable compile/startup layout constants.
65
+ */
66
+ createAndStartSpan(
67
+ identityMode: typeof WASM_SPAN_IDENTITY_ROOT | typeof WASM_SPAN_IDENTITY_CHILD,
68
+ traceIdLength: number,
69
+ superblockByteLength: number,
70
+ systemOffset: number,
71
+ entryTypeOffset: number,
72
+ rowHeaderOffset: number,
73
+ traceRootPtr: number,
74
+ ): number;
75
+ /** Allocate one storage-only overflow superblock in one WASM call. */
76
+ createOverflowSpan(superblockByteLength: number): number;
77
+ /** Release one root, child, or overflow superblock. */
78
+ freeSpanSuperblock(offset: number, byteLength: number): void;
67
79
 
68
80
  // Span lifecycle (writes timestamp + entry_type)
69
81
  spanStart(systemPtr: number, identityPtr: number, traceRootPtr: number, capacity?: number): void;
@@ -78,11 +90,6 @@ export interface WasmAllocator {
78
90
  capacity?: number,
79
91
  ): number;
80
92
 
81
- // Column writes (auto-allocate if offset is 0)
82
- writeColF64(colOffset: number, rowIdx: number, value: number, capacity?: number): number;
83
- writeColU32(colOffset: number, rowIdx: number, value: number, capacity?: number): number;
84
- writeColU8(colOffset: number, rowIdx: number, value: number, capacity?: number): number;
85
-
86
93
  // TraceRoot initialization
87
94
  initTraceRoot(traceRootPtr: number): void;
88
95
 
@@ -90,10 +97,6 @@ export interface WasmAllocator {
90
97
  getBumpPtr(): number;
91
98
  getAllocCount(): number;
92
99
  getFreeCount(): number;
93
- getSpanSystemSize(capacity?: number): number;
94
- getCol1BSize(capacity?: number): number;
95
- getCol4BSize(capacity?: number): number;
96
- getCol8BSize(capacity?: number): number;
97
100
 
98
101
  // Reading (for Arrow conversion)
99
102
  readTimestamp(systemPtr: number, rowIdx: number): bigint;
@@ -151,16 +154,19 @@ export interface WasmAllocatorOptions {
151
154
  interface WasmExports {
152
155
  init(): void;
153
156
  reset(): void;
154
-
155
- alloc_span_system(capacity: number): number;
156
- alloc_col_1b(capacity: number): number;
157
- alloc_col_4b(capacity: number): number;
158
- alloc_col_8b(capacity: number): number;
159
-
160
- free_span_system(offset: number, capacity: number): void;
161
- free_col_1b(offset: number, capacity: number): void;
162
- free_col_4b(offset: number, capacity: number): void;
163
- free_col_8b(offset: number, capacity: number): void;
157
+ alloc_exact(byteLength: number, alignment: number): number;
158
+ free_exact(offset: number, byteLength: number, alignment: number): void;
159
+ create_and_start_span(
160
+ identityMode: number,
161
+ traceIdLength: number,
162
+ superblockByteLength: number,
163
+ systemOffset: number,
164
+ entryTypeOffset: number,
165
+ rowHeaderOffset: number,
166
+ traceRootPtr: number,
167
+ ): number;
168
+ create_overflow_span(superblockByteLength: number): number;
169
+ free_span_superblock(offset: number, byteLength: number): void;
164
170
 
165
171
  span_start(systemPtr: number, identityPtr: number, traceRootPtr: number, capacity: number): void;
166
172
  span_end_ok(systemPtr: number, traceRootPtr: number, capacity: number): void;
@@ -182,10 +188,6 @@ interface WasmExports {
182
188
  get_bump_ptr(): number;
183
189
  get_alloc_count(): number;
184
190
  get_free_count(): number;
185
- get_span_system_size(capacity: number): number;
186
- get_col_1b_size(capacity: number): number;
187
- get_col_4b_size(capacity: number): number;
188
- get_col_8b_size(capacity: number): number;
189
191
 
190
192
  read_timestamp(systemPtr: number, rowIdx: number): bigint;
191
193
  read_entry_type(systemPtr: number, rowIdx: number, capacity: number): number;
@@ -221,7 +223,11 @@ function isWasmExports(value: unknown): value is WasmExports {
221
223
  }
222
224
 
223
225
  return (
224
- typeof Reflect.get(value, 'init') === 'function' && typeof Reflect.get(value, 'alloc_span_system') === 'function'
226
+ typeof Reflect.get(value, 'init') === 'function' &&
227
+ typeof Reflect.get(value, 'alloc_exact') === 'function' &&
228
+ typeof Reflect.get(value, 'create_and_start_span') === 'function' &&
229
+ typeof Reflect.get(value, 'create_overflow_span') === 'function' &&
230
+ typeof Reflect.get(value, 'free_span_superblock') === 'function'
225
231
  );
226
232
  }
227
233
 
@@ -256,6 +262,20 @@ function wrapWasmInstance(instance: WebAssembly.Instance, memory: WebAssembly.Me
256
262
  const exports = instance.exports;
257
263
  let views = createViews(memory);
258
264
  let currentBuffer = memory.buffer;
265
+ let memoryVersion = 1;
266
+ let memoryEpochPins = 0;
267
+
268
+ const refreshViews = (): number => {
269
+ if (memory.buffer !== currentBuffer) {
270
+ if (memoryEpochPins !== 0) {
271
+ throw new Error('WASM memory grew while an Arrow lease pinned the previous epoch');
272
+ }
273
+ currentBuffer = memory.buffer;
274
+ views = createViews(memory);
275
+ memoryVersion++;
276
+ }
277
+ return memoryVersion;
278
+ };
259
279
 
260
280
  // Initialize the allocator header
261
281
  exports.init();
@@ -263,80 +283,91 @@ function wrapWasmInstance(instance: WebAssembly.Instance, memory: WebAssembly.Me
263
283
  return {
264
284
  memory,
265
285
  capacity,
266
- exports: {
267
- write_col_f64: exports.write_col_f64,
268
- write_col_u32: exports.write_col_u32,
269
- write_col_u8: exports.write_col_u8,
270
- write_log_entry: exports.write_log_entry,
286
+ get memoryVersion() {
287
+ return refreshViews();
288
+ },
289
+ refreshViews,
290
+ pinMemoryEpoch() {
291
+ const version = refreshViews();
292
+ const buffer = currentBuffer;
293
+ memoryEpochPins++;
294
+ let released = false;
295
+ return {
296
+ buffer,
297
+ version,
298
+ get released() {
299
+ return released;
300
+ },
301
+ release() {
302
+ if (released) return;
303
+ released = true;
304
+ memoryEpochPins--;
305
+ },
306
+ };
271
307
  },
272
308
 
273
309
  get u8() {
274
- // Check if memory grew since last access
275
- if (memory.buffer !== currentBuffer) {
276
- currentBuffer = memory.buffer;
277
- views = createViews(memory);
278
- }
310
+ refreshViews();
279
311
  return views.u8;
280
312
  },
281
313
  get u32() {
282
- if (memory.buffer !== currentBuffer) {
283
- currentBuffer = memory.buffer;
284
- views = createViews(memory);
285
- }
314
+ refreshViews();
286
315
  return views.u32;
287
316
  },
288
317
  get i64() {
289
- if (memory.buffer !== currentBuffer) {
290
- currentBuffer = memory.buffer;
291
- views = createViews(memory);
292
- }
318
+ refreshViews();
293
319
  return views.i64;
294
320
  },
295
321
  get f64() {
296
- if (memory.buffer !== currentBuffer) {
297
- currentBuffer = memory.buffer;
298
- views = createViews(memory);
299
- }
322
+ refreshViews();
300
323
  return views.f64;
301
324
  },
302
325
 
303
326
  init: exports.init,
304
327
  reset: exports.reset,
305
-
306
- // Allocation with optional capacity (defaults to instance capacity)
307
- allocSpanSystem: (cap = capacity) => exports.alloc_span_system(cap),
308
- alloc1B: (cap = capacity) => exports.alloc_col_1b(cap),
309
- alloc4B: (cap = capacity) => exports.alloc_col_4b(cap),
310
- alloc8B: (cap = capacity) => exports.alloc_col_8b(cap),
311
-
312
- // Deallocation with optional capacity
313
- freeSpanSystem: (offset, cap = capacity) => exports.free_span_system(offset, cap),
314
- free1B: (offset, cap = capacity) => exports.free_col_1b(offset, cap),
315
- free4B: (offset, cap = capacity) => exports.free_col_4b(offset, cap),
316
- free8B: (offset, cap = capacity) => exports.free_col_8b(offset, cap),
328
+ allocExact: exports.alloc_exact,
329
+ freeExact: exports.free_exact,
330
+ createAndStartSpan: (
331
+ identityMode,
332
+ traceIdLength,
333
+ superblockByteLength,
334
+ systemOffset,
335
+ entryTypeOffset,
336
+ rowHeaderOffset,
337
+ traceRootPtr,
338
+ ) => {
339
+ const offset = exports.create_and_start_span(
340
+ identityMode,
341
+ traceIdLength,
342
+ superblockByteLength,
343
+ systemOffset,
344
+ entryTypeOffset,
345
+ rowHeaderOffset,
346
+ traceRootPtr,
347
+ );
348
+ refreshViews();
349
+ return offset;
350
+ },
351
+ createOverflowSpan: (superblockByteLength) => {
352
+ const offset = exports.create_overflow_span(superblockByteLength);
353
+ refreshViews();
354
+ return offset;
355
+ },
356
+ freeSpanSuperblock: exports.free_span_superblock,
317
357
 
318
358
  // Span lifecycle with optional capacity
319
359
  spanStart: (systemPtr, identityPtr, traceRootPtr, cap = capacity) =>
320
360
  exports.span_start(systemPtr, identityPtr, traceRootPtr, cap),
321
361
  spanEndOk: (systemPtr, traceRootPtr, cap = capacity) => exports.span_end_ok(systemPtr, traceRootPtr, cap),
322
362
  spanEndErr: (systemPtr, traceRootPtr, cap = capacity) => exports.span_end_err(systemPtr, traceRootPtr, cap),
323
- writeLogEntry: (systemPtr, traceRootPtr, idx, entryType, cap = capacity) =>
324
- exports.write_log_entry(systemPtr, traceRootPtr, idx, entryType, cap),
325
-
326
- // Column writes with optional capacity
327
- writeColF64: (colOffset, rowIdx, value, cap = capacity) => exports.write_col_f64(colOffset, rowIdx, value, cap),
328
- writeColU32: (colOffset, rowIdx, value, cap = capacity) => exports.write_col_u32(colOffset, rowIdx, value, cap),
329
- writeColU8: (colOffset, rowIdx, value, cap = capacity) => exports.write_col_u8(colOffset, rowIdx, value, cap),
363
+ writeLogEntry: (systemPtr, identityPtr, traceRootPtr, entryType, cap = capacity) =>
364
+ exports.write_log_entry(systemPtr, identityPtr, traceRootPtr, entryType, cap),
330
365
 
331
366
  initTraceRoot: exports.init_trace_root,
332
367
 
333
368
  getBumpPtr: exports.get_bump_ptr,
334
369
  getAllocCount: exports.get_alloc_count,
335
370
  getFreeCount: exports.get_free_count,
336
- getSpanSystemSize: (cap = capacity) => exports.get_span_system_size(cap),
337
- getCol1BSize: (cap = capacity) => exports.get_col_1b_size(cap),
338
- getCol4BSize: (cap = capacity) => exports.get_col_4b_size(cap),
339
- getCol8BSize: (cap = capacity) => exports.get_col_8b_size(cap),
340
371
 
341
372
  readTimestamp: exports.read_timestamp,
342
373
  readEntryType: (systemPtr, rowIdx, cap = capacity) => exports.read_entry_type(systemPtr, rowIdx, cap),
@@ -384,6 +415,10 @@ function createImports(memory: WebAssembly.Memory) {
384
415
  // This eliminates recompilation cost in benchmarks and production
385
416
  let cachedWasmModule: WebAssembly.Module | null = null;
386
417
 
418
+ // The shipped Rust allocator is the only supported artifact. Node and browser loading
419
+ // deliberately share this fixed path so runtime selection cannot drift by environment.
420
+ const WASM_ARTIFACT_NAME = 'allocator.wasm';
421
+
387
422
  /**
388
423
  * Load WASM bytes - handles both Node.js and browser environments.
389
424
  */
@@ -397,7 +432,7 @@ async function loadWasmBytes(): Promise<ArrayBuffer> {
397
432
  // __dirname equivalent for ESM
398
433
  const currentFile = fileURLToPath(import.meta.url);
399
434
  const currentDir = dirname(currentFile);
400
- const wasmPath = join(currentDir, '../../../dist/allocator.wasm');
435
+ const wasmPath = join(currentDir, '../../../dist', WASM_ARTIFACT_NAME);
401
436
 
402
437
  const buffer = await readFile(wasmPath);
403
438
  // Create a proper ArrayBuffer from the Node.js Buffer
@@ -407,7 +442,7 @@ async function loadWasmBytes(): Promise<ArrayBuffer> {
407
442
  }
408
443
 
409
444
  // Browser: fetch from relative path
410
- const response = await fetch(new URL('../../../dist/allocator.wasm', import.meta.url));
445
+ const response = await fetch(new URL(`../../../dist/${WASM_ARTIFACT_NAME}`, import.meta.url));
411
446
  return response.arrayBuffer();
412
447
  }
413
448