@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
@@ -0,0 +1,414 @@
1
+ import { describe, expect, it } from 'bun:test';
2
+ import './test-helpers.js';
3
+ import { defineOpContext } from '../defineOpContext.js';
4
+ import type { OpContext, OpContextOf, SpanContext } from '../opContext/types.js';
5
+ import { Ok } from '../result.js';
6
+ import {
7
+ RUNTIME_HINT_ANALYZED_VALID,
8
+ RUNTIME_HINT_DEPS,
9
+ RUNTIME_HINT_FF,
10
+ RUNTIME_HINT_RESULT,
11
+ RUNTIME_HINT_SPAN,
12
+ } from '../runtimeHint.js';
13
+ import { S } from '../schema/builder.js';
14
+ import { defineFeatureFlags } from '../schema/defineFeatureFlags.js';
15
+ import { defineLogSchema } from '../schema/defineLogSchema.js';
16
+ import { InMemoryFlagEvaluator, type SpanContextWithoutFf } from '../schema/evaluator.js';
17
+ import { createTraceId } from '../traceId.js';
18
+ import { TestTracer } from '../tracers/TestTracer.js';
19
+ import { createTestTracerOptions } from './test-helpers.js';
20
+
21
+ const schema = defineLogSchema({ marker: S.category() });
22
+ const flags = defineFeatureFlags({ enabled: S.boolean().default(false).sync() });
23
+
24
+ const dependencyContext = defineOpContext({ logSchema: defineLogSchema({}) });
25
+ const dependencyOps = dependencyContext.defineOps({
26
+ probe: (ctx) => ctx.ok('dependency'),
27
+ });
28
+
29
+ interface RuntimeEnv {
30
+ REGION: string;
31
+ }
32
+
33
+ const rootDefaults: {
34
+ requestId: string;
35
+ optional: string | undefined;
36
+ env: RuntimeEnv | null;
37
+ nullable: string | null;
38
+ config: { mode: string };
39
+ } = {
40
+ requestId: 'default-request',
41
+ optional: undefined,
42
+ env: null,
43
+ nullable: 'default-nullable',
44
+ config: { mode: 'safe' },
45
+ };
46
+
47
+ const rootContext = defineOpContext({
48
+ logSchema: schema,
49
+ flags: flags.schema,
50
+ deps: { dependency: dependencyOps },
51
+ ctx: rootDefaults,
52
+ });
53
+
54
+ type RootContext = OpContextOf<typeof rootContext>;
55
+ type RootSpanContext = SpanContext<RootContext>;
56
+
57
+ const ROOT_HINT =
58
+ RUNTIME_HINT_ANALYZED_VALID | RUNTIME_HINT_FF | RUNTIME_HINT_DEPS | RUNTIME_HINT_SPAN | RUNTIME_HINT_RESULT | 4;
59
+ const ROOT_KEYS = [
60
+ '_spanBuffer',
61
+ '_buffer',
62
+ '_appendLogEntry',
63
+ '_schema',
64
+ '_logBinding',
65
+ '_physicalLayoutPlan',
66
+ '_spanLogger',
67
+ 'deps',
68
+ 'ff',
69
+ 'config',
70
+ 'env',
71
+ 'nullable',
72
+ 'optional',
73
+ 'requestId',
74
+ 'ok',
75
+ 'err',
76
+ 'span',
77
+ 'spanSync',
78
+ ];
79
+ const RESULT_ONLY_KEYS = [
80
+ '_spanBuffer',
81
+ '_buffer',
82
+ '_appendLogEntry',
83
+ '_schema',
84
+ '_logBinding',
85
+ '_physicalLayoutPlan',
86
+ 'config',
87
+ 'env',
88
+ 'nullable',
89
+ 'optional',
90
+ 'requestId',
91
+ 'ok',
92
+ 'err',
93
+ ];
94
+
95
+ function requireContext(value: RootSpanContext | undefined, label: string): RootSpanContext {
96
+ if (!value) throw new Error(`missing ${label}`);
97
+ return value;
98
+ }
99
+
100
+ class CapturingEvaluator extends InMemoryFlagEvaluator {
101
+ readonly contexts: SpanContextWithoutFf<OpContext>[] = [];
102
+
103
+ override getSync<K extends string>(ctx: SpanContextWithoutFf<OpContext>, flag: K) {
104
+ this.contexts.push(ctx);
105
+ return super.getSync(ctx, flag);
106
+ }
107
+ }
108
+
109
+ describe('root SpanContext direct construction', () => {
110
+ it('passes defaults and overrides directly without enumerable carrier copies', () => {
111
+ let defaultOwnKeysCalls = 0;
112
+ let overrideOwnKeysCalls = 0;
113
+ const defaultsTarget: { env: RuntimeEnv | null; requestId: string } = {
114
+ env: null,
115
+ requestId: 'default-request',
116
+ };
117
+ const defaults = new Proxy(defaultsTarget, {
118
+ ownKeys(target) {
119
+ defaultOwnKeysCalls += 1;
120
+ return Reflect.ownKeys(target);
121
+ },
122
+ });
123
+ const directContext = defineOpContext({ logSchema: schema, ctx: defaults });
124
+ const traceId = createTraceId('direct-context-sources');
125
+ const directOp = directContext.defineOp(
126
+ 'direct-context-sources',
127
+ (ctx) => {
128
+ if (!ctx.env) throw new Error('missing direct env');
129
+ expect(ctx.buffer.trace_id).toBe(traceId);
130
+ expect(ctx.env.REGION).toBe('nrt');
131
+ expect(ctx.requestId).toBe('override-request');
132
+ return ctx.ok(null);
133
+ },
134
+ undefined,
135
+ { runtimeHint: RUNTIME_HINT_ANALYZED_VALID | RUNTIME_HINT_RESULT | 2 },
136
+ );
137
+ const tracer = new TestTracer(directContext, createTestTracerOptions());
138
+ const overridesTarget = {
139
+ env: { REGION: 'nrt' },
140
+ requestId: 'override-request',
141
+ trace_id: traceId,
142
+ };
143
+ const overrides = new Proxy(overridesTarget, {
144
+ ownKeys(target) {
145
+ overrideOwnKeysCalls += 1;
146
+ return Reflect.ownKeys(target);
147
+ },
148
+ });
149
+
150
+ // Ignore factory/class setup. The trace path must not enumerate either record
151
+ // to validate or to build temporary spread/copy carriers.
152
+ defaultOwnKeysCalls = 0;
153
+ overrideOwnKeysCalls = 0;
154
+ const result = tracer.trace('direct-context-sources', overrides, directOp);
155
+
156
+ expect(result).toBeInstanceOf(Ok);
157
+ expect(defaultOwnKeysCalls).toBe(0);
158
+ expect(overrideOwnKeysCalls).toBe(0);
159
+ });
160
+
161
+ it('uses the selected constructor once for sync, async, and child contexts with canonical keys', async () => {
162
+ const evaluator = new CapturingEvaluator(flags.schema, { enabled: true });
163
+ const observed: Array<{
164
+ config: string;
165
+ dependencyBound: boolean;
166
+ enabled: boolean;
167
+ env: string;
168
+ nullable: string | null;
169
+ optional: string | undefined;
170
+ requestId: string;
171
+ }> = [];
172
+ let syncRoot: RootSpanContext | undefined;
173
+ let syncChild: RootSpanContext | undefined;
174
+ let asyncRoot: RootSpanContext | undefined;
175
+ let asyncChild: RootSpanContext | undefined;
176
+
177
+ function observe(ctx: RootSpanContext) {
178
+ if (!ctx.env) throw new Error('missing observed env');
179
+ const enabled = ctx.ff.enabled;
180
+ if (!enabled) throw new Error('missing enabled flag');
181
+ observed.push({
182
+ config: ctx.config.mode,
183
+ dependencyBound: ctx.deps.dependency.probe === dependencyOps.probe,
184
+ enabled: enabled.value,
185
+ env: ctx.env.REGION,
186
+ nullable: ctx.nullable,
187
+ optional: ctx.optional,
188
+ requestId: ctx.requestId,
189
+ });
190
+ }
191
+
192
+ const syncChildOp = rootContext.defineOp(
193
+ 'direct-sync-child',
194
+ (ctx) => {
195
+ syncChild = ctx;
196
+ observe(ctx);
197
+ return ctx.ok('sync-child');
198
+ },
199
+ undefined,
200
+ { runtimeHint: ROOT_HINT },
201
+ );
202
+ const asyncChildOp = rootContext.defineOp(
203
+ 'direct-async-child',
204
+ async (ctx) => {
205
+ asyncChild = ctx;
206
+ observe(ctx);
207
+ await Promise.resolve();
208
+ return ctx.ok('async-child');
209
+ },
210
+ undefined,
211
+ { runtimeHint: ROOT_HINT | 27 },
212
+ );
213
+
214
+ const syncOp = rootContext.defineOp(
215
+ 'direct-root-sync',
216
+ (ctx) => {
217
+ syncRoot = ctx;
218
+ observe(ctx);
219
+ const childResult = ctx.spanSync('direct-sync-child', syncChildOp);
220
+ expect(childResult.success).toBe(true);
221
+ return ctx.ok('sync-root');
222
+ },
223
+ undefined,
224
+ { runtimeHint: ROOT_HINT },
225
+ );
226
+ const asyncOp = rootContext.defineOp(
227
+ 'direct-root-async',
228
+ async (ctx) => {
229
+ asyncRoot = ctx;
230
+ observe(ctx);
231
+ const childResult = await ctx.span('direct-async-child', asyncChildOp);
232
+ expect(childResult.success).toBe(true);
233
+ return ctx.ok('async-root');
234
+ },
235
+ undefined,
236
+ { runtimeHint: ROOT_HINT | 27 },
237
+ );
238
+
239
+ expect(syncOp.callsitePlan.SpanContextClass).toBe(asyncOp.callsitePlan.SpanContextClass);
240
+ expect(syncChildOp.callsitePlan.SpanContextClass).toBe(syncOp.callsitePlan.SpanContextClass);
241
+ expect(asyncChildOp.callsitePlan.SpanContextClass).toBe(syncOp.callsitePlan.SpanContextClass);
242
+
243
+ const tracer = new TestTracer(rootContext, { ...createTestTracerOptions(), flagEvaluator: evaluator });
244
+ const syncResult = tracer.trace('direct-root-sync', { env: { REGION: 'iad' }, nullable: null }, syncOp);
245
+ expect(syncResult).toBeInstanceOf(Ok);
246
+
247
+ const asyncResultPromise = tracer.trace(
248
+ 'direct-root-async',
249
+ {
250
+ config: { mode: 'fast' },
251
+ env: { REGION: 'fra' },
252
+ optional: 'present',
253
+ requestId: 'override-request',
254
+ },
255
+ asyncOp,
256
+ );
257
+ expect(asyncResultPromise).toBeInstanceOf(Promise);
258
+ const asyncResult = await asyncResultPromise;
259
+ expect(asyncResult).toBeInstanceOf(Ok);
260
+
261
+ const contexts = [
262
+ requireContext(syncRoot, 'sync root'),
263
+ requireContext(syncChild, 'sync child'),
264
+ requireContext(asyncRoot, 'async root'),
265
+ requireContext(asyncChild, 'async child'),
266
+ ];
267
+ for (const ctx of contexts) {
268
+ expect(ctx).toBeInstanceOf(syncOp.callsitePlan.SpanContextClass);
269
+ expect(Object.keys(ctx)).toEqual(ROOT_KEYS);
270
+ }
271
+ expect(evaluator.contexts).toEqual(contexts);
272
+ expect(new Set(evaluator.contexts).size).toBe(contexts.length);
273
+ expect(observed).toEqual([
274
+ {
275
+ config: 'safe',
276
+ dependencyBound: true,
277
+ enabled: true,
278
+ env: 'iad',
279
+ nullable: null,
280
+ optional: undefined,
281
+ requestId: 'default-request',
282
+ },
283
+ {
284
+ config: 'safe',
285
+ dependencyBound: true,
286
+ enabled: true,
287
+ env: 'iad',
288
+ nullable: null,
289
+ optional: undefined,
290
+ requestId: 'default-request',
291
+ },
292
+ {
293
+ config: 'fast',
294
+ dependencyBound: true,
295
+ enabled: true,
296
+ env: 'fra',
297
+ nullable: 'default-nullable',
298
+ optional: 'present',
299
+ requestId: 'override-request',
300
+ },
301
+ {
302
+ config: 'fast',
303
+ dependencyBound: true,
304
+ enabled: true,
305
+ env: 'fra',
306
+ nullable: 'default-nullable',
307
+ optional: 'present',
308
+ requestId: 'override-request',
309
+ },
310
+ ]);
311
+ });
312
+
313
+ it('separates root constructors for capability and user-context layouts', () => {
314
+ let fullRoot: RootSpanContext | undefined;
315
+ let resultOnlyRoot: RootSpanContext | undefined;
316
+ const fullOp = rootContext.defineOp(
317
+ 'full-layout-root',
318
+ (ctx) => {
319
+ fullRoot = ctx;
320
+ return ctx.ok(null);
321
+ },
322
+ undefined,
323
+ { runtimeHint: ROOT_HINT },
324
+ );
325
+ const resultOnlyOp = rootContext.defineOp(
326
+ 'result-layout-root',
327
+ (ctx) => {
328
+ resultOnlyRoot = ctx;
329
+ return ctx.ok(null);
330
+ },
331
+ undefined,
332
+ { runtimeHint: RUNTIME_HINT_ANALYZED_VALID | RUNTIME_HINT_RESULT | 4 },
333
+ );
334
+
335
+ const alternateDefaults: { accountId: string; env: RuntimeEnv | null } = {
336
+ accountId: 'default-account',
337
+ env: null,
338
+ };
339
+ const alternateContext = defineOpContext({
340
+ logSchema: schema,
341
+ flags: flags.schema,
342
+ deps: { dependency: dependencyOps },
343
+ ctx: alternateDefaults,
344
+ });
345
+ let alternateRoot: SpanContext<OpContextOf<typeof alternateContext>> | undefined;
346
+ const alternateOp = alternateContext.defineOp(
347
+ 'alternate-layout-root',
348
+ (ctx) => {
349
+ if (!ctx.env) throw new Error('missing alternate env');
350
+ alternateRoot = ctx;
351
+ expect(ctx.accountId).toBe('account-7');
352
+ expect(ctx.env.REGION).toBe('syd');
353
+ return ctx.ok(null);
354
+ },
355
+ undefined,
356
+ { runtimeHint: ROOT_HINT },
357
+ );
358
+
359
+ const tracer = new TestTracer(rootContext, createTestTracerOptions());
360
+ tracer.trace('full-layout-root', { env: { REGION: 'ord' } }, fullOp);
361
+ tracer.trace('result-layout-root', { env: { REGION: 'ord' } }, resultOnlyOp);
362
+ const alternateTracer = new TestTracer(alternateContext, createTestTracerOptions());
363
+ alternateTracer.trace('alternate-layout-root', { accountId: 'account-7', env: { REGION: 'syd' } }, alternateOp);
364
+
365
+ const capturedFull = requireContext(fullRoot, 'full root');
366
+ const capturedResultOnly = requireContext(resultOnlyRoot, 'result-only root');
367
+ if (!alternateRoot) throw new Error('missing alternate root');
368
+
369
+ expect(fullOp.callsitePlan.SpanContextClass).not.toBe(resultOnlyOp.callsitePlan.SpanContextClass);
370
+ expect(fullOp.callsitePlan.SpanContextClass).not.toBe(alternateOp.callsitePlan.SpanContextClass);
371
+ expect(capturedFull).toBeInstanceOf(fullOp.callsitePlan.SpanContextClass);
372
+ expect(capturedResultOnly).toBeInstanceOf(resultOnlyOp.callsitePlan.SpanContextClass);
373
+ expect(alternateRoot).toBeInstanceOf(alternateOp.callsitePlan.SpanContextClass);
374
+ expect(Object.keys(capturedFull)).toEqual(ROOT_KEYS);
375
+ expect(Object.keys(capturedResultOnly)).toEqual(RESULT_ONLY_KEYS);
376
+ expect(Object.keys(alternateRoot)).toEqual([
377
+ '_spanBuffer',
378
+ '_buffer',
379
+ '_appendLogEntry',
380
+ '_schema',
381
+ '_logBinding',
382
+ '_physicalLayoutPlan',
383
+ '_spanLogger',
384
+ 'deps',
385
+ 'ff',
386
+ 'accountId',
387
+ 'env',
388
+ 'ok',
389
+ 'err',
390
+ 'span',
391
+ 'spanSync',
392
+ ]);
393
+ });
394
+
395
+ it('rejects missing and null required root values before construction', () => {
396
+ const op = rootContext.defineOp(
397
+ 'required-root-env',
398
+ (ctx) => {
399
+ if (!ctx.env) throw new Error('missing required env');
400
+ return ctx.ok(ctx.env.REGION);
401
+ },
402
+ undefined,
403
+ { runtimeHint: RUNTIME_HINT_ANALYZED_VALID | RUNTIME_HINT_RESULT | 2 },
404
+ );
405
+ const tracer = new TestTracer(rootContext, createTestTracerOptions());
406
+
407
+ expect(() => Reflect.apply(tracer.trace, tracer, ['missing-root-env', op])).toThrow(
408
+ "Required context parameter 'env' must be provided",
409
+ );
410
+ expect(() => Reflect.apply(tracer.trace, tracer, ['null-root-env', { env: null }, op])).toThrow(
411
+ "Required context parameter 'env' must be provided",
412
+ );
413
+ });
414
+ });