@smoothbricks/lmao 0.2.0 → 0.2.2
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/dist/es.js +1 -0
- package/dist/lib/JsBufferStrategy.d.ts.map +1 -1
- package/dist/lib/JsBufferStrategy.js +12 -0
- package/dist/lib/archive/chunkEnvelope.js +1 -0
- package/dist/lib/archive/chunkRouting.js +1 -0
- package/dist/lib/archive/chunkStats.js +1 -0
- package/dist/lib/arrow/capacityStats.js +1 -0
- package/dist/lib/arrow/dictionaries.d.ts.map +1 -1
- package/dist/lib/buffer/Nanoseconds.d.ts.map +1 -1
- package/dist/lib/buffer/Nanoseconds.js +34 -0
- package/dist/lib/bufferStrategy.js +21 -0
- package/dist/lib/capacityTuning.js +26 -0
- package/dist/lib/cleanupDiagnostics.js +2 -2
- package/dist/lib/cloudflare/classSplit.d.ts.map +1 -1
- package/dist/lib/cloudflare/classSplit.js +19 -0
- package/dist/lib/cloudflare/collectorClient.d.ts.map +1 -1
- package/dist/lib/cloudflare/diagnosticDrain.d.ts.map +1 -1
- package/dist/lib/cloudflare/diagnosticDrain.js +1 -1
- package/dist/lib/codegen/evaluatorGenerator.js +1 -0
- package/dist/lib/codegen/fixedPositionWriterGenerator.js +1 -0
- package/dist/lib/codegen/spanLoggerGenerator.js +1 -0
- package/dist/lib/errors/Blocked.d.ts +1 -1
- package/dist/lib/errors/Blocked.d.ts.map +1 -1
- package/dist/lib/errors/Blocked.js +53 -0
- package/dist/lib/errors/CodeError.d.ts.map +1 -1
- package/dist/lib/errors/CodeError.js +31 -0
- package/dist/lib/errors/RetriesExhausted.d.ts +1 -1
- package/dist/lib/errors/RetriesExhausted.d.ts.map +1 -1
- package/dist/lib/errors/RetriesExhausted.js +38 -0
- package/dist/lib/errors/Transient.d.ts +1 -1
- package/dist/lib/errors/Transient.d.ts.map +1 -1
- package/dist/lib/errors/Transient.js +31 -0
- package/dist/lib/errors/retry-policy.js +1 -0
- package/dist/lib/flushScheduler.d.ts +0 -3
- package/dist/lib/flushScheduler.d.ts.map +1 -1
- package/dist/lib/library.js +1 -0
- package/dist/lib/logApi.js +11 -0
- package/dist/lib/logBinding.js +13 -0
- package/dist/lib/op.d.ts.map +1 -1
- package/dist/lib/op.js +15 -0
- package/dist/lib/opContext/contextTypes.d.ts +1 -1
- package/dist/lib/opContext/contextTypes.d.ts.map +1 -1
- package/dist/lib/opContext/createOpGroup.js +1 -0
- package/dist/lib/opContext/featureFlagTypes.js +13 -0
- package/dist/lib/opContext/opGroupTypes.d.ts +1 -1
- package/dist/lib/opContext/opGroupTypes.d.ts.map +1 -1
- package/dist/lib/opContext/opGroupTypes.js +16 -0
- package/dist/lib/opContext/opTypes.js +14 -0
- package/dist/lib/opContext/spanContextTypes.js +19 -0
- package/dist/lib/opContext/types.js +15 -0
- package/dist/lib/result.d.ts.map +1 -1
- package/dist/lib/schema/LogSchema.d.ts.map +1 -1
- package/dist/lib/schema/builder.js +1 -0
- package/dist/lib/schema/defineFeatureFlags.js +1 -0
- package/dist/lib/schema/defineLogSchema.js +10 -0
- package/dist/lib/schema/evaluator.d.ts.map +1 -1
- package/dist/lib/schema/evaluator.js +1 -0
- package/dist/lib/schema/systemSchema.d.ts +1 -1
- package/dist/lib/schema/systemSchema.d.ts.map +1 -1
- package/dist/lib/schema/systemSchema.js +8 -0
- package/dist/lib/schema/types.js +6 -0
- package/dist/lib/spanBuffer.d.ts.map +1 -1
- package/dist/lib/spanBufferHelpers.js +1 -0
- package/dist/lib/spanBufferStats.js +24 -0
- package/dist/lib/spanContext.js +1 -0
- package/dist/lib/sqlite/sqlite-async-writer.d.ts.map +1 -1
- package/dist/lib/sqlite/sqlite-d1.js +8 -0
- package/dist/lib/sqlite/sqlite-db.js +8 -0
- package/dist/lib/sqlite/sqlite-writer.d.ts.map +1 -1
- package/dist/lib/testing/bun-harness.d.ts +4 -0
- package/dist/lib/testing/bun-harness.d.ts.map +1 -1
- package/dist/lib/testing/extractFacts.js +8 -0
- package/dist/lib/testing/facts.d.ts.map +1 -1
- package/dist/lib/testing/facts.js +19 -0
- package/dist/lib/testing/queryable-span.js +16 -0
- package/dist/lib/testing/span-query.js +8 -0
- package/dist/lib/testing/trace-query.d.ts.map +1 -1
- package/dist/lib/testing/trace-query.js +247 -219
- package/dist/lib/traceContext.js +8 -0
- package/dist/lib/traceId.js +1 -0
- package/dist/lib/traceRoot.es.d.ts.map +1 -1
- package/dist/lib/traceRoot.es.js +1 -0
- package/dist/lib/traceRoot.js +15 -0
- package/dist/lib/traceRoot.node.d.ts.map +1 -1
- package/dist/lib/traceRoot.node.js +1 -0
- package/dist/lib/tracer.d.ts.map +1 -1
- package/dist/lib/tracer.js +61 -0
- package/dist/lib/tracers/ArrayQueueTracer.d.ts.map +1 -1
- package/dist/lib/tracers/ArrayQueueTracer.js +1 -0
- package/dist/lib/tracers/CompositeTracer.d.ts.map +1 -1
- package/dist/lib/tracers/CompositeTracer.js +1 -0
- package/dist/lib/tracers/NoOpTracer.d.ts.map +1 -1
- package/dist/lib/tracers/NoOpTracer.js +25 -0
- package/dist/lib/tracers/SQLiteTracer.d.ts.map +1 -1
- package/dist/lib/tracers/StdioTracer.d.ts.map +1 -1
- package/dist/lib/tracers/StdioTracer.js +39 -6
- package/dist/lib/tracers/TestTracer.d.ts.map +1 -1
- package/dist/lib/tracers/TestTracer.js +30 -0
- package/dist/lib/types.js +10 -0
- package/dist/lib/utf8Cache.d.ts.map +1 -1
- package/dist/lib/utf8Cache.js +1 -0
- package/dist/lib/wasm/WasmBufferStrategy.d.ts.map +1 -1
- package/dist/lib/wasm/WasmBufferStrategy.js +15 -0
- package/dist/lib/wasm/wasmAllocator.js +16 -0
- package/dist/lib/wasm/wasmSpanBuffer.js +12 -0
- package/dist/lib/wasm/wasmTraceRoot.d.ts.map +1 -1
- package/dist/lib/wasm/wasmTraceRoot.js +2 -1
- package/dist/node.js +1 -0
- package/package.json +5 -4
- package/src/lib/cleanupDiagnostics.ts +2 -2
package/dist/es.js
CHANGED
|
@@ -8,3 +8,4 @@ export * from './index.js';
|
|
|
8
8
|
// Export browser-specific TraceRoot factory for Tracer construction
|
|
9
9
|
//#region smoo/lmao!n/trace-root-timestamps.entry-points #es
|
|
10
10
|
export { createTraceRoot } from './lib/traceRoot.es.js';
|
|
11
|
+
//#endregion smoo/lmao!n/trace-root-timestamps.entry-points
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"JsBufferStrategy.d.ts","sourceRoot":"","sources":["../../src/lib/JsBufferStrategy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAE1D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAQvD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAS5D;;;;;;;;;;;;;GAaG;AACH,qBAAa,gBAAgB,CAAC,CAAC,SAAS,SAAS,GAAG,SAAS,CAAE,YAAW,cAAc,CAAC,CAAC,CAAC;IACzF;;;OAGG;IACH,OAAO,CAAC,oBAAoB,CAAmD;IAE/E;;OAEG;IACH,OAAO,CAAC,2BAA2B;IAYnC,gBAAgB,CAAC,MAAM,EAAE,CAAC,EAAE,SAAS,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,UAAU,CAAC,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"JsBufferStrategy.d.ts","sourceRoot":"","sources":["../../src/lib/JsBufferStrategy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAE1D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAQvD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAS5D;;;;;;;;;;;;;GAaG;AACH,qBAAa,gBAAgB,CAAC,CAAC,SAAS,SAAS,GAAG,SAAS,CAAE,YAAW,cAAc,CAAC,CAAC,CAAC;IACzF;;;OAGG;IACH,OAAO,CAAC,oBAAoB,CAAmD;IAE/E;;OAEG;IACH,OAAO,CAAC,2BAA2B;IAYnC,gBAAgB,CAAC,MAAM,EAAE,CAAC,EAAE,SAAS,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,UAAU,CAAC,CAAC,CAAC,CAE3G;IAED,qBAAqB,CACnB,YAAY,EAAE,UAAU,CAAC,CAAC,CAAC,EAC3B,gBAAgB,EAAE,UAAU,EAC5B,UAAU,EAAE,UAAU,EACtB,QAAQ,CAAC,EAAE,MAAM,EACjB,MAAM,CAAC,EAAE,CAAC,GACT,UAAU,CAAC,CAAC,CAAC,CAKf;IAED,oBAAoB,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,CAEzD;IAED,YAAY,CAAC,MAAM,EAAE,aAAa,GAAG,KAAK,CAGzC;IAED,aAAa,CAAC,OAAO,EAAE,aAAa,GAAG,IAAI,CAG1C;CACF"}
|
|
@@ -1,3 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* JsBufferStrategy - Default buffer strategy using JavaScript TypedArrays.
|
|
3
|
+
*
|
|
4
|
+
* Uses GC-managed memory with zero-copy Arrow conversion via flechette.
|
|
5
|
+
*
|
|
6
|
+
* Memory characteristics:
|
|
7
|
+
* - Buffers are regular JS objects with TypedArray properties
|
|
8
|
+
* - GC handles deallocation (no explicit release needed)
|
|
9
|
+
* - Arrow conversion shares ArrayBuffer references (zero-copy)
|
|
10
|
+
*
|
|
11
|
+
* @module JsBufferStrategy
|
|
12
|
+
*/
|
|
1
13
|
import { convertSpanTreeToArrowTable } from './convertToArrow.js';
|
|
2
14
|
import { createChildSpanBuffer as createChildSpanBufferImpl, createOverflowBuffer as createOverflowBufferImpl, createSpanBuffer as createSpanBufferImpl, getSpanBufferClass, } from './spanBuffer.js';
|
|
3
15
|
function isSpanBufferConstructorForSchema(ctor, schema) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dictionaries.d.ts","sourceRoot":"","sources":["../../../src/lib/arrow/dictionaries.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,KAAK,OAAO,EAAyB,MAAM,mBAAmB,CAAC;AACxE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAGjD;;;GAGG;AACH,qBAAa,qBAAqB;aAEd,UAAU,EAAE,MAAM,EAAE;aACpB,OAAO,EAAE,UAAU,GAAG,WAAW,GAAG,WAAW;aAC/C,cAAc,EAAE,qBAAqB,GAAG,sBAAsB,GAAG,sBAAsB;aACvF,cAAc,EAAE,OAAO;aACvB,UAAU,EAAE,UAAU,GAAG,SAAS;aAClC,SAAS,EAAE,MAAM;
|
|
1
|
+
{"version":3,"file":"dictionaries.d.ts","sourceRoot":"","sources":["../../../src/lib/arrow/dictionaries.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,KAAK,OAAO,EAAyB,MAAM,mBAAmB,CAAC;AACxE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAGjD;;;GAGG;AACH,qBAAa,qBAAqB;aAEd,UAAU,EAAE,MAAM,EAAE;aACpB,OAAO,EAAE,UAAU,GAAG,WAAW,GAAG,WAAW;aAC/C,cAAc,EAAE,qBAAqB,GAAG,sBAAsB,GAAG,sBAAsB;aACvF,cAAc,EAAE,OAAO;aACvB,UAAU,EAAE,UAAU,GAAG,SAAS;aAClC,SAAS,EAAE,MAAM;IANnC,YACkB,UAAU,EAAE,MAAM,EAAE,EACpB,OAAO,EAAE,UAAU,GAAG,WAAW,GAAG,WAAW,EAC/C,cAAc,EAAE,qBAAqB,GAAG,sBAAsB,GAAG,sBAAsB,EACvF,cAAc,EAAE,OAAO,EACvB,UAAU,EAAE,UAAU,GAAG,SAAS,EAClC,SAAS,EAAE,MAAM,EAC/B;CACL;AAED;;GAEG;AACH,wBAAgB,6BAA6B,CAC3C,OAAO,EAAE,aAAa,EAAE,EACxB,UAAU,EAAE,MAAM,EAClB,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,GACxC,qBAAqB,CAkDvB;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,aAAa,EAAE,EACxB,UAAU,EAAE,MAAM,EAClB,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,GACxC,qBAAqB,GAAG,IAAI,CAqE9B"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Nanoseconds.d.ts","sourceRoot":"","sources":["../../../src/lib/buffer/Nanoseconds.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AAEH;;;;;GAKG;AACH,OAAO,CAAC,MAAM,gBAAgB,EAAE,OAAO,MAAM,CAAC;AAE9C,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG;IAAE,QAAQ,CAAC,CAAC,gBAAgB,CAAC,EAAE,aAAa,CAAA;CAAE,CAAC;AAOlF;;GAEG;AACH,yBAAiB,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"Nanoseconds.d.ts","sourceRoot":"","sources":["../../../src/lib/buffer/Nanoseconds.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AAEH;;;;;GAKG;AACH,OAAO,CAAC,MAAM,gBAAgB,EAAE,OAAO,MAAM,CAAC;AAE9C,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG;IAAE,QAAQ,CAAC,CAAC,gBAAgB,CAAC,EAAE,aAAa,CAAA;CAAE,CAAC;AAOlF;;GAEG;AACH,yBAAiB,WAAW,CAAC,CAAC;IAC5B;;;;;;;;;;;;;;;;;;;;OAoBG;IACH,SAAgB,GAAG,IAAI,WAAW,CAMjC;IAED;;;;;;;;;;OAUG;IACH,SAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,WAAW,CAEtD;IAED;;;;;;;;OAQG;IACH,SAAgB,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW,CAEjD;IAED;;;;;OAKG;IACH,SAAgB,QAAQ,CAAC,KAAK,EAAE,WAAW,GAAG,MAAM,CAEnD;IAED;;;;;OAKG;IACH,SAAgB,QAAQ,CAAC,KAAK,EAAE,WAAW,GAAG,MAAM,CAEnD;CACF"}
|
|
@@ -1,3 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Nanoseconds branded type for type-safe timestamp handling
|
|
3
|
+
*
|
|
4
|
+
* Prevents accidental unit mixing (milliseconds vs nanoseconds) and provides
|
|
5
|
+
* a centralized location for timestamp conversion utilities.
|
|
6
|
+
*
|
|
7
|
+
* This is a generic buffer concept used for high-precision time-series data.
|
|
8
|
+
*
|
|
9
|
+
* **Benefits:**
|
|
10
|
+
* - Type safety prevents mixing time units
|
|
11
|
+
* - Self-documenting code - units clear from type
|
|
12
|
+
* - Zero runtime overhead on hot path (BigInt operations are fast)
|
|
13
|
+
* - Conversion functions centralized and tested
|
|
14
|
+
* - Works with Arrow's TimestampNanosecond type
|
|
15
|
+
*
|
|
16
|
+
* **Precision:**
|
|
17
|
+
* - BigInt can represent arbitrarily large integers
|
|
18
|
+
* - Nanoseconds since epoch will never overflow
|
|
19
|
+
* - Node.js: Native nanosecond precision via process.hrtime.bigint()
|
|
20
|
+
* - Browser: Microsecond precision via performance.now() (last 3 digits are 000)
|
|
21
|
+
*
|
|
22
|
+
* @module nanoseconds
|
|
23
|
+
*
|
|
24
|
+
* @example
|
|
25
|
+
* ```typescript
|
|
26
|
+
* import { Nanoseconds } from '@smoothbricks/arrow-builder';
|
|
27
|
+
*
|
|
28
|
+
* // Node.js: Native nanoseconds
|
|
29
|
+
* const timestamp = Nanoseconds.now();
|
|
30
|
+
*
|
|
31
|
+
* // Store in buffer (BigInt64Array)
|
|
32
|
+
* buffer.timestamps[idx] = timestamp; // Type-safe!
|
|
33
|
+
* ```
|
|
34
|
+
*/
|
|
1
35
|
function toNanoseconds(value) {
|
|
2
36
|
return value;
|
|
3
37
|
}
|
|
@@ -1 +1,22 @@
|
|
|
1
|
+
//#region smoo/lmao!n/buffer-strategy
|
|
2
|
+
/**
|
|
3
|
+
* BufferStrategy - Abstraction for SpanBuffer memory management and Arrow conversion.
|
|
4
|
+
*
|
|
5
|
+
* This interface separates memory management concerns from sink concerns (Tracer):
|
|
6
|
+
* - BufferStrategy: HOW buffers are allocated and converted (JS TypedArrays vs WASM)
|
|
7
|
+
* - Tracer (sink): WHAT happens with completed buffers (stdio, queue, test accumulation)
|
|
8
|
+
*
|
|
9
|
+
* Key responsibilities:
|
|
10
|
+
* 1. Buffer creation (root, child, overflow)
|
|
11
|
+
* 2. Arrow conversion (strategy knows optimal path)
|
|
12
|
+
* 3. Buffer release (GC for JS, freelist for WASM)
|
|
13
|
+
*
|
|
14
|
+
* The sink (Tracer subclass) controls WHEN to convert and release:
|
|
15
|
+
* - StdioTracer: prints then releases immediately
|
|
16
|
+
* - TestTracer: holds buffers until clear()
|
|
17
|
+
* - SqsTracer: accumulates, converts on flush(), then releases
|
|
18
|
+
*
|
|
19
|
+
* @module bufferStrategy
|
|
20
|
+
*/
|
|
1
21
|
export {};
|
|
22
|
+
//#endregion smoo/lmao!n/buffer-strategy
|
|
@@ -1,3 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Capacity Tuning - Self-tuning buffer capacity based on utilization
|
|
3
|
+
*
|
|
4
|
+
* Per specs/lmao/01b2_buffer_self_tuning.md:
|
|
5
|
+
* - Track row utilization = totalWrites / (spansCreated * usableRowsPerSpan)
|
|
6
|
+
* - Increase capacity if utilization > 150% (regularly overflowing)
|
|
7
|
+
* - Decrease capacity if utilization < 50% (wasting space)
|
|
8
|
+
* - Maintain power-of-2 capacities between 8 and 1024
|
|
9
|
+
*
|
|
10
|
+
* ## Utilization Model
|
|
11
|
+
*
|
|
12
|
+
* - 100% = exactly filling first buffer per span (ideal)
|
|
13
|
+
* - 150% = filling 1.5x first buffer (some spans overflow)
|
|
14
|
+
* - 200% = filling 2x first buffer (every span overflows once)
|
|
15
|
+
* - 50% = only using half the first buffer (wasting space)
|
|
16
|
+
*
|
|
17
|
+
* The 3x gap between shrink (50%) and grow (150%) thresholds prevents flip-flopping:
|
|
18
|
+
* - After grow: utilization halves → lands in stable zone
|
|
19
|
+
* - After shrink: utilization doubles → lands in stable zone
|
|
20
|
+
*
|
|
21
|
+
* ## Architecture Note
|
|
22
|
+
*
|
|
23
|
+
* Stats are on SpanBufferClass.stats (static property), NOT on LogBinding.
|
|
24
|
+
* This reduces per-instance memory and avoids sync bugs from having two stat objects.
|
|
25
|
+
*/
|
|
1
26
|
//#region smoo/lmao!n/buffer-tuning-capacity
|
|
2
27
|
/** Minimum spans needed before tuning decisions */
|
|
3
28
|
const MIN_SPANS_FOR_TUNING = 10;
|
|
@@ -64,3 +89,4 @@ export function shouldTuneCapacity(stats) {
|
|
|
64
89
|
resetStats(stats);
|
|
65
90
|
}
|
|
66
91
|
}
|
|
92
|
+
//#endregion smoo/lmao!n/buffer-tuning-capacity
|
|
@@ -34,8 +34,8 @@ export function cleanupDebugActiveHandles(label) {
|
|
|
34
34
|
if (typeof handle !== 'object' || handle === null) {
|
|
35
35
|
return typeof handle;
|
|
36
36
|
}
|
|
37
|
-
const
|
|
38
|
-
const name = typeof
|
|
37
|
+
const handleConstructor = Reflect.get(handle, 'constructor');
|
|
38
|
+
const name = typeof handleConstructor === 'function' ? Reflect.get(handleConstructor, 'name') : undefined;
|
|
39
39
|
return typeof name === 'string' && name.length > 0 ? name : 'Object';
|
|
40
40
|
});
|
|
41
41
|
cleanupDebug(label, { activeHandleCount: handles.length, activeHandles: names });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"classSplit.d.ts","sourceRoot":"","sources":["../../../src/lib/cloudflare/classSplit.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,EAAW,KAAK,MAAM,EAAE,MAAM,cAAc,CAAC;AACpD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAClE,OAAO,KAAK,EAAE,YAAY,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAChG,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAChE,OAAO,EAAyB,KAAK,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAEtE,MAAM,MAAM,aAAa,GAAG,eAAe,GAAG,YAAY,CAAC;AAE3D,uEAAuE;AACvE,MAAM,MAAM,kBAAkB,GAAG,CAAC,GAAG,EAAE,QAAQ,KAAK,aAAa,CAAC;AAKlE,MAAM,WAAW,iBAAiB,CAChC,CAAC,SAAS,OAAO,wBAAwB,EAAE,SAAS,GAAG,OAAO,wBAAwB,EAAE,SAAS,CACjG,SAAQ,aAAa,CAAC,CAAC,CAAC;IACxB,SAAS,EAAE,eAAe,CAAC;IAC3B,WAAW,EAAE,mBAAmB,CAAC;IACjC,QAAQ,EAAE,kBAAkB,CAAC;IAC7B,0FAA0F;IAC1F,qBAAqB,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,QAAQ,EAAE,KAAK,IAAI,CAAC;IAC5E;;;;OAIG;IACH,yBAAyB,CAAC,EAAE,CAAC,OAAO,EAAE,oBAAoB,EAAE,IAAI,EAAE,SAAS,QAAQ,EAAE,KAAK,IAAI,CAAC;CAChG;AAOD;;;;;GAKG;AACH,qBAAa,gBAAgB,CAAC,CAAC,SAAS,gBAAgB,GAAG,gBAAgB,CAAE,SAAQ,gBAAgB,CAAC,CAAC,CAAC;IACtG,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAkB;IAC5C,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAsB;IAClD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAqB;IAC9C,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAAoE;IAC1G,OAAO,CAAC,QAAQ,CAAC,yBAAyB,CAE5B;IACd,OAAO,CAAC,qBAAqB,CAAkB;
|
|
1
|
+
{"version":3,"file":"classSplit.d.ts","sourceRoot":"","sources":["../../../src/lib/cloudflare/classSplit.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,EAAW,KAAK,MAAM,EAAE,MAAM,cAAc,CAAC;AACpD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAClE,OAAO,KAAK,EAAE,YAAY,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAChG,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAChE,OAAO,EAAyB,KAAK,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAEtE,MAAM,MAAM,aAAa,GAAG,eAAe,GAAG,YAAY,CAAC;AAE3D,uEAAuE;AACvE,MAAM,MAAM,kBAAkB,GAAG,CAAC,GAAG,EAAE,QAAQ,KAAK,aAAa,CAAC;AAKlE,MAAM,WAAW,iBAAiB,CAChC,CAAC,SAAS,OAAO,wBAAwB,EAAE,SAAS,GAAG,OAAO,wBAAwB,EAAE,SAAS,CACjG,SAAQ,aAAa,CAAC,CAAC,CAAC;IACxB,SAAS,EAAE,eAAe,CAAC;IAC3B,WAAW,EAAE,mBAAmB,CAAC;IACjC,QAAQ,EAAE,kBAAkB,CAAC;IAC7B,0FAA0F;IAC1F,qBAAqB,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,QAAQ,EAAE,KAAK,IAAI,CAAC;IAC5E;;;;OAIG;IACH,yBAAyB,CAAC,EAAE,CAAC,OAAO,EAAE,oBAAoB,EAAE,IAAI,EAAE,SAAS,QAAQ,EAAE,KAAK,IAAI,CAAC;CAChG;AAOD;;;;;GAKG;AACH,qBAAa,gBAAgB,CAAC,CAAC,SAAS,gBAAgB,GAAG,gBAAgB,CAAE,SAAQ,gBAAgB,CAAC,CAAC,CAAC;IACtG,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAkB;IAC5C,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAsB;IAClD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAqB;IAC9C,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAAoE;IAC1G,OAAO,CAAC,QAAQ,CAAC,yBAAyB,CAE5B;IACd,OAAO,CAAC,qBAAqB,CAAkB;IAE/C,YAAY,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,iBAAiB,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,WAAW,CAAC,CAAC,EAO/E;IAED,OAAO,CAAC,gBAAgB;IAiBxB;;;;;OAKG;IACG,cAAc,IAAI,OAAO,CAAC,MAAM,CAAC,YAAY,GAAG,IAAI,EAAE,oBAAoB,CAAC,CAAC,CAKjF;IAED;;;;;OAKG;IACY,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAmBpC;CACF"}
|
|
@@ -1,3 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Class-split flush adapter — routes each completed root buffer's rows by delivery class.
|
|
3
|
+
*
|
|
4
|
+
* Per specs/lmao/01u_cloudflare_trace_segments.md §Delivery Classes every trace row belongs to
|
|
5
|
+
* exactly one class:
|
|
6
|
+
* - billing-grade rows go to the CollectorClient, AWAITED within the request via
|
|
7
|
+
* `settleBillable()` before/alongside response completion — an Err fails the billable request
|
|
8
|
+
* (backpressure ownership: never silently queue billing-grade rows in the isolate)
|
|
9
|
+
* - diagnostic rows go to the drain transport lazily, on the waitUntil-scheduled `flush()`
|
|
10
|
+
*
|
|
11
|
+
* The classifier is an injected function: the spec fixes the CLASSES, not the classification
|
|
12
|
+
* mechanism, so the mapping from row to class stays a seam (constructor-injected like the
|
|
13
|
+
* transports).
|
|
14
|
+
*
|
|
15
|
+
* Canonical request flow (01s wrapper seam):
|
|
16
|
+
* const settled = await tracer.settleBillable(); // before returning the response
|
|
17
|
+
* if (settled instanceof Err) return failBillableRequest(settled.error);
|
|
18
|
+
* ctx.waitUntil(tracer.flush()); // diagnostics, fire-and-forget
|
|
19
|
+
*/
|
|
1
20
|
import { Err, Ok } from '../result.js';
|
|
2
21
|
import { ArrayQueueTracer } from '../tracers/ArrayQueueTracer.js';
|
|
3
22
|
import { spanBufferToTraceRows } from './traceRows.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"collectorClient.d.ts","sourceRoot":"","sources":["../../../src/lib/cloudflare/collectorClient.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAW,KAAK,MAAM,EAAE,MAAM,cAAc,CAAC;AACpD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAE/C,oFAAoF;AACpF,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAC;CACxB;AAED,8EAA8E;AAC9E,eAAO,MAAM,aAAa,EAAE,YAAgC,CAAC;AAE7D,oFAAoF;AACpF,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,IAAI,EAAE,uBAAuB,GAAG,oBAAoB,CAAC;IAC9D,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED;;;;;GAKG;AACH,MAAM,WAAW,eAAe;IAC9B,IAAI,CAAC,IAAI,EAAE,SAAS,QAAQ,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,YAAY,EAAE,oBAAoB,CAAC,CAAC,CAAC;CACtF;AAOD;;;;;;;;GAQG;AACH,qBAAa,mBAAoB,YAAW,eAAe;IACzD,4DAA4D;IAC5D,QAAQ,CAAC,KAAK,EAAE,CAAC,SAAS,QAAQ,EAAE,CAAC,EAAE,CAAM;IAE7C,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA8B;IACvD,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAkB;IACvC,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,SAAS,CAAK;IAEtB,0EAA0E;IAC1E,QAAQ,CAAC,OAAO,EAAE,oBAAoB,GAAG,IAAI;
|
|
1
|
+
{"version":3,"file":"collectorClient.d.ts","sourceRoot":"","sources":["../../../src/lib/cloudflare/collectorClient.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAW,KAAK,MAAM,EAAE,MAAM,cAAc,CAAC;AACpD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAE/C,oFAAoF;AACpF,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAC;CACxB;AAED,8EAA8E;AAC9E,eAAO,MAAM,aAAa,EAAE,YAAgC,CAAC;AAE7D,oFAAoF;AACpF,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,IAAI,EAAE,uBAAuB,GAAG,oBAAoB,CAAC;IAC9D,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED;;;;;GAKG;AACH,MAAM,WAAW,eAAe;IAC9B,IAAI,CAAC,IAAI,EAAE,SAAS,QAAQ,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,YAAY,EAAE,oBAAoB,CAAC,CAAC,CAAC;CACtF;AAOD;;;;;;;;GAQG;AACH,qBAAa,mBAAoB,YAAW,eAAe;IACzD,4DAA4D;IAC5D,QAAQ,CAAC,KAAK,EAAE,CAAC,SAAS,QAAQ,EAAE,CAAC,EAAE,CAAM;IAE7C,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA8B;IACvD,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAkB;IACvC,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,SAAS,CAAK;IAEtB,0EAA0E;IAC1E,QAAQ,CAAC,OAAO,EAAE,oBAAoB,GAAG,IAAI,CAE5C;IAED,0DAA0D;IAC1D,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAE3B;IAED,8EAA8E;IAC9E,SAAS,IAAI,IAAI,CAEhB;IAED,uDAAuD;IACvD,IAAI,YAAY,IAAI,MAAM,CAEzB;IAED,qDAAqD;IACrD,OAAO,IAAI,IAAI,CAKd;IAED,6DAA6D;IAC7D,UAAU,CAAC,OAAO,EAAE,oBAAoB,GAAG,IAAI,CAI9C;IAEK,IAAI,CAAC,IAAI,EAAE,SAAS,QAAQ,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,YAAY,EAAE,oBAAoB,CAAC,CAAC,CAazF;CACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"diagnosticDrain.d.ts","sourceRoot":"","sources":["../../../src/lib/cloudflare/diagnosticDrain.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,EAA2B,KAAK,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AAC/F,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAClE,OAAO,EAAyB,KAAK,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAEtE,oGAAoG;AACpG,MAAM,MAAM,mBAAmB,GAAG,CAAC,IAAI,EAAE,QAAQ,EAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;AAEtE,+FAA+F;AAC/F,MAAM,WAAW,mBAAmB;IAClC,IAAI,CAAC,IAAI,EAAE,SAAS,QAAQ,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAChD;AAED,8FAA8F;AAC9F,qBAAa,wBAAyB,YAAW,mBAAmB;IACtD,OAAO,CAAC,QAAQ,CAAC,YAAY;
|
|
1
|
+
{"version":3,"file":"diagnosticDrain.d.ts","sourceRoot":"","sources":["../../../src/lib/cloudflare/diagnosticDrain.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,EAA2B,KAAK,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AAC/F,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAClE,OAAO,EAAyB,KAAK,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAEtE,oGAAoG;AACpG,MAAM,MAAM,mBAAmB,GAAG,CAAC,IAAI,EAAE,QAAQ,EAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;AAEtE,+FAA+F;AAC/F,MAAM,WAAW,mBAAmB;IAClC,IAAI,CAAC,IAAI,EAAE,SAAS,QAAQ,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAChD;AAED,8FAA8F;AAC9F,qBAAa,wBAAyB,YAAW,mBAAmB;IACtD,OAAO,CAAC,QAAQ,CAAC,YAAY;IAAzC,YAA6B,YAAY,EAAE,mBAAmB,EAAI;IAElE,IAAI,CAAC,IAAI,EAAE,SAAS,QAAQ,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAG7C;CACF;AAED,kGAAkG;AAClG,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,QAAQ,EAAE,kBAAkB,CAAC;IACtC,QAAQ,CAAC,IAAI,EAAE,SAAS,QAAQ,EAAE,CAAC;CACpC;AAED,MAAM,WAAW,qBAAqB;IACpC,oFAAoF;IACpF,OAAO,EAAE,MAAM,CAAC;IAChB,sFAAsF;IACtF,iBAAiB,EAAE,MAAM,CAAC;IAC1B,wEAAwE;IACxE,WAAW,EAAE,CAAC,OAAO,EAAE,sBAAsB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACjE;AAwBD;;;;;GAKG;AACH,qBAAa,uBAAwB,YAAW,mBAAmB;IACrD,OAAO,CAAC,QAAQ,CAAC,OAAO;IAApC,YAA6B,OAAO,EAAE,qBAAqB,EAI1D;IAEK,IAAI,CAAC,IAAI,EAAE,SAAS,QAAQ,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAcnD;CACF;AAED,MAAM,WAAW,sBAAsB,CACrC,CAAC,SAAS,OAAO,wBAAwB,EAAE,SAAS,GAAG,OAAO,wBAAwB,EAAE,SAAS,CACjG,SAAQ,aAAa,CAAC,CAAC,CAAC;IACxB,SAAS,EAAE,mBAAmB,CAAC;IAC/B,8FAA8F;IAC9F,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,QAAQ,EAAE,KAAK,IAAI,CAAC;CACnE;AAED;;;;;GAKG;AACH,qBAAa,qBAAqB,CAAC,CAAC,SAAS,gBAAgB,GAAG,gBAAgB,CAAE,SAAQ,gBAAgB,CAAC,CAAC,CAAC;IAC3G,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAsB;IAChD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAoE;IAEhG,YAAY,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,sBAAsB,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,WAAW,CAAC,CAAC,EAIpF;IAEc,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAepC;CACF"}
|
|
@@ -53,7 +53,7 @@ function timestampBoundsMs(rows) {
|
|
|
53
53
|
}
|
|
54
54
|
if (minNs === Number.POSITIVE_INFINITY)
|
|
55
55
|
return { startedAtMs: 0, endedAtMs: 0 };
|
|
56
|
-
return { startedAtMs: Math.floor(minNs /
|
|
56
|
+
return { startedAtMs: Math.floor(minNs / 1000000), endedAtMs: Math.floor(maxNs / 1000000) };
|
|
57
57
|
}
|
|
58
58
|
/**
|
|
59
59
|
* Queues-fallback transport: rows are batched into chunk-envelope messages.
|
|
@@ -91,7 +91,7 @@ type BlockedJsonView = {
|
|
|
91
91
|
export declare class Blocked extends Error implements TaggedError<'Blocked'> {
|
|
92
92
|
/** The reason this Op is blocked */
|
|
93
93
|
readonly reason: BlockedReason;
|
|
94
|
-
static readonly _tag:
|
|
94
|
+
static readonly _tag: 'Blocked';
|
|
95
95
|
get _tag(): 'Blocked';
|
|
96
96
|
/** Retry configuration */
|
|
97
97
|
readonly blockedConfig: BlockedConfig | undefined;
|
|
@@ -1 +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;AAGhD;;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
|
|
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;AAGhD;;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;IAElD;IACE,oCAAoC;IAC3B,MAAM,EAAE,aAAa;IAC9B,mCAAmC;IACnC,MAAM,CAAC,EAAE,aAAa,EAKvB;IAED,6DAA6D;IAC7D,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,aAAa,GAAG,OAAO,CAE5D;IAED,kEAAkE;IAClE,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,aAAa,GAAG,OAAO,CAE5D;IAED,wDAAwD;IACxD,MAAM,CAAC,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,aAAa,GAAG,OAAO,CAE/D;IAWD,sCAAsC;IACtC,MAAM,IAAI,eAAe,CAcxB;CACF"}
|
|
@@ -1,3 +1,55 @@
|
|
|
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
|
+
*/
|
|
1
53
|
/**
|
|
2
54
|
* Convert a blocked reason union into its display name.
|
|
3
55
|
*/
|
|
@@ -66,3 +118,4 @@ export class Blocked extends Error {
|
|
|
66
118
|
};
|
|
67
119
|
}
|
|
68
120
|
}
|
|
121
|
+
//#endregion smoo/lmao!n/op-context-tagged-errors.blocked
|
|
@@ -1 +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;
|
|
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;IAEjB,YAAY,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAK3B;IAED;;;OAGG;IACH,IAAI,IAAI,IAAI,CAAC,CAEZ;IAMD,MAAM,IAAI,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC,CAE5B;CACF;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"}
|
|
@@ -1,3 +1,34 @@
|
|
|
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
|
+
*/
|
|
1
32
|
/**
|
|
2
33
|
* Error instance created by a Code constructor.
|
|
3
34
|
*
|
|
@@ -51,7 +51,7 @@ export declare class RetriesExhausted extends Error implements TaggedError<'Retr
|
|
|
51
51
|
readonly attempts: number;
|
|
52
52
|
/** Max attempts that was configured (the limit that was hit) */
|
|
53
53
|
readonly maxAttempts: number;
|
|
54
|
-
static readonly _tag:
|
|
54
|
+
static readonly _tag: 'RetriesExhausted';
|
|
55
55
|
get _tag(): 'RetriesExhausted';
|
|
56
56
|
constructor(
|
|
57
57
|
/** The original blocked reason */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RetriesExhausted.d.ts","sourceRoot":"","sources":["../../../src/lib/errors/RetriesExhausted.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,KAAK,aAAa,EAAwB,MAAM,cAAc,CAAC;AAExE,KAAK,oBAAoB,GAAG;IAC1B,IAAI,EAAE,kBAAkB,CAAC;IACzB,MAAM,EAAE,aAAa,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF,qBAAa,gBAAiB,SAAQ,KAAM,YAAW,WAAW,CAAC,kBAAkB,CAAC;IAQlF,kCAAkC;IAClC,QAAQ,CAAC,MAAM,EAAE,aAAa;IAC9B,kCAAkC;IAClC,QAAQ,CAAC,QAAQ,EAAE,MAAM;IACzB,gEAAgE;IAChE,QAAQ,CAAC,WAAW,EAAE,MAAM;IAZ9B,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAG,kBAAkB,CAAU;IAEnD,IAAI,IAAI,IAAI,kBAAkB,CAE7B
|
|
1
|
+
{"version":3,"file":"RetriesExhausted.d.ts","sourceRoot":"","sources":["../../../src/lib/errors/RetriesExhausted.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,KAAK,aAAa,EAAwB,MAAM,cAAc,CAAC;AAExE,KAAK,oBAAoB,GAAG;IAC1B,IAAI,EAAE,kBAAkB,CAAC;IACzB,MAAM,EAAE,aAAa,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF,qBAAa,gBAAiB,SAAQ,KAAM,YAAW,WAAW,CAAC,kBAAkB,CAAC;IAQlF,kCAAkC;IAClC,QAAQ,CAAC,MAAM,EAAE,aAAa;IAC9B,kCAAkC;IAClC,QAAQ,CAAC,QAAQ,EAAE,MAAM;IACzB,gEAAgE;IAChE,QAAQ,CAAC,WAAW,EAAE,MAAM;IAZ9B,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAG,kBAAkB,CAAU;IAEnD,IAAI,IAAI,IAAI,kBAAkB,CAE7B;IAED;IACE,kCAAkC;IACzB,MAAM,EAAE,aAAa;IAC9B,kCAAkC;IACzB,QAAQ,EAAE,MAAM;IACzB,gEAAgE;IACvD,WAAW,EAAE,MAAM,EAI7B;IAOD,sCAAsC;IACtC,MAAM,IAAI,oBAAoB,CAE7B;CACF"}
|
|
@@ -1,3 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Retries exhausted error - returned when a Blocked error has exceeded max attempts.
|
|
3
|
+
*
|
|
4
|
+
* When an Op repeatedly returns `Blocked` and the retry config's `maxAttempts`
|
|
5
|
+
* is exhausted, the retry layer converts the final failure to `RetriesExhausted`.
|
|
6
|
+
*
|
|
7
|
+
* Unlike `Blocked`, this represents a permanent failure that callers must handle
|
|
8
|
+
* (e.g., compensate, alert, escalate, return error to caller).
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* ```typescript
|
|
12
|
+
* import { defineOpContext, S, Err } from '@smoothbricks/lmao';
|
|
13
|
+
* import { Blocked } from '@smoothbricks/lmao/errors/Blocked';
|
|
14
|
+
* import { RetriesExhausted } from '@smoothbricks/lmao/errors/RetriesExhausted';
|
|
15
|
+
*
|
|
16
|
+
* const { defineOp } = defineOpContext({
|
|
17
|
+
* logSchema: { service: S.category() },
|
|
18
|
+
* ctx: { env: null as Env },
|
|
19
|
+
* });
|
|
20
|
+
*
|
|
21
|
+
* // Op that may be blocked by external service
|
|
22
|
+
* const callPaymentApi = defineOp('callPaymentApi', async (ctx, amount: number) => {
|
|
23
|
+
* const health = await checkHealth('payment-api');
|
|
24
|
+
* if (!health.available) {
|
|
25
|
+
* return new Err(Blocked.service('payment-api'));
|
|
26
|
+
* }
|
|
27
|
+
* const result = await ctx.deps.http.post('/pay', { amount });
|
|
28
|
+
* return ctx.ok(result);
|
|
29
|
+
* });
|
|
30
|
+
*
|
|
31
|
+
* // Caller handles permanent failure after retries exhausted
|
|
32
|
+
* const result = await trace('checkout', checkoutOp);
|
|
33
|
+
* if (result.isErr(RetriesExhausted)) {
|
|
34
|
+
* ctx.log.error(`Payment failed after ${result.error.attempts} attempts`);
|
|
35
|
+
* return ctx.err('PAYMENT_UNAVAILABLE', { service: result.error.reason });
|
|
36
|
+
* }
|
|
37
|
+
* ```
|
|
38
|
+
*/
|
|
1
39
|
import { getBlockedReasonName } from './Blocked.js';
|
|
2
40
|
export class RetriesExhausted extends Error {
|
|
3
41
|
reason;
|
|
@@ -48,9 +48,9 @@ export declare class TransientError<C extends string, D = void> extends CodeErro
|
|
|
48
48
|
readonly policy: RetryPolicy;
|
|
49
49
|
constructor(code: C, data: D, policy: RetryPolicy);
|
|
50
50
|
toJSON(): {
|
|
51
|
-
policy: RetryPolicy;
|
|
52
51
|
code: C;
|
|
53
52
|
data: D;
|
|
53
|
+
policy: RetryPolicy;
|
|
54
54
|
};
|
|
55
55
|
}
|
|
56
56
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Transient.d.ts","sourceRoot":"","sources":["../../../src/lib/errors/Transient.ts"],"names":[],"mappings":"AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AAC3D,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAe,KAAK,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAElE;;;;;;;;;GASG;AACH,qBAAa,cAAc,CAAC,CAAC,SAAS,MAAM,EAAE,CAAC,GAAG,IAAI,CAAE,SAAQ,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC;IAC7E;;;OAGG;IACH,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"Transient.d.ts","sourceRoot":"","sources":["../../../src/lib/errors/Transient.ts"],"names":[],"mappings":"AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AAC3D,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAe,KAAK,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAElE;;;;;;;;;GASG;AACH,qBAAa,cAAc,CAAC,CAAC,SAAS,MAAM,EAAE,CAAC,GAAG,IAAI,CAAE,SAAQ,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC;IAC7E;;;OAGG;IACH,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;IAE7B,YAAY,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,WAAW,EAIhD;IAEQ,MAAM;;;;MAKd;CACF;AAED;;;GAGG;AACH,MAAM,WAAW,oBAAoB,CAAC,CAAC,SAAS,MAAM,EAAE,CAAC,GAAG,IAAI,CAAE,SAAQ,sBAAsB,CAAC,cAAc,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACpH,oEAAoE;IACpE,CAAC,IAAI,EAAE,CAAC,EAAE,cAAc,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,GAAG,cAAc,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACvE,gCAAgC;IAChC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;IACjB,+CAA+C;IAC/C,QAAQ,CAAC,aAAa,EAAE,WAAW,CAAC;CACrC;AAED;;GAEG;AACH,MAAM,WAAW,wBAAwB,CAAC,CAAC,SAAS,MAAM,CAAE,SAAQ,sBAAsB,CAAC,cAAc,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;IACjH,2DAA2D;IAC3D,CAAC,cAAc,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,GAAG,cAAc,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;IACjE,gCAAgC;IAChC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;IACjB,+CAA+C;IAC/C,QAAQ,CAAC,aAAa,EAAE,WAAW,CAAC;CACrC;AAED,KAAK,sBAAsB,CAAC,CAAC,SAAS,MAAM,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,GACpE,oBAAoB,CAAC,CAAC,EAAE,CAAC,CAAC,GAC1B,SAAS,SAAS,CAAC,GACjB,wBAAwB,CAAC,CAAC,CAAC,GAC3B,oBAAoB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAEjC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,wBAAgB,SAAS,CAAC,CAAC,SAAS,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,aAAa,EAAE,WAAW,GAAG,wBAAwB,CAAC,CAAC,CAAC,CAAC;AAC9G,wBAAgB,SAAS,CAAC,CAAC,EAAE,CAAC,SAAS,MAAM,GAAG,MAAM,EACpD,IAAI,EAAE,CAAC,EACP,aAAa,EAAE,WAAW,GACzB,sBAAsB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAmChC,OAAO,EAAE,kBAAkB,EAAE,UAAU,EAAE,aAAa,EAAE,WAAW,EAAE,KAAK,WAAW,EAAE,MAAM,mBAAmB,CAAC"}
|
|
@@ -1,3 +1,33 @@
|
|
|
1
|
+
//#region smoo/lmao!n/op-retry.transient
|
|
2
|
+
/**
|
|
3
|
+
* TransientError - typed transient error codes with embedded retry policy.
|
|
4
|
+
*
|
|
5
|
+
* Use the `Transient()` factory to define transient error codes WITH default retry policy.
|
|
6
|
+
* Op class checks `instanceof TransientError` and reads `error.policy` for retry config.
|
|
7
|
+
*
|
|
8
|
+
* @example
|
|
9
|
+
* ```typescript
|
|
10
|
+
* import { Transient, exponentialBackoff, fixedDelay } from '@smoothbricks/lmao/errors/Transient';
|
|
11
|
+
*
|
|
12
|
+
* // Define error with default exponential backoff (5 attempts)
|
|
13
|
+
* const SERVICE_UNAVAILABLE = Transient<{ service: string }>('SERVICE_UNAVAILABLE', exponentialBackoff(5));
|
|
14
|
+
*
|
|
15
|
+
* // Define error with fixed delay for rate limiting
|
|
16
|
+
* const RATE_LIMITED = Transient<{ retryAfter?: number }>('RATE_LIMITED', fixedDelay(3, 5000));
|
|
17
|
+
*
|
|
18
|
+
* // Usage - data only, uses default policy
|
|
19
|
+
* ctx.err(SERVICE_UNAVAILABLE({ service: 'api' }));
|
|
20
|
+
*
|
|
21
|
+
* // Override policy for this specific call (e.g., use Retry-After header)
|
|
22
|
+
* ctx.err(RATE_LIMITED({ retryAfter: 60000 }, fixedDelay(1, 60000)));
|
|
23
|
+
*
|
|
24
|
+
* // Op class detects transient and reads policy
|
|
25
|
+
* if (result.error instanceof TransientError) {
|
|
26
|
+
* const { maxAttempts, backoff, baseDelayMs } = result.error.policy;
|
|
27
|
+
* // Execute retry loop based on policy
|
|
28
|
+
* }
|
|
29
|
+
* ```
|
|
30
|
+
*/
|
|
1
31
|
import { CodeError } from './CodeError.js';
|
|
2
32
|
import { mergePolicy } from './retry-policy.js';
|
|
3
33
|
/**
|
|
@@ -52,3 +82,4 @@ function isRetryPolicyLike(value) {
|
|
|
52
82
|
}
|
|
53
83
|
// Re-export policy helpers for convenience
|
|
54
84
|
export { exponentialBackoff, fixedDelay, linearBackoff, mergePolicy } from './retry-policy.js';
|
|
85
|
+
//#endregion smoo/lmao!n/op-retry.transient
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"flushScheduler.d.ts","sourceRoot":"","sources":["../../src/lib/flushScheduler.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAU,KAAK,KAAK,EAAoB,MAAM,mBAAmB,CAAC;AAKzE,OAAO,KAAK,EAAE,aAAa,EAAc,MAAM,YAAY,CAAC;AAuC5D;;;GAGG;AACH,MAAM,MAAM,YAAY,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,aAAa,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;AAE3F;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,UAAU,GAAG,MAAM,GAAG,QAAQ,GAAG,MAAM,GAAG,QAAQ,CAAC;IAChE,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC;;;OAGG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAE1B;;;OAGG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAE1B;;;;OAIG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAE3B;;;OAGG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;IAExB;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB;;;OAGG;IACH,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAElC;;;;OAIG;IACH,uBAAuB,CAAC,EAAE,MAAM,CAAC;CAClC;AAED;;;GAGG;AAEH,qBAAa,cAAc;IACzB,OAAO,CAAC,MAAM,CAAiC;IAC/C,OAAO,CAAC,OAAO,CAAe;IAE9B,OAAO,CAAC,OAAO,CAA4B;IAC3C,OAAO,CAAC,aAAa,CAAc;IACnC,OAAO,CAAC,gBAAgB,CAAc;IACtC,OAAO,CAAC,UAAU,CAAC,CAAiB;IACpC,OAAO,CAAC,SAAS,CAAC,CAAiB;IACnC,OAAO,CAAC,WAAW,CAAC,CAAiB;IACrC,OAAO,CAAC,SAAS,CAAS;IAE1B,wDAAwD;IACxD,OAAO,CAAC,WAAW,CAAK;IAExB;;;;OAIG;IACH,OAAO,CAAC,+BAA+B,CAAgD;
|
|
1
|
+
{"version":3,"file":"flushScheduler.d.ts","sourceRoot":"","sources":["../../src/lib/flushScheduler.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAU,KAAK,KAAK,EAAoB,MAAM,mBAAmB,CAAC;AAKzE,OAAO,KAAK,EAAE,aAAa,EAAc,MAAM,YAAY,CAAC;AAuC5D;;;GAGG;AACH,MAAM,MAAM,YAAY,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,aAAa,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;AAE3F;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,UAAU,GAAG,MAAM,GAAG,QAAQ,GAAG,MAAM,GAAG,QAAQ,CAAC;IAChE,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC;;;OAGG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAE1B;;;OAGG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAE1B;;;;OAIG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAE3B;;;OAGG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;IAExB;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB;;;OAGG;IACH,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAElC;;;;OAIG;IACH,uBAAuB,CAAC,EAAE,MAAM,CAAC;CAClC;AAED;;;GAGG;AAEH,qBAAa,cAAc;IACzB,OAAO,CAAC,MAAM,CAAiC;IAC/C,OAAO,CAAC,OAAO,CAAe;IAE9B,OAAO,CAAC,OAAO,CAA4B;IAC3C,OAAO,CAAC,aAAa,CAAc;IACnC,OAAO,CAAC,gBAAgB,CAAc;IACtC,OAAO,CAAC,UAAU,CAAC,CAAiB;IACpC,OAAO,CAAC,SAAS,CAAC,CAAiB;IACnC,OAAO,CAAC,WAAW,CAAC,CAAiB;IACrC,OAAO,CAAC,SAAS,CAAS;IAE1B,wDAAwD;IACxD,OAAO,CAAC,WAAW,CAAK;IAExB;;;;OAIG;IACH,OAAO,CAAC,+BAA+B,CAAgD;IAEvF,YAAY,OAAO,EAAE,YAAY,EAAE,MAAM,GAAE,oBAAyB,EAanE;IAED;;OAEG;IACH,QAAQ,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI,CAQpC;IAED;;OAEG;IACH,KAAK,IAAI,IAAI,CA6BZ;IAED;;OAEG;IACH,IAAI,IAAI,IAAI,CAqBX;IAED;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAE3B;IAED;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAiB5B;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAU7B;;OAEG;IACH,OAAO,CAAC,cAAc;IAatB;;;OAGG;IACH,OAAO,CAAC,mBAAmB;YAkBb,OAAO;IAqJrB;;OAEG;IACH,cAAc,IAAI,IAAI,CAErB;CACF;AASD;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,YAAY,EAAE,MAAM,CAAC,EAAE,oBAAoB,GAAG,cAAc,CAK5G;AAED;;GAEG;AACH,wBAAgB,yBAAyB,IAAI,IAAI,CAKhD;AAED;;;GAGG;AACH,eAAO,MAAM,uBAAuB;IAClC;;OAEG;IACH,aAAa,YAAY,cAAc,GAAG,MAAM,CAAC,OAAO,GAAG,SAAS;IAKpE;;OAEG;IACH,aAAa,YAAY,cAAc,SAAS,MAAM,CAAC,OAAO,GAAG,SAAS,GAAG,IAAI;IAIjF;;OAEG;IACH,mBAAmB,YAAY,cAAc,GAAG,MAAM,GAAG,SAAS;IAKlE;;OAEG;IACH,mBAAmB,YAAY,cAAc,QAAQ,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,IAAI;CAGtF,CAAC"}
|
package/dist/lib/library.js
CHANGED
package/dist/lib/logApi.js
CHANGED
|
@@ -1,3 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LogAPI - Simple logging interface for contexts that need structured logging
|
|
3
|
+
* without direct access to a SpanBuffer.
|
|
4
|
+
*
|
|
5
|
+
* Used by:
|
|
6
|
+
* - Other contexts where a simplified logging interface is needed
|
|
7
|
+
*
|
|
8
|
+
* Unlike SpanLogger which is tightly coupled to a SpanBuffer and returns
|
|
9
|
+
* FluentLogEntry for chaining, LogAPI is a simple fire-and-forget interface
|
|
10
|
+
* that can be backed by any logging implementation.
|
|
11
|
+
*/
|
|
1
12
|
/**
|
|
2
13
|
* No-op LogAPI implementation.
|
|
3
14
|
*
|
package/dist/lib/logBinding.js
CHANGED
|
@@ -1 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LogBinding - Logging infrastructure binding for ops and buffers
|
|
3
|
+
*
|
|
4
|
+
* Represents the binding between a set of operations and their logging infrastructure.
|
|
5
|
+
* Contains the schema and optional remapping support for prefixed modules.
|
|
6
|
+
*
|
|
7
|
+
* Note: Buffer stats (self-tuning capacity) are stored on SpanBufferClass.stats as static
|
|
8
|
+
* properties, NOT on LogBinding. See agent-todo/opgroup-refactor.md for rationale.
|
|
9
|
+
*
|
|
10
|
+
* Per specs:
|
|
11
|
+
* - 01b2_buffer_self_tuning.md - Self-tuning via SpanBufferClass.stats
|
|
12
|
+
* - 01e_library_integration_pattern.md - Library prefix/remapping support
|
|
13
|
+
*/
|
|
1
14
|
export {};
|
package/dist/lib/op.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"op.d.ts","sourceRoot":"","sources":["../../src/lib/op.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AACnE,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAC/D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAC;AACnE,OAAO,KAAK,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACxE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AAM7D;;;;;;GAMG;AAMH,MAAM,WAAW,UAAU;IACzB,+FAA+F;IAC/F,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,qCAAqC;IACrC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,yCAAyC;IACzC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,4BAA4B;IAC5B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,4CAA4C;IAC5C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAEtB,6DAA6D;IAC7D,QAAQ,CAAC,kBAAkB,EAAE,eAAe,CAAC;IAC7C,6DAA6D;IAC7D,QAAQ,CAAC,kBAAkB,EAAE,eAAe,CAAC;IAC7C,wDAAwD;IACxD,QAAQ,CAAC,aAAa,EAAE,eAAe,CAAC;CACzC;AAQD;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,qBAAa,EAAE,CAAC,GAAG,SAAS,SAAS,EAAE,IAAI,SAAS,OAAO,EAAE,EAAE,CAAC,EAAE,CAAC;IAE/D,oDAAoD;IACpD,QAAQ,CAAC,QAAQ,EAAE,UAAU;IAC7B,wFAAwF;IACxF,QAAQ,CAAC,eAAe,EAAE,qBAAqB;IAC/C,qGAAqG;IACrG,QAAQ,CAAC,EAAE,EAAE,CAAC,GAAG,EAAE,WAAW,CAAC,GAAG,CAAC,EAAE,GAAG,IAAI,EAAE,IAAI,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC3F,0EAA0E;IAC1E,QAAQ,CAAC,iBAAiB,CAAC,EAAE,uBAAuB;IACpD;;;;OAIG;IACH,QAAQ,CAAC,iBAAiB,CAAC,EAAE,gBAAgB
|
|
1
|
+
{"version":3,"file":"op.d.ts","sourceRoot":"","sources":["../../src/lib/op.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AACnE,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAC/D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAC;AACnE,OAAO,KAAK,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACxE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AAM7D;;;;;;GAMG;AAMH,MAAM,WAAW,UAAU;IACzB,+FAA+F;IAC/F,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,qCAAqC;IACrC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,yCAAyC;IACzC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,4BAA4B;IAC5B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,4CAA4C;IAC5C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAEtB,6DAA6D;IAC7D,QAAQ,CAAC,kBAAkB,EAAE,eAAe,CAAC;IAC7C,6DAA6D;IAC7D,QAAQ,CAAC,kBAAkB,EAAE,eAAe,CAAC;IAC7C,wDAAwD;IACxD,QAAQ,CAAC,aAAa,EAAE,eAAe,CAAC;CACzC;AAQD;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,qBAAa,EAAE,CAAC,GAAG,SAAS,SAAS,EAAE,IAAI,SAAS,OAAO,EAAE,EAAE,CAAC,EAAE,CAAC;IAE/D,oDAAoD;IACpD,QAAQ,CAAC,QAAQ,EAAE,UAAU;IAC7B,wFAAwF;IACxF,QAAQ,CAAC,eAAe,EAAE,qBAAqB;IAC/C,qGAAqG;IACrG,QAAQ,CAAC,EAAE,EAAE,CAAC,GAAG,EAAE,WAAW,CAAC,GAAG,CAAC,EAAE,GAAG,IAAI,EAAE,IAAI,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC3F,0EAA0E;IAC1E,QAAQ,CAAC,iBAAiB,CAAC,EAAE,uBAAuB;IACpD;;;;OAIG;IACH,QAAQ,CAAC,iBAAiB,CAAC,EAAE,gBAAgB;IAd/C;IACE,oDAAoD;IAC3C,QAAQ,EAAE,UAAU;IAC7B,wFAAwF;IAC/E,eAAe,EAAE,qBAAqB;IAC/C,qGAAqG;IAC5F,EAAE,EAAE,CAAC,GAAG,EAAE,WAAW,CAAC,GAAG,CAAC,EAAE,GAAG,IAAI,EAAE,IAAI,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC3F,0EAA0E;IACjE,iBAAiB,CAAC,EAAE,uBAAuB,YAAA;IACpD;;;;OAIG;IACM,iBAAiB,CAAC,EAAE,gBAAgB,YAAA,EAC3C;CACL"}
|
package/dist/lib/op.js
CHANGED
|
@@ -1,3 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Op - Traced operation class and OpMetadata
|
|
3
|
+
*
|
|
4
|
+
* This is the single source of truth for the Op class and OpMetadata interface.
|
|
5
|
+
* Other modules re-export these types for convenience.
|
|
6
|
+
*
|
|
7
|
+
* Wraps a user function with automatic span tracking.
|
|
8
|
+
* Created by defineOp() from the Op-centric API (defineOpContext).
|
|
9
|
+
*
|
|
10
|
+
* Per specs/lmao/01l_op_context_pattern.md and specs/lmao/01c_context_flow_and_op_wrappers.md:
|
|
11
|
+
* - Captures OpMetadata for attribution (package_name, package_file, git_sha, line)
|
|
12
|
+
* - fn is called by span_op() after span_op creates the SpanBuffer/SpanContext
|
|
13
|
+
* - Op name is used for metrics tracking (separate from span names)
|
|
14
|
+
*/
|
|
1
15
|
//#endregion smoo/lmao!n/opcontext-hierarchy
|
|
2
16
|
// =============================================================================
|
|
3
17
|
// Op Class
|
|
@@ -59,3 +73,4 @@ export class Op {
|
|
|
59
73
|
this._opContextBinding = _opContextBinding;
|
|
60
74
|
}
|
|
61
75
|
}
|
|
76
|
+
//#endregion smoo/lmao!n/op-class
|