@fluidframework/merge-tree 2.23.0-323641 → 2.23.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/mergeTree.d.ts.map +1 -1
- package/dist/mergeTree.js +47 -15
- package/dist/mergeTree.js.map +1 -1
- package/dist/mergeTreeNodes.d.ts.map +1 -1
- package/dist/mergeTreeNodes.js +0 -2
- package/dist/mergeTreeNodes.js.map +1 -1
- package/dist/partialLengths.d.ts.map +1 -1
- package/dist/partialLengths.js +3 -4
- package/dist/partialLengths.js.map +1 -1
- package/dist/segmentInfos.d.ts +10 -18
- package/dist/segmentInfos.d.ts.map +1 -1
- package/dist/segmentInfos.js +22 -3
- package/dist/segmentInfos.js.map +1 -1
- package/dist/snapshotLoader.d.ts.map +1 -1
- package/dist/snapshotLoader.js +0 -2
- package/dist/snapshotLoader.js.map +1 -1
- package/dist/test/obliterate.concurrent.spec.js +53 -1
- package/dist/test/obliterate.concurrent.spec.js.map +1 -1
- package/lib/mergeTree.d.ts.map +1 -1
- package/lib/mergeTree.js +48 -16
- package/lib/mergeTree.js.map +1 -1
- package/lib/mergeTreeNodes.d.ts.map +1 -1
- package/lib/mergeTreeNodes.js +0 -2
- package/lib/mergeTreeNodes.js.map +1 -1
- package/lib/partialLengths.d.ts.map +1 -1
- package/lib/partialLengths.js +4 -5
- package/lib/partialLengths.js.map +1 -1
- package/lib/segmentInfos.d.ts +10 -18
- package/lib/segmentInfos.d.ts.map +1 -1
- package/lib/segmentInfos.js +20 -2
- package/lib/segmentInfos.js.map +1 -1
- package/lib/snapshotLoader.d.ts.map +1 -1
- package/lib/snapshotLoader.js +0 -2
- package/lib/snapshotLoader.js.map +1 -1
- package/lib/test/obliterate.concurrent.spec.js +53 -1
- package/lib/test/obliterate.concurrent.spec.js.map +1 -1
- package/package.json +17 -17
- package/src/mergeTree.ts +57 -15
- package/src/mergeTreeNodes.ts +0 -2
- package/src/partialLengths.ts +12 -5
- package/src/segmentInfos.ts +23 -21
- package/src/snapshotLoader.ts +0 -2
package/lib/mergeTree.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mergeTree.d.ts","sourceRoot":"","sources":["../src/mergeTree.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,EAAU,IAAI,EAAa,MAAM,qCAAqC,CAAC;AAG9E,OAAO,EAAE,gCAAgC,EAAE,MAAM,4BAA4B,CAAC;AAC9E,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,gBAAgB,EAAY,MAAM,wBAAwB,CAAC;AAOpE,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC7E,OAAO,EAEN,sBAAsB,EACtB,iBAAiB,EAIjB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACN,qBAAqB,EAErB,sBAAsB,EACtB,4BAA4B,EAE5B,MAAM,6BAA6B,CAAC;AAQrC,OAAO,EACN,mBAAmB,EACnB,UAAU,EACV,cAAc,EAGd,MAAM,EAEN,UAAU,EACV,YAAY,EAOZ,KAAK,gBAAgB,EACrB,KAAK,YAAY,EACjB,KAAK,eAAe,EAEpB,MAAM,qBAAqB,CAAC;AAO7B,OAAO,EACN,iBAAiB,EACjB,iBAAiB,EAEjB,aAAa,EACb,MAAM,UAAU,CAAC;AAGlB,OAAO,EAAE,WAAW,EAAwC,MAAM,iBAAiB,CAAC;AACpF,OAAO,EAEN,iBAAiB,EAIjB,MAAM,yBAAyB,CAAC;AAEjC,OAAO,
|
|
1
|
+
{"version":3,"file":"mergeTree.d.ts","sourceRoot":"","sources":["../src/mergeTree.ts"],"names":[],"mappings":"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"}
|
package/lib/mergeTree.js
CHANGED
|
@@ -20,7 +20,7 @@ import { PerspectiveImpl, isSegmentPresent } from "./perspective.js";
|
|
|
20
20
|
import { createMap, extend, extendIfUndefined } from "./properties.js";
|
|
21
21
|
import { DetachedReferencePosition, refGetTileLabels, refHasTileLabel, refTypeIncludesFlag, } from "./referencePositions.js";
|
|
22
22
|
import { SegmentGroupCollection } from "./segmentGroupCollection.js";
|
|
23
|
-
import { assertMoved, assertRemoved, isMergeNodeInfo, isMoved, isRemoved, overwriteInfo, removeRemovalInfo, toMoveInfo, toRemovalInfo, } from "./segmentInfos.js";
|
|
23
|
+
import { assertMoved, assertRemoved, isMergeNodeInfo, isMoved, isRemoved, overwriteInfo, removeRemovalInfo, toMoveInfo, toRemovalInfo, wasMovedOnInsert, } from "./segmentInfos.js";
|
|
24
24
|
import { copyPropertiesAndManager, PropertiesManager, PropertiesRollback, } from "./segmentPropertiesManager.js";
|
|
25
25
|
import { Side } from "./sequencePlace.js";
|
|
26
26
|
import { SortedSegmentSet } from "./sortedSegmentSet.js";
|
|
@@ -628,7 +628,12 @@ export class MergeTree {
|
|
|
628
628
|
if (node.isLeaf()) {
|
|
629
629
|
return this.localNetLength(node, refSeq, localSeq);
|
|
630
630
|
}
|
|
631
|
-
else if (localSeq === undefined
|
|
631
|
+
else if (localSeq === undefined ||
|
|
632
|
+
// All changes are visible. Small note on why we allow refSeq >= this.collabWindow.currentSeq rather than just equality:
|
|
633
|
+
// merge-tree eventing occurs before the collab window is updated to account for whatever op it is processing, and we want
|
|
634
|
+
// to support resolving positions from within the event handler which account for that op. e.g. undo-redo relies on this
|
|
635
|
+
// behavior with local references.
|
|
636
|
+
(localSeq === this.collabWindow.localSeq && refSeq >= this.collabWindow.currentSeq)) {
|
|
632
637
|
// Local client sees all segments, even when collaborating
|
|
633
638
|
return node.cachedLength;
|
|
634
639
|
}
|
|
@@ -696,7 +701,10 @@ export class MergeTree {
|
|
|
696
701
|
* @param clientId - The ID of the client from whose perspective to resolve this reference. Defaults to the current client.
|
|
697
702
|
* @param localSeq - The local sequence number to consider. Defaults to including all local edits.
|
|
698
703
|
*/
|
|
699
|
-
referencePositionToLocalPosition(refPos,
|
|
704
|
+
referencePositionToLocalPosition(refPos,
|
|
705
|
+
// Note: this is not `this.collabWindow.currentSeq` because we want to support resolving local reference positions to positions
|
|
706
|
+
// from within event handlers, and the collab window's sequence numbers are not updated in time in all of those cases.
|
|
707
|
+
refSeq = Number.MAX_SAFE_INTEGER, clientId = this.collabWindow.clientId, localSeq = this.collabWindow.localSeq) {
|
|
700
708
|
const seg = refPos.getSegment();
|
|
701
709
|
if (!isSegmentLeaf(seg)) {
|
|
702
710
|
// We have no idea where this reference is, because it refers to a segment which is not in the tree.
|
|
@@ -1023,6 +1031,8 @@ export class MergeTree {
|
|
|
1023
1031
|
let normalizedNewestSeq = 0;
|
|
1024
1032
|
const movedClientIds = [];
|
|
1025
1033
|
const movedSeqs = [];
|
|
1034
|
+
let newestAcked;
|
|
1035
|
+
let oldestUnacked;
|
|
1026
1036
|
for (const ob of this.obliterates.findOverlapping(newSegment)) {
|
|
1027
1037
|
// compute a normalized seq that takes into account local seqs
|
|
1028
1038
|
// but is still comparable to remote seqs to keep the checks below easy
|
|
@@ -1052,6 +1062,17 @@ export class MergeTree {
|
|
|
1052
1062
|
normalizedNewestSeq = normalizedObSeq;
|
|
1053
1063
|
newest = ob;
|
|
1054
1064
|
}
|
|
1065
|
+
if (ob.seq !== UnassignedSequenceNumber &&
|
|
1066
|
+
(newestAcked === undefined || newestAcked.seq < ob.seq)) {
|
|
1067
|
+
newestAcked = ob;
|
|
1068
|
+
}
|
|
1069
|
+
if (ob.seq === UnassignedSequenceNumber &&
|
|
1070
|
+
(oldestUnacked === undefined || oldestUnacked.localSeq > ob.localSeq)) {
|
|
1071
|
+
// There can be one local obliterate surrounding a segment if a client repeatedly obliterates
|
|
1072
|
+
// a region (ex: in the text ABCDEFG, obliterate D, then obliterate CE, then BF). In this case,
|
|
1073
|
+
// the first one that's applied will be the one that actually removes the segment.
|
|
1074
|
+
oldestUnacked = ob;
|
|
1075
|
+
}
|
|
1055
1076
|
}
|
|
1056
1077
|
}
|
|
1057
1078
|
newSegment.obliteratePrecedingInsertion = newest;
|
|
@@ -1059,17 +1080,31 @@ export class MergeTree {
|
|
|
1059
1080
|
// by the same client that's inserting this segment, we let them insert into this range and therefore don't
|
|
1060
1081
|
// mark it obliterated.
|
|
1061
1082
|
if (oldest && newest?.clientId !== clientId) {
|
|
1062
|
-
|
|
1063
|
-
|
|
1064
|
-
|
|
1065
|
-
|
|
1066
|
-
|
|
1067
|
-
|
|
1068
|
-
|
|
1083
|
+
let moveInfo;
|
|
1084
|
+
if (newestAcked === newest || newestAcked?.clientId !== clientId) {
|
|
1085
|
+
moveInfo = {
|
|
1086
|
+
movedClientIds,
|
|
1087
|
+
movedSeq: oldest.seq,
|
|
1088
|
+
movedSeqs,
|
|
1089
|
+
localMovedSeq: oldestUnacked?.localSeq,
|
|
1090
|
+
};
|
|
1091
|
+
}
|
|
1092
|
+
else {
|
|
1093
|
+
assert(oldestUnacked !== undefined, 0xb55 /* Expected local obliterate to be defined if newestAcked is not equal to newest */);
|
|
1094
|
+
// There's a pending local obliterate for this range, so it will be marked as obliterated by us. However,
|
|
1095
|
+
// all other clients are under the impression that the most recent acked obliterate won the right to insert
|
|
1096
|
+
// in this range.
|
|
1097
|
+
moveInfo = {
|
|
1098
|
+
movedClientIds: [oldestUnacked.clientId],
|
|
1099
|
+
movedSeq: oldestUnacked.seq,
|
|
1100
|
+
movedSeqs: [oldestUnacked.seq],
|
|
1101
|
+
localMovedSeq: oldestUnacked.localSeq,
|
|
1102
|
+
};
|
|
1103
|
+
}
|
|
1069
1104
|
overwriteInfo(newSegment, moveInfo);
|
|
1070
1105
|
if (moveInfo.localMovedSeq !== undefined) {
|
|
1071
|
-
assert(
|
|
1072
|
-
this.addToPendingList(newSegment,
|
|
1106
|
+
assert(oldestUnacked?.segmentGroup !== undefined, 0x86c /* expected segment group to exist */);
|
|
1107
|
+
this.addToPendingList(newSegment, oldestUnacked?.segmentGroup);
|
|
1073
1108
|
}
|
|
1074
1109
|
if (newSegment.parent) {
|
|
1075
1110
|
// The incremental update codepath in theory can handle most cases where segments are obliterated upon insertion,
|
|
@@ -1359,7 +1394,6 @@ export class MergeTree {
|
|
|
1359
1394
|
movedSeq: seq,
|
|
1360
1395
|
localMovedSeq: localSeq,
|
|
1361
1396
|
movedSeqs: [seq],
|
|
1362
|
-
wasMovedOnInsert: segment.seq === UnassignedSequenceNumber && seq !== UnassignedSequenceNumber,
|
|
1363
1397
|
});
|
|
1364
1398
|
const existingRemoval = toRemovalInfo(movedSeg);
|
|
1365
1399
|
if (existingRemoval === undefined) {
|
|
@@ -1374,10 +1408,8 @@ export class MergeTree {
|
|
|
1374
1408
|
}
|
|
1375
1409
|
else {
|
|
1376
1410
|
if (existingMoveInfo.movedSeq === UnassignedSequenceNumber) {
|
|
1377
|
-
|
|
1378
|
-
assert(!existingMoveInfo.wasMovedOnInsert, 0xab4 /* Local obliterate cannot have removed a segment as soon as it was inserted */);
|
|
1411
|
+
assert(!wasMovedOnInsert(segment), 0xab4 /* Local obliterate cannot have removed a segment as soon as it was inserted */);
|
|
1379
1412
|
assert(seq !== UnassignedSequenceNumber, 0xab5 /* Cannot obliterate the same segment locally twice */);
|
|
1380
|
-
existingMoveInfo.wasMovedOnInsert = segment.seq === UnassignedSequenceNumber;
|
|
1381
1413
|
// we moved this locally, but someone else moved it first
|
|
1382
1414
|
// so put them at the head of the list
|
|
1383
1415
|
// The list isn't ordered, but we keep the first move at the head
|