@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,292 @@
|
|
|
1
|
+
import { describe, expect, it } from 'bun:test';
|
|
2
|
+
import { tableFromColumns, tableFromIPC, tableToIPC } from '@uwdata/flechette';
|
|
3
|
+
import { convertToArrowTable } from '../../convertToArrow.js';
|
|
4
|
+
import { DEFAULT_METADATA } from '../../opContext/defineOp.js';
|
|
5
|
+
import { S } from '../../schema/builder.js';
|
|
6
|
+
import { ENTRY_TYPE_SPAN_START } from '../../schema/systemSchema.js';
|
|
7
|
+
import { createSpanBuffer } from '../../spanBuffer.js';
|
|
8
|
+
|
|
9
|
+
import { createTestSchema, createTestTraceRoot, createTraceId } from '../test-helpers.js';
|
|
10
|
+
|
|
11
|
+
function serializeToIpcFile(table: ReturnType<typeof convertToArrowTable>, columnNames: string[]): Uint8Array {
|
|
12
|
+
if (columnNames.length === 0) {
|
|
13
|
+
const ipcBytes = tableToIPC(tableFromColumns({}), { format: 'file' });
|
|
14
|
+
if (!ipcBytes) {
|
|
15
|
+
throw new Error('Failed to serialize empty Arrow table');
|
|
16
|
+
}
|
|
17
|
+
return ipcBytes;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
const ipcColumns: Record<string, NonNullable<ReturnType<typeof table.getChild>>> = {};
|
|
21
|
+
for (const columnName of columnNames) {
|
|
22
|
+
const column = table.getChild(columnName);
|
|
23
|
+
if (!column) {
|
|
24
|
+
throw new Error(`Column not found for IPC file serialization: ${columnName}`);
|
|
25
|
+
}
|
|
26
|
+
ipcColumns[columnName] = column;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
const ipcTable = tableFromColumns(ipcColumns);
|
|
30
|
+
const ipcBytes = tableToIPC(ipcTable, { format: 'file' });
|
|
31
|
+
if (!ipcBytes) {
|
|
32
|
+
throw new Error('Failed to serialize Arrow table');
|
|
33
|
+
}
|
|
34
|
+
return ipcBytes;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
describe('Arrow Binary Format Compliance', () => {
|
|
38
|
+
describe('IPC Message Structure', () => {
|
|
39
|
+
it('should write correct IPC continuation bytes', () => {
|
|
40
|
+
const schema = createTestSchema({
|
|
41
|
+
numberValue: S.number(),
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
const traceId = createTraceId('trace-123');
|
|
45
|
+
const buffer = createSpanBuffer(schema, createTestTraceRoot(traceId), DEFAULT_METADATA, undefined);
|
|
46
|
+
buffer._opMetadata = DEFAULT_METADATA;
|
|
47
|
+
|
|
48
|
+
// Donbuffer._opMetadata = DEFAULT_METADATA;
|
|
49
|
+
|
|
50
|
+
// Writebuffer.timestamp[0] = BigInt(Date.now()) * 1000000n;
|
|
51
|
+
buffer.entry_type[0] = ENTRY_TYPE_SPAN_START;
|
|
52
|
+
buffer.numberValue(0, 42);
|
|
53
|
+
buffer._writeIndex = 1;
|
|
54
|
+
|
|
55
|
+
const table = convertToArrowTable(buffer);
|
|
56
|
+
const ipcBytes = serializeToIpcFile(table, ['numberValue']);
|
|
57
|
+
|
|
58
|
+
// IPC file should start with ARROW1 magic bytes
|
|
59
|
+
const magic = new TextDecoder().decode(ipcBytes.slice(0, 6));
|
|
60
|
+
expect(magic).toBe('ARROW1');
|
|
61
|
+
});
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
describe('Endianness', () => {
|
|
65
|
+
it('should preserve number values through round-trip', () => {
|
|
66
|
+
const schema = createTestSchema({
|
|
67
|
+
uint32Value: S.number(),
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
const traceId = createTraceId('trace-123');
|
|
71
|
+
const buffer = createSpanBuffer(schema, createTestTraceRoot(traceId), DEFAULT_METADATA, undefined);
|
|
72
|
+
buffer._opMetadata = DEFAULT_METADATA;
|
|
73
|
+
|
|
74
|
+
// Write test data using generated methods
|
|
75
|
+
const testValue = 0x12345678;
|
|
76
|
+
buffer.timestamp[0] = BigInt(Date.now()) * 1000000n;
|
|
77
|
+
buffer.entry_type[0] = ENTRY_TYPE_SPAN_START;
|
|
78
|
+
buffer.uint32Value(0, testValue);
|
|
79
|
+
buffer._writeIndex = 1;
|
|
80
|
+
|
|
81
|
+
const table = convertToArrowTable(buffer);
|
|
82
|
+
const ipcBytes = serializeToIpcFile(table, ['uint32Value']);
|
|
83
|
+
|
|
84
|
+
// Round-trip test
|
|
85
|
+
const reader = tableFromIPC(ipcBytes);
|
|
86
|
+
expect(reader.numRows).toBe(1);
|
|
87
|
+
|
|
88
|
+
// Find our data column (skip system columns)
|
|
89
|
+
for (let i = 0; i < reader.schema.fields.length; i++) {
|
|
90
|
+
const field = reader.schema.fields[i];
|
|
91
|
+
if (field.name === 'uint32Value') {
|
|
92
|
+
const col = reader.getChildAt(i);
|
|
93
|
+
if (col) {
|
|
94
|
+
expect(col.get(0)).toBe(testValue);
|
|
95
|
+
}
|
|
96
|
+
break;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
});
|
|
100
|
+
});
|
|
101
|
+
|
|
102
|
+
describe('Null Bitmaps', () => {
|
|
103
|
+
it('should handle null values correctly in round-trip', () => {
|
|
104
|
+
const schema = createTestSchema({
|
|
105
|
+
numberValue: S.number(),
|
|
106
|
+
});
|
|
107
|
+
|
|
108
|
+
const traceId = createTraceId('trace-123');
|
|
109
|
+
const buffer = createSpanBuffer(schema, createTestTraceRoot(traceId), DEFAULT_METADATA, undefined);
|
|
110
|
+
buffer._opMetadata = DEFAULT_METADATA;
|
|
111
|
+
|
|
112
|
+
// Write data with some nulls
|
|
113
|
+
const testData = [1, null, 3, null, 5];
|
|
114
|
+
|
|
115
|
+
for (let i = 0; i < testData.length; i++) {
|
|
116
|
+
const value = testData[i];
|
|
117
|
+
buffer.timestamp[i] = BigInt(Date.now()) * 1000000n;
|
|
118
|
+
buffer.entry_type[i] = ENTRY_TYPE_SPAN_START;
|
|
119
|
+
|
|
120
|
+
if (value === null) {
|
|
121
|
+
// Don't call the method for null values, just leave as default (null)
|
|
122
|
+
} else {
|
|
123
|
+
buffer.numberValue(i, value);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
buffer._writeIndex = testData.length;
|
|
127
|
+
|
|
128
|
+
const table = convertToArrowTable(buffer);
|
|
129
|
+
const ipcBytes = serializeToIpcFile(table, ['numberValue']);
|
|
130
|
+
|
|
131
|
+
// Round-trip test
|
|
132
|
+
const reader = tableFromIPC(ipcBytes);
|
|
133
|
+
expect(reader.numRows).toBe(5);
|
|
134
|
+
|
|
135
|
+
// Find our data column and verify null handling
|
|
136
|
+
for (let i = 0; i < reader.schema.fields.length; i++) {
|
|
137
|
+
const field = reader.schema.fields[i];
|
|
138
|
+
if (field.name === 'numberValue') {
|
|
139
|
+
const col = reader.getChildAt(i);
|
|
140
|
+
if (col) {
|
|
141
|
+
expect(col.get(0)).toBe(1);
|
|
142
|
+
expect(col.get(1)).toBe(null);
|
|
143
|
+
expect(col.get(2)).toBe(3);
|
|
144
|
+
expect(col.get(3)).toBe(null);
|
|
145
|
+
expect(col.get(4)).toBe(5);
|
|
146
|
+
}
|
|
147
|
+
break;
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
});
|
|
151
|
+
});
|
|
152
|
+
|
|
153
|
+
describe('Dictionary Encoding', () => {
|
|
154
|
+
it('should handle enum values correctly in round-trip', () => {
|
|
155
|
+
const schema = createTestSchema({
|
|
156
|
+
enumValue: S.enum(['a', 'b', 'c']),
|
|
157
|
+
});
|
|
158
|
+
|
|
159
|
+
const traceId = createTraceId('trace-123');
|
|
160
|
+
const buffer = createSpanBuffer(schema, createTestTraceRoot(traceId), DEFAULT_METADATA, undefined);
|
|
161
|
+
buffer._opMetadata = DEFAULT_METADATA;
|
|
162
|
+
|
|
163
|
+
// Write test data using generated methods
|
|
164
|
+
// For enums, we pass the index, not the string value
|
|
165
|
+
const testValues = [0, 1, 2, 0]; // a=0, b=1, c=2, includes repeated value
|
|
166
|
+
|
|
167
|
+
for (let i = 0; i < testValues.length; i++) {
|
|
168
|
+
buffer.timestamp[i] = BigInt(Date.now()) * 1000000n;
|
|
169
|
+
buffer.entry_type[i] = ENTRY_TYPE_SPAN_START;
|
|
170
|
+
buffer.enumValue(i, testValues[i]);
|
|
171
|
+
}
|
|
172
|
+
buffer._writeIndex = testValues.length;
|
|
173
|
+
|
|
174
|
+
const table = convertToArrowTable(buffer);
|
|
175
|
+
const enumField = table.schema.fields.find((field) => field.name === 'enumValue');
|
|
176
|
+
expect(enumField).toBeDefined();
|
|
177
|
+
expect(enumField?.type.typeId).toBe(-1);
|
|
178
|
+
|
|
179
|
+
const enumColumn = table.getChild('enumValue');
|
|
180
|
+
if (!enumColumn) {
|
|
181
|
+
throw new Error('enumValue column not found');
|
|
182
|
+
}
|
|
183
|
+
expect(enumColumn.get(0)).toBe('a');
|
|
184
|
+
expect(enumColumn.get(1)).toBe('b');
|
|
185
|
+
expect(enumColumn.get(2)).toBe('c');
|
|
186
|
+
expect(enumColumn.get(3)).toBe('a');
|
|
187
|
+
});
|
|
188
|
+
});
|
|
189
|
+
|
|
190
|
+
describe('Variable Size Binary', () => {
|
|
191
|
+
it('should handle string values correctly in round-trip', () => {
|
|
192
|
+
const schema = createTestSchema({
|
|
193
|
+
textValue: S.text(),
|
|
194
|
+
});
|
|
195
|
+
|
|
196
|
+
const traceId = createTraceId('trace-123');
|
|
197
|
+
const buffer = createSpanBuffer(schema, createTestTraceRoot(traceId), DEFAULT_METADATA, undefined);
|
|
198
|
+
buffer._opMetadata = DEFAULT_METADATA;
|
|
199
|
+
|
|
200
|
+
// Write test data with various string lengths
|
|
201
|
+
const testValues = ['', 'hello', '', 'world!'];
|
|
202
|
+
|
|
203
|
+
for (let i = 0; i < testValues.length; i++) {
|
|
204
|
+
buffer.timestamp[i] = BigInt(Date.now()) * 1000000n;
|
|
205
|
+
buffer.entry_type[i] = ENTRY_TYPE_SPAN_START;
|
|
206
|
+
buffer.textValue(i, testValues[i]);
|
|
207
|
+
}
|
|
208
|
+
buffer._writeIndex = testValues.length;
|
|
209
|
+
|
|
210
|
+
const table = convertToArrowTable(buffer);
|
|
211
|
+
const textField = table.schema.fields.find((field) => field.name === 'textValue');
|
|
212
|
+
expect(textField).toBeDefined();
|
|
213
|
+
expect(textField?.type.typeId).toBe(-1);
|
|
214
|
+
|
|
215
|
+
const textColumn = table.getChild('textValue');
|
|
216
|
+
if (!textColumn) {
|
|
217
|
+
throw new Error('textValue column not found');
|
|
218
|
+
}
|
|
219
|
+
expect(textColumn.get(0)).toBe('');
|
|
220
|
+
expect(textColumn.get(1)).toBe('hello');
|
|
221
|
+
expect(textColumn.get(2)).toBe('');
|
|
222
|
+
expect(textColumn.get(3)).toBe('world!');
|
|
223
|
+
});
|
|
224
|
+
});
|
|
225
|
+
|
|
226
|
+
describe('Edge Cases', () => {
|
|
227
|
+
it('should handle empty buffers correctly', () => {
|
|
228
|
+
const schema = createTestSchema({
|
|
229
|
+
numberValue: S.number(),
|
|
230
|
+
});
|
|
231
|
+
|
|
232
|
+
const traceId = createTraceId('trace-123');
|
|
233
|
+
const buffer = createSpanBuffer(schema, createTestTraceRoot(traceId), DEFAULT_METADATA, undefined);
|
|
234
|
+
buffer._opMetadata = DEFAULT_METADATA;
|
|
235
|
+
|
|
236
|
+
// Don't write any data
|
|
237
|
+
|
|
238
|
+
const table = convertToArrowTable(buffer);
|
|
239
|
+
const ipcBytes = serializeToIpcFile(table, []);
|
|
240
|
+
|
|
241
|
+
// Should still produce valid IPC
|
|
242
|
+
expect(ipcBytes.length).toBeGreaterThan(0);
|
|
243
|
+
|
|
244
|
+
// Should round-trip
|
|
245
|
+
const reader = tableFromIPC(ipcBytes);
|
|
246
|
+
expect(reader.numRows).toBe(0);
|
|
247
|
+
});
|
|
248
|
+
|
|
249
|
+
it('should handle boolean values correctly', () => {
|
|
250
|
+
const schema = createTestSchema({
|
|
251
|
+
boolValue: S.boolean(),
|
|
252
|
+
});
|
|
253
|
+
|
|
254
|
+
const traceId = createTraceId('trace-123');
|
|
255
|
+
const buffer = createSpanBuffer(schema, createTestTraceRoot(traceId), DEFAULT_METADATA, undefined);
|
|
256
|
+
buffer._opMetadata = DEFAULT_METADATA;
|
|
257
|
+
|
|
258
|
+
// Write test data using generated methods
|
|
259
|
+
const testValues = [true, false, true, false, true];
|
|
260
|
+
|
|
261
|
+
for (let i = 0; i < testValues.length; i++) {
|
|
262
|
+
buffer.timestamp[i] = BigInt(Date.now()) * 1000000n;
|
|
263
|
+
buffer.entry_type[i] = ENTRY_TYPE_SPAN_START;
|
|
264
|
+
buffer.boolValue(i, testValues[i]);
|
|
265
|
+
}
|
|
266
|
+
buffer._writeIndex = testValues.length;
|
|
267
|
+
|
|
268
|
+
const table = convertToArrowTable(buffer);
|
|
269
|
+
const ipcBytes = serializeToIpcFile(table, ['boolValue']);
|
|
270
|
+
|
|
271
|
+
// Round-trip test
|
|
272
|
+
const reader = tableFromIPC(ipcBytes);
|
|
273
|
+
expect(reader.numRows).toBe(5);
|
|
274
|
+
|
|
275
|
+
// Find our data column and verify boolean handling
|
|
276
|
+
for (let i = 0; i < reader.schema.fields.length; i++) {
|
|
277
|
+
const field = reader.schema.fields[i];
|
|
278
|
+
if (field.name === 'boolValue') {
|
|
279
|
+
const col = reader.getChildAt(i);
|
|
280
|
+
if (col) {
|
|
281
|
+
expect(col.get(0)).toBe(true);
|
|
282
|
+
expect(col.get(1)).toBe(false);
|
|
283
|
+
expect(col.get(2)).toBe(true);
|
|
284
|
+
expect(col.get(3)).toBe(false);
|
|
285
|
+
expect(col.get(4)).toBe(true);
|
|
286
|
+
}
|
|
287
|
+
break;
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
});
|
|
291
|
+
});
|
|
292
|
+
});
|
|
@@ -0,0 +1,354 @@
|
|
|
1
|
+
import { beforeEach, describe, expect, it } from 'bun:test';
|
|
2
|
+
import { DEFAULT_BUFFER_CAPACITY } from '@smoothbricks/arrow-builder';
|
|
3
|
+
import { DEFAULT_METADATA } from '../../opContext/defineOp.js';
|
|
4
|
+
import { S } from '../../schema/builder.js';
|
|
5
|
+
import type { LogSchema } from '../../schema/LogSchema.js';
|
|
6
|
+
import {
|
|
7
|
+
createChildSpanBuffer,
|
|
8
|
+
createOverflowBuffer,
|
|
9
|
+
createSpanBuffer,
|
|
10
|
+
getSpanBufferClass,
|
|
11
|
+
type SpanBufferConstructor,
|
|
12
|
+
} from '../../spanBuffer.js';
|
|
13
|
+
|
|
14
|
+
import type { SpanBuffer } from '../../types.js';
|
|
15
|
+
import { createBuffer, createTestSchema, createTestTraceRoot, createTraceId } from '../test-helpers.js';
|
|
16
|
+
|
|
17
|
+
describe('Buffer Chaining', () => {
|
|
18
|
+
let schema: LogSchema;
|
|
19
|
+
let SpanBufferClass: SpanBufferConstructor;
|
|
20
|
+
|
|
21
|
+
beforeEach(() => {
|
|
22
|
+
// Use LogSchema directly - createSpanBuffer requires LogSchema, not plain object
|
|
23
|
+
schema = createTestSchema({
|
|
24
|
+
userId: S.category(),
|
|
25
|
+
requestId: S.category(),
|
|
26
|
+
operation: S.enum(['GET', 'POST', 'PUT', 'DELETE']),
|
|
27
|
+
duration: S.number(),
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
SpanBufferClass = getSpanBufferClass(schema);
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
describe('createOverflowBuffer', () => {
|
|
34
|
+
it('should create a chained buffer with same spanId and traceId', () => {
|
|
35
|
+
const buffer = createBuffer(schema);
|
|
36
|
+
const nextBuffer = createOverflowBuffer(buffer);
|
|
37
|
+
|
|
38
|
+
// Should inherit spanId and traceId
|
|
39
|
+
expect(nextBuffer.span_id).toBe(buffer.span_id);
|
|
40
|
+
expect(nextBuffer.trace_id).toBe(buffer.trace_id);
|
|
41
|
+
|
|
42
|
+
// Should be linked via next property
|
|
43
|
+
expect(buffer._overflow).toBe(nextBuffer);
|
|
44
|
+
|
|
45
|
+
// Should have same parent
|
|
46
|
+
expect(nextBuffer._parent).toBe(buffer._parent);
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
it('should create buffer with current capacity from stats', () => {
|
|
50
|
+
const buffer = createBuffer(schema);
|
|
51
|
+
|
|
52
|
+
// Update capacity stats
|
|
53
|
+
SpanBufferClass.stats.capacity = 128;
|
|
54
|
+
|
|
55
|
+
const nextBuffer = createOverflowBuffer(buffer);
|
|
56
|
+
|
|
57
|
+
// Should use updated capacity (rounded to multiple of 8)
|
|
58
|
+
expect(nextBuffer._capacity).toBe(128);
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
it('should create independent writeIndex for chained buffer', () => {
|
|
62
|
+
const buffer = createBuffer(schema);
|
|
63
|
+
|
|
64
|
+
// Write some data to original buffer
|
|
65
|
+
buffer._writeIndex = 50;
|
|
66
|
+
|
|
67
|
+
const nextBuffer = createOverflowBuffer(buffer);
|
|
68
|
+
|
|
69
|
+
// Chained buffer should start at 0
|
|
70
|
+
expect(nextBuffer._writeIndex).toBe(0);
|
|
71
|
+
// Uses currentCapacity from stats (default)
|
|
72
|
+
expect(nextBuffer._capacity).toBe(DEFAULT_BUFFER_CAPACITY);
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
it('should maintain schema structure in chained buffer', () => {
|
|
76
|
+
const buffer = createBuffer(schema);
|
|
77
|
+
const nextBuffer = createOverflowBuffer(buffer);
|
|
78
|
+
|
|
79
|
+
// Should have same attribute columns (use _values suffix to access storage)
|
|
80
|
+
expect(Array.isArray(nextBuffer.userId_values)).toBe(true); // category (raw strings)
|
|
81
|
+
expect(Array.isArray(nextBuffer.requestId_values)).toBe(true); // category (raw strings)
|
|
82
|
+
expect(nextBuffer.operation_values).toBeInstanceOf(Uint8Array);
|
|
83
|
+
expect(nextBuffer.duration_values).toBeInstanceOf(Float64Array);
|
|
84
|
+
|
|
85
|
+
// Should have core columns
|
|
86
|
+
expect(nextBuffer.timestamp).toBeInstanceOf(BigInt64Array);
|
|
87
|
+
expect(nextBuffer.entry_type).toBeInstanceOf(Uint8Array);
|
|
88
|
+
});
|
|
89
|
+
|
|
90
|
+
it('should handle multiple chained buffers', () => {
|
|
91
|
+
const buffer1 = createBuffer(schema);
|
|
92
|
+
const buffer2 = createOverflowBuffer(buffer1);
|
|
93
|
+
const buffer3 = createOverflowBuffer(buffer2);
|
|
94
|
+
|
|
95
|
+
// All should have same spanId and traceId
|
|
96
|
+
expect(buffer2.span_id).toBe(buffer1.span_id);
|
|
97
|
+
expect(buffer3.span_id).toBe(buffer1.span_id);
|
|
98
|
+
expect(buffer2.trace_id).toBe(buffer1.trace_id);
|
|
99
|
+
expect(buffer3.trace_id).toBe(buffer1.trace_id);
|
|
100
|
+
|
|
101
|
+
// Should be properly linked
|
|
102
|
+
expect(buffer1._overflow).toBe(buffer2);
|
|
103
|
+
expect(buffer2._overflow).toBe(buffer3);
|
|
104
|
+
});
|
|
105
|
+
|
|
106
|
+
it('should not affect spansCreated stat (overflow is continuation, not new span)', () => {
|
|
107
|
+
const buffer = createBuffer(schema);
|
|
108
|
+
const initialSpans = SpanBufferClass.stats.spansCreated;
|
|
109
|
+
|
|
110
|
+
createOverflowBuffer(buffer);
|
|
111
|
+
|
|
112
|
+
// Overflow buffers don't increment spansCreated - they're continuations, not new spans
|
|
113
|
+
expect(SpanBufferClass.stats.spansCreated).toBe(initialSpans);
|
|
114
|
+
});
|
|
115
|
+
|
|
116
|
+
it('should handle buffer with parent correctly', () => {
|
|
117
|
+
const parentBuffer = createBuffer(schema);
|
|
118
|
+
|
|
119
|
+
const childBuffer = createChildSpanBuffer(parentBuffer, SpanBufferClass, DEFAULT_METADATA, DEFAULT_METADATA);
|
|
120
|
+
parentBuffer._children.push(childBuffer);
|
|
121
|
+
|
|
122
|
+
const nextChildBuffer = createOverflowBuffer(childBuffer);
|
|
123
|
+
|
|
124
|
+
// Should maintain parent relationship
|
|
125
|
+
expect(nextChildBuffer._parent).toBe(parentBuffer);
|
|
126
|
+
|
|
127
|
+
// Should NOT be added to parent's children (it's a continuation, not a new span)
|
|
128
|
+
expect(parentBuffer._children).toHaveLength(1);
|
|
129
|
+
expect(parentBuffer._children[0]).toBe(childBuffer);
|
|
130
|
+
});
|
|
131
|
+
|
|
132
|
+
it('should create empty children array for chained buffer', () => {
|
|
133
|
+
const buffer = createBuffer(schema);
|
|
134
|
+
|
|
135
|
+
// Add a child to original buffer
|
|
136
|
+
const childBuffer = createChildSpanBuffer(buffer, SpanBufferClass, DEFAULT_METADATA, DEFAULT_METADATA);
|
|
137
|
+
buffer._children.push(childBuffer);
|
|
138
|
+
|
|
139
|
+
const nextBuffer = createOverflowBuffer(buffer);
|
|
140
|
+
|
|
141
|
+
// Chained buffer should have empty children array
|
|
142
|
+
expect(nextBuffer._children).toHaveLength(0);
|
|
143
|
+
});
|
|
144
|
+
});
|
|
145
|
+
|
|
146
|
+
describe('Buffer Chaining Edge Cases', () => {
|
|
147
|
+
it('should handle buffer at exact capacity', () => {
|
|
148
|
+
const buffer = createSpanBuffer(schema, createTestTraceRoot('test-trace'), DEFAULT_METADATA, 10);
|
|
149
|
+
buffer._writeIndex = 10; // At exact capacity
|
|
150
|
+
|
|
151
|
+
const nextBuffer = createOverflowBuffer(buffer);
|
|
152
|
+
|
|
153
|
+
expect(nextBuffer._writeIndex).toBe(0);
|
|
154
|
+
expect(nextBuffer._capacity).toBe(SpanBufferClass.stats.capacity);
|
|
155
|
+
});
|
|
156
|
+
|
|
157
|
+
it('should preserve null bitmaps structure in chained buffer', () => {
|
|
158
|
+
const buffer = createBuffer(schema);
|
|
159
|
+
const nextBuffer = createOverflowBuffer(buffer);
|
|
160
|
+
|
|
161
|
+
// Should have null bitmaps for each attribute (direct properties)
|
|
162
|
+
expect(nextBuffer.userId_nulls).toBeInstanceOf(Uint8Array);
|
|
163
|
+
expect(nextBuffer.requestId_nulls).toBeInstanceOf(Uint8Array);
|
|
164
|
+
expect(nextBuffer.operation_nulls).toBeInstanceOf(Uint8Array);
|
|
165
|
+
expect(nextBuffer.duration_nulls).toBeInstanceOf(Uint8Array);
|
|
166
|
+
});
|
|
167
|
+
|
|
168
|
+
it('should handle capacity changes between chained buffers', () => {
|
|
169
|
+
const buffer1 = createBuffer(schema);
|
|
170
|
+
expect(buffer1._capacity).toBe(DEFAULT_BUFFER_CAPACITY);
|
|
171
|
+
|
|
172
|
+
// Simulate capacity tuning - double it
|
|
173
|
+
SpanBufferClass.stats.capacity = DEFAULT_BUFFER_CAPACITY * 2;
|
|
174
|
+
|
|
175
|
+
const buffer2 = createOverflowBuffer(buffer1);
|
|
176
|
+
expect(buffer2._capacity).toBe(DEFAULT_BUFFER_CAPACITY * 2);
|
|
177
|
+
|
|
178
|
+
// Change capacity again - double again
|
|
179
|
+
SpanBufferClass.stats.capacity = DEFAULT_BUFFER_CAPACITY * 4;
|
|
180
|
+
|
|
181
|
+
const buffer3 = createOverflowBuffer(buffer2);
|
|
182
|
+
expect(buffer3._capacity).toBe(DEFAULT_BUFFER_CAPACITY * 4);
|
|
183
|
+
});
|
|
184
|
+
});
|
|
185
|
+
|
|
186
|
+
describe('Enhanced Buffer Chaining Tests', () => {
|
|
187
|
+
it('should preserve data integrity across multiple buffer overflows', () => {
|
|
188
|
+
const traceId = createTraceId('complex-trace');
|
|
189
|
+
const rootBuffer = createSpanBuffer(schema, createTestTraceRoot(traceId), DEFAULT_METADATA, 4); // Small capacity
|
|
190
|
+
|
|
191
|
+
// Write entries that will cause multiple overflows
|
|
192
|
+
const testEntries = Array.from({ length: 10 }, (_, i) => ({
|
|
193
|
+
userId: `user-${i % 3}`,
|
|
194
|
+
requestId: `req-${i % 2}`,
|
|
195
|
+
operation: (['GET', 'POST', 'PUT', 'DELETE'] as const)[i % 4],
|
|
196
|
+
duration: i * 1.5,
|
|
197
|
+
}));
|
|
198
|
+
|
|
199
|
+
const operationEnumValues = ['GET', 'POST', 'PUT', 'DELETE'] as const;
|
|
200
|
+
let currentBuffer = rootBuffer;
|
|
201
|
+
for (let i = 0; i < testEntries.length; i++) {
|
|
202
|
+
if (currentBuffer._writeIndex >= currentBuffer._capacity) {
|
|
203
|
+
currentBuffer = createOverflowBuffer(currentBuffer);
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
const pos = currentBuffer._writeIndex;
|
|
207
|
+
const entry = testEntries[i];
|
|
208
|
+
|
|
209
|
+
currentBuffer.userId(pos, entry.userId);
|
|
210
|
+
currentBuffer.requestId(pos, entry.requestId);
|
|
211
|
+
// Enum setter expects index, not string
|
|
212
|
+
currentBuffer.operation(pos, operationEnumValues.indexOf(entry.operation));
|
|
213
|
+
currentBuffer.duration(pos, entry.duration);
|
|
214
|
+
currentBuffer.timestamp[pos] = BigInt(Date.now() + i * 1000);
|
|
215
|
+
currentBuffer._writeIndex++;
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
// Verify all data is preserved across the chain
|
|
219
|
+
let verificationBuffer: SpanBuffer<typeof schema> | undefined = rootBuffer;
|
|
220
|
+
let verifiedCount = 0;
|
|
221
|
+
|
|
222
|
+
while (verificationBuffer && verifiedCount < testEntries.length) {
|
|
223
|
+
for (let i = 0; i < verificationBuffer._writeIndex && verifiedCount < testEntries.length; i++) {
|
|
224
|
+
const expected = testEntries[verifiedCount];
|
|
225
|
+
|
|
226
|
+
expect(verificationBuffer.userId_values[i]).toBe(expected.userId);
|
|
227
|
+
expect(verificationBuffer.requestId_values[i]).toBe(expected.requestId);
|
|
228
|
+
expect(verificationBuffer.operation_values[i]).toBe(
|
|
229
|
+
['GET', 'POST', 'PUT', 'DELETE'].indexOf(expected.operation),
|
|
230
|
+
);
|
|
231
|
+
expect(verificationBuffer.duration_values[i]).toBe(expected.duration);
|
|
232
|
+
|
|
233
|
+
verifiedCount++;
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
verificationBuffer = verificationBuffer._overflow as SpanBuffer<typeof schema> | undefined;
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
expect(verifiedCount).toBe(testEntries.length);
|
|
240
|
+
});
|
|
241
|
+
|
|
242
|
+
it('should maintain buffer topology with mixed relationships', () => {
|
|
243
|
+
const traceId = createTraceId('topology-test');
|
|
244
|
+
const rootBuffer = createSpanBuffer(schema, createTestTraceRoot(traceId), DEFAULT_METADATA, undefined);
|
|
245
|
+
|
|
246
|
+
// Create first chained buffer with children
|
|
247
|
+
const buffer1 = createOverflowBuffer(rootBuffer);
|
|
248
|
+
const child1 = createChildSpanBuffer(buffer1, SpanBufferClass, DEFAULT_METADATA, DEFAULT_METADATA);
|
|
249
|
+
const child2 = createChildSpanBuffer(buffer1, SpanBufferClass, DEFAULT_METADATA, DEFAULT_METADATA);
|
|
250
|
+
buffer1._children.push(child1, child2);
|
|
251
|
+
|
|
252
|
+
// Create second chained buffer with children
|
|
253
|
+
const buffer2 = createOverflowBuffer(buffer1);
|
|
254
|
+
const child3 = createChildSpanBuffer(buffer2, SpanBufferClass, DEFAULT_METADATA, DEFAULT_METADATA);
|
|
255
|
+
buffer2._children.push(child3);
|
|
256
|
+
|
|
257
|
+
// Verify topology
|
|
258
|
+
// Overflow buffers inherit the logical parent (rootBuffer has no parent → undefined)
|
|
259
|
+
expect(rootBuffer._parent).toBeUndefined();
|
|
260
|
+
expect(rootBuffer._overflow).toBe(buffer1);
|
|
261
|
+
expect(rootBuffer._children).toHaveLength(0);
|
|
262
|
+
|
|
263
|
+
// buffer1 is an OVERFLOW of rootBuffer, so it inherits rootBuffer._parent (undefined)
|
|
264
|
+
expect(buffer1._parent).toBeUndefined();
|
|
265
|
+
expect(buffer1._overflow).toBe(buffer2);
|
|
266
|
+
expect(buffer1._children).toHaveLength(2);
|
|
267
|
+
expect(buffer1._children[0]).toBe(child1);
|
|
268
|
+
expect(buffer1._children[1]).toBe(child2);
|
|
269
|
+
|
|
270
|
+
// buffer2 is an OVERFLOW of buffer1, so it inherits buffer1._parent (undefined)
|
|
271
|
+
expect(buffer2._parent).toBeUndefined();
|
|
272
|
+
expect(buffer2._overflow).toBeUndefined();
|
|
273
|
+
expect(buffer2._children).toHaveLength(1);
|
|
274
|
+
expect(buffer2._children[0]).toBe(child3);
|
|
275
|
+
|
|
276
|
+
// Verify identity sharing
|
|
277
|
+
expect(rootBuffer.trace_id).toBe(traceId);
|
|
278
|
+
expect(buffer1.trace_id).toBe(traceId);
|
|
279
|
+
expect(buffer2.trace_id).toBe(traceId);
|
|
280
|
+
expect(child1.trace_id).toBe(traceId);
|
|
281
|
+
expect(child2.trace_id).toBe(traceId);
|
|
282
|
+
expect(child3.trace_id).toBe(traceId);
|
|
283
|
+
|
|
284
|
+
expect(rootBuffer.span_id).toBe(buffer1.span_id);
|
|
285
|
+
expect(buffer1.span_id).toBe(buffer2.span_id);
|
|
286
|
+
expect(child1.span_id).not.toBe(buffer1.span_id);
|
|
287
|
+
expect(child2.span_id).not.toBe(buffer1.span_id);
|
|
288
|
+
expect(child3.span_id).not.toBe(buffer2.span_id);
|
|
289
|
+
|
|
290
|
+
// Verify child relationships
|
|
291
|
+
expect(child1._parent).toBe(buffer1);
|
|
292
|
+
expect(child2._parent).toBe(buffer1);
|
|
293
|
+
expect(child3._parent).toBe(buffer2);
|
|
294
|
+
expect(child1._overflow).toBeUndefined();
|
|
295
|
+
expect(child2._overflow).toBeUndefined();
|
|
296
|
+
expect(child3._overflow).toBeUndefined();
|
|
297
|
+
});
|
|
298
|
+
|
|
299
|
+
it('should create overflow chain for many entries', () => {
|
|
300
|
+
// Use minimum capacity (8) to force overflow with fewer entries
|
|
301
|
+
const rootBuffer = createSpanBuffer(schema, createTestTraceRoot('test-trace'), DEFAULT_METADATA, 8);
|
|
302
|
+
|
|
303
|
+
// Write 20 entries to force multiple overflows
|
|
304
|
+
let currentBuffer = rootBuffer;
|
|
305
|
+
for (let i = 0; i < 20; i++) {
|
|
306
|
+
if (currentBuffer._writeIndex >= currentBuffer._capacity) {
|
|
307
|
+
currentBuffer = createOverflowBuffer(currentBuffer);
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
const pos = currentBuffer._writeIndex;
|
|
311
|
+
currentBuffer.userId(pos, `user-${i}`);
|
|
312
|
+
currentBuffer.operation(pos, 0); // GET
|
|
313
|
+
currentBuffer.duration(pos, 1.0);
|
|
314
|
+
currentBuffer._writeIndex++;
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
// Count actual buffers created
|
|
318
|
+
let bufferCount = 0;
|
|
319
|
+
let countBuffer: SpanBuffer<typeof schema> | undefined = rootBuffer;
|
|
320
|
+
while (countBuffer) {
|
|
321
|
+
bufferCount++;
|
|
322
|
+
countBuffer = countBuffer._overflow as SpanBuffer<typeof schema> | undefined;
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
// With capacity 8 and 20 entries, we need ceil(20/8) = 3 buffers
|
|
326
|
+
expect(bufferCount).toBe(3);
|
|
327
|
+
});
|
|
328
|
+
|
|
329
|
+
it('should preserve schema consistency across chain boundaries', () => {
|
|
330
|
+
const rootBuffer = createBuffer(schema);
|
|
331
|
+
const buffer1 = createOverflowBuffer(rootBuffer);
|
|
332
|
+
const buffer2 = createOverflowBuffer(buffer1);
|
|
333
|
+
const buffer3 = createOverflowBuffer(buffer2);
|
|
334
|
+
|
|
335
|
+
const buffers = [rootBuffer, buffer1, buffer2, buffer3];
|
|
336
|
+
|
|
337
|
+
// All buffers should have identical schema structure
|
|
338
|
+
for (const buf of buffers) {
|
|
339
|
+
expect(Array.isArray(buf.userId_values)).toBe(true);
|
|
340
|
+
expect(Array.isArray(buf.requestId_values)).toBe(true);
|
|
341
|
+
expect(buf.operation_values).toBeInstanceOf(Uint8Array);
|
|
342
|
+
expect(buf.duration_values).toBeInstanceOf(Float64Array);
|
|
343
|
+
|
|
344
|
+
expect(buf.userId_nulls).toBeInstanceOf(Uint8Array);
|
|
345
|
+
expect(buf.requestId_nulls).toBeInstanceOf(Uint8Array);
|
|
346
|
+
expect(buf.operation_nulls).toBeInstanceOf(Uint8Array);
|
|
347
|
+
expect(buf.duration_nulls).toBeInstanceOf(Uint8Array);
|
|
348
|
+
|
|
349
|
+
expect(buf.timestamp).toBeInstanceOf(BigInt64Array);
|
|
350
|
+
expect(buf.entry_type).toBeInstanceOf(Uint8Array);
|
|
351
|
+
}
|
|
352
|
+
});
|
|
353
|
+
});
|
|
354
|
+
});
|