@fluidframework/merge-tree 2.117.0 → 3.0.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.
Files changed (184) hide show
  1. package/CHANGELOG.md +36 -2
  2. package/README.md +53 -50
  3. package/{api-extractor.json → api-extractor/api-extractor-model.json} +1 -1
  4. package/dist/MergeTreeTextHelper.js +1 -0
  5. package/dist/MergeTreeTextHelper.js.map +1 -1
  6. package/dist/attributionCollection.js +6 -4
  7. package/dist/attributionCollection.js.map +1 -1
  8. package/dist/attributionPolicy.js +3 -4
  9. package/dist/attributionPolicy.js.map +1 -1
  10. package/dist/client.js +27 -10
  11. package/dist/client.js.map +1 -1
  12. package/dist/collections/rbTree.d.ts.map +1 -1
  13. package/dist/collections/rbTree.js +3 -0
  14. package/dist/collections/rbTree.js.map +1 -1
  15. package/dist/endOfTreeSegment.d.ts.map +1 -1
  16. package/dist/endOfTreeSegment.js +25 -26
  17. package/dist/endOfTreeSegment.js.map +1 -1
  18. package/dist/localReference.js +17 -7
  19. package/dist/localReference.js.map +1 -1
  20. package/dist/mergeTree.d.ts.map +1 -1
  21. package/dist/mergeTree.js +90 -74
  22. package/dist/mergeTree.js.map +1 -1
  23. package/dist/mergeTreeNodeWalk.js +5 -5
  24. package/dist/mergeTreeNodeWalk.js.map +1 -1
  25. package/dist/mergeTreeNodes.d.ts.map +1 -1
  26. package/dist/mergeTreeNodes.js +117 -90
  27. package/dist/mergeTreeNodes.js.map +1 -1
  28. package/dist/mergeTreeTracking.js +4 -0
  29. package/dist/mergeTreeTracking.js.map +1 -1
  30. package/dist/opBuilder.js +9 -10
  31. package/dist/opBuilder.js.map +1 -1
  32. package/dist/ordinal.js +1 -2
  33. package/dist/ordinal.js.map +1 -1
  34. package/dist/partialLengths.js +109 -73
  35. package/dist/partialLengths.js.map +1 -1
  36. package/dist/perspective.js +31 -11
  37. package/dist/perspective.js.map +1 -1
  38. package/dist/properties.js +6 -7
  39. package/dist/properties.js.map +1 -1
  40. package/dist/referencePositions.d.ts.map +1 -1
  41. package/dist/referencePositions.js +7 -7
  42. package/dist/referencePositions.js.map +1 -1
  43. package/dist/revertibles.js +4 -5
  44. package/dist/revertibles.js.map +1 -1
  45. package/dist/segmentGroupCollection.js +2 -0
  46. package/dist/segmentGroupCollection.js.map +1 -1
  47. package/dist/segmentInfos.d.ts.map +1 -1
  48. package/dist/segmentInfos.js +5 -5
  49. package/dist/segmentInfos.js.map +1 -1
  50. package/dist/segmentPropertiesManager.js +3 -5
  51. package/dist/segmentPropertiesManager.js.map +1 -1
  52. package/dist/sequencePlace.js +3 -3
  53. package/dist/sequencePlace.js.map +1 -1
  54. package/dist/snapshotChunks.d.ts.map +1 -1
  55. package/dist/snapshotChunks.js +6 -6
  56. package/dist/snapshotChunks.js.map +1 -1
  57. package/dist/snapshotLoader.js +85 -70
  58. package/dist/snapshotLoader.js.map +1 -1
  59. package/dist/snapshotV1.d.ts.map +1 -1
  60. package/dist/snapshotV1.js +34 -14
  61. package/dist/snapshotV1.js.map +1 -1
  62. package/dist/snapshotlegacy.d.ts.map +1 -1
  63. package/dist/snapshotlegacy.js +18 -10
  64. package/dist/snapshotlegacy.js.map +1 -1
  65. package/dist/sortedSet.js +1 -3
  66. package/dist/sortedSet.js.map +1 -1
  67. package/dist/stamps.js +11 -12
  68. package/dist/stamps.js.map +1 -1
  69. package/dist/test/attributionCollection.spec.js +1 -1
  70. package/dist/test/attributionCollection.spec.js.map +1 -1
  71. package/dist/test/beastTest.spec.js +15 -11
  72. package/dist/test/beastTest.spec.js.map +1 -1
  73. package/dist/test/client.apis.spec.js +2 -3
  74. package/dist/test/client.apis.spec.js.map +1 -1
  75. package/dist/test/client.replay.spec.js +17 -7
  76. package/dist/test/client.replay.spec.js.map +1 -1
  77. package/dist/test/clientTestHelper.js +7 -4
  78. package/dist/test/clientTestHelper.js.map +1 -1
  79. package/dist/test/mergeTreeOperationRunner.js +26 -16
  80. package/dist/test/mergeTreeOperationRunner.js.map +1 -1
  81. package/dist/test/obliterateOperations.d.ts.map +1 -1
  82. package/dist/test/revertibles.spec.js +1 -2
  83. package/dist/test/revertibles.spec.js.map +1 -1
  84. package/dist/test/snapshot.utils.d.ts.map +1 -1
  85. package/dist/test/snapshot.utils.js +7 -5
  86. package/dist/test/snapshot.utils.js.map +1 -1
  87. package/dist/test/stamps.spec.js +17 -7
  88. package/dist/test/stamps.spec.js.map +1 -1
  89. package/dist/test/testClient.d.ts.map +1 -1
  90. package/dist/test/testClient.js +19 -17
  91. package/dist/test/testClient.js.map +1 -1
  92. package/dist/test/testClientLogger.d.ts.map +1 -1
  93. package/dist/test/testClientLogger.js +12 -8
  94. package/dist/test/testClientLogger.js.map +1 -1
  95. package/dist/test/testServer.js +7 -7
  96. package/dist/test/testServer.js.map +1 -1
  97. package/dist/test/testUtils.d.ts +0 -1
  98. package/dist/test/testUtils.d.ts.map +1 -1
  99. package/dist/test/testUtils.js +9 -10
  100. package/dist/test/testUtils.js.map +1 -1
  101. package/dist/test/text.js +2 -3
  102. package/dist/test/text.js.map +1 -1
  103. package/dist/test/wordUnitTests.spec.js +1 -2
  104. package/dist/test/wordUnitTests.spec.js.map +1 -1
  105. package/dist/textSegment.js +3 -2
  106. package/dist/textSegment.js.map +1 -1
  107. package/dist/zamboni.js +20 -10
  108. package/dist/zamboni.js.map +1 -1
  109. package/lib/MergeTreeTextHelper.js +1 -0
  110. package/lib/MergeTreeTextHelper.js.map +1 -1
  111. package/lib/attributionCollection.js +4 -2
  112. package/lib/attributionCollection.js.map +1 -1
  113. package/lib/client.js +10 -3
  114. package/lib/client.js.map +1 -1
  115. package/lib/collections/rbTree.d.ts.map +1 -1
  116. package/lib/collections/rbTree.js +3 -0
  117. package/lib/collections/rbTree.js.map +1 -1
  118. package/lib/endOfTreeSegment.d.ts.map +1 -1
  119. package/lib/endOfTreeSegment.js +25 -26
  120. package/lib/endOfTreeSegment.js.map +1 -1
  121. package/lib/legacy.d.ts +1 -1
  122. package/lib/localReference.js +12 -2
  123. package/lib/localReference.js.map +1 -1
  124. package/lib/mergeTree.d.ts.map +1 -1
  125. package/lib/mergeTree.js +68 -62
  126. package/lib/mergeTree.js.map +1 -1
  127. package/lib/mergeTreeNodes.d.ts.map +1 -1
  128. package/lib/mergeTreeNodes.js +111 -84
  129. package/lib/mergeTreeNodes.js.map +1 -1
  130. package/lib/mergeTreeTracking.js +4 -0
  131. package/lib/mergeTreeTracking.js.map +1 -1
  132. package/lib/partialLengths.js +89 -63
  133. package/lib/partialLengths.js.map +1 -1
  134. package/lib/perspective.js +12 -2
  135. package/lib/perspective.js.map +1 -1
  136. package/lib/public.d.ts +1 -1
  137. package/lib/referencePositions.d.ts.map +1 -1
  138. package/lib/segmentGroupCollection.js +2 -0
  139. package/lib/segmentGroupCollection.js.map +1 -1
  140. package/lib/segmentInfos.d.ts.map +1 -1
  141. package/lib/segmentPropertiesManager.js +1 -3
  142. package/lib/segmentPropertiesManager.js.map +1 -1
  143. package/lib/snapshotChunks.d.ts.map +1 -1
  144. package/lib/snapshotChunks.js +2 -1
  145. package/lib/snapshotChunks.js.map +1 -1
  146. package/lib/snapshotLoader.js +68 -63
  147. package/lib/snapshotLoader.js.map +1 -1
  148. package/lib/snapshotV1.d.ts.map +1 -1
  149. package/lib/snapshotV1.js +17 -7
  150. package/lib/snapshotV1.js.map +1 -1
  151. package/lib/snapshotlegacy.d.ts.map +1 -1
  152. package/lib/snapshotlegacy.js +18 -10
  153. package/lib/snapshotlegacy.js.map +1 -1
  154. package/lib/sortedSet.js +1 -3
  155. package/lib/sortedSet.js.map +1 -1
  156. package/lib/test/attributionCollection.spec.js +1 -1
  157. package/lib/test/attributionCollection.spec.js.map +1 -1
  158. package/lib/test/beastTest.spec.js +7 -3
  159. package/lib/test/beastTest.spec.js.map +1 -1
  160. package/lib/test/clientTestHelper.js +7 -4
  161. package/lib/test/clientTestHelper.js.map +1 -1
  162. package/lib/test/obliterateOperations.d.ts.map +1 -1
  163. package/lib/test/snapshot.utils.d.ts.map +1 -1
  164. package/lib/test/snapshot.utils.js +5 -3
  165. package/lib/test/snapshot.utils.js.map +1 -1
  166. package/lib/test/testClient.d.ts.map +1 -1
  167. package/lib/test/testClient.js +16 -14
  168. package/lib/test/testClient.js.map +1 -1
  169. package/lib/test/testClientLogger.d.ts.map +1 -1
  170. package/lib/test/testClientLogger.js +10 -6
  171. package/lib/test/testClientLogger.js.map +1 -1
  172. package/lib/test/testServer.js +5 -5
  173. package/lib/test/testServer.js.map +1 -1
  174. package/lib/test/testUtils.d.ts +0 -1
  175. package/lib/test/testUtils.d.ts.map +1 -1
  176. package/lib/textSegment.js +3 -2
  177. package/lib/textSegment.js.map +1 -1
  178. package/package.json +39 -58
  179. package/src/snapshotChunks.ts +10 -6
  180. package/tsconfig.json +1 -1
  181. package/internal.d.ts +0 -11
  182. package/legacy.d.ts +0 -11
  183. /package/api-extractor/{api-extractor.current.json → api-extractor-report.current.json} +0 -0
  184. /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