@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,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SQLite persistence for LMAO span buffers.
|
|
3
|
+
*
|
|
4
|
+
* General-purpose writer API for persisting span buffer trees to SQLite.
|
|
5
|
+
* Platform-agnostic — accepts any SyncSQLiteDatabase (bun:sqlite or better-sqlite3).
|
|
6
|
+
*
|
|
7
|
+
* @module sqlite
|
|
8
|
+
*/
|
|
9
|
+
export { SQLiteAsyncTraceWriter } from './sqlite-async-writer.js';
|
|
10
|
+
export { buildAddColumnSql, extractSqliteColumnsFromTableInfo, getMissingSqliteColumns, quoteSqlIdentifier, SPANS_TABLE_INFO_SQL, SPANS_TABLE_INIT_SQL, } from './sqlite-common.js';
|
|
11
|
+
export { createD1SQLiteDatabase, type D1LikeDatabase, type D1LikePreparedStatement } from './sqlite-d1.js';
|
|
12
|
+
export type { AsyncSQLiteDatabase, AsyncSQLiteStatement, SyncSQLiteDatabase, SyncSQLiteStatement, } from './sqlite-db.js';
|
|
13
|
+
export { SQLiteTraceWriter, type SQLiteWriterConfig } from './sqlite-writer.js';
|
|
14
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/sqlite/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,EACL,iBAAiB,EACjB,iCAAiC,EACjC,uBAAuB,EACvB,kBAAkB,EAClB,oBAAoB,EACpB,oBAAoB,GACrB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,sBAAsB,EAAE,KAAK,cAAc,EAAE,KAAK,uBAAuB,EAAE,MAAM,gBAAgB,CAAC;AAC3G,YAAY,EACV,mBAAmB,EACnB,oBAAoB,EACpB,kBAAkB,EAClB,mBAAmB,GACpB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,iBAAiB,EAAE,KAAK,kBAAkB,EAAE,MAAM,oBAAoB,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SQLite persistence for LMAO span buffers.
|
|
3
|
+
*
|
|
4
|
+
* General-purpose writer API for persisting span buffer trees to SQLite.
|
|
5
|
+
* Platform-agnostic — accepts any SyncSQLiteDatabase (bun:sqlite or better-sqlite3).
|
|
6
|
+
*
|
|
7
|
+
* @module sqlite
|
|
8
|
+
*/
|
|
9
|
+
export { SQLiteAsyncTraceWriter } from './sqlite-async-writer.js';
|
|
10
|
+
export { buildAddColumnSql, extractSqliteColumnsFromTableInfo, getMissingSqliteColumns, quoteSqlIdentifier, SPANS_TABLE_INFO_SQL, SPANS_TABLE_INIT_SQL, } from './sqlite-common.js';
|
|
11
|
+
export { createD1SQLiteDatabase } from './sqlite-d1.js';
|
|
12
|
+
export { SQLiteTraceWriter } from './sqlite-writer.js';
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SQLiteAsyncTraceWriter - Async SQLite persistence for span buffer trees.
|
|
3
|
+
*
|
|
4
|
+
* Works with async SQLite drivers (for example Cloudflare D1 adapters) while
|
|
5
|
+
* preserving the same `spans` table shape as the sync SQLiteTraceWriter.
|
|
6
|
+
*
|
|
7
|
+
* @module sqlite-async-writer
|
|
8
|
+
*/
|
|
9
|
+
import type { AnySpanBuffer } from '../types.js';
|
|
10
|
+
import type { AsyncSQLiteDatabase } from './sqlite-db.js';
|
|
11
|
+
export declare class SQLiteAsyncTraceWriter {
|
|
12
|
+
private db;
|
|
13
|
+
private knownColumns;
|
|
14
|
+
private insertStmtCache;
|
|
15
|
+
private initialized;
|
|
16
|
+
constructor(db: AsyncSQLiteDatabase);
|
|
17
|
+
private init;
|
|
18
|
+
private refreshKnownColumns;
|
|
19
|
+
private ensureColumns;
|
|
20
|
+
private getInsertStatement;
|
|
21
|
+
flush(rootBuffer: AnySpanBuffer): Promise<void>;
|
|
22
|
+
close(): Promise<void>;
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=sqlite-async-writer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sqlite-async-writer.d.ts","sourceRoot":"","sources":["../../../src/lib/sqlite/sqlite-async-writer.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAejD,OAAO,KAAK,EAAE,mBAAmB,EAAwB,MAAM,gBAAgB,CAAC;AAEhF,qBAAa,sBAAsB;IAKrB,OAAO,CAAC,EAAE;IAJtB,OAAO,CAAC,YAAY,CAAqB;IACzC,OAAO,CAAC,eAAe,CAA2C;IAClE,OAAO,CAAC,WAAW,CAAS;gBAER,EAAE,EAAE,mBAAmB;YAE7B,IAAI;YAYJ,mBAAmB;YAUnB,aAAa;IAe3B,OAAO,CAAC,kBAAkB;IAYpB,KAAK,CAAC,UAAU,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IAc/C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAG7B"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { buildAddColumnSql, buildInsertParams, buildInsertSql, extractSqliteColumnsFromTableInfo, getActiveUserFields, getInsertStatementCacheKey, getMissingSchemaColumns, isSqliteDuplicateColumnError, parseSqliteTableInfoRows, SPANS_TABLE_INFO_SQL, SPANS_TABLE_INIT_SQL, walkSpanSegments, } from './sqlite-common.js';
|
|
2
|
+
export class SQLiteAsyncTraceWriter {
|
|
3
|
+
db;
|
|
4
|
+
knownColumns = new Set();
|
|
5
|
+
insertStmtCache = new Map();
|
|
6
|
+
initialized = false;
|
|
7
|
+
constructor(db) {
|
|
8
|
+
this.db = db;
|
|
9
|
+
}
|
|
10
|
+
async init() {
|
|
11
|
+
if (this.initialized) {
|
|
12
|
+
return;
|
|
13
|
+
}
|
|
14
|
+
await this.db.exec(SPANS_TABLE_INIT_SQL);
|
|
15
|
+
await this.refreshKnownColumns();
|
|
16
|
+
this.initialized = true;
|
|
17
|
+
}
|
|
18
|
+
async refreshKnownColumns() {
|
|
19
|
+
this.knownColumns.clear();
|
|
20
|
+
// WHY: async drivers are still a real schema boundary; validate PRAGMA rows before caching column names that drive
|
|
21
|
+
// later DDL and inserts.
|
|
22
|
+
const rows = parseSqliteTableInfoRows(await this.db.prepare(SPANS_TABLE_INFO_SQL).all());
|
|
23
|
+
for (const column of extractSqliteColumnsFromTableInfo(rows)) {
|
|
24
|
+
this.knownColumns.add(column.name);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
async ensureColumns(schema) {
|
|
28
|
+
for (const column of getMissingSchemaColumns(schema, this.knownColumns)) {
|
|
29
|
+
try {
|
|
30
|
+
await this.db.exec(buildAddColumnSql(column));
|
|
31
|
+
}
|
|
32
|
+
catch (error) {
|
|
33
|
+
if (!isSqliteDuplicateColumnError(error, column.name)) {
|
|
34
|
+
throw error;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
await this.refreshKnownColumns();
|
|
38
|
+
this.knownColumns.add(column.name);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
getInsertStatement(activeUserFields) {
|
|
42
|
+
const key = getInsertStatementCacheKey(activeUserFields);
|
|
43
|
+
const cached = this.insertStmtCache.get(key);
|
|
44
|
+
if (cached) {
|
|
45
|
+
return cached;
|
|
46
|
+
}
|
|
47
|
+
const stmt = this.db.prepare(buildInsertSql(activeUserFields));
|
|
48
|
+
this.insertStmtCache.set(key, stmt);
|
|
49
|
+
return stmt;
|
|
50
|
+
}
|
|
51
|
+
async flush(rootBuffer) {
|
|
52
|
+
await this.init();
|
|
53
|
+
for (const segment of walkSpanSegments(rootBuffer)) {
|
|
54
|
+
await this.ensureColumns(segment.buffer._logSchema);
|
|
55
|
+
const activeUserFields = getActiveUserFields(segment.buffer._logSchema, this.knownColumns);
|
|
56
|
+
const insertStmt = this.getInsertStatement(activeUserFields);
|
|
57
|
+
for (let row = 0; row < segment.buffer._writeIndex; row++) {
|
|
58
|
+
await insertStmt.run(...buildInsertParams(segment, row, activeUserFields));
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
async close() {
|
|
63
|
+
await this.db.close();
|
|
64
|
+
}
|
|
65
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import type { LogSchema } from '../schema/LogSchema.js';
|
|
2
|
+
import type { AnySpanBuffer } from '../types.js';
|
|
3
|
+
export declare const SPANS_TABLE_INIT_SQL = "\n CREATE TABLE IF NOT EXISTS spans (\n trace_id TEXT NOT NULL,\n span_id INTEGER NOT NULL,\n parent_span_id INTEGER NOT NULL,\n row_index INTEGER NOT NULL,\n entry_type INTEGER NOT NULL,\n timestamp_ns INTEGER NOT NULL,\n message TEXT,\n PRIMARY KEY (trace_id, span_id, row_index)\n );\n\n CREATE INDEX IF NOT EXISTS idx_spans_trace ON spans(trace_id);\n CREATE INDEX IF NOT EXISTS idx_spans_parent ON spans(trace_id, parent_span_id);\n";
|
|
4
|
+
export declare const SPANS_TABLE_INFO_SQL = "PRAGMA table_info(spans)";
|
|
5
|
+
export interface SQLiteColumnDefinition {
|
|
6
|
+
name: string;
|
|
7
|
+
sqliteType: string;
|
|
8
|
+
}
|
|
9
|
+
export interface SQLiteTableInfoRow {
|
|
10
|
+
cid: number;
|
|
11
|
+
name: string;
|
|
12
|
+
type: string;
|
|
13
|
+
notnull: number;
|
|
14
|
+
dflt_value: string | null;
|
|
15
|
+
pk: number;
|
|
16
|
+
}
|
|
17
|
+
export interface SpanSegment {
|
|
18
|
+
buffer: AnySpanBuffer;
|
|
19
|
+
traceId: string;
|
|
20
|
+
spanId: number;
|
|
21
|
+
parentSpanId: number;
|
|
22
|
+
rowOffset: number;
|
|
23
|
+
}
|
|
24
|
+
export declare function normalizeSqliteColumnType(type: string): string;
|
|
25
|
+
export declare function quoteSqlIdentifier(name: string): string;
|
|
26
|
+
export declare function buildAddColumnSql(column: SQLiteColumnDefinition): string;
|
|
27
|
+
export declare function isSqliteDuplicateColumnError(error: unknown, columnName: string): boolean;
|
|
28
|
+
export declare function getMissingSqliteColumns(columns: readonly SQLiteColumnDefinition[], knownColumns: ReadonlySet<string>): SQLiteColumnDefinition[];
|
|
29
|
+
export declare function extractSqliteColumnsFromTableInfo(columns: readonly SQLiteTableInfoRow[]): SQLiteColumnDefinition[];
|
|
30
|
+
export declare function parseSqliteTableInfoRows(rows: readonly unknown[], boundary?: string): SQLiteTableInfoRow[];
|
|
31
|
+
export declare function walkSpanSegments(rootBuffer: AnySpanBuffer): Generator<SpanSegment>;
|
|
32
|
+
export declare function getMissingSchemaColumns(schema: LogSchema, knownColumns: ReadonlySet<string>): SQLiteColumnDefinition[];
|
|
33
|
+
export declare function getActiveUserFields(schema: LogSchema, knownColumns: ReadonlySet<string>): string[];
|
|
34
|
+
export declare function getInsertStatementCacheKey(activeUserFields: readonly string[]): string;
|
|
35
|
+
export declare function buildInsertSql(activeUserFields: readonly string[]): string;
|
|
36
|
+
export declare function buildInsertParams(segment: SpanSegment, row: number, activeUserFields: readonly string[]): unknown[];
|
|
37
|
+
//# sourceMappingURL=sqlite-common.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sqlite-common.d.ts","sourceRoot":"","sources":["../../../src/lib/sqlite/sqlite-common.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAExD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEjD,eAAO,MAAM,oBAAoB,sdAchC,CAAC;AAEF,eAAO,MAAM,oBAAoB,6BAA6B,CAAC;AAI/D,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,kBAAkB;IACjC,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,aAAa,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;CACnB;AAqID,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE9D;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAKvD;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,sBAAsB,GAAG,MAAM,CAExE;AAED,wBAAgB,4BAA4B,CAAC,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAMxF;AAED,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,SAAS,sBAAsB,EAAE,EAC1C,YAAY,EAAE,WAAW,CAAC,MAAM,CAAC,GAChC,sBAAsB,EAAE,CAQ1B;AAED,wBAAgB,iCAAiC,CAAC,OAAO,EAAE,SAAS,kBAAkB,EAAE,GAAG,sBAAsB,EAAE,CAKlH;AAED,wBAAgB,wBAAwB,CACtC,IAAI,EAAE,SAAS,OAAO,EAAE,EACxB,QAAQ,SAA6B,GACpC,kBAAkB,EAAE,CAEtB;AA8BD,wBAAiB,gBAAgB,CAAC,UAAU,EAAE,aAAa,GAAG,SAAS,CAAC,WAAW,CAAC,CAEnF;AAED,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,SAAS,EACjB,YAAY,EAAE,WAAW,CAAC,MAAM,CAAC,GAChC,sBAAsB,EAAE,CAW1B;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,SAAS,EAAE,YAAY,EAAE,WAAW,CAAC,MAAM,CAAC,GAAG,MAAM,EAAE,CAElG;AAED,wBAAgB,0BAA0B,CAAC,gBAAgB,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,CAEtF;AAED,wBAAgB,cAAc,CAAC,gBAAgB,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,CAK1E;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,WAAW,EAAE,GAAG,EAAE,MAAM,EAAE,gBAAgB,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,EAAE,CAgBnH"}
|
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
import { hasOwn, hasOwnString, isRecord } from '@smoothbricks/validation';
|
|
2
|
+
import { getSchemaType } from '../schema/typeGuards.js';
|
|
3
|
+
export const SPANS_TABLE_INIT_SQL = `
|
|
4
|
+
CREATE TABLE IF NOT EXISTS spans (
|
|
5
|
+
trace_id TEXT NOT NULL,
|
|
6
|
+
span_id INTEGER NOT NULL,
|
|
7
|
+
parent_span_id INTEGER NOT NULL,
|
|
8
|
+
row_index INTEGER NOT NULL,
|
|
9
|
+
entry_type INTEGER NOT NULL,
|
|
10
|
+
timestamp_ns INTEGER NOT NULL,
|
|
11
|
+
message TEXT,
|
|
12
|
+
PRIMARY KEY (trace_id, span_id, row_index)
|
|
13
|
+
);
|
|
14
|
+
|
|
15
|
+
CREATE INDEX IF NOT EXISTS idx_spans_trace ON spans(trace_id);
|
|
16
|
+
CREATE INDEX IF NOT EXISTS idx_spans_parent ON spans(trace_id, parent_span_id);
|
|
17
|
+
`;
|
|
18
|
+
export const SPANS_TABLE_INFO_SQL = 'PRAGMA table_info(spans)';
|
|
19
|
+
/** Check if bit at index is set in Arrow null bitmap (1 = valid/present, 0 = null) */
|
|
20
|
+
function isBitSet(bitmap, idx) {
|
|
21
|
+
return (bitmap[idx >>> 3] & (1 << (idx & 7))) !== 0;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Read a user column value at the given row.
|
|
25
|
+
*
|
|
26
|
+
* Typed arrays are pre-allocated with zeros, so null bitmaps distinguish
|
|
27
|
+
* "set to zero" from "never written". JS arrays use `undefined` for unwritten slots.
|
|
28
|
+
*/
|
|
29
|
+
function readUserValue(buffer, fieldName, row) {
|
|
30
|
+
const values = Reflect.get(buffer, `${fieldName}_values`);
|
|
31
|
+
if (!values)
|
|
32
|
+
return undefined;
|
|
33
|
+
if (ArrayBuffer.isView(values)) {
|
|
34
|
+
const nulls = Reflect.get(buffer, `${fieldName}_nulls`);
|
|
35
|
+
if (!(nulls instanceof Uint8Array) || !('length' in values)) {
|
|
36
|
+
return undefined;
|
|
37
|
+
}
|
|
38
|
+
return isBitSet(nulls, row) ? Reflect.get(values, row) : undefined;
|
|
39
|
+
}
|
|
40
|
+
return Array.isArray(values) ? values[row] : undefined;
|
|
41
|
+
}
|
|
42
|
+
function readScopeValue(buffer, fieldName) {
|
|
43
|
+
return isRecord(buffer._scopeValues) ? buffer._scopeValues[fieldName] : undefined;
|
|
44
|
+
}
|
|
45
|
+
function describeSqliteBoundaryType(value) {
|
|
46
|
+
return typeof value;
|
|
47
|
+
}
|
|
48
|
+
function invalidSqliteBoundaryRow(boundary, rowIndex, message) {
|
|
49
|
+
return new Error(`${boundary} returned an invalid SQLite row ${rowIndex}: ${message}`);
|
|
50
|
+
}
|
|
51
|
+
function normalizeSqliteTableInfoInteger(value, boundary, rowIndex, fieldName) {
|
|
52
|
+
if (typeof value === 'number') {
|
|
53
|
+
return value;
|
|
54
|
+
}
|
|
55
|
+
if (typeof value === 'bigint') {
|
|
56
|
+
return Number(value);
|
|
57
|
+
}
|
|
58
|
+
throw invalidSqliteBoundaryRow(boundary, rowIndex, `${fieldName} expected number, got ${describeSqliteBoundaryType(value)}`);
|
|
59
|
+
}
|
|
60
|
+
function parseSqliteTableInfoRow(row, boundary, rowIndex) {
|
|
61
|
+
if (!isRecord(row)) {
|
|
62
|
+
throw invalidSqliteBoundaryRow(boundary, rowIndex, `expected record, got ${describeSqliteBoundaryType(row)}`);
|
|
63
|
+
}
|
|
64
|
+
const rowRecord = row;
|
|
65
|
+
if (!hasOwn(rowRecord, 'cid')) {
|
|
66
|
+
throw invalidSqliteBoundaryRow(boundary, rowIndex, 'missing cid');
|
|
67
|
+
}
|
|
68
|
+
if (!hasOwnString(rowRecord, 'name')) {
|
|
69
|
+
throw invalidSqliteBoundaryRow(boundary, rowIndex, `name expected string, got ${describeSqliteBoundaryType(rowRecord.name)}`);
|
|
70
|
+
}
|
|
71
|
+
if (!hasOwnString(rowRecord, 'type')) {
|
|
72
|
+
throw invalidSqliteBoundaryRow(boundary, rowIndex, `type expected string, got ${describeSqliteBoundaryType(rowRecord.type)}`);
|
|
73
|
+
}
|
|
74
|
+
if (!hasOwn(rowRecord, 'notnull')) {
|
|
75
|
+
throw invalidSqliteBoundaryRow(boundary, rowIndex, 'missing notnull');
|
|
76
|
+
}
|
|
77
|
+
if (!hasOwn(rowRecord, 'dflt_value')) {
|
|
78
|
+
throw invalidSqliteBoundaryRow(boundary, rowIndex, 'missing dflt_value');
|
|
79
|
+
}
|
|
80
|
+
if (typeof rowRecord.dflt_value !== 'string' && rowRecord.dflt_value !== null) {
|
|
81
|
+
throw invalidSqliteBoundaryRow(boundary, rowIndex, `dflt_value expected string|null, got ${describeSqliteBoundaryType(rowRecord.dflt_value)}`);
|
|
82
|
+
}
|
|
83
|
+
if (!hasOwn(rowRecord, 'pk')) {
|
|
84
|
+
throw invalidSqliteBoundaryRow(boundary, rowIndex, 'missing pk');
|
|
85
|
+
}
|
|
86
|
+
return {
|
|
87
|
+
// WHY: some SQLite adapters promote PRAGMA integer metadata to bigint, but the shared table-info contract uses
|
|
88
|
+
// numeric counters plus string column descriptors.
|
|
89
|
+
cid: normalizeSqliteTableInfoInteger(rowRecord.cid, boundary, rowIndex, 'cid'),
|
|
90
|
+
name: rowRecord.name,
|
|
91
|
+
type: rowRecord.type,
|
|
92
|
+
notnull: normalizeSqliteTableInfoInteger(rowRecord.notnull, boundary, rowIndex, 'notnull'),
|
|
93
|
+
dflt_value: rowRecord.dflt_value,
|
|
94
|
+
pk: normalizeSqliteTableInfoInteger(rowRecord.pk, boundary, rowIndex, 'pk'),
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
/** Map arrow-builder SchemaType to SQLite column type */
|
|
98
|
+
function schemaTypeToSqlite(schemaType) {
|
|
99
|
+
switch (schemaType) {
|
|
100
|
+
case 'category':
|
|
101
|
+
case 'text':
|
|
102
|
+
case 'enum':
|
|
103
|
+
return 'TEXT';
|
|
104
|
+
case 'number':
|
|
105
|
+
return 'REAL';
|
|
106
|
+
case 'bigUint64':
|
|
107
|
+
case 'boolean':
|
|
108
|
+
return 'INTEGER';
|
|
109
|
+
case 'binary':
|
|
110
|
+
return 'BLOB';
|
|
111
|
+
}
|
|
112
|
+
throw new Error(`Unsupported schema type: ${String(schemaType)}`);
|
|
113
|
+
}
|
|
114
|
+
export function normalizeSqliteColumnType(type) {
|
|
115
|
+
return type.trim() === '' ? 'TEXT' : type;
|
|
116
|
+
}
|
|
117
|
+
export function quoteSqlIdentifier(name) {
|
|
118
|
+
if (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(name)) {
|
|
119
|
+
throw new Error(`Unsafe SQLite identifier: ${name}`);
|
|
120
|
+
}
|
|
121
|
+
return `"${name}"`;
|
|
122
|
+
}
|
|
123
|
+
export function buildAddColumnSql(column) {
|
|
124
|
+
return `ALTER TABLE spans ADD COLUMN ${quoteSqlIdentifier(column.name)} ${normalizeSqliteColumnType(column.sqliteType)}`;
|
|
125
|
+
}
|
|
126
|
+
export function isSqliteDuplicateColumnError(error, columnName) {
|
|
127
|
+
if (!(error instanceof Error)) {
|
|
128
|
+
return false;
|
|
129
|
+
}
|
|
130
|
+
return error.message.toLowerCase().includes(`duplicate column name: ${columnName.toLowerCase()}`);
|
|
131
|
+
}
|
|
132
|
+
export function getMissingSqliteColumns(columns, knownColumns) {
|
|
133
|
+
const missing = [];
|
|
134
|
+
for (const column of columns) {
|
|
135
|
+
if (!knownColumns.has(column.name)) {
|
|
136
|
+
missing.push(column);
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
return missing;
|
|
140
|
+
}
|
|
141
|
+
export function extractSqliteColumnsFromTableInfo(columns) {
|
|
142
|
+
return columns.map((column) => ({
|
|
143
|
+
name: column.name,
|
|
144
|
+
sqliteType: normalizeSqliteColumnType(column.type),
|
|
145
|
+
}));
|
|
146
|
+
}
|
|
147
|
+
export function parseSqliteTableInfoRows(rows, boundary = 'PRAGMA table_info(spans)') {
|
|
148
|
+
return rows.map((row, rowIndex) => parseSqliteTableInfoRow(row, boundary, rowIndex));
|
|
149
|
+
}
|
|
150
|
+
function* walkOverflowSegments(buffer, traceId, spanId, parentSpanId, rowOffset) {
|
|
151
|
+
yield {
|
|
152
|
+
buffer,
|
|
153
|
+
traceId,
|
|
154
|
+
spanId,
|
|
155
|
+
parentSpanId,
|
|
156
|
+
rowOffset,
|
|
157
|
+
};
|
|
158
|
+
if (buffer._overflow) {
|
|
159
|
+
yield* walkOverflowSegments(buffer._overflow, traceId, spanId, parentSpanId, rowOffset + buffer._writeIndex);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
function* walkTree(buffer) {
|
|
163
|
+
yield* walkOverflowSegments(buffer, buffer.trace_id, buffer.span_id, buffer.parent_span_id, 0);
|
|
164
|
+
for (const child of buffer._children) {
|
|
165
|
+
yield* walkTree(child);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
export function* walkSpanSegments(rootBuffer) {
|
|
169
|
+
yield* walkTree(rootBuffer);
|
|
170
|
+
}
|
|
171
|
+
export function getMissingSchemaColumns(schema, knownColumns) {
|
|
172
|
+
const schemaColumns = [];
|
|
173
|
+
for (const [name, field] of Object.entries(schema.fields)) {
|
|
174
|
+
const schemaType = getSchemaType(field);
|
|
175
|
+
if (!schemaType)
|
|
176
|
+
continue;
|
|
177
|
+
schemaColumns.push({ name, sqliteType: schemaTypeToSqlite(schemaType) });
|
|
178
|
+
}
|
|
179
|
+
return getMissingSqliteColumns(schemaColumns, knownColumns);
|
|
180
|
+
}
|
|
181
|
+
export function getActiveUserFields(schema, knownColumns) {
|
|
182
|
+
return schema._columnNames.filter((fieldName) => knownColumns.has(fieldName));
|
|
183
|
+
}
|
|
184
|
+
export function getInsertStatementCacheKey(activeUserFields) {
|
|
185
|
+
return activeUserFields.join(',');
|
|
186
|
+
}
|
|
187
|
+
export function buildInsertSql(activeUserFields) {
|
|
188
|
+
const userColsSql = activeUserFields.length > 0 ? `, ${activeUserFields.join(', ')}` : '';
|
|
189
|
+
const userPlaceholders = activeUserFields.length > 0 ? `, ${activeUserFields.map(() => '?').join(', ')}` : '';
|
|
190
|
+
return `INSERT INTO spans (trace_id, span_id, parent_span_id, row_index, entry_type, timestamp_ns, message${userColsSql})
|
|
191
|
+
VALUES (?, ?, ?, ?, ?, ?, ?${userPlaceholders})`;
|
|
192
|
+
}
|
|
193
|
+
export function buildInsertParams(segment, row, activeUserFields) {
|
|
194
|
+
const { buffer, traceId, spanId, parentSpanId, rowOffset } = segment;
|
|
195
|
+
const entryType = buffer.entry_type[row];
|
|
196
|
+
const timestampNs = Number(buffer.timestamp[row]);
|
|
197
|
+
const message = buffer.message_values[row] ?? null;
|
|
198
|
+
const userValues = activeUserFields.map((fieldName) => {
|
|
199
|
+
const directValue = readUserValue(buffer, fieldName, row);
|
|
200
|
+
const val = directValue ?? readScopeValue(buffer, fieldName);
|
|
201
|
+
if (val === undefined || val === null) {
|
|
202
|
+
return null;
|
|
203
|
+
}
|
|
204
|
+
return typeof val === 'bigint' ? Number(val) : val;
|
|
205
|
+
});
|
|
206
|
+
return [traceId, spanId, parentSpanId, rowOffset + row, entryType, timestampNs, message, ...userValues];
|
|
207
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* D1 adapter for LMAO async SQLite interfaces.
|
|
3
|
+
*
|
|
4
|
+
* This keeps D1-specific behavior in one place while exposing the generic
|
|
5
|
+
* AsyncSQLiteDatabase contract used by SQLiteAsyncTracer/SQLiteAsyncTraceWriter.
|
|
6
|
+
*
|
|
7
|
+
* @module sqlite-d1
|
|
8
|
+
*/
|
|
9
|
+
import type { AsyncSQLiteDatabase } from './sqlite-db.js';
|
|
10
|
+
type D1BindValue = null | number | string | ArrayBuffer | ArrayBufferView;
|
|
11
|
+
export interface D1LikePreparedStatement {
|
|
12
|
+
bind(...values: D1BindValue[]): D1LikePreparedStatement;
|
|
13
|
+
run(): Promise<unknown>;
|
|
14
|
+
all<T = unknown>(): Promise<{
|
|
15
|
+
results?: T[];
|
|
16
|
+
}>;
|
|
17
|
+
first<T = unknown>(): Promise<T | null>;
|
|
18
|
+
}
|
|
19
|
+
export interface D1LikeDatabase {
|
|
20
|
+
prepare(query: string): D1LikePreparedStatement;
|
|
21
|
+
exec(query: string): Promise<unknown>;
|
|
22
|
+
}
|
|
23
|
+
export declare function createD1SQLiteDatabase(db: D1LikeDatabase): AsyncSQLiteDatabase;
|
|
24
|
+
export {};
|
|
25
|
+
//# sourceMappingURL=sqlite-d1.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sqlite-d1.d.ts","sourceRoot":"","sources":["../../../src/lib/sqlite/sqlite-d1.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,mBAAmB,EAAwB,MAAM,gBAAgB,CAAC;AAEhF,KAAK,WAAW,GAAG,IAAI,GAAG,MAAM,GAAG,MAAM,GAAG,WAAW,GAAG,eAAe,CAAC;AAE1E,MAAM,WAAW,uBAAuB;IACtC,IAAI,CAAC,GAAG,MAAM,EAAE,WAAW,EAAE,GAAG,uBAAuB,CAAC;IACxD,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;IACxB,GAAG,CAAC,CAAC,GAAG,OAAO,KAAK,OAAO,CAAC;QAAE,OAAO,CAAC,EAAE,CAAC,EAAE,CAAA;KAAE,CAAC,CAAC;IAC/C,KAAK,CAAC,CAAC,GAAG,OAAO,KAAK,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;CACzC;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,uBAAuB,CAAC;IAChD,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CACvC;AA8ED,wBAAgB,sBAAsB,CAAC,EAAE,EAAE,cAAc,GAAG,mBAAmB,CAE9E"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
function toD1BindValue(value) {
|
|
2
|
+
if (value == null) {
|
|
3
|
+
return null;
|
|
4
|
+
}
|
|
5
|
+
if (typeof value === 'boolean') {
|
|
6
|
+
return value ? 1 : 0;
|
|
7
|
+
}
|
|
8
|
+
if (typeof value === 'bigint') {
|
|
9
|
+
return Number(value);
|
|
10
|
+
}
|
|
11
|
+
if (typeof value === 'number' || typeof value === 'string') {
|
|
12
|
+
return value;
|
|
13
|
+
}
|
|
14
|
+
if (value instanceof ArrayBuffer) {
|
|
15
|
+
return value;
|
|
16
|
+
}
|
|
17
|
+
if (ArrayBuffer.isView(value)) {
|
|
18
|
+
return value;
|
|
19
|
+
}
|
|
20
|
+
throw new Error(`Unsupported D1 bind param type: ${typeof value}`);
|
|
21
|
+
}
|
|
22
|
+
class D1StatementAdapter {
|
|
23
|
+
db;
|
|
24
|
+
query;
|
|
25
|
+
constructor(db, query) {
|
|
26
|
+
this.db = db;
|
|
27
|
+
this.query = query;
|
|
28
|
+
}
|
|
29
|
+
bind(params) {
|
|
30
|
+
const statement = this.db.prepare(this.query);
|
|
31
|
+
return statement.bind(...params.map(toD1BindValue));
|
|
32
|
+
}
|
|
33
|
+
async run(...params) {
|
|
34
|
+
await this.bind(params).run();
|
|
35
|
+
}
|
|
36
|
+
async all(...params) {
|
|
37
|
+
const result = await this.bind(params).all();
|
|
38
|
+
return result.results ?? [];
|
|
39
|
+
}
|
|
40
|
+
async get(...params) {
|
|
41
|
+
return (await this.bind(params).first()) ?? undefined;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
class D1DatabaseAdapter {
|
|
45
|
+
db;
|
|
46
|
+
constructor(db) {
|
|
47
|
+
this.db = db;
|
|
48
|
+
}
|
|
49
|
+
async exec(sql) {
|
|
50
|
+
const statements = sql
|
|
51
|
+
.split(';')
|
|
52
|
+
.map((statement) => statement.trim())
|
|
53
|
+
.filter((statement) => statement.length > 0);
|
|
54
|
+
for (const statement of statements) {
|
|
55
|
+
await this.db.prepare(statement).run();
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
prepare(sql) {
|
|
59
|
+
return new D1StatementAdapter(this.db, sql);
|
|
60
|
+
}
|
|
61
|
+
async close() {
|
|
62
|
+
// D1 bindings are managed by the worker runtime.
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
export function createD1SQLiteDatabase(db) {
|
|
66
|
+
return new D1DatabaseAdapter(db);
|
|
67
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Minimal SQLite interfaces used by trace persistence.
|
|
3
|
+
*
|
|
4
|
+
* Sync APIs match bun:sqlite / better-sqlite3 style drivers.
|
|
5
|
+
* Async APIs match worker-style drivers (for example D1 adapters).
|
|
6
|
+
*
|
|
7
|
+
* @module sqlite-db
|
|
8
|
+
*/
|
|
9
|
+
export interface SyncSQLiteDatabase {
|
|
10
|
+
exec(sql: string): void;
|
|
11
|
+
prepare(sql: string): SyncSQLiteStatement;
|
|
12
|
+
close(): void;
|
|
13
|
+
}
|
|
14
|
+
export interface SyncSQLiteStatement {
|
|
15
|
+
run(...params: unknown[]): void;
|
|
16
|
+
all(...params: unknown[]): unknown[];
|
|
17
|
+
get(...params: unknown[]): unknown;
|
|
18
|
+
}
|
|
19
|
+
export interface AsyncSQLiteDatabase {
|
|
20
|
+
exec(sql: string): Promise<void>;
|
|
21
|
+
prepare(sql: string): AsyncSQLiteStatement;
|
|
22
|
+
close(): Promise<void>;
|
|
23
|
+
}
|
|
24
|
+
export interface AsyncSQLiteStatement {
|
|
25
|
+
run(...params: unknown[]): Promise<void>;
|
|
26
|
+
all(...params: unknown[]): Promise<unknown[]>;
|
|
27
|
+
get(...params: unknown[]): Promise<unknown>;
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=sqlite-db.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sqlite-db.d.ts","sourceRoot":"","sources":["../../../src/lib/sqlite/sqlite-db.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,MAAM,WAAW,kBAAkB;IACjC,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,mBAAmB,CAAC;IAC1C,KAAK,IAAI,IAAI,CAAC;CACf;AAED,MAAM,WAAW,mBAAmB;IAClC,GAAG,CAAC,GAAG,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IAChC,GAAG,CAAC,GAAG,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,EAAE,CAAC;IACrC,GAAG,CAAC,GAAG,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;CACpC;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACjC,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,oBAAoB,CAAC;IAC3C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAED,MAAM,WAAW,oBAAoB;IACnC,GAAG,CAAC,GAAG,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACzC,GAAG,CAAC,GAAG,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;IAC9C,GAAG,CAAC,GAAG,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CAC7C"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { AsyncSQLiteDatabase, SyncSQLiteDatabase } from './sqlite-db.js';
|
|
2
|
+
/**
|
|
3
|
+
* Create a Node built-in sqlite database adapter.
|
|
4
|
+
*
|
|
5
|
+
* Use this in Node Vitest setup when you want trace output persisted
|
|
6
|
+
* to a deterministic file path.
|
|
7
|
+
*/
|
|
8
|
+
export declare function createNodeSQLiteDatabase(dbPath: string): SyncSQLiteDatabase;
|
|
9
|
+
/**
|
|
10
|
+
* Create an async adapter around Node built-in sqlite.
|
|
11
|
+
*
|
|
12
|
+
* Useful when wiring into `createAsyncDatabase` callbacks while still
|
|
13
|
+
* writing to a deterministic file path on Node.
|
|
14
|
+
*/
|
|
15
|
+
export declare function createNodeSQLiteAsyncDatabase(dbPath: string): AsyncSQLiteDatabase;
|
|
16
|
+
//# sourceMappingURL=sqlite-node.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sqlite-node.d.ts","sourceRoot":"","sources":["../../../src/lib/sqlite/sqlite-node.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,mBAAmB,EAEnB,kBAAkB,EAEnB,MAAM,gBAAgB,CAAC;AAoBxB;;;;;GAKG;AACH,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,MAAM,GAAG,kBAAkB,CAa3E;AAgBD;;;;;GAKG;AACH,wBAAgB,6BAA6B,CAAC,MAAM,EAAE,MAAM,GAAG,mBAAmB,CAajF"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
import { DatabaseSync } from 'node:sqlite';
|
|
3
|
+
function toSyncStatement(statement) {
|
|
4
|
+
return {
|
|
5
|
+
run(...params) {
|
|
6
|
+
statement.run(...params);
|
|
7
|
+
},
|
|
8
|
+
all(...params) {
|
|
9
|
+
return statement.all(...params);
|
|
10
|
+
},
|
|
11
|
+
get(...params) {
|
|
12
|
+
return statement.get(...params);
|
|
13
|
+
},
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Create a Node built-in sqlite database adapter.
|
|
18
|
+
*
|
|
19
|
+
* Use this in Node Vitest setup when you want trace output persisted
|
|
20
|
+
* to a deterministic file path.
|
|
21
|
+
*/
|
|
22
|
+
export function createNodeSQLiteDatabase(dbPath) {
|
|
23
|
+
const db = new DatabaseSync(dbPath);
|
|
24
|
+
return {
|
|
25
|
+
exec(sql) {
|
|
26
|
+
db.exec(sql);
|
|
27
|
+
},
|
|
28
|
+
prepare(sql) {
|
|
29
|
+
return toSyncStatement(db.prepare(sql));
|
|
30
|
+
},
|
|
31
|
+
close() {
|
|
32
|
+
db.close();
|
|
33
|
+
},
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
function toAsyncStatement(statement) {
|
|
37
|
+
return {
|
|
38
|
+
async run(...params) {
|
|
39
|
+
statement.run(...params);
|
|
40
|
+
},
|
|
41
|
+
async all(...params) {
|
|
42
|
+
return statement.all(...params);
|
|
43
|
+
},
|
|
44
|
+
async get(...params) {
|
|
45
|
+
return statement.get(...params);
|
|
46
|
+
},
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Create an async adapter around Node built-in sqlite.
|
|
51
|
+
*
|
|
52
|
+
* Useful when wiring into `createAsyncDatabase` callbacks while still
|
|
53
|
+
* writing to a deterministic file path on Node.
|
|
54
|
+
*/
|
|
55
|
+
export function createNodeSQLiteAsyncDatabase(dbPath) {
|
|
56
|
+
const syncDb = createNodeSQLiteDatabase(dbPath);
|
|
57
|
+
return {
|
|
58
|
+
async exec(sql) {
|
|
59
|
+
syncDb.exec(sql);
|
|
60
|
+
},
|
|
61
|
+
prepare(sql) {
|
|
62
|
+
return toAsyncStatement(syncDb.prepare(sql));
|
|
63
|
+
},
|
|
64
|
+
async close() {
|
|
65
|
+
syncDb.close();
|
|
66
|
+
},
|
|
67
|
+
};
|
|
68
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SQLiteTraceWriter - General-purpose writer that persists span buffer trees to SQLite.
|
|
3
|
+
*
|
|
4
|
+
* Accepts a SyncSQLiteDatabase instance (from bun:sqlite or better-sqlite3)
|
|
5
|
+
* and persists the full span tree as a flat `spans` table with dynamic column
|
|
6
|
+
* evolution based on the LogSchema fields found at flush time.
|
|
7
|
+
*
|
|
8
|
+
* Architecture:
|
|
9
|
+
* - Single `spans` table — no runs/log_entries decomposition
|
|
10
|
+
* - trace_id IS the run identifier (one root span per trace)
|
|
11
|
+
* - Tree structure via span_id / parent_span_id (no depth column)
|
|
12
|
+
* - User schema columns added dynamically via ALTER TABLE
|
|
13
|
+
* - Per-buffer ensureColumns for cross-library schema merging
|
|
14
|
+
*
|
|
15
|
+
* @module sqlite-writer
|
|
16
|
+
*/
|
|
17
|
+
import type { AnySpanBuffer } from '../types.js';
|
|
18
|
+
import type { SyncSQLiteDatabase } from './sqlite-db.js';
|
|
19
|
+
export interface SQLiteWriterConfig {
|
|
20
|
+
/** Path to SQLite file. Default: '.trace-results.db' */
|
|
21
|
+
dbPath?: string;
|
|
22
|
+
}
|
|
23
|
+
export declare class SQLiteTraceWriter {
|
|
24
|
+
private db;
|
|
25
|
+
private knownColumns;
|
|
26
|
+
private insertStmtCache;
|
|
27
|
+
constructor(db: SyncSQLiteDatabase);
|
|
28
|
+
private init;
|
|
29
|
+
private refreshKnownColumns;
|
|
30
|
+
/** Ensure user-defined schema columns exist in the spans table */
|
|
31
|
+
private ensureColumns;
|
|
32
|
+
private writeSegmentRows;
|
|
33
|
+
private flushAllSegments;
|
|
34
|
+
private getInsertStatement;
|
|
35
|
+
/** Write a root SpanBuffer tree to the database */
|
|
36
|
+
flush(rootBuffer: AnySpanBuffer): void;
|
|
37
|
+
close(): void;
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=sqlite-writer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sqlite-writer.d.ts","sourceRoot":"","sources":["../../../src/lib/sqlite/sqlite-writer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAGH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAgBjD,OAAO,KAAK,EAAE,kBAAkB,EAAuB,MAAM,gBAAgB,CAAC;AAE9E,MAAM,WAAW,kBAAkB;IACjC,wDAAwD;IACxD,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,qBAAa,iBAAiB;IAIhB,OAAO,CAAC,EAAE;IAHtB,OAAO,CAAC,YAAY,CAAqB;IACzC,OAAO,CAAC,eAAe,CAA0C;gBAE7C,EAAE,EAAE,kBAAkB;IAI1C,OAAO,CAAC,IAAI;IAQZ,OAAO,CAAC,mBAAmB;IAU3B,kEAAkE;IAClE,OAAO,CAAC,aAAa;IAerB,OAAO,CAAC,gBAAgB;IAWxB,OAAO,CAAC,gBAAgB;IAMxB,OAAO,CAAC,kBAAkB;IAY1B,mDAAmD;IACnD,KAAK,CAAC,UAAU,EAAE,aAAa,GAAG,IAAI;IAWtC,KAAK,IAAI,IAAI;CAGd"}
|