@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
|
@@ -13,16 +13,24 @@
|
|
|
13
13
|
*
|
|
14
14
|
* Spec link (88): realizes specs/lmao/01q_wasm_memory_architecture.md#smoo/lmao!n/wasm-mem (TS allocator wrapper).
|
|
15
15
|
*/
|
|
16
|
+
export interface WasmMemoryEpochPin {
|
|
17
|
+
readonly buffer: ArrayBuffer;
|
|
18
|
+
readonly version: number;
|
|
19
|
+
readonly released: boolean;
|
|
20
|
+
release(): void;
|
|
21
|
+
}
|
|
22
|
+
export declare const WASM_SPAN_IDENTITY_ROOT = 0;
|
|
23
|
+
export declare const WASM_SPAN_IDENTITY_CHILD = 1;
|
|
24
|
+
export declare const WASM_NO_LAYOUT_OFFSET = 4294967295;
|
|
16
25
|
export interface WasmAllocator {
|
|
17
26
|
/** The underlying WASM memory */
|
|
18
27
|
readonly memory: WebAssembly.Memory;
|
|
19
|
-
/**
|
|
20
|
-
readonly
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
};
|
|
28
|
+
/** Monotonic version of the current linear-memory ArrayBuffer. */
|
|
29
|
+
readonly memoryVersion: number;
|
|
30
|
+
/** Refresh canonical allocator views after growth and return memoryVersion. */
|
|
31
|
+
refreshViews(): number;
|
|
32
|
+
/** Pin the current linear-memory backing epoch for borrowed Arrow views. */
|
|
33
|
+
pinMemoryEpoch(): WasmMemoryEpochPin;
|
|
26
34
|
/** Cached views (recreated after grow, but pre-sized to avoid grow for benchmarks) */
|
|
27
35
|
readonly u8: Uint8Array;
|
|
28
36
|
readonly u32: Uint32Array;
|
|
@@ -34,30 +42,27 @@ export interface WasmAllocator {
|
|
|
34
42
|
init(): void;
|
|
35
43
|
/** Reset all freelists (for testing/benchmarking) */
|
|
36
44
|
reset(): void;
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
+
/** Allocate and release an exact logical byte extent with explicit alignment. */
|
|
46
|
+
allocExact(byteLength: number, alignment: number): number;
|
|
47
|
+
freeExact(offset: number, byteLength: number, alignment: number): void;
|
|
48
|
+
/**
|
|
49
|
+
* Allocate one root/child superblock and pre-arm its lifecycle rows in one
|
|
50
|
+
* WASM call. All offsets are immutable compile/startup layout constants.
|
|
51
|
+
*/
|
|
52
|
+
createAndStartSpan(identityMode: typeof WASM_SPAN_IDENTITY_ROOT | typeof WASM_SPAN_IDENTITY_CHILD, traceIdLength: number, superblockByteLength: number, systemOffset: number, entryTypeOffset: number, rowHeaderOffset: number, traceRootPtr: number): number;
|
|
53
|
+
/** Allocate one storage-only overflow superblock in one WASM call. */
|
|
54
|
+
createOverflowSpan(superblockByteLength: number): number;
|
|
55
|
+
/** Release one root, child, or overflow superblock. */
|
|
56
|
+
freeSpanSuperblock(offset: number, byteLength: number): void;
|
|
45
57
|
spanStart(systemPtr: number, identityPtr: number, traceRootPtr: number, capacity?: number): void;
|
|
46
58
|
spanEndOk(systemPtr: number, traceRootPtr: number, capacity?: number): void;
|
|
47
59
|
spanEndErr(systemPtr: number, traceRootPtr: number, capacity?: number): void;
|
|
48
60
|
/** Write log entry, bump writeIndex, return idx written to */
|
|
49
61
|
writeLogEntry(systemPtr: number, identityPtr: number, traceRootPtr: number, entryType: number, capacity?: number): number;
|
|
50
|
-
writeColF64(colOffset: number, rowIdx: number, value: number, capacity?: number): number;
|
|
51
|
-
writeColU32(colOffset: number, rowIdx: number, value: number, capacity?: number): number;
|
|
52
|
-
writeColU8(colOffset: number, rowIdx: number, value: number, capacity?: number): number;
|
|
53
62
|
initTraceRoot(traceRootPtr: number): void;
|
|
54
63
|
getBumpPtr(): number;
|
|
55
64
|
getAllocCount(): number;
|
|
56
65
|
getFreeCount(): number;
|
|
57
|
-
getSpanSystemSize(capacity?: number): number;
|
|
58
|
-
getCol1BSize(capacity?: number): number;
|
|
59
|
-
getCol4BSize(capacity?: number): number;
|
|
60
|
-
getCol8BSize(capacity?: number): number;
|
|
61
66
|
readTimestamp(systemPtr: number, rowIdx: number): bigint;
|
|
62
67
|
readEntryType(systemPtr: number, rowIdx: number, capacity?: number): number;
|
|
63
68
|
readWriteIndex(identityPtr: number): number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wasmAllocator.d.ts","sourceRoot":"","sources":["../../../src/lib/wasm/wasmAllocator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAQH,MAAM,WAAW,
|
|
1
|
+
{"version":3,"file":"wasmAllocator.d.ts","sourceRoot":"","sources":["../../../src/lib/wasm/wasmAllocator.ts"],"names":[],"mappings":"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"}
|
|
@@ -13,6 +13,9 @@
|
|
|
13
13
|
*
|
|
14
14
|
* Spec link (88): realizes specs/lmao/01q_wasm_memory_architecture.md#smoo/lmao!n/wasm-mem (TS allocator wrapper).
|
|
15
15
|
*/
|
|
16
|
+
export const WASM_SPAN_IDENTITY_ROOT = 0;
|
|
17
|
+
export const WASM_SPAN_IDENTITY_CHILD = 1;
|
|
18
|
+
export const WASM_NO_LAYOUT_OFFSET = 0xffffffff;
|
|
16
19
|
/**
|
|
17
20
|
* Size class enum matching Zig's SizeClass
|
|
18
21
|
*/
|
|
@@ -28,7 +31,11 @@ function isWasmExports(value) {
|
|
|
28
31
|
if (typeof value !== 'object' || value === null) {
|
|
29
32
|
return false;
|
|
30
33
|
}
|
|
31
|
-
return (typeof Reflect.get(value, 'init') === 'function' &&
|
|
34
|
+
return (typeof Reflect.get(value, 'init') === 'function' &&
|
|
35
|
+
typeof Reflect.get(value, 'alloc_exact') === 'function' &&
|
|
36
|
+
typeof Reflect.get(value, 'create_and_start_span') === 'function' &&
|
|
37
|
+
typeof Reflect.get(value, 'create_overflow_span') === 'function' &&
|
|
38
|
+
typeof Reflect.get(value, 'free_span_superblock') === 'function');
|
|
32
39
|
}
|
|
33
40
|
// =============================================================================
|
|
34
41
|
// Implementation
|
|
@@ -58,75 +65,87 @@ function wrapWasmInstance(instance, memory, capacity) {
|
|
|
58
65
|
const exports = instance.exports;
|
|
59
66
|
let views = createViews(memory);
|
|
60
67
|
let currentBuffer = memory.buffer;
|
|
68
|
+
let memoryVersion = 1;
|
|
69
|
+
let memoryEpochPins = 0;
|
|
70
|
+
const refreshViews = () => {
|
|
71
|
+
if (memory.buffer !== currentBuffer) {
|
|
72
|
+
if (memoryEpochPins !== 0) {
|
|
73
|
+
throw new Error('WASM memory grew while an Arrow lease pinned the previous epoch');
|
|
74
|
+
}
|
|
75
|
+
currentBuffer = memory.buffer;
|
|
76
|
+
views = createViews(memory);
|
|
77
|
+
memoryVersion++;
|
|
78
|
+
}
|
|
79
|
+
return memoryVersion;
|
|
80
|
+
};
|
|
61
81
|
// Initialize the allocator header
|
|
62
82
|
exports.init();
|
|
63
83
|
return {
|
|
64
84
|
memory,
|
|
65
85
|
capacity,
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
86
|
+
get memoryVersion() {
|
|
87
|
+
return refreshViews();
|
|
88
|
+
},
|
|
89
|
+
refreshViews,
|
|
90
|
+
pinMemoryEpoch() {
|
|
91
|
+
const version = refreshViews();
|
|
92
|
+
const buffer = currentBuffer;
|
|
93
|
+
memoryEpochPins++;
|
|
94
|
+
let released = false;
|
|
95
|
+
return {
|
|
96
|
+
buffer,
|
|
97
|
+
version,
|
|
98
|
+
get released() {
|
|
99
|
+
return released;
|
|
100
|
+
},
|
|
101
|
+
release() {
|
|
102
|
+
if (released)
|
|
103
|
+
return;
|
|
104
|
+
released = true;
|
|
105
|
+
memoryEpochPins--;
|
|
106
|
+
},
|
|
107
|
+
};
|
|
71
108
|
},
|
|
72
109
|
get u8() {
|
|
73
|
-
|
|
74
|
-
if (memory.buffer !== currentBuffer) {
|
|
75
|
-
currentBuffer = memory.buffer;
|
|
76
|
-
views = createViews(memory);
|
|
77
|
-
}
|
|
110
|
+
refreshViews();
|
|
78
111
|
return views.u8;
|
|
79
112
|
},
|
|
80
113
|
get u32() {
|
|
81
|
-
|
|
82
|
-
currentBuffer = memory.buffer;
|
|
83
|
-
views = createViews(memory);
|
|
84
|
-
}
|
|
114
|
+
refreshViews();
|
|
85
115
|
return views.u32;
|
|
86
116
|
},
|
|
87
117
|
get i64() {
|
|
88
|
-
|
|
89
|
-
currentBuffer = memory.buffer;
|
|
90
|
-
views = createViews(memory);
|
|
91
|
-
}
|
|
118
|
+
refreshViews();
|
|
92
119
|
return views.i64;
|
|
93
120
|
},
|
|
94
121
|
get f64() {
|
|
95
|
-
|
|
96
|
-
currentBuffer = memory.buffer;
|
|
97
|
-
views = createViews(memory);
|
|
98
|
-
}
|
|
122
|
+
refreshViews();
|
|
99
123
|
return views.f64;
|
|
100
124
|
},
|
|
101
125
|
init: exports.init,
|
|
102
126
|
reset: exports.reset,
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
127
|
+
allocExact: exports.alloc_exact,
|
|
128
|
+
freeExact: exports.free_exact,
|
|
129
|
+
createAndStartSpan: (identityMode, traceIdLength, superblockByteLength, systemOffset, entryTypeOffset, rowHeaderOffset, traceRootPtr) => {
|
|
130
|
+
const offset = exports.create_and_start_span(identityMode, traceIdLength, superblockByteLength, systemOffset, entryTypeOffset, rowHeaderOffset, traceRootPtr);
|
|
131
|
+
refreshViews();
|
|
132
|
+
return offset;
|
|
133
|
+
},
|
|
134
|
+
createOverflowSpan: (superblockByteLength) => {
|
|
135
|
+
const offset = exports.create_overflow_span(superblockByteLength);
|
|
136
|
+
refreshViews();
|
|
137
|
+
return offset;
|
|
138
|
+
},
|
|
139
|
+
freeSpanSuperblock: exports.free_span_superblock,
|
|
113
140
|
// Span lifecycle with optional capacity
|
|
114
141
|
spanStart: (systemPtr, identityPtr, traceRootPtr, cap = capacity) => exports.span_start(systemPtr, identityPtr, traceRootPtr, cap),
|
|
115
142
|
spanEndOk: (systemPtr, traceRootPtr, cap = capacity) => exports.span_end_ok(systemPtr, traceRootPtr, cap),
|
|
116
143
|
spanEndErr: (systemPtr, traceRootPtr, cap = capacity) => exports.span_end_err(systemPtr, traceRootPtr, cap),
|
|
117
|
-
writeLogEntry: (systemPtr,
|
|
118
|
-
// Column writes with optional capacity
|
|
119
|
-
writeColF64: (colOffset, rowIdx, value, cap = capacity) => exports.write_col_f64(colOffset, rowIdx, value, cap),
|
|
120
|
-
writeColU32: (colOffset, rowIdx, value, cap = capacity) => exports.write_col_u32(colOffset, rowIdx, value, cap),
|
|
121
|
-
writeColU8: (colOffset, rowIdx, value, cap = capacity) => exports.write_col_u8(colOffset, rowIdx, value, cap),
|
|
144
|
+
writeLogEntry: (systemPtr, identityPtr, traceRootPtr, entryType, cap = capacity) => exports.write_log_entry(systemPtr, identityPtr, traceRootPtr, entryType, cap),
|
|
122
145
|
initTraceRoot: exports.init_trace_root,
|
|
123
146
|
getBumpPtr: exports.get_bump_ptr,
|
|
124
147
|
getAllocCount: exports.get_alloc_count,
|
|
125
148
|
getFreeCount: exports.get_free_count,
|
|
126
|
-
getSpanSystemSize: (cap = capacity) => exports.get_span_system_size(cap),
|
|
127
|
-
getCol1BSize: (cap = capacity) => exports.get_col_1b_size(cap),
|
|
128
|
-
getCol4BSize: (cap = capacity) => exports.get_col_4b_size(cap),
|
|
129
|
-
getCol8BSize: (cap = capacity) => exports.get_col_8b_size(cap),
|
|
130
149
|
readTimestamp: exports.read_timestamp,
|
|
131
150
|
readEntryType: (systemPtr, rowIdx, cap = capacity) => exports.read_entry_type(systemPtr, rowIdx, cap),
|
|
132
151
|
readWriteIndex: exports.read_write_index,
|
|
@@ -167,6 +186,9 @@ function createImports(memory) {
|
|
|
167
186
|
// Cache for compiled WASM module (shared across all allocators)
|
|
168
187
|
// This eliminates recompilation cost in benchmarks and production
|
|
169
188
|
let cachedWasmModule = null;
|
|
189
|
+
// The shipped Rust allocator is the only supported artifact. Node and browser loading
|
|
190
|
+
// deliberately share this fixed path so runtime selection cannot drift by environment.
|
|
191
|
+
const WASM_ARTIFACT_NAME = 'allocator.wasm';
|
|
170
192
|
/**
|
|
171
193
|
* Load WASM bytes - handles both Node.js and browser environments.
|
|
172
194
|
*/
|
|
@@ -179,7 +201,7 @@ async function loadWasmBytes() {
|
|
|
179
201
|
// __dirname equivalent for ESM
|
|
180
202
|
const currentFile = fileURLToPath(import.meta.url);
|
|
181
203
|
const currentDir = dirname(currentFile);
|
|
182
|
-
const wasmPath = join(currentDir, '../../../dist
|
|
204
|
+
const wasmPath = join(currentDir, '../../../dist', WASM_ARTIFACT_NAME);
|
|
183
205
|
const buffer = await readFile(wasmPath);
|
|
184
206
|
// Create a proper ArrayBuffer from the Node.js Buffer
|
|
185
207
|
const arrayBuffer = new ArrayBuffer(buffer.byteLength);
|
|
@@ -187,7 +209,7 @@ async function loadWasmBytes() {
|
|
|
187
209
|
return arrayBuffer;
|
|
188
210
|
}
|
|
189
211
|
// Browser: fetch from relative path
|
|
190
|
-
const response = await fetch(new URL(
|
|
212
|
+
const response = await fetch(new URL(`../../../dist/${WASM_ARTIFACT_NAME}`, import.meta.url));
|
|
191
213
|
return response.arrayBuffer();
|
|
192
214
|
}
|
|
193
215
|
/**
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import type { EagerColumnDescriptor } from '../physicalLayoutPlan.js';
|
|
2
|
+
import type { MessageLayoutFamily, MessagePhysicalLayout } from '../runtimeHint.js';
|
|
3
|
+
import type { LogSchema } from '../schema/LogSchema.js';
|
|
4
|
+
export type WasmNumericFamily = 'u8' | 'u32' | 'f64';
|
|
5
|
+
export type WasmArrayType = 'Uint8Array' | 'Uint32Array' | 'Float64Array' | 'BigUint64Array';
|
|
6
|
+
export interface WasmColumnLayoutTemplate {
|
|
7
|
+
readonly name: string;
|
|
8
|
+
readonly columnIndex: number;
|
|
9
|
+
readonly family: WasmNumericFamily;
|
|
10
|
+
readonly arrayType: WasmArrayType;
|
|
11
|
+
readonly byteWidth: 1 | 4 | 8;
|
|
12
|
+
readonly alignment: 1 | 4 | 8;
|
|
13
|
+
readonly eager: boolean;
|
|
14
|
+
}
|
|
15
|
+
export interface WasmColumnLayoutDescriptor extends WasmColumnLayoutTemplate {
|
|
16
|
+
readonly nullOffset: number;
|
|
17
|
+
readonly nullByteLength: number;
|
|
18
|
+
readonly valueOffset: number;
|
|
19
|
+
readonly valueLength: number;
|
|
20
|
+
}
|
|
21
|
+
export interface WasmNumericSlabLayoutDescriptor {
|
|
22
|
+
readonly family: WasmNumericFamily;
|
|
23
|
+
readonly byteLength: number;
|
|
24
|
+
readonly alignment: 1 | 4 | 8;
|
|
25
|
+
}
|
|
26
|
+
export interface WasmSystemSlabLayoutDescriptor {
|
|
27
|
+
readonly family: 'system';
|
|
28
|
+
readonly byteLength: number;
|
|
29
|
+
readonly alignment: 8;
|
|
30
|
+
readonly timestampOffset: 0;
|
|
31
|
+
readonly entryTypeOffset: number | null;
|
|
32
|
+
readonly messageIdOffset: number | null;
|
|
33
|
+
readonly messageDenseIndexOffset: number | null;
|
|
34
|
+
readonly rowHeaderOffset: number | null;
|
|
35
|
+
/** Logical row offset into the JS raw-message sidecar; contributes no WASM bytes. */
|
|
36
|
+
readonly messageValueOffset: 0 | null;
|
|
37
|
+
}
|
|
38
|
+
export type WasmSlabLayoutDescriptor = WasmSystemSlabLayoutDescriptor | WasmNumericSlabLayoutDescriptor;
|
|
39
|
+
export interface WasmSuperblockLayoutDescriptor {
|
|
40
|
+
readonly byteLength: number;
|
|
41
|
+
/** Bytes consumed by the previous separate-allocation shape from an 8-byte-aligned start. */
|
|
42
|
+
readonly legacyByteLength: number;
|
|
43
|
+
readonly identityOffset: 0 | null;
|
|
44
|
+
readonly systemOffset: number;
|
|
45
|
+
readonly familyOffsets: Readonly<Record<WasmNumericFamily, number>>;
|
|
46
|
+
}
|
|
47
|
+
export interface WasmPhysicalLayoutDescriptor {
|
|
48
|
+
readonly capacity: number;
|
|
49
|
+
readonly messageLayoutFamily: MessageLayoutFamily;
|
|
50
|
+
readonly messagePhysicalLayout: MessagePhysicalLayout;
|
|
51
|
+
readonly eagerColumns: EagerColumnDescriptor;
|
|
52
|
+
readonly system: WasmSystemSlabLayoutDescriptor;
|
|
53
|
+
readonly slabs: Readonly<Record<WasmNumericFamily, WasmNumericSlabLayoutDescriptor | null>>;
|
|
54
|
+
readonly columns: readonly WasmColumnLayoutDescriptor[];
|
|
55
|
+
readonly spanSuperblock: WasmSuperblockLayoutDescriptor;
|
|
56
|
+
readonly overflowSuperblock: WasmSuperblockLayoutDescriptor;
|
|
57
|
+
}
|
|
58
|
+
export interface WasmLayoutTemplate {
|
|
59
|
+
readonly messageLayoutFamily: MessageLayoutFamily;
|
|
60
|
+
readonly messagePhysicalLayout: MessagePhysicalLayout;
|
|
61
|
+
readonly eagerColumns: EagerColumnDescriptor;
|
|
62
|
+
readonly columns: readonly WasmColumnLayoutTemplate[];
|
|
63
|
+
forCapacity(capacity: number): WasmPhysicalLayoutDescriptor;
|
|
64
|
+
}
|
|
65
|
+
export declare function createWasmLayoutTemplate(schema: LogSchema, messageLayoutFamily?: MessageLayoutFamily, messagePhysicalLayout?: MessagePhysicalLayout, eagerColumns?: EagerColumnDescriptor): WasmLayoutTemplate;
|
|
66
|
+
export declare function getWasmPhysicalLayout(schema: LogSchema, capacity: number, messageLayoutFamily?: MessageLayoutFamily, messagePhysicalLayout?: MessagePhysicalLayout, eagerColumns?: EagerColumnDescriptor): WasmPhysicalLayoutDescriptor;
|
|
67
|
+
//# sourceMappingURL=wasmPhysicalLayout.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wasmPhysicalLayout.d.ts","sourceRoot":"","sources":["../../../src/lib/wasm/wasmPhysicalLayout.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
import { getSchemaType } from '@smoothbricks/arrow-builder';
|
|
2
|
+
const WASM_IDENTITY_BYTE_LENGTH = 128;
|
|
3
|
+
const EXACT_FREELIST_METADATA_BYTE_LENGTH = 16;
|
|
4
|
+
const EMPTY_EAGER_COLUMNS = Object.freeze({
|
|
5
|
+
names: Object.freeze([]),
|
|
6
|
+
words: Object.freeze([]),
|
|
7
|
+
key: '',
|
|
8
|
+
});
|
|
9
|
+
function align(value, alignment) {
|
|
10
|
+
return (value + alignment - 1) & ~(alignment - 1);
|
|
11
|
+
}
|
|
12
|
+
function freezeSuperblockLayout(system, slabs, includesIdentity) {
|
|
13
|
+
let byteLength = includesIdentity ? WASM_IDENTITY_BYTE_LENGTH : 0;
|
|
14
|
+
let legacyByteLength = byteLength;
|
|
15
|
+
const systemAlignment = Math.max(system.alignment, 4);
|
|
16
|
+
const systemOffset = align(byteLength, systemAlignment);
|
|
17
|
+
byteLength = systemOffset + system.byteLength;
|
|
18
|
+
legacyByteLength =
|
|
19
|
+
align(legacyByteLength, systemAlignment) + Math.max(system.byteLength, EXACT_FREELIST_METADATA_BYTE_LENGTH);
|
|
20
|
+
const familyOffsets = { u8: 0, u32: 0, f64: 0 };
|
|
21
|
+
for (const family of ['u8', 'u32', 'f64']) {
|
|
22
|
+
const slab = slabs[family];
|
|
23
|
+
if (slab === null)
|
|
24
|
+
continue;
|
|
25
|
+
const storageAlignment = Math.max(slab.alignment, 4);
|
|
26
|
+
const offset = align(byteLength, storageAlignment);
|
|
27
|
+
familyOffsets[family] = offset;
|
|
28
|
+
byteLength = offset + slab.byteLength;
|
|
29
|
+
legacyByteLength =
|
|
30
|
+
align(legacyByteLength, storageAlignment) + Math.max(slab.byteLength, EXACT_FREELIST_METADATA_BYTE_LENGTH);
|
|
31
|
+
}
|
|
32
|
+
if (byteLength > legacyByteLength) {
|
|
33
|
+
throw new Error('WASM superblock exceeded its separate-allocation footprint');
|
|
34
|
+
}
|
|
35
|
+
return Object.freeze({
|
|
36
|
+
byteLength,
|
|
37
|
+
legacyByteLength,
|
|
38
|
+
identityOffset: includesIdentity ? 0 : null,
|
|
39
|
+
systemOffset,
|
|
40
|
+
familyOffsets: Object.freeze(familyOffsets),
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
function freezeExactLayout(capacity, messageLayoutFamily, messagePhysicalLayout, templates, eagerColumns) {
|
|
44
|
+
if (!Number.isSafeInteger(capacity) || capacity <= 0) {
|
|
45
|
+
throw new RangeError(`WASM layout capacity must be a positive safe integer, received ${capacity}`);
|
|
46
|
+
}
|
|
47
|
+
const nullByteLength = Math.ceil(capacity / 8);
|
|
48
|
+
const familyOffsets = { u8: 0, u32: 0, f64: 0 };
|
|
49
|
+
const columns = [];
|
|
50
|
+
for (const template of templates) {
|
|
51
|
+
const nullOffset = familyOffsets[template.family];
|
|
52
|
+
const valueOffset = align(nullOffset + nullByteLength, template.alignment);
|
|
53
|
+
const valueLength = capacity * template.byteWidth;
|
|
54
|
+
familyOffsets[template.family] = valueOffset + valueLength;
|
|
55
|
+
columns.push(Object.freeze({
|
|
56
|
+
...template,
|
|
57
|
+
nullOffset,
|
|
58
|
+
nullByteLength,
|
|
59
|
+
valueOffset,
|
|
60
|
+
valueLength,
|
|
61
|
+
}));
|
|
62
|
+
}
|
|
63
|
+
const slab = (family, alignment) => {
|
|
64
|
+
const byteLength = familyOffsets[family];
|
|
65
|
+
return byteLength === 0 ? null : Object.freeze({ family, byteLength, alignment });
|
|
66
|
+
};
|
|
67
|
+
const hasStaticMessages = messageLayoutFamily !== 'dynamic-only';
|
|
68
|
+
const messageValueOffset = messageLayoutFamily === 'static-only' ? null : 0;
|
|
69
|
+
let systemByteLength = capacity * 8;
|
|
70
|
+
let entryTypeOffset = null;
|
|
71
|
+
let messageIdOffset = null;
|
|
72
|
+
let messageDenseIndexOffset = null;
|
|
73
|
+
let rowHeaderOffset = null;
|
|
74
|
+
if (messagePhysicalLayout === 'packed') {
|
|
75
|
+
rowHeaderOffset = align(systemByteLength, 4);
|
|
76
|
+
systemByteLength = rowHeaderOffset + capacity * 4;
|
|
77
|
+
}
|
|
78
|
+
else {
|
|
79
|
+
entryTypeOffset = systemByteLength;
|
|
80
|
+
systemByteLength = entryTypeOffset + capacity;
|
|
81
|
+
if (hasStaticMessages) {
|
|
82
|
+
if (messagePhysicalLayout === 'current') {
|
|
83
|
+
messageIdOffset = align(systemByteLength, 2);
|
|
84
|
+
systemByteLength = messageIdOffset + capacity * 2;
|
|
85
|
+
}
|
|
86
|
+
else {
|
|
87
|
+
messageDenseIndexOffset = align(systemByteLength, 4);
|
|
88
|
+
systemByteLength = messageDenseIndexOffset + capacity * 4;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
const system = Object.freeze({
|
|
93
|
+
family: 'system',
|
|
94
|
+
byteLength: align(systemByteLength, 8),
|
|
95
|
+
alignment: 8,
|
|
96
|
+
timestampOffset: 0,
|
|
97
|
+
entryTypeOffset,
|
|
98
|
+
messageIdOffset,
|
|
99
|
+
messageDenseIndexOffset,
|
|
100
|
+
rowHeaderOffset,
|
|
101
|
+
messageValueOffset,
|
|
102
|
+
});
|
|
103
|
+
const slabs = Object.freeze({
|
|
104
|
+
u8: slab('u8', 1),
|
|
105
|
+
u32: slab('u32', 4),
|
|
106
|
+
f64: slab('f64', 8),
|
|
107
|
+
});
|
|
108
|
+
return Object.freeze({
|
|
109
|
+
capacity,
|
|
110
|
+
messageLayoutFamily,
|
|
111
|
+
messagePhysicalLayout,
|
|
112
|
+
eagerColumns,
|
|
113
|
+
system,
|
|
114
|
+
slabs,
|
|
115
|
+
spanSuperblock: freezeSuperblockLayout(system, slabs, true),
|
|
116
|
+
overflowSuperblock: freezeSuperblockLayout(system, slabs, false),
|
|
117
|
+
columns: Object.freeze(columns),
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
function buildWasmLayoutTemplate(schema, messageLayoutFamily, messagePhysicalLayout, eagerColumns) {
|
|
121
|
+
const columns = [];
|
|
122
|
+
const preallocatedColumns = new Set(eagerColumns.names);
|
|
123
|
+
let columnIndex = 0;
|
|
124
|
+
for (const name of schema._columnNames) {
|
|
125
|
+
const field = schema.fields[name];
|
|
126
|
+
const schemaType = getSchemaType(field);
|
|
127
|
+
const eager = preallocatedColumns.has(name) ||
|
|
128
|
+
(typeof field === 'object' && field !== null && Reflect.get(field, '__eager') === true);
|
|
129
|
+
let storage = null;
|
|
130
|
+
switch (schemaType) {
|
|
131
|
+
case 'enum':
|
|
132
|
+
case 'boolean':
|
|
133
|
+
storage = { family: 'u8', arrayType: 'Uint8Array', byteWidth: 1, alignment: 1 };
|
|
134
|
+
break;
|
|
135
|
+
case 'number':
|
|
136
|
+
storage = { family: 'f64', arrayType: 'Float64Array', byteWidth: 8, alignment: 8 };
|
|
137
|
+
break;
|
|
138
|
+
case 'bigUint64':
|
|
139
|
+
storage = { family: 'f64', arrayType: 'BigUint64Array', byteWidth: 8, alignment: 8 };
|
|
140
|
+
break;
|
|
141
|
+
}
|
|
142
|
+
if (storage !== null && name !== 'message') {
|
|
143
|
+
columns.push(Object.freeze({ name, columnIndex, eager, ...storage }));
|
|
144
|
+
}
|
|
145
|
+
columnIndex++;
|
|
146
|
+
}
|
|
147
|
+
const frozenColumns = Object.freeze(columns);
|
|
148
|
+
const descriptors = new Map();
|
|
149
|
+
return Object.freeze({
|
|
150
|
+
messageLayoutFamily,
|
|
151
|
+
messagePhysicalLayout,
|
|
152
|
+
eagerColumns,
|
|
153
|
+
columns: frozenColumns,
|
|
154
|
+
forCapacity(capacity) {
|
|
155
|
+
let descriptor = descriptors.get(capacity);
|
|
156
|
+
if (descriptor === undefined) {
|
|
157
|
+
descriptor = freezeExactLayout(capacity, messageLayoutFamily, messagePhysicalLayout, frozenColumns, eagerColumns);
|
|
158
|
+
descriptors.set(capacity, descriptor);
|
|
159
|
+
}
|
|
160
|
+
return descriptor;
|
|
161
|
+
},
|
|
162
|
+
});
|
|
163
|
+
}
|
|
164
|
+
const templates = new WeakMap();
|
|
165
|
+
export function createWasmLayoutTemplate(schema, messageLayoutFamily = 'mixed', messagePhysicalLayout = 'current', eagerColumns = EMPTY_EAGER_COLUMNS) {
|
|
166
|
+
const cacheKey = `${messageLayoutFamily}:${messagePhysicalLayout}:${eagerColumns.key}`;
|
|
167
|
+
let familyTemplates = templates.get(schema);
|
|
168
|
+
let template = familyTemplates?.get(cacheKey);
|
|
169
|
+
if (template === undefined) {
|
|
170
|
+
template = buildWasmLayoutTemplate(schema, messageLayoutFamily, messagePhysicalLayout, eagerColumns);
|
|
171
|
+
familyTemplates ??= new Map();
|
|
172
|
+
familyTemplates.set(cacheKey, template);
|
|
173
|
+
templates.set(schema, familyTemplates);
|
|
174
|
+
}
|
|
175
|
+
return template;
|
|
176
|
+
}
|
|
177
|
+
export function getWasmPhysicalLayout(schema, capacity, messageLayoutFamily = 'mixed', messagePhysicalLayout = 'current', eagerColumns = EMPTY_EAGER_COLUMNS) {
|
|
178
|
+
return createWasmLayoutTemplate(schema, messageLayoutFamily, messagePhysicalLayout, eagerColumns).forCapacity(capacity);
|
|
179
|
+
}
|