@fluidframework/merge-tree 2.41.0 → 2.43.0-343119

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 (154) hide show
  1. package/CHANGELOG.md +4 -0
  2. package/dist/client.d.ts +9 -6
  3. package/dist/client.d.ts.map +1 -1
  4. package/dist/client.js +79 -36
  5. package/dist/client.js.map +1 -1
  6. package/dist/collections/list.d.ts +95 -5
  7. package/dist/collections/list.d.ts.map +1 -1
  8. package/dist/collections/list.js +67 -5
  9. package/dist/collections/list.js.map +1 -1
  10. package/dist/constants.d.ts +5 -0
  11. package/dist/constants.d.ts.map +1 -1
  12. package/dist/constants.js +6 -1
  13. package/dist/constants.js.map +1 -1
  14. package/dist/index.d.ts +1 -1
  15. package/dist/index.d.ts.map +1 -1
  16. package/dist/index.js +3 -2
  17. package/dist/index.js.map +1 -1
  18. package/dist/mergeTree.d.ts +9 -9
  19. package/dist/mergeTree.d.ts.map +1 -1
  20. package/dist/mergeTree.js +15 -7
  21. package/dist/mergeTree.js.map +1 -1
  22. package/dist/perspective.d.ts +15 -0
  23. package/dist/perspective.d.ts.map +1 -1
  24. package/dist/perspective.js +25 -1
  25. package/dist/perspective.js.map +1 -1
  26. package/dist/revertibles.js +1 -1
  27. package/dist/revertibles.js.map +1 -1
  28. package/dist/stamps.d.ts +1 -0
  29. package/dist/stamps.d.ts.map +1 -1
  30. package/dist/stamps.js +5 -1
  31. package/dist/stamps.js.map +1 -1
  32. package/dist/test/beastTest.spec.js +1 -1
  33. package/dist/test/beastTest.spec.js.map +1 -1
  34. package/dist/test/client.annotateMarker.spec.js +1 -1
  35. package/dist/test/client.annotateMarker.spec.js.map +1 -1
  36. package/dist/test/client.applyMsg.spec.js +25 -25
  37. package/dist/test/client.applyMsg.spec.js.map +1 -1
  38. package/dist/test/client.applyStashedOpFarm.spec.d.ts.map +1 -1
  39. package/dist/test/client.applyStashedOpFarm.spec.js +3 -3
  40. package/dist/test/client.applyStashedOpFarm.spec.js.map +1 -1
  41. package/dist/test/client.attributionFarm.spec.js +1 -1
  42. package/dist/test/client.attributionFarm.spec.js.map +1 -1
  43. package/dist/test/client.getPosition.spec.js +1 -0
  44. package/dist/test/client.getPosition.spec.js.map +1 -1
  45. package/dist/test/client.localReference.spec.js +62 -48
  46. package/dist/test/client.localReference.spec.js.map +1 -1
  47. package/dist/test/client.localReferenceFarm.spec.js +1 -0
  48. package/dist/test/client.localReferenceFarm.spec.js.map +1 -1
  49. package/dist/test/client.reconnectFarm.spec.js +1 -1
  50. package/dist/test/client.reconnectFarm.spec.js.map +1 -1
  51. package/dist/test/client.rollback.spec.js +8 -6
  52. package/dist/test/client.rollback.spec.js.map +1 -1
  53. package/dist/test/client.searchForMarker.spec.js +2 -2
  54. package/dist/test/client.searchForMarker.spec.js.map +1 -1
  55. package/dist/test/clientTestHelper.js +1 -1
  56. package/dist/test/clientTestHelper.js.map +1 -1
  57. package/dist/test/mergeTree.annotate.spec.js +25 -25
  58. package/dist/test/mergeTree.annotate.spec.js.map +1 -1
  59. package/dist/test/mergeTree.markRangeRemoved.spec.js +1 -1
  60. package/dist/test/mergeTree.markRangeRemoved.spec.js.map +1 -1
  61. package/dist/test/obliterate.spec.js +4 -4
  62. package/dist/test/obliterate.spec.js.map +1 -1
  63. package/dist/test/resetPendingSegmentsToOp.spec.js +14 -14
  64. package/dist/test/resetPendingSegmentsToOp.spec.js.map +1 -1
  65. package/dist/test/snapshot.utils.js +1 -1
  66. package/dist/test/snapshot.utils.js.map +1 -1
  67. package/dist/test/sortedSegmentSet.spec.js +3 -3
  68. package/dist/test/sortedSegmentSet.spec.js.map +1 -1
  69. package/dist/test/testClient.js +3 -3
  70. package/dist/test/testClient.js.map +1 -1
  71. package/dist/test/tracking.spec.js +7 -7
  72. package/dist/test/tracking.spec.js.map +1 -1
  73. package/dist/test/wordUnitTests.spec.js.map +1 -1
  74. package/lib/client.d.ts +9 -6
  75. package/lib/client.d.ts.map +1 -1
  76. package/lib/client.js +81 -38
  77. package/lib/client.js.map +1 -1
  78. package/lib/collections/list.d.ts +95 -5
  79. package/lib/collections/list.d.ts.map +1 -1
  80. package/lib/collections/list.js +67 -5
  81. package/lib/collections/list.js.map +1 -1
  82. package/lib/constants.d.ts +5 -0
  83. package/lib/constants.d.ts.map +1 -1
  84. package/lib/constants.js +5 -0
  85. package/lib/constants.js.map +1 -1
  86. package/lib/index.d.ts +1 -1
  87. package/lib/index.d.ts.map +1 -1
  88. package/lib/index.js +1 -1
  89. package/lib/index.js.map +1 -1
  90. package/lib/mergeTree.d.ts +9 -9
  91. package/lib/mergeTree.d.ts.map +1 -1
  92. package/lib/mergeTree.js +15 -7
  93. package/lib/mergeTree.js.map +1 -1
  94. package/lib/perspective.d.ts +15 -0
  95. package/lib/perspective.d.ts.map +1 -1
  96. package/lib/perspective.js +23 -0
  97. package/lib/perspective.js.map +1 -1
  98. package/lib/revertibles.js +1 -1
  99. package/lib/revertibles.js.map +1 -1
  100. package/lib/stamps.d.ts +1 -0
  101. package/lib/stamps.d.ts.map +1 -1
  102. package/lib/stamps.js +4 -1
  103. package/lib/stamps.js.map +1 -1
  104. package/lib/test/beastTest.spec.js +1 -1
  105. package/lib/test/beastTest.spec.js.map +1 -1
  106. package/lib/test/client.annotateMarker.spec.js +1 -1
  107. package/lib/test/client.annotateMarker.spec.js.map +1 -1
  108. package/lib/test/client.applyMsg.spec.js +25 -25
  109. package/lib/test/client.applyMsg.spec.js.map +1 -1
  110. package/lib/test/client.applyStashedOpFarm.spec.d.ts.map +1 -1
  111. package/lib/test/client.applyStashedOpFarm.spec.js +3 -3
  112. package/lib/test/client.applyStashedOpFarm.spec.js.map +1 -1
  113. package/lib/test/client.attributionFarm.spec.js +1 -1
  114. package/lib/test/client.attributionFarm.spec.js.map +1 -1
  115. package/lib/test/client.getPosition.spec.js +1 -0
  116. package/lib/test/client.getPosition.spec.js.map +1 -1
  117. package/lib/test/client.localReference.spec.js +62 -48
  118. package/lib/test/client.localReference.spec.js.map +1 -1
  119. package/lib/test/client.localReferenceFarm.spec.js +1 -0
  120. package/lib/test/client.localReferenceFarm.spec.js.map +1 -1
  121. package/lib/test/client.reconnectFarm.spec.js +1 -1
  122. package/lib/test/client.reconnectFarm.spec.js.map +1 -1
  123. package/lib/test/client.rollback.spec.js +8 -6
  124. package/lib/test/client.rollback.spec.js.map +1 -1
  125. package/lib/test/client.searchForMarker.spec.js +2 -2
  126. package/lib/test/client.searchForMarker.spec.js.map +1 -1
  127. package/lib/test/clientTestHelper.js +1 -1
  128. package/lib/test/clientTestHelper.js.map +1 -1
  129. package/lib/test/mergeTree.annotate.spec.js +25 -25
  130. package/lib/test/mergeTree.annotate.spec.js.map +1 -1
  131. package/lib/test/mergeTree.markRangeRemoved.spec.js +1 -1
  132. package/lib/test/mergeTree.markRangeRemoved.spec.js.map +1 -1
  133. package/lib/test/obliterate.spec.js +4 -4
  134. package/lib/test/obliterate.spec.js.map +1 -1
  135. package/lib/test/resetPendingSegmentsToOp.spec.js +14 -14
  136. package/lib/test/resetPendingSegmentsToOp.spec.js.map +1 -1
  137. package/lib/test/snapshot.utils.js +1 -1
  138. package/lib/test/snapshot.utils.js.map +1 -1
  139. package/lib/test/sortedSegmentSet.spec.js +3 -3
  140. package/lib/test/sortedSegmentSet.spec.js.map +1 -1
  141. package/lib/test/testClient.js +3 -3
  142. package/lib/test/testClient.js.map +1 -1
  143. package/lib/test/tracking.spec.js +7 -7
  144. package/lib/test/tracking.spec.js.map +1 -1
  145. package/lib/test/wordUnitTests.spec.js.map +1 -1
  146. package/package.json +16 -16
  147. package/src/client.ts +117 -50
  148. package/src/collections/list.ts +101 -5
  149. package/src/constants.ts +6 -0
  150. package/src/index.ts +3 -0
  151. package/src/mergeTree.ts +30 -24
  152. package/src/perspective.ts +26 -0
  153. package/src/revertibles.ts +1 -1
  154. package/src/stamps.ts +9 -1
package/src/mergeTree.ts CHANGED
@@ -469,15 +469,17 @@ function getSlideToSegment(
469
469
  * @internal
470
470
  */
471
471
  export function getSlideToSegoff(
472
- segoff: { segment: ISegmentInternal | undefined; offset: number | undefined },
472
+ segoff: { segment: ISegmentInternal; offset: number } | undefined,
473
473
  slidingPreference: SlidingPreference = SlidingPreference.FORWARD,
474
474
  perspective: Perspective = allAckedChangesPerspective,
475
475
  useNewSlidingBehavior: boolean = false,
476
- ): {
477
- segment: ISegmentInternal | undefined;
478
- offset: number | undefined;
479
- } {
480
- if (!isSegmentLeaf(segoff.segment)) {
476
+ ):
477
+ | {
478
+ segment: ISegmentInternal;
479
+ offset: number;
480
+ }
481
+ | undefined {
482
+ if (!isSegmentLeaf(segoff?.segment)) {
481
483
  return segoff;
482
484
  }
483
485
  const [segment, _] = getSlideToSegment(
@@ -490,8 +492,11 @@ export function getSlideToSegoff(
490
492
  if (segment === segoff.segment) {
491
493
  return segoff;
492
494
  }
493
- const offset =
494
- segment && segment.ordinal < segoff.segment.ordinal ? segment.cachedLength - 1 : 0;
495
+ if (segment === undefined) {
496
+ return undefined;
497
+ }
498
+
499
+ const offset = segment.ordinal < segoff.segment.ordinal ? segment.cachedLength - 1 : 0;
495
500
  return {
496
501
  segment,
497
502
  offset,
@@ -849,10 +854,12 @@ export class MergeTree {
849
854
  public getContainingSegment(
850
855
  pos: number,
851
856
  perspective: Perspective,
852
- ): {
853
- segment: ISegmentLeaf | undefined;
854
- offset: number | undefined;
855
- } {
857
+ ):
858
+ | {
859
+ segment: ISegmentLeaf;
860
+ offset: number;
861
+ }
862
+ | undefined {
856
863
  assert(
857
864
  perspective.localSeq === undefined ||
858
865
  perspective.clientId === this.collabWindow.clientId,
@@ -868,6 +875,9 @@ export class MergeTree {
868
875
  return false;
869
876
  };
870
877
  this.nodeMap(perspective, leaf, undefined, pos, pos + 1);
878
+ if (segment === undefined || offset === undefined) {
879
+ return undefined;
880
+ }
871
881
  return { segment, offset };
872
882
  }
873
883
 
@@ -1260,17 +1270,18 @@ export class MergeTree {
1260
1270
  ): Marker | undefined {
1261
1271
  let foundMarker: Marker | undefined;
1262
1272
 
1263
- const { segment } = this.getContainingSegment(startPos, this.localPerspective);
1264
- if (!isSegmentLeaf(segment)) {
1273
+ const segoff = this.getContainingSegment(startPos, this.localPerspective);
1274
+ if (!isSegmentLeaf(segoff?.segment)) {
1265
1275
  return undefined;
1266
1276
  }
1277
+ const { segment } = segoff;
1267
1278
 
1268
1279
  depthFirstNodeWalk(
1269
1280
  segment.parent,
1270
1281
  segment,
1271
1282
  (node) => {
1272
1283
  if (node.isLeaf()) {
1273
- if (Marker.is(node) && refHasTileLabel(node, markerLabel)) {
1284
+ if (!isRemoved(node) && Marker.is(node) && refHasTileLabel(node, markerLabel)) {
1274
1285
  foundMarker = node;
1275
1286
  }
1276
1287
  } else {
@@ -1529,7 +1540,7 @@ export class MergeTree {
1529
1540
 
1530
1541
  if (isSegmentLeaf(segmentInfo?.segment)) {
1531
1542
  const segmentPosition = this.getPosition(segmentInfo.segment, this.localPerspective);
1532
- return segmentPosition + segmentInfo.offset!;
1543
+ return segmentPosition + segmentInfo.offset;
1533
1544
  } else {
1534
1545
  if (remoteClientPosition === this.getLength(remotePerspective)) {
1535
1546
  return this.getLength(this.localPerspective);
@@ -2085,14 +2096,9 @@ export class MergeTree {
2085
2096
  const createRefFromSequencePlace = (
2086
2097
  place: InteriorSequencePlace,
2087
2098
  ): LocalReferencePosition => {
2088
- const { segment: placeSeg, offset: placeOffset } = this.getContainingSegment(
2089
- place.pos,
2090
- perspective,
2091
- );
2092
- assert(
2093
- isSegmentLeaf(placeSeg) && placeOffset !== undefined,
2094
- 0xa3f /* segments cannot be undefined */,
2095
- );
2099
+ const segOff = this.getContainingSegment(place.pos, perspective);
2100
+ assert(isSegmentLeaf(segOff?.segment), 0xa3f /* segments cannot be undefined */);
2101
+ const { segment: placeSeg, offset: placeOffset } = segOff;
2096
2102
  return this.createLocalReferencePosition(
2097
2103
  placeSeg,
2098
2104
  placeOffset,
@@ -117,6 +117,32 @@ export class LocalReconnectingPerspective extends PerspectiveBase implements Per
117
117
  }
118
118
  }
119
119
 
120
+ /**
121
+ * This perspective is used when rebasing obliterate endpoints to find the segment to slide to when squash is enabled.
122
+ *
123
+ * TODO:AB#39357: This class would not be necessary if obliterate rebasing occurred as resubmit was called rather than
124
+ * precomputed before segment normalization. It also adds more dependencies on all ops being resubmitted (the squash
125
+ * parameter coming from rebasing an obliterate does not necessarily align with an inserted segment), which is not
126
+ * fully correct.
127
+ */
128
+ export class LocalSquashPerspective extends LocalReconnectingPerspective {
129
+ public constructor(
130
+ readonly refSeq: number,
131
+ readonly clientId: number,
132
+ readonly localSeq: number,
133
+ ) {
134
+ super(refSeq, clientId, localSeq);
135
+ }
136
+
137
+ public override isSegmentPresent(seg: ISegment): boolean {
138
+ // Avoid sliding to segments whose insertion will be squashed.
139
+ if (isInserted(seg) && opstampUtils.isLocal(seg.insert) && isRemoved(seg)) {
140
+ return false;
141
+ }
142
+ return super.isSegmentPresent(seg);
143
+ }
144
+ }
145
+
120
146
  /**
121
147
  * A perspective which includes edits which were either:
122
148
  * - acked and at or before some reference sequence number
@@ -309,7 +309,7 @@ function revertLocalRemove(
309
309
  const insertSegment = mergeTreeWithRevert.getContainingSegment(
310
310
  realPos,
311
311
  mergeTreeWithRevert.localPerspective,
312
- ).segment;
312
+ )?.segment;
313
313
  assertSegmentLeaf(insertSegment);
314
314
 
315
315
  const localSlideFilter = (lref: LocalReferencePosition): boolean =>
package/src/stamps.ts CHANGED
@@ -3,7 +3,11 @@
3
3
  * Licensed under the MIT License.
4
4
  */
5
5
 
6
- import { UnassignedSequenceNumber } from "./constants.js";
6
+ import {
7
+ SquashClient,
8
+ UnassignedSequenceNumber,
9
+ UniversalSequenceNumber,
10
+ } from "./constants.js";
7
11
 
8
12
  /**
9
13
  * A stamp that identifies provenance of an operation performed on the MergeTree.
@@ -122,6 +126,10 @@ export function isLocal(a: OperationStamp): boolean {
122
126
  return a.seq === UnassignedSequenceNumber;
123
127
  }
124
128
 
129
+ export function isSquashedOp(a: OperationStamp): boolean {
130
+ return a.clientId === SquashClient && a.seq === UniversalSequenceNumber;
131
+ }
132
+
125
133
  export function isAcked(a: OperationStamp): boolean {
126
134
  return a.seq !== UnassignedSequenceNumber;
127
135
  }