@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,388 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Background flush scheduler with adaptive flushing
|
|
3
|
+
*
|
|
4
|
+
* Per specs/lmao/01b2_buffer_self_tuning.md:
|
|
5
|
+
* - Adaptive flush intervals based on capacity, time, memory pressure
|
|
6
|
+
* - Idle detection for opportunistic flushing
|
|
7
|
+
* - Background processing (cold path)
|
|
8
|
+
*/
|
|
9
|
+
import { Column, tableFromColumns } from '@uwdata/flechette';
|
|
10
|
+
import { convertSpanTreeToArrowTable } from './convertToArrow.js';
|
|
11
|
+
/**
|
|
12
|
+
* Number of flushes before logging capacity stats.
|
|
13
|
+
* Capacity stats are logged periodically to avoid overhead on every flush.
|
|
14
|
+
*/
|
|
15
|
+
const CAPACITY_STATS_FLUSH_INTERVAL = 100;
|
|
16
|
+
function isSpanBufferConstructor(value) {
|
|
17
|
+
return typeof value === 'function' && typeof Reflect.get(value, 'stats') === 'object';
|
|
18
|
+
}
|
|
19
|
+
function isNodeTimer(value) {
|
|
20
|
+
return typeof value === 'object' && value !== null && typeof Reflect.get(value, 'hasRef') === 'function';
|
|
21
|
+
}
|
|
22
|
+
function mergeTables(first, rest) {
|
|
23
|
+
if (rest.length === 0)
|
|
24
|
+
return first;
|
|
25
|
+
const names = first.names;
|
|
26
|
+
const merged = names.map((name, index) => {
|
|
27
|
+
const batches = [...(first.getChildAt(index)?.data ?? [])];
|
|
28
|
+
for (const table of rest) {
|
|
29
|
+
const col = table.getChild(name);
|
|
30
|
+
if (!col)
|
|
31
|
+
continue;
|
|
32
|
+
batches.push(...col.data);
|
|
33
|
+
}
|
|
34
|
+
return [name, new Column(batches)];
|
|
35
|
+
});
|
|
36
|
+
return tableFromColumns(merged);
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Background flush scheduler
|
|
40
|
+
* Manages automatic flushing of span buffers to Arrow tables
|
|
41
|
+
*/
|
|
42
|
+
export class FlushScheduler {
|
|
43
|
+
config;
|
|
44
|
+
handler;
|
|
45
|
+
buffers = new Set();
|
|
46
|
+
lastFlushTime = Date.now();
|
|
47
|
+
lastActivityTime = Date.now();
|
|
48
|
+
flushTimer;
|
|
49
|
+
idleTimer;
|
|
50
|
+
memoryTimer;
|
|
51
|
+
isRunning = false;
|
|
52
|
+
/** Flush counter for periodic capacity stats logging */
|
|
53
|
+
_flushCount = 0;
|
|
54
|
+
/**
|
|
55
|
+
* Track unique (SpanBufferConstructor, OpMetadata) pairs that have been flushed since last capacity stats log.
|
|
56
|
+
* We use SpanBufferConstructor as the key (for dedup) and store the OpMetadata for building PreEncodedEntry at conversion time.
|
|
57
|
+
* The constructor has static stats property with the capacity stats we need.
|
|
58
|
+
*/
|
|
59
|
+
_bufferClassesSinceLastStatsLog = new Map();
|
|
60
|
+
constructor(handler, config = {}) {
|
|
61
|
+
this.handler = handler;
|
|
62
|
+
// Apply defaults
|
|
63
|
+
this.config = {
|
|
64
|
+
maxFlushInterval: config.maxFlushInterval ?? 10000,
|
|
65
|
+
minFlushInterval: config.minFlushInterval ?? 1000,
|
|
66
|
+
capacityThreshold: config.capacityThreshold ?? 0.8,
|
|
67
|
+
idleDetection: config.idleDetection ?? true,
|
|
68
|
+
idleTimeout: config.idleTimeout ?? 5000,
|
|
69
|
+
memoryPressureDetection: config.memoryPressureDetection ?? true,
|
|
70
|
+
memoryPressureThreshold: config.memoryPressureThreshold ?? 100 * 1024 * 1024, // 100MB
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Register a buffer for automatic flushing
|
|
75
|
+
*/
|
|
76
|
+
register(buffer) {
|
|
77
|
+
this.buffers.add(buffer);
|
|
78
|
+
this.lastActivityTime = Date.now();
|
|
79
|
+
// Start scheduler if not running
|
|
80
|
+
if (!this.isRunning) {
|
|
81
|
+
this.start();
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Start the flush scheduler
|
|
86
|
+
*/
|
|
87
|
+
start() {
|
|
88
|
+
if (this.isRunning)
|
|
89
|
+
return;
|
|
90
|
+
this.isRunning = true;
|
|
91
|
+
this.lastFlushTime = Date.now();
|
|
92
|
+
this.lastActivityTime = Date.now();
|
|
93
|
+
// Set up periodic flush timer
|
|
94
|
+
this.flushTimer = setInterval(() => {
|
|
95
|
+
this.checkFlushConditions();
|
|
96
|
+
}, 1000); // Check every second
|
|
97
|
+
// Set up idle detection timer
|
|
98
|
+
if (this.config.idleDetection) {
|
|
99
|
+
this.idleTimer = setInterval(() => {
|
|
100
|
+
this.checkIdleFlush();
|
|
101
|
+
}, this.config.idleTimeout);
|
|
102
|
+
}
|
|
103
|
+
// Set up memory pressure timer (Node.js only)
|
|
104
|
+
if (this.config.memoryPressureDetection && typeof process !== 'undefined') {
|
|
105
|
+
this.memoryTimer = setInterval(() => {
|
|
106
|
+
this.checkMemoryPressure();
|
|
107
|
+
}, 2000); // Check every 2 seconds
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Stop the flush scheduler
|
|
112
|
+
*/
|
|
113
|
+
stop() {
|
|
114
|
+
if (!this.isRunning)
|
|
115
|
+
return;
|
|
116
|
+
this.isRunning = false;
|
|
117
|
+
if (this.flushTimer) {
|
|
118
|
+
clearInterval(this.flushTimer);
|
|
119
|
+
this.flushTimer = undefined;
|
|
120
|
+
}
|
|
121
|
+
if (this.idleTimer) {
|
|
122
|
+
clearInterval(this.idleTimer);
|
|
123
|
+
this.idleTimer = undefined;
|
|
124
|
+
}
|
|
125
|
+
if (this.memoryTimer) {
|
|
126
|
+
clearInterval(this.memoryTimer);
|
|
127
|
+
this.memoryTimer = undefined;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Manually trigger a flush
|
|
132
|
+
*/
|
|
133
|
+
async flush() {
|
|
134
|
+
await this.doFlush('manual');
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Check flush conditions and flush if needed
|
|
138
|
+
*/
|
|
139
|
+
checkFlushConditions() {
|
|
140
|
+
const now = Date.now();
|
|
141
|
+
const timeSinceLastFlush = now - this.lastFlushTime;
|
|
142
|
+
// Check max flush interval
|
|
143
|
+
if (timeSinceLastFlush >= this.config.maxFlushInterval) {
|
|
144
|
+
this.doFlush('time').catch(console.error);
|
|
145
|
+
return;
|
|
146
|
+
}
|
|
147
|
+
// Check capacity threshold
|
|
148
|
+
if (this.shouldFlushByCapacity()) {
|
|
149
|
+
this.doFlush('capacity').catch(console.error);
|
|
150
|
+
return;
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Check if should flush based on capacity
|
|
155
|
+
*/
|
|
156
|
+
shouldFlushByCapacity() {
|
|
157
|
+
for (const buffer of this.buffers) {
|
|
158
|
+
const utilizationRatio = buffer._writeIndex / buffer._capacity;
|
|
159
|
+
if (utilizationRatio >= this.config.capacityThreshold) {
|
|
160
|
+
return true;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
return false;
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Check idle state and flush if idle
|
|
167
|
+
*/
|
|
168
|
+
checkIdleFlush() {
|
|
169
|
+
const now = Date.now();
|
|
170
|
+
const timeSinceActivity = now - this.lastActivityTime;
|
|
171
|
+
if (timeSinceActivity >= this.config.idleTimeout) {
|
|
172
|
+
// Only flush if there's data and min interval has passed
|
|
173
|
+
const timeSinceLastFlush = now - this.lastFlushTime;
|
|
174
|
+
if (this.buffers.size > 0 && timeSinceLastFlush >= this.config.minFlushInterval) {
|
|
175
|
+
this.doFlush('idle').catch(console.error);
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* Check memory pressure and flush if needed
|
|
181
|
+
* Node.js only
|
|
182
|
+
*/
|
|
183
|
+
checkMemoryPressure() {
|
|
184
|
+
if (typeof process === 'undefined')
|
|
185
|
+
return;
|
|
186
|
+
try {
|
|
187
|
+
const memUsage = process.memoryUsage();
|
|
188
|
+
const availableMemory = memUsage.heapTotal - memUsage.heapUsed;
|
|
189
|
+
if (availableMemory < this.config.memoryPressureThreshold) {
|
|
190
|
+
this.doFlush('memory').catch(console.error);
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
catch {
|
|
194
|
+
// Ignore errors in memory detection
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* Perform the actual flush operation
|
|
199
|
+
*/
|
|
200
|
+
async doFlush(reason) {
|
|
201
|
+
if (this.buffers.size === 0)
|
|
202
|
+
return;
|
|
203
|
+
const now = Date.now();
|
|
204
|
+
const timeSinceLastFlush = now - this.lastFlushTime;
|
|
205
|
+
// Respect minimum flush interval
|
|
206
|
+
if (reason !== 'manual' && timeSinceLastFlush < this.config.minFlushInterval) {
|
|
207
|
+
return;
|
|
208
|
+
}
|
|
209
|
+
// Collect all buffers to flush
|
|
210
|
+
const buffersToFlush = Array.from(this.buffers);
|
|
211
|
+
// Collect unique (SpanBufferConstructor, OpMetadata) pairs from buffers being flushed
|
|
212
|
+
// Use SpanBufferConstructor as the key to dedup - multiple buffers may share the same class
|
|
213
|
+
// We pick the first OpMetadata we see for each class (they should be consistent)
|
|
214
|
+
const bufferClassesInThisFlush = new Map();
|
|
215
|
+
for (const buffer of buffersToFlush) {
|
|
216
|
+
let currentBuffer = buffer;
|
|
217
|
+
while (currentBuffer) {
|
|
218
|
+
const bufferClass = currentBuffer.constructor;
|
|
219
|
+
if (!isSpanBufferConstructor(bufferClass)) {
|
|
220
|
+
throw new TypeError('Expected span buffer constructor with shared stats metadata');
|
|
221
|
+
}
|
|
222
|
+
// Only add if we haven't seen this buffer class before
|
|
223
|
+
if (!bufferClassesInThisFlush.has(bufferClass)) {
|
|
224
|
+
bufferClassesInThisFlush.set(bufferClass, currentBuffer._opMetadata);
|
|
225
|
+
}
|
|
226
|
+
currentBuffer = currentBuffer._overflow;
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
// Add to tracking map (for periodic capacity stats logging)
|
|
230
|
+
for (const [bufferClass, metadata] of bufferClassesInThisFlush) {
|
|
231
|
+
// Only set if not already present (preserve first metadata seen)
|
|
232
|
+
if (!this._bufferClassesSinceLastStatsLog.has(bufferClass)) {
|
|
233
|
+
this._bufferClassesSinceLastStatsLog.set(bufferClass, metadata);
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
// Increment flush counter
|
|
237
|
+
this._flushCount++;
|
|
238
|
+
// Check if we should log capacity stats
|
|
239
|
+
const shouldLogCapacityStats = this._flushCount >= CAPACITY_STATS_FLUSH_INTERVAL;
|
|
240
|
+
// Convert Map to CapacityStatsEntry[] for the conversion function
|
|
241
|
+
const modulesToLogStatsForConversion = shouldLogCapacityStats
|
|
242
|
+
? Array.from(this._bufferClassesSinceLastStatsLog.entries()).map(([bufferClass, metadata]) => ({
|
|
243
|
+
bufferClass,
|
|
244
|
+
metadata,
|
|
245
|
+
}))
|
|
246
|
+
: undefined;
|
|
247
|
+
// Count total rows and buffers
|
|
248
|
+
let totalRows = 0;
|
|
249
|
+
let totalBuffers = 0;
|
|
250
|
+
for (const buffer of buffersToFlush) {
|
|
251
|
+
// Count rows in buffer chain
|
|
252
|
+
let currentBuffer = buffer;
|
|
253
|
+
while (currentBuffer) {
|
|
254
|
+
totalRows += currentBuffer._writeIndex;
|
|
255
|
+
totalBuffers++;
|
|
256
|
+
currentBuffer = currentBuffer._overflow;
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
if (totalRows === 0 && !shouldLogCapacityStats)
|
|
260
|
+
return;
|
|
261
|
+
// Convert all buffers to Arrow tables and concatenate
|
|
262
|
+
const tables = [];
|
|
263
|
+
for (const buffer of buffersToFlush) {
|
|
264
|
+
try {
|
|
265
|
+
const table = convertSpanTreeToArrowTable(buffer, undefined, modulesToLogStatsForConversion);
|
|
266
|
+
if (table.numRows > 0) {
|
|
267
|
+
tables.push(table);
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
catch (error) {
|
|
271
|
+
console.error('Error converting buffer to Arrow table:', error);
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
// Concatenate all tables
|
|
275
|
+
if (tables.length === 0) {
|
|
276
|
+
// No tables but might have capacity stats - create empty table
|
|
277
|
+
// Capacity stats will be in the first table if any buffer had data
|
|
278
|
+
// If no buffers had data, we still need to handle capacity stats
|
|
279
|
+
// For now, return early - capacity stats will be logged on next flush with data
|
|
280
|
+
if (!shouldLogCapacityStats)
|
|
281
|
+
return;
|
|
282
|
+
// If we should log stats but have no tables, we need to create a table with just capacity stats
|
|
283
|
+
// This is handled by convertSpanTreeToArrowTable returning a table with capacity stats batch
|
|
284
|
+
// But since we have no buffers, we can't call it. So we skip logging stats this time.
|
|
285
|
+
// Stats will be logged when there's actual data to flush.
|
|
286
|
+
return;
|
|
287
|
+
}
|
|
288
|
+
const [firstTable, ...otherTables] = tables;
|
|
289
|
+
const combinedTable = mergeTables(firstTable, otherTables);
|
|
290
|
+
// Call handler
|
|
291
|
+
const metadata = {
|
|
292
|
+
totalRows,
|
|
293
|
+
totalBuffers,
|
|
294
|
+
flushReason: reason,
|
|
295
|
+
timestamp: now,
|
|
296
|
+
};
|
|
297
|
+
try {
|
|
298
|
+
await this.handler(combinedTable, metadata);
|
|
299
|
+
this.lastFlushTime = now;
|
|
300
|
+
// Reset flush counter and module tracking if we logged capacity stats
|
|
301
|
+
if (shouldLogCapacityStats) {
|
|
302
|
+
this._flushCount = 0;
|
|
303
|
+
this._bufferClassesSinceLastStatsLog.clear();
|
|
304
|
+
}
|
|
305
|
+
// Reset buffers after successful flush to avoid duplicate re-processing
|
|
306
|
+
for (const buffer of buffersToFlush) {
|
|
307
|
+
// Reset writeIndex to 0 for the root buffer
|
|
308
|
+
buffer._writeIndex = 0;
|
|
309
|
+
// Clear any linked/chained buffers
|
|
310
|
+
let nextBuffer = buffer._overflow;
|
|
311
|
+
while (nextBuffer) {
|
|
312
|
+
nextBuffer._writeIndex = 0;
|
|
313
|
+
const temp = nextBuffer._overflow;
|
|
314
|
+
nextBuffer._overflow = undefined; // Unlink chained buffer
|
|
315
|
+
nextBuffer = temp;
|
|
316
|
+
}
|
|
317
|
+
buffer._overflow = undefined; // Clear link from root buffer
|
|
318
|
+
// A flushed root buffer is no longer pending; callers must re-register on future writes.
|
|
319
|
+
this.buffers.delete(buffer);
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
catch (error) {
|
|
323
|
+
console.error('Error in flush handler:', error);
|
|
324
|
+
// Do NOT reset buffers on failure to avoid data loss
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
/**
|
|
328
|
+
* Record activity (called when buffers are written to)
|
|
329
|
+
*/
|
|
330
|
+
recordActivity() {
|
|
331
|
+
this.lastActivityTime = Date.now();
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
/**
|
|
335
|
+
* Global flush scheduler instance (optional)
|
|
336
|
+
* Applications can use this or create their own
|
|
337
|
+
*/
|
|
338
|
+
let globalScheduler = null;
|
|
339
|
+
/**
|
|
340
|
+
* Get or create global flush scheduler
|
|
341
|
+
*/
|
|
342
|
+
export function getGlobalFlushScheduler(handler, config) {
|
|
343
|
+
if (!globalScheduler) {
|
|
344
|
+
globalScheduler = new FlushScheduler(handler, config);
|
|
345
|
+
}
|
|
346
|
+
return globalScheduler;
|
|
347
|
+
}
|
|
348
|
+
/**
|
|
349
|
+
* Reset global flush scheduler (for testing)
|
|
350
|
+
*/
|
|
351
|
+
export function resetGlobalFlushScheduler() {
|
|
352
|
+
if (globalScheduler) {
|
|
353
|
+
globalScheduler.stop();
|
|
354
|
+
globalScheduler = null;
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
/**
|
|
358
|
+
* Test utilities for accessing FlushScheduler internals
|
|
359
|
+
* @internal
|
|
360
|
+
*/
|
|
361
|
+
export const FlushSchedulerTestUtils = {
|
|
362
|
+
/**
|
|
363
|
+
* Get the flush timer for a scheduler instance (for testing)
|
|
364
|
+
*/
|
|
365
|
+
getFlushTimer(scheduler) {
|
|
366
|
+
const timer = Reflect.get(scheduler, 'flushTimer');
|
|
367
|
+
return isNodeTimer(timer) ? timer : undefined;
|
|
368
|
+
},
|
|
369
|
+
/**
|
|
370
|
+
* Set the flush timer for a scheduler instance (for testing)
|
|
371
|
+
*/
|
|
372
|
+
setFlushTimer(scheduler, timer) {
|
|
373
|
+
Reflect.set(scheduler, 'flushTimer', timer);
|
|
374
|
+
},
|
|
375
|
+
/**
|
|
376
|
+
* Get the last activity time for a scheduler instance (for testing)
|
|
377
|
+
*/
|
|
378
|
+
getLastActivityTime(scheduler) {
|
|
379
|
+
const time = Reflect.get(scheduler, 'lastActivityTime');
|
|
380
|
+
return typeof time === 'number' ? time : undefined;
|
|
381
|
+
},
|
|
382
|
+
/**
|
|
383
|
+
* Set the last activity time for a scheduler instance (for testing)
|
|
384
|
+
*/
|
|
385
|
+
setLastActivityTime(scheduler, time) {
|
|
386
|
+
Reflect.set(scheduler, 'lastActivityTime', time);
|
|
387
|
+
},
|
|
388
|
+
};
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Library Prefix/Remapping Utilities
|
|
3
|
+
*
|
|
4
|
+
* WHY: Libraries need to write clean, domain-focused code (ctx.tag.status(200))
|
|
5
|
+
* while avoiding naming conflicts when composed with other libraries.
|
|
6
|
+
*
|
|
7
|
+
* HOW: At composition time (cold path), we generate a remapped SpanLogger class
|
|
8
|
+
* that exposes clean method names but writes to prefixed buffer columns.
|
|
9
|
+
*
|
|
10
|
+
* Per specs/lmao/01e_library_integration_pattern.md:
|
|
11
|
+
* - Libraries define clean schemas without prefixes (status, method, url)
|
|
12
|
+
* - Prefixing happens at composition time (http_status, http_method, http_url)
|
|
13
|
+
* - Zero hot path overhead - all remapping done via code generation at module creation
|
|
14
|
+
*
|
|
15
|
+
* WHAT: This module provides:
|
|
16
|
+
* - prefixSchema() - Rename schema fields with prefix
|
|
17
|
+
* - createPrefixMapping() - Build clean→prefixed name mapping
|
|
18
|
+
* - generateRemappedBufferViewClass() - Generate view for Arrow conversion
|
|
19
|
+
* - generateRemappedSpanLoggerClass() - Generate class with clean methods, prefixed writes
|
|
20
|
+
* - createRemappedSpanLoggerClass() - Compile and cache SpanLogger classes
|
|
21
|
+
*/
|
|
22
|
+
import type { SpanLoggerImpl } from './codegen/spanLoggerGenerator.js';
|
|
23
|
+
import { LogSchema } from './schema/types.js';
|
|
24
|
+
import type { AnySpanBuffer } from './types.js';
|
|
25
|
+
type RemappedBufferViewConstructor = new (buffer: AnySpanBuffer) => AnySpanBuffer;
|
|
26
|
+
type RemappedSpanLoggerConstructor<T extends LogSchema = LogSchema> = new (buffer: AnySpanBuffer, createOverflowBuffer: (buffer: AnySpanBuffer) => AnySpanBuffer, initialScopedAttributes?: Record<string, unknown>) => SpanLoggerImpl<T>;
|
|
27
|
+
/**
|
|
28
|
+
* Prefix a tag attribute schema
|
|
29
|
+
* Renames all fields with a prefix to avoid conflicts
|
|
30
|
+
*
|
|
31
|
+
* Example:
|
|
32
|
+
* - Input: { status: S.number(), method: S.enum(['GET', 'POST']) }
|
|
33
|
+
* - Prefix: 'http'
|
|
34
|
+
* - Output: { http_status: S.number(), http_method: S.enum(['GET', 'POST']) }
|
|
35
|
+
*/
|
|
36
|
+
export declare function prefixSchema(schema: LogSchema, prefix: string): LogSchema & Record<string, unknown>;
|
|
37
|
+
/**
|
|
38
|
+
* Prefix mapping: maps clean names to prefixed column names
|
|
39
|
+
*
|
|
40
|
+
* WHY: Library authors write ctx.tag.status() but buffer column is http_status
|
|
41
|
+
* HOW: At module creation time, we build this mapping once (cold path)
|
|
42
|
+
*
|
|
43
|
+
* @example
|
|
44
|
+
* // Input: schema = { status: S.number(), method: S.enum([...]) }, prefix = 'http'
|
|
45
|
+
* // Output: { status: 'http_status', method: 'http_method' }
|
|
46
|
+
*/
|
|
47
|
+
export interface PrefixMapping {
|
|
48
|
+
[cleanName: string]: string;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Create a mapping from clean field names to prefixed column names
|
|
52
|
+
*
|
|
53
|
+
* WHY: This mapping is used by generateRemappedSpanLoggerClass to create methods
|
|
54
|
+
* that write to prefixed columns but expose clean API names.
|
|
55
|
+
*
|
|
56
|
+
* @param schema - Clean schema (LogSchema instance)
|
|
57
|
+
* @param prefix - Prefix to apply (e.g., 'http')
|
|
58
|
+
* @returns Mapping from clean name to prefixed name
|
|
59
|
+
*
|
|
60
|
+
* @example
|
|
61
|
+
* const schema = defineLogSchema({ status: S.number() });
|
|
62
|
+
* const mapping = createPrefixMapping(schema, 'http');
|
|
63
|
+
* // Returns: { status: 'http_status' }
|
|
64
|
+
*/
|
|
65
|
+
export declare function createPrefixMapping<T extends LogSchema>(schema: T, prefix: string): PrefixMapping;
|
|
66
|
+
/**
|
|
67
|
+
* Generate a RemappedBufferView class for library prefix support.
|
|
68
|
+
*
|
|
69
|
+
* WHY: Libraries write to unprefixed columns (status, method) but Arrow conversion
|
|
70
|
+
* iterates using prefixed names from the root schema (http_status, http_method).
|
|
71
|
+
* RemappedBufferView bridges this gap for tree traversal during cold-path Arrow conversion.
|
|
72
|
+
*
|
|
73
|
+
* HOW: Uses new Function() to generate a class at library composition time (cold path).
|
|
74
|
+
* The generated class wraps a SpanBuffer and remaps getColumnIfAllocated/getNullsIfAllocated
|
|
75
|
+
* calls from prefixed names to unprefixed names.
|
|
76
|
+
*
|
|
77
|
+
* WHAT: Returns a class constructor that:
|
|
78
|
+
* - Passes through tree traversal properties (children, next)
|
|
79
|
+
* - Passes through system columns (timestamps, operations, message, etc.)
|
|
80
|
+
* - Passes through identity properties (traceId, spanId, etc.)
|
|
81
|
+
* - Remaps getColumnIfAllocated() and getNullsIfAllocated() from prefixed→unprefixed
|
|
82
|
+
*
|
|
83
|
+
* Per specs/lmao/01e_library_integration_pattern.md:
|
|
84
|
+
* - Hot path: Library writes directly to unprefixed columns (zero overhead)
|
|
85
|
+
* - Cold path: Arrow conversion uses RemappedBufferView to access via prefixed names
|
|
86
|
+
*
|
|
87
|
+
* @param prefixToUnprefixedMapping - Maps prefixed names to unprefixed names
|
|
88
|
+
* e.g., { 'http_status': 'status', 'http_method': 'method' }
|
|
89
|
+
* NOTE: The mapping is prefixed→unprefixed (reverse of createPrefixMapping output)
|
|
90
|
+
*
|
|
91
|
+
* @returns Constructor for RemappedBufferView class
|
|
92
|
+
*
|
|
93
|
+
* @example
|
|
94
|
+
* ```typescript
|
|
95
|
+
* // Create mapping (prefixed → unprefixed)
|
|
96
|
+
* const mapping = { 'http_status': 'status', 'http_method': 'method' };
|
|
97
|
+
* const ViewClass = generateRemappedBufferViewClass(mapping);
|
|
98
|
+
*
|
|
99
|
+
* // Wrap library buffer
|
|
100
|
+
* const view = new ViewClass(libraryBuffer);
|
|
101
|
+
*
|
|
102
|
+
* // Access via prefixed name returns unprefixed column
|
|
103
|
+
* view.getColumnIfAllocated('http_status'); // Returns buffer.getColumnIfAllocated('status')
|
|
104
|
+
* ```
|
|
105
|
+
*/
|
|
106
|
+
export declare function generateRemappedBufferViewClass(prefixToUnprefixedMapping: Record<string, string>): RemappedBufferViewConstructor;
|
|
107
|
+
/**
|
|
108
|
+
* Generate a remapped SpanLogger class for library prefix support
|
|
109
|
+
*
|
|
110
|
+
* WHY: Library authors write clean code (ctx.tag.status(200)) but buffers use prefixed
|
|
111
|
+
* columns (http_status). This function generates a class at module creation time
|
|
112
|
+
* (cold path) that exposes clean method names but writes to prefixed columns.
|
|
113
|
+
*
|
|
114
|
+
* HOW: Uses new Function() to generate optimized JavaScript code. The generated class
|
|
115
|
+
* has methods named after clean schema fields but writes to prefixed buffer columns.
|
|
116
|
+
*
|
|
117
|
+
* WHAT: Returns executable JavaScript code string for a SpanLogger class with:
|
|
118
|
+
* - Clean method names (status, method, url)
|
|
119
|
+
* - Writes to prefixed columns (http_status, http_method, http_url)
|
|
120
|
+
* - Full support for enum/category/text type handling
|
|
121
|
+
* - Method chaining support
|
|
122
|
+
*
|
|
123
|
+
* @param cleanSchema - Original clean schema (without prefix)
|
|
124
|
+
* @param prefixMapping - Mapping from clean names to prefixed names
|
|
125
|
+
* @param className - Name for the generated class
|
|
126
|
+
* @returns Executable JavaScript code string
|
|
127
|
+
*
|
|
128
|
+
* @example
|
|
129
|
+
* const code = generateRemappedSpanLoggerClass(
|
|
130
|
+
* { status: S.number(), method: S.enum(['GET', 'POST']) },
|
|
131
|
+
* { status: 'http_status', method: 'http_method' },
|
|
132
|
+
* 'HttpSpanLogger'
|
|
133
|
+
* );
|
|
134
|
+
* // Generated class has .status() method that writes to http_status
|
|
135
|
+
*/
|
|
136
|
+
export declare function generateRemappedSpanLoggerClass<T extends LogSchema>(cleanSchema: T, prefixMapping: PrefixMapping, className?: string): string;
|
|
137
|
+
/**
|
|
138
|
+
* Create a remapped SpanLogger class constructor from clean schema and prefix mapping
|
|
139
|
+
*
|
|
140
|
+
* WHY: This is the cold-path function called at module creation time. It compiles
|
|
141
|
+
* the generated class code once and caches the constructor.
|
|
142
|
+
*
|
|
143
|
+
* @param cleanSchema - Clean schema (without prefix)
|
|
144
|
+
* @param prefixMapping - Mapping from clean names to prefixed names
|
|
145
|
+
* @returns Constructor for the remapped SpanLogger class
|
|
146
|
+
*/
|
|
147
|
+
export declare function createRemappedSpanLoggerClass<T extends LogSchema>(cleanSchema: T, prefixMapping: PrefixMapping): RemappedSpanLoggerConstructor<T>;
|
|
148
|
+
export {};
|
|
149
|
+
//# sourceMappingURL=library.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"library.d.ts","sourceRoot":"","sources":["../../src/lib/library.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAGH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kCAAkC,CAAC;AASvE,OAAO,EAAE,SAAS,EAAqB,MAAM,mBAAmB,CAAC;AACjE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD,KAAK,6BAA6B,GAAG,KAAK,MAAM,EAAE,aAAa,KAAK,aAAa,CAAC;AAClF,KAAK,6BAA6B,CAAC,CAAC,SAAS,SAAS,GAAG,SAAS,IAAI,KACpE,MAAM,EAAE,aAAa,EACrB,oBAAoB,EAAE,CAAC,MAAM,EAAE,aAAa,KAAK,aAAa,EAC9D,uBAAuB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAC9C,cAAc,CAAC,CAAC,CAAC,CAAC;AAiCvB;;;;;;;;GAQG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAenG;AAED;;;;;;;;;GASG;AACH,MAAM,WAAW,aAAa;IAC5B,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAAC;CAC7B;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,mBAAmB,CAAC,CAAC,SAAS,SAAS,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,MAAM,GAAG,aAAa,CASjG;AAsCD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCG;AACH,wBAAgB,+BAA+B,CAC7C,yBAAyB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAChD,6BAA6B,CA0F/B;AAkHD;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,wBAAgB,+BAA+B,CAAC,CAAC,SAAS,SAAS,EACjE,WAAW,EAAE,CAAC,EACd,aAAa,EAAE,aAAa,EAC5B,SAAS,SAAuB,GAC/B,MAAM,CAkMR;AAED;;;;;;;;;GASG;AACH,wBAAgB,6BAA6B,CAAC,CAAC,SAAS,SAAS,EAC/D,WAAW,EAAE,CAAC,EACd,aAAa,EAAE,aAAa,GAC3B,6BAA6B,CAAC,CAAC,CAAC,CAkBlC"}
|