@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,476 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Integration tests for WASM-backed trace flow.
|
|
3
|
+
*
|
|
4
|
+
* These tests verify the full trace lifecycle works with WASM memory backing:
|
|
5
|
+
* - Span start/end with timestamps
|
|
6
|
+
* - Tag writes to WASM columns
|
|
7
|
+
* - Nested spans with parent/child linkage
|
|
8
|
+
* - Error handling (ctx.err() and exceptions)
|
|
9
|
+
* - Log entries (info/debug/warn/error)
|
|
10
|
+
* - Memory reuse via freelist
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
import { afterEach, beforeAll, describe, expect, it } from 'bun:test';
|
|
14
|
+
import { defineOpContext } from '../../defineOpContext.js';
|
|
15
|
+
import { S } from '../../schema/builder.js';
|
|
16
|
+
import { defineLogSchema } from '../../schema/defineLogSchema.js';
|
|
17
|
+
import {
|
|
18
|
+
ENTRY_TYPE_DEBUG,
|
|
19
|
+
ENTRY_TYPE_ERROR,
|
|
20
|
+
ENTRY_TYPE_INFO,
|
|
21
|
+
ENTRY_TYPE_SPAN_ERR,
|
|
22
|
+
ENTRY_TYPE_SPAN_EXCEPTION,
|
|
23
|
+
ENTRY_TYPE_SPAN_OK,
|
|
24
|
+
ENTRY_TYPE_SPAN_START,
|
|
25
|
+
ENTRY_TYPE_WARN,
|
|
26
|
+
} from '../../schema/systemSchema.js';
|
|
27
|
+
import { TestTracer } from '../../tracers/TestTracer.js';
|
|
28
|
+
import { WasmBufferStrategy } from '../WasmBufferStrategy.js';
|
|
29
|
+
import { createWasmTraceRootFactory } from '../wasmTraceRoot.js';
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Type for accessing WASM-specific internal buffer properties.
|
|
33
|
+
* WASM buffers use different property names than standard SpanBuffer.
|
|
34
|
+
* We cast to this type to access WASM-specific properties in tests.
|
|
35
|
+
*/
|
|
36
|
+
interface WasmBufferInternals {
|
|
37
|
+
// System columns (WASM uses _message array internally)
|
|
38
|
+
_message: string[];
|
|
39
|
+
// Schema columns (WASM uses name_values without underscore prefix)
|
|
40
|
+
userId_values?: string[];
|
|
41
|
+
latency_values?: Float64Array;
|
|
42
|
+
operation_values?: Uint8Array;
|
|
43
|
+
// System schema columns
|
|
44
|
+
exception_stack_values?: string[];
|
|
45
|
+
error_code_values?: string[];
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/** Cast buffer to access WASM-specific internals */
|
|
49
|
+
function asWasm<T>(buffer: T): T & WasmBufferInternals {
|
|
50
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion -- test helper narrows to the generated WASM-only fields asserted below.
|
|
51
|
+
return buffer as T & WasmBufferInternals;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
describe('WASM Integration Tests', () => {
|
|
55
|
+
// Test schema with various field types
|
|
56
|
+
const schema = defineLogSchema({
|
|
57
|
+
userId: S.category(),
|
|
58
|
+
latency: S.number(),
|
|
59
|
+
operation: S.enum(['CREATE', 'READ', 'UPDATE', 'DELETE']),
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
// Define op context - env is optional (undefined by default, not null-sentinel)
|
|
63
|
+
const opContext = defineOpContext({
|
|
64
|
+
logSchema: schema,
|
|
65
|
+
ctx: { env: undefined as { region: string } | undefined },
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
let strategy: WasmBufferStrategy<typeof schema>;
|
|
69
|
+
let tracer: TestTracer<typeof opContext>;
|
|
70
|
+
|
|
71
|
+
beforeAll(async () => {
|
|
72
|
+
strategy = await WasmBufferStrategy.create({
|
|
73
|
+
capacity: 64,
|
|
74
|
+
initialPages: 16,
|
|
75
|
+
maxPages: 16,
|
|
76
|
+
});
|
|
77
|
+
|
|
78
|
+
tracer = new TestTracer(opContext, {
|
|
79
|
+
bufferStrategy: strategy,
|
|
80
|
+
createTraceRoot: createWasmTraceRootFactory(strategy.allocator),
|
|
81
|
+
});
|
|
82
|
+
});
|
|
83
|
+
|
|
84
|
+
afterEach(() => {
|
|
85
|
+
// Release all WASM memory for buffers
|
|
86
|
+
for (const buffer of tracer.rootBuffers) {
|
|
87
|
+
strategy.releaseBuffer(buffer);
|
|
88
|
+
}
|
|
89
|
+
// Clear tracer state
|
|
90
|
+
tracer.clear();
|
|
91
|
+
// Reset allocator for next test
|
|
92
|
+
strategy.reset();
|
|
93
|
+
|
|
94
|
+
// Create fresh tracer for next test
|
|
95
|
+
tracer = new TestTracer(opContext, {
|
|
96
|
+
bufferStrategy: strategy,
|
|
97
|
+
createTraceRoot: createWasmTraceRootFactory(strategy.allocator),
|
|
98
|
+
});
|
|
99
|
+
});
|
|
100
|
+
|
|
101
|
+
describe('Simple trace', () => {
|
|
102
|
+
it('creates a simple trace with WASM backing', async () => {
|
|
103
|
+
await tracer.trace('test-op', async (ctx) => {
|
|
104
|
+
return ctx.ok('done');
|
|
105
|
+
});
|
|
106
|
+
|
|
107
|
+
expect(tracer.rootBuffers).toHaveLength(1);
|
|
108
|
+
const buffer = tracer.rootBuffers[0];
|
|
109
|
+
|
|
110
|
+
// Verify entry types
|
|
111
|
+
expect(buffer.entry_type[0]).toBe(ENTRY_TYPE_SPAN_START);
|
|
112
|
+
expect(buffer.entry_type[1]).toBe(ENTRY_TYPE_SPAN_OK);
|
|
113
|
+
|
|
114
|
+
// Verify timestamps are valid
|
|
115
|
+
expect(buffer.timestamp[0]).toBeGreaterThan(0n);
|
|
116
|
+
expect(buffer.timestamp[1]).toBeGreaterThanOrEqual(buffer.timestamp[0]);
|
|
117
|
+
|
|
118
|
+
// Verify span name is set
|
|
119
|
+
expect(buffer.message_values[0]).toBe('test-op');
|
|
120
|
+
});
|
|
121
|
+
|
|
122
|
+
it('writes trace_id correctly', async () => {
|
|
123
|
+
await tracer.trace('trace-id-test', async (ctx) => {
|
|
124
|
+
return ctx.ok('done');
|
|
125
|
+
});
|
|
126
|
+
|
|
127
|
+
const buffer = tracer.rootBuffers[0];
|
|
128
|
+
// trace_id should be a valid W3C format (32 hex chars)
|
|
129
|
+
expect(buffer.trace_id).toMatch(/^[a-f0-9]{32}$/);
|
|
130
|
+
});
|
|
131
|
+
|
|
132
|
+
it('writes span_id correctly', async () => {
|
|
133
|
+
await tracer.trace('span-id-test', async (ctx) => {
|
|
134
|
+
return ctx.ok('done');
|
|
135
|
+
});
|
|
136
|
+
|
|
137
|
+
const buffer = tracer.rootBuffers[0];
|
|
138
|
+
// span_id should be a positive number
|
|
139
|
+
expect(buffer.span_id).toBeGreaterThan(0);
|
|
140
|
+
});
|
|
141
|
+
});
|
|
142
|
+
|
|
143
|
+
describe('Tags', () => {
|
|
144
|
+
it('writes tags to WASM columns', async () => {
|
|
145
|
+
await tracer.trace('tag-test', async (ctx) => {
|
|
146
|
+
ctx.tag.userId('user-123');
|
|
147
|
+
ctx.tag.latency(42.5);
|
|
148
|
+
ctx.tag.operation('READ');
|
|
149
|
+
return ctx.ok('done');
|
|
150
|
+
});
|
|
151
|
+
|
|
152
|
+
const buffer = asWasm(tracer.rootBuffers[0]);
|
|
153
|
+
|
|
154
|
+
// Verify tag values were written (row 0 is span-start)
|
|
155
|
+
// Note: Tags write to row 0 by default for initial span attributes
|
|
156
|
+
expect(buffer.userId_values?.[0]).toBe('user-123');
|
|
157
|
+
expect(buffer.latency_values?.[0]).toBe(42.5);
|
|
158
|
+
// Enum values are stored as uint8 indices
|
|
159
|
+
expect(buffer.operation_values?.[0]).toBe(1); // 'READ' is index 1 in ['CREATE', 'READ', 'UPDATE', 'DELETE']
|
|
160
|
+
});
|
|
161
|
+
|
|
162
|
+
it('chains multiple tags fluently', async () => {
|
|
163
|
+
await tracer.trace('chain-test', async (ctx) => {
|
|
164
|
+
ctx.tag.userId('user-456').latency(100.25).operation('CREATE');
|
|
165
|
+
return ctx.ok('done');
|
|
166
|
+
});
|
|
167
|
+
|
|
168
|
+
const buffer = asWasm(tracer.rootBuffers[0]);
|
|
169
|
+
expect(buffer.userId_values?.[0]).toBe('user-456');
|
|
170
|
+
expect(buffer.latency_values?.[0]).toBe(100.25);
|
|
171
|
+
expect(buffer.operation_values?.[0]).toBe(0); // 'CREATE' is index 0
|
|
172
|
+
});
|
|
173
|
+
});
|
|
174
|
+
|
|
175
|
+
describe('Nested spans', () => {
|
|
176
|
+
it('creates nested spans with correct linkage', async () => {
|
|
177
|
+
await tracer.trace('parent', async (ctx) => {
|
|
178
|
+
await ctx.span('child', async (childCtx) => {
|
|
179
|
+
return childCtx.ok('child done');
|
|
180
|
+
});
|
|
181
|
+
return ctx.ok('parent done');
|
|
182
|
+
});
|
|
183
|
+
|
|
184
|
+
const parent = tracer.rootBuffers[0];
|
|
185
|
+
expect(parent._children).toHaveLength(1);
|
|
186
|
+
|
|
187
|
+
const child = parent._children[0];
|
|
188
|
+
// Child should share trace_id with parent
|
|
189
|
+
expect(child.trace_id).toBe(parent.trace_id);
|
|
190
|
+
// Child's parent_span_id should be parent's span_id
|
|
191
|
+
expect(child.parent_span_id).toBe(parent.span_id);
|
|
192
|
+
// Child should have its own span_id
|
|
193
|
+
expect(child.span_id).not.toBe(parent.span_id);
|
|
194
|
+
});
|
|
195
|
+
|
|
196
|
+
it('creates deeply nested spans', async () => {
|
|
197
|
+
await tracer.trace('level-0', async (ctx) => {
|
|
198
|
+
await ctx.span('level-1', async (ctx1) => {
|
|
199
|
+
await ctx1.span('level-2', async (ctx2) => {
|
|
200
|
+
return ctx2.ok('deepest');
|
|
201
|
+
});
|
|
202
|
+
return ctx1.ok('middle');
|
|
203
|
+
});
|
|
204
|
+
return ctx.ok('root');
|
|
205
|
+
});
|
|
206
|
+
|
|
207
|
+
const root = tracer.rootBuffers[0];
|
|
208
|
+
expect(root._children).toHaveLength(1);
|
|
209
|
+
|
|
210
|
+
const level1 = root._children[0];
|
|
211
|
+
expect(level1._children).toHaveLength(1);
|
|
212
|
+
expect(level1.parent_span_id).toBe(root.span_id);
|
|
213
|
+
|
|
214
|
+
const level2 = level1._children[0];
|
|
215
|
+
expect(level2.parent_span_id).toBe(level1.span_id);
|
|
216
|
+
expect(level2.trace_id).toBe(root.trace_id);
|
|
217
|
+
});
|
|
218
|
+
|
|
219
|
+
it('creates sibling spans correctly', async () => {
|
|
220
|
+
await tracer.trace('parent', async (ctx) => {
|
|
221
|
+
await ctx.span('child-1', async (c1) => c1.ok('first'));
|
|
222
|
+
await ctx.span('child-2', async (c2) => c2.ok('second'));
|
|
223
|
+
return ctx.ok('done');
|
|
224
|
+
});
|
|
225
|
+
|
|
226
|
+
const parent = tracer.rootBuffers[0];
|
|
227
|
+
expect(parent._children).toHaveLength(2);
|
|
228
|
+
|
|
229
|
+
const [child1, child2] = parent._children;
|
|
230
|
+
expect(child1.message_values[0]).toBe('child-1');
|
|
231
|
+
expect(child2.message_values[0]).toBe('child-2');
|
|
232
|
+
expect(child1.parent_span_id).toBe(parent.span_id);
|
|
233
|
+
expect(child2.parent_span_id).toBe(parent.span_id);
|
|
234
|
+
// Siblings should have different span IDs
|
|
235
|
+
expect(child1.span_id).not.toBe(child2.span_id);
|
|
236
|
+
});
|
|
237
|
+
});
|
|
238
|
+
|
|
239
|
+
describe('Error handling', () => {
|
|
240
|
+
it('handles errors correctly with span-exception', async () => {
|
|
241
|
+
try {
|
|
242
|
+
await tracer.trace('error-op', async (_ctx) => {
|
|
243
|
+
throw new Error('test error');
|
|
244
|
+
});
|
|
245
|
+
} catch (_e) {
|
|
246
|
+
// Expected
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
const buffer = asWasm(tracer.rootBuffers[0]);
|
|
250
|
+
expect(buffer.entry_type[0]).toBe(ENTRY_TYPE_SPAN_START);
|
|
251
|
+
expect(buffer.entry_type[1]).toBe(ENTRY_TYPE_SPAN_EXCEPTION);
|
|
252
|
+
|
|
253
|
+
// Verify error message was written - use message_values getter
|
|
254
|
+
const messageValues = buffer.message_values;
|
|
255
|
+
const messages = messageValues.slice(0, buffer._writeIndex).filter((m: string) => m !== undefined);
|
|
256
|
+
expect(messages).toContain('test error');
|
|
257
|
+
});
|
|
258
|
+
|
|
259
|
+
it('captures exception stack trace', async () => {
|
|
260
|
+
try {
|
|
261
|
+
await tracer.trace('stack-trace-op', async (_ctx) => {
|
|
262
|
+
throw new Error('stack test');
|
|
263
|
+
});
|
|
264
|
+
} catch (_e) {
|
|
265
|
+
// Expected
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
const buffer = asWasm(tracer.rootBuffers[0]);
|
|
269
|
+
// Stack trace should be written
|
|
270
|
+
expect(buffer.exception_stack_values?.[1]).toContain('stack test');
|
|
271
|
+
expect(buffer.exception_stack_values?.[1]).toContain('at'); // Stack trace has 'at' for call frames
|
|
272
|
+
});
|
|
273
|
+
});
|
|
274
|
+
|
|
275
|
+
describe('ctx.err()', () => {
|
|
276
|
+
it('writes span-err for ctx.err()', async () => {
|
|
277
|
+
await tracer.trace('err-op', async (ctx) => {
|
|
278
|
+
return ctx.err('something went wrong');
|
|
279
|
+
});
|
|
280
|
+
|
|
281
|
+
const buffer = tracer.rootBuffers[0];
|
|
282
|
+
expect(buffer.entry_type[0]).toBe(ENTRY_TYPE_SPAN_START);
|
|
283
|
+
expect(buffer.entry_type[1]).toBe(ENTRY_TYPE_SPAN_ERR);
|
|
284
|
+
});
|
|
285
|
+
|
|
286
|
+
it('writes error code for typed errors', async () => {
|
|
287
|
+
await tracer.trace('typed-err-op', async (ctx) => {
|
|
288
|
+
return ctx.err({ code: 'VALIDATION_ERROR', message: 'Invalid input' });
|
|
289
|
+
});
|
|
290
|
+
|
|
291
|
+
const buffer = asWasm(tracer.rootBuffers[0]);
|
|
292
|
+
expect(buffer.entry_type[1]).toBe(ENTRY_TYPE_SPAN_ERR);
|
|
293
|
+
// Error code should be written to error_code column
|
|
294
|
+
expect(buffer.error_code_values?.[1]).toBe('VALIDATION_ERROR');
|
|
295
|
+
});
|
|
296
|
+
});
|
|
297
|
+
|
|
298
|
+
describe('Log entries', () => {
|
|
299
|
+
it('writes log entries with correct entry types', async () => {
|
|
300
|
+
await tracer.trace('log-op', async (ctx) => {
|
|
301
|
+
ctx.log.info('info message');
|
|
302
|
+
ctx.log.debug('debug message');
|
|
303
|
+
ctx.log.warn('warn message');
|
|
304
|
+
return ctx.ok('done');
|
|
305
|
+
});
|
|
306
|
+
|
|
307
|
+
const buffer = asWasm(tracer.rootBuffers[0]);
|
|
308
|
+
// Should have: span-start (0), span-ok (1), log entries (2+)
|
|
309
|
+
// _writeIndex tells us how many rows were written
|
|
310
|
+
expect(buffer._writeIndex).toBeGreaterThan(2);
|
|
311
|
+
|
|
312
|
+
// Row 0 = span-start, Row 1 = span-ok (written at end)
|
|
313
|
+
expect(buffer.entry_type[0]).toBe(ENTRY_TYPE_SPAN_START);
|
|
314
|
+
expect(buffer.entry_type[1]).toBe(ENTRY_TYPE_SPAN_OK);
|
|
315
|
+
|
|
316
|
+
// Log entries are written at indices 2+
|
|
317
|
+
const entryTypes = Array.from(buffer.entry_type.slice(0, buffer._writeIndex));
|
|
318
|
+
|
|
319
|
+
// Use entry type constants from systemSchema
|
|
320
|
+
expect(entryTypes).toContain(ENTRY_TYPE_INFO);
|
|
321
|
+
expect(entryTypes).toContain(ENTRY_TYPE_DEBUG);
|
|
322
|
+
expect(entryTypes).toContain(ENTRY_TYPE_WARN);
|
|
323
|
+
|
|
324
|
+
// Messages are written via message_values getter (SpanLogger uses this)
|
|
325
|
+
// Access via the getter since that's what SpanLogger writes to
|
|
326
|
+
const messageValues = buffer.message_values;
|
|
327
|
+
const messages = messageValues.slice(0, buffer._writeIndex).filter((m: string) => m !== undefined);
|
|
328
|
+
expect(messages).toContain('info message');
|
|
329
|
+
expect(messages).toContain('debug message');
|
|
330
|
+
expect(messages).toContain('warn message');
|
|
331
|
+
});
|
|
332
|
+
|
|
333
|
+
it('writes error log entries', async () => {
|
|
334
|
+
await tracer.trace('error-log-op', async (ctx) => {
|
|
335
|
+
ctx.log.error('error message');
|
|
336
|
+
return ctx.ok('done');
|
|
337
|
+
});
|
|
338
|
+
|
|
339
|
+
const buffer = asWasm(tracer.rootBuffers[0]);
|
|
340
|
+
// Use entry type constant from systemSchema
|
|
341
|
+
const entryTypes = Array.from(buffer.entry_type.slice(0, buffer._writeIndex));
|
|
342
|
+
expect(entryTypes).toContain(ENTRY_TYPE_ERROR);
|
|
343
|
+
});
|
|
344
|
+
});
|
|
345
|
+
|
|
346
|
+
describe('Memory reuse', () => {
|
|
347
|
+
it('tracks allocation stats', async () => {
|
|
348
|
+
const statsBefore = strategy.getStats();
|
|
349
|
+
|
|
350
|
+
await tracer.trace('alloc-test', async (ctx) => ctx.ok('done'));
|
|
351
|
+
|
|
352
|
+
const statsAfter = strategy.getStats();
|
|
353
|
+
// Should have allocated memory for the buffer
|
|
354
|
+
expect(statsAfter.allocCount).toBeGreaterThan(statsBefore.allocCount);
|
|
355
|
+
});
|
|
356
|
+
|
|
357
|
+
it('reuses WASM memory across traces', async () => {
|
|
358
|
+
// Run multiple traces
|
|
359
|
+
for (let i = 0; i < 5; i++) {
|
|
360
|
+
await tracer.trace(`trace-${i}`, async (ctx) => ctx.ok('done'));
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
const statsBeforeClear = strategy.getStats();
|
|
364
|
+
const allocCountBefore = statsBeforeClear.allocCount;
|
|
365
|
+
|
|
366
|
+
// Release all buffers
|
|
367
|
+
for (const buffer of tracer.rootBuffers) {
|
|
368
|
+
strategy.releaseBuffer(buffer);
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
const statsAfterFree = strategy.getStats();
|
|
372
|
+
// Free count should have increased after releasing buffers
|
|
373
|
+
expect(statsAfterFree.freeCount).toBeGreaterThan(0);
|
|
374
|
+
|
|
375
|
+
// Clear tracer (this will reset the allocator)
|
|
376
|
+
tracer.clear();
|
|
377
|
+
|
|
378
|
+
// Run more traces - should reuse freed memory
|
|
379
|
+
for (let i = 0; i < 5; i++) {
|
|
380
|
+
await tracer.trace(`trace-reuse-${i}`, async (ctx) => ctx.ok('done'));
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
const statsAfterReuse = strategy.getStats();
|
|
384
|
+
// Alloc count should not have more than doubled (some memory reused from freelist)
|
|
385
|
+
// Note: Exact reuse depends on freelist implementation and allocation patterns
|
|
386
|
+
expect(statsAfterReuse.allocCount).toBeLessThanOrEqual(allocCountBefore * 2);
|
|
387
|
+
});
|
|
388
|
+
|
|
389
|
+
it('releases entire span tree', async () => {
|
|
390
|
+
// Create a trace with nested spans
|
|
391
|
+
await tracer.trace('parent', async (ctx) => {
|
|
392
|
+
await ctx.span('child-1', async (c1) => {
|
|
393
|
+
await c1.span('grandchild', async (gc) => gc.ok('deep'));
|
|
394
|
+
return c1.ok('c1');
|
|
395
|
+
});
|
|
396
|
+
await ctx.span('child-2', async (c2) => c2.ok('c2'));
|
|
397
|
+
return ctx.ok('parent');
|
|
398
|
+
});
|
|
399
|
+
|
|
400
|
+
const freeCountBefore = strategy.getStats().freeCount;
|
|
401
|
+
|
|
402
|
+
// Release the root buffer (should release entire tree)
|
|
403
|
+
strategy.releaseBuffer(tracer.rootBuffers[0]);
|
|
404
|
+
|
|
405
|
+
const freeCountAfter = strategy.getStats().freeCount;
|
|
406
|
+
// Should have freed memory for all 4 spans (parent + 2 children + 1 grandchild)
|
|
407
|
+
expect(freeCountAfter).toBeGreaterThan(freeCountBefore);
|
|
408
|
+
});
|
|
409
|
+
});
|
|
410
|
+
|
|
411
|
+
describe('Sync vs Async traces', () => {
|
|
412
|
+
it('handles sync functions correctly', async () => {
|
|
413
|
+
// Note: trace() always returns a Promise, but the function can be sync
|
|
414
|
+
const result = await tracer.trace('sync-op', (ctx) => {
|
|
415
|
+
ctx.tag.userId('sync-user');
|
|
416
|
+
return ctx.ok({ sync: true });
|
|
417
|
+
});
|
|
418
|
+
|
|
419
|
+
expect(result.success).toBe(true);
|
|
420
|
+
if (result.success) {
|
|
421
|
+
expect(result.value.sync).toBe(true);
|
|
422
|
+
}
|
|
423
|
+
|
|
424
|
+
const buffer = tracer.rootBuffers[0];
|
|
425
|
+
expect(buffer.entry_type[1]).toBe(ENTRY_TYPE_SPAN_OK);
|
|
426
|
+
});
|
|
427
|
+
|
|
428
|
+
it('handles async functions correctly', async () => {
|
|
429
|
+
const result = await tracer.trace('async-op', async (ctx) => {
|
|
430
|
+
await new Promise((resolve) => setTimeout(resolve, 1));
|
|
431
|
+
ctx.tag.userId('async-user');
|
|
432
|
+
return ctx.ok({ async: true });
|
|
433
|
+
});
|
|
434
|
+
|
|
435
|
+
expect(result.success).toBe(true);
|
|
436
|
+
if (result.success) {
|
|
437
|
+
expect(result.value.async).toBe(true);
|
|
438
|
+
}
|
|
439
|
+
|
|
440
|
+
const buffer = tracer.rootBuffers[0];
|
|
441
|
+
expect(buffer.entry_type[1]).toBe(ENTRY_TYPE_SPAN_OK);
|
|
442
|
+
// Timestamps should reflect the delay
|
|
443
|
+
expect(buffer.timestamp[1]).toBeGreaterThan(buffer.timestamp[0]);
|
|
444
|
+
});
|
|
445
|
+
});
|
|
446
|
+
|
|
447
|
+
describe('Multiple traces', () => {
|
|
448
|
+
it('maintains separate buffers for each trace', async () => {
|
|
449
|
+
await tracer.trace('trace-1', async (ctx) => {
|
|
450
|
+
ctx.tag.userId('user-1');
|
|
451
|
+
return ctx.ok('one');
|
|
452
|
+
});
|
|
453
|
+
|
|
454
|
+
await tracer.trace('trace-2', async (ctx) => {
|
|
455
|
+
ctx.tag.userId('user-2');
|
|
456
|
+
return ctx.ok('two');
|
|
457
|
+
});
|
|
458
|
+
|
|
459
|
+
expect(tracer.rootBuffers).toHaveLength(2);
|
|
460
|
+
|
|
461
|
+
const buffer1 = asWasm(tracer.rootBuffers[0]);
|
|
462
|
+
const buffer2 = asWasm(tracer.rootBuffers[1]);
|
|
463
|
+
|
|
464
|
+
// Different trace IDs
|
|
465
|
+
expect(buffer1.trace_id).not.toBe(buffer2.trace_id);
|
|
466
|
+
|
|
467
|
+
// Different span names
|
|
468
|
+
expect(buffer1.message_values[0]).toBe('trace-1');
|
|
469
|
+
expect(buffer2.message_values[0]).toBe('trace-2');
|
|
470
|
+
|
|
471
|
+
// Different user IDs
|
|
472
|
+
expect(buffer1.userId_values?.[0]).toBe('user-1');
|
|
473
|
+
expect(buffer2.userId_values?.[0]).toBe('user-2');
|
|
474
|
+
});
|
|
475
|
+
});
|
|
476
|
+
});
|