@smoothbricks/lmao 0.2.2 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +206 -206
- package/dist/allocator.wasm +0 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/lib/JsBufferStrategy.d.ts +4 -3
- package/dist/lib/JsBufferStrategy.d.ts.map +1 -1
- package/dist/lib/JsBufferStrategy.js +18 -11
- package/dist/lib/arrow/lease.d.ts +10 -0
- package/dist/lib/arrow/lease.d.ts.map +1 -0
- package/dist/lib/arrow/lease.js +33 -0
- package/dist/lib/arrow/utils.d.ts +3 -4
- package/dist/lib/arrow/utils.d.ts.map +1 -1
- package/dist/lib/arrow/utils.js +12 -13
- package/dist/lib/arrow/vocabularyDictionary.d.ts +21 -0
- package/dist/lib/arrow/vocabularyDictionary.d.ts.map +1 -0
- package/dist/lib/arrow/vocabularyDictionary.js +95 -0
- package/dist/lib/bufferStrategy.d.ts +3 -2
- package/dist/lib/bufferStrategy.d.ts.map +1 -1
- package/dist/lib/cloudflare/traceRows.d.ts.map +1 -1
- package/dist/lib/cloudflare/traceRows.js +3 -2
- package/dist/lib/codegen/evaluatorGenerator.d.ts.map +1 -1
- package/dist/lib/codegen/evaluatorGenerator.js +12 -11
- package/dist/lib/codegen/fixedPositionWriterGenerator.d.ts +44 -82
- package/dist/lib/codegen/fixedPositionWriterGenerator.d.ts.map +1 -1
- package/dist/lib/codegen/fixedPositionWriterGenerator.js +223 -162
- package/dist/lib/codegen/spanLoggerClosureMaterializer.d.ts +63 -0
- package/dist/lib/codegen/spanLoggerClosureMaterializer.d.ts.map +1 -0
- package/dist/lib/codegen/spanLoggerClosureMaterializer.js +447 -0
- package/dist/lib/codegen/spanLoggerGenerator.d.ts +36 -19
- package/dist/lib/codegen/spanLoggerGenerator.d.ts.map +1 -1
- package/dist/lib/codegen/spanLoggerGenerator.js +164 -158
- package/dist/lib/convertToArrow.d.ts +7 -2
- package/dist/lib/convertToArrow.d.ts.map +1 -1
- package/dist/lib/convertToArrow.js +499 -285
- package/dist/lib/defineOpContext.js +1 -1
- package/dist/lib/enumMetadata.d.ts +19 -0
- package/dist/lib/enumMetadata.d.ts.map +1 -0
- package/dist/lib/enumMetadata.js +86 -0
- package/dist/lib/flushScheduler.d.ts.map +1 -1
- package/dist/lib/flushScheduler.js +13 -4
- package/dist/lib/library.d.ts +16 -98
- package/dist/lib/library.d.ts.map +1 -1
- package/dist/lib/library.js +32 -525
- package/dist/lib/logBinding.d.ts +21 -27
- package/dist/lib/logBinding.d.ts.map +1 -1
- package/dist/lib/op.d.ts +30 -30
- package/dist/lib/op.d.ts.map +1 -1
- package/dist/lib/op.js +15 -22
- package/dist/lib/opContext/createOpGroup.d.ts +1 -1
- package/dist/lib/opContext/createOpGroup.d.ts.map +1 -1
- package/dist/lib/opContext/createOpGroup.js +22 -29
- package/dist/lib/opContext/defineOp.d.ts +4 -4
- package/dist/lib/opContext/defineOp.d.ts.map +1 -1
- package/dist/lib/opContext/defineOp.js +53 -10
- package/dist/lib/opContext/opGroupTypes.d.ts +2 -2
- package/dist/lib/opContext/opTypes.d.ts +1 -1
- package/dist/lib/opContext/opTypes.d.ts.map +1 -1
- package/dist/lib/opContext/spanContextTypes.d.ts +33 -18
- package/dist/lib/opContext/spanContextTypes.d.ts.map +1 -1
- package/dist/lib/opContext/types.d.ts +4 -4
- package/dist/lib/opContext/types.d.ts.map +1 -1
- package/dist/lib/physicalLayoutPlan.d.ts +89 -0
- package/dist/lib/physicalLayoutPlan.d.ts.map +1 -0
- package/dist/lib/physicalLayoutPlan.js +442 -0
- package/dist/lib/resolveMessage.d.ts +9 -0
- package/dist/lib/resolveMessage.d.ts.map +1 -0
- package/dist/lib/resolveMessage.js +63 -0
- package/dist/lib/result.d.ts +5 -7
- package/dist/lib/result.d.ts.map +1 -1
- package/dist/lib/result.js +19 -26
- package/dist/lib/runtimeHint.d.ts +35 -0
- package/dist/lib/runtimeHint.d.ts.map +1 -0
- package/dist/lib/runtimeHint.js +79 -0
- package/dist/lib/schema/typeGuards.d.ts +7 -47
- package/dist/lib/schema/typeGuards.d.ts.map +1 -1
- package/dist/lib/schema/typeGuards.js +7 -123
- package/dist/lib/schema/types.d.ts +1 -1
- package/dist/lib/schema/types.d.ts.map +1 -1
- package/dist/lib/span-buffer/aot/v1.d.ts +2 -0
- package/dist/lib/span-buffer/aot/v1.d.ts.map +1 -0
- package/dist/lib/span-buffer/aot/v1.js +24 -0
- package/dist/lib/spanBuffer.d.ts +33 -4
- package/dist/lib/spanBuffer.d.ts.map +1 -1
- package/dist/lib/spanBuffer.js +583 -91
- package/dist/lib/spanBufferStats.d.ts +1 -1
- package/dist/lib/spanBufferStats.d.ts.map +1 -1
- package/dist/lib/spanContext.d.ts +27 -51
- package/dist/lib/spanContext.d.ts.map +1 -1
- package/dist/lib/spanContext.js +822 -344
- package/dist/lib/sqlite/sqlite-common.d.ts.map +1 -1
- package/dist/lib/sqlite/sqlite-common.js +20 -21
- package/dist/lib/testing/bun-harness.d.ts +8 -3
- package/dist/lib/testing/bun-harness.d.ts.map +1 -1
- package/dist/lib/testing/bun-harness.js +30 -18
- package/dist/lib/testing/extractFacts.d.ts +1 -1
- package/dist/lib/testing/extractFacts.d.ts.map +1 -1
- package/dist/lib/testing/extractFacts.js +55 -63
- package/dist/lib/testing/facts.d.ts +1 -1
- package/dist/lib/testing/facts.d.ts.map +1 -1
- package/dist/lib/testing/queryable-span.d.ts +1 -1
- package/dist/lib/testing/queryable-span.d.ts.map +1 -1
- package/dist/lib/testing/queryable-span.js +26 -28
- package/dist/lib/testing/span-query.d.ts.map +1 -1
- package/dist/lib/testing/span-query.js +19 -22
- package/dist/lib/testing/stdio-replay.d.ts.map +1 -1
- package/dist/lib/testing/stdio-replay.js +19 -8
- package/dist/lib/threadId.d.ts.map +1 -1
- package/dist/lib/threadId.js +6 -3
- package/dist/lib/traceContext.d.ts.map +1 -1
- package/dist/lib/traceContext.js +1 -4
- package/dist/lib/traceRoot.d.ts +30 -8
- package/dist/lib/traceRoot.d.ts.map +1 -1
- package/dist/lib/traceRoot.es.d.ts +17 -15
- package/dist/lib/traceRoot.es.d.ts.map +1 -1
- package/dist/lib/traceRoot.es.js +68 -34
- package/dist/lib/traceRoot.js +11 -0
- package/dist/lib/traceRoot.node.d.ts +17 -19
- package/dist/lib/traceRoot.node.d.ts.map +1 -1
- package/dist/lib/traceRoot.node.js +66 -38
- package/dist/lib/traceTopology.d.ts +42 -0
- package/dist/lib/traceTopology.d.ts.map +1 -0
- package/dist/lib/traceTopology.js +260 -0
- package/dist/lib/tracer.d.ts +9 -5
- package/dist/lib/tracer.d.ts.map +1 -1
- package/dist/lib/tracer.js +65 -71
- package/dist/lib/tracers/ArrayQueueTracer.d.ts +1 -1
- package/dist/lib/tracers/ArrayQueueTracer.js +1 -1
- package/dist/lib/tracers/StdioTracer.d.ts.map +1 -1
- package/dist/lib/tracers/StdioTracer.js +15 -13
- package/dist/lib/tracers/TestTracer.d.ts +4 -6
- package/dist/lib/tracers/TestTracer.d.ts.map +1 -1
- package/dist/lib/tracers/TestTracer.js +6 -8
- package/dist/lib/types.d.ts +49 -32
- package/dist/lib/types.d.ts.map +1 -1
- package/dist/lib/vocabularyRegistry.d.ts +25 -0
- package/dist/lib/vocabularyRegistry.d.ts.map +1 -0
- package/dist/lib/vocabularyRegistry.js +372 -0
- package/dist/lib/wasm/WasmBufferStrategy.d.ts +6 -10
- package/dist/lib/wasm/WasmBufferStrategy.d.ts.map +1 -1
- package/dist/lib/wasm/WasmBufferStrategy.js +44 -37
- package/dist/lib/wasm/wasmAllocator.d.ts +27 -22
- package/dist/lib/wasm/wasmAllocator.d.ts.map +1 -1
- package/dist/lib/wasm/wasmAllocator.js +66 -44
- package/dist/lib/wasm/wasmPhysicalLayout.d.ts +67 -0
- package/dist/lib/wasm/wasmPhysicalLayout.d.ts.map +1 -0
- package/dist/lib/wasm/wasmPhysicalLayout.js +179 -0
- package/dist/lib/wasm/wasmSpanBuffer.d.ts +79 -31
- package/dist/lib/wasm/wasmSpanBuffer.d.ts.map +1 -1
- package/dist/lib/wasm/wasmSpanBuffer.js +442 -272
- package/dist/lib/wasm/wasmTraceRoot.d.ts +24 -22
- package/dist/lib/wasm/wasmTraceRoot.d.ts.map +1 -1
- package/dist/lib/wasm/wasmTraceRoot.js +110 -71
- package/dist/vocabulary/register/v1.d.ts +2 -0
- package/dist/vocabulary/register/v1.d.ts.map +1 -0
- package/dist/vocabulary/register/v1.js +1 -0
- package/dist/wasm.d.ts +5 -0
- package/dist/wasm.d.ts.map +1 -0
- package/dist/wasm.js +4 -0
- package/package.json +54 -6
- package/src/index.ts +1 -0
- package/src/lib/JsBufferStrategy.ts +27 -9
- package/src/lib/__tests__/arrow-builder-integration/arrow-conversion.test.ts +335 -37
- package/src/lib/__tests__/arrow-builder-integration/binary-arrow-conversion.test.ts +97 -26
- package/src/lib/__tests__/arrow-builder-integration/binary-comparison.test.ts +75 -15
- package/src/lib/__tests__/arrow-builder-integration/binary-format-compliance.test.ts +30 -6
- package/src/lib/__tests__/arrow-builder-integration/buffer-chaining.test.ts +18 -21
- package/src/lib/__tests__/arrow-builder-integration/foundation.test.ts +5 -2
- package/src/lib/__tests__/arrow-builder-integration/integration.test.ts +25 -7
- package/src/lib/__tests__/arrow-builder-integration/lazy-columns.test.ts +3 -2
- package/src/lib/__tests__/buffer-overflow.test.ts +24 -18
- package/src/lib/__tests__/capability-span-context.test.ts +505 -0
- package/src/lib/__tests__/capacity-tuning.test.ts +5 -3
- package/src/lib/__tests__/eager-columns.test.ts +345 -0
- package/src/lib/__tests__/enum-metadata-aot.test.ts +153 -0
- package/src/lib/__tests__/enum-metadata.test.ts +177 -0
- package/src/lib/__tests__/fixtures/empty-vocabulary-runtime.fixture.ts +15 -0
- package/src/lib/__tests__/flushScheduler.test.ts +5 -1
- package/src/lib/__tests__/identity-view.property.test.ts +179 -0
- package/src/lib/__tests__/library.test.ts +19 -235
- package/src/lib/__tests__/message-buffer-families.test.ts +878 -0
- package/src/lib/__tests__/nested-library-tasks.test.ts +14 -15
- package/src/lib/__tests__/op-metadata.test.ts +1 -1
- package/src/lib/__tests__/op-type-safety.test.ts +5 -16
- package/src/lib/__tests__/physical-layout-plan.test.ts +333 -0
- package/src/lib/__tests__/remap-descriptor-integration.test.ts +381 -0
- package/src/lib/__tests__/root-context-construction.test.ts +414 -0
- package/src/lib/__tests__/span-auto-runtime.test.ts +386 -0
- package/src/lib/__tests__/span-buffer-segment-stats.test.ts +221 -0
- package/src/lib/__tests__/span-lifecycle.test.ts +53 -25
- package/src/lib/__tests__/spanbuffer-materializer-parity.test.ts +266 -0
- package/src/lib/__tests__/sync-async-trace.test.ts +24 -23
- package/src/lib/__tests__/tag-writer-aot.test.ts +214 -0
- package/src/lib/__tests__/test-helpers.ts +67 -12
- package/src/lib/__tests__/threadId.test.ts +62 -0
- package/src/lib/__tests__/timestamp.test.ts +221 -93
- package/src/lib/__tests__/traceTopology.property.test.ts +383 -0
- package/src/lib/__tests__/type-narrowing.test.ts +63 -0
- package/src/lib/__tests__/vocabulary-dense-decoding.test.ts +405 -0
- package/src/lib/__tests__/vocabularyRegistry.test.ts +313 -0
- package/src/lib/arrow/lease.ts +43 -0
- package/src/lib/arrow/utils.ts +10 -14
- package/src/lib/arrow/vocabularyDictionary.ts +123 -0
- package/src/lib/bufferStrategy.ts +9 -1
- package/src/lib/cloudflare/traceRows.ts +3 -2
- package/src/lib/codegen/__tests__/evaluatorGenerator.test.ts +21 -141
- package/src/lib/codegen/__tests__/fixedPositionWriter-parity.test.ts +273 -0
- package/src/lib/codegen/__tests__/fixedPositionWriter-uint64.test.ts +61 -34
- package/src/lib/codegen/__tests__/nullBitmap.test.ts +33 -37
- package/src/lib/codegen/__tests__/spanLoggerGenerator.test.ts +34 -18
- package/src/lib/codegen/__tests__/spanLoggerMaterializerParity.test.ts +503 -0
- package/src/lib/codegen/evaluatorGenerator.ts +18 -13
- package/src/lib/codegen/fixedPositionWriterGenerator.ts +329 -245
- package/src/lib/codegen/spanLoggerClosureMaterializer.ts +598 -0
- package/src/lib/codegen/spanLoggerGenerator.ts +241 -177
- package/src/lib/convertToArrow.ts +598 -311
- package/src/lib/defineOpContext.ts +1 -1
- package/src/lib/enumMetadata.ts +121 -0
- package/src/lib/flushScheduler.ts +11 -5
- package/src/lib/library.ts +37 -595
- package/src/lib/logBinding.ts +21 -27
- package/src/lib/op.ts +75 -18
- package/src/lib/opContext/__tests__/retry.test.ts +27 -21
- package/src/lib/opContext/createOpGroup.ts +33 -31
- package/src/lib/opContext/defineOp.ts +88 -11
- package/src/lib/opContext/opGroupTypes.ts +2 -2
- package/src/lib/opContext/opTypes.ts +1 -1
- package/src/lib/opContext/spanContextTypes.ts +122 -24
- package/src/lib/opContext/types.ts +7 -3
- package/src/lib/physicalLayoutPlan.ts +598 -0
- package/src/lib/resolveMessage.ts +67 -0
- package/src/lib/result.ts +20 -33
- package/src/lib/runtimeHint.ts +98 -0
- package/src/lib/schema/__tests__/featureFlags.test.ts +2 -1
- package/src/lib/schema/builder.ts +1 -1
- package/src/lib/schema/typeGuards.ts +7 -151
- package/src/lib/schema/types.ts +1 -1
- package/src/lib/span-buffer/aot/v1.ts +26 -0
- package/src/lib/spanBuffer.ts +658 -92
- package/src/lib/spanBufferStats.ts +1 -1
- package/src/lib/spanContext.ts +1350 -861
- package/src/lib/sqlite/sqlite-common.ts +20 -31
- package/src/lib/testing/__tests__/topology-traversal.test.ts +174 -0
- package/src/lib/testing/__tests__/vitest-harness.test.ts +2 -1
- package/src/lib/testing/bun-harness.ts +94 -43
- package/src/lib/testing/extractFacts.ts +64 -78
- package/src/lib/testing/facts.ts +1 -1
- package/src/lib/testing/queryable-span.ts +23 -30
- package/src/lib/testing/span-query.ts +16 -20
- package/src/lib/testing/stdio-replay.ts +25 -8
- package/src/lib/testing/vitest-harness.ts +1 -1
- package/src/lib/threadId.ts +6 -3
- package/src/lib/traceContext.ts +1 -6
- package/src/lib/traceRoot.es.ts +77 -42
- package/src/lib/traceRoot.node.ts +75 -46
- package/src/lib/traceRoot.ts +41 -14
- package/src/lib/traceTopology.ts +279 -0
- package/src/lib/tracer.ts +109 -98
- package/src/lib/tracers/ArrayQueueTracer.ts +1 -1
- package/src/lib/tracers/StdioTracer.ts +15 -13
- package/src/lib/tracers/TestTracer.ts +6 -8
- package/src/lib/tracers/__tests__/ArrayQueueTracer.test.ts +15 -10
- package/src/lib/tracers/__tests__/CompositeTracer.test.ts +150 -0
- package/src/lib/tracers/__tests__/TestTracer.test.ts +23 -13
- package/src/lib/types.ts +64 -33
- package/src/lib/vocabularyRegistry.ts +439 -0
- package/src/lib/wasm/WasmBufferStrategy.ts +56 -48
- package/src/lib/wasm/__tests__/WasmBufferStrategy.test.ts +215 -11
- package/src/lib/wasm/__tests__/allocatorFreeBlockClamp.test.ts +86 -0
- package/src/lib/wasm/__tests__/wasm-identity-view.test.ts +311 -0
- package/src/lib/wasm/__tests__/wasm-integration.test.ts +417 -44
- package/src/lib/wasm/__tests__/wasm-message-buffer-families.test.ts +588 -0
- package/src/lib/wasm/__tests__/wasmAllocator.test.ts +100 -668
- package/src/lib/wasm/__tests__/wasmSpanBuffer.test.ts +419 -63
- package/src/lib/wasm/__tests__/wasmTraceRoot.test.ts +24 -29
- package/src/lib/wasm/__tests__/wasmTracer.test.ts.disabled +2 -2
- package/src/lib/wasm/wasmAllocator.ts +131 -96
- package/src/lib/wasm/wasmPhysicalLayout.ts +309 -0
- package/src/lib/wasm/wasmSpanBuffer.ts +597 -341
- package/src/lib/wasm/wasmTraceRoot.ts +140 -78
- package/src/vocabulary/register/v1.ts +1 -0
- package/src/wasm.ts +19 -0
- package/src/lib/__tests__/remapped-buffer-view-integration.test.ts +0 -319
- package/src/lib/__tests__/remapped-buffer-view.test.ts +0 -635
- package/src/lib/wasm/allocator.zig +0 -948
package/dist/lib/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/lib/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EACV,eAAe,EACf,YAAY,EACZ,eAAe,EACf,iBAAiB,EACjB,gBAAgB,EAChB,WAAW,EACX,UAAU,EACX,MAAM,6BAA6B,CAAC;AACrC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/lib/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
export declare const REGISTER_VOCABULARY: unique symbol;
|
|
2
|
+
export interface VocabularyFragment {
|
|
3
|
+
readonly schemaVersion: 1;
|
|
4
|
+
readonly idAlgorithm: 'sha256-24-v1';
|
|
5
|
+
readonly contentHash: string;
|
|
6
|
+
readonly ids: Uint32Array;
|
|
7
|
+
readonly kindTags: Uint8Array;
|
|
8
|
+
readonly utf8: Uint8Array;
|
|
9
|
+
readonly offsets: Int32Array;
|
|
10
|
+
}
|
|
11
|
+
export type VocabularyBinding = Uint32Array;
|
|
12
|
+
export interface VocabularyGeneration {
|
|
13
|
+
readonly generation: number;
|
|
14
|
+
readonly ids: Uint32Array;
|
|
15
|
+
readonly kindTags: Uint8Array;
|
|
16
|
+
readonly records: Uint8Array;
|
|
17
|
+
readonly offsets: Int32Array;
|
|
18
|
+
}
|
|
19
|
+
export declare class VocabularyRegistrationError extends Error {
|
|
20
|
+
readonly name = "VocabularyRegistrationError";
|
|
21
|
+
}
|
|
22
|
+
export type RegisterVocabulary = (fragment: VocabularyFragment) => VocabularyBinding;
|
|
23
|
+
export declare const registerVocabularyFragment: RegisterVocabulary;
|
|
24
|
+
export declare function getVocabularyGeneration(): VocabularyGeneration;
|
|
25
|
+
//# sourceMappingURL=vocabularyRegistry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vocabularyRegistry.d.ts","sourceRoot":"","sources":["../../src/lib/vocabularyRegistry.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,mBAAmB,eAA0D,CAAC;AAqB3F,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,aAAa,EAAE,CAAC,CAAC;IAC1B,QAAQ,CAAC,WAAW,EAAE,cAAc,CAAC;IACrC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,GAAG,EAAE,WAAW,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,UAAU,CAAC;IAC9B,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAC1B,QAAQ,CAAC,OAAO,EAAE,UAAU,CAAC;CAC9B;AAED,MAAM,MAAM,iBAAiB,GAAG,WAAW,CAAC;AAE5C,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,GAAG,EAAE,WAAW,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,UAAU,CAAC;IAC9B,QAAQ,CAAC,OAAO,EAAE,UAAU,CAAC;IAC7B,QAAQ,CAAC,OAAO,EAAE,UAAU,CAAC;CAC9B;AAuBD,qBAAa,2BAA4B,SAAQ,KAAK;IACpD,SAAkB,IAAI,iCAAiC;CACxD;AA2VD,MAAM,MAAM,kBAAkB,GAAG,CAAC,QAAQ,EAAE,kBAAkB,KAAK,iBAAiB,CAAC;AAuBrF,eAAO,MAAM,0BAA0B,oBAAkC,CAAC;AAE1E,wBAAgB,uBAAuB,IAAI,oBAAoB,CAE9D"}
|
|
@@ -0,0 +1,372 @@
|
|
|
1
|
+
export const REGISTER_VOCABULARY = Symbol.for('@smoothbricks/lmao/vocabulary/register/v1');
|
|
2
|
+
const VOCABULARY_STATE = Symbol.for('@smoothbricks/lmao/vocabulary/state/v1');
|
|
3
|
+
const SCHEMA_VERSION = 1;
|
|
4
|
+
const ID_ALGORITHM = 'sha256-24-v1';
|
|
5
|
+
const MAX_VOCABULARY_ID = 16777215;
|
|
6
|
+
const CONTENT_HASH_PATTERN = /^[0-9a-f]{64}$/;
|
|
7
|
+
const SHA256_INITIAL = new Uint32Array([
|
|
8
|
+
0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a, 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19,
|
|
9
|
+
]);
|
|
10
|
+
const SHA256_ROUND = new Uint32Array([
|
|
11
|
+
0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5, 0xd807aa98,
|
|
12
|
+
0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174, 0xe49b69c1, 0xefbe4786,
|
|
13
|
+
0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da, 0x983e5152, 0xa831c66d, 0xb00327c8,
|
|
14
|
+
0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967, 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13,
|
|
15
|
+
0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85, 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819,
|
|
16
|
+
0xd6990624, 0xf40e3585, 0x106aa070, 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a,
|
|
17
|
+
0x5b9cca4f, 0x682e6ff3, 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7,
|
|
18
|
+
0xc67178f2,
|
|
19
|
+
]);
|
|
20
|
+
export class VocabularyRegistrationError extends Error {
|
|
21
|
+
name = 'VocabularyRegistrationError';
|
|
22
|
+
}
|
|
23
|
+
const decoder = new TextDecoder('utf-8', { fatal: true });
|
|
24
|
+
const algorithmBytes = new TextEncoder().encode(ID_ALGORITHM);
|
|
25
|
+
function fail(code, detail) {
|
|
26
|
+
throw new VocabularyRegistrationError(`${code}: ${detail}`);
|
|
27
|
+
}
|
|
28
|
+
function rotateRight(value, count) {
|
|
29
|
+
return (value >>> count) | (value << (32 - count));
|
|
30
|
+
}
|
|
31
|
+
function sha256(input) {
|
|
32
|
+
const bitLength = input.length * 8;
|
|
33
|
+
const paddedLength = (input.length + 9 + 63) & ~63;
|
|
34
|
+
const padded = new Uint8Array(paddedLength);
|
|
35
|
+
padded.set(input);
|
|
36
|
+
padded[input.length] = 0x80;
|
|
37
|
+
const view = new DataView(padded.buffer);
|
|
38
|
+
view.setUint32(paddedLength - 8, Math.floor(bitLength / 4294967296), false);
|
|
39
|
+
view.setUint32(paddedLength - 4, bitLength >>> 0, false);
|
|
40
|
+
const hash = SHA256_INITIAL.slice();
|
|
41
|
+
const words = new Uint32Array(64);
|
|
42
|
+
for (let block = 0; block < paddedLength; block += 64) {
|
|
43
|
+
for (let index = 0; index < 16; index++)
|
|
44
|
+
words[index] = view.getUint32(block + index * 4, false);
|
|
45
|
+
for (let index = 16; index < 64; index++) {
|
|
46
|
+
const x = words[index - 15];
|
|
47
|
+
const y = words[index - 2];
|
|
48
|
+
const sigma0 = rotateRight(x, 7) ^ rotateRight(x, 18) ^ (x >>> 3);
|
|
49
|
+
const sigma1 = rotateRight(y, 17) ^ rotateRight(y, 19) ^ (y >>> 10);
|
|
50
|
+
words[index] = (words[index - 16] + sigma0 + words[index - 7] + sigma1) >>> 0;
|
|
51
|
+
}
|
|
52
|
+
let a = hash[0];
|
|
53
|
+
let b = hash[1];
|
|
54
|
+
let c = hash[2];
|
|
55
|
+
let d = hash[3];
|
|
56
|
+
let e = hash[4];
|
|
57
|
+
let f = hash[5];
|
|
58
|
+
let g = hash[6];
|
|
59
|
+
let h = hash[7];
|
|
60
|
+
for (let index = 0; index < 64; index++) {
|
|
61
|
+
const sum1 = rotateRight(e, 6) ^ rotateRight(e, 11) ^ rotateRight(e, 25);
|
|
62
|
+
const choose = (e & f) ^ (~e & g);
|
|
63
|
+
const temp1 = (h + sum1 + choose + SHA256_ROUND[index] + words[index]) >>> 0;
|
|
64
|
+
const sum0 = rotateRight(a, 2) ^ rotateRight(a, 13) ^ rotateRight(a, 22);
|
|
65
|
+
const majority = (a & b) ^ (a & c) ^ (b & c);
|
|
66
|
+
const temp2 = (sum0 + majority) >>> 0;
|
|
67
|
+
h = g;
|
|
68
|
+
g = f;
|
|
69
|
+
f = e;
|
|
70
|
+
e = (d + temp1) >>> 0;
|
|
71
|
+
d = c;
|
|
72
|
+
c = b;
|
|
73
|
+
b = a;
|
|
74
|
+
a = (temp1 + temp2) >>> 0;
|
|
75
|
+
}
|
|
76
|
+
hash[0] = (hash[0] + a) >>> 0;
|
|
77
|
+
hash[1] = (hash[1] + b) >>> 0;
|
|
78
|
+
hash[2] = (hash[2] + c) >>> 0;
|
|
79
|
+
hash[3] = (hash[3] + d) >>> 0;
|
|
80
|
+
hash[4] = (hash[4] + e) >>> 0;
|
|
81
|
+
hash[5] = (hash[5] + f) >>> 0;
|
|
82
|
+
hash[6] = (hash[6] + g) >>> 0;
|
|
83
|
+
hash[7] = (hash[7] + h) >>> 0;
|
|
84
|
+
}
|
|
85
|
+
const result = new Uint8Array(32);
|
|
86
|
+
const resultView = new DataView(result.buffer);
|
|
87
|
+
for (let index = 0; index < hash.length; index++)
|
|
88
|
+
resultView.setUint32(index * 4, hash[index], false);
|
|
89
|
+
return result;
|
|
90
|
+
}
|
|
91
|
+
function hex(bytes) {
|
|
92
|
+
let result = '';
|
|
93
|
+
for (const byte of bytes)
|
|
94
|
+
result += byte.toString(16).padStart(2, '0');
|
|
95
|
+
return result;
|
|
96
|
+
}
|
|
97
|
+
function equalBytes(left, right) {
|
|
98
|
+
if (left.constructor !== right.constructor || left.length !== right.length)
|
|
99
|
+
return false;
|
|
100
|
+
for (let index = 0; index < left.length; index++)
|
|
101
|
+
if (left[index] !== right[index])
|
|
102
|
+
return false;
|
|
103
|
+
return true;
|
|
104
|
+
}
|
|
105
|
+
function samePayload(registered, fragment) {
|
|
106
|
+
return (equalBytes(registered.ids, fragment.ids) &&
|
|
107
|
+
equalBytes(registered.kindTags, fragment.kindTags) &&
|
|
108
|
+
equalBytes(registered.utf8, fragment.utf8) &&
|
|
109
|
+
equalBytes(registered.offsets, fragment.offsets));
|
|
110
|
+
}
|
|
111
|
+
function recordAt(fragment, ordinal) {
|
|
112
|
+
return fragment.utf8.subarray(fragment.offsets[ordinal], fragment.offsets[ordinal + 1]);
|
|
113
|
+
}
|
|
114
|
+
function validateRecord(record, ordinal) {
|
|
115
|
+
const view = new DataView(record.buffer, record.byteOffset, record.byteLength);
|
|
116
|
+
if (record.length < 6)
|
|
117
|
+
fail('LMAO_VOCABULARY_FRAGMENT_INVALID', `record ${ordinal} is truncated`);
|
|
118
|
+
let offset = 0;
|
|
119
|
+
const textLength = view.getUint32(offset, true);
|
|
120
|
+
offset += 4;
|
|
121
|
+
if (textLength > record.length - offset - 2)
|
|
122
|
+
fail('LMAO_VOCABULARY_FRAGMENT_INVALID', `record ${ordinal} text is truncated`);
|
|
123
|
+
try {
|
|
124
|
+
decoder.decode(record.subarray(offset, offset + textLength));
|
|
125
|
+
}
|
|
126
|
+
catch {
|
|
127
|
+
fail('LMAO_VOCABULARY_FRAGMENT_INVALID', `record ${ordinal} text is not valid UTF-8`);
|
|
128
|
+
}
|
|
129
|
+
offset += textLength;
|
|
130
|
+
const fieldCount = view.getUint16(offset, true);
|
|
131
|
+
offset += 2;
|
|
132
|
+
for (let field = 0; field < fieldCount; field++) {
|
|
133
|
+
if (offset + 2 > record.length)
|
|
134
|
+
fail('LMAO_VOCABULARY_FRAGMENT_INVALID', `record ${ordinal} field ${field} name length is truncated`);
|
|
135
|
+
const nameLength = view.getUint16(offset, true);
|
|
136
|
+
offset += 2;
|
|
137
|
+
if (offset + nameLength + 2 > record.length)
|
|
138
|
+
fail('LMAO_VOCABULARY_FRAGMENT_INVALID', `record ${ordinal} field ${field} name is truncated`);
|
|
139
|
+
try {
|
|
140
|
+
decoder.decode(record.subarray(offset, offset + nameLength));
|
|
141
|
+
}
|
|
142
|
+
catch {
|
|
143
|
+
fail('LMAO_VOCABULARY_FRAGMENT_INVALID', `record ${ordinal} field ${field} name is not valid UTF-8`);
|
|
144
|
+
}
|
|
145
|
+
offset += nameLength;
|
|
146
|
+
const columnLength = view.getUint16(offset, true);
|
|
147
|
+
offset += 2;
|
|
148
|
+
if (offset + columnLength > record.length)
|
|
149
|
+
fail('LMAO_VOCABULARY_FRAGMENT_INVALID', `record ${ordinal} field ${field} column is truncated`);
|
|
150
|
+
try {
|
|
151
|
+
decoder.decode(record.subarray(offset, offset + columnLength));
|
|
152
|
+
}
|
|
153
|
+
catch {
|
|
154
|
+
fail('LMAO_VOCABULARY_FRAGMENT_INVALID', `record ${ordinal} field ${field} column is not valid UTF-8`);
|
|
155
|
+
}
|
|
156
|
+
offset += columnLength;
|
|
157
|
+
}
|
|
158
|
+
if (offset !== record.length)
|
|
159
|
+
fail('LMAO_VOCABULARY_FRAGMENT_INVALID', `record ${ordinal} has trailing bytes`);
|
|
160
|
+
}
|
|
161
|
+
function contentHash(fragment) {
|
|
162
|
+
const size = 1 +
|
|
163
|
+
2 +
|
|
164
|
+
algorithmBytes.length +
|
|
165
|
+
4 +
|
|
166
|
+
fragment.ids.length * 4 +
|
|
167
|
+
4 +
|
|
168
|
+
fragment.kindTags.length +
|
|
169
|
+
4 +
|
|
170
|
+
fragment.utf8.length +
|
|
171
|
+
4 +
|
|
172
|
+
fragment.offsets.length * 4;
|
|
173
|
+
const bytes = new Uint8Array(size);
|
|
174
|
+
const view = new DataView(bytes.buffer);
|
|
175
|
+
let offset = 0;
|
|
176
|
+
bytes[offset++] = fragment.schemaVersion;
|
|
177
|
+
view.setUint16(offset, algorithmBytes.length, true);
|
|
178
|
+
offset += 2;
|
|
179
|
+
bytes.set(algorithmBytes, offset);
|
|
180
|
+
offset += algorithmBytes.length;
|
|
181
|
+
view.setUint32(offset, fragment.ids.length, true);
|
|
182
|
+
offset += 4;
|
|
183
|
+
for (const id of fragment.ids) {
|
|
184
|
+
view.setUint32(offset, id, true);
|
|
185
|
+
offset += 4;
|
|
186
|
+
}
|
|
187
|
+
view.setUint32(offset, fragment.kindTags.length, true);
|
|
188
|
+
offset += 4;
|
|
189
|
+
bytes.set(fragment.kindTags, offset);
|
|
190
|
+
offset += fragment.kindTags.length;
|
|
191
|
+
view.setUint32(offset, fragment.utf8.length, true);
|
|
192
|
+
offset += 4;
|
|
193
|
+
bytes.set(fragment.utf8, offset);
|
|
194
|
+
offset += fragment.utf8.length;
|
|
195
|
+
view.setUint32(offset, fragment.offsets.length, true);
|
|
196
|
+
offset += 4;
|
|
197
|
+
for (const boundary of fragment.offsets) {
|
|
198
|
+
view.setInt32(offset, boundary, true);
|
|
199
|
+
offset += 4;
|
|
200
|
+
}
|
|
201
|
+
return hex(sha256(bytes));
|
|
202
|
+
}
|
|
203
|
+
function createState() {
|
|
204
|
+
const initial = Object.freeze({
|
|
205
|
+
generation: 0,
|
|
206
|
+
ids: new Uint32Array(0),
|
|
207
|
+
kindTags: new Uint8Array(0),
|
|
208
|
+
records: new Uint8Array(0),
|
|
209
|
+
offsets: new Int32Array([0]),
|
|
210
|
+
});
|
|
211
|
+
return { entriesById: new Map(), fragmentsByHash: new Map(), generations: [initial], current: initial };
|
|
212
|
+
}
|
|
213
|
+
function globalState() {
|
|
214
|
+
const globals = globalThis;
|
|
215
|
+
let state = globals[VOCABULARY_STATE];
|
|
216
|
+
if (state === undefined) {
|
|
217
|
+
state = createState();
|
|
218
|
+
Object.defineProperty(globals, VOCABULARY_STATE, {
|
|
219
|
+
value: state,
|
|
220
|
+
configurable: false,
|
|
221
|
+
enumerable: false,
|
|
222
|
+
writable: false,
|
|
223
|
+
});
|
|
224
|
+
}
|
|
225
|
+
return state;
|
|
226
|
+
}
|
|
227
|
+
function validateFragmentStructure(fragment) {
|
|
228
|
+
if (fragment.schemaVersion !== SCHEMA_VERSION || fragment.idAlgorithm !== ID_ALGORITHM)
|
|
229
|
+
fail('LMAO_VOCABULARY_ABI_UNAVAILABLE', 'unsupported schema version or ID algorithm');
|
|
230
|
+
if (!CONTENT_HASH_PATTERN.test(fragment.contentHash))
|
|
231
|
+
fail('LMAO_VOCABULARY_FRAGMENT_INVALID', `invalid contentHash ${JSON.stringify(fragment.contentHash)}`);
|
|
232
|
+
if (!(fragment.ids instanceof Uint32Array) ||
|
|
233
|
+
!(fragment.kindTags instanceof Uint8Array) ||
|
|
234
|
+
!(fragment.utf8 instanceof Uint8Array) ||
|
|
235
|
+
!(fragment.offsets instanceof Int32Array))
|
|
236
|
+
fail('LMAO_VOCABULARY_FRAGMENT_INVALID', 'fragment arrays use incorrect types');
|
|
237
|
+
if (fragment.kindTags.length !== fragment.ids.length || fragment.offsets.length !== fragment.ids.length + 1)
|
|
238
|
+
fail('LMAO_VOCABULARY_FRAGMENT_INVALID', 'parallel lengths differ');
|
|
239
|
+
if (fragment.offsets[0] !== 0 || fragment.offsets[fragment.offsets.length - 1] !== fragment.utf8.length)
|
|
240
|
+
fail('LMAO_VOCABULARY_FRAGMENT_INVALID', 'offsets do not cover bytes');
|
|
241
|
+
const localOrdinals = new Map();
|
|
242
|
+
for (let ordinal = 0; ordinal < fragment.ids.length; ordinal++) {
|
|
243
|
+
const id = fragment.ids[ordinal];
|
|
244
|
+
const kindTag = fragment.kindTags[ordinal];
|
|
245
|
+
if (id === 0 || id > MAX_VOCABULARY_ID)
|
|
246
|
+
fail('LMAO_VOCABULARY_FRAGMENT_INVALID', `stable ID ${id}`);
|
|
247
|
+
if (kindTag !== 1 && kindTag !== 2)
|
|
248
|
+
fail('LMAO_VOCABULARY_FRAGMENT_INVALID', `kind tag ${kindTag}`);
|
|
249
|
+
if (fragment.offsets[ordinal] > fragment.offsets[ordinal + 1])
|
|
250
|
+
fail('LMAO_VOCABULARY_FRAGMENT_INVALID', 'offsets are not monotonic');
|
|
251
|
+
const record = recordAt(fragment, ordinal);
|
|
252
|
+
validateRecord(record, ordinal);
|
|
253
|
+
const idInput = new Uint8Array(record.length + 1);
|
|
254
|
+
idInput[0] = kindTag;
|
|
255
|
+
idInput.set(record, 1);
|
|
256
|
+
const digest = sha256(idInput);
|
|
257
|
+
const derivedId = (digest[0] << 16) | (digest[1] << 8) | digest[2];
|
|
258
|
+
if (id !== derivedId || id === 0)
|
|
259
|
+
fail('LMAO_VOCABULARY_FRAGMENT_INVALID', `stable ID ${id} does not match record ${ordinal}`);
|
|
260
|
+
const previousOrdinal = localOrdinals.get(id);
|
|
261
|
+
if (previousOrdinal !== undefined &&
|
|
262
|
+
(fragment.kindTags[previousOrdinal] !== kindTag || !equalBytes(recordAt(fragment, previousOrdinal), record))) {
|
|
263
|
+
fail('LMAO_VOCABULARY_ID_COLLISION', `stable ID ${id} within fragment`);
|
|
264
|
+
}
|
|
265
|
+
localOrdinals.set(id, ordinal);
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
function appendGeneration(state, ids, kindTags, records) {
|
|
269
|
+
if (ids.length === 0)
|
|
270
|
+
return;
|
|
271
|
+
const previous = state.current;
|
|
272
|
+
let byteLength = previous.records.length;
|
|
273
|
+
for (const record of records)
|
|
274
|
+
byteLength += record.length;
|
|
275
|
+
const generationIds = new Uint32Array(previous.ids.length + ids.length);
|
|
276
|
+
generationIds.set(previous.ids);
|
|
277
|
+
generationIds.set(ids, previous.ids.length);
|
|
278
|
+
const generationKinds = new Uint8Array(previous.kindTags.length + kindTags.length);
|
|
279
|
+
generationKinds.set(previous.kindTags);
|
|
280
|
+
generationKinds.set(kindTags, previous.kindTags.length);
|
|
281
|
+
const generationRecords = new Uint8Array(byteLength);
|
|
282
|
+
generationRecords.set(previous.records);
|
|
283
|
+
const generationOffsets = new Int32Array(generationIds.length + 1);
|
|
284
|
+
generationOffsets.set(previous.offsets);
|
|
285
|
+
let byteOffset = previous.records.length;
|
|
286
|
+
for (let index = 0; index < records.length; index++) {
|
|
287
|
+
generationRecords.set(records[index], byteOffset);
|
|
288
|
+
byteOffset += records[index].length;
|
|
289
|
+
generationOffsets[previous.ids.length + index + 1] = byteOffset;
|
|
290
|
+
}
|
|
291
|
+
const generation = Object.freeze({
|
|
292
|
+
generation: previous.generation + 1,
|
|
293
|
+
ids: generationIds,
|
|
294
|
+
kindTags: generationKinds,
|
|
295
|
+
records: generationRecords,
|
|
296
|
+
offsets: generationOffsets,
|
|
297
|
+
});
|
|
298
|
+
state.generations.push(generation);
|
|
299
|
+
state.current = generation;
|
|
300
|
+
}
|
|
301
|
+
function registerVocabulary(fragment) {
|
|
302
|
+
validateFragmentStructure(fragment);
|
|
303
|
+
const state = globalState();
|
|
304
|
+
const sameHash = state.fragmentsByHash.get(fragment.contentHash);
|
|
305
|
+
if (sameHash !== undefined) {
|
|
306
|
+
if (!samePayload(sameHash, fragment))
|
|
307
|
+
fail('LMAO_VOCABULARY_CONTENT_HASH_COLLISION', fragment.contentHash);
|
|
308
|
+
return sameHash.binding;
|
|
309
|
+
}
|
|
310
|
+
if (contentHash(fragment) !== fragment.contentHash) {
|
|
311
|
+
fail('LMAO_VOCABULARY_CONTENT_HASH_MISMATCH', fragment.contentHash);
|
|
312
|
+
}
|
|
313
|
+
for (let ordinal = 0; ordinal < fragment.ids.length; ordinal++) {
|
|
314
|
+
const existing = state.entriesById.get(fragment.ids[ordinal]);
|
|
315
|
+
if (existing !== undefined &&
|
|
316
|
+
(existing.kindTag !== fragment.kindTags[ordinal] || !equalBytes(existing.record, recordAt(fragment, ordinal))))
|
|
317
|
+
fail('LMAO_VOCABULARY_ID_COLLISION', `stable ID ${fragment.ids[ordinal]}`);
|
|
318
|
+
}
|
|
319
|
+
const binding = new Uint32Array(fragment.ids.length);
|
|
320
|
+
const appendedIds = [];
|
|
321
|
+
const appendedKinds = [];
|
|
322
|
+
const appendedRecords = [];
|
|
323
|
+
for (let ordinal = 0; ordinal < fragment.ids.length; ordinal++) {
|
|
324
|
+
const id = fragment.ids[ordinal];
|
|
325
|
+
let existing = state.entriesById.get(id);
|
|
326
|
+
if (existing === undefined) {
|
|
327
|
+
const record = recordAt(fragment, ordinal).slice();
|
|
328
|
+
existing = {
|
|
329
|
+
kindTag: fragment.kindTags[ordinal],
|
|
330
|
+
record,
|
|
331
|
+
denseIndex: state.current.ids.length + appendedIds.length,
|
|
332
|
+
};
|
|
333
|
+
state.entriesById.set(id, existing);
|
|
334
|
+
appendedIds.push(id);
|
|
335
|
+
appendedKinds.push(existing.kindTag);
|
|
336
|
+
appendedRecords.push(record);
|
|
337
|
+
}
|
|
338
|
+
binding[ordinal] = existing.denseIndex;
|
|
339
|
+
}
|
|
340
|
+
appendGeneration(state, appendedIds, appendedKinds, appendedRecords);
|
|
341
|
+
state.fragmentsByHash.set(fragment.contentHash, {
|
|
342
|
+
ids: fragment.ids.slice(),
|
|
343
|
+
kindTags: fragment.kindTags.slice(),
|
|
344
|
+
utf8: fragment.utf8.slice(),
|
|
345
|
+
offsets: fragment.offsets.slice(),
|
|
346
|
+
binding,
|
|
347
|
+
});
|
|
348
|
+
return binding;
|
|
349
|
+
}
|
|
350
|
+
function isRegisterVocabulary(value) {
|
|
351
|
+
return typeof value === 'function';
|
|
352
|
+
}
|
|
353
|
+
function installVocabularyRegistration() {
|
|
354
|
+
const globals = globalThis;
|
|
355
|
+
const installed = globals[REGISTER_VOCABULARY];
|
|
356
|
+
if (installed !== undefined) {
|
|
357
|
+
if (!isRegisterVocabulary(installed))
|
|
358
|
+
fail('LMAO_VOCABULARY_ABI_UNAVAILABLE', 'global symbol contains a non-function');
|
|
359
|
+
return installed;
|
|
360
|
+
}
|
|
361
|
+
Object.defineProperty(globals, REGISTER_VOCABULARY, {
|
|
362
|
+
value: registerVocabulary,
|
|
363
|
+
configurable: false,
|
|
364
|
+
enumerable: false,
|
|
365
|
+
writable: false,
|
|
366
|
+
});
|
|
367
|
+
return registerVocabulary;
|
|
368
|
+
}
|
|
369
|
+
export const registerVocabularyFragment = installVocabularyRegistration();
|
|
370
|
+
export function getVocabularyGeneration() {
|
|
371
|
+
return globalState().current;
|
|
372
|
+
}
|
|
@@ -16,6 +16,7 @@ import type { Table } from '@uwdata/flechette';
|
|
|
16
16
|
import type { BufferStrategy } from '../bufferStrategy.js';
|
|
17
17
|
import type { OpMetadata } from '../opContext/opTypes.js';
|
|
18
18
|
import type { LogSchema } from '../schema/LogSchema.js';
|
|
19
|
+
import { type SpanBufferConstructor } from '../spanBuffer.js';
|
|
19
20
|
import type { ITraceRoot } from '../traceRoot.js';
|
|
20
21
|
import type { AnySpanBuffer, SpanBuffer } from '../types.js';
|
|
21
22
|
import { type WasmAllocator, type WasmAllocatorOptions } from './wasmAllocator.js';
|
|
@@ -52,6 +53,7 @@ export declare class WasmBufferStrategy<T extends LogSchema = LogSchema> impleme
|
|
|
52
53
|
* Shared across all buffers created by this strategy.
|
|
53
54
|
*/
|
|
54
55
|
readonly allocator: WasmAllocator;
|
|
56
|
+
private readonly liveRoots;
|
|
55
57
|
/**
|
|
56
58
|
* Private constructor - use static create() method.
|
|
57
59
|
*/
|
|
@@ -65,19 +67,13 @@ export declare class WasmBufferStrategy<T extends LogSchema = LogSchema> impleme
|
|
|
65
67
|
* @returns Promise<WasmBufferStrategy>
|
|
66
68
|
*/
|
|
67
69
|
static create<T extends LogSchema = LogSchema>(options?: WasmBufferStrategyOptions): Promise<WasmBufferStrategy<T>>;
|
|
68
|
-
createSpanBuffer(schema: T, traceRoot: ITraceRoot
|
|
69
|
-
createChildSpanBuffer(parentBuffer: SpanBuffer<T>, callsiteMetadata: OpMetadata, opMetadata: OpMetadata, capacity?: number, schema?: T): SpanBuffer<T>;
|
|
70
|
+
createSpanBuffer(schema: T, traceRoot: ITraceRoot<T>, opMetadata: OpMetadata, capacity?: number, plannedClass?: SpanBufferConstructor<T>): SpanBuffer<T>;
|
|
71
|
+
createChildSpanBuffer(parentBuffer: SpanBuffer<T>, callsiteMetadata: OpMetadata, opMetadata: OpMetadata, capacity?: number, schema?: T, plannedClass?: SpanBufferConstructor<T>): SpanBuffer<T>;
|
|
70
72
|
createOverflowBuffer(buffer: SpanBuffer<T>): SpanBuffer<T>;
|
|
71
73
|
toArrowTable(buffer: AnySpanBuffer): Table;
|
|
72
74
|
releaseBuffer(buffer: AnySpanBuffer): void;
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
*/
|
|
76
|
-
private freeSpanTree;
|
|
77
|
-
/**
|
|
78
|
-
* Reset the allocator (for testing/benchmarking).
|
|
79
|
-
* WARNING: This invalidates ALL buffers created by this strategy.
|
|
80
|
-
*/
|
|
75
|
+
private invalidateSpanTree;
|
|
76
|
+
/** Reset invalidates every live handle before allocator offsets are reused. */
|
|
81
77
|
reset(): void;
|
|
82
78
|
/**
|
|
83
79
|
* Get allocator statistics for debugging/monitoring.
|
|
@@ -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;
|
|
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;AACxD,OAAO,EAAe,KAAK,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AAC3E,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAElD,OAAO,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC7D,OAAO,EAAuB,KAAK,aAAa,EAAE,KAAK,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAkBxG;;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;IAClC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAwC;IAElE;;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,CACd,MAAM,EAAE,CAAC,EACT,SAAS,EAAE,UAAU,CAAC,CAAC,CAAC,EACxB,UAAU,EAAE,UAAU,EACtB,QAAQ,CAAC,EAAE,MAAM,EACjB,YAAY,CAAC,EAAE,qBAAqB,CAAC,CAAC,CAAC,GACtC,UAAU,CAAC,CAAC,CAAC,CAsBf;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,EACV,YAAY,CAAC,EAAE,qBAAqB,CAAC,CAAC,CAAC,GACtC,UAAU,CAAC,CAAC,CAAC,CA0Bf;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,CAYzC;IAED,OAAO,CAAC,kBAAkB;IAQ1B,+EAA+E;IAC/E,KAAK,IAAI,IAAI,CAQZ;IAED;;OAEG;IACH,QAAQ,IAAI,kBAAkB,CAO7B;CACF"}
|
|
@@ -14,14 +14,15 @@
|
|
|
14
14
|
*/
|
|
15
15
|
import { convertSpanTreeToArrowTable } from '../convertToArrow.js';
|
|
16
16
|
import { EMPTY_SCOPE } from '../spanBuffer.js';
|
|
17
|
+
import { walkSpanTree } from '../traceTopology.js';
|
|
17
18
|
import { createWasmAllocator } from './wasmAllocator.js';
|
|
18
19
|
import { createWasmChildSpanBuffer, createWasmOverflowBuffer, createWasmSpanBuffer, isWasmSpanBufferInstance, } from './wasmSpanBuffer.js';
|
|
20
|
+
import { WasmTraceRoot } from './wasmTraceRoot.js';
|
|
19
21
|
// Spec link (88): realizes specs/lmao/01q_wasm_memory_architecture.md#smoo/lmao!n/wasm-mem (OpContext integration + trace completion).
|
|
20
22
|
//#region smoo/lmao!n/wasm-mem.strategy
|
|
21
23
|
function requireWasmSpanBuffer(buffer) {
|
|
22
|
-
if (!isWasmSpanBufferInstance(buffer))
|
|
24
|
+
if (!isWasmSpanBufferInstance(buffer))
|
|
23
25
|
throw new Error('Expected WASM-backed span buffer');
|
|
24
|
-
}
|
|
25
26
|
return buffer;
|
|
26
27
|
}
|
|
27
28
|
/**
|
|
@@ -44,6 +45,7 @@ export class WasmBufferStrategy {
|
|
|
44
45
|
* Shared across all buffers created by this strategy.
|
|
45
46
|
*/
|
|
46
47
|
allocator;
|
|
48
|
+
liveRoots = new Set();
|
|
47
49
|
/**
|
|
48
50
|
* Private constructor - use static create() method.
|
|
49
51
|
*/
|
|
@@ -62,39 +64,42 @@ export class WasmBufferStrategy {
|
|
|
62
64
|
const allocator = options?.allocator ?? (await createWasmAllocator(options));
|
|
63
65
|
return new WasmBufferStrategy(allocator);
|
|
64
66
|
}
|
|
65
|
-
createSpanBuffer(schema, traceRoot, opMetadata, capacity) {
|
|
67
|
+
createSpanBuffer(schema, traceRoot, opMetadata, capacity, plannedClass) {
|
|
66
68
|
const effectiveCapacity = capacity ?? this.allocator.capacity;
|
|
69
|
+
const messageLayoutFamily = plannedClass?.messageLayoutFamily ?? 'mixed';
|
|
70
|
+
const messagePhysicalLayout = plannedClass?.messagePhysicalLayout ?? 'current';
|
|
67
71
|
// Create WASM buffer
|
|
68
72
|
const wasmBuffer = createWasmSpanBuffer(schema, {
|
|
69
73
|
allocator: this.allocator,
|
|
70
74
|
capacity: effectiveCapacity,
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
thread_id: 0n, // Will be read from WASM header
|
|
74
|
-
span_id: 0, // Will be assigned by WASM allocator
|
|
75
|
+
messageLayoutFamily,
|
|
76
|
+
messagePhysicalLayout,
|
|
75
77
|
}, traceRoot, // _traceRoot
|
|
76
78
|
EMPTY_SCOPE, // _scopeValues
|
|
77
79
|
opMetadata, // _opMetadata
|
|
78
80
|
opMetadata);
|
|
79
|
-
|
|
81
|
+
traceRoot._topology.registerRoot(wasmBuffer);
|
|
82
|
+
this.liveRoots.add(wasmBuffer);
|
|
80
83
|
return wasmBuffer;
|
|
81
84
|
}
|
|
82
|
-
createChildSpanBuffer(parentBuffer, callsiteMetadata, opMetadata, capacity, schema) {
|
|
85
|
+
createChildSpanBuffer(parentBuffer, callsiteMetadata, opMetadata, capacity, schema, plannedClass) {
|
|
83
86
|
const wasmParent = requireWasmSpanBuffer(parentBuffer);
|
|
84
87
|
const effectiveCapacity = capacity ?? wasmParent._capacity;
|
|
85
88
|
// Use provided schema (for cross-library calls) or parent's schema
|
|
86
89
|
const childSchema = schema ?? parentBuffer._logSchema;
|
|
90
|
+
const messageLayoutFamily = plannedClass?.messageLayoutFamily ?? wasmParent._messageLayoutFamily;
|
|
91
|
+
const messagePhysicalLayout = plannedClass?.messagePhysicalLayout ?? wasmParent._messagePhysicalLayout;
|
|
87
92
|
const child = createWasmChildSpanBuffer(wasmParent, {
|
|
88
93
|
allocator: this.allocator,
|
|
89
94
|
capacity: effectiveCapacity,
|
|
90
|
-
thread_id: 0n, // Will be read from WASM header
|
|
91
|
-
span_id: 0, // Will be assigned by WASM allocator
|
|
92
95
|
schema: childSchema, // Pass schema for correct buffer class
|
|
96
|
+
messageLayoutFamily,
|
|
97
|
+
messagePhysicalLayout,
|
|
93
98
|
}, parentBuffer._traceRoot, // _traceRoot (inherit from parent)
|
|
94
99
|
parentBuffer._scopeValues, // _scopeValues (inherit from parent)
|
|
95
100
|
opMetadata, // _opMetadata
|
|
96
101
|
callsiteMetadata);
|
|
97
|
-
|
|
102
|
+
parentBuffer._traceRoot._topology.registerChild(parentBuffer, child);
|
|
98
103
|
return child;
|
|
99
104
|
}
|
|
100
105
|
createOverflowBuffer(buffer) {
|
|
@@ -103,7 +108,7 @@ export class WasmBufferStrategy {
|
|
|
103
108
|
buffer._scopeValues, // _scopeValues (same as original)
|
|
104
109
|
buffer._opMetadata, // _opMetadata (same as original)
|
|
105
110
|
buffer._callsiteMetadata ?? buffer._opMetadata);
|
|
106
|
-
|
|
111
|
+
buffer._traceRoot._topology.adoptOverflow(buffer, overflow);
|
|
107
112
|
return overflow;
|
|
108
113
|
}
|
|
109
114
|
toArrowTable(buffer) {
|
|
@@ -111,33 +116,35 @@ export class WasmBufferStrategy {
|
|
|
111
116
|
return convertSpanTreeToArrowTable(buffer);
|
|
112
117
|
}
|
|
113
118
|
releaseBuffer(buffer) {
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
for (const child of buffer._children) {
|
|
124
|
-
this.freeSpanTree(child);
|
|
119
|
+
const root = requireWasmSpanBuffer(buffer);
|
|
120
|
+
const segments = [];
|
|
121
|
+
walkSpanTree(root, (segment) => segments.push(requireWasmSpanBuffer(segment)));
|
|
122
|
+
const topology = root._traceRoot._topology;
|
|
123
|
+
topology.release(() => {
|
|
124
|
+
for (const segment of segments)
|
|
125
|
+
segment.free();
|
|
126
|
+
if (root._descriptor.kind === 'root' && root._traceRoot instanceof WasmTraceRoot) {
|
|
127
|
+
root._traceRoot.free();
|
|
125
128
|
}
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
if (buffer._overflow) {
|
|
129
|
-
this.freeSpanTree(buffer._overflow);
|
|
130
|
-
}
|
|
131
|
-
// Free this buffer's WASM memory
|
|
132
|
-
if (typeof buffer.free === 'function') {
|
|
133
|
-
buffer.free();
|
|
134
|
-
}
|
|
129
|
+
});
|
|
130
|
+
this.liveRoots.delete(root);
|
|
135
131
|
}
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
132
|
+
invalidateSpanTree(buffer) {
|
|
133
|
+
walkSpanTree(buffer, (segment) => {
|
|
134
|
+
const wasmSegment = requireWasmSpanBuffer(segment);
|
|
135
|
+
wasmSegment._columnPtrs.fill(-1);
|
|
136
|
+
wasmSegment._descriptor.state = 'freed';
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
/** Reset invalidates every live handle before allocator offsets are reused. */
|
|
140
140
|
reset() {
|
|
141
|
+
for (const root of this.liveRoots) {
|
|
142
|
+
this.invalidateSpanTree(root);
|
|
143
|
+
if (root._traceRoot instanceof WasmTraceRoot)
|
|
144
|
+
root._traceRoot.invalidate();
|
|
145
|
+
root._traceRoot._topology.release();
|
|
146
|
+
}
|
|
147
|
+
this.liveRoots.clear();
|
|
141
148
|
this.allocator.reset();
|
|
142
149
|
}
|
|
143
150
|
/**
|