@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,96 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Op-Centric API for LMAO - Main Entry Point
|
|
3
|
+
*
|
|
4
|
+
* This is the factory function that creates the Op-centric API.
|
|
5
|
+
* All types are exported from './opContext/index.js'
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```typescript
|
|
9
|
+
* import { defineOpContext, S, defineLogSchema } from '@smoothbricks/lmao';
|
|
10
|
+
*
|
|
11
|
+
* const { defineOp, defineOps } = defineOpContext({
|
|
12
|
+
* logSchema: defineLogSchema({ userId: S.category() }),
|
|
13
|
+
* ctx: { env: null as Env },
|
|
14
|
+
* });
|
|
15
|
+
*
|
|
16
|
+
* export const myHandler = defineOp('handler', async (ctx, req: Request) => {
|
|
17
|
+
* ctx.tag.userId('user-123');
|
|
18
|
+
* return ctx.ok({ status: 'ok' });
|
|
19
|
+
* });
|
|
20
|
+
* ```
|
|
21
|
+
*/
|
|
22
|
+
import { type DepsConfig, type EffectiveSchema, type FeatureFlagSchema, type OpContextConfig, type OpContextFactory, type ValidateUserContext } from './opContext/index.js';
|
|
23
|
+
import { LogSchema } from './schema/LogSchema.js';
|
|
24
|
+
import type { SchemaFields } from './schema/types.js';
|
|
25
|
+
/**
|
|
26
|
+
* Define an Op context factory
|
|
27
|
+
*
|
|
28
|
+
* Creates a factory for defining Ops that share the same schema, deps, and context.
|
|
29
|
+
* This is the main entry point for the Op-centric API.
|
|
30
|
+
*
|
|
31
|
+
* @param config - Context configuration
|
|
32
|
+
* @returns OpContextFactory with defineOp, defineOps
|
|
33
|
+
*
|
|
34
|
+
* @example
|
|
35
|
+
* ```typescript
|
|
36
|
+
* import { defineOpContext } from '@smoothbricks/lmao';
|
|
37
|
+
*
|
|
38
|
+
* const { defineOp, defineOps } = defineOpContext({
|
|
39
|
+
* logSchema: myLogSchema,
|
|
40
|
+
* deps: {
|
|
41
|
+
* http: httpOps.prefix('http'),
|
|
42
|
+
* auth: authOps.prefix('auth'),
|
|
43
|
+
* },
|
|
44
|
+
* flags: myFeatureFlags,
|
|
45
|
+
* ctx: {
|
|
46
|
+
* env: null as CFWorkerEnv, // Must provide at createTrace()
|
|
47
|
+
* config: { retryCount: 3 }, // Has default
|
|
48
|
+
* },
|
|
49
|
+
* });
|
|
50
|
+
*
|
|
51
|
+
* // Define ops
|
|
52
|
+
* export const myHandler = defineOp('handler', async (ctx, req: Request) => {
|
|
53
|
+
* ctx.tag.method(req.method);
|
|
54
|
+
* return ctx.ok({ status: 'ok' });
|
|
55
|
+
* });
|
|
56
|
+
*
|
|
57
|
+
* // Or batch define and export as OpGroup
|
|
58
|
+
* export const myOps = defineOps({
|
|
59
|
+
* myHandler,
|
|
60
|
+
* healthCheck: async (ctx) => ctx.ok({ healthy: true }),
|
|
61
|
+
* });
|
|
62
|
+
* ```
|
|
63
|
+
*/
|
|
64
|
+
export declare function defineOpContext<T extends SchemaFields>(config: OpContextConfig<T, Record<string, never>, Record<string, never>, Record<string, never>>): OpContextFactory<LogSchema<T>, Record<string, never>, Record<string, never>, Record<string, never>>;
|
|
65
|
+
export declare function defineOpContext<T extends SchemaFields, const FF extends FeatureFlagSchema>(config: OpContextConfig<T, FF, Record<string, never>, Record<string, never>> & {
|
|
66
|
+
flags: FF;
|
|
67
|
+
}): OpContextFactory<LogSchema<T>, FF, Record<string, never>, Record<string, never>>;
|
|
68
|
+
export declare function defineOpContext<T extends SchemaFields, UserCtx extends Record<string, unknown>>(config: OpContextConfig<T, Record<string, never>, Record<string, never>, UserCtx> & {
|
|
69
|
+
ctx: ValidateUserContext<UserCtx>;
|
|
70
|
+
}): OpContextFactory<LogSchema<T>, Record<string, never>, Record<string, never>, UserCtx>;
|
|
71
|
+
export declare function defineOpContext<T extends SchemaFields, const FF extends FeatureFlagSchema, UserCtx extends Record<string, unknown>>(config: OpContextConfig<T, FF, Record<string, never>, UserCtx> & {
|
|
72
|
+
flags: FF;
|
|
73
|
+
ctx: ValidateUserContext<UserCtx>;
|
|
74
|
+
}): OpContextFactory<LogSchema<T>, FF, Record<string, never>, UserCtx>;
|
|
75
|
+
export declare function defineOpContext<T extends SchemaFields, Deps extends DepsConfig>(config: OpContextConfig<T, Record<string, never>, Deps, Record<string, never>> & {
|
|
76
|
+
deps: Deps;
|
|
77
|
+
}): OpContextFactory<LogSchema<EffectiveSchema<T, Deps>>, Record<string, never>, Deps, Record<string, never>>;
|
|
78
|
+
export declare function defineOpContext<T extends SchemaFields, const FF extends FeatureFlagSchema, Deps extends DepsConfig>(config: OpContextConfig<T, FF, Deps, Record<string, never>> & {
|
|
79
|
+
flags: FF;
|
|
80
|
+
deps: Deps;
|
|
81
|
+
}): OpContextFactory<LogSchema<EffectiveSchema<T, Deps>>, FF, Deps, Record<string, never>>;
|
|
82
|
+
export declare function defineOpContext<T extends SchemaFields, Deps extends DepsConfig, UserCtx extends Record<string, unknown>>(config: OpContextConfig<T, Record<string, never>, Deps, UserCtx> & {
|
|
83
|
+
deps: Deps;
|
|
84
|
+
ctx: ValidateUserContext<UserCtx>;
|
|
85
|
+
}): OpContextFactory<LogSchema<EffectiveSchema<T, Deps>>, Record<string, never>, Deps, UserCtx>;
|
|
86
|
+
export declare function defineOpContext<T extends SchemaFields, const FF extends FeatureFlagSchema, Deps extends DepsConfig, UserCtx extends Record<string, unknown>>(config: OpContextConfig<T, FF, Deps, UserCtx> & {
|
|
87
|
+
flags: FF;
|
|
88
|
+
deps: Deps;
|
|
89
|
+
ctx: ValidateUserContext<UserCtx>;
|
|
90
|
+
}): OpContextFactory<LogSchema<EffectiveSchema<T, Deps>>, FF, Deps, UserCtx>;
|
|
91
|
+
export * from './opContext/index.js';
|
|
92
|
+
export { S } from './schema/builder.js';
|
|
93
|
+
export { defineFeatureFlags } from './schema/defineFeatureFlags.js';
|
|
94
|
+
export { defineLogSchema } from './schema/defineLogSchema.js';
|
|
95
|
+
export { LogSchema } from './schema/LogSchema.js';
|
|
96
|
+
//# sourceMappingURL=defineOpContext.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"defineOpContext.d.ts","sourceRoot":"","sources":["../../src/lib/defineOpContext.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,EAML,KAAK,UAAU,EACf,KAAK,eAAe,EACpB,KAAK,iBAAiB,EAGtB,KAAK,eAAe,EACpB,KAAK,gBAAgB,EAErB,KAAK,mBAAmB,EACzB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAElD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAoNtD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AACH,wBAAgB,eAAe,CAAC,CAAC,SAAS,YAAY,EACpD,MAAM,EAAE,eAAe,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,GAC9F,gBAAgB,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC;AACvG,wBAAgB,eAAe,CAAC,CAAC,SAAS,YAAY,EAAE,KAAK,CAAC,EAAE,SAAS,iBAAiB,EACxF,MAAM,EAAE,eAAe,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,GAAG;IAAE,KAAK,EAAE,EAAE,CAAA;CAAE,GAC3F,gBAAgB,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC;AACpF,wBAAgB,eAAe,CAAC,CAAC,SAAS,YAAY,EAAE,OAAO,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7F,MAAM,EAAE,eAAe,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO,CAAC,GAAG;IAClF,GAAG,EAAE,mBAAmB,CAAC,OAAO,CAAC,CAAC;CACnC,GACA,gBAAgB,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO,CAAC,CAAC;AACzF,wBAAgB,eAAe,CAC7B,CAAC,SAAS,YAAY,EACtB,KAAK,CAAC,EAAE,SAAS,iBAAiB,EAClC,OAAO,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAEvC,MAAM,EAAE,eAAe,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO,CAAC,GAAG;IAAE,KAAK,EAAE,EAAE,CAAC;IAAC,GAAG,EAAE,mBAAmB,CAAC,OAAO,CAAC,CAAA;CAAE,GAChH,gBAAgB,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO,CAAC,CAAC;AACtE,wBAAgB,eAAe,CAAC,CAAC,SAAS,YAAY,EAAE,IAAI,SAAS,UAAU,EAC7E,MAAM,EAAE,eAAe,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,GAAG;IAAE,IAAI,EAAE,IAAI,CAAA;CAAE,GAC9F,gBAAgB,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC;AAC7G,wBAAgB,eAAe,CAAC,CAAC,SAAS,YAAY,EAAE,KAAK,CAAC,EAAE,SAAS,iBAAiB,EAAE,IAAI,SAAS,UAAU,EACjH,MAAM,EAAE,eAAe,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,GAAG;IAAE,KAAK,EAAE,EAAE,CAAC;IAAC,IAAI,EAAE,IAAI,CAAA;CAAE,GACtF,gBAAgB,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC;AAC1F,wBAAgB,eAAe,CAC7B,CAAC,SAAS,YAAY,EACtB,IAAI,SAAS,UAAU,EACvB,OAAO,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAEvC,MAAM,EAAE,eAAe,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,GAAG;IAAE,IAAI,EAAE,IAAI,CAAC;IAAC,GAAG,EAAE,mBAAmB,CAAC,OAAO,CAAC,CAAA;CAAE,GACnH,gBAAgB,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;AAC/F,wBAAgB,eAAe,CAC7B,CAAC,SAAS,YAAY,EACtB,KAAK,CAAC,EAAE,SAAS,iBAAiB,EAClC,IAAI,SAAS,UAAU,EACvB,OAAO,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAEvC,MAAM,EAAE,eAAe,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,CAAC,GAAG;IAAE,KAAK,EAAE,EAAE,CAAC;IAAC,IAAI,EAAE,IAAI,CAAC;IAAC,GAAG,EAAE,mBAAmB,CAAC,OAAO,CAAC,CAAA;CAAE,GAC3G,gBAAgB,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;AA8D5E,cAAc,sBAAsB,CAAC;AAGrC,OAAO,EAAE,CAAC,EAAE,MAAM,qBAAqB,CAAC;AACxC,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AACpE,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAC9D,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC"}
|
|
@@ -0,0 +1,227 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Op-Centric API for LMAO - Main Entry Point
|
|
3
|
+
*
|
|
4
|
+
* This is the factory function that creates the Op-centric API.
|
|
5
|
+
* All types are exported from './opContext/index.js'
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```typescript
|
|
9
|
+
* import { defineOpContext, S, defineLogSchema } from '@smoothbricks/lmao';
|
|
10
|
+
*
|
|
11
|
+
* const { defineOp, defineOps } = defineOpContext({
|
|
12
|
+
* logSchema: defineLogSchema({ userId: S.category() }),
|
|
13
|
+
* ctx: { env: null as Env },
|
|
14
|
+
* });
|
|
15
|
+
*
|
|
16
|
+
* export const myHandler = defineOp('handler', async (ctx, req: Request) => {
|
|
17
|
+
* ctx.tag.userId('user-123');
|
|
18
|
+
* return ctx.ok({ status: 'ok' });
|
|
19
|
+
* });
|
|
20
|
+
* ```
|
|
21
|
+
*/
|
|
22
|
+
import { createDefineOp, createDefineOps, createOpGroup, isMappedOpGroup, RESERVED_CONTEXT_PROPS, } from './opContext/index.js';
|
|
23
|
+
import { LogSchema } from './schema/LogSchema.js';
|
|
24
|
+
import { mergeWithSystemSchema, SYSTEM_SCHEMA_FIELD_NAMES } from './schema/systemSchema.js';
|
|
25
|
+
const EMPTY_FLAGS = Object.freeze({});
|
|
26
|
+
const EMPTY_DEPS = Object.freeze({});
|
|
27
|
+
const EMPTY_USER_CTX = Object.freeze({});
|
|
28
|
+
// =============================================================================
|
|
29
|
+
// EFFECTIVE SCHEMA COMPUTATION
|
|
30
|
+
// =============================================================================
|
|
31
|
+
// isMappedOpGroup is imported from opContext/index.js
|
|
32
|
+
/**
|
|
33
|
+
* Check if a field name is a system field (original or prefixed).
|
|
34
|
+
*
|
|
35
|
+
* System fields can appear as:
|
|
36
|
+
* - Original names: 'message', 'line', 'error_code', etc.
|
|
37
|
+
* - Prefixed names: 'http_message', 'db_line', 'auth_error_code', etc.
|
|
38
|
+
*
|
|
39
|
+
* @param fieldName - The field name to check
|
|
40
|
+
* @returns True if the field is a system field
|
|
41
|
+
*/
|
|
42
|
+
function isSystemField(fieldName) {
|
|
43
|
+
// Check direct match first
|
|
44
|
+
if (SYSTEM_SCHEMA_FIELD_NAMES.has(fieldName)) {
|
|
45
|
+
return true;
|
|
46
|
+
}
|
|
47
|
+
// Check if it's a prefixed system field (e.g., 'http_message' -> 'message')
|
|
48
|
+
const underscoreIdx = fieldName.indexOf('_');
|
|
49
|
+
if (underscoreIdx !== -1) {
|
|
50
|
+
const suffix = fieldName.slice(underscoreIdx + 1);
|
|
51
|
+
if (SYSTEM_SCHEMA_FIELD_NAMES.has(suffix)) {
|
|
52
|
+
return true;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
return false;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Filter out system schema fields from a schema.
|
|
59
|
+
*
|
|
60
|
+
* System fields (message, line, error_code, etc.) are merged into every logSchema
|
|
61
|
+
* by defineOpContext, but they should NOT be contributed when a dep is wired.
|
|
62
|
+
* Each app gets its own system fields via mergeWithSystemSchema.
|
|
63
|
+
*
|
|
64
|
+
* This function handles both original and prefixed system field names.
|
|
65
|
+
*
|
|
66
|
+
* @param fields - Schema fields to filter
|
|
67
|
+
* @returns Schema fields without system fields
|
|
68
|
+
*/
|
|
69
|
+
function filterOutSystemFields(fields) {
|
|
70
|
+
const result = {};
|
|
71
|
+
for (const key of Object.keys(fields)) {
|
|
72
|
+
if (!isSystemField(key)) {
|
|
73
|
+
result[key] = fields[key];
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
return result;
|
|
77
|
+
}
|
|
78
|
+
function isInternalOpGroup(dep) {
|
|
79
|
+
return '_logSchema' in dep;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Get the schema fields contributed by a dep (OpGroup or MappedOpGroup).
|
|
83
|
+
*
|
|
84
|
+
* - For OpGroup: returns original schema fields (no transformation), excluding system fields
|
|
85
|
+
* - For MappedOpGroup: returns contributedSchema (after prefix/mapping)
|
|
86
|
+
*
|
|
87
|
+
* System fields (message, line, error_code, etc.) are always filtered out because
|
|
88
|
+
* each app gets its own system fields via mergeWithSystemSchema - deps should NOT
|
|
89
|
+
* contribute system fields.
|
|
90
|
+
*
|
|
91
|
+
* The returned object maps field names to their schema definitions.
|
|
92
|
+
*
|
|
93
|
+
* @param dep - An OpGroup or MappedOpGroup (with internal properties _logSchema, _contributedSchema)
|
|
94
|
+
* @returns The schema fields this dep contributes (user fields only, no system fields)
|
|
95
|
+
*/
|
|
96
|
+
function getContributedSchemaFromDep(dep) {
|
|
97
|
+
if (!isInternalOpGroup(dep)) {
|
|
98
|
+
throw new Error('Invalid op dependency: expected an OpGroup created by defineOps()');
|
|
99
|
+
}
|
|
100
|
+
if (isMappedOpGroup(dep)) {
|
|
101
|
+
// MappedOpGroup has _contributedSchema with mapped field names
|
|
102
|
+
// This already excludes null-mapped columns (they were dropped in buildContributedSchema)
|
|
103
|
+
// Filter out system fields in case the original schema included them
|
|
104
|
+
return filterOutSystemFields(dep._contributedSchema);
|
|
105
|
+
}
|
|
106
|
+
// OpGroup contributes its original schema fields, excluding system fields
|
|
107
|
+
return filterOutSystemFields(dep._logSchema.fields);
|
|
108
|
+
}
|
|
109
|
+
function computeEffectiveSchema(appFields, deps) {
|
|
110
|
+
if (!deps || Object.keys(deps).length === 0) {
|
|
111
|
+
return appFields;
|
|
112
|
+
}
|
|
113
|
+
// Start with app fields
|
|
114
|
+
const effective = { ...appFields };
|
|
115
|
+
// Track which dep contributed each field for conflict detection
|
|
116
|
+
const fieldSource = {};
|
|
117
|
+
for (const fieldName of Object.keys(appFields)) {
|
|
118
|
+
fieldSource[fieldName] = 'app';
|
|
119
|
+
}
|
|
120
|
+
// Add each dep's contributed fields
|
|
121
|
+
for (const [depName, dep] of Object.entries(deps)) {
|
|
122
|
+
// Cast to AnyOpGroup to access internal properties (_logSchema, _contributedSchema)
|
|
123
|
+
// These exist at runtime but are hidden from public TypeScript interfaces
|
|
124
|
+
const contributed = getContributedSchemaFromDep(dep);
|
|
125
|
+
for (const [fieldName, fieldDef] of Object.entries(contributed)) {
|
|
126
|
+
// Check for conflict
|
|
127
|
+
if (fieldName in effective) {
|
|
128
|
+
const existingSource = fieldSource[fieldName];
|
|
129
|
+
throw new Error(`Schema conflict: field '${fieldName}' contributed by dep '${depName}' ` +
|
|
130
|
+
`conflicts with field from '${existingSource}'. ` +
|
|
131
|
+
'Use .prefix() or .mapColumns() to resolve the conflict.');
|
|
132
|
+
}
|
|
133
|
+
effective[fieldName] = fieldDef;
|
|
134
|
+
fieldSource[fieldName] = depName;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
return effective;
|
|
138
|
+
}
|
|
139
|
+
function buildOpContextFactory(effectiveFields, flags, deps, ctxDefaults) {
|
|
140
|
+
// Merge effective schema with system schema (message, line, error_code, etc.)
|
|
141
|
+
// System columns are always available on SpanBuffer regardless of user schema.
|
|
142
|
+
// Type parameter stays on the effective user/dependency schema because callers should infer
|
|
143
|
+
// only the public columns, while the runtime object still carries the merged system fields.
|
|
144
|
+
const mergedSchema = new LogSchema(mergeWithSystemSchema(effectiveFields));
|
|
145
|
+
// Create a LogBinding for ops to use.
|
|
146
|
+
// NOTE: Stats are NO LONGER on LogBinding - they are on SpanBufferClass.stats (static property).
|
|
147
|
+
// This avoids sync bugs from having two stat objects and reduces per-instance memory.
|
|
148
|
+
// See agent-todo/opgroup-refactor.md lines 58-70, 525-547 for rationale.
|
|
149
|
+
const logBinding = {
|
|
150
|
+
logSchema: mergedSchema,
|
|
151
|
+
remappedViewClass: undefined,
|
|
152
|
+
};
|
|
153
|
+
// WHY: build the binding first so Ops created by defineOp carry it via _opContextBinding.
|
|
154
|
+
// This enables downstream consumers (defineAgentOps, OpRegistry) to extract the LMAO schema.
|
|
155
|
+
const opContextBinding = { logBinding, flags, ctxDefaults, deps };
|
|
156
|
+
// Create the defineOp and defineOps functions bound to this config.
|
|
157
|
+
// CRITICAL: Use mergedSchema (with system columns), not just the app schema, because
|
|
158
|
+
// runtime SpanBuffer generation needs the full row shape even though public factory.logSchema
|
|
159
|
+
// intentionally exposes only user/dependency columns.
|
|
160
|
+
const defineOp = createDefineOp({
|
|
161
|
+
logSchema: mergedSchema,
|
|
162
|
+
flags,
|
|
163
|
+
opContextBinding,
|
|
164
|
+
});
|
|
165
|
+
const defineOps = createDefineOps({ logSchema: mergedSchema, flags, opContextBinding }, createOpGroup);
|
|
166
|
+
// Create effective schema LogSchema instance for factory.logSchema.
|
|
167
|
+
// This contains app fields + all dep contributed fields (user fields only, no system).
|
|
168
|
+
const effectiveLogSchema = new LogSchema(effectiveFields);
|
|
169
|
+
return {
|
|
170
|
+
logSchema: effectiveLogSchema,
|
|
171
|
+
flags,
|
|
172
|
+
logBinding,
|
|
173
|
+
ctxDefaults,
|
|
174
|
+
deps,
|
|
175
|
+
defineOp,
|
|
176
|
+
defineOps,
|
|
177
|
+
};
|
|
178
|
+
}
|
|
179
|
+
export function defineOpContext(config) {
|
|
180
|
+
// Runtime validation: check for reserved property names in user context
|
|
181
|
+
if (config.ctx) {
|
|
182
|
+
const userKeys = Object.keys(config.ctx);
|
|
183
|
+
for (const key of userKeys) {
|
|
184
|
+
if (RESERVED_CONTEXT_PROPS.some((reservedProp) => reservedProp === key)) {
|
|
185
|
+
throw new Error(`Cannot use '${key}' in ctx - it is a reserved SpanContext property. ` +
|
|
186
|
+
`Reserved: ${RESERVED_CONTEXT_PROPS.join(', ')}`);
|
|
187
|
+
}
|
|
188
|
+
// Check for underscore prefix (reserved for internal use)
|
|
189
|
+
if (key.startsWith('_')) {
|
|
190
|
+
throw new Error(`Cannot use '${key}' in ctx - properties starting with '_' are reserved for internal use.`);
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
// Compute effective schema by combining app schema with dep contributions.
|
|
195
|
+
// This merges app fields + all dep contributed fields (after prefix/mapping).
|
|
196
|
+
if (config.deps === undefined) {
|
|
197
|
+
const effectiveFields = computeEffectiveSchema(config.logSchema.fields);
|
|
198
|
+
if (config.flags === undefined) {
|
|
199
|
+
if (config.ctx === undefined) {
|
|
200
|
+
return buildOpContextFactory(effectiveFields, EMPTY_FLAGS, EMPTY_DEPS, EMPTY_USER_CTX);
|
|
201
|
+
}
|
|
202
|
+
return buildOpContextFactory(effectiveFields, EMPTY_FLAGS, EMPTY_DEPS, config.ctx);
|
|
203
|
+
}
|
|
204
|
+
if (config.ctx === undefined) {
|
|
205
|
+
return buildOpContextFactory(effectiveFields, config.flags, EMPTY_DEPS, EMPTY_USER_CTX);
|
|
206
|
+
}
|
|
207
|
+
return buildOpContextFactory(effectiveFields, config.flags, EMPTY_DEPS, config.ctx);
|
|
208
|
+
}
|
|
209
|
+
const effectiveFields = computeEffectiveSchema(config.logSchema.fields, config.deps);
|
|
210
|
+
if (config.flags === undefined) {
|
|
211
|
+
if (config.ctx === undefined) {
|
|
212
|
+
return buildOpContextFactory(effectiveFields, EMPTY_FLAGS, config.deps, EMPTY_USER_CTX);
|
|
213
|
+
}
|
|
214
|
+
return buildOpContextFactory(effectiveFields, EMPTY_FLAGS, config.deps, config.ctx);
|
|
215
|
+
}
|
|
216
|
+
if (config.ctx === undefined) {
|
|
217
|
+
return buildOpContextFactory(effectiveFields, config.flags, config.deps, EMPTY_USER_CTX);
|
|
218
|
+
}
|
|
219
|
+
return buildOpContextFactory(effectiveFields, config.flags, config.deps, config.ctx);
|
|
220
|
+
}
|
|
221
|
+
// Re-export everything from opContext for convenience
|
|
222
|
+
export * from './opContext/index.js';
|
|
223
|
+
// Re-export schema utilities
|
|
224
|
+
export { S } from './schema/builder.js';
|
|
225
|
+
export { defineFeatureFlags } from './schema/defineFeatureFlags.js';
|
|
226
|
+
export { defineLogSchema } from './schema/defineLogSchema.js';
|
|
227
|
+
export { LogSchema } from './schema/LogSchema.js';
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Blocked error - indicates an Op cannot proceed due to a temporary condition.
|
|
3
|
+
*
|
|
4
|
+
* A tagged error type for use with `result.isErr(Blocked)` to discriminate
|
|
5
|
+
* blocked states from other errors. Useful for retry logic and dependency waiting.
|
|
6
|
+
*
|
|
7
|
+
* Uses BlockedConfig for retry configuration (closure-based nextRetry).
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* ```typescript
|
|
11
|
+
* import { defineOpContext, S, Err } from '@smoothbricks/lmao';
|
|
12
|
+
* import { Blocked } from '@smoothbricks/lmao/errors/Blocked';
|
|
13
|
+
*
|
|
14
|
+
* const { defineOp } = defineOpContext({
|
|
15
|
+
* logSchema: { service: S.category() },
|
|
16
|
+
* ctx: { env: null as Env },
|
|
17
|
+
* });
|
|
18
|
+
*
|
|
19
|
+
* const fetchData = defineOp('fetchData', async (ctx, service: string) => {
|
|
20
|
+
* const health = await checkHealth(service);
|
|
21
|
+
* if (!health.available) {
|
|
22
|
+
* // Return Err with Blocked - can chain .with() for tags
|
|
23
|
+
* return new Err(Blocked.service(service)).with({ service });
|
|
24
|
+
* }
|
|
25
|
+
* ctx.tag.service(service);
|
|
26
|
+
* return ctx.ok(await doFetch(service));
|
|
27
|
+
* });
|
|
28
|
+
*
|
|
29
|
+
* // With closure-based retry (captures HTTP response context)
|
|
30
|
+
* const callApi = defineOp('callApi', async (ctx, url: string) => {
|
|
31
|
+
* const response = await fetch(url);
|
|
32
|
+
* if (response.status === 503) {
|
|
33
|
+
* const retryAfterSec = parseInt(response.headers.get('Retry-After') ?? '5');
|
|
34
|
+
* return new Err(Blocked.service('payment-api', {
|
|
35
|
+
* maxAttempts: 5,
|
|
36
|
+
* nextRetry: (attempt) => {
|
|
37
|
+
* if (attempt === 1) return retryAfterSec * 1000;
|
|
38
|
+
* return 5000 * Math.pow(2, attempt - 1);
|
|
39
|
+
* },
|
|
40
|
+
* }));
|
|
41
|
+
* }
|
|
42
|
+
* return ctx.ok(await response.json());
|
|
43
|
+
* });
|
|
44
|
+
*
|
|
45
|
+
* // Caller can discriminate blocked from other errors
|
|
46
|
+
* const result = await trace('fetch', fetchData, 'payment-api');
|
|
47
|
+
* if (result.isErr(Blocked)) {
|
|
48
|
+
* // Handle temporary unavailability - retry, queue, etc.
|
|
49
|
+
* console.log(`Blocked on ${result.error.reason.name}`);
|
|
50
|
+
* }
|
|
51
|
+
* ```
|
|
52
|
+
*/
|
|
53
|
+
import type { TaggedError } from '../result.js';
|
|
54
|
+
/**
|
|
55
|
+
* Reason why an Op is blocked.
|
|
56
|
+
*/
|
|
57
|
+
export type BlockedReason = {
|
|
58
|
+
readonly type: 'service';
|
|
59
|
+
readonly name: string;
|
|
60
|
+
} | {
|
|
61
|
+
readonly type: 'ended';
|
|
62
|
+
readonly target: string;
|
|
63
|
+
} | {
|
|
64
|
+
readonly type: 'index';
|
|
65
|
+
readonly indexName: string;
|
|
66
|
+
};
|
|
67
|
+
/**
|
|
68
|
+
* Convert a blocked reason union into its display name.
|
|
69
|
+
*/
|
|
70
|
+
export declare function getBlockedReasonName(reason: BlockedReason): string;
|
|
71
|
+
/**
|
|
72
|
+
* Engine-level retry configuration for blocked operations.
|
|
73
|
+
*
|
|
74
|
+
* The nextRetry closure is powerful because it captures the Op's execution context.
|
|
75
|
+
* Each time the Op re-executes, it produces a new Blocked error with a new closure
|
|
76
|
+
* that may reference updated information (e.g., fresh Retry-After headers).
|
|
77
|
+
*/
|
|
78
|
+
export interface BlockedConfig {
|
|
79
|
+
/** Max canary retries before RetriesExhausted (default: 5) */
|
|
80
|
+
readonly maxAttempts?: number;
|
|
81
|
+
/** Closure returning delay in ms before next retry. Captures Op context. */
|
|
82
|
+
readonly nextRetry?: (attempt: number) => number;
|
|
83
|
+
}
|
|
84
|
+
type BlockedJsonView = {
|
|
85
|
+
_tag: 'Blocked';
|
|
86
|
+
reason: BlockedReason;
|
|
87
|
+
blockedConfig?: Omit<BlockedConfig, 'nextRetry'> & {
|
|
88
|
+
nextRetry?: string;
|
|
89
|
+
};
|
|
90
|
+
};
|
|
91
|
+
export declare class Blocked extends Error implements TaggedError<'Blocked'> {
|
|
92
|
+
/** The reason this Op is blocked */
|
|
93
|
+
readonly reason: BlockedReason;
|
|
94
|
+
static readonly _tag: "Blocked";
|
|
95
|
+
get _tag(): 'Blocked';
|
|
96
|
+
/** Retry configuration */
|
|
97
|
+
readonly blockedConfig: BlockedConfig | undefined;
|
|
98
|
+
constructor(
|
|
99
|
+
/** The reason this Op is blocked */
|
|
100
|
+
reason: BlockedReason,
|
|
101
|
+
/** Optional retry configuration */
|
|
102
|
+
config?: BlockedConfig);
|
|
103
|
+
/** Create a Blocked error for a service being unavailable */
|
|
104
|
+
static service(name: string, config?: BlockedConfig): Blocked;
|
|
105
|
+
/** Create a Blocked error waiting for another execution to end */
|
|
106
|
+
static ended(target: string, config?: BlockedConfig): Blocked;
|
|
107
|
+
/** Create a Blocked error for an index being rebuilt */
|
|
108
|
+
static index(indexName: string, config?: BlockedConfig): Blocked;
|
|
109
|
+
/** Clean output for JSON.stringify */
|
|
110
|
+
toJSON(): BlockedJsonView;
|
|
111
|
+
}
|
|
112
|
+
export {};
|
|
113
|
+
//# sourceMappingURL=Blocked.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Blocked.d.ts","sourceRoot":"","sources":["../../../src/lib/errors/Blocked.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmDG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAEhD;;GAEG;AACH,MAAM,MAAM,aAAa,GACrB;IAAE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACnD;IAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACnD;IAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC;AAE3D;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,CASlE;AAED;;;;;;GAMG;AACH,MAAM,WAAW,aAAa;IAC5B,8DAA8D;IAC9D,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,4EAA4E;IAC5E,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,MAAM,CAAC;CAClD;AAQD,KAAK,eAAe,GAAG;IACrB,IAAI,EAAE,SAAS,CAAC;IAChB,MAAM,EAAE,aAAa,CAAC;IACtB,aAAa,CAAC,EAAE,IAAI,CAAC,aAAa,EAAE,WAAW,CAAC,GAAG;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAC3E,CAAC;AAEF,qBAAa,OAAQ,SAAQ,KAAM,YAAW,WAAW,CAAC,SAAS,CAAC;IAWhE,oCAAoC;IACpC,QAAQ,CAAC,MAAM,EAAE,aAAa;IAXhC,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAG,SAAS,CAAU;IAE1C,IAAI,IAAI,IAAI,SAAS,CAEpB;IAED,0BAA0B;IAC1B,QAAQ,CAAC,aAAa,EAAE,aAAa,GAAG,SAAS,CAAC;;IAGhD,oCAAoC;IAC3B,MAAM,EAAE,aAAa;IAC9B,mCAAmC;IACnC,MAAM,CAAC,EAAE,aAAa;IAOxB,6DAA6D;IAC7D,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,aAAa,GAAG,OAAO;IAI7D,kEAAkE;IAClE,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,aAAa,GAAG,OAAO;IAI7D,wDAAwD;IACxD,MAAM,CAAC,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,aAAa,GAAG,OAAO;IAahE,sCAAsC;IACtC,MAAM,IAAI,eAAe;CAe1B"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Convert a blocked reason union into its display name.
|
|
3
|
+
*/
|
|
4
|
+
export function getBlockedReasonName(reason) {
|
|
5
|
+
switch (reason.type) {
|
|
6
|
+
case 'service':
|
|
7
|
+
return reason.name;
|
|
8
|
+
case 'ended':
|
|
9
|
+
return reason.target;
|
|
10
|
+
case 'index':
|
|
11
|
+
return reason.indexName;
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
export class Blocked extends Error {
|
|
15
|
+
reason;
|
|
16
|
+
static _tag = 'Blocked';
|
|
17
|
+
get _tag() {
|
|
18
|
+
return 'Blocked';
|
|
19
|
+
}
|
|
20
|
+
/** Retry configuration */
|
|
21
|
+
blockedConfig;
|
|
22
|
+
constructor(
|
|
23
|
+
/** The reason this Op is blocked */
|
|
24
|
+
reason,
|
|
25
|
+
/** Optional retry configuration */
|
|
26
|
+
config) {
|
|
27
|
+
super(`Blocked: ${getBlockedReasonName(reason)}`);
|
|
28
|
+
this.reason = reason;
|
|
29
|
+
this.name = 'Blocked';
|
|
30
|
+
this.blockedConfig = config;
|
|
31
|
+
}
|
|
32
|
+
/** Create a Blocked error for a service being unavailable */
|
|
33
|
+
static service(name, config) {
|
|
34
|
+
return new Blocked({ type: 'service', name }, config);
|
|
35
|
+
}
|
|
36
|
+
/** Create a Blocked error waiting for another execution to end */
|
|
37
|
+
static ended(target, config) {
|
|
38
|
+
return new Blocked({ type: 'ended', target }, config);
|
|
39
|
+
}
|
|
40
|
+
/** Create a Blocked error for an index being rebuilt */
|
|
41
|
+
static index(indexName, config) {
|
|
42
|
+
return new Blocked({ type: 'index', indexName }, config);
|
|
43
|
+
}
|
|
44
|
+
/** Clean output for console.log in Node.js */
|
|
45
|
+
[Symbol.for('nodejs.util.inspect.custom')]() {
|
|
46
|
+
return {
|
|
47
|
+
_tag: this._tag,
|
|
48
|
+
reason: this.reason,
|
|
49
|
+
...(this.blockedConfig ? { blockedConfig: this.blockedConfig } : {}),
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
/** Clean output for JSON.stringify */
|
|
53
|
+
toJSON() {
|
|
54
|
+
const config = this.blockedConfig;
|
|
55
|
+
return {
|
|
56
|
+
_tag: this._tag,
|
|
57
|
+
reason: this.reason,
|
|
58
|
+
...(config
|
|
59
|
+
? {
|
|
60
|
+
blockedConfig: {
|
|
61
|
+
...(config.maxAttempts != null ? { maxAttempts: config.maxAttempts } : {}),
|
|
62
|
+
...(config.nextRetry ? { nextRetry: '[closure]' } : {}),
|
|
63
|
+
},
|
|
64
|
+
}
|
|
65
|
+
: {}),
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CodeError - typed error codes with data payloads.
|
|
3
|
+
*
|
|
4
|
+
* Use the `Code()` helper to define typed error codes, then use them with `ctx.err()`.
|
|
5
|
+
* The error code becomes the `_tag` for discrimination with `result.isErr(CODE)`.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```typescript
|
|
9
|
+
* import { Code } from '@smoothbricks/lmao/errors/CodeError';
|
|
10
|
+
*
|
|
11
|
+
* // Define typed error codes
|
|
12
|
+
* const NOT_FOUND = Code<{ id: string }>('NOT_FOUND');
|
|
13
|
+
* const VALIDATION_ERROR = Code<{ field: string; reason: string }>('VALIDATION_ERROR');
|
|
14
|
+
* const TIMEOUT = Code('TIMEOUT'); // No data payload
|
|
15
|
+
*
|
|
16
|
+
* // Use in Ops
|
|
17
|
+
* const fetchUser = defineOp('fetchUser', async (ctx, id: string) => {
|
|
18
|
+
* const user = await db.find(id);
|
|
19
|
+
* if (!user) {
|
|
20
|
+
* return ctx.err(NOT_FOUND({ id }));
|
|
21
|
+
* }
|
|
22
|
+
* return ctx.ok(user);
|
|
23
|
+
* });
|
|
24
|
+
*
|
|
25
|
+
* // Discriminate errors
|
|
26
|
+
* const result = await trace('fetch', fetchUser, 'abc');
|
|
27
|
+
* if (result.isErr(NOT_FOUND)) {
|
|
28
|
+
* console.log(`User ${result.error.data.id} not found`);
|
|
29
|
+
* }
|
|
30
|
+
* ```
|
|
31
|
+
*/
|
|
32
|
+
import type { TaggedError, TaggedErrorConstructor } from '../result.js';
|
|
33
|
+
type CodeErrorJson<C extends string, D> = {
|
|
34
|
+
code: C;
|
|
35
|
+
data: D;
|
|
36
|
+
};
|
|
37
|
+
/**
|
|
38
|
+
* Error instance created by a Code constructor.
|
|
39
|
+
*
|
|
40
|
+
* @typeParam C - The error code string literal type (also serves as _tag)
|
|
41
|
+
* @typeParam D - The data payload type
|
|
42
|
+
*/
|
|
43
|
+
export declare class CodeError<C extends string, D = void> extends Error implements TaggedError<C> {
|
|
44
|
+
/**
|
|
45
|
+
* The error code - also serves as the tag for discrimination.
|
|
46
|
+
*/
|
|
47
|
+
readonly code: C;
|
|
48
|
+
/**
|
|
49
|
+
* The typed data payload.
|
|
50
|
+
*/
|
|
51
|
+
readonly data: D;
|
|
52
|
+
constructor(code: C, data: D);
|
|
53
|
+
/**
|
|
54
|
+
* Tag for discrimination with isErr(Tag).
|
|
55
|
+
* Returns the error code.
|
|
56
|
+
*/
|
|
57
|
+
get _tag(): C;
|
|
58
|
+
toJSON(): CodeErrorJson<C, D>;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Constructor function for a specific error code.
|
|
62
|
+
* Has static `_tag` for use with `isErr(CODE)`.
|
|
63
|
+
*/
|
|
64
|
+
export interface CodeConstructor<C extends string, D = void> extends TaggedErrorConstructor<CodeError<C, D>> {
|
|
65
|
+
(data: D): CodeError<C, D>;
|
|
66
|
+
readonly _tag: C;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Constructor function for error codes with no data.
|
|
70
|
+
*/
|
|
71
|
+
export interface CodeConstructorVoid<C extends string> extends TaggedErrorConstructor<CodeError<C, void>> {
|
|
72
|
+
(): CodeError<C, void>;
|
|
73
|
+
readonly _tag: C;
|
|
74
|
+
}
|
|
75
|
+
type CodeFactoryReturn<C extends string, D> = [unknown] extends [D] ? CodeConstructor<C, D> : undefined extends D ? CodeConstructorVoid<C> : CodeConstructor<C, D>;
|
|
76
|
+
/**
|
|
77
|
+
* Define a typed error code.
|
|
78
|
+
*
|
|
79
|
+
* @param code - The error code string (becomes _tag for discrimination)
|
|
80
|
+
* @returns A constructor function that creates CodeError instances
|
|
81
|
+
*
|
|
82
|
+
* @example
|
|
83
|
+
* ```typescript
|
|
84
|
+
* // With typed data
|
|
85
|
+
* const NOT_FOUND = Code<{ id: string }>('NOT_FOUND');
|
|
86
|
+
* ctx.err(NOT_FOUND({ id: 'abc' }));
|
|
87
|
+
*
|
|
88
|
+
* // Without data
|
|
89
|
+
* const TIMEOUT = Code('TIMEOUT');
|
|
90
|
+
* ctx.err(TIMEOUT());
|
|
91
|
+
*
|
|
92
|
+
* // Discrimination
|
|
93
|
+
* if (result.isErr(NOT_FOUND)) {
|
|
94
|
+
* console.log(result.error.data.id); // TypeScript knows the type
|
|
95
|
+
* }
|
|
96
|
+
* ```
|
|
97
|
+
*/
|
|
98
|
+
export declare function Code<C extends string>(code: C): CodeConstructorVoid<C>;
|
|
99
|
+
export declare function Code<D, C extends string = string>(code: C): CodeFactoryReturn<C, D>;
|
|
100
|
+
export {};
|
|
101
|
+
//# sourceMappingURL=CodeError.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CodeError.d.ts","sourceRoot":"","sources":["../../../src/lib/errors/CodeError.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AAExE,KAAK,aAAa,CAAC,CAAC,SAAS,MAAM,EAAE,CAAC,IAAI;IAAE,IAAI,EAAE,CAAC,CAAC;IAAC,IAAI,EAAE,CAAC,CAAA;CAAE,CAAC;AAE/D;;;;;GAKG;AACH,qBAAa,SAAS,CAAC,CAAC,SAAS,MAAM,EAAE,CAAC,GAAG,IAAI,CAAE,SAAQ,KAAM,YAAW,WAAW,CAAC,CAAC,CAAC;IACxF;;OAEG;IACH,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;IAEjB;;OAEG;IACH,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;gBAEL,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC;IAO5B;;;OAGG;IACH,IAAI,IAAI,IAAI,CAAC,CAEZ;IAMD,MAAM,IAAI,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC;CAG9B;AAED;;;GAGG;AACH,MAAM,WAAW,eAAe,CAAC,CAAC,SAAS,MAAM,EAAE,CAAC,GAAG,IAAI,CAAE,SAAQ,sBAAsB,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC1G,CAAC,IAAI,EAAE,CAAC,GAAG,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC3B,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB,CAAC,CAAC,SAAS,MAAM,CAAE,SAAQ,sBAAsB,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;IACvG,IAAI,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;IACvB,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;CAClB;AAED,KAAK,iBAAiB,CAAC,CAAC,SAAS,MAAM,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,GAC/D,eAAe,CAAC,CAAC,EAAE,CAAC,CAAC,GACrB,SAAS,SAAS,CAAC,GACjB,mBAAmB,CAAC,CAAC,CAAC,GACtB,eAAe,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAE5B;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,IAAI,CAAC,CAAC,SAAS,MAAM,EAAE,IAAI,EAAE,CAAC,GAAG,mBAAmB,CAAC,CAAC,CAAC,CAAC;AACxE,wBAAgB,IAAI,CAAC,CAAC,EAAE,CAAC,SAAS,MAAM,GAAG,MAAM,EAAE,IAAI,EAAE,CAAC,GAAG,iBAAiB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Error instance created by a Code constructor.
|
|
3
|
+
*
|
|
4
|
+
* @typeParam C - The error code string literal type (also serves as _tag)
|
|
5
|
+
* @typeParam D - The data payload type
|
|
6
|
+
*/
|
|
7
|
+
export class CodeError extends Error {
|
|
8
|
+
/**
|
|
9
|
+
* The error code - also serves as the tag for discrimination.
|
|
10
|
+
*/
|
|
11
|
+
code;
|
|
12
|
+
/**
|
|
13
|
+
* The typed data payload.
|
|
14
|
+
*/
|
|
15
|
+
data;
|
|
16
|
+
constructor(code, data) {
|
|
17
|
+
super(code);
|
|
18
|
+
this.name = 'CodeError';
|
|
19
|
+
this.code = code;
|
|
20
|
+
this.data = data;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Tag for discrimination with isErr(Tag).
|
|
24
|
+
* Returns the error code.
|
|
25
|
+
*/
|
|
26
|
+
get _tag() {
|
|
27
|
+
return this.code;
|
|
28
|
+
}
|
|
29
|
+
[Symbol.for('nodejs.util.inspect.custom')]() {
|
|
30
|
+
return { code: this.code, data: this.data };
|
|
31
|
+
}
|
|
32
|
+
toJSON() {
|
|
33
|
+
return { code: this.code, data: this.data };
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
export function Code(code) {
|
|
37
|
+
function createCodeError(data) {
|
|
38
|
+
return new CodeError(code, data);
|
|
39
|
+
}
|
|
40
|
+
Object.defineProperty(createCodeError, '_tag', { value: code, writable: false, enumerable: true });
|
|
41
|
+
return createCodeError;
|
|
42
|
+
}
|