@smoothbricks/lmao 0.2.2 → 0.2.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/allocator.wasm +0 -0
- package/dist/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 +29 -14
- 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/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/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 +98 -17
- 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/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/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__/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
|
@@ -0,0 +1,309 @@
|
|
|
1
|
+
import { getSchemaType } from '@smoothbricks/arrow-builder';
|
|
2
|
+
import type { EagerColumnDescriptor } from '../physicalLayoutPlan.js';
|
|
3
|
+
import type { MessageLayoutFamily, MessagePhysicalLayout } from '../runtimeHint.js';
|
|
4
|
+
import type { LogSchema } from '../schema/LogSchema.js';
|
|
5
|
+
|
|
6
|
+
export type WasmNumericFamily = 'u8' | 'u32' | 'f64';
|
|
7
|
+
|
|
8
|
+
const WASM_IDENTITY_BYTE_LENGTH = 128;
|
|
9
|
+
const EXACT_FREELIST_METADATA_BYTE_LENGTH = 16;
|
|
10
|
+
|
|
11
|
+
const EMPTY_EAGER_COLUMNS: EagerColumnDescriptor = Object.freeze({
|
|
12
|
+
names: Object.freeze([]),
|
|
13
|
+
words: Object.freeze([]),
|
|
14
|
+
key: '',
|
|
15
|
+
});
|
|
16
|
+
export type WasmArrayType = 'Uint8Array' | 'Uint32Array' | 'Float64Array' | 'BigUint64Array';
|
|
17
|
+
|
|
18
|
+
export interface WasmColumnLayoutTemplate {
|
|
19
|
+
readonly name: string;
|
|
20
|
+
readonly columnIndex: number;
|
|
21
|
+
readonly family: WasmNumericFamily;
|
|
22
|
+
readonly arrayType: WasmArrayType;
|
|
23
|
+
readonly byteWidth: 1 | 4 | 8;
|
|
24
|
+
readonly alignment: 1 | 4 | 8;
|
|
25
|
+
readonly eager: boolean;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export interface WasmColumnLayoutDescriptor extends WasmColumnLayoutTemplate {
|
|
29
|
+
readonly nullOffset: number;
|
|
30
|
+
readonly nullByteLength: number;
|
|
31
|
+
readonly valueOffset: number;
|
|
32
|
+
readonly valueLength: number;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export interface WasmNumericSlabLayoutDescriptor {
|
|
36
|
+
readonly family: WasmNumericFamily;
|
|
37
|
+
readonly byteLength: number;
|
|
38
|
+
readonly alignment: 1 | 4 | 8;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
export interface WasmSystemSlabLayoutDescriptor {
|
|
42
|
+
readonly family: 'system';
|
|
43
|
+
readonly byteLength: number;
|
|
44
|
+
readonly alignment: 8;
|
|
45
|
+
readonly timestampOffset: 0;
|
|
46
|
+
readonly entryTypeOffset: number | null;
|
|
47
|
+
readonly messageIdOffset: number | null;
|
|
48
|
+
readonly messageDenseIndexOffset: number | null;
|
|
49
|
+
readonly rowHeaderOffset: number | null;
|
|
50
|
+
/** Logical row offset into the JS raw-message sidecar; contributes no WASM bytes. */
|
|
51
|
+
readonly messageValueOffset: 0 | null;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
export type WasmSlabLayoutDescriptor = WasmSystemSlabLayoutDescriptor | WasmNumericSlabLayoutDescriptor;
|
|
55
|
+
|
|
56
|
+
export interface WasmSuperblockLayoutDescriptor {
|
|
57
|
+
readonly byteLength: number;
|
|
58
|
+
/** Bytes consumed by the previous separate-allocation shape from an 8-byte-aligned start. */
|
|
59
|
+
readonly legacyByteLength: number;
|
|
60
|
+
readonly identityOffset: 0 | null;
|
|
61
|
+
readonly systemOffset: number;
|
|
62
|
+
readonly familyOffsets: Readonly<Record<WasmNumericFamily, number>>;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
export interface WasmPhysicalLayoutDescriptor {
|
|
66
|
+
readonly capacity: number;
|
|
67
|
+
readonly messageLayoutFamily: MessageLayoutFamily;
|
|
68
|
+
readonly messagePhysicalLayout: MessagePhysicalLayout;
|
|
69
|
+
readonly eagerColumns: EagerColumnDescriptor;
|
|
70
|
+
readonly system: WasmSystemSlabLayoutDescriptor;
|
|
71
|
+
readonly slabs: Readonly<Record<WasmNumericFamily, WasmNumericSlabLayoutDescriptor | null>>;
|
|
72
|
+
readonly columns: readonly WasmColumnLayoutDescriptor[];
|
|
73
|
+
readonly spanSuperblock: WasmSuperblockLayoutDescriptor;
|
|
74
|
+
readonly overflowSuperblock: WasmSuperblockLayoutDescriptor;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
export interface WasmLayoutTemplate {
|
|
78
|
+
readonly messageLayoutFamily: MessageLayoutFamily;
|
|
79
|
+
readonly messagePhysicalLayout: MessagePhysicalLayout;
|
|
80
|
+
readonly eagerColumns: EagerColumnDescriptor;
|
|
81
|
+
readonly columns: readonly WasmColumnLayoutTemplate[];
|
|
82
|
+
forCapacity(capacity: number): WasmPhysicalLayoutDescriptor;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
function align(value: number, alignment: number): number {
|
|
86
|
+
return (value + alignment - 1) & ~(alignment - 1);
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
function freezeSuperblockLayout(
|
|
90
|
+
system: WasmSystemSlabLayoutDescriptor,
|
|
91
|
+
slabs: Readonly<Record<WasmNumericFamily, WasmNumericSlabLayoutDescriptor | null>>,
|
|
92
|
+
includesIdentity: boolean,
|
|
93
|
+
): WasmSuperblockLayoutDescriptor {
|
|
94
|
+
let byteLength = includesIdentity ? WASM_IDENTITY_BYTE_LENGTH : 0;
|
|
95
|
+
let legacyByteLength = byteLength;
|
|
96
|
+
const systemAlignment = Math.max(system.alignment, 4);
|
|
97
|
+
const systemOffset = align(byteLength, systemAlignment);
|
|
98
|
+
byteLength = systemOffset + system.byteLength;
|
|
99
|
+
legacyByteLength =
|
|
100
|
+
align(legacyByteLength, systemAlignment) + Math.max(system.byteLength, EXACT_FREELIST_METADATA_BYTE_LENGTH);
|
|
101
|
+
|
|
102
|
+
const familyOffsets: Record<WasmNumericFamily, number> = { u8: 0, u32: 0, f64: 0 };
|
|
103
|
+
for (const family of ['u8', 'u32', 'f64'] as const) {
|
|
104
|
+
const slab = slabs[family];
|
|
105
|
+
if (slab === null) continue;
|
|
106
|
+
const storageAlignment = Math.max(slab.alignment, 4);
|
|
107
|
+
const offset = align(byteLength, storageAlignment);
|
|
108
|
+
familyOffsets[family] = offset;
|
|
109
|
+
byteLength = offset + slab.byteLength;
|
|
110
|
+
legacyByteLength =
|
|
111
|
+
align(legacyByteLength, storageAlignment) + Math.max(slab.byteLength, EXACT_FREELIST_METADATA_BYTE_LENGTH);
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
if (byteLength > legacyByteLength) {
|
|
115
|
+
throw new Error('WASM superblock exceeded its separate-allocation footprint');
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
return Object.freeze({
|
|
119
|
+
byteLength,
|
|
120
|
+
legacyByteLength,
|
|
121
|
+
identityOffset: includesIdentity ? 0 : null,
|
|
122
|
+
systemOffset,
|
|
123
|
+
familyOffsets: Object.freeze(familyOffsets),
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
function freezeExactLayout(
|
|
128
|
+
capacity: number,
|
|
129
|
+
messageLayoutFamily: MessageLayoutFamily,
|
|
130
|
+
messagePhysicalLayout: MessagePhysicalLayout,
|
|
131
|
+
templates: readonly WasmColumnLayoutTemplate[],
|
|
132
|
+
eagerColumns: EagerColumnDescriptor,
|
|
133
|
+
): WasmPhysicalLayoutDescriptor {
|
|
134
|
+
if (!Number.isSafeInteger(capacity) || capacity <= 0) {
|
|
135
|
+
throw new RangeError(`WASM layout capacity must be a positive safe integer, received ${capacity}`);
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
const nullByteLength = Math.ceil(capacity / 8);
|
|
139
|
+
const familyOffsets: Record<WasmNumericFamily, number> = { u8: 0, u32: 0, f64: 0 };
|
|
140
|
+
const columns: WasmColumnLayoutDescriptor[] = [];
|
|
141
|
+
|
|
142
|
+
for (const template of templates) {
|
|
143
|
+
const nullOffset = familyOffsets[template.family];
|
|
144
|
+
const valueOffset = align(nullOffset + nullByteLength, template.alignment);
|
|
145
|
+
const valueLength = capacity * template.byteWidth;
|
|
146
|
+
familyOffsets[template.family] = valueOffset + valueLength;
|
|
147
|
+
columns.push(
|
|
148
|
+
Object.freeze({
|
|
149
|
+
...template,
|
|
150
|
+
nullOffset,
|
|
151
|
+
nullByteLength,
|
|
152
|
+
valueOffset,
|
|
153
|
+
valueLength,
|
|
154
|
+
}),
|
|
155
|
+
);
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
const slab = (family: WasmNumericFamily, alignment: 1 | 4 | 8): WasmNumericSlabLayoutDescriptor | null => {
|
|
159
|
+
const byteLength = familyOffsets[family];
|
|
160
|
+
return byteLength === 0 ? null : Object.freeze({ family, byteLength, alignment });
|
|
161
|
+
};
|
|
162
|
+
|
|
163
|
+
const hasStaticMessages = messageLayoutFamily !== 'dynamic-only';
|
|
164
|
+
const messageValueOffset = messageLayoutFamily === 'static-only' ? null : 0;
|
|
165
|
+
let systemByteLength = capacity * 8;
|
|
166
|
+
let entryTypeOffset: number | null = null;
|
|
167
|
+
let messageIdOffset: number | null = null;
|
|
168
|
+
let messageDenseIndexOffset: number | null = null;
|
|
169
|
+
let rowHeaderOffset: number | null = null;
|
|
170
|
+
|
|
171
|
+
if (messagePhysicalLayout === 'packed') {
|
|
172
|
+
rowHeaderOffset = align(systemByteLength, 4);
|
|
173
|
+
systemByteLength = rowHeaderOffset + capacity * 4;
|
|
174
|
+
} else {
|
|
175
|
+
entryTypeOffset = systemByteLength;
|
|
176
|
+
systemByteLength = entryTypeOffset + capacity;
|
|
177
|
+
if (hasStaticMessages) {
|
|
178
|
+
if (messagePhysicalLayout === 'current') {
|
|
179
|
+
messageIdOffset = align(systemByteLength, 2);
|
|
180
|
+
systemByteLength = messageIdOffset + capacity * 2;
|
|
181
|
+
} else {
|
|
182
|
+
messageDenseIndexOffset = align(systemByteLength, 4);
|
|
183
|
+
systemByteLength = messageDenseIndexOffset + capacity * 4;
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
const system: WasmSystemSlabLayoutDescriptor = Object.freeze({
|
|
189
|
+
family: 'system',
|
|
190
|
+
byteLength: align(systemByteLength, 8),
|
|
191
|
+
alignment: 8,
|
|
192
|
+
timestampOffset: 0,
|
|
193
|
+
entryTypeOffset,
|
|
194
|
+
messageIdOffset,
|
|
195
|
+
messageDenseIndexOffset,
|
|
196
|
+
rowHeaderOffset,
|
|
197
|
+
messageValueOffset,
|
|
198
|
+
});
|
|
199
|
+
|
|
200
|
+
const slabs = Object.freeze({
|
|
201
|
+
u8: slab('u8', 1),
|
|
202
|
+
u32: slab('u32', 4),
|
|
203
|
+
f64: slab('f64', 8),
|
|
204
|
+
});
|
|
205
|
+
return Object.freeze({
|
|
206
|
+
capacity,
|
|
207
|
+
messageLayoutFamily,
|
|
208
|
+
messagePhysicalLayout,
|
|
209
|
+
eagerColumns,
|
|
210
|
+
system,
|
|
211
|
+
slabs,
|
|
212
|
+
spanSuperblock: freezeSuperblockLayout(system, slabs, true),
|
|
213
|
+
overflowSuperblock: freezeSuperblockLayout(system, slabs, false),
|
|
214
|
+
columns: Object.freeze(columns),
|
|
215
|
+
});
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
function buildWasmLayoutTemplate(
|
|
219
|
+
schema: LogSchema,
|
|
220
|
+
messageLayoutFamily: MessageLayoutFamily,
|
|
221
|
+
messagePhysicalLayout: MessagePhysicalLayout,
|
|
222
|
+
eagerColumns: EagerColumnDescriptor,
|
|
223
|
+
): WasmLayoutTemplate {
|
|
224
|
+
const columns: WasmColumnLayoutTemplate[] = [];
|
|
225
|
+
const preallocatedColumns = new Set(eagerColumns.names);
|
|
226
|
+
let columnIndex = 0;
|
|
227
|
+
|
|
228
|
+
for (const name of schema._columnNames) {
|
|
229
|
+
const field = schema.fields[name];
|
|
230
|
+
const schemaType = getSchemaType(field);
|
|
231
|
+
const eager =
|
|
232
|
+
preallocatedColumns.has(name) ||
|
|
233
|
+
(typeof field === 'object' && field !== null && Reflect.get(field, '__eager') === true);
|
|
234
|
+
let storage: Pick<WasmColumnLayoutTemplate, 'family' | 'arrayType' | 'byteWidth' | 'alignment'> | null = null;
|
|
235
|
+
|
|
236
|
+
switch (schemaType) {
|
|
237
|
+
case 'enum':
|
|
238
|
+
case 'boolean':
|
|
239
|
+
storage = { family: 'u8', arrayType: 'Uint8Array', byteWidth: 1, alignment: 1 };
|
|
240
|
+
break;
|
|
241
|
+
case 'number':
|
|
242
|
+
storage = { family: 'f64', arrayType: 'Float64Array', byteWidth: 8, alignment: 8 };
|
|
243
|
+
break;
|
|
244
|
+
case 'bigUint64':
|
|
245
|
+
storage = { family: 'f64', arrayType: 'BigUint64Array', byteWidth: 8, alignment: 8 };
|
|
246
|
+
break;
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
if (storage !== null && name !== 'message') {
|
|
250
|
+
columns.push(Object.freeze({ name, columnIndex, eager, ...storage }));
|
|
251
|
+
}
|
|
252
|
+
columnIndex++;
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
const frozenColumns = Object.freeze(columns);
|
|
256
|
+
const descriptors = new Map<number, WasmPhysicalLayoutDescriptor>();
|
|
257
|
+
return Object.freeze({
|
|
258
|
+
messageLayoutFamily,
|
|
259
|
+
messagePhysicalLayout,
|
|
260
|
+
eagerColumns,
|
|
261
|
+
columns: frozenColumns,
|
|
262
|
+
forCapacity(capacity: number): WasmPhysicalLayoutDescriptor {
|
|
263
|
+
let descriptor = descriptors.get(capacity);
|
|
264
|
+
if (descriptor === undefined) {
|
|
265
|
+
descriptor = freezeExactLayout(
|
|
266
|
+
capacity,
|
|
267
|
+
messageLayoutFamily,
|
|
268
|
+
messagePhysicalLayout,
|
|
269
|
+
frozenColumns,
|
|
270
|
+
eagerColumns,
|
|
271
|
+
);
|
|
272
|
+
descriptors.set(capacity, descriptor);
|
|
273
|
+
}
|
|
274
|
+
return descriptor;
|
|
275
|
+
},
|
|
276
|
+
});
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
const templates = new WeakMap<LogSchema, Map<string, WasmLayoutTemplate>>();
|
|
280
|
+
|
|
281
|
+
export function createWasmLayoutTemplate(
|
|
282
|
+
schema: LogSchema,
|
|
283
|
+
messageLayoutFamily: MessageLayoutFamily = 'mixed',
|
|
284
|
+
messagePhysicalLayout: MessagePhysicalLayout = 'current',
|
|
285
|
+
eagerColumns: EagerColumnDescriptor = EMPTY_EAGER_COLUMNS,
|
|
286
|
+
): WasmLayoutTemplate {
|
|
287
|
+
const cacheKey = `${messageLayoutFamily}:${messagePhysicalLayout}:${eagerColumns.key}`;
|
|
288
|
+
let familyTemplates = templates.get(schema);
|
|
289
|
+
let template = familyTemplates?.get(cacheKey);
|
|
290
|
+
if (template === undefined) {
|
|
291
|
+
template = buildWasmLayoutTemplate(schema, messageLayoutFamily, messagePhysicalLayout, eagerColumns);
|
|
292
|
+
familyTemplates ??= new Map();
|
|
293
|
+
familyTemplates.set(cacheKey, template);
|
|
294
|
+
templates.set(schema, familyTemplates);
|
|
295
|
+
}
|
|
296
|
+
return template;
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
export function getWasmPhysicalLayout(
|
|
300
|
+
schema: LogSchema,
|
|
301
|
+
capacity: number,
|
|
302
|
+
messageLayoutFamily: MessageLayoutFamily = 'mixed',
|
|
303
|
+
messagePhysicalLayout: MessagePhysicalLayout = 'current',
|
|
304
|
+
eagerColumns: EagerColumnDescriptor = EMPTY_EAGER_COLUMNS,
|
|
305
|
+
): WasmPhysicalLayoutDescriptor {
|
|
306
|
+
return createWasmLayoutTemplate(schema, messageLayoutFamily, messagePhysicalLayout, eagerColumns).forCapacity(
|
|
307
|
+
capacity,
|
|
308
|
+
);
|
|
309
|
+
}
|