@fluidframework/tree 2.116.0-416006 → 2.116.1
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/CHANGELOG.md +84 -0
- package/README.md +5 -3
- package/api-report/tree.alpha.api.md +4 -2
- package/api-report/tree.beta.api.md +1 -1
- package/api-report/tree.legacy.beta.api.md +1 -1
- package/dist/codec/codec.d.ts +6 -6
- package/dist/codec/codec.d.ts.map +1 -1
- package/dist/codec/codec.js +3 -3
- package/dist/codec/codec.js.map +1 -1
- package/dist/codec/versioned/codec.d.ts +3 -3
- package/dist/codec/versioned/codec.d.ts.map +1 -1
- package/dist/codec/versioned/codec.js.map +1 -1
- package/dist/core/forest/editableForest.d.ts +2 -0
- package/dist/core/forest/editableForest.d.ts.map +1 -1
- package/dist/core/forest/editableForest.js.map +1 -1
- package/dist/core/index.d.ts +1 -1
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +2 -2
- package/dist/core/index.js.map +1 -1
- package/dist/core/tree/index.d.ts +1 -1
- package/dist/core/tree/index.d.ts.map +1 -1
- package/dist/core/tree/index.js +2 -2
- package/dist/core/tree/index.js.map +1 -1
- package/dist/core/tree/visitorUtils.d.ts +24 -3
- package/dist/core/tree/visitorUtils.d.ts.map +1 -1
- package/dist/core/tree/visitorUtils.js +24 -6
- package/dist/core/tree/visitorUtils.js.map +1 -1
- package/dist/feature-libraries/chunked-forest/chunkedForest.d.ts +30 -6
- package/dist/feature-libraries/chunked-forest/chunkedForest.d.ts.map +1 -1
- package/dist/feature-libraries/chunked-forest/chunkedForest.js +146 -54
- package/dist/feature-libraries/chunked-forest/chunkedForest.js.map +1 -1
- package/dist/feature-libraries/comparison-forest/comparisonForest.d.ts +2 -1
- package/dist/feature-libraries/comparison-forest/comparisonForest.d.ts.map +1 -1
- package/dist/feature-libraries/comparison-forest/comparisonForest.js +87 -70
- package/dist/feature-libraries/comparison-forest/comparisonForest.js.map +1 -1
- package/dist/feature-libraries/detachedFieldIndexSummarizer.js.map +1 -1
- package/dist/feature-libraries/forest-summary/forestSummarizer.d.ts +5 -0
- package/dist/feature-libraries/forest-summary/forestSummarizer.d.ts.map +1 -1
- package/dist/feature-libraries/forest-summary/forestSummarizer.js +127 -107
- package/dist/feature-libraries/forest-summary/forestSummarizer.js.map +1 -1
- package/dist/feature-libraries/forest-summary/summaryTypes.d.ts +2 -2
- package/dist/feature-libraries/forest-summary/summaryTypes.d.ts.map +1 -1
- package/dist/feature-libraries/forest-summary/summaryTypes.js.map +1 -1
- package/dist/feature-libraries/indexing/anchorTreeIndex.js +1 -1
- package/dist/feature-libraries/indexing/anchorTreeIndex.js.map +1 -1
- package/dist/feature-libraries/modular-schema/invert.js +1 -1
- package/dist/feature-libraries/modular-schema/invert.js.map +1 -1
- package/dist/feature-libraries/modular-schema/modularChangeFamily.d.ts.map +1 -1
- package/dist/feature-libraries/modular-schema/modularChangeFamily.js +2 -11
- package/dist/feature-libraries/modular-schema/modularChangeFamily.js.map +1 -1
- package/dist/feature-libraries/modular-schema/modularChangeUtils.d.ts +11 -16
- package/dist/feature-libraries/modular-schema/modularChangeUtils.d.ts.map +1 -1
- package/dist/feature-libraries/modular-schema/modularChangeUtils.js +10 -3
- package/dist/feature-libraries/modular-schema/modularChangeUtils.js.map +1 -1
- package/dist/feature-libraries/object-forest/objectForest.d.ts.map +1 -1
- package/dist/feature-libraries/object-forest/objectForest.js +34 -13
- package/dist/feature-libraries/object-forest/objectForest.js.map +1 -1
- package/dist/feature-libraries/schema-index/schemaSummarizer.d.ts +2 -2
- package/dist/feature-libraries/schema-index/schemaSummarizer.d.ts.map +1 -1
- package/dist/feature-libraries/schema-index/schemaSummarizer.js.map +1 -1
- package/dist/feature-libraries/sequence-field/rebase.js +1 -1
- package/dist/feature-libraries/sequence-field/rebase.js.map +1 -1
- package/dist/feature-libraries/sequence-field/utils.js +1 -1
- package/dist/feature-libraries/sequence-field/utils.js.map +1 -1
- package/dist/packageVersion.d.ts +1 -1
- package/dist/packageVersion.d.ts.map +1 -1
- package/dist/packageVersion.js +1 -1
- package/dist/packageVersion.js.map +1 -1
- package/dist/shared-tree/independentView.d.ts.map +1 -1
- package/dist/shared-tree/independentView.js +2 -4
- package/dist/shared-tree/independentView.js.map +1 -1
- package/dist/shared-tree/sharedTree.d.ts +30 -5
- package/dist/shared-tree/sharedTree.d.ts.map +1 -1
- package/dist/shared-tree/sharedTree.js +8 -8
- package/dist/shared-tree/sharedTree.js.map +1 -1
- package/dist/shared-tree/sharedTreeChangeCodecs.d.ts +2 -2
- package/dist/shared-tree/sharedTreeChangeCodecs.d.ts.map +1 -1
- package/dist/shared-tree/sharedTreeChangeCodecs.js.map +1 -1
- package/dist/shared-tree/sharedTreeChangeEnricher.d.ts +25 -1
- package/dist/shared-tree/sharedTreeChangeEnricher.d.ts.map +1 -1
- package/dist/shared-tree/sharedTreeChangeEnricher.js +24 -0
- package/dist/shared-tree/sharedTreeChangeEnricher.js.map +1 -1
- package/dist/shared-tree/treeCheckout.d.ts +21 -10
- package/dist/shared-tree/treeCheckout.d.ts.map +1 -1
- package/dist/shared-tree/treeCheckout.js +56 -24
- package/dist/shared-tree/treeCheckout.js.map +1 -1
- package/dist/shared-tree-core/branchCommitEnricher.d.ts +2 -1
- package/dist/shared-tree-core/branchCommitEnricher.d.ts.map +1 -1
- package/dist/shared-tree-core/branchCommitEnricher.js +3 -2
- package/dist/shared-tree-core/branchCommitEnricher.js.map +1 -1
- package/dist/shared-tree-core/changeEnricher.d.ts +3 -2
- package/dist/shared-tree-core/changeEnricher.d.ts.map +1 -1
- package/dist/shared-tree-core/changeEnricher.js.map +1 -1
- package/dist/shared-tree-core/defaultResubmitMachine.d.ts +9 -1
- package/dist/shared-tree-core/defaultResubmitMachine.d.ts.map +1 -1
- package/dist/shared-tree-core/defaultResubmitMachine.js +7 -2
- package/dist/shared-tree-core/defaultResubmitMachine.js.map +1 -1
- package/dist/shared-tree-core/editManager.d.ts.map +1 -1
- package/dist/shared-tree-core/editManager.js +2 -2
- package/dist/shared-tree-core/editManager.js.map +1 -1
- package/dist/shared-tree-core/editManagerCodecs.d.ts +2 -2
- package/dist/shared-tree-core/editManagerCodecs.d.ts.map +1 -1
- package/dist/shared-tree-core/editManagerCodecs.js.map +1 -1
- package/dist/shared-tree-core/editManagerSummarizer.d.ts +2 -2
- package/dist/shared-tree-core/editManagerSummarizer.d.ts.map +1 -1
- package/dist/shared-tree-core/editManagerSummarizer.js.map +1 -1
- package/dist/shared-tree-core/messageCodecs.d.ts +2 -2
- package/dist/shared-tree-core/messageCodecs.d.ts.map +1 -1
- package/dist/shared-tree-core/messageCodecs.js.map +1 -1
- package/dist/shared-tree-core/sharedTreeCore.d.ts +11 -2
- package/dist/shared-tree-core/sharedTreeCore.d.ts.map +1 -1
- package/dist/shared-tree-core/sharedTreeCore.js +11 -8
- package/dist/shared-tree-core/sharedTreeCore.js.map +1 -1
- package/dist/shared-tree-core/summaryTypes.d.ts +2 -2
- package/dist/shared-tree-core/summaryTypes.d.ts.map +1 -1
- package/dist/shared-tree-core/summaryTypes.js.map +1 -1
- package/dist/simple-tree/api/snapshotCompatibilityChecker.d.ts +1 -1
- package/dist/simple-tree/api/snapshotCompatibilityChecker.js.map +1 -1
- package/dist/simple-tree/api/storedSchema.d.ts +2 -2
- package/dist/simple-tree/api/storedSchema.d.ts.map +1 -1
- package/dist/simple-tree/api/storedSchema.js.map +1 -1
- package/dist/simple-tree/api/treeChangeEvents.d.ts +5 -1
- package/dist/simple-tree/api/treeChangeEvents.d.ts.map +1 -1
- package/dist/simple-tree/api/treeChangeEvents.js.map +1 -1
- package/dist/simple-tree/node-kinds/array/arrayNode.d.ts.map +1 -1
- package/dist/simple-tree/node-kinds/array/arrayNode.js +10 -0
- package/dist/simple-tree/node-kinds/array/arrayNode.js.map +1 -1
- package/dist/simple-tree/node-kinds/map/mapNode.d.ts.map +1 -1
- package/dist/simple-tree/node-kinds/map/mapNode.js +19 -2
- package/dist/simple-tree/node-kinds/map/mapNode.js.map +1 -1
- package/dist/tableSchema.d.ts +1 -1
- package/dist/tableSchema.js +1 -1
- package/dist/tableSchema.js.map +1 -1
- package/dist/treeFactory.d.ts.map +1 -1
- package/dist/treeFactory.js +1 -1
- package/dist/treeFactory.js.map +1 -1
- package/dist/util/breakable.d.ts +14 -2
- package/dist/util/breakable.d.ts.map +1 -1
- package/dist/util/breakable.js +9 -1
- package/dist/util/breakable.js.map +1 -1
- package/dist/util/compressedIds.d.ts +2 -2
- package/dist/util/compressedIds.d.ts.map +1 -1
- package/dist/util/compressedIds.js +1 -6
- package/dist/util/compressedIds.js.map +1 -1
- package/lib/codec/codec.d.ts +6 -6
- package/lib/codec/codec.d.ts.map +1 -1
- package/lib/codec/codec.js +3 -3
- package/lib/codec/codec.js.map +1 -1
- package/lib/codec/versioned/codec.d.ts +3 -3
- package/lib/codec/versioned/codec.d.ts.map +1 -1
- package/lib/codec/versioned/codec.js.map +1 -1
- package/lib/core/forest/editableForest.d.ts +2 -0
- package/lib/core/forest/editableForest.d.ts.map +1 -1
- package/lib/core/forest/editableForest.js.map +1 -1
- package/lib/core/index.d.ts +1 -1
- package/lib/core/index.d.ts.map +1 -1
- package/lib/core/index.js +1 -1
- package/lib/core/index.js.map +1 -1
- package/lib/core/tree/index.d.ts +1 -1
- package/lib/core/tree/index.d.ts.map +1 -1
- package/lib/core/tree/index.js +1 -1
- package/lib/core/tree/index.js.map +1 -1
- package/lib/core/tree/visitorUtils.d.ts +24 -3
- package/lib/core/tree/visitorUtils.d.ts.map +1 -1
- package/lib/core/tree/visitorUtils.js +22 -4
- package/lib/core/tree/visitorUtils.js.map +1 -1
- package/lib/feature-libraries/chunked-forest/chunkedForest.d.ts +30 -6
- package/lib/feature-libraries/chunked-forest/chunkedForest.d.ts.map +1 -1
- package/lib/feature-libraries/chunked-forest/chunkedForest.js +146 -56
- package/lib/feature-libraries/chunked-forest/chunkedForest.js.map +1 -1
- package/lib/feature-libraries/comparison-forest/comparisonForest.d.ts +2 -1
- package/lib/feature-libraries/comparison-forest/comparisonForest.d.ts.map +1 -1
- package/lib/feature-libraries/comparison-forest/comparisonForest.js +88 -70
- package/lib/feature-libraries/comparison-forest/comparisonForest.js.map +1 -1
- package/lib/feature-libraries/detachedFieldIndexSummarizer.js.map +1 -1
- package/lib/feature-libraries/forest-summary/forestSummarizer.d.ts +5 -0
- package/lib/feature-libraries/forest-summary/forestSummarizer.d.ts.map +1 -1
- package/lib/feature-libraries/forest-summary/forestSummarizer.js +129 -108
- package/lib/feature-libraries/forest-summary/forestSummarizer.js.map +1 -1
- package/lib/feature-libraries/forest-summary/summaryTypes.d.ts +2 -2
- package/lib/feature-libraries/forest-summary/summaryTypes.d.ts.map +1 -1
- package/lib/feature-libraries/forest-summary/summaryTypes.js.map +1 -1
- package/lib/feature-libraries/indexing/anchorTreeIndex.js +1 -1
- package/lib/feature-libraries/indexing/anchorTreeIndex.js.map +1 -1
- package/lib/feature-libraries/modular-schema/invert.js +2 -2
- package/lib/feature-libraries/modular-schema/invert.js.map +1 -1
- package/lib/feature-libraries/modular-schema/modularChangeFamily.d.ts.map +1 -1
- package/lib/feature-libraries/modular-schema/modularChangeFamily.js +2 -11
- package/lib/feature-libraries/modular-schema/modularChangeFamily.js.map +1 -1
- package/lib/feature-libraries/modular-schema/modularChangeUtils.d.ts +11 -16
- package/lib/feature-libraries/modular-schema/modularChangeUtils.d.ts.map +1 -1
- package/lib/feature-libraries/modular-schema/modularChangeUtils.js +10 -3
- package/lib/feature-libraries/modular-schema/modularChangeUtils.js.map +1 -1
- package/lib/feature-libraries/object-forest/objectForest.d.ts.map +1 -1
- package/lib/feature-libraries/object-forest/objectForest.js +35 -14
- package/lib/feature-libraries/object-forest/objectForest.js.map +1 -1
- package/lib/feature-libraries/schema-index/schemaSummarizer.d.ts +2 -2
- package/lib/feature-libraries/schema-index/schemaSummarizer.d.ts.map +1 -1
- package/lib/feature-libraries/schema-index/schemaSummarizer.js.map +1 -1
- package/lib/feature-libraries/sequence-field/rebase.js +2 -2
- package/lib/feature-libraries/sequence-field/rebase.js.map +1 -1
- package/lib/feature-libraries/sequence-field/utils.js +1 -1
- package/lib/feature-libraries/sequence-field/utils.js.map +1 -1
- package/lib/packageVersion.d.ts +1 -1
- package/lib/packageVersion.d.ts.map +1 -1
- package/lib/packageVersion.js +1 -1
- package/lib/packageVersion.js.map +1 -1
- package/lib/shared-tree/independentView.d.ts.map +1 -1
- package/lib/shared-tree/independentView.js +3 -5
- package/lib/shared-tree/independentView.js.map +1 -1
- package/lib/shared-tree/sharedTree.d.ts +30 -5
- package/lib/shared-tree/sharedTree.d.ts.map +1 -1
- package/lib/shared-tree/sharedTree.js +8 -8
- package/lib/shared-tree/sharedTree.js.map +1 -1
- package/lib/shared-tree/sharedTreeChangeCodecs.d.ts +2 -2
- package/lib/shared-tree/sharedTreeChangeCodecs.d.ts.map +1 -1
- package/lib/shared-tree/sharedTreeChangeCodecs.js.map +1 -1
- package/lib/shared-tree/sharedTreeChangeEnricher.d.ts +25 -1
- package/lib/shared-tree/sharedTreeChangeEnricher.d.ts.map +1 -1
- package/lib/shared-tree/sharedTreeChangeEnricher.js +24 -0
- package/lib/shared-tree/sharedTreeChangeEnricher.js.map +1 -1
- package/lib/shared-tree/treeCheckout.d.ts +21 -10
- package/lib/shared-tree/treeCheckout.d.ts.map +1 -1
- package/lib/shared-tree/treeCheckout.js +56 -24
- package/lib/shared-tree/treeCheckout.js.map +1 -1
- package/lib/shared-tree-core/branchCommitEnricher.d.ts +2 -1
- package/lib/shared-tree-core/branchCommitEnricher.d.ts.map +1 -1
- package/lib/shared-tree-core/branchCommitEnricher.js +3 -2
- package/lib/shared-tree-core/branchCommitEnricher.js.map +1 -1
- package/lib/shared-tree-core/changeEnricher.d.ts +3 -2
- package/lib/shared-tree-core/changeEnricher.d.ts.map +1 -1
- package/lib/shared-tree-core/changeEnricher.js.map +1 -1
- package/lib/shared-tree-core/defaultResubmitMachine.d.ts +9 -1
- package/lib/shared-tree-core/defaultResubmitMachine.d.ts.map +1 -1
- package/lib/shared-tree-core/defaultResubmitMachine.js +7 -2
- package/lib/shared-tree-core/defaultResubmitMachine.js.map +1 -1
- package/lib/shared-tree-core/editManager.d.ts.map +1 -1
- package/lib/shared-tree-core/editManager.js +2 -2
- package/lib/shared-tree-core/editManager.js.map +1 -1
- package/lib/shared-tree-core/editManagerCodecs.d.ts +2 -2
- package/lib/shared-tree-core/editManagerCodecs.d.ts.map +1 -1
- package/lib/shared-tree-core/editManagerCodecs.js.map +1 -1
- package/lib/shared-tree-core/editManagerSummarizer.d.ts +2 -2
- package/lib/shared-tree-core/editManagerSummarizer.d.ts.map +1 -1
- package/lib/shared-tree-core/editManagerSummarizer.js.map +1 -1
- package/lib/shared-tree-core/messageCodecs.d.ts +2 -2
- package/lib/shared-tree-core/messageCodecs.d.ts.map +1 -1
- package/lib/shared-tree-core/messageCodecs.js.map +1 -1
- package/lib/shared-tree-core/sharedTreeCore.d.ts +11 -2
- package/lib/shared-tree-core/sharedTreeCore.d.ts.map +1 -1
- package/lib/shared-tree-core/sharedTreeCore.js +11 -8
- package/lib/shared-tree-core/sharedTreeCore.js.map +1 -1
- package/lib/shared-tree-core/summaryTypes.d.ts +2 -2
- package/lib/shared-tree-core/summaryTypes.d.ts.map +1 -1
- package/lib/shared-tree-core/summaryTypes.js.map +1 -1
- package/lib/simple-tree/api/snapshotCompatibilityChecker.d.ts +1 -1
- package/lib/simple-tree/api/snapshotCompatibilityChecker.js.map +1 -1
- package/lib/simple-tree/api/storedSchema.d.ts +2 -2
- package/lib/simple-tree/api/storedSchema.d.ts.map +1 -1
- package/lib/simple-tree/api/storedSchema.js.map +1 -1
- package/lib/simple-tree/api/treeChangeEvents.d.ts +5 -1
- package/lib/simple-tree/api/treeChangeEvents.d.ts.map +1 -1
- package/lib/simple-tree/api/treeChangeEvents.js.map +1 -1
- package/lib/simple-tree/node-kinds/array/arrayNode.d.ts.map +1 -1
- package/lib/simple-tree/node-kinds/array/arrayNode.js +10 -0
- package/lib/simple-tree/node-kinds/array/arrayNode.js.map +1 -1
- package/lib/simple-tree/node-kinds/map/mapNode.d.ts.map +1 -1
- package/lib/simple-tree/node-kinds/map/mapNode.js +19 -2
- package/lib/simple-tree/node-kinds/map/mapNode.js.map +1 -1
- package/lib/tableSchema.d.ts +1 -1
- package/lib/tableSchema.js +1 -1
- package/lib/tableSchema.js.map +1 -1
- package/lib/treeFactory.d.ts.map +1 -1
- package/lib/treeFactory.js +1 -1
- package/lib/treeFactory.js.map +1 -1
- package/lib/util/breakable.d.ts +14 -2
- package/lib/util/breakable.d.ts.map +1 -1
- package/lib/util/breakable.js +9 -1
- package/lib/util/breakable.js.map +1 -1
- package/lib/util/compressedIds.d.ts +2 -2
- package/lib/util/compressedIds.d.ts.map +1 -1
- package/lib/util/compressedIds.js +1 -6
- package/lib/util/compressedIds.js.map +1 -1
- package/package.json +27 -27
- package/src/codec/codec.ts +7 -7
- package/src/codec/versioned/codec.ts +5 -5
- package/src/core/forest/editableForest.ts +2 -0
- package/src/core/index.ts +1 -1
- package/src/core/tree/index.ts +1 -1
- package/src/core/tree/visitorUtils.ts +37 -12
- package/src/feature-libraries/chunked-forest/chunkedForest.ts +214 -59
- package/src/feature-libraries/comparison-forest/comparisonForest.ts +6 -1
- package/src/feature-libraries/detachedFieldIndexSummarizer.ts +2 -2
- package/src/feature-libraries/forest-summary/forestSummarizer.ts +10 -0
- package/src/feature-libraries/forest-summary/summaryTypes.ts +2 -2
- package/src/feature-libraries/indexing/anchorTreeIndex.ts +1 -1
- package/src/feature-libraries/modular-schema/invert.ts +2 -2
- package/src/feature-libraries/modular-schema/modularChangeFamily.ts +2 -23
- package/src/feature-libraries/modular-schema/modularChangeUtils.ts +12 -21
- package/src/feature-libraries/object-forest/objectForest.ts +48 -14
- package/src/feature-libraries/schema-index/schemaSummarizer.ts +3 -3
- package/src/feature-libraries/sequence-field/rebase.ts +2 -2
- package/src/feature-libraries/sequence-field/utils.ts +1 -1
- package/src/packageVersion.ts +1 -1
- package/src/shared-tree/independentView.ts +5 -12
- package/src/shared-tree/sharedTree.ts +41 -10
- package/src/shared-tree/sharedTreeChangeCodecs.ts +2 -2
- package/src/shared-tree/sharedTreeChangeEnricher.ts +25 -1
- package/src/shared-tree/treeCheckout.ts +53 -24
- package/src/shared-tree-core/branchCommitEnricher.ts +6 -2
- package/src/shared-tree-core/changeEnricher.ts +7 -2
- package/src/shared-tree-core/defaultResubmitMachine.ts +5 -0
- package/src/shared-tree-core/editManager.ts +2 -4
- package/src/shared-tree-core/editManagerCodecs.ts +2 -2
- package/src/shared-tree-core/editManagerSummarizer.ts +3 -3
- package/src/shared-tree-core/messageCodecs.ts +2 -2
- package/src/shared-tree-core/sharedTreeCore.ts +29 -11
- package/src/shared-tree-core/summaryTypes.ts +2 -2
- package/src/simple-tree/api/snapshotCompatibilityChecker.ts +1 -1
- package/src/simple-tree/api/storedSchema.ts +2 -2
- package/src/simple-tree/api/treeChangeEvents.ts +5 -1
- package/src/simple-tree/node-kinds/array/arrayNode.ts +15 -0
- package/src/simple-tree/node-kinds/map/mapNode.ts +23 -2
- package/src/tableSchema.ts +1 -1
- package/src/treeFactory.ts +0 -1
- package/src/util/breakable.ts +9 -1
- package/src/util/compressedIds.ts +7 -13
|
@@ -5,7 +5,9 @@
|
|
|
5
5
|
*/
|
|
6
6
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
7
|
exports.ComparisonForest = void 0;
|
|
8
|
+
const tslib_1 = require("tslib");
|
|
8
9
|
const index_js_1 = require("../../core/index.js");
|
|
10
|
+
const index_js_2 = require("../../util/index.js");
|
|
9
11
|
const treeTextCursor_js_1 = require("../treeTextCursor.js");
|
|
10
12
|
/**
|
|
11
13
|
* An {@link IEditableForest} which wraps two other forests: a `main` forest and a `reference` forest.
|
|
@@ -24,75 +26,90 @@ const treeTextCursor_js_1 = require("../treeTextCursor.js");
|
|
|
24
26
|
* This forest is intentionally expensive: it maintains two full copies of the data and re-reads and
|
|
25
27
|
* structurally compares all of their contents after every delta.
|
|
26
28
|
*/
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
29
|
+
let ComparisonForest = (() => {
|
|
30
|
+
var _a;
|
|
31
|
+
let _instanceExtraInitializers = [];
|
|
32
|
+
let _assertValid_decorators;
|
|
33
|
+
return _a = class ComparisonForest {
|
|
34
|
+
/**
|
|
35
|
+
* @param main - The forest whose behavior is under test.
|
|
36
|
+
* All reads are delegated to this forest, and it is the source of truth for anchors and events.
|
|
37
|
+
* @param reference - The forest to compare against.
|
|
38
|
+
* This forest receives all the same deltas as `main`, and its contents are asserted to match `main` after each delta.
|
|
39
|
+
*/
|
|
40
|
+
constructor(main, reference) {
|
|
41
|
+
this.main = (tslib_1.__runInitializers(this, _instanceExtraInitializers), main);
|
|
42
|
+
this.reference = reference;
|
|
43
|
+
this.assertValid();
|
|
44
|
+
}
|
|
45
|
+
assertValid() {
|
|
46
|
+
(0, treeTextCursor_js_1.assertForestsEqual)(this.main, this.reference);
|
|
47
|
+
}
|
|
48
|
+
get events() {
|
|
49
|
+
return this.main.events;
|
|
50
|
+
}
|
|
51
|
+
get anchors() {
|
|
52
|
+
return this.main.anchors;
|
|
53
|
+
}
|
|
54
|
+
get isEmpty() {
|
|
55
|
+
return this.main.isEmpty;
|
|
56
|
+
}
|
|
57
|
+
get breaker() {
|
|
58
|
+
return this.main.breaker;
|
|
59
|
+
}
|
|
60
|
+
clone(schema, breaker) {
|
|
61
|
+
this.assertValid();
|
|
62
|
+
return new _a(this.main.clone(schema, breaker), this.reference.clone(schema, breaker));
|
|
63
|
+
}
|
|
64
|
+
chunkField(cursor) {
|
|
65
|
+
return this.main.chunkField(cursor);
|
|
66
|
+
}
|
|
67
|
+
allocateCursor(source) {
|
|
68
|
+
// Currently we just use the cursor from "main", but we could use "reference" or a custom cursor ensuring both match in behavior.
|
|
69
|
+
// TODO: Add a custom combined cursor type which validates two cursors match, and use it here.
|
|
70
|
+
return this.main.allocateCursor(source);
|
|
71
|
+
}
|
|
72
|
+
forgetAnchor(anchor) {
|
|
73
|
+
this.main.forgetAnchor(anchor);
|
|
74
|
+
}
|
|
75
|
+
tryMoveCursorToNode(destination, cursorToMove) {
|
|
76
|
+
return this.main.tryMoveCursorToNode(destination, cursorToMove);
|
|
77
|
+
}
|
|
78
|
+
tryMoveCursorToField(destination, cursorToMove) {
|
|
79
|
+
return this.main.tryMoveCursorToField(destination, cursorToMove);
|
|
80
|
+
}
|
|
81
|
+
moveCursorToPath(destination, cursorToMove) {
|
|
82
|
+
this.main.moveCursorToPath(destination, cursorToMove);
|
|
83
|
+
}
|
|
84
|
+
getCursorAboveDetachedFields() {
|
|
85
|
+
return this.main.getCursorAboveDetachedFields();
|
|
86
|
+
}
|
|
87
|
+
registerAnnouncedVisitor(visitor) {
|
|
88
|
+
this.main.registerAnnouncedVisitor(visitor);
|
|
89
|
+
}
|
|
90
|
+
deregisterAnnouncedVisitor(visitor) {
|
|
91
|
+
this.main.deregisterAnnouncedVisitor(visitor);
|
|
92
|
+
}
|
|
93
|
+
acquireVisitor() {
|
|
94
|
+
this.assertValid();
|
|
95
|
+
const main = this.main;
|
|
96
|
+
const reference = this.reference;
|
|
97
|
+
const mainVisitor = main.acquireVisitor();
|
|
98
|
+
const referenceVisitor = reference.acquireVisitor();
|
|
99
|
+
// A visitor which does nothing except assert the two forests match once the delta has been fully applied to both.
|
|
100
|
+
const comparisonVisitor = (0, index_js_1.createAnnouncedVisitor)({
|
|
101
|
+
free: () => this.assertValid(),
|
|
102
|
+
});
|
|
103
|
+
return (0, index_js_1.combineVisitors)([mainVisitor, referenceVisitor, comparisonVisitor]);
|
|
104
|
+
}
|
|
105
|
+
},
|
|
106
|
+
(() => {
|
|
107
|
+
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(null) : void 0;
|
|
108
|
+
_assertValid_decorators = [index_js_2.breakingMethod];
|
|
109
|
+
tslib_1.__esDecorate(_a, null, _assertValid_decorators, { kind: "method", name: "assertValid", static: false, private: false, access: { has: obj => "assertValid" in obj, get: obj => obj.assertValid }, metadata: _metadata }, null, _instanceExtraInitializers);
|
|
110
|
+
if (_metadata) Object.defineProperty(_a, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
|
|
111
|
+
})(),
|
|
112
|
+
_a;
|
|
113
|
+
})();
|
|
97
114
|
exports.ComparisonForest = ComparisonForest;
|
|
98
115
|
//# sourceMappingURL=comparisonForest.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"comparisonForest.js","sourceRoot":"","sources":["../../../src/feature-libraries/comparison-forest/comparisonForest.ts"],"names":[],"mappings":";AAAA;;;GAGG
|
|
1
|
+
{"version":3,"file":"comparisonForest.js","sourceRoot":"","sources":["../../../src/feature-libraries/comparison-forest/comparisonForest.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport type { Listenable } from \"@fluidframework/core-interfaces\";\n\nimport {\n\ttype Anchor,\n\ttype AnchorSet,\n\ttype AnnouncedVisitor,\n\ttype DeltaVisitor,\n\ttype FieldAnchor,\n\ttype ForestEvents,\n\ttype IEditableForest,\n\ttype ITreeCursorSynchronous,\n\ttype ITreeSubscriptionCursor,\n\ttype TreeChunk,\n\ttype TreeNavigationResult,\n\ttype TreeStoredSchemaSubscription,\n\ttype UpPath,\n\tcombineVisitors,\n\tcreateAnnouncedVisitor,\n} from \"../../core/index.js\";\nimport { breakingMethod, type Breakable } from \"../../util/index.js\";\n\nimport { assertForestsEqual } from \"../treeTextCursor.js\";\n\n/**\n * An {@link IEditableForest} which wraps two other forests: a `main` forest and a `reference` forest.\n *\n * @remarks\n * All read operations are delegated to `main`, so from the outside a `ComparisonForest` behaves exactly like its `main` forest.\n *\n * When a delta is applied (via {@link IEditableForest.acquireVisitor}), the delta is applied to both `main` and `reference`.\n * Once the visitor is freed, the full contents of both forests (including all detached/removed fields) are compared,\n * and an error is thrown if they differ.\n *\n * This is a testing/debugging aid: it allows validating that a forest implementation (for example the optimized `ChunkedForest`)\n * produces the same results as a simpler reference implementation (for example the `ObjectForest`) for every delta that is applied.\n *\n * @privateRemarks\n * This forest is intentionally expensive: it maintains two full copies of the data and re-reads and\n * structurally compares all of their contents after every delta.\n */\nexport class ComparisonForest implements IEditableForest {\n\t/**\n\t * @param main - The forest whose behavior is under test.\n\t * All reads are delegated to this forest, and it is the source of truth for anchors and events.\n\t * @param reference - The forest to compare against.\n\t * This forest receives all the same deltas as `main`, and its contents are asserted to match `main` after each delta.\n\t */\n\tpublic constructor(\n\t\tpublic readonly main: IEditableForest,\n\t\tpublic readonly reference: IEditableForest,\n\t) {\n\t\tthis.assertValid();\n\t}\n\n\t@breakingMethod\n\tprivate assertValid(): void {\n\t\tassertForestsEqual(this.main, this.reference);\n\t}\n\n\tpublic get events(): Listenable<ForestEvents> {\n\t\treturn this.main.events;\n\t}\n\n\tpublic get anchors(): AnchorSet {\n\t\treturn this.main.anchors;\n\t}\n\n\tpublic get isEmpty(): boolean {\n\t\treturn this.main.isEmpty;\n\t}\n\n\tpublic get breaker(): Breakable {\n\t\treturn this.main.breaker;\n\t}\n\n\tpublic clone(schema: TreeStoredSchemaSubscription, breaker?: Breakable): ComparisonForest {\n\t\tthis.assertValid();\n\t\treturn new ComparisonForest(\n\t\t\tthis.main.clone(schema, breaker),\n\t\t\tthis.reference.clone(schema, breaker),\n\t\t);\n\t}\n\n\tpublic chunkField(cursor: ITreeCursorSynchronous): TreeChunk[] {\n\t\treturn this.main.chunkField(cursor);\n\t}\n\n\tpublic allocateCursor(source?: string): ITreeSubscriptionCursor {\n\t\t// Currently we just use the cursor from \"main\", but we could use \"reference\" or a custom cursor ensuring both match in behavior.\n\t\t// TODO: Add a custom combined cursor type which validates two cursors match, and use it here.\n\t\treturn this.main.allocateCursor(source);\n\t}\n\n\tpublic forgetAnchor(anchor: Anchor): void {\n\t\tthis.main.forgetAnchor(anchor);\n\t}\n\n\tpublic tryMoveCursorToNode(\n\t\tdestination: Anchor,\n\t\tcursorToMove: ITreeSubscriptionCursor,\n\t): TreeNavigationResult {\n\t\treturn this.main.tryMoveCursorToNode(destination, cursorToMove);\n\t}\n\n\tpublic tryMoveCursorToField(\n\t\tdestination: FieldAnchor,\n\t\tcursorToMove: ITreeSubscriptionCursor,\n\t): TreeNavigationResult {\n\t\treturn this.main.tryMoveCursorToField(destination, cursorToMove);\n\t}\n\n\tpublic moveCursorToPath(destination: UpPath, cursorToMove: ITreeSubscriptionCursor): void {\n\t\tthis.main.moveCursorToPath(destination, cursorToMove);\n\t}\n\n\tpublic getCursorAboveDetachedFields(): ITreeCursorSynchronous {\n\t\treturn this.main.getCursorAboveDetachedFields();\n\t}\n\n\tpublic registerAnnouncedVisitor(visitor: () => AnnouncedVisitor): void {\n\t\tthis.main.registerAnnouncedVisitor(visitor);\n\t}\n\n\tpublic deregisterAnnouncedVisitor(visitor: () => AnnouncedVisitor): void {\n\t\tthis.main.deregisterAnnouncedVisitor(visitor);\n\t}\n\n\tpublic acquireVisitor(): DeltaVisitor {\n\t\tthis.assertValid();\n\t\tconst main = this.main;\n\t\tconst reference = this.reference;\n\t\tconst mainVisitor = main.acquireVisitor();\n\t\tconst referenceVisitor = reference.acquireVisitor();\n\t\t// A visitor which does nothing except assert the two forests match once the delta has been fully applied to both.\n\t\tconst comparisonVisitor = createAnnouncedVisitor({\n\t\t\tfree: () => this.assertValid(),\n\t\t});\n\t\treturn combineVisitors([mainVisitor, referenceVisitor, comparisonVisitor]);\n\t}\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"detachedFieldIndexSummarizer.js","sourceRoot":"","sources":["../../src/feature-libraries/detachedFieldIndexSummarizer.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAEH,+DAA8D;AAU9D,gDAK2B;AAC3B,+CAK0B;AAC1B,2DAKsC;AAGtC;;GAEG;AACU,QAAA,yBAAyB,GAAG,wBAAwB,CAAC;AAElE;;GAEG;AACH,IAAkB,sCAajB;AAbD,WAAkB,sCAAsC;IACvD;;OAEG;IACH,+FAAM,CAAA;IACN;;OAEG;IACH,+FAAM,CAAA;IACN;;OAEG;IACH,yGAAY,CAAA;AACb,CAAC,EAbiB,sCAAsC,sDAAtC,sCAAsC,QAavD;AAED,MAAM,iBAAiB,GAAG,IAAI,GAAG,CAAyC;;;CAGzE,CAAC,CAAC;AAEH;;GAEG;AACH,SAAS,kDAAkD,CAC1D,
|
|
1
|
+
{"version":3,"file":"detachedFieldIndexSummarizer.js","sourceRoot":"","sources":["../../src/feature-libraries/detachedFieldIndexSummarizer.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAEH,+DAA8D;AAU9D,gDAK2B;AAC3B,+CAK0B;AAC1B,2DAKsC;AAGtC;;GAEG;AACU,QAAA,yBAAyB,GAAG,wBAAwB,CAAC;AAElE;;GAEG;AACH,IAAkB,sCAajB;AAbD,WAAkB,sCAAsC;IACvD;;OAEG;IACH,+FAAM,CAAA;IACN;;OAEG;IACH,+FAAM,CAAA;IACN;;OAEG;IACH,yGAAY,CAAA;AACb,CAAC,EAbiB,sCAAsC,sDAAtC,sCAAsC,QAavD;AAED,MAAM,iBAAiB,GAAG,IAAI,GAAG,CAAyC;;;CAGzE,CAAC,CAAC;AAEH;;GAEG;AACH,SAAS,kDAAkD,CAC1D,OAAqC;IAErC,2EAA2E;IAC3E,yDAAiD;AAClD,CAAC;AAED;;GAEG;AACH,MAAa,4BACZ,SAAQ,8BAA2D;IAKnE,YACkB,kBAAsC,EACvD,gBAAkC,EAClC,YAA2B,EAC3B,OAA2B;QAE3B,MAAM,iBAAiB,GAAG,OAAO,IAAI;YACpC,aAAa,EAAE,8BAAmB;YAClC,mBAAmB,EAAE,6BAAkB,CAAC,IAAI;SAC5C,CAAC;QACF,KAAK,CACJ,oBAAoB,EACpB,kDAAkD,CACjD,iBAAiB,CAAC,mBAAmB,CACrC,EACD,iBAAiB,EACjB,IAAI,CACJ,CAAC;QAhBe,uBAAkB,GAAlB,kBAAkB,CAAoB;QAiBvD,IAAI,CAAC,KAAK,GAAG,yCAA8B,CAAC,KAAK,CAAC;YACjD,GAAG,iBAAiB;YACpB,gBAAgB;YAChB,YAAY;SACZ,CAAC,CAAC;IACJ,CAAC;IAES,iBAAiB,CAAC,KAO3B;QACA,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,GAAG,KAAK,CAAC;QACrC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,kBAAkB,CAAC,cAAc,EAAE,CAAC,CAAC;QACzE,OAAO,CAAC,OAAO,CAAC,iCAAyB,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;IAC7D,CAAC;IAES,KAAK,CAAC,YAAY,CAC3B,QAAgC,EAChC,KAA2B;QAE3B,IAAI,MAAM,QAAQ,CAAC,QAAQ,CAAC,iCAAyB,CAAC,EAAE,CAAC;YACxD,MAAM,wBAAwB,GAAG,MAAM,QAAQ,CAAC,QAAQ,CAAC,iCAAyB,CAAC,CAAC;YACpF,MAAM,gBAAgB,GAAG,IAAA,6BAAc,EAAC,wBAAwB,EAAE,MAAM,CAAC,CAAC;YAC1E,MAAM,MAAM,GAAG,KAAK,CAAC,gBAAgB,CAA2B,CAAC;YACjE,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YAC1C,IAAI,CAAC,kBAAkB,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QAC3C,CAAC;IACF,CAAC;CACD;AAxDD,oEAwDC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { bufferToString } from \"@fluid-internal/client-utils\";\nimport type { IChannelStorageService } from \"@fluidframework/datastore-definitions/internal\";\nimport type { IIdCompressor } from \"@fluidframework/id-compressor\";\nimport type {\n\tIExperimentalIncrementalSummaryContext,\n\tITelemetryContext,\n\tOldestSupportedClientVersion,\n} from \"@fluidframework/runtime-definitions/internal\";\nimport type { SummaryTreeBuilder } from \"@fluidframework/runtime-utils/internal\";\n\nimport {\n\ttype CodecWriteOptions,\n\tFluidClientVersion,\n\tFormatValidatorNoOp,\n\ttype IJsonCodec,\n} from \"../codec/index.js\";\nimport {\n\ttype DetachedFieldIndex,\n\ttype DetachedFieldSummaryData,\n\ttype RevisionTagCodec,\n\tdetachedFieldIndexCodecBuilder,\n} from \"../core/index.js\";\nimport {\n\ttype Summarizable,\n\ttype SummaryElementParser,\n\ttype SummaryElementStringifier,\n\tVersionedSummarizer,\n} from \"../shared-tree-core/index.js\";\nimport type { JsonCompatibleReadOnly } from \"../util/index.js\";\n\n/**\n * The storage key for the blob in the summary containing schema data\n */\nexport const detachedFieldIndexBlobKey = \"DetachedFieldIndexBlob\";\n\n/**\n * The versions for the detached field index summary format.\n */\nexport const enum DetachedFieldIndexSummaryFormatVersion {\n\t/**\n\t * This version represents summary format before summary versioning was introduced.\n\t */\n\tv1 = 1,\n\t/**\n\t * This version adds metadata to the summary. This is backward compatible with version 1.\n\t */\n\tv2 = 2,\n\t/**\n\t * The latest version of the summary. Must be updated when a new version is added.\n\t */\n\tvLatest = v2,\n}\n\nconst supportedVersions = new Set<DetachedFieldIndexSummaryFormatVersion>([\n\tDetachedFieldIndexSummaryFormatVersion.v1,\n\tDetachedFieldIndexSummaryFormatVersion.v2,\n]);\n\n/**\n * Returns the summary version to use as per the given minimum version for collab.\n */\nfunction minVersionToDetachedFieldIndexSummaryFormatVersion(\n\tversion: OldestSupportedClientVersion,\n): DetachedFieldIndexSummaryFormatVersion {\n\t// Currently, version 2 is written which adds metadata blob to the summary.\n\treturn DetachedFieldIndexSummaryFormatVersion.v2;\n}\n\n/**\n * Provides methods for summarizing and loading a tree index.\n */\nexport class DetachedFieldIndexSummarizer\n\textends VersionedSummarizer<DetachedFieldIndexSummaryFormatVersion>\n\timplements Summarizable\n{\n\tprivate readonly codec: IJsonCodec<DetachedFieldSummaryData>;\n\n\tpublic constructor(\n\t\tprivate readonly detachedFieldIndex: DetachedFieldIndex,\n\t\trevisionTagCodec: RevisionTagCodec,\n\t\tidCompressor: IIdCompressor,\n\t\toptions?: CodecWriteOptions,\n\t) {\n\t\tconst normalizedOptions = options ?? {\n\t\t\tjsonValidator: FormatValidatorNoOp,\n\t\t\tminVersionForCollab: FluidClientVersion.v2_0,\n\t\t};\n\t\tsuper(\n\t\t\t\"DetachedFieldIndex\",\n\t\t\tminVersionToDetachedFieldIndexSummaryFormatVersion(\n\t\t\t\tnormalizedOptions.minVersionForCollab,\n\t\t\t),\n\t\t\tsupportedVersions,\n\t\t\ttrue,\n\t\t);\n\t\tthis.codec = detachedFieldIndexCodecBuilder.build({\n\t\t\t...normalizedOptions,\n\t\t\trevisionTagCodec,\n\t\t\tidCompressor,\n\t\t});\n\t}\n\n\tprotected summarizeInternal(props: {\n\t\tstringify: SummaryElementStringifier;\n\t\tfullTree?: boolean;\n\t\ttrackState?: boolean;\n\t\ttelemetryContext?: ITelemetryContext;\n\t\tincrementalSummaryContext?: IExperimentalIncrementalSummaryContext;\n\t\tbuilder: SummaryTreeBuilder;\n\t}): void {\n\t\tconst { stringify, builder } = props;\n\t\tconst data = this.codec.encode(this.detachedFieldIndex.getSummaryData());\n\t\tbuilder.addBlob(detachedFieldIndexBlobKey, stringify(data));\n\t}\n\n\tprotected async loadInternal(\n\t\tservices: IChannelStorageService,\n\t\tparse: SummaryElementParser,\n\t): Promise<void> {\n\t\tif (await services.contains(detachedFieldIndexBlobKey)) {\n\t\t\tconst detachedFieldIndexBuffer = await services.readBlob(detachedFieldIndexBlobKey);\n\t\t\tconst treeBufferString = bufferToString(detachedFieldIndexBuffer, \"utf8\");\n\t\t\tconst parsed = parse(treeBufferString) as JsonCompatibleReadOnly;\n\t\t\tconst decoded = this.codec.decode(parsed);\n\t\t\tthis.detachedFieldIndex.loadData(decoded);\n\t\t}\n\t}\n}\n"]}
|
|
@@ -9,6 +9,7 @@ import type { SummaryTreeBuilder } from "@fluidframework/runtime-utils/internal"
|
|
|
9
9
|
import type { CodecWriteOptions } from "../../codec/index.js";
|
|
10
10
|
import { type IEditableForest } from "../../core/index.js";
|
|
11
11
|
import { VersionedSummarizer, type Summarizable, type SummaryElementParser, type SummaryElementStringifier } from "../../shared-tree-core/index.js";
|
|
12
|
+
import { type Breakable } from "../../util/index.js";
|
|
12
13
|
import { type FieldBatchDecodingContext, type FieldBatchEncodingContext, type IncrementalEncodingPolicy } from "../chunked-forest/index.js";
|
|
13
14
|
import { ForestSummaryFormatVersion } from "./summaryFormatCommon.js";
|
|
14
15
|
/**
|
|
@@ -20,6 +21,10 @@ export declare class ForestSummarizer extends VersionedSummarizer<ForestSummaryF
|
|
|
20
21
|
private readonly decoderContext;
|
|
21
22
|
private readonly idCompressor;
|
|
22
23
|
private readonly codec;
|
|
24
|
+
/**
|
|
25
|
+
* This object is broken if and only if the forest it owns is broken.
|
|
26
|
+
*/
|
|
27
|
+
get breaker(): Breakable;
|
|
23
28
|
private readonly incrementalSummaryBuilder;
|
|
24
29
|
private readonly forestRootSummaryContentKey;
|
|
25
30
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"forestSummarizer.d.ts","sourceRoot":"","sources":["../../../src/feature-libraries/forest-summary/forestSummarizer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,gDAAgD,CAAC;AAC7F,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AACnE,OAAO,KAAK,EACX,sCAAsC,EACtC,iBAAiB,EACjB,MAAM,8CAA8C,CAAC;AACtD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,wCAAwC,CAAC;AAEjF,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EAIN,KAAK,eAAe,EAOpB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACN,mBAAmB,EACnB,KAAK,YAAY,EACjB,KAAK,oBAAoB,EACzB,KAAK,yBAAyB,EAC9B,MAAM,iCAAiC,CAAC;
|
|
1
|
+
{"version":3,"file":"forestSummarizer.d.ts","sourceRoot":"","sources":["../../../src/feature-libraries/forest-summary/forestSummarizer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,gDAAgD,CAAC;AAC7F,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AACnE,OAAO,KAAK,EACX,sCAAsC,EACtC,iBAAiB,EACjB,MAAM,8CAA8C,CAAC;AACtD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,wCAAwC,CAAC;AAEjF,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EAIN,KAAK,eAAe,EAOpB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACN,mBAAmB,EACnB,KAAK,YAAY,EACjB,KAAK,oBAAoB,EACzB,KAAK,yBAAyB,EAC9B,MAAM,iCAAiC,CAAC;AACzC,OAAO,EAIN,KAAK,SAAS,EAEd,MAAM,qBAAqB,CAAC;AAG7B,OAAO,EAEN,KAAK,yBAAyB,EAC9B,KAAK,yBAAyB,EAC9B,KAAK,yBAAyB,EAC9B,MAAM,4BAA4B,CAAC;AAQpC,OAAO,EACN,0BAA0B,EAG1B,MAAM,0BAA0B,CAAC;AAMlC;;GAEG;AACH,qBAAa,gBACZ,SAAQ,mBAAmB,CAAC,0BAA0B,CACtD,YAAW,YAAY;IAkBtB,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,cAAc;IAC/B,OAAO,CAAC,QAAQ,CAAC,cAAc;IAE/B,OAAO,CAAC,QAAQ,CAAC,YAAY;IApB9B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAc;IAEpC;;OAEG;IACH,IAAW,OAAO,IAAI,SAAS,CAE9B;IAED,OAAO,CAAC,QAAQ,CAAC,yBAAyB,CAAkC;IAC5E,OAAO,CAAC,QAAQ,CAAC,2BAA2B,CAAS;IAErD;;OAEG;gBAEe,MAAM,EAAE,eAAe,EACvB,cAAc,EAAE,yBAAyB,EACzC,cAAc,EAAE,yBAAyB,EAC1D,OAAO,EAAE,iBAAiB,EACT,YAAY,EAAE,aAAa,EAC5C,qBAAqB,EAAE,MAAM,EAC7B,yBAAyB,GAAE,yBAA4D;IAgCxF;;;;;;;;;OASG;IACH,SAAS,CAAC,iBAAiB,CAAC,KAAK,EAAE;QAClC,SAAS,EAAE,yBAAyB,CAAC;QACrC,QAAQ,CAAC,EAAE,OAAO,CAAC;QACnB,UAAU,CAAC,EAAE,OAAO,CAAC;QACrB,gBAAgB,CAAC,EAAE,iBAAiB,CAAC;QACrC,yBAAyB,CAAC,EAAE,sCAAsC,CAAC;QACnE,OAAO,EAAE,kBAAkB,CAAC;KAC5B,GAAG,IAAI;cA+CQ,YAAY,CAC3B,QAAQ,EAAE,sBAAsB,EAChC,KAAK,EAAE,oBAAoB,EAC3B,OAAO,EAAE,0BAA0B,GAAG,SAAS,GAC7C,OAAO,CAAC,IAAI,CAAC;CA2DhB"}
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
*/
|
|
6
6
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
7
|
exports.ForestSummarizer = void 0;
|
|
8
|
+
const tslib_1 = require("tslib");
|
|
8
9
|
const internal_1 = require("@fluidframework/core-utils/internal");
|
|
9
10
|
const index_js_1 = require("../../core/index.js");
|
|
10
11
|
const index_js_2 = require("../../shared-tree-core/index.js");
|
|
@@ -20,112 +21,131 @@ const summaryTypes_js_1 = require("./summaryTypes.js");
|
|
|
20
21
|
/**
|
|
21
22
|
* Provides methods for summarizing and loading a forest.
|
|
22
23
|
*/
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
fieldKey,
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
24
|
+
let ForestSummarizer = (() => {
|
|
25
|
+
var _a;
|
|
26
|
+
let _classSuper = index_js_2.VersionedSummarizer;
|
|
27
|
+
let _instanceExtraInitializers = [];
|
|
28
|
+
let _loadInternal_decorators;
|
|
29
|
+
return _a = class ForestSummarizer extends _classSuper {
|
|
30
|
+
/**
|
|
31
|
+
* This object is broken if and only if the forest it owns is broken.
|
|
32
|
+
*/
|
|
33
|
+
get breaker() {
|
|
34
|
+
return this.forest.breaker;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* @param encoderContext - The schema if provided here must be mutated by the caller to keep it up to date.
|
|
38
|
+
*/
|
|
39
|
+
constructor(forest, encoderContext, decoderContext, options, idCompressor, initialSequenceNumber, shouldEncodeIncrementally = index_js_4.defaultIncrementalEncodingPolicy) {
|
|
40
|
+
super(summaryFormatCommon_js_1.forestSummaryKey, (0, summaryTypes_js_1.minVersionToForestSummaryFormatVersion)(options.minVersionForCollab), summaryFormatCommon_js_1.supportedForestSummaryFormatVersions, true /* supportPreVersioningFormat */);
|
|
41
|
+
this.forest = (tslib_1.__runInitializers(this, _instanceExtraInitializers), forest);
|
|
42
|
+
this.encoderContext = encoderContext;
|
|
43
|
+
this.decoderContext = decoderContext;
|
|
44
|
+
this.idCompressor = idCompressor;
|
|
45
|
+
this.codec = codec_js_1.forestCodecBuilder.build(options);
|
|
46
|
+
const summaryFormatWriteVersion = (0, summaryTypes_js_1.minVersionToForestSummaryFormatVersion)(options.minVersionForCollab);
|
|
47
|
+
this.forestRootSummaryContentKey = (0, summaryTypes_js_1.getForestRootSummaryContentKey)(summaryFormatWriteVersion);
|
|
48
|
+
// Incremental summary is supported in ForestSummaryFormatVersion.v3 onwards.
|
|
49
|
+
// Note that even in versions that support it, it is possible that the
|
|
50
|
+
// FieldBatchCodec will not use incremental encoding (for example if using its v1 formats which does not support it).
|
|
51
|
+
const enableIncrementalSummary = summaryFormatWriteVersion >= summaryFormatCommon_js_1.ForestSummaryFormatVersion.v3 &&
|
|
52
|
+
encoderContext.encodeType === treeCompressionUtils_js_1.TreeCompressionStrategy.CompressedIncremental;
|
|
53
|
+
this.incrementalSummaryBuilder = new incrementalSummaryBuilder_js_1.ForestIncrementalSummaryBuilder(enableIncrementalSummary, (cursor) => this.forest.chunkField(cursor), shouldEncodeIncrementally, initialSequenceNumber);
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Summarization of the forest's tree content.
|
|
57
|
+
* @returns a summary tree containing the forest's tree content.
|
|
58
|
+
* @remarks
|
|
59
|
+
* If incremental summary is disabled, all the content will be added to a single summary blob.
|
|
60
|
+
* If incremental summary is enabled, the summary will be a tree.
|
|
61
|
+
* See {@link ForestIncrementalSummaryBuilder} for details of what this tree looks like.
|
|
62
|
+
*
|
|
63
|
+
* TODO: when perf matters, this should be replaced with a chunked async version using a binary format.
|
|
64
|
+
*/
|
|
65
|
+
summarizeInternal(props) {
|
|
66
|
+
const { stringify, fullTree = false, incrementalSummaryContext, builder } = props;
|
|
67
|
+
const rootCursor = this.forest.getCursorAboveDetachedFields();
|
|
68
|
+
const fieldMap = new Map();
|
|
69
|
+
// TODO: Encode all detached fields in one operation for better performance and compression
|
|
70
|
+
(0, index_js_1.forEachField)(rootCursor, (cursor) => {
|
|
71
|
+
const key = cursor.getFieldKey();
|
|
72
|
+
const innerCursor = this.forest.allocateCursor("getTreeString");
|
|
73
|
+
(0, internal_1.assert)(this.forest.tryMoveCursorToField({ fieldKey: key, parent: undefined }, innerCursor) ===
|
|
74
|
+
1 /* TreeNavigationResult.Ok */, 0x892 /* failed to navigate to field */);
|
|
75
|
+
fieldMap.set(key, innerCursor);
|
|
76
|
+
});
|
|
77
|
+
// Let the incremental summary builder know that we are starting a new summary.
|
|
78
|
+
// It returns whether incremental encoding is enabled.
|
|
79
|
+
const incrementalSummaryBehavior = this.incrementalSummaryBuilder.startSummary({
|
|
80
|
+
fullTree,
|
|
81
|
+
incrementalSummaryContext,
|
|
82
|
+
stringify,
|
|
83
|
+
builder,
|
|
84
|
+
});
|
|
85
|
+
const encoderContext = {
|
|
86
|
+
...this.encoderContext,
|
|
87
|
+
incrementalEncoder: incrementalSummaryBehavior === incrementalSummaryBuilder_js_1.ForestIncrementalSummaryBehavior.Incremental
|
|
88
|
+
? this.incrementalSummaryBuilder
|
|
89
|
+
: undefined,
|
|
90
|
+
};
|
|
91
|
+
const encoded = this.codec.encode(fieldMap, encoderContext);
|
|
92
|
+
for (const value of fieldMap.values()) {
|
|
93
|
+
value.free();
|
|
94
|
+
}
|
|
95
|
+
this.incrementalSummaryBuilder.completeSummary({
|
|
96
|
+
incrementalSummaryContext,
|
|
97
|
+
forestSummaryRootContent: stringify(encoded),
|
|
98
|
+
forestSummaryRootContentKey: this.forestRootSummaryContentKey,
|
|
99
|
+
builder,
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
async loadInternal(services, parse, version) {
|
|
103
|
+
// Get the key of the summary blob where the top-level forest content is stored based on the summary format version.
|
|
104
|
+
// If the summary was generated as `ForestIncrementalSummaryBehavior.SingleBlob`, this blob will contain all
|
|
105
|
+
// of forest's contents.
|
|
106
|
+
// If the summary was generated as `ForestIncrementalSummaryBehavior.Incremental`, this blob will contain only
|
|
107
|
+
// the top-level forest node's contents.
|
|
108
|
+
// The contents of the incremental chunks will be in separate tree nodes and will be read later during decoding.
|
|
109
|
+
const forestSummaryRootContentKey = (0, summaryTypes_js_1.getForestRootSummaryContentKey)(version);
|
|
110
|
+
(0, internal_1.assert)(await services.contains(forestSummaryRootContentKey), 0xc21 /* Forest summary content missing in snapshot */);
|
|
111
|
+
// Load the incremental summary builder so that it can download any incremental chunks in the
|
|
112
|
+
// snapshot.
|
|
113
|
+
await this.incrementalSummaryBuilder.load({
|
|
114
|
+
services,
|
|
115
|
+
readAndParseChunk: async (chunkBlobPath) => (0, index_js_3.readAndParseSnapshotBlob)(chunkBlobPath, services, parse),
|
|
116
|
+
});
|
|
117
|
+
// TODO: this code is parsing data without an optional validator, this should be defined in a typebox schema as part of the
|
|
118
|
+
// forest summary format.
|
|
119
|
+
const fields = this.codec.decode((await (0, index_js_3.readAndParseSnapshotBlob)(forestSummaryRootContentKey, services, parse)), this.decoderContext.withIncrementalDecoder(this.incrementalSummaryBuilder));
|
|
120
|
+
const allocator = (0, index_js_3.idAllocatorFromMaxId)();
|
|
121
|
+
const fieldChanges = [];
|
|
122
|
+
const build = [];
|
|
123
|
+
for (const [fieldKey, field] of fields) {
|
|
124
|
+
const chunked = (0, chunkTree_js_1.chunkFieldSingle)(field, {
|
|
125
|
+
policy: chunkTree_js_1.defaultChunkPolicy,
|
|
126
|
+
idCompressor: this.idCompressor,
|
|
127
|
+
});
|
|
128
|
+
const buildId = { minor: allocator.allocate(chunked.topLevelLength) };
|
|
129
|
+
build.push({
|
|
130
|
+
id: buildId,
|
|
131
|
+
trees: chunked,
|
|
132
|
+
});
|
|
133
|
+
fieldChanges.push([
|
|
134
|
+
fieldKey,
|
|
135
|
+
{ marks: [{ count: chunked.topLevelLength, attach: buildId }] },
|
|
136
|
+
]);
|
|
137
|
+
}
|
|
138
|
+
(0, internal_1.assert)(this.forest.isEmpty, 0x797 /* forest must be empty */);
|
|
139
|
+
(0, index_js_1.applyDelta)({ build, fields: new Map(fieldChanges) }, undefined, this.forest, (0, index_js_1.makeDetachedFieldIndex)("init"));
|
|
140
|
+
}
|
|
141
|
+
},
|
|
142
|
+
(() => {
|
|
143
|
+
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
|
|
144
|
+
_loadInternal_decorators = [index_js_3.breakingMethod];
|
|
145
|
+
tslib_1.__esDecorate(_a, null, _loadInternal_decorators, { kind: "method", name: "loadInternal", static: false, private: false, access: { has: obj => "loadInternal" in obj, get: obj => obj.loadInternal }, metadata: _metadata }, null, _instanceExtraInitializers);
|
|
146
|
+
if (_metadata) Object.defineProperty(_a, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
|
|
147
|
+
})(),
|
|
148
|
+
_a;
|
|
149
|
+
})();
|
|
130
150
|
exports.ForestSummarizer = ForestSummarizer;
|
|
131
151
|
//# sourceMappingURL=forestSummarizer.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"forestSummarizer.js","sourceRoot":"","sources":["../../../src/feature-libraries/forest-summary/forestSummarizer.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { assert } from \"@fluidframework/core-utils/internal\";\nimport type { IChannelStorageService } from \"@fluidframework/datastore-definitions/internal\";\nimport type { IIdCompressor } from \"@fluidframework/id-compressor\";\nimport type {\n\tIExperimentalIncrementalSummaryContext,\n\tITelemetryContext,\n} from \"@fluidframework/runtime-definitions/internal\";\nimport type { SummaryTreeBuilder } from \"@fluidframework/runtime-utils/internal\";\n\nimport type { CodecWriteOptions } from \"../../codec/index.js\";\nimport {\n\ttype DeltaDetachedNodeBuild,\n\ttype DeltaFieldChanges,\n\ttype FieldKey,\n\ttype IEditableForest,\n\ttype ITreeCursorSynchronous,\n\ttype ITreeSubscriptionCursor,\n\tTreeNavigationResult,\n\tapplyDelta,\n\tforEachField,\n\tmakeDetachedFieldIndex,\n} from \"../../core/index.js\";\nimport {\n\tVersionedSummarizer,\n\ttype Summarizable,\n\ttype SummaryElementParser,\n\ttype SummaryElementStringifier,\n} from \"../../shared-tree-core/index.js\";\nimport {\n\tidAllocatorFromMaxId,\n\treadAndParseSnapshotBlob,\n\ttype JsonCompatibleReadOnly,\n} from \"../../util/index.js\";\n// eslint-disable-next-line import-x/no-internal-modules\nimport { chunkFieldSingle, defaultChunkPolicy } from \"../chunked-forest/chunkTree.js\";\nimport {\n\tdefaultIncrementalEncodingPolicy,\n\ttype FieldBatchDecodingContext,\n\ttype FieldBatchEncodingContext,\n\ttype IncrementalEncodingPolicy,\n} from \"../chunked-forest/index.js\";\nimport { TreeCompressionStrategy } from \"../treeCompressionUtils.js\";\n\nimport { forestCodecBuilder, type ForestCodec } from \"./codec.js\";\nimport {\n\tForestIncrementalSummaryBehavior,\n\tForestIncrementalSummaryBuilder,\n} from \"./incrementalSummaryBuilder.js\";\nimport {\n\tForestSummaryFormatVersion,\n\tforestSummaryKey,\n\tsupportedForestSummaryFormatVersions,\n} from \"./summaryFormatCommon.js\";\nimport {\n\tminVersionToForestSummaryFormatVersion,\n\tgetForestRootSummaryContentKey,\n} from \"./summaryTypes.js\";\n\n/**\n * Provides methods for summarizing and loading a forest.\n */\nexport class ForestSummarizer\n\textends VersionedSummarizer<ForestSummaryFormatVersion>\n\timplements Summarizable\n{\n\tprivate readonly codec: ForestCodec;\n\n\tprivate readonly incrementalSummaryBuilder: ForestIncrementalSummaryBuilder;\n\tprivate readonly forestRootSummaryContentKey: string;\n\n\t/**\n\t * @param encoderContext - The schema if provided here must be mutated by the caller to keep it up to date.\n\t */\n\tpublic constructor(\n\t\tprivate readonly forest: IEditableForest,\n\t\tprivate readonly encoderContext: FieldBatchEncodingContext,\n\t\tprivate readonly decoderContext: FieldBatchDecodingContext,\n\t\toptions: CodecWriteOptions,\n\t\tprivate readonly idCompressor: IIdCompressor,\n\t\tinitialSequenceNumber: number,\n\t\tshouldEncodeIncrementally: IncrementalEncodingPolicy = defaultIncrementalEncodingPolicy,\n\t) {\n\t\tsuper(\n\t\t\tforestSummaryKey,\n\t\t\tminVersionToForestSummaryFormatVersion(options.minVersionForCollab),\n\t\t\tsupportedForestSummaryFormatVersions,\n\t\t\ttrue /* supportPreVersioningFormat */,\n\t\t);\n\n\t\tthis.codec = forestCodecBuilder.build(options);\n\n\t\tconst summaryFormatWriteVersion = minVersionToForestSummaryFormatVersion(\n\t\t\toptions.minVersionForCollab,\n\t\t);\n\t\tthis.forestRootSummaryContentKey = getForestRootSummaryContentKey(\n\t\t\tsummaryFormatWriteVersion,\n\t\t);\n\n\t\t// Incremental summary is supported in ForestSummaryFormatVersion.v3 onwards.\n\t\t// Note that even in versions that support it, it is possible that the\n\t\t// FieldBatchCodec will not use incremental encoding (for example if using its v1 formats which does not support it).\n\t\tconst enableIncrementalSummary =\n\t\t\tsummaryFormatWriteVersion >= ForestSummaryFormatVersion.v3 &&\n\t\t\tencoderContext.encodeType === TreeCompressionStrategy.CompressedIncremental;\n\t\tthis.incrementalSummaryBuilder = new ForestIncrementalSummaryBuilder(\n\t\t\tenableIncrementalSummary,\n\t\t\t(cursor: ITreeCursorSynchronous) => this.forest.chunkField(cursor),\n\t\t\tshouldEncodeIncrementally,\n\t\t\tinitialSequenceNumber,\n\t\t);\n\t}\n\n\t/**\n\t * Summarization of the forest's tree content.\n\t * @returns a summary tree containing the forest's tree content.\n\t * @remarks\n\t * If incremental summary is disabled, all the content will be added to a single summary blob.\n\t * If incremental summary is enabled, the summary will be a tree.\n\t * See {@link ForestIncrementalSummaryBuilder} for details of what this tree looks like.\n\t *\n\t * TODO: when perf matters, this should be replaced with a chunked async version using a binary format.\n\t */\n\tprotected summarizeInternal(props: {\n\t\tstringify: SummaryElementStringifier;\n\t\tfullTree?: boolean;\n\t\ttrackState?: boolean;\n\t\ttelemetryContext?: ITelemetryContext;\n\t\tincrementalSummaryContext?: IExperimentalIncrementalSummaryContext;\n\t\tbuilder: SummaryTreeBuilder;\n\t}): void {\n\t\tconst { stringify, fullTree = false, incrementalSummaryContext, builder } = props;\n\n\t\tconst rootCursor = this.forest.getCursorAboveDetachedFields();\n\t\tconst fieldMap: Map<FieldKey, ITreeCursorSynchronous & ITreeSubscriptionCursor> =\n\t\t\tnew Map();\n\t\t// TODO: Encode all detached fields in one operation for better performance and compression\n\t\tforEachField(rootCursor, (cursor) => {\n\t\t\tconst key = cursor.getFieldKey();\n\t\t\tconst innerCursor = this.forest.allocateCursor(\"getTreeString\");\n\t\t\tassert(\n\t\t\t\tthis.forest.tryMoveCursorToField({ fieldKey: key, parent: undefined }, innerCursor) ===\n\t\t\t\t\tTreeNavigationResult.Ok,\n\t\t\t\t0x892 /* failed to navigate to field */,\n\t\t\t);\n\t\t\tfieldMap.set(key, innerCursor as ITreeCursorSynchronous & ITreeSubscriptionCursor);\n\t\t});\n\n\t\t// Let the incremental summary builder know that we are starting a new summary.\n\t\t// It returns whether incremental encoding is enabled.\n\t\tconst incrementalSummaryBehavior = this.incrementalSummaryBuilder.startSummary({\n\t\t\tfullTree,\n\t\t\tincrementalSummaryContext,\n\t\t\tstringify,\n\t\t\tbuilder,\n\t\t});\n\t\tconst encoderContext: FieldBatchEncodingContext = {\n\t\t\t...this.encoderContext,\n\t\t\tincrementalEncoder:\n\t\t\t\tincrementalSummaryBehavior === ForestIncrementalSummaryBehavior.Incremental\n\t\t\t\t\t? this.incrementalSummaryBuilder\n\t\t\t\t\t: undefined,\n\t\t};\n\t\tconst encoded = this.codec.encode(fieldMap, encoderContext);\n\t\tfor (const value of fieldMap.values()) {\n\t\t\tvalue.free();\n\t\t}\n\n\t\tthis.incrementalSummaryBuilder.completeSummary({\n\t\t\tincrementalSummaryContext,\n\t\t\tforestSummaryRootContent: stringify(encoded),\n\t\t\tforestSummaryRootContentKey: this.forestRootSummaryContentKey,\n\t\t\tbuilder,\n\t\t});\n\t}\n\n\tprotected async loadInternal(\n\t\tservices: IChannelStorageService,\n\t\tparse: SummaryElementParser,\n\t\tversion: ForestSummaryFormatVersion | undefined,\n\t): Promise<void> {\n\t\t// Get the key of the summary blob where the top-level forest content is stored based on the summary format version.\n\t\t// If the summary was generated as `ForestIncrementalSummaryBehavior.SingleBlob`, this blob will contain all\n\t\t// of forest's contents.\n\t\t// If the summary was generated as `ForestIncrementalSummaryBehavior.Incremental`, this blob will contain only\n\t\t// the top-level forest node's contents.\n\t\t// The contents of the incremental chunks will be in separate tree nodes and will be read later during decoding.\n\t\tconst forestSummaryRootContentKey = getForestRootSummaryContentKey(version);\n\t\tassert(\n\t\t\tawait services.contains(forestSummaryRootContentKey),\n\t\t\t0xc21 /* Forest summary content missing in snapshot */,\n\t\t);\n\n\t\t// Load the incremental summary builder so that it can download any incremental chunks in the\n\t\t// snapshot.\n\t\tawait this.incrementalSummaryBuilder.load({\n\t\t\tservices,\n\t\t\treadAndParseChunk: async (chunkBlobPath: string) =>\n\t\t\t\treadAndParseSnapshotBlob(chunkBlobPath, services, parse),\n\t\t});\n\n\t\t// TODO: this code is parsing data without an optional validator, this should be defined in a typebox schema as part of the\n\t\t// forest summary format.\n\t\tconst fields = this.codec.decode(\n\t\t\t(await readAndParseSnapshotBlob(\n\t\t\t\tforestSummaryRootContentKey,\n\t\t\t\tservices,\n\t\t\t\tparse,\n\t\t\t\t// TODO: this type cast assumes there are no handles, which should probably be enforced at runtime or the need for this cast should be removed altogether.\n\t\t\t)) as JsonCompatibleReadOnly,\n\t\t\tthis.decoderContext.withIncrementalDecoder(this.incrementalSummaryBuilder),\n\t\t);\n\t\tconst allocator = idAllocatorFromMaxId();\n\t\tconst fieldChanges: [FieldKey, DeltaFieldChanges][] = [];\n\t\tconst build: DeltaDetachedNodeBuild[] = [];\n\t\tfor (const [fieldKey, field] of fields) {\n\t\t\tconst chunked = chunkFieldSingle(field, {\n\t\t\t\tpolicy: defaultChunkPolicy,\n\t\t\t\tidCompressor: this.idCompressor,\n\t\t\t});\n\t\t\tconst buildId = { minor: allocator.allocate(chunked.topLevelLength) };\n\t\t\tbuild.push({\n\t\t\t\tid: buildId,\n\t\t\t\ttrees: chunked,\n\t\t\t});\n\t\t\tfieldChanges.push([\n\t\t\t\tfieldKey,\n\t\t\t\t{ marks: [{ count: chunked.topLevelLength, attach: buildId }] },\n\t\t\t]);\n\t\t}\n\n\t\tassert(this.forest.isEmpty, 0x797 /* forest must be empty */);\n\t\tapplyDelta(\n\t\t\t{ build, fields: new Map(fieldChanges) },\n\t\t\tundefined,\n\t\t\tthis.forest,\n\t\t\tmakeDetachedFieldIndex(\"init\"),\n\t\t);\n\t}\n}\n"]}
|
|
1
|
+
{"version":3,"file":"forestSummarizer.js","sourceRoot":"","sources":["../../../src/feature-libraries/forest-summary/forestSummarizer.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { assert } from \"@fluidframework/core-utils/internal\";\nimport type { IChannelStorageService } from \"@fluidframework/datastore-definitions/internal\";\nimport type { IIdCompressor } from \"@fluidframework/id-compressor\";\nimport type {\n\tIExperimentalIncrementalSummaryContext,\n\tITelemetryContext,\n} from \"@fluidframework/runtime-definitions/internal\";\nimport type { SummaryTreeBuilder } from \"@fluidframework/runtime-utils/internal\";\n\nimport type { CodecWriteOptions } from \"../../codec/index.js\";\nimport {\n\ttype DeltaDetachedNodeBuild,\n\ttype DeltaFieldChanges,\n\ttype FieldKey,\n\ttype IEditableForest,\n\ttype ITreeCursorSynchronous,\n\ttype ITreeSubscriptionCursor,\n\tTreeNavigationResult,\n\tapplyDelta,\n\tforEachField,\n\tmakeDetachedFieldIndex,\n} from \"../../core/index.js\";\nimport {\n\tVersionedSummarizer,\n\ttype Summarizable,\n\ttype SummaryElementParser,\n\ttype SummaryElementStringifier,\n} from \"../../shared-tree-core/index.js\";\nimport {\n\tbreakingMethod,\n\tidAllocatorFromMaxId,\n\treadAndParseSnapshotBlob,\n\ttype Breakable,\n\ttype JsonCompatibleReadOnly,\n} from \"../../util/index.js\";\n// eslint-disable-next-line import-x/no-internal-modules\nimport { chunkFieldSingle, defaultChunkPolicy } from \"../chunked-forest/chunkTree.js\";\nimport {\n\tdefaultIncrementalEncodingPolicy,\n\ttype FieldBatchDecodingContext,\n\ttype FieldBatchEncodingContext,\n\ttype IncrementalEncodingPolicy,\n} from \"../chunked-forest/index.js\";\nimport { TreeCompressionStrategy } from \"../treeCompressionUtils.js\";\n\nimport { forestCodecBuilder, type ForestCodec } from \"./codec.js\";\nimport {\n\tForestIncrementalSummaryBehavior,\n\tForestIncrementalSummaryBuilder,\n} from \"./incrementalSummaryBuilder.js\";\nimport {\n\tForestSummaryFormatVersion,\n\tforestSummaryKey,\n\tsupportedForestSummaryFormatVersions,\n} from \"./summaryFormatCommon.js\";\nimport {\n\tminVersionToForestSummaryFormatVersion,\n\tgetForestRootSummaryContentKey,\n} from \"./summaryTypes.js\";\n\n/**\n * Provides methods for summarizing and loading a forest.\n */\nexport class ForestSummarizer\n\textends VersionedSummarizer<ForestSummaryFormatVersion>\n\timplements Summarizable\n{\n\tprivate readonly codec: ForestCodec;\n\n\t/**\n\t * This object is broken if and only if the forest it owns is broken.\n\t */\n\tpublic get breaker(): Breakable {\n\t\treturn this.forest.breaker;\n\t}\n\n\tprivate readonly incrementalSummaryBuilder: ForestIncrementalSummaryBuilder;\n\tprivate readonly forestRootSummaryContentKey: string;\n\n\t/**\n\t * @param encoderContext - The schema if provided here must be mutated by the caller to keep it up to date.\n\t */\n\tpublic constructor(\n\t\tprivate readonly forest: IEditableForest,\n\t\tprivate readonly encoderContext: FieldBatchEncodingContext,\n\t\tprivate readonly decoderContext: FieldBatchDecodingContext,\n\t\toptions: CodecWriteOptions,\n\t\tprivate readonly idCompressor: IIdCompressor,\n\t\tinitialSequenceNumber: number,\n\t\tshouldEncodeIncrementally: IncrementalEncodingPolicy = defaultIncrementalEncodingPolicy,\n\t) {\n\t\tsuper(\n\t\t\tforestSummaryKey,\n\t\t\tminVersionToForestSummaryFormatVersion(options.minVersionForCollab),\n\t\t\tsupportedForestSummaryFormatVersions,\n\t\t\ttrue /* supportPreVersioningFormat */,\n\t\t);\n\n\t\tthis.codec = forestCodecBuilder.build(options);\n\n\t\tconst summaryFormatWriteVersion = minVersionToForestSummaryFormatVersion(\n\t\t\toptions.minVersionForCollab,\n\t\t);\n\t\tthis.forestRootSummaryContentKey = getForestRootSummaryContentKey(\n\t\t\tsummaryFormatWriteVersion,\n\t\t);\n\n\t\t// Incremental summary is supported in ForestSummaryFormatVersion.v3 onwards.\n\t\t// Note that even in versions that support it, it is possible that the\n\t\t// FieldBatchCodec will not use incremental encoding (for example if using its v1 formats which does not support it).\n\t\tconst enableIncrementalSummary =\n\t\t\tsummaryFormatWriteVersion >= ForestSummaryFormatVersion.v3 &&\n\t\t\tencoderContext.encodeType === TreeCompressionStrategy.CompressedIncremental;\n\t\tthis.incrementalSummaryBuilder = new ForestIncrementalSummaryBuilder(\n\t\t\tenableIncrementalSummary,\n\t\t\t(cursor: ITreeCursorSynchronous) => this.forest.chunkField(cursor),\n\t\t\tshouldEncodeIncrementally,\n\t\t\tinitialSequenceNumber,\n\t\t);\n\t}\n\n\t/**\n\t * Summarization of the forest's tree content.\n\t * @returns a summary tree containing the forest's tree content.\n\t * @remarks\n\t * If incremental summary is disabled, all the content will be added to a single summary blob.\n\t * If incremental summary is enabled, the summary will be a tree.\n\t * See {@link ForestIncrementalSummaryBuilder} for details of what this tree looks like.\n\t *\n\t * TODO: when perf matters, this should be replaced with a chunked async version using a binary format.\n\t */\n\tprotected summarizeInternal(props: {\n\t\tstringify: SummaryElementStringifier;\n\t\tfullTree?: boolean;\n\t\ttrackState?: boolean;\n\t\ttelemetryContext?: ITelemetryContext;\n\t\tincrementalSummaryContext?: IExperimentalIncrementalSummaryContext;\n\t\tbuilder: SummaryTreeBuilder;\n\t}): void {\n\t\tconst { stringify, fullTree = false, incrementalSummaryContext, builder } = props;\n\n\t\tconst rootCursor = this.forest.getCursorAboveDetachedFields();\n\t\tconst fieldMap: Map<FieldKey, ITreeCursorSynchronous & ITreeSubscriptionCursor> =\n\t\t\tnew Map();\n\t\t// TODO: Encode all detached fields in one operation for better performance and compression\n\t\tforEachField(rootCursor, (cursor) => {\n\t\t\tconst key = cursor.getFieldKey();\n\t\t\tconst innerCursor = this.forest.allocateCursor(\"getTreeString\");\n\t\t\tassert(\n\t\t\t\tthis.forest.tryMoveCursorToField({ fieldKey: key, parent: undefined }, innerCursor) ===\n\t\t\t\t\tTreeNavigationResult.Ok,\n\t\t\t\t0x892 /* failed to navigate to field */,\n\t\t\t);\n\t\t\tfieldMap.set(key, innerCursor as ITreeCursorSynchronous & ITreeSubscriptionCursor);\n\t\t});\n\n\t\t// Let the incremental summary builder know that we are starting a new summary.\n\t\t// It returns whether incremental encoding is enabled.\n\t\tconst incrementalSummaryBehavior = this.incrementalSummaryBuilder.startSummary({\n\t\t\tfullTree,\n\t\t\tincrementalSummaryContext,\n\t\t\tstringify,\n\t\t\tbuilder,\n\t\t});\n\t\tconst encoderContext: FieldBatchEncodingContext = {\n\t\t\t...this.encoderContext,\n\t\t\tincrementalEncoder:\n\t\t\t\tincrementalSummaryBehavior === ForestIncrementalSummaryBehavior.Incremental\n\t\t\t\t\t? this.incrementalSummaryBuilder\n\t\t\t\t\t: undefined,\n\t\t};\n\t\tconst encoded = this.codec.encode(fieldMap, encoderContext);\n\t\tfor (const value of fieldMap.values()) {\n\t\t\tvalue.free();\n\t\t}\n\n\t\tthis.incrementalSummaryBuilder.completeSummary({\n\t\t\tincrementalSummaryContext,\n\t\t\tforestSummaryRootContent: stringify(encoded),\n\t\t\tforestSummaryRootContentKey: this.forestRootSummaryContentKey,\n\t\t\tbuilder,\n\t\t});\n\t}\n\n\t@breakingMethod\n\tprotected async loadInternal(\n\t\tservices: IChannelStorageService,\n\t\tparse: SummaryElementParser,\n\t\tversion: ForestSummaryFormatVersion | undefined,\n\t): Promise<void> {\n\t\t// Get the key of the summary blob where the top-level forest content is stored based on the summary format version.\n\t\t// If the summary was generated as `ForestIncrementalSummaryBehavior.SingleBlob`, this blob will contain all\n\t\t// of forest's contents.\n\t\t// If the summary was generated as `ForestIncrementalSummaryBehavior.Incremental`, this blob will contain only\n\t\t// the top-level forest node's contents.\n\t\t// The contents of the incremental chunks will be in separate tree nodes and will be read later during decoding.\n\t\tconst forestSummaryRootContentKey = getForestRootSummaryContentKey(version);\n\t\tassert(\n\t\t\tawait services.contains(forestSummaryRootContentKey),\n\t\t\t0xc21 /* Forest summary content missing in snapshot */,\n\t\t);\n\n\t\t// Load the incremental summary builder so that it can download any incremental chunks in the\n\t\t// snapshot.\n\t\tawait this.incrementalSummaryBuilder.load({\n\t\t\tservices,\n\t\t\treadAndParseChunk: async (chunkBlobPath: string) =>\n\t\t\t\treadAndParseSnapshotBlob(chunkBlobPath, services, parse),\n\t\t});\n\n\t\t// TODO: this code is parsing data without an optional validator, this should be defined in a typebox schema as part of the\n\t\t// forest summary format.\n\t\tconst fields = this.codec.decode(\n\t\t\t(await readAndParseSnapshotBlob(\n\t\t\t\tforestSummaryRootContentKey,\n\t\t\t\tservices,\n\t\t\t\tparse,\n\t\t\t\t// TODO: this type cast assumes there are no handles, which should probably be enforced at runtime or the need for this cast should be removed altogether.\n\t\t\t)) as JsonCompatibleReadOnly,\n\t\t\tthis.decoderContext.withIncrementalDecoder(this.incrementalSummaryBuilder),\n\t\t);\n\t\tconst allocator = idAllocatorFromMaxId();\n\t\tconst fieldChanges: [FieldKey, DeltaFieldChanges][] = [];\n\t\tconst build: DeltaDetachedNodeBuild[] = [];\n\t\tfor (const [fieldKey, field] of fields) {\n\t\t\tconst chunked = chunkFieldSingle(field, {\n\t\t\t\tpolicy: defaultChunkPolicy,\n\t\t\t\tidCompressor: this.idCompressor,\n\t\t\t});\n\t\t\tconst buildId = { minor: allocator.allocate(chunked.topLevelLength) };\n\t\t\tbuild.push({\n\t\t\t\tid: buildId,\n\t\t\t\ttrees: chunked,\n\t\t\t});\n\t\t\tfieldChanges.push([\n\t\t\t\tfieldKey,\n\t\t\t\t{ marks: [{ count: chunked.topLevelLength, attach: buildId }] },\n\t\t\t]);\n\t\t}\n\n\t\tassert(this.forest.isEmpty, 0x797 /* forest must be empty */);\n\t\tapplyDelta(\n\t\t\t{ build, fields: new Map(fieldChanges) },\n\t\t\tundefined,\n\t\t\tthis.forest,\n\t\t\tmakeDetachedFieldIndex(\"init\"),\n\t\t);\n\t}\n}\n"]}
|