@fluidframework/merge-tree 2.11.0 → 2.13.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 (306) hide show
  1. package/CHANGELOG.md +45 -0
  2. package/api-report/merge-tree.legacy.alpha.api.md +50 -19
  3. package/dist/MergeTreeTextHelper.d.ts.map +1 -1
  4. package/dist/MergeTreeTextHelper.js +0 -2
  5. package/dist/MergeTreeTextHelper.js.map +1 -1
  6. package/dist/attributionPolicy.d.ts.map +1 -1
  7. package/dist/attributionPolicy.js +6 -15
  8. package/dist/attributionPolicy.js.map +1 -1
  9. package/dist/client.d.ts +3 -4
  10. package/dist/client.d.ts.map +1 -1
  11. package/dist/client.js +39 -28
  12. package/dist/client.js.map +1 -1
  13. package/dist/endOfTreeSegment.d.ts +5 -4
  14. package/dist/endOfTreeSegment.d.ts.map +1 -1
  15. package/dist/endOfTreeSegment.js.map +1 -1
  16. package/dist/index.d.ts +2 -1
  17. package/dist/index.d.ts.map +1 -1
  18. package/dist/index.js +3 -4
  19. package/dist/index.js.map +1 -1
  20. package/dist/legacy.d.ts +2 -1
  21. package/dist/localReference.d.ts +1 -0
  22. package/dist/localReference.d.ts.map +1 -1
  23. package/dist/localReference.js +1 -0
  24. package/dist/localReference.js.map +1 -1
  25. package/dist/mergeTree.d.ts +8 -7
  26. package/dist/mergeTree.d.ts.map +1 -1
  27. package/dist/mergeTree.js +202 -211
  28. package/dist/mergeTree.js.map +1 -1
  29. package/dist/mergeTreeNodeWalk.d.ts +5 -5
  30. package/dist/mergeTreeNodeWalk.d.ts.map +1 -1
  31. package/dist/mergeTreeNodeWalk.js +3 -2
  32. package/dist/mergeTreeNodeWalk.js.map +1 -1
  33. package/dist/mergeTreeNodes.d.ts +181 -159
  34. package/dist/mergeTreeNodes.d.ts.map +1 -1
  35. package/dist/mergeTreeNodes.js +121 -109
  36. package/dist/mergeTreeNodes.js.map +1 -1
  37. package/dist/mergeTreeTracking.d.ts.map +1 -1
  38. package/dist/mergeTreeTracking.js +0 -2
  39. package/dist/mergeTreeTracking.js.map +1 -1
  40. package/dist/partialLengths.d.ts +2 -2
  41. package/dist/partialLengths.d.ts.map +1 -1
  42. package/dist/partialLengths.js +33 -27
  43. package/dist/partialLengths.js.map +1 -1
  44. package/dist/perspective.d.ts +10 -9
  45. package/dist/perspective.d.ts.map +1 -1
  46. package/dist/perspective.js +11 -4
  47. package/dist/perspective.js.map +1 -1
  48. package/dist/referencePositions.d.ts.map +1 -1
  49. package/dist/referencePositions.js +4 -1
  50. package/dist/referencePositions.js.map +1 -1
  51. package/dist/revertibles.d.ts.map +1 -1
  52. package/dist/revertibles.js +13 -11
  53. package/dist/revertibles.js.map +1 -1
  54. package/dist/segmentGroupCollection.d.ts +4 -4
  55. package/dist/segmentGroupCollection.d.ts.map +1 -1
  56. package/dist/segmentGroupCollection.js +0 -6
  57. package/dist/segmentGroupCollection.js.map +1 -1
  58. package/dist/segmentInfos.d.ts +257 -0
  59. package/dist/segmentInfos.d.ts.map +1 -0
  60. package/dist/segmentInfos.js +166 -0
  61. package/dist/segmentInfos.js.map +1 -0
  62. package/dist/snapshotLoader.d.ts.map +1 -1
  63. package/dist/snapshotLoader.js +38 -44
  64. package/dist/snapshotLoader.js.map +1 -1
  65. package/dist/snapshotV1.d.ts.map +1 -1
  66. package/dist/snapshotV1.js +9 -12
  67. package/dist/snapshotV1.js.map +1 -1
  68. package/dist/snapshotlegacy.d.ts +2 -2
  69. package/dist/snapshotlegacy.d.ts.map +1 -1
  70. package/dist/snapshotlegacy.js +5 -3
  71. package/dist/snapshotlegacy.js.map +1 -1
  72. package/dist/sortedSegmentSet.d.ts +4 -4
  73. package/dist/sortedSegmentSet.d.ts.map +1 -1
  74. package/dist/sortedSegmentSet.js +5 -8
  75. package/dist/sortedSegmentSet.js.map +1 -1
  76. package/dist/test/beastTest.spec.d.ts +0 -2
  77. package/dist/test/beastTest.spec.d.ts.map +1 -1
  78. package/dist/test/beastTest.spec.js +1 -5
  79. package/dist/test/beastTest.spec.js.map +1 -1
  80. package/dist/test/client.annotateMarker.spec.js.map +1 -1
  81. package/dist/test/client.applyMsg.spec.js +15 -12
  82. package/dist/test/client.applyMsg.spec.js.map +1 -1
  83. package/dist/test/client.attributionFarm.spec.d.ts.map +1 -1
  84. package/dist/test/client.attributionFarm.spec.js.map +1 -1
  85. package/dist/test/client.getPosition.spec.js +3 -2
  86. package/dist/test/client.getPosition.spec.js.map +1 -1
  87. package/dist/test/client.localReference.spec.js +6 -6
  88. package/dist/test/client.localReference.spec.js.map +1 -1
  89. package/dist/test/client.localReferenceFarm.spec.js.map +1 -1
  90. package/dist/test/client.rollback.spec.js.map +1 -1
  91. package/dist/test/dirname.cjs +0 -1
  92. package/dist/test/dirname.cjs.map +1 -1
  93. package/dist/test/index.d.ts +1 -1
  94. package/dist/test/index.d.ts.map +1 -1
  95. package/dist/test/index.js +2 -4
  96. package/dist/test/index.js.map +1 -1
  97. package/dist/test/mergeTree.annotate.spec.js +3 -0
  98. package/dist/test/mergeTree.annotate.spec.js.map +1 -1
  99. package/dist/test/mergeTree.insertingWalk.spec.js +1 -1
  100. package/dist/test/mergeTree.insertingWalk.spec.js.map +1 -1
  101. package/dist/test/mergeTree.markRangeRemoved.spec.js +2 -0
  102. package/dist/test/mergeTree.markRangeRemoved.spec.js.map +1 -1
  103. package/dist/test/mergeTree.walk.spec.js.map +1 -1
  104. package/dist/test/mergeTreeOperationRunner.d.ts.map +1 -1
  105. package/dist/test/mergeTreeOperationRunner.js +2 -3
  106. package/dist/test/mergeTreeOperationRunner.js.map +1 -1
  107. package/dist/test/obliterate.spec.js.map +1 -1
  108. package/dist/test/propertyManager.spec.js.map +1 -1
  109. package/dist/test/reconnectHelper.d.ts +2 -1
  110. package/dist/test/reconnectHelper.d.ts.map +1 -1
  111. package/dist/test/reconnectHelper.js.map +1 -1
  112. package/dist/test/resetPendingSegmentsToOp.spec.js.map +1 -1
  113. package/dist/test/revertibleFarm.spec.js.map +1 -1
  114. package/dist/test/segmentGroupCollection.spec.js +15 -3
  115. package/dist/test/segmentGroupCollection.spec.js.map +1 -1
  116. package/dist/test/snapshot.utils.d.ts +2 -2
  117. package/dist/test/snapshot.utils.d.ts.map +1 -1
  118. package/dist/test/snapshot.utils.js.map +1 -1
  119. package/dist/test/sortedSegmentSet.spec.js +4 -3
  120. package/dist/test/sortedSegmentSet.spec.js.map +1 -1
  121. package/dist/test/testClient.d.ts +8 -6
  122. package/dist/test/testClient.d.ts.map +1 -1
  123. package/dist/test/testClient.js +29 -27
  124. package/dist/test/testClient.js.map +1 -1
  125. package/dist/test/testClientLogger.d.ts.map +1 -1
  126. package/dist/test/testClientLogger.js +6 -4
  127. package/dist/test/testClientLogger.js.map +1 -1
  128. package/dist/test/testUtils.d.ts +2 -2
  129. package/dist/test/testUtils.d.ts.map +1 -1
  130. package/dist/test/testUtils.js +32 -8
  131. package/dist/test/testUtils.js.map +1 -1
  132. package/dist/test/text.d.ts +2 -2
  133. package/dist/test/text.d.ts.map +1 -1
  134. package/dist/test/text.js +12 -6
  135. package/dist/test/text.js.map +1 -1
  136. package/dist/test/tracking.spec.js.map +1 -1
  137. package/dist/test/wordUnitTests.spec.d.ts.map +1 -1
  138. package/dist/test/wordUnitTests.spec.js +4 -2
  139. package/dist/test/wordUnitTests.spec.js.map +1 -1
  140. package/dist/zamboni.d.ts.map +1 -1
  141. package/dist/zamboni.js +8 -7
  142. package/dist/zamboni.js.map +1 -1
  143. package/lib/MergeTreeTextHelper.d.ts.map +1 -1
  144. package/lib/MergeTreeTextHelper.js +0 -2
  145. package/lib/MergeTreeTextHelper.js.map +1 -1
  146. package/lib/attributionPolicy.d.ts.map +1 -1
  147. package/lib/attributionPolicy.js +6 -15
  148. package/lib/attributionPolicy.js.map +1 -1
  149. package/lib/client.d.ts +3 -4
  150. package/lib/client.d.ts.map +1 -1
  151. package/lib/client.js +40 -29
  152. package/lib/client.js.map +1 -1
  153. package/lib/endOfTreeSegment.d.ts +5 -4
  154. package/lib/endOfTreeSegment.d.ts.map +1 -1
  155. package/lib/endOfTreeSegment.js.map +1 -1
  156. package/lib/index.d.ts +2 -1
  157. package/lib/index.d.ts.map +1 -1
  158. package/lib/index.js +1 -1
  159. package/lib/index.js.map +1 -1
  160. package/lib/legacy.d.ts +2 -1
  161. package/lib/localReference.d.ts +1 -0
  162. package/lib/localReference.d.ts.map +1 -1
  163. package/lib/localReference.js +1 -0
  164. package/lib/localReference.js.map +1 -1
  165. package/lib/mergeTree.d.ts +8 -7
  166. package/lib/mergeTree.d.ts.map +1 -1
  167. package/lib/mergeTree.js +192 -201
  168. package/lib/mergeTree.js.map +1 -1
  169. package/lib/mergeTreeNodeWalk.d.ts +5 -5
  170. package/lib/mergeTreeNodeWalk.d.ts.map +1 -1
  171. package/lib/mergeTreeNodeWalk.js +3 -2
  172. package/lib/mergeTreeNodeWalk.js.map +1 -1
  173. package/lib/mergeTreeNodes.d.ts +181 -159
  174. package/lib/mergeTreeNodes.d.ts.map +1 -1
  175. package/lib/mergeTreeNodes.js +115 -105
  176. package/lib/mergeTreeNodes.js.map +1 -1
  177. package/lib/mergeTreeTracking.d.ts.map +1 -1
  178. package/lib/mergeTreeTracking.js +0 -2
  179. package/lib/mergeTreeTracking.js.map +1 -1
  180. package/lib/partialLengths.d.ts +2 -2
  181. package/lib/partialLengths.d.ts.map +1 -1
  182. package/lib/partialLengths.js +30 -24
  183. package/lib/partialLengths.js.map +1 -1
  184. package/lib/perspective.d.ts +10 -9
  185. package/lib/perspective.d.ts.map +1 -1
  186. package/lib/perspective.js +11 -4
  187. package/lib/perspective.js.map +1 -1
  188. package/lib/referencePositions.d.ts.map +1 -1
  189. package/lib/referencePositions.js +4 -1
  190. package/lib/referencePositions.js.map +1 -1
  191. package/lib/revertibles.d.ts.map +1 -1
  192. package/lib/revertibles.js +11 -9
  193. package/lib/revertibles.js.map +1 -1
  194. package/lib/segmentGroupCollection.d.ts +4 -4
  195. package/lib/segmentGroupCollection.d.ts.map +1 -1
  196. package/lib/segmentGroupCollection.js +0 -6
  197. package/lib/segmentGroupCollection.js.map +1 -1
  198. package/lib/segmentInfos.d.ts +257 -0
  199. package/lib/segmentInfos.d.ts.map +1 -0
  200. package/lib/segmentInfos.js +145 -0
  201. package/lib/segmentInfos.js.map +1 -0
  202. package/lib/snapshotLoader.d.ts.map +1 -1
  203. package/lib/snapshotLoader.js +38 -44
  204. package/lib/snapshotLoader.js.map +1 -1
  205. package/lib/snapshotV1.d.ts.map +1 -1
  206. package/lib/snapshotV1.js +9 -12
  207. package/lib/snapshotV1.js.map +1 -1
  208. package/lib/snapshotlegacy.d.ts +2 -2
  209. package/lib/snapshotlegacy.d.ts.map +1 -1
  210. package/lib/snapshotlegacy.js +5 -3
  211. package/lib/snapshotlegacy.js.map +1 -1
  212. package/lib/sortedSegmentSet.d.ts +4 -4
  213. package/lib/sortedSegmentSet.d.ts.map +1 -1
  214. package/lib/sortedSegmentSet.js +5 -8
  215. package/lib/sortedSegmentSet.js.map +1 -1
  216. package/lib/test/beastTest.spec.d.ts +0 -2
  217. package/lib/test/beastTest.spec.d.ts.map +1 -1
  218. package/lib/test/beastTest.spec.js +0 -3
  219. package/lib/test/beastTest.spec.js.map +1 -1
  220. package/lib/test/client.annotateMarker.spec.js.map +1 -1
  221. package/lib/test/client.applyMsg.spec.js +15 -12
  222. package/lib/test/client.applyMsg.spec.js.map +1 -1
  223. package/lib/test/client.attributionFarm.spec.d.ts.map +1 -1
  224. package/lib/test/client.attributionFarm.spec.js.map +1 -1
  225. package/lib/test/client.getPosition.spec.js +3 -2
  226. package/lib/test/client.getPosition.spec.js.map +1 -1
  227. package/lib/test/client.localReference.spec.js +1 -1
  228. package/lib/test/client.localReference.spec.js.map +1 -1
  229. package/lib/test/client.localReferenceFarm.spec.js.map +1 -1
  230. package/lib/test/client.rollback.spec.js +1 -1
  231. package/lib/test/client.rollback.spec.js.map +1 -1
  232. package/lib/test/dirname.cjs +0 -1
  233. package/lib/test/dirname.cjs.map +1 -1
  234. package/lib/test/index.d.ts +1 -1
  235. package/lib/test/index.d.ts.map +1 -1
  236. package/lib/test/index.js +1 -1
  237. package/lib/test/index.js.map +1 -1
  238. package/lib/test/mergeTree.annotate.spec.js +3 -0
  239. package/lib/test/mergeTree.annotate.spec.js.map +1 -1
  240. package/lib/test/mergeTree.insertingWalk.spec.js +2 -2
  241. package/lib/test/mergeTree.insertingWalk.spec.js.map +1 -1
  242. package/lib/test/mergeTree.markRangeRemoved.spec.js +2 -0
  243. package/lib/test/mergeTree.markRangeRemoved.spec.js.map +1 -1
  244. package/lib/test/mergeTree.walk.spec.js.map +1 -1
  245. package/lib/test/mergeTreeOperationRunner.d.ts.map +1 -1
  246. package/lib/test/mergeTreeOperationRunner.js +1 -2
  247. package/lib/test/mergeTreeOperationRunner.js.map +1 -1
  248. package/lib/test/obliterate.spec.js.map +1 -1
  249. package/lib/test/propertyManager.spec.js.map +1 -1
  250. package/lib/test/reconnectHelper.d.ts +2 -1
  251. package/lib/test/reconnectHelper.d.ts.map +1 -1
  252. package/lib/test/reconnectHelper.js.map +1 -1
  253. package/lib/test/resetPendingSegmentsToOp.spec.js +1 -1
  254. package/lib/test/resetPendingSegmentsToOp.spec.js.map +1 -1
  255. package/lib/test/revertibleFarm.spec.js.map +1 -1
  256. package/lib/test/segmentGroupCollection.spec.js +15 -3
  257. package/lib/test/segmentGroupCollection.spec.js.map +1 -1
  258. package/lib/test/snapshot.utils.d.ts +2 -2
  259. package/lib/test/snapshot.utils.d.ts.map +1 -1
  260. package/lib/test/snapshot.utils.js.map +1 -1
  261. package/lib/test/sortedSegmentSet.spec.js +4 -3
  262. package/lib/test/sortedSegmentSet.spec.js.map +1 -1
  263. package/lib/test/testClient.d.ts +8 -6
  264. package/lib/test/testClient.d.ts.map +1 -1
  265. package/lib/test/testClient.js +30 -28
  266. package/lib/test/testClient.js.map +1 -1
  267. package/lib/test/testClientLogger.d.ts.map +1 -1
  268. package/lib/test/testClientLogger.js +5 -3
  269. package/lib/test/testClientLogger.js.map +1 -1
  270. package/lib/test/testUtils.d.ts +2 -2
  271. package/lib/test/testUtils.d.ts.map +1 -1
  272. package/lib/test/testUtils.js +9 -8
  273. package/lib/test/testUtils.js.map +1 -1
  274. package/lib/test/text.d.ts +2 -2
  275. package/lib/test/text.d.ts.map +1 -1
  276. package/lib/test/text.js +12 -6
  277. package/lib/test/text.js.map +1 -1
  278. package/lib/test/tracking.spec.js.map +1 -1
  279. package/lib/test/wordUnitTests.spec.d.ts.map +1 -1
  280. package/lib/test/wordUnitTests.spec.js +4 -2
  281. package/lib/test/wordUnitTests.spec.js.map +1 -1
  282. package/lib/zamboni.d.ts.map +1 -1
  283. package/lib/zamboni.js +7 -6
  284. package/lib/zamboni.js.map +1 -1
  285. package/package.json +18 -18
  286. package/src/MergeTreeTextHelper.ts +2 -4
  287. package/src/attributionPolicy.ts +5 -11
  288. package/src/client.ts +55 -44
  289. package/src/endOfTreeSegment.ts +7 -4
  290. package/src/index.ts +5 -6
  291. package/src/localReference.ts +1 -0
  292. package/src/mergeTree.ts +253 -271
  293. package/src/mergeTreeNodeWalk.ts +9 -8
  294. package/src/mergeTreeNodes.ts +300 -305
  295. package/src/mergeTreeTracking.ts +0 -3
  296. package/src/partialLengths.ts +44 -25
  297. package/src/perspective.ts +36 -13
  298. package/src/referencePositions.ts +4 -1
  299. package/src/revertibles.ts +20 -16
  300. package/src/segmentGroupCollection.ts +7 -18
  301. package/src/segmentInfos.ts +377 -0
  302. package/src/snapshotLoader.ts +60 -57
  303. package/src/snapshotV1.ts +14 -16
  304. package/src/snapshotlegacy.ts +12 -17
  305. package/src/sortedSegmentSet.ts +12 -15
  306. package/src/zamboni.ts +10 -12
package/src/client.ts CHANGED
@@ -27,7 +27,11 @@ import {
27
27
 
28
28
  import { MergeTreeTextHelper } from "./MergeTreeTextHelper.js";
29
29
  import { DoublyLinkedList, RedBlackTree } from "./collections/index.js";
30
- import { UnassignedSequenceNumber, UniversalSequenceNumber } from "./constants.js";
30
+ import {
31
+ NonCollabClient,
32
+ UnassignedSequenceNumber,
33
+ UniversalSequenceNumber,
34
+ } from "./constants.js";
31
35
  import { LocalReferencePosition, SlidingPreference } from "./localReference.js";
32
36
  import {
33
37
  MergeTree,
@@ -42,16 +46,14 @@ import type {
42
46
  } from "./mergeTreeDeltaCallback.js";
43
47
  import { walkAllChildSegments } from "./mergeTreeNodeWalk.js";
44
48
  import {
45
- // eslint-disable-next-line import/no-deprecated
46
49
  CollaborationWindow,
47
50
  ISegment,
48
51
  ISegmentAction,
49
- ISegmentLeaf,
52
+ ISegmentPrivate,
50
53
  Marker,
51
- // eslint-disable-next-line import/no-deprecated
52
54
  SegmentGroup,
53
55
  compareStrings,
54
- toMoveInfo,
56
+ isSegmentLeaf,
55
57
  } from "./mergeTreeNodes.js";
56
58
  import {
57
59
  createAdjustRangeOp,
@@ -84,11 +86,18 @@ import {
84
86
  } from "./ops.js";
85
87
  import { PropertySet, type MapLike } from "./properties.js";
86
88
  import { DetachedReferencePosition, ReferencePosition } from "./referencePositions.js";
89
+ import {
90
+ isInserted,
91
+ isMoved,
92
+ isRemoved,
93
+ overwriteInfo,
94
+ toMoveInfo,
95
+ type IInsertionInfo,
96
+ } from "./segmentInfos.js";
87
97
  import { Side, type InteriorSequencePlace } from "./sequencePlace.js";
88
98
  import { SnapshotLoader } from "./snapshotLoader.js";
89
99
  import { SnapshotV1 } from "./snapshotV1.js";
90
100
  import { SnapshotLegacy } from "./snapshotlegacy.js";
91
- // eslint-disable-next-line import/no-deprecated
92
101
  import { IMergeTreeTextHelper } from "./textSegment.js";
93
102
 
94
103
  type IMergeTreeDeltaRemoteOpArgs = Omit<IMergeTreeDeltaOpArgs, "sequencedMessage"> &
@@ -129,6 +138,8 @@ export interface IClientEvents {
129
138
  ): void;
130
139
  }
131
140
 
141
+ const UNBOUND_SEGMENT_ERROR = "The provided segment is not bound to this DDS.";
142
+
132
143
  /**
133
144
  * This class encapsulates a merge-tree, and provides a local client specific view over it and
134
145
  * the capability to modify it as the local client. Additionally it provides
@@ -194,20 +205,14 @@ export class Client extends TypedEventEmitter<IClientEvents> {
194
205
  * It is used to get the segment group(s) for the previous operations.
195
206
  * @param count - The number segment groups to get peek from the tail of the queue. Default 1.
196
207
  */
197
- // eslint-disable-next-line import/no-deprecated
198
- public peekPendingSegmentGroups(): SegmentGroup | undefined;
199
- // eslint-disable-next-line import/no-deprecated
200
- public peekPendingSegmentGroups(count: number): SegmentGroup | SegmentGroup[] | undefined;
201
- public peekPendingSegmentGroups(
202
- count: number = 1,
203
- // eslint-disable-next-line import/no-deprecated
204
- ): SegmentGroup | SegmentGroup[] | undefined {
208
+
209
+ public peekPendingSegmentGroups(count: number = 1): unknown {
205
210
  const pending = this._mergeTree.pendingSegments;
206
211
  let node = pending?.last;
207
212
  if (count === 1 || pending === undefined) {
208
213
  return node?.data;
209
214
  }
210
- // eslint-disable-next-line import/no-deprecated
215
+
211
216
  const taken: SegmentGroup[] = Array.from({ length: Math.min(count, pending.length) });
212
217
  for (let i = taken.length - 1; i >= 0; i--) {
213
218
  taken[i] = node!.data;
@@ -396,15 +401,15 @@ export class Client extends TypedEventEmitter<IClientEvents> {
396
401
  ): void {
397
402
  let localInserts = 0;
398
403
  let localRemoves = 0;
399
- walkAllChildSegments(this._mergeTree.root, (seg) => {
400
- if (seg.seq === UnassignedSequenceNumber) {
404
+ walkAllChildSegments(this._mergeTree.root, (seg: ISegmentPrivate) => {
405
+ if (isInserted(seg) && seg.seq === UnassignedSequenceNumber) {
401
406
  localInserts++;
402
407
  }
403
- if (seg.removedSeq === UnassignedSequenceNumber) {
408
+ if (isRemoved(seg) && seg.removedSeq === UnassignedSequenceNumber) {
404
409
  localRemoves++;
405
410
  }
406
411
  // Only serialize segments that have not been removed.
407
- if (seg.removedSeq === undefined) {
412
+ if (!isRemoved(seg)) {
408
413
  handleCollectingSerializer.stringify(seg.clone().toJSONObject(), handle);
409
414
  }
410
415
  return true;
@@ -419,7 +424,6 @@ export class Client extends TypedEventEmitter<IClientEvents> {
419
424
  }
420
425
  }
421
426
 
422
- // eslint-disable-next-line import/no-deprecated
423
427
  public getCollabWindow(): CollaborationWindow {
424
428
  return this._mergeTree.collabWindow;
425
429
  }
@@ -430,12 +434,11 @@ export class Client extends TypedEventEmitter<IClientEvents> {
430
434
  * @param segment - The segment to get the position of
431
435
  */
432
436
  public getPosition(segment: ISegment | undefined, localSeq?: number): number {
433
- const mergeSegment: ISegmentLeaf | undefined = segment;
434
- if (mergeSegment?.parent === undefined) {
437
+ if (!isSegmentLeaf(segment)) {
435
438
  return -1;
436
439
  }
437
440
  return this._mergeTree.getPosition(
438
- mergeSegment,
441
+ segment,
439
442
  this.getCurrentSeq(),
440
443
  this.getClientId(),
441
444
  localSeq,
@@ -461,6 +464,9 @@ export class Client extends TypedEventEmitter<IClientEvents> {
461
464
  slidingPreference?: SlidingPreference,
462
465
  canSlideToEndpoint?: boolean,
463
466
  ): LocalReferencePosition {
467
+ if (!isSegmentLeaf(segment) && typeof segment !== "string") {
468
+ throw new UsageError(UNBOUND_SEGMENT_ERROR);
469
+ }
464
470
  return this._mergeTree.createLocalReferencePosition(
465
471
  segment,
466
472
  offset ?? 0,
@@ -509,7 +515,6 @@ export class Client extends TypedEventEmitter<IClientEvents> {
509
515
  * Revert an op
510
516
  */
511
517
  public rollback?(op: unknown, localOpMetadata: unknown): void {
512
- // eslint-disable-next-line import/no-deprecated
513
518
  this._mergeTree.rollback(op as IMergeTreeDeltaOp, localOpMetadata as SegmentGroup);
514
519
  }
515
520
 
@@ -876,13 +881,16 @@ export class Client extends TypedEventEmitter<IClientEvents> {
876
881
  0x032 /* "localSeq greater than collab window" */,
877
882
  );
878
883
  const { currentSeq, clientId } = this.getCollabWindow();
884
+ if (!isSegmentLeaf(segment)) {
885
+ throw new UsageError(UNBOUND_SEGMENT_ERROR);
886
+ }
879
887
  return this._mergeTree.getPosition(segment, currentSeq, clientId, localSeq);
880
888
  }
881
889
 
882
890
  private resetPendingDeltaToOps(
883
891
  resetOp: IMergeTreeDeltaOp,
884
- // eslint-disable-next-line import/no-deprecated
885
- segmentGroup: SegmentGroup<ISegmentLeaf>,
892
+
893
+ segmentGroup: SegmentGroup,
886
894
  ): IMergeTreeDeltaOp[] {
887
895
  assert(!!segmentGroup, 0x033 /* "Segment group undefined" */);
888
896
  const NACKedSegmentGroup = this.pendingRebase?.shift()?.data;
@@ -895,7 +903,7 @@ export class Client extends TypedEventEmitter<IClientEvents> {
895
903
  }
896
904
 
897
905
  // if this is an obliterate op, keep all segments in same segment group
898
- // eslint-disable-next-line import/no-deprecated
906
+
899
907
  const obliterateSegmentGroup: SegmentGroup = {
900
908
  segments: [],
901
909
  localSeq: segmentGroup.localSeq,
@@ -915,7 +923,7 @@ export class Client extends TypedEventEmitter<IClientEvents> {
915
923
  a.ordinal < b.ordinal ? -1 : 1,
916
924
  )) {
917
925
  assert(
918
- segment.segmentGroups?.remove?.(segmentGroup) === true,
926
+ segment.segmentGroups?.remove(segmentGroup) === true,
919
927
  0x035 /* "Segment group not in segment pending queue" */,
920
928
  );
921
929
  assert(
@@ -935,10 +943,10 @@ export class Client extends TypedEventEmitter<IClientEvents> {
935
943
  // unless the remove was local, in which case the annotate must have come
936
944
  // before the remove
937
945
  if (
938
- (segment.removedSeq === undefined ||
946
+ (!isRemoved(segment) ||
939
947
  (segment.localRemovedSeq !== undefined &&
940
948
  segment.removedSeq === UnassignedSequenceNumber)) &&
941
- (segment.movedSeq === undefined ||
949
+ (!isMoved(segment) ||
942
950
  (segment.localMovedSeq !== undefined &&
943
951
  segment.movedSeq === UnassignedSequenceNumber))
944
952
  ) {
@@ -960,7 +968,7 @@ export class Client extends TypedEventEmitter<IClientEvents> {
960
968
 
961
969
  case MergeTreeDeltaType.INSERT: {
962
970
  assert(
963
- segment.seq === UnassignedSequenceNumber,
971
+ isInserted(segment) && segment.seq === UnassignedSequenceNumber,
964
972
  0x037 /* "Segment already has assigned sequence number" */,
965
973
  );
966
974
  const moveInfo = toMoveInfo(segment);
@@ -975,8 +983,11 @@ export class Client extends TypedEventEmitter<IClientEvents> {
975
983
  // we set the seq to the universal seq and remove the local seq,
976
984
  // so its length is not considered for subsequent local changes
977
985
  // this allows us to not send the op as even the local client will ignore the segment
978
- segment.seq = UniversalSequenceNumber;
979
- segment.localSeq = undefined;
986
+ overwriteInfo<IInsertionInfo>(segment, {
987
+ seq: UniversalSequenceNumber,
988
+ localSeq: undefined,
989
+ clientId: NonCollabClient,
990
+ });
980
991
  break;
981
992
  }
982
993
  }
@@ -993,9 +1004,10 @@ export class Client extends TypedEventEmitter<IClientEvents> {
993
1004
 
994
1005
  case MergeTreeDeltaType.REMOVE: {
995
1006
  if (
1007
+ isRemoved(segment) &&
996
1008
  segment.localRemovedSeq !== undefined &&
997
1009
  segment.removedSeq === UnassignedSequenceNumber &&
998
- (segment.movedSeq === undefined ||
1010
+ (!isMoved(segment) ||
999
1011
  (segment.localMovedSeq !== undefined &&
1000
1012
  segment.movedSeq === UnassignedSequenceNumber))
1001
1013
  ) {
@@ -1009,9 +1021,10 @@ export class Client extends TypedEventEmitter<IClientEvents> {
1009
1021
  case MergeTreeDeltaType.OBLITERATE: {
1010
1022
  errorIfOptionNotTrue(this._mergeTree.options, "mergeTreeEnableObliterateReconnect");
1011
1023
  if (
1024
+ isMoved(segment) &&
1012
1025
  segment.localMovedSeq !== undefined &&
1013
1026
  segment.movedSeq === UnassignedSequenceNumber &&
1014
- (segment.removedSeq === undefined ||
1027
+ (!isRemoved(segment) ||
1015
1028
  (segment.localRemovedSeq !== undefined &&
1016
1029
  segment.removedSeq === UnassignedSequenceNumber))
1017
1030
  ) {
@@ -1191,7 +1204,6 @@ export class Client extends TypedEventEmitter<IClientEvents> {
1191
1204
 
1192
1205
  private lastNormalizationRefSeq = 0;
1193
1206
 
1194
- // eslint-disable-next-line import/no-deprecated
1195
1207
  private pendingRebase: DoublyLinkedList<SegmentGroup> | undefined;
1196
1208
 
1197
1209
  /**
@@ -1200,11 +1212,8 @@ export class Client extends TypedEventEmitter<IClientEvents> {
1200
1212
  * @param resetOp - The op to reset
1201
1213
  * @param segmentGroup - The segment group associated with the op
1202
1214
  */
1203
- public regeneratePendingOp(
1204
- resetOp: IMergeTreeOp,
1205
- // eslint-disable-next-line import/no-deprecated
1206
- segmentGroup: SegmentGroup | SegmentGroup[],
1207
- ): IMergeTreeOp {
1215
+ public regeneratePendingOp(resetOp: IMergeTreeOp, localOpMetadata: unknown): IMergeTreeOp {
1216
+ const segmentGroup = localOpMetadata as SegmentGroup | SegmentGroup[];
1208
1217
  if (this.pendingRebase === undefined || this.pendingRebase.empty) {
1209
1218
  let firstGroup: SegmentGroup;
1210
1219
  if (Array.isArray(segmentGroup)) {
@@ -1269,7 +1278,6 @@ export class Client extends TypedEventEmitter<IClientEvents> {
1269
1278
  return opList.length === 1 ? opList[0] : createGroupOp(...opList);
1270
1279
  }
1271
1280
 
1272
- // eslint-disable-next-line import/no-deprecated
1273
1281
  public createTextHelper(): IMergeTreeTextHelper {
1274
1282
  return new MergeTreeTextHelper(this._mergeTree);
1275
1283
  }
@@ -1376,12 +1384,15 @@ export class Client extends TypedEventEmitter<IClientEvents> {
1376
1384
  } {
1377
1385
  const { referenceSequenceNumber, clientId } =
1378
1386
  this.getClientSequenceArgsForMessage(sequenceArgs);
1379
- return this._mergeTree.getContainingSegment<T>(
1387
+ return this._mergeTree.getContainingSegment(
1380
1388
  pos,
1381
1389
  referenceSequenceNumber,
1382
1390
  clientId,
1383
1391
  localSeq,
1384
- );
1392
+ ) as {
1393
+ segment: T | undefined;
1394
+ offset: number | undefined;
1395
+ };
1385
1396
  }
1386
1397
 
1387
1398
  getPropertiesAtPosition(pos: number): PropertySet | undefined {
@@ -6,10 +6,12 @@
6
6
  import { assert } from "@fluidframework/core-utils/internal";
7
7
 
8
8
  import { LocalClientId } from "./constants.js";
9
+ // eslint-disable-next-line import/no-deprecated
9
10
  import { LocalReferenceCollection } from "./localReference.js";
10
11
  import { MergeTree } from "./mergeTree.js";
11
12
  import { NodeAction, depthFirstNodeWalk } from "./mergeTreeNodeWalk.js";
12
- import { IRemovalInfo, ISegment, ISegmentLeaf, type MergeBlock } from "./mergeTreeNodes.js";
13
+ import { ISegment, type ISegmentLeaf, type MergeBlock } from "./mergeTreeNodes.js";
14
+ import { type IMergeNodeInfo } from "./segmentInfos.js";
13
15
 
14
16
  /**
15
17
  * This is a special segment that is not bound or known by the merge tree itself,
@@ -32,7 +34,7 @@ import { IRemovalInfo, ISegment, ISegmentLeaf, type MergeBlock } from "./mergeTr
32
34
  * must be possible in some way to refer to a position before or after the tree
33
35
  * respectively. The endpoint segments allow us to support such behavior.
34
36
  */
35
- abstract class BaseEndpointSegment {
37
+ abstract class BaseEndpointSegment implements IMergeNodeInfo {
36
38
  constructor(protected readonly mergeTree: MergeTree) {}
37
39
  /*
38
40
  * segments must be of at least length one, but
@@ -71,6 +73,7 @@ abstract class BaseEndpointSegment {
71
73
 
72
74
  abstract get ordinal(): string;
73
75
 
76
+ // eslint-disable-next-line import/no-deprecated
74
77
  localRefs?: LocalReferenceCollection;
75
78
 
76
79
  /*
@@ -99,7 +102,7 @@ const notSupported = (): never => {
99
102
  /**
100
103
  * The position immediately prior to the start of the tree
101
104
  */
102
- export class StartOfTreeSegment extends BaseEndpointSegment implements ISegment, IRemovalInfo {
105
+ export class StartOfTreeSegment extends BaseEndpointSegment implements ISegment {
103
106
  type: string = "StartOfTreeSegment";
104
107
  readonly endpointType = "start";
105
108
 
@@ -149,7 +152,7 @@ export class StartOfTreeSegment extends BaseEndpointSegment implements ISegment,
149
152
  /**
150
153
  * The position immediately after the end of the tree
151
154
  */
152
- export class EndOfTreeSegment extends BaseEndpointSegment implements ISegment, IRemovalInfo {
155
+ export class EndOfTreeSegment extends BaseEndpointSegment implements ISegment {
153
156
  type: string = "EndOfTreeSegment";
154
157
  readonly endpointType = "end";
155
158
 
package/src/index.ts CHANGED
@@ -58,19 +58,14 @@ export {
58
58
  export {
59
59
  BaseSegment,
60
60
  CollaborationWindow,
61
- debugMarkerToString,
62
61
  IJSONMarkerSegment,
63
62
  IMergeNodeCommon,
64
- IMoveInfo,
65
- IRemovalInfo,
63
+ segmentIsRemoved,
66
64
  ISegment,
67
65
  ISegmentAction,
68
66
  Marker,
69
67
  reservedMarkerIdKey,
70
68
  reservedMarkerSimpleTypeKey,
71
- SegmentGroup,
72
- toRemovalInfo,
73
- ObliterateInfo,
74
69
  ISegmentInternal,
75
70
  } from "./mergeTreeNodes.js";
76
71
  export {
@@ -125,6 +120,10 @@ export {
125
120
  reservedRangeLabelsKey,
126
121
  reservedTileLabelsKey,
127
122
  } from "./referencePositions.js";
123
+ export {
124
+ IMoveInfo,
125
+ IRemovalInfo,
126
+ } from "./segmentInfos.js";
128
127
  export {
129
128
  PropsOrAdjust,
130
129
  copyPropertiesAndManager,
@@ -228,6 +228,7 @@ export function setValidateRefCount(
228
228
  *
229
229
  * @legacy
230
230
  * @alpha
231
+ * @deprecated - This class will be removed in 2.20 with no replacement.
231
232
  */
232
233
  export class LocalReferenceCollection {
233
234
  public static append(seg1: ISegment, seg2: ISegment): void {