@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,550 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Result types for type-safe error handling without exceptions.
|
|
3
|
+
*
|
|
4
|
+
* ## Classes
|
|
5
|
+
* - `Ok<V, T>` - Success result with fluent tag API
|
|
6
|
+
* - `Err<E, T>` - Error result with fluent tag API
|
|
7
|
+
*
|
|
8
|
+
* ## Error Factories
|
|
9
|
+
* - `defineCodeError(code)` - Create callable error class with `code` on prototype
|
|
10
|
+
*
|
|
11
|
+
* ## Result Row Writer
|
|
12
|
+
*
|
|
13
|
+
* Span start reserves row 1 for the eventual span-end entry, so fluent result
|
|
14
|
+
* methods can write directly to that fixed row instead of capturing deferred
|
|
15
|
+
* closure chains.
|
|
16
|
+
*
|
|
17
|
+
* @example
|
|
18
|
+
* ```typescript
|
|
19
|
+
* // Define error codes as callable classes
|
|
20
|
+
* const NOT_FOUND = defineCodeError('NOT_FOUND')<{ userId: string }>();
|
|
21
|
+
* const VALIDATION_FAILED = defineCodeError('VALIDATION_FAILED')<{ field: string }>();
|
|
22
|
+
*
|
|
23
|
+
* // Use in ops - no 'new' required
|
|
24
|
+
* return ctx.err(NOT_FOUND({ userId }));
|
|
25
|
+
* return ctx.err(VALIDATION_FAILED({ field: 'email' })).message('Invalid email');
|
|
26
|
+
*
|
|
27
|
+
* // instanceof works for type narrowing
|
|
28
|
+
* if (result.isErr(NOT_FOUND)) {
|
|
29
|
+
* console.log(result.error.userId); // typed!
|
|
30
|
+
* }
|
|
31
|
+
* ```
|
|
32
|
+
*/
|
|
33
|
+
|
|
34
|
+
import { createResultWriter, type ResultWriter } from './codegen/fixedPositionWriterGenerator.js';
|
|
35
|
+
import type { InferSchema, LogSchema } from './schema/types.js';
|
|
36
|
+
import type { AnySpanBuffer } from './types.js';
|
|
37
|
+
|
|
38
|
+
// =============================================================================
|
|
39
|
+
// TAGGED ERROR INTERFACE
|
|
40
|
+
// =============================================================================
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Interface for tagged errors that can be discriminated with isErr(Tag).
|
|
44
|
+
* Used by Blocked, RetriesExhausted, and user-defined error classes.
|
|
45
|
+
*/
|
|
46
|
+
export interface TaggedError<Tag extends string = string> {
|
|
47
|
+
readonly _tag: Tag;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* Constructor type for tagged errors.
|
|
52
|
+
* Used with Result.isErr(Tag) to check error type via instanceof.
|
|
53
|
+
*/
|
|
54
|
+
export interface TaggedErrorConstructor<T extends TaggedError = TaggedError> {
|
|
55
|
+
readonly _tag: T['_tag'];
|
|
56
|
+
readonly prototype: T;
|
|
57
|
+
readonly [Symbol.hasInstance]: (value: unknown) => boolean;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
type OkJson<V> = { ok: true; value: V };
|
|
61
|
+
type ErrJson<E> = { ok: false; error: E };
|
|
62
|
+
|
|
63
|
+
type ErrPredicate<E> = (error: E) => boolean;
|
|
64
|
+
type ErrClassMatcher = abstract new (...args: never[]) => unknown;
|
|
65
|
+
type ErrMatcher<E> = TaggedErrorConstructor<TaggedError> | ErrClassMatcher | ErrPredicate<E>;
|
|
66
|
+
|
|
67
|
+
type BoundResultWriter<T extends LogSchema, R, E> = ResultWriter<T, R, E>;
|
|
68
|
+
|
|
69
|
+
function ensureResultWriter<T extends LogSchema, R, E>(
|
|
70
|
+
writer: BoundResultWriter<T, R, E> | undefined,
|
|
71
|
+
schema: T | undefined,
|
|
72
|
+
buffer: AnySpanBuffer | undefined,
|
|
73
|
+
resultOrError: R | E,
|
|
74
|
+
isError: boolean,
|
|
75
|
+
): BoundResultWriter<T, R, E> | undefined {
|
|
76
|
+
if (writer) {
|
|
77
|
+
return writer;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
if (!schema || !buffer) {
|
|
81
|
+
return undefined;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
return createResultWriter<T, R, E>(schema, buffer, resultOrError, isError);
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
function isErrPredicate<E>(value: ErrMatcher<E>): value is ErrPredicate<E> {
|
|
88
|
+
const prototype = Reflect.get(value, 'prototype');
|
|
89
|
+
return prototype === undefined || prototype === Function.prototype;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
function isInstanceofMatcher<E>(value: ErrMatcher<E>): value is TaggedErrorConstructor<TaggedError> | ErrClassMatcher {
|
|
93
|
+
return typeof value === 'function' && !isErrPredicate(value);
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
function createCodeErrorValue<Code extends string, Fields extends object>(
|
|
97
|
+
prototype: object,
|
|
98
|
+
fields: Fields,
|
|
99
|
+
): CodeErrorInstance<Code, Fields> & Fields {
|
|
100
|
+
return Object.assign(Object.create(prototype), fields);
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
// =============================================================================
|
|
104
|
+
// OK CLASS
|
|
105
|
+
// =============================================================================
|
|
106
|
+
|
|
107
|
+
/**
|
|
108
|
+
* Success result with fluent tag application.
|
|
109
|
+
*
|
|
110
|
+
* Created by `ctx.ok(value)`. Tags are captured as closures and applied when
|
|
111
|
+
* span()/trace() completes, ensuring writes go to the correct buffer.
|
|
112
|
+
*
|
|
113
|
+
* @typeParam V - The type of the success value
|
|
114
|
+
* @typeParam T - The log schema for buffer tag application
|
|
115
|
+
*
|
|
116
|
+
* @example
|
|
117
|
+
* ```typescript
|
|
118
|
+
* return ctx.ok(user);
|
|
119
|
+
* return ctx.ok(user).with({ userId: user.id }).message('Created');
|
|
120
|
+
* ```
|
|
121
|
+
*/
|
|
122
|
+
export class Ok<V, T extends LogSchema = LogSchema> {
|
|
123
|
+
readonly value: V;
|
|
124
|
+
|
|
125
|
+
private readonly _schema: T | undefined;
|
|
126
|
+
private readonly _buffer: AnySpanBuffer | undefined;
|
|
127
|
+
private _writer: BoundResultWriter<T, V, never> | undefined;
|
|
128
|
+
|
|
129
|
+
constructor(value: V, schema?: T, buffer?: AnySpanBuffer) {
|
|
130
|
+
this.value = value;
|
|
131
|
+
this._schema = schema;
|
|
132
|
+
this._buffer = buffer;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
private _resultWriter(): BoundResultWriter<T, V, never> | undefined {
|
|
136
|
+
this._writer = ensureResultWriter<T, V, never>(this._writer, this._schema, this._buffer, this.value, false);
|
|
137
|
+
return this._writer;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
/** Discriminant for type narrowing. */
|
|
141
|
+
get success(): true {
|
|
142
|
+
return true;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
/** Tag discriminant for tagged result interop — matches the { _tag: 'ok' } protocol. */
|
|
146
|
+
get _tag(): 'ok' {
|
|
147
|
+
return 'ok';
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
/** Type guard - always returns true for Ok. */
|
|
151
|
+
isOk(): this is Ok<V, T> {
|
|
152
|
+
return true;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
/** Type guard - always returns false for Ok. */
|
|
156
|
+
isErr(): false;
|
|
157
|
+
isErr<Tag extends TaggedError>(_Tag: TaggedErrorConstructor<Tag>): false;
|
|
158
|
+
isErr(_predicate?: unknown): false {
|
|
159
|
+
return false;
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
/** Get the value (always present for Ok). */
|
|
163
|
+
get maybeValue(): V {
|
|
164
|
+
return this.value;
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
/** Get the error (always undefined for Ok). */
|
|
168
|
+
get maybeError(): undefined {
|
|
169
|
+
return undefined;
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
/** Transform the success value. */
|
|
173
|
+
map<U>(fn: (value: V) => U): Ok<U, T> {
|
|
174
|
+
return new Ok<U, T>(fn(this.value), this._schema, this._buffer);
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
/** No-op for Ok (error transformation). */
|
|
178
|
+
mapErr<F>(_fn: (error: never) => F): Ok<V, T> {
|
|
179
|
+
return this;
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
/** Transform the success value, potentially returning an error. */
|
|
183
|
+
flatMap<U, F>(fn: (value: V) => Result<U, F, T>): Result<U, F, T> {
|
|
184
|
+
return fn(this.value);
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
/** Get the value (always returns value for Ok). */
|
|
188
|
+
unwrapOr<U>(_defaultValue: U): V {
|
|
189
|
+
return this.value;
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
/** Get the value (always returns value for Ok). */
|
|
193
|
+
unwrapOrElse<U>(_fn: (error: never) => U): V {
|
|
194
|
+
return this.value;
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
/** Pattern match on the result. */
|
|
198
|
+
match<U>(handlers: { ok: (value: V) => U; err: (error: never) => U }): U {
|
|
199
|
+
return handlers.ok(this.value);
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
/**
|
|
203
|
+
* Set multiple attributes on the span-end entry (row 1).
|
|
204
|
+
* Deferred - applied when span()/trace() completes.
|
|
205
|
+
*
|
|
206
|
+
* @example ctx.ok(result).with({ userId: 'u1', operation: 'CREATE' })
|
|
207
|
+
*/
|
|
208
|
+
with(attributes: Partial<InferSchema<T>>): this {
|
|
209
|
+
this._resultWriter()?.with(attributes);
|
|
210
|
+
return this;
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
/**
|
|
214
|
+
* Set result message on span-end entry (row 1).
|
|
215
|
+
* Overwrites the default span name in the message column.
|
|
216
|
+
*
|
|
217
|
+
* @example ctx.ok(result).message('User created successfully')
|
|
218
|
+
*/
|
|
219
|
+
message(text: string): this {
|
|
220
|
+
this._resultWriter()?.message(text);
|
|
221
|
+
return this;
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
/**
|
|
225
|
+
* Set source code line number on span-end entry (row 1).
|
|
226
|
+
* Typically injected by transformer.
|
|
227
|
+
*
|
|
228
|
+
* @example ctx.ok(result).line(42)
|
|
229
|
+
*/
|
|
230
|
+
line(lineNumber: number): this {
|
|
231
|
+
this._resultWriter()?.line(lineNumber);
|
|
232
|
+
return this;
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
[Symbol.for('nodejs.util.inspect.custom')](): OkJson<V> {
|
|
236
|
+
return { ok: true, value: this.value };
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
toJSON(): OkJson<V> {
|
|
240
|
+
return { ok: true, value: this.value };
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
// =============================================================================
|
|
245
|
+
// ERR CLASS
|
|
246
|
+
// =============================================================================
|
|
247
|
+
|
|
248
|
+
/**
|
|
249
|
+
* Error result with fluent tag application.
|
|
250
|
+
*
|
|
251
|
+
* Created by `ctx.err(error)`. The error is stored directly (flat structure).
|
|
252
|
+
* Supports fluent `.with()`, `.message()`, `.line()` for deferred tag application.
|
|
253
|
+
*
|
|
254
|
+
* @typeParam E - The type of the error
|
|
255
|
+
* @typeParam T - The log schema for buffer tag application
|
|
256
|
+
*
|
|
257
|
+
* @example
|
|
258
|
+
* ```typescript
|
|
259
|
+
* const NOT_FOUND = defineCodeError('NOT_FOUND')<{ userId: string }>();
|
|
260
|
+
* return ctx.err(NOT_FOUND({ userId }));
|
|
261
|
+
* return ctx.err(NOT_FOUND({ userId })).message('User not found');
|
|
262
|
+
*
|
|
263
|
+
* // Tagged errors work too
|
|
264
|
+
* return ctx.err(Blocked.service('payment-api'));
|
|
265
|
+
* ```
|
|
266
|
+
*/
|
|
267
|
+
export class Err<E, T extends LogSchema = LogSchema> {
|
|
268
|
+
readonly error: E;
|
|
269
|
+
|
|
270
|
+
private readonly _schema: T | undefined;
|
|
271
|
+
private readonly _buffer: AnySpanBuffer | undefined;
|
|
272
|
+
private _writer: BoundResultWriter<T, never, E> | undefined;
|
|
273
|
+
|
|
274
|
+
constructor(error: E, schema?: T, buffer?: AnySpanBuffer) {
|
|
275
|
+
this.error = error;
|
|
276
|
+
this._schema = schema;
|
|
277
|
+
this._buffer = buffer;
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
private _resultWriter(): BoundResultWriter<T, never, E> | undefined {
|
|
281
|
+
this._writer = ensureResultWriter<T, never, E>(this._writer, this._schema, this._buffer, this.error, true);
|
|
282
|
+
return this._writer;
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
/** Discriminant for type narrowing. */
|
|
286
|
+
get success(): false {
|
|
287
|
+
return false;
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
/** Tag discriminant for tagged result interop — matches the { _tag: 'err' } protocol. */
|
|
291
|
+
get _tag(): 'err' {
|
|
292
|
+
return 'err';
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
/** Type guard - always returns false for Err. */
|
|
296
|
+
isOk(): false {
|
|
297
|
+
return false;
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
/**
|
|
301
|
+
* Check if this is an error result, optionally matching a tagged type or predicate.
|
|
302
|
+
*
|
|
303
|
+
* @example
|
|
304
|
+
* ```typescript
|
|
305
|
+
* if (result.isErr()) { ... } // Always true for Err
|
|
306
|
+
* if (result.isErr(Blocked)) { ... } // Check instanceof Blocked
|
|
307
|
+
* if (result.isErr(NOT_FOUND)) { ... } // Check instanceof NOT_FOUND
|
|
308
|
+
* if (result.isErr(e => e.code === 'X')) { ... } // Predicate
|
|
309
|
+
* ```
|
|
310
|
+
*/
|
|
311
|
+
isErr(): this is Err<E, T>;
|
|
312
|
+
isErr<Tag extends TaggedError>(Tag: TaggedErrorConstructor<Tag>): this is Err<Tag, T>;
|
|
313
|
+
isErr<C extends abstract new (...args: never[]) => unknown>(Class: C): this is Err<InstanceType<C>, T>;
|
|
314
|
+
isErr(predicate: (error: E) => boolean): boolean;
|
|
315
|
+
isErr<Tag extends TaggedError>(
|
|
316
|
+
tagOrPredicate?: TaggedErrorConstructor<Tag> | ErrClassMatcher | ErrPredicate<E>,
|
|
317
|
+
): boolean {
|
|
318
|
+
if (tagOrPredicate === undefined) return true;
|
|
319
|
+
|
|
320
|
+
// instanceof check for classes (including TaggedError and CodeError)
|
|
321
|
+
if (isErrPredicate(tagOrPredicate)) {
|
|
322
|
+
return tagOrPredicate(this.error);
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
if (isInstanceofMatcher(tagOrPredicate)) {
|
|
326
|
+
return this.error instanceof tagOrPredicate;
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
return false;
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
/** Get the value (always undefined for Err). */
|
|
333
|
+
get maybeValue(): undefined {
|
|
334
|
+
return undefined;
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
/** Get the error (always present for Err). */
|
|
338
|
+
get maybeError(): E {
|
|
339
|
+
return this.error;
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
/** No-op for Err (value transformation). */
|
|
343
|
+
map<U>(_fn: (value: never) => U): Err<E, T> {
|
|
344
|
+
return this;
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
/** Transform the error. */
|
|
348
|
+
mapErr<F>(fn: (error: E) => F): Err<F, T> {
|
|
349
|
+
return new Err<F, T>(fn(this.error), this._schema, this._buffer);
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
/** No-op for Err (returns self). */
|
|
353
|
+
flatMap<U, F>(_fn: (value: never) => Result<U, F>): Err<E, T> {
|
|
354
|
+
return this;
|
|
355
|
+
}
|
|
356
|
+
|
|
357
|
+
/** Get the default value (error is ignored). */
|
|
358
|
+
unwrapOr<U>(defaultValue: U): U {
|
|
359
|
+
return defaultValue;
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
/** Compute a value from the error. */
|
|
363
|
+
unwrapOrElse<U>(fn: (error: E) => U): U {
|
|
364
|
+
return fn(this.error);
|
|
365
|
+
}
|
|
366
|
+
|
|
367
|
+
/** Pattern match on the result. */
|
|
368
|
+
match<U>(handlers: { ok: (value: never) => U; err: (error: E) => U }): U {
|
|
369
|
+
return handlers.err(this.error);
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
/**
|
|
373
|
+
* Set multiple attributes on the span-end entry (row 1).
|
|
374
|
+
* Deferred - applied when span()/trace() completes.
|
|
375
|
+
*
|
|
376
|
+
* @example ctx.err(error).with({ user_id: 'u1' })
|
|
377
|
+
*/
|
|
378
|
+
with(attributes: Partial<InferSchema<T>>): this {
|
|
379
|
+
this._resultWriter()?.with(attributes);
|
|
380
|
+
return this;
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
/**
|
|
384
|
+
* Set result message on span-end entry (row 1).
|
|
385
|
+
* Overwrites the default span name in the message column.
|
|
386
|
+
*
|
|
387
|
+
* @example ctx.err('ERROR', details).message('Operation failed')
|
|
388
|
+
*/
|
|
389
|
+
message(text: string): this {
|
|
390
|
+
this._resultWriter()?.message(text);
|
|
391
|
+
return this;
|
|
392
|
+
}
|
|
393
|
+
|
|
394
|
+
/**
|
|
395
|
+
* Set source code line number on span-end entry (row 1).
|
|
396
|
+
* Typically injected by transformer.
|
|
397
|
+
*
|
|
398
|
+
* @example ctx.err('ERROR', details).line(42)
|
|
399
|
+
*/
|
|
400
|
+
line(lineNumber: number): this {
|
|
401
|
+
this._resultWriter()?.line(lineNumber);
|
|
402
|
+
return this;
|
|
403
|
+
}
|
|
404
|
+
|
|
405
|
+
[Symbol.for('nodejs.util.inspect.custom')](): ErrJson<E> {
|
|
406
|
+
return { ok: false, error: this.error };
|
|
407
|
+
}
|
|
408
|
+
|
|
409
|
+
toJSON(): ErrJson<E> {
|
|
410
|
+
return { ok: false, error: this.error };
|
|
411
|
+
}
|
|
412
|
+
}
|
|
413
|
+
|
|
414
|
+
// =============================================================================
|
|
415
|
+
// RESULT TYPE
|
|
416
|
+
// =============================================================================
|
|
417
|
+
|
|
418
|
+
/** Union type for Result - either Ok or Err. */
|
|
419
|
+
export type Result<V, E, T extends LogSchema = LogSchema> = Ok<V, T> | Err<E, T>;
|
|
420
|
+
|
|
421
|
+
// =============================================================================
|
|
422
|
+
// CODE ERROR FACTORY
|
|
423
|
+
// =============================================================================
|
|
424
|
+
|
|
425
|
+
/**
|
|
426
|
+
* Code error instance type - has `code` on prototype plus fields as own properties.
|
|
427
|
+
*/
|
|
428
|
+
export interface CodeErrorInstance<Code extends string, _Fields extends object> {
|
|
429
|
+
readonly code: Code;
|
|
430
|
+
}
|
|
431
|
+
|
|
432
|
+
/**
|
|
433
|
+
* Callable class type returned by defineCodeError.
|
|
434
|
+
* Can be called without `new`, instanceof works.
|
|
435
|
+
*/
|
|
436
|
+
export interface CodeErrorClass<Code extends string, Fields extends object> {
|
|
437
|
+
(fields: Fields): CodeErrorInstance<Code, Fields> & Fields;
|
|
438
|
+
readonly prototype: { readonly code: Code };
|
|
439
|
+
}
|
|
440
|
+
|
|
441
|
+
/**
|
|
442
|
+
* Create a callable error class with `code` on prototype.
|
|
443
|
+
*
|
|
444
|
+
* The returned class can be called without `new` and supports `instanceof`.
|
|
445
|
+
*
|
|
446
|
+
* @param code - The error code string (becomes a literal type)
|
|
447
|
+
* @returns A curried function that takes type parameter for fields
|
|
448
|
+
*
|
|
449
|
+
* @example
|
|
450
|
+
* ```typescript
|
|
451
|
+
* const NOT_FOUND = defineCodeError('NOT_FOUND')<{ userId: string }>();
|
|
452
|
+
* const VALIDATION_FAILED = defineCodeError('VALIDATION_FAILED')<{ field: string }>();
|
|
453
|
+
*
|
|
454
|
+
* // Call without 'new'
|
|
455
|
+
* const err = NOT_FOUND({ userId: 'u1' });
|
|
456
|
+
* err.code; // 'NOT_FOUND' (from prototype)
|
|
457
|
+
* err.userId; // 'u1' (own property)
|
|
458
|
+
*
|
|
459
|
+
* // instanceof works
|
|
460
|
+
* err instanceof NOT_FOUND; // true
|
|
461
|
+
*
|
|
462
|
+
* // Use with ctx.err()
|
|
463
|
+
* return ctx.err(NOT_FOUND({ userId }));
|
|
464
|
+
*
|
|
465
|
+
* // Type narrowing with isErr()
|
|
466
|
+
* if (result.isErr(NOT_FOUND)) {
|
|
467
|
+
* result.error.userId; // typed!
|
|
468
|
+
* }
|
|
469
|
+
* ```
|
|
470
|
+
*/
|
|
471
|
+
export function defineCodeError<Code extends string>(code: Code) {
|
|
472
|
+
return <Fields extends object = Record<string, never>>(): CodeErrorClass<Code, Fields> => {
|
|
473
|
+
// Constructor function that works with or without 'new'
|
|
474
|
+
const CodeError: CodeErrorClass<Code, Fields> = function (
|
|
475
|
+
this: (CodeErrorInstance<Code, Fields> & Fields) | undefined,
|
|
476
|
+
fields: Fields,
|
|
477
|
+
): CodeErrorInstance<Code, Fields> & Fields {
|
|
478
|
+
// Allow calling without 'new'
|
|
479
|
+
if (!(this instanceof CodeError)) {
|
|
480
|
+
return createCodeErrorValue<Code, Fields>(CodeError.prototype, fields);
|
|
481
|
+
}
|
|
482
|
+
// Assign fields as own properties
|
|
483
|
+
Object.assign(this, fields);
|
|
484
|
+
return this;
|
|
485
|
+
};
|
|
486
|
+
|
|
487
|
+
// Put code on prototype so all instances share it
|
|
488
|
+
Object.defineProperty(CodeError.prototype, 'code', {
|
|
489
|
+
value: code,
|
|
490
|
+
writable: false,
|
|
491
|
+
enumerable: true,
|
|
492
|
+
configurable: false,
|
|
493
|
+
});
|
|
494
|
+
|
|
495
|
+
return CodeError;
|
|
496
|
+
};
|
|
497
|
+
}
|
|
498
|
+
|
|
499
|
+
/**
|
|
500
|
+
* Check if an error has a `code` property.
|
|
501
|
+
* Used by writeSpanEnd to extract error_code for logging.
|
|
502
|
+
*/
|
|
503
|
+
export function hasErrorCode(error: unknown): error is { code: string } {
|
|
504
|
+
return (
|
|
505
|
+
error !== null &&
|
|
506
|
+
typeof error === 'object' &&
|
|
507
|
+
'code' in error &&
|
|
508
|
+
typeof (error as { code: unknown }).code === 'string'
|
|
509
|
+
);
|
|
510
|
+
}
|
|
511
|
+
|
|
512
|
+
// =============================================================================
|
|
513
|
+
// RESULT TYPE EXTRACTION UTILITIES
|
|
514
|
+
// =============================================================================
|
|
515
|
+
|
|
516
|
+
/**
|
|
517
|
+
* Extract success type from a Result type.
|
|
518
|
+
* Returns `never` if R is not a Result.
|
|
519
|
+
*/
|
|
520
|
+
export type ResultSuccess<R> = R extends Result<infer S, unknown, LogSchema> ? S : never;
|
|
521
|
+
|
|
522
|
+
/**
|
|
523
|
+
* Extract success type from a Promise<Result> type.
|
|
524
|
+
* Returns `never` if R is not a Promise<Result>.
|
|
525
|
+
*/
|
|
526
|
+
export type PromiseResultSuccess<R> = R extends Promise<Result<infer S, unknown, LogSchema>> ? S : never;
|
|
527
|
+
|
|
528
|
+
/**
|
|
529
|
+
* Extract success type from either Result or Promise<Result>.
|
|
530
|
+
* Useful for inferring the success type from Op return values.
|
|
531
|
+
*/
|
|
532
|
+
export type ExtractSuccess<R> = ResultSuccess<R> | PromiseResultSuccess<R>;
|
|
533
|
+
|
|
534
|
+
/**
|
|
535
|
+
* Extract error type from a Result type.
|
|
536
|
+
* Returns `never` if R is not a Result.
|
|
537
|
+
*/
|
|
538
|
+
export type ResultError<R> = R extends Result<unknown, infer E, LogSchema> ? E : never;
|
|
539
|
+
|
|
540
|
+
/**
|
|
541
|
+
* Extract error type from a Promise<Result> type.
|
|
542
|
+
* Returns `never` if R is not a Promise<Result>.
|
|
543
|
+
*/
|
|
544
|
+
export type PromiseResultError<R> = R extends Promise<Result<unknown, infer E, LogSchema>> ? E : never;
|
|
545
|
+
|
|
546
|
+
/**
|
|
547
|
+
* Extract error type from either Result or Promise<Result>.
|
|
548
|
+
* Useful for inferring the error type from Op return values.
|
|
549
|
+
*/
|
|
550
|
+
export type ExtractError<R> = ResultError<R> | PromiseResultError<R>;
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LogSchema class for logging-specific schema functionality
|
|
3
|
+
*
|
|
4
|
+
* Extends ColumnSchema from arrow-builder with logging-specific features:
|
|
5
|
+
* - Schema extension with reserved name validation
|
|
6
|
+
* - Integration with lmao's logging system
|
|
7
|
+
*
|
|
8
|
+
* The base ColumnSchema provides generic cached field access.
|
|
9
|
+
* LogSchema adds logging-specific extension capabilities.
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
import { ColumnSchema } from '@smoothbricks/arrow-builder';
|
|
13
|
+
import type { SchemaFields } from './types.js';
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Reserved method names that cannot be used as attribute names
|
|
17
|
+
*
|
|
18
|
+
* These names are reserved to prevent conflicts or confusion:
|
|
19
|
+
* - Technically conflicting: Names that would shadow actual methods/properties
|
|
20
|
+
* on TagWriter, SpanLogger, FluentLogEntry, or result objects
|
|
21
|
+
* - Confusing: Names that would create confusing code patterns even though
|
|
22
|
+
* they don't technically conflict (e.g., ctx.tag.tag() or ctx.scope.scope)
|
|
23
|
+
*/
|
|
24
|
+
const RESERVED_NAMES = new Set([
|
|
25
|
+
// Technically conflicting - methods on TagWriter/FluentLogEntry/result objects
|
|
26
|
+
'with', // Used on TagWriter, FluentLogEntry, Ok, Err
|
|
27
|
+
'message', // Used on Ok, Err
|
|
28
|
+
|
|
29
|
+
// Technically conflicting - log level methods on SpanLogger
|
|
30
|
+
'info', // ctx.log.info()
|
|
31
|
+
'debug', // ctx.log.debug()
|
|
32
|
+
'warn', // ctx.log.warn()
|
|
33
|
+
'error', // ctx.log.error()
|
|
34
|
+
'trace', // ctx.log.trace()
|
|
35
|
+
|
|
36
|
+
// Internal SpanLogger methods (prefixed with _ but included for completeness)
|
|
37
|
+
'_nextRow', // Internal row advancement
|
|
38
|
+
'_buffer', // Internal buffer reference
|
|
39
|
+
'_writeIndex', // Internal write position
|
|
40
|
+
'_getNextBuffer', // Internal buffer chaining
|
|
41
|
+
'_setScope', // Internal scope setter
|
|
42
|
+
'_prefillScopedAttributes', // Internal scope prefill
|
|
43
|
+
|
|
44
|
+
// Internal FF logging methods (called by evaluator, not on public type)
|
|
45
|
+
'ffAccess', // Feature flag access logging
|
|
46
|
+
'ffUsage', // Feature flag usage logging
|
|
47
|
+
|
|
48
|
+
// Confusing - properties on SpanContext (not technically conflicting)
|
|
49
|
+
'tag', // ctx.tag is TagWriter; ctx.tag.tag() would be confusing
|
|
50
|
+
'scope', // ctx.scope is readonly; ctx.scope.scope would be confusing
|
|
51
|
+
|
|
52
|
+
// Confusing - methods on SpanContext (not technically conflicting)
|
|
53
|
+
'ok', // ctx.ok() is method; ctx.tag.ok() or ctx.ok(result).ok() would be confusing
|
|
54
|
+
'err', // ctx.err() is method; ctx.tag.err() or ctx.err(code, details).err() would be confusing
|
|
55
|
+
'span', // ctx.span() is method; ctx.tag.span() would be confusing
|
|
56
|
+
]);
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* LogSchema class - extends ColumnSchema with logging-specific features
|
|
60
|
+
*
|
|
61
|
+
* Provides all the generic schema functionality from ColumnSchema plus
|
|
62
|
+
* logging-specific extension with reserved name validation.
|
|
63
|
+
*
|
|
64
|
+
* @template T - The schema fields type (SchemaFields)
|
|
65
|
+
*/
|
|
66
|
+
export class LogSchema<T extends SchemaFields = SchemaFields> extends ColumnSchema<T> {
|
|
67
|
+
/**
|
|
68
|
+
* Assert that user-provided field names don't conflict with reserved names
|
|
69
|
+
* and don't start with underscore (reserved for system properties)
|
|
70
|
+
*
|
|
71
|
+
* @throws Error if any field name is reserved or starts with _
|
|
72
|
+
*/
|
|
73
|
+
static assertUserFieldNames(fieldNames: readonly string[]): void {
|
|
74
|
+
for (const name of fieldNames) {
|
|
75
|
+
if (name.startsWith('_')) {
|
|
76
|
+
throw new Error(`Field name '${name}' cannot start with '_' - this prefix is reserved for system properties`);
|
|
77
|
+
}
|
|
78
|
+
if (RESERVED_NAMES.has(name)) {
|
|
79
|
+
throw new Error(
|
|
80
|
+
`Attribute name '${name}' is reserved and cannot be used. ` +
|
|
81
|
+
`Reserved names: ${Array.from(RESERVED_NAMES).join(', ')}`,
|
|
82
|
+
);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* Extend this schema with additional fields
|
|
89
|
+
*
|
|
90
|
+
* Creates a new LogSchema instance with merged fields.
|
|
91
|
+
* Validates that extension fields don't conflict with existing fields
|
|
92
|
+
* and don't use reserved names (logging-specific validation).
|
|
93
|
+
*
|
|
94
|
+
* @param extension - Additional schema fields to add
|
|
95
|
+
* @returns New LogSchema instance with merged fields
|
|
96
|
+
* @throws Error if field names conflict or reserved names are used
|
|
97
|
+
*
|
|
98
|
+
* @example
|
|
99
|
+
* ```typescript
|
|
100
|
+
* const base = new LogSchema({ requestId: S.category() });
|
|
101
|
+
* const extended = base.extend({ duration: S.number() });
|
|
102
|
+
* // extended.fields = { requestId: ..., duration: ... }
|
|
103
|
+
* ```
|
|
104
|
+
*/
|
|
105
|
+
extend<U extends SchemaFields>(extension: U): LogSchema<T & U> {
|
|
106
|
+
// Check for field name conflicts
|
|
107
|
+
const extensionKeys = Object.keys(extension);
|
|
108
|
+
for (const key of extensionKeys) {
|
|
109
|
+
if (this._columnNames.includes(key)) {
|
|
110
|
+
throw new Error(
|
|
111
|
+
`Schema conflict: attribute '${key}' already exists in base schema. ` +
|
|
112
|
+
`Base schema has: ${this._columnNames.join(', ')}`,
|
|
113
|
+
);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
// Assert extension doesn't use reserved names (logging-specific)
|
|
118
|
+
LogSchema.assertUserFieldNames(extensionKeys);
|
|
119
|
+
|
|
120
|
+
// Perform shallow merge
|
|
121
|
+
// Create merged via explicit property assignment to preserve property order for V8 hidden class stability
|
|
122
|
+
const merged = Object.create(null);
|
|
123
|
+
for (const key of this._columnNames) {
|
|
124
|
+
// Use prototypeless object for stable prototype, prevents hidden class deopt
|
|
125
|
+
merged[key] = this.fields[key];
|
|
126
|
+
}
|
|
127
|
+
for (const key of extensionKeys) {
|
|
128
|
+
merged[key] = extension[key];
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
// Return new LogSchema instance
|
|
132
|
+
return new LogSchema(merged);
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
/**
|
|
136
|
+
* Check if this is a LogSchema instance
|
|
137
|
+
*
|
|
138
|
+
* Used for type guards and instanceof checks
|
|
139
|
+
*/
|
|
140
|
+
static isLogSchema(value: unknown): value is LogSchema {
|
|
141
|
+
return value instanceof LogSchema;
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
/**
|
|
146
|
+
* Type guard to check if a value is a LogSchema instance
|
|
147
|
+
*
|
|
148
|
+
* @param value - Value to check
|
|
149
|
+
* @returns True if value is a LogSchema instance
|
|
150
|
+
*/
|
|
151
|
+
export function isLogSchema(value: unknown): value is LogSchema {
|
|
152
|
+
return LogSchema.isLogSchema(value);
|
|
153
|
+
}
|