@fluidframework/merge-tree 2.11.0 → 2.13.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 +45 -0
- package/api-report/merge-tree.legacy.alpha.api.md +50 -19
- package/dist/MergeTreeTextHelper.d.ts.map +1 -1
- package/dist/MergeTreeTextHelper.js +0 -2
- package/dist/MergeTreeTextHelper.js.map +1 -1
- package/dist/attributionPolicy.d.ts.map +1 -1
- package/dist/attributionPolicy.js +6 -15
- package/dist/attributionPolicy.js.map +1 -1
- package/dist/client.d.ts +3 -4
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +39 -28
- package/dist/client.js.map +1 -1
- package/dist/endOfTreeSegment.d.ts +5 -4
- package/dist/endOfTreeSegment.d.ts.map +1 -1
- package/dist/endOfTreeSegment.js.map +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -4
- package/dist/index.js.map +1 -1
- package/dist/legacy.d.ts +2 -1
- package/dist/localReference.d.ts +1 -0
- package/dist/localReference.d.ts.map +1 -1
- package/dist/localReference.js +1 -0
- package/dist/localReference.js.map +1 -1
- package/dist/mergeTree.d.ts +8 -7
- package/dist/mergeTree.d.ts.map +1 -1
- package/dist/mergeTree.js +202 -211
- package/dist/mergeTree.js.map +1 -1
- package/dist/mergeTreeNodeWalk.d.ts +5 -5
- package/dist/mergeTreeNodeWalk.d.ts.map +1 -1
- package/dist/mergeTreeNodeWalk.js +3 -2
- package/dist/mergeTreeNodeWalk.js.map +1 -1
- package/dist/mergeTreeNodes.d.ts +181 -159
- package/dist/mergeTreeNodes.d.ts.map +1 -1
- package/dist/mergeTreeNodes.js +121 -109
- package/dist/mergeTreeNodes.js.map +1 -1
- package/dist/mergeTreeTracking.d.ts.map +1 -1
- package/dist/mergeTreeTracking.js +0 -2
- package/dist/mergeTreeTracking.js.map +1 -1
- package/dist/partialLengths.d.ts +2 -2
- package/dist/partialLengths.d.ts.map +1 -1
- package/dist/partialLengths.js +33 -27
- package/dist/partialLengths.js.map +1 -1
- package/dist/perspective.d.ts +10 -9
- package/dist/perspective.d.ts.map +1 -1
- package/dist/perspective.js +11 -4
- package/dist/perspective.js.map +1 -1
- package/dist/referencePositions.d.ts.map +1 -1
- package/dist/referencePositions.js +4 -1
- package/dist/referencePositions.js.map +1 -1
- package/dist/revertibles.d.ts.map +1 -1
- package/dist/revertibles.js +13 -11
- package/dist/revertibles.js.map +1 -1
- package/dist/segmentGroupCollection.d.ts +4 -4
- package/dist/segmentGroupCollection.d.ts.map +1 -1
- package/dist/segmentGroupCollection.js +0 -6
- package/dist/segmentGroupCollection.js.map +1 -1
- package/dist/segmentInfos.d.ts +257 -0
- package/dist/segmentInfos.d.ts.map +1 -0
- package/dist/segmentInfos.js +166 -0
- package/dist/segmentInfos.js.map +1 -0
- package/dist/snapshotLoader.d.ts.map +1 -1
- package/dist/snapshotLoader.js +38 -44
- package/dist/snapshotLoader.js.map +1 -1
- package/dist/snapshotV1.d.ts.map +1 -1
- package/dist/snapshotV1.js +9 -12
- package/dist/snapshotV1.js.map +1 -1
- package/dist/snapshotlegacy.d.ts +2 -2
- package/dist/snapshotlegacy.d.ts.map +1 -1
- package/dist/snapshotlegacy.js +5 -3
- package/dist/snapshotlegacy.js.map +1 -1
- package/dist/sortedSegmentSet.d.ts +4 -4
- package/dist/sortedSegmentSet.d.ts.map +1 -1
- package/dist/sortedSegmentSet.js +5 -8
- package/dist/sortedSegmentSet.js.map +1 -1
- package/dist/test/beastTest.spec.d.ts +0 -2
- package/dist/test/beastTest.spec.d.ts.map +1 -1
- package/dist/test/beastTest.spec.js +1 -5
- package/dist/test/beastTest.spec.js.map +1 -1
- package/dist/test/client.annotateMarker.spec.js.map +1 -1
- package/dist/test/client.applyMsg.spec.js +15 -12
- package/dist/test/client.applyMsg.spec.js.map +1 -1
- package/dist/test/client.attributionFarm.spec.d.ts.map +1 -1
- package/dist/test/client.attributionFarm.spec.js.map +1 -1
- package/dist/test/client.getPosition.spec.js +3 -2
- package/dist/test/client.getPosition.spec.js.map +1 -1
- package/dist/test/client.localReference.spec.js +6 -6
- package/dist/test/client.localReference.spec.js.map +1 -1
- package/dist/test/client.localReferenceFarm.spec.js.map +1 -1
- package/dist/test/client.rollback.spec.js.map +1 -1
- package/dist/test/dirname.cjs +0 -1
- package/dist/test/dirname.cjs.map +1 -1
- package/dist/test/index.d.ts +1 -1
- package/dist/test/index.d.ts.map +1 -1
- package/dist/test/index.js +2 -4
- package/dist/test/index.js.map +1 -1
- package/dist/test/mergeTree.annotate.spec.js +3 -0
- package/dist/test/mergeTree.annotate.spec.js.map +1 -1
- package/dist/test/mergeTree.insertingWalk.spec.js +1 -1
- package/dist/test/mergeTree.insertingWalk.spec.js.map +1 -1
- package/dist/test/mergeTree.markRangeRemoved.spec.js +2 -0
- package/dist/test/mergeTree.markRangeRemoved.spec.js.map +1 -1
- package/dist/test/mergeTree.walk.spec.js.map +1 -1
- package/dist/test/mergeTreeOperationRunner.d.ts.map +1 -1
- package/dist/test/mergeTreeOperationRunner.js +2 -3
- package/dist/test/mergeTreeOperationRunner.js.map +1 -1
- package/dist/test/obliterate.spec.js.map +1 -1
- package/dist/test/propertyManager.spec.js.map +1 -1
- package/dist/test/reconnectHelper.d.ts +2 -1
- package/dist/test/reconnectHelper.d.ts.map +1 -1
- package/dist/test/reconnectHelper.js.map +1 -1
- package/dist/test/resetPendingSegmentsToOp.spec.js.map +1 -1
- package/dist/test/revertibleFarm.spec.js.map +1 -1
- package/dist/test/segmentGroupCollection.spec.js +15 -3
- package/dist/test/segmentGroupCollection.spec.js.map +1 -1
- package/dist/test/snapshot.utils.d.ts +2 -2
- package/dist/test/snapshot.utils.d.ts.map +1 -1
- package/dist/test/snapshot.utils.js.map +1 -1
- package/dist/test/sortedSegmentSet.spec.js +4 -3
- package/dist/test/sortedSegmentSet.spec.js.map +1 -1
- package/dist/test/testClient.d.ts +8 -6
- package/dist/test/testClient.d.ts.map +1 -1
- package/dist/test/testClient.js +29 -27
- package/dist/test/testClient.js.map +1 -1
- package/dist/test/testClientLogger.d.ts.map +1 -1
- package/dist/test/testClientLogger.js +6 -4
- package/dist/test/testClientLogger.js.map +1 -1
- package/dist/test/testUtils.d.ts +2 -2
- package/dist/test/testUtils.d.ts.map +1 -1
- package/dist/test/testUtils.js +32 -8
- package/dist/test/testUtils.js.map +1 -1
- package/dist/test/text.d.ts +2 -2
- package/dist/test/text.d.ts.map +1 -1
- package/dist/test/text.js +12 -6
- package/dist/test/text.js.map +1 -1
- package/dist/test/tracking.spec.js.map +1 -1
- package/dist/test/wordUnitTests.spec.d.ts.map +1 -1
- package/dist/test/wordUnitTests.spec.js +4 -2
- package/dist/test/wordUnitTests.spec.js.map +1 -1
- package/dist/zamboni.d.ts.map +1 -1
- package/dist/zamboni.js +8 -7
- package/dist/zamboni.js.map +1 -1
- package/lib/MergeTreeTextHelper.d.ts.map +1 -1
- package/lib/MergeTreeTextHelper.js +0 -2
- package/lib/MergeTreeTextHelper.js.map +1 -1
- package/lib/attributionPolicy.d.ts.map +1 -1
- package/lib/attributionPolicy.js +6 -15
- package/lib/attributionPolicy.js.map +1 -1
- package/lib/client.d.ts +3 -4
- package/lib/client.d.ts.map +1 -1
- package/lib/client.js +40 -29
- package/lib/client.js.map +1 -1
- package/lib/endOfTreeSegment.d.ts +5 -4
- package/lib/endOfTreeSegment.d.ts.map +1 -1
- package/lib/endOfTreeSegment.js.map +1 -1
- package/lib/index.d.ts +2 -1
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +1 -1
- package/lib/index.js.map +1 -1
- package/lib/legacy.d.ts +2 -1
- package/lib/localReference.d.ts +1 -0
- package/lib/localReference.d.ts.map +1 -1
- package/lib/localReference.js +1 -0
- package/lib/localReference.js.map +1 -1
- package/lib/mergeTree.d.ts +8 -7
- package/lib/mergeTree.d.ts.map +1 -1
- package/lib/mergeTree.js +192 -201
- package/lib/mergeTree.js.map +1 -1
- package/lib/mergeTreeNodeWalk.d.ts +5 -5
- package/lib/mergeTreeNodeWalk.d.ts.map +1 -1
- package/lib/mergeTreeNodeWalk.js +3 -2
- package/lib/mergeTreeNodeWalk.js.map +1 -1
- package/lib/mergeTreeNodes.d.ts +181 -159
- package/lib/mergeTreeNodes.d.ts.map +1 -1
- package/lib/mergeTreeNodes.js +115 -105
- package/lib/mergeTreeNodes.js.map +1 -1
- package/lib/mergeTreeTracking.d.ts.map +1 -1
- package/lib/mergeTreeTracking.js +0 -2
- package/lib/mergeTreeTracking.js.map +1 -1
- package/lib/partialLengths.d.ts +2 -2
- package/lib/partialLengths.d.ts.map +1 -1
- package/lib/partialLengths.js +30 -24
- package/lib/partialLengths.js.map +1 -1
- package/lib/perspective.d.ts +10 -9
- package/lib/perspective.d.ts.map +1 -1
- package/lib/perspective.js +11 -4
- package/lib/perspective.js.map +1 -1
- package/lib/referencePositions.d.ts.map +1 -1
- package/lib/referencePositions.js +4 -1
- package/lib/referencePositions.js.map +1 -1
- package/lib/revertibles.d.ts.map +1 -1
- package/lib/revertibles.js +11 -9
- package/lib/revertibles.js.map +1 -1
- package/lib/segmentGroupCollection.d.ts +4 -4
- package/lib/segmentGroupCollection.d.ts.map +1 -1
- package/lib/segmentGroupCollection.js +0 -6
- package/lib/segmentGroupCollection.js.map +1 -1
- package/lib/segmentInfos.d.ts +257 -0
- package/lib/segmentInfos.d.ts.map +1 -0
- package/lib/segmentInfos.js +145 -0
- package/lib/segmentInfos.js.map +1 -0
- package/lib/snapshotLoader.d.ts.map +1 -1
- package/lib/snapshotLoader.js +38 -44
- package/lib/snapshotLoader.js.map +1 -1
- package/lib/snapshotV1.d.ts.map +1 -1
- package/lib/snapshotV1.js +9 -12
- package/lib/snapshotV1.js.map +1 -1
- package/lib/snapshotlegacy.d.ts +2 -2
- package/lib/snapshotlegacy.d.ts.map +1 -1
- package/lib/snapshotlegacy.js +5 -3
- package/lib/snapshotlegacy.js.map +1 -1
- package/lib/sortedSegmentSet.d.ts +4 -4
- package/lib/sortedSegmentSet.d.ts.map +1 -1
- package/lib/sortedSegmentSet.js +5 -8
- package/lib/sortedSegmentSet.js.map +1 -1
- package/lib/test/beastTest.spec.d.ts +0 -2
- package/lib/test/beastTest.spec.d.ts.map +1 -1
- package/lib/test/beastTest.spec.js +0 -3
- package/lib/test/beastTest.spec.js.map +1 -1
- package/lib/test/client.annotateMarker.spec.js.map +1 -1
- package/lib/test/client.applyMsg.spec.js +15 -12
- package/lib/test/client.applyMsg.spec.js.map +1 -1
- package/lib/test/client.attributionFarm.spec.d.ts.map +1 -1
- package/lib/test/client.attributionFarm.spec.js.map +1 -1
- package/lib/test/client.getPosition.spec.js +3 -2
- package/lib/test/client.getPosition.spec.js.map +1 -1
- package/lib/test/client.localReference.spec.js +1 -1
- package/lib/test/client.localReference.spec.js.map +1 -1
- package/lib/test/client.localReferenceFarm.spec.js.map +1 -1
- package/lib/test/client.rollback.spec.js +1 -1
- package/lib/test/client.rollback.spec.js.map +1 -1
- package/lib/test/dirname.cjs +0 -1
- package/lib/test/dirname.cjs.map +1 -1
- package/lib/test/index.d.ts +1 -1
- package/lib/test/index.d.ts.map +1 -1
- package/lib/test/index.js +1 -1
- package/lib/test/index.js.map +1 -1
- package/lib/test/mergeTree.annotate.spec.js +3 -0
- package/lib/test/mergeTree.annotate.spec.js.map +1 -1
- package/lib/test/mergeTree.insertingWalk.spec.js +2 -2
- package/lib/test/mergeTree.insertingWalk.spec.js.map +1 -1
- package/lib/test/mergeTree.markRangeRemoved.spec.js +2 -0
- package/lib/test/mergeTree.markRangeRemoved.spec.js.map +1 -1
- package/lib/test/mergeTree.walk.spec.js.map +1 -1
- package/lib/test/mergeTreeOperationRunner.d.ts.map +1 -1
- package/lib/test/mergeTreeOperationRunner.js +1 -2
- package/lib/test/mergeTreeOperationRunner.js.map +1 -1
- package/lib/test/obliterate.spec.js.map +1 -1
- package/lib/test/propertyManager.spec.js.map +1 -1
- package/lib/test/reconnectHelper.d.ts +2 -1
- package/lib/test/reconnectHelper.d.ts.map +1 -1
- package/lib/test/reconnectHelper.js.map +1 -1
- package/lib/test/resetPendingSegmentsToOp.spec.js +1 -1
- package/lib/test/resetPendingSegmentsToOp.spec.js.map +1 -1
- package/lib/test/revertibleFarm.spec.js.map +1 -1
- package/lib/test/segmentGroupCollection.spec.js +15 -3
- package/lib/test/segmentGroupCollection.spec.js.map +1 -1
- package/lib/test/snapshot.utils.d.ts +2 -2
- package/lib/test/snapshot.utils.d.ts.map +1 -1
- package/lib/test/snapshot.utils.js.map +1 -1
- package/lib/test/sortedSegmentSet.spec.js +4 -3
- package/lib/test/sortedSegmentSet.spec.js.map +1 -1
- package/lib/test/testClient.d.ts +8 -6
- package/lib/test/testClient.d.ts.map +1 -1
- package/lib/test/testClient.js +30 -28
- package/lib/test/testClient.js.map +1 -1
- package/lib/test/testClientLogger.d.ts.map +1 -1
- package/lib/test/testClientLogger.js +5 -3
- package/lib/test/testClientLogger.js.map +1 -1
- package/lib/test/testUtils.d.ts +2 -2
- package/lib/test/testUtils.d.ts.map +1 -1
- package/lib/test/testUtils.js +9 -8
- package/lib/test/testUtils.js.map +1 -1
- package/lib/test/text.d.ts +2 -2
- package/lib/test/text.d.ts.map +1 -1
- package/lib/test/text.js +12 -6
- package/lib/test/text.js.map +1 -1
- package/lib/test/tracking.spec.js.map +1 -1
- package/lib/test/wordUnitTests.spec.d.ts.map +1 -1
- package/lib/test/wordUnitTests.spec.js +4 -2
- package/lib/test/wordUnitTests.spec.js.map +1 -1
- package/lib/zamboni.d.ts.map +1 -1
- package/lib/zamboni.js +7 -6
- package/lib/zamboni.js.map +1 -1
- package/package.json +18 -18
- package/src/MergeTreeTextHelper.ts +2 -4
- package/src/attributionPolicy.ts +5 -11
- package/src/client.ts +55 -44
- package/src/endOfTreeSegment.ts +7 -4
- package/src/index.ts +5 -6
- package/src/localReference.ts +1 -0
- package/src/mergeTree.ts +253 -271
- package/src/mergeTreeNodeWalk.ts +9 -8
- package/src/mergeTreeNodes.ts +300 -305
- package/src/mergeTreeTracking.ts +0 -3
- package/src/partialLengths.ts +44 -25
- package/src/perspective.ts +36 -13
- package/src/referencePositions.ts +4 -1
- package/src/revertibles.ts +20 -16
- package/src/segmentGroupCollection.ts +7 -18
- package/src/segmentInfos.ts +377 -0
- package/src/snapshotLoader.ts +60 -57
- package/src/snapshotV1.ts +14 -16
- package/src/snapshotlegacy.ts +12 -17
- package/src/sortedSegmentSet.ts +12 -15
- package/src/zamboni.ts +10 -12
package/src/client.ts
CHANGED
|
@@ -27,7 +27,11 @@ import {
|
|
|
27
27
|
|
|
28
28
|
import { MergeTreeTextHelper } from "./MergeTreeTextHelper.js";
|
|
29
29
|
import { DoublyLinkedList, RedBlackTree } from "./collections/index.js";
|
|
30
|
-
import {
|
|
30
|
+
import {
|
|
31
|
+
NonCollabClient,
|
|
32
|
+
UnassignedSequenceNumber,
|
|
33
|
+
UniversalSequenceNumber,
|
|
34
|
+
} from "./constants.js";
|
|
31
35
|
import { LocalReferencePosition, SlidingPreference } from "./localReference.js";
|
|
32
36
|
import {
|
|
33
37
|
MergeTree,
|
|
@@ -42,16 +46,14 @@ import type {
|
|
|
42
46
|
} from "./mergeTreeDeltaCallback.js";
|
|
43
47
|
import { walkAllChildSegments } from "./mergeTreeNodeWalk.js";
|
|
44
48
|
import {
|
|
45
|
-
// eslint-disable-next-line import/no-deprecated
|
|
46
49
|
CollaborationWindow,
|
|
47
50
|
ISegment,
|
|
48
51
|
ISegmentAction,
|
|
49
|
-
|
|
52
|
+
ISegmentPrivate,
|
|
50
53
|
Marker,
|
|
51
|
-
// eslint-disable-next-line import/no-deprecated
|
|
52
54
|
SegmentGroup,
|
|
53
55
|
compareStrings,
|
|
54
|
-
|
|
56
|
+
isSegmentLeaf,
|
|
55
57
|
} from "./mergeTreeNodes.js";
|
|
56
58
|
import {
|
|
57
59
|
createAdjustRangeOp,
|
|
@@ -84,11 +86,18 @@ import {
|
|
|
84
86
|
} from "./ops.js";
|
|
85
87
|
import { PropertySet, type MapLike } from "./properties.js";
|
|
86
88
|
import { DetachedReferencePosition, ReferencePosition } from "./referencePositions.js";
|
|
89
|
+
import {
|
|
90
|
+
isInserted,
|
|
91
|
+
isMoved,
|
|
92
|
+
isRemoved,
|
|
93
|
+
overwriteInfo,
|
|
94
|
+
toMoveInfo,
|
|
95
|
+
type IInsertionInfo,
|
|
96
|
+
} from "./segmentInfos.js";
|
|
87
97
|
import { Side, type InteriorSequencePlace } from "./sequencePlace.js";
|
|
88
98
|
import { SnapshotLoader } from "./snapshotLoader.js";
|
|
89
99
|
import { SnapshotV1 } from "./snapshotV1.js";
|
|
90
100
|
import { SnapshotLegacy } from "./snapshotlegacy.js";
|
|
91
|
-
// eslint-disable-next-line import/no-deprecated
|
|
92
101
|
import { IMergeTreeTextHelper } from "./textSegment.js";
|
|
93
102
|
|
|
94
103
|
type IMergeTreeDeltaRemoteOpArgs = Omit<IMergeTreeDeltaOpArgs, "sequencedMessage"> &
|
|
@@ -129,6 +138,8 @@ export interface IClientEvents {
|
|
|
129
138
|
): void;
|
|
130
139
|
}
|
|
131
140
|
|
|
141
|
+
const UNBOUND_SEGMENT_ERROR = "The provided segment is not bound to this DDS.";
|
|
142
|
+
|
|
132
143
|
/**
|
|
133
144
|
* This class encapsulates a merge-tree, and provides a local client specific view over it and
|
|
134
145
|
* the capability to modify it as the local client. Additionally it provides
|
|
@@ -194,20 +205,14 @@ export class Client extends TypedEventEmitter<IClientEvents> {
|
|
|
194
205
|
* It is used to get the segment group(s) for the previous operations.
|
|
195
206
|
* @param count - The number segment groups to get peek from the tail of the queue. Default 1.
|
|
196
207
|
*/
|
|
197
|
-
|
|
198
|
-
public peekPendingSegmentGroups():
|
|
199
|
-
// eslint-disable-next-line import/no-deprecated
|
|
200
|
-
public peekPendingSegmentGroups(count: number): SegmentGroup | SegmentGroup[] | undefined;
|
|
201
|
-
public peekPendingSegmentGroups(
|
|
202
|
-
count: number = 1,
|
|
203
|
-
// eslint-disable-next-line import/no-deprecated
|
|
204
|
-
): SegmentGroup | SegmentGroup[] | undefined {
|
|
208
|
+
|
|
209
|
+
public peekPendingSegmentGroups(count: number = 1): unknown {
|
|
205
210
|
const pending = this._mergeTree.pendingSegments;
|
|
206
211
|
let node = pending?.last;
|
|
207
212
|
if (count === 1 || pending === undefined) {
|
|
208
213
|
return node?.data;
|
|
209
214
|
}
|
|
210
|
-
|
|
215
|
+
|
|
211
216
|
const taken: SegmentGroup[] = Array.from({ length: Math.min(count, pending.length) });
|
|
212
217
|
for (let i = taken.length - 1; i >= 0; i--) {
|
|
213
218
|
taken[i] = node!.data;
|
|
@@ -396,15 +401,15 @@ export class Client extends TypedEventEmitter<IClientEvents> {
|
|
|
396
401
|
): void {
|
|
397
402
|
let localInserts = 0;
|
|
398
403
|
let localRemoves = 0;
|
|
399
|
-
walkAllChildSegments(this._mergeTree.root, (seg) => {
|
|
400
|
-
if (seg.seq === UnassignedSequenceNumber) {
|
|
404
|
+
walkAllChildSegments(this._mergeTree.root, (seg: ISegmentPrivate) => {
|
|
405
|
+
if (isInserted(seg) && seg.seq === UnassignedSequenceNumber) {
|
|
401
406
|
localInserts++;
|
|
402
407
|
}
|
|
403
|
-
if (seg.removedSeq === UnassignedSequenceNumber) {
|
|
408
|
+
if (isRemoved(seg) && seg.removedSeq === UnassignedSequenceNumber) {
|
|
404
409
|
localRemoves++;
|
|
405
410
|
}
|
|
406
411
|
// Only serialize segments that have not been removed.
|
|
407
|
-
if (seg
|
|
412
|
+
if (!isRemoved(seg)) {
|
|
408
413
|
handleCollectingSerializer.stringify(seg.clone().toJSONObject(), handle);
|
|
409
414
|
}
|
|
410
415
|
return true;
|
|
@@ -419,7 +424,6 @@ export class Client extends TypedEventEmitter<IClientEvents> {
|
|
|
419
424
|
}
|
|
420
425
|
}
|
|
421
426
|
|
|
422
|
-
// eslint-disable-next-line import/no-deprecated
|
|
423
427
|
public getCollabWindow(): CollaborationWindow {
|
|
424
428
|
return this._mergeTree.collabWindow;
|
|
425
429
|
}
|
|
@@ -430,12 +434,11 @@ export class Client extends TypedEventEmitter<IClientEvents> {
|
|
|
430
434
|
* @param segment - The segment to get the position of
|
|
431
435
|
*/
|
|
432
436
|
public getPosition(segment: ISegment | undefined, localSeq?: number): number {
|
|
433
|
-
|
|
434
|
-
if (mergeSegment?.parent === undefined) {
|
|
437
|
+
if (!isSegmentLeaf(segment)) {
|
|
435
438
|
return -1;
|
|
436
439
|
}
|
|
437
440
|
return this._mergeTree.getPosition(
|
|
438
|
-
|
|
441
|
+
segment,
|
|
439
442
|
this.getCurrentSeq(),
|
|
440
443
|
this.getClientId(),
|
|
441
444
|
localSeq,
|
|
@@ -461,6 +464,9 @@ export class Client extends TypedEventEmitter<IClientEvents> {
|
|
|
461
464
|
slidingPreference?: SlidingPreference,
|
|
462
465
|
canSlideToEndpoint?: boolean,
|
|
463
466
|
): LocalReferencePosition {
|
|
467
|
+
if (!isSegmentLeaf(segment) && typeof segment !== "string") {
|
|
468
|
+
throw new UsageError(UNBOUND_SEGMENT_ERROR);
|
|
469
|
+
}
|
|
464
470
|
return this._mergeTree.createLocalReferencePosition(
|
|
465
471
|
segment,
|
|
466
472
|
offset ?? 0,
|
|
@@ -509,7 +515,6 @@ export class Client extends TypedEventEmitter<IClientEvents> {
|
|
|
509
515
|
* Revert an op
|
|
510
516
|
*/
|
|
511
517
|
public rollback?(op: unknown, localOpMetadata: unknown): void {
|
|
512
|
-
// eslint-disable-next-line import/no-deprecated
|
|
513
518
|
this._mergeTree.rollback(op as IMergeTreeDeltaOp, localOpMetadata as SegmentGroup);
|
|
514
519
|
}
|
|
515
520
|
|
|
@@ -876,13 +881,16 @@ export class Client extends TypedEventEmitter<IClientEvents> {
|
|
|
876
881
|
0x032 /* "localSeq greater than collab window" */,
|
|
877
882
|
);
|
|
878
883
|
const { currentSeq, clientId } = this.getCollabWindow();
|
|
884
|
+
if (!isSegmentLeaf(segment)) {
|
|
885
|
+
throw new UsageError(UNBOUND_SEGMENT_ERROR);
|
|
886
|
+
}
|
|
879
887
|
return this._mergeTree.getPosition(segment, currentSeq, clientId, localSeq);
|
|
880
888
|
}
|
|
881
889
|
|
|
882
890
|
private resetPendingDeltaToOps(
|
|
883
891
|
resetOp: IMergeTreeDeltaOp,
|
|
884
|
-
|
|
885
|
-
segmentGroup: SegmentGroup
|
|
892
|
+
|
|
893
|
+
segmentGroup: SegmentGroup,
|
|
886
894
|
): IMergeTreeDeltaOp[] {
|
|
887
895
|
assert(!!segmentGroup, 0x033 /* "Segment group undefined" */);
|
|
888
896
|
const NACKedSegmentGroup = this.pendingRebase?.shift()?.data;
|
|
@@ -895,7 +903,7 @@ export class Client extends TypedEventEmitter<IClientEvents> {
|
|
|
895
903
|
}
|
|
896
904
|
|
|
897
905
|
// if this is an obliterate op, keep all segments in same segment group
|
|
898
|
-
|
|
906
|
+
|
|
899
907
|
const obliterateSegmentGroup: SegmentGroup = {
|
|
900
908
|
segments: [],
|
|
901
909
|
localSeq: segmentGroup.localSeq,
|
|
@@ -915,7 +923,7 @@ export class Client extends TypedEventEmitter<IClientEvents> {
|
|
|
915
923
|
a.ordinal < b.ordinal ? -1 : 1,
|
|
916
924
|
)) {
|
|
917
925
|
assert(
|
|
918
|
-
segment.segmentGroups?.remove
|
|
926
|
+
segment.segmentGroups?.remove(segmentGroup) === true,
|
|
919
927
|
0x035 /* "Segment group not in segment pending queue" */,
|
|
920
928
|
);
|
|
921
929
|
assert(
|
|
@@ -935,10 +943,10 @@ export class Client extends TypedEventEmitter<IClientEvents> {
|
|
|
935
943
|
// unless the remove was local, in which case the annotate must have come
|
|
936
944
|
// before the remove
|
|
937
945
|
if (
|
|
938
|
-
(segment
|
|
946
|
+
(!isRemoved(segment) ||
|
|
939
947
|
(segment.localRemovedSeq !== undefined &&
|
|
940
948
|
segment.removedSeq === UnassignedSequenceNumber)) &&
|
|
941
|
-
(segment
|
|
949
|
+
(!isMoved(segment) ||
|
|
942
950
|
(segment.localMovedSeq !== undefined &&
|
|
943
951
|
segment.movedSeq === UnassignedSequenceNumber))
|
|
944
952
|
) {
|
|
@@ -960,7 +968,7 @@ export class Client extends TypedEventEmitter<IClientEvents> {
|
|
|
960
968
|
|
|
961
969
|
case MergeTreeDeltaType.INSERT: {
|
|
962
970
|
assert(
|
|
963
|
-
segment.seq === UnassignedSequenceNumber,
|
|
971
|
+
isInserted(segment) && segment.seq === UnassignedSequenceNumber,
|
|
964
972
|
0x037 /* "Segment already has assigned sequence number" */,
|
|
965
973
|
);
|
|
966
974
|
const moveInfo = toMoveInfo(segment);
|
|
@@ -975,8 +983,11 @@ export class Client extends TypedEventEmitter<IClientEvents> {
|
|
|
975
983
|
// we set the seq to the universal seq and remove the local seq,
|
|
976
984
|
// so its length is not considered for subsequent local changes
|
|
977
985
|
// this allows us to not send the op as even the local client will ignore the segment
|
|
978
|
-
segment
|
|
979
|
-
|
|
986
|
+
overwriteInfo<IInsertionInfo>(segment, {
|
|
987
|
+
seq: UniversalSequenceNumber,
|
|
988
|
+
localSeq: undefined,
|
|
989
|
+
clientId: NonCollabClient,
|
|
990
|
+
});
|
|
980
991
|
break;
|
|
981
992
|
}
|
|
982
993
|
}
|
|
@@ -993,9 +1004,10 @@ export class Client extends TypedEventEmitter<IClientEvents> {
|
|
|
993
1004
|
|
|
994
1005
|
case MergeTreeDeltaType.REMOVE: {
|
|
995
1006
|
if (
|
|
1007
|
+
isRemoved(segment) &&
|
|
996
1008
|
segment.localRemovedSeq !== undefined &&
|
|
997
1009
|
segment.removedSeq === UnassignedSequenceNumber &&
|
|
998
|
-
(segment
|
|
1010
|
+
(!isMoved(segment) ||
|
|
999
1011
|
(segment.localMovedSeq !== undefined &&
|
|
1000
1012
|
segment.movedSeq === UnassignedSequenceNumber))
|
|
1001
1013
|
) {
|
|
@@ -1009,9 +1021,10 @@ export class Client extends TypedEventEmitter<IClientEvents> {
|
|
|
1009
1021
|
case MergeTreeDeltaType.OBLITERATE: {
|
|
1010
1022
|
errorIfOptionNotTrue(this._mergeTree.options, "mergeTreeEnableObliterateReconnect");
|
|
1011
1023
|
if (
|
|
1024
|
+
isMoved(segment) &&
|
|
1012
1025
|
segment.localMovedSeq !== undefined &&
|
|
1013
1026
|
segment.movedSeq === UnassignedSequenceNumber &&
|
|
1014
|
-
(segment
|
|
1027
|
+
(!isRemoved(segment) ||
|
|
1015
1028
|
(segment.localRemovedSeq !== undefined &&
|
|
1016
1029
|
segment.removedSeq === UnassignedSequenceNumber))
|
|
1017
1030
|
) {
|
|
@@ -1191,7 +1204,6 @@ export class Client extends TypedEventEmitter<IClientEvents> {
|
|
|
1191
1204
|
|
|
1192
1205
|
private lastNormalizationRefSeq = 0;
|
|
1193
1206
|
|
|
1194
|
-
// eslint-disable-next-line import/no-deprecated
|
|
1195
1207
|
private pendingRebase: DoublyLinkedList<SegmentGroup> | undefined;
|
|
1196
1208
|
|
|
1197
1209
|
/**
|
|
@@ -1200,11 +1212,8 @@ export class Client extends TypedEventEmitter<IClientEvents> {
|
|
|
1200
1212
|
* @param resetOp - The op to reset
|
|
1201
1213
|
* @param segmentGroup - The segment group associated with the op
|
|
1202
1214
|
*/
|
|
1203
|
-
public regeneratePendingOp(
|
|
1204
|
-
|
|
1205
|
-
// eslint-disable-next-line import/no-deprecated
|
|
1206
|
-
segmentGroup: SegmentGroup | SegmentGroup[],
|
|
1207
|
-
): IMergeTreeOp {
|
|
1215
|
+
public regeneratePendingOp(resetOp: IMergeTreeOp, localOpMetadata: unknown): IMergeTreeOp {
|
|
1216
|
+
const segmentGroup = localOpMetadata as SegmentGroup | SegmentGroup[];
|
|
1208
1217
|
if (this.pendingRebase === undefined || this.pendingRebase.empty) {
|
|
1209
1218
|
let firstGroup: SegmentGroup;
|
|
1210
1219
|
if (Array.isArray(segmentGroup)) {
|
|
@@ -1269,7 +1278,6 @@ export class Client extends TypedEventEmitter<IClientEvents> {
|
|
|
1269
1278
|
return opList.length === 1 ? opList[0] : createGroupOp(...opList);
|
|
1270
1279
|
}
|
|
1271
1280
|
|
|
1272
|
-
// eslint-disable-next-line import/no-deprecated
|
|
1273
1281
|
public createTextHelper(): IMergeTreeTextHelper {
|
|
1274
1282
|
return new MergeTreeTextHelper(this._mergeTree);
|
|
1275
1283
|
}
|
|
@@ -1376,12 +1384,15 @@ export class Client extends TypedEventEmitter<IClientEvents> {
|
|
|
1376
1384
|
} {
|
|
1377
1385
|
const { referenceSequenceNumber, clientId } =
|
|
1378
1386
|
this.getClientSequenceArgsForMessage(sequenceArgs);
|
|
1379
|
-
return this._mergeTree.getContainingSegment
|
|
1387
|
+
return this._mergeTree.getContainingSegment(
|
|
1380
1388
|
pos,
|
|
1381
1389
|
referenceSequenceNumber,
|
|
1382
1390
|
clientId,
|
|
1383
1391
|
localSeq,
|
|
1384
|
-
)
|
|
1392
|
+
) as {
|
|
1393
|
+
segment: T | undefined;
|
|
1394
|
+
offset: number | undefined;
|
|
1395
|
+
};
|
|
1385
1396
|
}
|
|
1386
1397
|
|
|
1387
1398
|
getPropertiesAtPosition(pos: number): PropertySet | undefined {
|
package/src/endOfTreeSegment.ts
CHANGED
|
@@ -6,10 +6,12 @@
|
|
|
6
6
|
import { assert } from "@fluidframework/core-utils/internal";
|
|
7
7
|
|
|
8
8
|
import { LocalClientId } from "./constants.js";
|
|
9
|
+
// eslint-disable-next-line import/no-deprecated
|
|
9
10
|
import { LocalReferenceCollection } from "./localReference.js";
|
|
10
11
|
import { MergeTree } from "./mergeTree.js";
|
|
11
12
|
import { NodeAction, depthFirstNodeWalk } from "./mergeTreeNodeWalk.js";
|
|
12
|
-
import {
|
|
13
|
+
import { ISegment, type ISegmentLeaf, type MergeBlock } from "./mergeTreeNodes.js";
|
|
14
|
+
import { type IMergeNodeInfo } from "./segmentInfos.js";
|
|
13
15
|
|
|
14
16
|
/**
|
|
15
17
|
* This is a special segment that is not bound or known by the merge tree itself,
|
|
@@ -32,7 +34,7 @@ import { IRemovalInfo, ISegment, ISegmentLeaf, type MergeBlock } from "./mergeTr
|
|
|
32
34
|
* must be possible in some way to refer to a position before or after the tree
|
|
33
35
|
* respectively. The endpoint segments allow us to support such behavior.
|
|
34
36
|
*/
|
|
35
|
-
abstract class BaseEndpointSegment {
|
|
37
|
+
abstract class BaseEndpointSegment implements IMergeNodeInfo {
|
|
36
38
|
constructor(protected readonly mergeTree: MergeTree) {}
|
|
37
39
|
/*
|
|
38
40
|
* segments must be of at least length one, but
|
|
@@ -71,6 +73,7 @@ abstract class BaseEndpointSegment {
|
|
|
71
73
|
|
|
72
74
|
abstract get ordinal(): string;
|
|
73
75
|
|
|
76
|
+
// eslint-disable-next-line import/no-deprecated
|
|
74
77
|
localRefs?: LocalReferenceCollection;
|
|
75
78
|
|
|
76
79
|
/*
|
|
@@ -99,7 +102,7 @@ const notSupported = (): never => {
|
|
|
99
102
|
/**
|
|
100
103
|
* The position immediately prior to the start of the tree
|
|
101
104
|
*/
|
|
102
|
-
export class StartOfTreeSegment extends BaseEndpointSegment implements ISegment
|
|
105
|
+
export class StartOfTreeSegment extends BaseEndpointSegment implements ISegment {
|
|
103
106
|
type: string = "StartOfTreeSegment";
|
|
104
107
|
readonly endpointType = "start";
|
|
105
108
|
|
|
@@ -149,7 +152,7 @@ export class StartOfTreeSegment extends BaseEndpointSegment implements ISegment,
|
|
|
149
152
|
/**
|
|
150
153
|
* The position immediately after the end of the tree
|
|
151
154
|
*/
|
|
152
|
-
export class EndOfTreeSegment extends BaseEndpointSegment implements ISegment
|
|
155
|
+
export class EndOfTreeSegment extends BaseEndpointSegment implements ISegment {
|
|
153
156
|
type: string = "EndOfTreeSegment";
|
|
154
157
|
readonly endpointType = "end";
|
|
155
158
|
|
package/src/index.ts
CHANGED
|
@@ -58,19 +58,14 @@ export {
|
|
|
58
58
|
export {
|
|
59
59
|
BaseSegment,
|
|
60
60
|
CollaborationWindow,
|
|
61
|
-
debugMarkerToString,
|
|
62
61
|
IJSONMarkerSegment,
|
|
63
62
|
IMergeNodeCommon,
|
|
64
|
-
|
|
65
|
-
IRemovalInfo,
|
|
63
|
+
segmentIsRemoved,
|
|
66
64
|
ISegment,
|
|
67
65
|
ISegmentAction,
|
|
68
66
|
Marker,
|
|
69
67
|
reservedMarkerIdKey,
|
|
70
68
|
reservedMarkerSimpleTypeKey,
|
|
71
|
-
SegmentGroup,
|
|
72
|
-
toRemovalInfo,
|
|
73
|
-
ObliterateInfo,
|
|
74
69
|
ISegmentInternal,
|
|
75
70
|
} from "./mergeTreeNodes.js";
|
|
76
71
|
export {
|
|
@@ -125,6 +120,10 @@ export {
|
|
|
125
120
|
reservedRangeLabelsKey,
|
|
126
121
|
reservedTileLabelsKey,
|
|
127
122
|
} from "./referencePositions.js";
|
|
123
|
+
export {
|
|
124
|
+
IMoveInfo,
|
|
125
|
+
IRemovalInfo,
|
|
126
|
+
} from "./segmentInfos.js";
|
|
128
127
|
export {
|
|
129
128
|
PropsOrAdjust,
|
|
130
129
|
copyPropertiesAndManager,
|
package/src/localReference.ts
CHANGED
|
@@ -228,6 +228,7 @@ export function setValidateRefCount(
|
|
|
228
228
|
*
|
|
229
229
|
* @legacy
|
|
230
230
|
* @alpha
|
|
231
|
+
* @deprecated - This class will be removed in 2.20 with no replacement.
|
|
231
232
|
*/
|
|
232
233
|
export class LocalReferenceCollection {
|
|
233
234
|
public static append(seg1: ISegment, seg2: ISegment): void {
|