@fluidframework/merge-tree 2.41.0 → 2.43.0-343119
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/client.d.ts +9 -6
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +79 -36
- package/dist/client.js.map +1 -1
- package/dist/collections/list.d.ts +95 -5
- package/dist/collections/list.d.ts.map +1 -1
- package/dist/collections/list.js +67 -5
- package/dist/collections/list.js.map +1 -1
- package/dist/constants.d.ts +5 -0
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +6 -1
- package/dist/constants.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -2
- package/dist/index.js.map +1 -1
- package/dist/mergeTree.d.ts +9 -9
- package/dist/mergeTree.d.ts.map +1 -1
- package/dist/mergeTree.js +15 -7
- package/dist/mergeTree.js.map +1 -1
- package/dist/perspective.d.ts +15 -0
- package/dist/perspective.d.ts.map +1 -1
- package/dist/perspective.js +25 -1
- package/dist/perspective.js.map +1 -1
- package/dist/revertibles.js +1 -1
- package/dist/revertibles.js.map +1 -1
- package/dist/stamps.d.ts +1 -0
- package/dist/stamps.d.ts.map +1 -1
- package/dist/stamps.js +5 -1
- package/dist/stamps.js.map +1 -1
- package/dist/test/beastTest.spec.js +1 -1
- package/dist/test/beastTest.spec.js.map +1 -1
- package/dist/test/client.annotateMarker.spec.js +1 -1
- package/dist/test/client.annotateMarker.spec.js.map +1 -1
- package/dist/test/client.applyMsg.spec.js +25 -25
- package/dist/test/client.applyMsg.spec.js.map +1 -1
- package/dist/test/client.applyStashedOpFarm.spec.d.ts.map +1 -1
- package/dist/test/client.applyStashedOpFarm.spec.js +3 -3
- package/dist/test/client.applyStashedOpFarm.spec.js.map +1 -1
- package/dist/test/client.attributionFarm.spec.js +1 -1
- package/dist/test/client.attributionFarm.spec.js.map +1 -1
- package/dist/test/client.getPosition.spec.js +1 -0
- package/dist/test/client.getPosition.spec.js.map +1 -1
- package/dist/test/client.localReference.spec.js +62 -48
- package/dist/test/client.localReference.spec.js.map +1 -1
- package/dist/test/client.localReferenceFarm.spec.js +1 -0
- package/dist/test/client.localReferenceFarm.spec.js.map +1 -1
- package/dist/test/client.reconnectFarm.spec.js +1 -1
- package/dist/test/client.reconnectFarm.spec.js.map +1 -1
- package/dist/test/client.rollback.spec.js +8 -6
- package/dist/test/client.rollback.spec.js.map +1 -1
- package/dist/test/client.searchForMarker.spec.js +2 -2
- package/dist/test/client.searchForMarker.spec.js.map +1 -1
- package/dist/test/clientTestHelper.js +1 -1
- package/dist/test/clientTestHelper.js.map +1 -1
- package/dist/test/mergeTree.annotate.spec.js +25 -25
- package/dist/test/mergeTree.annotate.spec.js.map +1 -1
- package/dist/test/mergeTree.markRangeRemoved.spec.js +1 -1
- package/dist/test/mergeTree.markRangeRemoved.spec.js.map +1 -1
- package/dist/test/obliterate.spec.js +4 -4
- package/dist/test/obliterate.spec.js.map +1 -1
- package/dist/test/resetPendingSegmentsToOp.spec.js +14 -14
- package/dist/test/resetPendingSegmentsToOp.spec.js.map +1 -1
- package/dist/test/snapshot.utils.js +1 -1
- package/dist/test/snapshot.utils.js.map +1 -1
- package/dist/test/sortedSegmentSet.spec.js +3 -3
- package/dist/test/sortedSegmentSet.spec.js.map +1 -1
- package/dist/test/testClient.js +3 -3
- package/dist/test/testClient.js.map +1 -1
- package/dist/test/tracking.spec.js +7 -7
- package/dist/test/tracking.spec.js.map +1 -1
- package/dist/test/wordUnitTests.spec.js.map +1 -1
- package/lib/client.d.ts +9 -6
- package/lib/client.d.ts.map +1 -1
- package/lib/client.js +81 -38
- package/lib/client.js.map +1 -1
- package/lib/collections/list.d.ts +95 -5
- package/lib/collections/list.d.ts.map +1 -1
- package/lib/collections/list.js +67 -5
- package/lib/collections/list.js.map +1 -1
- package/lib/constants.d.ts +5 -0
- package/lib/constants.d.ts.map +1 -1
- package/lib/constants.js +5 -0
- package/lib/constants.js.map +1 -1
- package/lib/index.d.ts +1 -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 +9 -9
- package/lib/mergeTree.d.ts.map +1 -1
- package/lib/mergeTree.js +15 -7
- package/lib/mergeTree.js.map +1 -1
- package/lib/perspective.d.ts +15 -0
- package/lib/perspective.d.ts.map +1 -1
- package/lib/perspective.js +23 -0
- package/lib/perspective.js.map +1 -1
- package/lib/revertibles.js +1 -1
- package/lib/revertibles.js.map +1 -1
- package/lib/stamps.d.ts +1 -0
- package/lib/stamps.d.ts.map +1 -1
- package/lib/stamps.js +4 -1
- package/lib/stamps.js.map +1 -1
- package/lib/test/beastTest.spec.js +1 -1
- 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.applyMsg.spec.js +25 -25
- package/lib/test/client.applyMsg.spec.js.map +1 -1
- package/lib/test/client.applyStashedOpFarm.spec.d.ts.map +1 -1
- package/lib/test/client.applyStashedOpFarm.spec.js +3 -3
- package/lib/test/client.applyStashedOpFarm.spec.js.map +1 -1
- package/lib/test/client.attributionFarm.spec.js +1 -1
- package/lib/test/client.attributionFarm.spec.js.map +1 -1
- package/lib/test/client.getPosition.spec.js +1 -0
- package/lib/test/client.getPosition.spec.js.map +1 -1
- package/lib/test/client.localReference.spec.js +62 -48
- package/lib/test/client.localReference.spec.js.map +1 -1
- package/lib/test/client.localReferenceFarm.spec.js +1 -0
- package/lib/test/client.localReferenceFarm.spec.js.map +1 -1
- package/lib/test/client.reconnectFarm.spec.js +1 -1
- package/lib/test/client.reconnectFarm.spec.js.map +1 -1
- package/lib/test/client.rollback.spec.js +8 -6
- package/lib/test/client.rollback.spec.js.map +1 -1
- package/lib/test/client.searchForMarker.spec.js +2 -2
- package/lib/test/client.searchForMarker.spec.js.map +1 -1
- package/lib/test/clientTestHelper.js +1 -1
- package/lib/test/clientTestHelper.js.map +1 -1
- package/lib/test/mergeTree.annotate.spec.js +25 -25
- package/lib/test/mergeTree.annotate.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/obliterate.spec.js +4 -4
- package/lib/test/obliterate.spec.js.map +1 -1
- package/lib/test/resetPendingSegmentsToOp.spec.js +14 -14
- package/lib/test/resetPendingSegmentsToOp.spec.js.map +1 -1
- package/lib/test/snapshot.utils.js +1 -1
- package/lib/test/snapshot.utils.js.map +1 -1
- package/lib/test/sortedSegmentSet.spec.js +3 -3
- package/lib/test/sortedSegmentSet.spec.js.map +1 -1
- package/lib/test/testClient.js +3 -3
- package/lib/test/testClient.js.map +1 -1
- package/lib/test/tracking.spec.js +7 -7
- package/lib/test/tracking.spec.js.map +1 -1
- package/lib/test/wordUnitTests.spec.js.map +1 -1
- package/package.json +16 -16
- package/src/client.ts +117 -50
- package/src/collections/list.ts +101 -5
- package/src/constants.ts +6 -0
- package/src/index.ts +3 -0
- package/src/mergeTree.ts +30 -24
- package/src/perspective.ts +26 -0
- package/src/revertibles.ts +1 -1
- package/src/stamps.ts +9 -1
package/src/mergeTree.ts
CHANGED
|
@@ -469,15 +469,17 @@ function getSlideToSegment(
|
|
|
469
469
|
* @internal
|
|
470
470
|
*/
|
|
471
471
|
export function getSlideToSegoff(
|
|
472
|
-
segoff: { segment: ISegmentInternal
|
|
472
|
+
segoff: { segment: ISegmentInternal; offset: number } | undefined,
|
|
473
473
|
slidingPreference: SlidingPreference = SlidingPreference.FORWARD,
|
|
474
474
|
perspective: Perspective = allAckedChangesPerspective,
|
|
475
475
|
useNewSlidingBehavior: boolean = false,
|
|
476
|
-
):
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
476
|
+
):
|
|
477
|
+
| {
|
|
478
|
+
segment: ISegmentInternal;
|
|
479
|
+
offset: number;
|
|
480
|
+
}
|
|
481
|
+
| undefined {
|
|
482
|
+
if (!isSegmentLeaf(segoff?.segment)) {
|
|
481
483
|
return segoff;
|
|
482
484
|
}
|
|
483
485
|
const [segment, _] = getSlideToSegment(
|
|
@@ -490,8 +492,11 @@ export function getSlideToSegoff(
|
|
|
490
492
|
if (segment === segoff.segment) {
|
|
491
493
|
return segoff;
|
|
492
494
|
}
|
|
493
|
-
|
|
494
|
-
|
|
495
|
+
if (segment === undefined) {
|
|
496
|
+
return undefined;
|
|
497
|
+
}
|
|
498
|
+
|
|
499
|
+
const offset = segment.ordinal < segoff.segment.ordinal ? segment.cachedLength - 1 : 0;
|
|
495
500
|
return {
|
|
496
501
|
segment,
|
|
497
502
|
offset,
|
|
@@ -849,10 +854,12 @@ export class MergeTree {
|
|
|
849
854
|
public getContainingSegment(
|
|
850
855
|
pos: number,
|
|
851
856
|
perspective: Perspective,
|
|
852
|
-
):
|
|
853
|
-
|
|
854
|
-
|
|
855
|
-
|
|
857
|
+
):
|
|
858
|
+
| {
|
|
859
|
+
segment: ISegmentLeaf;
|
|
860
|
+
offset: number;
|
|
861
|
+
}
|
|
862
|
+
| undefined {
|
|
856
863
|
assert(
|
|
857
864
|
perspective.localSeq === undefined ||
|
|
858
865
|
perspective.clientId === this.collabWindow.clientId,
|
|
@@ -868,6 +875,9 @@ export class MergeTree {
|
|
|
868
875
|
return false;
|
|
869
876
|
};
|
|
870
877
|
this.nodeMap(perspective, leaf, undefined, pos, pos + 1);
|
|
878
|
+
if (segment === undefined || offset === undefined) {
|
|
879
|
+
return undefined;
|
|
880
|
+
}
|
|
871
881
|
return { segment, offset };
|
|
872
882
|
}
|
|
873
883
|
|
|
@@ -1260,17 +1270,18 @@ export class MergeTree {
|
|
|
1260
1270
|
): Marker | undefined {
|
|
1261
1271
|
let foundMarker: Marker | undefined;
|
|
1262
1272
|
|
|
1263
|
-
const
|
|
1264
|
-
if (!isSegmentLeaf(segment)) {
|
|
1273
|
+
const segoff = this.getContainingSegment(startPos, this.localPerspective);
|
|
1274
|
+
if (!isSegmentLeaf(segoff?.segment)) {
|
|
1265
1275
|
return undefined;
|
|
1266
1276
|
}
|
|
1277
|
+
const { segment } = segoff;
|
|
1267
1278
|
|
|
1268
1279
|
depthFirstNodeWalk(
|
|
1269
1280
|
segment.parent,
|
|
1270
1281
|
segment,
|
|
1271
1282
|
(node) => {
|
|
1272
1283
|
if (node.isLeaf()) {
|
|
1273
|
-
if (Marker.is(node) && refHasTileLabel(node, markerLabel)) {
|
|
1284
|
+
if (!isRemoved(node) && Marker.is(node) && refHasTileLabel(node, markerLabel)) {
|
|
1274
1285
|
foundMarker = node;
|
|
1275
1286
|
}
|
|
1276
1287
|
} else {
|
|
@@ -1529,7 +1540,7 @@ export class MergeTree {
|
|
|
1529
1540
|
|
|
1530
1541
|
if (isSegmentLeaf(segmentInfo?.segment)) {
|
|
1531
1542
|
const segmentPosition = this.getPosition(segmentInfo.segment, this.localPerspective);
|
|
1532
|
-
return segmentPosition + segmentInfo.offset
|
|
1543
|
+
return segmentPosition + segmentInfo.offset;
|
|
1533
1544
|
} else {
|
|
1534
1545
|
if (remoteClientPosition === this.getLength(remotePerspective)) {
|
|
1535
1546
|
return this.getLength(this.localPerspective);
|
|
@@ -2085,14 +2096,9 @@ export class MergeTree {
|
|
|
2085
2096
|
const createRefFromSequencePlace = (
|
|
2086
2097
|
place: InteriorSequencePlace,
|
|
2087
2098
|
): LocalReferencePosition => {
|
|
2088
|
-
const
|
|
2089
|
-
|
|
2090
|
-
|
|
2091
|
-
);
|
|
2092
|
-
assert(
|
|
2093
|
-
isSegmentLeaf(placeSeg) && placeOffset !== undefined,
|
|
2094
|
-
0xa3f /* segments cannot be undefined */,
|
|
2095
|
-
);
|
|
2099
|
+
const segOff = this.getContainingSegment(place.pos, perspective);
|
|
2100
|
+
assert(isSegmentLeaf(segOff?.segment), 0xa3f /* segments cannot be undefined */);
|
|
2101
|
+
const { segment: placeSeg, offset: placeOffset } = segOff;
|
|
2096
2102
|
return this.createLocalReferencePosition(
|
|
2097
2103
|
placeSeg,
|
|
2098
2104
|
placeOffset,
|
package/src/perspective.ts
CHANGED
|
@@ -117,6 +117,32 @@ export class LocalReconnectingPerspective extends PerspectiveBase implements Per
|
|
|
117
117
|
}
|
|
118
118
|
}
|
|
119
119
|
|
|
120
|
+
/**
|
|
121
|
+
* This perspective is used when rebasing obliterate endpoints to find the segment to slide to when squash is enabled.
|
|
122
|
+
*
|
|
123
|
+
* TODO:AB#39357: This class would not be necessary if obliterate rebasing occurred as resubmit was called rather than
|
|
124
|
+
* precomputed before segment normalization. It also adds more dependencies on all ops being resubmitted (the squash
|
|
125
|
+
* parameter coming from rebasing an obliterate does not necessarily align with an inserted segment), which is not
|
|
126
|
+
* fully correct.
|
|
127
|
+
*/
|
|
128
|
+
export class LocalSquashPerspective extends LocalReconnectingPerspective {
|
|
129
|
+
public constructor(
|
|
130
|
+
readonly refSeq: number,
|
|
131
|
+
readonly clientId: number,
|
|
132
|
+
readonly localSeq: number,
|
|
133
|
+
) {
|
|
134
|
+
super(refSeq, clientId, localSeq);
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
public override isSegmentPresent(seg: ISegment): boolean {
|
|
138
|
+
// Avoid sliding to segments whose insertion will be squashed.
|
|
139
|
+
if (isInserted(seg) && opstampUtils.isLocal(seg.insert) && isRemoved(seg)) {
|
|
140
|
+
return false;
|
|
141
|
+
}
|
|
142
|
+
return super.isSegmentPresent(seg);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
|
|
120
146
|
/**
|
|
121
147
|
* A perspective which includes edits which were either:
|
|
122
148
|
* - acked and at or before some reference sequence number
|
package/src/revertibles.ts
CHANGED
|
@@ -309,7 +309,7 @@ function revertLocalRemove(
|
|
|
309
309
|
const insertSegment = mergeTreeWithRevert.getContainingSegment(
|
|
310
310
|
realPos,
|
|
311
311
|
mergeTreeWithRevert.localPerspective,
|
|
312
|
-
)
|
|
312
|
+
)?.segment;
|
|
313
313
|
assertSegmentLeaf(insertSegment);
|
|
314
314
|
|
|
315
315
|
const localSlideFilter = (lref: LocalReferencePosition): boolean =>
|
package/src/stamps.ts
CHANGED
|
@@ -3,7 +3,11 @@
|
|
|
3
3
|
* Licensed under the MIT License.
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
|
-
import {
|
|
6
|
+
import {
|
|
7
|
+
SquashClient,
|
|
8
|
+
UnassignedSequenceNumber,
|
|
9
|
+
UniversalSequenceNumber,
|
|
10
|
+
} from "./constants.js";
|
|
7
11
|
|
|
8
12
|
/**
|
|
9
13
|
* A stamp that identifies provenance of an operation performed on the MergeTree.
|
|
@@ -122,6 +126,10 @@ export function isLocal(a: OperationStamp): boolean {
|
|
|
122
126
|
return a.seq === UnassignedSequenceNumber;
|
|
123
127
|
}
|
|
124
128
|
|
|
129
|
+
export function isSquashedOp(a: OperationStamp): boolean {
|
|
130
|
+
return a.clientId === SquashClient && a.seq === UniversalSequenceNumber;
|
|
131
|
+
}
|
|
132
|
+
|
|
125
133
|
export function isAcked(a: OperationStamp): boolean {
|
|
126
134
|
return a.seq !== UnassignedSequenceNumber;
|
|
127
135
|
}
|