@fluidframework/merge-tree 2.118.1 → 3.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +34 -4
- package/README.md +53 -50
- package/{api-extractor.json → api-extractor/api-extractor-model.json} +1 -1
- package/dist/MergeTreeTextHelper.js +1 -0
- package/dist/MergeTreeTextHelper.js.map +1 -1
- package/dist/attributionCollection.js +6 -4
- package/dist/attributionCollection.js.map +1 -1
- package/dist/attributionPolicy.js +3 -4
- package/dist/attributionPolicy.js.map +1 -1
- package/dist/client.js +27 -10
- package/dist/client.js.map +1 -1
- package/dist/collections/rbTree.d.ts.map +1 -1
- package/dist/collections/rbTree.js +3 -0
- package/dist/collections/rbTree.js.map +1 -1
- package/dist/endOfTreeSegment.d.ts.map +1 -1
- package/dist/endOfTreeSegment.js +25 -26
- package/dist/endOfTreeSegment.js.map +1 -1
- package/dist/localReference.js +17 -7
- package/dist/localReference.js.map +1 -1
- package/dist/mergeTree.d.ts.map +1 -1
- package/dist/mergeTree.js +90 -74
- package/dist/mergeTree.js.map +1 -1
- package/dist/mergeTreeNodeWalk.js +5 -5
- package/dist/mergeTreeNodeWalk.js.map +1 -1
- package/dist/mergeTreeNodes.d.ts.map +1 -1
- package/dist/mergeTreeNodes.js +117 -90
- package/dist/mergeTreeNodes.js.map +1 -1
- package/dist/mergeTreeTracking.js +4 -0
- package/dist/mergeTreeTracking.js.map +1 -1
- package/dist/opBuilder.js +9 -10
- package/dist/opBuilder.js.map +1 -1
- package/dist/ordinal.js +1 -2
- package/dist/ordinal.js.map +1 -1
- package/dist/partialLengths.js +109 -73
- package/dist/partialLengths.js.map +1 -1
- package/dist/perspective.js +31 -11
- package/dist/perspective.js.map +1 -1
- package/dist/properties.js +6 -7
- package/dist/properties.js.map +1 -1
- package/dist/referencePositions.d.ts.map +1 -1
- package/dist/referencePositions.js +7 -7
- package/dist/referencePositions.js.map +1 -1
- package/dist/revertibles.js +4 -5
- package/dist/revertibles.js.map +1 -1
- package/dist/segmentGroupCollection.js +2 -0
- package/dist/segmentGroupCollection.js.map +1 -1
- package/dist/segmentInfos.d.ts.map +1 -1
- package/dist/segmentInfos.js +5 -5
- package/dist/segmentInfos.js.map +1 -1
- package/dist/segmentPropertiesManager.js +3 -5
- package/dist/segmentPropertiesManager.js.map +1 -1
- package/dist/sequencePlace.js +3 -3
- package/dist/sequencePlace.js.map +1 -1
- package/dist/snapshotChunks.js +4 -5
- package/dist/snapshotChunks.js.map +1 -1
- package/dist/snapshotLoader.js +85 -70
- package/dist/snapshotLoader.js.map +1 -1
- package/dist/snapshotV1.d.ts.map +1 -1
- package/dist/snapshotV1.js +34 -14
- package/dist/snapshotV1.js.map +1 -1
- package/dist/snapshotlegacy.d.ts.map +1 -1
- package/dist/snapshotlegacy.js +18 -10
- package/dist/snapshotlegacy.js.map +1 -1
- package/dist/sortedSet.js +1 -3
- package/dist/sortedSet.js.map +1 -1
- package/dist/stamps.js +11 -12
- package/dist/stamps.js.map +1 -1
- package/dist/test/attributionCollection.spec.js +1 -1
- package/dist/test/attributionCollection.spec.js.map +1 -1
- package/dist/test/beastTest.spec.js +15 -11
- package/dist/test/beastTest.spec.js.map +1 -1
- package/dist/test/client.apis.spec.js +2 -3
- package/dist/test/client.apis.spec.js.map +1 -1
- package/dist/test/client.replay.spec.js +17 -7
- package/dist/test/client.replay.spec.js.map +1 -1
- package/dist/test/clientTestHelper.js +7 -4
- package/dist/test/clientTestHelper.js.map +1 -1
- package/dist/test/mergeTreeOperationRunner.js +26 -16
- package/dist/test/mergeTreeOperationRunner.js.map +1 -1
- package/dist/test/obliterateOperations.d.ts.map +1 -1
- package/dist/test/revertibles.spec.js +1 -2
- package/dist/test/revertibles.spec.js.map +1 -1
- package/dist/test/snapshot.utils.d.ts.map +1 -1
- package/dist/test/snapshot.utils.js +7 -5
- package/dist/test/snapshot.utils.js.map +1 -1
- package/dist/test/stamps.spec.js +17 -7
- package/dist/test/stamps.spec.js.map +1 -1
- package/dist/test/testClient.d.ts.map +1 -1
- package/dist/test/testClient.js +19 -17
- package/dist/test/testClient.js.map +1 -1
- package/dist/test/testClientLogger.d.ts.map +1 -1
- package/dist/test/testClientLogger.js +12 -8
- package/dist/test/testClientLogger.js.map +1 -1
- package/dist/test/testServer.js +7 -7
- package/dist/test/testServer.js.map +1 -1
- package/dist/test/testUtils.d.ts +0 -1
- package/dist/test/testUtils.d.ts.map +1 -1
- package/dist/test/testUtils.js +9 -10
- package/dist/test/testUtils.js.map +1 -1
- package/dist/test/text.js +2 -3
- package/dist/test/text.js.map +1 -1
- package/dist/test/wordUnitTests.spec.js +1 -2
- package/dist/test/wordUnitTests.spec.js.map +1 -1
- package/dist/textSegment.js +3 -2
- package/dist/textSegment.js.map +1 -1
- package/dist/zamboni.js +20 -10
- package/dist/zamboni.js.map +1 -1
- package/lib/MergeTreeTextHelper.js +1 -0
- package/lib/MergeTreeTextHelper.js.map +1 -1
- package/lib/attributionCollection.js +4 -2
- package/lib/attributionCollection.js.map +1 -1
- package/lib/client.js +10 -3
- package/lib/client.js.map +1 -1
- package/lib/collections/rbTree.d.ts.map +1 -1
- package/lib/collections/rbTree.js +3 -0
- package/lib/collections/rbTree.js.map +1 -1
- package/lib/endOfTreeSegment.d.ts.map +1 -1
- package/lib/endOfTreeSegment.js +25 -26
- package/lib/endOfTreeSegment.js.map +1 -1
- package/lib/legacy.d.ts +1 -1
- package/lib/localReference.js +12 -2
- package/lib/localReference.js.map +1 -1
- package/lib/mergeTree.d.ts.map +1 -1
- package/lib/mergeTree.js +68 -62
- package/lib/mergeTree.js.map +1 -1
- package/lib/mergeTreeNodes.d.ts.map +1 -1
- package/lib/mergeTreeNodes.js +111 -84
- package/lib/mergeTreeNodes.js.map +1 -1
- package/lib/mergeTreeTracking.js +4 -0
- package/lib/mergeTreeTracking.js.map +1 -1
- package/lib/partialLengths.js +89 -63
- package/lib/partialLengths.js.map +1 -1
- package/lib/perspective.js +12 -2
- package/lib/perspective.js.map +1 -1
- package/lib/public.d.ts +1 -1
- package/lib/referencePositions.d.ts.map +1 -1
- package/lib/segmentGroupCollection.js +2 -0
- package/lib/segmentGroupCollection.js.map +1 -1
- package/lib/segmentInfos.d.ts.map +1 -1
- package/lib/segmentPropertiesManager.js +1 -3
- package/lib/segmentPropertiesManager.js.map +1 -1
- package/lib/snapshotLoader.js +68 -63
- package/lib/snapshotLoader.js.map +1 -1
- package/lib/snapshotV1.d.ts.map +1 -1
- package/lib/snapshotV1.js +17 -7
- package/lib/snapshotV1.js.map +1 -1
- package/lib/snapshotlegacy.d.ts.map +1 -1
- package/lib/snapshotlegacy.js +18 -10
- package/lib/snapshotlegacy.js.map +1 -1
- package/lib/sortedSet.js +1 -3
- package/lib/sortedSet.js.map +1 -1
- package/lib/test/attributionCollection.spec.js +1 -1
- package/lib/test/attributionCollection.spec.js.map +1 -1
- package/lib/test/beastTest.spec.js +7 -3
- package/lib/test/beastTest.spec.js.map +1 -1
- package/lib/test/clientTestHelper.js +7 -4
- package/lib/test/clientTestHelper.js.map +1 -1
- package/lib/test/obliterateOperations.d.ts.map +1 -1
- package/lib/test/snapshot.utils.d.ts.map +1 -1
- package/lib/test/snapshot.utils.js +5 -3
- package/lib/test/snapshot.utils.js.map +1 -1
- package/lib/test/testClient.d.ts.map +1 -1
- package/lib/test/testClient.js +16 -14
- package/lib/test/testClient.js.map +1 -1
- package/lib/test/testClientLogger.d.ts.map +1 -1
- package/lib/test/testClientLogger.js +10 -6
- package/lib/test/testClientLogger.js.map +1 -1
- package/lib/test/testServer.js +5 -5
- package/lib/test/testServer.js.map +1 -1
- package/lib/test/testUtils.d.ts +0 -1
- package/lib/test/testUtils.d.ts.map +1 -1
- package/lib/textSegment.js +3 -2
- package/lib/textSegment.js.map +1 -1
- package/package.json +39 -58
- package/tsconfig.json +1 -1
- package/internal.d.ts +0 -11
- package/legacy.d.ts +0 -11
- /package/api-extractor/{api-extractor.current.json → api-extractor-report.current.json} +0 -0
- /package/api-extractor/{api-extractor.legacy.json → api-extractor-report.legacy.json} +0 -0
package/lib/mergeTree.js
CHANGED
|
@@ -194,24 +194,25 @@ export function getSlideToSegoff(segoff, slidingPreference = SlidingPreference.F
|
|
|
194
194
|
const forwardPred = (ref) => ref.slidingPreference !== SlidingPreference.BACKWARD;
|
|
195
195
|
const backwardPred = (ref) => ref.slidingPreference === SlidingPreference.BACKWARD;
|
|
196
196
|
class Obliterates {
|
|
197
|
+
mergeTree;
|
|
198
|
+
/**
|
|
199
|
+
* Array containing the all obliterate operations within the
|
|
200
|
+
* collab window.
|
|
201
|
+
*
|
|
202
|
+
* The obliterates are stored in sequence order which accelerates clean up in setMinSeq
|
|
203
|
+
*
|
|
204
|
+
* See https://github.com/microsoft/FluidFramework/blob/main/packages/dds/merge-tree/docs/Obliterate.md#remote-perspective
|
|
205
|
+
* for additional context
|
|
206
|
+
*/
|
|
207
|
+
seqOrdered = new DoublyLinkedList();
|
|
208
|
+
/**
|
|
209
|
+
* This contains a sorted lists of all obliterate starts
|
|
210
|
+
* and is used to accelerate finding overlapping obliterates
|
|
211
|
+
* as well as determining if there are any obliterates at all.
|
|
212
|
+
*/
|
|
213
|
+
startOrdered = new SortedSegmentSet();
|
|
197
214
|
constructor(mergeTree) {
|
|
198
215
|
this.mergeTree = mergeTree;
|
|
199
|
-
/**
|
|
200
|
-
* Array containing the all obliterate operations within the
|
|
201
|
-
* collab window.
|
|
202
|
-
*
|
|
203
|
-
* The obliterates are stored in sequence order which accelerates clean up in setMinSeq
|
|
204
|
-
*
|
|
205
|
-
* See https://github.com/microsoft/FluidFramework/blob/main/packages/dds/merge-tree/docs/Obliterate.md#remote-perspective
|
|
206
|
-
* for additional context
|
|
207
|
-
*/
|
|
208
|
-
this.seqOrdered = new DoublyLinkedList();
|
|
209
|
-
/**
|
|
210
|
-
* This contains a sorted lists of all obliterate starts
|
|
211
|
-
* and is used to accelerate finding overlapping obliterates
|
|
212
|
-
* as well as determining if there are any obliterates at all.
|
|
213
|
-
*/
|
|
214
|
-
this.startOrdered = new SortedSegmentSet();
|
|
215
216
|
}
|
|
216
217
|
setMinSeq(minSeq) {
|
|
217
218
|
// eslint-disable-next-line @typescript-eslint/no-non-null-asserted-optional-chain
|
|
@@ -291,46 +292,41 @@ class Obliterates {
|
|
|
291
292
|
* @internal
|
|
292
293
|
*/
|
|
293
294
|
export class MergeTree {
|
|
295
|
+
options;
|
|
296
|
+
static options = {
|
|
297
|
+
incrementalUpdate: true,
|
|
298
|
+
insertAfterRemovedSegs: true,
|
|
299
|
+
zamboniSegments: true,
|
|
300
|
+
};
|
|
301
|
+
/**
|
|
302
|
+
* A sentinel value that indicates an inserting walk should continue to the next block sibling.
|
|
303
|
+
* This can occur for example when tie-break forces insertion of a segment past an entire block (and
|
|
304
|
+
* the inserting walk first recurses into the block before realizing that).
|
|
305
|
+
*/
|
|
306
|
+
static theUnfinishedNode = { childCount: -1 };
|
|
307
|
+
collabWindow = new CollaborationWindow();
|
|
308
|
+
pendingSegments = new DoublyLinkedList();
|
|
309
|
+
segmentsToScour = new Heap(LRUSegmentComparer);
|
|
310
|
+
attributionPolicy;
|
|
294
311
|
get localPerspective() {
|
|
295
312
|
return this.collabWindow.localPerspective;
|
|
296
313
|
}
|
|
314
|
+
/**
|
|
315
|
+
* Whether or not all blocks in the mergeTree currently have information about local partial lengths computed.
|
|
316
|
+
* This information is only necessary on reconnect, and otherwise costly to bookkeep.
|
|
317
|
+
* This field enables tracking whether partials need to be recomputed using localSeq information.
|
|
318
|
+
*/
|
|
319
|
+
localPartialsComputed = false;
|
|
320
|
+
// for now assume only markers have ids and so point directly at the Segment
|
|
321
|
+
// if we need to have pointers to non-markers, we can change to point at local refs
|
|
322
|
+
idToMarker = new Map();
|
|
323
|
+
mergeTreeDeltaCallback;
|
|
324
|
+
mergeTreeMaintenanceCallback;
|
|
325
|
+
// TODO:AB#29553: This property doesn't seem to be adequately round-tripped through summarization.
|
|
326
|
+
// Specifically, it seems like we drop information about obliterates within the collab window for at least V1 summaries.
|
|
327
|
+
obliterates = new Obliterates(this);
|
|
297
328
|
constructor(options) {
|
|
298
329
|
this.options = options;
|
|
299
|
-
this.collabWindow = new CollaborationWindow();
|
|
300
|
-
this.pendingSegments = new DoublyLinkedList();
|
|
301
|
-
this.segmentsToScour = new Heap(LRUSegmentComparer);
|
|
302
|
-
/**
|
|
303
|
-
* Whether or not all blocks in the mergeTree currently have information about local partial lengths computed.
|
|
304
|
-
* This information is only necessary on reconnect, and otherwise costly to bookkeep.
|
|
305
|
-
* This field enables tracking whether partials need to be recomputed using localSeq information.
|
|
306
|
-
*/
|
|
307
|
-
this.localPartialsComputed = false;
|
|
308
|
-
// for now assume only markers have ids and so point directly at the Segment
|
|
309
|
-
// if we need to have pointers to non-markers, we can change to point at local refs
|
|
310
|
-
this.idToMarker = new Map();
|
|
311
|
-
// TODO:AB#29553: This property doesn't seem to be adequately round-tripped through summarization.
|
|
312
|
-
// Specifically, it seems like we drop information about obliterates within the collab window for at least V1 summaries.
|
|
313
|
-
this.obliterates = new Obliterates(this);
|
|
314
|
-
this.splitLeafSegment = (segment, pos) => {
|
|
315
|
-
if (!(pos > 0 && segment)) {
|
|
316
|
-
return {};
|
|
317
|
-
}
|
|
318
|
-
const next = segment.splitAt(pos);
|
|
319
|
-
assertSegmentLeaf(next);
|
|
320
|
-
if (segment?.segmentGroups) {
|
|
321
|
-
next.segmentGroups ??= new SegmentGroupCollection(next);
|
|
322
|
-
segment.segmentGroups.copyTo(next.segmentGroups);
|
|
323
|
-
}
|
|
324
|
-
copyPropertiesAndManager(segment, next);
|
|
325
|
-
segment.localRefs?.split(pos, next);
|
|
326
|
-
this.mergeTreeMaintenanceCallback?.({
|
|
327
|
-
operation: MergeTreeMaintenanceType.SPLIT,
|
|
328
|
-
deltaSegments: [{ segment }, { segment: next }],
|
|
329
|
-
}, undefined);
|
|
330
|
-
return { next };
|
|
331
|
-
};
|
|
332
|
-
this.startOfTree = new StartOfTreeSegment(this);
|
|
333
|
-
this.endOfTree = new EndOfTreeSegment(this);
|
|
334
330
|
this._root = this.makeBlock(0);
|
|
335
331
|
this._root.mergeTree = this;
|
|
336
332
|
this.attributionPolicy = options?.attribution?.policyFactory?.();
|
|
@@ -341,6 +337,7 @@ export class MergeTree {
|
|
|
341
337
|
this.obliterates.addOrUpdate(newObliterate);
|
|
342
338
|
}
|
|
343
339
|
}
|
|
340
|
+
_root;
|
|
344
341
|
get root() {
|
|
345
342
|
return this._root;
|
|
346
343
|
}
|
|
@@ -1094,6 +1091,24 @@ export class MergeTree {
|
|
|
1094
1091
|
}
|
|
1095
1092
|
return newest;
|
|
1096
1093
|
}
|
|
1094
|
+
splitLeafSegment = (segment, pos) => {
|
|
1095
|
+
if (!(pos > 0 && segment)) {
|
|
1096
|
+
return {};
|
|
1097
|
+
}
|
|
1098
|
+
const next = segment.splitAt(pos);
|
|
1099
|
+
assertSegmentLeaf(next);
|
|
1100
|
+
if (segment?.segmentGroups) {
|
|
1101
|
+
next.segmentGroups ??= new SegmentGroupCollection(next);
|
|
1102
|
+
segment.segmentGroups.copyTo(next.segmentGroups);
|
|
1103
|
+
}
|
|
1104
|
+
copyPropertiesAndManager(segment, next);
|
|
1105
|
+
segment.localRefs?.split(pos, next);
|
|
1106
|
+
this.mergeTreeMaintenanceCallback?.({
|
|
1107
|
+
operation: MergeTreeMaintenanceType.SPLIT,
|
|
1108
|
+
deltaSegments: [{ segment }, { segment: next }],
|
|
1109
|
+
}, undefined);
|
|
1110
|
+
return { next };
|
|
1111
|
+
};
|
|
1097
1112
|
ensureIntervalBoundary(pos, perspective) {
|
|
1098
1113
|
this.insertingWalk(pos, perspective, {
|
|
1099
1114
|
seq: TreeMaintenanceSequenceNumber,
|
|
@@ -1640,6 +1655,8 @@ export class MergeTree {
|
|
|
1640
1655
|
const segment = lref.getSegment();
|
|
1641
1656
|
return segment?.localRefs?.removeLocalRef(lref);
|
|
1642
1657
|
}
|
|
1658
|
+
startOfTree = new StartOfTreeSegment(this);
|
|
1659
|
+
endOfTree = new EndOfTreeSegment(this);
|
|
1643
1660
|
createLocalReferencePosition(_segment, offset, refType, properties, slidingPreference, canSlideToEndpoint) {
|
|
1644
1661
|
if (_segment !== "start" &&
|
|
1645
1662
|
_segment !== "end" &&
|
|
@@ -1999,15 +2016,4 @@ export class MergeTree {
|
|
|
1999
2016
|
}, undefined, post);
|
|
2000
2017
|
}
|
|
2001
2018
|
}
|
|
2002
|
-
MergeTree.options = {
|
|
2003
|
-
incrementalUpdate: true,
|
|
2004
|
-
insertAfterRemovedSegs: true,
|
|
2005
|
-
zamboniSegments: true,
|
|
2006
|
-
};
|
|
2007
|
-
/**
|
|
2008
|
-
* A sentinel value that indicates an inserting walk should continue to the next block sibling.
|
|
2009
|
-
* This can occur for example when tie-break forces insertion of a segment past an entire block (and
|
|
2010
|
-
* the inserting walk first recurses into the block before realizing that).
|
|
2011
|
-
*/
|
|
2012
|
-
MergeTree.theUnfinishedNode = { childCount: -1 };
|
|
2013
2019
|
//# sourceMappingURL=mergeTree.js.map
|