@fluidframework/merge-tree 2.12.0 → 2.13.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +4 -0
- package/dist/MergeTreeTextHelper.d.ts.map +1 -1
- package/dist/MergeTreeTextHelper.js +0 -2
- package/dist/MergeTreeTextHelper.js.map +1 -1
- package/dist/attributionPolicy.d.ts.map +1 -1
- package/dist/attributionPolicy.js +6 -16
- package/dist/attributionPolicy.js.map +1 -1
- package/dist/client.d.ts +3 -4
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +39 -28
- package/dist/client.js.map +1 -1
- package/dist/endOfTreeSegment.d.ts +2 -1
- package/dist/endOfTreeSegment.d.ts.map +1 -1
- package/dist/endOfTreeSegment.js.map +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -4
- package/dist/index.js.map +1 -1
- package/dist/mergeTree.d.ts +8 -7
- package/dist/mergeTree.d.ts.map +1 -1
- package/dist/mergeTree.js +190 -216
- package/dist/mergeTree.js.map +1 -1
- package/dist/mergeTreeNodeWalk.d.ts.map +1 -1
- package/dist/mergeTreeNodeWalk.js +3 -2
- package/dist/mergeTreeNodeWalk.js.map +1 -1
- package/dist/mergeTreeNodes.d.ts +76 -162
- package/dist/mergeTreeNodes.d.ts.map +1 -1
- package/dist/mergeTreeNodes.js +100 -112
- package/dist/mergeTreeNodes.js.map +1 -1
- package/dist/mergeTreeTracking.d.ts.map +1 -1
- package/dist/mergeTreeTracking.js +0 -2
- package/dist/mergeTreeTracking.js.map +1 -1
- package/dist/partialLengths.d.ts +2 -2
- package/dist/partialLengths.d.ts.map +1 -1
- package/dist/partialLengths.js +28 -26
- package/dist/partialLengths.js.map +1 -1
- package/dist/perspective.d.ts +3 -2
- package/dist/perspective.d.ts.map +1 -1
- package/dist/perspective.js +11 -4
- package/dist/perspective.js.map +1 -1
- package/dist/referencePositions.d.ts.map +1 -1
- package/dist/referencePositions.js +4 -1
- package/dist/referencePositions.js.map +1 -1
- package/dist/revertibles.d.ts.map +1 -1
- package/dist/revertibles.js +10 -11
- package/dist/revertibles.js.map +1 -1
- package/dist/segmentGroupCollection.d.ts +4 -4
- package/dist/segmentGroupCollection.d.ts.map +1 -1
- package/dist/segmentGroupCollection.js +0 -6
- package/dist/segmentGroupCollection.js.map +1 -1
- package/dist/segmentInfos.d.ts +257 -0
- package/dist/segmentInfos.d.ts.map +1 -0
- package/dist/segmentInfos.js +166 -0
- package/dist/segmentInfos.js.map +1 -0
- package/dist/snapshotLoader.d.ts.map +1 -1
- package/dist/snapshotLoader.js +38 -44
- package/dist/snapshotLoader.js.map +1 -1
- package/dist/snapshotV1.d.ts.map +1 -1
- package/dist/snapshotV1.js +9 -12
- package/dist/snapshotV1.js.map +1 -1
- package/dist/snapshotlegacy.d.ts +2 -2
- package/dist/snapshotlegacy.d.ts.map +1 -1
- package/dist/snapshotlegacy.js +5 -3
- package/dist/snapshotlegacy.js.map +1 -1
- package/dist/sortedSegmentSet.d.ts.map +1 -1
- package/dist/sortedSegmentSet.js +5 -8
- package/dist/sortedSegmentSet.js.map +1 -1
- package/dist/test/beastTest.spec.d.ts +0 -2
- package/dist/test/beastTest.spec.d.ts.map +1 -1
- package/dist/test/beastTest.spec.js +1 -5
- package/dist/test/beastTest.spec.js.map +1 -1
- package/dist/test/client.annotateMarker.spec.js.map +1 -1
- package/dist/test/client.applyMsg.spec.js +15 -12
- package/dist/test/client.applyMsg.spec.js.map +1 -1
- package/dist/test/client.attributionFarm.spec.js.map +1 -1
- package/dist/test/client.getPosition.spec.js +3 -2
- package/dist/test/client.getPosition.spec.js.map +1 -1
- package/dist/test/client.localReference.spec.js +6 -6
- package/dist/test/client.localReference.spec.js.map +1 -1
- package/dist/test/client.localReferenceFarm.spec.js.map +1 -1
- package/dist/test/client.rollback.spec.js.map +1 -1
- package/dist/test/dirname.cjs +0 -1
- package/dist/test/dirname.cjs.map +1 -1
- package/dist/test/index.d.ts +1 -1
- package/dist/test/index.d.ts.map +1 -1
- package/dist/test/index.js +2 -4
- package/dist/test/index.js.map +1 -1
- package/dist/test/mergeTree.annotate.spec.js +3 -0
- package/dist/test/mergeTree.annotate.spec.js.map +1 -1
- package/dist/test/mergeTree.insertingWalk.spec.js +1 -1
- package/dist/test/mergeTree.insertingWalk.spec.js.map +1 -1
- package/dist/test/mergeTree.markRangeRemoved.spec.js +2 -0
- package/dist/test/mergeTree.markRangeRemoved.spec.js.map +1 -1
- package/dist/test/mergeTree.walk.spec.js.map +1 -1
- package/dist/test/mergeTreeOperationRunner.d.ts.map +1 -1
- package/dist/test/mergeTreeOperationRunner.js +2 -3
- package/dist/test/mergeTreeOperationRunner.js.map +1 -1
- package/dist/test/obliterate.spec.js.map +1 -1
- package/dist/test/propertyManager.spec.js.map +1 -1
- package/dist/test/reconnectHelper.d.ts +2 -1
- package/dist/test/reconnectHelper.d.ts.map +1 -1
- package/dist/test/reconnectHelper.js.map +1 -1
- package/dist/test/resetPendingSegmentsToOp.spec.js.map +1 -1
- package/dist/test/revertibleFarm.spec.js.map +1 -1
- package/dist/test/segmentGroupCollection.spec.js +15 -3
- package/dist/test/segmentGroupCollection.spec.js.map +1 -1
- package/dist/test/snapshot.utils.d.ts +2 -2
- package/dist/test/snapshot.utils.d.ts.map +1 -1
- package/dist/test/snapshot.utils.js.map +1 -1
- package/dist/test/sortedSegmentSet.spec.js +4 -3
- package/dist/test/sortedSegmentSet.spec.js.map +1 -1
- package/dist/test/testClient.d.ts +8 -6
- package/dist/test/testClient.d.ts.map +1 -1
- package/dist/test/testClient.js +29 -27
- package/dist/test/testClient.js.map +1 -1
- package/dist/test/testClientLogger.d.ts.map +1 -1
- package/dist/test/testClientLogger.js +6 -4
- package/dist/test/testClientLogger.js.map +1 -1
- package/dist/test/testUtils.d.ts +2 -2
- package/dist/test/testUtils.d.ts.map +1 -1
- package/dist/test/testUtils.js +32 -8
- package/dist/test/testUtils.js.map +1 -1
- package/dist/test/text.d.ts +2 -2
- package/dist/test/text.d.ts.map +1 -1
- package/dist/test/text.js +12 -6
- package/dist/test/text.js.map +1 -1
- package/dist/test/tracking.spec.js.map +1 -1
- package/dist/test/wordUnitTests.spec.js +1 -1
- package/dist/test/wordUnitTests.spec.js.map +1 -1
- package/dist/zamboni.d.ts.map +1 -1
- package/dist/zamboni.js +8 -7
- package/dist/zamboni.js.map +1 -1
- package/lib/MergeTreeTextHelper.d.ts.map +1 -1
- package/lib/MergeTreeTextHelper.js +0 -2
- package/lib/MergeTreeTextHelper.js.map +1 -1
- package/lib/attributionPolicy.d.ts.map +1 -1
- package/lib/attributionPolicy.js +6 -16
- package/lib/attributionPolicy.js.map +1 -1
- package/lib/client.d.ts +3 -4
- package/lib/client.d.ts.map +1 -1
- package/lib/client.js +40 -29
- package/lib/client.js.map +1 -1
- package/lib/endOfTreeSegment.d.ts +2 -1
- package/lib/endOfTreeSegment.d.ts.map +1 -1
- package/lib/endOfTreeSegment.js.map +1 -1
- package/lib/index.d.ts +2 -1
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +1 -1
- package/lib/index.js.map +1 -1
- package/lib/mergeTree.d.ts +8 -7
- package/lib/mergeTree.d.ts.map +1 -1
- package/lib/mergeTree.js +177 -205
- package/lib/mergeTree.js.map +1 -1
- package/lib/mergeTreeNodeWalk.d.ts.map +1 -1
- package/lib/mergeTreeNodeWalk.js +3 -2
- package/lib/mergeTreeNodeWalk.js.map +1 -1
- package/lib/mergeTreeNodes.d.ts +76 -162
- package/lib/mergeTreeNodes.d.ts.map +1 -1
- package/lib/mergeTreeNodes.js +95 -108
- package/lib/mergeTreeNodes.js.map +1 -1
- package/lib/mergeTreeTracking.d.ts.map +1 -1
- package/lib/mergeTreeTracking.js +0 -2
- package/lib/mergeTreeTracking.js.map +1 -1
- package/lib/partialLengths.d.ts +2 -2
- package/lib/partialLengths.d.ts.map +1 -1
- package/lib/partialLengths.js +25 -23
- package/lib/partialLengths.js.map +1 -1
- package/lib/perspective.d.ts +3 -2
- package/lib/perspective.d.ts.map +1 -1
- package/lib/perspective.js +11 -4
- package/lib/perspective.js.map +1 -1
- package/lib/referencePositions.d.ts.map +1 -1
- package/lib/referencePositions.js +4 -1
- package/lib/referencePositions.js.map +1 -1
- package/lib/revertibles.d.ts.map +1 -1
- package/lib/revertibles.js +8 -9
- package/lib/revertibles.js.map +1 -1
- package/lib/segmentGroupCollection.d.ts +4 -4
- package/lib/segmentGroupCollection.d.ts.map +1 -1
- package/lib/segmentGroupCollection.js +0 -6
- package/lib/segmentGroupCollection.js.map +1 -1
- package/lib/segmentInfos.d.ts +257 -0
- package/lib/segmentInfos.d.ts.map +1 -0
- package/lib/segmentInfos.js +145 -0
- package/lib/segmentInfos.js.map +1 -0
- package/lib/snapshotLoader.d.ts.map +1 -1
- package/lib/snapshotLoader.js +38 -44
- package/lib/snapshotLoader.js.map +1 -1
- package/lib/snapshotV1.d.ts.map +1 -1
- package/lib/snapshotV1.js +9 -12
- package/lib/snapshotV1.js.map +1 -1
- package/lib/snapshotlegacy.d.ts +2 -2
- package/lib/snapshotlegacy.d.ts.map +1 -1
- package/lib/snapshotlegacy.js +5 -3
- package/lib/snapshotlegacy.js.map +1 -1
- package/lib/sortedSegmentSet.d.ts.map +1 -1
- package/lib/sortedSegmentSet.js +5 -8
- package/lib/sortedSegmentSet.js.map +1 -1
- package/lib/test/beastTest.spec.d.ts +0 -2
- package/lib/test/beastTest.spec.d.ts.map +1 -1
- package/lib/test/beastTest.spec.js +0 -3
- package/lib/test/beastTest.spec.js.map +1 -1
- package/lib/test/client.annotateMarker.spec.js.map +1 -1
- package/lib/test/client.applyMsg.spec.js +15 -12
- package/lib/test/client.applyMsg.spec.js.map +1 -1
- package/lib/test/client.attributionFarm.spec.js.map +1 -1
- package/lib/test/client.getPosition.spec.js +3 -2
- package/lib/test/client.getPosition.spec.js.map +1 -1
- package/lib/test/client.localReference.spec.js +1 -1
- package/lib/test/client.localReference.spec.js.map +1 -1
- package/lib/test/client.localReferenceFarm.spec.js.map +1 -1
- package/lib/test/client.rollback.spec.js +1 -1
- package/lib/test/client.rollback.spec.js.map +1 -1
- package/lib/test/dirname.cjs +0 -1
- package/lib/test/dirname.cjs.map +1 -1
- package/lib/test/index.d.ts +1 -1
- package/lib/test/index.d.ts.map +1 -1
- package/lib/test/index.js +1 -1
- package/lib/test/index.js.map +1 -1
- package/lib/test/mergeTree.annotate.spec.js +3 -0
- package/lib/test/mergeTree.annotate.spec.js.map +1 -1
- package/lib/test/mergeTree.insertingWalk.spec.js +2 -2
- package/lib/test/mergeTree.insertingWalk.spec.js.map +1 -1
- package/lib/test/mergeTree.markRangeRemoved.spec.js +2 -0
- package/lib/test/mergeTree.markRangeRemoved.spec.js.map +1 -1
- package/lib/test/mergeTree.walk.spec.js.map +1 -1
- package/lib/test/mergeTreeOperationRunner.d.ts.map +1 -1
- package/lib/test/mergeTreeOperationRunner.js +1 -2
- package/lib/test/mergeTreeOperationRunner.js.map +1 -1
- package/lib/test/obliterate.spec.js.map +1 -1
- package/lib/test/propertyManager.spec.js.map +1 -1
- package/lib/test/reconnectHelper.d.ts +2 -1
- package/lib/test/reconnectHelper.d.ts.map +1 -1
- package/lib/test/reconnectHelper.js.map +1 -1
- package/lib/test/resetPendingSegmentsToOp.spec.js.map +1 -1
- package/lib/test/revertibleFarm.spec.js.map +1 -1
- package/lib/test/segmentGroupCollection.spec.js +15 -3
- package/lib/test/segmentGroupCollection.spec.js.map +1 -1
- package/lib/test/snapshot.utils.d.ts +2 -2
- package/lib/test/snapshot.utils.d.ts.map +1 -1
- package/lib/test/snapshot.utils.js.map +1 -1
- package/lib/test/sortedSegmentSet.spec.js +4 -3
- package/lib/test/sortedSegmentSet.spec.js.map +1 -1
- package/lib/test/testClient.d.ts +8 -6
- package/lib/test/testClient.d.ts.map +1 -1
- package/lib/test/testClient.js +30 -28
- package/lib/test/testClient.js.map +1 -1
- package/lib/test/testClientLogger.d.ts.map +1 -1
- package/lib/test/testClientLogger.js +5 -3
- package/lib/test/testClientLogger.js.map +1 -1
- package/lib/test/testUtils.d.ts +2 -2
- package/lib/test/testUtils.d.ts.map +1 -1
- package/lib/test/testUtils.js +9 -8
- package/lib/test/testUtils.js.map +1 -1
- package/lib/test/text.d.ts +2 -2
- package/lib/test/text.d.ts.map +1 -1
- package/lib/test/text.js +12 -6
- package/lib/test/text.js.map +1 -1
- package/lib/test/tracking.spec.js.map +1 -1
- package/lib/test/wordUnitTests.spec.js +1 -1
- package/lib/test/wordUnitTests.spec.js.map +1 -1
- package/lib/zamboni.d.ts.map +1 -1
- package/lib/zamboni.js +7 -6
- package/lib/zamboni.js.map +1 -1
- package/package.json +17 -17
- package/src/MergeTreeTextHelper.ts +2 -4
- package/src/attributionPolicy.ts +5 -13
- package/src/client.ts +55 -44
- package/src/endOfTreeSegment.ts +3 -3
- package/src/index.ts +4 -6
- package/src/mergeTree.ts +245 -282
- package/src/mergeTreeNodeWalk.ts +3 -2
- package/src/mergeTreeNodes.ts +190 -322
- package/src/mergeTreeTracking.ts +0 -3
- package/src/partialLengths.ts +42 -27
- package/src/perspective.ts +27 -4
- package/src/referencePositions.ts +4 -1
- package/src/revertibles.ts +19 -13
- package/src/segmentGroupCollection.ts +7 -18
- package/src/segmentInfos.ts +377 -0
- package/src/snapshotLoader.ts +60 -57
- package/src/snapshotV1.ts +14 -16
- package/src/snapshotlegacy.ts +12 -17
- package/src/sortedSegmentSet.ts +6 -8
- package/src/zamboni.ts +10 -12
package/dist/mergeTree.js
CHANGED
|
@@ -22,45 +22,26 @@ const partialLengths_js_1 = require("./partialLengths.js");
|
|
|
22
22
|
const perspective_js_1 = require("./perspective.js");
|
|
23
23
|
const properties_js_1 = require("./properties.js");
|
|
24
24
|
const referencePositions_js_1 = require("./referencePositions.js");
|
|
25
|
-
// eslint-disable-next-line import/no-deprecated
|
|
26
25
|
const segmentGroupCollection_js_1 = require("./segmentGroupCollection.js");
|
|
27
|
-
|
|
26
|
+
const segmentInfos_js_1 = require("./segmentInfos.js");
|
|
28
27
|
const segmentPropertiesManager_js_1 = require("./segmentPropertiesManager.js");
|
|
29
28
|
const sequencePlace_js_1 = require("./sequencePlace.js");
|
|
30
29
|
const sortedSegmentSet_js_1 = require("./sortedSegmentSet.js");
|
|
31
30
|
const zamboni_js_1 = require("./zamboni.js");
|
|
32
|
-
// eslint-disable-next-line import/no-deprecated
|
|
33
|
-
function markSegmentMoved(seg, moveInfo) {
|
|
34
|
-
seg.moveDst = moveInfo.moveDst;
|
|
35
|
-
seg.movedClientIds = [...moveInfo.movedClientIds];
|
|
36
|
-
seg.movedSeqs = [moveInfo.movedSeq];
|
|
37
|
-
seg.movedSeq = moveInfo.movedSeq;
|
|
38
|
-
seg.localMovedSeq = moveInfo.localMovedSeq;
|
|
39
|
-
seg.wasMovedOnInsert = moveInfo.wasMovedOnInsert;
|
|
40
|
-
}
|
|
41
|
-
// eslint-disable-next-line import/no-deprecated
|
|
42
|
-
function isMoved(segment) {
|
|
43
|
-
return (0, mergeTreeNodes_js_1.toMoveInfo)(segment) !== undefined;
|
|
44
|
-
}
|
|
45
|
-
// eslint-disable-next-line import/no-deprecated
|
|
46
|
-
function isRemoved(segment) {
|
|
47
|
-
return (0, mergeTreeNodes_js_1.toRemovalInfo)(segment) !== undefined;
|
|
48
|
-
}
|
|
49
|
-
// eslint-disable-next-line import/no-deprecated
|
|
50
31
|
function isRemovedAndAcked(segment) {
|
|
51
|
-
const removalInfo = (0,
|
|
32
|
+
const removalInfo = (0, segmentInfos_js_1.toRemovalInfo)(segment);
|
|
52
33
|
return removalInfo !== undefined && removalInfo.removedSeq !== constants_js_1.UnassignedSequenceNumber;
|
|
53
34
|
}
|
|
54
35
|
// eslint-disable-next-line import/no-deprecated
|
|
55
36
|
function isMovedAndAcked(segment) {
|
|
56
|
-
const moveInfo = (0,
|
|
37
|
+
const moveInfo = (0, segmentInfos_js_1.toMoveInfo)(segment);
|
|
57
38
|
return moveInfo !== undefined && moveInfo.movedSeq !== constants_js_1.UnassignedSequenceNumber;
|
|
58
39
|
}
|
|
59
40
|
function isRemovedAndAckedOrMovedAndAcked(segment) {
|
|
60
41
|
return isRemovedAndAcked(segment) || isMovedAndAcked(segment);
|
|
61
42
|
}
|
|
62
43
|
function isRemovedOrMoved(segment) {
|
|
63
|
-
return isRemoved(segment) || isMoved(segment);
|
|
44
|
+
return (0, segmentInfos_js_1.isRemoved)(segment) || (0, segmentInfos_js_1.isMoved)(segment);
|
|
64
45
|
}
|
|
65
46
|
function nodeTotalLength(mergeTree, node) {
|
|
66
47
|
if (!node.isLeaf()) {
|
|
@@ -90,29 +71,25 @@ function ackSegment(segment, segmentGroup, opArgs) {
|
|
|
90
71
|
return true;
|
|
91
72
|
}
|
|
92
73
|
case ops_js_1.MergeTreeDeltaType.REMOVE: {
|
|
93
|
-
|
|
94
|
-
const removalInfo = (0, mergeTreeNodes_js_1.toRemovalInfo)(segment);
|
|
95
|
-
(0, internal_1.assert)(removalInfo !== undefined, 0x046 /* "On remove ack, missing removal info!" */);
|
|
74
|
+
(0, segmentInfos_js_1.assertRemoved)(segment);
|
|
96
75
|
segment.localRemovedSeq = undefined;
|
|
97
|
-
if (
|
|
98
|
-
|
|
76
|
+
if (segment.removedSeq === constants_js_1.UnassignedSequenceNumber) {
|
|
77
|
+
segment.removedSeq = sequenceNumber;
|
|
99
78
|
return true;
|
|
100
79
|
}
|
|
101
80
|
return false;
|
|
102
81
|
}
|
|
103
82
|
case ops_js_1.MergeTreeDeltaType.OBLITERATE:
|
|
104
83
|
case ops_js_1.MergeTreeDeltaType.OBLITERATE_SIDED: {
|
|
105
|
-
|
|
106
|
-
const moveInfo = (0, mergeTreeNodes_js_1.toMoveInfo)(segment);
|
|
107
|
-
(0, internal_1.assert)(moveInfo !== undefined, 0x86e /* On obliterate ack, missing move info! */);
|
|
84
|
+
(0, segmentInfos_js_1.assertMoved)(segment);
|
|
108
85
|
const obliterateInfo = segmentGroup.obliterateInfo;
|
|
109
86
|
(0, internal_1.assert)(obliterateInfo !== undefined, 0xa40 /* must have obliterate info */);
|
|
110
87
|
segment.localMovedSeq = obliterateInfo.localSeq = undefined;
|
|
111
|
-
const seqIdx =
|
|
88
|
+
const seqIdx = segment.movedSeqs.indexOf(constants_js_1.UnassignedSequenceNumber);
|
|
112
89
|
(0, internal_1.assert)(seqIdx !== -1, 0x86f /* expected movedSeqs to contain unacked seq */);
|
|
113
|
-
|
|
114
|
-
if (
|
|
115
|
-
|
|
90
|
+
segment.movedSeqs[seqIdx] = sequenceNumber;
|
|
91
|
+
if (segment.movedSeq === constants_js_1.UnassignedSequenceNumber) {
|
|
92
|
+
segment.movedSeq = sequenceNumber;
|
|
116
93
|
return true;
|
|
117
94
|
}
|
|
118
95
|
return false;
|
|
@@ -151,7 +128,6 @@ exports.findRootMergeBlock = findRootMergeBlock;
|
|
|
151
128
|
* entries for all segments visited during excursion.
|
|
152
129
|
* This can reduce the number of times the tree needs to be scanned if a range containing many
|
|
153
130
|
* SlideOnRemove references is removed.
|
|
154
|
-
* @internal
|
|
155
131
|
*/
|
|
156
132
|
function getSlideToSegment(segment, slidingPreference = localReference_js_1.SlidingPreference.FORWARD, cache, useNewSlidingBehavior = false) {
|
|
157
133
|
if (!segment ||
|
|
@@ -171,7 +147,8 @@ function getSlideToSegment(segment, slidingPreference = localReference_js_1.Slid
|
|
|
171
147
|
return false;
|
|
172
148
|
}
|
|
173
149
|
if (cache !== undefined &&
|
|
174
|
-
(seg
|
|
150
|
+
((0, segmentInfos_js_1.toRemovalInfo)(seg)?.removedSeq === (0, segmentInfos_js_1.toRemovalInfo)(segment)?.removedSeq ||
|
|
151
|
+
(0, segmentInfos_js_1.toMoveInfo)(seg)?.movedSeq === (0, segmentInfos_js_1.toMoveInfo)(segment)?.movedSeq)) {
|
|
175
152
|
cache.set(seg, result);
|
|
176
153
|
}
|
|
177
154
|
return true;
|
|
@@ -218,7 +195,7 @@ function getSlideToSegment(segment, slidingPreference = localReference_js_1.Slid
|
|
|
218
195
|
* @internal
|
|
219
196
|
*/
|
|
220
197
|
function getSlideToSegoff(segoff, slidingPreference = localReference_js_1.SlidingPreference.FORWARD, useNewSlidingBehavior = false) {
|
|
221
|
-
if (segoff.segment
|
|
198
|
+
if (!(0, mergeTreeNodes_js_1.isSegmentLeaf)(segoff.segment)) {
|
|
222
199
|
return segoff;
|
|
223
200
|
}
|
|
224
201
|
const [segment, _] = getSlideToSegment(segoff.segment, slidingPreference, undefined, useNewSlidingBehavior);
|
|
@@ -246,7 +223,6 @@ class Obliterates {
|
|
|
246
223
|
* See https://github.com/microsoft/FluidFramework/blob/main/packages/dds/merge-tree/docs/Obliterate.md#remote-perspective
|
|
247
224
|
* for additional context
|
|
248
225
|
*/
|
|
249
|
-
// eslint-disable-next-line import/no-deprecated
|
|
250
226
|
this.seqOrdered = new index_js_1.DoublyLinkedList();
|
|
251
227
|
/**
|
|
252
228
|
* This contains a sorted lists of all obliterate starts
|
|
@@ -264,7 +240,6 @@ class Obliterates {
|
|
|
264
240
|
this.mergeTree.removeLocalReferencePosition(ob.data.end);
|
|
265
241
|
}
|
|
266
242
|
}
|
|
267
|
-
// eslint-disable-next-line import/no-deprecated
|
|
268
243
|
addOrUpdate(obliterateInfo) {
|
|
269
244
|
const { seq, start } = obliterateInfo;
|
|
270
245
|
if (seq !== constants_js_1.UnassignedSequenceNumber) {
|
|
@@ -275,14 +250,14 @@ class Obliterates {
|
|
|
275
250
|
empty() {
|
|
276
251
|
return this.startOrdered.size === 0;
|
|
277
252
|
}
|
|
278
|
-
// eslint-disable-next-line import/no-deprecated
|
|
279
253
|
findOverlapping(seg) {
|
|
280
|
-
// eslint-disable-next-line import/no-deprecated
|
|
281
254
|
const overlapping = [];
|
|
282
255
|
for (const start of this.startOrdered.items) {
|
|
283
|
-
|
|
256
|
+
const startSeg = start.getSegment();
|
|
257
|
+
if ((0, segmentInfos_js_1.isMergeNodeInfo)(startSeg) && startSeg.ordinal <= seg.ordinal) {
|
|
284
258
|
const ob = start.properties?.obliterate;
|
|
285
|
-
|
|
259
|
+
const endSeg = ob.end.getSegment();
|
|
260
|
+
if ((0, segmentInfos_js_1.isMergeNodeInfo)(endSeg) && endSeg.ordinal >= seg.ordinal) {
|
|
286
261
|
overlapping.push(ob);
|
|
287
262
|
}
|
|
288
263
|
}
|
|
@@ -300,9 +275,7 @@ class Obliterates {
|
|
|
300
275
|
class MergeTree {
|
|
301
276
|
constructor(options) {
|
|
302
277
|
this.options = options;
|
|
303
|
-
// eslint-disable-next-line import/no-deprecated
|
|
304
278
|
this.collabWindow = new mergeTreeNodes_js_1.CollaborationWindow();
|
|
305
|
-
// eslint-disable-next-line import/no-deprecated
|
|
306
279
|
this.pendingSegments = new index_js_1.DoublyLinkedList();
|
|
307
280
|
this.segmentsToScour = new internal_1.Heap(LRUSegmentComparer);
|
|
308
281
|
/**
|
|
@@ -320,6 +293,7 @@ class MergeTree {
|
|
|
320
293
|
return {};
|
|
321
294
|
}
|
|
322
295
|
const next = segment.splitAt(pos);
|
|
296
|
+
(0, mergeTreeNodes_js_1.assertSegmentLeaf)(next);
|
|
323
297
|
if (segment?.segmentGroups) {
|
|
324
298
|
next.segmentGroups ?? (next.segmentGroups = new segmentGroupCollection_js_1.SegmentGroupCollection(next));
|
|
325
299
|
segment.segmentGroups.copyTo(next.segmentGroups);
|
|
@@ -363,8 +337,8 @@ class MergeTree {
|
|
|
363
337
|
* numbers corresponding to un-acked operations give valid results.
|
|
364
338
|
*/
|
|
365
339
|
localNetLength(segment, refSeq, localSeq) {
|
|
366
|
-
const removalInfo = (0,
|
|
367
|
-
const moveInfo = (0,
|
|
340
|
+
const removalInfo = (0, segmentInfos_js_1.toRemovalInfo)(segment);
|
|
341
|
+
const moveInfo = (0, segmentInfos_js_1.toMoveInfo)(segment);
|
|
368
342
|
if (localSeq === undefined) {
|
|
369
343
|
if (removalInfo !== undefined || moveInfo !== undefined) {
|
|
370
344
|
if ((!!removalInfo && !(0, mergeTreeNodes_js_1.seqLTE)(removalInfo.removedSeq, this.collabWindow.minSeq)) ||
|
|
@@ -382,7 +356,9 @@ class MergeTree {
|
|
|
382
356
|
}
|
|
383
357
|
(0, internal_1.assert)(refSeq !== undefined, 0x398 /* localSeq provided for local length without refSeq */);
|
|
384
358
|
(0, internal_1.assert)(segment.seq !== undefined, 0x399 /* segment with no seq in mergeTree */);
|
|
385
|
-
const { seq
|
|
359
|
+
const { seq } = segment;
|
|
360
|
+
const { removedSeq, localRemovedSeq } = removalInfo ?? {};
|
|
361
|
+
const { movedSeq, localMovedSeq } = moveInfo ?? {};
|
|
386
362
|
if (seq === constants_js_1.UnassignedSequenceNumber) {
|
|
387
363
|
(0, internal_1.assert)(segment.localSeq !== undefined, 0x39a /* unacked segment with undefined localSeq */);
|
|
388
364
|
// inserted locally, still un-acked
|
|
@@ -418,7 +394,7 @@ class MergeTree {
|
|
|
418
394
|
}
|
|
419
395
|
addNode(block, node) {
|
|
420
396
|
const index = block.childCount++;
|
|
421
|
-
|
|
397
|
+
(0, mergeTreeNodes_js_1.assignChild)(block, node, index, false);
|
|
422
398
|
return index;
|
|
423
399
|
}
|
|
424
400
|
reloadFromSegments(segments) {
|
|
@@ -512,12 +488,12 @@ class MergeTree {
|
|
|
512
488
|
(0, internal_1.assert)(localSeq === undefined || clientId === this.collabWindow.clientId, 0x39b /* localSeq provided for non-local client */);
|
|
513
489
|
let segment;
|
|
514
490
|
let offset;
|
|
515
|
-
const leaf = (leafSeg,
|
|
491
|
+
const leaf = (leafSeg, _, start) => {
|
|
516
492
|
segment = leafSeg;
|
|
517
493
|
offset = start;
|
|
518
494
|
return false;
|
|
519
495
|
};
|
|
520
|
-
this.nodeMap(refSeq, clientId, leaf, undefined,
|
|
496
|
+
this.nodeMap(refSeq, clientId, leaf, undefined, pos, pos + 1, localSeq);
|
|
521
497
|
return { segment, offset };
|
|
522
498
|
}
|
|
523
499
|
/**
|
|
@@ -652,7 +628,6 @@ class MergeTree {
|
|
|
652
628
|
if (this.localPartialsComputed) {
|
|
653
629
|
return;
|
|
654
630
|
}
|
|
655
|
-
// eslint-disable-next-line import/no-deprecated
|
|
656
631
|
const rebaseCollabWindow = new mergeTreeNodes_js_1.CollaborationWindow();
|
|
657
632
|
rebaseCollabWindow.loadFrom(this.collabWindow);
|
|
658
633
|
if (refSeq < this.collabWindow.minSeq) {
|
|
@@ -682,8 +657,8 @@ class MergeTree {
|
|
|
682
657
|
// Sequence number within window
|
|
683
658
|
if (node.isLeaf()) {
|
|
684
659
|
const segment = node;
|
|
685
|
-
const removalInfo = (0,
|
|
686
|
-
const moveInfo = (0,
|
|
660
|
+
const removalInfo = (0, segmentInfos_js_1.toRemovalInfo)(segment);
|
|
661
|
+
const moveInfo = (0, segmentInfos_js_1.toMoveInfo)(segment);
|
|
687
662
|
if (removalInfo !== undefined) {
|
|
688
663
|
if ((0, mergeTreeNodes_js_1.seqLTE)(removalInfo.removedSeq, this.collabWindow.minSeq)) {
|
|
689
664
|
return undefined;
|
|
@@ -736,24 +711,26 @@ class MergeTree {
|
|
|
736
711
|
*/
|
|
737
712
|
referencePositionToLocalPosition(refPos, refSeq = Number.MAX_SAFE_INTEGER, clientId = this.collabWindow.clientId, localSeq = this.collabWindow.localSeq) {
|
|
738
713
|
const seg = refPos.getSegment();
|
|
739
|
-
if (
|
|
714
|
+
if (!(0, mergeTreeNodes_js_1.isSegmentLeaf)(seg)) {
|
|
740
715
|
// We have no idea where this reference is, because it refers to a segment which is not in the tree.
|
|
741
716
|
return referencePositions_js_1.DetachedReferencePosition;
|
|
742
717
|
}
|
|
743
718
|
if (refPos.isLeaf()) {
|
|
744
|
-
return this.getPosition(
|
|
719
|
+
return this.getPosition(seg, refSeq, clientId, localSeq);
|
|
745
720
|
}
|
|
746
721
|
if ((0, referencePositions_js_1.refTypeIncludesFlag)(refPos, ops_js_1.ReferenceType.Transient) || seg.localRefs?.has(refPos)) {
|
|
747
722
|
if (seg !== this.startOfTree &&
|
|
748
723
|
seg !== this.endOfTree &&
|
|
749
724
|
!(0, perspective_js_1.isSegmentPresent)(seg, { refSeq, localSeq })) {
|
|
750
725
|
const forward = refPos.slidingPreference === localReference_js_1.SlidingPreference.FORWARD;
|
|
751
|
-
const
|
|
752
|
-
|
|
753
|
-
|
|
754
|
-
|
|
726
|
+
const moveInfo = (0, segmentInfos_js_1.toMoveInfo)(seg);
|
|
727
|
+
const removeInfo = (0, segmentInfos_js_1.toRemovalInfo)(seg);
|
|
728
|
+
const slideSeq = moveInfo !== undefined && moveInfo.movedSeq !== constants_js_1.UnassignedSequenceNumber
|
|
729
|
+
? moveInfo.movedSeq
|
|
730
|
+
: removeInfo !== undefined && removeInfo.removedSeq !== constants_js_1.UnassignedSequenceNumber
|
|
731
|
+
? removeInfo.removedSeq
|
|
755
732
|
: refSeq;
|
|
756
|
-
const slideLocalSeq =
|
|
733
|
+
const slideLocalSeq = moveInfo?.localMovedSeq ?? removeInfo?.localRemovedSeq;
|
|
757
734
|
const perspective = new perspective_js_1.PerspectiveImpl(this, {
|
|
758
735
|
refSeq: slideSeq,
|
|
759
736
|
localSeq: slideLocalSeq,
|
|
@@ -781,11 +758,10 @@ class MergeTree {
|
|
|
781
758
|
searchForMarker(startPos, clientId, markerLabel, forwards = true) {
|
|
782
759
|
let foundMarker;
|
|
783
760
|
const { segment } = this.getContainingSegment(startPos, constants_js_1.UniversalSequenceNumber, clientId);
|
|
784
|
-
|
|
785
|
-
if (segWithParent?.parent === undefined) {
|
|
761
|
+
if (!(0, mergeTreeNodes_js_1.isSegmentLeaf)(segment)) {
|
|
786
762
|
return undefined;
|
|
787
763
|
}
|
|
788
|
-
(0, mergeTreeNodeWalk_js_1.depthFirstNodeWalk)(
|
|
764
|
+
(0, mergeTreeNodeWalk_js_1.depthFirstNodeWalk)(segment.parent, segment, (node) => {
|
|
789
765
|
if (node.isLeaf()) {
|
|
790
766
|
if (mergeTreeNodes_js_1.Marker.is(node) && (0, referencePositions_js_1.refHasTileLabel)(node, markerLabel)) {
|
|
791
767
|
foundMarker = node;
|
|
@@ -807,8 +783,8 @@ class MergeTree {
|
|
|
807
783
|
updateRoot(splitNode) {
|
|
808
784
|
if (splitNode !== undefined) {
|
|
809
785
|
const newRoot = this.makeBlock(2);
|
|
810
|
-
|
|
811
|
-
|
|
786
|
+
(0, mergeTreeNodes_js_1.assignChild)(newRoot, this.root, 0, false);
|
|
787
|
+
(0, mergeTreeNodes_js_1.assignChild)(newRoot, splitNode, 1, false);
|
|
812
788
|
this.root = newRoot;
|
|
813
789
|
this.nodeUpdateOrdinals(this.root);
|
|
814
790
|
this.nodeUpdateLengthNewStructure(this.root);
|
|
@@ -864,9 +840,7 @@ class MergeTree {
|
|
|
864
840
|
(0, zamboni_js_1.zamboniSegments)(this);
|
|
865
841
|
}
|
|
866
842
|
}
|
|
867
|
-
addToPendingList(segment,
|
|
868
|
-
// eslint-disable-next-line import/no-deprecated
|
|
869
|
-
segmentGroup, localSeq, previousProps) {
|
|
843
|
+
addToPendingList(segment, segmentGroup, localSeq, previousProps) {
|
|
870
844
|
let _segmentGroup = segmentGroup;
|
|
871
845
|
if (_segmentGroup === undefined) {
|
|
872
846
|
_segmentGroup = {
|
|
@@ -886,7 +860,6 @@ class MergeTree {
|
|
|
886
860
|
if (previousProps) {
|
|
887
861
|
_segmentGroup.previousProps.push(previousProps);
|
|
888
862
|
}
|
|
889
|
-
// eslint-disable-next-line import/no-deprecated
|
|
890
863
|
const segmentGroups = (segment.segmentGroups ?? (segment.segmentGroups = new segmentGroupCollection_js_1.SegmentGroupCollection(segment)));
|
|
891
864
|
segmentGroups.enqueue(_segmentGroup);
|
|
892
865
|
return _segmentGroup;
|
|
@@ -895,8 +868,8 @@ class MergeTree {
|
|
|
895
868
|
getMarkerFromId(id) {
|
|
896
869
|
const marker = this.idToMarker.get(id);
|
|
897
870
|
return marker === undefined ||
|
|
898
|
-
isRemoved(marker) ||
|
|
899
|
-
(isMoved(marker) && marker.moveDst === undefined)
|
|
871
|
+
(0, segmentInfos_js_1.isRemoved)(marker) ||
|
|
872
|
+
((0, segmentInfos_js_1.isMoved)(marker) && marker.moveDst === undefined)
|
|
900
873
|
? undefined
|
|
901
874
|
: marker;
|
|
902
875
|
}
|
|
@@ -913,7 +886,7 @@ class MergeTree {
|
|
|
913
886
|
if (relativePos.id) {
|
|
914
887
|
marker = this.getMarkerFromId(relativePos.id);
|
|
915
888
|
}
|
|
916
|
-
if (marker) {
|
|
889
|
+
if ((0, mergeTreeNodes_js_1.isSegmentLeaf)(marker)) {
|
|
917
890
|
pos = this.getPosition(marker, refseq, clientId);
|
|
918
891
|
if (relativePos.before) {
|
|
919
892
|
if (relativePos.offset !== undefined) {
|
|
@@ -936,7 +909,7 @@ class MergeTree {
|
|
|
936
909
|
// opArgs == undefined => loading snapshot or test code
|
|
937
910
|
if (opArgs !== undefined) {
|
|
938
911
|
const deltaSegments = segments
|
|
939
|
-
.filter((segment) => !(0,
|
|
912
|
+
.filter((segment) => !(0, segmentInfos_js_1.toMoveInfo)(segment))
|
|
940
913
|
.map((segment) => ({ segment }));
|
|
941
914
|
if (deltaSegments.length > 0) {
|
|
942
915
|
this.mergeTreeDeltaCallback?.(opArgs, {
|
|
@@ -971,7 +944,7 @@ class MergeTree {
|
|
|
971
944
|
}
|
|
972
945
|
const segmentInfo = this.getContainingSegment(remoteClientPosition, remoteClientRefSeq, remoteClientId);
|
|
973
946
|
const { currentSeq, clientId } = this.collabWindow;
|
|
974
|
-
if (segmentInfo?.segment) {
|
|
947
|
+
if ((0, mergeTreeNodes_js_1.isSegmentLeaf)(segmentInfo?.segment)) {
|
|
975
948
|
const segmentPosition = this.getPosition(segmentInfo.segment, currentSeq, clientId);
|
|
976
949
|
return segmentPosition + segmentInfo.offset;
|
|
977
950
|
}
|
|
@@ -992,7 +965,6 @@ class MergeTree {
|
|
|
992
965
|
});
|
|
993
966
|
return siblingExists;
|
|
994
967
|
};
|
|
995
|
-
// eslint-disable-next-line import/no-deprecated
|
|
996
968
|
let segmentGroup;
|
|
997
969
|
const saveIfLocal = (locSegment) => {
|
|
998
970
|
// Save segment so we can assign sequence number when acked by server
|
|
@@ -1022,93 +994,95 @@ class MergeTree {
|
|
|
1022
994
|
}
|
|
1023
995
|
return segmentChanges;
|
|
1024
996
|
};
|
|
997
|
+
const insertInfo = {
|
|
998
|
+
clientId,
|
|
999
|
+
seq,
|
|
1000
|
+
localSeq,
|
|
1001
|
+
};
|
|
1025
1002
|
// TODO: build tree from segs and insert all at once
|
|
1026
1003
|
let insertPos = pos;
|
|
1027
|
-
for (const newSegment of newSegments
|
|
1028
|
-
|
|
1029
|
-
|
|
1030
|
-
|
|
1031
|
-
|
|
1032
|
-
if (
|
|
1033
|
-
|
|
1034
|
-
if (markerId) {
|
|
1035
|
-
this.idToMarker.set(markerId, newSegment);
|
|
1036
|
-
}
|
|
1004
|
+
for (const newSegment of newSegments
|
|
1005
|
+
.filter((s) => s.cachedLength > 0)
|
|
1006
|
+
.map((s) => (0, segmentInfos_js_1.overwriteInfo)(s, insertInfo))) {
|
|
1007
|
+
if (mergeTreeNodes_js_1.Marker.is(newSegment)) {
|
|
1008
|
+
const markerId = newSegment.getId();
|
|
1009
|
+
if (markerId) {
|
|
1010
|
+
this.idToMarker.set(markerId, newSegment);
|
|
1037
1011
|
}
|
|
1038
|
-
|
|
1039
|
-
|
|
1040
|
-
|
|
1041
|
-
|
|
1012
|
+
}
|
|
1013
|
+
const splitNode = this.insertingWalk(this.root, insertPos, refSeq, clientId, seq, {
|
|
1014
|
+
leaf: onLeaf,
|
|
1015
|
+
candidateSegment: newSegment,
|
|
1016
|
+
continuePredicate: continueFrom,
|
|
1017
|
+
});
|
|
1018
|
+
if (!(0, mergeTreeNodes_js_1.isSegmentLeaf)(newSegment)) {
|
|
1019
|
+
// Indicates an attempt to insert past the end of the merge-tree's content.
|
|
1020
|
+
const errorConstructor = localSeq === undefined ? internal_2.DataProcessingError : internal_2.UsageError;
|
|
1021
|
+
throw new errorConstructor("MergeTree insert failed", {
|
|
1022
|
+
currentSeq: this.collabWindow.currentSeq,
|
|
1023
|
+
minSeq: this.collabWindow.minSeq,
|
|
1024
|
+
segSeq: insertInfo.seq,
|
|
1042
1025
|
});
|
|
1043
|
-
|
|
1044
|
-
|
|
1045
|
-
|
|
1046
|
-
|
|
1047
|
-
|
|
1048
|
-
|
|
1049
|
-
|
|
1050
|
-
|
|
1051
|
-
|
|
1052
|
-
|
|
1053
|
-
|
|
1054
|
-
|
|
1055
|
-
|
|
1056
|
-
|
|
1057
|
-
|
|
1058
|
-
|
|
1059
|
-
|
|
1060
|
-
|
|
1061
|
-
|
|
1062
|
-
|
|
1063
|
-
|
|
1064
|
-
|
|
1065
|
-
|
|
1066
|
-
|
|
1067
|
-
|
|
1068
|
-
|
|
1069
|
-
|
|
1070
|
-
? Number.MAX_SAFE_INTEGER - this.collabWindow.localSeq + ob.localSeq
|
|
1071
|
-
: ob.seq;
|
|
1072
|
-
if (normalizedObSeq > refSeq) {
|
|
1073
|
-
if (oldest === undefined || normalizedOldestSeq > normalizedObSeq) {
|
|
1074
|
-
normalizedOldestSeq = normalizedObSeq;
|
|
1075
|
-
oldest = ob;
|
|
1076
|
-
movedClientIds.unshift(ob.clientId);
|
|
1077
|
-
movedSeqs.unshift(ob.seq);
|
|
1078
|
-
}
|
|
1079
|
-
else {
|
|
1080
|
-
movedClientIds.push(ob.clientId);
|
|
1081
|
-
movedSeqs.push(ob.seq);
|
|
1082
|
-
}
|
|
1083
|
-
if (newest === undefined || normalizedNewestSeq < normalizedObSeq) {
|
|
1084
|
-
normalizedNewestSeq = normalizedObSeq;
|
|
1085
|
-
newest = ob;
|
|
1086
|
-
}
|
|
1026
|
+
}
|
|
1027
|
+
this.updateRoot(splitNode);
|
|
1028
|
+
insertPos += newSegment.cachedLength;
|
|
1029
|
+
if (!this.options?.mergeTreeEnableObliterate || this.obliterates.empty()) {
|
|
1030
|
+
saveIfLocal(newSegment);
|
|
1031
|
+
continue;
|
|
1032
|
+
}
|
|
1033
|
+
let oldest;
|
|
1034
|
+
let normalizedOldestSeq = 0;
|
|
1035
|
+
let newest;
|
|
1036
|
+
let normalizedNewestSeq = 0;
|
|
1037
|
+
const movedClientIds = [];
|
|
1038
|
+
const movedSeqs = [];
|
|
1039
|
+
for (const ob of this.obliterates.findOverlapping(newSegment)) {
|
|
1040
|
+
// compute a normalized seq that takes into account local seqs
|
|
1041
|
+
// but is still comparable to remote seqs to keep the checks below easy
|
|
1042
|
+
// REMOTE SEQUENCE NUMBERS LOCAL SEQUENCE NUMBERS
|
|
1043
|
+
// [0, 1, 2, 3, ..., 100, ..., 1000, ..., (MAX - MaxLocalSeq), L1, L2, L3, L4, ..., L100, ..., L1000, ...(MAX)]
|
|
1044
|
+
const normalizedObSeq = ob.seq === constants_js_1.UnassignedSequenceNumber
|
|
1045
|
+
? Number.MAX_SAFE_INTEGER - this.collabWindow.localSeq + ob.localSeq
|
|
1046
|
+
: ob.seq;
|
|
1047
|
+
if (normalizedObSeq > refSeq) {
|
|
1048
|
+
if (oldest === undefined || normalizedOldestSeq > normalizedObSeq) {
|
|
1049
|
+
normalizedOldestSeq = normalizedObSeq;
|
|
1050
|
+
oldest = ob;
|
|
1051
|
+
movedClientIds.unshift(ob.clientId);
|
|
1052
|
+
movedSeqs.unshift(ob.seq);
|
|
1087
1053
|
}
|
|
1088
|
-
|
|
1089
|
-
|
|
1090
|
-
|
|
1091
|
-
const moveInfo = {
|
|
1092
|
-
movedClientIds,
|
|
1093
|
-
movedSeq: oldest.seq,
|
|
1094
|
-
movedSeqs,
|
|
1095
|
-
localMovedSeq: oldest.localSeq,
|
|
1096
|
-
wasMovedOnInsert: oldest.seq !== constants_js_1.UnassignedSequenceNumber,
|
|
1097
|
-
};
|
|
1098
|
-
markSegmentMoved(newSegment, moveInfo);
|
|
1099
|
-
if (moveInfo.localMovedSeq !== undefined) {
|
|
1100
|
-
(0, internal_1.assert)(oldest.segmentGroup !== undefined, 0x86c /* expected segment group to exist */);
|
|
1101
|
-
this.addToPendingList(newSegment, oldest.segmentGroup);
|
|
1054
|
+
else {
|
|
1055
|
+
movedClientIds.push(ob.clientId);
|
|
1056
|
+
movedSeqs.push(ob.seq);
|
|
1102
1057
|
}
|
|
1103
|
-
if (
|
|
1104
|
-
|
|
1058
|
+
if (newest === undefined || normalizedNewestSeq < normalizedObSeq) {
|
|
1059
|
+
normalizedNewestSeq = normalizedObSeq;
|
|
1060
|
+
newest = ob;
|
|
1105
1061
|
}
|
|
1106
1062
|
}
|
|
1107
|
-
|
|
1108
|
-
|
|
1063
|
+
}
|
|
1064
|
+
if (oldest && newest?.clientId !== clientId) {
|
|
1065
|
+
// eslint-disable-next-line import/no-deprecated
|
|
1066
|
+
const moveInfo = {
|
|
1067
|
+
movedClientIds,
|
|
1068
|
+
movedSeq: oldest.seq,
|
|
1069
|
+
movedSeqs,
|
|
1070
|
+
localMovedSeq: oldest.localSeq,
|
|
1071
|
+
wasMovedOnInsert: oldest.seq !== constants_js_1.UnassignedSequenceNumber,
|
|
1072
|
+
};
|
|
1073
|
+
(0, segmentInfos_js_1.overwriteInfo)(newSegment, moveInfo);
|
|
1074
|
+
if (moveInfo.localMovedSeq !== undefined) {
|
|
1075
|
+
(0, internal_1.assert)(oldest.segmentGroup !== undefined, 0x86c /* expected segment group to exist */);
|
|
1076
|
+
this.addToPendingList(newSegment, oldest.segmentGroup);
|
|
1109
1077
|
}
|
|
1110
|
-
|
|
1078
|
+
if (newSegment.parent) {
|
|
1079
|
+
this.blockUpdatePathLengths(newSegment.parent, seq, clientId);
|
|
1080
|
+
}
|
|
1081
|
+
}
|
|
1082
|
+
else if (oldest && newest?.clientId === clientId) {
|
|
1083
|
+
newSegment.prevObliterateByInserter = newest;
|
|
1111
1084
|
}
|
|
1085
|
+
saveIfLocal(newSegment);
|
|
1112
1086
|
}
|
|
1113
1087
|
}
|
|
1114
1088
|
ensureIntervalBoundary(pos, refSeq, clientId) {
|
|
@@ -1129,10 +1103,8 @@ class MergeTree {
|
|
|
1129
1103
|
const newSeq = seq === constants_js_1.UnassignedSequenceNumber ? Number.MAX_SAFE_INTEGER : seq;
|
|
1130
1104
|
const segSeq = node.seq === constants_js_1.UnassignedSequenceNumber ? Number.MAX_SAFE_INTEGER - 1 : (node.seq ?? 0);
|
|
1131
1105
|
return (newSeq > segSeq ||
|
|
1132
|
-
(node.movedSeq !==
|
|
1133
|
-
|
|
1134
|
-
node.movedSeq > seq) ||
|
|
1135
|
-
(node.removedSeq !== undefined &&
|
|
1106
|
+
((0, segmentInfos_js_1.isMoved)(node) && node.movedSeq !== constants_js_1.UnassignedSequenceNumber && node.movedSeq > seq) ||
|
|
1107
|
+
((0, segmentInfos_js_1.isRemoved)(node) &&
|
|
1136
1108
|
node.removedSeq !== constants_js_1.UnassignedSequenceNumber &&
|
|
1137
1109
|
node.removedSeq > seq));
|
|
1138
1110
|
}
|
|
@@ -1164,7 +1136,7 @@ class MergeTree {
|
|
|
1164
1136
|
const segment = child;
|
|
1165
1137
|
const segmentChanges = context.leaf(segment, _pos, context);
|
|
1166
1138
|
if (segmentChanges.replaceCurrent) {
|
|
1167
|
-
|
|
1139
|
+
(0, mergeTreeNodes_js_1.assignChild)(block, segmentChanges.replaceCurrent, childIndex, false);
|
|
1168
1140
|
segmentChanges.replaceCurrent.ordinal = child.ordinal;
|
|
1169
1141
|
}
|
|
1170
1142
|
if (segmentChanges.next) {
|
|
@@ -1215,7 +1187,7 @@ class MergeTree {
|
|
|
1215
1187
|
block.children[i] = block.children[i - 1];
|
|
1216
1188
|
block.children[i].index = i;
|
|
1217
1189
|
}
|
|
1218
|
-
|
|
1190
|
+
(0, mergeTreeNodes_js_1.assignChild)(block, newNode, childIndex, false);
|
|
1219
1191
|
block.childCount++;
|
|
1220
1192
|
block.setOrdinal(newNode, childIndex);
|
|
1221
1193
|
if (block.childCount < mergeTreeNodes_js_1.MaxNodesInBlock) {
|
|
@@ -1244,7 +1216,7 @@ class MergeTree {
|
|
|
1244
1216
|
// Update ordinals to reflect lowered child count
|
|
1245
1217
|
this.nodeUpdateOrdinals(node);
|
|
1246
1218
|
for (let i = 0; i < halfCount; i++) {
|
|
1247
|
-
|
|
1219
|
+
(0, mergeTreeNodes_js_1.assignChild)(newNode, node.children[halfCount + i], i, false);
|
|
1248
1220
|
node.children[halfCount + i] = undefined;
|
|
1249
1221
|
}
|
|
1250
1222
|
this.nodeUpdateLengthNewStructure(node);
|
|
@@ -1271,9 +1243,7 @@ class MergeTree {
|
|
|
1271
1243
|
* @param opArgs - The op args for the annotate op. this is passed to the merge tree callback if there is one
|
|
1272
1244
|
* @param rollback - Whether this is for a local rollback and what kind
|
|
1273
1245
|
*/
|
|
1274
|
-
annotateRange(start, end, propsOrAdjust, refSeq, clientId, seq, opArgs,
|
|
1275
|
-
// eslint-disable-next-line import/no-deprecated
|
|
1276
|
-
rollback = segmentPropertiesManager_js_1.PropertiesRollback.None) {
|
|
1246
|
+
annotateRange(start, end, propsOrAdjust, refSeq, clientId, seq, opArgs, rollback = segmentPropertiesManager_js_1.PropertiesRollback.None) {
|
|
1277
1247
|
if (propsOrAdjust.adjust !== undefined) {
|
|
1278
1248
|
errorIfOptionNotTrue(this.options, "mergeTreeEnableAnnotateAdjust");
|
|
1279
1249
|
}
|
|
@@ -1281,7 +1251,6 @@ class MergeTree {
|
|
|
1281
1251
|
this.ensureIntervalBoundary(end, refSeq, clientId);
|
|
1282
1252
|
const deltaSegments = [];
|
|
1283
1253
|
const localSeq = seq === constants_js_1.UnassignedSequenceNumber ? ++this.collabWindow.localSeq : undefined;
|
|
1284
|
-
// eslint-disable-next-line import/no-deprecated
|
|
1285
1254
|
let segmentGroup;
|
|
1286
1255
|
const opObj = propsOrAdjust.props ?? propsOrAdjust.adjust;
|
|
1287
1256
|
const annotateSegment = (segment) => {
|
|
@@ -1305,7 +1274,7 @@ class MergeTree {
|
|
|
1305
1274
|
}
|
|
1306
1275
|
return true;
|
|
1307
1276
|
};
|
|
1308
|
-
this.nodeMap(refSeq, clientId, annotateSegment, undefined,
|
|
1277
|
+
this.nodeMap(refSeq, clientId, annotateSegment, undefined, start, end);
|
|
1309
1278
|
// OpArgs == undefined => test code
|
|
1310
1279
|
if (deltaSegments.length > 0) {
|
|
1311
1280
|
this.mergeTreeDeltaCallback?.(opArgs, {
|
|
@@ -1326,9 +1295,9 @@ class MergeTree {
|
|
|
1326
1295
|
this.ensureIntervalBoundary(endPos, refSeq, clientId);
|
|
1327
1296
|
let _overwrite = false;
|
|
1328
1297
|
const localOverlapWithRefs = [];
|
|
1298
|
+
// eslint-disable-next-line import/no-deprecated
|
|
1329
1299
|
const movedSegments = [];
|
|
1330
1300
|
const localSeq = seq === constants_js_1.UnassignedSequenceNumber ? ++this.collabWindow.localSeq : undefined;
|
|
1331
|
-
// eslint-disable-next-line import/no-deprecated
|
|
1332
1301
|
const obliterate = {
|
|
1333
1302
|
clientId,
|
|
1334
1303
|
end: (0, localReference_js_1.createDetachedLocalReferencePosition)(undefined),
|
|
@@ -1340,7 +1309,7 @@ class MergeTree {
|
|
|
1340
1309
|
};
|
|
1341
1310
|
const { segment: startSeg } = this.getContainingSegment(start.pos, refSeq, clientId);
|
|
1342
1311
|
const { segment: endSeg } = this.getContainingSegment(end.pos, refSeq, clientId);
|
|
1343
|
-
(0, internal_1.assert)(startSeg
|
|
1312
|
+
(0, internal_1.assert)((0, mergeTreeNodes_js_1.isSegmentLeaf)(startSeg) && (0, mergeTreeNodes_js_1.isSegmentLeaf)(endSeg), 0xa3f /* segments cannot be undefined */);
|
|
1344
1313
|
obliterate.start = this.createLocalReferencePosition(startSeg, start.side === sequencePlace_js_1.Side.Before ? 0 : Math.max(startSeg.cachedLength - 1, 0), ops_js_1.ReferenceType.StayOnRemove, {
|
|
1345
1314
|
obliterate,
|
|
1346
1315
|
});
|
|
@@ -1361,7 +1330,7 @@ class MergeTree {
|
|
|
1361
1330
|
this.pendingSegments.push(obliterate.segmentGroup);
|
|
1362
1331
|
}
|
|
1363
1332
|
this.obliterates.addOrUpdate(obliterate);
|
|
1364
|
-
const markMoved = (segment, pos
|
|
1333
|
+
const markMoved = (segment, pos) => {
|
|
1365
1334
|
if ((start.side === sequencePlace_js_1.Side.After && startPos === pos + segment.cachedLength) || // exclusive start segment
|
|
1366
1335
|
(end.side === sequencePlace_js_1.Side.Before &&
|
|
1367
1336
|
endPos === pos &&
|
|
@@ -1371,30 +1340,34 @@ class MergeTree {
|
|
|
1371
1340
|
// These segments are outside of the obliteration range though, so return true to keep walking.
|
|
1372
1341
|
return true;
|
|
1373
1342
|
}
|
|
1374
|
-
const existingMoveInfo = (0,
|
|
1343
|
+
const existingMoveInfo = (0, segmentInfos_js_1.toMoveInfo)(segment);
|
|
1375
1344
|
if (segment.prevObliterateByInserter?.seq === constants_js_1.UnassignedSequenceNumber) {
|
|
1376
1345
|
// We chose to not obliterate this segment because we are aware of an unacked local obliteration.
|
|
1377
1346
|
// The local obliterate has not been sequenced yet, so it is still the newest obliterate we are aware of.
|
|
1378
1347
|
// Other clients will also choose not to obliterate this segment because the most recent obliteration has the same clientId
|
|
1379
1348
|
return true;
|
|
1380
1349
|
}
|
|
1381
|
-
|
|
1350
|
+
const wasMovedOnInsert = clientId !== segment.clientId &&
|
|
1382
1351
|
segment.seq !== undefined &&
|
|
1383
1352
|
seq !== constants_js_1.UnassignedSequenceNumber &&
|
|
1384
|
-
(refSeq < segment.seq || segment.seq === constants_js_1.UnassignedSequenceNumber)
|
|
1385
|
-
segment.wasMovedOnInsert = true;
|
|
1386
|
-
}
|
|
1353
|
+
(refSeq < segment.seq || segment.seq === constants_js_1.UnassignedSequenceNumber);
|
|
1387
1354
|
if (existingMoveInfo === undefined) {
|
|
1388
|
-
|
|
1389
|
-
|
|
1390
|
-
|
|
1391
|
-
|
|
1392
|
-
|
|
1393
|
-
|
|
1355
|
+
// eslint-disable-next-line import/no-deprecated
|
|
1356
|
+
const movedSeg = (0, segmentInfos_js_1.overwriteInfo)(segment, {
|
|
1357
|
+
movedClientIds: [clientId],
|
|
1358
|
+
movedSeq: seq,
|
|
1359
|
+
localMovedSeq: localSeq,
|
|
1360
|
+
movedSeqs: [seq],
|
|
1361
|
+
wasMovedOnInsert,
|
|
1362
|
+
});
|
|
1363
|
+
if (!(0, segmentInfos_js_1.toRemovalInfo)(movedSeg)) {
|
|
1364
|
+
movedSegments.push(movedSeg);
|
|
1394
1365
|
}
|
|
1395
1366
|
}
|
|
1396
1367
|
else {
|
|
1397
1368
|
_overwrite = true;
|
|
1369
|
+
// never move wasMovedOnInsert from true to false
|
|
1370
|
+
existingMoveInfo.wasMovedOnInsert || (existingMoveInfo.wasMovedOnInsert = wasMovedOnInsert);
|
|
1398
1371
|
if (existingMoveInfo.movedSeq === constants_js_1.UnassignedSequenceNumber) {
|
|
1399
1372
|
// we moved this locally, but someone else moved it first
|
|
1400
1373
|
// so put them at the head of the list
|
|
@@ -1413,6 +1386,7 @@ class MergeTree {
|
|
|
1413
1386
|
existingMoveInfo.movedSeqs.push(seq);
|
|
1414
1387
|
}
|
|
1415
1388
|
}
|
|
1389
|
+
(0, segmentInfos_js_1.assertMoved)(segment);
|
|
1416
1390
|
// Save segment so can assign moved sequence number when acked by server
|
|
1417
1391
|
if (this.collabWindow.collaborating) {
|
|
1418
1392
|
if (segment.movedSeq === constants_js_1.UnassignedSequenceNumber &&
|
|
@@ -1427,7 +1401,7 @@ class MergeTree {
|
|
|
1427
1401
|
}
|
|
1428
1402
|
return true;
|
|
1429
1403
|
};
|
|
1430
|
-
const afterMarkMoved = (node
|
|
1404
|
+
const afterMarkMoved = (node) => {
|
|
1431
1405
|
if (_overwrite) {
|
|
1432
1406
|
this.nodeUpdateLengthNewStructure(node);
|
|
1433
1407
|
}
|
|
@@ -1436,21 +1410,21 @@ class MergeTree {
|
|
|
1436
1410
|
}
|
|
1437
1411
|
return true;
|
|
1438
1412
|
};
|
|
1439
|
-
this.nodeMap(refSeq, clientId, markMoved,
|
|
1413
|
+
this.nodeMap(refSeq, clientId, markMoved, afterMarkMoved, start.pos, end.pos + 1, // include the segment containing the end reference
|
|
1440
1414
|
undefined, seq === constants_js_1.UnassignedSequenceNumber ? undefined : seq);
|
|
1441
1415
|
this.slideAckedRemovedSegmentReferences(localOverlapWithRefs);
|
|
1442
1416
|
// opArgs == undefined => test code
|
|
1443
1417
|
if (start.pos !== end.pos || start.side !== end.side) {
|
|
1444
1418
|
this.mergeTreeDeltaCallback?.(opArgs, {
|
|
1445
1419
|
operation: ops_js_1.MergeTreeDeltaType.OBLITERATE,
|
|
1446
|
-
deltaSegments: movedSegments,
|
|
1420
|
+
deltaSegments: movedSegments.map((segment) => ({ segment })),
|
|
1447
1421
|
});
|
|
1448
1422
|
}
|
|
1449
1423
|
// these events are newly removed
|
|
1450
1424
|
// so we slide after eventing in case the consumer wants to make reference
|
|
1451
1425
|
// changes at remove time, like add a ref to track undo redo.
|
|
1452
1426
|
if (!this.collabWindow.collaborating || clientId !== this.collabWindow.clientId) {
|
|
1453
|
-
this.slideAckedRemovedSegmentReferences(movedSegments
|
|
1427
|
+
this.slideAckedRemovedSegmentReferences(movedSegments);
|
|
1454
1428
|
}
|
|
1455
1429
|
if (this.collabWindow.collaborating &&
|
|
1456
1430
|
seq !== constants_js_1.UnassignedSequenceNumber &&
|
|
@@ -1473,19 +1447,22 @@ class MergeTree {
|
|
|
1473
1447
|
let _overwrite = false;
|
|
1474
1448
|
this.ensureIntervalBoundary(start, refSeq, clientId);
|
|
1475
1449
|
this.ensureIntervalBoundary(end, refSeq, clientId);
|
|
1476
|
-
// eslint-disable-next-line import/no-deprecated
|
|
1477
1450
|
let segmentGroup;
|
|
1451
|
+
// eslint-disable-next-line import/no-deprecated
|
|
1478
1452
|
const removedSegments = [];
|
|
1479
1453
|
const localOverlapWithRefs = [];
|
|
1480
1454
|
const localSeq = seq === constants_js_1.UnassignedSequenceNumber ? ++this.collabWindow.localSeq : undefined;
|
|
1481
1455
|
const markRemoved = (segment, pos, _start, _end) => {
|
|
1482
|
-
const existingRemovalInfo = (0,
|
|
1456
|
+
const existingRemovalInfo = (0, segmentInfos_js_1.toRemovalInfo)(segment);
|
|
1483
1457
|
if (existingRemovalInfo === undefined) {
|
|
1484
|
-
|
|
1485
|
-
|
|
1486
|
-
|
|
1487
|
-
|
|
1488
|
-
|
|
1458
|
+
// eslint-disable-next-line import/no-deprecated
|
|
1459
|
+
const removed = (0, segmentInfos_js_1.overwriteInfo)(segment, {
|
|
1460
|
+
removedClientIds: [clientId],
|
|
1461
|
+
removedSeq: seq,
|
|
1462
|
+
localRemovedSeq: localSeq,
|
|
1463
|
+
});
|
|
1464
|
+
if (!(0, segmentInfos_js_1.toMoveInfo)(removed)) {
|
|
1465
|
+
removedSegments.push(removed);
|
|
1489
1466
|
}
|
|
1490
1467
|
}
|
|
1491
1468
|
else {
|
|
@@ -1506,6 +1483,7 @@ class MergeTree {
|
|
|
1506
1483
|
existingRemovalInfo.removedClientIds.push(clientId);
|
|
1507
1484
|
}
|
|
1508
1485
|
}
|
|
1486
|
+
(0, segmentInfos_js_1.assertRemoved)(segment);
|
|
1509
1487
|
// Save segment so we can assign removed sequence number when acked by server
|
|
1510
1488
|
if (this.collabWindow.collaborating) {
|
|
1511
1489
|
if (segment.removedSeq === constants_js_1.UnassignedSequenceNumber &&
|
|
@@ -1520,7 +1498,7 @@ class MergeTree {
|
|
|
1520
1498
|
}
|
|
1521
1499
|
return true;
|
|
1522
1500
|
};
|
|
1523
|
-
const afterMarkRemoved = (node
|
|
1501
|
+
const afterMarkRemoved = (node) => {
|
|
1524
1502
|
if (_overwrite) {
|
|
1525
1503
|
this.nodeUpdateLengthNewStructure(node);
|
|
1526
1504
|
}
|
|
@@ -1529,7 +1507,7 @@ class MergeTree {
|
|
|
1529
1507
|
}
|
|
1530
1508
|
return true;
|
|
1531
1509
|
};
|
|
1532
|
-
this.nodeMap(refSeq, clientId, markRemoved,
|
|
1510
|
+
this.nodeMap(refSeq, clientId, markRemoved, afterMarkRemoved, start, end);
|
|
1533
1511
|
// these segments are already viewed as being removed locally and are not event-ed
|
|
1534
1512
|
// so can slide non-StayOnRemove refs immediately
|
|
1535
1513
|
this.slideAckedRemovedSegmentReferences(localOverlapWithRefs);
|
|
@@ -1537,14 +1515,14 @@ class MergeTree {
|
|
|
1537
1515
|
if (removedSegments.length > 0) {
|
|
1538
1516
|
this.mergeTreeDeltaCallback?.(opArgs, {
|
|
1539
1517
|
operation: ops_js_1.MergeTreeDeltaType.REMOVE,
|
|
1540
|
-
deltaSegments: removedSegments,
|
|
1518
|
+
deltaSegments: removedSegments.map((segment) => ({ segment })),
|
|
1541
1519
|
});
|
|
1542
1520
|
}
|
|
1543
1521
|
// these events are newly removed
|
|
1544
1522
|
// so we slide after eventing in case the consumer wants to make reference
|
|
1545
1523
|
// changes at remove time, like add a ref to track undo redo.
|
|
1546
1524
|
if (!this.collabWindow.collaborating || clientId !== this.collabWindow.clientId) {
|
|
1547
|
-
this.slideAckedRemovedSegmentReferences(removedSegments
|
|
1525
|
+
this.slideAckedRemovedSegmentReferences(removedSegments);
|
|
1548
1526
|
}
|
|
1549
1527
|
if (this.collabWindow.collaborating &&
|
|
1550
1528
|
seq !== constants_js_1.UnassignedSequenceNumber &&
|
|
@@ -1555,24 +1533,21 @@ class MergeTree {
|
|
|
1555
1533
|
/**
|
|
1556
1534
|
* Revert an unacked local op
|
|
1557
1535
|
*/
|
|
1558
|
-
// eslint-disable-next-line import/no-deprecated
|
|
1559
1536
|
rollback(op, localOpMetadata) {
|
|
1560
1537
|
if (op.type === ops_js_1.MergeTreeDeltaType.REMOVE) {
|
|
1561
|
-
const pendingSegmentGroup = this.pendingSegments.pop
|
|
1538
|
+
const pendingSegmentGroup = this.pendingSegments.pop()?.data;
|
|
1562
1539
|
if (pendingSegmentGroup === undefined || pendingSegmentGroup !== localOpMetadata) {
|
|
1563
1540
|
throw new Error("Rollback op doesn't match last edit");
|
|
1564
1541
|
}
|
|
1565
1542
|
// Disabling because a for of loop causes the type of segment to be ISegmentLeaf, which does not have parent information stored
|
|
1566
1543
|
// eslint-disable-next-line unicorn/no-array-for-each
|
|
1567
1544
|
pendingSegmentGroup.segments.forEach((segment) => {
|
|
1568
|
-
const segmentSegmentGroup = segment?.segmentGroups?.pop
|
|
1545
|
+
const segmentSegmentGroup = segment?.segmentGroups?.pop();
|
|
1569
1546
|
(0, internal_1.assert)(segmentSegmentGroup === pendingSegmentGroup, 0x3ee /* Unexpected segmentGroup in segment */);
|
|
1570
|
-
(0, internal_1.assert)(segment.removedClientIds
|
|
1571
|
-
|
|
1572
|
-
segment
|
|
1573
|
-
|
|
1574
|
-
segment.localRemovedSeq = undefined;
|
|
1575
|
-
for (let updateNode = segment.parent; updateNode !== undefined; updateNode = updateNode.parent) {
|
|
1547
|
+
(0, internal_1.assert)((0, segmentInfos_js_1.isRemoved)(segment) && segment.removedClientIds[0] === this.collabWindow.clientId, 0x39d /* Rollback segment removedClientId does not match local client */);
|
|
1548
|
+
let updateNode = segment.parent;
|
|
1549
|
+
(0, segmentInfos_js_1.removeRemovalInfo)(segment);
|
|
1550
|
+
for (updateNode; updateNode !== undefined; updateNode = updateNode.parent) {
|
|
1576
1551
|
this.blockUpdateLength(updateNode, constants_js_1.UnassignedSequenceNumber, this.collabWindow.clientId);
|
|
1577
1552
|
}
|
|
1578
1553
|
// Note: optional chaining short-circuits:
|
|
@@ -1585,7 +1560,7 @@ class MergeTree {
|
|
|
1585
1560
|
}
|
|
1586
1561
|
else if (op.type === ops_js_1.MergeTreeDeltaType.INSERT ||
|
|
1587
1562
|
op.type === ops_js_1.MergeTreeDeltaType.ANNOTATE) {
|
|
1588
|
-
const pendingSegmentGroup = this.pendingSegments.pop
|
|
1563
|
+
const pendingSegmentGroup = this.pendingSegments.pop()?.data;
|
|
1589
1564
|
if (pendingSegmentGroup === undefined ||
|
|
1590
1565
|
pendingSegmentGroup !== localOpMetadata ||
|
|
1591
1566
|
(op.type === ops_js_1.MergeTreeDeltaType.ANNOTATE && !pendingSegmentGroup.previousProps)) {
|
|
@@ -1593,7 +1568,7 @@ class MergeTree {
|
|
|
1593
1568
|
}
|
|
1594
1569
|
let i = 0;
|
|
1595
1570
|
for (const segment of pendingSegmentGroup.segments) {
|
|
1596
|
-
const segmentSegmentGroup = segment?.segmentGroups?.pop
|
|
1571
|
+
const segmentSegmentGroup = segment?.segmentGroups?.pop();
|
|
1597
1572
|
(0, internal_1.assert)(segmentSegmentGroup === pendingSegmentGroup, 0x3ef /* Unexpected segmentGroup in segment */);
|
|
1598
1573
|
const start = this.findRollbackPosition(segment);
|
|
1599
1574
|
if (op.type === ops_js_1.MergeTreeDeltaType.INSERT) {
|
|
@@ -1625,7 +1600,7 @@ class MergeTree {
|
|
|
1625
1600
|
return false;
|
|
1626
1601
|
}
|
|
1627
1602
|
// If not removed, increase position
|
|
1628
|
-
if (
|
|
1603
|
+
if (!(0, segmentInfos_js_1.isRemoved)(seg)) {
|
|
1629
1604
|
segmentPosition += seg.cachedLength;
|
|
1630
1605
|
}
|
|
1631
1606
|
return true;
|
|
@@ -1659,6 +1634,7 @@ class MergeTree {
|
|
|
1659
1634
|
segment = this.endOfTree;
|
|
1660
1635
|
}
|
|
1661
1636
|
else {
|
|
1637
|
+
(0, mergeTreeNodes_js_1.assertSegmentLeaf)(_segment);
|
|
1662
1638
|
segment = _segment;
|
|
1663
1639
|
}
|
|
1664
1640
|
// eslint-disable-next-line import/no-deprecated
|
|
@@ -1689,7 +1665,7 @@ class MergeTree {
|
|
|
1689
1665
|
affectedSegments.remove(segmentToSlide);
|
|
1690
1666
|
affectedSegments.insertAfter(lastLocalSegment, segmentToSlide.data);
|
|
1691
1667
|
}
|
|
1692
|
-
else if (isRemoved(segmentToSlide.data)) {
|
|
1668
|
+
else if ((0, segmentInfos_js_1.isRemoved)(segmentToSlide.data)) {
|
|
1693
1669
|
(0, internal_1.assert)(segmentToSlide.data.localRemovedSeq !== undefined, 0x54d /* Removed segment that hasnt had its removal acked should be locally removed */);
|
|
1694
1670
|
// Slide each locally removed item past all segments that have localSeq > lremoveItem.localSeq
|
|
1695
1671
|
// but not past remotely removed segments;
|
|
@@ -1723,7 +1699,7 @@ class MergeTree {
|
|
|
1723
1699
|
for (let i = 0; i < newOrder.length; i++) {
|
|
1724
1700
|
const seg = newOrder[i];
|
|
1725
1701
|
const { parent, index, ordinal } = currentOrder[i];
|
|
1726
|
-
|
|
1702
|
+
(0, mergeTreeNodes_js_1.assignChild)(parent, seg, index, false);
|
|
1727
1703
|
seg.ordinal = ordinal;
|
|
1728
1704
|
}
|
|
1729
1705
|
for (const [segment, groups] of perSegmentTrackingGroups.entries()) {
|
|
@@ -1783,7 +1759,7 @@ class MergeTree {
|
|
|
1783
1759
|
}
|
|
1784
1760
|
};
|
|
1785
1761
|
(0, mergeTreeNodeWalk_js_1.walkAllChildSegments)(this.root, (seg) => {
|
|
1786
|
-
if (isRemoved(seg) || seg.seq === constants_js_1.UnassignedSequenceNumber) {
|
|
1762
|
+
if ((0, segmentInfos_js_1.isRemoved)(seg) || seg.seq === constants_js_1.UnassignedSequenceNumber) {
|
|
1787
1763
|
if (isRemovedAndAcked(seg)) {
|
|
1788
1764
|
rangeContainsRemoteRemovedSegs = true;
|
|
1789
1765
|
}
|
|
@@ -1890,7 +1866,7 @@ class MergeTree {
|
|
|
1890
1866
|
this.ensureIntervalBoundary(end, refSeq, clientId);
|
|
1891
1867
|
}
|
|
1892
1868
|
}
|
|
1893
|
-
this.nodeMap(refSeq, clientId, handler, accum, undefined, start, end, undefined, visibilitySeq);
|
|
1869
|
+
this.nodeMap(refSeq, clientId, (seg, pos, _start, _end) => handler(seg, pos, refSeq, clientId, _start, _end, accum), undefined, start, end, undefined, visibilitySeq);
|
|
1894
1870
|
}
|
|
1895
1871
|
/**
|
|
1896
1872
|
* Map over all visible segments in a given range
|
|
@@ -1915,7 +1891,7 @@ class MergeTree {
|
|
|
1915
1891
|
* but it will not count as a segment within the range. That is, it will be
|
|
1916
1892
|
* ignored for the purposes of tracking when traversal should end.
|
|
1917
1893
|
*/
|
|
1918
|
-
nodeMap(refSeq, clientId, leaf,
|
|
1894
|
+
nodeMap(refSeq, clientId, leaf, post, start = 0, end, localSeq, visibilitySeq = refSeq) {
|
|
1919
1895
|
const endPos = end ?? this.nodeLength(this.root, refSeq, clientId, localSeq) ?? 0;
|
|
1920
1896
|
if (endPos === start) {
|
|
1921
1897
|
return;
|
|
@@ -1942,14 +1918,12 @@ class MergeTree {
|
|
|
1942
1918
|
return mergeTreeNodeWalk_js_1.NodeAction.Skip;
|
|
1943
1919
|
}
|
|
1944
1920
|
if (node.isLeaf()) {
|
|
1945
|
-
if (leaf(node, pos,
|
|
1921
|
+
if (leaf(node, pos, start - pos, endPos - pos) === false) {
|
|
1946
1922
|
return mergeTreeNodeWalk_js_1.NodeAction.Exit;
|
|
1947
1923
|
}
|
|
1948
1924
|
pos = nextPos;
|
|
1949
1925
|
}
|
|
1950
|
-
}, undefined, post
|
|
1951
|
-
? undefined
|
|
1952
|
-
: (block) => post(block, pos, refSeq, clientId, start - pos, endPos - pos, accum));
|
|
1926
|
+
}, undefined, post);
|
|
1953
1927
|
}
|
|
1954
1928
|
}
|
|
1955
1929
|
exports.MergeTree = MergeTree;
|