@smoothbricks/lmao 0.1.3 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/allocator.wasm +0 -0
- package/dist/cloudflare.d.ts +15 -0
- package/dist/cloudflare.d.ts.map +1 -0
- package/dist/cloudflare.js +14 -0
- package/dist/es.d.ts.map +1 -1
- package/dist/es.js +1 -0
- package/dist/lib/archive/chunkCompaction.d.ts.map +1 -1
- package/dist/lib/archive/chunkCompaction.js +2 -0
- package/dist/lib/archive/chunkEnvelope.d.ts.map +1 -1
- package/dist/lib/archive/chunkRouting.d.ts.map +1 -1
- package/dist/lib/archive/chunkRouting.js +3 -0
- package/dist/lib/archive/chunkStats.d.ts.map +1 -1
- package/dist/lib/archive/chunkStats.js +1 -0
- package/dist/lib/arrow/capacityStats.d.ts.map +1 -1
- package/dist/lib/arrow/capacityStats.js +1 -0
- package/dist/lib/bufferStrategy.d.ts.map +1 -1
- package/dist/lib/capacityTuning.d.ts.map +1 -1
- package/dist/lib/capacityTuning.js +1 -0
- 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 +82 -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.d.ts.map +1 -1
- package/dist/lib/codegen/evaluatorGenerator.js +1 -0
- 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.d.ts.map +1 -1
- package/dist/lib/codegen/spanLoggerGenerator.js +3 -0
- package/dist/lib/convertToArrow.d.ts.map +1 -1
- package/dist/lib/convertToArrow.js +6 -0
- package/dist/lib/defineOpContext.d.ts +5 -0
- package/dist/lib/defineOpContext.d.ts.map +1 -1
- package/dist/lib/defineOpContext.js +11 -1
- package/dist/lib/errors/Blocked.d.ts.map +1 -1
- package/dist/lib/errors/Transient.d.ts.map +1 -1
- package/dist/lib/errors/retry-policy.d.ts.map +1 -1
- package/dist/lib/flushScheduler.d.ts.map +1 -1
- package/dist/lib/flushScheduler.js +2 -0
- package/dist/lib/library.d.ts +5 -0
- package/dist/lib/library.d.ts.map +1 -1
- package/dist/lib/library.js +6 -0
- package/dist/lib/op.d.ts.map +1 -1
- package/dist/lib/op.js +2 -0
- package/dist/lib/opContext/createOpGroup.d.ts.map +1 -1
- package/dist/lib/opContext/createOpGroup.js +5 -0
- package/dist/lib/opContext/defineOp.d.ts.map +1 -1
- package/dist/lib/opContext/defineOp.js +5 -0
- package/dist/lib/result.d.ts.map +1 -1
- package/dist/lib/result.js +3 -0
- package/dist/lib/schema/builder.d.ts.map +1 -1
- package/dist/lib/schema/builder.js +1 -0
- package/dist/lib/schema/defineFeatureFlags.d.ts.map +1 -1
- package/dist/lib/schema/defineLogSchema.d.ts.map +1 -1
- package/dist/lib/schema/defineLogSchema.js +1 -0
- package/dist/lib/schema/evaluator.d.ts.map +1 -1
- package/dist/lib/schema/systemSchema.d.ts.map +1 -1
- package/dist/lib/schema/systemSchema.js +1 -0
- package/dist/lib/spanBuffer.d.ts.map +1 -1
- package/dist/lib/spanBuffer.js +8 -0
- package/dist/lib/spanBufferHelpers.d.ts.map +1 -1
- package/dist/lib/spanBufferHelpers.js +1 -0
- package/dist/lib/spanBufferStats.d.ts.map +1 -1
- package/dist/lib/spanContext.d.ts +8 -0
- package/dist/lib/spanContext.d.ts.map +1 -1
- package/dist/lib/spanContext.js +35 -0
- package/dist/lib/sqlite/index.d.ts +1 -0
- package/dist/lib/sqlite/index.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 +9 -1
- package/dist/lib/threadId.d.ts.map +1 -1
- package/dist/lib/threadId.js +2 -0
- package/dist/lib/traceId.d.ts.map +1 -1
- package/dist/lib/traceId.js +1 -0
- package/dist/lib/traceRoot.d.ts +5 -5
- package/dist/lib/traceRoot.d.ts.map +1 -1
- package/dist/lib/traceRoot.es.d.ts.map +1 -1
- package/dist/lib/traceRoot.es.js +3 -0
- package/dist/lib/traceRoot.js +3 -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 +2 -0
- package/dist/lib/tracers/ArrayQueueTracer.d.ts.map +1 -1
- 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 +1 -0
- package/dist/lib/tracers/SQLiteTracer.d.ts.map +1 -1
- package/dist/lib/tracers/SQLiteTracer.js +2 -0
- package/dist/lib/tracers/StdioTracer.d.ts.map +1 -1
- package/dist/lib/tracers/StdioTracer.js +1 -0
- package/dist/lib/tracers/TestTracer.d.ts.map +1 -1
- package/dist/lib/tracers/TestTracer.js +1 -0
- package/dist/lib/types.d.ts.map +1 -1
- 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 +2 -0
- package/dist/lib/wasm/wasmAllocator.d.ts +2 -0
- package/dist/lib/wasm/wasmAllocator.d.ts.map +1 -1
- package/dist/lib/wasm/wasmSpanBuffer.d.ts.map +1 -1
- package/dist/lib/wasm/wasmTraceRoot.d.ts.map +1 -1
- package/dist/node.d.ts.map +1 -1
- package/dist/node.js +1 -0
- package/package.json +10 -4
- package/src/cloudflare.ts +35 -0
- package/src/es.ts +2 -0
- package/src/lib/archive/chunkCompaction.ts +2 -0
- package/src/lib/archive/chunkEnvelope.ts +2 -0
- package/src/lib/archive/chunkRouting.ts +4 -0
- package/src/lib/archive/chunkStats.ts +2 -0
- package/src/lib/arrow/capacityStats.ts +2 -0
- package/src/lib/bufferStrategy.ts +2 -0
- package/src/lib/capacityTuning.ts +2 -0
- 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 -0
- package/src/lib/codegen/fixedPositionWriterGenerator.ts +28 -1
- package/src/lib/codegen/spanLoggerGenerator.ts +4 -0
- package/src/lib/convertToArrow.ts +6 -0
- package/src/lib/defineOpContext.ts +17 -1
- package/src/lib/errors/Blocked.ts +2 -0
- package/src/lib/errors/Transient.ts +2 -0
- package/src/lib/errors/retry-policy.ts +2 -0
- package/src/lib/flushScheduler.ts +2 -0
- package/src/lib/library.ts +7 -0
- package/src/lib/op.ts +8 -0
- package/src/lib/opContext/createOpGroup.ts +6 -0
- package/src/lib/opContext/defineOp.ts +6 -0
- package/src/lib/result.ts +4 -0
- package/src/lib/schema/builder.ts +2 -0
- package/src/lib/schema/defineFeatureFlags.ts +2 -0
- package/src/lib/schema/defineLogSchema.ts +2 -0
- package/src/lib/schema/evaluator.ts +2 -0
- package/src/lib/schema/systemSchema.ts +2 -0
- package/src/lib/spanBuffer.ts +10 -0
- package/src/lib/spanBufferHelpers.ts +2 -0
- package/src/lib/spanBufferStats.ts +2 -0
- package/src/lib/spanContext.ts +48 -1
- package/src/lib/sqlite/__tests__/sqlite-common.test.ts +40 -1
- package/src/lib/sqlite/index.ts +1 -0
- package/src/lib/sqlite/sqlite-common.ts +10 -1
- package/src/lib/testing/__tests__/facts.test.ts +6 -6
- package/src/lib/threadId.ts +2 -0
- package/src/lib/traceId.ts +4 -0
- package/src/lib/traceRoot.es.ts +4 -0
- package/src/lib/traceRoot.node.ts +5 -3
- package/src/lib/traceRoot.ts +9 -5
- package/src/lib/tracer.ts +4 -0
- package/src/lib/tracers/ArrayQueueTracer.ts +2 -0
- package/src/lib/tracers/CompositeTracer.ts +2 -0
- package/src/lib/tracers/NoOpTracer.ts +2 -0
- package/src/lib/tracers/SQLiteTracer.ts +2 -0
- package/src/lib/tracers/StdioTracer.ts +2 -0
- package/src/lib/tracers/TestTracer.ts +2 -0
- package/src/lib/types.ts +2 -0
- package/src/lib/utf8Cache.ts +2 -0
- package/src/lib/wasm/WasmBufferStrategy.ts +4 -0
- package/src/lib/wasm/allocator.zig +4 -1
- package/src/lib/wasm/wasmAllocator.ts +5 -0
- package/src/lib/wasm/wasmSpanBuffer.ts +4 -0
- package/src/lib/wasm/wasmTraceRoot.ts +4 -0
- package/src/node.ts +2 -0
- package/src/lib/codegen/__tests__/__snapshots__/spanLoggerGenerator.test.ts.snap +0 -1965
|
@@ -286,10 +286,10 @@ describe('trace-testing example', () => {
|
|
|
286
286
|
// Simulate facts collected from a trace
|
|
287
287
|
const facts = createFactArray([
|
|
288
288
|
spanStarted('execute-loop'),
|
|
289
|
-
spanStarted('
|
|
289
|
+
spanStarted('prepare'),
|
|
290
290
|
tagFact('event_count', 5),
|
|
291
|
-
spanOk('
|
|
292
|
-
spanStarted('
|
|
291
|
+
spanOk('prepare'),
|
|
292
|
+
spanStarted('plan'),
|
|
293
293
|
spanStarted('op:reserveInventory'),
|
|
294
294
|
tagFact('sku', 'SKU-A'),
|
|
295
295
|
tagFact('quantity', 2),
|
|
@@ -297,7 +297,7 @@ describe('trace-testing example', () => {
|
|
|
297
297
|
spanStarted('op:chargePayment'),
|
|
298
298
|
logInfo('Charging $49.99'),
|
|
299
299
|
spanOk('op:chargePayment'),
|
|
300
|
-
spanOk('
|
|
300
|
+
spanOk('plan'),
|
|
301
301
|
spanOk('execute-loop'),
|
|
302
302
|
]);
|
|
303
303
|
|
|
@@ -307,8 +307,8 @@ describe('trace-testing example', () => {
|
|
|
307
307
|
// The execution completed successfully
|
|
308
308
|
expect(facts.has(spanOk('execute-loop'))).toBe(true);
|
|
309
309
|
|
|
310
|
-
//
|
|
311
|
-
expect(facts.hasInOrder([spanOk('
|
|
310
|
+
// Preparation happened before planning
|
|
311
|
+
expect(facts.hasInOrder([spanOk('prepare'), spanStarted('plan')])).toBe(true);
|
|
312
312
|
|
|
313
313
|
// Inventory was reserved before payment was charged
|
|
314
314
|
expect(facts.hasInOrder([spanOk('op:reserveInventory'), spanStarted('op:chargePayment')])).toBe(true);
|
package/src/lib/threadId.ts
CHANGED
|
@@ -22,6 +22,7 @@
|
|
|
22
22
|
* @module threadId
|
|
23
23
|
*/
|
|
24
24
|
|
|
25
|
+
//#region smoo/lmao!n/spanbuffer-layout.thread-id
|
|
25
26
|
/** Thread ID size in bytes */
|
|
26
27
|
export const THREAD_ID_BYTES = 8;
|
|
27
28
|
|
|
@@ -120,6 +121,7 @@ export function writeThreadIdToUint64Array(dest: BigUint64Array, index: number):
|
|
|
120
121
|
const byteView = new Uint8Array(dest.buffer, dest.byteOffset + index * 8, 8);
|
|
121
122
|
byteView.set(threadIdBytes);
|
|
122
123
|
}
|
|
124
|
+
//#endregion smoo/lmao!n/spanbuffer-layout.thread-id
|
|
123
125
|
|
|
124
126
|
/**
|
|
125
127
|
* Reset thread ID for testing purposes only.
|
package/src/lib/traceId.ts
CHANGED
|
@@ -12,6 +12,7 @@
|
|
|
12
12
|
* @module traceId
|
|
13
13
|
*/
|
|
14
14
|
|
|
15
|
+
//#region smoo/lmao!n/span-identity.trace-id
|
|
15
16
|
/** Maximum length for a trace ID */
|
|
16
17
|
export const MAX_TRACE_ID_LENGTH = 128;
|
|
17
18
|
|
|
@@ -85,10 +86,12 @@ export function generateTraceId(): TraceId {
|
|
|
85
86
|
|
|
86
87
|
return brandTraceId(hex);
|
|
87
88
|
}
|
|
89
|
+
//#endregion smoo/lmao!n/span-identity.trace-id
|
|
88
90
|
|
|
89
91
|
// ============================================================================
|
|
90
92
|
// SpanIdentity - Span identification for external systems
|
|
91
93
|
// ============================================================================
|
|
94
|
+
//#region smoo/lmao!n/span-identity.external-correlation
|
|
92
95
|
|
|
93
96
|
/**
|
|
94
97
|
* SpanIdentity - Identifies a specific span for external correlation.
|
|
@@ -140,3 +143,4 @@ export function extractSpanIdentity(buffer: { trace_id: TraceId; span_id: number
|
|
|
140
143
|
thread_id: buffer.thread_id,
|
|
141
144
|
};
|
|
142
145
|
}
|
|
146
|
+
//#endregion smoo/lmao!n/span-identity.external-correlation
|
package/src/lib/traceRoot.es.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
//#region smoo/lmao!n/es-trace-root
|
|
1
2
|
/**
|
|
2
3
|
* TraceRoot - Browser/ES implementation.
|
|
3
4
|
*
|
|
@@ -94,6 +95,7 @@ export class TraceRoot implements ITraceRoot {
|
|
|
94
95
|
return createTraceId(textDecoder.decode(new Uint8Array(this._system, TRACE_ROOT_TRACE_ID_OFFSET, len)));
|
|
95
96
|
}
|
|
96
97
|
|
|
98
|
+
//#region smoo/lmao!n/trace-root-timestamps #es
|
|
97
99
|
/**
|
|
98
100
|
* Get current timestamp in nanoseconds since Unix epoch.
|
|
99
101
|
* Uses performance.now() - microsecond precision (last 3 digits = 000).
|
|
@@ -104,6 +106,7 @@ export class TraceRoot implements ITraceRoot {
|
|
|
104
106
|
const elapsedNanos = BigInt(Math.floor(elapsedMs * 1000)) * 1000n;
|
|
105
107
|
return Nanoseconds.unsafe(this._epochView[0] + elapsedNanos);
|
|
106
108
|
}
|
|
109
|
+
//#endregion smoo/lmao!n/trace-root-timestamps
|
|
107
110
|
|
|
108
111
|
/**
|
|
109
112
|
* Write span-start entry to buffer at row 0.
|
|
@@ -155,3 +158,4 @@ export function createTraceRoot(trace_id: string, tracer: TracerLifecycleHooks):
|
|
|
155
158
|
const anchorPerfNow = performance.now();
|
|
156
159
|
return new TraceRoot(createTraceId(trace_id), anchorEpochNanos, anchorPerfNow, tracer);
|
|
157
160
|
}
|
|
161
|
+
//#endregion smoo/lmao!n/es-trace-root
|
|
@@ -28,6 +28,7 @@ const textEncoder = new TextEncoder();
|
|
|
28
28
|
/** Shared TextDecoder for trace_id decoding (stateless, reusable) */
|
|
29
29
|
const textDecoder = new TextDecoder();
|
|
30
30
|
|
|
31
|
+
//#region smoo/lmao!n/trace-root-timestamps #node
|
|
31
32
|
/**
|
|
32
33
|
* TraceRoot - Node.js implementation.
|
|
33
34
|
*
|
|
@@ -51,8 +52,8 @@ export class TraceRoot implements ITraceRoot {
|
|
|
51
52
|
private readonly _perfView: Float64Array;
|
|
52
53
|
|
|
53
54
|
/**
|
|
54
|
-
* Cached anchor hrtime as BigInt
|
|
55
|
-
*
|
|
55
|
+
* Cached anchor hrtime as the exact BigInt, so the JS timestamp delta stays
|
|
56
|
+
* correct after the f64 `anchorPerfNow` loses integer precision (~104 days uptime).
|
|
56
57
|
*/
|
|
57
58
|
private readonly _anchorHrtimeBigInt: bigint;
|
|
58
59
|
|
|
@@ -164,7 +165,8 @@ export class TraceRoot implements ITraceRoot {
|
|
|
164
165
|
export function createTraceRoot(trace_id: string, tracer: TracerLifecycleHooks): TraceRoot {
|
|
165
166
|
const anchorEpochNanos = BigInt(Date.now()) * 1_000_000n;
|
|
166
167
|
const anchorHrtimeBigInt = process.hrtime.bigint();
|
|
167
|
-
//
|
|
168
|
+
// Also store as f64 in the shared _system layout (WASM reads it without BigInt extraction)
|
|
168
169
|
const anchorPerfNow = Number(anchorHrtimeBigInt);
|
|
169
170
|
return new TraceRoot(createTraceId(trace_id), anchorEpochNanos, anchorPerfNow, anchorHrtimeBigInt, tracer);
|
|
170
171
|
}
|
|
172
|
+
//#endregion smoo/lmao!n/trace-root-timestamps
|
package/src/lib/traceRoot.ts
CHANGED
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
*
|
|
9
9
|
* Platform-specific implementations:
|
|
10
10
|
* - TraceRoot.es.ts: Browser - uses performance.now() for timing
|
|
11
|
-
* - TraceRoot.node.ts: Node.js -
|
|
11
|
+
* - TraceRoot.node.ts: Node.js - process.hrtime.bigint(), pure-JS writes to SpanBuffer state
|
|
12
12
|
*
|
|
13
13
|
* @module traceRoot
|
|
14
14
|
*/
|
|
@@ -24,6 +24,7 @@ export { createTraceId, extractSpanIdentity, generateTraceId, isValidTraceId, MA
|
|
|
24
24
|
* Tracer lifecycle hooks interface.
|
|
25
25
|
* Extracted to avoid circular dependency - Tracer implements this.
|
|
26
26
|
*/
|
|
27
|
+
//#region smoo/lmao!n/buffer-tuning-observability
|
|
27
28
|
export interface TracerLifecycleHooks {
|
|
28
29
|
onTraceStart(buffer: unknown): void;
|
|
29
30
|
onTraceEnd(buffer: unknown): void;
|
|
@@ -47,6 +48,7 @@ export interface TracerLifecycleHooks {
|
|
|
47
48
|
createOverflowBuffer(buffer: AnySpanBuffer): AnySpanBuffer;
|
|
48
49
|
};
|
|
49
50
|
}
|
|
51
|
+
//#endregion smoo/lmao!n/buffer-tuning-observability
|
|
50
52
|
|
|
51
53
|
/**
|
|
52
54
|
* TraceRoot._system memory layout (little-endian):
|
|
@@ -59,8 +61,9 @@ export interface TracerLifecycleHooks {
|
|
|
59
61
|
*
|
|
60
62
|
* Total: 17 + trace_id.length bytes
|
|
61
63
|
*
|
|
62
|
-
* This layout enables
|
|
64
|
+
* This layout enables the WASM path to read anchors directly without BigInt extraction.
|
|
63
65
|
*/
|
|
66
|
+
//#region smoo/lmao!n/trace-root-timestamps #contract
|
|
64
67
|
export const TRACE_ROOT_ANCHOR_EPOCH_OFFSET = 0;
|
|
65
68
|
export const TRACE_ROOT_ANCHOR_PERF_OFFSET = 8;
|
|
66
69
|
export const TRACE_ROOT_TRACE_ID_LEN_OFFSET = 16;
|
|
@@ -71,7 +74,7 @@ export const TRACE_ROOT_TRACE_ID_OFFSET = 17;
|
|
|
71
74
|
*
|
|
72
75
|
* Each implementation handles timestamp calculation and span writes differently:
|
|
73
76
|
* - Browser: Pure JS with performance.now()
|
|
74
|
-
* - Node.js: NAPI addon
|
|
77
|
+
* - Node.js: process.hrtime.bigint() (pure JS; a NAPI addon was benchmarked slower than WASM and removed)
|
|
75
78
|
*/
|
|
76
79
|
/**
|
|
77
80
|
* Factory function type for creating platform-specific TraceRoot instances.
|
|
@@ -84,7 +87,7 @@ export type TraceRootFactory = (trace_id: string, tracer: TracerLifecycleHooks)
|
|
|
84
87
|
export interface ITraceRoot {
|
|
85
88
|
/**
|
|
86
89
|
* Raw backing buffer containing anchor timestamps and trace_id.
|
|
87
|
-
*
|
|
90
|
+
* The WASM path can read this directly without BigInt extraction.
|
|
88
91
|
*/
|
|
89
92
|
readonly _system: ArrayBuffer;
|
|
90
93
|
|
|
@@ -107,7 +110,7 @@ export interface ITraceRoot {
|
|
|
107
110
|
/**
|
|
108
111
|
* High-resolution timer anchor when trace was created.
|
|
109
112
|
* Browser: performance.now() value (number)
|
|
110
|
-
* Node.js: stored as number
|
|
113
|
+
* Node.js: stored as number in the shared layout (WASM-readable), but represents hrtime
|
|
111
114
|
*/
|
|
112
115
|
readonly anchorPerfNow: number;
|
|
113
116
|
|
|
@@ -152,3 +155,4 @@ export interface ITraceRoot {
|
|
|
152
155
|
*/
|
|
153
156
|
writeLogEntry(buffer: AnySpanBuffer, entryType: number): number;
|
|
154
157
|
}
|
|
158
|
+
//#endregion smoo/lmao!n/trace-root-timestamps
|
package/src/lib/tracer.ts
CHANGED
|
@@ -239,6 +239,7 @@ export type TraceFn<Ctx extends OpContext> = {
|
|
|
239
239
|
// Tracer Class
|
|
240
240
|
// =============================================================================
|
|
241
241
|
|
|
242
|
+
//#region smoo/lmao!n/tracer-architecture #contract
|
|
242
243
|
/**
|
|
243
244
|
* Tracer - Abstract base class for trace collection
|
|
244
245
|
*
|
|
@@ -357,6 +358,7 @@ export abstract class Tracer<B extends OpContextBinding = OpContextBinding> {
|
|
|
357
358
|
// trace() - Polymorphic dispatcher (like span())
|
|
358
359
|
// ===========================================================================
|
|
359
360
|
|
|
361
|
+
//#region smoo/lmao!n/tracer-architecture.trace-overloads
|
|
360
362
|
/**
|
|
361
363
|
* Polymorphic trace dispatcher.
|
|
362
364
|
*
|
|
@@ -547,6 +549,7 @@ export abstract class Tracer<B extends OpContextBinding = OpContextBinding> {
|
|
|
547
549
|
}
|
|
548
550
|
return this._trace_unknown_fn(line, name, overrides, fnOrOp);
|
|
549
551
|
}
|
|
552
|
+
//#endregion smoo/lmao!n/tracer-architecture.trace-overloads
|
|
550
553
|
|
|
551
554
|
// ===========================================================================
|
|
552
555
|
// Monomorphic trace methods (for transformer optimization)
|
|
@@ -894,3 +897,4 @@ export abstract class Tracer<B extends OpContextBinding = OpContextBinding> {
|
|
|
894
897
|
}
|
|
895
898
|
}
|
|
896
899
|
}
|
|
900
|
+
//#endregion smoo/lmao!n/tracer-architecture
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
//#region smoo/lmao!n/array-queue-tracer
|
|
1
2
|
import type { OpContextBinding } from '../opContext/types.js';
|
|
2
3
|
import { Tracer } from '../tracer.js';
|
|
3
4
|
import type { SpanBuffer } from '../types.js';
|
|
@@ -74,3 +75,4 @@ export class ArrayQueueTracer<B extends OpContextBinding = OpContextBinding> ext
|
|
|
74
75
|
return buffers;
|
|
75
76
|
}
|
|
76
77
|
}
|
|
78
|
+
//#endregion smoo/lmao!n/array-queue-tracer
|
|
@@ -20,6 +20,7 @@ export interface CompositeTracerOptions<B extends OpContextBinding = OpContextBi
|
|
|
20
20
|
* Useful when you want multiple outputs from a single trace run,
|
|
21
21
|
* for example Stdio + SQLite.
|
|
22
22
|
*/
|
|
23
|
+
//#region smoo/lmao!n/tracer-implementations.composite
|
|
23
24
|
export class CompositeTracer<B extends OpContextBinding = OpContextBinding> extends Tracer<B> {
|
|
24
25
|
private readonly delegates: Tracer<B>[];
|
|
25
26
|
|
|
@@ -79,3 +80,4 @@ export class CompositeTracer<B extends OpContextBinding = OpContextBinding> exte
|
|
|
79
80
|
}
|
|
80
81
|
}
|
|
81
82
|
}
|
|
83
|
+
//#endregion smoo/lmao!n/tracer-implementations.composite
|
|
@@ -35,6 +35,7 @@ import type { SpanBuffer } from '../types.js';
|
|
|
35
35
|
*
|
|
36
36
|
* @typeParam B - OpContextBinding type
|
|
37
37
|
*/
|
|
38
|
+
//#region smoo/lmao!n/tracer-implementations.noop
|
|
38
39
|
export class NoOpTracer<B extends OpContextBinding = OpContextBinding> extends Tracer<B> {
|
|
39
40
|
/**
|
|
40
41
|
* No-op hook for trace start.
|
|
@@ -71,3 +72,4 @@ export class NoOpTracer<B extends OpContextBinding = OpContextBinding> extends T
|
|
|
71
72
|
// No-op
|
|
72
73
|
}
|
|
73
74
|
}
|
|
75
|
+
//#endregion smoo/lmao!n/tracer-implementations.noop
|
|
@@ -21,6 +21,7 @@ export interface SQLiteAsyncTracerOptions<
|
|
|
21
21
|
/**
|
|
22
22
|
* Tracer that persists completed root traces to SQLite synchronously.
|
|
23
23
|
*/
|
|
24
|
+
//#region smoo/lmao!n/tracer-implementations.sqlite
|
|
24
25
|
export class SQLiteTracer<B extends OpContextBinding = OpContextBinding> extends Tracer<B> {
|
|
25
26
|
private readonly writer: SQLiteTraceWriter;
|
|
26
27
|
|
|
@@ -57,6 +58,7 @@ export class SQLiteTracer<B extends OpContextBinding = OpContextBinding> extends
|
|
|
57
58
|
cleanupDebug('sqliteTracer.close:end');
|
|
58
59
|
}
|
|
59
60
|
}
|
|
61
|
+
//#endregion smoo/lmao!n/tracer-implementations.sqlite
|
|
60
62
|
|
|
61
63
|
/**
|
|
62
64
|
* Tracer that persists completed root traces to SQLite asynchronously.
|
|
@@ -204,6 +204,7 @@ export interface StdioTracerOptions<
|
|
|
204
204
|
* - Human-readable timestamps and durations
|
|
205
205
|
* - Exceptions go to stderr
|
|
206
206
|
*/
|
|
207
|
+
//#region smoo/lmao!n/tracer-implementations.stdio
|
|
207
208
|
export class StdioTracer<B extends OpContextBinding = OpContextBinding> extends Tracer<B> {
|
|
208
209
|
/**
|
|
209
210
|
* Per-trace indent levels for concurrent-safe nesting.
|
|
@@ -378,3 +379,4 @@ export class StdioTracer<B extends OpContextBinding = OpContextBinding> extends
|
|
|
378
379
|
);
|
|
379
380
|
}
|
|
380
381
|
}
|
|
382
|
+
//#endregion smoo/lmao!n/tracer-implementations.stdio
|
|
@@ -81,6 +81,7 @@ export interface StatsSnapshot<T extends LogSchema = LogSchema> {
|
|
|
81
81
|
* expect(tracer.statsSnapshots.length).toBeGreaterThan(0);
|
|
82
82
|
* ```
|
|
83
83
|
*/
|
|
84
|
+
//#region smoo/lmao!n/tracer-implementations.test
|
|
84
85
|
export class TestTracer<B extends OpContextBinding = OpContextBinding> extends Tracer<B> {
|
|
85
86
|
/**
|
|
86
87
|
* All completed root trace buffers.
|
|
@@ -144,3 +145,4 @@ export class TestTracer<B extends OpContextBinding = OpContextBinding> extends T
|
|
|
144
145
|
}
|
|
145
146
|
}
|
|
146
147
|
}
|
|
148
|
+
//#endregion smoo/lmao!n/tracer-implementations.test
|
package/src/lib/types.ts
CHANGED
|
@@ -74,6 +74,7 @@ export type { AnyColumnBuffer, ColumnBuffer, ColumnValueType, TypedArray };
|
|
|
74
74
|
*
|
|
75
75
|
* @see SpanBuffer<T> for schema-typed version with index signatures
|
|
76
76
|
*/
|
|
77
|
+
//#region smoo/lmao!n/spanbuffer-layout.interface
|
|
77
78
|
export interface AnySpanBuffer extends AnyColumnBuffer {
|
|
78
79
|
// ===========================================================================
|
|
79
80
|
// System Memory (cache-aligned, per specs/lmao/01b1)
|
|
@@ -414,6 +415,7 @@ export interface AnySpanBuffer extends AnyColumnBuffer {
|
|
|
414
415
|
*/
|
|
415
416
|
copyParentThreadIdTo(dest: Uint8Array, offset: number): void;
|
|
416
417
|
}
|
|
418
|
+
//#endregion smoo/lmao!n/spanbuffer-layout.interface
|
|
417
419
|
|
|
418
420
|
// ============================================================================
|
|
419
421
|
// Schema Type Helpers
|
package/src/lib/utf8Cache.ts
CHANGED
|
@@ -39,6 +39,7 @@ type Utf8CacheStats = { hits: number; misses: number; hitRate: number; size: num
|
|
|
39
39
|
* The cache is safe to use in async contexts since JS awaits don't
|
|
40
40
|
* allow concurrent access to the same cache instance.
|
|
41
41
|
*/
|
|
42
|
+
//#region smoo/lmao!n/buffer-perf-utf8-cache
|
|
42
43
|
export class Utf8Cache implements Utf8Encoder {
|
|
43
44
|
private readonly cache: SieveCache<string, Uint8Array>;
|
|
44
45
|
private readonly encoder = new TextEncoder();
|
|
@@ -199,3 +200,4 @@ export const globalUtf8Cache = new Utf8Cache();
|
|
|
199
200
|
export function createUtf8Cache(maxSize?: number): Utf8Cache {
|
|
200
201
|
return new Utf8Cache(maxSize);
|
|
201
202
|
}
|
|
203
|
+
//#endregion smoo/lmao!n/buffer-perf-utf8-cache
|
|
@@ -30,6 +30,9 @@ import {
|
|
|
30
30
|
type WasmSpanBufferInstance,
|
|
31
31
|
} from './wasmSpanBuffer.js';
|
|
32
32
|
|
|
33
|
+
// Spec link (88): realizes specs/lmao/01q_wasm_memory_architecture.md#smoo/lmao!n/wasm-mem (OpContext integration + trace completion).
|
|
34
|
+
//#region smoo/lmao!n/wasm-mem.strategy
|
|
35
|
+
|
|
33
36
|
function requireWasmSpanBuffer(buffer: AnySpanBuffer): WasmSpanBufferInstance {
|
|
34
37
|
if (!isWasmSpanBufferInstance(buffer)) {
|
|
35
38
|
throw new Error('Expected WASM-backed span buffer');
|
|
@@ -217,3 +220,4 @@ export class WasmBufferStrategy<T extends LogSchema = LogSchema> implements Buff
|
|
|
217
220
|
};
|
|
218
221
|
}
|
|
219
222
|
}
|
|
223
|
+
//#endregion smoo/lmao!n/wasm-mem.strategy
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
//
|
|
7
7
|
// Memory Layout:
|
|
8
8
|
// ┌─────────────────────────────────────────────────────────────────────────────┐
|
|
9
|
-
// │ Header (
|
|
9
|
+
// │ Header (192 bytes, 3 cache lines) │
|
|
10
10
|
// ├─────────────────────────────────────────────────────────────────────────────┤
|
|
11
11
|
// │ Allocated Blocks (spans + columns) │
|
|
12
12
|
// ├─────────────────────────────────────────────────────────────────────────────┤
|
|
@@ -22,7 +22,9 @@
|
|
|
22
22
|
//
|
|
23
23
|
// Freelist: Zero-overhead, uses block's memory for next pointer + cascading stats when free.
|
|
24
24
|
//
|
|
25
|
+
// Spec link (88): realizes specs/lmao/01q_wasm_memory_architecture.md#smoo/lmao!n/wasm-mem (the Zig allocator region).
|
|
25
26
|
|
|
27
|
+
//#region smoo/lmao!n/wasm-mem.allocator
|
|
26
28
|
const std = @import("std");
|
|
27
29
|
|
|
28
30
|
// =============================================================================
|
|
@@ -943,3 +945,4 @@ export fn read_col_is_valid(col_offset: u32, row_idx: u32) u8 {
|
|
|
943
945
|
const bit: u8 = @as(u8, 1) << @intCast(row_idx & 7);
|
|
944
946
|
return if ((byte & bit) != 0) 1 else 0;
|
|
945
947
|
}
|
|
948
|
+
//#endregion smoo/lmao!n/wasm-mem.allocator
|
|
@@ -10,8 +10,12 @@
|
|
|
10
10
|
* - Blocks are organized by tier (capacity 8, 16, 32, 64, 128, 256, 512)
|
|
11
11
|
* - When freelist is empty, splits from larger tier
|
|
12
12
|
* - When freeing, merges with adjacent blocks if both are free (address-based buddy merge)
|
|
13
|
+
*
|
|
14
|
+
* Spec link (88): realizes specs/lmao/01q_wasm_memory_architecture.md#smoo/lmao!n/wasm-mem (TS allocator wrapper).
|
|
13
15
|
*/
|
|
14
16
|
|
|
17
|
+
//#region smoo/lmao!n/wasm-mem.ts-allocator
|
|
18
|
+
|
|
15
19
|
// =============================================================================
|
|
16
20
|
// Types
|
|
17
21
|
// =============================================================================
|
|
@@ -467,3 +471,4 @@ export function createWasmAllocatorSync(wasmModule: WebAssembly.Module, options?
|
|
|
467
471
|
|
|
468
472
|
return wrapWasmInstance(instance, memory, capacity);
|
|
469
473
|
}
|
|
474
|
+
//#endregion smoo/lmao!n/wasm-mem.ts-allocator
|
|
@@ -20,6 +20,9 @@ import type { ITraceRoot } from '../traceRoot.js';
|
|
|
20
20
|
import type { AnySpanBuffer } from '../types.js';
|
|
21
21
|
import type { WasmAllocator } from './wasmAllocator.js';
|
|
22
22
|
|
|
23
|
+
// Spec link (88): realizes specs/lmao/01q_wasm_memory_architecture.md#smoo/lmao!n/wasm-mem (SpanBuffer + SpanLogger codegen).
|
|
24
|
+
//#region smoo/lmao!n/wasm-mem.spanbuffer
|
|
25
|
+
|
|
23
26
|
// =============================================================================
|
|
24
27
|
// Types
|
|
25
28
|
// =============================================================================
|
|
@@ -1012,3 +1015,4 @@ export function createWasmOverflowBuffer(
|
|
|
1012
1015
|
|
|
1013
1016
|
return overflow;
|
|
1014
1017
|
}
|
|
1018
|
+
//#endregion smoo/lmao!n/wasm-mem.spanbuffer
|
|
@@ -16,6 +16,9 @@ import type { ITraceRoot, TracerLifecycleHooks } from '../traceRoot.js';
|
|
|
16
16
|
import type { AnySpanBuffer } from '../types.js';
|
|
17
17
|
import type { WasmAllocator } from './wasmAllocator.js';
|
|
18
18
|
|
|
19
|
+
// Spec link (88): realizes specs/lmao/01q_wasm_memory_architecture.md#smoo/lmao!n/wasm-mem (span lifecycle writer).
|
|
20
|
+
//#region smoo/lmao!n/wasm-mem.trace-root
|
|
21
|
+
|
|
19
22
|
// =============================================================================
|
|
20
23
|
// WASM Buffer Detection
|
|
21
24
|
// =============================================================================
|
|
@@ -313,3 +316,4 @@ export function createWasmTraceRootFactory(allocator: WasmAllocator) {
|
|
|
313
316
|
return new WasmTraceRoot(allocator, createTraceId(trace_id), tracer);
|
|
314
317
|
};
|
|
315
318
|
}
|
|
319
|
+
//#endregion smoo/lmao!n/wasm-mem.trace-root
|
package/src/node.ts
CHANGED
|
@@ -7,4 +7,6 @@
|
|
|
7
7
|
export * from './index.js';
|
|
8
8
|
|
|
9
9
|
// Export Node.js-specific TraceRoot factory for Tracer construction
|
|
10
|
+
//#region smoo/lmao!n/trace-root-timestamps.entry-points #node
|
|
10
11
|
export { createTraceRoot } from './lib/traceRoot.node.js';
|
|
12
|
+
//#endregion smoo/lmao!n/trace-root-timestamps.entry-points
|