@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/lib/mergeTree.js
CHANGED
|
@@ -19,7 +19,6 @@ import { createAnnotateRangeOp, createInsertSegmentOp, createRemoveRangeOp, } fr
|
|
|
19
19
|
import { MergeTreeDeltaType, ReferenceType, } from "./ops.js";
|
|
20
20
|
import { PartialSequenceLengths } from "./partialLengths.js";
|
|
21
21
|
import { PerspectiveImpl, isSegmentPresent } from "./perspective.js";
|
|
22
|
-
// eslint-disable-next-line import/no-deprecated
|
|
23
22
|
import { createMap, extend, extendIfUndefined } from "./properties.js";
|
|
24
23
|
import { DetachedReferencePosition, refGetTileLabels, refHasTileLabel, refTypeIncludesFlag, } from "./referencePositions.js";
|
|
25
24
|
import { PropertiesRollback } from "./segmentPropertiesManager.js";
|
|
@@ -30,7 +29,7 @@ function wasRemovedAfter(seg, seq) {
|
|
|
30
29
|
}
|
|
31
30
|
function markSegmentMoved(seg, moveInfo) {
|
|
32
31
|
seg.moveDst = moveInfo.moveDst;
|
|
33
|
-
seg.movedClientIds = moveInfo.movedClientIds
|
|
32
|
+
seg.movedClientIds = [...moveInfo.movedClientIds];
|
|
34
33
|
seg.movedSeqs = [moveInfo.movedSeq];
|
|
35
34
|
seg.movedSeq = moveInfo.movedSeq;
|
|
36
35
|
seg.localMovedSeq = moveInfo.localMovedSeq;
|
|
@@ -76,17 +75,18 @@ export function findRootMergeBlock(segmentOrNode) {
|
|
|
76
75
|
while (maybeRoot?.parent !== undefined) {
|
|
77
76
|
maybeRoot = maybeRoot.parent;
|
|
78
77
|
}
|
|
79
|
-
return maybeRoot?.mergeTree
|
|
78
|
+
return maybeRoot?.mergeTree === undefined ? undefined : maybeRoot;
|
|
80
79
|
}
|
|
81
80
|
/**
|
|
81
|
+
* Find the segment to which a reference will slide if it needs to slide, or undefined if there
|
|
82
|
+
* is no valid segment (i.e. the tree is empty).
|
|
83
|
+
*
|
|
82
84
|
* @param segment - The segment to slide from.
|
|
83
85
|
* @param cache - Optional cache mapping segments to their sliding destinations.
|
|
84
86
|
* Excursions will be avoided for segments in the cache, and the cache will be populated with
|
|
85
87
|
* entries for all segments visited during excursion.
|
|
86
88
|
* This can reduce the number of times the tree needs to be scanned if a range containing many
|
|
87
89
|
* SlideOnRemove references is removed.
|
|
88
|
-
* @returns The segment a SlideOnRemove reference should slide to, or undefined if there is no
|
|
89
|
-
* valid segment (i.e. the tree is empty).
|
|
90
90
|
* @internal
|
|
91
91
|
*/
|
|
92
92
|
function getSlideToSegment(segment, slidingPreference = SlidingPreference.FORWARD, cache, useNewSlidingBehavior = false) {
|
|
@@ -167,6 +167,8 @@ export function getSlideToSegoff(segoff, slidingPreference = SlidingPreference.F
|
|
|
167
167
|
offset,
|
|
168
168
|
};
|
|
169
169
|
}
|
|
170
|
+
const forwardPred = (ref) => ref.slidingPreference !== SlidingPreference.BACKWARD;
|
|
171
|
+
const backwardPred = (ref) => ref.slidingPreference === SlidingPreference.BACKWARD;
|
|
170
172
|
/**
|
|
171
173
|
* @internal
|
|
172
174
|
*/
|
|
@@ -274,7 +276,18 @@ export class MergeTree {
|
|
|
274
276
|
assert(refSeq !== undefined, 0x398 /* localSeq provided for local length without refSeq */);
|
|
275
277
|
assert(segment.seq !== undefined, 0x399 /* segment with no seq in mergeTree */);
|
|
276
278
|
const { seq, removedSeq, localRemovedSeq, movedSeq, localMovedSeq } = segment;
|
|
277
|
-
if (seq
|
|
279
|
+
if (seq === UnassignedSequenceNumber) {
|
|
280
|
+
assert(segment.localSeq !== undefined, 0x39a /* unacked segment with undefined localSeq */);
|
|
281
|
+
// inserted locally, still un-acked
|
|
282
|
+
if (segment.localSeq > localSeq ||
|
|
283
|
+
(localRemovedSeq !== undefined && localRemovedSeq <= localSeq) ||
|
|
284
|
+
(localMovedSeq !== undefined && localMovedSeq <= localSeq)) {
|
|
285
|
+
return 0;
|
|
286
|
+
}
|
|
287
|
+
const { cachedLength } = segment;
|
|
288
|
+
return cachedLength;
|
|
289
|
+
}
|
|
290
|
+
else {
|
|
278
291
|
// inserted remotely
|
|
279
292
|
if (seq > refSeq ||
|
|
280
293
|
(removedSeq !== undefined &&
|
|
@@ -289,16 +302,6 @@ export class MergeTree {
|
|
|
289
302
|
}
|
|
290
303
|
return segment.cachedLength;
|
|
291
304
|
}
|
|
292
|
-
else {
|
|
293
|
-
assert(segment.localSeq !== undefined, 0x39a /* unacked segment with undefined localSeq */);
|
|
294
|
-
// inserted locally, still un-acked
|
|
295
|
-
if (segment.localSeq > localSeq ||
|
|
296
|
-
(localRemovedSeq !== undefined && localRemovedSeq <= localSeq) ||
|
|
297
|
-
(localMovedSeq !== undefined && localMovedSeq <= localSeq)) {
|
|
298
|
-
return 0;
|
|
299
|
-
}
|
|
300
|
-
return segment.cachedLength;
|
|
301
|
-
}
|
|
302
305
|
}
|
|
303
306
|
unlinkMarker(marker) {
|
|
304
307
|
const id = marker.getId();
|
|
@@ -318,7 +321,7 @@ export class MergeTree {
|
|
|
318
321
|
// Starting with the leaf segments, recursively builds the B-Tree layer by layer from the bottom up.
|
|
319
322
|
const buildMergeBlock = (nodes) => {
|
|
320
323
|
const blockCount = Math.ceil(nodes.length / maxChildren); // Compute # blocks require for this level of B-Tree
|
|
321
|
-
const blocks =
|
|
324
|
+
const blocks = Array.from({ length: blockCount }); // Pre-alloc array to collect nodes
|
|
322
325
|
// For each block in this level of the B-Tree...
|
|
323
326
|
for (let nodeIndex = 0, blockIndex = 0; // Start with the first block and first node
|
|
324
327
|
blockIndex < blockCount; // If we have more blocks, we also have more nodes to insert
|
|
@@ -331,6 +334,7 @@ export class MergeTree {
|
|
|
331
334
|
childIndex++, nodeIndex++ // Advance to next child & node
|
|
332
335
|
) {
|
|
333
336
|
// Insert the next node into the current block
|
|
337
|
+
// TODO Non null asserting, why is this not null?
|
|
334
338
|
this.addNode(block, nodes[nodeIndex]);
|
|
335
339
|
}
|
|
336
340
|
// Calculate this block's info. Previously this was inlined into the above loop as a micro-optimization,
|
|
@@ -339,7 +343,8 @@ export class MergeTree {
|
|
|
339
343
|
this.blockUpdate(block);
|
|
340
344
|
}
|
|
341
345
|
return blocks.length === 1 // If there is only one block at this layer...
|
|
342
|
-
?
|
|
346
|
+
? // Non null asserting here because of the length check above
|
|
347
|
+
blocks[0] // ...then we're done. Return the root.
|
|
343
348
|
: buildMergeBlock(blocks); // ...otherwise recursively build the next layer above blocks.
|
|
344
349
|
};
|
|
345
350
|
if (segments.length > 0) {
|
|
@@ -387,6 +392,7 @@ export class MergeTree {
|
|
|
387
392
|
while (parent) {
|
|
388
393
|
const children = parent.children;
|
|
389
394
|
for (let childIndex = 0; childIndex < parent.childCount; childIndex++) {
|
|
395
|
+
// TODO Non null asserting, why is this not null?
|
|
390
396
|
const child = children[childIndex];
|
|
391
397
|
if ((!!prevParent && child === prevParent) || child === node) {
|
|
392
398
|
break;
|
|
@@ -437,11 +443,9 @@ export class MergeTree {
|
|
|
437
443
|
let currentForwardMaybeEndpoint;
|
|
438
444
|
let currentForwardSlideDestination;
|
|
439
445
|
let currentForwardSlideIsForward;
|
|
440
|
-
const forwardPred = (ref) => ref.slidingPreference !== SlidingPreference.BACKWARD;
|
|
441
446
|
let currentBackwardMaybeEndpoint;
|
|
442
447
|
let currentBackwardSlideDestination;
|
|
443
448
|
let currentBackwardSlideIsForward;
|
|
444
|
-
const backwardPred = (ref) => ref.slidingPreference === SlidingPreference.BACKWARD;
|
|
445
449
|
const slideGroup = (currentSlideDestination, currentSlideIsForward, currentSlideGroup, pred, maybeEndpoint) => {
|
|
446
450
|
if (currentSlideIsForward === undefined) {
|
|
447
451
|
return;
|
|
@@ -458,16 +462,7 @@ export class MergeTree {
|
|
|
458
462
|
localRefs.addAfterTombstones(...endpointRefsToAdd);
|
|
459
463
|
}
|
|
460
464
|
}
|
|
461
|
-
if (currentSlideDestination
|
|
462
|
-
const localRefs = LocalReferenceCollection.setOrGet(currentSlideDestination);
|
|
463
|
-
if (currentSlideIsForward) {
|
|
464
|
-
localRefs.addBeforeTombstones(...nonEndpointRefsToAdd);
|
|
465
|
-
}
|
|
466
|
-
else {
|
|
467
|
-
localRefs.addAfterTombstones(...nonEndpointRefsToAdd);
|
|
468
|
-
}
|
|
469
|
-
}
|
|
470
|
-
else {
|
|
465
|
+
if (currentSlideDestination === undefined) {
|
|
471
466
|
for (const collection of currentSlideGroup) {
|
|
472
467
|
for (const ref of collection) {
|
|
473
468
|
if (pred(ref) && !refTypeIncludesFlag(ref, ReferenceType.StayOnRemove)) {
|
|
@@ -478,6 +473,15 @@ export class MergeTree {
|
|
|
478
473
|
}
|
|
479
474
|
}
|
|
480
475
|
}
|
|
476
|
+
else {
|
|
477
|
+
const localRefs = LocalReferenceCollection.setOrGet(currentSlideDestination);
|
|
478
|
+
if (currentSlideIsForward) {
|
|
479
|
+
localRefs.addBeforeTombstones(...nonEndpointRefsToAdd);
|
|
480
|
+
}
|
|
481
|
+
else {
|
|
482
|
+
localRefs.addAfterTombstones(...nonEndpointRefsToAdd);
|
|
483
|
+
}
|
|
484
|
+
}
|
|
481
485
|
};
|
|
482
486
|
const trySlideSegment = (segment, currentSlideDestination, currentSlideIsForward, currentSlideGroup, pred, slidingPreference, currentMaybeEndpoint, reassign) => {
|
|
483
487
|
// avoid sliding logic if this segment doesn't have any references
|
|
@@ -564,12 +568,7 @@ export class MergeTree {
|
|
|
564
568
|
}
|
|
565
569
|
else {
|
|
566
570
|
// Sequence number within window
|
|
567
|
-
if (
|
|
568
|
-
const partialLen = node.partialLengths.getPartialLength(refSeq, clientId);
|
|
569
|
-
PartialSequenceLengths.options.verifyExpected?.(this, node, refSeq, clientId);
|
|
570
|
-
return partialLen;
|
|
571
|
-
}
|
|
572
|
-
else {
|
|
571
|
+
if (node.isLeaf()) {
|
|
573
572
|
const segment = node;
|
|
574
573
|
const removalInfo = toRemovalInfo(segment);
|
|
575
574
|
const moveInfo = toMoveInfo(segment);
|
|
@@ -595,6 +594,11 @@ export class MergeTree {
|
|
|
595
594
|
? segment.cachedLength
|
|
596
595
|
: 0;
|
|
597
596
|
}
|
|
597
|
+
else {
|
|
598
|
+
const partialLen = node.partialLengths.getPartialLength(refSeq, clientId);
|
|
599
|
+
PartialSequenceLengths.options.verifyExpected?.(this, node, refSeq, clientId);
|
|
600
|
+
return partialLen;
|
|
601
|
+
}
|
|
598
602
|
}
|
|
599
603
|
}
|
|
600
604
|
setMinSeq(minSeq) {
|
|
@@ -618,7 +622,6 @@ export class MergeTree {
|
|
|
618
622
|
* Defaults to including all edits which have been applied.
|
|
619
623
|
* @param clientId - The ID of the client from whose perspective to resolve this reference. Defaults to the current client.
|
|
620
624
|
* @param localSeq - The local sequence number to consider. Defaults to including all local edits.
|
|
621
|
-
* @returns the count of elements before the given reference position in the given perspective.
|
|
622
625
|
*/
|
|
623
626
|
referencePositionToLocalPosition(refPos, refSeq = Number.MAX_SAFE_INTEGER, clientId = this.collabWindow.clientId, localSeq = this.collabWindow.localSeq) {
|
|
624
627
|
const seg = refPos.getSegment();
|
|
@@ -686,7 +689,7 @@ export class MergeTree {
|
|
|
686
689
|
foundMarker = marker;
|
|
687
690
|
}
|
|
688
691
|
}
|
|
689
|
-
return foundMarker
|
|
692
|
+
return foundMarker === undefined ? NodeAction.Skip : NodeAction.Exit;
|
|
690
693
|
}, undefined, undefined, forwards);
|
|
691
694
|
return foundMarker;
|
|
692
695
|
}
|
|
@@ -718,6 +721,8 @@ export class MergeTree {
|
|
|
718
721
|
if (opArgs.op.type === MergeTreeDeltaType.OBLITERATE && localMovedSeq !== undefined) {
|
|
719
722
|
const locallyMovedSegments = this.locallyMovedSegments.get(localMovedSeq);
|
|
720
723
|
if (locallyMovedSegments) {
|
|
724
|
+
// Disabling because a for of loop causes the type of segment to be ISegment, which does not have parent information stored
|
|
725
|
+
// eslint-disable-next-line unicorn/no-array-for-each
|
|
721
726
|
locallyMovedSegments.segments.forEach((segment) => {
|
|
722
727
|
segment.localMovedSeq = undefined;
|
|
723
728
|
if (!nodesToUpdate.includes(segment.parent)) {
|
|
@@ -818,15 +823,15 @@ export class MergeTree {
|
|
|
818
823
|
}
|
|
819
824
|
if (marker) {
|
|
820
825
|
pos = this.getPosition(marker, refseq, clientId);
|
|
821
|
-
if (
|
|
822
|
-
pos += marker.cachedLength;
|
|
826
|
+
if (relativePos.before) {
|
|
823
827
|
if (relativePos.offset !== undefined) {
|
|
824
|
-
pos
|
|
828
|
+
pos -= relativePos.offset;
|
|
825
829
|
}
|
|
826
830
|
}
|
|
827
831
|
else {
|
|
832
|
+
pos += marker.cachedLength;
|
|
828
833
|
if (relativePos.offset !== undefined) {
|
|
829
|
-
pos
|
|
834
|
+
pos += relativePos.offset;
|
|
830
835
|
}
|
|
831
836
|
}
|
|
832
837
|
}
|
|
@@ -885,6 +890,8 @@ export class MergeTree {
|
|
|
885
890
|
}
|
|
886
891
|
}
|
|
887
892
|
blockInsert(pos, refSeq, clientId, seq, localSeq, newSegments) {
|
|
893
|
+
// Keeping this function within the scope of blockInsert for readability.
|
|
894
|
+
// eslint-disable-next-line unicorn/consistent-function-scoping
|
|
888
895
|
const continueFrom = (node) => {
|
|
889
896
|
let siblingExists = false;
|
|
890
897
|
forwardExcursion(node, () => {
|
|
@@ -943,7 +950,7 @@ export class MergeTree {
|
|
|
943
950
|
});
|
|
944
951
|
if (newSegment.parent === undefined) {
|
|
945
952
|
// Indicates an attempt to insert past the end of the merge-tree's content.
|
|
946
|
-
const errorConstructor = localSeq
|
|
953
|
+
const errorConstructor = localSeq === undefined ? DataProcessingError : UsageError;
|
|
947
954
|
throw new errorConstructor("MergeTree insert failed", {
|
|
948
955
|
currentSeq: this.collabWindow.currentSeq,
|
|
949
956
|
minSeq: this.collabWindow.minSeq,
|
|
@@ -1085,6 +1092,7 @@ export class MergeTree {
|
|
|
1085
1092
|
let newNode;
|
|
1086
1093
|
let fromSplit;
|
|
1087
1094
|
for (childIndex = 0; childIndex < block.childCount; childIndex++) {
|
|
1095
|
+
// TODO Non null asserting, why is this not null?
|
|
1088
1096
|
child = children[childIndex];
|
|
1089
1097
|
// ensure we walk down the far edge of the tree, even if all sub-tree is eligible for zamboni
|
|
1090
1098
|
const isLastNonLeafBlock = isLastChildBlock && !child.isLeaf() && childIndex === block.childCount - 1;
|
|
@@ -1097,7 +1105,23 @@ export class MergeTree {
|
|
|
1097
1105
|
assert(len >= 0, 0x4bc /* Length should not be negative */);
|
|
1098
1106
|
if (_pos < len || (_pos === len && this.breakTie(_pos, child, seq))) {
|
|
1099
1107
|
// Found entry containing pos
|
|
1100
|
-
if (
|
|
1108
|
+
if (child.isLeaf()) {
|
|
1109
|
+
const segment = child;
|
|
1110
|
+
const segmentChanges = context.leaf(segment, _pos, context);
|
|
1111
|
+
if (segmentChanges.replaceCurrent) {
|
|
1112
|
+
block.assignChild(segmentChanges.replaceCurrent, childIndex, false);
|
|
1113
|
+
segmentChanges.replaceCurrent.ordinal = child.ordinal;
|
|
1114
|
+
}
|
|
1115
|
+
if (segmentChanges.next) {
|
|
1116
|
+
newNode = segmentChanges.next;
|
|
1117
|
+
childIndex++; // Insert after
|
|
1118
|
+
}
|
|
1119
|
+
else {
|
|
1120
|
+
// No change
|
|
1121
|
+
return undefined;
|
|
1122
|
+
}
|
|
1123
|
+
}
|
|
1124
|
+
else {
|
|
1101
1125
|
const childBlock = child;
|
|
1102
1126
|
// Internal node
|
|
1103
1127
|
const splitNode = this.insertingWalk(childBlock, _pos, refSeq, clientId, seq, context, isLastNonLeafBlock);
|
|
@@ -1115,43 +1139,27 @@ export class MergeTree {
|
|
|
1115
1139
|
childIndex++; // Insert after
|
|
1116
1140
|
}
|
|
1117
1141
|
}
|
|
1118
|
-
else {
|
|
1119
|
-
const segment = child;
|
|
1120
|
-
const segmentChanges = context.leaf(segment, _pos, context);
|
|
1121
|
-
if (segmentChanges.replaceCurrent) {
|
|
1122
|
-
block.assignChild(segmentChanges.replaceCurrent, childIndex, false);
|
|
1123
|
-
segmentChanges.replaceCurrent.ordinal = child.ordinal;
|
|
1124
|
-
}
|
|
1125
|
-
if (segmentChanges.next) {
|
|
1126
|
-
newNode = segmentChanges.next;
|
|
1127
|
-
childIndex++; // Insert after
|
|
1128
|
-
}
|
|
1129
|
-
else {
|
|
1130
|
-
// No change
|
|
1131
|
-
return undefined;
|
|
1132
|
-
}
|
|
1133
|
-
}
|
|
1134
1142
|
break;
|
|
1135
1143
|
}
|
|
1136
1144
|
else {
|
|
1137
1145
|
_pos -= len;
|
|
1138
1146
|
}
|
|
1139
1147
|
}
|
|
1140
|
-
if (!newNode) {
|
|
1141
|
-
if (
|
|
1142
|
-
|
|
1143
|
-
|
|
1144
|
-
|
|
1145
|
-
|
|
1146
|
-
|
|
1147
|
-
|
|
1148
|
-
// Assert segmentChanges.replaceCurrent === undefined
|
|
1149
|
-
}
|
|
1148
|
+
if (!newNode && _pos === 0) {
|
|
1149
|
+
if (context.continuePredicate?.(block)) {
|
|
1150
|
+
return MergeTree.theUnfinishedNode;
|
|
1151
|
+
}
|
|
1152
|
+
else {
|
|
1153
|
+
const segmentChanges = context.leaf(undefined, _pos, context);
|
|
1154
|
+
newNode = segmentChanges.next;
|
|
1155
|
+
// Assert segmentChanges.replaceCurrent === undefined
|
|
1150
1156
|
}
|
|
1151
1157
|
}
|
|
1152
1158
|
if (newNode) {
|
|
1153
1159
|
for (let i = block.childCount; i > childIndex; i--) {
|
|
1160
|
+
// TODO Non null asserting, why is this not null?
|
|
1154
1161
|
block.children[i] = block.children[i - 1];
|
|
1162
|
+
// TODO Non null asserting, why is this not null?
|
|
1155
1163
|
block.children[i].index = i;
|
|
1156
1164
|
}
|
|
1157
1165
|
block.assignChild(newNode, childIndex, false);
|
|
@@ -1183,6 +1191,7 @@ export class MergeTree {
|
|
|
1183
1191
|
// Update ordinals to reflect lowered child count
|
|
1184
1192
|
this.nodeUpdateOrdinals(node);
|
|
1185
1193
|
for (let i = 0; i < halfCount; i++) {
|
|
1194
|
+
// TODO Non null asserting, why is this not null?
|
|
1186
1195
|
newNode.assignChild(node.children[halfCount + i], i, false);
|
|
1187
1196
|
node.children[halfCount + i] = undefined;
|
|
1188
1197
|
}
|
|
@@ -1192,6 +1201,7 @@ export class MergeTree {
|
|
|
1192
1201
|
}
|
|
1193
1202
|
nodeUpdateOrdinals(block) {
|
|
1194
1203
|
for (let i = 0; i < block.childCount; i++) {
|
|
1204
|
+
// TODO Non null asserting, why is this not null?
|
|
1195
1205
|
const child = block.children[i];
|
|
1196
1206
|
block.setOrdinal(child, i);
|
|
1197
1207
|
if (!child.isLeaf()) {
|
|
@@ -1245,10 +1255,10 @@ export class MergeTree {
|
|
|
1245
1255
|
deltaSegments,
|
|
1246
1256
|
});
|
|
1247
1257
|
}
|
|
1248
|
-
if (this.collabWindow.collaborating &&
|
|
1249
|
-
|
|
1250
|
-
|
|
1251
|
-
|
|
1258
|
+
if (this.collabWindow.collaborating &&
|
|
1259
|
+
seq !== UnassignedSequenceNumber &&
|
|
1260
|
+
MergeTree.options.zamboniSegments) {
|
|
1261
|
+
zamboniSegments(this);
|
|
1252
1262
|
}
|
|
1253
1263
|
}
|
|
1254
1264
|
obliterateRange(start, end, refSeq, clientId, seq, overwrite = false, opArgs) {
|
|
@@ -1277,7 +1287,16 @@ export class MergeTree {
|
|
|
1277
1287
|
(refSeq < segment.seq || segment.seq === UnassignedSequenceNumber)) {
|
|
1278
1288
|
segment.wasMovedOnInsert = true;
|
|
1279
1289
|
}
|
|
1280
|
-
if (existingMoveInfo
|
|
1290
|
+
if (existingMoveInfo === undefined) {
|
|
1291
|
+
segment.movedClientIds = [clientId];
|
|
1292
|
+
segment.movedSeq = seq;
|
|
1293
|
+
segment.localMovedSeq = localSeq;
|
|
1294
|
+
segment.movedSeqs = [seq];
|
|
1295
|
+
if (!toRemovalInfo(segment)) {
|
|
1296
|
+
movedSegments.push({ segment });
|
|
1297
|
+
}
|
|
1298
|
+
}
|
|
1299
|
+
else {
|
|
1281
1300
|
_overwrite = true;
|
|
1282
1301
|
if (existingMoveInfo.movedSeq === UnassignedSequenceNumber) {
|
|
1283
1302
|
// we moved this locally, but someone else moved it first
|
|
@@ -1297,15 +1316,6 @@ export class MergeTree {
|
|
|
1297
1316
|
existingMoveInfo.movedSeqs.push(seq);
|
|
1298
1317
|
}
|
|
1299
1318
|
}
|
|
1300
|
-
else {
|
|
1301
|
-
segment.movedClientIds = [clientId];
|
|
1302
|
-
segment.movedSeq = seq;
|
|
1303
|
-
segment.localMovedSeq = localSeq;
|
|
1304
|
-
segment.movedSeqs = [seq];
|
|
1305
|
-
if (!toRemovalInfo(segment)) {
|
|
1306
|
-
movedSegments.push({ segment });
|
|
1307
|
-
}
|
|
1308
|
-
}
|
|
1309
1319
|
// Save segment so can assign moved sequence number when acked by server
|
|
1310
1320
|
if (this.collabWindow.collaborating) {
|
|
1311
1321
|
if (segment.movedSeq === UnassignedSequenceNumber &&
|
|
@@ -1329,7 +1339,7 @@ export class MergeTree {
|
|
|
1329
1339
|
}
|
|
1330
1340
|
return true;
|
|
1331
1341
|
};
|
|
1332
|
-
this.nodeMap(refSeq, clientId, markMoved, undefined, afterMarkMoved, start, end, undefined, seq
|
|
1342
|
+
this.nodeMap(refSeq, clientId, markMoved, undefined, afterMarkMoved, start, end, undefined, seq === UnassignedSequenceNumber ? undefined : seq);
|
|
1333
1343
|
this.slideAckedRemovedSegmentReferences(localOverlapWithRefs);
|
|
1334
1344
|
// opArgs == undefined => test code
|
|
1335
1345
|
if (movedSegments.length > 0) {
|
|
@@ -1347,10 +1357,10 @@ export class MergeTree {
|
|
|
1347
1357
|
if (!this.collabWindow.collaborating || clientId !== this.collabWindow.clientId) {
|
|
1348
1358
|
this.slideAckedRemovedSegmentReferences(movedSegments.map(({ segment }) => segment));
|
|
1349
1359
|
}
|
|
1350
|
-
if (this.collabWindow.collaborating &&
|
|
1351
|
-
|
|
1352
|
-
|
|
1353
|
-
|
|
1360
|
+
if (this.collabWindow.collaborating &&
|
|
1361
|
+
seq !== UnassignedSequenceNumber &&
|
|
1362
|
+
MergeTree.options.zamboniSegments) {
|
|
1363
|
+
zamboniSegments(this);
|
|
1354
1364
|
}
|
|
1355
1365
|
}
|
|
1356
1366
|
markRangeRemoved(start, end, refSeq, clientId, seq, overwrite = false, opArgs) {
|
|
@@ -1364,7 +1374,15 @@ export class MergeTree {
|
|
|
1364
1374
|
const localSeq = seq === UnassignedSequenceNumber ? ++this.collabWindow.localSeq : undefined;
|
|
1365
1375
|
const markRemoved = (segment, pos, _start, _end) => {
|
|
1366
1376
|
const existingRemovalInfo = toRemovalInfo(segment);
|
|
1367
|
-
if (existingRemovalInfo
|
|
1377
|
+
if (existingRemovalInfo === undefined) {
|
|
1378
|
+
segment.removedClientIds = [clientId];
|
|
1379
|
+
segment.removedSeq = seq;
|
|
1380
|
+
segment.localRemovedSeq = localSeq;
|
|
1381
|
+
if (!toMoveInfo(segment)) {
|
|
1382
|
+
removedSegments.push({ segment });
|
|
1383
|
+
}
|
|
1384
|
+
}
|
|
1385
|
+
else {
|
|
1368
1386
|
_overwrite = true;
|
|
1369
1387
|
if (existingRemovalInfo.removedSeq === UnassignedSequenceNumber) {
|
|
1370
1388
|
// we removed this locally, but someone else removed it first
|
|
@@ -1382,14 +1400,6 @@ export class MergeTree {
|
|
|
1382
1400
|
existingRemovalInfo.removedClientIds.push(clientId);
|
|
1383
1401
|
}
|
|
1384
1402
|
}
|
|
1385
|
-
else {
|
|
1386
|
-
segment.removedClientIds = [clientId];
|
|
1387
|
-
segment.removedSeq = seq;
|
|
1388
|
-
segment.localRemovedSeq = localSeq;
|
|
1389
|
-
if (!toMoveInfo(segment)) {
|
|
1390
|
-
removedSegments.push({ segment });
|
|
1391
|
-
}
|
|
1392
|
-
}
|
|
1393
1403
|
// Save segment so we can assign removed sequence number when acked by server
|
|
1394
1404
|
if (this.collabWindow.collaborating) {
|
|
1395
1405
|
if (segment.removedSeq === UnassignedSequenceNumber &&
|
|
@@ -1430,10 +1440,10 @@ export class MergeTree {
|
|
|
1430
1440
|
if (!this.collabWindow.collaborating || clientId !== this.collabWindow.clientId) {
|
|
1431
1441
|
this.slideAckedRemovedSegmentReferences(removedSegments.map(({ segment }) => segment));
|
|
1432
1442
|
}
|
|
1433
|
-
if (this.collabWindow.collaborating &&
|
|
1434
|
-
|
|
1435
|
-
|
|
1436
|
-
|
|
1443
|
+
if (this.collabWindow.collaborating &&
|
|
1444
|
+
seq !== UnassignedSequenceNumber &&
|
|
1445
|
+
MergeTree.options.zamboniSegments) {
|
|
1446
|
+
zamboniSegments(this);
|
|
1437
1447
|
}
|
|
1438
1448
|
}
|
|
1439
1449
|
/**
|
|
@@ -1446,6 +1456,8 @@ export class MergeTree {
|
|
|
1446
1456
|
if (pendingSegmentGroup === undefined || pendingSegmentGroup !== localOpMetadata) {
|
|
1447
1457
|
throw new Error("Rollback op doesn't match last edit");
|
|
1448
1458
|
}
|
|
1459
|
+
// Disabling because a for of loop causes the type of segment to be ISegment, which does not have parent information stored
|
|
1460
|
+
// eslint-disable-next-line unicorn/no-array-for-each
|
|
1449
1461
|
pendingSegmentGroup.segments.forEach((segment) => {
|
|
1450
1462
|
const segmentSegmentGroup = segment.segmentGroups?.pop?.();
|
|
1451
1463
|
assert(segmentSegmentGroup === pendingSegmentGroup, 0x3ee /* Unexpected segmentGroup in segment */);
|
|
@@ -1485,6 +1497,7 @@ export class MergeTree {
|
|
|
1485
1497
|
this.markRangeRemoved(start, start + segment.cachedLength, UniversalSequenceNumber, this.collabWindow.clientId, UniversalSequenceNumber, false, { op: removeOp });
|
|
1486
1498
|
} /* op.type === MergeTreeDeltaType.ANNOTATE */
|
|
1487
1499
|
else {
|
|
1500
|
+
// TODO Non null asserting, why is this not null?
|
|
1488
1501
|
const props = pendingSegmentGroup.previousProps[i];
|
|
1489
1502
|
const annotateOp = createAnnotateRangeOp(start, start + segment.cachedLength, props);
|
|
1490
1503
|
this.annotateRange(start, start + segment.cachedLength, props, UniversalSequenceNumber, this.collabWindow.clientId, UniversalSequenceNumber, { op: annotateOp }, PropertiesRollback.Rollback);
|
|
@@ -1589,18 +1602,20 @@ export class MergeTree {
|
|
|
1589
1602
|
}
|
|
1590
1603
|
}
|
|
1591
1604
|
}
|
|
1592
|
-
const newOrder = Array.from(affectedSegments
|
|
1593
|
-
|
|
1605
|
+
const newOrder = Array.from(affectedSegments, ({ data }) => data);
|
|
1606
|
+
for (const seg of newOrder)
|
|
1607
|
+
seg.localRefs?.walkReferences((lref) => lref.callbacks?.beforeSlide?.(lref));
|
|
1594
1608
|
const perSegmentTrackingGroups = new Map();
|
|
1595
1609
|
for (const segment of newOrder) {
|
|
1596
1610
|
const { trackingCollection } = segment;
|
|
1597
|
-
const trackingGroups =
|
|
1611
|
+
const trackingGroups = [...trackingCollection.trackingGroups];
|
|
1598
1612
|
perSegmentTrackingGroups.set(segment, trackingGroups);
|
|
1599
1613
|
for (const group of trackingCollection.trackingGroups) {
|
|
1600
1614
|
trackingCollection.unlink(group);
|
|
1601
1615
|
}
|
|
1602
1616
|
}
|
|
1603
1617
|
for (let i = 0; i < newOrder.length; i++) {
|
|
1618
|
+
// TODO Non null asserting, why is this not null?
|
|
1604
1619
|
const seg = newOrder[i];
|
|
1605
1620
|
const { parent, index, ordinal } = currentOrder[i];
|
|
1606
1621
|
parent?.assignChild(seg, index, false);
|
|
@@ -1620,13 +1635,16 @@ export class MergeTree {
|
|
|
1620
1635
|
}
|
|
1621
1636
|
return depths.get(block);
|
|
1622
1637
|
};
|
|
1623
|
-
newOrder
|
|
1624
|
-
|
|
1638
|
+
for (const element of newOrder) {
|
|
1639
|
+
computeDepth(element);
|
|
1640
|
+
}
|
|
1641
|
+
for (const [node] of [...depths.entries()].sort((a, b) => b[1] - a[1])) {
|
|
1625
1642
|
if (!node.isLeaf()) {
|
|
1626
1643
|
this.nodeUpdateLengthNewStructure(node);
|
|
1627
1644
|
}
|
|
1628
1645
|
}
|
|
1629
|
-
|
|
1646
|
+
for (const seg of newOrder)
|
|
1647
|
+
seg.localRefs?.walkReferences((lref) => lref.callbacks?.afterSlide?.(lref));
|
|
1630
1648
|
}
|
|
1631
1649
|
/**
|
|
1632
1650
|
* Normalizes the segments nearby `segmentGroup` to be ordered as they would if the op submitting `segmentGroup`
|
|
@@ -1681,11 +1699,10 @@ export class MergeTree {
|
|
|
1681
1699
|
}
|
|
1682
1700
|
blockUpdate(block) {
|
|
1683
1701
|
let len;
|
|
1684
|
-
// eslint-disable-next-line import/no-deprecated
|
|
1685
1702
|
const rightmostTiles = createMap();
|
|
1686
|
-
// eslint-disable-next-line import/no-deprecated
|
|
1687
1703
|
const leftmostTiles = createMap();
|
|
1688
1704
|
for (let i = 0; i < block.childCount; i++) {
|
|
1705
|
+
// TODO Non null asserting, why is this not null?
|
|
1689
1706
|
const node = block.children[i];
|
|
1690
1707
|
const nodeLength = nodeTotalLength(this, node);
|
|
1691
1708
|
if (nodeLength !== undefined) {
|
|
@@ -1716,9 +1733,7 @@ export class MergeTree {
|
|
|
1716
1733
|
}
|
|
1717
1734
|
}
|
|
1718
1735
|
else {
|
|
1719
|
-
// eslint-disable-next-line import/no-deprecated
|
|
1720
1736
|
extend(rightmostTiles, node.rightmostTiles);
|
|
1721
|
-
// eslint-disable-next-line import/no-deprecated
|
|
1722
1737
|
extendIfUndefined(leftmostTiles, node.leftmostTiles);
|
|
1723
1738
|
}
|
|
1724
1739
|
}
|