@smoothbricks/lmao 0.1.4 → 0.2.1
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/cloudflare.d.ts +15 -0
- package/dist/cloudflare.d.ts.map +1 -0
- package/dist/cloudflare.js +14 -0
- 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 +73 -0
- package/dist/lib/cloudflare/classSplit.d.ts.map +1 -0
- package/dist/lib/cloudflare/classSplit.js +101 -0
- package/dist/lib/cloudflare/collectorClient.d.ts +69 -0
- package/dist/lib/cloudflare/collectorClient.d.ts.map +1 -0
- package/dist/lib/cloudflare/collectorClient.js +82 -0
- package/dist/lib/cloudflare/diagnosticDrain.d.ts +78 -0
- package/dist/lib/cloudflare/diagnosticDrain.d.ts.map +1 -0
- package/dist/lib/cloudflare/diagnosticDrain.js +120 -0
- package/dist/lib/cloudflare/traceRows.d.ts +19 -0
- package/dist/lib/cloudflare/traceRows.d.ts.map +1 -0
- package/dist/lib/cloudflare/traceRows.js +51 -0
- package/dist/lib/codegen/evaluatorGenerator.js +2 -1
- package/dist/lib/codegen/fixedPositionWriterGenerator.d.ts +8 -0
- package/dist/lib/codegen/fixedPositionWriterGenerator.d.ts.map +1 -1
- package/dist/lib/codegen/fixedPositionWriterGenerator.js +18 -1
- 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-common.d.ts +2 -0
- package/dist/lib/sqlite/sqlite-common.d.ts.map +1 -1
- package/dist/lib/sqlite/sqlite-common.js +4 -0
- 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.d.ts +5 -5
- package/dist/lib/traceRoot.es.d.ts.map +1 -1
- package/dist/lib/traceRoot.es.js +2 -1
- package/dist/lib/traceRoot.js +16 -1
- package/dist/lib/traceRoot.node.d.ts +2 -2
- package/dist/lib/traceRoot.node.d.ts.map +1 -1
- package/dist/lib/traceRoot.node.js +4 -3
- 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 +11 -4
- package/src/cloudflare.ts +35 -0
- package/src/lib/bufferStrategy.ts +2 -2
- package/src/lib/cleanupDiagnostics.ts +2 -2
- package/src/lib/cloudflare/__tests__/classSplit.test.ts +171 -0
- package/src/lib/cloudflare/__tests__/collectorClient.test.ts +104 -0
- package/src/lib/cloudflare/__tests__/diagnosticDrain.test.ts +165 -0
- package/src/lib/cloudflare/classSplit.ts +139 -0
- package/src/lib/cloudflare/collectorClient.ts +117 -0
- package/src/lib/cloudflare/diagnosticDrain.ts +152 -0
- package/src/lib/cloudflare/traceRows.ts +60 -0
- package/src/lib/codegen/__tests__/fixedPositionWriter-uint64.test.ts +304 -0
- package/src/lib/codegen/evaluatorGenerator.ts +2 -2
- package/src/lib/codegen/fixedPositionWriterGenerator.ts +26 -1
- package/src/lib/schema/defineFeatureFlags.ts +2 -2
- package/src/lib/schema/evaluator.ts +2 -2
- package/src/lib/sqlite/sqlite-common.ts +5 -0
- package/src/lib/testing/__tests__/facts.test.ts +6 -6
- package/src/lib/traceRoot.es.ts +2 -2
- package/src/lib/traceRoot.node.ts +3 -3
- package/src/lib/traceRoot.ts +5 -5
- package/src/lib/tracers/ArrayQueueTracer.ts +2 -2
- package/src/lib/codegen/__tests__/__snapshots__/spanLoggerGenerator.test.ts.snap +0 -1965
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Diagnostic-class drain adapter.
|
|
3
|
+
*
|
|
4
|
+
* Per specs/lmao/01u_cloudflare_trace_segments.md §LMAO Sink Fit: no new abstraction — the base
|
|
5
|
+
* Tracer lifecycle (onTraceEnd queueing + flush) already models this. The drain tracer extends
|
|
6
|
+
* ArrayQueueTracer; flush() drains completed root buffers, flattens them to rows, and hands them
|
|
7
|
+
* to a constructor-injected transport.
|
|
8
|
+
*
|
|
9
|
+
* Transports (per 01u §Collection Lanes and Fallbacks):
|
|
10
|
+
* - primary: a Pipelines-stream-binding-shaped send fn (`env.TRACE_STREAM.send(rows)`) — rows,
|
|
11
|
+
* because Pipelines owns batching and Parquet encoding for the raw tier
|
|
12
|
+
* - fallback: Cloudflare Queues — batched TraceChunkEnvelope messages built from the existing
|
|
13
|
+
* lib/archive primitives (chunk_id idempotency); NEVER per-span messages (128 KB messages,
|
|
14
|
+
* per-64 KB op billing make per-span ~160x more expensive)
|
|
15
|
+
*
|
|
16
|
+
* Delivery is fire-and-forget: flush() is scheduled via ctx.waitUntil and never rejects; enqueue
|
|
17
|
+
* failures surface through the onSendError hook (01s §Failure Handling — emit metrics, rely on
|
|
18
|
+
* queue policy/backoff), they never block.
|
|
19
|
+
*/
|
|
20
|
+
import { buildTraceChunkEnvelope } from '../archive/chunkEnvelope.js';
|
|
21
|
+
import { ArrayQueueTracer } from '../tracers/ArrayQueueTracer.js';
|
|
22
|
+
import { spanBufferToTraceRows } from './traceRows.js';
|
|
23
|
+
/** Primary diagnostic transport: rows straight into the injected Pipelines stream binding. */
|
|
24
|
+
export class PipelinesStreamTransport {
|
|
25
|
+
sendToStream;
|
|
26
|
+
constructor(sendToStream) {
|
|
27
|
+
this.sendToStream = sendToStream;
|
|
28
|
+
}
|
|
29
|
+
send(rows) {
|
|
30
|
+
// The binding signature takes a mutable array of records.
|
|
31
|
+
return this.sendToStream([...rows]);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
function fnv1a32Hex(input) {
|
|
35
|
+
let hash = 0x811c9dc5;
|
|
36
|
+
for (let i = 0; i < input.length; i++) {
|
|
37
|
+
hash ^= input.charCodeAt(i);
|
|
38
|
+
hash = Math.imul(hash, 0x01000193) >>> 0;
|
|
39
|
+
}
|
|
40
|
+
return hash.toString(16).padStart(8, '0');
|
|
41
|
+
}
|
|
42
|
+
function timestampBoundsMs(rows) {
|
|
43
|
+
let minNs = Number.POSITIVE_INFINITY;
|
|
44
|
+
let maxNs = Number.NEGATIVE_INFINITY;
|
|
45
|
+
for (const row of rows) {
|
|
46
|
+
const ts = row.timestamp_ns;
|
|
47
|
+
if (typeof ts !== 'number')
|
|
48
|
+
continue;
|
|
49
|
+
if (ts < minNs)
|
|
50
|
+
minNs = ts;
|
|
51
|
+
if (ts > maxNs)
|
|
52
|
+
maxNs = ts;
|
|
53
|
+
}
|
|
54
|
+
if (minNs === Number.POSITIVE_INFINITY)
|
|
55
|
+
return { startedAtMs: 0, endedAtMs: 0 };
|
|
56
|
+
return { startedAtMs: Math.floor(minNs / 1000000), endedAtMs: Math.floor(maxNs / 1000000) };
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Queues-fallback transport: rows are batched into chunk-envelope messages.
|
|
60
|
+
*
|
|
61
|
+
* The chunk_ref is a deterministic content hash of the batch, so a retried send of the same
|
|
62
|
+
* batch produces the same chunk_id and the consumer's chunk_id dedup makes redelivery a no-op.
|
|
63
|
+
*/
|
|
64
|
+
export class QueuesFallbackTransport {
|
|
65
|
+
options;
|
|
66
|
+
constructor(options) {
|
|
67
|
+
this.options = options;
|
|
68
|
+
if (options.maxRowsPerMessage < 1) {
|
|
69
|
+
throw new Error('QueuesFallbackTransport: maxRowsPerMessage must be >= 1');
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
async send(rows) {
|
|
73
|
+
const { fileRef, maxRowsPerMessage, sendMessage } = this.options;
|
|
74
|
+
for (let offset = 0; offset < rows.length; offset += maxRowsPerMessage) {
|
|
75
|
+
const batch = rows.slice(offset, offset + maxRowsPerMessage);
|
|
76
|
+
const { startedAtMs, endedAtMs } = timestampBoundsMs(batch);
|
|
77
|
+
const envelope = buildTraceChunkEnvelope({
|
|
78
|
+
file_ref: fileRef,
|
|
79
|
+
chunk_ref: `rows_${fnv1a32Hex(JSON.stringify(batch))}`,
|
|
80
|
+
row_count: batch.length,
|
|
81
|
+
started_at_ms: startedAtMs,
|
|
82
|
+
ended_at_ms: endedAtMs,
|
|
83
|
+
});
|
|
84
|
+
await sendMessage({ envelope, rows: batch });
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Diagnostic-lane sink tracer: queue completed roots (ArrayQueueTracer), drain + send on flush().
|
|
90
|
+
*
|
|
91
|
+
* flush() is waitUntil-schedulable: it never rejects, and buffers are always released back to
|
|
92
|
+
* the strategy regardless of transport outcome.
|
|
93
|
+
*/
|
|
94
|
+
export class DiagnosticDrainTracer extends ArrayQueueTracer {
|
|
95
|
+
transport;
|
|
96
|
+
onSendError;
|
|
97
|
+
constructor(binding, options) {
|
|
98
|
+
super(binding, options);
|
|
99
|
+
this.transport = options.transport;
|
|
100
|
+
this.onSendError = options.onSendError;
|
|
101
|
+
}
|
|
102
|
+
async flush() {
|
|
103
|
+
const buffers = this.drain();
|
|
104
|
+
for (const buffer of buffers) {
|
|
105
|
+
let rows;
|
|
106
|
+
try {
|
|
107
|
+
rows = spanBufferToTraceRows(buffer);
|
|
108
|
+
}
|
|
109
|
+
finally {
|
|
110
|
+
this.bufferStrategy.releaseBuffer(buffer);
|
|
111
|
+
}
|
|
112
|
+
try {
|
|
113
|
+
await this.transport.send(rows);
|
|
114
|
+
}
|
|
115
|
+
catch (error) {
|
|
116
|
+
this.onSendError?.(error, rows);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Trace-row conversion for the Cloudflare sink lanes.
|
|
3
|
+
*
|
|
4
|
+
* Per specs/lmao/01u_cloudflare_trace_segments.md §Collection Lanes: spans are sent as ROWS
|
|
5
|
+
* (JSON-serializable records), not pre-built Arrow chunks — Pipelines owns batching and Parquet
|
|
6
|
+
* encoding for the raw tier, and the collector DO reduces the same flat row shape.
|
|
7
|
+
*
|
|
8
|
+
* The row shape mirrors the SQLite `spans` table (01a schema system): system columns
|
|
9
|
+
* (trace_id, span_id, parent_span_id, row_index, entry_type, timestamp_ns, message) plus the
|
|
10
|
+
* buffer's user schema columns, flattened so downstream SQL transforms need no unnesting.
|
|
11
|
+
*/
|
|
12
|
+
import type { AnySpanBuffer } from '../types.js';
|
|
13
|
+
/** JSON-serializable scalar — the only value kinds a trace row may carry across the sink boundary. */
|
|
14
|
+
export type TraceRowValue = string | number | boolean | null;
|
|
15
|
+
/** One flat, JSON-serializable trace record — the payload unit of both delivery lanes. */
|
|
16
|
+
export type TraceRow = Record<string, TraceRowValue>;
|
|
17
|
+
/** Flatten a completed root span-buffer tree into JSON-serializable trace rows. */
|
|
18
|
+
export declare function spanBufferToTraceRows(rootBuffer: AnySpanBuffer): TraceRow[];
|
|
19
|
+
//# sourceMappingURL=traceRows.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"traceRows.d.ts","sourceRoot":"","sources":["../../../src/lib/cloudflare/traceRows.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEjD,sGAAsG;AACtG,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,CAAC;AAE7D,0FAA0F;AAC1F,MAAM,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;AAiBrD,mFAAmF;AACnF,wBAAgB,qBAAqB,CAAC,UAAU,EAAE,aAAa,GAAG,QAAQ,EAAE,CAsB3E"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Trace-row conversion for the Cloudflare sink lanes.
|
|
3
|
+
*
|
|
4
|
+
* Per specs/lmao/01u_cloudflare_trace_segments.md §Collection Lanes: spans are sent as ROWS
|
|
5
|
+
* (JSON-serializable records), not pre-built Arrow chunks — Pipelines owns batching and Parquet
|
|
6
|
+
* encoding for the raw tier, and the collector DO reduces the same flat row shape.
|
|
7
|
+
*
|
|
8
|
+
* The row shape mirrors the SQLite `spans` table (01a schema system): system columns
|
|
9
|
+
* (trace_id, span_id, parent_span_id, row_index, entry_type, timestamp_ns, message) plus the
|
|
10
|
+
* buffer's user schema columns, flattened so downstream SQL transforms need no unnesting.
|
|
11
|
+
*/
|
|
12
|
+
import { readSpanFieldValue, walkSpanSegments } from '../sqlite/sqlite-common.js';
|
|
13
|
+
function toTraceRowValue(value) {
|
|
14
|
+
if (value === undefined || value === null)
|
|
15
|
+
return null;
|
|
16
|
+
switch (typeof value) {
|
|
17
|
+
case 'string':
|
|
18
|
+
case 'number':
|
|
19
|
+
case 'boolean':
|
|
20
|
+
return value;
|
|
21
|
+
case 'bigint':
|
|
22
|
+
return Number(value);
|
|
23
|
+
default:
|
|
24
|
+
// Non-scalar buffer values (binary payloads etc.) have no JSON row representation.
|
|
25
|
+
return null;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
/** Flatten a completed root span-buffer tree into JSON-serializable trace rows. */
|
|
29
|
+
export function spanBufferToTraceRows(rootBuffer) {
|
|
30
|
+
const rows = [];
|
|
31
|
+
for (const segment of walkSpanSegments(rootBuffer)) {
|
|
32
|
+
const { buffer, traceId, spanId, parentSpanId, rowOffset } = segment;
|
|
33
|
+
const fieldNames = buffer._logSchema._columnNames;
|
|
34
|
+
for (let row = 0; row < buffer._writeIndex; row++) {
|
|
35
|
+
const record = {
|
|
36
|
+
trace_id: traceId,
|
|
37
|
+
span_id: spanId,
|
|
38
|
+
parent_span_id: parentSpanId,
|
|
39
|
+
row_index: rowOffset + row,
|
|
40
|
+
entry_type: buffer.entry_type[row],
|
|
41
|
+
timestamp_ns: Number(buffer.timestamp[row]),
|
|
42
|
+
message: buffer.message_values[row] ?? null,
|
|
43
|
+
};
|
|
44
|
+
for (const fieldName of fieldNames) {
|
|
45
|
+
record[fieldName] = toTraceRowValue(readSpanFieldValue(buffer, fieldName, row));
|
|
46
|
+
}
|
|
47
|
+
rows.push(record);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
return rows;
|
|
51
|
+
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
//#region
|
|
1
|
+
//#region smoo/lmao!n/flag-evaluator-generator
|
|
2
2
|
/**
|
|
3
3
|
* Worker-safe feature-flag evaluator generation.
|
|
4
4
|
*
|
|
@@ -198,3 +198,4 @@ export function createEvaluatorClass(schema, validateFlagValue, ENTRY_TYPE_FF_AC
|
|
|
198
198
|
}
|
|
199
199
|
return generatedEvaluatorClass;
|
|
200
200
|
}
|
|
201
|
+
//#endregion smoo/lmao!n/flag-evaluator-generator
|
|
@@ -48,6 +48,10 @@ export type TagWriter<T extends LogSchema> = {
|
|
|
48
48
|
* Bulk set multiple attributes at once.
|
|
49
49
|
*/
|
|
50
50
|
with(attributes: Partial<InferSchema<T>>): TagWriter<T>;
|
|
51
|
+
/**
|
|
52
|
+
* Set the reserved `uint64_value` column for this span-start row.
|
|
53
|
+
*/
|
|
54
|
+
uint64_value(value: bigint): TagWriter<T>;
|
|
51
55
|
} & {
|
|
52
56
|
[K in keyof InferSchema<T>]: (value: InferSchema<T>[K]) => TagWriter<T>;
|
|
53
57
|
};
|
|
@@ -81,6 +85,10 @@ export type ResultWriter<T extends LogSchema, R = unknown, E = unknown> = {
|
|
|
81
85
|
* Set the result-row source line (row 1).
|
|
82
86
|
*/
|
|
83
87
|
line(lineNumber: number): ResultWriter<T, R, E>;
|
|
88
|
+
/**
|
|
89
|
+
* Set the reserved `uint64_value` column for this result row.
|
|
90
|
+
*/
|
|
91
|
+
uint64_value(value: bigint): ResultWriter<T, R, E>;
|
|
84
92
|
} & {
|
|
85
93
|
[K in keyof InferSchema<T>]: (value: InferSchema<T>[K]) => ResultWriter<T, R, E>;
|
|
86
94
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fixedPositionWriterGenerator.d.ts","sourceRoot":"","sources":["../../../src/lib/codegen/fixedPositionWriterGenerator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAIH,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AACjE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEjD;;GAEG;AACH,MAAM,WAAW,4BAA4B;IAC3C;;;OAGG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;IAEzB;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB;;;;OAIG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED;;GAEG;AACH,MAAM,MAAM,SAAS,CAAC,CAAC,SAAS,SAAS,IAAI;IAC3C;;OAEG;IACH,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"fixedPositionWriterGenerator.d.ts","sourceRoot":"","sources":["../../../src/lib/codegen/fixedPositionWriterGenerator.ts"],"names":[],"mappings":"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"}
|
|
@@ -171,12 +171,23 @@ const resultWriterClassCache = new WeakMap();
|
|
|
171
171
|
// ============================================================================
|
|
172
172
|
// TagWriter API
|
|
173
173
|
// ============================================================================
|
|
174
|
+
/**
|
|
175
|
+
* TagWriter extension - adds the reserved system `uint64_value` writer (row 0).
|
|
176
|
+
*/
|
|
177
|
+
const tagWriterExtension = {
|
|
178
|
+
methods: `
|
|
179
|
+
uint64_value(value) {
|
|
180
|
+
this._buffer.uint64_value(this._pos, value);
|
|
181
|
+
return this;
|
|
182
|
+
}
|
|
183
|
+
`,
|
|
184
|
+
};
|
|
174
185
|
/**
|
|
175
186
|
* Generate TagWriter class code for a schema.
|
|
176
187
|
* TagWriter writes to position 0 (span-start row).
|
|
177
188
|
*/
|
|
178
189
|
export function generateTagWriterClass(schema) {
|
|
179
|
-
return generateFixedPositionWriterClass(schema, 0, 'GeneratedTagWriter');
|
|
190
|
+
return generateFixedPositionWriterClass(schema, 0, 'GeneratedTagWriter', tagWriterExtension);
|
|
180
191
|
}
|
|
181
192
|
/**
|
|
182
193
|
* Get or create a cached TagWriter class for a schema.
|
|
@@ -243,6 +254,11 @@ line(lineNumber) {
|
|
|
243
254
|
this._buffer.line(this._pos, lineNumber);
|
|
244
255
|
return this;
|
|
245
256
|
}
|
|
257
|
+
|
|
258
|
+
uint64_value(value) {
|
|
259
|
+
this._buffer.uint64_value(this._pos, value);
|
|
260
|
+
return this;
|
|
261
|
+
}
|
|
246
262
|
`,
|
|
247
263
|
};
|
|
248
264
|
/**
|
|
@@ -288,3 +304,4 @@ export function createResultWriter(schema, buffer, resultOrError, isError) {
|
|
|
288
304
|
const WriterClass = getResultWriterClass(schema);
|
|
289
305
|
return new WriterClass(buffer, resultOrError, isError);
|
|
290
306
|
}
|
|
307
|
+
//#endregion smoo/lmao!n/codegen-architecture
|
|
@@ -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":"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"}
|
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
|