@fluidframework/merge-tree 2.41.0 → 2.42.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/client.d.ts +6 -3
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +71 -25
- package/dist/client.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/mergeTree.js +1 -1
- 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/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/client.applyMsg.spec.js +4 -4
- 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.reconnectFarm.spec.js +1 -1
- package/dist/test/client.reconnectFarm.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/resetPendingSegmentsToOp.spec.js +10 -10
- package/dist/test/resetPendingSegmentsToOp.spec.js.map +1 -1
- package/lib/client.d.ts +6 -3
- package/lib/client.d.ts.map +1 -1
- package/lib/client.js +73 -27
- package/lib/client.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/mergeTree.js +1 -1
- 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/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/client.applyMsg.spec.js +4 -4
- 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.reconnectFarm.spec.js +1 -1
- package/lib/test/client.reconnectFarm.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/resetPendingSegmentsToOp.spec.js +10 -10
- package/lib/test/resetPendingSegmentsToOp.spec.js.map +1 -1
- package/package.json +16 -16
- package/src/client.ts +95 -30
- package/src/constants.ts +6 -0
- package/src/mergeTree.ts +1 -1
- package/src/perspective.ts +26 -0
- 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<{
|
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));
|
|
@@ -592,9 +594,9 @@ class Client extends client_utils_1.TypedEventEmitter {
|
|
|
592
594
|
: sequencePlace_js_1.Side.After;
|
|
593
595
|
return { segment: newSegment, offset: newOffset, side: newSide };
|
|
594
596
|
}
|
|
595
|
-
computeNewObliterateEndpoints(obliterateInfo) {
|
|
597
|
+
computeNewObliterateEndpoints(obliterateInfo, squash) {
|
|
596
598
|
const { currentSeq, clientId } = this.getCollabWindow();
|
|
597
|
-
const reconnectingPerspective = new perspective_js_1.LocalReconnectingPerspective(currentSeq, clientId, obliterateInfo.stamp.localSeq - 1);
|
|
599
|
+
const reconnectingPerspective = new (squash ? perspective_js_1.LocalSquashPerspective : perspective_js_1.LocalReconnectingPerspective)(currentSeq, clientId, obliterateInfo.stamp.localSeq - 1);
|
|
598
600
|
const newStart = this.rebaseSidedLocalReference(obliterateInfo.start, obliterateInfo.startSide, reconnectingPerspective, localReference_js_1.SlidingPreference.FORWARD);
|
|
599
601
|
const newEnd = this.rebaseSidedLocalReference(obliterateInfo.end, obliterateInfo.endSide, reconnectingPerspective, localReference_js_1.SlidingPreference.BACKWARD);
|
|
600
602
|
return {
|
|
@@ -602,7 +604,7 @@ class Client extends client_utils_1.TypedEventEmitter {
|
|
|
602
604
|
end: newEnd,
|
|
603
605
|
};
|
|
604
606
|
}
|
|
605
|
-
resetPendingDeltaToOps(resetOp, segmentGroup) {
|
|
607
|
+
resetPendingDeltaToOps(resetOp, segmentGroup, squash) {
|
|
606
608
|
(0, internal_1.assert)(!!segmentGroup, 0x033 /* "Segment group undefined" */);
|
|
607
609
|
const NACKedSegmentGroup = this.pendingRebase?.shift()?.data;
|
|
608
610
|
(0, internal_1.assert)(segmentGroup === NACKedSegmentGroup, 0x034 /* "Segment group not at head of pending rebase queue" */);
|
|
@@ -629,11 +631,17 @@ class Client extends client_utils_1.TypedEventEmitter {
|
|
|
629
631
|
for (const segment of segmentGroup.segments) {
|
|
630
632
|
(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
633
|
const lastRemove = segment.removes[segment.removes.length - 1];
|
|
632
|
-
(0, internal_1.assert)(lastRemove.type === "sliceRemove" &&
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
//
|
|
636
|
-
segment
|
|
634
|
+
(0, internal_1.assert)((lastRemove.type === "sliceRemove" &&
|
|
635
|
+
lastRemove.localSeq === segmentGroup.localSeq) ||
|
|
636
|
+
opstampUtils.isSquashedOp(lastRemove), 0xbad /* Last remove should be the obliterate that is being resubmitted. */);
|
|
637
|
+
// The original obliterate affected this segment, but it has since been removed.
|
|
638
|
+
// This can happen when a concurrent obliterate also removed the segment, as well as when the segment was
|
|
639
|
+
// only locally inserted and its insertion was squashed upon reconnecting.
|
|
640
|
+
// In the concurrent removal case (where we didn't avoid sending the segment's insertion in the first place due
|
|
641
|
+
// to squashing), we adjust the metadata on that segment to reflect the fact that this obliterate no longer removes it.
|
|
642
|
+
if (!opstampUtils.isSquashedOp(lastRemove)) {
|
|
643
|
+
segment.removes.pop();
|
|
644
|
+
}
|
|
637
645
|
}
|
|
638
646
|
this._mergeTree.rebaseObliterateTo(obliterateInfo, undefined);
|
|
639
647
|
return [];
|
|
@@ -662,19 +670,24 @@ class Client extends client_utils_1.TypedEventEmitter {
|
|
|
662
670
|
};
|
|
663
671
|
for (const segment of segmentGroup.segments) {
|
|
664
672
|
(0, internal_1.assert)(segment.segmentGroups?.remove(segmentGroup) === true, 0x035 /* "Segment group not in segment pending queue" */);
|
|
665
|
-
if ((
|
|
666
|
-
segment.ordinal
|
|
667
|
-
|
|
668
|
-
|
|
673
|
+
if (!(0, mergeTree_js_1.isRemovedAndAcked)(segment) &&
|
|
674
|
+
((segment.ordinal > newStartSegment.ordinal &&
|
|
675
|
+
segment.ordinal < newEndSegment.ordinal) ||
|
|
676
|
+
(segment === newStartSegment && newStartSide === sequencePlace_js_1.Side.Before) ||
|
|
677
|
+
(segment === newEndSegment && newEndSide === sequencePlace_js_1.Side.After))) {
|
|
669
678
|
segment.segmentGroups.enqueue(newObliterate.segmentGroup);
|
|
670
679
|
}
|
|
671
680
|
else {
|
|
672
681
|
(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
682
|
const lastRemove = segment.removes[segment.removes.length - 1];
|
|
674
|
-
(0, internal_1.assert)(lastRemove.type === "sliceRemove" &&
|
|
675
|
-
|
|
676
|
-
|
|
677
|
-
|
|
683
|
+
(0, internal_1.assert)((lastRemove.type === "sliceRemove" &&
|
|
684
|
+
lastRemove.localSeq === segmentGroup.localSeq) ||
|
|
685
|
+
opstampUtils.isSquashedOp(lastRemove), 0xbae /* Last remove should be the obliterate that is being resubmitted. */);
|
|
686
|
+
if (!opstampUtils.isSquashedOp(lastRemove)) {
|
|
687
|
+
// The original obliterate affected this segment, but it has since been removed and it's impossible to apply the
|
|
688
|
+
// local obliterate so that is so. We adjust the metadata on that segment now.
|
|
689
|
+
segment.removes.pop();
|
|
690
|
+
}
|
|
678
691
|
}
|
|
679
692
|
}
|
|
680
693
|
this._mergeTree.rebaseObliterateTo(obliterateInfo, newObliterate);
|
|
@@ -727,9 +740,19 @@ class Client extends client_utils_1.TypedEventEmitter {
|
|
|
727
740
|
break;
|
|
728
741
|
}
|
|
729
742
|
case ops_js_1.MergeTreeDeltaType.INSERT: {
|
|
743
|
+
if ((0, segmentInfos_js_1.isInserted)(segment) && opstampUtils.isSquashedOp(segment.insert)) {
|
|
744
|
+
break;
|
|
745
|
+
}
|
|
730
746
|
(0, internal_1.assert)((0, segmentInfos_js_1.isInserted)(segment) && opstampUtils.isLocal(segment.insert), 0x037 /* "Segment already has assigned sequence number" */);
|
|
731
747
|
const removeInfo = (0, segmentInfos_js_1.toRemovalInfo)(segment);
|
|
732
|
-
|
|
748
|
+
const unusedStamp = { seq: 0, clientId: 0 };
|
|
749
|
+
if (removeInfo !== undefined && squash) {
|
|
750
|
+
(0, internal_1.assert)(removeInfo.removes.length === 1 ||
|
|
751
|
+
opstampUtils.isAcked(removeInfo.removes[removeInfo.removes.length - 2]), 0xbaf /* Expected only one local remove */);
|
|
752
|
+
this.squashInsertion(segment);
|
|
753
|
+
break;
|
|
754
|
+
}
|
|
755
|
+
else if (removeInfo !== undefined && opstampUtils.isAcked(removeInfo.removes[0])) {
|
|
733
756
|
(0, internal_1.assert)(removeInfo.removes[0].type === "sliceRemove", 0xb5c /* Remove on insertion must be caused by obliterate. */);
|
|
734
757
|
(0, mergeTree_js_1.errorIfOptionNotTrue)(this._mergeTree.options, "mergeTreeEnableObliterateReconnect");
|
|
735
758
|
// the segment was remotely obliterated, so is considered removed
|
|
@@ -744,6 +767,7 @@ class Client extends client_utils_1.TypedEventEmitter {
|
|
|
744
767
|
clientId: constants_js_1.NonCollabClient,
|
|
745
768
|
},
|
|
746
769
|
});
|
|
770
|
+
this._mergeTree.blockUpdatePathLengths(segment.parent, unusedStamp, true);
|
|
747
771
|
break;
|
|
748
772
|
}
|
|
749
773
|
const segInsertOp = segment.clone();
|
|
@@ -883,13 +907,34 @@ class Client extends client_utils_1.TypedEventEmitter {
|
|
|
883
907
|
const shortRemoteClientId = this.getOrAddShortClientId(remoteClientId);
|
|
884
908
|
return this._mergeTree.resolveRemoteClientPosition(remoteClientPosition, remoteClientRefSeq, shortRemoteClientId);
|
|
885
909
|
}
|
|
910
|
+
squashInsertion(segment) {
|
|
911
|
+
(0, segmentInfos_js_1.overwriteInfo)(segment, {
|
|
912
|
+
insert: {
|
|
913
|
+
type: "insert",
|
|
914
|
+
seq: constants_js_1.UniversalSequenceNumber,
|
|
915
|
+
localSeq: undefined,
|
|
916
|
+
clientId: constants_js_1.SquashClient,
|
|
917
|
+
},
|
|
918
|
+
removes: [
|
|
919
|
+
{
|
|
920
|
+
type: "setRemove",
|
|
921
|
+
seq: constants_js_1.UniversalSequenceNumber,
|
|
922
|
+
localSeq: undefined,
|
|
923
|
+
clientId: constants_js_1.SquashClient,
|
|
924
|
+
},
|
|
925
|
+
],
|
|
926
|
+
});
|
|
927
|
+
this._mergeTree.blockUpdatePathLengths(segment.parent, { seq: 0, clientId: 0 }, true);
|
|
928
|
+
}
|
|
886
929
|
/**
|
|
887
930
|
* Given a pending operation and segment group, regenerate the op, so it
|
|
888
931
|
* can be resubmitted
|
|
889
932
|
* @param resetOp - The op to reset
|
|
890
933
|
* @param segmentGroup - The segment group associated with the op
|
|
934
|
+
* @param squash - whether intermediate states should be squashed. See `IDeltaHandler.reSubmit`'s squash parameter
|
|
935
|
+
* documentation for more details.
|
|
891
936
|
*/
|
|
892
|
-
regeneratePendingOp(resetOp, localOpMetadata) {
|
|
937
|
+
regeneratePendingOp(resetOp, localOpMetadata, squash) {
|
|
893
938
|
const segmentGroup = localOpMetadata;
|
|
894
939
|
if (this.pendingRebase === undefined || this.pendingRebase.empty) {
|
|
895
940
|
let firstGroup;
|
|
@@ -911,13 +956,14 @@ class Client extends client_utils_1.TypedEventEmitter {
|
|
|
911
956
|
if (this.lastNormalization === undefined ||
|
|
912
957
|
collabWindow.currentSeq !== this.lastNormalization.refSeq ||
|
|
913
958
|
collabWindow.localSeq !== this.lastNormalization.localRefSeq) {
|
|
959
|
+
const allPendingSegments = [...this._mergeTree.pendingSegments, ...this.pendingRebase];
|
|
914
960
|
// Compute obliterate endpoint destinations before segments are normalized.
|
|
915
961
|
// Segment normalization can affect what should be the semantically correct segments for the endpoints to be placed on.
|
|
916
962
|
this.cachedObliterateRebases.clear();
|
|
917
|
-
for (const group of
|
|
963
|
+
for (const group of allPendingSegments) {
|
|
918
964
|
const { obliterateInfo } = group.data;
|
|
919
965
|
if (obliterateInfo !== undefined) {
|
|
920
|
-
const { start, end } = this.computeNewObliterateEndpoints(obliterateInfo);
|
|
966
|
+
const { start, end } = this.computeNewObliterateEndpoints(obliterateInfo, squash);
|
|
921
967
|
const { localSeq } = obliterateInfo.stamp;
|
|
922
968
|
(0, internal_1.assert)(localSeq !== undefined, 0xb6d /* Local seq must be defined */);
|
|
923
969
|
this.cachedObliterateRebases.set(localSeq, { start, end });
|
|
@@ -935,20 +981,20 @@ class Client extends client_utils_1.TypedEventEmitter {
|
|
|
935
981
|
if (Array.isArray(segmentGroup)) {
|
|
936
982
|
(0, internal_1.assert)(resetOp.ops.length === segmentGroup.length, 0x03a /* "Number of ops in 'resetOp' must match the number of segment groups provided." */);
|
|
937
983
|
for (let i = 0; i < resetOp.ops.length; i++) {
|
|
938
|
-
opList.push(...this.resetPendingDeltaToOps(resetOp.ops[i], segmentGroup[i]));
|
|
984
|
+
opList.push(...this.resetPendingDeltaToOps(resetOp.ops[i], segmentGroup[i], squash));
|
|
939
985
|
}
|
|
940
986
|
}
|
|
941
987
|
else {
|
|
942
988
|
// A group op containing a single op will pass a direct reference to 'segmentGroup'
|
|
943
989
|
// rather than an array of segment groups. (See 'peekPendingSegmentGroups()')
|
|
944
990
|
(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));
|
|
991
|
+
opList.push(...this.resetPendingDeltaToOps(resetOp.ops[0], segmentGroup, squash));
|
|
946
992
|
}
|
|
947
993
|
}
|
|
948
994
|
else {
|
|
949
995
|
(0, internal_1.assert)(resetOp.type !== ops_js_1.MergeTreeDeltaType.GROUP, 0x03c /* "Reset op has 'group' delta type!" */);
|
|
950
996
|
(0, internal_1.assert)(!Array.isArray(segmentGroup), 0x03d /* "segmentGroup is array rather than singleton!" */);
|
|
951
|
-
opList.push(...this.resetPendingDeltaToOps(resetOp, segmentGroup));
|
|
997
|
+
opList.push(...this.resetPendingDeltaToOps(resetOp, segmentGroup, squash));
|
|
952
998
|
}
|
|
953
999
|
return opList.length === 1 ? opList[0] : (0, opBuilder_js_1.createGroupOp)(...opList);
|
|
954
1000
|
}
|