@smoothbricks/lmao 0.1.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.
- package/README.md +269 -0
- package/dist/allocator.wasm +0 -0
- package/dist/bun/preload.d.ts +11 -0
- package/dist/bun/preload.d.ts.map +1 -0
- package/dist/bun/preload.js +10 -0
- package/dist/bun/trace-preload.d.ts +8 -0
- package/dist/bun/trace-preload.d.ts.map +1 -0
- package/dist/bun/trace-preload.js +12 -0
- package/dist/es.d.ts +8 -0
- package/dist/es.d.ts.map +1 -0
- package/dist/es.js +9 -0
- package/dist/index.d.ts +41 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +84 -0
- package/dist/lib/JsBufferStrategy.d.ts +49 -0
- package/dist/lib/JsBufferStrategy.d.ts.map +1 -0
- package/dist/lib/JsBufferStrategy.js +60 -0
- package/dist/lib/archive/chunkCompaction.d.ts +15 -0
- package/dist/lib/archive/chunkCompaction.d.ts.map +1 -0
- package/dist/lib/archive/chunkCompaction.js +24 -0
- package/dist/lib/archive/chunkEnvelope.d.ts +21 -0
- package/dist/lib/archive/chunkEnvelope.d.ts.map +1 -0
- package/dist/lib/archive/chunkEnvelope.js +55 -0
- package/dist/lib/archive/chunkRouting.d.ts +10 -0
- package/dist/lib/archive/chunkRouting.d.ts.map +1 -0
- package/dist/lib/archive/chunkRouting.js +47 -0
- package/dist/lib/archive/chunkStats.d.ts +12 -0
- package/dist/lib/archive/chunkStats.d.ts.map +1 -0
- package/dist/lib/archive/chunkStats.js +10 -0
- package/dist/lib/archive/index.d.ts +5 -0
- package/dist/lib/archive/index.d.ts.map +1 -0
- package/dist/lib/archive/index.js +4 -0
- package/dist/lib/arrow/capacityStats.d.ts +9 -0
- package/dist/lib/arrow/capacityStats.d.ts.map +1 -0
- package/dist/lib/arrow/capacityStats.js +231 -0
- package/dist/lib/arrow/dictionaries.d.ts +27 -0
- package/dist/lib/arrow/dictionaries.d.ts.map +1 -0
- package/dist/lib/arrow/dictionaries.js +135 -0
- package/dist/lib/arrow/flechette.d.ts +40 -0
- package/dist/lib/arrow/flechette.d.ts.map +1 -0
- package/dist/lib/arrow/flechette.js +67 -0
- package/dist/lib/arrow/utils.d.ts +38 -0
- package/dist/lib/arrow/utils.d.ts.map +1 -0
- package/dist/lib/arrow/utils.js +112 -0
- package/dist/lib/buffer/Nanoseconds.d.ts +109 -0
- package/dist/lib/buffer/Nanoseconds.d.ts.map +1 -0
- package/dist/lib/buffer/Nanoseconds.js +86 -0
- package/dist/lib/bufferStrategy.d.ts +95 -0
- package/dist/lib/bufferStrategy.d.ts.map +1 -0
- package/dist/lib/bufferStrategy.js +1 -0
- package/dist/lib/capacityTuning.d.ts +50 -0
- package/dist/lib/capacityTuning.d.ts.map +1 -0
- package/dist/lib/capacityTuning.js +65 -0
- package/dist/lib/codegen/evaluatorGenerator.d.ts +35 -0
- package/dist/lib/codegen/evaluatorGenerator.d.ts.map +1 -0
- package/dist/lib/codegen/evaluatorGenerator.js +199 -0
- package/dist/lib/codegen/fixedPositionWriterGenerator.d.ts +139 -0
- package/dist/lib/codegen/fixedPositionWriterGenerator.d.ts.map +1 -0
- package/dist/lib/codegen/fixedPositionWriterGenerator.js +289 -0
- package/dist/lib/codegen/spanLoggerGenerator.d.ts +115 -0
- package/dist/lib/codegen/spanLoggerGenerator.d.ts.map +1 -0
- package/dist/lib/codegen/spanLoggerGenerator.js +575 -0
- package/dist/lib/convertToArrow.d.ts +40 -0
- package/dist/lib/convertToArrow.d.ts.map +1 -0
- package/dist/lib/convertToArrow.js +1467 -0
- package/dist/lib/defineOpContext.d.ts +96 -0
- package/dist/lib/defineOpContext.d.ts.map +1 -0
- package/dist/lib/defineOpContext.js +227 -0
- package/dist/lib/errors/Blocked.d.ts +113 -0
- package/dist/lib/errors/Blocked.d.ts.map +1 -0
- package/dist/lib/errors/Blocked.js +68 -0
- package/dist/lib/errors/CodeError.d.ts +101 -0
- package/dist/lib/errors/CodeError.d.ts.map +1 -0
- package/dist/lib/errors/CodeError.js +42 -0
- package/dist/lib/errors/RetriesExhausted.d.ts +67 -0
- package/dist/lib/errors/RetriesExhausted.d.ts.map +1 -0
- package/dist/lib/errors/RetriesExhausted.js +31 -0
- package/dist/lib/errors/Transient.d.ts +115 -0
- package/dist/lib/errors/Transient.d.ts.map +1 -0
- package/dist/lib/errors/Transient.js +54 -0
- package/dist/lib/errors/index.d.ts +14 -0
- package/dist/lib/errors/index.d.ts.map +1 -0
- package/dist/lib/errors/index.js +16 -0
- package/dist/lib/errors/retry-policy.d.ts +60 -0
- package/dist/lib/errors/retry-policy.d.ts.map +1 -0
- package/dist/lib/errors/retry-policy.js +54 -0
- package/dist/lib/flushScheduler.d.ts +162 -0
- package/dist/lib/flushScheduler.d.ts.map +1 -0
- package/dist/lib/flushScheduler.js +388 -0
- package/dist/lib/library.d.ts +149 -0
- package/dist/lib/library.d.ts.map +1 -0
- package/dist/lib/library.js +588 -0
- package/dist/lib/logApi.d.ts +61 -0
- package/dist/lib/logApi.d.ts.map +1 -0
- package/dist/lib/logApi.js +12 -0
- package/dist/lib/logBinding.d.ts +63 -0
- package/dist/lib/logBinding.d.ts.map +1 -0
- package/dist/lib/logBinding.js +1 -0
- package/dist/lib/op.d.ts +105 -0
- package/dist/lib/op.d.ts.map +1 -0
- package/dist/lib/op.js +59 -0
- package/dist/lib/opContext/contextTypes.d.ts +88 -0
- package/dist/lib/opContext/contextTypes.d.ts.map +1 -0
- package/dist/lib/opContext/contextTypes.js +34 -0
- package/dist/lib/opContext/createOpGroup.d.ts +57 -0
- package/dist/lib/opContext/createOpGroup.d.ts.map +1 -0
- package/dist/lib/opContext/createOpGroup.js +341 -0
- package/dist/lib/opContext/defineOp.d.ts +83 -0
- package/dist/lib/opContext/defineOp.d.ts.map +1 -0
- package/dist/lib/opContext/defineOp.js +197 -0
- package/dist/lib/opContext/featureFlagTypes.d.ts +58 -0
- package/dist/lib/opContext/featureFlagTypes.d.ts.map +1 -0
- package/dist/lib/opContext/featureFlagTypes.js +1 -0
- package/dist/lib/opContext/index.d.ts +13 -0
- package/dist/lib/opContext/index.d.ts.map +1 -0
- package/dist/lib/opContext/index.js +15 -0
- package/dist/lib/opContext/opGroupTypes.d.ts +250 -0
- package/dist/lib/opContext/opGroupTypes.d.ts.map +1 -0
- package/dist/lib/opContext/opGroupTypes.js +31 -0
- package/dist/lib/opContext/opTypes.d.ts +48 -0
- package/dist/lib/opContext/opTypes.d.ts.map +1 -0
- package/dist/lib/opContext/opTypes.js +7 -0
- package/dist/lib/opContext/spanContextTypes.d.ts +347 -0
- package/dist/lib/opContext/spanContextTypes.d.ts.map +1 -0
- package/dist/lib/opContext/spanContextTypes.js +1 -0
- package/dist/lib/opContext/types.d.ts +297 -0
- package/dist/lib/opContext/types.d.ts.map +1 -0
- package/dist/lib/opContext/types.js +16 -0
- package/dist/lib/result.d.ts +308 -0
- package/dist/lib/result.d.ts.map +1 -0
- package/dist/lib/result.js +359 -0
- package/dist/lib/schema/LogSchema.d.ts +62 -0
- package/dist/lib/schema/LogSchema.d.ts.map +1 -0
- package/dist/lib/schema/LogSchema.js +134 -0
- package/dist/lib/schema/builder.d.ts +12 -0
- package/dist/lib/schema/builder.d.ts.map +1 -0
- package/dist/lib/schema/builder.js +169 -0
- package/dist/lib/schema/defineFeatureFlags.d.ts +60 -0
- package/dist/lib/schema/defineFeatureFlags.d.ts.map +1 -0
- package/dist/lib/schema/defineFeatureFlags.js +29 -0
- package/dist/lib/schema/defineLogSchema.d.ts +87 -0
- package/dist/lib/schema/defineLogSchema.d.ts.map +1 -0
- package/dist/lib/schema/defineLogSchema.js +171 -0
- package/dist/lib/schema/evaluator.d.ts +267 -0
- package/dist/lib/schema/evaluator.d.ts.map +1 -0
- package/dist/lib/schema/evaluator.js +169 -0
- package/dist/lib/schema/extend.d.ts +14 -0
- package/dist/lib/schema/extend.d.ts.map +1 -0
- package/dist/lib/schema/extend.js +51 -0
- package/dist/lib/schema/systemSchema.d.ts +112 -0
- package/dist/lib/schema/systemSchema.d.ts.map +1 -0
- package/dist/lib/schema/systemSchema.js +260 -0
- package/dist/lib/schema/typeGuards.d.ts +52 -0
- package/dist/lib/schema/typeGuards.d.ts.map +1 -0
- package/dist/lib/schema/typeGuards.js +127 -0
- package/dist/lib/schema/types.d.ts +156 -0
- package/dist/lib/schema/types.d.ts.map +1 -0
- package/dist/lib/schema/types.js +4 -0
- package/dist/lib/spanBuffer.d.ts +133 -0
- package/dist/lib/spanBuffer.d.ts.map +1 -0
- package/dist/lib/spanBuffer.js +442 -0
- package/dist/lib/spanBufferHelpers.d.ts +53 -0
- package/dist/lib/spanBufferHelpers.d.ts.map +1 -0
- package/dist/lib/spanBufferHelpers.js +65 -0
- package/dist/lib/spanBufferStats.d.ts +38 -0
- package/dist/lib/spanBufferStats.d.ts.map +1 -0
- package/dist/lib/spanBufferStats.js +1 -0
- package/dist/lib/spanContext.d.ts +141 -0
- package/dist/lib/spanContext.d.ts.map +1 -0
- package/dist/lib/spanContext.js +763 -0
- package/dist/lib/sqlite/index.d.ts +14 -0
- package/dist/lib/sqlite/index.d.ts.map +1 -0
- package/dist/lib/sqlite/index.js +12 -0
- package/dist/lib/sqlite/sqlite-async-writer.d.ts +24 -0
- package/dist/lib/sqlite/sqlite-async-writer.d.ts.map +1 -0
- package/dist/lib/sqlite/sqlite-async-writer.js +65 -0
- package/dist/lib/sqlite/sqlite-common.d.ts +37 -0
- package/dist/lib/sqlite/sqlite-common.d.ts.map +1 -0
- package/dist/lib/sqlite/sqlite-common.js +207 -0
- package/dist/lib/sqlite/sqlite-d1.d.ts +25 -0
- package/dist/lib/sqlite/sqlite-d1.d.ts.map +1 -0
- package/dist/lib/sqlite/sqlite-d1.js +67 -0
- package/dist/lib/sqlite/sqlite-db.d.ts +29 -0
- package/dist/lib/sqlite/sqlite-db.d.ts.map +1 -0
- package/dist/lib/sqlite/sqlite-db.js +1 -0
- package/dist/lib/sqlite/sqlite-node.d.ts +16 -0
- package/dist/lib/sqlite/sqlite-node.d.ts.map +1 -0
- package/dist/lib/sqlite/sqlite-node.js +68 -0
- package/dist/lib/sqlite/sqlite-writer.d.ts +39 -0
- package/dist/lib/sqlite/sqlite-writer.d.ts.map +1 -0
- package/dist/lib/sqlite/sqlite-writer.js +78 -0
- package/dist/lib/testing/bun-harness.d.ts +150 -0
- package/dist/lib/testing/bun-harness.d.ts.map +1 -0
- package/dist/lib/testing/bun-harness.js +729 -0
- package/dist/lib/testing/extractFacts.d.ts +73 -0
- package/dist/lib/testing/extractFacts.d.ts.map +1 -0
- package/dist/lib/testing/extractFacts.js +237 -0
- package/dist/lib/testing/facts.d.ts +235 -0
- package/dist/lib/testing/facts.d.ts.map +1 -0
- package/dist/lib/testing/facts.js +209 -0
- package/dist/lib/testing/index.d.ts +58 -0
- package/dist/lib/testing/index.d.ts.map +1 -0
- package/dist/lib/testing/index.js +74 -0
- package/dist/lib/testing/queryable-span.d.ts +39 -0
- package/dist/lib/testing/queryable-span.d.ts.map +1 -0
- package/dist/lib/testing/queryable-span.js +58 -0
- package/dist/lib/testing/span-query.d.ts +21 -0
- package/dist/lib/testing/span-query.d.ts.map +1 -0
- package/dist/lib/testing/span-query.js +47 -0
- package/dist/lib/testing/stdio-replay.d.ts +4 -0
- package/dist/lib/testing/stdio-replay.d.ts.map +1 -0
- package/dist/lib/testing/stdio-replay.js +42 -0
- package/dist/lib/testing/trace-query.d.ts +59 -0
- package/dist/lib/testing/trace-query.d.ts.map +1 -0
- package/dist/lib/testing/trace-query.js +462 -0
- package/dist/lib/testing/vitest-harness.d.ts +135 -0
- package/dist/lib/testing/vitest-harness.d.ts.map +1 -0
- package/dist/lib/testing/vitest-harness.js +486 -0
- package/dist/lib/threadId.d.ts +58 -0
- package/dist/lib/threadId.d.ts.map +1 -0
- package/dist/lib/threadId.js +123 -0
- package/dist/lib/traceContext.d.ts +116 -0
- package/dist/lib/traceContext.d.ts.map +1 -0
- package/dist/lib/traceContext.js +37 -0
- package/dist/lib/traceId.d.ts +78 -0
- package/dist/lib/traceId.d.ts.map +1 -0
- package/dist/lib/traceId.js +87 -0
- package/dist/lib/traceRoot.d.ts +133 -0
- package/dist/lib/traceRoot.d.ts.map +1 -0
- package/dist/lib/traceRoot.es.d.ts +75 -0
- package/dist/lib/traceRoot.es.d.ts.map +1 -0
- package/dist/lib/traceRoot.es.js +129 -0
- package/dist/lib/traceRoot.js +19 -0
- package/dist/lib/traceRoot.node.d.ts +77 -0
- package/dist/lib/traceRoot.node.d.ts.map +1 -0
- package/dist/lib/traceRoot.node.js +133 -0
- package/dist/lib/traceRoot.universal.d.ts +3 -0
- package/dist/lib/traceRoot.universal.d.ts.map +1 -0
- package/dist/lib/traceRoot.universal.js +17 -0
- package/dist/lib/tracer.d.ts +296 -0
- package/dist/lib/tracer.d.ts.map +1 -0
- package/dist/lib/tracer.js +346 -0
- package/dist/lib/tracers/ArrayQueueTracer.d.ts +56 -0
- package/dist/lib/tracers/ArrayQueueTracer.d.ts.map +1 -0
- package/dist/lib/tracers/ArrayQueueTracer.js +67 -0
- package/dist/lib/tracers/CompositeTracer.d.ts +24 -0
- package/dist/lib/tracers/CompositeTracer.d.ts.map +1 -0
- package/dist/lib/tracers/CompositeTracer.js +57 -0
- package/dist/lib/tracers/NoOpTracer.d.ts +58 -0
- package/dist/lib/tracers/NoOpTracer.d.ts.map +1 -0
- package/dist/lib/tracers/NoOpTracer.js +41 -0
- package/dist/lib/tracers/SQLiteTracer.d.ts +42 -0
- package/dist/lib/tracers/SQLiteTracer.d.ts.map +1 -0
- package/dist/lib/tracers/SQLiteTracer.js +84 -0
- package/dist/lib/tracers/StdioTracer.d.ts +83 -0
- package/dist/lib/tracers/StdioTracer.d.ts.map +1 -0
- package/dist/lib/tracers/StdioTracer.js +270 -0
- package/dist/lib/tracers/TestTracer.d.ts +95 -0
- package/dist/lib/tracers/TestTracer.d.ts.map +1 -0
- package/dist/lib/tracers/TestTracer.js +87 -0
- package/dist/lib/tracers/index.d.ts +12 -0
- package/dist/lib/tracers/index.d.ts.map +1 -0
- package/dist/lib/tracers/index.js +11 -0
- package/dist/lib/types.d.ts +366 -0
- package/dist/lib/types.d.ts.map +1 -0
- package/dist/lib/types.js +1 -0
- package/dist/lib/utf8Cache.d.ts +111 -0
- package/dist/lib/utf8Cache.d.ts.map +1 -0
- package/dist/lib/utf8Cache.js +177 -0
- package/dist/lib/wasm/WasmBufferStrategy.d.ts +88 -0
- package/dist/lib/wasm/WasmBufferStrategy.d.ts.map +1 -0
- package/dist/lib/wasm/WasmBufferStrategy.js +138 -0
- package/dist/lib/wasm/wasmAllocator.d.ts +109 -0
- package/dist/lib/wasm/wasmAllocator.d.ts.map +1 -0
- package/dist/lib/wasm/wasmAllocator.js +227 -0
- package/dist/lib/wasm/wasmSpanBuffer.d.ts +123 -0
- package/dist/lib/wasm/wasmSpanBuffer.d.ts.map +1 -0
- package/dist/lib/wasm/wasmSpanBuffer.js +772 -0
- package/dist/lib/wasm/wasmTraceRoot.d.ts +167 -0
- package/dist/lib/wasm/wasmTraceRoot.d.ts.map +1 -0
- package/dist/lib/wasm/wasmTraceRoot.js +264 -0
- package/dist/node.d.ts +7 -0
- package/dist/node.d.ts.map +1 -0
- package/dist/node.js +8 -0
- package/dist/testing.d.ts +18 -0
- package/dist/testing.d.ts.map +1 -0
- package/dist/testing.js +17 -0
- package/package.json +193 -0
- package/src/bun/preload.ts +11 -0
- package/src/bun/trace-preload.ts +14 -0
- package/src/es.ts +11 -0
- package/src/index.ts +194 -0
- package/src/lib/JsBufferStrategy.ts +102 -0
- package/src/lib/__tests__/arrow-builder-integration/arrow-conversion.test.ts +485 -0
- package/src/lib/__tests__/arrow-builder-integration/binary-arrow-conversion.test.ts +390 -0
- package/src/lib/__tests__/arrow-builder-integration/binary-comparison.test.ts +647 -0
- package/src/lib/__tests__/arrow-builder-integration/binary-format-compliance.test.ts +292 -0
- package/src/lib/__tests__/arrow-builder-integration/buffer-chaining.test.ts +354 -0
- package/src/lib/__tests__/arrow-builder-integration/foundation.test.ts +127 -0
- package/src/lib/__tests__/arrow-builder-integration/integration.test.ts +392 -0
- package/src/lib/__tests__/arrow-builder-integration/lazy-columns.test.ts +389 -0
- package/src/lib/__tests__/arrow-conversion-algorithms.test.ts +54 -0
- package/src/lib/__tests__/arrow-test-helpers.ts +71 -0
- package/src/lib/__tests__/binary-e2e.test.ts +203 -0
- package/src/lib/__tests__/buffer-overflow-op-api.test.ts +608 -0
- package/src/lib/__tests__/buffer-overflow.test.ts +612 -0
- package/src/lib/__tests__/capacity-tuning.test.ts +544 -0
- package/src/lib/__tests__/effective-schema.test.ts +439 -0
- package/src/lib/__tests__/flechette.test.ts +42 -0
- package/src/lib/__tests__/flushScheduler.test.ts +537 -0
- package/src/lib/__tests__/integration.test.ts +600 -0
- package/src/lib/__tests__/library.test.ts +934 -0
- package/src/lib/__tests__/nested-library-tasks.test.ts +849 -0
- package/src/lib/__tests__/op-context-binding.test.ts +135 -0
- package/src/lib/__tests__/op-metadata.test.ts +198 -0
- package/src/lib/__tests__/op-type-safety.test.ts +71 -0
- package/src/lib/__tests__/package-exports.test.ts +57 -0
- package/src/lib/__tests__/remapped-buffer-view-integration.test.ts +319 -0
- package/src/lib/__tests__/remapped-buffer-view.test.ts +635 -0
- package/src/lib/__tests__/scope-attributes.test.ts +348 -0
- package/src/lib/__tests__/span-lifecycle.test.ts +680 -0
- package/src/lib/__tests__/sync-async-trace.test.ts +435 -0
- package/src/lib/__tests__/test-helpers.ts +318 -0
- package/src/lib/__tests__/timestamp.test.ts +259 -0
- package/src/lib/__tests__/trace-archive-primitives.test.ts +98 -0
- package/src/lib/__tests__/traceContext-type-enforcement.test.ts +271 -0
- package/src/lib/__tests__/tracer.test.ts +211 -0
- package/src/lib/__tests__/type-narrowing.test.ts +137 -0
- package/src/lib/archive/chunkCompaction.ts +44 -0
- package/src/lib/archive/chunkEnvelope.ts +79 -0
- package/src/lib/archive/chunkRouting.ts +70 -0
- package/src/lib/archive/chunkStats.ts +25 -0
- package/src/lib/archive/index.ts +4 -0
- package/src/lib/arrow/capacityStats.ts +340 -0
- package/src/lib/arrow/dictionaries.ts +159 -0
- package/src/lib/arrow/flechette.ts +114 -0
- package/src/lib/arrow/utils.ts +126 -0
- package/src/lib/buffer/Nanoseconds.ts +131 -0
- package/src/lib/bufferStrategy.ts +106 -0
- package/src/lib/capacityTuning.ts +102 -0
- package/src/lib/codegen/__tests__/__snapshots__/evaluatorGenerator.test.ts.snap +160 -0
- package/src/lib/codegen/__tests__/__snapshots__/scopeGenerator.test.ts.snap +196 -0
- package/src/lib/codegen/__tests__/__snapshots__/spanLoggerGenerator.test.ts.snap +1965 -0
- package/src/lib/codegen/__tests__/evaluatorGenerator.test.ts +516 -0
- package/src/lib/codegen/__tests__/nullBitmap.test.ts +207 -0
- package/src/lib/codegen/__tests__/spanLoggerGenerator.test.ts +237 -0
- package/src/lib/codegen/evaluatorGenerator.ts +309 -0
- package/src/lib/codegen/fixedPositionWriterGenerator.ts +444 -0
- package/src/lib/codegen/spanLoggerGenerator.ts +715 -0
- package/src/lib/convertToArrow.ts +1805 -0
- package/src/lib/defineOpContext.ts +398 -0
- package/src/lib/errors/Blocked.ts +165 -0
- package/src/lib/errors/CodeError.ts +132 -0
- package/src/lib/errors/RetriesExhausted.ts +78 -0
- package/src/lib/errors/Transient.ts +168 -0
- package/src/lib/errors/__tests__/Blocked-config.test.ts +152 -0
- package/src/lib/errors/__tests__/Transient.test.ts +129 -0
- package/src/lib/errors/__tests__/retry-policy.test.ts +85 -0
- package/src/lib/errors/index.ts +24 -0
- package/src/lib/errors/retry-policy.ts +87 -0
- package/src/lib/flushScheduler.ts +509 -0
- package/src/lib/library.ts +682 -0
- package/src/lib/logApi.ts +70 -0
- package/src/lib/logBinding.ts +67 -0
- package/src/lib/op.ts +103 -0
- package/src/lib/opContext/__tests__/retry.test.ts +764 -0
- package/src/lib/opContext/contextTypes.ts +130 -0
- package/src/lib/opContext/createOpGroup.ts +456 -0
- package/src/lib/opContext/defineOp.ts +281 -0
- package/src/lib/opContext/featureFlagTypes.ts +54 -0
- package/src/lib/opContext/index.ts +16 -0
- package/src/lib/opContext/opGroupTypes.ts +342 -0
- package/src/lib/opContext/opTypes.ts +80 -0
- package/src/lib/opContext/spanContextTypes.ts +398 -0
- package/src/lib/opContext/types.ts +403 -0
- package/src/lib/result.ts +550 -0
- package/src/lib/schema/LogSchema.ts +153 -0
- package/src/lib/schema/__tests__/defineLogSchema.test.ts +342 -0
- package/src/lib/schema/__tests__/featureFlags.test.ts +443 -0
- package/src/lib/schema/builder.ts +201 -0
- package/src/lib/schema/defineFeatureFlags.ts +91 -0
- package/src/lib/schema/defineLogSchema.ts +291 -0
- package/src/lib/schema/evaluator.ts +404 -0
- package/src/lib/schema/extend.ts +69 -0
- package/src/lib/schema/systemSchema.ts +339 -0
- package/src/lib/schema/typeGuards.ts +163 -0
- package/src/lib/schema/types.ts +265 -0
- package/src/lib/spanBuffer.ts +571 -0
- package/src/lib/spanBufferHelpers.ts +73 -0
- package/src/lib/spanBufferStats.ts +40 -0
- package/src/lib/spanContext.ts +1566 -0
- package/src/lib/sqlite/__tests__/sqlite-common.test.ts +89 -0
- package/src/lib/sqlite/index.ts +26 -0
- package/src/lib/sqlite/sqlite-async-writer.ts +101 -0
- package/src/lib/sqlite/sqlite-common.ts +309 -0
- package/src/lib/sqlite/sqlite-d1.ts +104 -0
- package/src/lib/sqlite/sqlite-db.ts +32 -0
- package/src/lib/sqlite/sqlite-node.ts +83 -0
- package/src/lib/sqlite/sqlite-writer.ts +128 -0
- package/src/lib/testing/TRACE-TESTING.md +100 -0
- package/src/lib/testing/__tests__/bun-harness.test.ts +108 -0
- package/src/lib/testing/__tests__/extractFacts.test.ts +279 -0
- package/src/lib/testing/__tests__/facts.test.ts +324 -0
- package/src/lib/testing/__tests__/vitest-harness.test.ts +32 -0
- package/src/lib/testing/bun-harness.ts +990 -0
- package/src/lib/testing/extractFacts.ts +362 -0
- package/src/lib/testing/facts.ts +470 -0
- package/src/lib/testing/index.ts +141 -0
- package/src/lib/testing/queryable-span.ts +108 -0
- package/src/lib/testing/span-query.ts +65 -0
- package/src/lib/testing/stdio-replay.ts +50 -0
- package/src/lib/testing/trace-query.ts +329 -0
- package/src/lib/testing/vitest-harness.ts +691 -0
- package/src/lib/threadId.ts +135 -0
- package/src/lib/traceContext.ts +182 -0
- package/src/lib/traceId.ts +142 -0
- package/src/lib/traceRoot.es.ts +157 -0
- package/src/lib/traceRoot.node.ts +170 -0
- package/src/lib/traceRoot.ts +154 -0
- package/src/lib/traceRoot.universal.ts +22 -0
- package/src/lib/tracer.ts +896 -0
- package/src/lib/tracers/ArrayQueueTracer.ts +76 -0
- package/src/lib/tracers/CompositeTracer.ts +76 -0
- package/src/lib/tracers/NoOpTracer.ts +73 -0
- package/src/lib/tracers/SQLiteTracer.ts +115 -0
- package/src/lib/tracers/StdioTracer.ts +380 -0
- package/src/lib/tracers/TestTracer.ts +146 -0
- package/src/lib/tracers/__tests__/ArrayQueueTracer.test.ts +184 -0
- package/src/lib/tracers/__tests__/NoOpTracer.test.ts +204 -0
- package/src/lib/tracers/__tests__/StdioTracer.test.ts +313 -0
- package/src/lib/tracers/__tests__/TestTracer.test.ts +200 -0
- package/src/lib/tracers/index.ts +12 -0
- package/src/lib/types.ts +498 -0
- package/src/lib/utf8Cache.ts +201 -0
- package/src/lib/wasm/WasmBufferStrategy.ts +219 -0
- package/src/lib/wasm/__tests__/WasmBufferStrategy.test.ts +256 -0
- package/src/lib/wasm/__tests__/wasm-integration.test.ts +476 -0
- package/src/lib/wasm/__tests__/wasmAllocator.test.ts +699 -0
- package/src/lib/wasm/__tests__/wasmSpanBuffer.test.ts +449 -0
- package/src/lib/wasm/__tests__/wasmTraceRoot.test.ts +390 -0
- package/src/lib/wasm/__tests__/wasmTracer.test.ts.disabled +444 -0
- package/src/lib/wasm/allocator.zig +945 -0
- package/src/lib/wasm/wasmAllocator.ts +469 -0
- package/src/lib/wasm/wasmSpanBuffer.ts +1014 -0
- package/src/lib/wasm/wasmTraceRoot.ts +315 -0
- package/src/node.ts +10 -0
- package/src/testing.ts +18 -0
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TraceContext Types and Prototype System
|
|
3
|
+
*
|
|
4
|
+
* Per specs/lmao/01c_context_flow_and_op_wrappers.md and specs/lmao/01l_op_context_pattern.md:
|
|
5
|
+
* - TraceContext is created via module.traceContext() at request entry
|
|
6
|
+
* - Uses prototype-based inheritance for V8 hidden class optimization
|
|
7
|
+
* - Contains system properties (traceId, timestamps, threadId) + user Extra
|
|
8
|
+
*/
|
|
9
|
+
import type { OpContext } from './opContext/types.js';
|
|
10
|
+
import type { Result } from './result.js';
|
|
11
|
+
import type { FeatureFlagSchema } from './schema/defineFeatureFlags.js';
|
|
12
|
+
import type { FlagEvaluator } from './schema/evaluator.js';
|
|
13
|
+
import type { LogSchema } from './schema/types.js';
|
|
14
|
+
import type { TraceId } from './traceId.js';
|
|
15
|
+
/**
|
|
16
|
+
* Reserved keys that Extra cannot contain (compile-time enforcement)
|
|
17
|
+
*
|
|
18
|
+
* Per spec 01l lines 379-386
|
|
19
|
+
*/
|
|
20
|
+
export type ReservedTraceContextKeys = 'traceId' | 'anchorEpochMicros' | 'anchorPerfNow' | 'threadId' | 'ff' | 'span';
|
|
21
|
+
/**
|
|
22
|
+
* Op type - traced operation
|
|
23
|
+
*
|
|
24
|
+
* Imported from op.ts to break circular dependency.
|
|
25
|
+
* The actual Op class is defined in op.ts.
|
|
26
|
+
*/
|
|
27
|
+
import type { Op } from './op.js';
|
|
28
|
+
export type { Op } from './op.js';
|
|
29
|
+
/**
|
|
30
|
+
* Function type for ctx.span() at the root level
|
|
31
|
+
*
|
|
32
|
+
* Per spec 01c lines 243-244 and experiment exp7-full-ctx.ts lines 253-259:
|
|
33
|
+
* Supports both with and without line number (transformer injects line number)
|
|
34
|
+
*
|
|
35
|
+
* The first argument (lineNumber) is injected by the transformer.
|
|
36
|
+
*/
|
|
37
|
+
export type RootSpanFn = {
|
|
38
|
+
<Ctx extends OpContext, Args extends unknown[], S, E>(line: number, name: string, op: Op<Ctx, Args, S, E>, ...args: Args): Promise<Result<S, E>>;
|
|
39
|
+
<Ctx extends OpContext, Args extends unknown[], S, E>(name: string, op: Op<Ctx, Args, S, E>, ...args: Args): Promise<Result<S, E>>;
|
|
40
|
+
};
|
|
41
|
+
/**
|
|
42
|
+
* TraceContext system properties - root context created via module.traceContext()
|
|
43
|
+
*
|
|
44
|
+
* Per spec 01c lines 206-216 and 01l lines 369-377:
|
|
45
|
+
* - System properties are auto-generated and cannot be overridden via Extra
|
|
46
|
+
*
|
|
47
|
+
* @typeParam FF - Feature flag schema type
|
|
48
|
+
* @typeParam T - LogSchema type (for typed evaluation context)
|
|
49
|
+
* @typeParam Env - Environment type
|
|
50
|
+
*/
|
|
51
|
+
export interface TraceContextSystem<FF extends FeatureFlagSchema, T extends LogSchema = LogSchema, Env extends Record<string, unknown> = Record<string, unknown>> {
|
|
52
|
+
readonly anchorEpochMicros: number;
|
|
53
|
+
readonly anchorPerfNow: number;
|
|
54
|
+
/** Root flag evaluator - use forContext(spanCtx) to get span-bound evaluator */
|
|
55
|
+
readonly ff: FlagEvaluator<OpContext<T, FF, Record<string, never>, Env>>;
|
|
56
|
+
readonly span: RootSpanFn;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* TraceContext - system properties + user Extra
|
|
60
|
+
*
|
|
61
|
+
* Per spec 01c lines 215-216:
|
|
62
|
+
* ```typescript
|
|
63
|
+
* interface TraceContext<FF, Extra> { ... } & Extra;
|
|
64
|
+
* ```
|
|
65
|
+
*
|
|
66
|
+
* Extra properties are spread via intersection at usage site.
|
|
67
|
+
*
|
|
68
|
+
* @typeParam FF - Feature flag schema type
|
|
69
|
+
* @typeParam Extra - User-defined properties (e.g., requestId, userId, env)
|
|
70
|
+
*/
|
|
71
|
+
export type TraceContext<FF extends FeatureFlagSchema, Extra extends Record<string, unknown>> = TraceContextSystem<FF> & Extra;
|
|
72
|
+
/**
|
|
73
|
+
* Internal symbol to mark contexts as prototype-based
|
|
74
|
+
* Used for type guards and instanceof-like checks
|
|
75
|
+
*/
|
|
76
|
+
export declare const TRACE_CONTEXT_MARKER: unique symbol;
|
|
77
|
+
/**
|
|
78
|
+
* Base prototype interface for all trace contexts.
|
|
79
|
+
*
|
|
80
|
+
* Per specs/lmao/01c_context_flow_and_op_wrappers.md:
|
|
81
|
+
* - Methods are defined ONCE on a shared prototype
|
|
82
|
+
* - Object.create() is used for inheritance (no object spreads)
|
|
83
|
+
* - Properties are assigned directly for stable hidden classes
|
|
84
|
+
*
|
|
85
|
+
* This is used internally and should not be accessed directly.
|
|
86
|
+
*/
|
|
87
|
+
export interface TraceContextBase {
|
|
88
|
+
/** Marker for prototype chain detection */
|
|
89
|
+
readonly [TRACE_CONTEXT_MARKER]: true;
|
|
90
|
+
/** Trace ID for this context */
|
|
91
|
+
trace_id: TraceId | undefined;
|
|
92
|
+
/** Epoch microseconds when trace started */
|
|
93
|
+
anchorEpochMicros: number | undefined;
|
|
94
|
+
/** performance.now() when trace started */
|
|
95
|
+
anchorPerfNow: number | undefined;
|
|
96
|
+
/** Feature flag evaluator */
|
|
97
|
+
ff: unknown;
|
|
98
|
+
/** Root span function */
|
|
99
|
+
span: unknown;
|
|
100
|
+
/** Pre-computed Extra keys for V8 optimization (avoid Object.keys in hot path) */
|
|
101
|
+
_extraKeys?: string[];
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* The shared prototype object for TraceContext.
|
|
105
|
+
*
|
|
106
|
+
* Per V8 optimization guidelines:
|
|
107
|
+
* - Define methods ONCE on prototype, not per-instance
|
|
108
|
+
* - Use Object.create() for inheritance chains
|
|
109
|
+
* - Avoid object spreads which break hidden classes
|
|
110
|
+
*/
|
|
111
|
+
export declare const TraceContextProto: TraceContextBase;
|
|
112
|
+
/**
|
|
113
|
+
* Type guard to check if a value is a TraceContext
|
|
114
|
+
*/
|
|
115
|
+
export declare function isTraceContext(value: unknown): value is TraceContext<FeatureFlagSchema, Record<string, unknown>>;
|
|
116
|
+
//# sourceMappingURL=traceContext.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"traceContext.d.ts","sourceRoot":"","sources":["../../src/lib/traceContext.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AACxE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAM5C;;;;GAIG;AACH,MAAM,MAAM,wBAAwB,GAAG,SAAS,GAAG,mBAAmB,GAAG,eAAe,GAAG,UAAU,GAAG,IAAI,GAAG,MAAM,CAAC;AAMtH;;;;;GAKG;AACH,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,SAAS,CAAC;AAElC,YAAY,EAAE,EAAE,EAAE,MAAM,SAAS,CAAC;AAMlC;;;;;;;GAOG;AACH,MAAM,MAAM,UAAU,GAAG;IAEvB,CAAC,GAAG,SAAS,SAAS,EAAE,IAAI,SAAS,OAAO,EAAE,EAAE,CAAC,EAAE,CAAC,EAClD,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,EAAE,EAAE,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,EACvB,GAAG,IAAI,EAAE,IAAI,GACZ,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAEzB,CAAC,GAAG,SAAS,SAAS,EAAE,IAAI,SAAS,OAAO,EAAE,EAAE,CAAC,EAAE,CAAC,EAClD,IAAI,EAAE,MAAM,EACZ,EAAE,EAAE,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,EACvB,GAAG,IAAI,EAAE,IAAI,GACZ,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;CAC1B,CAAC;AAMF;;;;;;;;;GASG;AACH,MAAM,WAAW,kBAAkB,CACjC,EAAE,SAAS,iBAAiB,EAC5B,CAAC,SAAS,SAAS,GAAG,SAAS,EAC/B,GAAG,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAG7D,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,gFAAgF;IAChF,QAAQ,CAAC,EAAE,EAAE,aAAa,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;IACzE,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;CAC3B;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,MAAM,YAAY,CAAC,EAAE,SAAS,iBAAiB,EAAE,KAAK,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,kBAAkB,CAAC,EAAE,CAAC,GACpH,KAAK,CAAC;AAMR;;;GAGG;AACH,eAAO,MAAM,oBAAoB,eAAkC,CAAC;AAEpE;;;;;;;;;GASG;AACH,MAAM,WAAW,gBAAgB;IAC/B,2CAA2C;IAC3C,QAAQ,CAAC,CAAC,oBAAoB,CAAC,EAAE,IAAI,CAAC;IACtC,gCAAgC;IAChC,QAAQ,EAAE,OAAO,GAAG,SAAS,CAAC;IAC9B,4CAA4C;IAC5C,iBAAiB,EAAE,MAAM,GAAG,SAAS,CAAC;IACtC,2CAA2C;IAC3C,aAAa,EAAE,MAAM,GAAG,SAAS,CAAC;IAClC,6BAA6B;IAC7B,EAAE,EAAE,OAAO,CAAC;IACZ,yBAAyB;IACzB,IAAI,EAAE,OAAO,CAAC;IACd,kFAAkF;IAClF,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;CACvB;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,iBAAiB,EAAE,gBAQ/B,CAAC;AAMF;;GAEG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,YAAY,CAAC,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAOhH"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
// =============================================================================
|
|
2
|
+
// Prototype System for V8 Hidden Class Optimization
|
|
3
|
+
// =============================================================================
|
|
4
|
+
/**
|
|
5
|
+
* Internal symbol to mark contexts as prototype-based
|
|
6
|
+
* Used for type guards and instanceof-like checks
|
|
7
|
+
*/
|
|
8
|
+
export const TRACE_CONTEXT_MARKER = Symbol.for('lmao.TraceContext');
|
|
9
|
+
/**
|
|
10
|
+
* The shared prototype object for TraceContext.
|
|
11
|
+
*
|
|
12
|
+
* Per V8 optimization guidelines:
|
|
13
|
+
* - Define methods ONCE on prototype, not per-instance
|
|
14
|
+
* - Use Object.create() for inheritance chains
|
|
15
|
+
* - Avoid object spreads which break hidden classes
|
|
16
|
+
*/
|
|
17
|
+
export const TraceContextProto = {
|
|
18
|
+
[TRACE_CONTEXT_MARKER]: true,
|
|
19
|
+
trace_id: undefined,
|
|
20
|
+
anchorEpochMicros: undefined,
|
|
21
|
+
anchorPerfNow: undefined,
|
|
22
|
+
ff: undefined,
|
|
23
|
+
span: undefined,
|
|
24
|
+
_extraKeys: undefined,
|
|
25
|
+
};
|
|
26
|
+
// =============================================================================
|
|
27
|
+
// Type Guard
|
|
28
|
+
// =============================================================================
|
|
29
|
+
/**
|
|
30
|
+
* Type guard to check if a value is a TraceContext
|
|
31
|
+
*/
|
|
32
|
+
export function isTraceContext(value) {
|
|
33
|
+
return (typeof value === 'object' &&
|
|
34
|
+
value !== null &&
|
|
35
|
+
TRACE_CONTEXT_MARKER in value &&
|
|
36
|
+
value[TRACE_CONTEXT_MARKER] === true);
|
|
37
|
+
}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TraceId - Branded string type for trace identification
|
|
3
|
+
*
|
|
4
|
+
* A TraceId is a string that uniquely identifies a distributed trace.
|
|
5
|
+
* It's validated to be non-empty and at most 128 characters (ASCII).
|
|
6
|
+
*
|
|
7
|
+
* Common formats:
|
|
8
|
+
* - W3C Trace Context: 32 hex chars (e.g., "0af7651916cd43dd8448eb211c80319c")
|
|
9
|
+
* - OpenTelemetry: same as W3C
|
|
10
|
+
* - Custom: any string up to 128 chars
|
|
11
|
+
*
|
|
12
|
+
* @module traceId
|
|
13
|
+
*/
|
|
14
|
+
/** Maximum length for a trace ID */
|
|
15
|
+
export declare const MAX_TRACE_ID_LENGTH = 128;
|
|
16
|
+
/** Branded type for validated trace IDs */
|
|
17
|
+
export type TraceId = string & {
|
|
18
|
+
readonly __brand: 'TraceId';
|
|
19
|
+
};
|
|
20
|
+
/**
|
|
21
|
+
* Validate and create a TraceId from a string.
|
|
22
|
+
* @throws Error if validation fails
|
|
23
|
+
*/
|
|
24
|
+
export declare function createTraceId(value: string): TraceId;
|
|
25
|
+
/**
|
|
26
|
+
* Check if a value is a valid TraceId without throwing.
|
|
27
|
+
*/
|
|
28
|
+
export declare function isValidTraceId(value: unknown): value is TraceId;
|
|
29
|
+
/**
|
|
30
|
+
* Generate a new random TraceId (W3C format: 32 hex chars).
|
|
31
|
+
*/
|
|
32
|
+
export declare function generateTraceId(): TraceId;
|
|
33
|
+
/**
|
|
34
|
+
* SpanIdentity - Identifies a specific span for external correlation.
|
|
35
|
+
*
|
|
36
|
+
* distributed tracing headers, error reporting). Contains the minimal fields needed
|
|
37
|
+
* to uniquely identify a span within a trace.
|
|
38
|
+
*
|
|
39
|
+
* **Usage:**
|
|
40
|
+
* ```typescript
|
|
41
|
+
* // Extract from buffer
|
|
42
|
+
* const identity: SpanIdentity = {
|
|
43
|
+
* trace_id: buffer.trace_id,
|
|
44
|
+
* span_id: buffer.span_id,
|
|
45
|
+
* thread_id: buffer.thread_id,
|
|
46
|
+
* };
|
|
47
|
+
*
|
|
48
|
+
* // Use in signals/messages
|
|
49
|
+
* signalReportDown({ service, reporter, span: identity });
|
|
50
|
+
* ```
|
|
51
|
+
*
|
|
52
|
+
* **Fields:**
|
|
53
|
+
* - `trace_id`: 128-bit UUID identifying the entire trace (branded string)
|
|
54
|
+
* - `span_id`: 32-bit counter unique within the trace
|
|
55
|
+
* - `thread_id`: 64-bit identifier for execution thread/context
|
|
56
|
+
*
|
|
57
|
+
* @see specs/lmao/01b4_span_identity.md for full identity design
|
|
58
|
+
*/
|
|
59
|
+
export interface SpanIdentity {
|
|
60
|
+
/** Trace ID - 128-bit UUID identifying the entire trace */
|
|
61
|
+
readonly trace_id: TraceId;
|
|
62
|
+
/** Span ID - 32-bit counter unique within this trace */
|
|
63
|
+
readonly span_id: number;
|
|
64
|
+
/** Thread ID - 64-bit identifier for execution thread/context */
|
|
65
|
+
readonly thread_id: bigint;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Extract SpanIdentity from a span buffer.
|
|
69
|
+
*
|
|
70
|
+
* @param buffer - Any object with trace_id, span_id, thread_id properties
|
|
71
|
+
* @returns SpanIdentity for external correlation
|
|
72
|
+
*/
|
|
73
|
+
export declare function extractSpanIdentity(buffer: {
|
|
74
|
+
trace_id: TraceId;
|
|
75
|
+
span_id: number;
|
|
76
|
+
thread_id: bigint;
|
|
77
|
+
}): SpanIdentity;
|
|
78
|
+
//# sourceMappingURL=traceId.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"traceId.d.ts","sourceRoot":"","sources":["../../src/lib/traceId.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,oCAAoC;AACpC,eAAO,MAAM,mBAAmB,MAAM,CAAC;AAEvC,2CAA2C;AAC3C,MAAM,MAAM,OAAO,GAAG,MAAM,GAAG;IAAE,QAAQ,CAAC,OAAO,EAAE,SAAS,CAAA;CAAE,CAAC;AAU/D;;;GAGG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAcpD;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,OAAO,CAI/D;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,OAAO,CA0BzC;AAMD;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,MAAM,WAAW,YAAY;IAC3B,2DAA2D;IAC3D,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAE3B,wDAAwD;IACxD,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IAEzB,iEAAiE;IACjE,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE;IAAE,QAAQ,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GAAG,YAAY,CAMnH"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TraceId - Branded string type for trace identification
|
|
3
|
+
*
|
|
4
|
+
* A TraceId is a string that uniquely identifies a distributed trace.
|
|
5
|
+
* It's validated to be non-empty and at most 128 characters (ASCII).
|
|
6
|
+
*
|
|
7
|
+
* Common formats:
|
|
8
|
+
* - W3C Trace Context: 32 hex chars (e.g., "0af7651916cd43dd8448eb211c80319c")
|
|
9
|
+
* - OpenTelemetry: same as W3C
|
|
10
|
+
* - Custom: any string up to 128 chars
|
|
11
|
+
*
|
|
12
|
+
* @module traceId
|
|
13
|
+
*/
|
|
14
|
+
/** Maximum length for a trace ID */
|
|
15
|
+
export const MAX_TRACE_ID_LENGTH = 128;
|
|
16
|
+
function brandTraceId(value) {
|
|
17
|
+
return value;
|
|
18
|
+
}
|
|
19
|
+
/** Precompiled regex for non-ASCII detection (2x faster than loop) */
|
|
20
|
+
const NON_ASCII_REGEX = /[^\x20-\x7E]/;
|
|
21
|
+
/**
|
|
22
|
+
* Validate and create a TraceId from a string.
|
|
23
|
+
* @throws Error if validation fails
|
|
24
|
+
*/
|
|
25
|
+
export function createTraceId(value) {
|
|
26
|
+
if (typeof value !== 'string') {
|
|
27
|
+
throw new Error('TraceId must be a string');
|
|
28
|
+
}
|
|
29
|
+
if (value.length === 0) {
|
|
30
|
+
throw new Error('TraceId cannot be empty');
|
|
31
|
+
}
|
|
32
|
+
if (value.length > MAX_TRACE_ID_LENGTH) {
|
|
33
|
+
throw new Error(`TraceId cannot exceed ${MAX_TRACE_ID_LENGTH} characters`);
|
|
34
|
+
}
|
|
35
|
+
if (NON_ASCII_REGEX.test(value)) {
|
|
36
|
+
throw new Error('TraceId must be ASCII printable characters only');
|
|
37
|
+
}
|
|
38
|
+
return brandTraceId(value);
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Check if a value is a valid TraceId without throwing.
|
|
42
|
+
*/
|
|
43
|
+
export function isValidTraceId(value) {
|
|
44
|
+
return (typeof value === 'string' && value.length > 0 && value.length <= MAX_TRACE_ID_LENGTH && !NON_ASCII_REGEX.test(value));
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Generate a new random TraceId (W3C format: 32 hex chars).
|
|
48
|
+
*/
|
|
49
|
+
export function generateTraceId() {
|
|
50
|
+
const bytes = new Uint8Array(16);
|
|
51
|
+
if (typeof crypto !== 'undefined' && typeof crypto.getRandomValues === 'function') {
|
|
52
|
+
crypto.getRandomValues(bytes);
|
|
53
|
+
}
|
|
54
|
+
else {
|
|
55
|
+
try {
|
|
56
|
+
const nodeCrypto = require('node:crypto');
|
|
57
|
+
if (nodeCrypto?.randomFillSync) {
|
|
58
|
+
nodeCrypto.randomFillSync(bytes);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
catch {
|
|
62
|
+
// Fallback to Math.random (not ideal but works)
|
|
63
|
+
for (let i = 0; i < 16; i++) {
|
|
64
|
+
bytes[i] = Math.floor(Math.random() * 256);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
// Convert to hex string
|
|
69
|
+
let hex = '';
|
|
70
|
+
for (let i = 0; i < 16; i++) {
|
|
71
|
+
hex += bytes[i].toString(16).padStart(2, '0');
|
|
72
|
+
}
|
|
73
|
+
return brandTraceId(hex);
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Extract SpanIdentity from a span buffer.
|
|
77
|
+
*
|
|
78
|
+
* @param buffer - Any object with trace_id, span_id, thread_id properties
|
|
79
|
+
* @returns SpanIdentity for external correlation
|
|
80
|
+
*/
|
|
81
|
+
export function extractSpanIdentity(buffer) {
|
|
82
|
+
return {
|
|
83
|
+
trace_id: buffer.trace_id,
|
|
84
|
+
span_id: buffer.span_id,
|
|
85
|
+
thread_id: buffer.thread_id,
|
|
86
|
+
};
|
|
87
|
+
}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TraceRoot - Platform-agnostic interface for trace anchoring and timestamp writes.
|
|
3
|
+
*
|
|
4
|
+
* TraceRoot manages:
|
|
5
|
+
* - Trace ID storage
|
|
6
|
+
* - Timestamp anchoring (epoch + high-res timer reference)
|
|
7
|
+
* - Writing span-start/span-end to SpanBuffer's _system columns
|
|
8
|
+
*
|
|
9
|
+
* Platform-specific implementations:
|
|
10
|
+
* - TraceRoot.es.ts: Browser - uses performance.now() for timing
|
|
11
|
+
* - TraceRoot.node.ts: Node.js - delegates to NAPI addon for optimized writes
|
|
12
|
+
*
|
|
13
|
+
* @module traceRoot
|
|
14
|
+
*/
|
|
15
|
+
import type { Nanoseconds } from '@smoothbricks/arrow-builder';
|
|
16
|
+
import type { AnySpanBuffer } from './types.js';
|
|
17
|
+
export type { SpanIdentity, TraceId } from './traceId.js';
|
|
18
|
+
export { createTraceId, extractSpanIdentity, generateTraceId, isValidTraceId, MAX_TRACE_ID_LENGTH } from './traceId.js';
|
|
19
|
+
/**
|
|
20
|
+
* Tracer lifecycle hooks interface.
|
|
21
|
+
* Extracted to avoid circular dependency - Tracer implements this.
|
|
22
|
+
*/
|
|
23
|
+
export interface TracerLifecycleHooks {
|
|
24
|
+
onTraceStart(buffer: unknown): void;
|
|
25
|
+
onTraceEnd(buffer: unknown): void;
|
|
26
|
+
onSpanStart(buffer: unknown): void;
|
|
27
|
+
onSpanEnd(buffer: unknown): void;
|
|
28
|
+
onStatsWillResetFor(buffer: unknown): void;
|
|
29
|
+
/**
|
|
30
|
+
* Buffer strategy for creating child and overflow buffers.
|
|
31
|
+
* SpanContext uses this to create child spans with the correct strategy (JS or WASM).
|
|
32
|
+
* Note: Caller must call writeSpanStart() after createChildSpanBuffer() to set span name.
|
|
33
|
+
*/
|
|
34
|
+
readonly bufferStrategy: {
|
|
35
|
+
createChildSpanBuffer(parentBuffer: AnySpanBuffer, callsiteMetadata: unknown, opMetadata: unknown, capacity?: number, schema?: unknown): AnySpanBuffer;
|
|
36
|
+
createOverflowBuffer(buffer: AnySpanBuffer): AnySpanBuffer;
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* TraceRoot._system memory layout (little-endian):
|
|
41
|
+
*
|
|
42
|
+
* Offset Size Field
|
|
43
|
+
* 0 8 anchorEpochNanos (i64) - epoch time in nanoseconds
|
|
44
|
+
* 8 8 anchorPerfNow (f64) - high-res timer anchor
|
|
45
|
+
* 16 1 trace_id_len (u8) - length of trace_id UTF-8 bytes
|
|
46
|
+
* 17 N trace_id (UTF-8 bytes)
|
|
47
|
+
*
|
|
48
|
+
* Total: 17 + trace_id.length bytes
|
|
49
|
+
*
|
|
50
|
+
* This layout enables NAPI/WASM to read anchors directly without BigInt extraction.
|
|
51
|
+
*/
|
|
52
|
+
export declare const TRACE_ROOT_ANCHOR_EPOCH_OFFSET = 0;
|
|
53
|
+
export declare const TRACE_ROOT_ANCHOR_PERF_OFFSET = 8;
|
|
54
|
+
export declare const TRACE_ROOT_TRACE_ID_LEN_OFFSET = 16;
|
|
55
|
+
export declare const TRACE_ROOT_TRACE_ID_OFFSET = 17;
|
|
56
|
+
/**
|
|
57
|
+
* TraceRoot interface - implemented by platform-specific classes.
|
|
58
|
+
*
|
|
59
|
+
* Each implementation handles timestamp calculation and span writes differently:
|
|
60
|
+
* - Browser: Pure JS with performance.now()
|
|
61
|
+
* - Node.js: NAPI addon with mach_absolute_time() / clock_gettime()
|
|
62
|
+
*/
|
|
63
|
+
/**
|
|
64
|
+
* Factory function type for creating platform-specific TraceRoot instances.
|
|
65
|
+
* Passed to Tracer constructor to enable tree-shaking of unused platform code.
|
|
66
|
+
*
|
|
67
|
+
* The factory creates anchor timestamps internally using platform-specific APIs.
|
|
68
|
+
*/
|
|
69
|
+
export type TraceRootFactory = (trace_id: string, tracer: TracerLifecycleHooks) => ITraceRoot;
|
|
70
|
+
export interface ITraceRoot {
|
|
71
|
+
/**
|
|
72
|
+
* Raw backing buffer containing anchor timestamps and trace_id.
|
|
73
|
+
* NAPI/WASM can read this directly without BigInt extraction.
|
|
74
|
+
*/
|
|
75
|
+
readonly _system: ArrayBuffer;
|
|
76
|
+
/**
|
|
77
|
+
* Tracer reference for lifecycle hooks and event callbacks.
|
|
78
|
+
*/
|
|
79
|
+
readonly tracer: TracerLifecycleHooks;
|
|
80
|
+
/**
|
|
81
|
+
* Trace ID for this trace.
|
|
82
|
+
*/
|
|
83
|
+
readonly trace_id: string;
|
|
84
|
+
/**
|
|
85
|
+
* Epoch time in nanoseconds when trace was created.
|
|
86
|
+
* Used by SpanLogger for log entry timestamps.
|
|
87
|
+
*/
|
|
88
|
+
readonly anchorEpochNanos: bigint;
|
|
89
|
+
/**
|
|
90
|
+
* High-resolution timer anchor when trace was created.
|
|
91
|
+
* Browser: performance.now() value (number)
|
|
92
|
+
* Node.js: stored as number for NAPI compatibility, but represents hrtime
|
|
93
|
+
*/
|
|
94
|
+
readonly anchorPerfNow: number;
|
|
95
|
+
/**
|
|
96
|
+
* Get current timestamp in nanoseconds since Unix epoch.
|
|
97
|
+
* Platform-specific implementation.
|
|
98
|
+
*/
|
|
99
|
+
getTimestampNanos(): Nanoseconds;
|
|
100
|
+
/**
|
|
101
|
+
* Write span-start entry to buffer at row 0.
|
|
102
|
+
*
|
|
103
|
+
* Writes:
|
|
104
|
+
* - timestamp[0] = current time
|
|
105
|
+
* - entry_type[0] = SPAN_START
|
|
106
|
+
* - entry_type[1] = SPAN_EXCEPTION (pre-initialized for crash safety)
|
|
107
|
+
* - timestamp[1] = 0 (will be set on completion)
|
|
108
|
+
* - message[0] = spanName
|
|
109
|
+
* - _writeIndex = 2
|
|
110
|
+
*
|
|
111
|
+
* @param buffer - SpanBuffer to write to
|
|
112
|
+
* @param spanName - Name for this span
|
|
113
|
+
*/
|
|
114
|
+
writeSpanStart(buffer: AnySpanBuffer, spanName: string): void;
|
|
115
|
+
/**
|
|
116
|
+
* Write span-end entry to buffer at row 1.
|
|
117
|
+
* Writes both timestamp and entry_type.
|
|
118
|
+
*
|
|
119
|
+
* @param buffer - SpanBuffer to write to
|
|
120
|
+
* @param entryType - Entry type (SPAN_OK, SPAN_ERR, or SPAN_EXCEPTION)
|
|
121
|
+
*/
|
|
122
|
+
writeSpanEnd(buffer: AnySpanBuffer, entryType: number): void;
|
|
123
|
+
/**
|
|
124
|
+
* Write log entry: bump writeIndex, write timestamp + entry_type, return idx.
|
|
125
|
+
* SpanLogger uses returned idx for string column writes.
|
|
126
|
+
*
|
|
127
|
+
* @param buffer - SpanBuffer to write to
|
|
128
|
+
* @param entryType - Entry type (INFO, DEBUG, WARN, ERROR, TRACE, FF_ACCESS, FF_USAGE)
|
|
129
|
+
* @returns The row index where entry was written
|
|
130
|
+
*/
|
|
131
|
+
writeLogEntry(buffer: AnySpanBuffer, entryType: number): number;
|
|
132
|
+
}
|
|
133
|
+
//# sourceMappingURL=traceRoot.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"traceRoot.d.ts","sourceRoot":"","sources":["../../src/lib/traceRoot.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAC/D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD,YAAY,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAE1D,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,eAAe,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAExH;;;GAGG;AACH,MAAM,WAAW,oBAAoB;IACnC,YAAY,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI,CAAC;IACpC,UAAU,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI,CAAC;IAClC,WAAW,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI,CAAC;IACnC,SAAS,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI,CAAC;IACjC,mBAAmB,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI,CAAC;IAE3C;;;;OAIG;IACH,QAAQ,CAAC,cAAc,EAAE;QACvB,qBAAqB,CACnB,YAAY,EAAE,aAAa,EAC3B,gBAAgB,EAAE,OAAO,EACzB,UAAU,EAAE,OAAO,EACnB,QAAQ,CAAC,EAAE,MAAM,EACjB,MAAM,CAAC,EAAE,OAAO,GACf,aAAa,CAAC;QACjB,oBAAoB,CAAC,MAAM,EAAE,aAAa,GAAG,aAAa,CAAC;KAC5D,CAAC;CACH;AAED;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,8BAA8B,IAAI,CAAC;AAChD,eAAO,MAAM,6BAA6B,IAAI,CAAC;AAC/C,eAAO,MAAM,8BAA8B,KAAK,CAAC;AACjD,eAAO,MAAM,0BAA0B,KAAK,CAAC;AAE7C;;;;;;GAMG;AACH;;;;;GAKG;AACH,MAAM,MAAM,gBAAgB,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,oBAAoB,KAAK,UAAU,CAAC;AAE9F,MAAM,WAAW,UAAU;IACzB;;;OAGG;IACH,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAC;IAE9B;;OAEG;IACH,QAAQ,CAAC,MAAM,EAAE,oBAAoB,CAAC;IAEtC;;OAEG;IACH,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAE1B;;;OAGG;IACH,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAElC;;;;OAIG;IACH,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAE/B;;;OAGG;IACH,iBAAiB,IAAI,WAAW,CAAC;IAEjC;;;;;;;;;;;;;OAaG;IACH,cAAc,CAAC,MAAM,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IAE9D;;;;;;OAMG;IACH,YAAY,CAAC,MAAM,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IAE7D;;;;;;;OAOG;IACH,aAAa,CAAC,MAAM,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAAC;CACjE"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TraceRoot - Browser/ES implementation.
|
|
3
|
+
*
|
|
4
|
+
* Uses performance.now() for timing with microsecond precision (~5-20μs).
|
|
5
|
+
* Last 3 digits of nanoseconds are always 000.
|
|
6
|
+
*
|
|
7
|
+
* For Node.js with NAPI-optimized writes, use traceRoot.node.ts instead.
|
|
8
|
+
*
|
|
9
|
+
* @module traceRoot.es
|
|
10
|
+
*/
|
|
11
|
+
import { Nanoseconds } from '@smoothbricks/arrow-builder';
|
|
12
|
+
import { type TraceId } from './traceId.js';
|
|
13
|
+
import { type ITraceRoot, type TracerLifecycleHooks } from './traceRoot.js';
|
|
14
|
+
import type { AnySpanBuffer } from './types.js';
|
|
15
|
+
/**
|
|
16
|
+
* TraceRoot - Browser implementation with performance.now() timing.
|
|
17
|
+
*
|
|
18
|
+
* Stores anchor data in _system ArrayBuffer for consistency with Node.js layout,
|
|
19
|
+
* but all timestamp calculations are done in pure JS.
|
|
20
|
+
*/
|
|
21
|
+
export declare class TraceRoot implements ITraceRoot {
|
|
22
|
+
/**
|
|
23
|
+
* Raw backing buffer containing anchor timestamps and trace_id.
|
|
24
|
+
*/
|
|
25
|
+
readonly _system: ArrayBuffer;
|
|
26
|
+
/**
|
|
27
|
+
* Tracer reference for lifecycle hooks and event callbacks.
|
|
28
|
+
*/
|
|
29
|
+
readonly tracer: TracerLifecycleHooks;
|
|
30
|
+
/**
|
|
31
|
+
* Cached TypedArray views for fast JS access.
|
|
32
|
+
*/
|
|
33
|
+
private readonly _epochView;
|
|
34
|
+
private readonly _perfView;
|
|
35
|
+
constructor(trace_id: TraceId, anchorEpochNanos: bigint, anchorPerfNow: number, tracer: TracerLifecycleHooks);
|
|
36
|
+
/**
|
|
37
|
+
* Epoch time in nanoseconds when trace was created.
|
|
38
|
+
*/
|
|
39
|
+
get anchorEpochNanos(): bigint;
|
|
40
|
+
/**
|
|
41
|
+
* High-resolution timer anchor when trace was created (performance.now() value).
|
|
42
|
+
*/
|
|
43
|
+
get anchorPerfNow(): number;
|
|
44
|
+
/**
|
|
45
|
+
* Trace ID for this trace.
|
|
46
|
+
*/
|
|
47
|
+
get trace_id(): TraceId;
|
|
48
|
+
/**
|
|
49
|
+
* Get current timestamp in nanoseconds since Unix epoch.
|
|
50
|
+
* Uses performance.now() - microsecond precision (last 3 digits = 000).
|
|
51
|
+
*/
|
|
52
|
+
getTimestampNanos(): Nanoseconds;
|
|
53
|
+
/**
|
|
54
|
+
* Write span-start entry to buffer at row 0.
|
|
55
|
+
*
|
|
56
|
+
* Pure JS implementation - writes timestamp, entry_type, message, and sets _writeIndex.
|
|
57
|
+
*/
|
|
58
|
+
writeSpanStart(buffer: AnySpanBuffer, spanName: string): void;
|
|
59
|
+
/**
|
|
60
|
+
* Write span-end entry to buffer at row 1.
|
|
61
|
+
* Writes both timestamp and entry_type.
|
|
62
|
+
*/
|
|
63
|
+
writeSpanEnd(buffer: AnySpanBuffer, entryType: number): void;
|
|
64
|
+
/**
|
|
65
|
+
* Write log entry: bump writeIndex, write timestamp + entry_type, return idx.
|
|
66
|
+
* SpanLogger uses returned idx for string column writes.
|
|
67
|
+
*/
|
|
68
|
+
writeLogEntry(buffer: AnySpanBuffer, entryType: number): number;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Factory function for creating browser TraceRoot instances.
|
|
72
|
+
* Pass this to Tracer constructor for browser/ES environments.
|
|
73
|
+
*/
|
|
74
|
+
export declare function createTraceRoot(trace_id: string, tracer: TracerLifecycleHooks): TraceRoot;
|
|
75
|
+
//# sourceMappingURL=traceRoot.es.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"traceRoot.es.d.ts","sourceRoot":"","sources":["../../src/lib/traceRoot.es.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAE1D,OAAO,EAAiB,KAAK,OAAO,EAAE,MAAM,cAAc,CAAC;AAC3D,OAAO,EACL,KAAK,UAAU,EAKf,KAAK,oBAAoB,EAC1B,MAAM,gBAAgB,CAAC;AACxB,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAQhD;;;;;GAKG;AACH,qBAAa,SAAU,YAAW,UAAU;IAC1C;;OAEG;IACH,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAC;IAE9B;;OAEG;IACH,QAAQ,CAAC,MAAM,EAAE,oBAAoB,CAAC;IAEtC;;OAEG;IACH,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAgB;IAC3C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAe;gBAE7B,QAAQ,EAAE,OAAO,EAAE,gBAAgB,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,EAAE,oBAAoB;IAqB5G;;OAEG;IACH,IAAI,gBAAgB,IAAI,MAAM,CAE7B;IAED;;OAEG;IACH,IAAI,aAAa,IAAI,MAAM,CAE1B;IAED;;OAEG;IACH,IAAI,QAAQ,IAAI,OAAO,CAGtB;IAED;;;OAGG;IACH,iBAAiB,IAAI,WAAW;IAOhC;;;;OAIG;IACH,cAAc,CAAC,MAAM,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI;IAc7D;;;OAGG;IACH,YAAY,CAAC,MAAM,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI;IAK5D;;;OAGG;IACH,aAAa,CAAC,MAAM,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM;CAOhE;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,oBAAoB,GAAG,SAAS,CAIzF"}
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TraceRoot - Browser/ES implementation.
|
|
3
|
+
*
|
|
4
|
+
* Uses performance.now() for timing with microsecond precision (~5-20μs).
|
|
5
|
+
* Last 3 digits of nanoseconds are always 000.
|
|
6
|
+
*
|
|
7
|
+
* For Node.js with NAPI-optimized writes, use traceRoot.node.ts instead.
|
|
8
|
+
*
|
|
9
|
+
* @module traceRoot.es
|
|
10
|
+
*/
|
|
11
|
+
import { Nanoseconds } from '@smoothbricks/arrow-builder';
|
|
12
|
+
import { ENTRY_TYPE_SPAN_EXCEPTION, ENTRY_TYPE_SPAN_START } from './schema/systemSchema.js';
|
|
13
|
+
import { createTraceId } from './traceId.js';
|
|
14
|
+
import { TRACE_ROOT_ANCHOR_EPOCH_OFFSET, TRACE_ROOT_ANCHOR_PERF_OFFSET, TRACE_ROOT_TRACE_ID_LEN_OFFSET, TRACE_ROOT_TRACE_ID_OFFSET, } from './traceRoot.js';
|
|
15
|
+
/** Shared TextEncoder for trace_id encoding (stateless, reusable) */
|
|
16
|
+
const textEncoder = new TextEncoder();
|
|
17
|
+
/** Shared TextDecoder for trace_id decoding (stateless, reusable) */
|
|
18
|
+
const textDecoder = new TextDecoder();
|
|
19
|
+
/**
|
|
20
|
+
* TraceRoot - Browser implementation with performance.now() timing.
|
|
21
|
+
*
|
|
22
|
+
* Stores anchor data in _system ArrayBuffer for consistency with Node.js layout,
|
|
23
|
+
* but all timestamp calculations are done in pure JS.
|
|
24
|
+
*/
|
|
25
|
+
export class TraceRoot {
|
|
26
|
+
/**
|
|
27
|
+
* Raw backing buffer containing anchor timestamps and trace_id.
|
|
28
|
+
*/
|
|
29
|
+
_system;
|
|
30
|
+
/**
|
|
31
|
+
* Tracer reference for lifecycle hooks and event callbacks.
|
|
32
|
+
*/
|
|
33
|
+
tracer;
|
|
34
|
+
/**
|
|
35
|
+
* Cached TypedArray views for fast JS access.
|
|
36
|
+
*/
|
|
37
|
+
_epochView;
|
|
38
|
+
_perfView;
|
|
39
|
+
constructor(trace_id, anchorEpochNanos, anchorPerfNow, tracer) {
|
|
40
|
+
// Allocate buffer: 17 bytes header + trace_id length
|
|
41
|
+
// trace_id is validated to be ASCII (1 byte per char) so length === byte length
|
|
42
|
+
this._system = new ArrayBuffer(TRACE_ROOT_TRACE_ID_OFFSET + trace_id.length);
|
|
43
|
+
this.tracer = tracer;
|
|
44
|
+
// Create cached views (one-time allocation)
|
|
45
|
+
this._epochView = new BigInt64Array(this._system, TRACE_ROOT_ANCHOR_EPOCH_OFFSET, 1);
|
|
46
|
+
this._perfView = new Float64Array(this._system, TRACE_ROOT_ANCHOR_PERF_OFFSET, 1);
|
|
47
|
+
// Write anchor data directly
|
|
48
|
+
this._epochView[0] = anchorEpochNanos;
|
|
49
|
+
this._perfView[0] = anchorPerfNow;
|
|
50
|
+
// Encode trace_id directly into buffer (no intermediate allocation)
|
|
51
|
+
const u8View = new Uint8Array(this._system, TRACE_ROOT_TRACE_ID_LEN_OFFSET);
|
|
52
|
+
const traceIdDest = new Uint8Array(this._system, TRACE_ROOT_TRACE_ID_OFFSET, trace_id.length);
|
|
53
|
+
const { written } = textEncoder.encodeInto(trace_id, traceIdDest);
|
|
54
|
+
u8View[0] = written;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Epoch time in nanoseconds when trace was created.
|
|
58
|
+
*/
|
|
59
|
+
get anchorEpochNanos() {
|
|
60
|
+
return this._epochView[0];
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* High-resolution timer anchor when trace was created (performance.now() value).
|
|
64
|
+
*/
|
|
65
|
+
get anchorPerfNow() {
|
|
66
|
+
return this._perfView[0];
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Trace ID for this trace.
|
|
70
|
+
*/
|
|
71
|
+
get trace_id() {
|
|
72
|
+
const len = new Uint8Array(this._system, TRACE_ROOT_TRACE_ID_LEN_OFFSET, 1)[0];
|
|
73
|
+
return createTraceId(textDecoder.decode(new Uint8Array(this._system, TRACE_ROOT_TRACE_ID_OFFSET, len)));
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Get current timestamp in nanoseconds since Unix epoch.
|
|
77
|
+
* Uses performance.now() - microsecond precision (last 3 digits = 000).
|
|
78
|
+
*/
|
|
79
|
+
getTimestampNanos() {
|
|
80
|
+
const elapsedMs = performance.now() - this._perfView[0];
|
|
81
|
+
// Convert to nanoseconds (last 3 digits = 000 due to microsecond precision)
|
|
82
|
+
const elapsedNanos = BigInt(Math.floor(elapsedMs * 1000)) * 1000n;
|
|
83
|
+
return Nanoseconds.unsafe(this._epochView[0] + elapsedNanos);
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Write span-start entry to buffer at row 0.
|
|
87
|
+
*
|
|
88
|
+
* Pure JS implementation - writes timestamp, entry_type, message, and sets _writeIndex.
|
|
89
|
+
*/
|
|
90
|
+
writeSpanStart(buffer, spanName) {
|
|
91
|
+
// Row 0: span-start
|
|
92
|
+
buffer.timestamp[0] = this.getTimestampNanos();
|
|
93
|
+
buffer.entry_type[0] = ENTRY_TYPE_SPAN_START;
|
|
94
|
+
buffer.message(0, spanName);
|
|
95
|
+
// Row 1: pre-initialize as span-exception (will be overwritten on ok/err)
|
|
96
|
+
buffer.entry_type[1] = ENTRY_TYPE_SPAN_EXCEPTION;
|
|
97
|
+
buffer.timestamp[1] = 0n;
|
|
98
|
+
// Events start at row 2
|
|
99
|
+
buffer._writeIndex = 2;
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Write span-end entry to buffer at row 1.
|
|
103
|
+
* Writes both timestamp and entry_type.
|
|
104
|
+
*/
|
|
105
|
+
writeSpanEnd(buffer, entryType) {
|
|
106
|
+
buffer.timestamp[1] = this.getTimestampNanos();
|
|
107
|
+
buffer.entry_type[1] = entryType;
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Write log entry: bump writeIndex, write timestamp + entry_type, return idx.
|
|
111
|
+
* SpanLogger uses returned idx for string column writes.
|
|
112
|
+
*/
|
|
113
|
+
writeLogEntry(buffer, entryType) {
|
|
114
|
+
const idx = buffer._writeIndex;
|
|
115
|
+
buffer.timestamp[idx] = this.getTimestampNanos();
|
|
116
|
+
buffer.entry_type[idx] = entryType;
|
|
117
|
+
buffer._writeIndex = idx + 1;
|
|
118
|
+
return idx;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Factory function for creating browser TraceRoot instances.
|
|
123
|
+
* Pass this to Tracer constructor for browser/ES environments.
|
|
124
|
+
*/
|
|
125
|
+
export function createTraceRoot(trace_id, tracer) {
|
|
126
|
+
const anchorEpochNanos = BigInt(Date.now()) * 1000000n;
|
|
127
|
+
const anchorPerfNow = performance.now();
|
|
128
|
+
return new TraceRoot(createTraceId(trace_id), anchorEpochNanos, anchorPerfNow, tracer);
|
|
129
|
+
}
|