@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,772 @@
|
|
|
1
|
+
import { getSchemaType } from '@smoothbricks/arrow-builder';
|
|
2
|
+
import { checkCapacityTuning } from '../capacityTuning.js';
|
|
3
|
+
function getFieldEager(value) {
|
|
4
|
+
return typeof value === 'object' && value !== null && Reflect.get(value, '__eager') === true;
|
|
5
|
+
}
|
|
6
|
+
function getFieldEnumValues(value) {
|
|
7
|
+
if (typeof value !== 'object' || value === null) {
|
|
8
|
+
return undefined;
|
|
9
|
+
}
|
|
10
|
+
const enumValues = Reflect.get(value, '__enum_values');
|
|
11
|
+
return Array.isArray(enumValues) ? enumValues : undefined;
|
|
12
|
+
}
|
|
13
|
+
function isColumnValueType(value) {
|
|
14
|
+
return value === undefined || Array.isArray(value) || ArrayBuffer.isView(value);
|
|
15
|
+
}
|
|
16
|
+
function getFreeMethod(sizeClass) {
|
|
17
|
+
switch (sizeClass) {
|
|
18
|
+
case '1b':
|
|
19
|
+
return 'free1B';
|
|
20
|
+
case '4b':
|
|
21
|
+
return 'free4B';
|
|
22
|
+
case '8b':
|
|
23
|
+
return 'free8B';
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
function isWasmSpanBufferConstructor(value) {
|
|
27
|
+
return (typeof value === 'function' &&
|
|
28
|
+
typeof Reflect.get(value, 'schema') === 'object' &&
|
|
29
|
+
Reflect.get(value, 'schema') !== null &&
|
|
30
|
+
typeof Reflect.get(value, 'stats') === 'object' &&
|
|
31
|
+
Reflect.get(value, 'stats') !== null);
|
|
32
|
+
}
|
|
33
|
+
export function isWasmSpanBufferInstance(value) {
|
|
34
|
+
return typeof value === 'object' && value !== null && typeof Reflect.get(value, '_systemPtr') === 'number';
|
|
35
|
+
}
|
|
36
|
+
function getWasmSpanBufferConstructor(instance) {
|
|
37
|
+
if (!isWasmSpanBufferConstructor(instance.constructor)) {
|
|
38
|
+
throw new Error('Expected generated WasmSpanBuffer constructor');
|
|
39
|
+
}
|
|
40
|
+
return instance.constructor;
|
|
41
|
+
}
|
|
42
|
+
function isWasmSpanBufferFactory(value) {
|
|
43
|
+
return typeof value === 'function';
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Build column metadata array from schema.
|
|
47
|
+
* Maps each schema field to its storage characteristics.
|
|
48
|
+
*/
|
|
49
|
+
function buildColumnMeta(schema) {
|
|
50
|
+
const result = [];
|
|
51
|
+
const fields = schema.fields;
|
|
52
|
+
let columnIndex = 0;
|
|
53
|
+
for (const name of schema._columnNames) {
|
|
54
|
+
const field = fields[name];
|
|
55
|
+
const schemaType = getSchemaType(field);
|
|
56
|
+
const isEager = getFieldEager(field);
|
|
57
|
+
const enumValues = getFieldEnumValues(field);
|
|
58
|
+
let sizeClass;
|
|
59
|
+
switch (schemaType) {
|
|
60
|
+
case 'enum':
|
|
61
|
+
case 'boolean':
|
|
62
|
+
sizeClass = '1b';
|
|
63
|
+
break;
|
|
64
|
+
case 'number':
|
|
65
|
+
case 'bigUint64':
|
|
66
|
+
sizeClass = '8b';
|
|
67
|
+
break;
|
|
68
|
+
case 'category':
|
|
69
|
+
case 'text':
|
|
70
|
+
sizeClass = 'string';
|
|
71
|
+
break;
|
|
72
|
+
default:
|
|
73
|
+
sizeClass = '8b'; // Default to largest for unknown types
|
|
74
|
+
}
|
|
75
|
+
result.push({
|
|
76
|
+
name,
|
|
77
|
+
sizeClass,
|
|
78
|
+
schemaType: schemaType ?? 'unknown',
|
|
79
|
+
columnIndex,
|
|
80
|
+
isEager,
|
|
81
|
+
enumValues,
|
|
82
|
+
});
|
|
83
|
+
columnIndex++;
|
|
84
|
+
}
|
|
85
|
+
return result;
|
|
86
|
+
}
|
|
87
|
+
// =============================================================================
|
|
88
|
+
// Common WasmSpanBuffer Methods (shared via prototype)
|
|
89
|
+
// =============================================================================
|
|
90
|
+
/**
|
|
91
|
+
* Get timestamp column view from WASM memory.
|
|
92
|
+
* Assigned to prototype after class generation.
|
|
93
|
+
*/
|
|
94
|
+
function wasmGetTimestamp() {
|
|
95
|
+
return new BigInt64Array(this._allocator.memory.buffer, this._systemPtr, this._capacity);
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Get entry_type column view from WASM memory.
|
|
99
|
+
* Assigned to prototype after class generation.
|
|
100
|
+
*/
|
|
101
|
+
function wasmGetEntryType() {
|
|
102
|
+
return new Uint8Array(this._allocator.memory.buffer, this._systemPtr + this._capacity * 8, this._capacity);
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Get writeIndex from WASM identity block.
|
|
106
|
+
*/
|
|
107
|
+
function wasmGetWriteIndex() {
|
|
108
|
+
return this._allocator.readWriteIndex(this._identityPtr);
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Set writeIndex in WASM identity block.
|
|
112
|
+
*/
|
|
113
|
+
function wasmSetWriteIndex(value) {
|
|
114
|
+
new DataView(this._allocator.memory.buffer).setUint32(this._identityPtr, value, true);
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Get trace_id from WASM identity block.
|
|
118
|
+
*/
|
|
119
|
+
function wasmGetTraceId() {
|
|
120
|
+
const len = this._allocator.readIdentityTraceIdLen(this._identityPtr);
|
|
121
|
+
if (len === 0) {
|
|
122
|
+
let p = this._parent;
|
|
123
|
+
while (p?._parent)
|
|
124
|
+
p = p._parent;
|
|
125
|
+
return p ? p.trace_id : '';
|
|
126
|
+
}
|
|
127
|
+
const traceIdPtr = this._allocator.getIdentityTraceIdPtr(this._identityPtr);
|
|
128
|
+
return new TextDecoder().decode(new Uint8Array(this._allocator.memory.buffer, traceIdPtr, len));
|
|
129
|
+
}
|
|
130
|
+
function wasmGetSpanStartTime() {
|
|
131
|
+
return this.timestamp[0];
|
|
132
|
+
}
|
|
133
|
+
function wasmGetLastLoggedTime() {
|
|
134
|
+
const chain = [];
|
|
135
|
+
let current = this;
|
|
136
|
+
while (current) {
|
|
137
|
+
chain.push(current);
|
|
138
|
+
current = current._overflow;
|
|
139
|
+
}
|
|
140
|
+
for (let i = chain.length - 1; i >= 0; i--) {
|
|
141
|
+
const buffer = chain[i];
|
|
142
|
+
for (let row = buffer._writeIndex - 1; row >= 0; row--) {
|
|
143
|
+
const ts = buffer.timestamp[row];
|
|
144
|
+
if (ts !== 0n) {
|
|
145
|
+
return ts;
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
return null;
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Get thread_id from WASM identity block.
|
|
153
|
+
*/
|
|
154
|
+
function wasmGetThreadId() {
|
|
155
|
+
const high = this._allocator.getThreadIdHigh();
|
|
156
|
+
const low = this._allocator.getThreadIdLow();
|
|
157
|
+
return (BigInt(high) << 32n) | BigInt(low);
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Get span_id from WASM identity block.
|
|
161
|
+
*/
|
|
162
|
+
function wasmGetSpanId() {
|
|
163
|
+
return this._allocator.readIdentitySpanId(this._identityPtr);
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Get parent_thread_id.
|
|
167
|
+
*/
|
|
168
|
+
function wasmGetParentThreadId() {
|
|
169
|
+
return this._parent ? this._parent.thread_id : 0n;
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Get parent_span_id.
|
|
173
|
+
*/
|
|
174
|
+
function wasmGetParentSpanId() {
|
|
175
|
+
return this._parent ? this._parent.span_id : 0;
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Check if buffer has parent.
|
|
179
|
+
*/
|
|
180
|
+
function wasmGetHasParent() {
|
|
181
|
+
return this._parent !== null;
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Message column setter.
|
|
185
|
+
*/
|
|
186
|
+
function wasmMessage(idx, value) {
|
|
187
|
+
this._message[idx] = value;
|
|
188
|
+
return this;
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* Get message column values.
|
|
192
|
+
*/
|
|
193
|
+
function wasmGetMessageValues() {
|
|
194
|
+
return this._message;
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* Get message column nulls (always undefined for eager column).
|
|
198
|
+
*/
|
|
199
|
+
function wasmGetMessageNulls() {
|
|
200
|
+
return undefined;
|
|
201
|
+
}
|
|
202
|
+
/**
|
|
203
|
+
* Free all WASM memory for this buffer.
|
|
204
|
+
*/
|
|
205
|
+
function wasmFree() {
|
|
206
|
+
// Free identity block
|
|
207
|
+
this._allocator.freeIdentity(this._identityPtr);
|
|
208
|
+
// Free system block
|
|
209
|
+
this._allocator.freeSpanSystem(this._systemPtr);
|
|
210
|
+
// Free column blocks
|
|
211
|
+
const columnMeta = buildColumnMeta(this._logSchema);
|
|
212
|
+
for (const col of columnMeta) {
|
|
213
|
+
if (col.sizeClass !== 'string' && this._columnPtrs[col.columnIndex] >= 0) {
|
|
214
|
+
const freeMethod = getFreeMethod(col.sizeClass);
|
|
215
|
+
this._allocator[freeMethod](this._columnPtrs[col.columnIndex]);
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
/**
|
|
220
|
+
* Check if column is allocated.
|
|
221
|
+
*/
|
|
222
|
+
function wasmIsColumnAllocated(columnIndex) {
|
|
223
|
+
return this._columnPtrs[columnIndex] >= 0;
|
|
224
|
+
}
|
|
225
|
+
/**
|
|
226
|
+
* Get column values if allocated.
|
|
227
|
+
*/
|
|
228
|
+
function wasmGetColumnIfAllocated(columnName) {
|
|
229
|
+
const idx = this._logSchema._columnNames.indexOf(columnName);
|
|
230
|
+
if (idx === -1)
|
|
231
|
+
return undefined;
|
|
232
|
+
const getter = Object.getOwnPropertyDescriptor(Object.getPrototypeOf(this), `${columnName}_values`);
|
|
233
|
+
if (getter?.get) {
|
|
234
|
+
const value = getter.get.call(this);
|
|
235
|
+
return isColumnValueType(value) ? value : undefined;
|
|
236
|
+
}
|
|
237
|
+
return undefined;
|
|
238
|
+
}
|
|
239
|
+
/**
|
|
240
|
+
* Get column nulls if allocated.
|
|
241
|
+
*/
|
|
242
|
+
function wasmGetNullsIfAllocated(columnName) {
|
|
243
|
+
const getter = Object.getOwnPropertyDescriptor(Object.getPrototypeOf(this), `${columnName}_nulls`);
|
|
244
|
+
if (getter?.get) {
|
|
245
|
+
return getter.get.call(this);
|
|
246
|
+
}
|
|
247
|
+
return undefined;
|
|
248
|
+
}
|
|
249
|
+
/**
|
|
250
|
+
* Get system ArrayBuffer for compatibility with AnySpanBuffer.
|
|
251
|
+
* WASM uses shared memory, so this returns the entire WASM memory buffer.
|
|
252
|
+
*/
|
|
253
|
+
function wasmGetSystem() {
|
|
254
|
+
return this._allocator.memory.buffer;
|
|
255
|
+
}
|
|
256
|
+
/**
|
|
257
|
+
* Get identity Uint8Array for compatibility with AnySpanBuffer.
|
|
258
|
+
* Returns a view of the identity block (48 bytes) in WASM memory.
|
|
259
|
+
*/
|
|
260
|
+
function wasmGetIdentity() {
|
|
261
|
+
// Identity block is 48 bytes: writeIndex(4) + reserved(4) + span_id(4) + trace_id_len(1) + trace_id(up to 35)
|
|
262
|
+
return new Uint8Array(this._allocator.memory.buffer, this._identityPtr, 48);
|
|
263
|
+
}
|
|
264
|
+
/**
|
|
265
|
+
* Get or create overflow buffer.
|
|
266
|
+
*/
|
|
267
|
+
function wasmGetOrCreateOverflow() {
|
|
268
|
+
if (this._overflow)
|
|
269
|
+
return this._overflow;
|
|
270
|
+
const tracer = this._traceRoot.tracer;
|
|
271
|
+
tracer.onStatsWillResetFor(this);
|
|
272
|
+
checkCapacityTuning(getWasmSpanBufferConstructor(this).stats);
|
|
273
|
+
// WasmSpanBufferInstance extends AnySpanBuffer and has all SpanBuffer properties at runtime
|
|
274
|
+
const overflow = tracer.bufferStrategy.createOverflowBuffer(this);
|
|
275
|
+
if (!isWasmSpanBufferInstance(overflow)) {
|
|
276
|
+
throw new Error('Expected overflow buffer to be WASM-backed');
|
|
277
|
+
}
|
|
278
|
+
return overflow;
|
|
279
|
+
}
|
|
280
|
+
/**
|
|
281
|
+
* Get _stats property.
|
|
282
|
+
*/
|
|
283
|
+
function wasmGetStats() {
|
|
284
|
+
return getWasmSpanBufferConstructor(this).stats;
|
|
285
|
+
}
|
|
286
|
+
/**
|
|
287
|
+
* Get _columns property.
|
|
288
|
+
*/
|
|
289
|
+
function wasmGetColumns() {
|
|
290
|
+
return getWasmSpanBufferConstructor(this).schema._columns;
|
|
291
|
+
}
|
|
292
|
+
/**
|
|
293
|
+
* Custom inspect for debugging.
|
|
294
|
+
*/
|
|
295
|
+
function wasmInspect() {
|
|
296
|
+
return `WasmSpanBuffer { _writeIndex: ${this._writeIndex}, _capacity: ${this._capacity}, trace_id: ${this.trace_id ?? 'N/A'}, _systemPtr: ${this._systemPtr} }`;
|
|
297
|
+
}
|
|
298
|
+
// =============================================================================
|
|
299
|
+
// Code Generation Helpers
|
|
300
|
+
// =============================================================================
|
|
301
|
+
/**
|
|
302
|
+
* Generate eager column initialization code for constructor.
|
|
303
|
+
* Eager columns are pre-allocated, lazy columns start as undefined/-1.
|
|
304
|
+
*/
|
|
305
|
+
function generateEagerColumnInit(columnMeta) {
|
|
306
|
+
const lines = [];
|
|
307
|
+
for (const col of columnMeta) {
|
|
308
|
+
if (col.name === 'message')
|
|
309
|
+
continue; // Message handled separately
|
|
310
|
+
if (col.sizeClass === 'string') {
|
|
311
|
+
if (col.isEager) {
|
|
312
|
+
lines.push(`this._${col.name}_values = new Array(this._capacity);`);
|
|
313
|
+
}
|
|
314
|
+
else {
|
|
315
|
+
lines.push(`this._${col.name}_values = undefined;`);
|
|
316
|
+
lines.push(`this._${col.name}_nulls = undefined;`);
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
else if (col.isEager) {
|
|
320
|
+
lines.push(`this._columnPtrs[${col.columnIndex}] = this._allocator.alloc${col.sizeClass.toUpperCase()}();`);
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
return lines.join('\n ');
|
|
324
|
+
}
|
|
325
|
+
/**
|
|
326
|
+
* Generate setter method for a numeric column (stored in WASM).
|
|
327
|
+
* Calls WASM exports directly for hot path optimization.
|
|
328
|
+
*/
|
|
329
|
+
function generateNumericSetter(col) {
|
|
330
|
+
const allocMethod = `alloc${col.sizeClass.toUpperCase()}`;
|
|
331
|
+
// Map to WASM export names
|
|
332
|
+
const writeExportName = col.schemaType === 'number' || col.schemaType === 'bigUint64'
|
|
333
|
+
? 'write_col_f64'
|
|
334
|
+
: col.sizeClass === '1b'
|
|
335
|
+
? 'write_col_u8'
|
|
336
|
+
: col.sizeClass === '4b'
|
|
337
|
+
? 'write_col_u32'
|
|
338
|
+
: 'write_col_f64';
|
|
339
|
+
if (col.isEager) {
|
|
340
|
+
// Eager: column is pre-allocated, just write value (call WASM export directly)
|
|
341
|
+
return `${col.name}(idx, value) {
|
|
342
|
+
const ptr = this._columnPtrs[${col.columnIndex}];
|
|
343
|
+
this._allocator.exports.${writeExportName}(ptr, idx, value, this._capacity);
|
|
344
|
+
return this;
|
|
345
|
+
}`;
|
|
346
|
+
}
|
|
347
|
+
// Lazy: allocate on first write (call WASM export directly)
|
|
348
|
+
return `${col.name}(idx, value) {
|
|
349
|
+
let ptr = this._columnPtrs[${col.columnIndex}];
|
|
350
|
+
if (ptr < 0) {
|
|
351
|
+
ptr = this._allocator.${allocMethod}();
|
|
352
|
+
this._columnPtrs[${col.columnIndex}] = ptr;
|
|
353
|
+
}
|
|
354
|
+
this._allocator.exports.${writeExportName}(ptr, idx, value, this._capacity);
|
|
355
|
+
return this;
|
|
356
|
+
}`;
|
|
357
|
+
}
|
|
358
|
+
/**
|
|
359
|
+
* Generate getter for numeric column values (creates view on demand).
|
|
360
|
+
*/
|
|
361
|
+
function generateNumericValuesGetter(col) {
|
|
362
|
+
const arrayType = col.schemaType === 'number'
|
|
363
|
+
? 'Float64Array'
|
|
364
|
+
: col.schemaType === 'bigUint64'
|
|
365
|
+
? 'BigUint64Array'
|
|
366
|
+
: col.sizeClass === '1b'
|
|
367
|
+
? 'Uint8Array'
|
|
368
|
+
: col.sizeClass === '4b'
|
|
369
|
+
? 'Uint32Array'
|
|
370
|
+
: 'Float64Array';
|
|
371
|
+
const bytesPerElement = col.sizeClass === '1b' ? 1 : col.sizeClass === '4b' ? 4 : 8;
|
|
372
|
+
return `get ${col.name}_values() {
|
|
373
|
+
const ptr = this._columnPtrs[${col.columnIndex}];
|
|
374
|
+
if (ptr < 0) return ${col.isEager ? 'null' : 'undefined'};
|
|
375
|
+
const nullBitmapSize = Math.ceil(this._capacity / 8);
|
|
376
|
+
const valueOffset = ptr + nullBitmapSize;
|
|
377
|
+
// Align offset for typed array
|
|
378
|
+
const alignedOffset = (valueOffset + ${bytesPerElement - 1}) & ~${bytesPerElement - 1};
|
|
379
|
+
return new ${arrayType}(
|
|
380
|
+
this._allocator.memory.buffer,
|
|
381
|
+
alignedOffset,
|
|
382
|
+
this._capacity
|
|
383
|
+
);
|
|
384
|
+
}`;
|
|
385
|
+
}
|
|
386
|
+
/**
|
|
387
|
+
* Generate getter for numeric column nulls bitmap.
|
|
388
|
+
*/
|
|
389
|
+
function generateNumericNullsGetter(col) {
|
|
390
|
+
if (col.isEager) {
|
|
391
|
+
// Eager columns don't have null bitmaps
|
|
392
|
+
return `get ${col.name}_nulls() {
|
|
393
|
+
return undefined;
|
|
394
|
+
}`;
|
|
395
|
+
}
|
|
396
|
+
return `get ${col.name}_nulls() {
|
|
397
|
+
const ptr = this._columnPtrs[${col.columnIndex}];
|
|
398
|
+
if (ptr < 0) return undefined;
|
|
399
|
+
const nullBitmapSize = Math.ceil(this._capacity / 8);
|
|
400
|
+
return new Uint8Array(
|
|
401
|
+
this._allocator.memory.buffer,
|
|
402
|
+
ptr,
|
|
403
|
+
nullBitmapSize
|
|
404
|
+
);
|
|
405
|
+
}`;
|
|
406
|
+
}
|
|
407
|
+
/**
|
|
408
|
+
* Generate setter method for a string column (stored in JS).
|
|
409
|
+
*/
|
|
410
|
+
function generateStringSetter(col) {
|
|
411
|
+
if (col.isEager) {
|
|
412
|
+
return `${col.name}(idx, value) {
|
|
413
|
+
this._${col.name}_values[idx] = value;
|
|
414
|
+
return this;
|
|
415
|
+
}`;
|
|
416
|
+
}
|
|
417
|
+
// Lazy string column: allocate arrays on first write
|
|
418
|
+
return `${col.name}(idx, value) {
|
|
419
|
+
if (this._${col.name}_values === undefined) {
|
|
420
|
+
this._${col.name}_values = new Array(this._capacity);
|
|
421
|
+
const nullBitmapSize = Math.ceil(this._capacity / 8);
|
|
422
|
+
this._${col.name}_nulls = new Uint8Array(nullBitmapSize);
|
|
423
|
+
}
|
|
424
|
+
if (value == null) {
|
|
425
|
+
// Clear validity bit
|
|
426
|
+
this._${col.name}_nulls[idx >>> 3] &= ~(1 << (idx & 7));
|
|
427
|
+
} else {
|
|
428
|
+
this._${col.name}_values[idx] = value;
|
|
429
|
+
// Set validity bit
|
|
430
|
+
this._${col.name}_nulls[idx >>> 3] |= (1 << (idx & 7));
|
|
431
|
+
}
|
|
432
|
+
return this;
|
|
433
|
+
}`;
|
|
434
|
+
}
|
|
435
|
+
/**
|
|
436
|
+
* Generate getter for string column values.
|
|
437
|
+
*/
|
|
438
|
+
function generateStringValuesGetter(col) {
|
|
439
|
+
if (col.isEager) {
|
|
440
|
+
return `get ${col.name}_values() {
|
|
441
|
+
return this._${col.name}_values;
|
|
442
|
+
}`;
|
|
443
|
+
}
|
|
444
|
+
return `get ${col.name}_values() {
|
|
445
|
+
return this._${col.name}_values;
|
|
446
|
+
}`;
|
|
447
|
+
}
|
|
448
|
+
/**
|
|
449
|
+
* Generate getter for string column nulls.
|
|
450
|
+
*/
|
|
451
|
+
function generateStringNullsGetter(col) {
|
|
452
|
+
if (col.isEager) {
|
|
453
|
+
return `get ${col.name}_nulls() {
|
|
454
|
+
return undefined;
|
|
455
|
+
}`;
|
|
456
|
+
}
|
|
457
|
+
return `get ${col.name}_nulls() {
|
|
458
|
+
return this._${col.name}_nulls;
|
|
459
|
+
}`;
|
|
460
|
+
}
|
|
461
|
+
/**
|
|
462
|
+
* Generate column methods for all schema columns.
|
|
463
|
+
* Note: 'message' column is handled specially by generateMessageMethods() and excluded here.
|
|
464
|
+
*/
|
|
465
|
+
function generateColumnMethods(columnMeta) {
|
|
466
|
+
const methods = [];
|
|
467
|
+
for (const col of columnMeta) {
|
|
468
|
+
// Skip 'message' - handled specially by generateMessageMethods()
|
|
469
|
+
if (col.name === 'message') {
|
|
470
|
+
continue;
|
|
471
|
+
}
|
|
472
|
+
if (col.sizeClass === 'string') {
|
|
473
|
+
methods.push(generateStringSetter(col));
|
|
474
|
+
methods.push(generateStringValuesGetter(col));
|
|
475
|
+
methods.push(generateStringNullsGetter(col));
|
|
476
|
+
}
|
|
477
|
+
else {
|
|
478
|
+
methods.push(generateNumericSetter(col));
|
|
479
|
+
methods.push(generateNumericValuesGetter(col));
|
|
480
|
+
methods.push(generateNumericNullsGetter(col));
|
|
481
|
+
}
|
|
482
|
+
}
|
|
483
|
+
return methods.join('\n\n ');
|
|
484
|
+
}
|
|
485
|
+
// =============================================================================
|
|
486
|
+
// Class Cache and Generation
|
|
487
|
+
// =============================================================================
|
|
488
|
+
/**
|
|
489
|
+
* Cache for generated WASM SpanBuffer classes.
|
|
490
|
+
* Key is the schema object reference (WeakMap for GC).
|
|
491
|
+
*/
|
|
492
|
+
const wasmSpanBufferClassCache = new WeakMap();
|
|
493
|
+
/**
|
|
494
|
+
* Generate a WASM SpanBuffer class for the given schema.
|
|
495
|
+
*
|
|
496
|
+
* Generates minimal constructor + column methods, then assigns common methods to prototype.
|
|
497
|
+
*
|
|
498
|
+
* @param schema - LogSchema defining the buffer structure
|
|
499
|
+
* @returns WasmSpanBufferConstructor for creating buffer instances
|
|
500
|
+
*/
|
|
501
|
+
export function getWasmSpanBufferClass(schema) {
|
|
502
|
+
const cached = wasmSpanBufferClassCache.get(schema);
|
|
503
|
+
if (cached) {
|
|
504
|
+
return cached;
|
|
505
|
+
}
|
|
506
|
+
// Pre-compute column metadata
|
|
507
|
+
const columnMeta = buildColumnMeta(schema);
|
|
508
|
+
// Generate ONLY schema-specific code (constructor + column methods)
|
|
509
|
+
const classCode = `
|
|
510
|
+
class WasmSpanBuffer {
|
|
511
|
+
constructor(opts) {
|
|
512
|
+
// Store allocator and capacity
|
|
513
|
+
this._allocator = opts.allocator;
|
|
514
|
+
this._capacity = opts.capacity;
|
|
515
|
+
this._logSchema = opts.logSchema;
|
|
516
|
+
|
|
517
|
+
// Allocate identity block from WASM (root has trace_id, child does not)
|
|
518
|
+
if (opts.trace_id) {
|
|
519
|
+
const traceIdBytes = new TextEncoder().encode(opts.trace_id);
|
|
520
|
+
const packed = opts.allocator.allocIdentityRootForJsWrite(traceIdBytes.length);
|
|
521
|
+
this._identityPtr = Number(packed >> 32n);
|
|
522
|
+
const traceIdOffset = Number(packed & 0xFFFFFFFFn);
|
|
523
|
+
new Uint8Array(opts.allocator.memory.buffer).set(traceIdBytes, traceIdOffset);
|
|
524
|
+
} else {
|
|
525
|
+
this._identityPtr = opts.allocator.allocIdentityChild();
|
|
526
|
+
}
|
|
527
|
+
|
|
528
|
+
// Allocate system block from WASM
|
|
529
|
+
this._systemPtr = opts.allocator.allocSpanSystem();
|
|
530
|
+
|
|
531
|
+
// Initialize column pointers as unallocated (-1)
|
|
532
|
+
this._columnPtrs = new Int32Array(${columnMeta.length}).fill(-1);
|
|
533
|
+
|
|
534
|
+
// Tree structure
|
|
535
|
+
this._parent = null;
|
|
536
|
+
this._children = [];
|
|
537
|
+
this._overflow = null;
|
|
538
|
+
|
|
539
|
+
// Assign context properties from opts
|
|
540
|
+
this._traceRoot = opts._traceRoot;
|
|
541
|
+
this._scopeValues = opts._scopeValues;
|
|
542
|
+
this._opMetadata = opts._opMetadata;
|
|
543
|
+
this._callsiteMetadata = opts._callsiteMetadata;
|
|
544
|
+
|
|
545
|
+
// Initialize message array
|
|
546
|
+
this._message = new Array(opts.capacity);
|
|
547
|
+
|
|
548
|
+
// Initialize eager columns
|
|
549
|
+
${generateEagerColumnInit(columnMeta)}
|
|
550
|
+
}
|
|
551
|
+
|
|
552
|
+
// Schema-specific column methods (ONLY part that differs per schema)
|
|
553
|
+
${generateColumnMethods(columnMeta)}
|
|
554
|
+
}
|
|
555
|
+
|
|
556
|
+
return WasmSpanBuffer;
|
|
557
|
+
`;
|
|
558
|
+
// Create the class using Function constructor
|
|
559
|
+
const factory = new Function(classCode);
|
|
560
|
+
if (!isWasmSpanBufferFactory(factory)) {
|
|
561
|
+
throw new Error('Expected WasmSpanBuffer factory function');
|
|
562
|
+
}
|
|
563
|
+
const WasmSpanBufferClass = factory();
|
|
564
|
+
// Assign common methods to prototype (shared by all schemas)
|
|
565
|
+
Object.defineProperty(WasmSpanBufferClass.prototype, 'timestamp', {
|
|
566
|
+
get: wasmGetTimestamp,
|
|
567
|
+
enumerable: true,
|
|
568
|
+
configurable: true,
|
|
569
|
+
});
|
|
570
|
+
Object.defineProperty(WasmSpanBufferClass.prototype, 'entry_type', {
|
|
571
|
+
get: wasmGetEntryType,
|
|
572
|
+
enumerable: true,
|
|
573
|
+
configurable: true,
|
|
574
|
+
});
|
|
575
|
+
Object.defineProperty(WasmSpanBufferClass.prototype, '_writeIndex', {
|
|
576
|
+
get: wasmGetWriteIndex,
|
|
577
|
+
set: wasmSetWriteIndex,
|
|
578
|
+
enumerable: true,
|
|
579
|
+
configurable: true,
|
|
580
|
+
});
|
|
581
|
+
Object.defineProperty(WasmSpanBufferClass.prototype, 'trace_id', {
|
|
582
|
+
get: wasmGetTraceId,
|
|
583
|
+
enumerable: true,
|
|
584
|
+
configurable: true,
|
|
585
|
+
});
|
|
586
|
+
Object.defineProperty(WasmSpanBufferClass.prototype, 'thread_id', {
|
|
587
|
+
get: wasmGetThreadId,
|
|
588
|
+
enumerable: true,
|
|
589
|
+
configurable: true,
|
|
590
|
+
});
|
|
591
|
+
Object.defineProperty(WasmSpanBufferClass.prototype, 'span_id', {
|
|
592
|
+
get: wasmGetSpanId,
|
|
593
|
+
enumerable: true,
|
|
594
|
+
configurable: true,
|
|
595
|
+
});
|
|
596
|
+
Object.defineProperty(WasmSpanBufferClass.prototype, 'parent_thread_id', {
|
|
597
|
+
get: wasmGetParentThreadId,
|
|
598
|
+
enumerable: true,
|
|
599
|
+
configurable: true,
|
|
600
|
+
});
|
|
601
|
+
Object.defineProperty(WasmSpanBufferClass.prototype, 'parent_span_id', {
|
|
602
|
+
get: wasmGetParentSpanId,
|
|
603
|
+
enumerable: true,
|
|
604
|
+
configurable: true,
|
|
605
|
+
});
|
|
606
|
+
Object.defineProperty(WasmSpanBufferClass.prototype, '_hasParent', {
|
|
607
|
+
get: wasmGetHasParent,
|
|
608
|
+
enumerable: true,
|
|
609
|
+
configurable: true,
|
|
610
|
+
});
|
|
611
|
+
Object.defineProperty(WasmSpanBufferClass.prototype, 'message_values', {
|
|
612
|
+
get: wasmGetMessageValues,
|
|
613
|
+
enumerable: true,
|
|
614
|
+
configurable: true,
|
|
615
|
+
});
|
|
616
|
+
Object.defineProperty(WasmSpanBufferClass.prototype, 'message_nulls', {
|
|
617
|
+
get: wasmGetMessageNulls,
|
|
618
|
+
enumerable: true,
|
|
619
|
+
configurable: true,
|
|
620
|
+
});
|
|
621
|
+
Object.defineProperty(WasmSpanBufferClass.prototype, '_stats', {
|
|
622
|
+
get: wasmGetStats,
|
|
623
|
+
enumerable: true,
|
|
624
|
+
configurable: true,
|
|
625
|
+
});
|
|
626
|
+
Object.defineProperty(WasmSpanBufferClass.prototype, '_columns', {
|
|
627
|
+
get: wasmGetColumns,
|
|
628
|
+
enumerable: true,
|
|
629
|
+
configurable: true,
|
|
630
|
+
});
|
|
631
|
+
Object.defineProperty(WasmSpanBufferClass.prototype, '_spanStartTime', {
|
|
632
|
+
get: wasmGetSpanStartTime,
|
|
633
|
+
enumerable: true,
|
|
634
|
+
configurable: true,
|
|
635
|
+
});
|
|
636
|
+
Object.defineProperty(WasmSpanBufferClass.prototype, '_lastLoggedTime', {
|
|
637
|
+
get: wasmGetLastLoggedTime,
|
|
638
|
+
enumerable: true,
|
|
639
|
+
configurable: true,
|
|
640
|
+
});
|
|
641
|
+
// Assign compatibility getters for AnySpanBuffer interface
|
|
642
|
+
Object.defineProperty(WasmSpanBufferClass.prototype, '_system', {
|
|
643
|
+
get: wasmGetSystem,
|
|
644
|
+
enumerable: true,
|
|
645
|
+
configurable: true,
|
|
646
|
+
});
|
|
647
|
+
Object.defineProperty(WasmSpanBufferClass.prototype, '_identity', {
|
|
648
|
+
get: wasmGetIdentity,
|
|
649
|
+
enumerable: true,
|
|
650
|
+
configurable: true,
|
|
651
|
+
});
|
|
652
|
+
WasmSpanBufferClass.prototype.message = wasmMessage;
|
|
653
|
+
WasmSpanBufferClass.prototype.free = wasmFree;
|
|
654
|
+
WasmSpanBufferClass.prototype.isColumnAllocated = wasmIsColumnAllocated;
|
|
655
|
+
WasmSpanBufferClass.prototype.getColumnIfAllocated = wasmGetColumnIfAllocated;
|
|
656
|
+
WasmSpanBufferClass.prototype.getNullsIfAllocated = wasmGetNullsIfAllocated;
|
|
657
|
+
WasmSpanBufferClass.prototype.getOrCreateOverflow = wasmGetOrCreateOverflow;
|
|
658
|
+
WasmSpanBufferClass.prototype[Symbol.for('nodejs.util.inspect.custom')] = wasmInspect;
|
|
659
|
+
// Add static schema property
|
|
660
|
+
Object.defineProperty(WasmSpanBufferClass, 'schema', {
|
|
661
|
+
value: schema,
|
|
662
|
+
writable: false,
|
|
663
|
+
enumerable: true,
|
|
664
|
+
configurable: false,
|
|
665
|
+
});
|
|
666
|
+
// Add static stats property (required by SpanContext and arrow-builder's ColumnWriter)
|
|
667
|
+
// This matches the structure in spanBuffer.ts
|
|
668
|
+
// IMPORTANT: stats object itself must be writable so totalWrites++ and spansCreated++ can modify it
|
|
669
|
+
const statsObject = {
|
|
670
|
+
capacity: 64, // Default capacity, will be overridden by allocator
|
|
671
|
+
totalWrites: 0,
|
|
672
|
+
spansCreated: 0,
|
|
673
|
+
};
|
|
674
|
+
Object.defineProperty(WasmSpanBufferClass, 'stats', {
|
|
675
|
+
value: statsObject,
|
|
676
|
+
writable: true,
|
|
677
|
+
enumerable: true,
|
|
678
|
+
configurable: true,
|
|
679
|
+
});
|
|
680
|
+
// Cache the class
|
|
681
|
+
wasmSpanBufferClassCache.set(schema, WasmSpanBufferClass);
|
|
682
|
+
return WasmSpanBufferClass;
|
|
683
|
+
}
|
|
684
|
+
// =============================================================================
|
|
685
|
+
// Factory Functions
|
|
686
|
+
// =============================================================================
|
|
687
|
+
/**
|
|
688
|
+
* Create a WASM SpanBuffer instance.
|
|
689
|
+
*
|
|
690
|
+
* @param schema - LogSchema defining the buffer structure
|
|
691
|
+
* @param opts - Options for buffer creation
|
|
692
|
+
* @param _traceRoot - Trace root context
|
|
693
|
+
* @param _scopeValues - Scope values for this span
|
|
694
|
+
* @param _opMetadata - Op metadata for attribution
|
|
695
|
+
* @param _callsiteMetadata - Callsite metadata for attribution
|
|
696
|
+
* @returns WasmSpanBufferInstance
|
|
697
|
+
*/
|
|
698
|
+
export function createWasmSpanBuffer(schema, opts, _traceRoot, _scopeValues, _opMetadata, _callsiteMetadata) {
|
|
699
|
+
const WasmSpanBufferClass = getWasmSpanBufferClass(schema);
|
|
700
|
+
return new WasmSpanBufferClass({
|
|
701
|
+
...opts,
|
|
702
|
+
logSchema: schema,
|
|
703
|
+
_traceRoot,
|
|
704
|
+
_scopeValues,
|
|
705
|
+
_opMetadata,
|
|
706
|
+
_callsiteMetadata,
|
|
707
|
+
});
|
|
708
|
+
}
|
|
709
|
+
/**
|
|
710
|
+
* Create a child WASM SpanBuffer linked to a parent.
|
|
711
|
+
*
|
|
712
|
+
* For cross-library calls, the child buffer may use a different schema than the parent.
|
|
713
|
+
* Pass the schema option to use a different schema.
|
|
714
|
+
*
|
|
715
|
+
* @param parent - Parent WASM SpanBuffer
|
|
716
|
+
* @param opts - Options for child buffer creation (schema is optional, defaults to parent's)
|
|
717
|
+
* @param _traceRoot - Trace root context
|
|
718
|
+
* @param _scopeValues - Scope values for this span
|
|
719
|
+
* @param _opMetadata - Op metadata for attribution
|
|
720
|
+
* @param _callsiteMetadata - Callsite metadata for attribution
|
|
721
|
+
* @returns WasmSpanBufferInstance linked to parent
|
|
722
|
+
*/
|
|
723
|
+
export function createWasmChildSpanBuffer(parent, opts, _traceRoot, _scopeValues, _opMetadata, _callsiteMetadata) {
|
|
724
|
+
// Use provided schema (for cross-library calls) or parent's schema
|
|
725
|
+
const childSchema = opts.schema ?? parent._logSchema;
|
|
726
|
+
const WasmSpanBufferClass = getWasmSpanBufferClass(childSchema);
|
|
727
|
+
const child = new WasmSpanBufferClass({
|
|
728
|
+
...opts,
|
|
729
|
+
logSchema: childSchema, // Use the child's schema (may differ from parent)
|
|
730
|
+
trace_id: parent.trace_id,
|
|
731
|
+
parent_thread_id: parent.thread_id,
|
|
732
|
+
parent_span_id: parent.span_id,
|
|
733
|
+
_traceRoot,
|
|
734
|
+
_scopeValues,
|
|
735
|
+
_opMetadata,
|
|
736
|
+
_callsiteMetadata,
|
|
737
|
+
});
|
|
738
|
+
// Link to parent (SpanContext will push to parent._children with possible RemappedBufferView wrapper)
|
|
739
|
+
child._parent = parent;
|
|
740
|
+
return child;
|
|
741
|
+
}
|
|
742
|
+
/**
|
|
743
|
+
* Create an overflow WASM SpanBuffer for chaining.
|
|
744
|
+
*
|
|
745
|
+
* @param buffer - The full buffer that needs overflow handling
|
|
746
|
+
* @param _traceRoot - Trace root context
|
|
747
|
+
* @param _scopeValues - Scope values for this span
|
|
748
|
+
* @param _opMetadata - Op metadata for attribution
|
|
749
|
+
* @param _callsiteMetadata - Callsite metadata for attribution
|
|
750
|
+
* @returns WasmSpanBufferInstance linked as overflow
|
|
751
|
+
*/
|
|
752
|
+
export function createWasmOverflowBuffer(buffer, _traceRoot, _scopeValues, _opMetadata, _callsiteMetadata) {
|
|
753
|
+
const WasmSpanBufferClass = getWasmSpanBufferClass(buffer._logSchema);
|
|
754
|
+
const overflow = new WasmSpanBufferClass({
|
|
755
|
+
allocator: buffer._allocator,
|
|
756
|
+
capacity: buffer._capacity,
|
|
757
|
+
trace_id: buffer.trace_id,
|
|
758
|
+
thread_id: buffer.thread_id,
|
|
759
|
+
span_id: buffer.span_id,
|
|
760
|
+
parent_thread_id: buffer.parent_thread_id,
|
|
761
|
+
parent_span_id: buffer.parent_span_id,
|
|
762
|
+
logSchema: buffer._logSchema,
|
|
763
|
+
_traceRoot,
|
|
764
|
+
_scopeValues,
|
|
765
|
+
_opMetadata,
|
|
766
|
+
_callsiteMetadata,
|
|
767
|
+
});
|
|
768
|
+
// Link as overflow (not child - same logical span)
|
|
769
|
+
overflow._parent = buffer._parent;
|
|
770
|
+
buffer._overflow = overflow;
|
|
771
|
+
return overflow;
|
|
772
|
+
}
|