@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
@@ -1,319 +0,0 @@
1
- /**
2
- * Integration tests for RemappedBufferView registration with prefixed modules
3
- *
4
- * Per specs/lmao/01e_library_integration_pattern.md and 01c_context_flow_and_op_wrappers.md:
5
- * - RemappedBufferView class is generated once when prefix() is called (cold path)
6
- * - Op._invoke() creates instances when registering child spans with parent buffers
7
- * - Root spans don't create RemappedBufferView (no parent to register with)
8
- *
9
- * Note: These tests verify the Op-centric API's span hierarchy handling.
10
- */
11
-
12
- import { describe, expect, it } from 'bun:test';
13
- // Must import test-helpers first to initialize timestamp implementation
14
- import './test-helpers.js';
15
- import { convertSpanTreeToArrowTable } from '../convertToArrow.js';
16
- import { defineOpContext } from '../defineOpContext.js';
17
- import { S } from '../schema/builder.js';
18
- import { defineLogSchema } from '../schema/defineLogSchema.js';
19
- import { TestTracer } from '../tracers/TestTracer.js';
20
- import type { AnySpanBuffer } from '../types.js';
21
- import { createTestTracerOptions } from './test-helpers.js';
22
-
23
- function extractRows(
24
- table: ReturnType<typeof convertSpanTreeToArrowTable>,
25
- columns: readonly string[],
26
- ): Array<Record<string, unknown>> {
27
- return Array.from({ length: table.numRows }, (_, rowIndex) => {
28
- const row: Record<string, unknown> = {};
29
- for (const columnName of columns) {
30
- const column = table.getChild(columnName);
31
- if (column) {
32
- row[columnName] = column.get(rowIndex) as unknown;
33
- }
34
- }
35
- return row;
36
- });
37
- }
38
-
39
- describe('RemappedBufferView Integration', () => {
40
- describe('basic span execution', () => {
41
- it('should execute parent and child ops correctly', async () => {
42
- const appSchema = defineLogSchema({
43
- userId: S.category(),
44
- });
45
-
46
- const opContext = defineOpContext({
47
- logSchema: appSchema,
48
- });
49
-
50
- const { defineOp } = opContext;
51
-
52
- let parentExecuted = false;
53
- let childExecuted = false;
54
-
55
- const childOp = defineOp('child-op', async (ctx) => {
56
- childExecuted = true;
57
- ctx.tag.userId('child-user');
58
- return ctx.ok({ child: true });
59
- });
60
-
61
- const parentOp = defineOp('parent-op', async (ctx) => {
62
- parentExecuted = true;
63
- const childResult = await ctx.span('child-span', childOp);
64
- return ctx.ok({ parent: true, childResult });
65
- });
66
-
67
- const { trace } = new TestTracer(opContext, { ...createTestTracerOptions() });
68
- const result = await trace('parent-span', parentOp);
69
-
70
- expect(parentExecuted).toBe(true);
71
- expect(childExecuted).toBe(true);
72
- expect(result.success).toBe(true);
73
- });
74
- });
75
-
76
- describe('Arrow conversion with unprefixed schemas', () => {
77
- it('should write to buffer correctly', async () => {
78
- const appSchema = defineLogSchema({
79
- userId: S.category(),
80
- action: S.enum(['create', 'read', 'update', 'delete']),
81
- });
82
-
83
- const opContext = defineOpContext({
84
- logSchema: appSchema,
85
- });
86
-
87
- const { defineOp } = opContext;
88
-
89
- let rootBuffer: AnySpanBuffer | undefined;
90
-
91
- const parentOp = defineOp('parent-op', async (ctx) => {
92
- rootBuffer = ctx.buffer;
93
- ctx.tag.userId('test-user').action('create');
94
- ctx.log.info('Test log message');
95
- return ctx.ok({ success: true });
96
- });
97
-
98
- const { trace } = new TestTracer(opContext, { ...createTestTracerOptions() });
99
- await trace('parent-span', parentOp);
100
-
101
- expect(rootBuffer).toBeDefined();
102
- if (!rootBuffer) throw new Error('rootBuffer is undefined');
103
-
104
- // Verify buffer has rows written
105
- expect(rootBuffer._writeIndex).toBeGreaterThan(0);
106
-
107
- // Convert to Arrow table and verify schema
108
- const table = convertSpanTreeToArrowTable(rootBuffer);
109
-
110
- // Should have rows
111
- expect(table.numRows).toBeGreaterThan(0);
112
-
113
- // Verify user attribute columns exist in schema
114
- const fieldNames = table.schema.fields.map((f) => f.name);
115
- expect(fieldNames).toContain('userId');
116
- expect(fieldNames).toContain('action');
117
-
118
- // Verify system columns exist
119
- expect(fieldNames).toContain('timestamp');
120
- expect(fieldNames).toContain('trace_id');
121
- expect(fieldNames).toContain('span_id');
122
- expect(fieldNames).toContain('entry_type');
123
- expect(fieldNames).toContain('package_name');
124
- expect(fieldNames).toContain('message');
125
-
126
- // Verify actual data values in rows
127
- // Collect all rows for easier debugging
128
- const rows = extractRows(table, ['userId', 'action', 'message', 'entry_type']);
129
-
130
- // Find the row with our userId (should be the tag row or span-start row)
131
- const userIdRow = rows.find((r) => r.userId === 'test-user');
132
- expect(userIdRow).toBeDefined();
133
- expect(userIdRow?.userId).toBe('test-user');
134
- expect(userIdRow?.action).toBe('create');
135
-
136
- // Find the log message row
137
- const logRow = rows.find((r) => r.message === 'Test log message');
138
- expect(logRow).toBeDefined();
139
- expect(logRow?.message).toBe('Test log message');
140
-
141
- // Verify entry types are present (span-start, info log, span-ok)
142
- const entryTypes = rows.map((r) => r.entry_type);
143
- expect(entryTypes).toContain('span-start');
144
- expect(entryTypes).toContain('info');
145
- expect(entryTypes).toContain('span-ok');
146
- });
147
- });
148
-
149
- describe('nested spans execution', () => {
150
- it('should execute deeply nested spans', async () => {
151
- const schema = defineLogSchema({
152
- level: S.category(),
153
- data: S.text(),
154
- });
155
-
156
- const opContext = defineOpContext({
157
- logSchema: schema,
158
- });
159
-
160
- const { defineOp } = opContext;
161
-
162
- const executionOrder: number[] = [];
163
-
164
- const level3Op = defineOp('level3', async (ctx) => {
165
- executionOrder.push(3);
166
- ctx.tag.level('3').data('level 3 data');
167
- return ctx.ok({ level: 3 });
168
- });
169
-
170
- const level2Op = defineOp('level2', async (ctx) => {
171
- executionOrder.push(2);
172
- ctx.tag.level('2').data('level 2 data');
173
- await ctx.span('level3-span', level3Op);
174
- return ctx.ok({ level: 2 });
175
- });
176
-
177
- const level1Op = defineOp('level1', async (ctx) => {
178
- executionOrder.push(1);
179
- ctx.tag.level('1').data('level 1 data');
180
- await ctx.span('level2-span', level2Op);
181
- return ctx.ok({ level: 1 });
182
- });
183
-
184
- const { trace } = new TestTracer(opContext, { ...createTestTracerOptions() });
185
- const result = await trace('level1-span', level1Op);
186
-
187
- expect(result.success).toBe(true);
188
- expect(executionOrder).toEqual([1, 2, 3]);
189
- });
190
- });
191
-
192
- describe('parallel child spans', () => {
193
- it('should execute multiple sequential child spans', async () => {
194
- const schema = defineLogSchema({
195
- taskId: S.category(),
196
- taskStatus: S.enum(['pending', 'done']),
197
- });
198
-
199
- const opContext = defineOpContext({
200
- logSchema: schema,
201
- });
202
-
203
- const { defineOp } = opContext;
204
-
205
- const taskResults: number[] = [];
206
-
207
- const task1Op = defineOp('task1', async (ctx) => {
208
- ctx.tag.taskId('task-1').taskStatus('done');
209
- taskResults.push(1);
210
- return ctx.ok({ task: 1 });
211
- });
212
-
213
- const task2Op = defineOp('task2', async (ctx) => {
214
- ctx.tag.taskId('task-2').taskStatus('done');
215
- taskResults.push(2);
216
- return ctx.ok({ task: 2 });
217
- });
218
-
219
- const task3Op = defineOp('task3', async (ctx) => {
220
- ctx.tag.taskId('task-3').taskStatus('done');
221
- taskResults.push(3);
222
- return ctx.ok({ task: 3 });
223
- });
224
-
225
- const parentOp = defineOp('parent', async (ctx) => {
226
- ctx.tag.taskId('parent').taskStatus('pending');
227
-
228
- // Run child tasks sequentially
229
- await ctx.span('task1-span', task1Op);
230
- await ctx.span('task2-span', task2Op);
231
- await ctx.span('task3-span', task3Op);
232
-
233
- ctx.tag.taskStatus('done');
234
- return ctx.ok({ done: true });
235
- });
236
-
237
- const { trace } = new TestTracer(opContext, { ...createTestTracerOptions() });
238
- const result = await trace('parent-span', parentOp);
239
-
240
- expect(result.success).toBe(true);
241
- expect(taskResults).toEqual([1, 2, 3]);
242
- });
243
- });
244
-
245
- describe('same factory for all ops', () => {
246
- it('should handle all ops from the same factory', async () => {
247
- // All ops use the same factory/schema for consistent behavior
248
- const schema = defineLogSchema({
249
- userId: S.category(),
250
- status: S.number(),
251
- method: S.category(),
252
- });
253
-
254
- const opContext = defineOpContext({
255
- logSchema: schema,
256
- });
257
-
258
- const { defineOp } = opContext;
259
-
260
- let appExecuted = false;
261
- let httpExecuted = false;
262
-
263
- const httpOp = defineOp('http-request', async (ctx) => {
264
- httpExecuted = true;
265
- ctx.tag.status(200).method('GET');
266
- return ctx.ok({ http: true });
267
- });
268
-
269
- const appOp = defineOp('app-handler', async (ctx) => {
270
- appExecuted = true;
271
- ctx.tag.userId('user-123');
272
- await ctx.span('http-span', httpOp);
273
- return ctx.ok({ app: true });
274
- });
275
-
276
- const { trace } = new TestTracer(opContext, { ...createTestTracerOptions() });
277
- const result = await trace('app-span', appOp);
278
-
279
- expect(result.success).toBe(true);
280
- expect(appExecuted).toBe(true);
281
- expect(httpExecuted).toBe(true);
282
- });
283
- });
284
-
285
- describe('inline closure spans', () => {
286
- it('should handle inline closure spans', async () => {
287
- const schema = defineLogSchema({
288
- step: S.category(),
289
- });
290
-
291
- const opContext = defineOpContext({
292
- logSchema: schema,
293
- });
294
-
295
- const { defineOp } = opContext;
296
-
297
- const executedSteps: string[] = [];
298
-
299
- const parentOp = defineOp('parent', async (ctx) => {
300
- executedSteps.push('parent-start');
301
-
302
- await ctx.span('inline-child', async (childCtx) => {
303
- executedSteps.push('child');
304
- childCtx.tag.step('inline-step');
305
- return childCtx.ok({ inline: true });
306
- });
307
-
308
- executedSteps.push('parent-end');
309
- return ctx.ok({ done: true });
310
- });
311
-
312
- const { trace } = new TestTracer(opContext, { ...createTestTracerOptions() });
313
- const result = await trace('parent-span', parentOp);
314
-
315
- expect(result.success).toBe(true);
316
- expect(executedSteps).toEqual(['parent-start', 'child', 'parent-end']);
317
- });
318
- });
319
- });