@elaraai/east 1.0.78 → 1.0.80
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 +1 -1
- package/dist/src/comparison.d.ts.map +1 -1
- package/dist/src/comparison.js +4 -5
- package/dist/src/comparison.js.map +1 -1
- package/dist/src/compile/builtins/array.d.ts +59 -0
- package/dist/src/compile/builtins/array.d.ts.map +1 -0
- package/dist/src/compile/builtins/array.js +656 -0
- package/dist/src/compile/builtins/array.js.map +1 -0
- package/dist/src/compile/builtins/blob.d.ts +18 -0
- package/dist/src/compile/builtins/blob.d.ts.map +1 -0
- package/dist/src/compile/builtins/blob.js +150 -0
- package/dist/src/compile/builtins/blob.js.map +1 -0
- package/dist/src/compile/builtins/compare.d.ts +18 -0
- package/dist/src/compile/builtins/compare.d.ts.map +1 -0
- package/dist/src/compile/builtins/compare.js +52 -0
- package/dist/src/compile/builtins/compare.js.map +1 -0
- package/dist/src/compile/builtins/datetime.d.ts +21 -0
- package/dist/src/compile/builtins/datetime.d.ts.map +1 -0
- package/dist/src/compile/builtins/datetime.js +46 -0
- package/dist/src/compile/builtins/datetime.js.map +1 -0
- package/dist/src/compile/builtins/dict.d.ts +46 -0
- package/dist/src/compile/builtins/dict.d.ts.map +1 -0
- package/dist/src/compile/builtins/dict.js +551 -0
- package/dist/src/compile/builtins/dict.js.map +1 -0
- package/dist/src/compile/builtins/index.d.ts +9 -0
- package/dist/src/compile/builtins/index.d.ts.map +1 -0
- package/dist/src/compile/builtins/index.js +28 -0
- package/dist/src/compile/builtins/index.js.map +1 -0
- package/dist/src/compile/builtins/matrix.d.ts +31 -0
- package/dist/src/compile/builtins/matrix.d.ts.map +1 -0
- package/dist/src/compile/builtins/matrix.js +310 -0
- package/dist/src/compile/builtins/matrix.js.map +1 -0
- package/dist/src/compile/builtins/primitives.d.ts +36 -0
- package/dist/src/compile/builtins/primitives.d.ts.map +1 -0
- package/dist/src/compile/builtins/primitives.js +67 -0
- package/dist/src/compile/builtins/primitives.js.map +1 -0
- package/dist/src/compile/builtins/ref.d.ts +11 -0
- package/dist/src/compile/builtins/ref.d.ts.map +1 -0
- package/dist/src/compile/builtins/ref.js +30 -0
- package/dist/src/compile/builtins/ref.js.map +1 -0
- package/dist/src/compile/builtins/set.d.ts +41 -0
- package/dist/src/compile/builtins/set.d.ts.map +1 -0
- package/dist/src/compile/builtins/set.js +385 -0
- package/dist/src/compile/builtins/set.js.map +1 -0
- package/dist/src/compile/builtins/sparse.d.ts +19 -0
- package/dist/src/compile/builtins/sparse.d.ts.map +1 -0
- package/dist/src/compile/builtins/sparse.js +143 -0
- package/dist/src/compile/builtins/sparse.js.map +1 -0
- package/dist/src/compile/builtins/string.d.ts +34 -0
- package/dist/src/compile/builtins/string.d.ts.map +1 -0
- package/dist/src/compile/builtins/string.js +238 -0
- package/dist/src/compile/builtins/string.js.map +1 -0
- package/dist/src/compile/builtins/vector.d.ts +44 -0
- package/dist/src/compile/builtins/vector.d.ts.map +1 -0
- package/dist/src/compile/builtins/vector.js +463 -0
- package/dist/src/compile/builtins/vector.js.map +1 -0
- package/dist/src/compile/constructors.d.ts +13 -0
- package/dist/src/compile/constructors.d.ts.map +1 -0
- package/dist/src/compile/constructors.js +179 -0
- package/dist/src/compile/constructors.js.map +1 -0
- package/dist/src/compile/control.d.ts +13 -0
- package/dist/src/compile/control.d.ts.map +1 -0
- package/dist/src/compile/control.js +513 -0
- package/dist/src/compile/control.js.map +1 -0
- package/dist/src/compile/functions.d.ts +13 -0
- package/dist/src/compile/functions.d.ts.map +1 -0
- package/dist/src/compile/functions.js +492 -0
- package/dist/src/compile/functions.js.map +1 -0
- package/dist/src/compile/ir.d.ts +19 -0
- package/dist/src/compile/ir.d.ts.map +1 -0
- package/dist/src/compile/ir.js +193 -0
- package/dist/src/compile/ir.js.map +1 -0
- package/dist/src/compile/runtime.d.ts +78 -0
- package/dist/src/compile/runtime.d.ts.map +1 -0
- package/dist/src/compile/runtime.js +111 -0
- package/dist/src/compile/runtime.js.map +1 -0
- package/dist/src/compile/type_parameters.d.ts +4 -0
- package/dist/src/compile/type_parameters.d.ts.map +1 -0
- package/dist/src/compile/type_parameters.js +55 -0
- package/dist/src/compile/type_parameters.js.map +1 -0
- package/dist/src/compile/typed_arrays.d.ts +28 -0
- package/dist/src/compile/typed_arrays.d.ts.map +1 -0
- package/dist/src/compile/typed_arrays.js +77 -0
- package/dist/src/compile/typed_arrays.js.map +1 -0
- package/dist/src/compile.d.ts +6 -41
- package/dist/src/compile.d.ts.map +1 -1
- package/dist/src/compile.js +8 -4415
- package/dist/src/compile.js.map +1 -1
- package/dist/src/compile.open_beast.spec.js +5 -4
- package/dist/src/compile.open_beast.spec.js.map +1 -1
- package/dist/src/containers/sortedmap.d.ts +2 -1
- package/dist/src/containers/sortedmap.d.ts.map +1 -1
- package/dist/src/containers/sortedmap.js +4 -2
- package/dist/src/containers/sortedmap.js.map +1 -1
- package/dist/src/containers/sortedset.d.ts +2 -1
- package/dist/src/containers/sortedset.d.ts.map +1 -1
- package/dist/src/containers/sortedset.js +4 -2
- package/dist/src/containers/sortedset.js.map +1 -1
- package/dist/src/error.d.ts +15 -0
- package/dist/src/error.d.ts.map +1 -1
- package/dist/src/error.js +16 -0
- package/dist/src/error.js.map +1 -1
- package/dist/src/index.d.ts +1 -0
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +1 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/patch/index.d.ts +1 -1
- package/dist/src/patch/index.d.ts.map +1 -1
- package/dist/src/patch/index.js +1 -1
- package/dist/src/patch/index.js.map +1 -1
- package/dist/src/patch/type_of_patch.d.ts +25 -1
- package/dist/src/patch/type_of_patch.d.ts.map +1 -1
- package/dist/src/patch/type_of_patch.js +33 -10
- package/dist/src/patch/type_of_patch.js.map +1 -1
- package/dist/src/platform.spec.js +19 -1
- package/dist/src/platform.spec.js.map +1 -1
- package/dist/src/runner_protocol.d.ts +316 -0
- package/dist/src/runner_protocol.d.ts.map +1 -0
- package/dist/src/runner_protocol.js +135 -0
- package/dist/src/runner_protocol.js.map +1 -0
- package/dist/src/serialization/beast2/index.d.ts +21 -5
- package/dist/src/serialization/beast2/index.d.ts.map +1 -1
- package/dist/src/serialization/beast2/index.js +12 -2
- package/dist/src/serialization/beast2/index.js.map +1 -1
- package/dist/src/serialization/beast2/index.spec.js +84 -3
- package/dist/src/serialization/beast2/index.spec.js.map +1 -1
- package/dist/src/serialization/beast2/shared.d.ts +32 -3
- package/dist/src/serialization/beast2/shared.d.ts.map +1 -1
- package/dist/src/serialization/beast2/shared.js +135 -10
- package/dist/src/serialization/beast2/shared.js.map +1 -1
- package/dist/src/serialization/beast2/v4/container.d.ts.map +1 -1
- package/dist/src/serialization/beast2/v4/container.js +5 -3
- package/dist/src/serialization/beast2/v4/container.js.map +1 -1
- package/dist/src/serialization/beast2/v5/aliasing.spec.d.ts +6 -0
- package/dist/src/serialization/beast2/v5/aliasing.spec.d.ts.map +1 -0
- package/dist/src/serialization/beast2/v5/aliasing.spec.js +75 -0
- package/dist/src/serialization/beast2/v5/aliasing.spec.js.map +1 -0
- package/dist/src/serialization/beast2/v5/boundary.d.ts +176 -0
- package/dist/src/serialization/beast2/v5/boundary.d.ts.map +1 -0
- package/dist/src/serialization/beast2/v5/boundary.js +297 -0
- package/dist/src/serialization/beast2/v5/boundary.js.map +1 -0
- package/dist/src/serialization/beast2/v5/boundary.spec.d.ts +6 -0
- package/dist/src/serialization/beast2/v5/boundary.spec.d.ts.map +1 -0
- package/dist/src/serialization/beast2/v5/boundary.spec.js +479 -0
- package/dist/src/serialization/beast2/v5/boundary.spec.js.map +1 -0
- package/dist/src/serialization/beast2/v5/codec.d.ts +6 -5
- package/dist/src/serialization/beast2/v5/codec.d.ts.map +1 -1
- package/dist/src/serialization/beast2/v5/codec.js +18 -3
- package/dist/src/serialization/beast2/v5/codec.js.map +1 -1
- package/dist/src/serialization/beast2/v5/deflate.d.ts +24 -2
- package/dist/src/serialization/beast2/v5/deflate.d.ts.map +1 -1
- package/dist/src/serialization/beast2/v5/deflate.js +47 -12
- package/dist/src/serialization/beast2/v5/deflate.js.map +1 -1
- package/dist/src/serialization/beast2/v5/deflate.spec.js +15 -1
- package/dist/src/serialization/beast2/v5/deflate.spec.js.map +1 -1
- package/dist/src/serialization/beast2/v5/elements.d.ts +64 -0
- package/dist/src/serialization/beast2/v5/elements.d.ts.map +1 -0
- package/dist/src/serialization/beast2/v5/elements.js +320 -0
- package/dist/src/serialization/beast2/v5/elements.js.map +1 -0
- package/dist/src/serialization/beast2/v5/elements.spec.d.ts +6 -0
- package/dist/src/serialization/beast2/v5/elements.spec.d.ts.map +1 -0
- package/dist/src/serialization/beast2/v5/elements.spec.js +161 -0
- package/dist/src/serialization/beast2/v5/elements.spec.js.map +1 -0
- package/dist/src/serialization/beast2/v5/frame-pool.d.ts +62 -21
- package/dist/src/serialization/beast2/v5/frame-pool.d.ts.map +1 -1
- package/dist/src/serialization/beast2/v5/frame-pool.js +138 -27
- package/dist/src/serialization/beast2/v5/frame-pool.js.map +1 -1
- package/dist/src/serialization/beast2/v5/frame-pool.spec.js +198 -71
- package/dist/src/serialization/beast2/v5/frame-pool.spec.js.map +1 -1
- package/dist/src/serialization/beast2/v5/frame-worker.js +25 -15
- package/dist/src/serialization/beast2/v5/frame-worker.js.map +1 -1
- package/dist/src/serialization/beast2/v5/frames.d.ts +22 -12
- package/dist/src/serialization/beast2/v5/frames.d.ts.map +1 -1
- package/dist/src/serialization/beast2/v5/frames.js +52 -27
- package/dist/src/serialization/beast2/v5/frames.js.map +1 -1
- package/dist/src/serialization/beast2/v5/geometry.d.ts +38 -1
- package/dist/src/serialization/beast2/v5/geometry.d.ts.map +1 -1
- package/dist/src/serialization/beast2/v5/geometry.js +73 -1
- package/dist/src/serialization/beast2/v5/geometry.js.map +1 -1
- package/dist/src/serialization/beast2/v5/geometry.spec.js +34 -23
- package/dist/src/serialization/beast2/v5/geometry.spec.js.map +1 -1
- package/dist/src/serialization/beast2/v5/index.spec.js +32 -28
- package/dist/src/serialization/beast2/v5/index.spec.js.map +1 -1
- package/dist/src/serialization/beast2/v5/lazy.d.ts +42 -1
- package/dist/src/serialization/beast2/v5/lazy.d.ts.map +1 -1
- package/dist/src/serialization/beast2/v5/lazy.js +143 -28
- package/dist/src/serialization/beast2/v5/lazy.js.map +1 -1
- package/dist/src/serialization/beast2/v5/lazy.spec.js +102 -24
- package/dist/src/serialization/beast2/v5/lazy.spec.js.map +1 -1
- package/dist/src/serialization/beast2/v5/manifest-writer.d.ts +110 -0
- package/dist/src/serialization/beast2/v5/manifest-writer.d.ts.map +1 -0
- package/dist/src/serialization/beast2/v5/manifest-writer.js +118 -0
- package/dist/src/serialization/beast2/v5/manifest-writer.js.map +1 -0
- package/dist/src/serialization/beast2/v5/manifest-writer.spec.d.ts +6 -0
- package/dist/src/serialization/beast2/v5/manifest-writer.spec.d.ts.map +1 -0
- package/dist/src/serialization/beast2/v5/manifest-writer.spec.js +207 -0
- package/dist/src/serialization/beast2/v5/manifest-writer.spec.js.map +1 -0
- package/dist/src/serialization/beast2/v5/manifest.d.ts +241 -0
- package/dist/src/serialization/beast2/v5/manifest.d.ts.map +1 -0
- package/dist/src/serialization/beast2/v5/manifest.js +233 -0
- package/dist/src/serialization/beast2/v5/manifest.js.map +1 -0
- package/dist/src/serialization/beast2/v5/merge.d.ts +93 -0
- package/dist/src/serialization/beast2/v5/merge.d.ts.map +1 -0
- package/dist/src/serialization/beast2/v5/merge.js +202 -0
- package/dist/src/serialization/beast2/v5/merge.js.map +1 -0
- package/dist/src/serialization/beast2/v5/merge.spec.d.ts +6 -0
- package/dist/src/serialization/beast2/v5/merge.spec.d.ts.map +1 -0
- package/dist/src/serialization/beast2/v5/merge.spec.js +118 -0
- package/dist/src/serialization/beast2/v5/merge.spec.js.map +1 -0
- package/dist/src/serialization/beast2/v5/recut.d.ts +143 -0
- package/dist/src/serialization/beast2/v5/recut.d.ts.map +1 -0
- package/dist/src/serialization/beast2/v5/recut.js +365 -0
- package/dist/src/serialization/beast2/v5/recut.js.map +1 -0
- package/dist/src/serialization/beast2/v5/recut.spec.d.ts +6 -0
- package/dist/src/serialization/beast2/v5/recut.spec.d.ts.map +1 -0
- package/dist/src/serialization/beast2/v5/recut.spec.js +215 -0
- package/dist/src/serialization/beast2/v5/recut.spec.js.map +1 -0
- package/dist/src/serialization/beast2/v5/runs.d.ts +148 -0
- package/dist/src/serialization/beast2/v5/runs.d.ts.map +1 -0
- package/dist/src/serialization/beast2/v5/runs.js +260 -0
- package/dist/src/serialization/beast2/v5/runs.js.map +1 -0
- package/dist/src/serialization/beast2/v5/runs.spec.d.ts +6 -0
- package/dist/src/serialization/beast2/v5/runs.spec.d.ts.map +1 -0
- package/dist/src/serialization/beast2/v5/runs.spec.js +182 -0
- package/dist/src/serialization/beast2/v5/runs.spec.js.map +1 -0
- package/dist/src/serialization/beast2/v5/sha256.d.ts +19 -0
- package/dist/src/serialization/beast2/v5/sha256.d.ts.map +1 -0
- package/dist/src/serialization/beast2/v5/sha256.js +103 -0
- package/dist/src/serialization/beast2/v5/sha256.js.map +1 -0
- package/dist/src/serialization/beast2/v5/sha256.spec.d.ts +6 -0
- package/dist/src/serialization/beast2/v5/sha256.spec.d.ts.map +1 -0
- package/dist/src/serialization/beast2/v5/sha256.spec.js +42 -0
- package/dist/src/serialization/beast2/v5/sha256.spec.js.map +1 -0
- package/dist/src/serialization/beast2/v5/stream.d.ts +273 -86
- package/dist/src/serialization/beast2/v5/stream.d.ts.map +1 -1
- package/dist/src/serialization/beast2/v5/stream.js +576 -244
- package/dist/src/serialization/beast2/v5/stream.js.map +1 -1
- package/dist/src/serialization/beast2/v5/sync-reader.spec.js +24 -10
- package/dist/src/serialization/beast2/v5/sync-reader.spec.js.map +1 -1
- package/dist/src/serialization/index.d.ts +1 -1
- package/dist/src/serialization/index.d.ts.map +1 -1
- package/dist/src/serialization/index.js +1 -1
- package/dist/src/serialization/index.js.map +1 -1
- package/dist/src/serialization/json.d.ts +28 -0
- package/dist/src/serialization/json.d.ts.map +1 -1
- package/dist/src/serialization/json.js +141 -30
- package/dist/src/serialization/json.js.map +1 -1
- package/dist/src/serialization/json.spec.js +47 -2
- package/dist/src/serialization/json.spec.js.map +1 -1
- package/dist/src/serialization/json_schema.d.ts +15 -11
- package/dist/src/serialization/json_schema.d.ts.map +1 -1
- package/dist/src/serialization/json_schema.js +21 -36
- package/dist/src/serialization/json_schema.js.map +1 -1
- package/dist/src/serialization/json_schema.spec.js +26 -32
- package/dist/src/serialization/json_schema.spec.js.map +1 -1
- package/dist/src/serialization/json_schema_to_type.d.ts +10 -5
- package/dist/src/serialization/json_schema_to_type.d.ts.map +1 -1
- package/dist/src/serialization/json_schema_to_type.js +13 -6
- package/dist/src/serialization/json_schema_to_type.js.map +1 -1
- package/dist/src/serialization/json_schema_to_type.spec.js +19 -0
- package/dist/src/serialization/json_schema_to_type.spec.js.map +1 -1
- package/dist/src/string_order.d.ts +36 -0
- package/dist/src/string_order.d.ts.map +1 -0
- package/dist/src/string_order.js +64 -0
- package/dist/src/string_order.js.map +1 -0
- package/dist/src/string_order.spec.d.ts +6 -0
- package/dist/src/string_order.spec.d.ts.map +1 -0
- package/dist/src/string_order.spec.js +79 -0
- package/dist/src/string_order.spec.js.map +1 -0
- package/dist/src/type_of_type.d.ts +17 -0
- package/dist/src/type_of_type.d.ts.map +1 -1
- package/dist/src/type_of_type.js +66 -0
- package/dist/src/type_of_type.js.map +1 -1
- package/dist/src/type_of_type.to_etv.spec.js +69 -1
- package/dist/src/type_of_type.to_etv.spec.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,479 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2025 Elara AI Pty Ltd
|
|
3
|
+
* Dual-licensed under AGPL-3.0 and commercial license. See LICENSE for details.
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* The content-defined segment boundary: the hash and its pinned vectors, the
|
|
7
|
+
* size-aware threshold and the bounds, and the properties the segment-object
|
|
8
|
+
* layout stands on — segmentation is a pure function of the value, a one-row
|
|
9
|
+
* edit re-cuts one segment (for an Array as much as a Dict), wide rows cut near
|
|
10
|
+
* the byte target, and a standalone segment encode is byte-identical to carving
|
|
11
|
+
* that segment out of the whole blob.
|
|
12
|
+
*/
|
|
13
|
+
import { describe, test } from "node:test";
|
|
14
|
+
import assert from "node:assert/strict";
|
|
15
|
+
import { IntegerType, StringType, ArrayType, SetType, DictType, StructType, BlobType } from "../../../types.js";
|
|
16
|
+
import { compareFor } from "../../../comparison.js";
|
|
17
|
+
import { SortedMap, SortedSet } from "../../../index.js";
|
|
18
|
+
import { Beast2ElementWriter, encodeBeast2PagedFor, encodeBeast2SegmentsFor, openBeast2PagesFor, decodeBeast2For, readBeast2Extents, readBeast2SegmentLogicalBytes, carveBeast2, spliceBeast2, fnv1a64, segmentBoundaryHash, isSegmentBoundary, startsSegmentAfter, segmentRuleFor, segmentKeyTypeOf, encodeBeast2FenceFor, decodeBeast2FenceFor, SegmentCutter, SEGMENT_MIN_COUNT, SEGMENT_TARGET_COUNT, SEGMENT_MAX_COUNT, SEGMENT_MIN_BYTES, SEGMENT_TARGET_BYTES, SEGMENT_MAX_BYTES, SEGMENT_RULE_KEYED, SEGMENT_RULE_ARRAY, } from "../index.js";
|
|
19
|
+
import { toEastTypeValue } from "../../../type_of_type.js";
|
|
20
|
+
const RowType = StructType({ id: IntegerType, name: StringType });
|
|
21
|
+
const TableType = DictType(StringType, RowType);
|
|
22
|
+
/** The cross-runtime parity fixture: 50,000 `k0000000`-style keys to their
|
|
23
|
+
* index. Kept narrow (a scalar value) so the C twin builds the same value
|
|
24
|
+
* with no struct layout to agree on. */
|
|
25
|
+
const TableKeyedType = DictType(StringType, IntegerType);
|
|
26
|
+
function parityTable() {
|
|
27
|
+
return new SortedMap(Array.from({ length: 50_000 }, (_, i) => [`k${String(i).padStart(7, "0")}`, BigInt(i)]), compareFor(StringType));
|
|
28
|
+
}
|
|
29
|
+
/** `n` rows keyed `k0000000`… in canonical order. */
|
|
30
|
+
function table(n, mark) {
|
|
31
|
+
const entries = [];
|
|
32
|
+
for (let i = 0; i < n; i++) {
|
|
33
|
+
const key = `k${String(i).padStart(7, "0")}`;
|
|
34
|
+
entries.push([key, { id: BigInt(i), name: mark?.at === key ? mark.name : `row-${i}` }]);
|
|
35
|
+
}
|
|
36
|
+
return new SortedMap(entries, compareFor(StringType));
|
|
37
|
+
}
|
|
38
|
+
/** Every segment's fence bytes, element count and logical size, from a
|
|
39
|
+
* stored blob. */
|
|
40
|
+
function geometry(blob, type) {
|
|
41
|
+
const pages = openBeast2PagesFor(type)(blob);
|
|
42
|
+
const fence = encodeBeast2FenceFor(segmentKeyTypeOf(type));
|
|
43
|
+
const fences = [];
|
|
44
|
+
for (let i = 0; i < pages.segmentCount; i++)
|
|
45
|
+
fences.push(fence(pages.fence(i)));
|
|
46
|
+
return { fences, counts: [...pages.counts], sizes: readBeast2SegmentLogicalBytes(blob) };
|
|
47
|
+
}
|
|
48
|
+
/** Each segment's frame bytes, which is what a segment object stores. */
|
|
49
|
+
function segmentFrames(blob) {
|
|
50
|
+
const extents = readBeast2Extents(blob);
|
|
51
|
+
return extents.offsets.map((offset, i) => Buffer.from(blob.subarray(offset, i + 1 < extents.offsets.length ? extents.offsets[i + 1] : extents.segmentsEnd)).toString("hex"));
|
|
52
|
+
}
|
|
53
|
+
/** How many of `after`'s segments `before` does not hold. */
|
|
54
|
+
function newSegments(before, after) {
|
|
55
|
+
const held = new Set(segmentFrames(before));
|
|
56
|
+
return segmentFrames(after).filter((frame) => !held.has(frame)).length;
|
|
57
|
+
}
|
|
58
|
+
/** The first `k0000000`-style key whose boundary hash falls under the narrow
|
|
59
|
+
* threshold. */
|
|
60
|
+
function narrowBoundaryKey() {
|
|
61
|
+
const fence = encodeBeast2FenceFor(StringType);
|
|
62
|
+
for (let i = 0;; i++) {
|
|
63
|
+
const key = `k${String(i).padStart(7, "0")}`;
|
|
64
|
+
if (isSegmentBoundary(segmentBoundaryHash(fence(key)), 1, 1))
|
|
65
|
+
return key;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
describe("beast2 v5 content-defined boundaries", () => {
|
|
69
|
+
describe("fnv1a64", () => {
|
|
70
|
+
test("matches the reference vectors", () => {
|
|
71
|
+
const of = (s) => fnv1a64(new TextEncoder().encode(s));
|
|
72
|
+
assert.equal(of(""), 0xcbf29ce484222325n);
|
|
73
|
+
assert.equal(of("a"), 0xaf63dc4c8601ec8cn);
|
|
74
|
+
assert.equal(of("foobar"), 0x85944171f73967e8n);
|
|
75
|
+
});
|
|
76
|
+
test("stays inside 64 bits over a long input", () => {
|
|
77
|
+
const hash = fnv1a64(new Uint8Array(4096).fill(0xff));
|
|
78
|
+
assert.ok(hash >= 0n && hash <= 0xffffffffffffffffn);
|
|
79
|
+
});
|
|
80
|
+
test("agrees with the byte-by-byte 64-bit hash", () => {
|
|
81
|
+
// The hash runs in 32-bit words; it must be the plain 64-bit recurrence,
|
|
82
|
+
// or every type-section hash moves.
|
|
83
|
+
const reference = (bytes) => {
|
|
84
|
+
let hash = 0xcbf29ce484222325n;
|
|
85
|
+
for (const byte of bytes)
|
|
86
|
+
hash = ((hash ^ BigInt(byte)) * 0x100000001b3n) & 0xffffffffffffffffn;
|
|
87
|
+
return hash;
|
|
88
|
+
};
|
|
89
|
+
let seed = 0x9e3779b9;
|
|
90
|
+
for (let n = 0; n < 20_000; n++) {
|
|
91
|
+
const bytes = new Uint8Array(1 + (n % 40));
|
|
92
|
+
for (let i = 0; i < bytes.length; i++) {
|
|
93
|
+
seed = (Math.imul(seed, 1664525) + 1013904223) >>> 0;
|
|
94
|
+
bytes[i] = seed >>> 24;
|
|
95
|
+
}
|
|
96
|
+
assert.equal(fnv1a64(bytes), reference(bytes));
|
|
97
|
+
}
|
|
98
|
+
});
|
|
99
|
+
});
|
|
100
|
+
describe("the boundary hash", () => {
|
|
101
|
+
test("matches the pinned vectors", () => {
|
|
102
|
+
// Pinned in east-c's tests/test_beast2_boundary.c as well.
|
|
103
|
+
const of = (s) => segmentBoundaryHash(new TextEncoder().encode(s));
|
|
104
|
+
assert.equal(of(""), 0x2c773e2c);
|
|
105
|
+
assert.equal(of("a"), 0xa3eabd3f);
|
|
106
|
+
assert.equal(of("foobar"), 0x1f341994);
|
|
107
|
+
assert.equal(of("k0000000"), 0xc8ca7941);
|
|
108
|
+
});
|
|
109
|
+
test("is murmur3's finalizer over the FNV-1a hash's low word", () => {
|
|
110
|
+
const finalize = (h) => {
|
|
111
|
+
h ^= h >>> 16;
|
|
112
|
+
h = Math.imul(h, 0x85ebca6b);
|
|
113
|
+
h ^= h >>> 13;
|
|
114
|
+
h = Math.imul(h, 0xc2b2ae35);
|
|
115
|
+
h ^= h >>> 16;
|
|
116
|
+
return h >>> 0;
|
|
117
|
+
};
|
|
118
|
+
let seed = 0x2545f491;
|
|
119
|
+
for (let n = 0; n < 5_000; n++) {
|
|
120
|
+
const bytes = new Uint8Array(n % 64);
|
|
121
|
+
for (let i = 0; i < bytes.length; i++) {
|
|
122
|
+
seed = (Math.imul(seed, 1664525) + 1013904223) >>> 0;
|
|
123
|
+
bytes[i] = seed >>> 24;
|
|
124
|
+
}
|
|
125
|
+
assert.equal(segmentBoundaryHash(bytes), finalize(Number(fnv1a64(bytes) & 0xffffffffn)));
|
|
126
|
+
}
|
|
127
|
+
});
|
|
128
|
+
});
|
|
129
|
+
describe("the threshold", () => {
|
|
130
|
+
test("is a quarter of one narrow element in the target count short of the target, four times it past", () => {
|
|
131
|
+
const base = 2 ** 32 / SEGMENT_TARGET_COUNT;
|
|
132
|
+
assert.equal(isSegmentBoundary(base / 4 - 1, SEGMENT_MIN_COUNT, 16 * SEGMENT_MIN_COUNT), true);
|
|
133
|
+
assert.equal(isSegmentBoundary(base / 4, SEGMENT_MIN_COUNT, 16 * SEGMENT_MIN_COUNT), false);
|
|
134
|
+
assert.equal(isSegmentBoundary(base * 4 - 1, SEGMENT_TARGET_COUNT, 16 * SEGMENT_TARGET_COUNT), true);
|
|
135
|
+
assert.equal(isSegmentBoundary(base * 4, SEGMENT_TARGET_COUNT, 16 * SEGMENT_TARGET_COUNT), false);
|
|
136
|
+
});
|
|
137
|
+
test("rises with the open segment's average element size", () => {
|
|
138
|
+
// An average of 64 KiB is one sixteenth of the byte target: a quarter of
|
|
139
|
+
// that short of the target, four times it once the segment holds 1 MiB.
|
|
140
|
+
const base = 2 ** 32 / 16;
|
|
141
|
+
assert.equal(isSegmentBoundary(base / 4 - 1, 2, 2 * 64 * 1024), true);
|
|
142
|
+
assert.equal(isSegmentBoundary(base / 4, 2, 2 * 64 * 1024), false);
|
|
143
|
+
assert.equal(isSegmentBoundary(base * 4 - 1, 16, 16 * 64 * 1024), true);
|
|
144
|
+
assert.equal(isSegmentBoundary(base * 4, 16, 16 * 64 * 1024), false);
|
|
145
|
+
});
|
|
146
|
+
test("makes every element a boundary at an average of the byte target", () => {
|
|
147
|
+
assert.equal(isSegmentBoundary(0xffffffff, 1, SEGMENT_TARGET_BYTES), true);
|
|
148
|
+
assert.equal(isSegmentBoundary(0xffffffff, 1, SEGMENT_TARGET_BYTES - 1), false);
|
|
149
|
+
});
|
|
150
|
+
});
|
|
151
|
+
describe("the rule id", () => {
|
|
152
|
+
test("is keyed for Set and Dict roots and element-hashed for Array roots", () => {
|
|
153
|
+
assert.equal(segmentRuleFor(TableType), SEGMENT_RULE_KEYED);
|
|
154
|
+
assert.equal(segmentRuleFor(SetType(StringType)), SEGMENT_RULE_KEYED);
|
|
155
|
+
assert.equal(segmentRuleFor(ArrayType(RowType)), SEGMENT_RULE_ARRAY);
|
|
156
|
+
});
|
|
157
|
+
test("refuses a non-collection root", () => {
|
|
158
|
+
assert.throws(() => segmentRuleFor(IntegerType), /Array, Set or Dict roots/);
|
|
159
|
+
});
|
|
160
|
+
test("names the key type a fence holds", () => {
|
|
161
|
+
assert.deepEqual(segmentKeyTypeOf(TableType), toEastTypeValue(StringType));
|
|
162
|
+
assert.deepEqual(segmentKeyTypeOf(SetType(RowType)), toEastTypeValue(RowType));
|
|
163
|
+
assert.equal(segmentKeyTypeOf(ArrayType(RowType)), null);
|
|
164
|
+
});
|
|
165
|
+
});
|
|
166
|
+
describe("fence bytes", () => {
|
|
167
|
+
test("round-trip and depend on the key alone", () => {
|
|
168
|
+
const encode = encodeBeast2FenceFor(RowType);
|
|
169
|
+
const decode = decodeBeast2FenceFor(RowType);
|
|
170
|
+
const row = { id: 7n, name: "seven" };
|
|
171
|
+
assert.deepEqual(decode(encode(row)), row);
|
|
172
|
+
// A second encode through the same closure must not carry state from the
|
|
173
|
+
// first — a container REF would make a key's bytes depend on its position.
|
|
174
|
+
assert.deepEqual(encode(row), encode(row));
|
|
175
|
+
});
|
|
176
|
+
test("are the key's own bytes, which the next encode leaves alone", () => {
|
|
177
|
+
// The encoder reuses one writer across keys; what it hands back is kept
|
|
178
|
+
// — in a manifest, a cache of fences — so it must be a copy of the key's
|
|
179
|
+
// bytes and nothing more.
|
|
180
|
+
const encode = encodeBeast2FenceFor(StringType);
|
|
181
|
+
const first = encode("first");
|
|
182
|
+
const kept = first.slice();
|
|
183
|
+
encode("a much longer second key, long enough to overwrite a shared buffer");
|
|
184
|
+
assert.deepEqual(first, kept);
|
|
185
|
+
assert.equal(first.buffer.byteLength, first.byteLength, "a fence holds only its own bytes");
|
|
186
|
+
});
|
|
187
|
+
test("refuse trailing bytes", () => {
|
|
188
|
+
const bytes = encodeBeast2FenceFor(StringType)("abc");
|
|
189
|
+
const padded = new Uint8Array(bytes.length + 1);
|
|
190
|
+
padded.set(bytes);
|
|
191
|
+
assert.throws(() => decodeBeast2FenceFor(StringType)(padded), /bytes after the encoded key/);
|
|
192
|
+
});
|
|
193
|
+
});
|
|
194
|
+
describe("the cutter", () => {
|
|
195
|
+
const narrow = new Uint8Array([0x61]);
|
|
196
|
+
test("never starts a segment at the first element", () => {
|
|
197
|
+
const cutter = new SegmentCutter();
|
|
198
|
+
const fence = encodeBeast2FenceFor(StringType);
|
|
199
|
+
assert.equal(cutter.startsSegment(8, fence(narrowBoundaryKey())), false);
|
|
200
|
+
assert.equal(cutter.openCount, 1);
|
|
201
|
+
assert.equal(cutter.openBytes, 8);
|
|
202
|
+
});
|
|
203
|
+
test("forces a cut at the maximum count", () => {
|
|
204
|
+
// A hash no threshold admits: only the bound can cut.
|
|
205
|
+
const cutter = new SegmentCutter();
|
|
206
|
+
const never = new Uint8Array(0);
|
|
207
|
+
assert.ok(!isSegmentBoundary(segmentBoundaryHash(never), SEGMENT_MAX_COUNT, SEGMENT_MAX_COUNT));
|
|
208
|
+
let cuts = 0;
|
|
209
|
+
for (let i = 0; i < SEGMENT_MAX_COUNT * 2; i++) {
|
|
210
|
+
if (cutter.startsSegment(1, never)) {
|
|
211
|
+
cuts++;
|
|
212
|
+
assert.equal(i % SEGMENT_MAX_COUNT, 0, `cut at element ${i}`);
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
assert.equal(cuts, 1);
|
|
216
|
+
assert.equal(cutter.openCount, SEGMENT_MAX_COUNT);
|
|
217
|
+
});
|
|
218
|
+
test("forces a cut at the maximum bytes, and never splits an element", () => {
|
|
219
|
+
const cutter = new SegmentCutter();
|
|
220
|
+
const never = new Uint8Array(0);
|
|
221
|
+
assert.equal(cutter.startsSegment(SEGMENT_MAX_BYTES + 1, never), false);
|
|
222
|
+
assert.equal(cutter.startsSegment(1, never), true, "an element wider than the maximum is a segment of its own");
|
|
223
|
+
assert.equal(cutter.openBytes, 1);
|
|
224
|
+
});
|
|
225
|
+
test("ignores a boundary hash below the minimum", () => {
|
|
226
|
+
const fence = encodeBeast2FenceFor(StringType);
|
|
227
|
+
const cutter = new SegmentCutter();
|
|
228
|
+
cutter.startsSegment(1, narrow);
|
|
229
|
+
assert.equal(cutter.startsSegment(1, fence(narrowBoundaryKey())), false);
|
|
230
|
+
});
|
|
231
|
+
test("consults the hash once the open segment holds the minimum bytes", () => {
|
|
232
|
+
const fence = encodeBeast2FenceFor(StringType);
|
|
233
|
+
const cutter = new SegmentCutter();
|
|
234
|
+
cutter.startsSegment(SEGMENT_MIN_BYTES, narrow);
|
|
235
|
+
assert.equal(cutter.startsSegment(1, fence(narrowBoundaryKey())), true);
|
|
236
|
+
});
|
|
237
|
+
});
|
|
238
|
+
describe("the element writer", () => {
|
|
239
|
+
test("segments inside the pinned bounds", () => {
|
|
240
|
+
const blob = encodeBeast2PagedFor(TableType)(table(50_000));
|
|
241
|
+
const { counts, sizes } = geometry(blob, TableType);
|
|
242
|
+
assert.ok(counts.length > 1, "50k rows must not be one segment");
|
|
243
|
+
for (let i = 0; i < counts.length - 1; i++) {
|
|
244
|
+
assert.ok(counts[i] >= SEGMENT_MIN_COUNT || sizes[i] >= SEGMENT_MIN_BYTES, `segment ${i} holds ${counts[i]}`);
|
|
245
|
+
assert.ok(counts[i] <= SEGMENT_MAX_COUNT, `segment ${i} holds ${counts[i]}`);
|
|
246
|
+
}
|
|
247
|
+
});
|
|
248
|
+
test("is a pure function of the value, not of insertion order", () => {
|
|
249
|
+
const ascending = encodeBeast2PagedFor(TableType)(table(20_000));
|
|
250
|
+
const shuffled = new Map();
|
|
251
|
+
for (const [k, v] of [...table(20_000)].reverse())
|
|
252
|
+
shuffled.set(k, v);
|
|
253
|
+
assert.deepEqual(encodeBeast2PagedFor(TableType)(shuffled), ascending);
|
|
254
|
+
});
|
|
255
|
+
test("re-cuts exactly one segment for a one-row edit", () => {
|
|
256
|
+
const before = encodeBeast2PagedFor(TableType)(table(20_000));
|
|
257
|
+
const after = encodeBeast2PagedFor(TableType)(table(20_000, { at: "k0009000", name: "edited" }));
|
|
258
|
+
assert.equal(readBeast2Extents(before).offsets.length, readBeast2Extents(after).offsets.length);
|
|
259
|
+
assert.equal(newSegments(before, after), 1);
|
|
260
|
+
});
|
|
261
|
+
test("re-cuts O(1) Array segments for an edit, and for an insert at the front", () => {
|
|
262
|
+
const type = ArrayType(RowType);
|
|
263
|
+
const rows = Array.from({ length: 20_000 }, (_, i) => ({ id: BigInt(i), name: `row-${i}` }));
|
|
264
|
+
const before = encodeBeast2PagedFor(type)(rows);
|
|
265
|
+
const edited = rows.slice();
|
|
266
|
+
edited[9_000] = { id: 9000n, name: "edited" };
|
|
267
|
+
assert.equal(newSegments(before, encodeBeast2PagedFor(type)(edited)), 1);
|
|
268
|
+
// An insert shifts every element after it, but a cut the hash placed
|
|
269
|
+
// stays at its element: only the segments before the first such cut
|
|
270
|
+
// change — here the first segment's own cut is the hash's, so just the
|
|
271
|
+
// one.
|
|
272
|
+
assert.ok(openBeast2PagesFor(type)(before).counts[0] < SEGMENT_MAX_COUNT);
|
|
273
|
+
assert.equal(newSegments(before, encodeBeast2PagedFor(type)([{ id: -1n, name: "first" }, ...rows])), 1);
|
|
274
|
+
});
|
|
275
|
+
test("cuts wide rows near the byte target rather than at a count", () => {
|
|
276
|
+
const type = DictType(StringType, BlobType);
|
|
277
|
+
const rows = new Map();
|
|
278
|
+
for (let i = 0; i < 64; i++)
|
|
279
|
+
rows.set(`r${String(i).padStart(3, "0")}`, new Uint8Array(256 * 1024).fill(i));
|
|
280
|
+
const blob = encodeBeast2PagedFor(type, { codec: "none" })(rows);
|
|
281
|
+
const sizes = readBeast2SegmentLogicalBytes(blob);
|
|
282
|
+
assert.ok(sizes.length > 4, `16 MiB of rows must not be ${sizes.length} segments`);
|
|
283
|
+
for (let i = 0; i < sizes.length - 1; i++) {
|
|
284
|
+
assert.ok(sizes[i] <= SEGMENT_MAX_BYTES + 256 * 1024 + 16, `segment ${i} is ${sizes[i]} bytes`);
|
|
285
|
+
}
|
|
286
|
+
const { fences, counts } = geometry(blob, type);
|
|
287
|
+
for (let i = 0; i < counts.length - 1; i++) {
|
|
288
|
+
assert.ok(startsSegmentAfter(counts[i], sizes[i], fences[i + 1]), `the cut after segment ${i} is the rule's`);
|
|
289
|
+
}
|
|
290
|
+
});
|
|
291
|
+
test("stores a Dict of 300 rows of 1 MiB as segments of about 1 MiB, not as one", () => {
|
|
292
|
+
// An average of 1 MiB makes every element a boundary: each row is a
|
|
293
|
+
// segment of its own, the size target. Written through the segment sink,
|
|
294
|
+
// as a manifest directory is, so the test holds one segment at a time;
|
|
295
|
+
// one row value serves every key.
|
|
296
|
+
const row = new Uint8Array(1024 * 1024).fill(7);
|
|
297
|
+
const segments = [];
|
|
298
|
+
const writer = new Beast2ElementWriter(DictType(StringType, BlobType), {
|
|
299
|
+
segment: ({ count, logicalBytes }) => { segments.push({ count, logicalBytes }); },
|
|
300
|
+
}, { codec: "none" });
|
|
301
|
+
for (let i = 0; i < 300; i++)
|
|
302
|
+
writer.add([`r${String(i).padStart(3, "0")}`, row]);
|
|
303
|
+
writer.finish();
|
|
304
|
+
assert.equal(segments.length, 300);
|
|
305
|
+
for (const [i, { count, logicalBytes }] of segments.entries()) {
|
|
306
|
+
assert.equal(count, 1, `segment ${i} holds one row`);
|
|
307
|
+
assert.ok(logicalBytes >= SEGMENT_TARGET_BYTES && logicalBytes < SEGMENT_TARGET_BYTES + 64, `segment ${i} is ${logicalBytes} bytes`);
|
|
308
|
+
}
|
|
309
|
+
});
|
|
310
|
+
test("holds a short collection in one segment", () => {
|
|
311
|
+
const blob = encodeBeast2PagedFor(TableType)(table(SEGMENT_MIN_COUNT - 1));
|
|
312
|
+
assert.equal(openBeast2PagesFor(TableType)(blob).segmentCount, 1);
|
|
313
|
+
});
|
|
314
|
+
test("decodes to the value it was given", () => {
|
|
315
|
+
const value = table(5_000);
|
|
316
|
+
const decoded = decodeBeast2For(TableType)(encodeBeast2PagedFor(TableType)(value));
|
|
317
|
+
assert.equal(decoded.size, value.size);
|
|
318
|
+
assert.deepEqual(decoded.get("k0004999"), value.get("k0004999"));
|
|
319
|
+
});
|
|
320
|
+
test("cuts a Set root by its elements", () => {
|
|
321
|
+
const elements = new SortedSet(Array.from({ length: 10_000 }, (_, i) => `e${String(i).padStart(6, "0")}`), compareFor(StringType));
|
|
322
|
+
const type = SetType(StringType);
|
|
323
|
+
const blob = encodeBeast2PagedFor(type)(elements);
|
|
324
|
+
const { fences, counts, sizes } = geometry(blob, type);
|
|
325
|
+
assert.ok(counts.length > 1);
|
|
326
|
+
for (let i = 0; i < counts.length - 1; i++) {
|
|
327
|
+
assert.ok(startsSegmentAfter(counts[i], sizes[i], fences[i + 1]), `the cut after segment ${i} is the rule's`);
|
|
328
|
+
}
|
|
329
|
+
});
|
|
330
|
+
test("writes encoded elements to the same bytes as decoded ones", () => {
|
|
331
|
+
const type = TableKeyedType;
|
|
332
|
+
const key = encodeBeast2FenceFor(StringType);
|
|
333
|
+
const value = encodeBeast2FenceFor(IntegerType);
|
|
334
|
+
const fromValues = [];
|
|
335
|
+
const fromBytes = [];
|
|
336
|
+
const a = new Beast2ElementWriter(type, (b) => fromValues.push(b.slice()));
|
|
337
|
+
const b = new Beast2ElementWriter(type, (bytes) => fromBytes.push(bytes.slice()));
|
|
338
|
+
for (const [k, v] of parityTable()) {
|
|
339
|
+
a.add([k, v]);
|
|
340
|
+
const keyBytes = key(k);
|
|
341
|
+
const element = new Uint8Array(keyBytes.length + 10);
|
|
342
|
+
element.set(keyBytes);
|
|
343
|
+
const valueBytes = value(v);
|
|
344
|
+
element.set(valueBytes, keyBytes.length);
|
|
345
|
+
b.addEncoded(element.subarray(0, keyBytes.length + valueBytes.length), keyBytes.length);
|
|
346
|
+
}
|
|
347
|
+
a.finish();
|
|
348
|
+
b.finish();
|
|
349
|
+
assert.deepEqual(Buffer.concat(fromBytes), Buffer.concat(fromValues));
|
|
350
|
+
});
|
|
351
|
+
test("refuses a key that does not ascend", () => {
|
|
352
|
+
const writer = new Beast2ElementWriter(TableKeyedType, () => { });
|
|
353
|
+
writer.add(["b", 1n]);
|
|
354
|
+
assert.throws(() => writer.add(["a", 2n]), /strictly ascending/);
|
|
355
|
+
assert.throws(() => writer.add(["b", 2n]), /strictly ascending/);
|
|
356
|
+
});
|
|
357
|
+
test("is left as it was by an element that fails to encode", () => {
|
|
358
|
+
const chunks = [];
|
|
359
|
+
const writer = new Beast2ElementWriter(TableKeyedType, (b) => chunks.push(b.slice()));
|
|
360
|
+
writer.add(["a", 1n]);
|
|
361
|
+
assert.throws(() => writer.add(["b", "not an integer"]));
|
|
362
|
+
writer.add(["b", 2n]);
|
|
363
|
+
writer.finish();
|
|
364
|
+
assert.deepEqual([...decodeBeast2For(TableKeyedType)(Buffer.concat(chunks))], [["a", 1n], ["b", 2n]]);
|
|
365
|
+
});
|
|
366
|
+
test("hands each segment over as the blob carving it out of the whole gives", () => {
|
|
367
|
+
const value = table(20_000);
|
|
368
|
+
const blob = encodeBeast2PagedFor(TableType)(value);
|
|
369
|
+
const extents = readBeast2Extents(blob);
|
|
370
|
+
const { fences, counts, sizes } = geometry(blob, TableType);
|
|
371
|
+
const segments = [];
|
|
372
|
+
const writer = new Beast2ElementWriter(TableType, { segment: (segment) => { segments.push(segment); } });
|
|
373
|
+
for (const entry of value)
|
|
374
|
+
writer.add(entry);
|
|
375
|
+
writer.finish();
|
|
376
|
+
assert.deepEqual(writer.header, blob.subarray(0, extents.prefixEnd));
|
|
377
|
+
assert.equal(writer.segments, counts.length);
|
|
378
|
+
assert.equal(segments.length, counts.length);
|
|
379
|
+
for (let i = 0; i < segments.length; i++) {
|
|
380
|
+
assert.deepEqual(segments[i].blob, carveBeast2(blob, i, i + 1, extents), `segment ${i}`);
|
|
381
|
+
assert.equal(segments[i].count, counts[i]);
|
|
382
|
+
assert.deepEqual(segments[i].fence, fences[i]);
|
|
383
|
+
assert.equal(segments[i].logicalBytes, sizes[i]);
|
|
384
|
+
}
|
|
385
|
+
});
|
|
386
|
+
test("hands an Array's segments over with empty fences, and an empty collection's none", () => {
|
|
387
|
+
const type = ArrayType(RowType);
|
|
388
|
+
const rows = Array.from({ length: 5_000 }, (_, i) => ({ id: BigInt(i), name: `row-${i}` }));
|
|
389
|
+
const segments = [];
|
|
390
|
+
const writer = new Beast2ElementWriter(type, { segment: (segment) => { segments.push(segment); } });
|
|
391
|
+
for (const row of rows)
|
|
392
|
+
writer.add(row);
|
|
393
|
+
writer.finish();
|
|
394
|
+
assert.ok(segments.length > 1);
|
|
395
|
+
assert.ok(segments.every((segment) => segment.fence.length === 0));
|
|
396
|
+
assert.deepEqual(spliceBeast2(segments.map((segment) => segment.blob)), encodeBeast2PagedFor(type)(rows));
|
|
397
|
+
const none = [];
|
|
398
|
+
const empty = new Beast2ElementWriter(type, { segment: (segment) => { none.push(segment); } });
|
|
399
|
+
empty.finish();
|
|
400
|
+
assert.equal(none.length, 0);
|
|
401
|
+
const blob = encodeBeast2PagedFor(type)([]);
|
|
402
|
+
assert.deepEqual(empty.header, blob.subarray(0, readBeast2Extents(blob).prefixEnd));
|
|
403
|
+
});
|
|
404
|
+
});
|
|
405
|
+
describe("three-runtime parity", () => {
|
|
406
|
+
// The claim the segment-object layout rests on: east, east-c and east-py
|
|
407
|
+
// (which binds east-c's writer) cut the same value at the same elements,
|
|
408
|
+
// so a state shares every segment a write did not touch and a manifest
|
|
409
|
+
// one runtime maintains equals the one another rebuilds.
|
|
410
|
+
//
|
|
411
|
+
// The same fixtures and the same digests are pinned in east-c's
|
|
412
|
+
// `tests/test_beast2_boundary.c`. A change on either side fails both.
|
|
413
|
+
const digestOf = (counts) => fnv1a64(new TextEncoder().encode(counts.join(","))).toString(16).padStart(16, "0");
|
|
414
|
+
test("cuts the 50,000-key Dict where east-c cuts it", () => {
|
|
415
|
+
const blob = encodeBeast2PagedFor(TableKeyedType)(parityTable());
|
|
416
|
+
const pages = openBeast2PagesFor(TableKeyedType)(blob);
|
|
417
|
+
assert.equal(pages.segmentCount, 38);
|
|
418
|
+
assert.equal(digestOf(pages.counts), "2d1d1a2f011d367d");
|
|
419
|
+
});
|
|
420
|
+
test("cuts the 50,000-element Set where east-c cuts it", () => {
|
|
421
|
+
const type = SetType(StringType);
|
|
422
|
+
const elements = new SortedSet(Array.from({ length: 50_000 }, (_, i) => `e${String(i).padStart(7, "0")}`), compareFor(StringType));
|
|
423
|
+
const pages = openBeast2PagesFor(type)(encodeBeast2PagedFor(type)(elements));
|
|
424
|
+
assert.equal(pages.segmentCount, 44);
|
|
425
|
+
assert.equal(digestOf(pages.counts), "617fc98188343a6a");
|
|
426
|
+
});
|
|
427
|
+
test("cuts the 50,000-element Array where east-c cuts it", () => {
|
|
428
|
+
const type = ArrayType(StringType);
|
|
429
|
+
const elements = Array.from({ length: 50_000 }, (_, i) => `a${String(i).padStart(7, "0")}`);
|
|
430
|
+
const pages = openBeast2PagesFor(type)(encodeBeast2PagedFor(type)(elements));
|
|
431
|
+
assert.equal(pages.segmentCount, 43);
|
|
432
|
+
assert.equal(digestOf(pages.counts), "4b14a976ccd91c65");
|
|
433
|
+
});
|
|
434
|
+
});
|
|
435
|
+
describe("a standalone segment", () => {
|
|
436
|
+
test("is byte-identical to carving that segment out of the whole blob", () => {
|
|
437
|
+
const value = table(20_000);
|
|
438
|
+
const blob = encodeBeast2PagedFor(TableType)(value);
|
|
439
|
+
const extents = readBeast2Extents(blob);
|
|
440
|
+
const pages = openBeast2PagesFor(TableType)(blob);
|
|
441
|
+
const encodeSegments = encodeBeast2SegmentsFor(TableType);
|
|
442
|
+
assert.ok(pages.segmentCount > 2);
|
|
443
|
+
for (let i = 0; i < pages.segmentCount; i++) {
|
|
444
|
+
assert.deepEqual(encodeSegments([pages.segment(i)]), carveBeast2(blob, i, i + 1, extents), `segment ${i}`);
|
|
445
|
+
}
|
|
446
|
+
});
|
|
447
|
+
test("splices back into the whole blob", () => {
|
|
448
|
+
const blob = encodeBeast2PagedFor(TableType)(table(20_000));
|
|
449
|
+
const extents = readBeast2Extents(blob);
|
|
450
|
+
const segments = Array.from({ length: extents.offsets.length }, (_, i) => carveBeast2(blob, i, i + 1, extents));
|
|
451
|
+
assert.deepEqual(spliceBeast2(segments), blob);
|
|
452
|
+
});
|
|
453
|
+
test("reports its logical size from the frame header", () => {
|
|
454
|
+
// With codec none a frame's payload IS its logical bytes: the count's
|
|
455
|
+
// varint, then the elements back to back.
|
|
456
|
+
const type = SetType(StringType);
|
|
457
|
+
const elements = Array.from({ length: 3_000 }, (_, i) => `e${String(i).padStart(6, "0")}`);
|
|
458
|
+
const fence = encodeBeast2FenceFor(StringType);
|
|
459
|
+
const chunks = [];
|
|
460
|
+
const writer = new Beast2ElementWriter(type, (b) => chunks.push(b.slice()), { codec: "none" });
|
|
461
|
+
for (const e of elements)
|
|
462
|
+
writer.add(e);
|
|
463
|
+
writer.finish();
|
|
464
|
+
const blob = new Uint8Array(Buffer.concat(chunks));
|
|
465
|
+
const counts = readBeast2Extents(blob).counts;
|
|
466
|
+
const sizes = readBeast2SegmentLogicalBytes(blob);
|
|
467
|
+
let at = 0;
|
|
468
|
+
for (let i = 0; i < counts.length; i++) {
|
|
469
|
+
let expected = 0;
|
|
470
|
+
for (let j = 0; j < counts[i]; j++)
|
|
471
|
+
expected += fence(elements[at++]).length;
|
|
472
|
+
assert.equal(sizes[i], expected, `segment ${i}`);
|
|
473
|
+
}
|
|
474
|
+
const reader = { size: blob.length, read: (offset, length) => blob.subarray(offset, offset + length) };
|
|
475
|
+
assert.deepEqual(readBeast2SegmentLogicalBytes(reader), sizes);
|
|
476
|
+
});
|
|
477
|
+
});
|
|
478
|
+
});
|
|
479
|
+
//# sourceMappingURL=boundary.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"boundary.spec.js","sourceRoot":"","sources":["../../../../../src/serialization/beast2/v5/boundary.spec.ts"],"names":[],"mappings":"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"}
|
|
@@ -52,13 +52,13 @@ export declare const TAG_NEW = 0;
|
|
|
52
52
|
export declare const TAG_REF = 1;
|
|
53
53
|
/** Mutable state threaded through a v5 encode pass. */
|
|
54
54
|
export interface V5EncodeContext {
|
|
55
|
-
/** Identity map: container object → definition index. Cleared
|
|
56
|
-
*
|
|
55
|
+
/** Identity map: container object → definition index. Cleared at every root
|
|
56
|
+
* element of a segmented collection, so no REF reaches past its element. */
|
|
57
57
|
containerIndex: Map<any, number>;
|
|
58
58
|
/** Count of container definitions so far (the definition counter). */
|
|
59
59
|
containerCount: number;
|
|
60
|
-
/** Definition count at the start of the current root
|
|
61
|
-
* reaching below this mark
|
|
60
|
+
/** Definition count at the start of the current root element — REFs
|
|
61
|
+
* reaching below this mark would alias across elements. */
|
|
62
62
|
segmentBaseDef: number;
|
|
63
63
|
/** Whether any REF crossed a root-segment boundary. */
|
|
64
64
|
crossSegmentRef: boolean;
|
|
@@ -75,7 +75,8 @@ export interface V5EncodeContext {
|
|
|
75
75
|
/** Creates a fresh v5 encode context.
|
|
76
76
|
*
|
|
77
77
|
* @param sourceMap - the pre-resolved header source map, if any
|
|
78
|
-
* @param selfContained - whether the writer
|
|
78
|
+
* @param selfContained - whether the writer's segments must decode on their
|
|
79
|
+
* own, which forbids inline source-map growth
|
|
79
80
|
* @returns the initialized context
|
|
80
81
|
*/
|
|
81
82
|
export declare function createV5EncodeContext(sourceMap: SourceMap | null, selfContained: boolean): V5EncodeContext;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"codec.d.ts","sourceRoot":"","sources":["../../../../../src/serialization/beast2/v5/codec.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AAEH,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAOlD,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAKnE,OAAO,EAAE,SAAS,EAAiB,MAAM,sBAAsB,CAAC;AAChE,OAAO,EAAE,KAAK,mBAAmB,EAAE,KAAK,qBAAqB,
|
|
1
|
+
{"version":3,"file":"codec.d.ts","sourceRoot":"","sources":["../../../../../src/serialization/beast2/v5/codec.ts"],"names":[],"mappings":"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"}
|
|
@@ -50,7 +50,7 @@ import { compareFor } from "../../../comparison.js";
|
|
|
50
50
|
import { EAST_IR_SYMBOL, EAST_CAPTURES_SYMBOL, EAST_SOURCE_MAP_SYMBOL } from "../../../compile.js";
|
|
51
51
|
import { InternalError } from "../../../error.js";
|
|
52
52
|
import { SourceMap } from "../../../location.js";
|
|
53
|
-
import { buildPlatformContext, describeNoIrValue, finishDecodedFunction, irTypeValue } from "../shared.js";
|
|
53
|
+
import { buildPlatformContext, checkDecodeType, describeNoIrValue, finishDecodedFunction, irTypeValue } from "../shared.js";
|
|
54
54
|
import { writeTypeSection, readTypeSection, asTypeValue } from "./type-section.js";
|
|
55
55
|
import { FrameReader, writeFrame, preInflateFrames } from "./frames.js";
|
|
56
56
|
// =============================================================================
|
|
@@ -65,7 +65,8 @@ export const TAG_REF = 0x01;
|
|
|
65
65
|
/** Creates a fresh v5 encode context.
|
|
66
66
|
*
|
|
67
67
|
* @param sourceMap - the pre-resolved header source map, if any
|
|
68
|
-
* @param selfContained - whether the writer
|
|
68
|
+
* @param selfContained - whether the writer's segments must decode on their
|
|
69
|
+
* own, which forbids inline source-map growth
|
|
69
70
|
* @returns the initialized context
|
|
70
71
|
*/
|
|
71
72
|
export function createV5EncodeContext(sourceMap, selfContained) {
|
|
@@ -715,16 +716,28 @@ export function encodeBeast2V5For(type, options) {
|
|
|
715
716
|
writeIndexAndFooter(writer, segments, !ctx.crossSegmentRef);
|
|
716
717
|
return writer.toUint8Array();
|
|
717
718
|
};
|
|
719
|
+
// Every root element starts with an identity map holding only the root, as
|
|
720
|
+
// in the streaming writer: no REF reaches a neighbouring element, so each
|
|
721
|
+
// element's bytes depend on the element alone. The root stays registered,
|
|
722
|
+
// so an element that reaches back to it is still a REF — which marks the
|
|
723
|
+
// blob as not self-contained, rather than writing the root out again.
|
|
718
724
|
function encodeSegmentElements(rootType, value, logical, ctx, typeCtx) {
|
|
719
725
|
if (rootType.type === "Array" || rootType.type === "Set") {
|
|
720
726
|
const elem = getElemEncoder(rootType.value, typeCtx);
|
|
721
|
-
for (const item of value)
|
|
727
|
+
for (const item of value) {
|
|
728
|
+
ctx.containerIndex.clear();
|
|
729
|
+
ctx.containerIndex.set(value, 0);
|
|
730
|
+
ctx.segmentBaseDef = ctx.containerCount;
|
|
722
731
|
elem(item, logical, ctx);
|
|
732
|
+
}
|
|
723
733
|
}
|
|
724
734
|
else {
|
|
725
735
|
const key = getElemEncoder(rootType.value.key, typeCtx);
|
|
726
736
|
const val = getElemEncoder(rootType.value.value, typeCtx);
|
|
727
737
|
for (const [k, v] of value) {
|
|
738
|
+
ctx.containerIndex.clear();
|
|
739
|
+
ctx.containerIndex.set(value, 0);
|
|
740
|
+
ctx.segmentBaseDef = ctx.containerCount;
|
|
728
741
|
key(k, logical, ctx);
|
|
729
742
|
val(v, logical, ctx);
|
|
730
743
|
}
|
|
@@ -851,6 +864,8 @@ function readHeader(data) {
|
|
|
851
864
|
* root type), enforcing whole-stream strictness. */
|
|
852
865
|
function decodeV5(data, decodeType, options, inflate) {
|
|
853
866
|
const { rootType, sourceMap, frameOffset } = readHeader(data);
|
|
867
|
+
if (decodeType !== null)
|
|
868
|
+
checkDecodeType(rootType, decodeType);
|
|
854
869
|
const typeValue = decodeType ?? rootType;
|
|
855
870
|
const ctx = {
|
|
856
871
|
containers: [],
|