@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/lib/tracer.js
CHANGED
|
@@ -1,3 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tracer - Abstract base class for trace collection
|
|
3
|
+
*
|
|
4
|
+
* Per specs/lmao/01c_context_flow_and_op_wrappers.md:
|
|
5
|
+
* - Tracer owns trace() function for creating root spans
|
|
6
|
+
* - Collects SpanBuffers in pendingBuffers array
|
|
7
|
+
* - Subclasses implement flush() to define persistence strategy
|
|
8
|
+
*
|
|
9
|
+
* ## Design Philosophy
|
|
10
|
+
*
|
|
11
|
+
* Tracer separates two concerns:
|
|
12
|
+
* 1. **BufferStrategy**: HOW buffers are allocated (JS TypedArrays vs WASM memory)
|
|
13
|
+
* 2. **Sink behavior** (lifecycle hooks): WHAT happens with completed buffers
|
|
14
|
+
*
|
|
15
|
+
* Tracer is ABSTRACT - subclasses implement lifecycle hooks:
|
|
16
|
+
* - `onTraceEnd()` - called when root trace completes
|
|
17
|
+
* - `onSpanEnd()` - called when child span completes
|
|
18
|
+
* - `flush()` - optional, for batching strategies
|
|
19
|
+
*
|
|
20
|
+
* BufferStrategy is INJECTED via constructor:
|
|
21
|
+
* - `JsBufferStrategy` - GC-managed TypedArrays, zero-copy Arrow
|
|
22
|
+
* - `WasmBufferStrategy` - WASM memory with freelist, Arrow built in WASM
|
|
23
|
+
*
|
|
24
|
+
* The sink controls WHEN to convert/release:
|
|
25
|
+
* - StdioTracer: prints then releases immediately
|
|
26
|
+
* - TestTracer: holds buffers until clear()
|
|
27
|
+
* - SqsTracer: accumulates, converts on flush(), then releases
|
|
28
|
+
*
|
|
29
|
+
* @example
|
|
30
|
+
* ```typescript
|
|
31
|
+
* // Concrete implementation - Cloudflare Queue
|
|
32
|
+
* class QueueTracer extends Tracer {
|
|
33
|
+
* constructor(binding, strategy, options, private queue: Queue) {
|
|
34
|
+
* super(binding, strategy, options);
|
|
35
|
+
* }
|
|
36
|
+
*
|
|
37
|
+
* async flush() {
|
|
38
|
+
* const buffers = [...this.pending];
|
|
39
|
+
* this.pending.length = 0;
|
|
40
|
+
* for (const buffer of buffers) {
|
|
41
|
+
* const table = await this.bufferStrategy.toArrowTable(buffer);
|
|
42
|
+
* await this.queue.send(table);
|
|
43
|
+
* this.bufferStrategy.releaseBuffer(buffer);
|
|
44
|
+
* }
|
|
45
|
+
* }
|
|
46
|
+
* }
|
|
47
|
+
*
|
|
48
|
+
* // Usage
|
|
49
|
+
* const ctx = defineOpContext({ logSchema, ctx: { env: null as Env } });
|
|
50
|
+
* const strategy = new JsBufferStrategy();
|
|
51
|
+
* const { trace, flush } = new QueueTracer(ctx, strategy, options, env.TRACES);
|
|
52
|
+
* await trace('fetch', { env: myEnv }, async (ctx) => {
|
|
53
|
+
* ctx.tag.userId('user-123');
|
|
54
|
+
* return ctx.ok('done');
|
|
55
|
+
* });
|
|
56
|
+
* executionContext.waitUntil(flush());
|
|
57
|
+
* ```
|
|
58
|
+
*
|
|
59
|
+
* @module tracer
|
|
60
|
+
*/
|
|
1
61
|
import { createTagWriter } from './codegen/fixedPositionWriterGenerator.js';
|
|
2
62
|
import { createSpanLogger as createSpanLoggerFromGenerator } from './codegen/spanLoggerGenerator.js';
|
|
3
63
|
import { Op } from './op.js';
|
|
@@ -346,3 +406,4 @@ export class Tracer {
|
|
|
346
406
|
}
|
|
347
407
|
}
|
|
348
408
|
}
|
|
409
|
+
//#endregion smoo/lmao!n/tracer-architecture
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ArrayQueueTracer.d.ts","sourceRoot":"","sources":["../../../src/lib/tracers/ArrayQueueTracer.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAE9C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,qBAAa,gBAAgB,CAAC,CAAC,SAAS,gBAAgB,GAAG,gBAAgB,CAAE,SAAQ,MAAM,CAAC,CAAC,CAAC;IAC5F;;;;OAIG;IACH,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,WAAW,CAAC,CAAC,EAAE,CAAM;IAEhE,YAAY,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,WAAW,CAAC,CAAC,GAAG,IAAI;
|
|
1
|
+
{"version":3,"file":"ArrayQueueTracer.d.ts","sourceRoot":"","sources":["../../../src/lib/tracers/ArrayQueueTracer.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAE9C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,qBAAa,gBAAgB,CAAC,CAAC,SAAS,gBAAgB,GAAG,gBAAgB,CAAE,SAAQ,MAAM,CAAC,CAAC,CAAC;IAC5F;;;;OAIG;IACH,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,WAAW,CAAC,CAAC,EAAE,CAAM;IAEhE,YAAY,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,WAAW,CAAC,CAAC,GAAG,IAAI,CAExE;IAED,UAAU,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,WAAW,CAAC,CAAC,GAAG,IAAI,CAErE;IAED,WAAW,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,WAAW,CAAC,CAAC,GAAG,IAAI,CAExE;IAED,SAAS,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,WAAW,CAAC,CAAC,GAAG,IAAI,CAEtE;IAED,mBAAmB,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,WAAW,CAAC,CAAC,GAAG,IAAI,CAE3E;IAED;;;;;OAKG;IACH,KAAK,IAAI,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,WAAW,CAAC,CAAC,EAAE,CAIlD;CACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CompositeTracer.d.ts","sourceRoot":"","sources":["../../../src/lib/tracers/CompositeTracer.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,EAAE,MAAM,EAAE,KAAK,aAAa,EAAE,MAAM,cAAc,CAAC;AAC1D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAQ9C,MAAM,WAAW,sBAAsB,CAAC,CAAC,SAAS,gBAAgB,GAAG,gBAAgB,CACnF,SAAQ,aAAa,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,WAAW,CAAC,CAAC;IACnD,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;CACxB;AAED;;;;;GAKG;AAEH,qBAAa,eAAe,CAAC,CAAC,SAAS,gBAAgB,GAAG,gBAAgB,CAAE,SAAQ,MAAM,CAAC,CAAC,CAAC;IAC3F,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAc;
|
|
1
|
+
{"version":3,"file":"CompositeTracer.d.ts","sourceRoot":"","sources":["../../../src/lib/tracers/CompositeTracer.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,EAAE,MAAM,EAAE,KAAK,aAAa,EAAE,MAAM,cAAc,CAAC;AAC1D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAQ9C,MAAM,WAAW,sBAAsB,CAAC,CAAC,SAAS,gBAAgB,GAAG,gBAAgB,CACnF,SAAQ,aAAa,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,WAAW,CAAC,CAAC;IACnD,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;CACxB;AAED;;;;;GAKG;AAEH,qBAAa,eAAe,CAAC,CAAC,SAAS,gBAAgB,GAAG,gBAAgB,CAAE,SAAQ,MAAM,CAAC,CAAC,CAAC;IAC3F,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAc;IAExC,YAAY,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,sBAAsB,CAAC,CAAC,CAAC,EAGzD;IAED,YAAY,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,WAAW,CAAC,CAAC,GAAG,IAAI,CAIvE;IAED,UAAU,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,WAAW,CAAC,CAAC,GAAG,IAAI,CAIrE;IAED,WAAW,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,WAAW,CAAC,CAAC,GAAG,IAAI,CAIvE;IAED,SAAS,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,WAAW,CAAC,CAAC,GAAG,IAAI,CAIrE;IAED,mBAAmB,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,WAAW,CAAC,CAAC,GAAG,IAAI,CAI1E;IAEc,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAMpC;IAEK,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAW3B;CACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NoOpTracer.d.ts","sourceRoot":"","sources":["../../../src/lib/tracers/NoOpTracer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAE9C;;;;;;;GAOG;AAEH,qBAAa,UAAU,CAAC,CAAC,SAAS,gBAAgB,GAAG,gBAAgB,CAAE,SAAQ,MAAM,CAAC,CAAC,CAAC;IACtF;;OAEG;IACH,YAAY,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,WAAW,CAAC,CAAC,GAAG,IAAI;
|
|
1
|
+
{"version":3,"file":"NoOpTracer.d.ts","sourceRoot":"","sources":["../../../src/lib/tracers/NoOpTracer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAE9C;;;;;;;GAOG;AAEH,qBAAa,UAAU,CAAC,CAAC,SAAS,gBAAgB,GAAG,gBAAgB,CAAE,SAAQ,MAAM,CAAC,CAAC,CAAC;IACtF;;OAEG;IACH,YAAY,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,WAAW,CAAC,CAAC,GAAG,IAAI,CAExE;IAED;;OAEG;IACH,UAAU,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,WAAW,CAAC,CAAC,GAAG,IAAI,CAEtE;IAED;;OAEG;IACH,WAAW,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,WAAW,CAAC,CAAC,GAAG,IAAI,CAExE;IAED;;OAEG;IACH,SAAS,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,WAAW,CAAC,CAAC,GAAG,IAAI,CAEtE;IAED;;OAEG;IACH,mBAAmB,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,WAAW,CAAC,CAAC,GAAG,IAAI,CAE3E;CACF"}
|
|
@@ -1,3 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* NoOpTracer - A tracer that executes ops but discards all trace data
|
|
3
|
+
*
|
|
4
|
+
* All lifecycle hooks are no-ops - traces execute normally but produce no output.
|
|
5
|
+
* Useful for:
|
|
6
|
+
* - Tests that don't need to inspect trace output
|
|
7
|
+
* - Disabling tracing in production without code changes
|
|
8
|
+
* - Baseline performance testing (measures op execution cost without tracing overhead)
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* ```typescript
|
|
12
|
+
* import { createTraceRoot } from '@smoothbricks/lmao/node';
|
|
13
|
+
* import { JsBufferStrategy } from '@smoothbricks/lmao';
|
|
14
|
+
*
|
|
15
|
+
* const ctx = defineOpContext({ logSchema });
|
|
16
|
+
* const { trace } = new NoOpTracer(ctx, {
|
|
17
|
+
* bufferStrategy: new JsBufferStrategy(),
|
|
18
|
+
* createTraceRoot,
|
|
19
|
+
* });
|
|
20
|
+
*
|
|
21
|
+
* // Trace executes, result returned, no side effects
|
|
22
|
+
* const result = await trace('fetch', fetchOp);
|
|
23
|
+
* ```
|
|
24
|
+
*/
|
|
1
25
|
import { Tracer } from '../tracer.js';
|
|
2
26
|
/**
|
|
3
27
|
* No-op tracer - executes ops normally but discards all trace data
|
|
@@ -40,3 +64,4 @@ export class NoOpTracer extends Tracer {
|
|
|
40
64
|
// No-op
|
|
41
65
|
}
|
|
42
66
|
}
|
|
67
|
+
//#endregion smoo/lmao!n/tracer-implementations.noop
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SQLiteTracer.d.ts","sourceRoot":"","sources":["../../../src/lib/tracers/SQLiteTracer.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAE9D,OAAO,KAAK,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAEtF,OAAO,EAAE,MAAM,EAAE,KAAK,aAAa,EAAE,MAAM,cAAc,CAAC;AAC1D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAE9C,MAAM,WAAW,mBAAmB,CAClC,CAAC,SAAS,OAAO,wBAAwB,EAAE,SAAS,GAAG,OAAO,wBAAwB,EAAE,SAAS,CACjG,SAAQ,aAAa,CAAC,CAAC,CAAC;IACxB,EAAE,EAAE,kBAAkB,CAAC;CACxB;AAED,MAAM,WAAW,wBAAwB,CACvC,CAAC,SAAS,OAAO,wBAAwB,EAAE,SAAS,GAAG,OAAO,wBAAwB,EAAE,SAAS,CACjG,SAAQ,aAAa,CAAC,CAAC,CAAC;IACxB,EAAE,EAAE,mBAAmB,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAAC;CACxD;AAED;;GAEG;AAEH,qBAAa,YAAY,CAAC,CAAC,SAAS,gBAAgB,GAAG,gBAAgB,CAAE,SAAQ,MAAM,CAAC,CAAC,CAAC;IACxF,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAoB;
|
|
1
|
+
{"version":3,"file":"SQLiteTracer.d.ts","sourceRoot":"","sources":["../../../src/lib/tracers/SQLiteTracer.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"StdioTracer.d.ts","sourceRoot":"","sources":["../../../src/lib/tracers/StdioTracer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAY9D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAE7D,MAAM,WAAW,aAAa;IAC5B,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;CAC/B;AA+HD;;GAEG;AACH,MAAM,WAAW,kBAAkB,CACjC,CAAC,SAAS,OAAO,wBAAwB,EAAE,SAAS,GAAG,OAAO,wBAAwB,EAAE,SAAS,CACjG,SAAQ,aAAa,CAAC,CAAC,CAAC;IACxB,iDAAiD;IACjD,GAAG,CAAC,EAAE,aAAa,CAAC;IACpB,gDAAgD;IAChD,GAAG,CAAC,EAAE,aAAa,CAAC;IACpB,4CAA4C;IAC5C,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAMD;;;;;;;;;GASG;AAEH,qBAAa,WAAW,CAAC,CAAC,SAAS,gBAAgB,GAAG,gBAAgB,CAAE,SAAQ,MAAM,CAAC,CAAC,CAAC;IACvF;;;OAGG;IACH,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA6B;IAErD,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAgB;IACpC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAgB;IACpC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAU;
|
|
1
|
+
{"version":3,"file":"StdioTracer.d.ts","sourceRoot":"","sources":["../../../src/lib/tracers/StdioTracer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAY9D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAE7D,MAAM,WAAW,aAAa;IAC5B,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;CAC/B;AA+HD;;GAEG;AACH,MAAM,WAAW,kBAAkB,CACjC,CAAC,SAAS,OAAO,wBAAwB,EAAE,SAAS,GAAG,OAAO,wBAAwB,EAAE,SAAS,CACjG,SAAQ,aAAa,CAAC,CAAC,CAAC;IACxB,iDAAiD;IACjD,GAAG,CAAC,EAAE,aAAa,CAAC;IACpB,gDAAgD;IAChD,GAAG,CAAC,EAAE,aAAa,CAAC;IACpB,4CAA4C;IAC5C,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAMD;;;;;;;;;GASG;AAEH,qBAAa,WAAW,CAAC,CAAC,SAAS,gBAAgB,GAAG,gBAAgB,CAAE,SAAQ,MAAM,CAAC,CAAC,CAAC;IACvF;;;OAGG;IACH,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA6B;IAErD,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAgB;IACpC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAgB;IACpC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAU;IAEvC,YAAY,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,kBAAkB,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,WAAW,CAAC,CAAC,EAKhF;IAMD,OAAO,CAAC,SAAS;IAKjB,OAAO,CAAC,eAAe;IAKvB,OAAO,CAAC,eAAe;IAcvB,OAAO,CAAC,KAAK;IAIb,OAAO,CAAC,KAAK;IAIb,OAAO,CAAC,YAAY;IAoCpB,YAAY,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,WAAW,CAAC,CAAC,GAAG,aAAa,GAAG,IAAI,CAOvF;IAED,UAAU,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,WAAW,CAAC,CAAC,GAAG,aAAa,GAAG,IAAI,CAqBrF;IAED,WAAW,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,WAAW,CAAC,CAAC,GAAG,aAAa,GAAG,IAAI,CAQvF;IAED,SAAS,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,WAAW,CAAC,CAAC,GAAG,aAAa,GAAG,IAAI,CAsBrF;IAED,mBAAmB,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,WAAW,CAAC,CAAC,GAAG,IAAI,CAgB3E;CACF"}
|
|
@@ -1,3 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* StdioTracer - A tracer that prints spans to stdout/stderr
|
|
3
|
+
*
|
|
4
|
+
* Features:
|
|
5
|
+
* - Color-coded trace IDs based on trace_id for visual separation of concurrent traces
|
|
6
|
+
* - Per-trace indent tracking using Map<TraceId, number> for correct nesting
|
|
7
|
+
* - Human-readable timestamps (ISO 8601) and durations
|
|
8
|
+
* - Tree-style output with ├─ for start and └─ for end
|
|
9
|
+
* - Exceptions written to stderr
|
|
10
|
+
*
|
|
11
|
+
* Useful for development/debugging to see span execution in real-time.
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* ```typescript
|
|
15
|
+
* import { createTraceRoot } from '@smoothbricks/lmao/node';
|
|
16
|
+
* import { JsBufferStrategy } from '@smoothbricks/lmao';
|
|
17
|
+
*
|
|
18
|
+
* const ctx = defineOpContext({ logSchema: mySchema });
|
|
19
|
+
* const { trace } = new StdioTracer(ctx, {
|
|
20
|
+
* bufferStrategy: new JsBufferStrategy(),
|
|
21
|
+
* createTraceRoot,
|
|
22
|
+
* });
|
|
23
|
+
*
|
|
24
|
+
* await trace('fetch-user', fetchOp);
|
|
25
|
+
*
|
|
26
|
+
* // Output:
|
|
27
|
+
* // [2025-12-25T10:30:45.123Z] [123456] fetch-user
|
|
28
|
+
* // [2025-12-25T10:30:45.125Z] [123456] ├─ db-query
|
|
29
|
+
* // [2025-12-25T10:30:45.225Z] [123456] └─ db-query [OK] (100.00ms)
|
|
30
|
+
* // [2025-12-25T10:30:45.226Z] [123456] fetch-user (103.00ms) ========
|
|
31
|
+
* ```
|
|
32
|
+
*/
|
|
1
33
|
import { ENTRY_TYPE_DEBUG, ENTRY_TYPE_ERROR, ENTRY_TYPE_INFO, ENTRY_TYPE_SPAN_ERR, ENTRY_TYPE_SPAN_EXCEPTION, ENTRY_TYPE_SPAN_OK, ENTRY_TYPE_TRACE, ENTRY_TYPE_WARN, } from '../schema/systemSchema.js';
|
|
2
34
|
import { Tracer } from '../tracer.js';
|
|
3
35
|
// ============================================================================
|
|
@@ -15,14 +47,14 @@ function formatTimestamp(nanos) {
|
|
|
15
47
|
*/
|
|
16
48
|
function formatDuration(nanos) {
|
|
17
49
|
const n = Number(nanos);
|
|
18
|
-
if (n >=
|
|
19
|
-
return `${(n /
|
|
50
|
+
if (n >= 1000000000) {
|
|
51
|
+
return `${(n / 1000000000).toFixed(2)}s`;
|
|
20
52
|
}
|
|
21
|
-
if (n >=
|
|
22
|
-
return `${(n /
|
|
53
|
+
if (n >= 1000000) {
|
|
54
|
+
return `${(n / 1000000).toFixed(2)}ms`;
|
|
23
55
|
}
|
|
24
|
-
if (n >=
|
|
25
|
-
return `${(n /
|
|
56
|
+
if (n >= 1000) {
|
|
57
|
+
return `${(n / 1000).toFixed(2)}µs`;
|
|
26
58
|
}
|
|
27
59
|
return `${n}ns`;
|
|
28
60
|
}
|
|
@@ -269,3 +301,4 @@ export class StdioTracer extends Tracer {
|
|
|
269
301
|
`capacity=${stats.capacity}\n`);
|
|
270
302
|
}
|
|
271
303
|
}
|
|
304
|
+
//#endregion smoo/lmao!n/tracer-implementations.stdio
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TestTracer.d.ts","sourceRoot":"","sources":["../../../src/lib/tracers/TestTracer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAU9C;;GAEG;AACH,MAAM,WAAW,aAAa,CAAC,CAAC,SAAS,SAAS,GAAG,SAAS;IAC5D,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAEH,qBAAa,UAAU,CAAC,CAAC,SAAS,gBAAgB,GAAG,gBAAgB,CAAE,SAAQ,MAAM,CAAC,CAAC,CAAC;IACtF;;;OAGG;IACH,QAAQ,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,WAAW,CAAC,CAAC,EAAE,CAAM;IAEtE;;;OAGG;IACH,QAAQ,CAAC,cAAc,EAAE,aAAa,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,WAAW,CAAC,CAAC,EAAE,CAAM;IAM5E,YAAY,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,WAAW,CAAC,CAAC,GAAG,IAAI;
|
|
1
|
+
{"version":3,"file":"TestTracer.d.ts","sourceRoot":"","sources":["../../../src/lib/tracers/TestTracer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAU9C;;GAEG;AACH,MAAM,WAAW,aAAa,CAAC,CAAC,SAAS,SAAS,GAAG,SAAS;IAC5D,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAEH,qBAAa,UAAU,CAAC,CAAC,SAAS,gBAAgB,GAAG,gBAAgB,CAAE,SAAQ,MAAM,CAAC,CAAC,CAAC;IACtF;;;OAGG;IACH,QAAQ,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,WAAW,CAAC,CAAC,EAAE,CAAM;IAEtE;;;OAGG;IACH,QAAQ,CAAC,cAAc,EAAE,aAAa,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,WAAW,CAAC,CAAC,EAAE,CAAM;IAM5E,YAAY,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,WAAW,CAAC,CAAC,GAAG,IAAI,CAExE;IAED,UAAU,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,WAAW,CAAC,CAAC,GAAG,IAAI,CAGrE;IAED,WAAW,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,WAAW,CAAC,CAAC,GAAG,IAAI,CAExE;IAED,SAAS,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,WAAW,CAAC,CAAC,GAAG,IAAI,CAEtE;IAED,mBAAmB,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,WAAW,CAAC,CAAC,GAAG,IAAI,CAS1E;IAMD;;;OAGG;IACH,KAAK,IAAI,IAAI,CAQZ;CACF"}
|
|
@@ -1,3 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TestTracer - A tracer that accumulates completed root trace buffers for test inspection.
|
|
3
|
+
*
|
|
4
|
+
* Child spans are accessible via the buffer's `_children` tree - no need to track them separately.
|
|
5
|
+
* This is the primary tracer for tests that need to inspect trace output, convert to Arrow tables,
|
|
6
|
+
* or verify buffer contents.
|
|
7
|
+
*
|
|
8
|
+
* @example
|
|
9
|
+
* ```typescript
|
|
10
|
+
* import { createTraceRoot } from '@smoothbricks/lmao/node';
|
|
11
|
+
* import { JsBufferStrategy } from '@smoothbricks/lmao';
|
|
12
|
+
*
|
|
13
|
+
* const ctx = defineOpContext({ logSchema });
|
|
14
|
+
* const tracer = new TestTracer(ctx, {
|
|
15
|
+
* bufferStrategy: new JsBufferStrategy(),
|
|
16
|
+
* createTraceRoot,
|
|
17
|
+
* });
|
|
18
|
+
*
|
|
19
|
+
* await tracer.trace('my-op', myOp);
|
|
20
|
+
*
|
|
21
|
+
* // Inspect buffers
|
|
22
|
+
* expect(tracer.rootBuffers).toHaveLength(1);
|
|
23
|
+
*
|
|
24
|
+
* // Convert to Arrow using strategy
|
|
25
|
+
* const table = await tracer.bufferStrategy.toArrowTable(tracer.rootBuffers[0]);
|
|
26
|
+
* ```
|
|
27
|
+
*
|
|
28
|
+
* @module tracers/TestTracer
|
|
29
|
+
*/
|
|
1
30
|
import { Tracer } from '../tracer.js';
|
|
2
31
|
function isResettableBufferStrategy(value) {
|
|
3
32
|
return typeof value === 'object' && value !== null && typeof Reflect.get(value, 'reset') === 'function';
|
|
@@ -86,3 +115,4 @@ export class TestTracer extends Tracer {
|
|
|
86
115
|
}
|
|
87
116
|
}
|
|
88
117
|
}
|
|
118
|
+
//#endregion smoo/lmao!n/tracer-implementations.test
|
package/dist/lib/types.js
CHANGED
|
@@ -1 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LMAO-specific types for trace logging
|
|
3
|
+
*
|
|
4
|
+
* ## Type System
|
|
5
|
+
*
|
|
6
|
+
* - `AnySpanBuffer`: NO index signatures, accepts any schema (for generic processing)
|
|
7
|
+
* - `SpanBuffer<T>`: WITH index signatures, typed for specific schema T (T is REQUIRED)
|
|
8
|
+
*
|
|
9
|
+
* This mirrors arrow-builder's AnyColumnBuffer/ColumnBuffer<T> pattern.
|
|
10
|
+
*/
|
|
1
11
|
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utf8Cache.d.ts","sourceRoot":"","sources":["../../src/lib/utf8Cache.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAGH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAY/D,KAAK,gBAAgB,GAAG;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,OAAO,EAAE,UAAU,CAAA;CAAE,CAAC;AAClE,KAAK,cAAc,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAEtF;;;;;;;;;GASG;AAEH,qBAAa,SAAU,YAAW,WAAW;IAC3C,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAiC;IACvD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAqB;IAG7C,OAAO,CAAC,IAAI,CAAK;IACjB,OAAO,CAAC,MAAM,CAAK;
|
|
1
|
+
{"version":3,"file":"utf8Cache.d.ts","sourceRoot":"","sources":["../../src/lib/utf8Cache.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAGH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAY/D,KAAK,gBAAgB,GAAG;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,OAAO,EAAE,UAAU,CAAA;CAAE,CAAC;AAClE,KAAK,cAAc,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAEtF;;;;;;;;;GASG;AAEH,qBAAa,SAAU,YAAW,WAAW;IAC3C,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAiC;IACvD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAqB;IAG7C,OAAO,CAAC,IAAI,CAAK;IACjB,OAAO,CAAC,MAAM,CAAK;IAEnB,YAAY,OAAO,SAA0B,EAE5C;IAED;;;;;OAKG;IACH,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU,CAW9B;IAED;;;;;;;OAOG;IACH,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAa9B;IAED;;;;;;;OAOG;IACH,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAKlE;IAED;;;;;;;;OAQG;IACH,UAAU,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,GAAG,gBAAgB,CA0BvD;IAED;;OAEG;IACH,IAAI,KAAK,IAAI,cAAc,CAQ1B;IAED;;OAEG;IACH,UAAU,IAAI,IAAI,CAGjB;IAED;;OAEG;IACH,KAAK,IAAI,IAAI,CAIZ;CACF;AAED;;;;;;;;GAQG;AACH,eAAO,MAAM,eAAe,WAAkB,CAAC;AAE/C;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAE3D"}
|
package/dist/lib/utf8Cache.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WasmBufferStrategy.d.ts","sourceRoot":"","sources":["../../../src/lib/wasm/WasmBufferStrategy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAE3D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAExD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC7D,OAAO,EAAuB,KAAK,aAAa,EAAE,KAAK,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAmBxG;;GAEG;AACH,MAAM,WAAW,yBAA0B,SAAQ,oBAAoB;IACrE,mEAAmE;IACnE,SAAS,CAAC,EAAE,aAAa,CAAC;CAC3B;AAED,KAAK,kBAAkB,GAAG;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF;;;;;;;;;;;;;GAaG;AACH,qBAAa,kBAAkB,CAAC,CAAC,SAAS,SAAS,GAAG,SAAS,CAAE,YAAW,cAAc,CAAC,CAAC,CAAC;IAC3F;;;OAGG;IACH,QAAQ,CAAC,SAAS,EAAE,aAAa,CAAC;IAElC;;OAEG;IACH,OAAO;
|
|
1
|
+
{"version":3,"file":"WasmBufferStrategy.d.ts","sourceRoot":"","sources":["../../../src/lib/wasm/WasmBufferStrategy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAE3D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAExD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC7D,OAAO,EAAuB,KAAK,aAAa,EAAE,KAAK,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAmBxG;;GAEG;AACH,MAAM,WAAW,yBAA0B,SAAQ,oBAAoB;IACrE,mEAAmE;IACnE,SAAS,CAAC,EAAE,aAAa,CAAC;CAC3B;AAED,KAAK,kBAAkB,GAAG;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF;;;;;;;;;;;;;GAaG;AACH,qBAAa,kBAAkB,CAAC,CAAC,SAAS,SAAS,GAAG,SAAS,CAAE,YAAW,cAAc,CAAC,CAAC,CAAC;IAC3F;;;OAGG;IACH,QAAQ,CAAC,SAAS,EAAE,aAAa,CAAC;IAElC;;OAEG;IACH,OAAO,eAEN;IAED;;;;;;;OAOG;IACH,OAAa,MAAM,CAAC,CAAC,SAAS,SAAS,GAAG,SAAS,EACjD,OAAO,CAAC,EAAE,yBAAyB,GAClC,OAAO,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,CAGhC;IAED,gBAAgB,CAAC,MAAM,EAAE,CAAC,EAAE,SAAS,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,UAAU,CAAC,CAAC,CAAC,CAsB3G;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,CAwBf;IAED,oBAAoB,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,CAYzD;IAED,YAAY,CAAC,MAAM,EAAE,aAAa,GAAG,KAAK,CAGzC;IAED,aAAa,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI,CAGzC;IAED;;OAEG;IACH,OAAO,CAAC,YAAY;IAmBpB;;;OAGG;IACH,KAAK,IAAI,IAAI,CAEZ;IAED;;OAEG;IACH,QAAQ,IAAI,kBAAkB,CAO7B;CACF"}
|
|
@@ -1,3 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WasmBufferStrategy - Buffer strategy using WASM memory with freelist allocation.
|
|
3
|
+
*
|
|
4
|
+
* Uses WebAssembly memory for numeric columns with O(1) freelist allocation/deallocation.
|
|
5
|
+
* String columns remain in JavaScript.
|
|
6
|
+
*
|
|
7
|
+
* Memory characteristics:
|
|
8
|
+
* - Numeric data lives in contiguous WASM memory (better cache locality)
|
|
9
|
+
* - Freelist enables O(1) memory reuse across traces
|
|
10
|
+
* - Explicit release required (not GC-managed)
|
|
11
|
+
* - Arrow conversion reads from WASM memory views
|
|
12
|
+
*
|
|
13
|
+
* @module WasmBufferStrategy
|
|
14
|
+
*/
|
|
1
15
|
import { convertSpanTreeToArrowTable } from '../convertToArrow.js';
|
|
2
16
|
import { EMPTY_SCOPE } from '../spanBuffer.js';
|
|
3
17
|
import { createWasmAllocator } from './wasmAllocator.js';
|
|
@@ -138,3 +152,4 @@ export class WasmBufferStrategy {
|
|
|
138
152
|
};
|
|
139
153
|
}
|
|
140
154
|
}
|
|
155
|
+
//#endregion smoo/lmao!n/wasm-mem.strategy
|
|
@@ -1,3 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TypeScript wrapper for the WASM allocator.
|
|
3
|
+
*
|
|
4
|
+
* Implements spec 01q: WASM Memory Architecture for SpanBuffer Storage
|
|
5
|
+
*
|
|
6
|
+
* The allocator provides O(1) alloc/free via freelists with memory reuse.
|
|
7
|
+
* Each OpContext may have a different capacity - capacity is passed to each call.
|
|
8
|
+
*
|
|
9
|
+
* Buddy Allocation:
|
|
10
|
+
* - Blocks are organized by tier (capacity 8, 16, 32, 64, 128, 256, 512)
|
|
11
|
+
* - When freelist is empty, splits from larger tier
|
|
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).
|
|
15
|
+
*/
|
|
1
16
|
/**
|
|
2
17
|
* Size class enum matching Zig's SizeClass
|
|
3
18
|
*/
|
|
@@ -225,3 +240,4 @@ export function createWasmAllocatorSync(wasmModule, options) {
|
|
|
225
240
|
const instance = new WebAssembly.Instance(wasmModule, imports);
|
|
226
241
|
return wrapWasmInstance(instance, memory, capacity);
|
|
227
242
|
}
|
|
243
|
+
//#endregion smoo/lmao!n/wasm-mem.ts-allocator
|
|
@@ -1,3 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WASM-backed SpanBuffer class generation.
|
|
3
|
+
*
|
|
4
|
+
* Implements spec 01q: WASM Memory Architecture for SpanBuffer Storage
|
|
5
|
+
*
|
|
6
|
+
* Key differences from JS SpanBuffer:
|
|
7
|
+
* - System columns (timestamp, entry_type) live in WASM memory at _systemPtr
|
|
8
|
+
* - Numeric columns allocated lazily from WASM freelists
|
|
9
|
+
* - String columns (category, text) remain as JS string[] arrays
|
|
10
|
+
* - All TypedArray views created on-demand from WASM memory.buffer
|
|
11
|
+
*/
|
|
1
12
|
import { getSchemaType } from '@smoothbricks/arrow-builder';
|
|
2
13
|
import { checkCapacityTuning } from '../capacityTuning.js';
|
|
3
14
|
function getFieldEager(value) {
|
|
@@ -770,3 +781,4 @@ export function createWasmOverflowBuffer(buffer, _traceRoot, _scopeValues, _opMe
|
|
|
770
781
|
buffer._overflow = overflow;
|
|
771
782
|
return overflow;
|
|
772
783
|
}
|
|
784
|
+
//#endregion smoo/lmao!n/wasm-mem.spanbuffer
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wasmTraceRoot.d.ts","sourceRoot":"","sources":["../../../src/lib/wasm/wasmTraceRoot.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAE1D,OAAO,EAAiB,KAAK,OAAO,EAAE,MAAM,eAAe,CAAC;AAC5D,OAAO,KAAK,EAAE,UAAU,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AACxE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AASxD;;;GAGG;AACH,MAAM,WAAW,kBAAkB;IACjC,+EAA+E;IAC/E,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,sFAAsF;IACtF,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,oEAAoE;IACpE,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,CAAC;IAC5B,4EAA4E;IAC5E,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,IAAI,kBAAkB,CAE9E;AAMD;;;;;;;;;;;;GAYG;AACH,qBAAa,aAAc,YAAW,UAAU;IAC9C,4DAA4D;IAC5D,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAE/B,kCAAkC;IAClC,QAAQ,CAAC,SAAS,EAAE,aAAa,CAAC;IAElC,sBAAsB;IACtB,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAE3B,2CAA2C;IAC3C,QAAQ,CAAC,MAAM,EAAE,oBAAoB,CAAC;IAEtC;;;OAGG;IACH,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"wasmTraceRoot.d.ts","sourceRoot":"","sources":["../../../src/lib/wasm/wasmTraceRoot.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAE1D,OAAO,EAAiB,KAAK,OAAO,EAAE,MAAM,eAAe,CAAC;AAC5D,OAAO,KAAK,EAAE,UAAU,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AACxE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AASxD;;;GAGG;AACH,MAAM,WAAW,kBAAkB;IACjC,+EAA+E;IAC/E,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,sFAAsF;IACtF,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,oEAAoE;IACpE,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,CAAC;IAC5B,4EAA4E;IAC5E,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,IAAI,kBAAkB,CAE9E;AAMD;;;;;;;;;;;;GAYG;AACH,qBAAa,aAAc,YAAW,UAAU;IAC9C,4DAA4D;IAC5D,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAE/B,kCAAkC;IAClC,QAAQ,CAAC,SAAS,EAAE,aAAa,CAAC;IAElC,sBAAsB;IACtB,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAE3B,2CAA2C;IAC3C,QAAQ,CAAC,MAAM,EAAE,oBAAoB,CAAC;IAEtC;;;OAGG;IACH,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAC;IAE9B,YAAY,SAAS,EAAE,aAAa,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,oBAAoB,EAepF;IAED;;;OAGG;IACH,IAAI,gBAAgB,IAAI,MAAM,CAG7B;IAED;;;OAGG;IACH,IAAI,aAAa,IAAI,MAAM,CAG1B;IAED;;;;;;;;OAQG;IACH,iBAAiB,IAAI,WAAW,CAI/B;IAOD;;;;;;;;;OASG;IACH,cAAc,CAAC,MAAM,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAmB5D;IAED;;;;;;OAMG;IACH,YAAY,CAAC,MAAM,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAwB3D;IAED;;;;;;;OAOG;IACH,aAAa,CAAC,MAAM,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAW9D;IAOD;;;;;;;OAOG;IACH,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,IAAI,CAE9D;IAED;;;OAGG;IACH,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAEzC;IAED;;;OAGG;IACH,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAE1C;IAED;;;;;;;;OAQG;IACH,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAElF;IAED;;;OAGG;IACH,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAE1C;IAED;;OAEG;IACH,IAAI,IAAI,IAAI,CAEX;CACF;AAMD;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CACjC,SAAS,EAAE,aAAa,EACxB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,oBAAoB,GAC3B,aAAa,CAEf;AAED;;;;;;;GAOG;AACH,wBAAgB,0BAA0B,CAAC,SAAS,EAAE,aAAa,cAC/C,MAAM,UAAU,oBAAoB,KAAG,aAAa,CAGvE"}
|
|
@@ -87,7 +87,7 @@ export class WasmTraceRoot {
|
|
|
87
87
|
*/
|
|
88
88
|
getTimestampNanos() {
|
|
89
89
|
const elapsedMs = performance.now() - this.anchorPerfNow;
|
|
90
|
-
const elapsedNanos = BigInt(Math.round(elapsedMs *
|
|
90
|
+
const elapsedNanos = BigInt(Math.round(elapsedMs * 1000000));
|
|
91
91
|
return Nanoseconds.unsafe(this.anchorEpochNanos + elapsedNanos);
|
|
92
92
|
}
|
|
93
93
|
// ===========================================================================
|
|
@@ -262,3 +262,4 @@ export function createWasmTraceRootFactory(allocator) {
|
|
|
262
262
|
return new WasmTraceRoot(allocator, createTraceId(trace_id), tracer);
|
|
263
263
|
};
|
|
264
264
|
}
|
|
265
|
+
//#endregion smoo/lmao!n/wasm-mem.trace-root
|
package/dist/node.js
CHANGED
|
@@ -7,3 +7,4 @@ export * from './index.js';
|
|
|
7
7
|
// Export Node.js-specific TraceRoot factory for Tracer construction
|
|
8
8
|
//#region smoo/lmao!n/trace-root-timestamps.entry-points #node
|
|
9
9
|
export { createTraceRoot } from './lib/traceRoot.node.js';
|
|
10
|
+
//#endregion smoo/lmao!n/trace-root-timestamps.entry-points
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@smoothbricks/lmao",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.2",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"sideEffects": false,
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -124,10 +124,11 @@
|
|
|
124
124
|
"dependencies": {
|
|
125
125
|
"@msgpack/msgpack": "^3.1.3",
|
|
126
126
|
"@neophi/sieve-cache": "^1.5.0",
|
|
127
|
-
"@smoothbricks/arrow-builder": "0.1.
|
|
128
|
-
"@smoothbricks/validation": "0.1.
|
|
127
|
+
"@smoothbricks/arrow-builder": "0.1.4",
|
|
128
|
+
"@smoothbricks/validation": "0.1.3",
|
|
129
129
|
"@uwdata/flechette": "^2.3.0",
|
|
130
|
-
"tslib": "^2.8.1"
|
|
130
|
+
"tslib": "^2.8.1",
|
|
131
|
+
"typia": "13.1.1"
|
|
131
132
|
},
|
|
132
133
|
"scripts": {
|
|
133
134
|
"bench": "bun run benchmarks/*.bench.ts",
|
|
@@ -43,8 +43,8 @@ export function cleanupDebugActiveHandles(label: string): void {
|
|
|
43
43
|
if (typeof handle !== 'object' || handle === null) {
|
|
44
44
|
return typeof handle;
|
|
45
45
|
}
|
|
46
|
-
const
|
|
47
|
-
const name = typeof
|
|
46
|
+
const handleConstructor = Reflect.get(handle, 'constructor');
|
|
47
|
+
const name = typeof handleConstructor === 'function' ? Reflect.get(handleConstructor, 'name') : undefined;
|
|
48
48
|
return typeof name === 'string' && name.length > 0 ? name : 'Object';
|
|
49
49
|
});
|
|
50
50
|
|