@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.
Files changed (52) hide show
  1. package/dist/client.d.ts.map +1 -1
  2. package/dist/client.js +2 -0
  3. package/dist/client.js.map +1 -1
  4. package/dist/collections.d.ts.map +1 -1
  5. package/dist/collections.js +1 -0
  6. package/dist/collections.js.map +1 -1
  7. package/dist/mergeTree.d.ts +5 -8
  8. package/dist/mergeTree.d.ts.map +1 -1
  9. package/dist/mergeTree.js +35 -48
  10. package/dist/mergeTree.js.map +1 -1
  11. package/dist/partialLengths.d.ts.map +1 -1
  12. package/dist/partialLengths.js +19 -18
  13. package/dist/partialLengths.js.map +1 -1
  14. package/dist/snapshotChunks.d.ts +4 -0
  15. package/dist/snapshotChunks.d.ts.map +1 -1
  16. package/dist/snapshotChunks.js.map +1 -1
  17. package/dist/snapshotLoader.d.ts.map +1 -1
  18. package/dist/snapshotLoader.js +9 -1
  19. package/dist/snapshotLoader.js.map +1 -1
  20. package/dist/snapshotV1.d.ts.map +1 -1
  21. package/dist/snapshotV1.js +7 -2
  22. package/dist/snapshotV1.js.map +1 -1
  23. package/lib/client.d.ts.map +1 -1
  24. package/lib/client.js +2 -0
  25. package/lib/client.js.map +1 -1
  26. package/lib/collections.d.ts.map +1 -1
  27. package/lib/collections.js +1 -0
  28. package/lib/collections.js.map +1 -1
  29. package/lib/mergeTree.d.ts +5 -8
  30. package/lib/mergeTree.d.ts.map +1 -1
  31. package/lib/mergeTree.js +33 -47
  32. package/lib/mergeTree.js.map +1 -1
  33. package/lib/partialLengths.d.ts.map +1 -1
  34. package/lib/partialLengths.js +20 -19
  35. package/lib/partialLengths.js.map +1 -1
  36. package/lib/snapshotChunks.d.ts +4 -0
  37. package/lib/snapshotChunks.d.ts.map +1 -1
  38. package/lib/snapshotChunks.js.map +1 -1
  39. package/lib/snapshotLoader.d.ts.map +1 -1
  40. package/lib/snapshotLoader.js +9 -1
  41. package/lib/snapshotLoader.js.map +1 -1
  42. package/lib/snapshotV1.d.ts.map +1 -1
  43. package/lib/snapshotV1.js +7 -2
  44. package/lib/snapshotV1.js.map +1 -1
  45. package/package.json +19 -13
  46. package/src/client.ts +2 -0
  47. package/src/collections.ts +2 -0
  48. package/src/mergeTree.ts +37 -55
  49. package/src/partialLengths.ts +23 -21
  50. package/src/snapshotChunks.ts +4 -0
  51. package/src/snapshotLoader.ts +9 -1
  52. 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.removedClientId = this.removedClientId;
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
- // eslint-disable-next-line @typescript-eslint/no-this-alias
289
- const removalInfo = this;
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.removedClientId = this.removedClientId;
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
- let block;
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.removedSeq !== undefined) {
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.removedSeq !== undefined
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.removedSeq !== undefined) {
1086
- if (removalInfo.removedClientId === clientId
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.removedSeq !== undefined
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 removalInfo = segment;
1866
- if (removalInfo.removedSeq !== undefined) {
1855
+ const existingRemovalInfo = toRemovalInfo(segment);
1856
+ if (existingRemovalInfo !== undefined) {
1867
1857
  _overwrite = true;
1868
- if (removalInfo.removedSeq === constants_1.UnassignedSequenceNumber) {
1869
- // replace because comes later
1870
- removalInfo.removedClientId = clientId;
1871
- removalInfo.removedSeq = seq;
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
- this.addOverlappingClient(removalInfo, clientId);
1869
+ existingRemovalInfo.removedClientIds.push(clientId);
1877
1870
  }
1878
1871
  }
1879
1872
  else {
1880
- removalInfo.removedClientId = clientId;
1881
- removalInfo.removedSeq = seq;
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
- // Use removal information
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