@fluidframework/merge-tree 2.0.0-rc.2.0.1 → 2.0.0-rc.3.0.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 +23 -0
- package/api-report/merge-tree.api.md +16 -4
- package/dist/MergeTreeTextHelper.d.ts.map +1 -1
- package/dist/MergeTreeTextHelper.js.map +1 -1
- package/dist/attributionCollection.d.ts +1 -1
- package/dist/attributionCollection.d.ts.map +1 -1
- package/dist/attributionCollection.js +6 -6
- package/dist/attributionCollection.js.map +1 -1
- package/dist/attributionPolicy.d.ts +2 -2
- package/dist/attributionPolicy.d.ts.map +1 -1
- package/dist/attributionPolicy.js +5 -5
- package/dist/attributionPolicy.js.map +1 -1
- package/dist/client.d.ts +8 -8
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +37 -48
- package/dist/client.js.map +1 -1
- package/dist/collections/list.js +3 -3
- package/dist/collections/list.js.map +1 -1
- package/dist/endOfTreeSegment.d.ts +5 -5
- package/dist/endOfTreeSegment.d.ts.map +1 -1
- package/dist/endOfTreeSegment.js +2 -2
- package/dist/endOfTreeSegment.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -2
- package/dist/index.js.map +1 -1
- package/dist/legacy.d.ts +76 -0
- package/dist/localReference.d.ts.map +1 -1
- package/dist/localReference.js +7 -7
- package/dist/localReference.js.map +1 -1
- package/dist/mergeTree.d.ts +8 -8
- package/dist/mergeTree.d.ts.map +1 -1
- package/dist/mergeTree.js +44 -57
- package/dist/mergeTree.js.map +1 -1
- package/dist/mergeTreeDeltaCallback.d.ts +1 -1
- package/dist/mergeTreeDeltaCallback.d.ts.map +1 -1
- package/dist/mergeTreeDeltaCallback.js +4 -0
- package/dist/mergeTreeDeltaCallback.js.map +1 -1
- package/dist/mergeTreeNodeWalk.d.ts +3 -3
- package/dist/mergeTreeNodeWalk.d.ts.map +1 -1
- package/dist/mergeTreeNodeWalk.js.map +1 -1
- package/dist/mergeTreeNodes.d.ts +37 -55
- package/dist/mergeTreeNodes.d.ts.map +1 -1
- package/dist/mergeTreeNodes.js +40 -19
- package/dist/mergeTreeNodes.js.map +1 -1
- package/dist/opBuilder.d.ts +1 -1
- package/dist/opBuilder.d.ts.map +1 -1
- package/dist/opBuilder.js.map +1 -1
- package/dist/ordinal.js +2 -2
- package/dist/ordinal.js.map +1 -1
- package/dist/partialLengths.d.ts +6 -6
- package/dist/partialLengths.d.ts.map +1 -1
- package/dist/partialLengths.js +13 -13
- package/dist/partialLengths.js.map +1 -1
- package/dist/public.d.ts +12 -0
- package/dist/revertibles.d.ts +1 -1
- package/dist/revertibles.d.ts.map +1 -1
- package/dist/revertibles.js +15 -15
- package/dist/revertibles.js.map +1 -1
- package/dist/segmentPropertiesManager.d.ts.map +1 -1
- package/dist/segmentPropertiesManager.js +2 -2
- package/dist/segmentPropertiesManager.js.map +1 -1
- package/dist/snapshotChunks.d.ts +2 -2
- package/dist/snapshotChunks.d.ts.map +1 -1
- package/dist/snapshotChunks.js.map +1 -1
- package/dist/snapshotLoader.d.ts +2 -2
- package/dist/snapshotLoader.d.ts.map +1 -1
- package/dist/snapshotLoader.js +11 -11
- package/dist/snapshotLoader.js.map +1 -1
- package/dist/snapshotV1.d.ts +3 -3
- package/dist/snapshotV1.d.ts.map +1 -1
- package/dist/snapshotV1.js +10 -10
- package/dist/snapshotV1.js.map +1 -1
- package/dist/snapshotlegacy.d.ts +4 -4
- package/dist/snapshotlegacy.d.ts.map +1 -1
- package/dist/snapshotlegacy.js +9 -10
- package/dist/snapshotlegacy.js.map +1 -1
- package/dist/test/Insertion.perf.spec.js.map +1 -1
- package/dist/test/PartialLengths.perf.spec.js +1 -1
- package/dist/test/PartialLengths.perf.spec.js.map +1 -1
- package/dist/test/Removal.perf.spec.js +1 -1
- package/dist/test/Removal.perf.spec.js.map +1 -1
- package/dist/test/Snapshot.perf.spec.js.map +1 -1
- package/dist/test/attributionCollection.perf.spec.js +2 -2
- package/dist/test/attributionCollection.perf.spec.js.map +1 -1
- package/dist/test/attributionCollection.spec.js.map +1 -1
- package/dist/test/attributionPolicy.spec.js.map +1 -1
- package/dist/test/beastTest.spec.d.ts.map +1 -1
- package/dist/test/beastTest.spec.js +7 -7
- package/dist/test/beastTest.spec.js.map +1 -1
- package/dist/test/client.annotateMarker.spec.js.map +1 -1
- package/dist/test/client.apis.spec.d.ts.map +1 -1
- package/dist/test/client.apis.spec.js.map +1 -1
- package/dist/test/client.applyMsg.spec.js +2 -2
- package/dist/test/client.applyMsg.spec.js.map +1 -1
- package/dist/test/client.applyStashedOpFarm.spec.d.ts +1 -1
- package/dist/test/client.applyStashedOpFarm.spec.d.ts.map +1 -1
- package/dist/test/client.applyStashedOpFarm.spec.js.map +1 -1
- package/dist/test/client.attributionFarm.spec.d.ts.map +1 -1
- package/dist/test/client.attributionFarm.spec.js +1 -1
- package/dist/test/client.attributionFarm.spec.js.map +1 -1
- package/dist/test/client.conflictFarm.spec.d.ts.map +1 -1
- package/dist/test/client.conflictFarm.spec.js.map +1 -1
- package/dist/test/client.getPosition.spec.js +1 -1
- package/dist/test/client.getPosition.spec.js.map +1 -1
- package/dist/test/client.localReference.spec.js +6 -6
- package/dist/test/client.localReference.spec.js.map +1 -1
- package/dist/test/client.localReferenceFarm.spec.js +2 -2
- package/dist/test/client.localReferenceFarm.spec.js.map +1 -1
- package/dist/test/client.rebasePosition.spec.js.map +1 -1
- package/dist/test/client.reconnectFarm.spec.d.ts +1 -1
- package/dist/test/client.reconnectFarm.spec.d.ts.map +1 -1
- package/dist/test/client.reconnectFarm.spec.js +1 -1
- package/dist/test/client.reconnectFarm.spec.js.map +1 -1
- package/dist/test/client.replay.spec.js +4 -4
- package/dist/test/client.replay.spec.js.map +1 -1
- package/dist/test/client.rollback.spec.js +2 -2
- package/dist/test/client.rollback.spec.js.map +1 -1
- package/dist/test/client.rollbackFarm.spec.js.map +1 -1
- package/dist/test/client.searchForMarker.spec.js +1 -1
- package/dist/test/client.searchForMarker.spec.js.map +1 -1
- package/dist/test/client.walkSegments.spec.js.map +1 -1
- package/dist/test/collections.list.spec.js.map +1 -1
- package/dist/test/createInsertOnlyAttributionPolicy.spec.js.map +1 -1
- package/dist/test/mergeTree.annotate.deltaCallback.spec.js +3 -3
- package/dist/test/mergeTree.annotate.deltaCallback.spec.js.map +1 -1
- package/dist/test/mergeTree.annotate.spec.js +1 -1
- package/dist/test/mergeTree.annotate.spec.js.map +1 -1
- package/dist/test/mergeTree.insert.deltaCallback.spec.js +1 -1
- package/dist/test/mergeTree.insert.deltaCallback.spec.js.map +1 -1
- package/dist/test/mergeTree.insertingWalk.spec.js +3 -3
- package/dist/test/mergeTree.insertingWalk.spec.js.map +1 -1
- package/dist/test/mergeTree.markRangeRemoved.deltaCallback.spec.js +1 -1
- package/dist/test/mergeTree.markRangeRemoved.deltaCallback.spec.js.map +1 -1
- package/dist/test/mergeTree.markRangeRemoved.spec.js +1 -1
- package/dist/test/mergeTree.markRangeRemoved.spec.js.map +1 -1
- package/dist/test/mergeTree.walk.spec.js +2 -2
- package/dist/test/mergeTree.walk.spec.js.map +1 -1
- package/dist/test/mergeTree.zamboni.spec.js.map +1 -1
- package/dist/test/mergeTreeOperationRunner.d.ts +2 -2
- package/dist/test/mergeTreeOperationRunner.d.ts.map +1 -1
- package/dist/test/mergeTreeOperationRunner.js +3 -3
- package/dist/test/mergeTreeOperationRunner.js.map +1 -1
- package/dist/test/mergeTreeOperationRunner.spec.js.map +1 -1
- package/dist/test/obliterate.concurrent.spec.js +2 -2
- package/dist/test/obliterate.concurrent.spec.js.map +1 -1
- package/dist/test/obliterate.deltaCallback.spec.js +1 -1
- package/dist/test/obliterate.deltaCallback.spec.js.map +1 -1
- package/dist/test/obliterate.partialLength.spec.js.map +1 -1
- package/dist/test/obliterate.reconnect.spec.js.map +1 -1
- package/dist/test/obliterate.spec.js.map +1 -1
- package/dist/test/ordinal.spec.d.ts +4 -0
- package/dist/test/ordinal.spec.d.ts.map +1 -1
- package/dist/test/ordinal.spec.js +4 -4
- package/dist/test/ordinal.spec.js.map +1 -1
- package/dist/test/partialLength.spec.js.map +1 -1
- package/dist/test/properties.spec.js.map +1 -1
- package/dist/test/reconnectHelper.d.ts +1 -1
- package/dist/test/reconnectHelper.d.ts.map +1 -1
- package/dist/test/reconnectHelper.js.map +1 -1
- package/dist/test/resetPendingSegmentsToOp.spec.js +1 -1
- package/dist/test/resetPendingSegmentsToOp.spec.js.map +1 -1
- package/dist/test/revertibleFarm.spec.js +1 -1
- package/dist/test/revertibleFarm.spec.js.map +1 -1
- package/dist/test/revertibles.spec.d.ts.map +1 -1
- package/dist/test/revertibles.spec.js +1 -1
- package/dist/test/revertibles.spec.js.map +1 -1
- package/dist/test/segmentGroupCollection.spec.js.map +1 -1
- package/dist/test/snapshot.spec.js +1 -1
- package/dist/test/snapshot.spec.js.map +1 -1
- package/dist/test/snapshot.utils.d.ts +1 -1
- package/dist/test/snapshot.utils.d.ts.map +1 -1
- package/dist/test/snapshot.utils.js +3 -3
- package/dist/test/snapshot.utils.js.map +1 -1
- package/dist/test/snapshotlegacy.spec.js +8 -8
- package/dist/test/snapshotlegacy.spec.js.map +1 -1
- package/dist/test/sortedSegmentSet.spec.js +2 -2
- package/dist/test/sortedSegmentSet.spec.js.map +1 -1
- package/dist/test/testClient.d.ts +5 -5
- package/dist/test/testClient.d.ts.map +1 -1
- package/dist/test/testClient.js +11 -11
- package/dist/test/testClient.js.map +1 -1
- package/dist/test/testClientLogger.d.ts +1 -1
- package/dist/test/testClientLogger.d.ts.map +1 -1
- package/dist/test/testClientLogger.js +10 -8
- package/dist/test/testClientLogger.js.map +1 -1
- package/dist/test/testSerializer.d.ts.map +1 -1
- package/dist/test/testSerializer.js +2 -2
- package/dist/test/testSerializer.js.map +1 -1
- package/dist/test/testServer.d.ts +1 -1
- package/dist/test/testServer.d.ts.map +1 -1
- package/dist/test/testServer.js +4 -4
- package/dist/test/testServer.js.map +1 -1
- package/dist/test/testUtils.d.ts +5 -5
- package/dist/test/testUtils.d.ts.map +1 -1
- package/dist/test/testUtils.js +3 -3
- package/dist/test/testUtils.js.map +1 -1
- package/dist/test/text.d.ts +1 -1
- package/dist/test/text.d.ts.map +1 -1
- package/dist/test/text.js.map +1 -1
- package/dist/test/tracking.spec.js.map +1 -1
- package/dist/test/wordUnitTests.spec.d.ts.map +1 -1
- package/dist/test/wordUnitTests.spec.js +2 -2
- package/dist/test/wordUnitTests.spec.js.map +1 -1
- package/dist/textSegment.d.ts.map +1 -1
- package/dist/textSegment.js +2 -2
- package/dist/textSegment.js.map +1 -1
- package/dist/zamboni.d.ts +2 -2
- package/dist/zamboni.d.ts.map +1 -1
- package/dist/zamboni.js.map +1 -1
- package/internal.d.ts +11 -0
- package/legacy.d.ts +11 -0
- package/lib/MergeTreeTextHelper.d.ts.map +1 -1
- package/lib/MergeTreeTextHelper.js.map +1 -1
- package/lib/attributionCollection.d.ts +1 -1
- package/lib/attributionCollection.d.ts.map +1 -1
- package/lib/attributionCollection.js +1 -1
- package/lib/attributionCollection.js.map +1 -1
- package/lib/attributionPolicy.d.ts +2 -2
- package/lib/attributionPolicy.d.ts.map +1 -1
- package/lib/attributionPolicy.js +4 -4
- package/lib/attributionPolicy.js.map +1 -1
- package/lib/client.d.ts +8 -8
- package/lib/client.d.ts.map +1 -1
- package/lib/client.js +14 -25
- package/lib/client.js.map +1 -1
- package/lib/collections/list.js +1 -1
- package/lib/collections/list.js.map +1 -1
- package/lib/endOfTreeSegment.d.ts +5 -5
- package/lib/endOfTreeSegment.d.ts.map +1 -1
- package/lib/endOfTreeSegment.js +2 -2
- package/lib/endOfTreeSegment.js.map +1 -1
- package/lib/index.d.ts +1 -1
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +1 -1
- package/lib/index.js.map +1 -1
- package/lib/legacy.d.ts +76 -0
- package/lib/localReference.d.ts.map +1 -1
- package/lib/localReference.js +2 -2
- package/lib/localReference.js.map +1 -1
- package/lib/mergeTree.d.ts +8 -8
- package/lib/mergeTree.d.ts.map +1 -1
- package/lib/mergeTree.js +23 -36
- package/lib/mergeTree.js.map +1 -1
- package/lib/mergeTreeDeltaCallback.d.ts +1 -1
- package/lib/mergeTreeDeltaCallback.d.ts.map +1 -1
- package/lib/mergeTreeDeltaCallback.js +4 -0
- package/lib/mergeTreeDeltaCallback.js.map +1 -1
- package/lib/mergeTreeNodeWalk.d.ts +3 -3
- package/lib/mergeTreeNodeWalk.d.ts.map +1 -1
- package/lib/mergeTreeNodeWalk.js.map +1 -1
- package/lib/mergeTreeNodes.d.ts +37 -55
- package/lib/mergeTreeNodes.d.ts.map +1 -1
- package/lib/mergeTreeNodes.js +28 -8
- package/lib/mergeTreeNodes.js.map +1 -1
- package/lib/opBuilder.d.ts +1 -1
- package/lib/opBuilder.d.ts.map +1 -1
- package/lib/opBuilder.js.map +1 -1
- package/lib/ordinal.js +1 -1
- package/lib/ordinal.js.map +1 -1
- package/lib/partialLengths.d.ts +6 -6
- package/lib/partialLengths.d.ts.map +1 -1
- package/lib/partialLengths.js +3 -3
- package/lib/partialLengths.js.map +1 -1
- package/lib/public.d.ts +12 -0
- package/lib/revertibles.d.ts +1 -1
- package/lib/revertibles.d.ts.map +1 -1
- package/lib/revertibles.js +4 -4
- package/lib/revertibles.js.map +1 -1
- package/lib/segmentPropertiesManager.d.ts.map +1 -1
- package/lib/segmentPropertiesManager.js +1 -1
- package/lib/segmentPropertiesManager.js.map +1 -1
- package/lib/snapshotChunks.d.ts +2 -2
- package/lib/snapshotChunks.d.ts.map +1 -1
- package/lib/snapshotChunks.js.map +1 -1
- package/lib/snapshotLoader.d.ts +2 -2
- package/lib/snapshotLoader.d.ts.map +1 -1
- package/lib/snapshotLoader.js +2 -2
- package/lib/snapshotLoader.js.map +1 -1
- package/lib/snapshotV1.d.ts +3 -3
- package/lib/snapshotV1.d.ts.map +1 -1
- package/lib/snapshotV1.js +5 -5
- package/lib/snapshotV1.js.map +1 -1
- package/lib/snapshotlegacy.d.ts +4 -4
- package/lib/snapshotlegacy.d.ts.map +1 -1
- package/lib/snapshotlegacy.js +3 -4
- package/lib/snapshotlegacy.js.map +1 -1
- package/lib/test/Insertion.perf.spec.js +1 -1
- package/lib/test/Insertion.perf.spec.js.map +1 -1
- package/lib/test/PartialLengths.perf.spec.js +2 -2
- package/lib/test/PartialLengths.perf.spec.js.map +1 -1
- package/lib/test/Removal.perf.spec.js +2 -2
- package/lib/test/Removal.perf.spec.js.map +1 -1
- package/lib/test/Snapshot.perf.spec.js +2 -2
- package/lib/test/Snapshot.perf.spec.js.map +1 -1
- package/lib/test/attributionCollection.perf.spec.js +4 -4
- package/lib/test/attributionCollection.perf.spec.js.map +1 -1
- package/lib/test/attributionCollection.spec.js.map +1 -1
- package/lib/test/attributionPolicy.spec.js.map +1 -1
- package/lib/test/beastTest.spec.d.ts.map +1 -1
- package/lib/test/beastTest.spec.js +8 -8
- package/lib/test/beastTest.spec.js.map +1 -1
- package/lib/test/client.annotateMarker.spec.js.map +1 -1
- package/lib/test/client.apis.spec.d.ts.map +1 -1
- package/lib/test/client.apis.spec.js.map +1 -1
- package/lib/test/client.applyMsg.spec.js +3 -3
- package/lib/test/client.applyMsg.spec.js.map +1 -1
- package/lib/test/client.applyStashedOpFarm.spec.d.ts +1 -1
- package/lib/test/client.applyStashedOpFarm.spec.d.ts.map +1 -1
- package/lib/test/client.applyStashedOpFarm.spec.js +1 -1
- package/lib/test/client.applyStashedOpFarm.spec.js.map +1 -1
- package/lib/test/client.attributionFarm.spec.d.ts.map +1 -1
- package/lib/test/client.attributionFarm.spec.js +2 -2
- package/lib/test/client.attributionFarm.spec.js.map +1 -1
- package/lib/test/client.conflictFarm.spec.d.ts.map +1 -1
- package/lib/test/client.conflictFarm.spec.js +1 -1
- package/lib/test/client.conflictFarm.spec.js.map +1 -1
- package/lib/test/client.getPosition.spec.js.map +1 -1
- package/lib/test/client.localReference.spec.js +5 -5
- package/lib/test/client.localReference.spec.js.map +1 -1
- package/lib/test/client.localReferenceFarm.spec.js +2 -2
- package/lib/test/client.localReferenceFarm.spec.js.map +1 -1
- package/lib/test/client.rebasePosition.spec.js.map +1 -1
- package/lib/test/client.reconnectFarm.spec.d.ts +1 -1
- package/lib/test/client.reconnectFarm.spec.d.ts.map +1 -1
- package/lib/test/client.reconnectFarm.spec.js +2 -2
- package/lib/test/client.reconnectFarm.spec.js.map +1 -1
- package/lib/test/client.replay.spec.js +3 -3
- package/lib/test/client.replay.spec.js.map +1 -1
- package/lib/test/client.rollback.spec.js +1 -1
- package/lib/test/client.rollback.spec.js.map +1 -1
- package/lib/test/client.rollbackFarm.spec.js +1 -1
- package/lib/test/client.rollbackFarm.spec.js.map +1 -1
- package/lib/test/client.searchForMarker.spec.js +2 -2
- package/lib/test/client.searchForMarker.spec.js.map +1 -1
- package/lib/test/client.walkSegments.spec.js.map +1 -1
- package/lib/test/collections.list.spec.js.map +1 -1
- package/lib/test/createInsertOnlyAttributionPolicy.spec.js.map +1 -1
- package/lib/test/mergeTree.annotate.deltaCallback.spec.js +3 -3
- package/lib/test/mergeTree.annotate.deltaCallback.spec.js.map +1 -1
- package/lib/test/mergeTree.annotate.spec.js +1 -1
- package/lib/test/mergeTree.annotate.spec.js.map +1 -1
- package/lib/test/mergeTree.insert.deltaCallback.spec.js +1 -1
- package/lib/test/mergeTree.insert.deltaCallback.spec.js.map +1 -1
- package/lib/test/mergeTree.insertingWalk.spec.js +3 -3
- package/lib/test/mergeTree.insertingWalk.spec.js.map +1 -1
- package/lib/test/mergeTree.markRangeRemoved.deltaCallback.spec.js +1 -1
- package/lib/test/mergeTree.markRangeRemoved.deltaCallback.spec.js.map +1 -1
- package/lib/test/mergeTree.markRangeRemoved.spec.js.map +1 -1
- package/lib/test/mergeTree.walk.spec.js +2 -2
- package/lib/test/mergeTree.walk.spec.js.map +1 -1
- package/lib/test/mergeTree.zamboni.spec.js +1 -1
- package/lib/test/mergeTree.zamboni.spec.js.map +1 -1
- package/lib/test/mergeTreeOperationRunner.d.ts +2 -2
- package/lib/test/mergeTreeOperationRunner.d.ts.map +1 -1
- package/lib/test/mergeTreeOperationRunner.js +3 -3
- package/lib/test/mergeTreeOperationRunner.js.map +1 -1
- package/lib/test/mergeTreeOperationRunner.spec.js.map +1 -1
- package/lib/test/obliterate.concurrent.spec.js +1 -1
- package/lib/test/obliterate.concurrent.spec.js.map +1 -1
- package/lib/test/obliterate.deltaCallback.spec.js +1 -1
- package/lib/test/obliterate.deltaCallback.spec.js.map +1 -1
- package/lib/test/obliterate.partialLength.spec.js.map +1 -1
- package/lib/test/obliterate.reconnect.spec.js.map +1 -1
- package/lib/test/obliterate.spec.js.map +1 -1
- package/lib/test/ordinal.spec.d.ts +4 -0
- package/lib/test/ordinal.spec.d.ts.map +1 -1
- package/lib/test/ordinal.spec.js.map +1 -1
- package/lib/test/partialLength.spec.js.map +1 -1
- package/lib/test/properties.spec.js.map +1 -1
- package/lib/test/reconnectHelper.d.ts +1 -1
- package/lib/test/reconnectHelper.d.ts.map +1 -1
- package/lib/test/reconnectHelper.js +1 -1
- package/lib/test/reconnectHelper.js.map +1 -1
- package/lib/test/resetPendingSegmentsToOp.spec.js.map +1 -1
- package/lib/test/revertibleFarm.spec.js +3 -3
- package/lib/test/revertibleFarm.spec.js.map +1 -1
- package/lib/test/revertibles.spec.d.ts.map +1 -1
- package/lib/test/revertibles.spec.js +2 -2
- package/lib/test/revertibles.spec.js.map +1 -1
- package/lib/test/segmentGroupCollection.spec.js.map +1 -1
- package/lib/test/snapshot.spec.js +2 -2
- package/lib/test/snapshot.spec.js.map +1 -1
- package/lib/test/snapshot.utils.d.ts +1 -1
- package/lib/test/snapshot.utils.d.ts.map +1 -1
- package/lib/test/snapshot.utils.js +2 -2
- package/lib/test/snapshot.utils.js.map +1 -1
- package/lib/test/snapshotlegacy.spec.js +4 -4
- package/lib/test/snapshotlegacy.spec.js.map +1 -1
- package/lib/test/sortedSegmentSet.spec.js +2 -2
- package/lib/test/sortedSegmentSet.spec.js.map +1 -1
- package/lib/test/testClient.d.ts +5 -5
- package/lib/test/testClient.d.ts.map +1 -1
- package/lib/test/testClient.js +7 -7
- package/lib/test/testClient.js.map +1 -1
- package/lib/test/testClientLogger.d.ts +1 -1
- package/lib/test/testClientLogger.d.ts.map +1 -1
- package/lib/test/testClientLogger.js +9 -7
- package/lib/test/testClientLogger.js.map +1 -1
- package/lib/test/testSerializer.d.ts.map +1 -1
- package/lib/test/testSerializer.js +1 -1
- package/lib/test/testSerializer.js.map +1 -1
- package/lib/test/testServer.d.ts +1 -1
- package/lib/test/testServer.d.ts.map +1 -1
- package/lib/test/testServer.js +2 -2
- package/lib/test/testServer.js.map +1 -1
- package/lib/test/testUtils.d.ts +5 -5
- package/lib/test/testUtils.d.ts.map +1 -1
- package/lib/test/testUtils.js +3 -3
- package/lib/test/testUtils.js.map +1 -1
- package/lib/test/text.d.ts +1 -1
- package/lib/test/text.d.ts.map +1 -1
- package/lib/test/text.js.map +1 -1
- package/lib/test/tracking.spec.js.map +1 -1
- package/lib/test/wordUnitTests.spec.d.ts.map +1 -1
- package/lib/test/wordUnitTests.spec.js +2 -2
- package/lib/test/wordUnitTests.spec.js.map +1 -1
- package/lib/textSegment.d.ts.map +1 -1
- package/lib/textSegment.js +1 -1
- package/lib/textSegment.js.map +1 -1
- package/lib/zamboni.d.ts +2 -2
- package/lib/zamboni.d.ts.map +1 -1
- package/lib/zamboni.js.map +1 -1
- package/package.json +37 -58
- package/src/MergeTreeTextHelper.ts +1 -1
- package/src/attributionCollection.ts +4 -3
- package/src/attributionPolicy.ts +7 -6
- package/src/client.ts +32 -45
- package/src/collections/list.ts +1 -1
- package/src/endOfTreeSegment.ts +5 -4
- package/src/index.ts +5 -1
- package/src/localReference.ts +4 -3
- package/src/mergeTree.ts +66 -84
- package/src/mergeTreeDeltaCallback.ts +3 -1
- package/src/mergeTreeNodeWalk.ts +6 -6
- package/src/mergeTreeNodes.ts +59 -61
- package/src/opBuilder.ts +3 -3
- package/src/ordinal.ts +1 -1
- package/src/partialLengths.ts +11 -10
- package/src/revertibles.ts +6 -5
- package/src/segmentPropertiesManager.ts +3 -2
- package/src/snapshotChunks.ts +3 -2
- package/src/snapshotLoader.ts +10 -12
- package/src/snapshotV1.ts +15 -12
- package/src/snapshotlegacy.ts +8 -6
- package/src/textSegment.ts +2 -1
- package/src/zamboni.ts +7 -7
- package/api-extractor-cjs.json +0 -8
- package/dist/merge-tree-alpha.d.ts +0 -1558
- package/dist/merge-tree-beta.d.ts +0 -230
- package/dist/merge-tree-public.d.ts +0 -230
- package/dist/merge-tree-untrimmed.d.ts +0 -1894
- package/lib/merge-tree-alpha.d.ts +0 -1558
- package/lib/merge-tree-beta.d.ts +0 -230
- package/lib/merge-tree-public.d.ts +0 -230
- package/lib/merge-tree-untrimmed.d.ts +0 -1894
- package/lib/test/types/validateMergeTreePrevious.generated.d.ts +0 -2
- package/lib/test/types/validateMergeTreePrevious.generated.d.ts.map +0 -1
- package/lib/test/types/validateMergeTreePrevious.generated.js +0 -228
- package/lib/test/types/validateMergeTreePrevious.generated.js.map +0 -1
- /package/{dist → lib}/tsdoc-metadata.json +0 -0
package/dist/revertibles.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"revertibles.js","sourceRoot":"","sources":["../src/revertibles.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, unreachableCase } from \"@fluidframework/core-utils\";\nimport { UsageError } from \"@fluidframework/telemetry-utils\";\nimport { DoublyLinkedList } from \"./collections/index.js\";\nimport { EndOfTreeSegment } from \"./endOfTreeSegment.js\";\nimport { LocalReferenceCollection, LocalReferencePosition } from \"./localReference.js\";\nimport { IMergeTreeDeltaCallbackArgs } from \"./mergeTreeDeltaCallback.js\";\nimport { ISegmentLeaf, ISegment, toRemovalInfo } from \"./mergeTreeNodes.js\";\nimport { depthFirstNodeWalk } from \"./mergeTreeNodeWalk.js\";\nimport { ITrackingGroup, Trackable, UnorderedTrackingGroup } from \"./mergeTreeTracking.js\";\nimport { IJSONSegment, MergeTreeDeltaType, ReferenceType } from \"./ops.js\";\nimport { matchProperties, PropertySet } from \"./properties.js\";\nimport { DetachedReferencePosition } from \"./referencePositions.js\";\nimport { MergeTree, findRootMergeBlock } from \"./mergeTree.js\";\n\n/**\n * @alpha\n */\nexport type MergeTreeDeltaRevertible =\n\t| {\n\t\t\toperation: typeof MergeTreeDeltaType.INSERT;\n\t\t\ttrackingGroup: ITrackingGroup;\n\t }\n\t| {\n\t\t\toperation: typeof MergeTreeDeltaType.REMOVE;\n\t\t\ttrackingGroup: ITrackingGroup;\n\t }\n\t| {\n\t\t\toperation: typeof MergeTreeDeltaType.ANNOTATE;\n\t\t\ttrackingGroup: ITrackingGroup;\n\t\t\tpropertyDeltas: PropertySet;\n\t };\n\n/**\n * Tests whether x is a MergeTreeDeltaRevertible\n * @internal\n */\nexport function isMergeTreeDeltaRevertible(x: unknown): x is MergeTreeDeltaRevertible {\n\treturn !!x && typeof x === \"object\" && \"operation\" in x && \"trackingGroup\" in x;\n}\n\ntype TypedRevertible<T extends MergeTreeDeltaRevertible[\"operation\"]> = MergeTreeDeltaRevertible & {\n\toperation: T;\n};\n\ninterface RemoveSegmentRefProperties {\n\t/**\n\t * the serialized form of the segment, so it can be re-inserted\n\t */\n\tsegSpec: IJSONSegment;\n\t/**\n\t * a tag so the reference can be identified as being created for revert\n\t */\n\treferenceSpace: \"mergeTreeDeltaRevertible\";\n}\n\n/**\n * @alpha\n */\nexport interface MergeTreeRevertibleDriver {\n\tinsertFromSpec(pos: number, spec: IJSONSegment): void;\n\tremoveRange(start: number, end: number): void;\n\tannotateRange(start: number, end: number, props: PropertySet): void;\n}\n\n/**\n * exported for test only. should not be exported out the the package\n * @internal\n */\nexport interface MergeTreeWithRevert extends MergeTree {\n\t__mergeTreeRevertible: {\n\t\tdetachedReferences: EndOfTreeSegment;\n\t\trefCallbacks: LocalReferencePosition[\"callbacks\"];\n\t};\n}\n\nexport type PickPartial<T, K extends keyof T> = Omit<T, K> & Partial<Pick<T, K>>;\nfunction findMergeTreeWithRevert(trackable: Trackable): MergeTreeWithRevert {\n\tconst segmentOrNode = trackable.isLeaf() ? trackable : trackable.getSegment();\n\tconst maybeRoot = findRootMergeBlock(segmentOrNode);\n\tassert(\n\t\tmaybeRoot?.mergeTree !== undefined,\n\t\t0x5c2 /* trackable is invalid as it is not in a rooted merge tree. */,\n\t);\n\tconst mergeTree: PickPartial<MergeTreeWithRevert, \"__mergeTreeRevertible\"> =\n\t\tmaybeRoot.mergeTree;\n\n\tif (mergeTree.__mergeTreeRevertible === undefined) {\n\t\tconst detachedReferences = new EndOfTreeSegment(maybeRoot.mergeTree);\n\t\tconst refCallbacks: MergeTreeWithRevert[\"__mergeTreeRevertible\"][\"refCallbacks\"] = {\n\t\t\tafterSlide: (r: LocalReferencePosition) => {\n\t\t\t\tif (mergeTree.referencePositionToLocalPosition(r) === DetachedReferencePosition) {\n\t\t\t\t\tconst refs = LocalReferenceCollection.setOrGet(detachedReferences);\n\t\t\t\t\trefs.addAfterTombstones([r]);\n\t\t\t\t}\n\t\t\t},\n\t\t};\n\t\tmergeTree.__mergeTreeRevertible = {\n\t\t\trefCallbacks,\n\t\t\tdetachedReferences,\n\t\t};\n\t}\n\treturn mergeTree as MergeTreeWithRevert;\n}\n\nfunction appendLocalInsertToRevertibles(\n\tdeltaArgs: IMergeTreeDeltaCallbackArgs,\n\trevertibles: MergeTreeDeltaRevertible[],\n) {\n\tif (revertibles[revertibles.length - 1]?.operation !== MergeTreeDeltaType.INSERT) {\n\t\trevertibles.push({\n\t\t\toperation: MergeTreeDeltaType.INSERT,\n\t\t\ttrackingGroup: new UnorderedTrackingGroup(),\n\t\t});\n\t}\n\tconst last = revertibles[revertibles.length - 1];\n\tdeltaArgs.deltaSegments.forEach((t) => last.trackingGroup.link(t.segment));\n\n\treturn revertibles;\n}\n\nfunction appendLocalRemoveToRevertibles(\n\tdeltaArgs: IMergeTreeDeltaCallbackArgs,\n\trevertibles: MergeTreeDeltaRevertible[],\n) {\n\tif (revertibles[revertibles.length - 1]?.operation !== MergeTreeDeltaType.REMOVE) {\n\t\trevertibles.push({\n\t\t\toperation: MergeTreeDeltaType.REMOVE,\n\t\t\ttrackingGroup: new UnorderedTrackingGroup(),\n\t\t});\n\t}\n\tconst last = revertibles[revertibles.length - 1];\n\n\tconst mergeTreeWithRevert = findMergeTreeWithRevert(deltaArgs.deltaSegments[0].segment);\n\n\tdeltaArgs.deltaSegments.forEach((t) => {\n\t\tconst props: RemoveSegmentRefProperties = {\n\t\t\tsegSpec: t.segment.toJSONObject(),\n\t\t\treferenceSpace: \"mergeTreeDeltaRevertible\",\n\t\t};\n\t\tconst ref = mergeTreeWithRevert.createLocalReferencePosition(\n\t\t\tt.segment,\n\t\t\t0,\n\t\t\tReferenceType.SlideOnRemove,\n\t\t\tprops,\n\t\t);\n\t\tref.callbacks = mergeTreeWithRevert.__mergeTreeRevertible.refCallbacks;\n\t\tt.segment.trackingCollection.trackingGroups.forEach((tg) => {\n\t\t\ttg.link(ref);\n\t\t\ttg.unlink(t.segment);\n\t\t});\n\n\t\tlast.trackingGroup.link(ref);\n\t});\n\treturn revertibles;\n}\n\nfunction appendLocalAnnotateToRevertibles(\n\tdeltaArgs: IMergeTreeDeltaCallbackArgs,\n\trevertibles: MergeTreeDeltaRevertible[],\n) {\n\tlet last = revertibles[revertibles.length - 1];\n\tdeltaArgs.deltaSegments.forEach((ds) => {\n\t\tconst propertyDeltas = ds.propertyDeltas;\n\t\tif (propertyDeltas) {\n\t\t\tif (\n\t\t\t\tlast?.operation === MergeTreeDeltaType.ANNOTATE &&\n\t\t\t\tmatchProperties(last?.propertyDeltas, propertyDeltas)\n\t\t\t) {\n\t\t\t\tlast.trackingGroup.link(ds.segment);\n\t\t\t} else {\n\t\t\t\tlast = {\n\t\t\t\t\toperation: MergeTreeDeltaType.ANNOTATE,\n\t\t\t\t\tpropertyDeltas,\n\t\t\t\t\ttrackingGroup: new UnorderedTrackingGroup(),\n\t\t\t\t};\n\t\t\t\tlast.trackingGroup.link(ds.segment);\n\t\t\t\trevertibles.push(last);\n\t\t\t}\n\t\t}\n\t});\n\treturn revertibles;\n}\n\n/**\n * @alpha\n */\nexport function appendToMergeTreeDeltaRevertibles(\n\tdeltaArgs: IMergeTreeDeltaCallbackArgs,\n\trevertibles: MergeTreeDeltaRevertible[],\n) {\n\tif (deltaArgs.deltaSegments.length === 0) {\n\t\treturn;\n\t}\n\tswitch (deltaArgs.operation) {\n\t\tcase MergeTreeDeltaType.INSERT:\n\t\t\tappendLocalInsertToRevertibles(deltaArgs, revertibles);\n\t\t\tbreak;\n\n\t\tcase MergeTreeDeltaType.REMOVE:\n\t\t\tappendLocalRemoveToRevertibles(deltaArgs, revertibles);\n\t\t\tbreak;\n\n\t\tcase MergeTreeDeltaType.ANNOTATE:\n\t\t\tappendLocalAnnotateToRevertibles(deltaArgs, revertibles);\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tthrow new UsageError(\"Unsupported event delta type\", {\n\t\t\t\toperation: deltaArgs.operation,\n\t\t\t});\n\t}\n}\n\n/**\n * @alpha\n */\nexport function discardMergeTreeDeltaRevertible(revertibles: MergeTreeDeltaRevertible[]) {\n\trevertibles.forEach((r) => {\n\t\tr.trackingGroup.tracked.forEach((t) => {\n\t\t\tt.trackingCollection.unlink(r.trackingGroup);\n\t\t\t// remove untracked local references\n\t\t\tif (t.trackingCollection.empty && !t.isLeaf()) {\n\t\t\t\tt.getSegment()?.localRefs?.removeLocalRef(t);\n\t\t\t}\n\t\t});\n\t});\n}\n\nfunction revertLocalInsert(\n\tdriver: MergeTreeRevertibleDriver,\n\tmergeTreeWithRevert: MergeTreeWithRevert,\n\trevertible: TypedRevertible<typeof MergeTreeDeltaType.INSERT>,\n) {\n\twhile (revertible.trackingGroup.size > 0) {\n\t\tconst tracked = revertible.trackingGroup.tracked[0];\n\t\tassert(\n\t\t\ttracked.trackingCollection.unlink(revertible.trackingGroup),\n\t\t\t0x3f1 /* tracking group removed */,\n\t\t);\n\t\tassert(tracked.isLeaf(), 0x3f2 /* inserts must track segments */);\n\t\tif (toRemovalInfo(tracked) === undefined) {\n\t\t\tconst start = getPosition(mergeTreeWithRevert, tracked);\n\t\t\tdriver.removeRange(start, start + tracked.cachedLength);\n\t\t}\n\t}\n}\n\nfunction revertLocalRemove(\n\tdriver: MergeTreeRevertibleDriver,\n\tmergeTreeWithRevert: MergeTreeWithRevert,\n\trevertible: TypedRevertible<typeof MergeTreeDeltaType.REMOVE>,\n) {\n\twhile (revertible.trackingGroup.size > 0) {\n\t\tconst tracked = revertible.trackingGroup.tracked[0];\n\n\t\tassert(\n\t\t\ttracked.trackingCollection.unlink(revertible.trackingGroup),\n\t\t\t0x3f3 /* tracking group removed */,\n\t\t);\n\n\t\tassert(!tracked.isLeaf(), 0x3f4 /* removes must track local refs */);\n\n\t\tconst refSeg = tracked.getSegment();\n\t\tlet realPos = mergeTreeWithRevert.referencePositionToLocalPosition(tracked);\n\n\t\t// References which are on EndOfStringSegment don't return detached for pos,\n\t\t// they will return the length of the merge-tree. this case just catches\n\t\t// random references, likely not created in the revertible flow,\n\t\t// that are tying to be reverted for some reason.\n\t\tif (realPos === DetachedReferencePosition || refSeg === undefined) {\n\t\t\tthrow new UsageError(\"Cannot insert at detached references position\");\n\t\t}\n\n\t\tif (toRemovalInfo(refSeg) === undefined && refSeg.localRefs?.isAfterTombstone(tracked)) {\n\t\t\trealPos++;\n\t\t}\n\n\t\tconst props = tracked.properties as RemoveSegmentRefProperties;\n\t\tdriver.insertFromSpec(realPos, props.segSpec);\n\t\tconst insertSegment: ISegmentLeaf | undefined = mergeTreeWithRevert.getContainingSegment(\n\t\t\trealPos,\n\t\t\tmergeTreeWithRevert.collabWindow.currentSeq,\n\t\t\tmergeTreeWithRevert.collabWindow.clientId,\n\t\t).segment;\n\t\tassert(insertSegment !== undefined, 0x3f5 /* insert segment must exist at position */);\n\n\t\tconst localSlideFilter = (lref: LocalReferencePosition) =>\n\t\t\t(lref.properties as Partial<RemoveSegmentRefProperties>)?.referenceSpace ===\n\t\t\t\"mergeTreeDeltaRevertible\";\n\n\t\tconst insertRef: Partial<\n\t\t\tRecord<\"before\" | \"after\", DoublyLinkedList<LocalReferencePosition>>\n\t\t> = {};\n\t\tconst forward = insertSegment.ordinal < refSeg.ordinal;\n\t\tconst refHandler = (lref: LocalReferencePosition) => {\n\t\t\t// once we reach it keep the original reference where it is\n\t\t\t// we'll move tracking groups, and remove it as a last step.\n\t\t\tif (tracked === lref) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tif (localSlideFilter(lref)) {\n\t\t\t\tif (forward) {\n\t\t\t\t\tconst before = (insertRef.before ??= new DoublyLinkedList());\n\t\t\t\t\tbefore.push(lref);\n\t\t\t\t} else {\n\t\t\t\t\tconst after = (insertRef.after ??= new DoublyLinkedList());\n\t\t\t\t\tafter.unshift(lref);\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t\tdepthFirstNodeWalk(\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\t\tinsertSegment.parent!,\n\t\t\tinsertSegment,\n\t\t\tundefined,\n\t\t\t(seg) => {\n\t\t\t\tif (seg.localRefs?.empty === false) {\n\t\t\t\t\treturn seg.localRefs.walkReferences(refHandler, undefined, forward);\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t},\n\t\t\tundefined,\n\t\t\tforward,\n\t\t);\n\t\tif (\n\t\t\tmergeTreeWithRevert?.__mergeTreeRevertible?.detachedReferences?.localRefs?.has(tracked)\n\t\t) {\n\t\t\tassert(forward, 0x3f6 /* forward should always be true when detached */);\n\t\t\tmergeTreeWithRevert?.__mergeTreeRevertible.detachedReferences.localRefs.walkReferences(\n\t\t\t\trefHandler,\n\t\t\t);\n\t\t}\n\n\t\tif (insertRef !== undefined) {\n\t\t\tconst localRefs = LocalReferenceCollection.setOrGet(insertSegment);\n\t\t\tif (insertRef.before?.empty === false) {\n\t\t\t\tlocalRefs.addBeforeTombstones(insertRef.before.map((n) => n.data));\n\t\t\t}\n\t\t\tif (insertRef.after?.empty === false) {\n\t\t\t\tlocalRefs.addAfterTombstones(insertRef.after.map((n) => n.data));\n\t\t\t}\n\t\t}\n\n\t\ttracked.trackingCollection.trackingGroups.forEach((tg) => {\n\t\t\ttg.link(insertSegment);\n\t\t\ttg.unlink(tracked);\n\t\t});\n\t\ttracked.getSegment()?.localRefs?.removeLocalRef(tracked);\n\t}\n}\n\nfunction revertLocalAnnotate(\n\tdriver: MergeTreeRevertibleDriver,\n\tmergeTreeWithRevert: MergeTreeWithRevert,\n\trevertible: TypedRevertible<typeof MergeTreeDeltaType.ANNOTATE>,\n) {\n\twhile (revertible.trackingGroup.size > 0) {\n\t\tconst tracked = revertible.trackingGroup.tracked[0];\n\t\tconst unlinked = tracked.trackingCollection.unlink(revertible.trackingGroup);\n\t\tassert(unlinked && tracked.isLeaf(), 0x3f7 /* annotates must track segments */);\n\t\tif (toRemovalInfo(tracked) === undefined) {\n\t\t\tconst start = getPosition(mergeTreeWithRevert, tracked);\n\t\t\tdriver.annotateRange(start, start + tracked.cachedLength, revertible.propertyDeltas);\n\t\t}\n\t}\n}\n\nfunction getPosition(mergeTreeWithRevert: MergeTreeWithRevert, segment: ISegment) {\n\treturn mergeTreeWithRevert.getPosition(\n\t\tsegment,\n\t\tmergeTreeWithRevert.collabWindow.currentSeq,\n\t\tmergeTreeWithRevert.collabWindow.clientId,\n\t);\n}\n\n/**\n * @alpha\n */\nexport function revertMergeTreeDeltaRevertibles(\n\tdriver: MergeTreeRevertibleDriver,\n\trevertibles: MergeTreeDeltaRevertible[],\n) {\n\tlet mergeTreeWithRevert: MergeTreeWithRevert | undefined;\n\n\twhile (revertibles.length > 0) {\n\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\tconst r = revertibles.pop()!;\n\t\tconst operation = r.operation;\n\t\tif (r.trackingGroup.size > 0) {\n\t\t\tmergeTreeWithRevert ??= findMergeTreeWithRevert(r.trackingGroup.tracked[0]);\n\t\t\tswitch (operation) {\n\t\t\t\tcase MergeTreeDeltaType.INSERT:\n\t\t\t\t\trevertLocalInsert(driver, mergeTreeWithRevert, r);\n\t\t\t\t\tbreak;\n\t\t\t\tcase MergeTreeDeltaType.REMOVE:\n\t\t\t\t\trevertLocalRemove(driver, mergeTreeWithRevert, r);\n\t\t\t\t\tbreak;\n\t\t\t\tcase MergeTreeDeltaType.ANNOTATE:\n\t\t\t\t\trevertLocalAnnotate(driver, mergeTreeWithRevert, r);\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tunreachableCase(operation);\n\t\t\t}\n\t\t}\n\t}\n}\n"]}
|
|
1
|
+
{"version":3,"file":"revertibles.js","sourceRoot":"","sources":["../src/revertibles.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAEH,kEAA8E;AAC9E,uEAAsE;AAEtE,qDAA0D;AAC1D,+DAAyD;AACzD,2DAAuF;AACvF,iDAA+D;AAE/D,iEAA4D;AAC5D,2DAA4E;AAC5E,iEAA2F;AAC3F,qCAA2E;AAC3E,mDAA+D;AAC/D,mEAAoE;AAoBpE;;;GAGG;AACH,SAAgB,0BAA0B,CAAC,CAAU;IACpD,OAAO,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,WAAW,IAAI,CAAC,IAAI,eAAe,IAAI,CAAC,CAAC;AACjF,CAAC;AAFD,gEAEC;AAsCD,SAAS,uBAAuB,CAAC,SAAoB;IACpD,MAAM,aAAa,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,UAAU,EAAE,CAAC;IAC9E,MAAM,SAAS,GAAG,IAAA,iCAAkB,EAAC,aAAa,CAAC,CAAC;IACpD,IAAA,iBAAM,EACL,SAAS,EAAE,SAAS,KAAK,SAAS,EAClC,KAAK,CAAC,+DAA+D,CACrE,CAAC;IACF,MAAM,SAAS,GACd,SAAS,CAAC,SAAS,CAAC;IAErB,IAAI,SAAS,CAAC,qBAAqB,KAAK,SAAS,EAAE;QAClD,MAAM,kBAAkB,GAAG,IAAI,sCAAgB,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QACrE,MAAM,YAAY,GAAiE;YAClF,UAAU,EAAE,CAAC,CAAyB,EAAE,EAAE;gBACzC,IAAI,SAAS,CAAC,gCAAgC,CAAC,CAAC,CAAC,KAAK,iDAAyB,EAAE;oBAChF,MAAM,IAAI,GAAG,4CAAwB,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAC;oBACnE,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;iBAC7B;YACF,CAAC;SACD,CAAC;QACF,SAAS,CAAC,qBAAqB,GAAG;YACjC,YAAY;YACZ,kBAAkB;SAClB,CAAC;KACF;IACD,OAAO,SAAgC,CAAC;AACzC,CAAC;AAED,SAAS,8BAA8B,CACtC,SAAsC,EACtC,WAAuC;IAEvC,IAAI,WAAW,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,SAAS,KAAK,2BAAkB,CAAC,MAAM,EAAE;QACjF,WAAW,CAAC,IAAI,CAAC;YAChB,SAAS,EAAE,2BAAkB,CAAC,MAAM;YACpC,aAAa,EAAE,IAAI,6CAAsB,EAAE;SAC3C,CAAC,CAAC;KACH;IACD,MAAM,IAAI,GAAG,WAAW,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACjD,SAAS,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;IAE3E,OAAO,WAAW,CAAC;AACpB,CAAC;AAED,SAAS,8BAA8B,CACtC,SAAsC,EACtC,WAAuC;IAEvC,IAAI,WAAW,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,SAAS,KAAK,2BAAkB,CAAC,MAAM,EAAE;QACjF,WAAW,CAAC,IAAI,CAAC;YAChB,SAAS,EAAE,2BAAkB,CAAC,MAAM;YACpC,aAAa,EAAE,IAAI,6CAAsB,EAAE;SAC3C,CAAC,CAAC;KACH;IACD,MAAM,IAAI,GAAG,WAAW,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAEjD,MAAM,mBAAmB,GAAG,uBAAuB,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;IAExF,SAAS,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;QACrC,MAAM,KAAK,GAA+B;YACzC,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,YAAY,EAAE;YACjC,cAAc,EAAE,0BAA0B;SAC1C,CAAC;QACF,MAAM,GAAG,GAAG,mBAAmB,CAAC,4BAA4B,CAC3D,CAAC,CAAC,OAAO,EACT,CAAC,EACD,sBAAa,CAAC,aAAa,EAC3B,KAAK,CACL,CAAC;QACF,GAAG,CAAC,SAAS,GAAG,mBAAmB,CAAC,qBAAqB,CAAC,YAAY,CAAC;QACvE,CAAC,CAAC,OAAO,CAAC,kBAAkB,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE;YAC1D,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACb,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;QACtB,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC9B,CAAC,CAAC,CAAC;IACH,OAAO,WAAW,CAAC;AACpB,CAAC;AAED,SAAS,gCAAgC,CACxC,SAAsC,EACtC,WAAuC;IAEvC,IAAI,IAAI,GAAG,WAAW,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC/C,SAAS,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE;QACtC,MAAM,cAAc,GAAG,EAAE,CAAC,cAAc,CAAC;QACzC,IAAI,cAAc,EAAE;YACnB,IACC,IAAI,EAAE,SAAS,KAAK,2BAAkB,CAAC,QAAQ;gBAC/C,IAAA,+BAAe,EAAC,IAAI,EAAE,cAAc,EAAE,cAAc,CAAC,EACpD;gBACD,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC;aACpC;iBAAM;gBACN,IAAI,GAAG;oBACN,SAAS,EAAE,2BAAkB,CAAC,QAAQ;oBACtC,cAAc;oBACd,aAAa,EAAE,IAAI,6CAAsB,EAAE;iBAC3C,CAAC;gBACF,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC;gBACpC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;aACvB;SACD;IACF,CAAC,CAAC,CAAC;IACH,OAAO,WAAW,CAAC;AACpB,CAAC;AAED;;GAEG;AACH,SAAgB,iCAAiC,CAChD,SAAsC,EACtC,WAAuC;IAEvC,IAAI,SAAS,CAAC,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE;QACzC,OAAO;KACP;IACD,QAAQ,SAAS,CAAC,SAAS,EAAE;QAC5B,KAAK,2BAAkB,CAAC,MAAM;YAC7B,8BAA8B,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;YACvD,MAAM;QAEP,KAAK,2BAAkB,CAAC,MAAM;YAC7B,8BAA8B,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;YACvD,MAAM;QAEP,KAAK,2BAAkB,CAAC,QAAQ;YAC/B,gCAAgC,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;YACzD,MAAM;QAEP;YACC,MAAM,IAAI,qBAAU,CAAC,8BAA8B,EAAE;gBACpD,SAAS,EAAE,SAAS,CAAC,SAAS;aAC9B,CAAC,CAAC;KACJ;AACF,CAAC;AAzBD,8EAyBC;AAED;;GAEG;AACH,SAAgB,+BAA+B,CAAC,WAAuC;IACtF,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;QACzB,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;YACrC,CAAC,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC;YAC7C,oCAAoC;YACpC,IAAI,CAAC,CAAC,kBAAkB,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE;gBAC9C,CAAC,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,cAAc,CAAC,CAAC,CAAC,CAAC;aAC7C;QACF,CAAC,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;AACJ,CAAC;AAVD,0EAUC;AAED,SAAS,iBAAiB,CACzB,MAAiC,EACjC,mBAAwC,EACxC,UAA6D;IAE7D,OAAO,UAAU,CAAC,aAAa,CAAC,IAAI,GAAG,CAAC,EAAE;QACzC,MAAM,OAAO,GAAG,UAAU,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QACpD,IAAA,iBAAM,EACL,OAAO,CAAC,kBAAkB,CAAC,MAAM,CAAC,UAAU,CAAC,aAAa,CAAC,EAC3D,KAAK,CAAC,4BAA4B,CAClC,CAAC;QACF,IAAA,iBAAM,EAAC,OAAO,CAAC,MAAM,EAAE,EAAE,KAAK,CAAC,iCAAiC,CAAC,CAAC;QAClE,IAAI,IAAA,iCAAa,EAAC,OAAO,CAAC,KAAK,SAAS,EAAE;YACzC,MAAM,KAAK,GAAG,WAAW,CAAC,mBAAmB,EAAE,OAAO,CAAC,CAAC;YACxD,MAAM,CAAC,WAAW,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;SACxD;KACD;AACF,CAAC;AAED,SAAS,iBAAiB,CACzB,MAAiC,EACjC,mBAAwC,EACxC,UAA6D;IAE7D,OAAO,UAAU,CAAC,aAAa,CAAC,IAAI,GAAG,CAAC,EAAE;QACzC,MAAM,OAAO,GAAG,UAAU,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAEpD,IAAA,iBAAM,EACL,OAAO,CAAC,kBAAkB,CAAC,MAAM,CAAC,UAAU,CAAC,aAAa,CAAC,EAC3D,KAAK,CAAC,4BAA4B,CAClC,CAAC;QAEF,IAAA,iBAAM,EAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,KAAK,CAAC,mCAAmC,CAAC,CAAC;QAErE,MAAM,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;QACpC,IAAI,OAAO,GAAG,mBAAmB,CAAC,gCAAgC,CAAC,OAAO,CAAC,CAAC;QAE5E,4EAA4E;QAC5E,wEAAwE;QACxE,gEAAgE;QAChE,iDAAiD;QACjD,IAAI,OAAO,KAAK,iDAAyB,IAAI,MAAM,KAAK,SAAS,EAAE;YAClE,MAAM,IAAI,qBAAU,CAAC,+CAA+C,CAAC,CAAC;SACtE;QAED,IAAI,IAAA,iCAAa,EAAC,MAAM,CAAC,KAAK,SAAS,IAAI,MAAM,CAAC,SAAS,EAAE,gBAAgB,CAAC,OAAO,CAAC,EAAE;YACvF,OAAO,EAAE,CAAC;SACV;QAED,MAAM,KAAK,GAAG,OAAO,CAAC,UAAwC,CAAC;QAC/D,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;QAC9C,MAAM,aAAa,GAA6B,mBAAmB,CAAC,oBAAoB,CACvF,OAAO,EACP,mBAAmB,CAAC,YAAY,CAAC,UAAU,EAC3C,mBAAmB,CAAC,YAAY,CAAC,QAAQ,CACzC,CAAC,OAAO,CAAC;QACV,IAAA,iBAAM,EAAC,aAAa,KAAK,SAAS,EAAE,KAAK,CAAC,2CAA2C,CAAC,CAAC;QAEvF,MAAM,gBAAgB,GAAG,CAAC,IAA4B,EAAE,EAAE,CACxD,IAAI,CAAC,UAAkD,EAAE,cAAc;YACxE,0BAA0B,CAAC;QAE5B,MAAM,SAAS,GAEX,EAAE,CAAC;QACP,MAAM,OAAO,GAAG,aAAa,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;QACvD,MAAM,UAAU,GAAG,CAAC,IAA4B,EAAE,EAAE;YACnD,2DAA2D;YAC3D,4DAA4D;YAC5D,IAAI,OAAO,KAAK,IAAI,EAAE;gBACrB,OAAO,KAAK,CAAC;aACb;YACD,IAAI,gBAAgB,CAAC,IAAI,CAAC,EAAE;gBAC3B,IAAI,OAAO,EAAE;oBACZ,MAAM,MAAM,GAAG,CAAC,SAAS,CAAC,MAAM,KAAhB,SAAS,CAAC,MAAM,GAAK,IAAI,2BAAgB,EAAE,EAAC,CAAC;oBAC7D,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;iBAClB;qBAAM;oBACN,MAAM,KAAK,GAAG,CAAC,SAAS,CAAC,KAAK,KAAf,SAAS,CAAC,KAAK,GAAK,IAAI,2BAAgB,EAAE,EAAC,CAAC;oBAC3D,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;iBACpB;aACD;QACF,CAAC,CAAC;QACF,IAAA,yCAAkB;QACjB,oEAAoE;QACpE,aAAa,CAAC,MAAO,EACrB,aAAa,EACb,SAAS,EACT,CAAC,GAAG,EAAE,EAAE;YACP,IAAI,GAAG,CAAC,SAAS,EAAE,KAAK,KAAK,KAAK,EAAE;gBACnC,OAAO,GAAG,CAAC,SAAS,CAAC,cAAc,CAAC,UAAU,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;aACpE;YACD,OAAO,IAAI,CAAC;QACb,CAAC,EACD,SAAS,EACT,OAAO,CACP,CAAC;QACF,IACC,mBAAmB,EAAE,qBAAqB,EAAE,kBAAkB,EAAE,SAAS,EAAE,GAAG,CAAC,OAAO,CAAC,EACtF;YACD,IAAA,iBAAM,EAAC,OAAO,EAAE,KAAK,CAAC,iDAAiD,CAAC,CAAC;YACzE,mBAAmB,EAAE,qBAAqB,CAAC,kBAAkB,CAAC,SAAS,CAAC,cAAc,CACrF,UAAU,CACV,CAAC;SACF;QAED,IAAI,SAAS,KAAK,SAAS,EAAE;YAC5B,MAAM,SAAS,GAAG,4CAAwB,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;YACnE,IAAI,SAAS,CAAC,MAAM,EAAE,KAAK,KAAK,KAAK,EAAE;gBACtC,SAAS,CAAC,mBAAmB,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;aACnE;YACD,IAAI,SAAS,CAAC,KAAK,EAAE,KAAK,KAAK,KAAK,EAAE;gBACrC,SAAS,CAAC,kBAAkB,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;aACjE;SACD;QAED,OAAO,CAAC,kBAAkB,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE;YACxD,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YACvB,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACpB,CAAC,CAAC,CAAC;QACH,OAAO,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,cAAc,CAAC,OAAO,CAAC,CAAC;KACzD;AACF,CAAC;AAED,SAAS,mBAAmB,CAC3B,MAAiC,EACjC,mBAAwC,EACxC,UAA+D;IAE/D,OAAO,UAAU,CAAC,aAAa,CAAC,IAAI,GAAG,CAAC,EAAE;QACzC,MAAM,OAAO,GAAG,UAAU,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QACpD,MAAM,QAAQ,GAAG,OAAO,CAAC,kBAAkB,CAAC,MAAM,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;QAC7E,IAAA,iBAAM,EAAC,QAAQ,IAAI,OAAO,CAAC,MAAM,EAAE,EAAE,KAAK,CAAC,mCAAmC,CAAC,CAAC;QAChF,IAAI,IAAA,iCAAa,EAAC,OAAO,CAAC,KAAK,SAAS,EAAE;YACzC,MAAM,KAAK,GAAG,WAAW,CAAC,mBAAmB,EAAE,OAAO,CAAC,CAAC;YACxD,MAAM,CAAC,aAAa,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC,YAAY,EAAE,UAAU,CAAC,cAAc,CAAC,CAAC;SACrF;KACD;AACF,CAAC;AAED,SAAS,WAAW,CAAC,mBAAwC,EAAE,OAAiB;IAC/E,OAAO,mBAAmB,CAAC,WAAW,CACrC,OAAO,EACP,mBAAmB,CAAC,YAAY,CAAC,UAAU,EAC3C,mBAAmB,CAAC,YAAY,CAAC,QAAQ,CACzC,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAgB,+BAA+B,CAC9C,MAAiC,EACjC,WAAuC;IAEvC,IAAI,mBAAoD,CAAC;IAEzD,OAAO,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE;QAC9B,oEAAoE;QACpE,MAAM,CAAC,GAAG,WAAW,CAAC,GAAG,EAAG,CAAC;QAC7B,MAAM,SAAS,GAAG,CAAC,CAAC,SAAS,CAAC;QAC9B,IAAI,CAAC,CAAC,aAAa,CAAC,IAAI,GAAG,CAAC,EAAE;YAC7B,mBAAmB,KAAnB,mBAAmB,GAAK,uBAAuB,CAAC,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAC;YAC5E,QAAQ,SAAS,EAAE;gBAClB,KAAK,2BAAkB,CAAC,MAAM;oBAC7B,iBAAiB,CAAC,MAAM,EAAE,mBAAmB,EAAE,CAAC,CAAC,CAAC;oBAClD,MAAM;gBACP,KAAK,2BAAkB,CAAC,MAAM;oBAC7B,iBAAiB,CAAC,MAAM,EAAE,mBAAmB,EAAE,CAAC,CAAC,CAAC;oBAClD,MAAM;gBACP,KAAK,2BAAkB,CAAC,QAAQ;oBAC/B,mBAAmB,CAAC,MAAM,EAAE,mBAAmB,EAAE,CAAC,CAAC,CAAC;oBACpD,MAAM;gBACP;oBACC,IAAA,0BAAe,EAAC,SAAS,CAAC,CAAC;aAC5B;SACD;KACD;AACF,CAAC;AA3BD,0EA2BC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { assert, unreachableCase } from \"@fluidframework/core-utils/internal\";\nimport { UsageError } from \"@fluidframework/telemetry-utils/internal\";\n\nimport { DoublyLinkedList } from \"./collections/index.js\";\nimport { EndOfTreeSegment } from \"./endOfTreeSegment.js\";\nimport { LocalReferenceCollection, LocalReferencePosition } from \"./localReference.js\";\nimport { MergeTree, findRootMergeBlock } from \"./mergeTree.js\";\nimport { IMergeTreeDeltaCallbackArgs } from \"./mergeTreeDeltaCallback.js\";\nimport { depthFirstNodeWalk } from \"./mergeTreeNodeWalk.js\";\nimport { ISegment, ISegmentLeaf, toRemovalInfo } from \"./mergeTreeNodes.js\";\nimport { ITrackingGroup, Trackable, UnorderedTrackingGroup } from \"./mergeTreeTracking.js\";\nimport { IJSONSegment, MergeTreeDeltaType, ReferenceType } from \"./ops.js\";\nimport { PropertySet, matchProperties } from \"./properties.js\";\nimport { DetachedReferencePosition } from \"./referencePositions.js\";\n\n/**\n * @alpha\n */\nexport type MergeTreeDeltaRevertible =\n\t| {\n\t\t\toperation: typeof MergeTreeDeltaType.INSERT;\n\t\t\ttrackingGroup: ITrackingGroup;\n\t }\n\t| {\n\t\t\toperation: typeof MergeTreeDeltaType.REMOVE;\n\t\t\ttrackingGroup: ITrackingGroup;\n\t }\n\t| {\n\t\t\toperation: typeof MergeTreeDeltaType.ANNOTATE;\n\t\t\ttrackingGroup: ITrackingGroup;\n\t\t\tpropertyDeltas: PropertySet;\n\t };\n\n/**\n * Tests whether x is a MergeTreeDeltaRevertible\n * @internal\n */\nexport function isMergeTreeDeltaRevertible(x: unknown): x is MergeTreeDeltaRevertible {\n\treturn !!x && typeof x === \"object\" && \"operation\" in x && \"trackingGroup\" in x;\n}\n\ntype TypedRevertible<T extends MergeTreeDeltaRevertible[\"operation\"]> = MergeTreeDeltaRevertible & {\n\toperation: T;\n};\n\ninterface RemoveSegmentRefProperties {\n\t/**\n\t * the serialized form of the segment, so it can be re-inserted\n\t */\n\tsegSpec: IJSONSegment;\n\t/**\n\t * a tag so the reference can be identified as being created for revert\n\t */\n\treferenceSpace: \"mergeTreeDeltaRevertible\";\n}\n\n/**\n * @alpha\n */\nexport interface MergeTreeRevertibleDriver {\n\tinsertFromSpec(pos: number, spec: IJSONSegment): void;\n\tremoveRange(start: number, end: number): void;\n\tannotateRange(start: number, end: number, props: PropertySet): void;\n}\n\n/**\n * exported for test only. should not be exported out the the package\n * @internal\n */\nexport interface MergeTreeWithRevert extends MergeTree {\n\t__mergeTreeRevertible: {\n\t\tdetachedReferences: EndOfTreeSegment;\n\t\trefCallbacks: LocalReferencePosition[\"callbacks\"];\n\t};\n}\n\nexport type PickPartial<T, K extends keyof T> = Omit<T, K> & Partial<Pick<T, K>>;\nfunction findMergeTreeWithRevert(trackable: Trackable): MergeTreeWithRevert {\n\tconst segmentOrNode = trackable.isLeaf() ? trackable : trackable.getSegment();\n\tconst maybeRoot = findRootMergeBlock(segmentOrNode);\n\tassert(\n\t\tmaybeRoot?.mergeTree !== undefined,\n\t\t0x5c2 /* trackable is invalid as it is not in a rooted merge tree. */,\n\t);\n\tconst mergeTree: PickPartial<MergeTreeWithRevert, \"__mergeTreeRevertible\"> =\n\t\tmaybeRoot.mergeTree;\n\n\tif (mergeTree.__mergeTreeRevertible === undefined) {\n\t\tconst detachedReferences = new EndOfTreeSegment(maybeRoot.mergeTree);\n\t\tconst refCallbacks: MergeTreeWithRevert[\"__mergeTreeRevertible\"][\"refCallbacks\"] = {\n\t\t\tafterSlide: (r: LocalReferencePosition) => {\n\t\t\t\tif (mergeTree.referencePositionToLocalPosition(r) === DetachedReferencePosition) {\n\t\t\t\t\tconst refs = LocalReferenceCollection.setOrGet(detachedReferences);\n\t\t\t\t\trefs.addAfterTombstones([r]);\n\t\t\t\t}\n\t\t\t},\n\t\t};\n\t\tmergeTree.__mergeTreeRevertible = {\n\t\t\trefCallbacks,\n\t\t\tdetachedReferences,\n\t\t};\n\t}\n\treturn mergeTree as MergeTreeWithRevert;\n}\n\nfunction appendLocalInsertToRevertibles(\n\tdeltaArgs: IMergeTreeDeltaCallbackArgs,\n\trevertibles: MergeTreeDeltaRevertible[],\n) {\n\tif (revertibles[revertibles.length - 1]?.operation !== MergeTreeDeltaType.INSERT) {\n\t\trevertibles.push({\n\t\t\toperation: MergeTreeDeltaType.INSERT,\n\t\t\ttrackingGroup: new UnorderedTrackingGroup(),\n\t\t});\n\t}\n\tconst last = revertibles[revertibles.length - 1];\n\tdeltaArgs.deltaSegments.forEach((t) => last.trackingGroup.link(t.segment));\n\n\treturn revertibles;\n}\n\nfunction appendLocalRemoveToRevertibles(\n\tdeltaArgs: IMergeTreeDeltaCallbackArgs,\n\trevertibles: MergeTreeDeltaRevertible[],\n) {\n\tif (revertibles[revertibles.length - 1]?.operation !== MergeTreeDeltaType.REMOVE) {\n\t\trevertibles.push({\n\t\t\toperation: MergeTreeDeltaType.REMOVE,\n\t\t\ttrackingGroup: new UnorderedTrackingGroup(),\n\t\t});\n\t}\n\tconst last = revertibles[revertibles.length - 1];\n\n\tconst mergeTreeWithRevert = findMergeTreeWithRevert(deltaArgs.deltaSegments[0].segment);\n\n\tdeltaArgs.deltaSegments.forEach((t) => {\n\t\tconst props: RemoveSegmentRefProperties = {\n\t\t\tsegSpec: t.segment.toJSONObject(),\n\t\t\treferenceSpace: \"mergeTreeDeltaRevertible\",\n\t\t};\n\t\tconst ref = mergeTreeWithRevert.createLocalReferencePosition(\n\t\t\tt.segment,\n\t\t\t0,\n\t\t\tReferenceType.SlideOnRemove,\n\t\t\tprops,\n\t\t);\n\t\tref.callbacks = mergeTreeWithRevert.__mergeTreeRevertible.refCallbacks;\n\t\tt.segment.trackingCollection.trackingGroups.forEach((tg) => {\n\t\t\ttg.link(ref);\n\t\t\ttg.unlink(t.segment);\n\t\t});\n\n\t\tlast.trackingGroup.link(ref);\n\t});\n\treturn revertibles;\n}\n\nfunction appendLocalAnnotateToRevertibles(\n\tdeltaArgs: IMergeTreeDeltaCallbackArgs,\n\trevertibles: MergeTreeDeltaRevertible[],\n) {\n\tlet last = revertibles[revertibles.length - 1];\n\tdeltaArgs.deltaSegments.forEach((ds) => {\n\t\tconst propertyDeltas = ds.propertyDeltas;\n\t\tif (propertyDeltas) {\n\t\t\tif (\n\t\t\t\tlast?.operation === MergeTreeDeltaType.ANNOTATE &&\n\t\t\t\tmatchProperties(last?.propertyDeltas, propertyDeltas)\n\t\t\t) {\n\t\t\t\tlast.trackingGroup.link(ds.segment);\n\t\t\t} else {\n\t\t\t\tlast = {\n\t\t\t\t\toperation: MergeTreeDeltaType.ANNOTATE,\n\t\t\t\t\tpropertyDeltas,\n\t\t\t\t\ttrackingGroup: new UnorderedTrackingGroup(),\n\t\t\t\t};\n\t\t\t\tlast.trackingGroup.link(ds.segment);\n\t\t\t\trevertibles.push(last);\n\t\t\t}\n\t\t}\n\t});\n\treturn revertibles;\n}\n\n/**\n * @alpha\n */\nexport function appendToMergeTreeDeltaRevertibles(\n\tdeltaArgs: IMergeTreeDeltaCallbackArgs,\n\trevertibles: MergeTreeDeltaRevertible[],\n) {\n\tif (deltaArgs.deltaSegments.length === 0) {\n\t\treturn;\n\t}\n\tswitch (deltaArgs.operation) {\n\t\tcase MergeTreeDeltaType.INSERT:\n\t\t\tappendLocalInsertToRevertibles(deltaArgs, revertibles);\n\t\t\tbreak;\n\n\t\tcase MergeTreeDeltaType.REMOVE:\n\t\t\tappendLocalRemoveToRevertibles(deltaArgs, revertibles);\n\t\t\tbreak;\n\n\t\tcase MergeTreeDeltaType.ANNOTATE:\n\t\t\tappendLocalAnnotateToRevertibles(deltaArgs, revertibles);\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tthrow new UsageError(\"Unsupported event delta type\", {\n\t\t\t\toperation: deltaArgs.operation,\n\t\t\t});\n\t}\n}\n\n/**\n * @alpha\n */\nexport function discardMergeTreeDeltaRevertible(revertibles: MergeTreeDeltaRevertible[]) {\n\trevertibles.forEach((r) => {\n\t\tr.trackingGroup.tracked.forEach((t) => {\n\t\t\tt.trackingCollection.unlink(r.trackingGroup);\n\t\t\t// remove untracked local references\n\t\t\tif (t.trackingCollection.empty && !t.isLeaf()) {\n\t\t\t\tt.getSegment()?.localRefs?.removeLocalRef(t);\n\t\t\t}\n\t\t});\n\t});\n}\n\nfunction revertLocalInsert(\n\tdriver: MergeTreeRevertibleDriver,\n\tmergeTreeWithRevert: MergeTreeWithRevert,\n\trevertible: TypedRevertible<typeof MergeTreeDeltaType.INSERT>,\n) {\n\twhile (revertible.trackingGroup.size > 0) {\n\t\tconst tracked = revertible.trackingGroup.tracked[0];\n\t\tassert(\n\t\t\ttracked.trackingCollection.unlink(revertible.trackingGroup),\n\t\t\t0x3f1 /* tracking group removed */,\n\t\t);\n\t\tassert(tracked.isLeaf(), 0x3f2 /* inserts must track segments */);\n\t\tif (toRemovalInfo(tracked) === undefined) {\n\t\t\tconst start = getPosition(mergeTreeWithRevert, tracked);\n\t\t\tdriver.removeRange(start, start + tracked.cachedLength);\n\t\t}\n\t}\n}\n\nfunction revertLocalRemove(\n\tdriver: MergeTreeRevertibleDriver,\n\tmergeTreeWithRevert: MergeTreeWithRevert,\n\trevertible: TypedRevertible<typeof MergeTreeDeltaType.REMOVE>,\n) {\n\twhile (revertible.trackingGroup.size > 0) {\n\t\tconst tracked = revertible.trackingGroup.tracked[0];\n\n\t\tassert(\n\t\t\ttracked.trackingCollection.unlink(revertible.trackingGroup),\n\t\t\t0x3f3 /* tracking group removed */,\n\t\t);\n\n\t\tassert(!tracked.isLeaf(), 0x3f4 /* removes must track local refs */);\n\n\t\tconst refSeg = tracked.getSegment();\n\t\tlet realPos = mergeTreeWithRevert.referencePositionToLocalPosition(tracked);\n\n\t\t// References which are on EndOfStringSegment don't return detached for pos,\n\t\t// they will return the length of the merge-tree. this case just catches\n\t\t// random references, likely not created in the revertible flow,\n\t\t// that are tying to be reverted for some reason.\n\t\tif (realPos === DetachedReferencePosition || refSeg === undefined) {\n\t\t\tthrow new UsageError(\"Cannot insert at detached references position\");\n\t\t}\n\n\t\tif (toRemovalInfo(refSeg) === undefined && refSeg.localRefs?.isAfterTombstone(tracked)) {\n\t\t\trealPos++;\n\t\t}\n\n\t\tconst props = tracked.properties as RemoveSegmentRefProperties;\n\t\tdriver.insertFromSpec(realPos, props.segSpec);\n\t\tconst insertSegment: ISegmentLeaf | undefined = mergeTreeWithRevert.getContainingSegment(\n\t\t\trealPos,\n\t\t\tmergeTreeWithRevert.collabWindow.currentSeq,\n\t\t\tmergeTreeWithRevert.collabWindow.clientId,\n\t\t).segment;\n\t\tassert(insertSegment !== undefined, 0x3f5 /* insert segment must exist at position */);\n\n\t\tconst localSlideFilter = (lref: LocalReferencePosition) =>\n\t\t\t(lref.properties as Partial<RemoveSegmentRefProperties>)?.referenceSpace ===\n\t\t\t\"mergeTreeDeltaRevertible\";\n\n\t\tconst insertRef: Partial<\n\t\t\tRecord<\"before\" | \"after\", DoublyLinkedList<LocalReferencePosition>>\n\t\t> = {};\n\t\tconst forward = insertSegment.ordinal < refSeg.ordinal;\n\t\tconst refHandler = (lref: LocalReferencePosition) => {\n\t\t\t// once we reach it keep the original reference where it is\n\t\t\t// we'll move tracking groups, and remove it as a last step.\n\t\t\tif (tracked === lref) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tif (localSlideFilter(lref)) {\n\t\t\t\tif (forward) {\n\t\t\t\t\tconst before = (insertRef.before ??= new DoublyLinkedList());\n\t\t\t\t\tbefore.push(lref);\n\t\t\t\t} else {\n\t\t\t\t\tconst after = (insertRef.after ??= new DoublyLinkedList());\n\t\t\t\t\tafter.unshift(lref);\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t\tdepthFirstNodeWalk(\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\t\tinsertSegment.parent!,\n\t\t\tinsertSegment,\n\t\t\tundefined,\n\t\t\t(seg) => {\n\t\t\t\tif (seg.localRefs?.empty === false) {\n\t\t\t\t\treturn seg.localRefs.walkReferences(refHandler, undefined, forward);\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t},\n\t\t\tundefined,\n\t\t\tforward,\n\t\t);\n\t\tif (\n\t\t\tmergeTreeWithRevert?.__mergeTreeRevertible?.detachedReferences?.localRefs?.has(tracked)\n\t\t) {\n\t\t\tassert(forward, 0x3f6 /* forward should always be true when detached */);\n\t\t\tmergeTreeWithRevert?.__mergeTreeRevertible.detachedReferences.localRefs.walkReferences(\n\t\t\t\trefHandler,\n\t\t\t);\n\t\t}\n\n\t\tif (insertRef !== undefined) {\n\t\t\tconst localRefs = LocalReferenceCollection.setOrGet(insertSegment);\n\t\t\tif (insertRef.before?.empty === false) {\n\t\t\t\tlocalRefs.addBeforeTombstones(insertRef.before.map((n) => n.data));\n\t\t\t}\n\t\t\tif (insertRef.after?.empty === false) {\n\t\t\t\tlocalRefs.addAfterTombstones(insertRef.after.map((n) => n.data));\n\t\t\t}\n\t\t}\n\n\t\ttracked.trackingCollection.trackingGroups.forEach((tg) => {\n\t\t\ttg.link(insertSegment);\n\t\t\ttg.unlink(tracked);\n\t\t});\n\t\ttracked.getSegment()?.localRefs?.removeLocalRef(tracked);\n\t}\n}\n\nfunction revertLocalAnnotate(\n\tdriver: MergeTreeRevertibleDriver,\n\tmergeTreeWithRevert: MergeTreeWithRevert,\n\trevertible: TypedRevertible<typeof MergeTreeDeltaType.ANNOTATE>,\n) {\n\twhile (revertible.trackingGroup.size > 0) {\n\t\tconst tracked = revertible.trackingGroup.tracked[0];\n\t\tconst unlinked = tracked.trackingCollection.unlink(revertible.trackingGroup);\n\t\tassert(unlinked && tracked.isLeaf(), 0x3f7 /* annotates must track segments */);\n\t\tif (toRemovalInfo(tracked) === undefined) {\n\t\t\tconst start = getPosition(mergeTreeWithRevert, tracked);\n\t\t\tdriver.annotateRange(start, start + tracked.cachedLength, revertible.propertyDeltas);\n\t\t}\n\t}\n}\n\nfunction getPosition(mergeTreeWithRevert: MergeTreeWithRevert, segment: ISegment) {\n\treturn mergeTreeWithRevert.getPosition(\n\t\tsegment,\n\t\tmergeTreeWithRevert.collabWindow.currentSeq,\n\t\tmergeTreeWithRevert.collabWindow.clientId,\n\t);\n}\n\n/**\n * @alpha\n */\nexport function revertMergeTreeDeltaRevertibles(\n\tdriver: MergeTreeRevertibleDriver,\n\trevertibles: MergeTreeDeltaRevertible[],\n) {\n\tlet mergeTreeWithRevert: MergeTreeWithRevert | undefined;\n\n\twhile (revertibles.length > 0) {\n\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\tconst r = revertibles.pop()!;\n\t\tconst operation = r.operation;\n\t\tif (r.trackingGroup.size > 0) {\n\t\t\tmergeTreeWithRevert ??= findMergeTreeWithRevert(r.trackingGroup.tracked[0]);\n\t\t\tswitch (operation) {\n\t\t\t\tcase MergeTreeDeltaType.INSERT:\n\t\t\t\t\trevertLocalInsert(driver, mergeTreeWithRevert, r);\n\t\t\t\t\tbreak;\n\t\t\t\tcase MergeTreeDeltaType.REMOVE:\n\t\t\t\t\trevertLocalRemove(driver, mergeTreeWithRevert, r);\n\t\t\t\t\tbreak;\n\t\t\t\tcase MergeTreeDeltaType.ANNOTATE:\n\t\t\t\t\trevertLocalAnnotate(driver, mergeTreeWithRevert, r);\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tunreachableCase(operation);\n\t\t\t}\n\t\t}\n\t}\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"segmentPropertiesManager.d.ts","sourceRoot":"","sources":["../src/segmentPropertiesManager.ts"],"names":[],"mappings":"AAAA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"segmentPropertiesManager.d.ts","sourceRoot":"","sources":["../src/segmentPropertiesManager.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAOH,OAAO,EAAE,qBAAqB,EAAE,MAAM,UAAU,CAAC;AAEjD,OAAO,EAAW,WAAW,EAAa,MAAM,iBAAiB,CAAC;AAElE;;GAEG;AACH,oBAAY,kBAAkB;IAC7B,wBAAwB;IACxB,IAAI,IAAA;IAEJ,eAAe;IACf,QAAQ,IAAA;CACR;AAED;;GAEG;AACH,qBAAa,iBAAiB;IAC7B,OAAO,CAAC,qBAAqB,CAA8B;IAEpD,oBAAoB,CAAC,UAAU,EAAE,qBAAqB;IAI7D,OAAO,CAAC,sBAAsB;IAgBvB,aAAa,CACnB,QAAQ,EAAE,WAAW,EACrB,QAAQ,EAAE,WAAW,EACrB,GAAG,CAAC,EAAE,MAAM,EACZ,aAAa,GAAE,OAAe,EAC9B,QAAQ,GAAE,kBAA4C,GACpD,WAAW;IAiDP,MAAM,CACZ,QAAQ,EAAE,WAAW,EACrB,QAAQ,EAAE,WAAW,GAAG,SAAS,EACjC,UAAU,EAAE,iBAAiB,GAC3B,WAAW,GAAG,SAAS;IAmBnB,oBAAoB;IAIpB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;CAG/C"}
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
7
|
exports.PropertiesManager = exports.PropertiesRollback = void 0;
|
|
8
8
|
/* eslint-disable @typescript-eslint/no-non-null-assertion */
|
|
9
|
-
const
|
|
9
|
+
const internal_1 = require("@fluidframework/core-utils/internal");
|
|
10
10
|
const constants_js_1 = require("./constants.js");
|
|
11
11
|
// eslint-disable-next-line import/no-deprecated
|
|
12
12
|
const properties_js_1 = require("./properties.js");
|
|
@@ -30,7 +30,7 @@ class PropertiesManager {
|
|
|
30
30
|
decrementPendingCounts(props) {
|
|
31
31
|
for (const key of Object.keys(props)) {
|
|
32
32
|
if (this.pendingKeyUpdateCount?.[key] !== undefined) {
|
|
33
|
-
(0,
|
|
33
|
+
(0, internal_1.assert)(this.pendingKeyUpdateCount[key] > 0, 0x05c /* "Trying to update more annotate props than do exist!" */);
|
|
34
34
|
this.pendingKeyUpdateCount[key]--;
|
|
35
35
|
if (this.pendingKeyUpdateCount?.[key] === 0) {
|
|
36
36
|
// eslint-disable-next-line @typescript-eslint/no-dynamic-delete
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"segmentPropertiesManager.js","sourceRoot":"","sources":["../src/segmentPropertiesManager.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAEH,6DAA6D;AAE7D,
|
|
1
|
+
{"version":3,"file":"segmentPropertiesManager.js","sourceRoot":"","sources":["../src/segmentPropertiesManager.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\n/* eslint-disable @typescript-eslint/no-non-null-assertion */\n\nimport { assert } from \"@fluidframework/core-utils/internal\";\n\nimport { UnassignedSequenceNumber, UniversalSequenceNumber } from \"./constants.js\";\nimport { IMergeTreeAnnotateMsg } from \"./ops.js\";\n// eslint-disable-next-line import/no-deprecated\nimport { MapLike, PropertySet, createMap } from \"./properties.js\";\n\n/**\n * @alpha\n */\nexport enum PropertiesRollback {\n\t/** Not in a rollback */\n\tNone,\n\n\t/** Rollback */\n\tRollback,\n}\n\n/**\n * @alpha\n */\nexport class PropertiesManager {\n\tprivate pendingKeyUpdateCount: MapLike<number> | undefined;\n\n\tpublic ackPendingProperties(annotateOp: IMergeTreeAnnotateMsg) {\n\t\tthis.decrementPendingCounts(annotateOp.props);\n\t}\n\n\tprivate decrementPendingCounts(props: PropertySet) {\n\t\tfor (const key of Object.keys(props)) {\n\t\t\tif (this.pendingKeyUpdateCount?.[key] !== undefined) {\n\t\t\t\tassert(\n\t\t\t\t\tthis.pendingKeyUpdateCount[key] > 0,\n\t\t\t\t\t0x05c /* \"Trying to update more annotate props than do exist!\" */,\n\t\t\t\t);\n\t\t\t\tthis.pendingKeyUpdateCount[key]--;\n\t\t\t\tif (this.pendingKeyUpdateCount?.[key] === 0) {\n\t\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n\t\t\t\t\tdelete this.pendingKeyUpdateCount[key];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic addProperties(\n\t\toldProps: PropertySet,\n\t\tnewProps: PropertySet,\n\t\tseq?: number,\n\t\tcollaborating: boolean = false,\n\t\trollback: PropertiesRollback = PropertiesRollback.None,\n\t): PropertySet {\n\t\t// eslint-disable-next-line import/no-deprecated\n\t\tthis.pendingKeyUpdateCount ??= createMap<number>();\n\n\t\t// Clean up counts for rolled back edits before modifying oldProps\n\t\tif (collaborating && rollback === PropertiesRollback.Rollback) {\n\t\t\tthis.decrementPendingCounts(newProps);\n\t\t}\n\n\t\tconst shouldModifyKey = (key: string): boolean => {\n\t\t\tif (\n\t\t\t\tseq === UnassignedSequenceNumber ||\n\t\t\t\tseq === UniversalSequenceNumber ||\n\t\t\t\tthis.pendingKeyUpdateCount?.[key] === undefined\n\t\t\t) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\treturn false;\n\t\t};\n\n\t\tconst deltas: PropertySet = {};\n\n\t\tfor (const key of Object.keys(newProps)) {\n\t\t\tif (collaborating) {\n\t\t\t\tif (seq === UnassignedSequenceNumber) {\n\t\t\t\t\tif (this.pendingKeyUpdateCount?.[key] === undefined) {\n\t\t\t\t\t\tthis.pendingKeyUpdateCount[key] = 0;\n\t\t\t\t\t}\n\t\t\t\t\tthis.pendingKeyUpdateCount[key]++;\n\t\t\t\t} else if (!shouldModifyKey(key)) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst previousValue: any = oldProps[key];\n\t\t\t// The delta should be null if undefined, as that's how we encode delete\n\t\t\tdeltas[key] = previousValue === undefined ? null : previousValue;\n\t\t\tconst newValue = newProps[key];\n\t\t\tif (newValue === null) {\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n\t\t\t\tdelete oldProps[key];\n\t\t\t} else {\n\t\t\t\toldProps[key] = newValue;\n\t\t\t}\n\t\t}\n\n\t\treturn deltas;\n\t}\n\n\tpublic copyTo(\n\t\toldProps: PropertySet,\n\t\tnewProps: PropertySet | undefined,\n\t\tnewManager: PropertiesManager,\n\t): PropertySet | undefined {\n\t\tif (oldProps) {\n\t\t\t// eslint-disable-next-line no-param-reassign, import/no-deprecated\n\t\t\tnewProps ??= createMap<any>();\n\t\t\tif (!newManager) {\n\t\t\t\tthrow new Error(\"Must provide new PropertyManager\");\n\t\t\t}\n\t\t\tfor (const key of Object.keys(oldProps)) {\n\t\t\t\tnewProps[key] = oldProps[key];\n\t\t\t}\n\t\t\t// eslint-disable-next-line import/no-deprecated\n\t\t\tnewManager.pendingKeyUpdateCount = createMap<number>();\n\t\t\tfor (const key of Object.keys(this.pendingKeyUpdateCount!)) {\n\t\t\t\tnewManager.pendingKeyUpdateCount[key] = this.pendingKeyUpdateCount![key];\n\t\t\t}\n\t\t}\n\t\treturn newProps;\n\t}\n\n\tpublic hasPendingProperties() {\n\t\treturn Object.keys(this.pendingKeyUpdateCount!).length > 0;\n\t}\n\n\tpublic hasPendingProperty(key: string): boolean {\n\t\treturn (this.pendingKeyUpdateCount?.[key] ?? 0) > 0;\n\t}\n}\n"]}
|
package/dist/snapshotChunks.d.ts
CHANGED
|
@@ -5,9 +5,9 @@
|
|
|
5
5
|
import { IFluidHandle } from "@fluidframework/core-interfaces";
|
|
6
6
|
import { IFluidSerializer } from "@fluidframework/shared-object-base";
|
|
7
7
|
import { ITelemetryLoggerExt } from "@fluidframework/telemetry-utils";
|
|
8
|
-
import { PropertySet } from "./properties.js";
|
|
9
|
-
import { IJSONSegment } from "./ops.js";
|
|
10
8
|
import { SerializedAttributionCollection } from "./attributionCollection.js";
|
|
9
|
+
import { IJSONSegment } from "./ops.js";
|
|
10
|
+
import { PropertySet } from "./properties.js";
|
|
11
11
|
export interface VersionedMergeTreeChunk {
|
|
12
12
|
version: undefined | "1";
|
|
13
13
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"snapshotChunks.d.ts","sourceRoot":"","sources":["../src/snapshotChunks.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAC/D,OAAO,EAAE,gBAAgB,EAAE,MAAM,oCAAoC,CAAC;AACtE,OAAO,EAAE,mBAAmB,EAAE,MAAM,iCAAiC,CAAC;
|
|
1
|
+
{"version":3,"file":"snapshotChunks.d.ts","sourceRoot":"","sources":["../src/snapshotChunks.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"snapshotChunks.js","sourceRoot":"","sources":["../src/snapshotChunks.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;
|
|
1
|
+
{"version":3,"file":"snapshotChunks.js","sourceRoot":"","sources":["../src/snapshotChunks.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\n/* eslint-disable @typescript-eslint/no-non-null-assertion */\n\nimport { IFluidHandle } from \"@fluidframework/core-interfaces\";\nimport { IFluidSerializer } from \"@fluidframework/shared-object-base\";\nimport { ITelemetryLoggerExt } from \"@fluidframework/telemetry-utils\";\n\nimport { SerializedAttributionCollection } from \"./attributionCollection.js\";\nimport { IJSONSegment } from \"./ops.js\";\nimport { PropertySet } from \"./properties.js\";\nimport { SnapshotLegacy } from \"./snapshotlegacy.js\";\n\nexport interface VersionedMergeTreeChunk {\n\tversion: undefined | \"1\";\n}\n\nexport type JsonSegmentSpecs = IJSONSegment | IJSONSegmentWithMergeInfo;\n\nexport interface MergeTreeChunkLegacy extends VersionedMergeTreeChunk {\n\tversion: undefined;\n\tchunkStartSegmentIndex: number;\n\tchunkSegmentCount: number;\n\tchunkLengthChars: number;\n\ttotalLengthChars?: number;\n\ttotalSegmentCount?: number;\n\tchunkSequenceNumber?: number;\n\tchunkMinSequenceNumber?: number;\n\tsegmentTexts: JsonSegmentSpecs[];\n\theaderMetadata?: MergeTreeHeaderMetadata;\n\tattribution?: SerializedAttributionCollection;\n}\n\nexport interface MergeTreeHeaderChunkMetadata {\n\tid: string;\n}\n\nexport interface MergeTreeHeaderMetadata {\n\ttotalLength: number;\n\ttotalSegmentCount: number;\n\torderedChunkMetadata: MergeTreeHeaderChunkMetadata[];\n\tsequenceNumber: number;\n\tminSequenceNumber: number;\n}\n\nexport interface MergeTreeChunkV1 extends VersionedMergeTreeChunk {\n\tversion: \"1\";\n\tstartIndex: number;\n\tsegmentCount: number;\n\tlength: number;\n\tsegments: JsonSegmentSpecs[];\n\theaderMetadata: MergeTreeHeaderMetadata | undefined;\n\tattribution?: SerializedAttributionCollection;\n}\n\n/**\n * Used during snapshotting to record the metadata required to merge segments above the MSN\n * to the raw output of `ISegment.toJSONObject()`. (Note that IJSONSegment may be a raw\n * string or array, which is why this interface wraps the original IJSONSegment instead of\n * extending it.)\n */\nexport interface IJSONSegmentWithMergeInfo {\n\tjson: IJSONSegment;\n\tclient?: string;\n\tseq?: number;\n\tremovedClientIds?: string[];\n\tremovedSeq?: number;\n\tmovedClientIds?: string[];\n\tmovedSeq?: number;\n\tmovedSeqs?: number[];\n}\n\n/**\n * Returns true if the given 'spec' is an IJSONSegmentWithMergeInfo.\n */\nexport function hasMergeInfo(\n\tspec: IJSONSegment | IJSONSegmentWithMergeInfo,\n): spec is IJSONSegmentWithMergeInfo {\n\treturn !!spec && typeof spec === \"object\" && \"json\" in spec;\n}\n\nexport function serializeAsMinSupportedVersion(\n\tpath: string,\n\tchunk: VersionedMergeTreeChunk,\n\tlogger: ITelemetryLoggerExt,\n\toptions: PropertySet | undefined,\n\tserializer: IFluidSerializer,\n\tbind: IFluidHandle,\n) {\n\tlet targetChuck: MergeTreeChunkLegacy;\n\n\tif (chunk.version !== undefined) {\n\t\tlogger.send({\n\t\t\teventName: \"MergeTreeChunk:serializeAsMinSupportedVersion\",\n\t\t\tcategory: \"generic\",\n\t\t\tfromChunkVersion: chunk.version,\n\t\t\ttoChunkVersion: undefined,\n\t\t});\n\t}\n\n\tswitch (chunk.version) {\n\t\tcase undefined:\n\t\t\ttargetChuck = chunk as MergeTreeChunkLegacy;\n\t\t\ttargetChuck.headerMetadata = buildHeaderMetadataForLegacyChunk(\n\t\t\t\tpath,\n\t\t\t\ttargetChuck,\n\t\t\t\toptions,\n\t\t\t);\n\t\t\tbreak;\n\n\t\tcase \"1\":\n\t\t\tconst chunkV1 = chunk as MergeTreeChunkV1;\n\t\t\tconst headerMetadata =\n\t\t\t\tpath === SnapshotLegacy.header ? chunkV1.headerMetadata : undefined;\n\t\t\ttargetChuck = {\n\t\t\t\tversion: undefined,\n\t\t\t\tchunkStartSegmentIndex: chunkV1.startIndex,\n\t\t\t\tchunkLengthChars: chunkV1.length,\n\t\t\t\tchunkSegmentCount: chunkV1.segmentCount,\n\t\t\t\tsegmentTexts: chunkV1.segments,\n\t\t\t\ttotalLengthChars: headerMetadata?.totalLength,\n\t\t\t\ttotalSegmentCount: headerMetadata?.totalSegmentCount,\n\t\t\t\tchunkSequenceNumber: headerMetadata?.sequenceNumber,\n\t\t\t\tchunkMinSequenceNumber: headerMetadata?.minSequenceNumber,\n\t\t\t\theaderMetadata,\n\t\t\t};\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tthrow new Error(`Unsupported chunk path: ${path} version: ${chunk.version}`);\n\t}\n\treturn serializer.stringify(targetChuck, bind);\n}\n\nexport function serializeAsMaxSupportedVersion(\n\tpath: string,\n\tchunk: VersionedMergeTreeChunk,\n\tlogger: ITelemetryLoggerExt,\n\toptions: PropertySet | undefined,\n\tserializer: IFluidSerializer,\n\tbind: IFluidHandle,\n) {\n\tconst targetChuck = toLatestVersion(path, chunk, logger, options);\n\treturn serializer.stringify(targetChuck, bind);\n}\n\nexport function toLatestVersion(\n\tpath: string,\n\tchunk: VersionedMergeTreeChunk,\n\tlogger: ITelemetryLoggerExt,\n\toptions: PropertySet | undefined,\n): MergeTreeChunkV1 {\n\tswitch (chunk.version) {\n\t\tcase undefined: {\n\t\t\tconst chunkLegacy = chunk as MergeTreeChunkLegacy;\n\t\t\treturn {\n\t\t\t\tversion: \"1\",\n\t\t\t\tlength: chunkLegacy.chunkLengthChars,\n\t\t\t\tsegmentCount: chunkLegacy.chunkSegmentCount,\n\t\t\t\theaderMetadata: buildHeaderMetadataForLegacyChunk(path, chunkLegacy, options),\n\t\t\t\tsegments: chunkLegacy.segmentTexts,\n\t\t\t\tstartIndex: chunkLegacy.chunkStartSegmentIndex,\n\t\t\t\tattribution: chunkLegacy.attribution,\n\t\t\t};\n\t\t}\n\t\tcase \"1\":\n\t\t\treturn chunk as MergeTreeChunkV1;\n\n\t\tdefault:\n\t\t\tthrow new Error(`Unsupported chunk path: ${path} version: ${chunk.version}`);\n\t}\n}\n\nfunction buildHeaderMetadataForLegacyChunk(\n\tpath: string,\n\tchunk: MergeTreeChunkLegacy,\n\toptions: PropertySet | undefined,\n): MergeTreeHeaderMetadata | undefined {\n\tif (path === SnapshotLegacy.header) {\n\t\tif (chunk.headerMetadata !== undefined) {\n\t\t\treturn chunk.headerMetadata;\n\t\t}\n\t\tconst chunkIds: MergeTreeHeaderChunkMetadata[] = [{ id: SnapshotLegacy.header }];\n\t\tif (chunk.chunkLengthChars < chunk.totalLengthChars!) {\n\t\t\tchunkIds.push({ id: SnapshotLegacy.body });\n\t\t}\n\t\treturn {\n\t\t\torderedChunkMetadata: chunkIds,\n\t\t\tminSequenceNumber: chunk.chunkMinSequenceNumber!,\n\t\t\tsequenceNumber: chunk.chunkSequenceNumber!,\n\t\t\ttotalLength: chunk.totalLengthChars!,\n\t\t\ttotalSegmentCount: chunk.totalSegmentCount!,\n\t\t};\n\t}\n\treturn undefined;\n}\n"]}
|
package/dist/snapshotLoader.d.ts
CHANGED
|
@@ -2,10 +2,10 @@
|
|
|
2
2
|
* Copyright (c) Microsoft Corporation and contributors. All rights reserved.
|
|
3
3
|
* Licensed under the MIT License.
|
|
4
4
|
*/
|
|
5
|
+
import { IChannelStorageService, IFluidDataStoreRuntime } from "@fluidframework/datastore-definitions";
|
|
6
|
+
import { ISequencedDocumentMessage } from "@fluidframework/protocol-definitions";
|
|
5
7
|
import { IFluidSerializer } from "@fluidframework/shared-object-base";
|
|
6
8
|
import { ITelemetryLoggerExt } from "@fluidframework/telemetry-utils";
|
|
7
|
-
import { ISequencedDocumentMessage } from "@fluidframework/protocol-definitions";
|
|
8
|
-
import { IFluidDataStoreRuntime, IChannelStorageService } from "@fluidframework/datastore-definitions";
|
|
9
9
|
import { Client } from "./client.js";
|
|
10
10
|
import { MergeTree } from "./mergeTree.js";
|
|
11
11
|
export declare class SnapshotLoader {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"snapshotLoader.d.ts","sourceRoot":"","sources":["../src/snapshotLoader.ts"],"names":[],"mappings":"AAAA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"snapshotLoader.d.ts","sourceRoot":"","sources":["../src/snapshotLoader.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAOH,OAAO,EACN,sBAAsB,EACtB,sBAAsB,EACtB,MAAM,uCAAuC,CAAC;AAC/C,OAAO,EAAE,yBAAyB,EAAE,MAAM,sCAAsC,CAAC;AACjF,OAAO,EAAE,gBAAgB,EAAE,MAAM,oCAAoC,CAAC;AACtE,OAAO,EAAE,mBAAmB,EAAE,MAAM,iCAAiC,CAAC;AAItE,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAO3C,qBAAa,cAAc;IAIzB,OAAO,CAAC,QAAQ,CAAC,OAAO;IAExB,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAE1B,OAAO,CAAC,QAAQ,CAAC,UAAU;IAR5B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAsB;gBAG3B,OAAO,EAAE,sBAAsB,EAE/B,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,SAAS,EACrC,MAAM,EAAE,mBAAmB,EACV,UAAU,EAAE,gBAAgB;IAKjC,UAAU,CACtB,QAAQ,EAAE,sBAAsB,GAC9B,OAAO,CAAC;QAAE,WAAW,EAAE,OAAO,CAAC,yBAAyB,EAAE,CAAC,CAAA;KAAE,CAAC;YAiBnD,qBAAqB;IA4BnC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAsD5B;IAEF,OAAO,CAAC,UAAU;YAsCJ,QAAQ;IA0FtB,OAAO,CAAC,kBAAkB;IAwB1B;;;;;OAKG;YACW,cAAc;CAQ5B"}
|
package/dist/snapshotLoader.js
CHANGED
|
@@ -7,9 +7,9 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
7
7
|
exports.SnapshotLoader = void 0;
|
|
8
8
|
/* eslint-disable @typescript-eslint/no-non-null-assertion */
|
|
9
9
|
const client_utils_1 = require("@fluid-internal/client-utils");
|
|
10
|
-
const core_utils_1 = require("@fluidframework/core-utils");
|
|
11
|
-
const telemetry_utils_1 = require("@fluidframework/telemetry-utils");
|
|
12
10
|
const container_definitions_1 = require("@fluidframework/container-definitions");
|
|
11
|
+
const internal_1 = require("@fluidframework/core-utils/internal");
|
|
12
|
+
const internal_2 = require("@fluidframework/telemetry-utils/internal");
|
|
13
13
|
const constants_js_1 = require("./constants.js");
|
|
14
14
|
const snapshotChunks_js_1 = require("./snapshotChunks.js");
|
|
15
15
|
const snapshotV1_js_1 = require("./snapshotV1.js");
|
|
@@ -68,11 +68,11 @@ class SnapshotLoader {
|
|
|
68
68
|
}
|
|
69
69
|
return seg;
|
|
70
70
|
};
|
|
71
|
-
this.logger = (0,
|
|
71
|
+
this.logger = (0, internal_2.createChildLogger)({ logger, namespace: "SnapshotLoader" });
|
|
72
72
|
}
|
|
73
73
|
async initialize(services) {
|
|
74
74
|
const headerLoadedP = services.readBlob(snapshotlegacy_js_1.SnapshotLegacy.header).then((header) => {
|
|
75
|
-
(0,
|
|
75
|
+
(0, internal_1.assert)(!!header, 0x05f /* "Missing blob header on legacy snapshot!" */);
|
|
76
76
|
return this.loadHeader((0, client_utils_1.bufferToString)(header, "utf8"));
|
|
77
77
|
});
|
|
78
78
|
const catchupOpsP = this.loadBodyAndCatchupOps(headerLoadedP, services);
|
|
@@ -89,7 +89,7 @@ class SnapshotLoader {
|
|
|
89
89
|
const blobs = await blobsP;
|
|
90
90
|
if (blobs.length === headerChunk.headerMetadata.orderedChunkMetadata.length + 1) {
|
|
91
91
|
headerChunk.headerMetadata.orderedChunkMetadata.forEach((md) => blobs.splice(blobs.indexOf(md.id), 1));
|
|
92
|
-
(0,
|
|
92
|
+
(0, internal_1.assert)(blobs.length === 1, 0x060 /* There should be only one blob with catch up ops */);
|
|
93
93
|
// TODO: The 'Snapshot.catchupOps' tree entry is purely for backwards compatibility.
|
|
94
94
|
// (See https://github.com/microsoft/FluidFramework/issues/84)
|
|
95
95
|
return this.loadCatchupOps(services.readBlob(blobs[0]), this.serializer);
|
|
@@ -126,8 +126,8 @@ class SnapshotLoader {
|
|
|
126
126
|
}
|
|
127
127
|
async loadBody(chunk1, services) {
|
|
128
128
|
const headerMetadata = chunk1.headerMetadata;
|
|
129
|
-
(0,
|
|
130
|
-
(0,
|
|
129
|
+
(0, internal_1.assert)(chunk1.length <= headerMetadata.totalLength, 0x061 /* "Mismatch in totalLength" */);
|
|
130
|
+
(0, internal_1.assert)(chunk1.segmentCount <= headerMetadata.totalSegmentCount, 0x062 /* "Mismatch in totalSegmentCount" */);
|
|
131
131
|
if (chunk1.segmentCount === headerMetadata.totalSegmentCount) {
|
|
132
132
|
return;
|
|
133
133
|
}
|
|
@@ -143,10 +143,10 @@ class SnapshotLoader {
|
|
|
143
143
|
chunksWithAttribution += chunk.attribution !== undefined ? 1 : 0;
|
|
144
144
|
segs.push(...newSegs);
|
|
145
145
|
}
|
|
146
|
-
(0,
|
|
146
|
+
(0, internal_1.assert)(chunksWithAttribution === 0 ||
|
|
147
147
|
chunksWithAttribution === headerMetadata.orderedChunkMetadata.length, 0x4c0 /* all or no chunks should have attribution information */);
|
|
148
|
-
(0,
|
|
149
|
-
(0,
|
|
148
|
+
(0, internal_1.assert)(lengthSofar === headerMetadata.totalLength, 0x063 /* "Mismatch in totalLength" */);
|
|
149
|
+
(0, internal_1.assert)(chunk1.segmentCount + segs.length === headerMetadata.totalSegmentCount, 0x064 /* "Mismatch in totalSegmentCount" */);
|
|
150
150
|
// Helper to insert segments at the end of the MergeTree.
|
|
151
151
|
const mergeTree = this.mergeTree;
|
|
152
152
|
const append = (segments, cli, seq) => {
|
|
@@ -182,7 +182,7 @@ class SnapshotLoader {
|
|
|
182
182
|
if (chunk.attribution) {
|
|
183
183
|
const { attributionPolicy } = this.mergeTree;
|
|
184
184
|
if (attributionPolicy === undefined) {
|
|
185
|
-
throw new
|
|
185
|
+
throw new internal_2.UsageError("Attribution policy must be provided when loading a document with attribution information.");
|
|
186
186
|
}
|
|
187
187
|
const { isAttached, attach, serializer } = attributionPolicy;
|
|
188
188
|
if (!isAttached) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"snapshotLoader.js","sourceRoot":"","sources":["../src/snapshotLoader.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\n/* eslint-disable @typescript-eslint/no-non-null-assertion */\n\nimport { bufferToString } from \"@fluid-internal/client-utils\";\nimport { assert } from \"@fluidframework/core-utils\";\nimport { IFluidSerializer } from \"@fluidframework/shared-object-base\";\nimport {\n\tcreateChildLogger,\n\tITelemetryLoggerExt,\n\tUsageError,\n} from \"@fluidframework/telemetry-utils\";\nimport { ISequencedDocumentMessage } from \"@fluidframework/protocol-definitions\";\nimport {\n\tIFluidDataStoreRuntime,\n\tIChannelStorageService,\n} from \"@fluidframework/datastore-definitions\";\nimport { AttachState } from \"@fluidframework/container-definitions\";\n// eslint-disable-next-line import/no-deprecated\nimport { Client } from \"./client.js\";\nimport { NonCollabClient, UniversalSequenceNumber } from \"./constants.js\";\nimport { ISegment } from \"./mergeTreeNodes.js\";\nimport { IJSONSegment } from \"./ops.js\";\nimport { IJSONSegmentWithMergeInfo, hasMergeInfo, MergeTreeChunkV1 } from \"./snapshotChunks.js\";\nimport { SnapshotV1 } from \"./snapshotV1.js\";\nimport { SnapshotLegacy } from \"./snapshotlegacy.js\";\nimport { MergeTree } from \"./mergeTree.js\";\n\nexport class SnapshotLoader {\n\tprivate readonly logger: ITelemetryLoggerExt;\n\n\tconstructor(\n\t\tprivate readonly runtime: IFluidDataStoreRuntime,\n\t\t// eslint-disable-next-line import/no-deprecated\n\t\tprivate readonly client: Client,\n\t\tprivate readonly mergeTree: MergeTree,\n\t\tlogger: ITelemetryLoggerExt,\n\t\tprivate readonly serializer: IFluidSerializer,\n\t) {\n\t\tthis.logger = createChildLogger({ logger, namespace: \"SnapshotLoader\" });\n\t}\n\n\tpublic async initialize(\n\t\tservices: IChannelStorageService,\n\t): Promise<{ catchupOpsP: Promise<ISequencedDocumentMessage[]> }> {\n\t\tconst headerLoadedP = services.readBlob(SnapshotLegacy.header).then((header) => {\n\t\t\tassert(!!header, 0x05f /* \"Missing blob header on legacy snapshot!\" */);\n\t\t\treturn this.loadHeader(bufferToString(header, \"utf8\"));\n\t\t});\n\n\t\tconst catchupOpsP = this.loadBodyAndCatchupOps(headerLoadedP, services);\n\n\t\tcatchupOpsP.catch((err) =>\n\t\t\tthis.logger.sendErrorEvent({ eventName: \"CatchupOpsLoadFailure\" }, err),\n\t\t);\n\n\t\tawait headerLoadedP;\n\n\t\treturn { catchupOpsP };\n\t}\n\n\tprivate async loadBodyAndCatchupOps(\n\t\theaderChunkP: Promise<MergeTreeChunkV1>,\n\t\tservices: IChannelStorageService,\n\t): Promise<ISequencedDocumentMessage[]> {\n\t\tconst blobsP = services.list(\"\");\n\t\tconst headerChunk = await headerChunkP;\n\n\t\t// TODO we shouldn't need to wait on the body being complete to finish initialization.\n\t\t// To fully support this we need to be able to process inbound ops for pending segments.\n\t\tawait this.loadBody(headerChunk, services);\n\n\t\tconst blobs = await blobsP;\n\t\tif (blobs.length === headerChunk.headerMetadata!.orderedChunkMetadata.length + 1) {\n\t\t\theaderChunk.headerMetadata!.orderedChunkMetadata.forEach((md) =>\n\t\t\t\tblobs.splice(blobs.indexOf(md.id), 1),\n\t\t\t);\n\t\t\tassert(blobs.length === 1, 0x060 /* There should be only one blob with catch up ops */);\n\n\t\t\t// TODO: The 'Snapshot.catchupOps' tree entry is purely for backwards compatibility.\n\t\t\t// (See https://github.com/microsoft/FluidFramework/issues/84)\n\n\t\t\treturn this.loadCatchupOps(services.readBlob(blobs[0]), this.serializer);\n\t\t} else if (blobs.length !== headerChunk.headerMetadata!.orderedChunkMetadata.length) {\n\t\t\tthrow new Error(\"Unexpected blobs in snapshot\");\n\t\t}\n\t\treturn [];\n\t}\n\n\tprivate readonly specToSegment = (spec: IJSONSegment | IJSONSegmentWithMergeInfo) => {\n\t\tlet seg: ISegment;\n\n\t\tif (hasMergeInfo(spec)) {\n\t\t\tseg = this.client.specToSegment(spec.json);\n\n\t\t\t// `specToSegment()` initializes `seg` with the LocalClientId. Overwrite this with\n\t\t\t// the `spec` client (if specified). Otherwise overwrite with `NonCollabClient`.\n\t\t\tseg.clientId =\n\t\t\t\tspec.client !== undefined\n\t\t\t\t\t? this.client.getOrAddShortClientId(spec.client)\n\t\t\t\t\t: NonCollabClient;\n\n\t\t\tseg.seq = spec.seq ?? UniversalSequenceNumber;\n\n\t\t\tif (spec.removedSeq !== undefined) {\n\t\t\t\tseg.removedSeq = spec.removedSeq;\n\t\t\t}\n\t\t\tif (spec.movedSeq !== undefined) {\n\t\t\t\tseg.movedSeq = spec.movedSeq;\n\t\t\t}\n\t\t\tif (spec.movedSeqs !== undefined) {\n\t\t\t\tseg.movedSeqs = spec.movedSeqs;\n\t\t\t}\n\t\t\t// this format had a bug where it didn't store all the overlap clients\n\t\t\t// this is for back compat, so we change the singular id to an array\n\t\t\t// this will only cause problems if there is an overlapping delete\n\t\t\t// spanning the snapshot, which should be rare\n\t\t\tconst specAsBuggyFormat: IJSONSegmentWithMergeInfo & { removedClient?: string } = spec;\n\t\t\tif (specAsBuggyFormat.removedClient !== undefined) {\n\t\t\t\tseg.removedClientIds = [\n\t\t\t\t\tthis.client.getOrAddShortClientId(specAsBuggyFormat.removedClient),\n\t\t\t\t];\n\t\t\t}\n\t\t\tif (spec.removedClientIds !== undefined) {\n\t\t\t\tseg.removedClientIds = spec.removedClientIds?.map((sid) =>\n\t\t\t\t\tthis.client.getOrAddShortClientId(sid),\n\t\t\t\t);\n\t\t\t}\n\t\t\tif (spec.movedClientIds !== undefined) {\n\t\t\t\tseg.movedClientIds = spec.movedClientIds?.map((sid) =>\n\t\t\t\t\tthis.client.getOrAddShortClientId(sid),\n\t\t\t\t);\n\t\t\t}\n\t\t} else {\n\t\t\tseg = this.client.specToSegment(spec);\n\t\t\tseg.seq = UniversalSequenceNumber;\n\n\t\t\t// `specToSegment()` initializes `seg` with the LocalClientId. We must overwrite this with\n\t\t\t// `NonCollabClient`.\n\t\t\tseg.clientId = NonCollabClient;\n\t\t}\n\n\t\treturn seg;\n\t};\n\n\tprivate loadHeader(header: string): MergeTreeChunkV1 {\n\t\tconst chunk = SnapshotV1.processChunk(\n\t\t\tSnapshotLegacy.header,\n\t\t\theader,\n\t\t\tthis.logger,\n\t\t\tthis.mergeTree.options,\n\t\t\tthis.serializer,\n\t\t);\n\t\tconst segs = chunk.segments.map(this.specToSegment);\n\t\tthis.extractAttribution(segs, chunk);\n\n\t\tthis.mergeTree.reloadFromSegments(segs);\n\n\t\tif (chunk.headerMetadata === undefined) {\n\t\t\tthrow new Error(\"header metadata not available\");\n\t\t}\n\t\t// If we load a detached container from snapshot, then we don't supply a default clientId\n\t\t// because we don't want to start collaboration.\n\t\tif (this.runtime.attachState !== AttachState.Detached) {\n\t\t\t// specify a default client id, \"snapshot\" here as we\n\t\t\t// should enter collaboration/op sending mode if we load\n\t\t\t// a snapshot in any case (summary or attach message)\n\t\t\t// once we get a client id this will be called with that\n\t\t\t// clientId in the connected event\n\t\t\tthis.client.startOrUpdateCollaboration(\n\t\t\t\tthis.runtime.clientId ?? \"snapshot\",\n\n\t\t\t\t// TODO: Make 'minSeq' non-optional once the new snapshot format becomes the default?\n\t\t\t\t// (See https://github.com/microsoft/FluidFramework/issues/84)\n\t\t\t\t/* minSeq: */ chunk.headerMetadata.minSequenceNumber ??\n\t\t\t\t\tchunk.headerMetadata.sequenceNumber,\n\t\t\t\t/* currentSeq: */ chunk.headerMetadata.sequenceNumber,\n\t\t\t);\n\t\t}\n\n\t\treturn chunk;\n\t}\n\n\tprivate async loadBody(\n\t\tchunk1: MergeTreeChunkV1,\n\t\tservices: IChannelStorageService,\n\t): Promise<void> {\n\t\tconst headerMetadata = chunk1.headerMetadata!;\n\t\tassert(chunk1.length <= headerMetadata.totalLength, 0x061 /* \"Mismatch in totalLength\" */);\n\n\t\tassert(\n\t\t\tchunk1.segmentCount <= headerMetadata.totalSegmentCount,\n\t\t\t0x062 /* \"Mismatch in totalSegmentCount\" */,\n\t\t);\n\n\t\tif (chunk1.segmentCount === headerMetadata.totalSegmentCount) {\n\t\t\treturn;\n\t\t}\n\n\t\tlet chunksWithAttribution = chunk1.attribution !== undefined ? 1 : 0;\n\t\tconst segs: ISegment[] = [];\n\t\tlet lengthSofar = chunk1.length;\n\t\tfor (\n\t\t\tlet chunkIndex = 1;\n\t\t\tchunkIndex < headerMetadata.orderedChunkMetadata.length;\n\t\t\tchunkIndex++\n\t\t) {\n\t\t\tconst chunk = await SnapshotV1.loadChunk(\n\t\t\t\tservices,\n\t\t\t\theaderMetadata.orderedChunkMetadata[chunkIndex].id,\n\t\t\t\tthis.logger,\n\t\t\t\tthis.mergeTree.options,\n\t\t\t\tthis.serializer,\n\t\t\t);\n\t\t\tlengthSofar += chunk.length;\n\t\t\t// Deserialize each chunk segment and append it to the end of the MergeTree.\n\t\t\tconst newSegs = chunk.segments.map(this.specToSegment);\n\t\t\tthis.extractAttribution(newSegs, chunk);\n\t\t\tchunksWithAttribution += chunk.attribution !== undefined ? 1 : 0;\n\t\t\tsegs.push(...newSegs);\n\t\t}\n\n\t\tassert(\n\t\t\tchunksWithAttribution === 0 ||\n\t\t\t\tchunksWithAttribution === headerMetadata.orderedChunkMetadata.length,\n\t\t\t0x4c0 /* all or no chunks should have attribution information */,\n\t\t);\n\n\t\tassert(lengthSofar === headerMetadata.totalLength, 0x063 /* \"Mismatch in totalLength\" */);\n\n\t\tassert(\n\t\t\tchunk1.segmentCount + segs.length === headerMetadata.totalSegmentCount,\n\t\t\t0x064 /* \"Mismatch in totalSegmentCount\" */,\n\t\t);\n\n\t\t// Helper to insert segments at the end of the MergeTree.\n\t\tconst mergeTree = this.mergeTree;\n\t\tconst append = (segments: ISegment[], cli: number, seq: number) => {\n\t\t\tmergeTree.insertSegments(\n\t\t\t\tmergeTree.root.cachedLength ?? 0,\n\t\t\t\tsegments,\n\t\t\t\t/* refSeq: */ UniversalSequenceNumber,\n\t\t\t\tcli,\n\t\t\t\tseq,\n\t\t\t\tundefined,\n\t\t\t);\n\t\t};\n\n\t\t// Helpers to batch-insert segments that are below the min seq\n\t\tconst batch: ISegment[] = [];\n\t\tconst flushBatch = () => {\n\t\t\tif (batch.length > 0) {\n\t\t\t\tappend(batch, NonCollabClient, UniversalSequenceNumber);\n\t\t\t}\n\t\t};\n\n\t\tfor (const seg of segs) {\n\t\t\tconst cli = seg.clientId;\n\t\t\tconst seq = seg.seq;\n\n\t\t\t// If the segment can be batch inserted, add it to the 'batch' array. Otherwise, flush\n\t\t\t// any batched segments and then insert the current segment individually.\n\t\t\tif (cli === NonCollabClient && seq === UniversalSequenceNumber) {\n\t\t\t\tbatch.push(seg);\n\t\t\t} else {\n\t\t\t\tflushBatch();\n\t\t\t\tappend([seg], cli, seq!);\n\t\t\t}\n\t\t}\n\n\t\tflushBatch();\n\t}\n\n\tprivate extractAttribution(segments: ISegment[], chunk: MergeTreeChunkV1): void {\n\t\tthis.mergeTree.options ??= {};\n\t\tthis.mergeTree.options.attribution ??= {};\n\t\tif (chunk.attribution) {\n\t\t\tconst { attributionPolicy } = this.mergeTree;\n\t\t\tif (attributionPolicy === undefined) {\n\t\t\t\tthrow new UsageError(\n\t\t\t\t\t\"Attribution policy must be provided when loading a document with attribution information.\",\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst { isAttached, attach, serializer } = attributionPolicy;\n\t\t\tif (!isAttached) {\n\t\t\t\tattach(this.client);\n\t\t\t}\n\t\t\tserializer.populateAttributionCollections(segments, chunk.attribution);\n\t\t} else {\n\t\t\tconst { attributionPolicy } = this.mergeTree;\n\t\t\tif (attributionPolicy?.isAttached) {\n\t\t\t\tattributionPolicy?.detach();\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * If loading from a snapshot, get the catchup messages.\n\t * @param rawMessages - The messages in original encoding\n\t * @returns The decoded messages with parsed+hydrated handles. Matches the format that will be passed in\n\t * SharedObject.processCore.\n\t */\n\tprivate async loadCatchupOps(\n\t\trawMessages: Promise<ArrayBufferLike>,\n\t\tserializer: IFluidSerializer,\n\t): Promise<ISequencedDocumentMessage[]> {\n\t\treturn serializer.parse(\n\t\t\tbufferToString(await rawMessages, \"utf8\"),\n\t\t) as ISequencedDocumentMessage[];\n\t}\n}\n"]}
|
|
1
|
+
{"version":3,"file":"snapshotLoader.js","sourceRoot":"","sources":["../src/snapshotLoader.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\n/* eslint-disable @typescript-eslint/no-non-null-assertion */\n\nimport { bufferToString } from \"@fluid-internal/client-utils\";\nimport { AttachState } from \"@fluidframework/container-definitions\";\nimport { assert } from \"@fluidframework/core-utils/internal\";\nimport {\n\tIChannelStorageService,\n\tIFluidDataStoreRuntime,\n} from \"@fluidframework/datastore-definitions\";\nimport { ISequencedDocumentMessage } from \"@fluidframework/protocol-definitions\";\nimport { IFluidSerializer } from \"@fluidframework/shared-object-base\";\nimport { ITelemetryLoggerExt } from \"@fluidframework/telemetry-utils\";\nimport { UsageError, createChildLogger } from \"@fluidframework/telemetry-utils/internal\";\n\n// eslint-disable-next-line import/no-deprecated\nimport { Client } from \"./client.js\";\nimport { NonCollabClient, UniversalSequenceNumber } from \"./constants.js\";\nimport { MergeTree } from \"./mergeTree.js\";\nimport { ISegment } from \"./mergeTreeNodes.js\";\nimport { IJSONSegment } from \"./ops.js\";\nimport { IJSONSegmentWithMergeInfo, MergeTreeChunkV1, hasMergeInfo } from \"./snapshotChunks.js\";\nimport { SnapshotV1 } from \"./snapshotV1.js\";\nimport { SnapshotLegacy } from \"./snapshotlegacy.js\";\n\nexport class SnapshotLoader {\n\tprivate readonly logger: ITelemetryLoggerExt;\n\n\tconstructor(\n\t\tprivate readonly runtime: IFluidDataStoreRuntime,\n\t\t// eslint-disable-next-line import/no-deprecated\n\t\tprivate readonly client: Client,\n\t\tprivate readonly mergeTree: MergeTree,\n\t\tlogger: ITelemetryLoggerExt,\n\t\tprivate readonly serializer: IFluidSerializer,\n\t) {\n\t\tthis.logger = createChildLogger({ logger, namespace: \"SnapshotLoader\" });\n\t}\n\n\tpublic async initialize(\n\t\tservices: IChannelStorageService,\n\t): Promise<{ catchupOpsP: Promise<ISequencedDocumentMessage[]> }> {\n\t\tconst headerLoadedP = services.readBlob(SnapshotLegacy.header).then((header) => {\n\t\t\tassert(!!header, 0x05f /* \"Missing blob header on legacy snapshot!\" */);\n\t\t\treturn this.loadHeader(bufferToString(header, \"utf8\"));\n\t\t});\n\n\t\tconst catchupOpsP = this.loadBodyAndCatchupOps(headerLoadedP, services);\n\n\t\tcatchupOpsP.catch((err) =>\n\t\t\tthis.logger.sendErrorEvent({ eventName: \"CatchupOpsLoadFailure\" }, err),\n\t\t);\n\n\t\tawait headerLoadedP;\n\n\t\treturn { catchupOpsP };\n\t}\n\n\tprivate async loadBodyAndCatchupOps(\n\t\theaderChunkP: Promise<MergeTreeChunkV1>,\n\t\tservices: IChannelStorageService,\n\t): Promise<ISequencedDocumentMessage[]> {\n\t\tconst blobsP = services.list(\"\");\n\t\tconst headerChunk = await headerChunkP;\n\n\t\t// TODO we shouldn't need to wait on the body being complete to finish initialization.\n\t\t// To fully support this we need to be able to process inbound ops for pending segments.\n\t\tawait this.loadBody(headerChunk, services);\n\n\t\tconst blobs = await blobsP;\n\t\tif (blobs.length === headerChunk.headerMetadata!.orderedChunkMetadata.length + 1) {\n\t\t\theaderChunk.headerMetadata!.orderedChunkMetadata.forEach((md) =>\n\t\t\t\tblobs.splice(blobs.indexOf(md.id), 1),\n\t\t\t);\n\t\t\tassert(blobs.length === 1, 0x060 /* There should be only one blob with catch up ops */);\n\n\t\t\t// TODO: The 'Snapshot.catchupOps' tree entry is purely for backwards compatibility.\n\t\t\t// (See https://github.com/microsoft/FluidFramework/issues/84)\n\n\t\t\treturn this.loadCatchupOps(services.readBlob(blobs[0]), this.serializer);\n\t\t} else if (blobs.length !== headerChunk.headerMetadata!.orderedChunkMetadata.length) {\n\t\t\tthrow new Error(\"Unexpected blobs in snapshot\");\n\t\t}\n\t\treturn [];\n\t}\n\n\tprivate readonly specToSegment = (spec: IJSONSegment | IJSONSegmentWithMergeInfo) => {\n\t\tlet seg: ISegment;\n\n\t\tif (hasMergeInfo(spec)) {\n\t\t\tseg = this.client.specToSegment(spec.json);\n\n\t\t\t// `specToSegment()` initializes `seg` with the LocalClientId. Overwrite this with\n\t\t\t// the `spec` client (if specified). Otherwise overwrite with `NonCollabClient`.\n\t\t\tseg.clientId =\n\t\t\t\tspec.client !== undefined\n\t\t\t\t\t? this.client.getOrAddShortClientId(spec.client)\n\t\t\t\t\t: NonCollabClient;\n\n\t\t\tseg.seq = spec.seq ?? UniversalSequenceNumber;\n\n\t\t\tif (spec.removedSeq !== undefined) {\n\t\t\t\tseg.removedSeq = spec.removedSeq;\n\t\t\t}\n\t\t\tif (spec.movedSeq !== undefined) {\n\t\t\t\tseg.movedSeq = spec.movedSeq;\n\t\t\t}\n\t\t\tif (spec.movedSeqs !== undefined) {\n\t\t\t\tseg.movedSeqs = spec.movedSeqs;\n\t\t\t}\n\t\t\t// this format had a bug where it didn't store all the overlap clients\n\t\t\t// this is for back compat, so we change the singular id to an array\n\t\t\t// this will only cause problems if there is an overlapping delete\n\t\t\t// spanning the snapshot, which should be rare\n\t\t\tconst specAsBuggyFormat: IJSONSegmentWithMergeInfo & { removedClient?: string } = spec;\n\t\t\tif (specAsBuggyFormat.removedClient !== undefined) {\n\t\t\t\tseg.removedClientIds = [\n\t\t\t\t\tthis.client.getOrAddShortClientId(specAsBuggyFormat.removedClient),\n\t\t\t\t];\n\t\t\t}\n\t\t\tif (spec.removedClientIds !== undefined) {\n\t\t\t\tseg.removedClientIds = spec.removedClientIds?.map((sid) =>\n\t\t\t\t\tthis.client.getOrAddShortClientId(sid),\n\t\t\t\t);\n\t\t\t}\n\t\t\tif (spec.movedClientIds !== undefined) {\n\t\t\t\tseg.movedClientIds = spec.movedClientIds?.map((sid) =>\n\t\t\t\t\tthis.client.getOrAddShortClientId(sid),\n\t\t\t\t);\n\t\t\t}\n\t\t} else {\n\t\t\tseg = this.client.specToSegment(spec);\n\t\t\tseg.seq = UniversalSequenceNumber;\n\n\t\t\t// `specToSegment()` initializes `seg` with the LocalClientId. We must overwrite this with\n\t\t\t// `NonCollabClient`.\n\t\t\tseg.clientId = NonCollabClient;\n\t\t}\n\n\t\treturn seg;\n\t};\n\n\tprivate loadHeader(header: string): MergeTreeChunkV1 {\n\t\tconst chunk = SnapshotV1.processChunk(\n\t\t\tSnapshotLegacy.header,\n\t\t\theader,\n\t\t\tthis.logger,\n\t\t\tthis.mergeTree.options,\n\t\t\tthis.serializer,\n\t\t);\n\t\tconst segs = chunk.segments.map(this.specToSegment);\n\t\tthis.extractAttribution(segs, chunk);\n\n\t\tthis.mergeTree.reloadFromSegments(segs);\n\n\t\tif (chunk.headerMetadata === undefined) {\n\t\t\tthrow new Error(\"header metadata not available\");\n\t\t}\n\t\t// If we load a detached container from snapshot, then we don't supply a default clientId\n\t\t// because we don't want to start collaboration.\n\t\tif (this.runtime.attachState !== AttachState.Detached) {\n\t\t\t// specify a default client id, \"snapshot\" here as we\n\t\t\t// should enter collaboration/op sending mode if we load\n\t\t\t// a snapshot in any case (summary or attach message)\n\t\t\t// once we get a client id this will be called with that\n\t\t\t// clientId in the connected event\n\t\t\tthis.client.startOrUpdateCollaboration(\n\t\t\t\tthis.runtime.clientId ?? \"snapshot\",\n\n\t\t\t\t// TODO: Make 'minSeq' non-optional once the new snapshot format becomes the default?\n\t\t\t\t// (See https://github.com/microsoft/FluidFramework/issues/84)\n\t\t\t\t/* minSeq: */ chunk.headerMetadata.minSequenceNumber ??\n\t\t\t\t\tchunk.headerMetadata.sequenceNumber,\n\t\t\t\t/* currentSeq: */ chunk.headerMetadata.sequenceNumber,\n\t\t\t);\n\t\t}\n\n\t\treturn chunk;\n\t}\n\n\tprivate async loadBody(\n\t\tchunk1: MergeTreeChunkV1,\n\t\tservices: IChannelStorageService,\n\t): Promise<void> {\n\t\tconst headerMetadata = chunk1.headerMetadata!;\n\t\tassert(chunk1.length <= headerMetadata.totalLength, 0x061 /* \"Mismatch in totalLength\" */);\n\n\t\tassert(\n\t\t\tchunk1.segmentCount <= headerMetadata.totalSegmentCount,\n\t\t\t0x062 /* \"Mismatch in totalSegmentCount\" */,\n\t\t);\n\n\t\tif (chunk1.segmentCount === headerMetadata.totalSegmentCount) {\n\t\t\treturn;\n\t\t}\n\n\t\tlet chunksWithAttribution = chunk1.attribution !== undefined ? 1 : 0;\n\t\tconst segs: ISegment[] = [];\n\t\tlet lengthSofar = chunk1.length;\n\t\tfor (\n\t\t\tlet chunkIndex = 1;\n\t\t\tchunkIndex < headerMetadata.orderedChunkMetadata.length;\n\t\t\tchunkIndex++\n\t\t) {\n\t\t\tconst chunk = await SnapshotV1.loadChunk(\n\t\t\t\tservices,\n\t\t\t\theaderMetadata.orderedChunkMetadata[chunkIndex].id,\n\t\t\t\tthis.logger,\n\t\t\t\tthis.mergeTree.options,\n\t\t\t\tthis.serializer,\n\t\t\t);\n\t\t\tlengthSofar += chunk.length;\n\t\t\t// Deserialize each chunk segment and append it to the end of the MergeTree.\n\t\t\tconst newSegs = chunk.segments.map(this.specToSegment);\n\t\t\tthis.extractAttribution(newSegs, chunk);\n\t\t\tchunksWithAttribution += chunk.attribution !== undefined ? 1 : 0;\n\t\t\tsegs.push(...newSegs);\n\t\t}\n\n\t\tassert(\n\t\t\tchunksWithAttribution === 0 ||\n\t\t\t\tchunksWithAttribution === headerMetadata.orderedChunkMetadata.length,\n\t\t\t0x4c0 /* all or no chunks should have attribution information */,\n\t\t);\n\n\t\tassert(lengthSofar === headerMetadata.totalLength, 0x063 /* \"Mismatch in totalLength\" */);\n\n\t\tassert(\n\t\t\tchunk1.segmentCount + segs.length === headerMetadata.totalSegmentCount,\n\t\t\t0x064 /* \"Mismatch in totalSegmentCount\" */,\n\t\t);\n\n\t\t// Helper to insert segments at the end of the MergeTree.\n\t\tconst mergeTree = this.mergeTree;\n\t\tconst append = (segments: ISegment[], cli: number, seq: number) => {\n\t\t\tmergeTree.insertSegments(\n\t\t\t\tmergeTree.root.cachedLength ?? 0,\n\t\t\t\tsegments,\n\t\t\t\t/* refSeq: */ UniversalSequenceNumber,\n\t\t\t\tcli,\n\t\t\t\tseq,\n\t\t\t\tundefined,\n\t\t\t);\n\t\t};\n\n\t\t// Helpers to batch-insert segments that are below the min seq\n\t\tconst batch: ISegment[] = [];\n\t\tconst flushBatch = () => {\n\t\t\tif (batch.length > 0) {\n\t\t\t\tappend(batch, NonCollabClient, UniversalSequenceNumber);\n\t\t\t}\n\t\t};\n\n\t\tfor (const seg of segs) {\n\t\t\tconst cli = seg.clientId;\n\t\t\tconst seq = seg.seq;\n\n\t\t\t// If the segment can be batch inserted, add it to the 'batch' array. Otherwise, flush\n\t\t\t// any batched segments and then insert the current segment individually.\n\t\t\tif (cli === NonCollabClient && seq === UniversalSequenceNumber) {\n\t\t\t\tbatch.push(seg);\n\t\t\t} else {\n\t\t\t\tflushBatch();\n\t\t\t\tappend([seg], cli, seq!);\n\t\t\t}\n\t\t}\n\n\t\tflushBatch();\n\t}\n\n\tprivate extractAttribution(segments: ISegment[], chunk: MergeTreeChunkV1): void {\n\t\tthis.mergeTree.options ??= {};\n\t\tthis.mergeTree.options.attribution ??= {};\n\t\tif (chunk.attribution) {\n\t\t\tconst { attributionPolicy } = this.mergeTree;\n\t\t\tif (attributionPolicy === undefined) {\n\t\t\t\tthrow new UsageError(\n\t\t\t\t\t\"Attribution policy must be provided when loading a document with attribution information.\",\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst { isAttached, attach, serializer } = attributionPolicy;\n\t\t\tif (!isAttached) {\n\t\t\t\tattach(this.client);\n\t\t\t}\n\t\t\tserializer.populateAttributionCollections(segments, chunk.attribution);\n\t\t} else {\n\t\t\tconst { attributionPolicy } = this.mergeTree;\n\t\t\tif (attributionPolicy?.isAttached) {\n\t\t\t\tattributionPolicy?.detach();\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * If loading from a snapshot, get the catchup messages.\n\t * @param rawMessages - The messages in original encoding\n\t * @returns The decoded messages with parsed+hydrated handles. Matches the format that will be passed in\n\t * SharedObject.processCore.\n\t */\n\tprivate async loadCatchupOps(\n\t\trawMessages: Promise<ArrayBufferLike>,\n\t\tserializer: IFluidSerializer,\n\t): Promise<ISequencedDocumentMessage[]> {\n\t\treturn serializer.parse(\n\t\t\tbufferToString(await rawMessages, \"utf8\"),\n\t\t) as ISequencedDocumentMessage[];\n\t}\n}\n"]}
|
package/dist/snapshotV1.d.ts
CHANGED
|
@@ -2,14 +2,14 @@
|
|
|
2
2
|
* Copyright (c) Microsoft Corporation and contributors. All rights reserved.
|
|
3
3
|
* Licensed under the MIT License.
|
|
4
4
|
*/
|
|
5
|
-
import { ITelemetryLoggerExt } from "@fluidframework/telemetry-utils";
|
|
6
5
|
import { IFluidHandle } from "@fluidframework/core-interfaces";
|
|
7
|
-
import { IFluidSerializer } from "@fluidframework/shared-object-base";
|
|
8
6
|
import { IChannelStorageService } from "@fluidframework/datastore-definitions";
|
|
9
7
|
import { ISummaryTreeWithStats } from "@fluidframework/runtime-definitions";
|
|
8
|
+
import { IFluidSerializer } from "@fluidframework/shared-object-base";
|
|
9
|
+
import { ITelemetryLoggerExt } from "@fluidframework/telemetry-utils";
|
|
10
|
+
import { MergeTree } from "./mergeTree.js";
|
|
10
11
|
import { PropertySet } from "./properties.js";
|
|
11
12
|
import { JsonSegmentSpecs, MergeTreeChunkV1 } from "./snapshotChunks.js";
|
|
12
|
-
import { MergeTree } from "./mergeTree.js";
|
|
13
13
|
export declare class SnapshotV1 {
|
|
14
14
|
mergeTree: MergeTree;
|
|
15
15
|
private readonly getLongClientId;
|
package/dist/snapshotV1.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"snapshotV1.d.ts","sourceRoot":"","sources":["../src/snapshotV1.ts"],"names":[],"mappings":"AAAA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"snapshotV1.d.ts","sourceRoot":"","sources":["../src/snapshotV1.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAE/D,OAAO,EAAE,sBAAsB,EAAE,MAAM,uCAAuC,CAAC;AAC/E,OAAO,EAAE,qBAAqB,EAAE,MAAM,qCAAqC,CAAC;AAG5E,OAAO,EAAE,gBAAgB,EAAE,MAAM,oCAAoC,CAAC;AACtE,OAAO,EAAE,mBAAmB,EAAE,MAAM,iCAAiC,CAAC;AAKtE,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAG3C,OAAO,EAAE,WAAW,EAAmB,MAAM,iBAAiB,CAAC;AAC/D,OAAO,EAEN,gBAAgB,EAChB,gBAAgB,EAIhB,MAAM,qBAAqB,CAAC;AAG7B,qBAAa,UAAU;IAiBd,SAAS,EAAE,SAAS;IAE3B,OAAO,CAAC,QAAQ,CAAC,eAAe;IACzB,QAAQ,CAAC;IACT,YAAY,CAAC,SAAQ,IAAI;IAdjC,gBAAuB,SAAS,EAAE,MAAM,CAAS;IAEjD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA0B;IACjD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAqB;IAC9C,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAW;IAC1C,OAAO,CAAC,QAAQ,CAAC,sBAAsB,CAA2C;IAClF,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAsB;IAC7C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;gBAG3B,SAAS,EAAE,SAAS,EAC3B,MAAM,EAAE,mBAAmB,EACV,eAAe,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,MAAM,EACjD,QAAQ,CAAC,oBAAQ,EACjB,YAAY,CAAC,SAAQ,IAAI,aAAA;IAmBjC,OAAO,CAAC,gBAAgB;IAgDxB;;;OAGG;IACH,IAAI,CAAC,UAAU,EAAE,gBAAgB,EAAE,IAAI,EAAE,YAAY,GAAG,qBAAqB;IA0D7E,WAAW;WAmLS,SAAS,CAC5B,OAAO,EAAE,sBAAsB,EAC/B,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,mBAAmB,EAC3B,OAAO,EAAE,WAAW,GAAG,SAAS,EAChC,UAAU,CAAC,EAAE,gBAAgB,GAC3B,OAAO,CAAC,gBAAgB,CAAC;WAMd,YAAY,CACzB,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,mBAAmB,EAC3B,OAAO,EAAE,WAAW,GAAG,SAAS,EAChC,UAAU,CAAC,EAAE,gBAAgB,GAC3B,gBAAgB;CAInB"}
|
package/dist/snapshotV1.js
CHANGED
|
@@ -5,22 +5,22 @@
|
|
|
5
5
|
*/
|
|
6
6
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
7
|
exports.SnapshotV1 = void 0;
|
|
8
|
-
const telemetry_utils_1 = require("@fluidframework/telemetry-utils");
|
|
9
|
-
const core_utils_1 = require("@fluidframework/core-utils");
|
|
10
8
|
const client_utils_1 = require("@fluid-internal/client-utils");
|
|
11
|
-
const
|
|
9
|
+
const internal_1 = require("@fluidframework/core-utils/internal");
|
|
10
|
+
const internal_2 = require("@fluidframework/runtime-utils/internal");
|
|
11
|
+
const internal_3 = require("@fluidframework/telemetry-utils/internal");
|
|
12
12
|
const constants_js_1 = require("./constants.js");
|
|
13
|
+
const mergeTreeNodeWalk_js_1 = require("./mergeTreeNodeWalk.js");
|
|
13
14
|
const properties_js_1 = require("./properties.js");
|
|
14
15
|
const snapshotChunks_js_1 = require("./snapshotChunks.js");
|
|
15
16
|
const snapshotlegacy_js_1 = require("./snapshotlegacy.js");
|
|
16
|
-
const mergeTreeNodeWalk_js_1 = require("./mergeTreeNodeWalk.js");
|
|
17
17
|
class SnapshotV1 {
|
|
18
18
|
constructor(mergeTree, logger, getLongClientId, filename, onCompletion) {
|
|
19
19
|
this.mergeTree = mergeTree;
|
|
20
20
|
this.getLongClientId = getLongClientId;
|
|
21
21
|
this.filename = filename;
|
|
22
22
|
this.onCompletion = onCompletion;
|
|
23
|
-
this.logger = (0,
|
|
23
|
+
this.logger = (0, internal_3.createChildLogger)({ logger, namespace: "Snapshot" });
|
|
24
24
|
this.chunkSize = mergeTree?.options?.mergeTreeSnapshotChunkSize ?? SnapshotV1.chunkSize;
|
|
25
25
|
const { currentSeq, minSeq } = mergeTree.collabWindow;
|
|
26
26
|
this.header = {
|
|
@@ -54,7 +54,7 @@ class SnapshotV1 {
|
|
|
54
54
|
segmentCount++;
|
|
55
55
|
}
|
|
56
56
|
const attributionSerializer = this.mergeTree.attributionPolicy?.serializer;
|
|
57
|
-
(0,
|
|
57
|
+
(0, internal_1.assert)(!hasAttribution || attributionSerializer !== undefined, 0x55a /* attribution serializer must be provided when there are segments with attribution. */);
|
|
58
58
|
return {
|
|
59
59
|
version: "1",
|
|
60
60
|
segmentCount,
|
|
@@ -95,7 +95,7 @@ class SnapshotV1 {
|
|
|
95
95
|
(0, snapshotChunks_js_1.serializeAsMaxSupportedVersion)(id, chunk, this.logger, this.mergeTree.options, serializer, bind),
|
|
96
96
|
]);
|
|
97
97
|
});
|
|
98
|
-
const builder = new
|
|
98
|
+
const builder = new internal_2.SummaryTreeBuilder();
|
|
99
99
|
builder.addBlob(snapshotlegacy_js_1.SnapshotLegacy.header, (0, snapshotChunks_js_1.serializeAsMaxSupportedVersion)(snapshotlegacy_js_1.SnapshotLegacy.header, headerChunk, this.logger, this.mergeTree.options, serializer, bind));
|
|
100
100
|
blobs.forEach((value) => {
|
|
101
101
|
builder.addBlob(value[0], value[1]);
|
|
@@ -197,7 +197,7 @@ class SnapshotV1 {
|
|
|
197
197
|
// We have already dispensed with removed segments below the MSN and removed segments with unassigned
|
|
198
198
|
// sequence numbers. Any remaining removal info should be preserved.
|
|
199
199
|
if (segment.removedSeq !== undefined) {
|
|
200
|
-
(0,
|
|
200
|
+
(0, internal_1.assert)(segment.removedSeq !== constants_js_1.UnassignedSequenceNumber &&
|
|
201
201
|
segment.removedSeq > minSeq, 0x065 /* "On removal info preservation, segment has invalid removed sequence number!" */);
|
|
202
202
|
raw.removedSeq = segment.removedSeq;
|
|
203
203
|
// back compat for when we split overlap and removed client
|
|
@@ -208,13 +208,13 @@ class SnapshotV1 {
|
|
|
208
208
|
raw.removedClientIds = segment.removedClientIds?.map((id) => this.getLongClientId(id));
|
|
209
209
|
}
|
|
210
210
|
if (segment.movedSeq !== undefined) {
|
|
211
|
-
(0,
|
|
211
|
+
(0, internal_1.assert)(segment.movedSeq !== constants_js_1.UnassignedSequenceNumber && segment.movedSeq > minSeq, 0x873 /* On move info preservation, segment has invalid moved sequence number! */);
|
|
212
212
|
raw.movedSeq = segment.movedSeq;
|
|
213
213
|
raw.movedSeqs = segment.movedSeqs;
|
|
214
214
|
raw.movedClientIds = segment.movedClientIds?.map((id) => this.getLongClientId(id));
|
|
215
215
|
}
|
|
216
216
|
// Sanity check that we are preserving either the seq > minSeq or a (re)moved segment's info.
|
|
217
|
-
(0,
|
|
217
|
+
(0, internal_1.assert)((raw.seq !== undefined && raw.client !== undefined) ||
|
|
218
218
|
(raw.removedSeq !== undefined && raw.removedClientIds !== undefined) ||
|
|
219
219
|
(raw.movedSeq !== undefined &&
|
|
220
220
|
raw.movedClientIds !== undefined &&
|