@fluidframework/merge-tree 2.0.0-internal.4.1.2 → 2.0.0-internal.4.2.1
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/dist/mergeTree.d.ts +18 -10
- package/dist/mergeTree.d.ts.map +1 -1
- package/dist/mergeTree.js +82 -83
- package/dist/mergeTree.js.map +1 -1
- package/lib/mergeTree.d.ts +18 -10
- package/lib/mergeTree.d.ts.map +1 -1
- package/lib/mergeTree.js +82 -83
- package/lib/mergeTree.js.map +1 -1
- package/package.json +15 -15
- package/src/mergeTree.ts +92 -104
package/dist/mergeTree.d.ts
CHANGED
|
@@ -152,11 +152,6 @@ export declare class MergeTree {
|
|
|
152
152
|
private minSeqListeners;
|
|
153
153
|
mergeTreeDeltaCallback?: MergeTreeDeltaCallback;
|
|
154
154
|
mergeTreeMaintenanceCallback?: MergeTreeMaintenanceCallback;
|
|
155
|
-
/**
|
|
156
|
-
* If we remove a contiguous range of segments, avoid duplicated tree traversal
|
|
157
|
-
* for each segment removed, as this scales poorly
|
|
158
|
-
*/
|
|
159
|
-
private cachedSlideDestination;
|
|
160
155
|
constructor(options?: IMergeTreeOptions | undefined);
|
|
161
156
|
private _root;
|
|
162
157
|
get root(): IRootMergeBlock;
|
|
@@ -192,16 +187,29 @@ export declare class MergeTree {
|
|
|
192
187
|
/**
|
|
193
188
|
* @remarks Must only be used by client.
|
|
194
189
|
* @param segment - The segment to slide from.
|
|
195
|
-
* @param
|
|
196
|
-
*
|
|
190
|
+
* @param cache - Optional cache mapping segments to their sliding destinations.
|
|
191
|
+
* Excursions will be avoided for segments in the cache, and the cache will be populated with
|
|
192
|
+
* entries for all segments visited during excursion.
|
|
193
|
+
* This can reduce the number of times the tree needs to be scanned if a range containing many
|
|
194
|
+
* SlideOnRemove references is removed.
|
|
195
|
+
* @returns The segment a SlideOnRemove reference should slide to, or undefined if there is no
|
|
196
|
+
* valid segment (i.e. the tree is empty).
|
|
197
197
|
* @internal
|
|
198
198
|
*/
|
|
199
|
-
_getSlideToSegment(segment: ISegment | undefined,
|
|
199
|
+
_getSlideToSegment(segment: ISegment | undefined, cache?: Map<ISegment, {
|
|
200
|
+
seg?: ISegment;
|
|
201
|
+
}>): ISegment | undefined;
|
|
200
202
|
/**
|
|
201
|
-
*
|
|
203
|
+
* Slides or removes references from the provided list of segments.
|
|
204
|
+
* The order of the references is preserved.
|
|
205
|
+
* @remarks -
|
|
206
|
+
* 1. Preserving the order of the references is a useful property for reference-based undo/redo
|
|
207
|
+
* (see revertibles.ts).
|
|
208
|
+
* 2. For use cases which necessitate eventual consistency across clients,
|
|
209
|
+
* this method should only be called with segments for which the current client sequence number is
|
|
202
210
|
* max(remove segment sequence number, add reference sequence number).
|
|
203
|
-
* Otherwise eventual consistency is not guaranteed.
|
|
204
211
|
* See `packages\dds\merge-tree\REFERENCEPOSITIONS.md`
|
|
212
|
+
* @param segments - An array of (not necessarily contiguous) segments with increasing ordinals.
|
|
205
213
|
*/
|
|
206
214
|
private slideAckedRemovedSegmentReferences;
|
|
207
215
|
private blockLength;
|
package/dist/mergeTree.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mergeTree.d.ts","sourceRoot":"","sources":["../src/mergeTree.ts"],"names":[],"mappings":"AAAA;;;GAGG;AASH,OAAO,EAAE,gCAAgC,EAAE,MAAM,yBAAyB,CAAC;AAC3E,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAY,KAAK,EAAE,MAAM,eAAe,CAAC;AAQtE,OAAO,EAA4B,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AACpF,OAAO,EAIN,mBAAmB,EAEnB,WAAW,EACX,UAAU,EAEV,mBAAmB,EAInB,QAAQ,EACR,cAAc,EAId,UAAU,EACV,SAAS,EAIT,YAAY,EAEZ,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACN,qBAAqB,EAErB,sBAAsB,EACtB,4BAA4B,EAE5B,MAAM,0BAA0B,CAAC;AAElC,OAAO,EACN,YAAY,EACZ,iBAAiB,EACjB,iBAAiB,EAEjB,aAAa,EACb,MAAM,OAAO,CAAC;AAEf,OAAO,EAA8B,WAAW,EAAE,MAAM,cAAc,CAAC;AACvE,OAAO,EAEN,iBAAiB,EAEjB,aAAa,EAKb,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAUhE,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AA4TlC;;;GAGG;AACH,MAAM,WAAW,SAAS;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,iBAAiB;IACjC,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB;;;;;;;;;;OAUG;IACH,iCAAiC,CAAC,EAAE,OAAO,CAAC;IAC5C,0BAA0B,CAAC,EAAE,MAAM,CAAC;IACpC;;;;;;;;;;;;;;;;OAgBG;IACH,0BAA0B,CAAC,EAAE,OAAO,CAAC;IAErC;;OAEG;IACH,WAAW,CAAC,EAAE,4BAA4B,CAAC;CAC3C;AAED,MAAM,WAAW,4BAA4B;IAC5C;;;;;;;;;OASG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC;IAEhB;;;;;;OAMG;IACH,aAAa,CAAC,EAAE,MAAM,iBAAiB,CAAC;CACxC;AAED;;;;GAIG;AACH,MAAM,WAAW,iBAAiB;IACjC;;;;;;;OAOG;IACH,MAAM,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACjC;;;OAGG;IACH,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB;;OAEG;IACH,UAAU,EAAE,OAAO,CAAC;IACpB;;;OAGG;IACH,UAAU,EAAE,gCAAgC,CAAC;CAC7C;AAED;;;GAGG;AACH,eAAO,MAAM,iBAAiB,EAAE,QAAQ,CAAC,SAAS,CAGjD,CAAC;AAEF;;GAEG;AACH,MAAM,WAAW,UAAU;IAC1B,OAAO,CAAC,EAAE,QAAQ,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,eAAgB,SAAQ,WAAW;IACnD,SAAS,CAAC,EAAE,SAAS,CAAC;CACtB;AAED,wBAAgB,kBAAkB,CACjC,aAAa,EAAE,UAAU,GAAG,SAAS,GACnC,eAAe,GAAG,SAAS,CAY7B;AAED;;GAEG;AACH,qBAAa,SAAS;
|
|
1
|
+
{"version":3,"file":"mergeTree.d.ts","sourceRoot":"","sources":["../src/mergeTree.ts"],"names":[],"mappings":"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"}
|
package/dist/mergeTree.js
CHANGED
|
@@ -535,92 +535,111 @@ class MergeTree {
|
|
|
535
535
|
/**
|
|
536
536
|
* @remarks Must only be used by client.
|
|
537
537
|
* @param segment - The segment to slide from.
|
|
538
|
-
* @param
|
|
539
|
-
*
|
|
538
|
+
* @param cache - Optional cache mapping segments to their sliding destinations.
|
|
539
|
+
* Excursions will be avoided for segments in the cache, and the cache will be populated with
|
|
540
|
+
* entries for all segments visited during excursion.
|
|
541
|
+
* This can reduce the number of times the tree needs to be scanned if a range containing many
|
|
542
|
+
* SlideOnRemove references is removed.
|
|
543
|
+
* @returns The segment a SlideOnRemove reference should slide to, or undefined if there is no
|
|
544
|
+
* valid segment (i.e. the tree is empty).
|
|
540
545
|
* @internal
|
|
541
546
|
*/
|
|
542
|
-
_getSlideToSegment(segment,
|
|
543
|
-
var _a, _b, _c, _d;
|
|
547
|
+
_getSlideToSegment(segment, cache) {
|
|
544
548
|
if (!segment || !isRemovedAndAcked(segment)) {
|
|
545
549
|
return segment;
|
|
546
550
|
}
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
seq: segment.removedSeq,
|
|
551
|
-
};
|
|
552
|
-
}
|
|
553
|
-
// cache slide destination of segments to improve the pathological case
|
|
554
|
-
// in which we slide the same segment multiple times
|
|
555
|
-
const cachedSegment = (_b = this.cachedSlideDestination) === null || _b === void 0 ? void 0 : _b.segmentToSlideDestination.get(segment);
|
|
556
|
-
if (cachedSegment !== undefined && shouldCache) {
|
|
557
|
-
return cachedSegment === "detached" ? undefined : cachedSegment;
|
|
551
|
+
const cachedSegment = cache === null || cache === void 0 ? void 0 : cache.get(segment);
|
|
552
|
+
if (cachedSegment !== undefined) {
|
|
553
|
+
return cachedSegment.seg;
|
|
558
554
|
}
|
|
559
|
-
const
|
|
560
|
-
|
|
555
|
+
const result = {};
|
|
556
|
+
cache === null || cache === void 0 ? void 0 : cache.set(segment, result);
|
|
561
557
|
const goFurtherToFindSlideToSegment = (seg) => {
|
|
562
558
|
if (seg.seq !== constants_1.UnassignedSequenceNumber && !isRemovedAndAcked(seg)) {
|
|
563
|
-
|
|
559
|
+
result.seg = seg;
|
|
564
560
|
return false;
|
|
565
561
|
}
|
|
566
|
-
|
|
562
|
+
if (cache !== undefined && seg.removedSeq === segment.removedSeq) {
|
|
563
|
+
cache.set(seg, result);
|
|
564
|
+
}
|
|
567
565
|
return true;
|
|
568
566
|
};
|
|
569
567
|
// Slide to the next farthest valid segment in the tree.
|
|
570
568
|
(0, mergeTreeNodeWalk_1.forwardExcursion)(segment, goFurtherToFindSlideToSegment);
|
|
571
|
-
if (
|
|
572
|
-
|
|
573
|
-
for (const seg of segmentsWithSlidDst) {
|
|
574
|
-
(_c = this.cachedSlideDestination) === null || _c === void 0 ? void 0 : _c.segmentToSlideDestination.set(seg, slideToSegment);
|
|
575
|
-
}
|
|
576
|
-
}
|
|
577
|
-
return slideToSegment;
|
|
569
|
+
if (result.seg !== undefined) {
|
|
570
|
+
return result.seg;
|
|
578
571
|
}
|
|
579
572
|
// If no such segment is found, slide to the last valid segment.
|
|
580
573
|
(0, mergeTreeNodeWalk_1.backwardExcursion)(segment, goFurtherToFindSlideToSegment);
|
|
581
|
-
|
|
582
|
-
for (const seg of segmentsWithSlidDst) {
|
|
583
|
-
(_d = this.cachedSlideDestination) === null || _d === void 0 ? void 0 : _d.segmentToSlideDestination.set(seg, slideToSegment !== null && slideToSegment !== void 0 ? slideToSegment : "detached");
|
|
584
|
-
}
|
|
585
|
-
}
|
|
586
|
-
return slideToSegment;
|
|
574
|
+
return result.seg;
|
|
587
575
|
}
|
|
588
576
|
/**
|
|
589
|
-
*
|
|
577
|
+
* Slides or removes references from the provided list of segments.
|
|
578
|
+
* The order of the references is preserved.
|
|
579
|
+
* @remarks -
|
|
580
|
+
* 1. Preserving the order of the references is a useful property for reference-based undo/redo
|
|
581
|
+
* (see revertibles.ts).
|
|
582
|
+
* 2. For use cases which necessitate eventual consistency across clients,
|
|
583
|
+
* this method should only be called with segments for which the current client sequence number is
|
|
590
584
|
* max(remove segment sequence number, add reference sequence number).
|
|
591
|
-
* Otherwise eventual consistency is not guaranteed.
|
|
592
585
|
* See `packages\dds\merge-tree\REFERENCEPOSITIONS.md`
|
|
586
|
+
* @param segments - An array of (not necessarily contiguous) segments with increasing ordinals.
|
|
593
587
|
*/
|
|
594
|
-
slideAckedRemovedSegmentReferences(
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
588
|
+
slideAckedRemovedSegmentReferences(segments) {
|
|
589
|
+
// References are slid in groups to preserve their order.
|
|
590
|
+
let currentSlideDestination;
|
|
591
|
+
let currentSlideIsForward;
|
|
592
|
+
let currentSlideGroup = [];
|
|
593
|
+
const slideGroup = () => {
|
|
594
|
+
var _a, _b, _c, _d, _e;
|
|
595
|
+
if (currentSlideIsForward !== undefined) {
|
|
596
|
+
if (currentSlideDestination !== undefined) {
|
|
597
|
+
const localRefs = ((_a = currentSlideDestination.localRefs) !== null && _a !== void 0 ? _a : (currentSlideDestination.localRefs = new localReference_1.LocalReferenceCollection(currentSlideDestination)));
|
|
598
|
+
if (currentSlideIsForward) {
|
|
599
|
+
localRefs.addBeforeTombstones(...currentSlideGroup);
|
|
600
|
+
}
|
|
601
|
+
else {
|
|
602
|
+
localRefs.addAfterTombstones(...currentSlideGroup);
|
|
603
|
+
}
|
|
604
|
+
}
|
|
605
|
+
else {
|
|
606
|
+
for (const collection of currentSlideGroup) {
|
|
607
|
+
for (const ref of collection) {
|
|
608
|
+
if (!(0, referencePositions_1.refTypeIncludesFlag)(ref, ops_1.ReferenceType.StayOnRemove)) {
|
|
609
|
+
(_c = (_b = ref.callbacks) === null || _b === void 0 ? void 0 : _b.beforeSlide) === null || _c === void 0 ? void 0 : _c.call(_b, ref);
|
|
610
|
+
collection.removeLocalRef(ref);
|
|
611
|
+
(_e = (_d = ref.callbacks) === null || _d === void 0 ? void 0 : _d.afterSlide) === null || _e === void 0 ? void 0 : _e.call(_d, ref);
|
|
612
|
+
}
|
|
613
|
+
}
|
|
614
|
+
}
|
|
615
|
+
}
|
|
616
|
+
// TODO:AB#4069: This update might be avoidable by checking if the old segment
|
|
617
|
+
// had hierarchical refs before sliding using `segment.localRefs?.hierRefCount`.
|
|
618
|
+
if (currentSlideDestination) {
|
|
619
|
+
this.blockUpdatePathLengths(currentSlideDestination.parent, constants_1.TreeMaintenanceSequenceNumber, constants_1.LocalClientId);
|
|
620
|
+
}
|
|
605
621
|
}
|
|
606
|
-
|
|
607
|
-
|
|
622
|
+
};
|
|
623
|
+
const segmentCache = new Map();
|
|
624
|
+
for (const segment of segments) {
|
|
625
|
+
(0, common_utils_1.assert)(isRemovedAndAcked(segment), 0x2f1 /* slideReferences from a segment which has not been removed and acked */);
|
|
626
|
+
if (segment.localRefs === undefined || segment.localRefs.empty) {
|
|
627
|
+
continue;
|
|
608
628
|
}
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
629
|
+
const slideToSegment = this._getSlideToSegment(segment, segmentCache);
|
|
630
|
+
const slideIsForward = slideToSegment === undefined ? false : slideToSegment.ordinal > segment.ordinal;
|
|
631
|
+
if (slideToSegment !== currentSlideDestination ||
|
|
632
|
+
slideIsForward !== currentSlideIsForward) {
|
|
633
|
+
slideGroup();
|
|
634
|
+
currentSlideGroup = [segment.localRefs];
|
|
635
|
+
currentSlideDestination = slideToSegment;
|
|
636
|
+
currentSlideIsForward = slideIsForward;
|
|
637
|
+
}
|
|
638
|
+
else {
|
|
639
|
+
currentSlideGroup.push(segment.localRefs);
|
|
617
640
|
}
|
|
618
641
|
}
|
|
619
|
-
|
|
620
|
-
// had hierarchical refs before sliding using `segment.localRefs?.hierRefCount`.
|
|
621
|
-
if (newSegment) {
|
|
622
|
-
this.blockUpdatePathLengths(newSegment.parent, constants_1.TreeMaintenanceSequenceNumber, constants_1.LocalClientId);
|
|
623
|
-
}
|
|
642
|
+
slideGroup();
|
|
624
643
|
}
|
|
625
644
|
blockLength(node, refSeq, clientId) {
|
|
626
645
|
return this.collabWindow.collaborating && clientId !== this.collabWindow.clientId
|
|
@@ -940,25 +959,7 @@ class MergeTree {
|
|
|
940
959
|
// Perform slides after all segments have been acked, so that
|
|
941
960
|
// positions after slide are final
|
|
942
961
|
if (opArgs.op.type === ops_1.MergeTreeDeltaType.REMOVE) {
|
|
943
|
-
|
|
944
|
-
// references in reverse to preserve their order
|
|
945
|
-
const newSegment = this._getSlideToSegment(pendingSegmentGroup.segments[0]);
|
|
946
|
-
const shouldReverse = pendingSegmentGroup.segments[0] &&
|
|
947
|
-
newSegment &&
|
|
948
|
-
pendingSegmentGroup.segments[0].ordinal < newSegment.ordinal;
|
|
949
|
-
let idx = shouldReverse ? pendingSegmentGroup.segments.length - 1 : 0;
|
|
950
|
-
while (idx >= 0 && idx < pendingSegmentGroup.segments.length) {
|
|
951
|
-
const pendingSegment = pendingSegmentGroup.segments[idx];
|
|
952
|
-
if (!overlappingRemoves[idx]) {
|
|
953
|
-
this.slideAckedRemovedSegmentReferences(pendingSegment);
|
|
954
|
-
}
|
|
955
|
-
if (shouldReverse) {
|
|
956
|
-
idx--;
|
|
957
|
-
}
|
|
958
|
-
else {
|
|
959
|
-
idx++;
|
|
960
|
-
}
|
|
961
|
-
}
|
|
962
|
+
this.slideAckedRemovedSegmentReferences(pendingSegmentGroup.segments);
|
|
962
963
|
}
|
|
963
964
|
(_b = this.mergeTreeMaintenanceCallback) === null || _b === void 0 ? void 0 : _b.call(this, {
|
|
964
965
|
deltaSegments,
|
|
@@ -1537,7 +1538,7 @@ class MergeTree {
|
|
|
1537
1538
|
this.nodeMap(refSeq, clientId, markRemoved, undefined, afterMarkRemoved, start, end);
|
|
1538
1539
|
// these segments are already viewed as being removed locally and are not event-ed
|
|
1539
1540
|
// so can slide non-StayOnRemove refs immediately
|
|
1540
|
-
|
|
1541
|
+
this.slideAckedRemovedSegmentReferences(localOverlapWithRefs);
|
|
1541
1542
|
// opArgs == undefined => test code
|
|
1542
1543
|
if (removedSegments.length > 0) {
|
|
1543
1544
|
(_a = this.mergeTreeDeltaCallback) === null || _a === void 0 ? void 0 : _a.call(this, opArgs, {
|
|
@@ -1549,9 +1550,7 @@ class MergeTree {
|
|
|
1549
1550
|
// so we slide after eventing in case the consumer wants to make reference
|
|
1550
1551
|
// changes at remove time, like add a ref to track undo redo.
|
|
1551
1552
|
if (!this.collabWindow.collaborating || clientId !== this.collabWindow.clientId) {
|
|
1552
|
-
removedSegments.
|
|
1553
|
-
this.slideAckedRemovedSegmentReferences(rSeg.segment);
|
|
1554
|
-
});
|
|
1553
|
+
this.slideAckedRemovedSegmentReferences(removedSegments.map(({ segment }) => segment));
|
|
1555
1554
|
}
|
|
1556
1555
|
if (this.collabWindow.collaborating && seq !== constants_1.UnassignedSequenceNumber) {
|
|
1557
1556
|
if (MergeTree.options.zamboniSegments) {
|