@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,130 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Context Type Utilities for Op-Centric API
|
|
3
|
+
*
|
|
4
|
+
* Type-level utilities for handling user context property patterns:
|
|
5
|
+
* - Required at createTrace (null sentinel)
|
|
6
|
+
* - Optional (undefined sentinel)
|
|
7
|
+
* - Has default (non-null, non-undefined value)
|
|
8
|
+
*
|
|
9
|
+
* Also includes reserved property validation to prevent conflicts with SpanContext.
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
// =============================================================================
|
|
13
|
+
// RESERVED PROPERTY NAMES
|
|
14
|
+
// =============================================================================
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Reserved property names that cannot be used in user context.
|
|
18
|
+
* These are properties that exist on SpanContext and would cause conflicts.
|
|
19
|
+
*/
|
|
20
|
+
export const RESERVED_CONTEXT_PROPS = [
|
|
21
|
+
// Core SpanContext properties
|
|
22
|
+
'buffer',
|
|
23
|
+
'tag',
|
|
24
|
+
'log',
|
|
25
|
+
'scope',
|
|
26
|
+
'setScope',
|
|
27
|
+
'ok',
|
|
28
|
+
'err',
|
|
29
|
+
'span',
|
|
30
|
+
'ff',
|
|
31
|
+
'deps',
|
|
32
|
+
// Internal properties
|
|
33
|
+
'_buffer',
|
|
34
|
+
'_schema',
|
|
35
|
+
'_spanLogger',
|
|
36
|
+
] as const;
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Union type of all reserved context property names.
|
|
40
|
+
*/
|
|
41
|
+
export type ReservedContextProp = (typeof RESERVED_CONTEXT_PROPS)[number];
|
|
42
|
+
|
|
43
|
+
// =============================================================================
|
|
44
|
+
// CONTEXT TYPE UTILITIES
|
|
45
|
+
// =============================================================================
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Context property patterns:
|
|
49
|
+
*
|
|
50
|
+
* 1. Required at createTrace (null sentinel):
|
|
51
|
+
* `env: null as Env` -> must provide at createTrace, type is Env in SpanContext
|
|
52
|
+
*
|
|
53
|
+
* 2. Optional (undefined sentinel):
|
|
54
|
+
* `userId: undefined as string | undefined` -> optional at createTrace, may be undefined in SpanContext
|
|
55
|
+
*
|
|
56
|
+
* 3. Has default (non-null, non-undefined value):
|
|
57
|
+
* `config: { retryCount: 3 }` -> can override at createTrace, uses default if not provided
|
|
58
|
+
*/
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* Extract keys where value is exactly `null` (required at trace creation).
|
|
62
|
+
* These MUST be provided at createTrace().
|
|
63
|
+
*/
|
|
64
|
+
export type NullKeys<T> = {
|
|
65
|
+
[K in keyof T]: [T[K]] extends [null] ? K : null extends T[K] ? (undefined extends T[K] ? never : K) : never;
|
|
66
|
+
}[keyof T];
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* Extract keys where value is `undefined` or includes `undefined` (optional).
|
|
70
|
+
* These are optional at createTrace() and may be undefined in SpanContext.
|
|
71
|
+
*/
|
|
72
|
+
export type UndefinedKeys<T> = {
|
|
73
|
+
[K in keyof T]: undefined extends T[K] ? K : never;
|
|
74
|
+
}[keyof T];
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* Extract keys with concrete values (neither null nor undefined).
|
|
78
|
+
* These have defaults and are optional to override at createTrace().
|
|
79
|
+
*/
|
|
80
|
+
export type DefaultKeys<T> = {
|
|
81
|
+
[K in keyof T]: null extends T[K] ? never : undefined extends T[K] ? never : K;
|
|
82
|
+
}[keyof T];
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* Transform user context for SpanContext.
|
|
86
|
+
* - Null properties become their non-null type (filled at createTrace)
|
|
87
|
+
* - Undefined properties stay as potentially undefined
|
|
88
|
+
* - Default properties stay as-is
|
|
89
|
+
*/
|
|
90
|
+
export type ResolvedContext<UserCtx> = {
|
|
91
|
+
readonly [K in keyof UserCtx]: null extends UserCtx[K]
|
|
92
|
+
? undefined extends UserCtx[K]
|
|
93
|
+
? UserCtx[K] // null | undefined | T -> keep as is (weird case)
|
|
94
|
+
: Exclude<UserCtx[K], null> // null | T -> T (null is sentinel, gets filled)
|
|
95
|
+
: UserCtx[K]; // no null -> keep as is (including undefined if present)
|
|
96
|
+
};
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* What MUST be provided at createTrace() - only null sentinel properties.
|
|
100
|
+
*/
|
|
101
|
+
export type RequiredContextParams<UserCtx> = {
|
|
102
|
+
[K in NullKeys<UserCtx>]: Exclude<UserCtx[K], null>;
|
|
103
|
+
};
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* What CAN be provided at createTrace() - optional and default properties.
|
|
107
|
+
*/
|
|
108
|
+
export type OptionalContextParams<UserCtx> = {
|
|
109
|
+
[K in UndefinedKeys<UserCtx> | DefaultKeys<UserCtx>]?: undefined extends UserCtx[K]
|
|
110
|
+
? UserCtx[K] // Keep undefined in type for optional props
|
|
111
|
+
: UserCtx[K]; // Default props
|
|
112
|
+
};
|
|
113
|
+
|
|
114
|
+
/**
|
|
115
|
+
* Combined context params for createTrace().
|
|
116
|
+
* - Null props are REQUIRED (must provide)
|
|
117
|
+
* - Undefined props are OPTIONAL (can provide or omit)
|
|
118
|
+
* - Default props are OPTIONAL (can override or use default)
|
|
119
|
+
*/
|
|
120
|
+
export type TraceContextParams<UserCtx> = RequiredContextParams<UserCtx> & OptionalContextParams<UserCtx>;
|
|
121
|
+
|
|
122
|
+
/**
|
|
123
|
+
* Validate that user context doesn't use reserved property names.
|
|
124
|
+
* Returns `never` with descriptive error if validation fails.
|
|
125
|
+
*/
|
|
126
|
+
export type ValidateUserContext<UserCtx> = keyof UserCtx extends infer K
|
|
127
|
+
? K extends ReservedContextProp
|
|
128
|
+
? { __error: `'${K & string}' is a reserved SpanContext property and cannot be used in ctx` }
|
|
129
|
+
: UserCtx
|
|
130
|
+
: UserCtx;
|
|
@@ -0,0 +1,456 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpGroup Creation - Class-based architecture for Phase 2
|
|
3
|
+
*
|
|
4
|
+
* Creates OpGroups as class instances with ops as own properties.
|
|
5
|
+
* Enables V8 hidden class optimization and cleaner API (`.opName` not `.ops.opName`).
|
|
6
|
+
*
|
|
7
|
+
* Why class-based:
|
|
8
|
+
* - Private fields (#columnMapping) don't affect hidden class (truly hidden, no enumeration)
|
|
9
|
+
* - Ops as own properties enable direct access and predictable object shape
|
|
10
|
+
* - prefix()/mapColumns() create new instances with same SpanBufferClass (shared stats)
|
|
11
|
+
* - Only remappedViewClass differs between original and prefixed op instances
|
|
12
|
+
*
|
|
13
|
+
* Internal properties (_logSchema, _flags, etc.) are prefixed with underscore to avoid
|
|
14
|
+
* collision with user-defined op names. Public interfaces hide these from intellisense.
|
|
15
|
+
*
|
|
16
|
+
* @module opContext/createOpGroup
|
|
17
|
+
*/
|
|
18
|
+
|
|
19
|
+
import { generateRemappedBufferViewClass } from '../library.js';
|
|
20
|
+
import { Op } from '../op.js';
|
|
21
|
+
import { SYSTEM_SCHEMA_FIELD_NAMES } from '../schema/systemSchema.js';
|
|
22
|
+
import type { SchemaFields } from '../schema/types.js';
|
|
23
|
+
import type {
|
|
24
|
+
ColumnMapping,
|
|
25
|
+
MappedOpGroup,
|
|
26
|
+
MappedOpGroupInternal,
|
|
27
|
+
MappedSchema,
|
|
28
|
+
OpGroup,
|
|
29
|
+
OpGroupInternal,
|
|
30
|
+
OpGroupOps,
|
|
31
|
+
PrefixedSchema,
|
|
32
|
+
SchemaFieldsOf,
|
|
33
|
+
} from './opGroupTypes.js';
|
|
34
|
+
import { validateOpName } from './opGroupTypes.js';
|
|
35
|
+
import type { OpContext } from './types.js';
|
|
36
|
+
|
|
37
|
+
// =============================================================================
|
|
38
|
+
// INTERNAL HELPERS
|
|
39
|
+
// =============================================================================
|
|
40
|
+
|
|
41
|
+
function getSchemaFields<Schema extends { readonly fields: SchemaFields }>(fieldsSchema: Schema): Schema['fields'] {
|
|
42
|
+
return fieldsSchema.fields;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Create reverse mapping for RemappedBufferView.
|
|
47
|
+
* Input: clean -> prefixed mapping (e.g., { status: 'http_status' })
|
|
48
|
+
* Output: prefixed -> clean mapping (e.g., { http_status: 'status' })
|
|
49
|
+
*
|
|
50
|
+
* Why reverse: RemappedBufferView wraps child buffer at registration time.
|
|
51
|
+
* Arrow conversion asks for 'http_status', view needs to find 'status' in raw buffer.
|
|
52
|
+
*/
|
|
53
|
+
function createReverseMapping(mapping: Record<string, string | null | undefined>): Record<string, string> {
|
|
54
|
+
const reverse: Record<string, string> = {};
|
|
55
|
+
for (const [cleanName, prefixedName] of Object.entries(mapping)) {
|
|
56
|
+
if (typeof prefixedName === 'string') {
|
|
57
|
+
reverse[prefixedName] = cleanName;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
return reverse;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
function isOpInstance<Ctx extends OpContext>(value: unknown): value is Op<Ctx, unknown[], unknown, unknown> {
|
|
64
|
+
return value instanceof Op;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
function copyOpsWithView<Ctx extends OpContext>(
|
|
68
|
+
source: OpGroupOps<Ctx>,
|
|
69
|
+
target: Record<string, unknown>,
|
|
70
|
+
remappedViewClass: ReturnType<typeof generateRemappedBufferViewClass>,
|
|
71
|
+
) {
|
|
72
|
+
for (const [key, value] of Object.entries(source)) {
|
|
73
|
+
if (isOpInstance<Ctx>(value)) {
|
|
74
|
+
target[key] = new Op(value.metadata, value.SpanBufferClass, value.fn, remappedViewClass, value._opContextBinding);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
function assertGroupCarriesOps<Ctx extends OpContext, Ops extends OpGroupOps<Ctx>>(
|
|
80
|
+
group: Record<string, unknown>,
|
|
81
|
+
ops: Ops,
|
|
82
|
+
): asserts group is Record<string, unknown> & Ops {
|
|
83
|
+
for (const name of Object.keys(ops)) {
|
|
84
|
+
if (!isOpInstance<Ctx>(group[name])) {
|
|
85
|
+
throw new TypeError(`Expected OpGroup to expose op '${name}' as an Op instance`);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
function cloneOpsWithView<Ctx extends OpContext, Ops extends OpGroupOps<Ctx>>(
|
|
91
|
+
source: Ops,
|
|
92
|
+
remappedViewClass: ReturnType<typeof generateRemappedBufferViewClass>,
|
|
93
|
+
): Ops {
|
|
94
|
+
const cloned: Record<string, unknown> = {};
|
|
95
|
+
copyOpsWithView<Ctx>(source, cloned, remappedViewClass);
|
|
96
|
+
assertGroupCarriesOps<Ctx, Ops>(cloned, source);
|
|
97
|
+
return cloned;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
function prefixContributedSchema<T extends SchemaFields, P extends string>(fields: T, prefix: P): PrefixedSchema<T, P> {
|
|
101
|
+
const result: Record<string, unknown> = {};
|
|
102
|
+
for (const [key, value] of Object.entries(fields)) {
|
|
103
|
+
result[`${prefix}_${key}`] = value;
|
|
104
|
+
}
|
|
105
|
+
assertMappedSchema<PrefixedSchema<T, P>>(result);
|
|
106
|
+
return result;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
function assertMappedSchema<T extends SchemaFields>(value: Record<string, unknown>): asserts value is T {
|
|
110
|
+
for (const schema of Object.values(value)) {
|
|
111
|
+
if (typeof schema !== 'object' || schema === null) {
|
|
112
|
+
throw new TypeError('Mapped schema must contain schema metadata objects');
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
/**
|
|
118
|
+
* Build a prefix mapping for all schema fields
|
|
119
|
+
*
|
|
120
|
+
* Why prefix all fields: Ensures no column name collisions when wiring multiple libraries.
|
|
121
|
+
* Each library's columns become `${prefix}_${field}` in app schema.
|
|
122
|
+
*
|
|
123
|
+
* @param fieldNames - The field names from the schema
|
|
124
|
+
* @param prefix - The prefix to apply
|
|
125
|
+
* @returns Column mapping where each field becomes `${prefix}_${field}`
|
|
126
|
+
*/
|
|
127
|
+
function buildPrefixMapping<T extends SchemaFields, P extends string>(
|
|
128
|
+
fieldNames: readonly string[],
|
|
129
|
+
prefix: P,
|
|
130
|
+
): ColumnMapping<T> {
|
|
131
|
+
const mapping: Record<string, string> = {};
|
|
132
|
+
for (const name of fieldNames) {
|
|
133
|
+
// Skip system columns - they should NOT be prefixed
|
|
134
|
+
if (SYSTEM_SCHEMA_FIELD_NAMES.has(name)) continue;
|
|
135
|
+
mapping[name] = `${prefix}_${name}`;
|
|
136
|
+
}
|
|
137
|
+
return mapping as ColumnMapping<T>;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
/**
|
|
141
|
+
* Apply a prefix to an existing mapping
|
|
142
|
+
*
|
|
143
|
+
* For each entry in the mapping:
|
|
144
|
+
* - If mapped to a string, prefix that string: 'status' -> 'http_status'
|
|
145
|
+
* - If mapped to null (dropped), keep as null
|
|
146
|
+
*
|
|
147
|
+
* Why: Enables chaining `.prefix('http').prefix('api')` to build composite prefixes.
|
|
148
|
+
*
|
|
149
|
+
* @param mapping - Existing column mapping
|
|
150
|
+
* @param prefix - Prefix to apply
|
|
151
|
+
* @returns New mapping with prefixed target names
|
|
152
|
+
*/
|
|
153
|
+
function prefixMapping<T extends SchemaFields, P extends string>(
|
|
154
|
+
mapping: ColumnMapping<T>,
|
|
155
|
+
prefix: P,
|
|
156
|
+
): ColumnMapping<T> {
|
|
157
|
+
const result: Record<string, string | null> = {};
|
|
158
|
+
for (const [key, value] of Object.entries(mapping)) {
|
|
159
|
+
if (value === null) {
|
|
160
|
+
result[key] = null;
|
|
161
|
+
} else if (typeof value === 'string') {
|
|
162
|
+
result[key] = `${prefix}_${value}`;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
return result as ColumnMapping<T>;
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
/**
|
|
169
|
+
* Build the contributed schema object from the original schema and mapping
|
|
170
|
+
*
|
|
171
|
+
* The contributed schema reflects what columns this group adds to the app's schema
|
|
172
|
+
* after mapping is applied.
|
|
173
|
+
*
|
|
174
|
+
* Why track contributed schema: Type system needs to know what columns are available
|
|
175
|
+
* after prefix/mapping transformations for compile-time safety.
|
|
176
|
+
*
|
|
177
|
+
* @param fields - Original schema fields
|
|
178
|
+
* @param mapping - Column mapping
|
|
179
|
+
* @returns The contributed schema with renamed keys
|
|
180
|
+
*/
|
|
181
|
+
function buildContributedSchema<T extends SchemaFields, M extends ColumnMapping<T>>(
|
|
182
|
+
fields: T,
|
|
183
|
+
mapping: M,
|
|
184
|
+
): MappedSchema<T, M> {
|
|
185
|
+
const result: Record<string, unknown> = {};
|
|
186
|
+
for (const [key, value] of Object.entries(fields)) {
|
|
187
|
+
const mappedName = mapping[key as keyof M];
|
|
188
|
+
if (mappedName === null) {
|
|
189
|
+
// Dropped column - not included in contributed schema
|
|
190
|
+
} else if (typeof mappedName === 'string') {
|
|
191
|
+
// Explicitly mapped - use the mapped name
|
|
192
|
+
result[mappedName] = value;
|
|
193
|
+
} else {
|
|
194
|
+
// Not in mapping - keep original name
|
|
195
|
+
result[key] = value;
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
assertMappedSchema<MappedSchema<T, M>>(result);
|
|
199
|
+
return result;
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
/**
|
|
203
|
+
* Validate all op names in a record.
|
|
204
|
+
* Throws if any name starts with underscore or is a reserved name.
|
|
205
|
+
*/
|
|
206
|
+
function validateAllOpNames(ops: Record<string, unknown>): void {
|
|
207
|
+
for (const name of Object.keys(ops)) {
|
|
208
|
+
validateOpName(name);
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
// =============================================================================
|
|
213
|
+
// OP GROUP CLASS - Phase 2 Architecture
|
|
214
|
+
// =============================================================================
|
|
215
|
+
|
|
216
|
+
/**
|
|
217
|
+
* OpGroup class - Holds ops as own properties with private field for mapping state.
|
|
218
|
+
*
|
|
219
|
+
* Why class-based:
|
|
220
|
+
* 1. Private fields don't pollute object shape (no hidden class impact)
|
|
221
|
+
* 2. Ops spread as own properties for direct access (`.request` not `.ops.request`)
|
|
222
|
+
* 3. Prototype methods (prefix/mapColumns) shared across instances
|
|
223
|
+
* 4. Same SpanBufferClass preserved across prefix() calls (shared schema + stats)
|
|
224
|
+
* 5. Only remappedViewClass differs between original and prefixed ops
|
|
225
|
+
*
|
|
226
|
+
* Structure enables V8 optimization:
|
|
227
|
+
* - All OpGroup instances with same ops have same hidden class
|
|
228
|
+
* - Private fields invisible to property enumeration
|
|
229
|
+
* - Method dispatch via prototype (no per-instance copies)
|
|
230
|
+
*
|
|
231
|
+
* Internal properties use underscore prefix (_logSchema, _flags) to avoid
|
|
232
|
+
* collision with user-defined op names.
|
|
233
|
+
*/
|
|
234
|
+
class OpGroupImpl<Ctx extends OpContext, Ops extends OpGroupOps<Ctx>> implements OpGroupInternal<Ctx, Ops> {
|
|
235
|
+
// Allow dynamic op properties (ops spread as own properties in constructor)
|
|
236
|
+
[key: string]: unknown;
|
|
237
|
+
|
|
238
|
+
// Private field - truly hidden, doesn't affect hidden class or enumeration
|
|
239
|
+
readonly #columnMapping: ColumnMapping<SchemaFieldsOf<Ctx['logSchema']>>;
|
|
240
|
+
readonly #ops: Ops;
|
|
241
|
+
|
|
242
|
+
constructor(
|
|
243
|
+
readonly _logSchema: Ctx['logSchema'],
|
|
244
|
+
readonly _flags: Ctx['flags'],
|
|
245
|
+
ops: Ops,
|
|
246
|
+
columnMapping?: ColumnMapping<SchemaFieldsOf<Ctx['logSchema']>>,
|
|
247
|
+
) {
|
|
248
|
+
this.#columnMapping = columnMapping ?? {};
|
|
249
|
+
this.#ops = ops;
|
|
250
|
+
|
|
251
|
+
// Validate op names before spreading
|
|
252
|
+
validateAllOpNames(ops);
|
|
253
|
+
|
|
254
|
+
// Spread ops onto this instance as own properties
|
|
255
|
+
// Why spread: Enables direct access (ctx.deps.http.request)
|
|
256
|
+
for (const [name, op] of Object.entries(ops)) {
|
|
257
|
+
this[name] = op;
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
prefix<P extends string>(p: P): MappedOpGroup<Ctx, PrefixedSchema<Ctx['logSchema']['fields'], P>, Ops> {
|
|
262
|
+
// Apply prefix to the current mapping
|
|
263
|
+
// Check if mapping is non-empty (empty object {} is truthy but has no entries)
|
|
264
|
+
const hasMapping = this.#columnMapping && Object.keys(this.#columnMapping).length > 0;
|
|
265
|
+
const newMapping = hasMapping
|
|
266
|
+
? prefixMapping(this.#columnMapping, p)
|
|
267
|
+
: buildPrefixMapping(this._logSchema._columnNames, p);
|
|
268
|
+
|
|
269
|
+
// Generate RemappedBufferView for this prefix
|
|
270
|
+
// Why reverse mapping: Arrow conversion asks for 'http_status', needs to find 'status'
|
|
271
|
+
const reverseMapping = createReverseMapping(newMapping);
|
|
272
|
+
const remappedViewClass = generateRemappedBufferViewClass(reverseMapping);
|
|
273
|
+
|
|
274
|
+
// Create new OpGroup with prefixed ops
|
|
275
|
+
const newGroup = new MappedOpGroupImpl<Ctx, PrefixedSchema<Ctx['logSchema']['fields'], P>, Ops>(
|
|
276
|
+
this._logSchema,
|
|
277
|
+
this._flags,
|
|
278
|
+
cloneOpsWithView<Ctx, Ops>(this.#ops, remappedViewClass),
|
|
279
|
+
newMapping,
|
|
280
|
+
prefixContributedSchema<Ctx['logSchema']['fields'], P>(getSchemaFields(this._logSchema), p),
|
|
281
|
+
);
|
|
282
|
+
|
|
283
|
+
assertGroupCarriesOps<Ctx, Ops>(newGroup, this.#ops);
|
|
284
|
+
return newGroup;
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
mapColumns<M extends ColumnMapping<Ctx['logSchema']['fields']>>(
|
|
288
|
+
mapping: M,
|
|
289
|
+
): MappedOpGroup<Ctx, MappedSchema<Ctx['logSchema']['fields'], M>, Ops> {
|
|
290
|
+
// Override/extend the existing mapping with new mapping
|
|
291
|
+
const newMapping = { ...this.#columnMapping, ...mapping };
|
|
292
|
+
|
|
293
|
+
// Generate RemappedBufferView for this mapping
|
|
294
|
+
const reverseMapping = createReverseMapping(newMapping);
|
|
295
|
+
const remappedViewClass = generateRemappedBufferViewClass(reverseMapping);
|
|
296
|
+
|
|
297
|
+
// Build contributed schema from original fields with new mapping
|
|
298
|
+
const newContributed = buildContributedSchema<Ctx['logSchema']['fields'], M>(
|
|
299
|
+
getSchemaFields(this._logSchema),
|
|
300
|
+
newMapping,
|
|
301
|
+
);
|
|
302
|
+
|
|
303
|
+
// Create new OpGroup with mapped ops
|
|
304
|
+
const newGroup = new MappedOpGroupImpl<Ctx, MappedSchema<Ctx['logSchema']['fields'], M>, Ops>(
|
|
305
|
+
this._logSchema,
|
|
306
|
+
this._flags,
|
|
307
|
+
cloneOpsWithView<Ctx, Ops>(this.#ops, remappedViewClass),
|
|
308
|
+
newMapping,
|
|
309
|
+
newContributed,
|
|
310
|
+
);
|
|
311
|
+
|
|
312
|
+
assertGroupCarriesOps<Ctx, Ops>(newGroup, this.#ops);
|
|
313
|
+
return newGroup;
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
// =============================================================================
|
|
318
|
+
// MAPPED OP GROUP CLASS
|
|
319
|
+
// =============================================================================
|
|
320
|
+
|
|
321
|
+
/**
|
|
322
|
+
* MappedOpGroup class - OpGroup with column mapping applied.
|
|
323
|
+
*
|
|
324
|
+
* Why separate class: TypeScript needs distinct type for mapped groups
|
|
325
|
+
* to track contributedSchema type parameter.
|
|
326
|
+
*
|
|
327
|
+
* Internal properties use underscore prefix to avoid collision with op names.
|
|
328
|
+
*/
|
|
329
|
+
class MappedOpGroupImpl<Ctx extends OpContext, ContributedSchema extends SchemaFields, Ops extends OpGroupOps<Ctx>>
|
|
330
|
+
implements MappedOpGroupInternal<Ctx, ContributedSchema, Ops>
|
|
331
|
+
{
|
|
332
|
+
// Allow dynamic op properties (ops spread as own properties in constructor)
|
|
333
|
+
[key: string]: unknown;
|
|
334
|
+
|
|
335
|
+
readonly #columnMapping: Record<string, string | null | undefined>;
|
|
336
|
+
readonly #ops: Ops;
|
|
337
|
+
|
|
338
|
+
constructor(
|
|
339
|
+
readonly _logSchema: Ctx['logSchema'],
|
|
340
|
+
readonly _flags: Ctx['flags'],
|
|
341
|
+
ops: Ops,
|
|
342
|
+
readonly _columnMapping: ColumnMapping<SchemaFieldsOf<Ctx['logSchema']>>,
|
|
343
|
+
readonly _contributedSchema: ContributedSchema,
|
|
344
|
+
) {
|
|
345
|
+
this.#columnMapping = _columnMapping;
|
|
346
|
+
this.#ops = ops;
|
|
347
|
+
|
|
348
|
+
// Validate op names before spreading
|
|
349
|
+
validateAllOpNames(ops);
|
|
350
|
+
|
|
351
|
+
// Spread ops onto this instance
|
|
352
|
+
for (const [name, op] of Object.entries(ops)) {
|
|
353
|
+
this[name] = op;
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
|
|
357
|
+
prefix<P extends string>(p: P): MappedOpGroup<Ctx, PrefixedSchema<ContributedSchema, P>, Ops> {
|
|
358
|
+
// Apply prefix to the current mapping's target names
|
|
359
|
+
const newMapping = prefixMapping(this.#columnMapping, p);
|
|
360
|
+
|
|
361
|
+
// Generate RemappedBufferView
|
|
362
|
+
const reverseMapping = createReverseMapping(newMapping);
|
|
363
|
+
const remappedViewClass = generateRemappedBufferViewClass(reverseMapping);
|
|
364
|
+
|
|
365
|
+
// Build new contributed schema by prefixing current contributed schema
|
|
366
|
+
const newContributed = prefixContributedSchema(this._contributedSchema, p);
|
|
367
|
+
|
|
368
|
+
// Create new MappedOpGroup
|
|
369
|
+
const newGroup = new MappedOpGroupImpl<Ctx, PrefixedSchema<ContributedSchema, P>, Ops>(
|
|
370
|
+
this._logSchema,
|
|
371
|
+
this._flags,
|
|
372
|
+
cloneOpsWithView<Ctx, Ops>(this.#ops, remappedViewClass),
|
|
373
|
+
newMapping,
|
|
374
|
+
newContributed,
|
|
375
|
+
);
|
|
376
|
+
|
|
377
|
+
assertGroupCarriesOps<Ctx, Ops>(newGroup, this.#ops);
|
|
378
|
+
return newGroup;
|
|
379
|
+
}
|
|
380
|
+
|
|
381
|
+
mapColumns<M extends ColumnMapping<ContributedSchema>>(
|
|
382
|
+
mapping: M,
|
|
383
|
+
): MappedOpGroup<Ctx, MappedSchema<ContributedSchema, M>, Ops> {
|
|
384
|
+
// Override/extend the existing mapping
|
|
385
|
+
const newMapping = { ...this.#columnMapping, ...mapping };
|
|
386
|
+
|
|
387
|
+
// Generate RemappedBufferView
|
|
388
|
+
const reverseMapping = createReverseMapping(newMapping);
|
|
389
|
+
const remappedViewClass = generateRemappedBufferViewClass(reverseMapping);
|
|
390
|
+
|
|
391
|
+
// Build contributed schema from current contributed fields so chained maps stay typed to the public surface.
|
|
392
|
+
const newContributed = buildContributedSchema(this._contributedSchema, mapping);
|
|
393
|
+
|
|
394
|
+
// Create new MappedOpGroup
|
|
395
|
+
const newGroup = new MappedOpGroupImpl<Ctx, MappedSchema<ContributedSchema, M>, Ops>(
|
|
396
|
+
this._logSchema,
|
|
397
|
+
this._flags,
|
|
398
|
+
cloneOpsWithView<Ctx, Ops>(this.#ops, remappedViewClass),
|
|
399
|
+
newMapping,
|
|
400
|
+
newContributed,
|
|
401
|
+
);
|
|
402
|
+
|
|
403
|
+
assertGroupCarriesOps<Ctx, Ops>(newGroup, this.#ops);
|
|
404
|
+
return newGroup;
|
|
405
|
+
}
|
|
406
|
+
}
|
|
407
|
+
|
|
408
|
+
// =============================================================================
|
|
409
|
+
// OP GROUP CREATION
|
|
410
|
+
// =============================================================================
|
|
411
|
+
|
|
412
|
+
/**
|
|
413
|
+
* Create an OpGroup from a schema, flags, and ops
|
|
414
|
+
*
|
|
415
|
+
* Why class-based: V8 hidden class optimization - all OpGroups with same ops
|
|
416
|
+
* have same object shape (private fields don't affect hidden class).
|
|
417
|
+
*
|
|
418
|
+
* The ops passed to this function already have a SpanBufferClass attached.
|
|
419
|
+
* All ops in the same context share the SAME SpanBufferClass instance, which carries:
|
|
420
|
+
* - Static schema property (shared by all instances)
|
|
421
|
+
* - Static stats property (shared mutable stats for self-tuning)
|
|
422
|
+
*
|
|
423
|
+
* The returned OpGroup can be:
|
|
424
|
+
* - Used directly as a dependency (ops accessible via ctx.deps.name.opName)
|
|
425
|
+
* - Prefixed with `.prefix('http')` to namespace all columns
|
|
426
|
+
* - Mapped with `.mapColumns({ query: 'query', _internal: null })` for fine control
|
|
427
|
+
*
|
|
428
|
+
* @param logSchema - The LogSchema defining columns for this group's ops
|
|
429
|
+
* @param flags - Feature flag schema
|
|
430
|
+
* @param ops - Record of Op instances belonging to this group
|
|
431
|
+
* @returns OpGroup with prefix() and mapColumns() methods, ops as own properties
|
|
432
|
+
*
|
|
433
|
+
* @example
|
|
434
|
+
* ```typescript
|
|
435
|
+
* const httpOps = createOpGroup(httpLogSchema, httpFlags, {
|
|
436
|
+
* fetch: fetchOp,
|
|
437
|
+
* post: postOp,
|
|
438
|
+
* });
|
|
439
|
+
*
|
|
440
|
+
* // Direct access (Phase 2):
|
|
441
|
+
* await ctx.deps.http.fetch(url);
|
|
442
|
+
*
|
|
443
|
+
* // Wire with prefix:
|
|
444
|
+
* deps: { http: httpOps.prefix('http') }
|
|
445
|
+
* // Columns become: http_status, http_url, http_duration, etc.
|
|
446
|
+
* ```
|
|
447
|
+
*/
|
|
448
|
+
export function createOpGroup<Ctx extends OpContext, Ops extends OpGroupOps<Ctx>>(
|
|
449
|
+
logSchema: Ctx['logSchema'],
|
|
450
|
+
flags: Ctx['flags'],
|
|
451
|
+
ops: Ops,
|
|
452
|
+
): OpGroup<Ctx, Ops> {
|
|
453
|
+
const group = new OpGroupImpl<Ctx, Ops>(logSchema, flags, ops);
|
|
454
|
+
assertGroupCarriesOps<Ctx, Ops>(group, ops);
|
|
455
|
+
return group;
|
|
456
|
+
}
|