@smoothbricks/lmao 0.2.2 → 0.3.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 (285) hide show
  1. package/README.md +206 -206
  2. package/dist/allocator.wasm +0 -0
  3. package/dist/index.d.ts +1 -0
  4. package/dist/index.d.ts.map +1 -1
  5. package/dist/index.js +1 -0
  6. package/dist/lib/JsBufferStrategy.d.ts +4 -3
  7. package/dist/lib/JsBufferStrategy.d.ts.map +1 -1
  8. package/dist/lib/JsBufferStrategy.js +18 -11
  9. package/dist/lib/arrow/lease.d.ts +10 -0
  10. package/dist/lib/arrow/lease.d.ts.map +1 -0
  11. package/dist/lib/arrow/lease.js +33 -0
  12. package/dist/lib/arrow/utils.d.ts +3 -4
  13. package/dist/lib/arrow/utils.d.ts.map +1 -1
  14. package/dist/lib/arrow/utils.js +12 -13
  15. package/dist/lib/arrow/vocabularyDictionary.d.ts +21 -0
  16. package/dist/lib/arrow/vocabularyDictionary.d.ts.map +1 -0
  17. package/dist/lib/arrow/vocabularyDictionary.js +95 -0
  18. package/dist/lib/bufferStrategy.d.ts +3 -2
  19. package/dist/lib/bufferStrategy.d.ts.map +1 -1
  20. package/dist/lib/cloudflare/traceRows.d.ts.map +1 -1
  21. package/dist/lib/cloudflare/traceRows.js +3 -2
  22. package/dist/lib/codegen/evaluatorGenerator.d.ts.map +1 -1
  23. package/dist/lib/codegen/evaluatorGenerator.js +12 -11
  24. package/dist/lib/codegen/fixedPositionWriterGenerator.d.ts +44 -82
  25. package/dist/lib/codegen/fixedPositionWriterGenerator.d.ts.map +1 -1
  26. package/dist/lib/codegen/fixedPositionWriterGenerator.js +223 -162
  27. package/dist/lib/codegen/spanLoggerClosureMaterializer.d.ts +63 -0
  28. package/dist/lib/codegen/spanLoggerClosureMaterializer.d.ts.map +1 -0
  29. package/dist/lib/codegen/spanLoggerClosureMaterializer.js +447 -0
  30. package/dist/lib/codegen/spanLoggerGenerator.d.ts +36 -19
  31. package/dist/lib/codegen/spanLoggerGenerator.d.ts.map +1 -1
  32. package/dist/lib/codegen/spanLoggerGenerator.js +164 -158
  33. package/dist/lib/convertToArrow.d.ts +7 -2
  34. package/dist/lib/convertToArrow.d.ts.map +1 -1
  35. package/dist/lib/convertToArrow.js +499 -285
  36. package/dist/lib/defineOpContext.js +1 -1
  37. package/dist/lib/enumMetadata.d.ts +19 -0
  38. package/dist/lib/enumMetadata.d.ts.map +1 -0
  39. package/dist/lib/enumMetadata.js +86 -0
  40. package/dist/lib/flushScheduler.d.ts.map +1 -1
  41. package/dist/lib/flushScheduler.js +13 -4
  42. package/dist/lib/library.d.ts +16 -98
  43. package/dist/lib/library.d.ts.map +1 -1
  44. package/dist/lib/library.js +32 -525
  45. package/dist/lib/logBinding.d.ts +21 -27
  46. package/dist/lib/logBinding.d.ts.map +1 -1
  47. package/dist/lib/op.d.ts +30 -30
  48. package/dist/lib/op.d.ts.map +1 -1
  49. package/dist/lib/op.js +15 -22
  50. package/dist/lib/opContext/createOpGroup.d.ts +1 -1
  51. package/dist/lib/opContext/createOpGroup.d.ts.map +1 -1
  52. package/dist/lib/opContext/createOpGroup.js +22 -29
  53. package/dist/lib/opContext/defineOp.d.ts +4 -4
  54. package/dist/lib/opContext/defineOp.d.ts.map +1 -1
  55. package/dist/lib/opContext/defineOp.js +53 -10
  56. package/dist/lib/opContext/opGroupTypes.d.ts +2 -2
  57. package/dist/lib/opContext/opTypes.d.ts +1 -1
  58. package/dist/lib/opContext/opTypes.d.ts.map +1 -1
  59. package/dist/lib/opContext/spanContextTypes.d.ts +33 -18
  60. package/dist/lib/opContext/spanContextTypes.d.ts.map +1 -1
  61. package/dist/lib/opContext/types.d.ts +4 -4
  62. package/dist/lib/opContext/types.d.ts.map +1 -1
  63. package/dist/lib/physicalLayoutPlan.d.ts +89 -0
  64. package/dist/lib/physicalLayoutPlan.d.ts.map +1 -0
  65. package/dist/lib/physicalLayoutPlan.js +442 -0
  66. package/dist/lib/resolveMessage.d.ts +9 -0
  67. package/dist/lib/resolveMessage.d.ts.map +1 -0
  68. package/dist/lib/resolveMessage.js +63 -0
  69. package/dist/lib/result.d.ts +5 -7
  70. package/dist/lib/result.d.ts.map +1 -1
  71. package/dist/lib/result.js +19 -26
  72. package/dist/lib/runtimeHint.d.ts +35 -0
  73. package/dist/lib/runtimeHint.d.ts.map +1 -0
  74. package/dist/lib/runtimeHint.js +79 -0
  75. package/dist/lib/schema/typeGuards.d.ts +7 -47
  76. package/dist/lib/schema/typeGuards.d.ts.map +1 -1
  77. package/dist/lib/schema/typeGuards.js +7 -123
  78. package/dist/lib/schema/types.d.ts +1 -1
  79. package/dist/lib/schema/types.d.ts.map +1 -1
  80. package/dist/lib/span-buffer/aot/v1.d.ts +2 -0
  81. package/dist/lib/span-buffer/aot/v1.d.ts.map +1 -0
  82. package/dist/lib/span-buffer/aot/v1.js +24 -0
  83. package/dist/lib/spanBuffer.d.ts +33 -4
  84. package/dist/lib/spanBuffer.d.ts.map +1 -1
  85. package/dist/lib/spanBuffer.js +583 -91
  86. package/dist/lib/spanBufferStats.d.ts +1 -1
  87. package/dist/lib/spanBufferStats.d.ts.map +1 -1
  88. package/dist/lib/spanContext.d.ts +27 -51
  89. package/dist/lib/spanContext.d.ts.map +1 -1
  90. package/dist/lib/spanContext.js +822 -344
  91. package/dist/lib/sqlite/sqlite-common.d.ts.map +1 -1
  92. package/dist/lib/sqlite/sqlite-common.js +20 -21
  93. package/dist/lib/testing/bun-harness.d.ts +8 -3
  94. package/dist/lib/testing/bun-harness.d.ts.map +1 -1
  95. package/dist/lib/testing/bun-harness.js +30 -18
  96. package/dist/lib/testing/extractFacts.d.ts +1 -1
  97. package/dist/lib/testing/extractFacts.d.ts.map +1 -1
  98. package/dist/lib/testing/extractFacts.js +55 -63
  99. package/dist/lib/testing/facts.d.ts +1 -1
  100. package/dist/lib/testing/facts.d.ts.map +1 -1
  101. package/dist/lib/testing/queryable-span.d.ts +1 -1
  102. package/dist/lib/testing/queryable-span.d.ts.map +1 -1
  103. package/dist/lib/testing/queryable-span.js +26 -28
  104. package/dist/lib/testing/span-query.d.ts.map +1 -1
  105. package/dist/lib/testing/span-query.js +19 -22
  106. package/dist/lib/testing/stdio-replay.d.ts.map +1 -1
  107. package/dist/lib/testing/stdio-replay.js +19 -8
  108. package/dist/lib/threadId.d.ts.map +1 -1
  109. package/dist/lib/threadId.js +6 -3
  110. package/dist/lib/traceContext.d.ts.map +1 -1
  111. package/dist/lib/traceContext.js +1 -4
  112. package/dist/lib/traceRoot.d.ts +30 -8
  113. package/dist/lib/traceRoot.d.ts.map +1 -1
  114. package/dist/lib/traceRoot.es.d.ts +17 -15
  115. package/dist/lib/traceRoot.es.d.ts.map +1 -1
  116. package/dist/lib/traceRoot.es.js +68 -34
  117. package/dist/lib/traceRoot.js +11 -0
  118. package/dist/lib/traceRoot.node.d.ts +17 -19
  119. package/dist/lib/traceRoot.node.d.ts.map +1 -1
  120. package/dist/lib/traceRoot.node.js +66 -38
  121. package/dist/lib/traceTopology.d.ts +42 -0
  122. package/dist/lib/traceTopology.d.ts.map +1 -0
  123. package/dist/lib/traceTopology.js +260 -0
  124. package/dist/lib/tracer.d.ts +9 -5
  125. package/dist/lib/tracer.d.ts.map +1 -1
  126. package/dist/lib/tracer.js +65 -71
  127. package/dist/lib/tracers/ArrayQueueTracer.d.ts +1 -1
  128. package/dist/lib/tracers/ArrayQueueTracer.js +1 -1
  129. package/dist/lib/tracers/StdioTracer.d.ts.map +1 -1
  130. package/dist/lib/tracers/StdioTracer.js +15 -13
  131. package/dist/lib/tracers/TestTracer.d.ts +4 -6
  132. package/dist/lib/tracers/TestTracer.d.ts.map +1 -1
  133. package/dist/lib/tracers/TestTracer.js +6 -8
  134. package/dist/lib/types.d.ts +49 -32
  135. package/dist/lib/types.d.ts.map +1 -1
  136. package/dist/lib/vocabularyRegistry.d.ts +25 -0
  137. package/dist/lib/vocabularyRegistry.d.ts.map +1 -0
  138. package/dist/lib/vocabularyRegistry.js +372 -0
  139. package/dist/lib/wasm/WasmBufferStrategy.d.ts +6 -10
  140. package/dist/lib/wasm/WasmBufferStrategy.d.ts.map +1 -1
  141. package/dist/lib/wasm/WasmBufferStrategy.js +44 -37
  142. package/dist/lib/wasm/wasmAllocator.d.ts +27 -22
  143. package/dist/lib/wasm/wasmAllocator.d.ts.map +1 -1
  144. package/dist/lib/wasm/wasmAllocator.js +66 -44
  145. package/dist/lib/wasm/wasmPhysicalLayout.d.ts +67 -0
  146. package/dist/lib/wasm/wasmPhysicalLayout.d.ts.map +1 -0
  147. package/dist/lib/wasm/wasmPhysicalLayout.js +179 -0
  148. package/dist/lib/wasm/wasmSpanBuffer.d.ts +79 -31
  149. package/dist/lib/wasm/wasmSpanBuffer.d.ts.map +1 -1
  150. package/dist/lib/wasm/wasmSpanBuffer.js +442 -272
  151. package/dist/lib/wasm/wasmTraceRoot.d.ts +24 -22
  152. package/dist/lib/wasm/wasmTraceRoot.d.ts.map +1 -1
  153. package/dist/lib/wasm/wasmTraceRoot.js +110 -71
  154. package/dist/vocabulary/register/v1.d.ts +2 -0
  155. package/dist/vocabulary/register/v1.d.ts.map +1 -0
  156. package/dist/vocabulary/register/v1.js +1 -0
  157. package/dist/wasm.d.ts +5 -0
  158. package/dist/wasm.d.ts.map +1 -0
  159. package/dist/wasm.js +4 -0
  160. package/package.json +54 -6
  161. package/src/index.ts +1 -0
  162. package/src/lib/JsBufferStrategy.ts +27 -9
  163. package/src/lib/__tests__/arrow-builder-integration/arrow-conversion.test.ts +335 -37
  164. package/src/lib/__tests__/arrow-builder-integration/binary-arrow-conversion.test.ts +97 -26
  165. package/src/lib/__tests__/arrow-builder-integration/binary-comparison.test.ts +75 -15
  166. package/src/lib/__tests__/arrow-builder-integration/binary-format-compliance.test.ts +30 -6
  167. package/src/lib/__tests__/arrow-builder-integration/buffer-chaining.test.ts +18 -21
  168. package/src/lib/__tests__/arrow-builder-integration/foundation.test.ts +5 -2
  169. package/src/lib/__tests__/arrow-builder-integration/integration.test.ts +25 -7
  170. package/src/lib/__tests__/arrow-builder-integration/lazy-columns.test.ts +3 -2
  171. package/src/lib/__tests__/buffer-overflow.test.ts +24 -18
  172. package/src/lib/__tests__/capability-span-context.test.ts +505 -0
  173. package/src/lib/__tests__/capacity-tuning.test.ts +5 -3
  174. package/src/lib/__tests__/eager-columns.test.ts +345 -0
  175. package/src/lib/__tests__/enum-metadata-aot.test.ts +153 -0
  176. package/src/lib/__tests__/enum-metadata.test.ts +177 -0
  177. package/src/lib/__tests__/fixtures/empty-vocabulary-runtime.fixture.ts +15 -0
  178. package/src/lib/__tests__/flushScheduler.test.ts +5 -1
  179. package/src/lib/__tests__/identity-view.property.test.ts +179 -0
  180. package/src/lib/__tests__/library.test.ts +19 -235
  181. package/src/lib/__tests__/message-buffer-families.test.ts +878 -0
  182. package/src/lib/__tests__/nested-library-tasks.test.ts +14 -15
  183. package/src/lib/__tests__/op-metadata.test.ts +1 -1
  184. package/src/lib/__tests__/op-type-safety.test.ts +5 -16
  185. package/src/lib/__tests__/physical-layout-plan.test.ts +333 -0
  186. package/src/lib/__tests__/remap-descriptor-integration.test.ts +381 -0
  187. package/src/lib/__tests__/root-context-construction.test.ts +414 -0
  188. package/src/lib/__tests__/span-auto-runtime.test.ts +386 -0
  189. package/src/lib/__tests__/span-buffer-segment-stats.test.ts +221 -0
  190. package/src/lib/__tests__/span-lifecycle.test.ts +53 -25
  191. package/src/lib/__tests__/spanbuffer-materializer-parity.test.ts +266 -0
  192. package/src/lib/__tests__/sync-async-trace.test.ts +24 -23
  193. package/src/lib/__tests__/tag-writer-aot.test.ts +214 -0
  194. package/src/lib/__tests__/test-helpers.ts +67 -12
  195. package/src/lib/__tests__/threadId.test.ts +62 -0
  196. package/src/lib/__tests__/timestamp.test.ts +221 -93
  197. package/src/lib/__tests__/traceTopology.property.test.ts +383 -0
  198. package/src/lib/__tests__/type-narrowing.test.ts +63 -0
  199. package/src/lib/__tests__/vocabulary-dense-decoding.test.ts +405 -0
  200. package/src/lib/__tests__/vocabularyRegistry.test.ts +313 -0
  201. package/src/lib/arrow/lease.ts +43 -0
  202. package/src/lib/arrow/utils.ts +10 -14
  203. package/src/lib/arrow/vocabularyDictionary.ts +123 -0
  204. package/src/lib/bufferStrategy.ts +9 -1
  205. package/src/lib/cloudflare/traceRows.ts +3 -2
  206. package/src/lib/codegen/__tests__/evaluatorGenerator.test.ts +21 -141
  207. package/src/lib/codegen/__tests__/fixedPositionWriter-parity.test.ts +273 -0
  208. package/src/lib/codegen/__tests__/fixedPositionWriter-uint64.test.ts +61 -34
  209. package/src/lib/codegen/__tests__/nullBitmap.test.ts +33 -37
  210. package/src/lib/codegen/__tests__/spanLoggerGenerator.test.ts +34 -18
  211. package/src/lib/codegen/__tests__/spanLoggerMaterializerParity.test.ts +503 -0
  212. package/src/lib/codegen/evaluatorGenerator.ts +18 -13
  213. package/src/lib/codegen/fixedPositionWriterGenerator.ts +329 -245
  214. package/src/lib/codegen/spanLoggerClosureMaterializer.ts +598 -0
  215. package/src/lib/codegen/spanLoggerGenerator.ts +241 -177
  216. package/src/lib/convertToArrow.ts +598 -311
  217. package/src/lib/defineOpContext.ts +1 -1
  218. package/src/lib/enumMetadata.ts +121 -0
  219. package/src/lib/flushScheduler.ts +11 -5
  220. package/src/lib/library.ts +37 -595
  221. package/src/lib/logBinding.ts +21 -27
  222. package/src/lib/op.ts +75 -18
  223. package/src/lib/opContext/__tests__/retry.test.ts +27 -21
  224. package/src/lib/opContext/createOpGroup.ts +33 -31
  225. package/src/lib/opContext/defineOp.ts +88 -11
  226. package/src/lib/opContext/opGroupTypes.ts +2 -2
  227. package/src/lib/opContext/opTypes.ts +1 -1
  228. package/src/lib/opContext/spanContextTypes.ts +122 -24
  229. package/src/lib/opContext/types.ts +7 -3
  230. package/src/lib/physicalLayoutPlan.ts +598 -0
  231. package/src/lib/resolveMessage.ts +67 -0
  232. package/src/lib/result.ts +20 -33
  233. package/src/lib/runtimeHint.ts +98 -0
  234. package/src/lib/schema/__tests__/featureFlags.test.ts +2 -1
  235. package/src/lib/schema/builder.ts +1 -1
  236. package/src/lib/schema/typeGuards.ts +7 -151
  237. package/src/lib/schema/types.ts +1 -1
  238. package/src/lib/span-buffer/aot/v1.ts +26 -0
  239. package/src/lib/spanBuffer.ts +658 -92
  240. package/src/lib/spanBufferStats.ts +1 -1
  241. package/src/lib/spanContext.ts +1350 -861
  242. package/src/lib/sqlite/sqlite-common.ts +20 -31
  243. package/src/lib/testing/__tests__/topology-traversal.test.ts +174 -0
  244. package/src/lib/testing/__tests__/vitest-harness.test.ts +2 -1
  245. package/src/lib/testing/bun-harness.ts +94 -43
  246. package/src/lib/testing/extractFacts.ts +64 -78
  247. package/src/lib/testing/facts.ts +1 -1
  248. package/src/lib/testing/queryable-span.ts +23 -30
  249. package/src/lib/testing/span-query.ts +16 -20
  250. package/src/lib/testing/stdio-replay.ts +25 -8
  251. package/src/lib/testing/vitest-harness.ts +1 -1
  252. package/src/lib/threadId.ts +6 -3
  253. package/src/lib/traceContext.ts +1 -6
  254. package/src/lib/traceRoot.es.ts +77 -42
  255. package/src/lib/traceRoot.node.ts +75 -46
  256. package/src/lib/traceRoot.ts +41 -14
  257. package/src/lib/traceTopology.ts +279 -0
  258. package/src/lib/tracer.ts +109 -98
  259. package/src/lib/tracers/ArrayQueueTracer.ts +1 -1
  260. package/src/lib/tracers/StdioTracer.ts +15 -13
  261. package/src/lib/tracers/TestTracer.ts +6 -8
  262. package/src/lib/tracers/__tests__/ArrayQueueTracer.test.ts +15 -10
  263. package/src/lib/tracers/__tests__/CompositeTracer.test.ts +150 -0
  264. package/src/lib/tracers/__tests__/TestTracer.test.ts +23 -13
  265. package/src/lib/types.ts +64 -33
  266. package/src/lib/vocabularyRegistry.ts +439 -0
  267. package/src/lib/wasm/WasmBufferStrategy.ts +56 -48
  268. package/src/lib/wasm/__tests__/WasmBufferStrategy.test.ts +215 -11
  269. package/src/lib/wasm/__tests__/allocatorFreeBlockClamp.test.ts +86 -0
  270. package/src/lib/wasm/__tests__/wasm-identity-view.test.ts +311 -0
  271. package/src/lib/wasm/__tests__/wasm-integration.test.ts +417 -44
  272. package/src/lib/wasm/__tests__/wasm-message-buffer-families.test.ts +588 -0
  273. package/src/lib/wasm/__tests__/wasmAllocator.test.ts +100 -668
  274. package/src/lib/wasm/__tests__/wasmSpanBuffer.test.ts +419 -63
  275. package/src/lib/wasm/__tests__/wasmTraceRoot.test.ts +24 -29
  276. package/src/lib/wasm/__tests__/wasmTracer.test.ts.disabled +2 -2
  277. package/src/lib/wasm/wasmAllocator.ts +131 -96
  278. package/src/lib/wasm/wasmPhysicalLayout.ts +309 -0
  279. package/src/lib/wasm/wasmSpanBuffer.ts +597 -341
  280. package/src/lib/wasm/wasmTraceRoot.ts +140 -78
  281. package/src/vocabulary/register/v1.ts +1 -0
  282. package/src/wasm.ts +19 -0
  283. package/src/lib/__tests__/remapped-buffer-view-integration.test.ts +0 -319
  284. package/src/lib/__tests__/remapped-buffer-view.test.ts +0 -635
  285. package/src/lib/wasm/allocator.zig +0 -948
@@ -0,0 +1,279 @@
1
+ import type { RemapDescriptor } from './logBinding.js';
2
+ import type { LogSchema } from './schema/LogSchema.js';
3
+ import type { AnySpanBuffer, SpanBuffer } from './types.js';
4
+
5
+ export const NO_NODE = 0xffff_ffff;
6
+ const INITIAL_CAPACITY = 8;
7
+ const MAX_NODE_COUNT = NO_NODE;
8
+
9
+ export type SpanTreeVisitor = (buffer: AnySpanBuffer, remapDescriptor: RemapDescriptor | undefined) => void;
10
+
11
+ /** Trace-owned O(1) span topology arena. Overflow segments share their logical node. */
12
+ export class TraceTopology {
13
+ buffers: Array<AnySpanBuffer | undefined> = new Array(INITIAL_CAPACITY);
14
+ firstChild = new Uint32Array(INITIAL_CAPACITY);
15
+ lastChild = new Uint32Array(INITIAL_CAPACITY);
16
+ nextSibling = new Uint32Array(INITIAL_CAPACITY);
17
+ count = 0;
18
+ root = NO_NODE;
19
+ generation = 1;
20
+ private activeLeases = 0;
21
+ private releasePending = false;
22
+ private pendingRelease: (() => void) | undefined;
23
+
24
+ constructor() {
25
+ this.firstChild.fill(NO_NODE);
26
+ this.lastChild.fill(NO_NODE);
27
+ this.nextSibling.fill(NO_NODE);
28
+ }
29
+
30
+ registerRoot(buffer: AnySpanBuffer): number {
31
+ if (this.count !== 0 || this.root !== NO_NODE) throw new Error('Trace topology root is already registered');
32
+ const index = this.register(buffer);
33
+ if (index !== 0) throw new Error('Trace topology root must have index 0');
34
+ this.root = index;
35
+ return index;
36
+ }
37
+
38
+ registerChild(parent: AnySpanBuffer, child: AnySpanBuffer): number {
39
+ this.assertLive(parent);
40
+ const parentIndex = parent._nodeIndex;
41
+ const childIndex = this.register(child);
42
+ const previous = this.lastChild[parentIndex];
43
+ if (previous === NO_NODE) {
44
+ this.firstChild[parentIndex] = childIndex;
45
+ } else {
46
+ this.nextSibling[previous] = childIndex;
47
+ }
48
+ this.lastChild[parentIndex] = childIndex;
49
+ return childIndex;
50
+ }
51
+
52
+ adoptOverflow(logicalBuffer: AnySpanBuffer, overflow: AnySpanBuffer): void {
53
+ this.assertLive(logicalBuffer);
54
+ overflow._nodeIndex = logicalBuffer._nodeIndex;
55
+ overflow._topologyGeneration = this.generation;
56
+ }
57
+
58
+ assertLive(buffer: AnySpanBuffer): void {
59
+ if (
60
+ this.releasePending ||
61
+ buffer._traceRoot._topology !== this ||
62
+ buffer._topologyGeneration !== this.generation ||
63
+ buffer._nodeIndex >= this.count ||
64
+ this.buffers[buffer._nodeIndex] === undefined
65
+ ) {
66
+ throw new Error('Span buffer topology handle is stale');
67
+ }
68
+ }
69
+
70
+ /** Pin this topology generation until the returned idempotent release runs. */
71
+ acquireLease(): () => void {
72
+ if (this.releasePending || this.count === 0 || this.root === NO_NODE) {
73
+ throw new Error('Cannot lease a released span topology');
74
+ }
75
+ this.activeLeases++;
76
+ let released = false;
77
+ return () => {
78
+ if (released) return;
79
+ released = true;
80
+ this.activeLeases--;
81
+ if (this.activeLeases === 0 && this.releasePending) this.finishRelease();
82
+ };
83
+ }
84
+
85
+ get leaseCount(): number {
86
+ return this.activeLeases;
87
+ }
88
+
89
+ release(finalizer?: () => void): void {
90
+ if (this.releasePending) throw new Error('Span buffer topology release is already pending');
91
+ if (this.activeLeases !== 0) {
92
+ this.releasePending = true;
93
+ this.pendingRelease = finalizer;
94
+ return;
95
+ }
96
+ finalizer?.();
97
+ this.clearReleasedTopology();
98
+ }
99
+
100
+ private finishRelease(): void {
101
+ const finalizer = this.pendingRelease;
102
+ this.pendingRelease = undefined;
103
+ finalizer?.();
104
+ this.clearReleasedTopology();
105
+ }
106
+
107
+ private clearReleasedTopology(): void {
108
+ this.releasePending = false;
109
+ for (let index = 0; index < this.count; index++) this.buffers[index] = undefined;
110
+ this.firstChild.fill(NO_NODE);
111
+ this.lastChild.fill(NO_NODE);
112
+ this.nextSibling.fill(NO_NODE);
113
+ this.count = 0;
114
+ this.root = NO_NODE;
115
+ this.generation++;
116
+ if (this.generation === 0) this.generation = 1;
117
+ }
118
+
119
+ private register(buffer: AnySpanBuffer): number {
120
+ if (this.count === MAX_NODE_COUNT) throw new RangeError('Trace topology node limit exceeded');
121
+ if (this.count === this.buffers.length) this.grow();
122
+ const index = this.count++;
123
+ this.buffers[index] = buffer;
124
+ buffer._nodeIndex = index;
125
+ buffer._topologyGeneration = this.generation;
126
+ return index;
127
+ }
128
+
129
+ private grow(): void {
130
+ const current = this.buffers.length;
131
+ const next = current * 2;
132
+ if (!Number.isSafeInteger(next) || next > MAX_NODE_COUNT) throw new RangeError('Trace topology capacity overflow');
133
+
134
+ this.buffers.length = next;
135
+ const firstChild = new Uint32Array(next);
136
+ const lastChild = new Uint32Array(next);
137
+ const nextSibling = new Uint32Array(next);
138
+ firstChild.fill(NO_NODE);
139
+ lastChild.fill(NO_NODE);
140
+ nextSibling.fill(NO_NODE);
141
+ firstChild.set(this.firstChild);
142
+ lastChild.set(this.lastChild);
143
+ nextSibling.set(this.nextSibling);
144
+ this.firstChild = firstChild;
145
+ this.lastChild = lastChild;
146
+ this.nextSibling = nextSibling;
147
+ }
148
+ }
149
+
150
+ /** Allocation-free iterative preorder: logical node overflow chain, then children in insertion order. */
151
+ export function walkSpanTree(root: AnySpanBuffer, visitor: SpanTreeVisitor): void {
152
+ const topology = root._traceRoot._topology;
153
+ topology.assertLive(root);
154
+ const subtreeRoot = root._nodeIndex;
155
+ let nodeIndex = subtreeRoot;
156
+
157
+ for (;;) {
158
+ const logical = topology.buffers[nodeIndex];
159
+ if (!logical) throw new Error('Trace topology references a released span buffer');
160
+ let segment: AnySpanBuffer | undefined = logical;
161
+ while (segment) {
162
+ visitor(segment, logical._remapDescriptor);
163
+ segment = segment._overflow;
164
+ }
165
+
166
+ const child = topology.firstChild[nodeIndex];
167
+ if (child !== NO_NODE) {
168
+ nodeIndex = child;
169
+ continue;
170
+ }
171
+
172
+ for (;;) {
173
+ if (nodeIndex === subtreeRoot) return;
174
+ const sibling = topology.nextSibling[nodeIndex];
175
+ if (sibling !== NO_NODE) {
176
+ nodeIndex = sibling;
177
+ break;
178
+ }
179
+ const current = topology.buffers[nodeIndex];
180
+ if (!current?._parent) throw new Error('Trace topology parent link is missing');
181
+ nodeIndex = current._parent._nodeIndex;
182
+ }
183
+ }
184
+ }
185
+ /** Allocation-free logical-tree depth-first walk with balanced enter/leave callbacks. */
186
+ export function walkLogicalSpanTree(
187
+ root: AnySpanBuffer,
188
+ enter: (buffer: AnySpanBuffer) => void,
189
+ leave: (buffer: AnySpanBuffer) => void,
190
+ ): void {
191
+ const topology = root._traceRoot._topology;
192
+ topology.assertLive(root);
193
+ const subtreeRoot = root._nodeIndex;
194
+ let nodeIndex = subtreeRoot;
195
+ let logical = topology.buffers[nodeIndex];
196
+ if (!logical) throw new Error('Trace topology references a released span buffer');
197
+ enter(logical);
198
+
199
+ for (;;) {
200
+ const child = topology.firstChild[nodeIndex];
201
+ if (child !== NO_NODE) {
202
+ nodeIndex = child;
203
+ logical = topology.buffers[nodeIndex];
204
+ if (!logical) throw new Error('Trace topology references a released span buffer');
205
+ enter(logical);
206
+ continue;
207
+ }
208
+
209
+ for (;;) {
210
+ logical = topology.buffers[nodeIndex];
211
+ if (!logical) throw new Error('Trace topology references a released span buffer');
212
+ leave(logical);
213
+ if (nodeIndex === subtreeRoot) return;
214
+ const sibling = topology.nextSibling[nodeIndex];
215
+ if (sibling !== NO_NODE) {
216
+ nodeIndex = sibling;
217
+ logical = topology.buffers[nodeIndex];
218
+ if (!logical) throw new Error('Trace topology references a released span buffer');
219
+ enter(logical);
220
+ break;
221
+ }
222
+ if (!logical._parent) throw new Error('Trace topology parent link is missing');
223
+ nodeIndex = logical._parent._nodeIndex;
224
+ }
225
+ }
226
+ }
227
+
228
+ /** Iterate logical child buffers without materializing a child array. */
229
+ export function iterateSpanChildren<T extends LogSchema>(root: SpanBuffer<T>): Generator<SpanBuffer<T>>;
230
+ export function iterateSpanChildren(root: AnySpanBuffer): Generator<AnySpanBuffer>;
231
+ export function* iterateSpanChildren(root: AnySpanBuffer): Generator<AnySpanBuffer> {
232
+ const topology = root._traceRoot._topology;
233
+ topology.assertLive(root);
234
+ let child = topology.firstChild[root._nodeIndex];
235
+ while (child !== NO_NODE) {
236
+ const buffer = topology.buffers[child];
237
+ if (!buffer) throw new Error('Trace topology references a released span buffer');
238
+ yield buffer;
239
+ child = topology.nextSibling[child];
240
+ }
241
+ }
242
+
243
+ /** Iterate physical buffers in canonical preorder without recursion or temporary arrays. */
244
+ export function iterateSpanTree<T extends LogSchema>(root: SpanBuffer<T>): Generator<SpanBuffer<T>>;
245
+ export function iterateSpanTree(root: AnySpanBuffer): Generator<AnySpanBuffer>;
246
+ export function* iterateSpanTree(root: AnySpanBuffer): Generator<AnySpanBuffer> {
247
+ const topology = root._traceRoot._topology;
248
+ topology.assertLive(root);
249
+ const subtreeRoot = root._nodeIndex;
250
+ let nodeIndex = subtreeRoot;
251
+
252
+ for (;;) {
253
+ const logical = topology.buffers[nodeIndex];
254
+ if (!logical) throw new Error('Trace topology references a released span buffer');
255
+ let segment: AnySpanBuffer | undefined = logical;
256
+ while (segment) {
257
+ yield segment;
258
+ segment = segment._overflow;
259
+ }
260
+
261
+ const child = topology.firstChild[nodeIndex];
262
+ if (child !== NO_NODE) {
263
+ nodeIndex = child;
264
+ continue;
265
+ }
266
+
267
+ for (;;) {
268
+ if (nodeIndex === subtreeRoot) return;
269
+ const sibling = topology.nextSibling[nodeIndex];
270
+ if (sibling !== NO_NODE) {
271
+ nodeIndex = sibling;
272
+ break;
273
+ }
274
+ const current = topology.buffers[nodeIndex];
275
+ if (!current?._parent) throw new Error('Trace topology parent link is missing');
276
+ nodeIndex = current._parent._nodeIndex;
277
+ }
278
+ }
279
+ }