@fluidframework/tree 2.116.0-416006 → 2.116.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/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 +48 -16
- 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 +48 -16
- 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 +45 -16
- 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
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chunkedForest.js","sourceRoot":"","sources":["../../../src/feature-libraries/chunked-forest/chunkedForest.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 { createEmitter } from \"@fluid-internal/client-utils\";\nimport type { Listenable } from \"@fluidframework/core-interfaces\";\nimport { assert, oob, fail } from \"@fluidframework/core-utils/internal\";\nimport type { IIdCompressor } from \"@fluidframework/id-compressor\";\n\nimport {\n\ttype Anchor,\n\tAnchorSet,\n\ttype AnnouncedVisitor,\n\ttype DeltaVisitor,\n\ttype DetachedField,\n\ttype FieldAnchor,\n\ttype FieldKey,\n\ttype ForestEvents,\n\ttype IEditableForest,\n\ttype ITreeCursorSynchronous,\n\ttype ITreeSubscriptionCursor,\n\tITreeSubscriptionCursorState,\n\ttype PlaceIndex,\n\ttype Range,\n\tTreeNavigationResult,\n\ttype TreeStoredSchemaSubscription,\n\ttype UpPath,\n\taboveRootPlaceholder,\n\tcombineVisitors,\n\tdetachedFieldAsKey,\n\tmapCursorField,\n\trootFieldKey,\n\ttype ChunkedCursor,\n\ttype TreeChunk,\n\ttype DeltaDetachedNodeId,\n} from \"../../core/index.js\";\nimport {\n\tbrand,\n\tgetLast,\n\tgetOrAddEmptyToMap,\n\thasSome,\n\ttype Breakable,\n} from \"../../util/index.js\";\n\nimport { BasicChunk, BasicChunkCursor, type SiblingsOrKey } from \"./basicChunk.js\";\nimport {\n\ttype ChunkCompressor,\n\ttype IChunker,\n\tbasicChunkTree,\n\tchunkField,\n\tchunkTree,\n\tsplitFieldAtIndex,\n} from \"./chunkTree.js\";\n\nfunction makeRoot(): BasicChunk {\n\treturn new BasicChunk(aboveRootPlaceholder, new Map());\n}\n\ninterface StackNode {\n\tmutableChunk: BasicChunk;\n\tkey: FieldKey;\n}\n\n/**\n * Implementation of IEditableForest based on copy on write chunks.\n *\n * This implementation focuses on performance.\n */\nexport class ChunkedForest implements IEditableForest {\n\tprivate activeVisitor?: DeltaVisitor;\n\n\tprivate readonly deltaVisitors: Set<() => AnnouncedVisitor> = new Set();\n\treadonly #events = createEmitter<ForestEvents>();\n\tpublic readonly events: Listenable<ForestEvents> = this.#events;\n\n\t/**\n\t * @param roots - dummy node above the root under which detached fields are stored. All content of the forest is reachable from this.\n\t * @param schema - schema which all content in this forest is assumed to comply with.\n\t * @param chunker - Chunking policy. TODO: dispose of this when forest is disposed.\n\t * @param anchors - anchorSet used to track location in this forest across changes. Callers of applyDelta must ensure this is updated accordingly.\n\t */\n\tpublic constructor(\n\t\tpublic roots: BasicChunk,\n\t\tpublic readonly schema: TreeStoredSchemaSubscription,\n\t\tpublic readonly chunker: IChunker,\n\t\tpublic readonly anchors: AnchorSet = new AnchorSet(),\n\t\tpublic readonly idCompressor?: IIdCompressor,\n\t) {}\n\n\tpublic get isEmpty(): boolean {\n\t\treturn this.roots.fields.size === 0;\n\t}\n\n\tpublic clone(schema: TreeStoredSchemaSubscription, _breaker?: Breakable): ChunkedForest {\n\t\tthis.roots.referenceAdded();\n\t\treturn new ChunkedForest(this.roots, schema, this.chunker.clone(schema));\n\t}\n\n\tpublic chunkField(cursor: ITreeCursorSynchronous): TreeChunk[] {\n\t\treturn chunkField(cursor, { idCompressor: this.idCompressor, policy: this.chunker });\n\t}\n\n\tpublic forgetAnchor(anchor: Anchor): void {\n\t\tthis.anchors.forget(anchor);\n\t}\n\n\tpublic registerAnnouncedVisitor(visitor: () => AnnouncedVisitor): void {\n\t\tthis.deltaVisitors.add(visitor);\n\t}\n\n\tpublic deregisterAnnouncedVisitor(visitor: () => AnnouncedVisitor): void {\n\t\tthis.deltaVisitors.delete(visitor);\n\t}\n\n\tpublic acquireVisitor(): DeltaVisitor {\n\t\tassert(\n\t\t\tthis.activeVisitor === undefined,\n\t\t\t0x76a /* Must release existing visitor before acquiring another */,\n\t\t);\n\n\t\tif (this.roots.isShared()) {\n\t\t\tthis.roots = this.roots.clone();\n\t\t}\n\n\t\tconst forestVisitor = {\n\t\t\tforest: this,\n\t\t\t// Current location in the tree, as a non-shared BasicChunk (TODO: support in-place modification of other chunk formats when possible).\n\t\t\t// Start above root detached sequences.\n\t\t\tmutableChunkStack: [] as StackNode[],\n\t\t\tmutableChunk: this.roots as BasicChunk | undefined,\n\t\t\tgetParent(): StackNode {\n\t\t\t\tassert(hasSome(this.mutableChunkStack), 0x532 /* invalid access to root's parent */);\n\t\t\t\treturn getLast(this.mutableChunkStack);\n\t\t\t},\n\t\t\tfree(): void {\n\t\t\t\tthis.mutableChunk = undefined;\n\t\t\t\tthis.mutableChunkStack.length = 0;\n\t\t\t\tassert(\n\t\t\t\t\tthis.forest.activeVisitor !== undefined,\n\t\t\t\t\t0x76b /* Multiple free calls for same visitor */,\n\t\t\t\t);\n\t\t\t\tthis.forest.activeVisitor = undefined;\n\t\t\t},\n\t\t\tdestroy(detachedField: FieldKey, count: number): void {\n\t\t\t\tthis.forest.#events.emit(\"beforeChange\");\n\t\t\t\tthis.forest.roots.fields.delete(detachedField);\n\t\t\t},\n\t\t\tcreate(content: readonly ITreeCursorSynchronous[], destination: FieldKey): void {\n\t\t\t\tthis.forest.#events.emit(\"beforeChange\");\n\t\t\t\tconst chunks: TreeChunk[] = content.map((c) =>\n\t\t\t\t\tchunkTree(c, {\n\t\t\t\t\t\tpolicy: this.forest.chunker,\n\t\t\t\t\t\tidCompressor: this.forest.idCompressor,\n\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t\tthis.forest.roots.fields.set(destination, chunks);\n\t\t\t\tthis.forest.#events.emit(\"afterRootFieldCreated\", destination);\n\t\t\t},\n\t\t\tattach(source: FieldKey, count: number, destination: PlaceIndex): void {\n\t\t\t\tthis.attachEdit(source, count, destination);\n\t\t\t},\n\t\t\tdetach(source: Range, destination: FieldKey, id: DeltaDetachedNodeId): void {\n\t\t\t\tthis.detachEdit(source, destination);\n\t\t\t},\n\t\t\t/**\n\t\t\t * Attaches the range into the current field by transferring it from the given source path.\n\t\t\t * Does not invalidate dependents.\n\t\t\t * @param source - The the range to be attached.\n\t\t\t * @param destination - The index in the current field at which to attach the content.\n\t\t\t */\n\t\t\tattachEdit(source: FieldKey, count: number, destination: PlaceIndex): void {\n\t\t\t\tthis.forest.#events.emit(\"beforeChange\");\n\t\t\t\tconst sourceField = this.forest.roots.fields.get(source) ?? [];\n\t\t\t\tthis.forest.roots.fields.delete(source);\n\t\t\t\tif (sourceField.length === 0) {\n\t\t\t\t\treturn; // Prevent creating 0 sized fields when inserting empty into empty.\n\t\t\t\t}\n\n\t\t\t\tconst parent = this.getParent();\n\t\t\t\tconst destinationField = getOrAddEmptyToMap(parent.mutableChunk.fields, parent.key);\n\t\t\t\tconst destinationChunkIndex = splitFieldAtIndex(destinationField, destination, {\n\t\t\t\t\tpolicy: this.forest.chunker,\n\t\t\t\t\tidCompressor: this.forest.idCompressor,\n\t\t\t\t});\n\t\t\t\t// TODO: this will fail for very large moves due to argument limits.\n\t\t\t\tdestinationField.splice(destinationChunkIndex, 0, ...sourceField);\n\t\t\t},\n\t\t\t/**\n\t\t\t * Detaches the range from the current field and transfers it to the given destination if any.\n\t\t\t * Does not invalidate dependents.\n\t\t\t * @param source - The bounds of the range to be detached from the current field.\n\t\t\t * @param destination - If specified, the destination to transfer the detached range to.\n\t\t\t * If not specified, the detached range is destroyed.\n\t\t\t */\n\t\t\tdetachEdit(source: Range, destination: FieldKey | undefined): void {\n\t\t\t\t// TODO: optimize this to perform in-place replace in uniform chunks when attach edits bring the chunk back to its original shape.\n\t\t\t\t// This should result in 3 cases:\n\t\t\t\t// 1. In-place update of uniform chunk. No allocations, no ref count changes, no new TreeChunks.\n\t\t\t\t// 2. Uniform chunk is shared: copy it (and parent path as needed), and update the copy.\n\t\t\t\t// 3. Fallback to detach then attach (Which will copy parents and convert to basic chunks as needed).\n\n\t\t\t\tthis.forest.#events.emit(\"beforeChange\");\n\t\t\t\tconst parent = this.getParent();\n\t\t\t\tconst sourceField = parent.mutableChunk.fields.get(parent.key) ?? [];\n\t\t\t\tassert(source.start <= source.end, 0xcf8 /* detach range start must not exceed end */);\n\n\t\t\t\tconst policy: ChunkCompressor = {\n\t\t\t\t\tpolicy: this.forest.chunker,\n\t\t\t\t\tidCompressor: this.forest.idCompressor,\n\t\t\t\t};\n\t\t\t\t// Split start first: splitting end later only expands chunks at positions >= startChunkIndex,\n\t\t\t\t// which leaves startChunkIndex valid. The reverse order would shift endChunkIndex when\n\t\t\t\t// source.start and source.end land in different chunks.\n\t\t\t\t// Performance: It's practical to have a variant of splitFieldAtIndex which can split at multiple locations in a single pass if the performance of this becomes worth optimizing.\n\t\t\t\tconst startChunkIndex = splitFieldAtIndex(sourceField, source.start, policy);\n\t\t\t\tconst endChunkIndex = splitFieldAtIndex(sourceField, source.end, policy);\n\t\t\t\tconst newField = sourceField.splice(startChunkIndex, endChunkIndex - startChunkIndex);\n\n\t\t\t\tif (destination === undefined) {\n\t\t\t\t\tfor (const child of newField) {\n\t\t\t\t\t\tchild.referenceRemoved();\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tassert(\n\t\t\t\t\t\t!this.forest.roots.fields.has(destination),\n\t\t\t\t\t\t0x7af /* Destination must be a new empty detached field */,\n\t\t\t\t\t);\n\t\t\t\t\tif (newField.length > 0) {\n\t\t\t\t\t\tthis.forest.roots.fields.set(destination, newField);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// This check is performed after the transfer to ensure that the field is not removed in scenarios\n\t\t\t\t// where the source and destination are the same.\n\t\t\t\tif (sourceField.length === 0) {\n\t\t\t\t\tparent.mutableChunk.fields.delete(parent.key);\n\t\t\t\t}\n\t\t\t},\n\t\t\tenterNode(index: number): void {\n\t\t\t\tassert(this.mutableChunk === undefined, 0x535 /* should be in field */);\n\t\t\t\tconst parent = this.getParent();\n\t\t\t\tconst chunks =\n\t\t\t\t\tparent.mutableChunk.fields.get(parent.key) ?? fail(0xaf6 /* missing edited field */);\n\t\t\t\tlet indexWithinChunk = index;\n\t\t\t\tlet indexOfChunk = 0;\n\t\t\t\tlet chunk = chunks[indexOfChunk] ?? oob();\n\t\t\t\twhile (indexWithinChunk >= chunk.topLevelLength) {\n\t\t\t\t\tindexWithinChunk -= chunk.topLevelLength;\n\t\t\t\t\tindexOfChunk++;\n\t\t\t\t\tif (indexOfChunk === chunks.length) {\n\t\t\t\t\t\tfail(0xaf7 /* missing edited node */);\n\t\t\t\t\t}\n\t\t\t\t\tchunk = chunks[indexOfChunk] ?? oob();\n\t\t\t\t}\n\t\t\t\tlet found = chunks[indexOfChunk] ?? oob();\n\t\t\t\tif (!(found instanceof BasicChunk)) {\n\t\t\t\t\t// TODO:Perf: support in place editing of other chunk formats when possible:\n\t\t\t\t\t// 1. Support updating values in uniform chunks.\n\t\t\t\t\t// 2. Support traversing sequence chunks.\n\t\t\t\t\t//\n\t\t\t\t\t// Maybe build path when visitor navigates then lazily sync to chunk tree when editing?\n\t\t\t\t\tconst newChunks = mapCursorField(found.cursor(), (cursor) =>\n\t\t\t\t\t\tbasicChunkTree(cursor, {\n\t\t\t\t\t\t\tpolicy: this.forest.chunker,\n\t\t\t\t\t\t\tidCompressor: this.forest.idCompressor,\n\t\t\t\t\t\t}),\n\t\t\t\t\t);\n\t\t\t\t\t// TODO: this could fail for really long chunks being split (due to argument count limits).\n\t\t\t\t\t// Current implementations of chunks shouldn't ever be that long, but it could be an issue if they get bigger.\n\t\t\t\t\tchunks.splice(indexOfChunk, 1, ...newChunks);\n\t\t\t\t\tfound.referenceRemoved();\n\n\t\t\t\t\tfound = newChunks[indexWithinChunk] ?? oob();\n\t\t\t\t}\n\t\t\t\tassert(found instanceof BasicChunk, 0x536 /* chunk should have been normalized */);\n\t\t\t\tif (found.isShared()) {\n\t\t\t\t\tthis.mutableChunk = chunks[indexOfChunk] = found.clone();\n\t\t\t\t\tfound.referenceRemoved();\n\t\t\t\t} else {\n\t\t\t\t\tthis.mutableChunk = found;\n\t\t\t\t}\n\t\t\t},\n\t\t\texitNode(index: number): void {\n\t\t\t\tassert(this.mutableChunk !== undefined, 0x537 /* should be in node */);\n\t\t\t\tthis.mutableChunk = undefined;\n\t\t\t},\n\t\t\tenterField(key: FieldKey): void {\n\t\t\t\tassert(this.mutableChunk !== undefined, 0x538 /* should be in node */);\n\t\t\t\tthis.mutableChunkStack.push({ key, mutableChunk: this.mutableChunk });\n\t\t\t\tthis.mutableChunk = undefined;\n\t\t\t},\n\t\t\texitField(key: FieldKey): void {\n\t\t\t\tconst top = this.mutableChunkStack.pop() ?? fail(0xaf8 /* should not be at root */);\n\t\t\t\tassert(this.mutableChunk === undefined, 0x539 /* should be in field */);\n\t\t\t\tthis.mutableChunk = top.mutableChunk;\n\t\t\t},\n\t\t};\n\n\t\tconst announcedVisitors: AnnouncedVisitor[] = [];\n\t\tfor (const getVisitor of this.deltaVisitors) {\n\t\t\tannouncedVisitors.push(getVisitor());\n\t\t}\n\t\tconst combinedVisitor = combineVisitors([forestVisitor, ...announcedVisitors]);\n\t\tthis.activeVisitor = combinedVisitor;\n\t\treturn combinedVisitor;\n\t}\n\n\tprivate nextDetachedFieldIdentifier = 0;\n\tpublic newDetachedField(): DetachedField {\n\t\tconst field: DetachedField = brand(String(this.nextDetachedFieldIdentifier));\n\t\tassert(\n\t\t\t!this.roots.fields.has(detachedFieldAsKey(field)),\n\t\t\t0x53a /* new field must not already exist */,\n\t\t);\n\t\tthis.nextDetachedFieldIdentifier += 1;\n\t\treturn field;\n\t}\n\n\tpublic allocateCursor(): Cursor {\n\t\treturn new Cursor(\n\t\t\tthis,\n\t\t\tITreeSubscriptionCursorState.Cleared,\n\t\t\t[],\n\t\t\t[],\n\t\t\t[],\n\t\t\t[],\n\t\t\t[],\n\t\t\t[],\n\t\t\t0,\n\t\t\t0,\n\t\t\t0,\n\t\t\tundefined,\n\t\t);\n\t}\n\n\tpublic tryMoveCursorToNode(\n\t\tdestination: Anchor,\n\t\tcursorToMove: ITreeSubscriptionCursor,\n\t): TreeNavigationResult {\n\t\tconst path = this.anchors.locate(destination);\n\t\tif (path === undefined) {\n\t\t\treturn TreeNavigationResult.NotFound;\n\t\t}\n\t\tthis.moveCursorToPath(path, cursorToMove);\n\t\treturn TreeNavigationResult.Ok;\n\t}\n\n\tpublic tryMoveCursorToField(\n\t\tdestination: FieldAnchor,\n\t\tcursorToMove: ITreeSubscriptionCursor,\n\t): TreeNavigationResult {\n\t\tassert(\n\t\t\tcursorToMove instanceof Cursor,\n\t\t\t0x53b /* ChunkedForest must only be given its own Cursor type */,\n\t\t);\n\t\tif (destination.parent === undefined) {\n\t\t\tcursorToMove.setToDetachedSequence(destination.fieldKey);\n\t\t\treturn TreeNavigationResult.Ok;\n\t\t}\n\t\tconst result = this.tryMoveCursorToNode(destination.parent, cursorToMove);\n\t\tif (result !== TreeNavigationResult.Ok) {\n\t\t\treturn result;\n\t\t}\n\n\t\tcursorToMove.enterField(destination.fieldKey);\n\t\treturn TreeNavigationResult.Ok;\n\t}\n\n\tpublic moveCursorToPath(destination: UpPath, cursorToMove: ITreeSubscriptionCursor): void {\n\t\tassert(\n\t\t\tcursorToMove instanceof Cursor,\n\t\t\t0x53c /* ChunkedForest must only be given its own Cursor type */,\n\t\t);\n\t\tassert(\n\t\t\tcursorToMove.forest === this,\n\t\t\t0x53d /* ChunkedForest must only be given its own Cursor */,\n\t\t);\n\n\t\tconst indexStack: number[] = [];\n\t\tconst keyStack: FieldKey[] = [];\n\n\t\tlet path: UpPath | undefined = destination;\n\t\twhile (path !== undefined) {\n\t\t\tindexStack.push(path.parentIndex);\n\t\t\tkeyStack.push(path.parentField);\n\t\t\tpath = path.parent;\n\t\t}\n\t\tcursorToMove.clear();\n\t\twhile (keyStack.length > 0) {\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\t\tconst key = keyStack.pop()!;\n\t\t\tif (cursorToMove.state === ITreeSubscriptionCursorState.Cleared) {\n\t\t\t\tcursorToMove.setToDetachedSequence(key);\n\t\t\t\tcursorToMove.state = ITreeSubscriptionCursorState.Current;\n\t\t\t} else {\n\t\t\t\tcursorToMove.enterField(key);\n\t\t\t}\n\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\t\tcursorToMove.enterNode(indexStack.pop()!);\n\t\t}\n\t}\n\n\tpublic getCursorAboveDetachedFields(): ITreeCursorSynchronous {\n\t\tconst rootCursor = this.roots.cursor();\n\t\trootCursor.enterNode(0);\n\t\treturn rootCursor;\n\t}\n}\n\nclass Cursor extends BasicChunkCursor implements ITreeSubscriptionCursor {\n\tpublic constructor(\n\t\tpublic readonly forest: ChunkedForest,\n\t\tpublic state: ITreeSubscriptionCursorState,\n\t\troot: readonly TreeChunk[],\n\t\tsiblingStack: SiblingsOrKey[],\n\t\tindexStack: number[],\n\t\tindexOfChunkStack: number[],\n\t\tindexWithinChunkStack: number[],\n\t\tsiblings: SiblingsOrKey,\n\t\tindex: number,\n\t\tindexOfChunk: number,\n\t\tindexWithinChunk: number,\n\t\tnestedCursor: ChunkedCursor | undefined,\n\t) {\n\t\tsuper(\n\t\t\troot,\n\t\t\tsiblingStack,\n\t\t\tindexStack,\n\t\t\tindexOfChunkStack,\n\t\t\tindexWithinChunkStack,\n\t\t\tsiblings,\n\t\t\tindex,\n\t\t\tindexOfChunk,\n\t\t\tindexWithinChunk,\n\t\t\tnestedCursor,\n\t\t);\n\t}\n\n\tpublic setToDetachedSequence(key: FieldKey): void {\n\t\tthis.root = (this.forest.roots.fields.get(key) ?? []) as BasicChunk[];\n\t\tthis.siblingStack.length = 0;\n\t\tthis.indexStack.length = 0;\n\t\tthis.indexOfChunkStack.length = 0;\n\t\tthis.indexWithinChunkStack.length = 0;\n\t\tthis.siblings = [key];\n\t\tthis.index = 0;\n\t\tthis.indexOfChunk = 0;\n\t\tthis.indexWithinChunk = 0;\n\t\tthis.nestedCursor = undefined;\n\t}\n\n\tpublic override fork(): Cursor {\n\t\t// Siblings arrays are not modified during navigation and do not need be be copied.\n\t\t// This allows this copy to be shallow, and `this.siblings` below to not be copied as all.\n\t\treturn new Cursor(\n\t\t\tthis.forest,\n\t\t\tthis.state,\n\t\t\tthis.root,\n\t\t\t[...this.siblingStack],\n\t\t\t[...this.indexStack],\n\t\t\t[...this.indexOfChunkStack],\n\t\t\t[...this.indexWithinChunkStack],\n\t\t\tthis.siblings,\n\t\t\tthis.index,\n\t\t\tthis.indexOfChunk,\n\t\t\tthis.indexWithinChunk,\n\t\t\tthis.nestedCursor?.fork(),\n\t\t);\n\t}\n\n\tpublic buildFieldAnchor(): FieldAnchor {\n\t\tconst path = this.getFieldPath();\n\t\tconst anchor =\n\t\t\tpath.parent === undefined ? undefined : this.forest.anchors.track(path.parent);\n\t\treturn { parent: anchor, fieldKey: path.field };\n\t}\n\n\tpublic free(): void {\n\t\tthis.state = ITreeSubscriptionCursorState.Freed;\n\t}\n\n\tpublic buildAnchor(): Anchor {\n\t\treturn this.forest.anchors.track(this.getPath());\n\t}\n\n\tpublic clear(): void {\n\t\tthis.state = ITreeSubscriptionCursorState.Cleared;\n\t\tthis.setToDetachedSequence(rootFieldKey);\n\t}\n}\n\n/**\n * Creates an implementation of {@link IEditableForest} with no data or schema.\n */\nexport function buildChunkedForest(\n\tchunker: IChunker,\n\tanchors?: AnchorSet,\n\tidCompressor?: IIdCompressor,\n): ChunkedForest {\n\treturn new ChunkedForest(makeRoot(), chunker.schema, chunker, anchors, idCompressor);\n}\n"]}
|
|
1
|
+
{"version":3,"file":"chunkedForest.js","sourceRoot":"","sources":["../../../src/feature-libraries/chunked-forest/chunkedForest.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 { createEmitter } from \"@fluid-internal/client-utils\";\nimport type { Listenable } from \"@fluidframework/core-interfaces\";\nimport { assert, oob, fail, debugAssert } from \"@fluidframework/core-utils/internal\";\nimport type { IIdCompressor } from \"@fluidframework/id-compressor\";\n\nimport {\n\ttype Anchor,\n\tAnchorSet,\n\ttype AnnouncedVisitor,\n\ttype DeltaVisitor,\n\ttype DetachedField,\n\ttype FieldAnchor,\n\ttype FieldKey,\n\ttype ForestEvents,\n\ttype IEditableForest,\n\ttype ITreeCursorSynchronous,\n\ttype ITreeSubscriptionCursor,\n\tITreeSubscriptionCursorState,\n\ttype PlaceIndex,\n\ttype Range,\n\tTreeNavigationResult,\n\ttype TreeStoredSchemaSubscription,\n\ttype UpPath,\n\taboveRootPlaceholder,\n\tcombineVisitors,\n\tdetachedFieldAsKey,\n\tmakeBreakingVisitor,\n\tmapCursorField,\n\trootFieldKey,\n\ttype ChunkedCursor,\n\ttype TreeChunk,\n\ttype DeltaDetachedNodeId,\n} from \"../../core/index.js\";\nimport {\n\tassertNonNegativeSafeInteger,\n\tbrand,\n\tgetLast,\n\tgetOrAddEmptyToMap,\n\thasSome,\n\tBreakable,\n\ttype WithBreakable,\n} from \"../../util/index.js\";\n\nimport { BasicChunk, BasicChunkCursor, type SiblingsOrKey } from \"./basicChunk.js\";\nimport {\n\ttype ChunkCompressor,\n\ttype IChunker,\n\tbasicChunkTree,\n\tchunkField,\n\tchunkTree,\n\tsplitFieldAtIndex,\n} from \"./chunkTree.js\";\n\nfunction makeRoot(): BasicChunk {\n\treturn new BasicChunk(aboveRootPlaceholder, new Map());\n}\n\n/** Returns the number of top-level nodes represented by a field's chunks. */\nfunction getFieldLength(field: readonly TreeChunk[]): number {\n\treturn field.reduce((length, chunk) => length + chunk.topLevelLength, 0);\n}\n\n/**\n * Locates a top-level node within a field's chunk representation.\n * @param chunks - The chunks representing the field.\n * @param index - The node index within the field.\n * @returns The containing chunk, its array index, and the node's offset within it.\n */\nexport function locateNodeInChunks(\n\tchunks: readonly TreeChunk[],\n\tindex: number,\n): { chunk: TreeChunk; indexOfChunk: number; indexWithinChunk: number } {\n\tassertNonNegativeSafeInteger(index);\n\t// Remaining node offset while scanning chunks; afterward, the offset within the matched chunk.\n\tlet indexWithinChunk = index;\n\t// Array index of the chunk currently being examined.\n\tlet indexOfChunk = 0;\n\twhile (true) {\n\t\tconst chunk = chunks[indexOfChunk] ?? oob();\n\t\tif (indexWithinChunk < chunk.topLevelLength) {\n\t\t\treturn { chunk, indexOfChunk, indexWithinChunk };\n\t\t}\n\t\tindexWithinChunk -= chunk.topLevelLength;\n\t\tindexOfChunk++;\n\t\tif (indexOfChunk === chunks.length) {\n\t\t\tfail(0xaf7 /* missing edited node */);\n\t\t}\n\t}\n}\n\n/**\n * Ensures the node at index `index` within the field represented by `chunks` is contained in a non-shared {@link BasicChunk}.\n *\n * @param chunks - The chunks representing the field which will be modified to ensure the node at\n * `index` is in a non-shared {@link BasicChunk}.\n * @param index - The node index within the field.\n * @returns The exclusively owned {@link BasicChunk} containing the node at `index`. This chunk is part of and owned by `chunks`.\n * @remarks\n * This function may modify the `chunks` array to ensure the node at `index` is in a non-shared {@link BasicChunk}.\n * This can include splitting chunks, and cloning.\n */\nexport function ensureExclusiveBasicChunk(\n\tchunks: TreeChunk[],\n\tindex: number,\n\tcompressor: ChunkCompressor,\n): BasicChunk {\n\tconst { chunk, indexOfChunk, indexWithinChunk } = locateNodeInChunks(chunks, index);\n\n\t// Normalize to a BasicChunk, splitting the chunk if needed.\n\tlet finalIndexOfChunk: number;\n\tlet basicChunk: BasicChunk;\n\tif (chunk instanceof BasicChunk) {\n\t\tbasicChunk = chunk;\n\t\tfinalIndexOfChunk = indexOfChunk;\n\t} else {\n\t\t// TODO:Perf: support in place editing of other chunk formats when possible:\n\t\t// 1. Support updating values in uniform chunks.\n\t\t// 2. Support traversing sequence chunks.\n\t\t//\n\t\t// Maybe build path when visitor navigates then lazily sync to chunk tree when editing?\n\t\tconst newChunks = mapCursorField(chunk.cursor(), (cursor) =>\n\t\t\tbasicChunkTree(cursor, compressor),\n\t\t);\n\t\t// TODO: this could fail for really long chunks being split (due to argument count limits).\n\t\t// Current implementations of chunks shouldn't ever be that long, but it could be an issue if they get bigger.\n\t\tchunks.splice(indexOfChunk, 1, ...newChunks);\n\t\t// We just overwrote the reference to the old chunk in the array, so drop the ref count for it.\n\t\tchunk.referenceRemoved();\n\n\t\t// Sanity check that the chunk indexing is as expected before updating it.\n\t\tdebugAssert(\n\t\t\t() =>\n\t\t\t\tnewChunks[indexWithinChunk] === chunks[indexOfChunk + indexWithinChunk] ||\n\t\t\t\t\"bad chunk indexing\",\n\t\t);\n\t\tbasicChunk = newChunks[indexWithinChunk] ?? oob();\n\t\tfinalIndexOfChunk = indexOfChunk + indexWithinChunk;\n\t}\n\n\tdebugAssert(() => chunks[finalIndexOfChunk] === basicChunk || \"bad child index\");\n\n\t// Ensure the BasicChunk we have is exclusively owned, so we can edit it in place.\n\tlet exclusiveChunk: BasicChunk;\n\tif (basicChunk.isShared()) {\n\t\texclusiveChunk = chunks[finalIndexOfChunk] = basicChunk.clone();\n\t\tbasicChunk.referenceRemoved();\n\t} else {\n\t\texclusiveChunk = basicChunk;\n\t}\n\treturn exclusiveChunk;\n}\n\n/**\n * Layer in the stack of basic chunks from traversing down the tree.\n */\ninterface StackNode {\n\t/**\n\t * The parent node.\n\t */\n\tmutableChunk: BasicChunk;\n\t/**\n\t * A key under {@link mutableChunk} into which this stack traverses.\n\t */\n\tkey: FieldKey;\n}\n\n/**\n * Implementation of IEditableForest based on copy on write chunks.\n *\n * This implementation focuses on performance.\n */\nexport class ChunkedForest implements IEditableForest, WithBreakable {\n\tprivate activeVisitor?: DeltaVisitor;\n\n\tprivate readonly deltaVisitors: Set<() => AnnouncedVisitor> = new Set();\n\treadonly #events = createEmitter<ForestEvents>();\n\tpublic readonly events: Listenable<ForestEvents> = this.#events;\n\n\t/**\n\t * @param roots - dummy node above the root under which detached fields are stored. All content of the forest is reachable from this.\n\t * @param schema - schema which all content in this forest is assumed to comply with.\n\t * @param chunker - Chunking policy. TODO: dispose of this when forest is disposed.\n\t * @param anchors - anchorSet used to track location in this forest across changes. Callers of applyDelta must ensure this is updated accordingly.\n\t */\n\tpublic constructor(\n\t\tpublic roots: BasicChunk,\n\t\tpublic readonly schema: TreeStoredSchemaSubscription,\n\t\tpublic readonly chunker: IChunker,\n\t\tpublic readonly anchors: AnchorSet = new AnchorSet(),\n\t\tpublic readonly idCompressor?: IIdCompressor,\n\t\tpublic readonly breaker: Breakable = new Breakable(\"ChunkedForest\"),\n\t) {}\n\n\tpublic get isEmpty(): boolean {\n\t\tthis.breaker.use();\n\t\treturn this.roots.fields.size === 0;\n\t}\n\n\tpublic clone(schema: TreeStoredSchemaSubscription, breaker?: Breakable): ChunkedForest {\n\t\tthis.breaker.use();\n\t\tthis.roots.referenceAdded();\n\t\treturn new ChunkedForest(\n\t\t\tthis.roots,\n\t\t\tschema,\n\t\t\tthis.chunker.clone(schema),\n\t\t\tundefined,\n\t\t\tthis.idCompressor,\n\t\t\tbreaker ?? this.breaker,\n\t\t);\n\t}\n\n\tpublic chunkField(cursor: ITreeCursorSynchronous): TreeChunk[] {\n\t\tthis.breaker.use();\n\t\treturn chunkField(cursor, { idCompressor: this.idCompressor, policy: this.chunker });\n\t}\n\n\tpublic forgetAnchor(anchor: Anchor): void {\n\t\tthis.anchors.forget(anchor);\n\t}\n\n\tpublic registerAnnouncedVisitor(visitor: () => AnnouncedVisitor): void {\n\t\tthis.deltaVisitors.add(visitor);\n\t}\n\n\tpublic deregisterAnnouncedVisitor(visitor: () => AnnouncedVisitor): void {\n\t\tthis.deltaVisitors.delete(visitor);\n\t}\n\n\tpublic acquireVisitor(): DeltaVisitor {\n\t\tthis.breaker.use();\n\t\tassert(\n\t\t\tthis.activeVisitor === undefined,\n\t\t\t0x76a /* Must release existing visitor before acquiring another */,\n\t\t);\n\n\t\tif (this.roots.isShared()) {\n\t\t\tthis.roots = this.roots.clone();\n\t\t}\n\n\t\t// The `CombinableVisitor` which can apply deltas to this forest.\n\t\t// Annoyingly declaring the type here or in a satisfies clause causes this code not to build,\n\t\t// so the type is inferred.\n\t\t//\n\t\t// This visitor works by shallow copying (where needed) the forest as it's walked down\n\t\t// to ensure the location being traversed (and thus possibly edited) is an exclusively owned BasicChunk.\n\t\t// Future optimizations may improve this, but currently that is a requirement for the editing code to work.\n\t\tconst forestVisitor = {\n\t\t\tforest: this,\n\t\t\t/**\n\t\t\t * Current location in the tree, as a non-shared BasicChunk (TODO: support in-place modification of other chunk formats when possible).\n\t\t\t * Starts above root detached sequences.\n\t\t\t */\n\t\t\tmutableChunkStack: [] as StackNode[],\n\t\t\t/**\n\t\t\t * When at a node level, this is set to the basic chunk for the current node.\n\t\t\t * When at a field level, undefined, see mutableChunkStack for the field.\n\t\t\t */\n\t\t\tmutableChunk: this.roots as BasicChunk | undefined,\n\t\t\tgetParent(): StackNode {\n\t\t\t\tassert(hasSome(this.mutableChunkStack), 0x532 /* invalid access to root's parent */);\n\t\t\t\treturn getLast(this.mutableChunkStack);\n\t\t\t},\n\t\t\tfree(): void {\n\t\t\t\tthis.mutableChunk = undefined;\n\t\t\t\tthis.mutableChunkStack.length = 0;\n\t\t\t\tassert(\n\t\t\t\t\tthis.forest.activeVisitor !== undefined,\n\t\t\t\t\t0x76b /* Multiple free calls for same visitor */,\n\t\t\t\t);\n\t\t\t\tthis.forest.activeVisitor = undefined;\n\t\t\t},\n\t\t\tdestroy(detachedField: FieldKey, count: number): void {\n\t\t\t\tthis.forest.#events.emit(\"beforeChange\");\n\t\t\t\tconst field = this.forest.roots.fields.get(detachedField);\n\t\t\t\tassert(field !== undefined, 0xd1d /* Destroyed field must exist */);\n\t\t\t\tassert(\n\t\t\t\t\tgetFieldLength(field) === count,\n\t\t\t\t\t0xd1e /* Destroy count must match field length */,\n\t\t\t\t);\n\t\t\t\tthis.forest.roots.fields.delete(detachedField);\n\t\t\t\tfor (const chunk of field) {\n\t\t\t\t\tchunk.referenceRemoved();\n\t\t\t\t}\n\t\t\t},\n\t\t\tcreate(content: readonly ITreeCursorSynchronous[], destination: FieldKey): void {\n\t\t\t\tthis.forest.#events.emit(\"beforeChange\");\n\t\t\t\tassert(\n\t\t\t\t\t!this.forest.roots.fields.has(destination),\n\t\t\t\t\t0xd1f /* Create destination must be a new empty field */,\n\t\t\t\t);\n\t\t\t\tconst chunks: TreeChunk[] = content.map((c) =>\n\t\t\t\t\tchunkTree(c, {\n\t\t\t\t\t\tpolicy: this.forest.chunker,\n\t\t\t\t\t\tidCompressor: this.forest.idCompressor,\n\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t\tthis.forest.roots.fields.set(destination, chunks);\n\t\t\t\tthis.forest.#events.emit(\"afterRootFieldCreated\", destination);\n\t\t\t},\n\t\t\tattach(source: FieldKey, count: number, destination: PlaceIndex): void {\n\t\t\t\tthis.attachEdit(source, count, destination);\n\t\t\t},\n\t\t\tdetach(source: Range, destination: FieldKey, id: DeltaDetachedNodeId): void {\n\t\t\t\tthis.detachEdit(source, destination);\n\t\t\t},\n\t\t\t/**\n\t\t\t * Attaches the range into the current field by transferring it from the given source path.\n\t\t\t * Does not invalidate dependents.\n\t\t\t * @param source - The the range to be attached.\n\t\t\t * @param destination - The index in the current field at which to attach the content.\n\t\t\t */\n\t\t\tattachEdit(source: FieldKey, count: number, destination: PlaceIndex): void {\n\t\t\t\tthis.forest.#events.emit(\"beforeChange\");\n\t\t\t\tconst parent = this.getParent();\n\t\t\t\tassert(\n\t\t\t\t\tparent.mutableChunk !== this.forest.roots || parent.key !== source,\n\t\t\t\t\t0xd20 /* Attach source field must be different from current field */,\n\t\t\t\t);\n\t\t\t\tconst sourceField = this.forest.roots.fields.get(source);\n\t\t\t\tassert(sourceField !== undefined, 0xd21 /* Attach source field must exist */);\n\t\t\t\tassert(\n\t\t\t\t\tgetFieldLength(sourceField) === count,\n\t\t\t\t\t0xd22 /* Attach must consume all nodes in source field */,\n\t\t\t\t);\n\t\t\t\tconst destinationField = getOrAddEmptyToMap(parent.mutableChunk.fields, parent.key);\n\t\t\t\tassert(\n\t\t\t\t\tdestination <= getFieldLength(destinationField),\n\t\t\t\t\t0xd23 /* Attach destination must not exceed field length */,\n\t\t\t\t);\n\t\t\t\tconst destinationChunkIndex = splitFieldAtIndex(destinationField, destination, {\n\t\t\t\t\tpolicy: this.forest.chunker,\n\t\t\t\t\tidCompressor: this.forest.idCompressor,\n\t\t\t\t});\n\t\t\t\tthis.forest.roots.fields.delete(source);\n\t\t\t\t// TODO: this will fail for very large moves due to argument limits.\n\t\t\t\tdestinationField.splice(destinationChunkIndex, 0, ...sourceField);\n\t\t\t},\n\t\t\t/**\n\t\t\t * Detaches the range from the current field and transfers it to the given destination if any.\n\t\t\t * Does not invalidate dependents.\n\t\t\t * @param source - The bounds of the range to be detached from the current field.\n\t\t\t * @param destination - If specified, the destination to transfer the detached range to.\n\t\t\t * If not specified, the detached range is destroyed.\n\t\t\t */\n\t\t\tdetachEdit(source: Range, destination: FieldKey | undefined): void {\n\t\t\t\t// TODO: optimize this to perform in-place replace in uniform chunks when attach edits bring the chunk back to its original shape.\n\t\t\t\t// This should result in 3 cases:\n\t\t\t\t// 1. In-place update of uniform chunk. No allocations, no ref count changes, no new TreeChunks.\n\t\t\t\t// 2. Uniform chunk is shared: copy it (and parent path as needed), and update the copy.\n\t\t\t\t// 3. Fallback to detach then attach (Which will copy parents and convert to basic chunks as needed).\n\n\t\t\t\tthis.forest.#events.emit(\"beforeChange\");\n\t\t\t\tconst parent = this.getParent();\n\t\t\t\tconst sourceField = parent.mutableChunk.fields.get(parent.key) ?? [];\n\t\t\t\tassert(source.start <= source.end, 0xd24 /* Detach range start must not exceed end */);\n\t\t\t\tassert(\n\t\t\t\t\tsource.end <= getFieldLength(sourceField),\n\t\t\t\t\t0xd25 /* Detach range must not exceed field length */,\n\t\t\t\t);\n\t\t\t\tif (destination !== undefined) {\n\t\t\t\t\tassert(\n\t\t\t\t\t\tparent.mutableChunk !== this.forest.roots || parent.key !== destination,\n\t\t\t\t\t\t0xd26 /* Detach destination field must be different from current field */,\n\t\t\t\t\t);\n\t\t\t\t\tassert(\n\t\t\t\t\t\t!this.forest.roots.fields.has(destination),\n\t\t\t\t\t\t0xd27 /* Detach destination must be a new empty field */,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tconst policy: ChunkCompressor = {\n\t\t\t\t\tpolicy: this.forest.chunker,\n\t\t\t\t\tidCompressor: this.forest.idCompressor,\n\t\t\t\t};\n\t\t\t\t// Split start first: splitting end later only expands chunks at positions >= startChunkIndex,\n\t\t\t\t// which leaves startChunkIndex valid. The reverse order would shift endChunkIndex when\n\t\t\t\t// source.start and source.end land in different chunks.\n\t\t\t\t// Performance: It's practical to have a variant of splitFieldAtIndex which can split at multiple locations in a single pass if the performance of this becomes worth optimizing.\n\t\t\t\tconst startChunkIndex = splitFieldAtIndex(sourceField, source.start, policy);\n\t\t\t\tconst endChunkIndex = splitFieldAtIndex(sourceField, source.end, policy);\n\t\t\t\tconst newField = sourceField.splice(startChunkIndex, endChunkIndex - startChunkIndex);\n\n\t\t\t\tif (destination === undefined) {\n\t\t\t\t\tfor (const child of newField) {\n\t\t\t\t\t\tchild.referenceRemoved();\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tif (newField.length > 0) {\n\t\t\t\t\t\tthis.forest.roots.fields.set(destination, newField);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// This check is performed after the transfer to ensure that the field is not removed in scenarios\n\t\t\t\t// where the source and destination are the same.\n\t\t\t\tif (sourceField.length === 0) {\n\t\t\t\t\tparent.mutableChunk.fields.delete(parent.key);\n\t\t\t\t}\n\t\t\t},\n\t\t\t/**\n\t\t\t * Ensure the selected node (by `index`) is an exclusively owned basic node,\n\t\t\t * and store it under `this.mutableChunk`.\n\t\t\t */\n\t\t\tenterNode(index: number): void {\n\t\t\t\tassert(this.mutableChunk === undefined, 0x535 /* should be in field */);\n\n\t\t\t\t// Get the mutable parent, which we might have to modify to ensure the desired child is an exclusively owned (and thus mutable) BasicChunk.\n\t\t\t\tconst parent = this.getParent();\n\n\t\t\t\t// Lookup the current location of the node to be entered\n\t\t\t\tconst chunks =\n\t\t\t\t\tparent.mutableChunk.fields.get(parent.key) ?? fail(0xaf6 /* missing edited field */);\n\n\t\t\t\tthis.mutableChunk = ensureExclusiveBasicChunk(chunks, index, {\n\t\t\t\t\tpolicy: this.forest.chunker,\n\t\t\t\t\tidCompressor: this.forest.idCompressor,\n\t\t\t\t});\n\t\t\t},\n\t\t\texitNode(index: number): void {\n\t\t\t\tassert(this.mutableChunk !== undefined, 0x537 /* should be in node */);\n\t\t\t\tthis.mutableChunk = undefined;\n\t\t\t},\n\t\t\tenterField(key: FieldKey): void {\n\t\t\t\tassert(this.mutableChunk !== undefined, 0x538 /* should be in node */);\n\t\t\t\tthis.mutableChunkStack.push({ key, mutableChunk: this.mutableChunk });\n\t\t\t\tthis.mutableChunk = undefined;\n\t\t\t},\n\t\t\texitField(key: FieldKey): void {\n\t\t\t\tconst top = this.mutableChunkStack.pop() ?? fail(0xaf8 /* should not be at root */);\n\t\t\t\tassert(this.mutableChunk === undefined, 0x539 /* should be in field */);\n\t\t\t\tthis.mutableChunk = top.mutableChunk;\n\t\t\t},\n\t\t};\n\n\t\tconst announcedVisitors: AnnouncedVisitor[] = [];\n\t\tfor (const getVisitor of this.deltaVisitors) {\n\t\t\tannouncedVisitors.push(getVisitor());\n\t\t}\n\t\tconst visitor = combineVisitors([\n\t\t\tmakeBreakingVisitor(forestVisitor, this.breaker),\n\t\t\t...announcedVisitors,\n\t\t]);\n\t\tthis.activeVisitor = visitor;\n\t\treturn visitor;\n\t}\n\n\tprivate nextDetachedFieldIdentifier = 0;\n\tpublic newDetachedField(): DetachedField {\n\t\tconst field: DetachedField = brand(String(this.nextDetachedFieldIdentifier));\n\t\tassert(\n\t\t\t!this.roots.fields.has(detachedFieldAsKey(field)),\n\t\t\t0x53a /* new field must not already exist */,\n\t\t);\n\t\tthis.nextDetachedFieldIdentifier += 1;\n\t\treturn field;\n\t}\n\n\tpublic allocateCursor(): Cursor {\n\t\tthis.breaker.use();\n\t\treturn new Cursor(\n\t\t\tthis,\n\t\t\tITreeSubscriptionCursorState.Cleared,\n\t\t\t[],\n\t\t\t[],\n\t\t\t[],\n\t\t\t[],\n\t\t\t[],\n\t\t\t[],\n\t\t\t0,\n\t\t\t0,\n\t\t\t0,\n\t\t\tundefined,\n\t\t);\n\t}\n\n\tpublic tryMoveCursorToNode(\n\t\tdestination: Anchor,\n\t\tcursorToMove: ITreeSubscriptionCursor,\n\t): TreeNavigationResult {\n\t\tthis.breaker.use();\n\t\tconst path = this.anchors.locate(destination);\n\t\tif (path === undefined) {\n\t\t\treturn TreeNavigationResult.NotFound;\n\t\t}\n\t\tthis.moveCursorToPath(path, cursorToMove);\n\t\treturn TreeNavigationResult.Ok;\n\t}\n\n\tpublic tryMoveCursorToField(\n\t\tdestination: FieldAnchor,\n\t\tcursorToMove: ITreeSubscriptionCursor,\n\t): TreeNavigationResult {\n\t\tthis.breaker.use();\n\t\tassert(\n\t\t\tcursorToMove instanceof Cursor,\n\t\t\t0x53b /* ChunkedForest must only be given its own Cursor type */,\n\t\t);\n\t\tif (destination.parent === undefined) {\n\t\t\tcursorToMove.setToDetachedSequence(destination.fieldKey);\n\t\t\treturn TreeNavigationResult.Ok;\n\t\t}\n\t\tconst result = this.tryMoveCursorToNode(destination.parent, cursorToMove);\n\t\tif (result !== TreeNavigationResult.Ok) {\n\t\t\treturn result;\n\t\t}\n\n\t\tcursorToMove.enterField(destination.fieldKey);\n\t\treturn TreeNavigationResult.Ok;\n\t}\n\n\tpublic moveCursorToPath(destination: UpPath, cursorToMove: ITreeSubscriptionCursor): void {\n\t\tthis.breaker.use();\n\t\tassert(\n\t\t\tcursorToMove instanceof Cursor,\n\t\t\t0x53c /* ChunkedForest must only be given its own Cursor type */,\n\t\t);\n\t\tassert(\n\t\t\tcursorToMove.forest === this,\n\t\t\t0x53d /* ChunkedForest must only be given its own Cursor */,\n\t\t);\n\n\t\tconst indexStack: number[] = [];\n\t\tconst keyStack: FieldKey[] = [];\n\n\t\tlet path: UpPath | undefined = destination;\n\t\twhile (path !== undefined) {\n\t\t\tindexStack.push(path.parentIndex);\n\t\t\tkeyStack.push(path.parentField);\n\t\t\tpath = path.parent;\n\t\t}\n\t\tcursorToMove.clear();\n\t\twhile (keyStack.length > 0) {\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\t\tconst key = keyStack.pop()!;\n\t\t\tif (cursorToMove.state === ITreeSubscriptionCursorState.Cleared) {\n\t\t\t\tcursorToMove.setToDetachedSequence(key);\n\t\t\t\tcursorToMove.state = ITreeSubscriptionCursorState.Current;\n\t\t\t} else {\n\t\t\t\tcursorToMove.enterField(key);\n\t\t\t}\n\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\t\tcursorToMove.enterNode(indexStack.pop()!);\n\t\t}\n\t}\n\n\tpublic getCursorAboveDetachedFields(): ITreeCursorSynchronous {\n\t\tthis.breaker.use();\n\t\tconst rootCursor = this.roots.cursor();\n\t\trootCursor.enterNode(0);\n\t\treturn rootCursor;\n\t}\n}\n\nclass Cursor extends BasicChunkCursor implements ITreeSubscriptionCursor {\n\tpublic constructor(\n\t\tpublic readonly forest: ChunkedForest,\n\t\tpublic state: ITreeSubscriptionCursorState,\n\t\troot: readonly TreeChunk[],\n\t\tsiblingStack: SiblingsOrKey[],\n\t\tindexStack: number[],\n\t\tindexOfChunkStack: number[],\n\t\tindexWithinChunkStack: number[],\n\t\tsiblings: SiblingsOrKey,\n\t\tindex: number,\n\t\tindexOfChunk: number,\n\t\tindexWithinChunk: number,\n\t\tnestedCursor: ChunkedCursor | undefined,\n\t) {\n\t\tsuper(\n\t\t\troot,\n\t\t\tsiblingStack,\n\t\t\tindexStack,\n\t\t\tindexOfChunkStack,\n\t\t\tindexWithinChunkStack,\n\t\t\tsiblings,\n\t\t\tindex,\n\t\t\tindexOfChunk,\n\t\t\tindexWithinChunk,\n\t\t\tnestedCursor,\n\t\t);\n\t}\n\n\tpublic setToDetachedSequence(key: FieldKey): void {\n\t\tthis.root = (this.forest.roots.fields.get(key) ?? []) as BasicChunk[];\n\t\tthis.siblingStack.length = 0;\n\t\tthis.indexStack.length = 0;\n\t\tthis.indexOfChunkStack.length = 0;\n\t\tthis.indexWithinChunkStack.length = 0;\n\t\tthis.siblings = [key];\n\t\tthis.index = 0;\n\t\tthis.indexOfChunk = 0;\n\t\tthis.indexWithinChunk = 0;\n\t\tthis.nestedCursor = undefined;\n\t}\n\n\tpublic override fork(): Cursor {\n\t\t// Siblings arrays are not modified during navigation and do not need be be copied.\n\t\t// This allows this copy to be shallow, and `this.siblings` below to not be copied as all.\n\t\treturn new Cursor(\n\t\t\tthis.forest,\n\t\t\tthis.state,\n\t\t\tthis.root,\n\t\t\t[...this.siblingStack],\n\t\t\t[...this.indexStack],\n\t\t\t[...this.indexOfChunkStack],\n\t\t\t[...this.indexWithinChunkStack],\n\t\t\tthis.siblings,\n\t\t\tthis.index,\n\t\t\tthis.indexOfChunk,\n\t\t\tthis.indexWithinChunk,\n\t\t\tthis.nestedCursor?.fork(),\n\t\t);\n\t}\n\n\tpublic buildFieldAnchor(): FieldAnchor {\n\t\tconst path = this.getFieldPath();\n\t\tconst anchor =\n\t\t\tpath.parent === undefined ? undefined : this.forest.anchors.track(path.parent);\n\t\treturn { parent: anchor, fieldKey: path.field };\n\t}\n\n\tpublic free(): void {\n\t\tthis.state = ITreeSubscriptionCursorState.Freed;\n\t}\n\n\tpublic buildAnchor(): Anchor {\n\t\treturn this.forest.anchors.track(this.getPath());\n\t}\n\n\tpublic clear(): void {\n\t\tthis.state = ITreeSubscriptionCursorState.Cleared;\n\t\tthis.setToDetachedSequence(rootFieldKey);\n\t}\n}\n\n/**\n * Creates an implementation of {@link IEditableForest} with no data or schema.\n */\nexport function buildChunkedForest(\n\tchunker: IChunker,\n\tanchors?: AnchorSet,\n\tidCompressor?: IIdCompressor,\n\tbreaker?: Breakable,\n): ChunkedForest {\n\treturn new ChunkedForest(\n\t\tmakeRoot(),\n\t\tchunker.schema,\n\t\tchunker,\n\t\tanchors,\n\t\tidCompressor,\n\t\tbreaker,\n\t);\n}\n"]}
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
*/
|
|
5
5
|
import type { Listenable } from "@fluidframework/core-interfaces";
|
|
6
6
|
import { type Anchor, type AnchorSet, type AnnouncedVisitor, type DeltaVisitor, type FieldAnchor, type ForestEvents, type IEditableForest, type ITreeCursorSynchronous, type ITreeSubscriptionCursor, type TreeChunk, type TreeNavigationResult, type TreeStoredSchemaSubscription, type UpPath } from "../../core/index.js";
|
|
7
|
-
import type
|
|
7
|
+
import { type Breakable } from "../../util/index.js";
|
|
8
8
|
/**
|
|
9
9
|
* An {@link IEditableForest} which wraps two other forests: a `main` forest and a `reference` forest.
|
|
10
10
|
*
|
|
@@ -36,6 +36,7 @@ export declare class ComparisonForest implements IEditableForest {
|
|
|
36
36
|
get events(): Listenable<ForestEvents>;
|
|
37
37
|
get anchors(): AnchorSet;
|
|
38
38
|
get isEmpty(): boolean;
|
|
39
|
+
get breaker(): Breakable;
|
|
39
40
|
clone(schema: TreeStoredSchemaSubscription, breaker?: Breakable): ComparisonForest;
|
|
40
41
|
chunkField(cursor: ITreeCursorSynchronous): TreeChunk[];
|
|
41
42
|
allocateCursor(source?: string): ITreeSubscriptionCursor;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"comparisonForest.d.ts","sourceRoot":"","sources":["../../../src/feature-libraries/comparison-forest/comparisonForest.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAElE,OAAO,EACN,KAAK,MAAM,EACX,KAAK,SAAS,EACd,KAAK,gBAAgB,EACrB,KAAK,YAAY,EACjB,KAAK,WAAW,EAChB,KAAK,YAAY,EACjB,KAAK,eAAe,EACpB,KAAK,sBAAsB,EAC3B,KAAK,uBAAuB,EAC5B,KAAK,SAAS,EACd,KAAK,oBAAoB,EACzB,KAAK,4BAA4B,EACjC,KAAK,MAAM,EAGX,MAAM,qBAAqB,CAAC;AAC7B,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"comparisonForest.d.ts","sourceRoot":"","sources":["../../../src/feature-libraries/comparison-forest/comparisonForest.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAElE,OAAO,EACN,KAAK,MAAM,EACX,KAAK,SAAS,EACd,KAAK,gBAAgB,EACrB,KAAK,YAAY,EACjB,KAAK,WAAW,EAChB,KAAK,YAAY,EACjB,KAAK,eAAe,EACpB,KAAK,sBAAsB,EAC3B,KAAK,uBAAuB,EAC5B,KAAK,SAAS,EACd,KAAK,oBAAoB,EACzB,KAAK,4BAA4B,EACjC,KAAK,MAAM,EAGX,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAkB,KAAK,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAIrE;;;;;;;;;;;;;;;;GAgBG;AACH,qBAAa,gBAAiB,YAAW,eAAe;aAQtC,IAAI,EAAE,eAAe;aACrB,SAAS,EAAE,eAAe;IAR3C;;;;;OAKG;gBAEc,IAAI,EAAE,eAAe,EACrB,SAAS,EAAE,eAAe;IAM3C,OAAO,CAAC,WAAW;IAInB,IAAW,MAAM,IAAI,UAAU,CAAC,YAAY,CAAC,CAE5C;IAED,IAAW,OAAO,IAAI,SAAS,CAE9B;IAED,IAAW,OAAO,IAAI,OAAO,CAE5B;IAED,IAAW,OAAO,IAAI,SAAS,CAE9B;IAEM,KAAK,CAAC,MAAM,EAAE,4BAA4B,EAAE,OAAO,CAAC,EAAE,SAAS,GAAG,gBAAgB;IAQlF,UAAU,CAAC,MAAM,EAAE,sBAAsB,GAAG,SAAS,EAAE;IAIvD,cAAc,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,uBAAuB;IAMxD,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAIlC,mBAAmB,CACzB,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,uBAAuB,GACnC,oBAAoB;IAIhB,oBAAoB,CAC1B,WAAW,EAAE,WAAW,EACxB,YAAY,EAAE,uBAAuB,GACnC,oBAAoB;IAIhB,gBAAgB,CAAC,WAAW,EAAE,MAAM,EAAE,YAAY,EAAE,uBAAuB,GAAG,IAAI;IAIlF,4BAA4B,IAAI,sBAAsB;IAItD,wBAAwB,CAAC,OAAO,EAAE,MAAM,gBAAgB,GAAG,IAAI;IAI/D,0BAA0B,CAAC,OAAO,EAAE,MAAM,gBAAgB,GAAG,IAAI;IAIjE,cAAc,IAAI,YAAY;CAYrC"}
|
|
@@ -2,7 +2,9 @@
|
|
|
2
2
|
* Copyright (c) Microsoft Corporation and contributors. All rights reserved.
|
|
3
3
|
* Licensed under the MIT License.
|
|
4
4
|
*/
|
|
5
|
+
import { __esDecorate, __runInitializers } from "tslib";
|
|
5
6
|
import { combineVisitors, createAnnouncedVisitor, } from "../../core/index.js";
|
|
7
|
+
import { breakingMethod } from "../../util/index.js";
|
|
6
8
|
import { assertForestsEqual } from "../treeTextCursor.js";
|
|
7
9
|
/**
|
|
8
10
|
* An {@link IEditableForest} which wraps two other forests: a `main` forest and a `reference` forest.
|
|
@@ -21,74 +23,90 @@ import { assertForestsEqual } from "../treeTextCursor.js";
|
|
|
21
23
|
* This forest is intentionally expensive: it maintains two full copies of the data and re-reads and
|
|
22
24
|
* structurally compares all of their contents after every delta.
|
|
23
25
|
*/
|
|
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
|
-
|
|
26
|
+
let ComparisonForest = (() => {
|
|
27
|
+
var _a;
|
|
28
|
+
let _instanceExtraInitializers = [];
|
|
29
|
+
let _assertValid_decorators;
|
|
30
|
+
return _a = class ComparisonForest {
|
|
31
|
+
/**
|
|
32
|
+
* @param main - The forest whose behavior is under test.
|
|
33
|
+
* All reads are delegated to this forest, and it is the source of truth for anchors and events.
|
|
34
|
+
* @param reference - The forest to compare against.
|
|
35
|
+
* This forest receives all the same deltas as `main`, and its contents are asserted to match `main` after each delta.
|
|
36
|
+
*/
|
|
37
|
+
constructor(main, reference) {
|
|
38
|
+
this.main = (__runInitializers(this, _instanceExtraInitializers), main);
|
|
39
|
+
this.reference = reference;
|
|
40
|
+
this.assertValid();
|
|
41
|
+
}
|
|
42
|
+
assertValid() {
|
|
43
|
+
assertForestsEqual(this.main, this.reference);
|
|
44
|
+
}
|
|
45
|
+
get events() {
|
|
46
|
+
return this.main.events;
|
|
47
|
+
}
|
|
48
|
+
get anchors() {
|
|
49
|
+
return this.main.anchors;
|
|
50
|
+
}
|
|
51
|
+
get isEmpty() {
|
|
52
|
+
return this.main.isEmpty;
|
|
53
|
+
}
|
|
54
|
+
get breaker() {
|
|
55
|
+
return this.main.breaker;
|
|
56
|
+
}
|
|
57
|
+
clone(schema, breaker) {
|
|
58
|
+
this.assertValid();
|
|
59
|
+
return new _a(this.main.clone(schema, breaker), this.reference.clone(schema, breaker));
|
|
60
|
+
}
|
|
61
|
+
chunkField(cursor) {
|
|
62
|
+
return this.main.chunkField(cursor);
|
|
63
|
+
}
|
|
64
|
+
allocateCursor(source) {
|
|
65
|
+
// Currently we just use the cursor from "main", but we could use "reference" or a custom cursor ensuring both match in behavior.
|
|
66
|
+
// TODO: Add a custom combined cursor type which validates two cursors match, and use it here.
|
|
67
|
+
return this.main.allocateCursor(source);
|
|
68
|
+
}
|
|
69
|
+
forgetAnchor(anchor) {
|
|
70
|
+
this.main.forgetAnchor(anchor);
|
|
71
|
+
}
|
|
72
|
+
tryMoveCursorToNode(destination, cursorToMove) {
|
|
73
|
+
return this.main.tryMoveCursorToNode(destination, cursorToMove);
|
|
74
|
+
}
|
|
75
|
+
tryMoveCursorToField(destination, cursorToMove) {
|
|
76
|
+
return this.main.tryMoveCursorToField(destination, cursorToMove);
|
|
77
|
+
}
|
|
78
|
+
moveCursorToPath(destination, cursorToMove) {
|
|
79
|
+
this.main.moveCursorToPath(destination, cursorToMove);
|
|
80
|
+
}
|
|
81
|
+
getCursorAboveDetachedFields() {
|
|
82
|
+
return this.main.getCursorAboveDetachedFields();
|
|
83
|
+
}
|
|
84
|
+
registerAnnouncedVisitor(visitor) {
|
|
85
|
+
this.main.registerAnnouncedVisitor(visitor);
|
|
86
|
+
}
|
|
87
|
+
deregisterAnnouncedVisitor(visitor) {
|
|
88
|
+
this.main.deregisterAnnouncedVisitor(visitor);
|
|
89
|
+
}
|
|
90
|
+
acquireVisitor() {
|
|
91
|
+
this.assertValid();
|
|
92
|
+
const main = this.main;
|
|
93
|
+
const reference = this.reference;
|
|
94
|
+
const mainVisitor = main.acquireVisitor();
|
|
95
|
+
const referenceVisitor = reference.acquireVisitor();
|
|
96
|
+
// A visitor which does nothing except assert the two forests match once the delta has been fully applied to both.
|
|
97
|
+
const comparisonVisitor = createAnnouncedVisitor({
|
|
98
|
+
free: () => this.assertValid(),
|
|
99
|
+
});
|
|
100
|
+
return combineVisitors([mainVisitor, referenceVisitor, comparisonVisitor]);
|
|
101
|
+
}
|
|
102
|
+
},
|
|
103
|
+
(() => {
|
|
104
|
+
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(null) : void 0;
|
|
105
|
+
_assertValid_decorators = [breakingMethod];
|
|
106
|
+
__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);
|
|
107
|
+
if (_metadata) Object.defineProperty(_a, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
|
|
108
|
+
})(),
|
|
109
|
+
_a;
|
|
110
|
+
})();
|
|
111
|
+
export { ComparisonForest };
|
|
94
112
|
//# 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,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAU9D,OAAO,EAEN,kBAAkB,EAClB,mBAAmB,GAEnB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAIN,8BAA8B,GAC9B,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAIN,mBAAmB,GACnB,MAAM,8BAA8B,CAAC;AAGtC;;GAEG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAG,wBAAwB,CAAC;AAElE;;GAEG;AACH,MAAM,CAAN,IAAkB,sCAajB;AAbD,WAAkB,sCAAsC;IACvD;;OAEG;IACH,+FAAM,CAAA;IACN;;OAEG;IACH,+FAAM,CAAA;IACN;;OAEG;IACH,yGAAY,CAAA;AACb,CAAC,EAbiB,sCAAsC,KAAtC,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,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAU9D,OAAO,EAEN,kBAAkB,EAClB,mBAAmB,GAEnB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAIN,8BAA8B,GAC9B,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAIN,mBAAmB,GACnB,MAAM,8BAA8B,CAAC;AAGtC;;GAEG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAG,wBAAwB,CAAC;AAElE;;GAEG;AACH,MAAM,CAAN,IAAkB,sCAajB;AAbD,WAAkB,sCAAsC;IACvD;;OAEG;IACH,+FAAM,CAAA;IACN;;OAEG;IACH,+FAAM,CAAA;IACN;;OAEG;IACH,yGAAY,CAAA;AACb,CAAC,EAbiB,sCAAsC,KAAtC,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,MAAM,OAAO,4BACZ,SAAQ,mBAA2D;IAKnE,YACkB,kBAAsC,EACvD,gBAAkC,EAClC,YAA2B,EAC3B,OAA2B;QAE3B,MAAM,iBAAiB,GAAG,OAAO,IAAI;YACpC,aAAa,EAAE,mBAAmB;YAClC,mBAAmB,EAAE,kBAAkB,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,8BAA8B,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,yBAAyB,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;IAC7D,CAAC;IAES,KAAK,CAAC,YAAY,CAC3B,QAAgC,EAChC,KAA2B;QAE3B,IAAI,MAAM,QAAQ,CAAC,QAAQ,CAAC,yBAAyB,CAAC,EAAE,CAAC;YACxD,MAAM,wBAAwB,GAAG,MAAM,QAAQ,CAAC,QAAQ,CAAC,yBAAyB,CAAC,CAAC;YACpF,MAAM,gBAAgB,GAAG,cAAc,CAAC,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","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"}
|