@fluidframework/merge-tree 0.58.2001 → 0.59.2000-61729
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/dist/client.d.ts.map +1 -1
- package/dist/client.js +2 -0
- package/dist/client.js.map +1 -1
- package/dist/collections.d.ts.map +1 -1
- package/dist/collections.js +1 -0
- package/dist/collections.js.map +1 -1
- package/dist/mergeTree.d.ts +5 -8
- package/dist/mergeTree.d.ts.map +1 -1
- package/dist/mergeTree.js +35 -48
- package/dist/mergeTree.js.map +1 -1
- package/dist/partialLengths.d.ts.map +1 -1
- package/dist/partialLengths.js +19 -18
- package/dist/partialLengths.js.map +1 -1
- package/dist/snapshotChunks.d.ts +4 -0
- package/dist/snapshotChunks.d.ts.map +1 -1
- package/dist/snapshotChunks.js.map +1 -1
- package/dist/snapshotLoader.d.ts.map +1 -1
- package/dist/snapshotLoader.js +9 -1
- package/dist/snapshotLoader.js.map +1 -1
- package/dist/snapshotV1.d.ts.map +1 -1
- package/dist/snapshotV1.js +7 -2
- package/dist/snapshotV1.js.map +1 -1
- package/lib/client.d.ts.map +1 -1
- package/lib/client.js +2 -0
- package/lib/client.js.map +1 -1
- package/lib/collections.d.ts.map +1 -1
- package/lib/collections.js +1 -0
- package/lib/collections.js.map +1 -1
- package/lib/mergeTree.d.ts +5 -8
- package/lib/mergeTree.d.ts.map +1 -1
- package/lib/mergeTree.js +33 -47
- package/lib/mergeTree.js.map +1 -1
- package/lib/partialLengths.d.ts.map +1 -1
- package/lib/partialLengths.js +20 -19
- package/lib/partialLengths.js.map +1 -1
- package/lib/snapshotChunks.d.ts +4 -0
- package/lib/snapshotChunks.d.ts.map +1 -1
- package/lib/snapshotChunks.js.map +1 -1
- package/lib/snapshotLoader.d.ts.map +1 -1
- package/lib/snapshotLoader.js +9 -1
- package/lib/snapshotLoader.js.map +1 -1
- package/lib/snapshotV1.d.ts.map +1 -1
- package/lib/snapshotV1.js +7 -2
- package/lib/snapshotV1.js.map +1 -1
- package/package.json +19 -13
- package/src/client.ts +2 -0
- package/src/collections.ts +2 -0
- package/src/mergeTree.ts +37 -55
- package/src/partialLengths.ts +23 -21
- package/src/snapshotChunks.ts +4 -0
- package/src/snapshotLoader.ts +9 -1
- package/src/snapshotV1.ts +8 -2
package/dist/mergeTree.js
CHANGED
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
/* eslint-disable @typescript-eslint/no-non-null-assertion */
|
|
8
8
|
/* eslint-disable @typescript-eslint/consistent-type-assertions */
|
|
9
9
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
-
exports.MergeTree = exports.clientSeqComparer = exports.internedSpaces = exports.compareStrings = exports.compareNumbers = exports.CollaborationWindow = exports.IncrementalMapState = exports.IncrementalExecOp = exports.Marker = exports.refHasRangeLabel = exports.refHasTileLabel = exports.refGetRangeLabels = exports.refGetTileLabels = exports.reservedMarkerSimpleTypeKey = exports.reservedMarkerIdKey = exports.reservedRangeLabelsKey = exports.reservedTileLabelsKey = exports.BaseSegment = exports.MergeBlock = exports.MaxNodesInBlock = exports.ordinalToArray = exports.MergeNode = void 0;
|
|
10
|
+
exports.MergeTree = exports.clientSeqComparer = exports.internedSpaces = exports.compareStrings = exports.compareNumbers = exports.CollaborationWindow = exports.IncrementalMapState = exports.IncrementalExecOp = exports.Marker = exports.refHasRangeLabel = exports.refHasTileLabel = exports.refGetRangeLabels = exports.refGetTileLabels = exports.reservedMarkerSimpleTypeKey = exports.reservedMarkerIdKey = exports.reservedRangeLabelsKey = exports.reservedTileLabelsKey = exports.BaseSegment = exports.MergeBlock = exports.MaxNodesInBlock = exports.ordinalToArray = exports.MergeNode = exports.toRemovalInfo = void 0;
|
|
11
11
|
/* eslint-disable no-bitwise */
|
|
12
12
|
const common_utils_1 = require("@fluidframework/common-utils");
|
|
13
13
|
const collections_1 = require("./collections");
|
|
@@ -19,6 +19,13 @@ const partialLengths_1 = require("./partialLengths");
|
|
|
19
19
|
const properties_1 = require("./properties");
|
|
20
20
|
const segmentGroupCollection_1 = require("./segmentGroupCollection");
|
|
21
21
|
const segmentPropertiesManager_1 = require("./segmentPropertiesManager");
|
|
22
|
+
function toRemovalInfo(maybe) {
|
|
23
|
+
if ((maybe === null || maybe === void 0 ? void 0 : maybe.removedClientIds) !== undefined && (maybe === null || maybe === void 0 ? void 0 : maybe.removedSeq) !== undefined) {
|
|
24
|
+
return maybe;
|
|
25
|
+
}
|
|
26
|
+
common_utils_1.assert((maybe === null || maybe === void 0 ? void 0 : maybe.removedClientIds) === undefined && (maybe === null || maybe === void 0 ? void 0 : maybe.removedSeq) === undefined, 0x2bf /* "both removedClientIds and removedSeq should be set or not set" */);
|
|
27
|
+
}
|
|
28
|
+
exports.toRemovalInfo = toRemovalInfo;
|
|
22
29
|
class MergeNode {
|
|
23
30
|
constructor() {
|
|
24
31
|
this.index = 0;
|
|
@@ -255,10 +262,11 @@ class BaseSegment extends MergeNode {
|
|
|
255
262
|
return true;
|
|
256
263
|
}
|
|
257
264
|
cloneInto(b) {
|
|
265
|
+
var _a;
|
|
258
266
|
b.clientId = this.clientId;
|
|
259
267
|
// TODO: deep clone properties
|
|
260
268
|
b.properties = properties_1.clone(this.properties);
|
|
261
|
-
b.
|
|
269
|
+
b.removedClientIds = (_a = this.removedClientIds) === null || _a === void 0 ? void 0 : _a.slice();
|
|
262
270
|
// TODO: copy removed client overlap and branch removal info
|
|
263
271
|
b.removedSeq = this.removedSeq;
|
|
264
272
|
b.seq = this.seq;
|
|
@@ -285,10 +293,8 @@ class BaseSegment extends MergeNode {
|
|
|
285
293
|
this.localSeq = undefined;
|
|
286
294
|
return true;
|
|
287
295
|
case 1 /* REMOVE */:
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
common_utils_1.assert(!!removalInfo, 0x046 /* "On remove ack, missing removal info!" */);
|
|
291
|
-
common_utils_1.assert(!!removalInfo.removedSeq, 0x047 /* "On remove ack, missing removed sequence number!" */);
|
|
296
|
+
const removalInfo = toRemovalInfo(this);
|
|
297
|
+
common_utils_1.assert(removalInfo !== undefined, 0x046 /* "On remove ack, missing removal info!" */);
|
|
292
298
|
this.localRemovedSeq = undefined;
|
|
293
299
|
if (removalInfo.removedSeq === constants_1.UnassignedSequenceNumber) {
|
|
294
300
|
removalInfo.removedSeq = opArgs.sequencedMessage.sequenceNumber;
|
|
@@ -300,6 +306,7 @@ class BaseSegment extends MergeNode {
|
|
|
300
306
|
}
|
|
301
307
|
}
|
|
302
308
|
splitAt(pos) {
|
|
309
|
+
var _a;
|
|
303
310
|
if (pos > 0) {
|
|
304
311
|
const leafSegment = this.createSplitSegmentAt(pos);
|
|
305
312
|
if (leafSegment) {
|
|
@@ -309,15 +316,12 @@ class BaseSegment extends MergeNode {
|
|
|
309
316
|
// when this segment is put in the tree, it will get it's real ordinal,
|
|
310
317
|
// but this ordinal meets all the necessary invariants for now.
|
|
311
318
|
leafSegment.ordinal = this.ordinal + String.fromCharCode(0);
|
|
312
|
-
leafSegment.
|
|
319
|
+
leafSegment.removedClientIds = (_a = this.removedClientIds) === null || _a === void 0 ? void 0 : _a.slice();
|
|
313
320
|
leafSegment.removedSeq = this.removedSeq;
|
|
314
321
|
leafSegment.localRemovedSeq = this.localRemovedSeq;
|
|
315
322
|
leafSegment.seq = this.seq;
|
|
316
323
|
leafSegment.localSeq = this.localSeq;
|
|
317
324
|
leafSegment.clientId = this.clientId;
|
|
318
|
-
if (this.removedClientOverlap) {
|
|
319
|
-
leafSegment.removedClientOverlap = [...this.removedClientOverlap];
|
|
320
|
-
}
|
|
321
325
|
this.segmentGroups.copyTo(leafSegment);
|
|
322
326
|
this.trackingCollection.copyTo(leafSegment);
|
|
323
327
|
if (this.localRefs) {
|
|
@@ -680,13 +684,7 @@ class MergeTree {
|
|
|
680
684
|
this.root = this.makeBlock(0);
|
|
681
685
|
}
|
|
682
686
|
makeBlock(childCount) {
|
|
683
|
-
|
|
684
|
-
if (MergeTree.blockUpdateMarkers) {
|
|
685
|
-
block = new HierMergeBlock(childCount);
|
|
686
|
-
}
|
|
687
|
-
else {
|
|
688
|
-
block = new MergeBlock(childCount);
|
|
689
|
-
}
|
|
687
|
+
const block = new HierMergeBlock(childCount);
|
|
690
688
|
block.ordinal = "";
|
|
691
689
|
return block;
|
|
692
690
|
}
|
|
@@ -719,8 +717,8 @@ class MergeTree {
|
|
|
719
717
|
return b;
|
|
720
718
|
}
|
|
721
719
|
localNetLength(segment) {
|
|
722
|
-
const removalInfo = segment;
|
|
723
|
-
if (removalInfo
|
|
720
|
+
const removalInfo = toRemovalInfo(segment);
|
|
721
|
+
if (removalInfo !== undefined) {
|
|
724
722
|
return 0;
|
|
725
723
|
}
|
|
726
724
|
else {
|
|
@@ -1070,8 +1068,8 @@ class MergeTree {
|
|
|
1070
1068
|
}
|
|
1071
1069
|
else {
|
|
1072
1070
|
const segment = node;
|
|
1073
|
-
const removalInfo = segment;
|
|
1074
|
-
if (removalInfo
|
|
1071
|
+
const removalInfo = toRemovalInfo(segment);
|
|
1072
|
+
if (removalInfo !== undefined
|
|
1075
1073
|
&& removalInfo.removedSeq !== constants_1.UnassignedSequenceNumber
|
|
1076
1074
|
&& removalInfo.removedSeq <= refSeq) {
|
|
1077
1075
|
// this segment is a tombstone eligible for zamboni
|
|
@@ -1082,10 +1080,8 @@ class MergeTree {
|
|
|
1082
1080
|
if (((segment.clientId === clientId) ||
|
|
1083
1081
|
((segment.seq !== constants_1.UnassignedSequenceNumber) && (segment.seq <= refSeq)))) {
|
|
1084
1082
|
// Segment happened by reference sequence number or segment from requesting client
|
|
1085
|
-
if (removalInfo
|
|
1086
|
-
if (removalInfo.
|
|
1087
|
-
|| (removalInfo.removedClientOverlap
|
|
1088
|
-
&& removalInfo.removedClientOverlap.includes(clientId))) {
|
|
1083
|
+
if (removalInfo !== undefined) {
|
|
1084
|
+
if (removalInfo.removedClientIds.includes(clientId)) {
|
|
1089
1085
|
return 0;
|
|
1090
1086
|
}
|
|
1091
1087
|
else {
|
|
@@ -1100,7 +1096,7 @@ class MergeTree {
|
|
|
1100
1096
|
// the segment was inserted and removed before the
|
|
1101
1097
|
// this context, so it will never exist for this
|
|
1102
1098
|
// context
|
|
1103
|
-
if (removalInfo
|
|
1099
|
+
if (removalInfo !== undefined
|
|
1104
1100
|
&& removalInfo.removedSeq !== constants_1.UnassignedSequenceNumber) {
|
|
1105
1101
|
return undefined;
|
|
1106
1102
|
}
|
|
@@ -1801,12 +1797,6 @@ class MergeTree {
|
|
|
1801
1797
|
}
|
|
1802
1798
|
}
|
|
1803
1799
|
}
|
|
1804
|
-
addOverlappingClient(removalInfo, clientId) {
|
|
1805
|
-
if (!removalInfo.removedClientOverlap) {
|
|
1806
|
-
removalInfo.removedClientOverlap = [];
|
|
1807
|
-
}
|
|
1808
|
-
removalInfo.removedClientOverlap.push(clientId);
|
|
1809
|
-
}
|
|
1810
1800
|
/**
|
|
1811
1801
|
* Annotate a range with properties
|
|
1812
1802
|
* @param start - The inclusive start position of the range to annotate
|
|
@@ -1862,23 +1852,26 @@ class MergeTree {
|
|
|
1862
1852
|
const savedLocalRefs = [];
|
|
1863
1853
|
const localSeq = seq === constants_1.UnassignedSequenceNumber ? ++this.collabWindow.localSeq : undefined;
|
|
1864
1854
|
const markRemoved = (segment, pos, _start, _end) => {
|
|
1865
|
-
const
|
|
1866
|
-
if (
|
|
1855
|
+
const existingRemovalInfo = toRemovalInfo(segment);
|
|
1856
|
+
if (existingRemovalInfo !== undefined) {
|
|
1867
1857
|
_overwrite = true;
|
|
1868
|
-
if (
|
|
1869
|
-
//
|
|
1870
|
-
|
|
1871
|
-
|
|
1858
|
+
if (existingRemovalInfo.removedSeq === constants_1.UnassignedSequenceNumber) {
|
|
1859
|
+
// we removed this locally, but someone else removed it first
|
|
1860
|
+
// so put them at the head of the list
|
|
1861
|
+
// the list isn't ordered, but we
|
|
1862
|
+
// keep first removal at the head.
|
|
1863
|
+
existingRemovalInfo.removedClientIds.unshift(clientId);
|
|
1864
|
+
existingRemovalInfo.removedSeq = seq;
|
|
1872
1865
|
segment.localRemovedSeq = undefined;
|
|
1873
1866
|
}
|
|
1874
1867
|
else {
|
|
1875
1868
|
// Do not replace earlier sequence number for remove
|
|
1876
|
-
|
|
1869
|
+
existingRemovalInfo.removedClientIds.push(clientId);
|
|
1877
1870
|
}
|
|
1878
1871
|
}
|
|
1879
1872
|
else {
|
|
1880
|
-
|
|
1881
|
-
|
|
1873
|
+
segment.removedClientIds = [clientId];
|
|
1874
|
+
segment.removedSeq = seq;
|
|
1882
1875
|
segment.localRemovedSeq = localSeq;
|
|
1883
1876
|
removedSegments.push({ segment });
|
|
1884
1877
|
if (segment.localRefs && !segment.localRefs.empty) {
|
|
@@ -1888,9 +1881,7 @@ class MergeTree {
|
|
|
1888
1881
|
}
|
|
1889
1882
|
// Save segment so can assign removed sequence number when acked by server
|
|
1890
1883
|
if (this.collabWindow.collaborating) {
|
|
1891
|
-
|
|
1892
|
-
const _removalInfo = segment;
|
|
1893
|
-
if (_removalInfo.removedSeq === constants_1.UnassignedSequenceNumber && clientId === this.collabWindow.clientId) {
|
|
1884
|
+
if (segment.removedSeq === constants_1.UnassignedSequenceNumber && clientId === this.collabWindow.clientId) {
|
|
1894
1885
|
segmentGroup = this.addToPendingList(segment, segmentGroup, localSeq);
|
|
1895
1886
|
}
|
|
1896
1887
|
else {
|
|
@@ -2185,8 +2176,4 @@ MergeTree.options = {
|
|
|
2185
2176
|
zamboniSegments: true,
|
|
2186
2177
|
};
|
|
2187
2178
|
MergeTree.theUnfinishedNode = { childCount: -1 };
|
|
2188
|
-
// WARNING:
|
|
2189
|
-
// Setting blockUpdateMarkers to false will result in eventual consistency issues
|
|
2190
|
-
// for property updates on markers when loading from snapshots
|
|
2191
|
-
MergeTree.blockUpdateMarkers = true;
|
|
2192
2179
|
//# sourceMappingURL=mergeTree.js.map
|