@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
@@ -7,6 +7,7 @@ import { describe, expect, it } from 'bun:test';
7
7
  import { Nanoseconds } from '@smoothbricks/arrow-builder';
8
8
  import { convertSpanTreeToArrowTable } from '../convertToArrow.js';
9
9
  import { defineOpContext } from '../defineOpContext.js';
10
+ import { resolveEntryType, resolveMessage } from '../resolveMessage.js';
10
11
  import { defineCodeError } from '../result.js';
11
12
  import { S } from '../schema/builder.js';
12
13
  import { defineLogSchema } from '../schema/defineLogSchema.js';
@@ -135,12 +136,13 @@ describe('Span Lifecycle', () => {
135
136
 
136
137
  it('should support spanSync for synchronous child spans', async () => {
137
138
  const tracer = new TestTracer(ctx, { ...createTestTracerOptions() });
139
+ const childOp = ctx.defineOp('sync-child-op', (childCtx) => {
140
+ childCtx.tag.spanName('sync-child');
141
+ return childCtx.ok('child-ok');
142
+ });
138
143
 
139
144
  const result = await tracer.trace('root-task', async (rootCtx) => {
140
- const childResult = rootCtx.spanSync('sync-child', (childCtx) => {
141
- childCtx.tag.spanName('sync-child');
142
- return childCtx.ok('child-ok');
143
- });
145
+ const childResult = rootCtx.spanSync('sync-child', childOp);
144
146
 
145
147
  expect(childResult).not.toBeInstanceOf(Promise);
146
148
  expect(childResult.success).toBe(true);
@@ -496,8 +498,8 @@ describe('Fixed Row Layout', () => {
496
498
 
497
499
  expect(result.success).toBe(true);
498
500
  expect(capturedBuffer).toBeDefined();
499
- expect(capturedBuffer?.entry_type[0]).toBe(ENTRY_TYPE_SPAN_START);
500
- expect(capturedBuffer?.entry_type[1]).toBe(ENTRY_TYPE_SPAN_OK);
501
+ expect(capturedBuffer ? resolveEntryType(capturedBuffer, 0) : undefined).toBe(ENTRY_TYPE_SPAN_START);
502
+ expect(capturedBuffer ? resolveEntryType(capturedBuffer, 1) : undefined).toBe(ENTRY_TYPE_SPAN_OK);
501
503
  });
502
504
 
503
505
  it('should have span-start at row 0 and span-err at row 1 after ctx.err()', async () => {
@@ -511,8 +513,8 @@ describe('Fixed Row Layout', () => {
511
513
 
512
514
  expect(result.success).toBe(false);
513
515
  expect(capturedBuffer).toBeDefined();
514
- expect(capturedBuffer?.entry_type[0]).toBe(ENTRY_TYPE_SPAN_START);
515
- expect(capturedBuffer?.entry_type[1]).toBe(ENTRY_TYPE_SPAN_ERR);
516
+ expect(capturedBuffer ? resolveEntryType(capturedBuffer, 0) : undefined).toBe(ENTRY_TYPE_SPAN_START);
517
+ expect(capturedBuffer ? resolveEntryType(capturedBuffer, 1) : undefined).toBe(ENTRY_TYPE_SPAN_ERR);
516
518
  });
517
519
 
518
520
  it('should write ok fluent result attributes directly to row 1', async () => {
@@ -529,7 +531,7 @@ describe('Fixed Row Layout', () => {
529
531
  throw new Error('capturedBuffer is undefined');
530
532
  }
531
533
 
532
- expect(capturedBuffer.message_values[1]).toBe('completed');
534
+ expect(resolveMessage(capturedBuffer, 1)).toBe('completed');
533
535
  expect(capturedBuffer.userId_values[1]).toBe('user-1');
534
536
  expect(capturedBuffer.operation_values[1]).toBe(0);
535
537
  expect(capturedBuffer.line_values[1]).toBe(42);
@@ -553,7 +555,7 @@ describe('Fixed Row Layout', () => {
553
555
  throw new Error('capturedBuffer is undefined');
554
556
  }
555
557
 
556
- expect(capturedBuffer.message_values[1]).toBe('failed');
558
+ expect(resolveMessage(capturedBuffer, 1)).toBe('failed');
557
559
  expect(capturedBuffer.userId_values[1]).toBe('user-2');
558
560
  expect(capturedBuffer.error_code_values[1]).toBe('VALIDATION_ERROR');
559
561
  expect(capturedBuffer.line_values[1]).toBe(99);
@@ -571,8 +573,8 @@ describe('Fixed Row Layout', () => {
571
573
  }),
572
574
  ).rejects.toThrow('Unexpected failure');
573
575
  expect(capturedBuffer).toBeDefined();
574
- expect(capturedBuffer?.entry_type[0]).toBe(ENTRY_TYPE_SPAN_START);
575
- expect(capturedBuffer?.entry_type[1]).toBe(ENTRY_TYPE_SPAN_EXCEPTION);
576
+ expect(capturedBuffer ? resolveEntryType(capturedBuffer, 0) : undefined).toBe(ENTRY_TYPE_SPAN_START);
577
+ expect(capturedBuffer ? resolveEntryType(capturedBuffer, 1) : undefined).toBe(ENTRY_TYPE_SPAN_EXCEPTION);
576
578
  });
577
579
 
578
580
  it('should start writeIndex at 2 after span-start is written', async () => {
@@ -660,21 +662,47 @@ describe('Fixed Row Layout', () => {
660
662
  expect(buffer._spanStartTime).toBe(Nanoseconds.unsafe(111n));
661
663
  });
662
664
 
663
- it('should expose _lastLoggedTime across overflow chain', () => {
664
- const opMetadata = createTestOpMetadata();
665
- const buffer = createSpanBuffer(testSchema, createTestTraceRoot('test-trace'), opMetadata, 4);
665
+ it('preserves strict chronological timestamps across root overflow and a child span', async () => {
666
+ let rootBuffer: AnySpanBuffer | undefined;
667
+ let childBuffer: AnySpanBuffer | undefined;
668
+ const { trace } = new TestTracer(ctx, { ...createTestTracerOptions() });
666
669
 
667
- buffer._writeIndex = 4;
668
- buffer.timestamp[0] = 100n;
669
- buffer.timestamp[1] = 200n;
670
- buffer.timestamp[2] = 300n;
671
- buffer.timestamp[3] = 400n;
670
+ await trace('timestamp-order-root', async (root) => {
671
+ rootBuffer = root.buffer;
672
+ for (let i = 0; i < 100; i++) root.log.info(`root-${i}`);
673
+ await root.span('timestamp-order-child', async (child) => {
674
+ childBuffer = child.buffer;
675
+ for (let i = 0; i < 100; i++) child.log.info(`child-${i}`);
676
+ return child.ok('child done');
677
+ });
678
+ return root.ok('root done');
679
+ });
672
680
 
673
- const overflow = buffer.getOrCreateOverflow();
674
- overflow._writeIndex = 2;
675
- overflow.timestamp[0] = 500n;
676
- overflow.timestamp[1] = 600n;
681
+ if (!rootBuffer || !childBuffer) throw new Error('trace did not expose both lifecycle buffers');
682
+ expect(rootBuffer._overflow).toBeDefined();
683
+ expect(childBuffer._overflow).toBeDefined();
684
+
685
+ const chronological: bigint[] = [rootBuffer.timestamp[0]];
686
+ let segment: AnySpanBuffer | undefined = rootBuffer;
687
+ let first = true;
688
+ while (segment) {
689
+ for (let row = first ? 2 : 0; row < segment._writeIndex; row++) chronological.push(segment.timestamp[row]);
690
+ first = false;
691
+ segment = segment._overflow;
692
+ }
693
+ chronological.push(childBuffer.timestamp[0]);
694
+ segment = childBuffer;
695
+ first = true;
696
+ while (segment) {
697
+ for (let row = first ? 2 : 0; row < segment._writeIndex; row++) chronological.push(segment.timestamp[row]);
698
+ first = false;
699
+ segment = segment._overflow;
700
+ }
701
+ chronological.push(childBuffer.timestamp[1], rootBuffer.timestamp[1]);
677
702
 
678
- expect(buffer._lastLoggedTime).toBe(Nanoseconds.unsafe(600n));
703
+ expect(chronological).toHaveLength(204);
704
+ for (let i = 1; i < chronological.length; i++) {
705
+ expect(chronological[i]).toBeGreaterThan(chronological[i - 1]);
706
+ }
679
707
  });
680
708
  });
@@ -0,0 +1,266 @@
1
+ /**
2
+ * Parity suite: SpanBuffer classes built by arrow-builder's compiled
3
+ * (new Function) materializer versus the closure-composed (no-eval)
4
+ * materializer MUST be byte-identical in observable behavior. The closure
5
+ * path — driven by the closureInit/closureMethods extension counterparts in
6
+ * spanBuffer.ts — is what production workerd runs, so any divergence here is
7
+ * a production bug.
8
+ *
9
+ * Non-deterministic state is normalized: span_id bytes inside _identity
10
+ * (global counter), thread id (compared for equality of layout, not value —
11
+ * it IS process-stable so compared directly), wall-clock timestamps are
12
+ * written explicitly so lanes stay deterministic.
13
+ */
14
+
15
+ import { afterEach, describe, expect, it } from 'bun:test';
16
+ import { type MaterializerMode, setMaterializerModeOverride } from '@smoothbricks/arrow-builder';
17
+ import { createOpMetadata } from '../opContext/defineOp.js';
18
+ import type { MessageLayoutFamily, MessagePhysicalLayout } from '../runtimeHint.js';
19
+ import { S } from '../schema/builder.js';
20
+ import { LogSchema } from '../schema/LogSchema.js';
21
+ import { mergeWithSystemSchema } from '../schema/systemSchema.js';
22
+ import { createChildSpanBuffer, createOverflowBuffer, createSpanBuffer, getSpanBufferClass } from '../spanBuffer.js';
23
+ import type { AnySpanBuffer } from '../types.js';
24
+ import { createTestTraceRoot } from './test-helpers.js';
25
+
26
+ afterEach(() => {
27
+ setMaterializerModeOverride(undefined);
28
+ });
29
+
30
+ function withMode<T>(mode: MaterializerMode, fn: () => T): T {
31
+ setMaterializerModeOverride(mode);
32
+ try {
33
+ return fn();
34
+ } finally {
35
+ setMaterializerModeOverride(undefined);
36
+ }
37
+ }
38
+
39
+ const OP_METADATA = createOpMetadata('parity-op', '@test/parity', 'parity.test.ts', 'deadbeef', 7);
40
+
41
+ const FAMILIES: readonly MessageLayoutFamily[] = ['mixed', 'static-only', 'dynamic-only'];
42
+ const PHYSICALS: readonly MessagePhysicalLayout[] = ['current', 'specialized', 'packed'];
43
+
44
+ function makeSchema(): LogSchema {
45
+ return new LogSchema(
46
+ mergeWithSystemSchema({
47
+ userId: S.category(),
48
+ operation: S.enum(['SELECT', 'INSERT', 'UPDATE', 'DELETE']),
49
+ duration: S.number(),
50
+ success: S.boolean(),
51
+ }),
52
+ );
53
+ }
54
+
55
+ function callMethod(target: object, name: string, ...args: unknown[]): unknown {
56
+ const method = Reflect.get(target, name);
57
+ if (typeof method !== 'function') throw new Error(`Missing method: ${name}`);
58
+ return Reflect.apply(method, target, args);
59
+ }
60
+
61
+ /** Deterministic write script driving generated setters and system lanes. */
62
+ function fillBuffer(buffer: AnySpanBuffer): void {
63
+ callMethod(buffer, 'message', 0, 'span-name');
64
+ if (buffer._messageLayoutFamily === 'static-only') callMethod(buffer, 'message', 1, 'terminal');
65
+ else callMethod(buffer, 'message', 2, 'log-entry');
66
+ buffer.timestamp[0] = 1000n;
67
+ buffer.timestamp[2] = 2000n;
68
+ if (buffer.entry_type) buffer.entry_type[2] = 5;
69
+ if (buffer._rowHeaders) buffer._rowHeaders[2] = (7 << 8) | 5;
70
+ if (buffer._messageIds) buffer._messageIds[2] = 3;
71
+ if (buffer._logHeaders) buffer._logHeaders[2] = 9;
72
+ callMethod(buffer, 'userId', 2, 'alice');
73
+ callMethod(buffer, 'userId', 3, 'bob');
74
+ callMethod(buffer, 'operation', 2, 1);
75
+ callMethod(buffer, 'duration', 2, 12.5);
76
+ callMethod(buffer, 'success', 2, true);
77
+ callMethod(buffer, 'success', 3, false);
78
+ callMethod(buffer, 'duration', 3, null);
79
+ callMethod(buffer, 'line', 2, 42);
80
+ callMethod(buffer, 'uint64_value', 2, 99n);
81
+ buffer._writeIndex = 4;
82
+ }
83
+
84
+ function snapshotTypedArray(view: unknown): unknown {
85
+ if (view === undefined || view === null) return view;
86
+ if (ArrayBuffer.isView(view) && !(view instanceof DataView)) {
87
+ return {
88
+ ctor: view.constructor.name,
89
+ bytes: Array.from(new Uint8Array(view.buffer, view.byteOffset, view.byteLength)),
90
+ };
91
+ }
92
+ return { unexpected: String(view) };
93
+ }
94
+
95
+ const SCHEMA_COLUMNS = ['userId', 'operation', 'duration', 'success', 'line', 'uint64_value', 'error_code'] as const;
96
+
97
+ /** Normalized observable state; span-id bytes in _identity are zeroed (global counter). */
98
+ function snapshotBuffer(buffer: AnySpanBuffer): Record<string, unknown> {
99
+ const identity = Array.from(buffer._identity);
100
+ for (let i = 8; i < 12 && i < identity.length; i++) identity[i] = 0;
101
+ const snapshot: Record<string, unknown> = {
102
+ capacity: buffer._capacity,
103
+ writeIndex: buffer._writeIndex,
104
+ identity,
105
+ threadId: buffer.thread_id,
106
+ traceId: buffer.trace_id,
107
+ spanStartTime: buffer._spanStartTime,
108
+ lastLoggedTime: buffer._lastLoggedTime,
109
+ hasParent: Reflect.get(buffer, '_hasParent'),
110
+ parentThreadId: buffer.parent_thread_id,
111
+ statsSealed: buffer._statsSealed,
112
+ statsReservedRows: buffer._statsReservedRows,
113
+ scopeValues: buffer._scopeValues,
114
+ spanName: buffer._spanName,
115
+ terminalMessage: buffer._terminalMessage,
116
+ messageValues: buffer.message_values ? [...buffer.message_values] : undefined,
117
+ timestamp: snapshotTypedArray(buffer.timestamp),
118
+ entryType: snapshotTypedArray(buffer.entry_type),
119
+ messageIds: snapshotTypedArray(buffer._messageIds),
120
+ logHeaders: snapshotTypedArray(buffer._logHeaders),
121
+ rowHeaders: snapshotTypedArray(buffer._rowHeaders),
122
+ systemByteLength: buffer._system.byteLength,
123
+ };
124
+ for (const column of SCHEMA_COLUMNS) {
125
+ const values = buffer.getColumnIfAllocated(column);
126
+ const nulls = buffer.getNullsIfAllocated(column);
127
+ snapshot[`${column}.values`] = Array.isArray(values) ? [...values] : snapshotTypedArray(values);
128
+ snapshot[`${column}.nulls`] = nulls === undefined ? undefined : Array.from(nulls);
129
+ }
130
+ return snapshot;
131
+ }
132
+
133
+ interface FamilySnapshots {
134
+ root: Record<string, unknown>;
135
+ child: Record<string, unknown>;
136
+ chained: Record<string, unknown>;
137
+ identitySharedWithRoot: boolean;
138
+ prototypeShared: boolean;
139
+ statics: Record<string, unknown>;
140
+ }
141
+
142
+ function buildAndSnapshot(
143
+ mode: MaterializerMode,
144
+ schema: LogSchema,
145
+ family: MessageLayoutFamily,
146
+ physical: MessagePhysicalLayout,
147
+ ): FamilySnapshots {
148
+ return withMode(mode, () => {
149
+ const SpanBufferClass = getSpanBufferClass(schema, family, physical);
150
+ SpanBufferClass.stats.capacity = 16;
151
+ SpanBufferClass.stats.totalWrites = 0;
152
+ SpanBufferClass.stats.spansCreated = 0;
153
+ const traceRoot = createTestTraceRoot(`parity-${family}-${physical}`);
154
+
155
+ const root = createSpanBuffer(schema, traceRoot, OP_METADATA, 16, SpanBufferClass);
156
+ fillBuffer(root);
157
+ const child = createChildSpanBuffer(root, SpanBufferClass, OP_METADATA, OP_METADATA, 16);
158
+ fillBuffer(child);
159
+ const chained = createOverflowBuffer(root);
160
+ fillBuffer(chained);
161
+ callMethod(root, '_sealStatsChain');
162
+
163
+ return {
164
+ root: snapshotBuffer(root),
165
+ child: snapshotBuffer(child),
166
+ chained: snapshotBuffer(chained),
167
+ identitySharedWithRoot: chained._identity === root._identity,
168
+ prototypeShared: Object.getPrototypeOf(root) === Object.getPrototypeOf(chained),
169
+ statics: {
170
+ family: SpanBufferClass.messageLayoutFamily,
171
+ physical: SpanBufferClass.messagePhysicalLayout,
172
+ totalWrites: SpanBufferClass.stats.totalWrites,
173
+ spansCreated: SpanBufferClass.stats.spansCreated,
174
+ },
175
+ };
176
+ });
177
+ }
178
+
179
+ describe('SpanBuffer materializer parity (compiled vs closure-composed)', () => {
180
+ for (const family of FAMILIES) {
181
+ for (const physical of PHYSICALS) {
182
+ it(`root/child/chained buffers are byte-identical: ${family} x ${physical}`, () => {
183
+ const schema = makeSchema();
184
+ const compiled = buildAndSnapshot('compiled', schema, family, physical);
185
+ const closure = buildAndSnapshot('closure', schema, family, physical);
186
+ expect(closure).toEqual(compiled);
187
+ // Anti-vacuity: the scripts really wrote rows and sealed stats.
188
+ expect(closure.root.writeIndex).toBe(4);
189
+ expect(closure.statics.totalWrites).toBeGreaterThan(0);
190
+ expect(closure.identitySharedWithRoot).toBe(true);
191
+ expect(closure.prototypeShared).toBe(true);
192
+ });
193
+ }
194
+ }
195
+
196
+ it('caches classes per materializer mode without cross-mode pollution', () => {
197
+ const schema = makeSchema();
198
+ const Compiled = withMode('compiled', () => getSpanBufferClass(schema));
199
+ const Closure = withMode('closure', () => getSpanBufferClass(schema));
200
+ expect(Compiled).not.toBe(Closure);
201
+ expect(withMode('compiled', () => getSpanBufferClass(schema))).toBe(Compiled);
202
+ expect(withMode('closure', () => getSpanBufferClass(schema))).toBe(Closure);
203
+ });
204
+
205
+ it('exposes identical extension-member descriptors on both prototypes', () => {
206
+ const schema = makeSchema();
207
+ const memberNames = [
208
+ 'span_id',
209
+ 'thread_id',
210
+ 'trace_id',
211
+ '_spanStartTime',
212
+ '_lastLoggedTime',
213
+ '_hasParent',
214
+ 'parent_span_id',
215
+ 'parent_thread_id',
216
+ 'isParentOf',
217
+ 'isChildOf',
218
+ 'copyThreadIdTo',
219
+ 'copyParentThreadIdTo',
220
+ '_logSchema',
221
+ '_messageLayoutFamily',
222
+ '_messagePhysicalLayout',
223
+ '_columns',
224
+ '_stats',
225
+ '_sealStats',
226
+ '_sealStatsChain',
227
+ 'getOrCreateOverflow',
228
+ 'message',
229
+ ];
230
+ const describeMembers = (proto: object) =>
231
+ memberNames.map((name) => {
232
+ const descriptor = Object.getOwnPropertyDescriptor(proto, name);
233
+ if (!descriptor) return { name, missing: true };
234
+ return {
235
+ name,
236
+ kind: descriptor.get ? 'getter' : typeof descriptor.value,
237
+ enumerable: descriptor.enumerable,
238
+ configurable: descriptor.configurable,
239
+ writable: descriptor.writable,
240
+ };
241
+ });
242
+
243
+ const compiled = withMode('compiled', () => describeMembers(getSpanBufferClass(schema).prototype));
244
+ const closure = withMode('closure', () => describeMembers(getSpanBufferClass(schema).prototype));
245
+ expect(closure).toEqual(compiled);
246
+ expect(compiled.some((member) => 'missing' in member)).toBe(false);
247
+ });
248
+
249
+ it('enforces the static-only message row guard identically', () => {
250
+ const schema = makeSchema();
251
+ const messageFor = (mode: MaterializerMode) =>
252
+ withMode(mode, () => {
253
+ const SpanBufferClass = getSpanBufferClass(schema, 'static-only', 'current');
254
+ const traceRoot = createTestTraceRoot(`static-guard-${mode}`);
255
+ const buffer = createSpanBuffer(schema, traceRoot, OP_METADATA, 16, SpanBufferClass);
256
+ try {
257
+ callMethod(buffer, 'message', 2, 'not allowed');
258
+ } catch (error) {
259
+ return error instanceof Error ? `${error.constructor.name}: ${error.message}` : String(error);
260
+ }
261
+ throw new Error('expected the static-only message guard to throw');
262
+ });
263
+ expect(messageFor('closure')).toBe(messageFor('compiled'));
264
+ expect(messageFor('closure')).toContain('rows 0 and 1');
265
+ });
266
+ });
@@ -14,6 +14,7 @@ import { describe, expect, it } from 'bun:test';
14
14
  // Must import test-helpers first to initialize timestamp implementation
15
15
  import './test-helpers.js';
16
16
  import { defineOpContext } from '../defineOpContext.js';
17
+ import { resolveEntryType } from '../resolveMessage.js';
17
18
  import { S } from '../schema/builder.js';
18
19
  import { defineLogSchema } from '../schema/defineLogSchema.js';
19
20
  import { ENTRY_TYPE_SPAN_EXCEPTION, ENTRY_TYPE_SPAN_OK, ENTRY_TYPE_SPAN_START } from '../schema/systemSchema.js';
@@ -43,7 +44,7 @@ describe('Sync/Async Trace Execution', () => {
43
44
  capturedBuffer = ctx.buffer;
44
45
 
45
46
  // At this point, span-start is written (row 0)
46
- expect(ctx.buffer.entry_type[0]).toBe(ENTRY_TYPE_SPAN_START);
47
+ expect(resolveEntryType(ctx.buffer, 0)).toBe(ENTRY_TYPE_SPAN_START);
47
48
 
48
49
  // Row 1 not yet written (happens after function returns)
49
50
  return { success: true, value: 42 };
@@ -54,8 +55,8 @@ describe('Sync/Async Trace Execution', () => {
54
55
 
55
56
  // span-ok should be written to row 1 immediately after sync function returns
56
57
  expect(capturedBuffer).toBeDefined();
57
- expect(capturedBuffer?.entry_type[0]).toBe(ENTRY_TYPE_SPAN_START);
58
- expect(capturedBuffer?.entry_type[1]).toBe(ENTRY_TYPE_SPAN_OK);
58
+ expect(capturedBuffer ? resolveEntryType(capturedBuffer, 0) : undefined).toBe(ENTRY_TYPE_SPAN_START);
59
+ expect(capturedBuffer ? resolveEntryType(capturedBuffer, 1) : undefined).toBe(ENTRY_TYPE_SPAN_OK);
59
60
 
60
61
  // Timestamp should be written
61
62
  expect(capturedBuffer?.timestamp[1]).toBeGreaterThan(0n);
@@ -78,7 +79,7 @@ describe('Sync/Async Trace Execution', () => {
78
79
  capturedBuffer = ctx.buffer;
79
80
 
80
81
  // span-start written at row 0
81
- expect(ctx.buffer.entry_type[0]).toBe(ENTRY_TYPE_SPAN_START);
82
+ expect(resolveEntryType(ctx.buffer, 0)).toBe(ENTRY_TYPE_SPAN_START);
82
83
 
83
84
  throw testError;
84
85
  });
@@ -86,8 +87,8 @@ describe('Sync/Async Trace Execution', () => {
86
87
 
87
88
  // span-exception should be written to row 1 immediately
88
89
  expect(capturedBuffer).toBeDefined();
89
- expect(capturedBuffer?.entry_type[0]).toBe(ENTRY_TYPE_SPAN_START);
90
- expect(capturedBuffer?.entry_type[1]).toBe(ENTRY_TYPE_SPAN_EXCEPTION);
90
+ expect(capturedBuffer ? resolveEntryType(capturedBuffer, 0) : undefined).toBe(ENTRY_TYPE_SPAN_START);
91
+ expect(capturedBuffer ? resolveEntryType(capturedBuffer, 1) : undefined).toBe(ENTRY_TYPE_SPAN_EXCEPTION);
91
92
 
92
93
  // Exception details should be written
93
94
  expect(capturedBuffer?.timestamp[1]).toBeGreaterThan(0n);
@@ -114,7 +115,7 @@ describe('Sync/Async Trace Execution', () => {
114
115
  capturedBuffer = ctx.buffer;
115
116
 
116
117
  // span-start is written at row 0
117
- expect(ctx.buffer.entry_type[0]).toBe(ENTRY_TYPE_SPAN_START);
118
+ expect(resolveEntryType(ctx.buffer, 0)).toBe(ENTRY_TYPE_SPAN_START);
118
119
 
119
120
  // Row 1 not yet written (will be written after Promise resolves)
120
121
  // At this point, entry_type[1] may be 0 or pre-initialized
@@ -142,8 +143,8 @@ describe('Sync/Async Trace Execution', () => {
142
143
 
143
144
  // After Promise resolves, span-ok should be written to row 1
144
145
  expect(capturedBuffer).toBeDefined();
145
- expect(capturedBuffer?.entry_type[0]).toBe(ENTRY_TYPE_SPAN_START);
146
- expect(capturedBuffer?.entry_type[1]).toBe(ENTRY_TYPE_SPAN_OK);
146
+ expect(capturedBuffer ? resolveEntryType(capturedBuffer, 0) : undefined).toBe(ENTRY_TYPE_SPAN_START);
147
+ expect(capturedBuffer ? resolveEntryType(capturedBuffer, 1) : undefined).toBe(ENTRY_TYPE_SPAN_OK);
147
148
 
148
149
  // Timestamp should be written
149
150
  expect(capturedBuffer?.timestamp[1]).toBeGreaterThan(0n);
@@ -166,7 +167,7 @@ describe('Sync/Async Trace Execution', () => {
166
167
  capturedBuffer = ctx.buffer;
167
168
 
168
169
  // span-start written at row 0
169
- expect(ctx.buffer.entry_type[0]).toBe(ENTRY_TYPE_SPAN_START);
170
+ expect(resolveEntryType(ctx.buffer, 0)).toBe(ENTRY_TYPE_SPAN_START);
170
171
 
171
172
  // Simulate async work before error
172
173
  await new Promise((resolve) => setTimeout(resolve, 10));
@@ -190,8 +191,8 @@ describe('Sync/Async Trace Execution', () => {
190
191
 
191
192
  // After Promise rejects, span-exception should be written to row 1
192
193
  expect(capturedBuffer).toBeDefined();
193
- expect(capturedBuffer?.entry_type[0]).toBe(ENTRY_TYPE_SPAN_START);
194
- expect(capturedBuffer?.entry_type[1]).toBe(ENTRY_TYPE_SPAN_EXCEPTION);
194
+ expect(capturedBuffer ? resolveEntryType(capturedBuffer, 0) : undefined).toBe(ENTRY_TYPE_SPAN_START);
195
+ expect(capturedBuffer ? resolveEntryType(capturedBuffer, 1) : undefined).toBe(ENTRY_TYPE_SPAN_EXCEPTION);
195
196
 
196
197
  // Timestamp should be written
197
198
  expect(capturedBuffer?.timestamp[1]).toBeGreaterThan(0n);
@@ -227,8 +228,8 @@ describe('Sync/Async Trace Execution', () => {
227
228
 
228
229
  // Both buffers should have span-ok written
229
230
  expect(buffers.length).toBe(2);
230
- expect(buffers[0].entry_type[1]).toBe(ENTRY_TYPE_SPAN_OK);
231
- expect(buffers[1].entry_type[1]).toBe(ENTRY_TYPE_SPAN_OK);
231
+ expect(resolveEntryType(buffers[0], 1)).toBe(ENTRY_TYPE_SPAN_OK);
232
+ expect(resolveEntryType(buffers[1], 1)).toBe(ENTRY_TYPE_SPAN_OK);
232
233
 
233
234
  // Both traces should be collected
234
235
  expect(tracer.rootBuffers.length).toBe(2);
@@ -270,8 +271,8 @@ describe('Sync/Async Trace Execution', () => {
270
271
 
271
272
  // Both buffers should have span-ok written
272
273
  expect(buffers.length).toBe(2);
273
- expect(buffers[0].entry_type[1]).toBe(ENTRY_TYPE_SPAN_OK);
274
- expect(buffers[1].entry_type[1]).toBe(ENTRY_TYPE_SPAN_OK);
274
+ expect(resolveEntryType(buffers[0], 1)).toBe(ENTRY_TYPE_SPAN_OK);
275
+ expect(resolveEntryType(buffers[1], 1)).toBe(ENTRY_TYPE_SPAN_OK);
275
276
 
276
277
  // Both traces should be collected
277
278
  expect(tracer.rootBuffers.length).toBe(2);
@@ -315,9 +316,9 @@ describe('Sync/Async Trace Execution', () => {
315
316
 
316
317
  // All three buffers should have span-ok
317
318
  expect(buffers.length).toBe(3);
318
- expect(buffers[0].entry_type[1]).toBe(ENTRY_TYPE_SPAN_OK);
319
- expect(buffers[1].entry_type[1]).toBe(ENTRY_TYPE_SPAN_OK);
320
- expect(buffers[2].entry_type[1]).toBe(ENTRY_TYPE_SPAN_OK);
319
+ expect(resolveEntryType(buffers[0], 1)).toBe(ENTRY_TYPE_SPAN_OK);
320
+ expect(resolveEntryType(buffers[1], 1)).toBe(ENTRY_TYPE_SPAN_OK);
321
+ expect(resolveEntryType(buffers[2], 1)).toBe(ENTRY_TYPE_SPAN_OK);
321
322
 
322
323
  // All three traces should be collected
323
324
  expect(tracer.rootBuffers.length).toBe(3);
@@ -347,7 +348,7 @@ describe('Sync/Async Trace Execution', () => {
347
348
  expect(result).toEqual({ id: 123 });
348
349
 
349
350
  // span-ok should be written
350
- expect(capturedBuffer?.entry_type[1]).toBe(ENTRY_TYPE_SPAN_OK);
351
+ expect(capturedBuffer ? resolveEntryType(capturedBuffer, 1) : undefined).toBe(ENTRY_TYPE_SPAN_OK);
351
352
  });
352
353
 
353
354
  it('should support tags in async trace', async () => {
@@ -374,7 +375,7 @@ describe('Sync/Async Trace Execution', () => {
374
375
  expect(result).toEqual({ id: 123 });
375
376
 
376
377
  // span-ok should be written after Promise resolves
377
- expect(capturedBuffer?.entry_type[1]).toBe(ENTRY_TYPE_SPAN_OK);
378
+ expect(capturedBuffer ? resolveEntryType(capturedBuffer, 1) : undefined).toBe(ENTRY_TYPE_SPAN_OK);
378
379
  });
379
380
 
380
381
  it('should support logging in sync trace', () => {
@@ -399,7 +400,7 @@ describe('Sync/Async Trace Execution', () => {
399
400
  expect(result).toBe('done');
400
401
 
401
402
  // span-ok at row 1
402
- expect(capturedBuffer?.entry_type[1]).toBe(ENTRY_TYPE_SPAN_OK);
403
+ expect(capturedBuffer ? resolveEntryType(capturedBuffer, 1) : undefined).toBe(ENTRY_TYPE_SPAN_OK);
403
404
 
404
405
  // Events logged at rows 2+ (verified by successful completion)
405
406
  });
@@ -429,7 +430,7 @@ describe('Sync/Async Trace Execution', () => {
429
430
  expect(result).toBe('done');
430
431
 
431
432
  // span-ok at row 1 (written after Promise resolves)
432
- expect(capturedBuffer?.entry_type[1]).toBe(ENTRY_TYPE_SPAN_OK);
433
+ expect(capturedBuffer ? resolveEntryType(capturedBuffer, 1) : undefined).toBe(ENTRY_TYPE_SPAN_OK);
433
434
  });
434
435
  });
435
436
  });