@fluidframework/merge-tree 2.1.0-276985 → 2.1.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/.eslintrc.cjs +2 -4
- package/CHANGELOG.md +15 -0
- package/README.md +109 -1
- package/api-extractor/api-extractor.current.json +5 -0
- package/api-extractor/api-extractor.legacy.json +1 -1
- package/api-extractor.json +1 -1
- package/api-report/merge-tree.legacy.alpha.api.md +10 -22
- package/api-report/merge-tree.legacy.public.api.md +9 -0
- package/dist/MergeTreeTextHelper.d.ts.map +1 -1
- package/dist/MergeTreeTextHelper.js +1 -1
- package/dist/MergeTreeTextHelper.js.map +1 -1
- package/dist/attributionCollection.d.ts.map +1 -1
- package/dist/attributionCollection.js +65 -17
- package/dist/attributionCollection.js.map +1 -1
- package/dist/attributionPolicy.d.ts +2 -1
- package/dist/attributionPolicy.d.ts.map +1 -1
- package/dist/attributionPolicy.js +10 -3
- package/dist/attributionPolicy.js.map +1 -1
- package/dist/client.d.ts +3 -1
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +65 -37
- package/dist/client.js.map +1 -1
- package/dist/collections/list.d.ts.map +1 -1
- package/dist/collections/list.js +5 -2
- package/dist/collections/list.js.map +1 -1
- package/dist/collections/rbTree.d.ts +2 -2
- package/dist/collections/rbTree.d.ts.map +1 -1
- package/dist/collections/rbTree.js +23 -35
- package/dist/collections/rbTree.js.map +1 -1
- package/dist/endOfTreeSegment.d.ts.map +1 -1
- package/dist/endOfTreeSegment.js +4 -1
- package/dist/endOfTreeSegment.js.map +1 -1
- package/dist/legacy.d.ts +1 -1
- package/dist/localReference.d.ts +16 -6
- package/dist/localReference.d.ts.map +1 -1
- package/dist/localReference.js +31 -20
- package/dist/localReference.js.map +1 -1
- package/dist/mergeTree.d.ts +0 -1
- package/dist/mergeTree.d.ts.map +1 -1
- package/dist/mergeTree.js +127 -112
- package/dist/mergeTree.js.map +1 -1
- package/dist/mergeTreeNodeWalk.d.ts.map +1 -1
- package/dist/mergeTreeNodeWalk.js +1 -1
- package/dist/mergeTreeNodeWalk.js.map +1 -1
- package/dist/mergeTreeNodes.d.ts +6 -5
- package/dist/mergeTreeNodes.d.ts.map +1 -1
- package/dist/mergeTreeNodes.js +29 -20
- package/dist/mergeTreeNodes.js.map +1 -1
- package/dist/mergeTreeTracking.js +3 -3
- package/dist/mergeTreeTracking.js.map +1 -1
- package/dist/opBuilder.d.ts +6 -1
- package/dist/opBuilder.d.ts.map +1 -1
- package/dist/opBuilder.js +5 -0
- package/dist/opBuilder.js.map +1 -1
- package/dist/ops.d.ts.map +1 -1
- package/dist/ops.js.map +1 -1
- package/dist/ordinal.d.ts.map +1 -1
- package/dist/ordinal.js +7 -0
- package/dist/ordinal.js.map +1 -1
- package/dist/partialLengths.d.ts +4 -2
- package/dist/partialLengths.d.ts.map +1 -1
- package/dist/partialLengths.js +101 -53
- package/dist/partialLengths.js.map +1 -1
- package/dist/perspective.d.ts +4 -1
- package/dist/perspective.d.ts.map +1 -1
- package/dist/perspective.js +7 -6
- package/dist/perspective.js.map +1 -1
- package/dist/properties.d.ts +13 -10
- package/dist/properties.d.ts.map +1 -1
- package/dist/properties.js +22 -11
- package/dist/properties.js.map +1 -1
- package/dist/public.d.ts +1 -1
- package/dist/referencePositions.d.ts +7 -0
- package/dist/referencePositions.d.ts.map +1 -1
- package/dist/referencePositions.js +7 -0
- package/dist/referencePositions.js.map +1 -1
- package/dist/revertibles.d.ts +6 -0
- package/dist/revertibles.d.ts.map +1 -1
- package/dist/revertibles.js +50 -21
- package/dist/revertibles.js.map +1 -1
- package/dist/segmentGroupCollection.d.ts.map +1 -1
- package/dist/segmentGroupCollection.js +2 -0
- package/dist/segmentGroupCollection.js.map +1 -1
- package/dist/segmentPropertiesManager.d.ts +7 -3
- package/dist/segmentPropertiesManager.d.ts.map +1 -1
- package/dist/segmentPropertiesManager.js +20 -15
- package/dist/segmentPropertiesManager.js.map +1 -1
- package/dist/snapshotChunks.d.ts.map +1 -1
- package/dist/snapshotChunks.js +10 -5
- package/dist/snapshotChunks.js.map +1 -1
- package/dist/snapshotLoader.d.ts.map +1 -1
- package/dist/snapshotLoader.js +14 -10
- package/dist/snapshotLoader.js.map +1 -1
- package/dist/snapshotV1.d.ts.map +1 -1
- package/dist/snapshotV1.js +20 -8
- package/dist/snapshotV1.js.map +1 -1
- package/dist/snapshotlegacy.d.ts.map +1 -1
- package/dist/snapshotlegacy.js +4 -2
- package/dist/snapshotlegacy.js.map +1 -1
- package/dist/sortedSegmentSet.d.ts.map +1 -1
- package/dist/sortedSegmentSet.js +8 -1
- package/dist/sortedSegmentSet.js.map +1 -1
- package/dist/sortedSet.d.ts.map +1 -1
- package/dist/sortedSet.js +4 -0
- package/dist/sortedSet.js.map +1 -1
- package/dist/test/Insertion.perf.spec.js.map +1 -1
- package/dist/test/Removal.perf.spec.js.map +1 -1
- package/dist/test/Snapshot.perf.spec.js +1 -0
- package/dist/test/Snapshot.perf.spec.js.map +1 -1
- package/dist/test/attributionCollection.perf.spec.js +3 -1
- package/dist/test/attributionCollection.perf.spec.js.map +1 -1
- package/dist/test/attributionCollection.spec.js +69 -68
- package/dist/test/attributionCollection.spec.js.map +1 -1
- package/dist/test/attributionPolicy.spec.js +29 -27
- package/dist/test/attributionPolicy.spec.js.map +1 -1
- package/dist/test/beastTest.spec.d.ts +1 -4
- package/dist/test/beastTest.spec.d.ts.map +1 -1
- package/dist/test/beastTest.spec.js +32 -30
- package/dist/test/beastTest.spec.js.map +1 -1
- package/dist/test/client.annotateMarker.spec.js +5 -5
- 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 +5 -7
- package/dist/test/client.apis.spec.js.map +1 -1
- package/dist/test/client.applyMsg.spec.js +125 -103
- package/dist/test/client.applyMsg.spec.js.map +1 -1
- package/dist/test/client.applyStashedOpFarm.spec.js +18 -10
- package/dist/test/client.applyStashedOpFarm.spec.js.map +1 -1
- package/dist/test/client.attributionFarm.spec.js +13 -8
- package/dist/test/client.attributionFarm.spec.js.map +1 -1
- package/dist/test/client.conflictFarm.spec.js +4 -2
- package/dist/test/client.conflictFarm.spec.js.map +1 -1
- package/dist/test/client.getPosition.spec.js +10 -10
- package/dist/test/client.getPosition.spec.js.map +1 -1
- package/dist/test/client.localReference.spec.js +111 -104
- package/dist/test/client.localReference.spec.js.map +1 -1
- package/dist/test/client.localReferenceFarm.spec.js +14 -10
- package/dist/test/client.localReferenceFarm.spec.js.map +1 -1
- package/dist/test/client.rebasePosition.spec.js +12 -12
- package/dist/test/client.rebasePosition.spec.js.map +1 -1
- package/dist/test/client.reconnectFarm.spec.js +12 -9
- package/dist/test/client.reconnectFarm.spec.js.map +1 -1
- package/dist/test/client.replay.spec.js +11 -10
- package/dist/test/client.replay.spec.js.map +1 -1
- package/dist/test/client.rollback.spec.js +87 -84
- package/dist/test/client.rollback.spec.js.map +1 -1
- package/dist/test/client.rollbackFarm.spec.js +3 -1
- package/dist/test/client.rollbackFarm.spec.js.map +1 -1
- package/dist/test/client.searchForMarker.spec.js +122 -112
- package/dist/test/client.searchForMarker.spec.js.map +1 -1
- package/dist/test/client.walkSegments.spec.js +7 -7
- package/dist/test/client.walkSegments.spec.js.map +1 -1
- package/dist/test/collections.list.spec.js +14 -14
- package/dist/test/collections.list.spec.js.map +1 -1
- package/dist/test/createInsertOnlyAttributionPolicy.spec.js +3 -3
- package/dist/test/createInsertOnlyAttributionPolicy.spec.js.map +1 -1
- package/dist/test/dirname.cjs +1 -0
- package/dist/test/dirname.cjs.map +1 -1
- package/dist/test/dirname.d.cts.map +1 -1
- package/dist/test/mergeTree.annotate.deltaCallback.spec.js +7 -7
- package/dist/test/mergeTree.annotate.deltaCallback.spec.js.map +1 -1
- package/dist/test/mergeTree.annotate.spec.js +87 -87
- package/dist/test/mergeTree.annotate.spec.js.map +1 -1
- package/dist/test/mergeTree.insert.deltaCallback.spec.js +6 -6
- package/dist/test/mergeTree.insert.deltaCallback.spec.js.map +1 -1
- package/dist/test/mergeTree.insertingWalk.spec.js +24 -24
- package/dist/test/mergeTree.insertingWalk.spec.js.map +1 -1
- package/dist/test/mergeTree.markRangeRemoved.deltaCallback.spec.js +6 -6
- package/dist/test/mergeTree.markRangeRemoved.deltaCallback.spec.js.map +1 -1
- package/dist/test/mergeTree.markRangeRemoved.spec.js +23 -23
- package/dist/test/mergeTree.markRangeRemoved.spec.js.map +1 -1
- package/dist/test/mergeTree.walk.spec.js +3 -3
- package/dist/test/mergeTree.walk.spec.js.map +1 -1
- package/dist/test/mergeTree.zamboni.spec.js +10 -10
- package/dist/test/mergeTree.zamboni.spec.js.map +1 -1
- package/dist/test/mergeTreeOperationRunner.d.ts.map +1 -1
- package/dist/test/mergeTreeOperationRunner.js +28 -16
- package/dist/test/mergeTreeOperationRunner.js.map +1 -1
- package/dist/test/mergeTreeOperationRunner.spec.js +9 -5
- package/dist/test/mergeTreeOperationRunner.spec.js.map +1 -1
- package/dist/test/obliterate.concurrent.spec.js +165 -165
- package/dist/test/obliterate.concurrent.spec.js.map +1 -1
- package/dist/test/obliterate.deltaCallback.spec.js +20 -21
- package/dist/test/obliterate.deltaCallback.spec.js.map +1 -1
- package/dist/test/obliterate.partialLength.spec.js +7 -7
- package/dist/test/obliterate.partialLength.spec.js.map +1 -1
- package/dist/test/obliterate.reconnect.spec.js +13 -13
- package/dist/test/obliterate.reconnect.spec.js.map +1 -1
- package/dist/test/obliterate.spec.js +9 -9
- package/dist/test/obliterate.spec.js.map +1 -1
- package/dist/test/ordinal.spec.js +10 -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 +15 -15
- package/dist/test/properties.spec.js.map +1 -1
- package/dist/test/reconnectHelper.d.ts +4 -4
- package/dist/test/reconnectHelper.d.ts.map +1 -1
- package/dist/test/reconnectHelper.js +28 -20
- package/dist/test/reconnectHelper.js.map +1 -1
- package/dist/test/resetPendingSegmentsToOp.spec.js +35 -29
- package/dist/test/resetPendingSegmentsToOp.spec.js.map +1 -1
- package/dist/test/revertibleFarm.spec.js +11 -10
- 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 +96 -57
- package/dist/test/revertibles.spec.js.map +1 -1
- package/dist/test/segmentGroupCollection.spec.js +17 -17
- package/dist/test/segmentGroupCollection.spec.js.map +1 -1
- package/dist/test/snapshot.spec.js +5 -5
- package/dist/test/snapshot.spec.js.map +1 -1
- package/dist/test/snapshot.utils.d.ts.map +1 -1
- package/dist/test/snapshot.utils.js +6 -6
- package/dist/test/snapshot.utils.js.map +1 -1
- package/dist/test/snapshotlegacy.spec.js +18 -13
- package/dist/test/snapshotlegacy.spec.js.map +1 -1
- package/dist/test/sortedSegmentSet.spec.js +22 -18
- package/dist/test/sortedSegmentSet.spec.js.map +1 -1
- package/dist/test/testClient.d.ts +6 -5
- package/dist/test/testClient.d.ts.map +1 -1
- package/dist/test/testClient.js +30 -32
- package/dist/test/testClient.js.map +1 -1
- package/dist/test/testClientLogger.d.ts.map +1 -1
- package/dist/test/testClientLogger.js +39 -38
- package/dist/test/testClientLogger.js.map +1 -1
- package/dist/test/testSerializer.d.ts +5 -5
- package/dist/test/testSerializer.d.ts.map +1 -1
- package/dist/test/testSerializer.js +0 -1
- package/dist/test/testSerializer.js.map +1 -1
- package/dist/test/testServer.d.ts.map +1 -1
- package/dist/test/testServer.js.map +1 -1
- package/dist/test/testUtils.d.ts +1 -1
- package/dist/test/testUtils.d.ts.map +1 -1
- package/dist/test/testUtils.js +15 -17
- package/dist/test/testUtils.js.map +1 -1
- package/dist/test/text.d.ts.map +1 -1
- package/dist/test/text.js +1 -1
- package/dist/test/text.js.map +1 -1
- package/dist/test/tracking.spec.js +50 -46
- 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 +10 -10
- package/dist/test/wordUnitTests.spec.js.map +1 -1
- package/dist/textSegment.d.ts +1 -1
- package/dist/textSegment.d.ts.map +1 -1
- package/dist/textSegment.js +3 -3
- package/dist/textSegment.js.map +1 -1
- package/dist/zamboni.d.ts.map +1 -1
- package/dist/zamboni.js +7 -2
- package/dist/zamboni.js.map +1 -1
- package/internal.d.ts +1 -1
- package/legacy.d.ts +1 -1
- package/lib/MergeTreeTextHelper.d.ts.map +1 -1
- package/lib/MergeTreeTextHelper.js +1 -1
- package/lib/MergeTreeTextHelper.js.map +1 -1
- package/lib/attributionCollection.d.ts.map +1 -1
- package/lib/attributionCollection.js +65 -17
- package/lib/attributionCollection.js.map +1 -1
- package/lib/attributionPolicy.d.ts +2 -1
- package/lib/attributionPolicy.d.ts.map +1 -1
- package/lib/attributionPolicy.js +10 -3
- package/lib/attributionPolicy.js.map +1 -1
- package/lib/client.d.ts +3 -1
- package/lib/client.d.ts.map +1 -1
- package/lib/client.js +65 -37
- package/lib/client.js.map +1 -1
- package/lib/collections/list.d.ts.map +1 -1
- package/lib/collections/list.js +5 -2
- package/lib/collections/list.js.map +1 -1
- package/lib/collections/rbTree.d.ts +2 -2
- package/lib/collections/rbTree.d.ts.map +1 -1
- package/lib/collections/rbTree.js +23 -35
- package/lib/collections/rbTree.js.map +1 -1
- package/lib/endOfTreeSegment.d.ts.map +1 -1
- package/lib/endOfTreeSegment.js +4 -1
- package/lib/endOfTreeSegment.js.map +1 -1
- package/lib/legacy.d.ts +1 -1
- package/lib/localReference.d.ts +16 -6
- package/lib/localReference.d.ts.map +1 -1
- package/lib/localReference.js +31 -20
- package/lib/localReference.js.map +1 -1
- package/lib/mergeTree.d.ts +0 -1
- package/lib/mergeTree.d.ts.map +1 -1
- package/lib/mergeTree.js +127 -112
- package/lib/mergeTree.js.map +1 -1
- package/lib/mergeTreeNodeWalk.d.ts.map +1 -1
- package/lib/mergeTreeNodeWalk.js +1 -1
- package/lib/mergeTreeNodeWalk.js.map +1 -1
- package/lib/mergeTreeNodes.d.ts +6 -5
- package/lib/mergeTreeNodes.d.ts.map +1 -1
- package/lib/mergeTreeNodes.js +29 -20
- package/lib/mergeTreeNodes.js.map +1 -1
- package/lib/mergeTreeTracking.js +3 -3
- package/lib/mergeTreeTracking.js.map +1 -1
- package/lib/opBuilder.d.ts +6 -1
- package/lib/opBuilder.d.ts.map +1 -1
- package/lib/opBuilder.js +5 -0
- package/lib/opBuilder.js.map +1 -1
- package/lib/ops.d.ts.map +1 -1
- package/lib/ops.js.map +1 -1
- package/lib/ordinal.d.ts.map +1 -1
- package/lib/ordinal.js +7 -0
- package/lib/ordinal.js.map +1 -1
- package/lib/partialLengths.d.ts +4 -2
- package/lib/partialLengths.d.ts.map +1 -1
- package/lib/partialLengths.js +101 -53
- package/lib/partialLengths.js.map +1 -1
- package/lib/perspective.d.ts +4 -1
- package/lib/perspective.d.ts.map +1 -1
- package/lib/perspective.js +7 -6
- package/lib/perspective.js.map +1 -1
- package/lib/properties.d.ts +13 -10
- package/lib/properties.d.ts.map +1 -1
- package/lib/properties.js +22 -11
- package/lib/properties.js.map +1 -1
- package/lib/public.d.ts +1 -1
- package/lib/referencePositions.d.ts +7 -0
- package/lib/referencePositions.d.ts.map +1 -1
- package/lib/referencePositions.js +7 -0
- package/lib/referencePositions.js.map +1 -1
- package/lib/revertibles.d.ts +6 -0
- package/lib/revertibles.d.ts.map +1 -1
- package/lib/revertibles.js +50 -21
- package/lib/revertibles.js.map +1 -1
- package/lib/segmentGroupCollection.d.ts.map +1 -1
- package/lib/segmentGroupCollection.js +2 -0
- package/lib/segmentGroupCollection.js.map +1 -1
- package/lib/segmentPropertiesManager.d.ts +7 -3
- package/lib/segmentPropertiesManager.d.ts.map +1 -1
- package/lib/segmentPropertiesManager.js +20 -15
- package/lib/segmentPropertiesManager.js.map +1 -1
- package/lib/snapshotChunks.d.ts.map +1 -1
- package/lib/snapshotChunks.js +10 -5
- package/lib/snapshotChunks.js.map +1 -1
- package/lib/snapshotLoader.d.ts.map +1 -1
- package/lib/snapshotLoader.js +14 -10
- package/lib/snapshotLoader.js.map +1 -1
- package/lib/snapshotV1.d.ts.map +1 -1
- package/lib/snapshotV1.js +20 -8
- package/lib/snapshotV1.js.map +1 -1
- package/lib/snapshotlegacy.d.ts.map +1 -1
- package/lib/snapshotlegacy.js +4 -2
- package/lib/snapshotlegacy.js.map +1 -1
- package/lib/sortedSegmentSet.d.ts.map +1 -1
- package/lib/sortedSegmentSet.js +8 -1
- package/lib/sortedSegmentSet.js.map +1 -1
- package/lib/sortedSet.d.ts.map +1 -1
- package/lib/sortedSet.js +4 -0
- package/lib/sortedSet.js.map +1 -1
- package/lib/test/Insertion.perf.spec.js.map +1 -1
- package/lib/test/Removal.perf.spec.js.map +1 -1
- package/lib/test/Snapshot.perf.spec.js +1 -0
- package/lib/test/Snapshot.perf.spec.js.map +1 -1
- package/lib/test/attributionCollection.perf.spec.js +3 -1
- package/lib/test/attributionCollection.perf.spec.js.map +1 -1
- package/lib/test/attributionCollection.spec.js +3 -2
- package/lib/test/attributionCollection.spec.js.map +1 -1
- package/lib/test/attributionPolicy.spec.js +3 -1
- package/lib/test/attributionPolicy.spec.js.map +1 -1
- package/lib/test/beastTest.spec.d.ts +1 -4
- package/lib/test/beastTest.spec.d.ts.map +1 -1
- package/lib/test/beastTest.spec.js +26 -24
- package/lib/test/beastTest.spec.js.map +1 -1
- package/lib/test/client.annotateMarker.spec.js +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 +4 -6
- package/lib/test/client.apis.spec.js.map +1 -1
- package/lib/test/client.applyMsg.spec.js +72 -50
- package/lib/test/client.applyMsg.spec.js.map +1 -1
- package/lib/test/client.applyStashedOpFarm.spec.js +18 -10
- package/lib/test/client.applyStashedOpFarm.spec.js.map +1 -1
- package/lib/test/client.attributionFarm.spec.js +12 -7
- package/lib/test/client.attributionFarm.spec.js.map +1 -1
- package/lib/test/client.conflictFarm.spec.js +4 -2
- package/lib/test/client.conflictFarm.spec.js.map +1 -1
- package/lib/test/client.getPosition.spec.js +1 -1
- package/lib/test/client.getPosition.spec.js.map +1 -1
- package/lib/test/client.localReference.spec.js +14 -7
- package/lib/test/client.localReference.spec.js.map +1 -1
- package/lib/test/client.localReferenceFarm.spec.js +13 -9
- package/lib/test/client.localReferenceFarm.spec.js.map +1 -1
- package/lib/test/client.rebasePosition.spec.js +1 -1
- package/lib/test/client.rebasePosition.spec.js.map +1 -1
- package/lib/test/client.reconnectFarm.spec.js +11 -8
- package/lib/test/client.reconnectFarm.spec.js.map +1 -1
- package/lib/test/client.replay.spec.js +8 -7
- package/lib/test/client.replay.spec.js.map +1 -1
- package/lib/test/client.rollback.spec.js +14 -11
- package/lib/test/client.rollback.spec.js.map +1 -1
- package/lib/test/client.rollbackFarm.spec.js +3 -1
- package/lib/test/client.rollbackFarm.spec.js.map +1 -1
- package/lib/test/client.searchForMarker.spec.js +29 -19
- package/lib/test/client.searchForMarker.spec.js.map +1 -1
- package/lib/test/client.walkSegments.spec.js +1 -1
- package/lib/test/client.walkSegments.spec.js.map +1 -1
- package/lib/test/collections.list.spec.js +1 -1
- package/lib/test/collections.list.spec.js.map +1 -1
- package/lib/test/createInsertOnlyAttributionPolicy.spec.js +1 -1
- package/lib/test/createInsertOnlyAttributionPolicy.spec.js.map +1 -1
- package/lib/test/dirname.cjs +1 -0
- package/lib/test/dirname.cjs.map +1 -1
- package/lib/test/dirname.d.cts.map +1 -1
- package/lib/test/mergeTree.annotate.deltaCallback.spec.js +1 -1
- 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 +8 -8
- 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 +1 -1
- package/lib/test/mergeTree.markRangeRemoved.spec.js.map +1 -1
- package/lib/test/mergeTree.walk.spec.js +1 -1
- 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.map +1 -1
- package/lib/test/mergeTreeOperationRunner.js +27 -15
- package/lib/test/mergeTreeOperationRunner.js.map +1 -1
- package/lib/test/mergeTreeOperationRunner.spec.js +5 -1
- package/lib/test/mergeTreeOperationRunner.spec.js.map +1 -1
- package/lib/test/obliterate.concurrent.spec.js +4 -4
- package/lib/test/obliterate.concurrent.spec.js.map +1 -1
- package/lib/test/obliterate.deltaCallback.spec.js +2 -3
- package/lib/test/obliterate.deltaCallback.spec.js.map +1 -1
- package/lib/test/obliterate.partialLength.spec.js +1 -1
- package/lib/test/obliterate.partialLength.spec.js.map +1 -1
- package/lib/test/obliterate.reconnect.spec.js +1 -1
- package/lib/test/obliterate.reconnect.spec.js.map +1 -1
- package/lib/test/obliterate.spec.js +1 -1
- package/lib/test/obliterate.spec.js.map +1 -1
- package/lib/test/ordinal.spec.js +7 -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 +1 -1
- package/lib/test/properties.spec.js.map +1 -1
- package/lib/test/reconnectHelper.d.ts +4 -4
- package/lib/test/reconnectHelper.d.ts.map +1 -1
- package/lib/test/reconnectHelper.js +22 -14
- package/lib/test/reconnectHelper.js.map +1 -1
- package/lib/test/resetPendingSegmentsToOp.spec.js +8 -2
- package/lib/test/resetPendingSegmentsToOp.spec.js.map +1 -1
- package/lib/test/revertibleFarm.spec.js +8 -7
- 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 +93 -54
- package/lib/test/revertibles.spec.js.map +1 -1
- package/lib/test/segmentGroupCollection.spec.js +1 -1
- package/lib/test/segmentGroupCollection.spec.js.map +1 -1
- package/lib/test/snapshot.spec.js +1 -1
- package/lib/test/snapshot.spec.js.map +1 -1
- package/lib/test/snapshot.utils.d.ts.map +1 -1
- package/lib/test/snapshot.utils.js +1 -1
- package/lib/test/snapshot.utils.js.map +1 -1
- package/lib/test/snapshotlegacy.spec.js +10 -5
- package/lib/test/snapshotlegacy.spec.js.map +1 -1
- package/lib/test/sortedSegmentSet.spec.js +6 -2
- package/lib/test/sortedSegmentSet.spec.js.map +1 -1
- package/lib/test/testClient.d.ts +6 -5
- package/lib/test/testClient.d.ts.map +1 -1
- package/lib/test/testClient.js +25 -27
- package/lib/test/testClient.js.map +1 -1
- package/lib/test/testClientLogger.d.ts.map +1 -1
- package/lib/test/testClientLogger.js +37 -36
- package/lib/test/testClientLogger.js.map +1 -1
- package/lib/test/testSerializer.d.ts +5 -5
- package/lib/test/testSerializer.d.ts.map +1 -1
- package/lib/test/testSerializer.js +0 -1
- package/lib/test/testSerializer.js.map +1 -1
- package/lib/test/testServer.d.ts.map +1 -1
- package/lib/test/testServer.js.map +1 -1
- package/lib/test/testUtils.d.ts +1 -1
- package/lib/test/testUtils.d.ts.map +1 -1
- package/lib/test/testUtils.js +6 -8
- package/lib/test/testUtils.js.map +1 -1
- package/lib/test/text.d.ts.map +1 -1
- package/lib/test/text.js +1 -1
- package/lib/test/text.js.map +1 -1
- package/lib/test/tracking.spec.js +9 -5
- 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 +9 -9
- package/lib/test/wordUnitTests.spec.js.map +1 -1
- package/lib/textSegment.d.ts +1 -1
- package/lib/textSegment.d.ts.map +1 -1
- package/lib/textSegment.js +3 -3
- package/lib/textSegment.js.map +1 -1
- package/lib/zamboni.d.ts.map +1 -1
- package/lib/zamboni.js +7 -2
- package/lib/zamboni.js.map +1 -1
- package/package.json +29 -27
- package/src/MergeTreeTextHelper.ts +2 -2
- package/src/attributionCollection.ts +71 -28
- package/src/attributionPolicy.ts +14 -9
- package/src/client.ts +120 -71
- package/src/collections/list.ts +9 -6
- package/src/collections/rbTree.ts +62 -71
- package/src/endOfTreeSegment.ts +21 -10
- package/src/localReference.ts +61 -43
- package/src/mergeTree.ts +229 -178
- package/src/mergeTreeNodeWalk.ts +2 -1
- package/src/mergeTreeNodes.ts +59 -46
- package/src/mergeTreeTracking.ts +3 -3
- package/src/opBuilder.ts +6 -1
- package/src/ops.ts +5 -0
- package/src/ordinal.ts +8 -1
- package/src/partialLengths.ts +143 -87
- package/src/perspective.ts +10 -7
- package/src/properties.ts +36 -18
- package/src/referencePositions.ts +7 -0
- package/src/revertibles.ts +71 -41
- package/src/segmentGroupCollection.ts +8 -6
- package/src/segmentPropertiesManager.ts +28 -24
- package/src/snapshotChunks.ts +12 -7
- package/src/snapshotLoader.ts +20 -17
- package/src/snapshotV1.ts +36 -18
- package/src/snapshotlegacy.ts +7 -5
- package/src/sortedSegmentSet.ts +9 -3
- package/src/sortedSet.ts +7 -3
- package/src/textSegment.ts +9 -9
- package/src/zamboni.ts +14 -10
- package/tsconfig.json +0 -1
package/src/snapshotChunks.ts
CHANGED
|
@@ -89,7 +89,7 @@ export function serializeAsMinSupportedVersion(
|
|
|
89
89
|
options: PropertySet | undefined,
|
|
90
90
|
serializer: IFluidSerializer,
|
|
91
91
|
bind: IFluidHandle,
|
|
92
|
-
) {
|
|
92
|
+
): string {
|
|
93
93
|
let targetChuck: MergeTreeChunkLegacy;
|
|
94
94
|
|
|
95
95
|
if (chunk.version !== undefined) {
|
|
@@ -102,7 +102,7 @@ export function serializeAsMinSupportedVersion(
|
|
|
102
102
|
}
|
|
103
103
|
|
|
104
104
|
switch (chunk.version) {
|
|
105
|
-
case undefined:
|
|
105
|
+
case undefined: {
|
|
106
106
|
targetChuck = chunk as MergeTreeChunkLegacy;
|
|
107
107
|
targetChuck.headerMetadata = buildHeaderMetadataForLegacyChunk(
|
|
108
108
|
path,
|
|
@@ -110,8 +110,9 @@ export function serializeAsMinSupportedVersion(
|
|
|
110
110
|
options,
|
|
111
111
|
);
|
|
112
112
|
break;
|
|
113
|
+
}
|
|
113
114
|
|
|
114
|
-
case "1":
|
|
115
|
+
case "1": {
|
|
115
116
|
const chunkV1 = chunk as MergeTreeChunkV1;
|
|
116
117
|
const headerMetadata =
|
|
117
118
|
path === SnapshotLegacy.header ? chunkV1.headerMetadata : undefined;
|
|
@@ -128,9 +129,11 @@ export function serializeAsMinSupportedVersion(
|
|
|
128
129
|
headerMetadata,
|
|
129
130
|
};
|
|
130
131
|
break;
|
|
132
|
+
}
|
|
131
133
|
|
|
132
|
-
default:
|
|
134
|
+
default: {
|
|
133
135
|
throw new Error(`Unsupported chunk path: ${path} version: ${chunk.version}`);
|
|
136
|
+
}
|
|
134
137
|
}
|
|
135
138
|
return serializer.stringify(targetChuck, bind);
|
|
136
139
|
}
|
|
@@ -142,7 +145,7 @@ export function serializeAsMaxSupportedVersion(
|
|
|
142
145
|
options: PropertySet | undefined,
|
|
143
146
|
serializer: IFluidSerializer,
|
|
144
147
|
bind: IFluidHandle,
|
|
145
|
-
) {
|
|
148
|
+
): string {
|
|
146
149
|
const targetChuck = toLatestVersion(path, chunk, logger, options);
|
|
147
150
|
return serializer.stringify(targetChuck, bind);
|
|
148
151
|
}
|
|
@@ -166,11 +169,13 @@ export function toLatestVersion(
|
|
|
166
169
|
attribution: chunkLegacy.attribution,
|
|
167
170
|
};
|
|
168
171
|
}
|
|
169
|
-
case "1":
|
|
172
|
+
case "1": {
|
|
170
173
|
return chunk as MergeTreeChunkV1;
|
|
174
|
+
}
|
|
171
175
|
|
|
172
|
-
default:
|
|
176
|
+
default: {
|
|
173
177
|
throw new Error(`Unsupported chunk path: ${path} version: ${chunk.version}`);
|
|
178
|
+
}
|
|
174
179
|
}
|
|
175
180
|
}
|
|
176
181
|
|
package/src/snapshotLoader.ts
CHANGED
|
@@ -58,8 +58,8 @@ export class SnapshotLoader {
|
|
|
58
58
|
|
|
59
59
|
const catchupOpsP = this.loadBodyAndCatchupOps(headerLoadedP, services);
|
|
60
60
|
|
|
61
|
-
catchupOpsP.catch((
|
|
62
|
-
this.logger.sendErrorEvent({ eventName: "CatchupOpsLoadFailure" },
|
|
61
|
+
catchupOpsP.catch((error) =>
|
|
62
|
+
this.logger.sendErrorEvent({ eventName: "CatchupOpsLoadFailure" }, error),
|
|
63
63
|
);
|
|
64
64
|
|
|
65
65
|
await headerLoadedP;
|
|
@@ -80,22 +80,24 @@ export class SnapshotLoader {
|
|
|
80
80
|
|
|
81
81
|
const blobs = await blobsP;
|
|
82
82
|
if (blobs.length === headerChunk.headerMetadata!.orderedChunkMetadata.length + 1) {
|
|
83
|
-
headerChunk.headerMetadata!.orderedChunkMetadata
|
|
84
|
-
blobs.splice(blobs.indexOf(md.id), 1)
|
|
85
|
-
);
|
|
83
|
+
for (const md of headerChunk.headerMetadata!.orderedChunkMetadata)
|
|
84
|
+
blobs.splice(blobs.indexOf(md.id), 1);
|
|
86
85
|
assert(blobs.length === 1, 0x060 /* There should be only one blob with catch up ops */);
|
|
87
86
|
|
|
88
87
|
// TODO: The 'Snapshot.catchupOps' tree entry is purely for backwards compatibility.
|
|
89
88
|
// (See https://github.com/microsoft/FluidFramework/issues/84)
|
|
90
89
|
|
|
91
|
-
|
|
90
|
+
// TODO Non null asserting, why is this not null?
|
|
91
|
+
return this.loadCatchupOps(services.readBlob(blobs[0]!), this.serializer);
|
|
92
92
|
} else if (blobs.length !== headerChunk.headerMetadata!.orderedChunkMetadata.length) {
|
|
93
93
|
throw new Error("Unexpected blobs in snapshot");
|
|
94
94
|
}
|
|
95
95
|
return [];
|
|
96
96
|
}
|
|
97
97
|
|
|
98
|
-
private readonly specToSegment = (
|
|
98
|
+
private readonly specToSegment = (
|
|
99
|
+
spec: IJSONSegment | IJSONSegmentWithMergeInfo,
|
|
100
|
+
): ISegment => {
|
|
99
101
|
let seg: ISegment;
|
|
100
102
|
|
|
101
103
|
if (hasMergeInfo(spec)) {
|
|
@@ -104,9 +106,9 @@ export class SnapshotLoader {
|
|
|
104
106
|
// `specToSegment()` initializes `seg` with the LocalClientId. Overwrite this with
|
|
105
107
|
// the `spec` client (if specified). Otherwise overwrite with `NonCollabClient`.
|
|
106
108
|
seg.clientId =
|
|
107
|
-
spec.client
|
|
108
|
-
?
|
|
109
|
-
:
|
|
109
|
+
spec.client === undefined
|
|
110
|
+
? NonCollabClient
|
|
111
|
+
: this.client.getOrAddShortClientId(spec.client);
|
|
110
112
|
|
|
111
113
|
seg.seq = spec.seq ?? UniversalSequenceNumber;
|
|
112
114
|
|
|
@@ -159,7 +161,7 @@ export class SnapshotLoader {
|
|
|
159
161
|
this.mergeTree.options,
|
|
160
162
|
this.serializer,
|
|
161
163
|
);
|
|
162
|
-
const segs = chunk.segments.map(this.specToSegment);
|
|
164
|
+
const segs = chunk.segments.map((element) => this.specToSegment(element));
|
|
163
165
|
this.extractAttribution(segs, chunk);
|
|
164
166
|
|
|
165
167
|
this.mergeTree.reloadFromSegments(segs);
|
|
@@ -205,7 +207,7 @@ export class SnapshotLoader {
|
|
|
205
207
|
return;
|
|
206
208
|
}
|
|
207
209
|
|
|
208
|
-
let chunksWithAttribution = chunk1.attribution
|
|
210
|
+
let chunksWithAttribution = chunk1.attribution === undefined ? 0 : 1;
|
|
209
211
|
const segs: ISegment[] = [];
|
|
210
212
|
let lengthSofar = chunk1.length;
|
|
211
213
|
for (
|
|
@@ -215,16 +217,17 @@ export class SnapshotLoader {
|
|
|
215
217
|
) {
|
|
216
218
|
const chunk = await SnapshotV1.loadChunk(
|
|
217
219
|
services,
|
|
218
|
-
|
|
220
|
+
// TODO Non null asserting, why is this not null?
|
|
221
|
+
headerMetadata.orderedChunkMetadata[chunkIndex]!.id,
|
|
219
222
|
this.logger,
|
|
220
223
|
this.mergeTree.options,
|
|
221
224
|
this.serializer,
|
|
222
225
|
);
|
|
223
226
|
lengthSofar += chunk.length;
|
|
224
227
|
// Deserialize each chunk segment and append it to the end of the MergeTree.
|
|
225
|
-
const newSegs = chunk.segments.map(this.specToSegment);
|
|
228
|
+
const newSegs = chunk.segments.map((element) => this.specToSegment(element));
|
|
226
229
|
this.extractAttribution(newSegs, chunk);
|
|
227
|
-
chunksWithAttribution += chunk.attribution
|
|
230
|
+
chunksWithAttribution += chunk.attribution === undefined ? 0 : 1;
|
|
228
231
|
segs.push(...newSegs);
|
|
229
232
|
}
|
|
230
233
|
|
|
@@ -243,7 +246,7 @@ export class SnapshotLoader {
|
|
|
243
246
|
|
|
244
247
|
// Helper to insert segments at the end of the MergeTree.
|
|
245
248
|
const mergeTree = this.mergeTree;
|
|
246
|
-
const append = (segments: ISegment[], cli: number, seq: number) => {
|
|
249
|
+
const append = (segments: ISegment[], cli: number, seq: number): void => {
|
|
247
250
|
mergeTree.insertSegments(
|
|
248
251
|
mergeTree.root.cachedLength ?? 0,
|
|
249
252
|
segments,
|
|
@@ -256,7 +259,7 @@ export class SnapshotLoader {
|
|
|
256
259
|
|
|
257
260
|
// Helpers to batch-insert segments that are below the min seq
|
|
258
261
|
const batch: ISegment[] = [];
|
|
259
|
-
const flushBatch = () => {
|
|
262
|
+
const flushBatch = (): void => {
|
|
260
263
|
if (batch.length > 0) {
|
|
261
264
|
append(batch, NonCollabClient, UniversalSequenceNumber);
|
|
262
265
|
}
|
package/src/snapshotV1.ts
CHANGED
|
@@ -23,6 +23,7 @@ import { UnassignedSequenceNumber } from "./constants.js";
|
|
|
23
23
|
import { MergeTree } from "./mergeTree.js";
|
|
24
24
|
import { walkAllChildSegments } from "./mergeTreeNodeWalk.js";
|
|
25
25
|
import { ISegment } from "./mergeTreeNodes.js";
|
|
26
|
+
import type { IJSONSegment } from "./ops.js";
|
|
26
27
|
import { PropertySet, matchProperties } from "./properties.js";
|
|
27
28
|
import {
|
|
28
29
|
IJSONSegmentWithMergeInfo,
|
|
@@ -31,6 +32,7 @@ import {
|
|
|
31
32
|
MergeTreeHeaderMetadata,
|
|
32
33
|
serializeAsMaxSupportedVersion,
|
|
33
34
|
toLatestVersion,
|
|
35
|
+
type VersionedMergeTreeChunk,
|
|
34
36
|
} from "./snapshotChunks.js";
|
|
35
37
|
import { SnapshotLegacy } from "./snapshotlegacy.js";
|
|
36
38
|
|
|
@@ -90,14 +92,22 @@ export class SnapshotV1 {
|
|
|
90
92
|
let segmentCount = 0;
|
|
91
93
|
let hasAttribution = false;
|
|
92
94
|
while (length < approxSequenceLength && startIndex + segmentCount < allSegments.length) {
|
|
93
|
-
|
|
95
|
+
// TODO Non null asserting, why is this not null?
|
|
96
|
+
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
97
|
+
const pseg = allSegments[startIndex + segmentCount]!;
|
|
94
98
|
segments.push(pseg);
|
|
95
|
-
|
|
99
|
+
// TODO Non null asserting, why is this not null?
|
|
100
|
+
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
101
|
+
length += allLengths[startIndex + segmentCount]!;
|
|
96
102
|
if (attributionCollections[startIndex + segmentCount]) {
|
|
97
103
|
hasAttribution = true;
|
|
98
104
|
collections.push({
|
|
99
|
-
|
|
100
|
-
|
|
105
|
+
// TODO Non null asserting, why is this not null?
|
|
106
|
+
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
107
|
+
attribution: attributionCollections[startIndex + segmentCount]!,
|
|
108
|
+
// TODO Non null asserting, why is this not null?
|
|
109
|
+
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
110
|
+
cachedLength: allLengths[startIndex + segmentCount]!,
|
|
101
111
|
});
|
|
102
112
|
}
|
|
103
113
|
segmentCount++;
|
|
@@ -149,7 +159,7 @@ export class SnapshotV1 {
|
|
|
149
159
|
headerChunk.headerMetadata = this.header;
|
|
150
160
|
headerChunk.headerMetadata.orderedChunkMetadata = [{ id: SnapshotLegacy.header }];
|
|
151
161
|
const blobs: [key: string, content: string][] = [];
|
|
152
|
-
chunks.
|
|
162
|
+
for (const [index, chunk] of chunks.entries()) {
|
|
153
163
|
const id = `${SnapshotLegacy.body}_${index}`;
|
|
154
164
|
this.header.orderedChunkMetadata.push({ id });
|
|
155
165
|
blobs.push([
|
|
@@ -163,7 +173,7 @@ export class SnapshotV1 {
|
|
|
163
173
|
bind,
|
|
164
174
|
),
|
|
165
175
|
]);
|
|
166
|
-
}
|
|
176
|
+
}
|
|
167
177
|
|
|
168
178
|
const builder = new SummaryTreeBuilder();
|
|
169
179
|
builder.addBlob(
|
|
@@ -177,14 +187,14 @@ export class SnapshotV1 {
|
|
|
177
187
|
bind,
|
|
178
188
|
),
|
|
179
189
|
);
|
|
180
|
-
|
|
190
|
+
for (const value of blobs) {
|
|
181
191
|
builder.addBlob(value[0], value[1]);
|
|
182
|
-
}
|
|
192
|
+
}
|
|
183
193
|
|
|
184
194
|
return builder.getSummaryTree();
|
|
185
195
|
}
|
|
186
196
|
|
|
187
|
-
extractSync() {
|
|
197
|
+
extractSync(): JsonSegmentSpecs[] {
|
|
188
198
|
const mergeTree = this.mergeTree;
|
|
189
199
|
const minSeq = this.header.minSequenceNumber;
|
|
190
200
|
|
|
@@ -196,7 +206,7 @@ export class SnapshotV1 {
|
|
|
196
206
|
json: JsonSegmentSpecs,
|
|
197
207
|
length: number,
|
|
198
208
|
attribution: IAttributionCollection<AttributionKey> | undefined,
|
|
199
|
-
) => {
|
|
209
|
+
): void => {
|
|
200
210
|
segmentsAfterCombine += 1;
|
|
201
211
|
this.segments.push(json);
|
|
202
212
|
this.segmentLengths.push(length);
|
|
@@ -206,18 +216,22 @@ export class SnapshotV1 {
|
|
|
206
216
|
};
|
|
207
217
|
|
|
208
218
|
// Helper to serialize the given `segment` and add it to the snapshot (if a segment is provided).
|
|
209
|
-
const pushSeg = (segment?: ISegment) => {
|
|
219
|
+
const pushSeg = (segment?: ISegment): void => {
|
|
210
220
|
if (segment) {
|
|
211
221
|
if (segment.properties !== undefined && Object.keys(segment.properties).length === 0) {
|
|
212
222
|
segment.properties = undefined;
|
|
213
223
|
segment.propertyManager = undefined;
|
|
214
224
|
}
|
|
215
|
-
pushSegRaw(
|
|
225
|
+
pushSegRaw(
|
|
226
|
+
segment.toJSONObject() as JsonSegmentSpecs,
|
|
227
|
+
segment.cachedLength,
|
|
228
|
+
segment.attribution,
|
|
229
|
+
);
|
|
216
230
|
}
|
|
217
231
|
};
|
|
218
232
|
|
|
219
233
|
let prev: ISegment | undefined;
|
|
220
|
-
const extractSegment = (segment: ISegment) => {
|
|
234
|
+
const extractSegment = (segment: ISegment): boolean => {
|
|
221
235
|
// Elide segments that do not need to be included in the snapshot. A segment may be elided if
|
|
222
236
|
// either condition is true:
|
|
223
237
|
// a) The segment has not yet been ACKed. We do not need to snapshot unACKed segments because
|
|
@@ -279,7 +293,7 @@ export class SnapshotV1 {
|
|
|
279
293
|
segment.propertyManager = undefined;
|
|
280
294
|
}
|
|
281
295
|
const raw: IJSONSegmentWithMergeInfo & { removedClient?: string } = {
|
|
282
|
-
json: segment.toJSONObject(),
|
|
296
|
+
json: segment.toJSONObject() as IJSONSegment,
|
|
283
297
|
};
|
|
284
298
|
// If the segment insertion is above the MSN, record the insertion merge info.
|
|
285
299
|
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
@@ -298,9 +312,11 @@ export class SnapshotV1 {
|
|
|
298
312
|
|
|
299
313
|
// back compat for when we split overlap and removed client
|
|
300
314
|
raw.removedClient =
|
|
301
|
-
segment.removedClientIds
|
|
302
|
-
?
|
|
303
|
-
:
|
|
315
|
+
segment.removedClientIds === undefined
|
|
316
|
+
? undefined
|
|
317
|
+
: // TODO Non null asserting, why is this not null?
|
|
318
|
+
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
319
|
+
this.getLongClientId(segment.removedClientIds[0]!);
|
|
304
320
|
|
|
305
321
|
raw.removedClientIds = segment.removedClientIds?.map((id) =>
|
|
306
322
|
this.getLongClientId(id),
|
|
@@ -373,7 +389,9 @@ export class SnapshotV1 {
|
|
|
373
389
|
options: PropertySet | undefined,
|
|
374
390
|
serializer?: IFluidSerializer,
|
|
375
391
|
): MergeTreeChunkV1 {
|
|
376
|
-
const chunkObj = serializer
|
|
392
|
+
const chunkObj: VersionedMergeTreeChunk = serializer
|
|
393
|
+
? (serializer.parse(chunk) as VersionedMergeTreeChunk)
|
|
394
|
+
: (JSON.parse(chunk) as VersionedMergeTreeChunk);
|
|
377
395
|
return toLatestVersion(path, chunkObj, logger, options);
|
|
378
396
|
}
|
|
379
397
|
}
|
package/src/snapshotlegacy.ts
CHANGED
|
@@ -83,7 +83,8 @@ export class SnapshotLegacy {
|
|
|
83
83
|
sequenceLength < approxSequenceLength &&
|
|
84
84
|
startIndex + segCount < allSegments.length
|
|
85
85
|
) {
|
|
86
|
-
|
|
86
|
+
// TODO Non null asserting, why is this not null?
|
|
87
|
+
const pseg = allSegments[startIndex + segCount]!;
|
|
87
88
|
segs.push(pseg);
|
|
88
89
|
if (pseg.attribution) {
|
|
89
90
|
segsWithAttribution++;
|
|
@@ -178,9 +179,10 @@ export class SnapshotLegacy {
|
|
|
178
179
|
// Messages used to have a "term" property which has since been removed.
|
|
179
180
|
// It is benign so it doesn't really need to be deleted here, but doing so permits snapshot tests
|
|
180
181
|
// to pass with an exact match (and matching the updated definition of ISequencedDocumentMessage).
|
|
181
|
-
|
|
182
|
+
for (const message of catchUpMsgs) {
|
|
183
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-member-access
|
|
182
184
|
delete (message as any).term;
|
|
183
|
-
}
|
|
185
|
+
}
|
|
184
186
|
builder.addBlob(
|
|
185
187
|
this.mergeTree.options?.catchUpBlobName ?? SnapshotLegacy.catchupOps,
|
|
186
188
|
serializer ? serializer.stringify(catchUpMsgs, bind) : JSON.stringify(catchUpMsgs),
|
|
@@ -190,7 +192,7 @@ export class SnapshotLegacy {
|
|
|
190
192
|
return builder.getSummaryTree();
|
|
191
193
|
}
|
|
192
194
|
|
|
193
|
-
extractSync() {
|
|
195
|
+
extractSync(): ISegment[] {
|
|
194
196
|
const collabWindow = this.mergeTree.collabWindow;
|
|
195
197
|
this.seq = collabWindow.minSeq;
|
|
196
198
|
this.header = {
|
|
@@ -212,7 +214,7 @@ export class SnapshotLegacy {
|
|
|
212
214
|
clientId: number,
|
|
213
215
|
start: number | undefined,
|
|
214
216
|
end: number | undefined,
|
|
215
|
-
) => {
|
|
217
|
+
): boolean => {
|
|
216
218
|
if (
|
|
217
219
|
segment.seq !== UnassignedSequenceNumber &&
|
|
218
220
|
segment.seq! <= this.seq! &&
|
package/src/sortedSegmentSet.ts
CHANGED
|
@@ -65,7 +65,9 @@ export class SortedSegmentSet<T extends SortedSegmentSetItem = ISegment> extends
|
|
|
65
65
|
|
|
66
66
|
while (start <= end) {
|
|
67
67
|
index = start + Math.floor((end - start) / 2);
|
|
68
|
-
|
|
68
|
+
// TODO Non null asserting, why is this not null?
|
|
69
|
+
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
70
|
+
const indexKey = this.getKey(this.keySortedItems[index]!);
|
|
69
71
|
if (indexKey > itemKey) {
|
|
70
72
|
if (start === index) {
|
|
71
73
|
return { exists: false, index };
|
|
@@ -85,7 +87,9 @@ export class SortedSegmentSet<T extends SortedSegmentSetItem = ISegment> extends
|
|
|
85
87
|
}
|
|
86
88
|
for (
|
|
87
89
|
let b = index - 1;
|
|
88
|
-
|
|
90
|
+
// TODO Non null asserting, why is this not null?
|
|
91
|
+
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
92
|
+
b >= 0 && this.getKey(this.keySortedItems[b]!) === itemKey;
|
|
89
93
|
b--
|
|
90
94
|
) {
|
|
91
95
|
if (this.keySortedItems[b] === item) {
|
|
@@ -95,7 +99,9 @@ export class SortedSegmentSet<T extends SortedSegmentSetItem = ISegment> extends
|
|
|
95
99
|
for (
|
|
96
100
|
index + 1;
|
|
97
101
|
index < this.keySortedItems.length &&
|
|
98
|
-
this
|
|
102
|
+
// TODO Non null asserting, why is this not null?
|
|
103
|
+
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
104
|
+
this.getKey(this.keySortedItems[index]!) === itemKey;
|
|
99
105
|
index++
|
|
100
106
|
) {
|
|
101
107
|
if (this.keySortedItems[index] === item) {
|
package/src/sortedSet.ts
CHANGED
|
@@ -20,10 +20,12 @@ export abstract class SortedSet<T, U extends string | number> {
|
|
|
20
20
|
return this.keySortedItems;
|
|
21
21
|
}
|
|
22
22
|
|
|
23
|
-
public addOrUpdate(newItem: T, update?: (existingItem: T, newItem: T) => void) {
|
|
23
|
+
public addOrUpdate(newItem: T, update?: (existingItem: T, newItem: T) => void): void {
|
|
24
24
|
const position = this.findItemPosition(newItem);
|
|
25
25
|
if (position.exists) {
|
|
26
|
-
|
|
26
|
+
// Non null asserting here because we know the item exists
|
|
27
|
+
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
28
|
+
update?.(this.keySortedItems[position.index]!, newItem);
|
|
27
29
|
} else {
|
|
28
30
|
this.keySortedItems.splice(position.index, 0, newItem);
|
|
29
31
|
}
|
|
@@ -54,7 +56,9 @@ export abstract class SortedSet<T, U extends string | number> {
|
|
|
54
56
|
|
|
55
57
|
while (start <= end) {
|
|
56
58
|
index = start + Math.floor((end - start) / 2);
|
|
57
|
-
|
|
59
|
+
// TODO Non null asserting, why is this not null?
|
|
60
|
+
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
61
|
+
const indexKey = this.getKey(this.keySortedItems[index]!);
|
|
58
62
|
if (indexKey > itemKey) {
|
|
59
63
|
if (start === index) {
|
|
60
64
|
return { exists: false, index };
|
package/src/textSegment.ts
CHANGED
|
@@ -40,7 +40,7 @@ export class TextSegment extends BaseSegment {
|
|
|
40
40
|
return segment.type === TextSegment.type;
|
|
41
41
|
}
|
|
42
42
|
|
|
43
|
-
public static make(text: string, props?: PropertySet) {
|
|
43
|
+
public static make(text: string, props?: PropertySet): TextSegment {
|
|
44
44
|
const seg = new TextSegment(text);
|
|
45
45
|
if (props) {
|
|
46
46
|
seg.addProperties(props);
|
|
@@ -48,7 +48,7 @@ export class TextSegment extends BaseSegment {
|
|
|
48
48
|
return seg;
|
|
49
49
|
}
|
|
50
50
|
|
|
51
|
-
public static fromJSONObject(spec:
|
|
51
|
+
public static fromJSONObject(spec: string | IJSONSegment): TextSegment | undefined {
|
|
52
52
|
if (typeof spec === "string") {
|
|
53
53
|
return new TextSegment(spec);
|
|
54
54
|
} else if (spec && typeof spec === "object" && "text" in spec) {
|
|
@@ -69,8 +69,8 @@ export class TextSegment extends BaseSegment {
|
|
|
69
69
|
return this.properties ? { text: this.text, props: { ...this.properties } } : this.text;
|
|
70
70
|
}
|
|
71
71
|
|
|
72
|
-
public clone(start = 0, end?: number) {
|
|
73
|
-
const text = this.text.
|
|
72
|
+
public clone(start = 0, end?: number): TextSegment {
|
|
73
|
+
const text = this.text.slice(start, end);
|
|
74
74
|
const b = TextSegment.make(text, this.properties);
|
|
75
75
|
this.cloneInto(b);
|
|
76
76
|
return b;
|
|
@@ -85,20 +85,20 @@ export class TextSegment extends BaseSegment {
|
|
|
85
85
|
);
|
|
86
86
|
}
|
|
87
87
|
|
|
88
|
-
public toString() {
|
|
88
|
+
public toString(): string {
|
|
89
89
|
return this.text;
|
|
90
90
|
}
|
|
91
91
|
|
|
92
|
-
public append(segment: ISegment) {
|
|
92
|
+
public append(segment: ISegment): void {
|
|
93
93
|
assert(TextSegment.is(segment), 0x447 /* can only append text segment */);
|
|
94
94
|
super.append(segment);
|
|
95
95
|
this.text += segment.text;
|
|
96
96
|
}
|
|
97
97
|
|
|
98
|
-
protected createSplitSegmentAt(pos: number) {
|
|
98
|
+
protected createSplitSegmentAt(pos: number): TextSegment | undefined {
|
|
99
99
|
if (pos > 0) {
|
|
100
|
-
const remainingText = this.text.
|
|
101
|
-
this.text = this.text.
|
|
100
|
+
const remainingText = this.text.slice(Math.max(0, pos));
|
|
101
|
+
this.text = this.text.slice(0, Math.max(0, pos));
|
|
102
102
|
this.cachedLength = this.text.length;
|
|
103
103
|
const leafSegment = new TextSegment(remainingText);
|
|
104
104
|
return leafSegment;
|
package/src/zamboni.ts
CHANGED
|
@@ -21,14 +21,14 @@ import {
|
|
|
21
21
|
import { matchProperties } from "./properties.js";
|
|
22
22
|
|
|
23
23
|
export const zamboniSegmentsMax = 2;
|
|
24
|
-
function underflow(node: MergeBlock) {
|
|
24
|
+
function underflow(node: MergeBlock): boolean {
|
|
25
25
|
return node.childCount < MaxNodesInBlock / 2;
|
|
26
26
|
}
|
|
27
27
|
|
|
28
28
|
export function zamboniSegments(
|
|
29
29
|
mergeTree: MergeTree,
|
|
30
30
|
zamboniSegmentsMaxCount = zamboniSegmentsMax,
|
|
31
|
-
) {
|
|
31
|
+
): void {
|
|
32
32
|
if (!mergeTree.collabWindow.collaborating) {
|
|
33
33
|
return;
|
|
34
34
|
}
|
|
@@ -57,7 +57,8 @@ export function zamboniSegments(
|
|
|
57
57
|
block.childCount = newChildCount;
|
|
58
58
|
block.children = childrenCopy;
|
|
59
59
|
for (let j = 0; j < newChildCount; j++) {
|
|
60
|
-
|
|
60
|
+
// Non null asserting here since its looping though childrenCopy.length so j at childrenCopy will always exist
|
|
61
|
+
block.assignChild(childrenCopy[j]!, j, false);
|
|
61
62
|
}
|
|
62
63
|
|
|
63
64
|
if (underflow(block) && block.parent) {
|
|
@@ -72,7 +73,7 @@ export function zamboniSegments(
|
|
|
72
73
|
}
|
|
73
74
|
|
|
74
75
|
// Interior node with all node children
|
|
75
|
-
export function packParent(parent: MergeBlock, mergeTree: MergeTree) {
|
|
76
|
+
export function packParent(parent: MergeBlock, mergeTree: MergeTree): void {
|
|
76
77
|
const children = parent.children;
|
|
77
78
|
let childIndex: number;
|
|
78
79
|
let childBlock: MergeBlock;
|
|
@@ -96,7 +97,7 @@ export function packParent(parent: MergeBlock, mergeTree: MergeTree) {
|
|
|
96
97
|
}
|
|
97
98
|
const baseNodesInBlockCount = Math.floor(totalNodeCount / childCount);
|
|
98
99
|
let remainderCount = totalNodeCount % childCount;
|
|
99
|
-
const packedBlocks =
|
|
100
|
+
const packedBlocks: IMergeNode[] = Array.from({ length: MaxNodesInBlock });
|
|
100
101
|
let childrenPackedCount = 0;
|
|
101
102
|
for (let nodeIndex = 0; nodeIndex < childCount; nodeIndex++) {
|
|
102
103
|
let nodeCount = baseNodesInBlockCount;
|
|
@@ -106,7 +107,8 @@ export function packParent(parent: MergeBlock, mergeTree: MergeTree) {
|
|
|
106
107
|
}
|
|
107
108
|
const packedBlock = mergeTree.makeBlock(nodeCount);
|
|
108
109
|
for (let packedNodeIndex = 0; packedNodeIndex < nodeCount; packedNodeIndex++) {
|
|
109
|
-
|
|
110
|
+
// TODO Non null asserting, why is this not null?
|
|
111
|
+
const nodeToPack = holdNodes[childrenPackedCount++]!;
|
|
110
112
|
packedBlock.assignChild(nodeToPack, packedNodeIndex, false);
|
|
111
113
|
}
|
|
112
114
|
packedBlock.parent = parent;
|
|
@@ -115,7 +117,8 @@ export function packParent(parent: MergeBlock, mergeTree: MergeTree) {
|
|
|
115
117
|
}
|
|
116
118
|
parent.children = packedBlocks;
|
|
117
119
|
for (let j = 0; j < childCount; j++) {
|
|
118
|
-
|
|
120
|
+
// TODO Non null asserting, why is this not null?
|
|
121
|
+
parent.assignChild(packedBlocks[j]!, j, false);
|
|
119
122
|
}
|
|
120
123
|
parent.childCount = childCount;
|
|
121
124
|
} else {
|
|
@@ -130,12 +133,13 @@ export function packParent(parent: MergeBlock, mergeTree: MergeTree) {
|
|
|
130
133
|
}
|
|
131
134
|
}
|
|
132
135
|
|
|
133
|
-
function scourNode(node: MergeBlock, holdNodes: IMergeNode[], mergeTree: MergeTree) {
|
|
136
|
+
function scourNode(node: MergeBlock, holdNodes: IMergeNode[], mergeTree: MergeTree): void {
|
|
134
137
|
// The previous segment is tracked while scouring for the purposes of merging adjacent segments
|
|
135
138
|
// when possible.
|
|
136
139
|
let prevSegment: ISegment | undefined;
|
|
137
140
|
for (let k = 0; k < node.childCount; k++) {
|
|
138
|
-
|
|
141
|
+
// TODO Non null asserting, why is this not null?
|
|
142
|
+
const childNode = node.children[k]!;
|
|
139
143
|
if (!childNode.isLeaf() || !childNode.segmentGroups.empty) {
|
|
140
144
|
holdNodes.push(childNode);
|
|
141
145
|
prevSegment = undefined;
|
|
@@ -191,7 +195,7 @@ function scourNode(node: MergeBlock, holdNodes: IMergeNode[], mergeTree: MergeTr
|
|
|
191
195
|
);
|
|
192
196
|
|
|
193
197
|
segment.parent = undefined;
|
|
194
|
-
segment.trackingCollection.trackingGroups
|
|
198
|
+
for (const tg of segment.trackingCollection.trackingGroups) tg.unlink(segment);
|
|
195
199
|
} else {
|
|
196
200
|
holdNodes.push(segment);
|
|
197
201
|
prevSegment = segmentHasPositiveLength ? segment : undefined;
|