@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/CHANGELOG.md
CHANGED
package/dist/client.d.ts
CHANGED
|
@@ -124,8 +124,8 @@ export declare class Client extends TypedEventEmitter<IClientEvents> {
|
|
|
124
124
|
* @param segment - The segment to insert
|
|
125
125
|
*/
|
|
126
126
|
insertAtReferencePositionLocal(refPos: ReferencePosition, segment: ISegment): IMergeTreeInsertMsg | undefined;
|
|
127
|
-
walkSegments<TClientData>(handler: ISegmentAction<TClientData>, start: number | undefined, end: number | undefined, accum: TClientData, splitRange?: boolean): void;
|
|
128
|
-
walkSegments(handler: ISegmentAction<undefined>, start?: number, end?: number, accum?: undefined, splitRange?: boolean): void;
|
|
127
|
+
walkSegments<TClientData>(handler: ISegmentAction<TClientData>, start: number | undefined, end: number | undefined, accum: TClientData, splitRange?: boolean, perspective?: Pick<ISequencedDocumentMessage, "clientId" | "referenceSequenceNumber">): void;
|
|
128
|
+
walkSegments(handler: ISegmentAction<undefined>, start?: number, end?: number, accum?: undefined, splitRange?: boolean, perspective?: Pick<ISequencedDocumentMessage, "clientId" | "referenceSequenceNumber">): void;
|
|
129
129
|
protected walkAllSegments<TClientData>(action: (segment: ISegment, accum?: TClientData) => boolean, accum?: TClientData): boolean;
|
|
130
130
|
/**
|
|
131
131
|
* Serializes the data required for garbage collection. The IFluidHandles stored in all segments that haven't
|
|
@@ -249,13 +249,16 @@ export declare class Client extends TypedEventEmitter<IClientEvents> {
|
|
|
249
249
|
private lastNormalization;
|
|
250
250
|
private pendingRebase;
|
|
251
251
|
private readonly cachedObliterateRebases;
|
|
252
|
+
private squashInsertion;
|
|
252
253
|
/**
|
|
253
254
|
* Given a pending operation and segment group, regenerate the op, so it
|
|
254
255
|
* can be resubmitted
|
|
255
256
|
* @param resetOp - The op to reset
|
|
256
257
|
* @param segmentGroup - The segment group associated with the op
|
|
258
|
+
* @param squash - whether intermediate states should be squashed. See `IDeltaHandler.reSubmit`'s squash parameter
|
|
259
|
+
* documentation for more details.
|
|
257
260
|
*/
|
|
258
|
-
regeneratePendingOp(resetOp: IMergeTreeOp, localOpMetadata: unknown): IMergeTreeOp;
|
|
261
|
+
regeneratePendingOp(resetOp: IMergeTreeOp, localOpMetadata: unknown, squash: boolean): IMergeTreeOp;
|
|
259
262
|
createTextHelper(): IMergeTreeTextHelper;
|
|
260
263
|
summarize(runtime: IFluidDataStoreRuntime, handle: IFluidHandle, serializer: IFluidSerializer, catchUpMsgs: ISequencedDocumentMessage[]): ISummaryTreeWithStats;
|
|
261
264
|
load(runtime: IFluidDataStoreRuntime, storage: IChannelStorageService, serializer: IFluidSerializer): Promise<{
|
|
@@ -264,9 +267,9 @@ export declare class Client extends TypedEventEmitter<IClientEvents> {
|
|
|
264
267
|
localTransaction(groupOp: IMergeTreeGroupMsg): void;
|
|
265
268
|
updateMinSeq(minSeq: number): void;
|
|
266
269
|
getContainingSegment<T extends ISegment>(pos: number, sequenceArgs?: Pick<ISequencedDocumentMessage, "referenceSequenceNumber" | "clientId">, localSeq?: number): {
|
|
267
|
-
segment: T
|
|
268
|
-
offset: number
|
|
269
|
-
};
|
|
270
|
+
segment: T;
|
|
271
|
+
offset: number;
|
|
272
|
+
} | undefined;
|
|
270
273
|
getPropertiesAtPosition(pos: number): PropertySet | undefined;
|
|
271
274
|
getRangeExtentsOfPosition(pos: number): {
|
|
272
275
|
posStart: number | undefined;
|
package/dist/client.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AACjE,OAAO,EAAE,KAAK,qBAAqB,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAE3F,OAAO,EACN,sBAAsB,EACtB,sBAAsB,EACtB,MAAM,gDAAgD,CAAC;AACxD,OAAO,EAEN,yBAAyB,EACzB,MAAM,6CAA6C,CAAC;AACrD,OAAO,EAAE,qBAAqB,EAAE,MAAM,8CAA8C,CAAC;AAErF,OAAO,EAAE,gBAAgB,EAAE,MAAM,6CAA6C,CAAC;AAC/E,OAAO,EACN,mBAAmB,EAGnB,MAAM,0CAA0C,CAAC;AAElD,OAAO,EAAuB,KAAK,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAG1F,OAAO,EAAE,sBAAsB,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAChF,OAAO,EAKN,KAAK,yBAAyB,EAC9B,MAAM,gBAAgB,CAAC;AACxB,OAAO,KAAK,EACX,2BAA2B,EAC3B,qBAAqB,EACrB,iCAAiC,EACjC,MAAM,6BAA6B,CAAC;AAErC,OAAO,EACN,mBAAmB,EACnB,QAAQ,EACR,cAAc,EAEd,MAAM,EAMN,MAAM,qBAAqB,CAAC;AAW7B,OAAO,EACN,YAAY,EACZ,qBAAqB,EAGrB,kBAAkB,EAClB,mBAAmB,EAEnB,uBAAuB,EACvB,YAAY,EACZ,mBAAmB,EACnB,iBAAiB,EAEjB,aAAa,EACb,KAAK,YAAY,EACjB,KAAK,2BAA2B,EAChC,KAAK,4BAA4B,EACjC,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|
package/dist/client.js
CHANGED
|
@@ -212,8 +212,10 @@ class Client extends client_utils_1.TypedEventEmitter {
|
|
|
212
212
|
}
|
|
213
213
|
return this.insertSegmentLocal(pos, segment);
|
|
214
214
|
}
|
|
215
|
-
walkSegments(handler, start, end, accum, splitRange = false) {
|
|
216
|
-
this._mergeTree.mapRange(handler,
|
|
215
|
+
walkSegments(handler, start, end, accum, splitRange = false, perspective) {
|
|
216
|
+
this._mergeTree.mapRange(handler, perspective === undefined
|
|
217
|
+
? this.getCollabWindow().localPerspective
|
|
218
|
+
: this.getOperationPerspective(perspective), accum, start, end, splitRange);
|
|
217
219
|
}
|
|
218
220
|
walkAllSegments(action, accum) {
|
|
219
221
|
return (0, mergeTreeNodeWalk_js_1.walkAllChildSegments)(this._mergeTree.root, accum === undefined ? action : (seg) => action(seg, accum));
|
|
@@ -577,11 +579,13 @@ class Client extends client_utils_1.TypedEventEmitter {
|
|
|
577
579
|
const useNewSlidingBehavior = true;
|
|
578
580
|
// Destructuring segment + offset is convenient and segment is reassigned
|
|
579
581
|
// eslint-disable-next-line prefer-const
|
|
580
|
-
|
|
581
|
-
newSegment
|
|
582
|
-
slidePreference === localReference_js_1.SlidingPreference.FORWARD
|
|
582
|
+
const segOff = (0, mergeTree_js_1.getSlideToSegoff)({ segment: oldSegment, offset: oldOffset }, slidePreference, reconnectingPerspective, useNewSlidingBehavior);
|
|
583
|
+
const { segment: newSegment, offset: newOffset } = segOff ?? {
|
|
584
|
+
segment: slidePreference === localReference_js_1.SlidingPreference.FORWARD
|
|
583
585
|
? this._mergeTree.endOfTree
|
|
584
|
-
: this._mergeTree.startOfTree
|
|
586
|
+
: this._mergeTree.startOfTree,
|
|
587
|
+
offset: 0,
|
|
588
|
+
};
|
|
585
589
|
(0, internal_1.assert)((0, mergeTreeNodes_js_1.isSegmentLeaf)(newSegment) && newOffset !== undefined, 0xb62 /* Invalid new segment on rebase */);
|
|
586
590
|
const newSide = newSegment === oldSegment
|
|
587
591
|
? side
|
|
@@ -592,9 +596,9 @@ class Client extends client_utils_1.TypedEventEmitter {
|
|
|
592
596
|
: sequencePlace_js_1.Side.After;
|
|
593
597
|
return { segment: newSegment, offset: newOffset, side: newSide };
|
|
594
598
|
}
|
|
595
|
-
computeNewObliterateEndpoints(obliterateInfo) {
|
|
599
|
+
computeNewObliterateEndpoints(obliterateInfo, squash) {
|
|
596
600
|
const { currentSeq, clientId } = this.getCollabWindow();
|
|
597
|
-
const reconnectingPerspective = new perspective_js_1.LocalReconnectingPerspective(currentSeq, clientId, obliterateInfo.stamp.localSeq - 1);
|
|
601
|
+
const reconnectingPerspective = new (squash ? perspective_js_1.LocalSquashPerspective : perspective_js_1.LocalReconnectingPerspective)(currentSeq, clientId, obliterateInfo.stamp.localSeq - 1);
|
|
598
602
|
const newStart = this.rebaseSidedLocalReference(obliterateInfo.start, obliterateInfo.startSide, reconnectingPerspective, localReference_js_1.SlidingPreference.FORWARD);
|
|
599
603
|
const newEnd = this.rebaseSidedLocalReference(obliterateInfo.end, obliterateInfo.endSide, reconnectingPerspective, localReference_js_1.SlidingPreference.BACKWARD);
|
|
600
604
|
return {
|
|
@@ -602,7 +606,7 @@ class Client extends client_utils_1.TypedEventEmitter {
|
|
|
602
606
|
end: newEnd,
|
|
603
607
|
};
|
|
604
608
|
}
|
|
605
|
-
resetPendingDeltaToOps(resetOp, segmentGroup) {
|
|
609
|
+
resetPendingDeltaToOps(resetOp, segmentGroup, squash) {
|
|
606
610
|
(0, internal_1.assert)(!!segmentGroup, 0x033 /* "Segment group undefined" */);
|
|
607
611
|
const NACKedSegmentGroup = this.pendingRebase?.shift()?.data;
|
|
608
612
|
(0, internal_1.assert)(segmentGroup === NACKedSegmentGroup, 0x034 /* "Segment group not at head of pending rebase queue" */);
|
|
@@ -629,11 +633,17 @@ class Client extends client_utils_1.TypedEventEmitter {
|
|
|
629
633
|
for (const segment of segmentGroup.segments) {
|
|
630
634
|
(0, internal_1.assert)((0, mergeTree_js_1.isRemovedAndAcked)(segment), 0xb66 /* On reconnect, obliterate applied to new segments even though original ones were not removed. */);
|
|
631
635
|
const lastRemove = segment.removes[segment.removes.length - 1];
|
|
632
|
-
(0, internal_1.assert)(lastRemove.type === "sliceRemove" &&
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
//
|
|
636
|
-
segment
|
|
636
|
+
(0, internal_1.assert)((lastRemove.type === "sliceRemove" &&
|
|
637
|
+
lastRemove.localSeq === segmentGroup.localSeq) ||
|
|
638
|
+
opstampUtils.isSquashedOp(lastRemove), 0xbad /* Last remove should be the obliterate that is being resubmitted. */);
|
|
639
|
+
// The original obliterate affected this segment, but it has since been removed.
|
|
640
|
+
// This can happen when a concurrent obliterate also removed the segment, as well as when the segment was
|
|
641
|
+
// only locally inserted and its insertion was squashed upon reconnecting.
|
|
642
|
+
// In the concurrent removal case (where we didn't avoid sending the segment's insertion in the first place due
|
|
643
|
+
// to squashing), we adjust the metadata on that segment to reflect the fact that this obliterate no longer removes it.
|
|
644
|
+
if (!opstampUtils.isSquashedOp(lastRemove)) {
|
|
645
|
+
segment.removes.pop();
|
|
646
|
+
}
|
|
637
647
|
}
|
|
638
648
|
this._mergeTree.rebaseObliterateTo(obliterateInfo, undefined);
|
|
639
649
|
return [];
|
|
@@ -662,19 +672,24 @@ class Client extends client_utils_1.TypedEventEmitter {
|
|
|
662
672
|
};
|
|
663
673
|
for (const segment of segmentGroup.segments) {
|
|
664
674
|
(0, internal_1.assert)(segment.segmentGroups?.remove(segmentGroup) === true, 0x035 /* "Segment group not in segment pending queue" */);
|
|
665
|
-
if ((
|
|
666
|
-
segment.ordinal
|
|
667
|
-
|
|
668
|
-
|
|
675
|
+
if (!(0, mergeTree_js_1.isRemovedAndAcked)(segment) &&
|
|
676
|
+
((segment.ordinal > newStartSegment.ordinal &&
|
|
677
|
+
segment.ordinal < newEndSegment.ordinal) ||
|
|
678
|
+
(segment === newStartSegment && newStartSide === sequencePlace_js_1.Side.Before) ||
|
|
679
|
+
(segment === newEndSegment && newEndSide === sequencePlace_js_1.Side.After))) {
|
|
669
680
|
segment.segmentGroups.enqueue(newObliterate.segmentGroup);
|
|
670
681
|
}
|
|
671
682
|
else {
|
|
672
683
|
(0, internal_1.assert)((0, mergeTree_js_1.isRemovedAndAcked)(segment), 0xb69 /* On reconnect, obliterate applied to new segments even though original ones were not removed. */);
|
|
673
684
|
const lastRemove = segment.removes[segment.removes.length - 1];
|
|
674
|
-
(0, internal_1.assert)(lastRemove.type === "sliceRemove" &&
|
|
675
|
-
|
|
676
|
-
|
|
677
|
-
|
|
685
|
+
(0, internal_1.assert)((lastRemove.type === "sliceRemove" &&
|
|
686
|
+
lastRemove.localSeq === segmentGroup.localSeq) ||
|
|
687
|
+
opstampUtils.isSquashedOp(lastRemove), 0xbae /* Last remove should be the obliterate that is being resubmitted. */);
|
|
688
|
+
if (!opstampUtils.isSquashedOp(lastRemove)) {
|
|
689
|
+
// The original obliterate affected this segment, but it has since been removed and it's impossible to apply the
|
|
690
|
+
// local obliterate so that is so. We adjust the metadata on that segment now.
|
|
691
|
+
segment.removes.pop();
|
|
692
|
+
}
|
|
678
693
|
}
|
|
679
694
|
}
|
|
680
695
|
this._mergeTree.rebaseObliterateTo(obliterateInfo, newObliterate);
|
|
@@ -727,9 +742,19 @@ class Client extends client_utils_1.TypedEventEmitter {
|
|
|
727
742
|
break;
|
|
728
743
|
}
|
|
729
744
|
case ops_js_1.MergeTreeDeltaType.INSERT: {
|
|
745
|
+
if ((0, segmentInfos_js_1.isInserted)(segment) && opstampUtils.isSquashedOp(segment.insert)) {
|
|
746
|
+
break;
|
|
747
|
+
}
|
|
730
748
|
(0, internal_1.assert)((0, segmentInfos_js_1.isInserted)(segment) && opstampUtils.isLocal(segment.insert), 0x037 /* "Segment already has assigned sequence number" */);
|
|
731
749
|
const removeInfo = (0, segmentInfos_js_1.toRemovalInfo)(segment);
|
|
732
|
-
|
|
750
|
+
const unusedStamp = { seq: 0, clientId: 0 };
|
|
751
|
+
if (removeInfo !== undefined && squash) {
|
|
752
|
+
(0, internal_1.assert)(removeInfo.removes.length === 1 ||
|
|
753
|
+
opstampUtils.isAcked(removeInfo.removes[removeInfo.removes.length - 2]), 0xbaf /* Expected only one local remove */);
|
|
754
|
+
this.squashInsertion(segment);
|
|
755
|
+
break;
|
|
756
|
+
}
|
|
757
|
+
else if (removeInfo !== undefined && opstampUtils.isAcked(removeInfo.removes[0])) {
|
|
733
758
|
(0, internal_1.assert)(removeInfo.removes[0].type === "sliceRemove", 0xb5c /* Remove on insertion must be caused by obliterate. */);
|
|
734
759
|
(0, mergeTree_js_1.errorIfOptionNotTrue)(this._mergeTree.options, "mergeTreeEnableObliterateReconnect");
|
|
735
760
|
// the segment was remotely obliterated, so is considered removed
|
|
@@ -744,6 +769,7 @@ class Client extends client_utils_1.TypedEventEmitter {
|
|
|
744
769
|
clientId: constants_js_1.NonCollabClient,
|
|
745
770
|
},
|
|
746
771
|
});
|
|
772
|
+
this._mergeTree.blockUpdatePathLengths(segment.parent, unusedStamp, true);
|
|
747
773
|
break;
|
|
748
774
|
}
|
|
749
775
|
const segInsertOp = segment.clone();
|
|
@@ -883,13 +909,34 @@ class Client extends client_utils_1.TypedEventEmitter {
|
|
|
883
909
|
const shortRemoteClientId = this.getOrAddShortClientId(remoteClientId);
|
|
884
910
|
return this._mergeTree.resolveRemoteClientPosition(remoteClientPosition, remoteClientRefSeq, shortRemoteClientId);
|
|
885
911
|
}
|
|
912
|
+
squashInsertion(segment) {
|
|
913
|
+
(0, segmentInfos_js_1.overwriteInfo)(segment, {
|
|
914
|
+
insert: {
|
|
915
|
+
type: "insert",
|
|
916
|
+
seq: constants_js_1.UniversalSequenceNumber,
|
|
917
|
+
localSeq: undefined,
|
|
918
|
+
clientId: constants_js_1.SquashClient,
|
|
919
|
+
},
|
|
920
|
+
removes: [
|
|
921
|
+
{
|
|
922
|
+
type: "setRemove",
|
|
923
|
+
seq: constants_js_1.UniversalSequenceNumber,
|
|
924
|
+
localSeq: undefined,
|
|
925
|
+
clientId: constants_js_1.SquashClient,
|
|
926
|
+
},
|
|
927
|
+
],
|
|
928
|
+
});
|
|
929
|
+
this._mergeTree.blockUpdatePathLengths(segment.parent, { seq: 0, clientId: 0 }, true);
|
|
930
|
+
}
|
|
886
931
|
/**
|
|
887
932
|
* Given a pending operation and segment group, regenerate the op, so it
|
|
888
933
|
* can be resubmitted
|
|
889
934
|
* @param resetOp - The op to reset
|
|
890
935
|
* @param segmentGroup - The segment group associated with the op
|
|
936
|
+
* @param squash - whether intermediate states should be squashed. See `IDeltaHandler.reSubmit`'s squash parameter
|
|
937
|
+
* documentation for more details.
|
|
891
938
|
*/
|
|
892
|
-
regeneratePendingOp(resetOp, localOpMetadata) {
|
|
939
|
+
regeneratePendingOp(resetOp, localOpMetadata, squash) {
|
|
893
940
|
const segmentGroup = localOpMetadata;
|
|
894
941
|
if (this.pendingRebase === undefined || this.pendingRebase.empty) {
|
|
895
942
|
let firstGroup;
|
|
@@ -911,13 +958,14 @@ class Client extends client_utils_1.TypedEventEmitter {
|
|
|
911
958
|
if (this.lastNormalization === undefined ||
|
|
912
959
|
collabWindow.currentSeq !== this.lastNormalization.refSeq ||
|
|
913
960
|
collabWindow.localSeq !== this.lastNormalization.localRefSeq) {
|
|
961
|
+
const allPendingSegments = [...this._mergeTree.pendingSegments, ...this.pendingRebase];
|
|
914
962
|
// Compute obliterate endpoint destinations before segments are normalized.
|
|
915
963
|
// Segment normalization can affect what should be the semantically correct segments for the endpoints to be placed on.
|
|
916
964
|
this.cachedObliterateRebases.clear();
|
|
917
|
-
for (const group of
|
|
965
|
+
for (const group of allPendingSegments) {
|
|
918
966
|
const { obliterateInfo } = group.data;
|
|
919
967
|
if (obliterateInfo !== undefined) {
|
|
920
|
-
const { start, end } = this.computeNewObliterateEndpoints(obliterateInfo);
|
|
968
|
+
const { start, end } = this.computeNewObliterateEndpoints(obliterateInfo, squash);
|
|
921
969
|
const { localSeq } = obliterateInfo.stamp;
|
|
922
970
|
(0, internal_1.assert)(localSeq !== undefined, 0xb6d /* Local seq must be defined */);
|
|
923
971
|
this.cachedObliterateRebases.set(localSeq, { start, end });
|
|
@@ -935,20 +983,20 @@ class Client extends client_utils_1.TypedEventEmitter {
|
|
|
935
983
|
if (Array.isArray(segmentGroup)) {
|
|
936
984
|
(0, internal_1.assert)(resetOp.ops.length === segmentGroup.length, 0x03a /* "Number of ops in 'resetOp' must match the number of segment groups provided." */);
|
|
937
985
|
for (let i = 0; i < resetOp.ops.length; i++) {
|
|
938
|
-
opList.push(...this.resetPendingDeltaToOps(resetOp.ops[i], segmentGroup[i]));
|
|
986
|
+
opList.push(...this.resetPendingDeltaToOps(resetOp.ops[i], segmentGroup[i], squash));
|
|
939
987
|
}
|
|
940
988
|
}
|
|
941
989
|
else {
|
|
942
990
|
// A group op containing a single op will pass a direct reference to 'segmentGroup'
|
|
943
991
|
// rather than an array of segment groups. (See 'peekPendingSegmentGroups()')
|
|
944
992
|
(0, internal_1.assert)(resetOp.ops.length === 1, 0x03b /* "Number of ops in 'resetOp' must match the number of segment groups provided." */);
|
|
945
|
-
opList.push(...this.resetPendingDeltaToOps(resetOp.ops[0], segmentGroup));
|
|
993
|
+
opList.push(...this.resetPendingDeltaToOps(resetOp.ops[0], segmentGroup, squash));
|
|
946
994
|
}
|
|
947
995
|
}
|
|
948
996
|
else {
|
|
949
997
|
(0, internal_1.assert)(resetOp.type !== ops_js_1.MergeTreeDeltaType.GROUP, 0x03c /* "Reset op has 'group' delta type!" */);
|
|
950
998
|
(0, internal_1.assert)(!Array.isArray(segmentGroup), 0x03d /* "segmentGroup is array rather than singleton!" */);
|
|
951
|
-
opList.push(...this.resetPendingDeltaToOps(resetOp, segmentGroup));
|
|
999
|
+
opList.push(...this.resetPendingDeltaToOps(resetOp, segmentGroup, squash));
|
|
952
1000
|
}
|
|
953
1001
|
return opList.length === 1 ? opList[0] : (0, opBuilder_js_1.createGroupOp)(...opList);
|
|
954
1002
|
}
|
|
@@ -1035,19 +1083,14 @@ class Client extends client_utils_1.TypedEventEmitter {
|
|
|
1035
1083
|
return this._mergeTree.getContainingSegment(pos, perspective);
|
|
1036
1084
|
}
|
|
1037
1085
|
getPropertiesAtPosition(pos) {
|
|
1038
|
-
let propertiesAtPosition;
|
|
1039
1086
|
const segoff = this.getContainingSegment(pos);
|
|
1040
|
-
|
|
1041
|
-
if (seg) {
|
|
1042
|
-
propertiesAtPosition = seg.properties;
|
|
1043
|
-
}
|
|
1044
|
-
return propertiesAtPosition;
|
|
1087
|
+
return segoff?.segment?.properties;
|
|
1045
1088
|
}
|
|
1046
1089
|
getRangeExtentsOfPosition(pos) {
|
|
1047
1090
|
let posStart;
|
|
1048
1091
|
let posAfterEnd;
|
|
1049
1092
|
const segoff = this.getContainingSegment(pos);
|
|
1050
|
-
const seg = segoff
|
|
1093
|
+
const seg = segoff?.segment;
|
|
1051
1094
|
if (seg) {
|
|
1052
1095
|
posStart = this.getPosition(seg);
|
|
1053
1096
|
posAfterEnd = posStart + seg.cachedLength;
|