@fluidframework/merge-tree 2.12.0 → 2.20.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 (307) hide show
  1. package/CHANGELOG.md +46 -0
  2. package/api-report/merge-tree.legacy.alpha.api.md +0 -108
  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 -16
  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 +2 -1
  14. package/dist/endOfTreeSegment.d.ts.map +1 -1
  15. package/dist/endOfTreeSegment.js.map +1 -1
  16. package/dist/index.d.ts +1 -1
  17. package/dist/index.d.ts.map +1 -1
  18. package/dist/index.js +2 -4
  19. package/dist/index.js.map +1 -1
  20. package/dist/legacy.d.ts +0 -4
  21. package/dist/localReference.d.ts +5 -7
  22. package/dist/localReference.d.ts.map +1 -1
  23. package/dist/localReference.js +1 -3
  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 +187 -228
  28. package/dist/mergeTree.js.map +1 -1
  29. package/dist/mergeTreeNodeWalk.d.ts.map +1 -1
  30. package/dist/mergeTreeNodeWalk.js +3 -2
  31. package/dist/mergeTreeNodeWalk.js.map +1 -1
  32. package/dist/mergeTreeNodes.d.ts +65 -325
  33. package/dist/mergeTreeNodes.d.ts.map +1 -1
  34. package/dist/mergeTreeNodes.js +96 -130
  35. package/dist/mergeTreeNodes.js.map +1 -1
  36. package/dist/mergeTreeTracking.d.ts.map +1 -1
  37. package/dist/mergeTreeTracking.js +0 -2
  38. package/dist/mergeTreeTracking.js.map +1 -1
  39. package/dist/opBuilder.d.ts +0 -5
  40. package/dist/opBuilder.d.ts.map +1 -1
  41. package/dist/opBuilder.js +0 -5
  42. package/dist/opBuilder.js.map +1 -1
  43. package/dist/package.json +2 -1
  44. package/dist/partialLengths.d.ts +2 -2
  45. package/dist/partialLengths.d.ts.map +1 -1
  46. package/dist/partialLengths.js +29 -31
  47. package/dist/partialLengths.js.map +1 -1
  48. package/dist/perspective.d.ts +3 -2
  49. package/dist/perspective.d.ts.map +1 -1
  50. package/dist/perspective.js +5 -2
  51. package/dist/perspective.js.map +1 -1
  52. package/dist/referencePositions.d.ts.map +1 -1
  53. package/dist/referencePositions.js +4 -1
  54. package/dist/referencePositions.js.map +1 -1
  55. package/dist/revertibles.d.ts.map +1 -1
  56. package/dist/revertibles.js +10 -14
  57. package/dist/revertibles.js.map +1 -1
  58. package/dist/segmentGroupCollection.d.ts +4 -4
  59. package/dist/segmentGroupCollection.d.ts.map +1 -1
  60. package/dist/segmentGroupCollection.js +0 -6
  61. package/dist/segmentGroupCollection.js.map +1 -1
  62. package/dist/segmentInfos.d.ts +251 -0
  63. package/dist/segmentInfos.d.ts.map +1 -0
  64. package/dist/segmentInfos.js +166 -0
  65. package/dist/segmentInfos.js.map +1 -0
  66. package/dist/snapshotLoader.d.ts.map +1 -1
  67. package/dist/snapshotLoader.js +36 -44
  68. package/dist/snapshotLoader.js.map +1 -1
  69. package/dist/snapshotV1.d.ts.map +1 -1
  70. package/dist/snapshotV1.js +9 -12
  71. package/dist/snapshotV1.js.map +1 -1
  72. package/dist/snapshotlegacy.d.ts +2 -2
  73. package/dist/snapshotlegacy.d.ts.map +1 -1
  74. package/dist/snapshotlegacy.js +5 -3
  75. package/dist/snapshotlegacy.js.map +1 -1
  76. package/dist/sortedSegmentSet.d.ts.map +1 -1
  77. package/dist/sortedSegmentSet.js +5 -8
  78. package/dist/sortedSegmentSet.js.map +1 -1
  79. package/dist/test/beastTest.spec.d.ts +0 -2
  80. package/dist/test/beastTest.spec.d.ts.map +1 -1
  81. package/dist/test/beastTest.spec.js +1 -5
  82. package/dist/test/beastTest.spec.js.map +1 -1
  83. package/dist/test/client.annotateMarker.spec.js.map +1 -1
  84. package/dist/test/client.applyMsg.spec.js +15 -12
  85. package/dist/test/client.applyMsg.spec.js.map +1 -1
  86. package/dist/test/client.attributionFarm.spec.js.map +1 -1
  87. package/dist/test/client.getPosition.spec.js +3 -2
  88. package/dist/test/client.getPosition.spec.js.map +1 -1
  89. package/dist/test/client.localReference.spec.js +6 -6
  90. package/dist/test/client.localReference.spec.js.map +1 -1
  91. package/dist/test/client.localReferenceFarm.spec.js.map +1 -1
  92. package/dist/test/client.rollback.spec.js.map +1 -1
  93. package/dist/test/dirname.cjs +0 -1
  94. package/dist/test/dirname.cjs.map +1 -1
  95. package/dist/test/index.d.ts +1 -1
  96. package/dist/test/index.d.ts.map +1 -1
  97. package/dist/test/index.js +2 -4
  98. package/dist/test/index.js.map +1 -1
  99. package/dist/test/mergeTree.annotate.spec.js +3 -0
  100. package/dist/test/mergeTree.annotate.spec.js.map +1 -1
  101. package/dist/test/mergeTree.insertingWalk.spec.js +1 -1
  102. package/dist/test/mergeTree.insertingWalk.spec.js.map +1 -1
  103. package/dist/test/mergeTree.markRangeRemoved.spec.js +2 -0
  104. package/dist/test/mergeTree.markRangeRemoved.spec.js.map +1 -1
  105. package/dist/test/mergeTree.walk.spec.js.map +1 -1
  106. package/dist/test/mergeTreeOperationRunner.d.ts.map +1 -1
  107. package/dist/test/mergeTreeOperationRunner.js +2 -3
  108. package/dist/test/mergeTreeOperationRunner.js.map +1 -1
  109. package/dist/test/obliterate.spec.js.map +1 -1
  110. package/dist/test/propertyManager.spec.js.map +1 -1
  111. package/dist/test/reconnectHelper.d.ts +2 -1
  112. package/dist/test/reconnectHelper.d.ts.map +1 -1
  113. package/dist/test/reconnectHelper.js.map +1 -1
  114. package/dist/test/resetPendingSegmentsToOp.spec.js.map +1 -1
  115. package/dist/test/revertibleFarm.spec.js.map +1 -1
  116. package/dist/test/segmentGroupCollection.spec.js +15 -3
  117. package/dist/test/segmentGroupCollection.spec.js.map +1 -1
  118. package/dist/test/snapshot.utils.d.ts +2 -2
  119. package/dist/test/snapshot.utils.d.ts.map +1 -1
  120. package/dist/test/snapshot.utils.js.map +1 -1
  121. package/dist/test/sortedSegmentSet.spec.js +4 -3
  122. package/dist/test/sortedSegmentSet.spec.js.map +1 -1
  123. package/dist/test/testClient.d.ts +8 -6
  124. package/dist/test/testClient.d.ts.map +1 -1
  125. package/dist/test/testClient.js +28 -27
  126. package/dist/test/testClient.js.map +1 -1
  127. package/dist/test/testClientLogger.d.ts.map +1 -1
  128. package/dist/test/testClientLogger.js +6 -4
  129. package/dist/test/testClientLogger.js.map +1 -1
  130. package/dist/test/testUtils.d.ts +2 -2
  131. package/dist/test/testUtils.d.ts.map +1 -1
  132. package/dist/test/testUtils.js +32 -8
  133. package/dist/test/testUtils.js.map +1 -1
  134. package/dist/test/text.d.ts +2 -2
  135. package/dist/test/text.d.ts.map +1 -1
  136. package/dist/test/text.js +12 -6
  137. package/dist/test/text.js.map +1 -1
  138. package/dist/test/tracking.spec.js.map +1 -1
  139. package/dist/test/wordUnitTests.spec.js +1 -1
  140. package/dist/test/wordUnitTests.spec.js.map +1 -1
  141. package/dist/zamboni.d.ts.map +1 -1
  142. package/dist/zamboni.js +8 -7
  143. package/dist/zamboni.js.map +1 -1
  144. package/lib/MergeTreeTextHelper.d.ts.map +1 -1
  145. package/lib/MergeTreeTextHelper.js +0 -2
  146. package/lib/MergeTreeTextHelper.js.map +1 -1
  147. package/lib/attributionPolicy.d.ts.map +1 -1
  148. package/lib/attributionPolicy.js +6 -16
  149. package/lib/attributionPolicy.js.map +1 -1
  150. package/lib/client.d.ts +3 -4
  151. package/lib/client.d.ts.map +1 -1
  152. package/lib/client.js +40 -29
  153. package/lib/client.js.map +1 -1
  154. package/lib/endOfTreeSegment.d.ts +2 -1
  155. package/lib/endOfTreeSegment.d.ts.map +1 -1
  156. package/lib/endOfTreeSegment.js.map +1 -1
  157. package/lib/index.d.ts +1 -1
  158. package/lib/index.d.ts.map +1 -1
  159. package/lib/index.js +1 -1
  160. package/lib/index.js.map +1 -1
  161. package/lib/legacy.d.ts +0 -4
  162. package/lib/localReference.d.ts +5 -7
  163. package/lib/localReference.d.ts.map +1 -1
  164. package/lib/localReference.js +1 -3
  165. package/lib/localReference.js.map +1 -1
  166. package/lib/mergeTree.d.ts +8 -7
  167. package/lib/mergeTree.d.ts.map +1 -1
  168. package/lib/mergeTree.js +175 -220
  169. package/lib/mergeTree.js.map +1 -1
  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 +65 -325
  174. package/lib/mergeTreeNodes.d.ts.map +1 -1
  175. package/lib/mergeTreeNodes.js +92 -127
  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/opBuilder.d.ts +0 -5
  181. package/lib/opBuilder.d.ts.map +1 -1
  182. package/lib/opBuilder.js +0 -5
  183. package/lib/opBuilder.js.map +1 -1
  184. package/lib/partialLengths.d.ts +2 -2
  185. package/lib/partialLengths.d.ts.map +1 -1
  186. package/lib/partialLengths.js +26 -28
  187. package/lib/partialLengths.js.map +1 -1
  188. package/lib/perspective.d.ts +3 -2
  189. package/lib/perspective.d.ts.map +1 -1
  190. package/lib/perspective.js +5 -2
  191. package/lib/perspective.js.map +1 -1
  192. package/lib/referencePositions.d.ts.map +1 -1
  193. package/lib/referencePositions.js +4 -1
  194. package/lib/referencePositions.js.map +1 -1
  195. package/lib/revertibles.d.ts.map +1 -1
  196. package/lib/revertibles.js +8 -12
  197. package/lib/revertibles.js.map +1 -1
  198. package/lib/segmentGroupCollection.d.ts +4 -4
  199. package/lib/segmentGroupCollection.d.ts.map +1 -1
  200. package/lib/segmentGroupCollection.js +0 -6
  201. package/lib/segmentGroupCollection.js.map +1 -1
  202. package/lib/segmentInfos.d.ts +251 -0
  203. package/lib/segmentInfos.d.ts.map +1 -0
  204. package/lib/segmentInfos.js +145 -0
  205. package/lib/segmentInfos.js.map +1 -0
  206. package/lib/snapshotLoader.d.ts.map +1 -1
  207. package/lib/snapshotLoader.js +36 -44
  208. package/lib/snapshotLoader.js.map +1 -1
  209. package/lib/snapshotV1.d.ts.map +1 -1
  210. package/lib/snapshotV1.js +9 -12
  211. package/lib/snapshotV1.js.map +1 -1
  212. package/lib/snapshotlegacy.d.ts +2 -2
  213. package/lib/snapshotlegacy.d.ts.map +1 -1
  214. package/lib/snapshotlegacy.js +5 -3
  215. package/lib/snapshotlegacy.js.map +1 -1
  216. package/lib/sortedSegmentSet.d.ts.map +1 -1
  217. package/lib/sortedSegmentSet.js +5 -8
  218. package/lib/sortedSegmentSet.js.map +1 -1
  219. package/lib/test/beastTest.spec.d.ts +0 -2
  220. package/lib/test/beastTest.spec.d.ts.map +1 -1
  221. package/lib/test/beastTest.spec.js +0 -3
  222. package/lib/test/beastTest.spec.js.map +1 -1
  223. package/lib/test/client.annotateMarker.spec.js.map +1 -1
  224. package/lib/test/client.applyMsg.spec.js +15 -12
  225. package/lib/test/client.applyMsg.spec.js.map +1 -1
  226. package/lib/test/client.attributionFarm.spec.js.map +1 -1
  227. package/lib/test/client.getPosition.spec.js +3 -2
  228. package/lib/test/client.getPosition.spec.js.map +1 -1
  229. package/lib/test/client.localReference.spec.js +1 -1
  230. package/lib/test/client.localReference.spec.js.map +1 -1
  231. package/lib/test/client.localReferenceFarm.spec.js.map +1 -1
  232. package/lib/test/client.rollback.spec.js +1 -1
  233. package/lib/test/client.rollback.spec.js.map +1 -1
  234. package/lib/test/dirname.cjs +0 -1
  235. package/lib/test/dirname.cjs.map +1 -1
  236. package/lib/test/index.d.ts +1 -1
  237. package/lib/test/index.d.ts.map +1 -1
  238. package/lib/test/index.js +1 -1
  239. package/lib/test/index.js.map +1 -1
  240. package/lib/test/mergeTree.annotate.spec.js +3 -0
  241. package/lib/test/mergeTree.annotate.spec.js.map +1 -1
  242. package/lib/test/mergeTree.insertingWalk.spec.js +2 -2
  243. package/lib/test/mergeTree.insertingWalk.spec.js.map +1 -1
  244. package/lib/test/mergeTree.markRangeRemoved.spec.js +2 -0
  245. package/lib/test/mergeTree.markRangeRemoved.spec.js.map +1 -1
  246. package/lib/test/mergeTree.walk.spec.js.map +1 -1
  247. package/lib/test/mergeTreeOperationRunner.d.ts.map +1 -1
  248. package/lib/test/mergeTreeOperationRunner.js +1 -2
  249. package/lib/test/mergeTreeOperationRunner.js.map +1 -1
  250. package/lib/test/obliterate.spec.js.map +1 -1
  251. package/lib/test/propertyManager.spec.js.map +1 -1
  252. package/lib/test/reconnectHelper.d.ts +2 -1
  253. package/lib/test/reconnectHelper.d.ts.map +1 -1
  254. package/lib/test/reconnectHelper.js.map +1 -1
  255. package/lib/test/resetPendingSegmentsToOp.spec.js.map +1 -1
  256. package/lib/test/revertibleFarm.spec.js.map +1 -1
  257. package/lib/test/segmentGroupCollection.spec.js +15 -3
  258. package/lib/test/segmentGroupCollection.spec.js.map +1 -1
  259. package/lib/test/snapshot.utils.d.ts +2 -2
  260. package/lib/test/snapshot.utils.d.ts.map +1 -1
  261. package/lib/test/snapshot.utils.js.map +1 -1
  262. package/lib/test/sortedSegmentSet.spec.js +4 -3
  263. package/lib/test/sortedSegmentSet.spec.js.map +1 -1
  264. package/lib/test/testClient.d.ts +8 -6
  265. package/lib/test/testClient.d.ts.map +1 -1
  266. package/lib/test/testClient.js +29 -28
  267. package/lib/test/testClient.js.map +1 -1
  268. package/lib/test/testClientLogger.d.ts.map +1 -1
  269. package/lib/test/testClientLogger.js +5 -3
  270. package/lib/test/testClientLogger.js.map +1 -1
  271. package/lib/test/testUtils.d.ts +2 -2
  272. package/lib/test/testUtils.d.ts.map +1 -1
  273. package/lib/test/testUtils.js +9 -8
  274. package/lib/test/testUtils.js.map +1 -1
  275. package/lib/test/text.d.ts +2 -2
  276. package/lib/test/text.d.ts.map +1 -1
  277. package/lib/test/text.js +12 -6
  278. package/lib/test/text.js.map +1 -1
  279. package/lib/test/tracking.spec.js.map +1 -1
  280. package/lib/test/wordUnitTests.spec.js +1 -1
  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 +77 -19
  286. package/src/MergeTreeTextHelper.ts +2 -4
  287. package/src/attributionPolicy.ts +5 -13
  288. package/src/client.ts +55 -44
  289. package/src/endOfTreeSegment.ts +3 -5
  290. package/src/index.ts +0 -7
  291. package/src/localReference.ts +6 -8
  292. package/src/mergeTree.ts +233 -290
  293. package/src/mergeTreeNodeWalk.ts +3 -2
  294. package/src/mergeTreeNodes.ts +160 -490
  295. package/src/mergeTreeTracking.ts +0 -3
  296. package/src/opBuilder.ts +0 -5
  297. package/src/partialLengths.ts +40 -29
  298. package/src/perspective.ts +23 -4
  299. package/src/referencePositions.ts +4 -1
  300. package/src/revertibles.ts +19 -16
  301. package/src/segmentGroupCollection.ts +7 -18
  302. package/src/segmentInfos.ts +371 -0
  303. package/src/snapshotLoader.ts +56 -57
  304. package/src/snapshotV1.ts +14 -16
  305. package/src/snapshotlegacy.ts +12 -17
  306. package/src/sortedSegmentSet.ts +6 -8
  307. package/src/zamboni.ts +10 -12
package/dist/client.js CHANGED
@@ -20,10 +20,12 @@ const mergeTreeNodes_js_1 = require("./mergeTreeNodes.js");
20
20
  const opBuilder_js_1 = require("./opBuilder.js");
21
21
  const ops_js_1 = require("./ops.js");
22
22
  const referencePositions_js_1 = require("./referencePositions.js");
23
+ const segmentInfos_js_1 = require("./segmentInfos.js");
23
24
  const sequencePlace_js_1 = require("./sequencePlace.js");
24
25
  const snapshotLoader_js_1 = require("./snapshotLoader.js");
25
26
  const snapshotV1_js_1 = require("./snapshotV1.js");
26
27
  const snapshotlegacy_js_1 = require("./snapshotlegacy.js");
28
+ const UNBOUND_SEGMENT_ERROR = "The provided segment is not bound to this DDS.";
27
29
  /**
28
30
  * This class encapsulates a merge-tree, and provides a local client specific view over it and
29
31
  * the capability to modify it as the local client. Additionally it provides
@@ -71,13 +73,19 @@ class Client extends client_utils_1.TypedEventEmitter {
71
73
  policy.attach(this);
72
74
  }
73
75
  }
76
+ /**
77
+ * The merge tree maintains a queue of segment groups for each local operation.
78
+ * These segment groups track segments modified by an operation.
79
+ * This method peeks the tail of that queue, and returns the segments groups there.
80
+ * It is used to get the segment group(s) for the previous operations.
81
+ * @param count - The number segment groups to get peek from the tail of the queue. Default 1.
82
+ */
74
83
  peekPendingSegmentGroups(count = 1) {
75
84
  const pending = this._mergeTree.pendingSegments;
76
85
  let node = pending?.last;
77
86
  if (count === 1 || pending === undefined) {
78
87
  return node?.data;
79
88
  }
80
- // eslint-disable-next-line import/no-deprecated
81
89
  const taken = Array.from({ length: Math.min(count, pending.length) });
82
90
  for (let i = taken.length - 1; i >= 0; i--) {
83
91
  taken[i] = node.data;
@@ -193,14 +201,14 @@ class Client extends client_utils_1.TypedEventEmitter {
193
201
  let localInserts = 0;
194
202
  let localRemoves = 0;
195
203
  (0, mergeTreeNodeWalk_js_1.walkAllChildSegments)(this._mergeTree.root, (seg) => {
196
- if (seg.seq === constants_js_1.UnassignedSequenceNumber) {
204
+ if ((0, segmentInfos_js_1.isInserted)(seg) && seg.seq === constants_js_1.UnassignedSequenceNumber) {
197
205
  localInserts++;
198
206
  }
199
- if (seg.removedSeq === constants_js_1.UnassignedSequenceNumber) {
207
+ if ((0, segmentInfos_js_1.isRemoved)(seg) && seg.removedSeq === constants_js_1.UnassignedSequenceNumber) {
200
208
  localRemoves++;
201
209
  }
202
210
  // Only serialize segments that have not been removed.
203
- if (seg.removedSeq === undefined) {
211
+ if (!(0, segmentInfos_js_1.isRemoved)(seg)) {
204
212
  handleCollectingSerializer.stringify(seg.clone().toJSONObject(), handle);
205
213
  }
206
214
  return true;
@@ -213,7 +221,6 @@ class Client extends client_utils_1.TypedEventEmitter {
213
221
  });
214
222
  }
215
223
  }
216
- // eslint-disable-next-line import/no-deprecated
217
224
  getCollabWindow() {
218
225
  return this._mergeTree.collabWindow;
219
226
  }
@@ -223,11 +230,10 @@ class Client extends client_utils_1.TypedEventEmitter {
223
230
  * @param segment - The segment to get the position of
224
231
  */
225
232
  getPosition(segment, localSeq) {
226
- const mergeSegment = segment;
227
- if (mergeSegment?.parent === undefined) {
233
+ if (!(0, mergeTreeNodes_js_1.isSegmentLeaf)(segment)) {
228
234
  return -1;
229
235
  }
230
- return this._mergeTree.getPosition(mergeSegment, this.getCurrentSeq(), this.getClientId(), localSeq);
236
+ return this._mergeTree.getPosition(segment, this.getCurrentSeq(), this.getClientId(), localSeq);
231
237
  }
232
238
  /**
233
239
  * Creates a `LocalReferencePosition` on this client. If the refType does not include ReferenceType.Transient,
@@ -241,6 +247,9 @@ class Client extends client_utils_1.TypedEventEmitter {
241
247
  * before the start of or after the end of the tree
242
248
  */
243
249
  createLocalReferencePosition(segment, offset, refType, properties, slidingPreference, canSlideToEndpoint) {
250
+ if (!(0, mergeTreeNodes_js_1.isSegmentLeaf)(segment) && typeof segment !== "string") {
251
+ throw new internal_4.UsageError(UNBOUND_SEGMENT_ERROR);
252
+ }
244
253
  return this._mergeTree.createLocalReferencePosition(segment, offset ?? 0, refType, properties, slidingPreference, canSlideToEndpoint);
245
254
  }
246
255
  /**
@@ -275,7 +284,6 @@ class Client extends client_utils_1.TypedEventEmitter {
275
284
  * Revert an op
276
285
  */
277
286
  rollback(op, localOpMetadata) {
278
- // eslint-disable-next-line import/no-deprecated
279
287
  this._mergeTree.rollback(op, localOpMetadata);
280
288
  }
281
289
  applyObliterateRangeOp(opArgs) {
@@ -524,11 +532,12 @@ class Client extends client_utils_1.TypedEventEmitter {
524
532
  findReconnectionPosition(segment, localSeq) {
525
533
  (0, internal_1.assert)(localSeq <= this._mergeTree.collabWindow.localSeq, 0x032 /* "localSeq greater than collab window" */);
526
534
  const { currentSeq, clientId } = this.getCollabWindow();
535
+ if (!(0, mergeTreeNodes_js_1.isSegmentLeaf)(segment)) {
536
+ throw new internal_4.UsageError(UNBOUND_SEGMENT_ERROR);
537
+ }
527
538
  return this._mergeTree.getPosition(segment, currentSeq, clientId, localSeq);
528
539
  }
529
- resetPendingDeltaToOps(resetOp,
530
- // eslint-disable-next-line import/no-deprecated
531
- segmentGroup) {
540
+ resetPendingDeltaToOps(resetOp, segmentGroup) {
532
541
  (0, internal_1.assert)(!!segmentGroup, 0x033 /* "Segment group undefined" */);
533
542
  const NACKedSegmentGroup = this.pendingRebase?.shift()?.data;
534
543
  (0, internal_1.assert)(segmentGroup === NACKedSegmentGroup, 0x034 /* "Segment group not at head of pending rebase queue" */);
@@ -536,7 +545,6 @@ class Client extends client_utils_1.TypedEventEmitter {
536
545
  this.pendingRebase = undefined;
537
546
  }
538
547
  // if this is an obliterate op, keep all segments in same segment group
539
- // eslint-disable-next-line import/no-deprecated
540
548
  const obliterateSegmentGroup = {
541
549
  segments: [],
542
550
  localSeq: segmentGroup.localSeq,
@@ -552,7 +560,7 @@ class Client extends client_utils_1.TypedEventEmitter {
552
560
  // By sorting we ensure the nearer segment will be applied and sequenced before the farther segments
553
561
  // so their recalculated positions will be correct.
554
562
  for (const segment of segmentGroup.segments.sort((a, b) => a.ordinal < b.ordinal ? -1 : 1)) {
555
- (0, internal_1.assert)(segment.segmentGroups?.remove?.(segmentGroup) === true, 0x035 /* "Segment group not in segment pending queue" */);
563
+ (0, internal_1.assert)(segment.segmentGroups?.remove(segmentGroup) === true, 0x035 /* "Segment group not in segment pending queue" */);
556
564
  (0, internal_1.assert)(segmentGroup.localSeq !== undefined, 0x867 /* expected segment group localSeq to be defined */);
557
565
  const segmentPosition = this.findReconnectionPosition(segment, segmentGroup.localSeq);
558
566
  let newOp;
@@ -563,10 +571,10 @@ class Client extends client_utils_1.TypedEventEmitter {
563
571
  // if the segment has been removed or obliterated, there's no need to send the annotate op
564
572
  // unless the remove was local, in which case the annotate must have come
565
573
  // before the remove
566
- if ((segment.removedSeq === undefined ||
574
+ if ((!(0, segmentInfos_js_1.isRemoved)(segment) ||
567
575
  (segment.localRemovedSeq !== undefined &&
568
576
  segment.removedSeq === constants_js_1.UnassignedSequenceNumber)) &&
569
- (segment.movedSeq === undefined ||
577
+ (!(0, segmentInfos_js_1.isMoved)(segment) ||
570
578
  (segment.localMovedSeq !== undefined &&
571
579
  segment.movedSeq === constants_js_1.UnassignedSequenceNumber))) {
572
580
  newOp =
@@ -577,8 +585,8 @@ class Client extends client_utils_1.TypedEventEmitter {
577
585
  break;
578
586
  }
579
587
  case ops_js_1.MergeTreeDeltaType.INSERT: {
580
- (0, internal_1.assert)(segment.seq === constants_js_1.UnassignedSequenceNumber, 0x037 /* "Segment already has assigned sequence number" */);
581
- const moveInfo = (0, mergeTreeNodes_js_1.toMoveInfo)(segment);
588
+ (0, internal_1.assert)((0, segmentInfos_js_1.isInserted)(segment) && segment.seq === constants_js_1.UnassignedSequenceNumber, 0x037 /* "Segment already has assigned sequence number" */);
589
+ const moveInfo = (0, segmentInfos_js_1.toMoveInfo)(segment);
582
590
  if (moveInfo !== undefined) {
583
591
  (0, mergeTree_js_1.errorIfOptionNotTrue)(this._mergeTree.options, "mergeTreeEnableObliterateReconnect");
584
592
  if (moveInfo.movedSeq !== constants_js_1.UnassignedSequenceNumber) {
@@ -586,8 +594,11 @@ class Client extends client_utils_1.TypedEventEmitter {
586
594
  // we set the seq to the universal seq and remove the local seq,
587
595
  // so its length is not considered for subsequent local changes
588
596
  // this allows us to not send the op as even the local client will ignore the segment
589
- segment.seq = constants_js_1.UniversalSequenceNumber;
590
- segment.localSeq = undefined;
597
+ (0, segmentInfos_js_1.overwriteInfo)(segment, {
598
+ seq: constants_js_1.UniversalSequenceNumber,
599
+ localSeq: undefined,
600
+ clientId: constants_js_1.NonCollabClient,
601
+ });
591
602
  break;
592
603
  }
593
604
  }
@@ -600,9 +611,10 @@ class Client extends client_utils_1.TypedEventEmitter {
600
611
  break;
601
612
  }
602
613
  case ops_js_1.MergeTreeDeltaType.REMOVE: {
603
- if (segment.localRemovedSeq !== undefined &&
614
+ if ((0, segmentInfos_js_1.isRemoved)(segment) &&
615
+ segment.localRemovedSeq !== undefined &&
604
616
  segment.removedSeq === constants_js_1.UnassignedSequenceNumber &&
605
- (segment.movedSeq === undefined ||
617
+ (!(0, segmentInfos_js_1.isMoved)(segment) ||
606
618
  (segment.localMovedSeq !== undefined &&
607
619
  segment.movedSeq === constants_js_1.UnassignedSequenceNumber))) {
608
620
  newOp = (0, opBuilder_js_1.createRemoveRangeOp)(segmentPosition, segmentPosition + segment.cachedLength);
@@ -611,9 +623,10 @@ class Client extends client_utils_1.TypedEventEmitter {
611
623
  }
612
624
  case ops_js_1.MergeTreeDeltaType.OBLITERATE: {
613
625
  (0, mergeTree_js_1.errorIfOptionNotTrue)(this._mergeTree.options, "mergeTreeEnableObliterateReconnect");
614
- if (segment.localMovedSeq !== undefined &&
626
+ if ((0, segmentInfos_js_1.isMoved)(segment) &&
627
+ segment.localMovedSeq !== undefined &&
615
628
  segment.movedSeq === constants_js_1.UnassignedSequenceNumber &&
616
- (segment.removedSeq === undefined ||
629
+ (!(0, segmentInfos_js_1.isRemoved)(segment) ||
617
630
  (segment.localRemovedSeq !== undefined &&
618
631
  segment.removedSeq === constants_js_1.UnassignedSequenceNumber))) {
619
632
  newOp = (0, opBuilder_js_1.createObliterateRangeOp)(segmentPosition, segmentPosition + segment.cachedLength);
@@ -764,9 +777,8 @@ class Client extends client_utils_1.TypedEventEmitter {
764
777
  * @param resetOp - The op to reset
765
778
  * @param segmentGroup - The segment group associated with the op
766
779
  */
767
- regeneratePendingOp(resetOp,
768
- // eslint-disable-next-line import/no-deprecated
769
- segmentGroup) {
780
+ regeneratePendingOp(resetOp, localOpMetadata) {
781
+ const segmentGroup = localOpMetadata;
770
782
  if (this.pendingRebase === undefined || this.pendingRebase.empty) {
771
783
  let firstGroup;
772
784
  if (Array.isArray(segmentGroup)) {
@@ -813,7 +825,6 @@ class Client extends client_utils_1.TypedEventEmitter {
813
825
  // eslint-disable-next-line import/no-deprecated
814
826
  return opList.length === 1 ? opList[0] : (0, opBuilder_js_1.createGroupOp)(...opList);
815
827
  }
816
- // eslint-disable-next-line import/no-deprecated
817
828
  createTextHelper() {
818
829
  return new MergeTreeTextHelper_js_1.MergeTreeTextHelper(this._mergeTree);
819
830
  }
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\n/* eslint-disable @typescript-eslint/no-non-null-assertion */\n\nimport { TypedEventEmitter } from \"@fluid-internal/client-utils\";\nimport { type IEventThisPlaceHolder, IFluidHandle } from \"@fluidframework/core-interfaces\";\nimport { assert, unreachableCase, isObject } from \"@fluidframework/core-utils/internal\";\nimport {\n\tIFluidDataStoreRuntime,\n\tIChannelStorageService,\n} from \"@fluidframework/datastore-definitions/internal\";\nimport {\n\tMessageType,\n\tISequencedDocumentMessage,\n} from \"@fluidframework/driver-definitions/internal\";\nimport { ISummaryTreeWithStats } from \"@fluidframework/runtime-definitions/internal\";\nimport { toDeltaManagerInternal } from \"@fluidframework/runtime-utils/internal\";\nimport { IFluidSerializer } from \"@fluidframework/shared-object-base/internal\";\nimport {\n\tITelemetryLoggerExt,\n\tLoggingError,\n\tUsageError,\n} from \"@fluidframework/telemetry-utils/internal\";\n\nimport { MergeTreeTextHelper } from \"./MergeTreeTextHelper.js\";\nimport { DoublyLinkedList, RedBlackTree } from \"./collections/index.js\";\nimport { UnassignedSequenceNumber, UniversalSequenceNumber } from \"./constants.js\";\nimport { LocalReferencePosition, SlidingPreference } from \"./localReference.js\";\nimport {\n\tMergeTree,\n\terrorIfOptionNotTrue,\n\ttype IMergeTreeOptionsInternal,\n} from \"./mergeTree.js\";\nimport type {\n\tIMergeTreeClientSequenceArgs,\n\tIMergeTreeDeltaCallbackArgs,\n\tIMergeTreeDeltaOpArgs,\n\tIMergeTreeMaintenanceCallbackArgs,\n} from \"./mergeTreeDeltaCallback.js\";\nimport { walkAllChildSegments } from \"./mergeTreeNodeWalk.js\";\nimport {\n\t// eslint-disable-next-line import/no-deprecated\n\tCollaborationWindow,\n\tISegment,\n\tISegmentAction,\n\tISegmentLeaf,\n\tMarker,\n\t// eslint-disable-next-line import/no-deprecated\n\tSegmentGroup,\n\tcompareStrings,\n\ttoMoveInfo,\n} from \"./mergeTreeNodes.js\";\nimport {\n\tcreateAdjustRangeOp,\n\tcreateAnnotateMarkerOp,\n\tcreateAnnotateRangeOp,\n\t// eslint-disable-next-line import/no-deprecated\n\tcreateGroupOp,\n\tcreateInsertSegmentOp,\n\tcreateObliterateRangeOp,\n\tcreateObliterateRangeOpSided,\n\tcreateRemoveRangeOp,\n} from \"./opBuilder.js\";\nimport {\n\tIJSONSegment,\n\tIMergeTreeAnnotateMsg,\n\tIMergeTreeDeltaOp,\n\t// eslint-disable-next-line import/no-deprecated\n\tIMergeTreeGroupMsg,\n\tIMergeTreeInsertMsg,\n\t// eslint-disable-next-line import/no-deprecated\n\tIMergeTreeObliterateMsg,\n\tIMergeTreeOp,\n\tIMergeTreeRemoveMsg,\n\tIRelativePosition,\n\tMergeTreeDeltaType,\n\tReferenceType,\n\ttype AdjustParams,\n\ttype IMergeTreeAnnotateAdjustMsg,\n\ttype IMergeTreeObliterateSidedMsg,\n} from \"./ops.js\";\nimport { PropertySet, type MapLike } from \"./properties.js\";\nimport { DetachedReferencePosition, ReferencePosition } from \"./referencePositions.js\";\nimport { Side, type InteriorSequencePlace } from \"./sequencePlace.js\";\nimport { SnapshotLoader } from \"./snapshotLoader.js\";\nimport { SnapshotV1 } from \"./snapshotV1.js\";\nimport { SnapshotLegacy } from \"./snapshotlegacy.js\";\n// eslint-disable-next-line import/no-deprecated\nimport { IMergeTreeTextHelper } from \"./textSegment.js\";\n\ntype IMergeTreeDeltaRemoteOpArgs = Omit<IMergeTreeDeltaOpArgs, \"sequencedMessage\"> &\n\tRequired<Pick<IMergeTreeDeltaOpArgs, \"sequencedMessage\">>;\n\n/**\n * A range [start, end)\n * @internal\n */\nexport interface IIntegerRange {\n\tstart: number;\n\tend: number;\n}\n\n/**\n * Emitted before this client's merge-tree normalizes its segments on reconnect, potentially\n * ordering them. Useful for DDS-like consumers built atop the merge-tree to compute any information\n * they need for rebasing their ops on reconnection.\n * @internal\n */\nexport interface IClientEvents {\n\t(event: \"normalize\", listener: (target: IEventThisPlaceHolder) => void): void;\n\t(\n\t\tevent: \"delta\",\n\t\tlistener: (\n\t\t\topArgs: IMergeTreeDeltaOpArgs,\n\t\t\tdeltaArgs: IMergeTreeDeltaCallbackArgs,\n\t\t\ttarget: IEventThisPlaceHolder,\n\t\t) => void,\n\t): void;\n\t(\n\t\tevent: \"maintenance\",\n\t\tlistener: (\n\t\t\targs: IMergeTreeMaintenanceCallbackArgs,\n\t\t\tdeltaArgs: IMergeTreeDeltaOpArgs | undefined,\n\t\t\ttarget: IEventThisPlaceHolder,\n\t\t) => void,\n\t): void;\n}\n\n/**\n * This class encapsulates a merge-tree, and provides a local client specific view over it and\n * the capability to modify it as the local client. Additionally it provides\n * binding for processing remote ops on the encapsulated merge tree, and projects local and remote events\n * caused by all modification to the underlying merge-tree.\n *\n * @internal\n */\nexport class Client extends TypedEventEmitter<IClientEvents> {\n\tpublic longClientId: string | undefined;\n\n\tprivate readonly _mergeTree: MergeTree;\n\n\tprivate readonly clientNameToIds = new RedBlackTree<string, number>(compareStrings);\n\tprivate readonly shortClientIdMap: string[] = [];\n\n\t/**\n\t * @param specToSegment - Rehydrates a segment from its JSON representation\n\t * @param logger - Telemetry logger for diagnostics\n\t * @param options - Options for this client. See {@link IMergeTreeOptions} for details.\n\t * @param getMinInFlightRefSeq - Upon applying a message (see {@link Client.applyMsg}), client purges collab-window information which\n\t * is no longer necessary based on that message's minimum sequence number.\n\t * However, if the user of this client has in-flight messages which refer to positions in this Client,\n\t * they may wish to preserve additional merge information.\n\t * The effective minimum sequence number will be the minimum of the message's minimumSequenceNumber and the result of this function.\n\t * If this function returns undefined, the message's minimumSequenceNumber will be used.\n\t *\n\t * @privateRemarks\n\t * - Passing specToSegment would be unnecessary if Client were merged with SharedSegmentSequence\n\t * - AB#6866 tracks a more unified approach to collab window min seq handling.\n\t */\n\tconstructor(\n\t\tpublic readonly specToSegment: (spec: IJSONSegment) => ISegment,\n\t\tpublic readonly logger: ITelemetryLoggerExt,\n\t\toptions?: IMergeTreeOptionsInternal & PropertySet,\n\t\tprivate readonly getMinInFlightRefSeq: () => number | undefined = (): undefined =>\n\t\t\tundefined,\n\t) {\n\t\tsuper();\n\t\tthis._mergeTree = new MergeTree(options);\n\t\tthis._mergeTree.mergeTreeDeltaCallback = (opArgs, deltaArgs): void => {\n\t\t\tthis.emit(\"delta\", opArgs, deltaArgs, this);\n\t\t};\n\t\tthis._mergeTree.mergeTreeMaintenanceCallback = (args, opArgs): void => {\n\t\t\tthis.emit(\"maintenance\", args, opArgs, this);\n\t\t};\n\n\t\tif (options?.attribution?.track) {\n\t\t\tconst policy = this._mergeTree?.attributionPolicy;\n\t\t\tif (policy === undefined) {\n\t\t\t\tthrow new UsageError(\n\t\t\t\t\t\"Attribution policy must be provided when attribution tracking is requested.\",\n\t\t\t\t);\n\t\t\t}\n\t\t\tpolicy.attach(this);\n\t\t}\n\t}\n\n\t/**\n\t * The merge tree maintains a queue of segment groups for each local operation.\n\t * These segment groups track segments modified by an operation.\n\t * This method peeks the tail of that queue, and returns the segments groups there.\n\t * It is used to get the segment group(s) for the previous operations.\n\t * @param count - The number segment groups to get peek from the tail of the queue. Default 1.\n\t */\n\t// eslint-disable-next-line import/no-deprecated\n\tpublic peekPendingSegmentGroups(): SegmentGroup | undefined;\n\t// eslint-disable-next-line import/no-deprecated\n\tpublic peekPendingSegmentGroups(count: number): SegmentGroup | SegmentGroup[] | undefined;\n\tpublic peekPendingSegmentGroups(\n\t\tcount: number = 1,\n\t\t// eslint-disable-next-line import/no-deprecated\n\t): SegmentGroup | SegmentGroup[] | undefined {\n\t\tconst pending = this._mergeTree.pendingSegments;\n\t\tlet node = pending?.last;\n\t\tif (count === 1 || pending === undefined) {\n\t\t\treturn node?.data;\n\t\t}\n\t\t// eslint-disable-next-line import/no-deprecated\n\t\tconst taken: SegmentGroup[] = Array.from({ length: Math.min(count, pending.length) });\n\t\tfor (let i = taken.length - 1; i >= 0; i--) {\n\t\t\ttaken[i] = node!.data;\n\t\t\tnode = node!.prev;\n\t\t}\n\t\treturn taken;\n\t}\n\n\t/**\n\t * Annotates the markers with the provided properties\n\t * @param marker - The marker to annotate\n\t * @param props - The properties to annotate the marker with\n\t * @returns The annotate op if valid, otherwise undefined\n\t */\n\tpublic annotateMarker(\n\t\tmarker: Marker,\n\t\tprops: PropertySet,\n\t): IMergeTreeAnnotateMsg | undefined {\n\t\tconst annotateOp = createAnnotateMarkerOp(marker, props)!;\n\t\tthis.applyAnnotateRangeOp({ op: annotateOp });\n\t\treturn annotateOp;\n\t}\n\n\t/**\n\t * Annotates the range with the provided properties\n\t * @param start - The inclusive start position of the range to annotate\n\t * @param end - The exclusive end position of the range to annotate\n\t * @param props - The properties to annotate the range with\n\t * @returns The annotate op if valid, otherwise undefined\n\t */\n\tpublic annotateRangeLocal(\n\t\tstart: number,\n\t\tend: number,\n\t\tprops: PropertySet,\n\t): IMergeTreeAnnotateMsg | undefined {\n\t\tconst annotateOp = createAnnotateRangeOp(start, end, props);\n\t\tthis.applyAnnotateRangeOp({ op: annotateOp });\n\t\treturn annotateOp;\n\t}\n\n\t/**\n\t * adjusts a value\n\t */\n\tpublic annotateAdjustRangeLocal(\n\t\tstart: number,\n\t\tend: number,\n\t\tadjust: MapLike<AdjustParams>,\n\t): IMergeTreeAnnotateAdjustMsg {\n\t\tconst annotateOp = createAdjustRangeOp(start, end, adjust);\n\n\t\tfor (const [key, value] of Object.entries(adjust)) {\n\t\t\tif (value.min !== undefined && value.max !== undefined && value.min > value.max) {\n\t\t\t\tthrow new UsageError(`min is greater than max for ${key}`);\n\t\t\t}\n\t\t}\n\n\t\tthis.applyAnnotateRangeOp({ op: annotateOp });\n\t\treturn annotateOp;\n\t}\n\n\t/**\n\t * Removes the range\n\t *\n\t * @param start - The inclusive start of the range to remove\n\t * @param end - The exclusive end of the range to remove\n\t */\n\tpublic removeRangeLocal(start: number, end: number): IMergeTreeRemoveMsg {\n\t\tconst removeOp = createRemoveRangeOp(start, end);\n\t\tthis.applyRemoveRangeOp({ op: removeOp });\n\t\treturn removeOp;\n\t}\n\n\t/**\n\t * Obliterates the range. This is similar to removing the range, but also\n\t * includes any concurrently inserted content.\n\t *\n\t * @param start - The start of the range to obliterate. Inclusive is side is Before (default).\n\t * @param end - The end of the range to obliterate. Exclusive is side is After\n\t * (default is to be after the last included character, but number index is exclusive).\n\t */\n\tpublic obliterateRangeLocal(\n\t\tstart: number | InteriorSequencePlace,\n\t\tend: number | InteriorSequencePlace,\n\t\t// eslint-disable-next-line import/no-deprecated\n\t): IMergeTreeObliterateMsg | IMergeTreeObliterateSidedMsg {\n\t\t// eslint-disable-next-line import/no-deprecated\n\t\tlet obliterateOp: IMergeTreeObliterateMsg | IMergeTreeObliterateSidedMsg;\n\t\tif (this._mergeTree.options?.mergeTreeEnableSidedObliterate) {\n\t\t\tobliterateOp = createObliterateRangeOpSided(start, end);\n\t\t} else {\n\t\t\tassert(\n\t\t\t\ttypeof start === \"number\" && typeof end === \"number\",\n\t\t\t\t0xa42 /* Start and end must be numbers if mergeTreeEnableSidedObliterate is not enabled. */,\n\t\t\t);\n\t\t\tobliterateOp = createObliterateRangeOp(start, end);\n\t\t}\n\t\tthis.applyObliterateRangeOp({ op: obliterateOp });\n\t\treturn obliterateOp;\n\t}\n\n\t/**\n\t * Create and insert a segment at the specified position.\n\t * @param pos - The position to insert the segment at\n\t * @param segment - The segment to insert\n\t */\n\tpublic insertSegmentLocal(pos: number, segment: ISegment): IMergeTreeInsertMsg | undefined {\n\t\tif (segment.cachedLength <= 0) {\n\t\t\treturn undefined;\n\t\t}\n\t\tconst insertOp = createInsertSegmentOp(pos, segment);\n\t\tthis.applyInsertOp({ op: insertOp });\n\t\treturn insertOp;\n\t}\n\n\t/**\n\t * Create and insert a segment at the specified reference position.\n\t * @param refPos - The reference position to insert the segment at\n\t * @param segment - The segment to insert\n\t */\n\tpublic insertAtReferencePositionLocal(\n\t\trefPos: ReferencePosition,\n\t\tsegment: ISegment,\n\t): IMergeTreeInsertMsg | undefined {\n\t\tconst pos = this._mergeTree.referencePositionToLocalPosition(\n\t\t\trefPos,\n\t\t\tthis.getCurrentSeq(),\n\t\t\tthis.getClientId(),\n\t\t);\n\n\t\tif (pos === DetachedReferencePosition) {\n\t\t\tthrow new UsageError(\"Cannot insert at detached local reference.\");\n\t\t}\n\t\treturn this.insertSegmentLocal(pos, segment);\n\t}\n\n\tpublic walkSegments<TClientData>(\n\t\thandler: ISegmentAction<TClientData>,\n\t\tstart: number | undefined,\n\t\tend: number | undefined,\n\t\taccum: TClientData,\n\t\tsplitRange?: boolean,\n\t): void;\n\tpublic walkSegments(\n\t\thandler: ISegmentAction<undefined>,\n\t\tstart?: number,\n\t\tend?: number,\n\t\taccum?: undefined,\n\t\tsplitRange?: boolean,\n\t): void;\n\tpublic walkSegments<TClientData>(\n\t\thandler: ISegmentAction<TClientData>,\n\t\tstart: number | undefined,\n\t\tend: number | undefined,\n\t\taccum: TClientData,\n\t\tsplitRange: boolean = false,\n\t): void {\n\t\tthis._mergeTree.mapRange(\n\t\t\thandler,\n\t\t\tthis.getCurrentSeq(),\n\t\t\tthis.getClientId(),\n\t\t\taccum,\n\t\t\tstart,\n\t\t\tend,\n\t\t\tsplitRange,\n\t\t);\n\t}\n\n\tprotected walkAllSegments<TClientData>(\n\t\taction: (segment: ISegment, accum?: TClientData) => boolean,\n\t\taccum?: TClientData,\n\t): boolean {\n\t\treturn walkAllChildSegments(\n\t\t\tthis._mergeTree.root,\n\t\t\taccum === undefined ? action : (seg): boolean => action(seg, accum),\n\t\t);\n\t}\n\n\t/**\n\t * Serializes the data required for garbage collection. The IFluidHandles stored in all segments that haven't\n\t * been removed represent routes to other objects. We serialize the data in these segments using the passed in\n\t * serializer which keeps track of all serialized handles.\n\t */\n\tpublic serializeGCData(\n\t\thandle: IFluidHandle,\n\t\thandleCollectingSerializer: IFluidSerializer,\n\t): void {\n\t\tlet localInserts = 0;\n\t\tlet localRemoves = 0;\n\t\twalkAllChildSegments(this._mergeTree.root, (seg: ISegmentLeaf) => {\n\t\t\tif (seg.seq === UnassignedSequenceNumber) {\n\t\t\t\tlocalInserts++;\n\t\t\t}\n\t\t\tif (seg.removedSeq === UnassignedSequenceNumber) {\n\t\t\t\tlocalRemoves++;\n\t\t\t}\n\t\t\t// Only serialize segments that have not been removed.\n\t\t\tif (seg.removedSeq === undefined) {\n\t\t\t\thandleCollectingSerializer.stringify(seg.clone().toJSONObject(), handle);\n\t\t\t}\n\t\t\treturn true;\n\t\t});\n\n\t\tif (localInserts > 0 || localRemoves > 0) {\n\t\t\tthis.logger.sendErrorEvent({\n\t\t\t\teventName: \"LocalEditsInProcessGCData\",\n\t\t\t\tlocalInserts,\n\t\t\t\tlocalRemoves,\n\t\t\t});\n\t\t}\n\t}\n\n\t// eslint-disable-next-line import/no-deprecated\n\tpublic getCollabWindow(): CollaborationWindow {\n\t\treturn this._mergeTree.collabWindow;\n\t}\n\n\t/**\n\t * Returns the current position of a segment, and -1 if the segment\n\t * does not exist in this merge tree\n\t * @param segment - The segment to get the position of\n\t */\n\tpublic getPosition(segment: ISegment | undefined, localSeq?: number): number {\n\t\tconst mergeSegment: ISegmentLeaf | undefined = segment;\n\t\tif (mergeSegment?.parent === undefined) {\n\t\t\treturn -1;\n\t\t}\n\t\treturn this._mergeTree.getPosition(\n\t\t\tmergeSegment,\n\t\t\tthis.getCurrentSeq(),\n\t\t\tthis.getClientId(),\n\t\t\tlocalSeq,\n\t\t);\n\t}\n\n\t/**\n\t * Creates a `LocalReferencePosition` on this client. If the refType does not include ReferenceType.Transient,\n\t * the returned reference will be added to the localRefs on the provided segment.\n\t * @param segment - Segment to add the local reference on\n\t * @param offset - Offset on the segment at which to place the local reference\n\t * @param refType - ReferenceType for the created local reference\n\t * @param properties - PropertySet to place on the created local reference\n\t * @param canSlideToEndpoint - Whether or not the created local reference can\n\t * slide onto one of the special endpoint segments denoting the position\n\t * before the start of or after the end of the tree\n\t */\n\tpublic createLocalReferencePosition(\n\t\tsegment: ISegment | \"start\" | \"end\",\n\t\toffset: number | undefined,\n\t\trefType: ReferenceType,\n\t\tproperties: PropertySet | undefined,\n\t\tslidingPreference?: SlidingPreference,\n\t\tcanSlideToEndpoint?: boolean,\n\t): LocalReferencePosition {\n\t\treturn this._mergeTree.createLocalReferencePosition(\n\t\t\tsegment,\n\t\t\toffset ?? 0,\n\t\t\trefType,\n\t\t\tproperties,\n\t\t\tslidingPreference,\n\t\t\tcanSlideToEndpoint,\n\t\t);\n\t}\n\n\t/**\n\t * Removes a `LocalReferencePosition` from this client.\n\t */\n\tpublic removeLocalReferencePosition(\n\t\tlref: LocalReferencePosition,\n\t): LocalReferencePosition | undefined {\n\t\treturn this._mergeTree.removeLocalReferencePosition(lref);\n\t}\n\n\t/**\n\t * Resolves a `ReferencePosition` into a character position using this client's perspective.\n\t *\n\t * Reference positions that point to a character that has been removed will\n\t * always return the position of the nearest non-removed character, regardless\n\t * of {@link ReferenceType}. To handle this case specifically, one may wish\n\t * to look at the segment returned by {@link ReferencePosition.getSegment}.\n\t */\n\tpublic localReferencePositionToPosition(lref: ReferencePosition): number {\n\t\treturn this._mergeTree.referencePositionToLocalPosition(lref);\n\t}\n\n\t/**\n\t * Given a position specified relative to a marker id, lookup the marker\n\t * and convert the position to a character position.\n\t * @param relativePos - Id of marker (may be indirect) and whether position is before or after marker.\n\t */\n\tpublic posFromRelativePos(relativePos: IRelativePosition): number {\n\t\treturn this._mergeTree.posFromRelativePos(relativePos);\n\t}\n\n\tpublic getMarkerFromId(id: string): ISegment | undefined {\n\t\treturn this._mergeTree.getMarkerFromId(id);\n\t}\n\n\t/**\n\t * Revert an op\n\t */\n\tpublic rollback?(op: unknown, localOpMetadata: unknown): void {\n\t\t// eslint-disable-next-line import/no-deprecated\n\t\tthis._mergeTree.rollback(op as IMergeTreeDeltaOp, localOpMetadata as SegmentGroup);\n\t}\n\n\tprivate applyObliterateRangeOp(opArgs: IMergeTreeDeltaOpArgs): void {\n\t\tassert(\n\t\t\topArgs.op.type === MergeTreeDeltaType.OBLITERATE ||\n\t\t\t\topArgs.op.type === MergeTreeDeltaType.OBLITERATE_SIDED,\n\t\t\t0x866 /* Unexpected op type on range obliterate! */,\n\t\t);\n\t\tconst op = opArgs.op;\n\t\tconst clientArgs = this.getClientSequenceArgs(opArgs);\n\t\tif (this._mergeTree.options?.mergeTreeEnableSidedObliterate) {\n\t\t\tconst { start, end } = this.getValidSidedRange(op, clientArgs);\n\t\t\tthis._mergeTree.obliterateRange(\n\t\t\t\tstart,\n\t\t\t\tend,\n\t\t\t\tclientArgs.referenceSequenceNumber,\n\t\t\t\tclientArgs.clientId,\n\t\t\t\tclientArgs.sequenceNumber,\n\t\t\t\topArgs,\n\t\t\t);\n\t\t} else {\n\t\t\tassert(\n\t\t\t\top.type === MergeTreeDeltaType.OBLITERATE,\n\t\t\t\t0xa43 /* Unexpected sided obliterate while mergeTreeEnableSidedObliterate is disabled */,\n\t\t\t);\n\t\t\tconst range = this.getValidOpRange(op, clientArgs);\n\t\t\tthis._mergeTree.obliterateRange(\n\t\t\t\trange.start,\n\t\t\t\trange.end,\n\t\t\t\tclientArgs.referenceSequenceNumber,\n\t\t\t\tclientArgs.clientId,\n\t\t\t\tclientArgs.sequenceNumber,\n\t\t\t\topArgs,\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Performs the remove based on the provided op\n\t * @param opArgs - The ops args for the op\n\t */\n\tprivate applyRemoveRangeOp(opArgs: IMergeTreeDeltaOpArgs): void {\n\t\tassert(\n\t\t\topArgs.op.type === MergeTreeDeltaType.REMOVE,\n\t\t\t0x02d /* \"Unexpected op type on range remove!\" */,\n\t\t);\n\t\tconst op = opArgs.op;\n\t\tconst clientArgs = this.getClientSequenceArgs(opArgs);\n\t\tconst range = this.getValidOpRange(op, clientArgs);\n\n\t\tthis._mergeTree.markRangeRemoved(\n\t\t\trange.start,\n\t\t\trange.end,\n\t\t\tclientArgs.referenceSequenceNumber,\n\t\t\tclientArgs.clientId,\n\t\t\tclientArgs.sequenceNumber,\n\t\t\topArgs,\n\t\t);\n\t}\n\n\t/**\n\t * Performs the annotate based on the provided op\n\t * @param opArgs - The ops args for the op\n\t */\n\tprivate applyAnnotateRangeOp(opArgs: IMergeTreeDeltaOpArgs): void {\n\t\tassert(\n\t\t\topArgs.op.type === MergeTreeDeltaType.ANNOTATE,\n\t\t\t0x02e /* \"Unexpected op type on range annotate!\" */,\n\t\t);\n\t\tconst op = opArgs.op;\n\t\tconst clientArgs = this.getClientSequenceArgs(opArgs);\n\t\tconst range = this.getValidOpRange(op, clientArgs);\n\n\t\tthis._mergeTree.annotateRange(\n\t\t\trange.start,\n\t\t\trange.end,\n\t\t\top,\n\t\t\tclientArgs.referenceSequenceNumber,\n\t\t\tclientArgs.clientId,\n\t\t\tclientArgs.sequenceNumber,\n\t\t\topArgs,\n\t\t);\n\t}\n\n\t/**\n\t * Performs the insert based on the provided op\n\t * @param opArgs - The ops args for the op\n\t * @returns True if the insert was applied. False if it could not be.\n\t */\n\tprivate applyInsertOp(opArgs: IMergeTreeDeltaOpArgs): void {\n\t\tassert(\n\t\t\topArgs.op.type === MergeTreeDeltaType.INSERT,\n\t\t\t0x02f /* \"Unexpected op type on range insert!\" */,\n\t\t);\n\t\tconst op = opArgs.op;\n\t\tconst clientArgs = this.getClientSequenceArgs(opArgs);\n\t\tconst range = this.getValidOpRange(op, clientArgs);\n\n\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n\t\tconst segments = [this.specToSegment(op.seg)];\n\n\t\tthis._mergeTree.insertSegments(\n\t\t\trange.start,\n\t\t\tsegments,\n\t\t\tclientArgs.referenceSequenceNumber,\n\t\t\tclientArgs.clientId,\n\t\t\tclientArgs.sequenceNumber,\n\t\t\topArgs,\n\t\t);\n\t}\n\n\t/**\n\t * Returns a valid range for the op, or throws if the range is invalid\n\t * @param op - The op to generate the range for\n\t * @param clientArgs - The client args for the op\n\t * @throws LoggingError if the range is invalid\n\t */\n\tprivate getValidSidedRange(\n\t\t// eslint-disable-next-line import/no-deprecated\n\t\top: IMergeTreeObliterateSidedMsg | IMergeTreeObliterateMsg,\n\t\tclientArgs: IMergeTreeClientSequenceArgs,\n\t): {\n\t\tstart: InteriorSequencePlace;\n\t\tend: InteriorSequencePlace;\n\t} {\n\t\tconst invalidPositions: string[] = [];\n\t\tlet start: InteriorSequencePlace | undefined;\n\t\tlet end: InteriorSequencePlace | undefined;\n\t\tif (op.pos1 === undefined) {\n\t\t\tinvalidPositions.push(\"start\");\n\t\t} else {\n\t\t\tstart =\n\t\t\t\ttypeof op.pos1 === \"object\"\n\t\t\t\t\t? { pos: op.pos1.pos, side: op.pos1.before ? Side.Before : Side.After }\n\t\t\t\t\t: { pos: op.pos1, side: Side.Before };\n\t\t}\n\t\tif (op.pos2 === undefined) {\n\t\t\tinvalidPositions.push(\"end\");\n\t\t} else {\n\t\t\tend =\n\t\t\t\ttypeof op.pos2 === \"object\"\n\t\t\t\t\t? { pos: op.pos2.pos, side: op.pos2.before ? Side.Before : Side.After }\n\t\t\t\t\t: { pos: op.pos2 - 1, side: Side.After };\n\t\t}\n\n\t\t// Validate if local op\n\t\tif (clientArgs.clientId === this.getClientId()) {\n\t\t\tconst length = this._mergeTree.getLength(\n\t\t\t\tthis.getCollabWindow().currentSeq,\n\t\t\t\tthis.getClientId(),\n\t\t\t);\n\t\t\tif (start !== undefined && (start.pos >= length || start.pos < 0)) {\n\t\t\t\t// start out of bounds\n\t\t\t\tinvalidPositions.push(\"start\");\n\t\t\t}\n\t\t\tif (end !== undefined && (end.pos >= length || end.pos < 0)) {\n\t\t\t\tinvalidPositions.push(\"end\");\n\t\t\t}\n\t\t\tif (\n\t\t\t\tstart !== undefined &&\n\t\t\t\tend !== undefined &&\n\t\t\t\t(start.pos > end.pos ||\n\t\t\t\t\t(start.pos === end.pos && start.side !== end.side && start.side === Side.After))\n\t\t\t) {\n\t\t\t\t// end is before start\n\t\t\t\tinvalidPositions.push(\"inverted\");\n\t\t\t}\n\t\t\tif (invalidPositions.length > 0) {\n\t\t\t\tthrow new LoggingError(\"InvalidRange\", {\n\t\t\t\t\tusageError: true,\n\t\t\t\t\tinvalidPositions: invalidPositions.toString(),\n\t\t\t\t\tlength,\n\t\t\t\t\topType: op.type,\n\t\t\t\t\topPos1Relative: op.relativePos1 !== undefined,\n\t\t\t\t\topPos2Relative: op.relativePos2 !== undefined,\n\t\t\t\t\topPos1: JSON.stringify(op.pos1),\n\t\t\t\t\topPos2: JSON.stringify(op.pos2),\n\t\t\t\t\tstart: JSON.stringify(start),\n\t\t\t\t\tend: JSON.stringify(end),\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tassert(\n\t\t\tstart !== undefined && end !== undefined,\n\t\t\t0xa44 /* Missing start or end of range */,\n\t\t);\n\t\treturn { start, end };\n\t}\n\n\t/**\n\t * Returns a valid range for the op, or undefined\n\t * @param op - The op to generate the range for\n\t * @param clientArgs - The client args for the op\n\t */\n\tprivate getValidOpRange(\n\t\top:\n\t\t\t| IMergeTreeAnnotateMsg\n\t\t\t| IMergeTreeAnnotateAdjustMsg\n\t\t\t| IMergeTreeInsertMsg\n\t\t\t| IMergeTreeRemoveMsg\n\t\t\t// eslint-disable-next-line import/no-deprecated\n\t\t\t| IMergeTreeObliterateMsg,\n\t\tclientArgs: IMergeTreeClientSequenceArgs,\n\t): IIntegerRange {\n\t\tlet start: number | undefined = op.pos1;\n\t\tif (start === undefined && op.relativePos1) {\n\t\t\tstart = this._mergeTree.posFromRelativePos(\n\t\t\t\top.relativePos1,\n\t\t\t\tclientArgs.referenceSequenceNumber,\n\t\t\t\tclientArgs.clientId,\n\t\t\t);\n\t\t}\n\n\t\tlet end: number | undefined = op.pos2;\n\t\tif (end === undefined && op.relativePos2) {\n\t\t\tend = this._mergeTree.posFromRelativePos(\n\t\t\t\top.relativePos2,\n\t\t\t\tclientArgs.referenceSequenceNumber,\n\t\t\t\tclientArgs.clientId,\n\t\t\t);\n\t\t}\n\n\t\t// Validate if local op\n\t\tif (clientArgs.clientId === this.getClientId()) {\n\t\t\tconst length = this.getLength();\n\n\t\t\tconst invalidPositions: string[] = [];\n\n\t\t\t// Validate start position\n\t\t\t//\n\t\t\tif (\n\t\t\t\tstart === undefined ||\n\t\t\t\tstart < 0 ||\n\t\t\t\tstart > length ||\n\t\t\t\t(start === length && op.type !== MergeTreeDeltaType.INSERT)\n\t\t\t) {\n\t\t\t\tinvalidPositions.push(\"start\");\n\t\t\t}\n\t\t\t// Validate end if not insert, or insert has end\n\t\t\tif (\n\t\t\t\t(op.type !== MergeTreeDeltaType.INSERT || end !== undefined) &&\n\t\t\t\t(end === undefined || end <= start!)\n\t\t\t) {\n\t\t\t\tinvalidPositions.push(\"end\");\n\t\t\t}\n\n\t\t\tif (op.type === MergeTreeDeltaType.OBLITERATE && end !== undefined && end > length) {\n\t\t\t\tinvalidPositions.push(\"end\");\n\t\t\t}\n\n\t\t\tif (invalidPositions.length > 0) {\n\t\t\t\tthrow new LoggingError(\"RangeOutOfBounds\", {\n\t\t\t\t\tusageError: true,\n\t\t\t\t\tend,\n\t\t\t\t\tinvalidPositions: invalidPositions.toString(),\n\t\t\t\t\tlength,\n\t\t\t\t\topPos1: op.pos1,\n\t\t\t\t\topPos1Relative: op.relativePos1 !== undefined,\n\t\t\t\t\topPos2: op.pos2,\n\t\t\t\t\topPos2Relative: op.relativePos2 !== undefined,\n\t\t\t\t\topType: op.type,\n\t\t\t\t\tstart,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\t// start and end are guaranteed to be non-null here, otherwise we throw above.\n\t\treturn { start: start!, end: end! };\n\t}\n\n\t/**\n\t * Gets the client args from the op if remote, otherwise uses the local clients info\n\t * @param sequencedMessage - The sequencedMessage to get the client sequence args for\n\t */\n\tprivate getClientSequenceArgsForMessage(\n\t\tsequencedMessage:\n\t\t\t| ISequencedDocumentMessage\n\t\t\t| Pick<ISequencedDocumentMessage, \"referenceSequenceNumber\" | \"clientId\">\n\t\t\t| undefined,\n\t): IMergeTreeClientSequenceArgs {\n\t\t// If there this no sequenced message, then the op is local\n\t\t// and unacked, so use this clients sequenced args\n\t\t//\n\t\tif (sequencedMessage) {\n\t\t\treturn {\n\t\t\t\tclientId: this.getOrAddShortClientIdFromMessage(sequencedMessage),\n\t\t\t\treferenceSequenceNumber: sequencedMessage.referenceSequenceNumber,\n\t\t\t\t// Note: return value satisfies overload signatures despite the cast, as if input argument doesn't contain sequenceNumber,\n\t\t\t\t// return value isn't expected to have it either.\n\t\t\t\tsequenceNumber: (sequencedMessage as ISequencedDocumentMessage).sequenceNumber,\n\t\t\t};\n\t\t} else {\n\t\t\tconst segWindow = this.getCollabWindow();\n\t\t\treturn {\n\t\t\t\tclientId: segWindow.clientId,\n\t\t\t\treferenceSequenceNumber: segWindow.currentSeq,\n\t\t\t\tsequenceNumber: this.getLocalSequenceNumber(),\n\t\t\t};\n\t\t}\n\t}\n\n\t/**\n\t * Gets the client args from the op if remote, otherwise uses the local clients info\n\t * @param opArgs - The op arg to get the client sequence args for\n\t */\n\tprivate getClientSequenceArgs(opArgs: IMergeTreeDeltaOpArgs): IMergeTreeClientSequenceArgs {\n\t\treturn this.getClientSequenceArgsForMessage(opArgs.sequencedMessage);\n\t}\n\n\tprivate ackPendingSegment(opArgs: IMergeTreeDeltaRemoteOpArgs): void {\n\t\tif (opArgs.op.type === MergeTreeDeltaType.GROUP) {\n\t\t\tfor (const memberOp of opArgs.op.ops) {\n\t\t\t\tthis._mergeTree.ackPendingSegment({\n\t\t\t\t\tgroupOp: opArgs.op,\n\t\t\t\t\top: memberOp,\n\t\t\t\t\tsequencedMessage: opArgs.sequencedMessage,\n\t\t\t\t});\n\t\t\t}\n\t\t} else {\n\t\t\tthis._mergeTree.ackPendingSegment(opArgs);\n\t\t}\n\t}\n\n\tgetOrAddShortClientId(longClientId: string): number {\n\t\tif (!this.clientNameToIds.get(longClientId)) {\n\t\t\tthis.addLongClientId(longClientId);\n\t\t}\n\t\treturn this.getShortClientId(longClientId);\n\t}\n\n\tprotected getShortClientId(longClientId: string): number {\n\t\treturn this.clientNameToIds.get(longClientId)!.data;\n\t}\n\n\tgetLongClientId(shortClientId: number): string {\n\t\treturn shortClientId >= 0 ? this.shortClientIdMap[shortClientId] : \"original\";\n\t}\n\n\taddLongClientId(longClientId: string): void {\n\t\tthis.clientNameToIds.put(longClientId, this.shortClientIdMap.length);\n\t\tthis.shortClientIdMap.push(longClientId);\n\t}\n\n\tprivate getOrAddShortClientIdFromMessage(\n\t\tmsg: Pick<ISequencedDocumentMessage, \"clientId\">,\n\t): number {\n\t\treturn this.getOrAddShortClientId(msg.clientId ?? \"server\");\n\t}\n\n\t/**\n\t * During reconnect, we must find the positions to pending segments\n\t * relative to other pending segments. This methods computes that\n\t * position relative to a localSeq. Pending segments above the localSeq\n\t * will be ignored.\n\t *\n\t * @param segment - The segment to find the position for\n\t * @param localSeq - The localSeq to find the position of the segment at\n\t */\n\tpublic findReconnectionPosition(segment: ISegment, localSeq: number): number {\n\t\tassert(\n\t\t\tlocalSeq <= this._mergeTree.collabWindow.localSeq,\n\t\t\t0x032 /* \"localSeq greater than collab window\" */,\n\t\t);\n\t\tconst { currentSeq, clientId } = this.getCollabWindow();\n\t\treturn this._mergeTree.getPosition(segment, currentSeq, clientId, localSeq);\n\t}\n\n\tprivate resetPendingDeltaToOps(\n\t\tresetOp: IMergeTreeDeltaOp,\n\t\t// eslint-disable-next-line import/no-deprecated\n\t\tsegmentGroup: SegmentGroup<ISegmentLeaf>,\n\t): IMergeTreeDeltaOp[] {\n\t\tassert(!!segmentGroup, 0x033 /* \"Segment group undefined\" */);\n\t\tconst NACKedSegmentGroup = this.pendingRebase?.shift()?.data;\n\t\tassert(\n\t\t\tsegmentGroup === NACKedSegmentGroup,\n\t\t\t0x034 /* \"Segment group not at head of pending rebase queue\" */,\n\t\t);\n\t\tif (this.pendingRebase?.empty) {\n\t\t\tthis.pendingRebase = undefined;\n\t\t}\n\n\t\t// if this is an obliterate op, keep all segments in same segment group\n\t\t// eslint-disable-next-line import/no-deprecated\n\t\tconst obliterateSegmentGroup: SegmentGroup = {\n\t\t\tsegments: [],\n\t\t\tlocalSeq: segmentGroup.localSeq,\n\t\t\trefSeq: this.getCollabWindow().currentSeq,\n\t\t\tobliterateInfo: {\n\t\t\t\t...segmentGroup.obliterateInfo!,\n\t\t\t},\n\t\t};\n\n\t\tconst opList: IMergeTreeDeltaOp[] = [];\n\t\t// We need to sort the segments by ordinal, as the segments are not sorted in the segment group.\n\t\t// The reason they need them sorted, as they have the same local sequence number and which means\n\t\t// farther segments will take into account nearer segments when calculating their position.\n\t\t// By sorting we ensure the nearer segment will be applied and sequenced before the farther segments\n\t\t// so their recalculated positions will be correct.\n\t\tfor (const segment of segmentGroup.segments.sort((a, b) =>\n\t\t\ta.ordinal < b.ordinal ? -1 : 1,\n\t\t)) {\n\t\t\tassert(\n\t\t\t\tsegment.segmentGroups?.remove?.(segmentGroup) === true,\n\t\t\t\t0x035 /* \"Segment group not in segment pending queue\" */,\n\t\t\t);\n\t\t\tassert(\n\t\t\t\tsegmentGroup.localSeq !== undefined,\n\t\t\t\t0x867 /* expected segment group localSeq to be defined */,\n\t\t\t);\n\t\t\tconst segmentPosition = this.findReconnectionPosition(segment, segmentGroup.localSeq);\n\t\t\tlet newOp: IMergeTreeDeltaOp | undefined;\n\t\t\tswitch (resetOp.type) {\n\t\t\t\tcase MergeTreeDeltaType.ANNOTATE: {\n\t\t\t\t\tassert(\n\t\t\t\t\t\tsegment.propertyManager?.hasPendingProperties(resetOp.props ?? resetOp.adjust) ===\n\t\t\t\t\t\t\ttrue,\n\t\t\t\t\t\t0x036 /* \"Segment has no pending properties\" */,\n\t\t\t\t\t);\n\t\t\t\t\t// if the segment has been removed or obliterated, there's no need to send the annotate op\n\t\t\t\t\t// unless the remove was local, in which case the annotate must have come\n\t\t\t\t\t// before the remove\n\t\t\t\t\tif (\n\t\t\t\t\t\t(segment.removedSeq === undefined ||\n\t\t\t\t\t\t\t(segment.localRemovedSeq !== undefined &&\n\t\t\t\t\t\t\t\tsegment.removedSeq === UnassignedSequenceNumber)) &&\n\t\t\t\t\t\t(segment.movedSeq === undefined ||\n\t\t\t\t\t\t\t(segment.localMovedSeq !== undefined &&\n\t\t\t\t\t\t\t\tsegment.movedSeq === UnassignedSequenceNumber))\n\t\t\t\t\t) {\n\t\t\t\t\t\tnewOp =\n\t\t\t\t\t\t\tresetOp.props === undefined\n\t\t\t\t\t\t\t\t? createAdjustRangeOp(\n\t\t\t\t\t\t\t\t\t\tsegmentPosition,\n\t\t\t\t\t\t\t\t\t\tsegmentPosition + segment.cachedLength,\n\t\t\t\t\t\t\t\t\t\tresetOp.adjust,\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t: createAnnotateRangeOp(\n\t\t\t\t\t\t\t\t\t\tsegmentPosition,\n\t\t\t\t\t\t\t\t\t\tsegmentPosition + segment.cachedLength,\n\t\t\t\t\t\t\t\t\t\tresetOp.props,\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tcase MergeTreeDeltaType.INSERT: {\n\t\t\t\t\tassert(\n\t\t\t\t\t\tsegment.seq === UnassignedSequenceNumber,\n\t\t\t\t\t\t0x037 /* \"Segment already has assigned sequence number\" */,\n\t\t\t\t\t);\n\t\t\t\t\tconst moveInfo = toMoveInfo(segment);\n\n\t\t\t\t\tif (moveInfo !== undefined) {\n\t\t\t\t\t\terrorIfOptionNotTrue(\n\t\t\t\t\t\t\tthis._mergeTree.options,\n\t\t\t\t\t\t\t\"mergeTreeEnableObliterateReconnect\",\n\t\t\t\t\t\t);\n\t\t\t\t\t\tif (moveInfo.movedSeq !== UnassignedSequenceNumber) {\n\t\t\t\t\t\t\t// the segment was remotely obliterated, so is considered removed\n\t\t\t\t\t\t\t// we set the seq to the universal seq and remove the local seq,\n\t\t\t\t\t\t\t// so its length is not considered for subsequent local changes\n\t\t\t\t\t\t\t// this allows us to not send the op as even the local client will ignore the segment\n\t\t\t\t\t\t\tsegment.seq = UniversalSequenceNumber;\n\t\t\t\t\t\t\tsegment.localSeq = undefined;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tconst segInsertOp: ISegment = segment.clone();\n\t\t\t\t\tconst opProps =\n\t\t\t\t\t\tisObject(resetOp.seg) && \"props\" in resetOp.seg && isObject(resetOp.seg.props)\n\t\t\t\t\t\t\t? { ...resetOp.seg.props }\n\t\t\t\t\t\t\t: undefined;\n\t\t\t\t\tsegInsertOp.properties = opProps;\n\t\t\t\t\tnewOp = createInsertSegmentOp(segmentPosition, segInsertOp);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tcase MergeTreeDeltaType.REMOVE: {\n\t\t\t\t\tif (\n\t\t\t\t\t\tsegment.localRemovedSeq !== undefined &&\n\t\t\t\t\t\tsegment.removedSeq === UnassignedSequenceNumber &&\n\t\t\t\t\t\t(segment.movedSeq === undefined ||\n\t\t\t\t\t\t\t(segment.localMovedSeq !== undefined &&\n\t\t\t\t\t\t\t\tsegment.movedSeq === UnassignedSequenceNumber))\n\t\t\t\t\t) {\n\t\t\t\t\t\tnewOp = createRemoveRangeOp(\n\t\t\t\t\t\t\tsegmentPosition,\n\t\t\t\t\t\t\tsegmentPosition + segment.cachedLength,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase MergeTreeDeltaType.OBLITERATE: {\n\t\t\t\t\terrorIfOptionNotTrue(this._mergeTree.options, \"mergeTreeEnableObliterateReconnect\");\n\t\t\t\t\tif (\n\t\t\t\t\t\tsegment.localMovedSeq !== undefined &&\n\t\t\t\t\t\tsegment.movedSeq === UnassignedSequenceNumber &&\n\t\t\t\t\t\t(segment.removedSeq === undefined ||\n\t\t\t\t\t\t\t(segment.localRemovedSeq !== undefined &&\n\t\t\t\t\t\t\t\tsegment.removedSeq === UnassignedSequenceNumber))\n\t\t\t\t\t) {\n\t\t\t\t\t\tnewOp = createObliterateRangeOp(\n\t\t\t\t\t\t\tsegmentPosition,\n\t\t\t\t\t\t\tsegmentPosition + segment.cachedLength,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tdefault: {\n\t\t\t\t\tthrow new Error(`Invalid op type`);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (newOp && resetOp.type === MergeTreeDeltaType.OBLITERATE) {\n\t\t\t\tsegment.segmentGroups.enqueue(obliterateSegmentGroup);\n\n\t\t\t\tconst first = opList[0];\n\n\t\t\t\tif (\n\t\t\t\t\t!!first &&\n\t\t\t\t\tfirst.pos2 !== undefined &&\n\t\t\t\t\tfirst.type !== MergeTreeDeltaType.OBLITERATE_SIDED &&\n\t\t\t\t\tnewOp.type !== MergeTreeDeltaType.OBLITERATE_SIDED\n\t\t\t\t) {\n\t\t\t\t\tfirst.pos2 += newOp.pos2! - newOp.pos1!;\n\t\t\t\t} else {\n\t\t\t\t\topList.push(newOp);\n\t\t\t\t}\n\t\t\t} else if (newOp) {\n\t\t\t\tconst newSegmentGroup: SegmentGroup = {\n\t\t\t\t\tsegments: [],\n\t\t\t\t\tlocalSeq: segmentGroup.localSeq,\n\t\t\t\t\trefSeq: this.getCollabWindow().currentSeq,\n\t\t\t\t};\n\t\t\t\tsegment.segmentGroups.enqueue(newSegmentGroup);\n\n\t\t\t\tthis._mergeTree.pendingSegments.push(newSegmentGroup);\n\n\t\t\t\topList.push(newOp);\n\t\t\t}\n\t\t}\n\n\t\tif (\n\t\t\tresetOp.type === MergeTreeDeltaType.OBLITERATE &&\n\t\t\tobliterateSegmentGroup.segments.length > 0\n\t\t) {\n\t\t\tthis._mergeTree.pendingSegments.push(obliterateSegmentGroup);\n\t\t}\n\n\t\treturn opList;\n\t}\n\n\tprivate applyRemoteOp(opArgs: IMergeTreeDeltaRemoteOpArgs): void {\n\t\tconst op = opArgs.op;\n\t\tconst msg = opArgs.sequencedMessage;\n\t\tthis.getOrAddShortClientIdFromMessage(msg);\n\t\tswitch (op.type) {\n\t\t\tcase MergeTreeDeltaType.INSERT: {\n\t\t\t\tthis.applyInsertOp(opArgs);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase MergeTreeDeltaType.REMOVE: {\n\t\t\t\tthis.applyRemoveRangeOp(opArgs);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase MergeTreeDeltaType.ANNOTATE: {\n\t\t\t\tthis.applyAnnotateRangeOp(opArgs);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase MergeTreeDeltaType.OBLITERATE:\n\t\t\tcase MergeTreeDeltaType.OBLITERATE_SIDED: {\n\t\t\t\tthis.applyObliterateRangeOp(opArgs);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase MergeTreeDeltaType.GROUP: {\n\t\t\t\tfor (const memberOp of op.ops) {\n\t\t\t\t\tthis.applyRemoteOp({\n\t\t\t\t\t\top: memberOp,\n\t\t\t\t\t\tgroupOp: op,\n\t\t\t\t\t\tsequencedMessage: msg,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tdefault: {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic applyStashedOp(op: IMergeTreeOp): void {\n\t\tswitch (op.type) {\n\t\t\tcase MergeTreeDeltaType.INSERT: {\n\t\t\t\tthis.applyInsertOp({ op });\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase MergeTreeDeltaType.REMOVE: {\n\t\t\t\tthis.applyRemoveRangeOp({ op });\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase MergeTreeDeltaType.ANNOTATE: {\n\t\t\t\tthis.applyAnnotateRangeOp({ op });\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase MergeTreeDeltaType.OBLITERATE_SIDED:\n\t\t\tcase MergeTreeDeltaType.OBLITERATE: {\n\t\t\t\tthis.applyObliterateRangeOp({ op });\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase MergeTreeDeltaType.GROUP: {\n\t\t\t\top.ops.map((o) => this.applyStashedOp(o));\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tdefault: {\n\t\t\t\tunreachableCase(op, \"unrecognized op type\");\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic applyMsg(msg: ISequencedDocumentMessage, local: boolean = false): void {\n\t\t// Ensure client ID is registered\n\t\tthis.getOrAddShortClientIdFromMessage(msg);\n\t\t// Apply if an operation message\n\t\tif (msg.type === MessageType.Operation) {\n\t\t\tconst opArgs: IMergeTreeDeltaRemoteOpArgs = {\n\t\t\t\top: msg.contents as IMergeTreeOp,\n\t\t\t\tsequencedMessage: msg,\n\t\t\t};\n\t\t\tif (opArgs.sequencedMessage?.clientId === this.longClientId || local) {\n\t\t\t\tthis.ackPendingSegment(opArgs);\n\t\t\t} else {\n\t\t\t\tthis.applyRemoteOp(opArgs);\n\t\t\t}\n\t\t}\n\n\t\tconst min = Math.min(\n\t\t\tthis.getMinInFlightRefSeq() ?? Number.POSITIVE_INFINITY,\n\t\t\tmsg.minimumSequenceNumber,\n\t\t);\n\t\tthis.updateSeqNumbers(min, msg.sequenceNumber);\n\t}\n\n\tprivate updateSeqNumbers(min: number, seq: number): void {\n\t\tconst collabWindow = this.getCollabWindow();\n\t\t// Equal is fine here due to SharedSegmentSequence<>.snapshotContent() potentially updating with same #\n\t\tassert(\n\t\t\tcollabWindow.currentSeq <= seq,\n\t\t\t0x038 /* \"Incoming op sequence# < local collabWindow's currentSequence#\" */,\n\t\t);\n\t\tcollabWindow.currentSeq = seq;\n\t\tassert(min <= seq, 0x039 /* \"Incoming op sequence# < minSequence#\" */);\n\t\tthis.updateMinSeq(min);\n\t}\n\n\t/**\n\t * Resolves a remote client's position against the local sequence\n\t * and returns the remote client's position relative to the local\n\t * sequence\n\t * @param remoteClientPosition - The remote client's position to resolve\n\t * @param remoteClientRefSeq - The reference sequence number of the remote client\n\t * @param remoteClientId - The client id of the remote client\n\t */\n\tpublic resolveRemoteClientPosition(\n\t\tremoteClientPosition: number,\n\t\tremoteClientRefSeq: number,\n\t\tremoteClientId: string,\n\t): number | undefined {\n\t\tconst shortRemoteClientId = this.getOrAddShortClientId(remoteClientId);\n\t\treturn this._mergeTree.resolveRemoteClientPosition(\n\t\t\tremoteClientPosition,\n\t\t\tremoteClientRefSeq,\n\t\t\tshortRemoteClientId,\n\t\t);\n\t}\n\n\tprivate lastNormalizationRefSeq = 0;\n\n\t// eslint-disable-next-line import/no-deprecated\n\tprivate pendingRebase: DoublyLinkedList<SegmentGroup> | undefined;\n\n\t/**\n\t * Given a pending operation and segment group, regenerate the op, so it\n\t * can be resubmitted\n\t * @param resetOp - The op to reset\n\t * @param segmentGroup - The segment group associated with the op\n\t */\n\tpublic regeneratePendingOp(\n\t\tresetOp: IMergeTreeOp,\n\t\t// eslint-disable-next-line import/no-deprecated\n\t\tsegmentGroup: SegmentGroup | SegmentGroup[],\n\t): IMergeTreeOp {\n\t\tif (this.pendingRebase === undefined || this.pendingRebase.empty) {\n\t\t\tlet firstGroup: SegmentGroup;\n\t\t\tif (Array.isArray(segmentGroup)) {\n\t\t\t\tif (segmentGroup.length === 0) {\n\t\t\t\t\t// sometimes we rebase to an empty op\n\t\t\t\t\t// eslint-disable-next-line import/no-deprecated\n\t\t\t\t\treturn createGroupOp();\n\t\t\t\t}\n\t\t\t\tfirstGroup = segmentGroup[0];\n\t\t\t} else {\n\t\t\t\tfirstGroup = segmentGroup;\n\t\t\t}\n\t\t\tconst firstGroupNode = this._mergeTree.pendingSegments.find(\n\t\t\t\t(node) => node.data === firstGroup,\n\t\t\t);\n\t\t\tassert(\n\t\t\t\tfirstGroupNode !== undefined,\n\t\t\t\t0x70e /* segment group must exist in pending list */,\n\t\t\t);\n\t\t\tthis.pendingRebase = this._mergeTree.pendingSegments.splice(firstGroupNode);\n\t\t}\n\n\t\tconst rebaseTo = this.getCollabWindow().currentSeq;\n\t\tif (rebaseTo !== this.lastNormalizationRefSeq) {\n\t\t\tthis.emit(\"normalize\", this);\n\t\t\tthis._mergeTree.normalizeSegmentsOnRebase();\n\t\t\tthis.lastNormalizationRefSeq = rebaseTo;\n\t\t}\n\n\t\tconst opList: IMergeTreeDeltaOp[] = [];\n\t\tif (resetOp.type === MergeTreeDeltaType.GROUP) {\n\t\t\tif (Array.isArray(segmentGroup)) {\n\t\t\t\tassert(\n\t\t\t\t\tresetOp.ops.length === segmentGroup.length,\n\t\t\t\t\t0x03a /* \"Number of ops in 'resetOp' must match the number of segment groups provided.\" */,\n\t\t\t\t);\n\n\t\t\t\tfor (let i = 0; i < resetOp.ops.length; i++) {\n\t\t\t\t\topList.push(...this.resetPendingDeltaToOps(resetOp.ops[i], segmentGroup[i]));\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// A group op containing a single op will pass a direct reference to 'segmentGroup'\n\t\t\t\t// rather than an array of segment groups. (See 'peekPendingSegmentGroups()')\n\t\t\t\tassert(\n\t\t\t\t\tresetOp.ops.length === 1,\n\t\t\t\t\t0x03b /* \"Number of ops in 'resetOp' must match the number of segment groups provided.\" */,\n\t\t\t\t);\n\t\t\t\topList.push(...this.resetPendingDeltaToOps(resetOp.ops[0], segmentGroup));\n\t\t\t}\n\t\t} else {\n\t\t\tassert(\n\t\t\t\t(resetOp.type as unknown) !== MergeTreeDeltaType.GROUP,\n\t\t\t\t0x03c /* \"Reset op has 'group' delta type!\" */,\n\t\t\t);\n\t\t\tassert(\n\t\t\t\t!Array.isArray(segmentGroup),\n\t\t\t\t0x03d /* \"segmentGroup is array rather than singleton!\" */,\n\t\t\t);\n\t\t\topList.push(...this.resetPendingDeltaToOps(resetOp, segmentGroup));\n\t\t}\n\t\t// eslint-disable-next-line import/no-deprecated\n\t\treturn opList.length === 1 ? opList[0] : createGroupOp(...opList);\n\t}\n\n\t// eslint-disable-next-line import/no-deprecated\n\tpublic createTextHelper(): IMergeTreeTextHelper {\n\t\treturn new MergeTreeTextHelper(this._mergeTree);\n\t}\n\n\tpublic summarize(\n\t\truntime: IFluidDataStoreRuntime,\n\t\thandle: IFluidHandle,\n\t\tserializer: IFluidSerializer,\n\t\tcatchUpMsgs: ISequencedDocumentMessage[],\n\t): ISummaryTreeWithStats {\n\t\tconst deltaManager = toDeltaManagerInternal(runtime.deltaManager);\n\t\tconst minSeq = deltaManager.minimumSequenceNumber;\n\n\t\t// Catch up to latest MSN, if we have not had a chance to do it.\n\t\t// Required for case where FluidDataStoreRuntime.attachChannel()\n\t\t// generates summary right after loading data store.\n\n\t\tthis.updateSeqNumbers(minSeq, deltaManager.lastSequenceNumber);\n\n\t\t// One of the summaries (from SPO) I observed to have chunk.chunkSequenceNumber > minSeq!\n\t\t// Not sure why - need to catch it sooner\n\t\tassert(\n\t\t\tthis.getCollabWindow().minSeq === minSeq,\n\t\t\t0x03e /* \"minSeq mismatch between collab window and delta manager!\" */,\n\t\t);\n\n\t\t// Must continue to support legacy\n\t\t// (See https://github.com/microsoft/FluidFramework/issues/84)\n\t\tif (this._mergeTree.options?.newMergeTreeSnapshotFormat === true) {\n\t\t\tassert(\n\t\t\t\tcatchUpMsgs === undefined || catchUpMsgs.length === 0,\n\t\t\t\t0x03f /* \"New format should not emit catchup ops\" */,\n\t\t\t);\n\t\t\tconst snap = new SnapshotV1(this._mergeTree, this.logger, (id) =>\n\t\t\t\tthis.getLongClientId(id),\n\t\t\t);\n\t\t\tsnap.extractSync();\n\t\t\treturn snap.emit(serializer, handle);\n\t\t} else {\n\t\t\tconst snap = new SnapshotLegacy(this._mergeTree, this.logger);\n\t\t\tsnap.extractSync();\n\t\t\treturn snap.emit(catchUpMsgs, serializer, handle);\n\t\t}\n\t}\n\n\tpublic async load(\n\t\truntime: IFluidDataStoreRuntime,\n\t\tstorage: IChannelStorageService,\n\t\tserializer: IFluidSerializer,\n\t): Promise<{ catchupOpsP: Promise<ISequencedDocumentMessage[]> }> {\n\t\tconst loader = new SnapshotLoader(runtime, this, this._mergeTree, this.logger, serializer);\n\n\t\treturn loader.initialize(storage);\n\t}\n\n\tprivate getLocalSequenceNumber(): number {\n\t\tconst segWindow = this.getCollabWindow();\n\t\treturn segWindow.collaborating ? UnassignedSequenceNumber : UniversalSequenceNumber;\n\t}\n\n\t// eslint-disable-next-line import/no-deprecated\n\tlocalTransaction(groupOp: IMergeTreeGroupMsg): void {\n\t\tfor (const op of groupOp.ops) {\n\t\t\tconst opArgs: IMergeTreeDeltaOpArgs = {\n\t\t\t\top,\n\t\t\t\tgroupOp,\n\t\t\t};\n\t\t\tswitch (op.type) {\n\t\t\t\tcase MergeTreeDeltaType.INSERT: {\n\t\t\t\t\tthis.applyInsertOp(opArgs);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase MergeTreeDeltaType.ANNOTATE: {\n\t\t\t\t\tthis.applyAnnotateRangeOp(opArgs);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase MergeTreeDeltaType.REMOVE: {\n\t\t\t\t\tthis.applyRemoveRangeOp(opArgs);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase MergeTreeDeltaType.OBLITERATE_SIDED:\n\t\t\t\tcase MergeTreeDeltaType.OBLITERATE: {\n\t\t\t\t\tthis.applyObliterateRangeOp(opArgs);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tdefault: {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tupdateMinSeq(minSeq: number): void {\n\t\tthis._mergeTree.setMinSeq(minSeq);\n\t}\n\n\tgetContainingSegment<T extends ISegment>(\n\t\tpos: number,\n\t\tsequenceArgs?: Pick<ISequencedDocumentMessage, \"referenceSequenceNumber\" | \"clientId\">,\n\t\tlocalSeq?: number,\n\t): {\n\t\tsegment: T | undefined;\n\t\toffset: number | undefined;\n\t} {\n\t\tconst { referenceSequenceNumber, clientId } =\n\t\t\tthis.getClientSequenceArgsForMessage(sequenceArgs);\n\t\treturn this._mergeTree.getContainingSegment<T>(\n\t\t\tpos,\n\t\t\treferenceSequenceNumber,\n\t\t\tclientId,\n\t\t\tlocalSeq,\n\t\t);\n\t}\n\n\tgetPropertiesAtPosition(pos: number): PropertySet | undefined {\n\t\tlet propertiesAtPosition: PropertySet | undefined;\n\t\tconst segoff = this.getContainingSegment(pos);\n\t\tconst seg = segoff.segment;\n\t\tif (seg) {\n\t\t\tpropertiesAtPosition = seg.properties;\n\t\t}\n\t\treturn propertiesAtPosition;\n\t}\n\n\tgetRangeExtentsOfPosition(pos: number): {\n\t\tposStart: number | undefined;\n\t\tposAfterEnd: number | undefined;\n\t} {\n\t\tlet posStart: number | undefined;\n\t\tlet posAfterEnd: number | undefined;\n\n\t\tconst segoff = this.getContainingSegment(pos);\n\t\tconst seg = segoff.segment;\n\t\tif (seg) {\n\t\t\tposStart = this.getPosition(seg);\n\t\t\tposAfterEnd = posStart + seg.cachedLength;\n\t\t}\n\t\treturn { posStart, posAfterEnd };\n\t}\n\n\tgetCurrentSeq(): number {\n\t\treturn this.getCollabWindow().currentSeq;\n\t}\n\n\tgetClientId(): number {\n\t\treturn this.getCollabWindow().clientId;\n\t}\n\n\tgetLength(): number {\n\t\treturn this._mergeTree.length ?? 0;\n\t}\n\n\tstartOrUpdateCollaboration(\n\t\tlongClientId: string | undefined,\n\t\tminSeq = 0,\n\t\tcurrentSeq = 0,\n\t): void {\n\t\t// we should always have a client id if we are collaborating\n\t\t// if the client id is undefined we are likely bound to a detached\n\t\t// container, so we should keep going in local mode. once\n\t\t// the container attaches this will be called again on connect with the\n\t\t// client id\n\t\tif (longClientId !== undefined) {\n\t\t\tif (this.longClientId === undefined) {\n\t\t\t\tthis.longClientId = longClientId;\n\t\t\t\tthis.addLongClientId(this.longClientId);\n\t\t\t\tthis._mergeTree.startCollaboration(\n\t\t\t\t\tthis.getShortClientId(this.longClientId),\n\t\t\t\t\tminSeq,\n\t\t\t\t\tcurrentSeq,\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tconst oldClientId = this.longClientId;\n\t\t\t\tconst oldData = this.clientNameToIds.get(oldClientId)!.data;\n\t\t\t\tthis.longClientId = longClientId;\n\t\t\t\tthis.clientNameToIds.put(longClientId, oldData);\n\t\t\t\tthis.shortClientIdMap[oldData] = longClientId;\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Searches a string for the nearest marker in either direction to a given start position.\n\t * The search will include the start position, so markers at the start position are valid\n\t * results of the search. Makes use of block-accelerated search functions for log(n) complexity.\n\t *\n\t * @param startPos - Position at which to start the search\n\t * @param markerLabel - Label of the marker to search for\n\t * @param forwards - Whether the desired marker comes before (false) or after (true) `startPos`\n\t */\n\tsearchForMarker(startPos: number, markerLabel: string, forwards = true): Marker | undefined {\n\t\tconst clientId = this.getClientId();\n\t\treturn this._mergeTree.searchForMarker(startPos, clientId, markerLabel, forwards);\n\t}\n}\n"]}
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\n/* eslint-disable @typescript-eslint/no-non-null-assertion */\n\nimport { TypedEventEmitter } from \"@fluid-internal/client-utils\";\nimport { type IEventThisPlaceHolder, IFluidHandle } from \"@fluidframework/core-interfaces\";\nimport { assert, unreachableCase, isObject } from \"@fluidframework/core-utils/internal\";\nimport {\n\tIFluidDataStoreRuntime,\n\tIChannelStorageService,\n} from \"@fluidframework/datastore-definitions/internal\";\nimport {\n\tMessageType,\n\tISequencedDocumentMessage,\n} from \"@fluidframework/driver-definitions/internal\";\nimport { ISummaryTreeWithStats } from \"@fluidframework/runtime-definitions/internal\";\nimport { toDeltaManagerInternal } from \"@fluidframework/runtime-utils/internal\";\nimport { IFluidSerializer } from \"@fluidframework/shared-object-base/internal\";\nimport {\n\tITelemetryLoggerExt,\n\tLoggingError,\n\tUsageError,\n} from \"@fluidframework/telemetry-utils/internal\";\n\nimport { MergeTreeTextHelper } from \"./MergeTreeTextHelper.js\";\nimport { DoublyLinkedList, RedBlackTree } from \"./collections/index.js\";\nimport {\n\tNonCollabClient,\n\tUnassignedSequenceNumber,\n\tUniversalSequenceNumber,\n} from \"./constants.js\";\nimport { LocalReferencePosition, SlidingPreference } from \"./localReference.js\";\nimport {\n\tMergeTree,\n\terrorIfOptionNotTrue,\n\ttype IMergeTreeOptionsInternal,\n} from \"./mergeTree.js\";\nimport type {\n\tIMergeTreeClientSequenceArgs,\n\tIMergeTreeDeltaCallbackArgs,\n\tIMergeTreeDeltaOpArgs,\n\tIMergeTreeMaintenanceCallbackArgs,\n} from \"./mergeTreeDeltaCallback.js\";\nimport { walkAllChildSegments } from \"./mergeTreeNodeWalk.js\";\nimport {\n\tCollaborationWindow,\n\tISegment,\n\tISegmentAction,\n\tISegmentPrivate,\n\tMarker,\n\tSegmentGroup,\n\tcompareStrings,\n\tisSegmentLeaf,\n} from \"./mergeTreeNodes.js\";\nimport {\n\tcreateAdjustRangeOp,\n\tcreateAnnotateMarkerOp,\n\tcreateAnnotateRangeOp,\n\t// eslint-disable-next-line import/no-deprecated\n\tcreateGroupOp,\n\tcreateInsertSegmentOp,\n\tcreateObliterateRangeOp,\n\tcreateObliterateRangeOpSided,\n\tcreateRemoveRangeOp,\n} from \"./opBuilder.js\";\nimport {\n\tIJSONSegment,\n\tIMergeTreeAnnotateMsg,\n\tIMergeTreeDeltaOp,\n\t// eslint-disable-next-line import/no-deprecated\n\tIMergeTreeGroupMsg,\n\tIMergeTreeInsertMsg,\n\t// eslint-disable-next-line import/no-deprecated\n\tIMergeTreeObliterateMsg,\n\tIMergeTreeOp,\n\tIMergeTreeRemoveMsg,\n\tIRelativePosition,\n\tMergeTreeDeltaType,\n\tReferenceType,\n\ttype AdjustParams,\n\ttype IMergeTreeAnnotateAdjustMsg,\n\ttype IMergeTreeObliterateSidedMsg,\n} from \"./ops.js\";\nimport { PropertySet, type MapLike } from \"./properties.js\";\nimport { DetachedReferencePosition, ReferencePosition } from \"./referencePositions.js\";\nimport {\n\tisInserted,\n\tisMoved,\n\tisRemoved,\n\toverwriteInfo,\n\ttoMoveInfo,\n\ttype IInsertionInfo,\n} from \"./segmentInfos.js\";\nimport { Side, type InteriorSequencePlace } from \"./sequencePlace.js\";\nimport { SnapshotLoader } from \"./snapshotLoader.js\";\nimport { SnapshotV1 } from \"./snapshotV1.js\";\nimport { SnapshotLegacy } from \"./snapshotlegacy.js\";\nimport { IMergeTreeTextHelper } from \"./textSegment.js\";\n\ntype IMergeTreeDeltaRemoteOpArgs = Omit<IMergeTreeDeltaOpArgs, \"sequencedMessage\"> &\n\tRequired<Pick<IMergeTreeDeltaOpArgs, \"sequencedMessage\">>;\n\n/**\n * A range [start, end)\n * @internal\n */\nexport interface IIntegerRange {\n\tstart: number;\n\tend: number;\n}\n\n/**\n * Emitted before this client's merge-tree normalizes its segments on reconnect, potentially\n * ordering them. Useful for DDS-like consumers built atop the merge-tree to compute any information\n * they need for rebasing their ops on reconnection.\n * @internal\n */\nexport interface IClientEvents {\n\t(event: \"normalize\", listener: (target: IEventThisPlaceHolder) => void): void;\n\t(\n\t\tevent: \"delta\",\n\t\tlistener: (\n\t\t\topArgs: IMergeTreeDeltaOpArgs,\n\t\t\tdeltaArgs: IMergeTreeDeltaCallbackArgs,\n\t\t\ttarget: IEventThisPlaceHolder,\n\t\t) => void,\n\t): void;\n\t(\n\t\tevent: \"maintenance\",\n\t\tlistener: (\n\t\t\targs: IMergeTreeMaintenanceCallbackArgs,\n\t\t\tdeltaArgs: IMergeTreeDeltaOpArgs | undefined,\n\t\t\ttarget: IEventThisPlaceHolder,\n\t\t) => void,\n\t): void;\n}\n\nconst UNBOUND_SEGMENT_ERROR = \"The provided segment is not bound to this DDS.\";\n\n/**\n * This class encapsulates a merge-tree, and provides a local client specific view over it and\n * the capability to modify it as the local client. Additionally it provides\n * binding for processing remote ops on the encapsulated merge tree, and projects local and remote events\n * caused by all modification to the underlying merge-tree.\n *\n * @internal\n */\nexport class Client extends TypedEventEmitter<IClientEvents> {\n\tpublic longClientId: string | undefined;\n\n\tprivate readonly _mergeTree: MergeTree;\n\n\tprivate readonly clientNameToIds = new RedBlackTree<string, number>(compareStrings);\n\tprivate readonly shortClientIdMap: string[] = [];\n\n\t/**\n\t * @param specToSegment - Rehydrates a segment from its JSON representation\n\t * @param logger - Telemetry logger for diagnostics\n\t * @param options - Options for this client. See {@link IMergeTreeOptions} for details.\n\t * @param getMinInFlightRefSeq - Upon applying a message (see {@link Client.applyMsg}), client purges collab-window information which\n\t * is no longer necessary based on that message's minimum sequence number.\n\t * However, if the user of this client has in-flight messages which refer to positions in this Client,\n\t * they may wish to preserve additional merge information.\n\t * The effective minimum sequence number will be the minimum of the message's minimumSequenceNumber and the result of this function.\n\t * If this function returns undefined, the message's minimumSequenceNumber will be used.\n\t *\n\t * @privateRemarks\n\t * - Passing specToSegment would be unnecessary if Client were merged with SharedSegmentSequence\n\t * - AB#6866 tracks a more unified approach to collab window min seq handling.\n\t */\n\tconstructor(\n\t\tpublic readonly specToSegment: (spec: IJSONSegment) => ISegment,\n\t\tpublic readonly logger: ITelemetryLoggerExt,\n\t\toptions?: IMergeTreeOptionsInternal & PropertySet,\n\t\tprivate readonly getMinInFlightRefSeq: () => number | undefined = (): undefined =>\n\t\t\tundefined,\n\t) {\n\t\tsuper();\n\t\tthis._mergeTree = new MergeTree(options);\n\t\tthis._mergeTree.mergeTreeDeltaCallback = (opArgs, deltaArgs): void => {\n\t\t\tthis.emit(\"delta\", opArgs, deltaArgs, this);\n\t\t};\n\t\tthis._mergeTree.mergeTreeMaintenanceCallback = (args, opArgs): void => {\n\t\t\tthis.emit(\"maintenance\", args, opArgs, this);\n\t\t};\n\n\t\tif (options?.attribution?.track) {\n\t\t\tconst policy = this._mergeTree?.attributionPolicy;\n\t\t\tif (policy === undefined) {\n\t\t\t\tthrow new UsageError(\n\t\t\t\t\t\"Attribution policy must be provided when attribution tracking is requested.\",\n\t\t\t\t);\n\t\t\t}\n\t\t\tpolicy.attach(this);\n\t\t}\n\t}\n\n\t/**\n\t * The merge tree maintains a queue of segment groups for each local operation.\n\t * These segment groups track segments modified by an operation.\n\t * This method peeks the tail of that queue, and returns the segments groups there.\n\t * It is used to get the segment group(s) for the previous operations.\n\t * @param count - The number segment groups to get peek from the tail of the queue. Default 1.\n\t */\n\n\tpublic peekPendingSegmentGroups(count: number = 1): unknown {\n\t\tconst pending = this._mergeTree.pendingSegments;\n\t\tlet node = pending?.last;\n\t\tif (count === 1 || pending === undefined) {\n\t\t\treturn node?.data;\n\t\t}\n\n\t\tconst taken: SegmentGroup[] = Array.from({ length: Math.min(count, pending.length) });\n\t\tfor (let i = taken.length - 1; i >= 0; i--) {\n\t\t\ttaken[i] = node!.data;\n\t\t\tnode = node!.prev;\n\t\t}\n\t\treturn taken;\n\t}\n\n\t/**\n\t * Annotates the markers with the provided properties\n\t * @param marker - The marker to annotate\n\t * @param props - The properties to annotate the marker with\n\t * @returns The annotate op if valid, otherwise undefined\n\t */\n\tpublic annotateMarker(\n\t\tmarker: Marker,\n\t\tprops: PropertySet,\n\t): IMergeTreeAnnotateMsg | undefined {\n\t\tconst annotateOp = createAnnotateMarkerOp(marker, props)!;\n\t\tthis.applyAnnotateRangeOp({ op: annotateOp });\n\t\treturn annotateOp;\n\t}\n\n\t/**\n\t * Annotates the range with the provided properties\n\t * @param start - The inclusive start position of the range to annotate\n\t * @param end - The exclusive end position of the range to annotate\n\t * @param props - The properties to annotate the range with\n\t * @returns The annotate op if valid, otherwise undefined\n\t */\n\tpublic annotateRangeLocal(\n\t\tstart: number,\n\t\tend: number,\n\t\tprops: PropertySet,\n\t): IMergeTreeAnnotateMsg | undefined {\n\t\tconst annotateOp = createAnnotateRangeOp(start, end, props);\n\t\tthis.applyAnnotateRangeOp({ op: annotateOp });\n\t\treturn annotateOp;\n\t}\n\n\t/**\n\t * adjusts a value\n\t */\n\tpublic annotateAdjustRangeLocal(\n\t\tstart: number,\n\t\tend: number,\n\t\tadjust: MapLike<AdjustParams>,\n\t): IMergeTreeAnnotateAdjustMsg {\n\t\tconst annotateOp = createAdjustRangeOp(start, end, adjust);\n\n\t\tfor (const [key, value] of Object.entries(adjust)) {\n\t\t\tif (value.min !== undefined && value.max !== undefined && value.min > value.max) {\n\t\t\t\tthrow new UsageError(`min is greater than max for ${key}`);\n\t\t\t}\n\t\t}\n\n\t\tthis.applyAnnotateRangeOp({ op: annotateOp });\n\t\treturn annotateOp;\n\t}\n\n\t/**\n\t * Removes the range\n\t *\n\t * @param start - The inclusive start of the range to remove\n\t * @param end - The exclusive end of the range to remove\n\t */\n\tpublic removeRangeLocal(start: number, end: number): IMergeTreeRemoveMsg {\n\t\tconst removeOp = createRemoveRangeOp(start, end);\n\t\tthis.applyRemoveRangeOp({ op: removeOp });\n\t\treturn removeOp;\n\t}\n\n\t/**\n\t * Obliterates the range. This is similar to removing the range, but also\n\t * includes any concurrently inserted content.\n\t *\n\t * @param start - The start of the range to obliterate. Inclusive is side is Before (default).\n\t * @param end - The end of the range to obliterate. Exclusive is side is After\n\t * (default is to be after the last included character, but number index is exclusive).\n\t */\n\tpublic obliterateRangeLocal(\n\t\tstart: number | InteriorSequencePlace,\n\t\tend: number | InteriorSequencePlace,\n\t\t// eslint-disable-next-line import/no-deprecated\n\t): IMergeTreeObliterateMsg | IMergeTreeObliterateSidedMsg {\n\t\t// eslint-disable-next-line import/no-deprecated\n\t\tlet obliterateOp: IMergeTreeObliterateMsg | IMergeTreeObliterateSidedMsg;\n\t\tif (this._mergeTree.options?.mergeTreeEnableSidedObliterate) {\n\t\t\tobliterateOp = createObliterateRangeOpSided(start, end);\n\t\t} else {\n\t\t\tassert(\n\t\t\t\ttypeof start === \"number\" && typeof end === \"number\",\n\t\t\t\t0xa42 /* Start and end must be numbers if mergeTreeEnableSidedObliterate is not enabled. */,\n\t\t\t);\n\t\t\tobliterateOp = createObliterateRangeOp(start, end);\n\t\t}\n\t\tthis.applyObliterateRangeOp({ op: obliterateOp });\n\t\treturn obliterateOp;\n\t}\n\n\t/**\n\t * Create and insert a segment at the specified position.\n\t * @param pos - The position to insert the segment at\n\t * @param segment - The segment to insert\n\t */\n\tpublic insertSegmentLocal(pos: number, segment: ISegment): IMergeTreeInsertMsg | undefined {\n\t\tif (segment.cachedLength <= 0) {\n\t\t\treturn undefined;\n\t\t}\n\t\tconst insertOp = createInsertSegmentOp(pos, segment);\n\t\tthis.applyInsertOp({ op: insertOp });\n\t\treturn insertOp;\n\t}\n\n\t/**\n\t * Create and insert a segment at the specified reference position.\n\t * @param refPos - The reference position to insert the segment at\n\t * @param segment - The segment to insert\n\t */\n\tpublic insertAtReferencePositionLocal(\n\t\trefPos: ReferencePosition,\n\t\tsegment: ISegment,\n\t): IMergeTreeInsertMsg | undefined {\n\t\tconst pos = this._mergeTree.referencePositionToLocalPosition(\n\t\t\trefPos,\n\t\t\tthis.getCurrentSeq(),\n\t\t\tthis.getClientId(),\n\t\t);\n\n\t\tif (pos === DetachedReferencePosition) {\n\t\t\tthrow new UsageError(\"Cannot insert at detached local reference.\");\n\t\t}\n\t\treturn this.insertSegmentLocal(pos, segment);\n\t}\n\n\tpublic walkSegments<TClientData>(\n\t\thandler: ISegmentAction<TClientData>,\n\t\tstart: number | undefined,\n\t\tend: number | undefined,\n\t\taccum: TClientData,\n\t\tsplitRange?: boolean,\n\t): void;\n\tpublic walkSegments(\n\t\thandler: ISegmentAction<undefined>,\n\t\tstart?: number,\n\t\tend?: number,\n\t\taccum?: undefined,\n\t\tsplitRange?: boolean,\n\t): void;\n\tpublic walkSegments<TClientData>(\n\t\thandler: ISegmentAction<TClientData>,\n\t\tstart: number | undefined,\n\t\tend: number | undefined,\n\t\taccum: TClientData,\n\t\tsplitRange: boolean = false,\n\t): void {\n\t\tthis._mergeTree.mapRange(\n\t\t\thandler,\n\t\t\tthis.getCurrentSeq(),\n\t\t\tthis.getClientId(),\n\t\t\taccum,\n\t\t\tstart,\n\t\t\tend,\n\t\t\tsplitRange,\n\t\t);\n\t}\n\n\tprotected walkAllSegments<TClientData>(\n\t\taction: (segment: ISegment, accum?: TClientData) => boolean,\n\t\taccum?: TClientData,\n\t): boolean {\n\t\treturn walkAllChildSegments(\n\t\t\tthis._mergeTree.root,\n\t\t\taccum === undefined ? action : (seg): boolean => action(seg, accum),\n\t\t);\n\t}\n\n\t/**\n\t * Serializes the data required for garbage collection. The IFluidHandles stored in all segments that haven't\n\t * been removed represent routes to other objects. We serialize the data in these segments using the passed in\n\t * serializer which keeps track of all serialized handles.\n\t */\n\tpublic serializeGCData(\n\t\thandle: IFluidHandle,\n\t\thandleCollectingSerializer: IFluidSerializer,\n\t): void {\n\t\tlet localInserts = 0;\n\t\tlet localRemoves = 0;\n\t\twalkAllChildSegments(this._mergeTree.root, (seg: ISegmentPrivate) => {\n\t\t\tif (isInserted(seg) && seg.seq === UnassignedSequenceNumber) {\n\t\t\t\tlocalInserts++;\n\t\t\t}\n\t\t\tif (isRemoved(seg) && seg.removedSeq === UnassignedSequenceNumber) {\n\t\t\t\tlocalRemoves++;\n\t\t\t}\n\t\t\t// Only serialize segments that have not been removed.\n\t\t\tif (!isRemoved(seg)) {\n\t\t\t\thandleCollectingSerializer.stringify(seg.clone().toJSONObject(), handle);\n\t\t\t}\n\t\t\treturn true;\n\t\t});\n\n\t\tif (localInserts > 0 || localRemoves > 0) {\n\t\t\tthis.logger.sendErrorEvent({\n\t\t\t\teventName: \"LocalEditsInProcessGCData\",\n\t\t\t\tlocalInserts,\n\t\t\t\tlocalRemoves,\n\t\t\t});\n\t\t}\n\t}\n\n\tpublic getCollabWindow(): CollaborationWindow {\n\t\treturn this._mergeTree.collabWindow;\n\t}\n\n\t/**\n\t * Returns the current position of a segment, and -1 if the segment\n\t * does not exist in this merge tree\n\t * @param segment - The segment to get the position of\n\t */\n\tpublic getPosition(segment: ISegment | undefined, localSeq?: number): number {\n\t\tif (!isSegmentLeaf(segment)) {\n\t\t\treturn -1;\n\t\t}\n\t\treturn this._mergeTree.getPosition(\n\t\t\tsegment,\n\t\t\tthis.getCurrentSeq(),\n\t\t\tthis.getClientId(),\n\t\t\tlocalSeq,\n\t\t);\n\t}\n\n\t/**\n\t * Creates a `LocalReferencePosition` on this client. If the refType does not include ReferenceType.Transient,\n\t * the returned reference will be added to the localRefs on the provided segment.\n\t * @param segment - Segment to add the local reference on\n\t * @param offset - Offset on the segment at which to place the local reference\n\t * @param refType - ReferenceType for the created local reference\n\t * @param properties - PropertySet to place on the created local reference\n\t * @param canSlideToEndpoint - Whether or not the created local reference can\n\t * slide onto one of the special endpoint segments denoting the position\n\t * before the start of or after the end of the tree\n\t */\n\tpublic createLocalReferencePosition(\n\t\tsegment: ISegment | \"start\" | \"end\",\n\t\toffset: number | undefined,\n\t\trefType: ReferenceType,\n\t\tproperties: PropertySet | undefined,\n\t\tslidingPreference?: SlidingPreference,\n\t\tcanSlideToEndpoint?: boolean,\n\t): LocalReferencePosition {\n\t\tif (!isSegmentLeaf(segment) && typeof segment !== \"string\") {\n\t\t\tthrow new UsageError(UNBOUND_SEGMENT_ERROR);\n\t\t}\n\t\treturn this._mergeTree.createLocalReferencePosition(\n\t\t\tsegment,\n\t\t\toffset ?? 0,\n\t\t\trefType,\n\t\t\tproperties,\n\t\t\tslidingPreference,\n\t\t\tcanSlideToEndpoint,\n\t\t);\n\t}\n\n\t/**\n\t * Removes a `LocalReferencePosition` from this client.\n\t */\n\tpublic removeLocalReferencePosition(\n\t\tlref: LocalReferencePosition,\n\t): LocalReferencePosition | undefined {\n\t\treturn this._mergeTree.removeLocalReferencePosition(lref);\n\t}\n\n\t/**\n\t * Resolves a `ReferencePosition` into a character position using this client's perspective.\n\t *\n\t * Reference positions that point to a character that has been removed will\n\t * always return the position of the nearest non-removed character, regardless\n\t * of {@link ReferenceType}. To handle this case specifically, one may wish\n\t * to look at the segment returned by {@link ReferencePosition.getSegment}.\n\t */\n\tpublic localReferencePositionToPosition(lref: ReferencePosition): number {\n\t\treturn this._mergeTree.referencePositionToLocalPosition(lref);\n\t}\n\n\t/**\n\t * Given a position specified relative to a marker id, lookup the marker\n\t * and convert the position to a character position.\n\t * @param relativePos - Id of marker (may be indirect) and whether position is before or after marker.\n\t */\n\tpublic posFromRelativePos(relativePos: IRelativePosition): number {\n\t\treturn this._mergeTree.posFromRelativePos(relativePos);\n\t}\n\n\tpublic getMarkerFromId(id: string): ISegment | undefined {\n\t\treturn this._mergeTree.getMarkerFromId(id);\n\t}\n\n\t/**\n\t * Revert an op\n\t */\n\tpublic rollback?(op: unknown, localOpMetadata: unknown): void {\n\t\tthis._mergeTree.rollback(op as IMergeTreeDeltaOp, localOpMetadata as SegmentGroup);\n\t}\n\n\tprivate applyObliterateRangeOp(opArgs: IMergeTreeDeltaOpArgs): void {\n\t\tassert(\n\t\t\topArgs.op.type === MergeTreeDeltaType.OBLITERATE ||\n\t\t\t\topArgs.op.type === MergeTreeDeltaType.OBLITERATE_SIDED,\n\t\t\t0x866 /* Unexpected op type on range obliterate! */,\n\t\t);\n\t\tconst op = opArgs.op;\n\t\tconst clientArgs = this.getClientSequenceArgs(opArgs);\n\t\tif (this._mergeTree.options?.mergeTreeEnableSidedObliterate) {\n\t\t\tconst { start, end } = this.getValidSidedRange(op, clientArgs);\n\t\t\tthis._mergeTree.obliterateRange(\n\t\t\t\tstart,\n\t\t\t\tend,\n\t\t\t\tclientArgs.referenceSequenceNumber,\n\t\t\t\tclientArgs.clientId,\n\t\t\t\tclientArgs.sequenceNumber,\n\t\t\t\topArgs,\n\t\t\t);\n\t\t} else {\n\t\t\tassert(\n\t\t\t\top.type === MergeTreeDeltaType.OBLITERATE,\n\t\t\t\t0xa43 /* Unexpected sided obliterate while mergeTreeEnableSidedObliterate is disabled */,\n\t\t\t);\n\t\t\tconst range = this.getValidOpRange(op, clientArgs);\n\t\t\tthis._mergeTree.obliterateRange(\n\t\t\t\trange.start,\n\t\t\t\trange.end,\n\t\t\t\tclientArgs.referenceSequenceNumber,\n\t\t\t\tclientArgs.clientId,\n\t\t\t\tclientArgs.sequenceNumber,\n\t\t\t\topArgs,\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Performs the remove based on the provided op\n\t * @param opArgs - The ops args for the op\n\t */\n\tprivate applyRemoveRangeOp(opArgs: IMergeTreeDeltaOpArgs): void {\n\t\tassert(\n\t\t\topArgs.op.type === MergeTreeDeltaType.REMOVE,\n\t\t\t0x02d /* \"Unexpected op type on range remove!\" */,\n\t\t);\n\t\tconst op = opArgs.op;\n\t\tconst clientArgs = this.getClientSequenceArgs(opArgs);\n\t\tconst range = this.getValidOpRange(op, clientArgs);\n\n\t\tthis._mergeTree.markRangeRemoved(\n\t\t\trange.start,\n\t\t\trange.end,\n\t\t\tclientArgs.referenceSequenceNumber,\n\t\t\tclientArgs.clientId,\n\t\t\tclientArgs.sequenceNumber,\n\t\t\topArgs,\n\t\t);\n\t}\n\n\t/**\n\t * Performs the annotate based on the provided op\n\t * @param opArgs - The ops args for the op\n\t */\n\tprivate applyAnnotateRangeOp(opArgs: IMergeTreeDeltaOpArgs): void {\n\t\tassert(\n\t\t\topArgs.op.type === MergeTreeDeltaType.ANNOTATE,\n\t\t\t0x02e /* \"Unexpected op type on range annotate!\" */,\n\t\t);\n\t\tconst op = opArgs.op;\n\t\tconst clientArgs = this.getClientSequenceArgs(opArgs);\n\t\tconst range = this.getValidOpRange(op, clientArgs);\n\n\t\tthis._mergeTree.annotateRange(\n\t\t\trange.start,\n\t\t\trange.end,\n\t\t\top,\n\t\t\tclientArgs.referenceSequenceNumber,\n\t\t\tclientArgs.clientId,\n\t\t\tclientArgs.sequenceNumber,\n\t\t\topArgs,\n\t\t);\n\t}\n\n\t/**\n\t * Performs the insert based on the provided op\n\t * @param opArgs - The ops args for the op\n\t * @returns True if the insert was applied. False if it could not be.\n\t */\n\tprivate applyInsertOp(opArgs: IMergeTreeDeltaOpArgs): void {\n\t\tassert(\n\t\t\topArgs.op.type === MergeTreeDeltaType.INSERT,\n\t\t\t0x02f /* \"Unexpected op type on range insert!\" */,\n\t\t);\n\t\tconst op = opArgs.op;\n\t\tconst clientArgs = this.getClientSequenceArgs(opArgs);\n\t\tconst range = this.getValidOpRange(op, clientArgs);\n\n\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n\t\tconst segments = [this.specToSegment(op.seg)];\n\n\t\tthis._mergeTree.insertSegments(\n\t\t\trange.start,\n\t\t\tsegments,\n\t\t\tclientArgs.referenceSequenceNumber,\n\t\t\tclientArgs.clientId,\n\t\t\tclientArgs.sequenceNumber,\n\t\t\topArgs,\n\t\t);\n\t}\n\n\t/**\n\t * Returns a valid range for the op, or throws if the range is invalid\n\t * @param op - The op to generate the range for\n\t * @param clientArgs - The client args for the op\n\t * @throws LoggingError if the range is invalid\n\t */\n\tprivate getValidSidedRange(\n\t\t// eslint-disable-next-line import/no-deprecated\n\t\top: IMergeTreeObliterateSidedMsg | IMergeTreeObliterateMsg,\n\t\tclientArgs: IMergeTreeClientSequenceArgs,\n\t): {\n\t\tstart: InteriorSequencePlace;\n\t\tend: InteriorSequencePlace;\n\t} {\n\t\tconst invalidPositions: string[] = [];\n\t\tlet start: InteriorSequencePlace | undefined;\n\t\tlet end: InteriorSequencePlace | undefined;\n\t\tif (op.pos1 === undefined) {\n\t\t\tinvalidPositions.push(\"start\");\n\t\t} else {\n\t\t\tstart =\n\t\t\t\ttypeof op.pos1 === \"object\"\n\t\t\t\t\t? { pos: op.pos1.pos, side: op.pos1.before ? Side.Before : Side.After }\n\t\t\t\t\t: { pos: op.pos1, side: Side.Before };\n\t\t}\n\t\tif (op.pos2 === undefined) {\n\t\t\tinvalidPositions.push(\"end\");\n\t\t} else {\n\t\t\tend =\n\t\t\t\ttypeof op.pos2 === \"object\"\n\t\t\t\t\t? { pos: op.pos2.pos, side: op.pos2.before ? Side.Before : Side.After }\n\t\t\t\t\t: { pos: op.pos2 - 1, side: Side.After };\n\t\t}\n\n\t\t// Validate if local op\n\t\tif (clientArgs.clientId === this.getClientId()) {\n\t\t\tconst length = this._mergeTree.getLength(\n\t\t\t\tthis.getCollabWindow().currentSeq,\n\t\t\t\tthis.getClientId(),\n\t\t\t);\n\t\t\tif (start !== undefined && (start.pos >= length || start.pos < 0)) {\n\t\t\t\t// start out of bounds\n\t\t\t\tinvalidPositions.push(\"start\");\n\t\t\t}\n\t\t\tif (end !== undefined && (end.pos >= length || end.pos < 0)) {\n\t\t\t\tinvalidPositions.push(\"end\");\n\t\t\t}\n\t\t\tif (\n\t\t\t\tstart !== undefined &&\n\t\t\t\tend !== undefined &&\n\t\t\t\t(start.pos > end.pos ||\n\t\t\t\t\t(start.pos === end.pos && start.side !== end.side && start.side === Side.After))\n\t\t\t) {\n\t\t\t\t// end is before start\n\t\t\t\tinvalidPositions.push(\"inverted\");\n\t\t\t}\n\t\t\tif (invalidPositions.length > 0) {\n\t\t\t\tthrow new LoggingError(\"InvalidRange\", {\n\t\t\t\t\tusageError: true,\n\t\t\t\t\tinvalidPositions: invalidPositions.toString(),\n\t\t\t\t\tlength,\n\t\t\t\t\topType: op.type,\n\t\t\t\t\topPos1Relative: op.relativePos1 !== undefined,\n\t\t\t\t\topPos2Relative: op.relativePos2 !== undefined,\n\t\t\t\t\topPos1: JSON.stringify(op.pos1),\n\t\t\t\t\topPos2: JSON.stringify(op.pos2),\n\t\t\t\t\tstart: JSON.stringify(start),\n\t\t\t\t\tend: JSON.stringify(end),\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tassert(\n\t\t\tstart !== undefined && end !== undefined,\n\t\t\t0xa44 /* Missing start or end of range */,\n\t\t);\n\t\treturn { start, end };\n\t}\n\n\t/**\n\t * Returns a valid range for the op, or undefined\n\t * @param op - The op to generate the range for\n\t * @param clientArgs - The client args for the op\n\t */\n\tprivate getValidOpRange(\n\t\top:\n\t\t\t| IMergeTreeAnnotateMsg\n\t\t\t| IMergeTreeAnnotateAdjustMsg\n\t\t\t| IMergeTreeInsertMsg\n\t\t\t| IMergeTreeRemoveMsg\n\t\t\t// eslint-disable-next-line import/no-deprecated\n\t\t\t| IMergeTreeObliterateMsg,\n\t\tclientArgs: IMergeTreeClientSequenceArgs,\n\t): IIntegerRange {\n\t\tlet start: number | undefined = op.pos1;\n\t\tif (start === undefined && op.relativePos1) {\n\t\t\tstart = this._mergeTree.posFromRelativePos(\n\t\t\t\top.relativePos1,\n\t\t\t\tclientArgs.referenceSequenceNumber,\n\t\t\t\tclientArgs.clientId,\n\t\t\t);\n\t\t}\n\n\t\tlet end: number | undefined = op.pos2;\n\t\tif (end === undefined && op.relativePos2) {\n\t\t\tend = this._mergeTree.posFromRelativePos(\n\t\t\t\top.relativePos2,\n\t\t\t\tclientArgs.referenceSequenceNumber,\n\t\t\t\tclientArgs.clientId,\n\t\t\t);\n\t\t}\n\n\t\t// Validate if local op\n\t\tif (clientArgs.clientId === this.getClientId()) {\n\t\t\tconst length = this.getLength();\n\n\t\t\tconst invalidPositions: string[] = [];\n\n\t\t\t// Validate start position\n\t\t\t//\n\t\t\tif (\n\t\t\t\tstart === undefined ||\n\t\t\t\tstart < 0 ||\n\t\t\t\tstart > length ||\n\t\t\t\t(start === length && op.type !== MergeTreeDeltaType.INSERT)\n\t\t\t) {\n\t\t\t\tinvalidPositions.push(\"start\");\n\t\t\t}\n\t\t\t// Validate end if not insert, or insert has end\n\t\t\tif (\n\t\t\t\t(op.type !== MergeTreeDeltaType.INSERT || end !== undefined) &&\n\t\t\t\t(end === undefined || end <= start!)\n\t\t\t) {\n\t\t\t\tinvalidPositions.push(\"end\");\n\t\t\t}\n\n\t\t\tif (op.type === MergeTreeDeltaType.OBLITERATE && end !== undefined && end > length) {\n\t\t\t\tinvalidPositions.push(\"end\");\n\t\t\t}\n\n\t\t\tif (invalidPositions.length > 0) {\n\t\t\t\tthrow new LoggingError(\"RangeOutOfBounds\", {\n\t\t\t\t\tusageError: true,\n\t\t\t\t\tend,\n\t\t\t\t\tinvalidPositions: invalidPositions.toString(),\n\t\t\t\t\tlength,\n\t\t\t\t\topPos1: op.pos1,\n\t\t\t\t\topPos1Relative: op.relativePos1 !== undefined,\n\t\t\t\t\topPos2: op.pos2,\n\t\t\t\t\topPos2Relative: op.relativePos2 !== undefined,\n\t\t\t\t\topType: op.type,\n\t\t\t\t\tstart,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\t// start and end are guaranteed to be non-null here, otherwise we throw above.\n\t\treturn { start: start!, end: end! };\n\t}\n\n\t/**\n\t * Gets the client args from the op if remote, otherwise uses the local clients info\n\t * @param sequencedMessage - The sequencedMessage to get the client sequence args for\n\t */\n\tprivate getClientSequenceArgsForMessage(\n\t\tsequencedMessage:\n\t\t\t| ISequencedDocumentMessage\n\t\t\t| Pick<ISequencedDocumentMessage, \"referenceSequenceNumber\" | \"clientId\">\n\t\t\t| undefined,\n\t): IMergeTreeClientSequenceArgs {\n\t\t// If there this no sequenced message, then the op is local\n\t\t// and unacked, so use this clients sequenced args\n\t\t//\n\t\tif (sequencedMessage) {\n\t\t\treturn {\n\t\t\t\tclientId: this.getOrAddShortClientIdFromMessage(sequencedMessage),\n\t\t\t\treferenceSequenceNumber: sequencedMessage.referenceSequenceNumber,\n\t\t\t\t// Note: return value satisfies overload signatures despite the cast, as if input argument doesn't contain sequenceNumber,\n\t\t\t\t// return value isn't expected to have it either.\n\t\t\t\tsequenceNumber: (sequencedMessage as ISequencedDocumentMessage).sequenceNumber,\n\t\t\t};\n\t\t} else {\n\t\t\tconst segWindow = this.getCollabWindow();\n\t\t\treturn {\n\t\t\t\tclientId: segWindow.clientId,\n\t\t\t\treferenceSequenceNumber: segWindow.currentSeq,\n\t\t\t\tsequenceNumber: this.getLocalSequenceNumber(),\n\t\t\t};\n\t\t}\n\t}\n\n\t/**\n\t * Gets the client args from the op if remote, otherwise uses the local clients info\n\t * @param opArgs - The op arg to get the client sequence args for\n\t */\n\tprivate getClientSequenceArgs(opArgs: IMergeTreeDeltaOpArgs): IMergeTreeClientSequenceArgs {\n\t\treturn this.getClientSequenceArgsForMessage(opArgs.sequencedMessage);\n\t}\n\n\tprivate ackPendingSegment(opArgs: IMergeTreeDeltaRemoteOpArgs): void {\n\t\tif (opArgs.op.type === MergeTreeDeltaType.GROUP) {\n\t\t\tfor (const memberOp of opArgs.op.ops) {\n\t\t\t\tthis._mergeTree.ackPendingSegment({\n\t\t\t\t\tgroupOp: opArgs.op,\n\t\t\t\t\top: memberOp,\n\t\t\t\t\tsequencedMessage: opArgs.sequencedMessage,\n\t\t\t\t});\n\t\t\t}\n\t\t} else {\n\t\t\tthis._mergeTree.ackPendingSegment(opArgs);\n\t\t}\n\t}\n\n\tgetOrAddShortClientId(longClientId: string): number {\n\t\tif (!this.clientNameToIds.get(longClientId)) {\n\t\t\tthis.addLongClientId(longClientId);\n\t\t}\n\t\treturn this.getShortClientId(longClientId);\n\t}\n\n\tprotected getShortClientId(longClientId: string): number {\n\t\treturn this.clientNameToIds.get(longClientId)!.data;\n\t}\n\n\tgetLongClientId(shortClientId: number): string {\n\t\treturn shortClientId >= 0 ? this.shortClientIdMap[shortClientId] : \"original\";\n\t}\n\n\taddLongClientId(longClientId: string): void {\n\t\tthis.clientNameToIds.put(longClientId, this.shortClientIdMap.length);\n\t\tthis.shortClientIdMap.push(longClientId);\n\t}\n\n\tprivate getOrAddShortClientIdFromMessage(\n\t\tmsg: Pick<ISequencedDocumentMessage, \"clientId\">,\n\t): number {\n\t\treturn this.getOrAddShortClientId(msg.clientId ?? \"server\");\n\t}\n\n\t/**\n\t * During reconnect, we must find the positions to pending segments\n\t * relative to other pending segments. This methods computes that\n\t * position relative to a localSeq. Pending segments above the localSeq\n\t * will be ignored.\n\t *\n\t * @param segment - The segment to find the position for\n\t * @param localSeq - The localSeq to find the position of the segment at\n\t */\n\tpublic findReconnectionPosition(segment: ISegment, localSeq: number): number {\n\t\tassert(\n\t\t\tlocalSeq <= this._mergeTree.collabWindow.localSeq,\n\t\t\t0x032 /* \"localSeq greater than collab window\" */,\n\t\t);\n\t\tconst { currentSeq, clientId } = this.getCollabWindow();\n\t\tif (!isSegmentLeaf(segment)) {\n\t\t\tthrow new UsageError(UNBOUND_SEGMENT_ERROR);\n\t\t}\n\t\treturn this._mergeTree.getPosition(segment, currentSeq, clientId, localSeq);\n\t}\n\n\tprivate resetPendingDeltaToOps(\n\t\tresetOp: IMergeTreeDeltaOp,\n\n\t\tsegmentGroup: SegmentGroup,\n\t): IMergeTreeDeltaOp[] {\n\t\tassert(!!segmentGroup, 0x033 /* \"Segment group undefined\" */);\n\t\tconst NACKedSegmentGroup = this.pendingRebase?.shift()?.data;\n\t\tassert(\n\t\t\tsegmentGroup === NACKedSegmentGroup,\n\t\t\t0x034 /* \"Segment group not at head of pending rebase queue\" */,\n\t\t);\n\t\tif (this.pendingRebase?.empty) {\n\t\t\tthis.pendingRebase = undefined;\n\t\t}\n\n\t\t// if this is an obliterate op, keep all segments in same segment group\n\n\t\tconst obliterateSegmentGroup: SegmentGroup = {\n\t\t\tsegments: [],\n\t\t\tlocalSeq: segmentGroup.localSeq,\n\t\t\trefSeq: this.getCollabWindow().currentSeq,\n\t\t\tobliterateInfo: {\n\t\t\t\t...segmentGroup.obliterateInfo!,\n\t\t\t},\n\t\t};\n\n\t\tconst opList: IMergeTreeDeltaOp[] = [];\n\t\t// We need to sort the segments by ordinal, as the segments are not sorted in the segment group.\n\t\t// The reason they need them sorted, as they have the same local sequence number and which means\n\t\t// farther segments will take into account nearer segments when calculating their position.\n\t\t// By sorting we ensure the nearer segment will be applied and sequenced before the farther segments\n\t\t// so their recalculated positions will be correct.\n\t\tfor (const segment of segmentGroup.segments.sort((a, b) =>\n\t\t\ta.ordinal < b.ordinal ? -1 : 1,\n\t\t)) {\n\t\t\tassert(\n\t\t\t\tsegment.segmentGroups?.remove(segmentGroup) === true,\n\t\t\t\t0x035 /* \"Segment group not in segment pending queue\" */,\n\t\t\t);\n\t\t\tassert(\n\t\t\t\tsegmentGroup.localSeq !== undefined,\n\t\t\t\t0x867 /* expected segment group localSeq to be defined */,\n\t\t\t);\n\t\t\tconst segmentPosition = this.findReconnectionPosition(segment, segmentGroup.localSeq);\n\t\t\tlet newOp: IMergeTreeDeltaOp | undefined;\n\t\t\tswitch (resetOp.type) {\n\t\t\t\tcase MergeTreeDeltaType.ANNOTATE: {\n\t\t\t\t\tassert(\n\t\t\t\t\t\tsegment.propertyManager?.hasPendingProperties(resetOp.props ?? resetOp.adjust) ===\n\t\t\t\t\t\t\ttrue,\n\t\t\t\t\t\t0x036 /* \"Segment has no pending properties\" */,\n\t\t\t\t\t);\n\t\t\t\t\t// if the segment has been removed or obliterated, there's no need to send the annotate op\n\t\t\t\t\t// unless the remove was local, in which case the annotate must have come\n\t\t\t\t\t// before the remove\n\t\t\t\t\tif (\n\t\t\t\t\t\t(!isRemoved(segment) ||\n\t\t\t\t\t\t\t(segment.localRemovedSeq !== undefined &&\n\t\t\t\t\t\t\t\tsegment.removedSeq === UnassignedSequenceNumber)) &&\n\t\t\t\t\t\t(!isMoved(segment) ||\n\t\t\t\t\t\t\t(segment.localMovedSeq !== undefined &&\n\t\t\t\t\t\t\t\tsegment.movedSeq === UnassignedSequenceNumber))\n\t\t\t\t\t) {\n\t\t\t\t\t\tnewOp =\n\t\t\t\t\t\t\tresetOp.props === undefined\n\t\t\t\t\t\t\t\t? createAdjustRangeOp(\n\t\t\t\t\t\t\t\t\t\tsegmentPosition,\n\t\t\t\t\t\t\t\t\t\tsegmentPosition + segment.cachedLength,\n\t\t\t\t\t\t\t\t\t\tresetOp.adjust,\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t: createAnnotateRangeOp(\n\t\t\t\t\t\t\t\t\t\tsegmentPosition,\n\t\t\t\t\t\t\t\t\t\tsegmentPosition + segment.cachedLength,\n\t\t\t\t\t\t\t\t\t\tresetOp.props,\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tcase MergeTreeDeltaType.INSERT: {\n\t\t\t\t\tassert(\n\t\t\t\t\t\tisInserted(segment) && segment.seq === UnassignedSequenceNumber,\n\t\t\t\t\t\t0x037 /* \"Segment already has assigned sequence number\" */,\n\t\t\t\t\t);\n\t\t\t\t\tconst moveInfo = toMoveInfo(segment);\n\n\t\t\t\t\tif (moveInfo !== undefined) {\n\t\t\t\t\t\terrorIfOptionNotTrue(\n\t\t\t\t\t\t\tthis._mergeTree.options,\n\t\t\t\t\t\t\t\"mergeTreeEnableObliterateReconnect\",\n\t\t\t\t\t\t);\n\t\t\t\t\t\tif (moveInfo.movedSeq !== UnassignedSequenceNumber) {\n\t\t\t\t\t\t\t// the segment was remotely obliterated, so is considered removed\n\t\t\t\t\t\t\t// we set the seq to the universal seq and remove the local seq,\n\t\t\t\t\t\t\t// so its length is not considered for subsequent local changes\n\t\t\t\t\t\t\t// this allows us to not send the op as even the local client will ignore the segment\n\t\t\t\t\t\t\toverwriteInfo<IInsertionInfo>(segment, {\n\t\t\t\t\t\t\t\tseq: UniversalSequenceNumber,\n\t\t\t\t\t\t\t\tlocalSeq: undefined,\n\t\t\t\t\t\t\t\tclientId: NonCollabClient,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tconst segInsertOp: ISegment = segment.clone();\n\t\t\t\t\tconst opProps =\n\t\t\t\t\t\tisObject(resetOp.seg) && \"props\" in resetOp.seg && isObject(resetOp.seg.props)\n\t\t\t\t\t\t\t? { ...resetOp.seg.props }\n\t\t\t\t\t\t\t: undefined;\n\t\t\t\t\tsegInsertOp.properties = opProps;\n\t\t\t\t\tnewOp = createInsertSegmentOp(segmentPosition, segInsertOp);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tcase MergeTreeDeltaType.REMOVE: {\n\t\t\t\t\tif (\n\t\t\t\t\t\tisRemoved(segment) &&\n\t\t\t\t\t\tsegment.localRemovedSeq !== undefined &&\n\t\t\t\t\t\tsegment.removedSeq === UnassignedSequenceNumber &&\n\t\t\t\t\t\t(!isMoved(segment) ||\n\t\t\t\t\t\t\t(segment.localMovedSeq !== undefined &&\n\t\t\t\t\t\t\t\tsegment.movedSeq === UnassignedSequenceNumber))\n\t\t\t\t\t) {\n\t\t\t\t\t\tnewOp = createRemoveRangeOp(\n\t\t\t\t\t\t\tsegmentPosition,\n\t\t\t\t\t\t\tsegmentPosition + segment.cachedLength,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase MergeTreeDeltaType.OBLITERATE: {\n\t\t\t\t\terrorIfOptionNotTrue(this._mergeTree.options, \"mergeTreeEnableObliterateReconnect\");\n\t\t\t\t\tif (\n\t\t\t\t\t\tisMoved(segment) &&\n\t\t\t\t\t\tsegment.localMovedSeq !== undefined &&\n\t\t\t\t\t\tsegment.movedSeq === UnassignedSequenceNumber &&\n\t\t\t\t\t\t(!isRemoved(segment) ||\n\t\t\t\t\t\t\t(segment.localRemovedSeq !== undefined &&\n\t\t\t\t\t\t\t\tsegment.removedSeq === UnassignedSequenceNumber))\n\t\t\t\t\t) {\n\t\t\t\t\t\tnewOp = createObliterateRangeOp(\n\t\t\t\t\t\t\tsegmentPosition,\n\t\t\t\t\t\t\tsegmentPosition + segment.cachedLength,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tdefault: {\n\t\t\t\t\tthrow new Error(`Invalid op type`);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (newOp && resetOp.type === MergeTreeDeltaType.OBLITERATE) {\n\t\t\t\tsegment.segmentGroups.enqueue(obliterateSegmentGroup);\n\n\t\t\t\tconst first = opList[0];\n\n\t\t\t\tif (\n\t\t\t\t\t!!first &&\n\t\t\t\t\tfirst.pos2 !== undefined &&\n\t\t\t\t\tfirst.type !== MergeTreeDeltaType.OBLITERATE_SIDED &&\n\t\t\t\t\tnewOp.type !== MergeTreeDeltaType.OBLITERATE_SIDED\n\t\t\t\t) {\n\t\t\t\t\tfirst.pos2 += newOp.pos2! - newOp.pos1!;\n\t\t\t\t} else {\n\t\t\t\t\topList.push(newOp);\n\t\t\t\t}\n\t\t\t} else if (newOp) {\n\t\t\t\tconst newSegmentGroup: SegmentGroup = {\n\t\t\t\t\tsegments: [],\n\t\t\t\t\tlocalSeq: segmentGroup.localSeq,\n\t\t\t\t\trefSeq: this.getCollabWindow().currentSeq,\n\t\t\t\t};\n\t\t\t\tsegment.segmentGroups.enqueue(newSegmentGroup);\n\n\t\t\t\tthis._mergeTree.pendingSegments.push(newSegmentGroup);\n\n\t\t\t\topList.push(newOp);\n\t\t\t}\n\t\t}\n\n\t\tif (\n\t\t\tresetOp.type === MergeTreeDeltaType.OBLITERATE &&\n\t\t\tobliterateSegmentGroup.segments.length > 0\n\t\t) {\n\t\t\tthis._mergeTree.pendingSegments.push(obliterateSegmentGroup);\n\t\t}\n\n\t\treturn opList;\n\t}\n\n\tprivate applyRemoteOp(opArgs: IMergeTreeDeltaRemoteOpArgs): void {\n\t\tconst op = opArgs.op;\n\t\tconst msg = opArgs.sequencedMessage;\n\t\tthis.getOrAddShortClientIdFromMessage(msg);\n\t\tswitch (op.type) {\n\t\t\tcase MergeTreeDeltaType.INSERT: {\n\t\t\t\tthis.applyInsertOp(opArgs);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase MergeTreeDeltaType.REMOVE: {\n\t\t\t\tthis.applyRemoveRangeOp(opArgs);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase MergeTreeDeltaType.ANNOTATE: {\n\t\t\t\tthis.applyAnnotateRangeOp(opArgs);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase MergeTreeDeltaType.OBLITERATE:\n\t\t\tcase MergeTreeDeltaType.OBLITERATE_SIDED: {\n\t\t\t\tthis.applyObliterateRangeOp(opArgs);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase MergeTreeDeltaType.GROUP: {\n\t\t\t\tfor (const memberOp of op.ops) {\n\t\t\t\t\tthis.applyRemoteOp({\n\t\t\t\t\t\top: memberOp,\n\t\t\t\t\t\tgroupOp: op,\n\t\t\t\t\t\tsequencedMessage: msg,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tdefault: {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic applyStashedOp(op: IMergeTreeOp): void {\n\t\tswitch (op.type) {\n\t\t\tcase MergeTreeDeltaType.INSERT: {\n\t\t\t\tthis.applyInsertOp({ op });\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase MergeTreeDeltaType.REMOVE: {\n\t\t\t\tthis.applyRemoveRangeOp({ op });\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase MergeTreeDeltaType.ANNOTATE: {\n\t\t\t\tthis.applyAnnotateRangeOp({ op });\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase MergeTreeDeltaType.OBLITERATE_SIDED:\n\t\t\tcase MergeTreeDeltaType.OBLITERATE: {\n\t\t\t\tthis.applyObliterateRangeOp({ op });\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase MergeTreeDeltaType.GROUP: {\n\t\t\t\top.ops.map((o) => this.applyStashedOp(o));\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tdefault: {\n\t\t\t\tunreachableCase(op, \"unrecognized op type\");\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic applyMsg(msg: ISequencedDocumentMessage, local: boolean = false): void {\n\t\t// Ensure client ID is registered\n\t\tthis.getOrAddShortClientIdFromMessage(msg);\n\t\t// Apply if an operation message\n\t\tif (msg.type === MessageType.Operation) {\n\t\t\tconst opArgs: IMergeTreeDeltaRemoteOpArgs = {\n\t\t\t\top: msg.contents as IMergeTreeOp,\n\t\t\t\tsequencedMessage: msg,\n\t\t\t};\n\t\t\tif (opArgs.sequencedMessage?.clientId === this.longClientId || local) {\n\t\t\t\tthis.ackPendingSegment(opArgs);\n\t\t\t} else {\n\t\t\t\tthis.applyRemoteOp(opArgs);\n\t\t\t}\n\t\t}\n\n\t\tconst min = Math.min(\n\t\t\tthis.getMinInFlightRefSeq() ?? Number.POSITIVE_INFINITY,\n\t\t\tmsg.minimumSequenceNumber,\n\t\t);\n\t\tthis.updateSeqNumbers(min, msg.sequenceNumber);\n\t}\n\n\tprivate updateSeqNumbers(min: number, seq: number): void {\n\t\tconst collabWindow = this.getCollabWindow();\n\t\t// Equal is fine here due to SharedSegmentSequence<>.snapshotContent() potentially updating with same #\n\t\tassert(\n\t\t\tcollabWindow.currentSeq <= seq,\n\t\t\t0x038 /* \"Incoming op sequence# < local collabWindow's currentSequence#\" */,\n\t\t);\n\t\tcollabWindow.currentSeq = seq;\n\t\tassert(min <= seq, 0x039 /* \"Incoming op sequence# < minSequence#\" */);\n\t\tthis.updateMinSeq(min);\n\t}\n\n\t/**\n\t * Resolves a remote client's position against the local sequence\n\t * and returns the remote client's position relative to the local\n\t * sequence\n\t * @param remoteClientPosition - The remote client's position to resolve\n\t * @param remoteClientRefSeq - The reference sequence number of the remote client\n\t * @param remoteClientId - The client id of the remote client\n\t */\n\tpublic resolveRemoteClientPosition(\n\t\tremoteClientPosition: number,\n\t\tremoteClientRefSeq: number,\n\t\tremoteClientId: string,\n\t): number | undefined {\n\t\tconst shortRemoteClientId = this.getOrAddShortClientId(remoteClientId);\n\t\treturn this._mergeTree.resolveRemoteClientPosition(\n\t\t\tremoteClientPosition,\n\t\t\tremoteClientRefSeq,\n\t\t\tshortRemoteClientId,\n\t\t);\n\t}\n\n\tprivate lastNormalizationRefSeq = 0;\n\n\tprivate pendingRebase: DoublyLinkedList<SegmentGroup> | undefined;\n\n\t/**\n\t * Given a pending operation and segment group, regenerate the op, so it\n\t * can be resubmitted\n\t * @param resetOp - The op to reset\n\t * @param segmentGroup - The segment group associated with the op\n\t */\n\tpublic regeneratePendingOp(resetOp: IMergeTreeOp, localOpMetadata: unknown): IMergeTreeOp {\n\t\tconst segmentGroup = localOpMetadata as SegmentGroup | SegmentGroup[];\n\t\tif (this.pendingRebase === undefined || this.pendingRebase.empty) {\n\t\t\tlet firstGroup: SegmentGroup;\n\t\t\tif (Array.isArray(segmentGroup)) {\n\t\t\t\tif (segmentGroup.length === 0) {\n\t\t\t\t\t// sometimes we rebase to an empty op\n\t\t\t\t\t// eslint-disable-next-line import/no-deprecated\n\t\t\t\t\treturn createGroupOp();\n\t\t\t\t}\n\t\t\t\tfirstGroup = segmentGroup[0];\n\t\t\t} else {\n\t\t\t\tfirstGroup = segmentGroup;\n\t\t\t}\n\t\t\tconst firstGroupNode = this._mergeTree.pendingSegments.find(\n\t\t\t\t(node) => node.data === firstGroup,\n\t\t\t);\n\t\t\tassert(\n\t\t\t\tfirstGroupNode !== undefined,\n\t\t\t\t0x70e /* segment group must exist in pending list */,\n\t\t\t);\n\t\t\tthis.pendingRebase = this._mergeTree.pendingSegments.splice(firstGroupNode);\n\t\t}\n\n\t\tconst rebaseTo = this.getCollabWindow().currentSeq;\n\t\tif (rebaseTo !== this.lastNormalizationRefSeq) {\n\t\t\tthis.emit(\"normalize\", this);\n\t\t\tthis._mergeTree.normalizeSegmentsOnRebase();\n\t\t\tthis.lastNormalizationRefSeq = rebaseTo;\n\t\t}\n\n\t\tconst opList: IMergeTreeDeltaOp[] = [];\n\t\tif (resetOp.type === MergeTreeDeltaType.GROUP) {\n\t\t\tif (Array.isArray(segmentGroup)) {\n\t\t\t\tassert(\n\t\t\t\t\tresetOp.ops.length === segmentGroup.length,\n\t\t\t\t\t0x03a /* \"Number of ops in 'resetOp' must match the number of segment groups provided.\" */,\n\t\t\t\t);\n\n\t\t\t\tfor (let i = 0; i < resetOp.ops.length; i++) {\n\t\t\t\t\topList.push(...this.resetPendingDeltaToOps(resetOp.ops[i], segmentGroup[i]));\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// A group op containing a single op will pass a direct reference to 'segmentGroup'\n\t\t\t\t// rather than an array of segment groups. (See 'peekPendingSegmentGroups()')\n\t\t\t\tassert(\n\t\t\t\t\tresetOp.ops.length === 1,\n\t\t\t\t\t0x03b /* \"Number of ops in 'resetOp' must match the number of segment groups provided.\" */,\n\t\t\t\t);\n\t\t\t\topList.push(...this.resetPendingDeltaToOps(resetOp.ops[0], segmentGroup));\n\t\t\t}\n\t\t} else {\n\t\t\tassert(\n\t\t\t\t(resetOp.type as unknown) !== MergeTreeDeltaType.GROUP,\n\t\t\t\t0x03c /* \"Reset op has 'group' delta type!\" */,\n\t\t\t);\n\t\t\tassert(\n\t\t\t\t!Array.isArray(segmentGroup),\n\t\t\t\t0x03d /* \"segmentGroup is array rather than singleton!\" */,\n\t\t\t);\n\t\t\topList.push(...this.resetPendingDeltaToOps(resetOp, segmentGroup));\n\t\t}\n\t\t// eslint-disable-next-line import/no-deprecated\n\t\treturn opList.length === 1 ? opList[0] : createGroupOp(...opList);\n\t}\n\n\tpublic createTextHelper(): IMergeTreeTextHelper {\n\t\treturn new MergeTreeTextHelper(this._mergeTree);\n\t}\n\n\tpublic summarize(\n\t\truntime: IFluidDataStoreRuntime,\n\t\thandle: IFluidHandle,\n\t\tserializer: IFluidSerializer,\n\t\tcatchUpMsgs: ISequencedDocumentMessage[],\n\t): ISummaryTreeWithStats {\n\t\tconst deltaManager = toDeltaManagerInternal(runtime.deltaManager);\n\t\tconst minSeq = deltaManager.minimumSequenceNumber;\n\n\t\t// Catch up to latest MSN, if we have not had a chance to do it.\n\t\t// Required for case where FluidDataStoreRuntime.attachChannel()\n\t\t// generates summary right after loading data store.\n\n\t\tthis.updateSeqNumbers(minSeq, deltaManager.lastSequenceNumber);\n\n\t\t// One of the summaries (from SPO) I observed to have chunk.chunkSequenceNumber > minSeq!\n\t\t// Not sure why - need to catch it sooner\n\t\tassert(\n\t\t\tthis.getCollabWindow().minSeq === minSeq,\n\t\t\t0x03e /* \"minSeq mismatch between collab window and delta manager!\" */,\n\t\t);\n\n\t\t// Must continue to support legacy\n\t\t// (See https://github.com/microsoft/FluidFramework/issues/84)\n\t\tif (this._mergeTree.options?.newMergeTreeSnapshotFormat === true) {\n\t\t\tassert(\n\t\t\t\tcatchUpMsgs === undefined || catchUpMsgs.length === 0,\n\t\t\t\t0x03f /* \"New format should not emit catchup ops\" */,\n\t\t\t);\n\t\t\tconst snap = new SnapshotV1(this._mergeTree, this.logger, (id) =>\n\t\t\t\tthis.getLongClientId(id),\n\t\t\t);\n\t\t\tsnap.extractSync();\n\t\t\treturn snap.emit(serializer, handle);\n\t\t} else {\n\t\t\tconst snap = new SnapshotLegacy(this._mergeTree, this.logger);\n\t\t\tsnap.extractSync();\n\t\t\treturn snap.emit(catchUpMsgs, serializer, handle);\n\t\t}\n\t}\n\n\tpublic async load(\n\t\truntime: IFluidDataStoreRuntime,\n\t\tstorage: IChannelStorageService,\n\t\tserializer: IFluidSerializer,\n\t): Promise<{ catchupOpsP: Promise<ISequencedDocumentMessage[]> }> {\n\t\tconst loader = new SnapshotLoader(runtime, this, this._mergeTree, this.logger, serializer);\n\n\t\treturn loader.initialize(storage);\n\t}\n\n\tprivate getLocalSequenceNumber(): number {\n\t\tconst segWindow = this.getCollabWindow();\n\t\treturn segWindow.collaborating ? UnassignedSequenceNumber : UniversalSequenceNumber;\n\t}\n\n\t// eslint-disable-next-line import/no-deprecated\n\tlocalTransaction(groupOp: IMergeTreeGroupMsg): void {\n\t\tfor (const op of groupOp.ops) {\n\t\t\tconst opArgs: IMergeTreeDeltaOpArgs = {\n\t\t\t\top,\n\t\t\t\tgroupOp,\n\t\t\t};\n\t\t\tswitch (op.type) {\n\t\t\t\tcase MergeTreeDeltaType.INSERT: {\n\t\t\t\t\tthis.applyInsertOp(opArgs);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase MergeTreeDeltaType.ANNOTATE: {\n\t\t\t\t\tthis.applyAnnotateRangeOp(opArgs);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase MergeTreeDeltaType.REMOVE: {\n\t\t\t\t\tthis.applyRemoveRangeOp(opArgs);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase MergeTreeDeltaType.OBLITERATE_SIDED:\n\t\t\t\tcase MergeTreeDeltaType.OBLITERATE: {\n\t\t\t\t\tthis.applyObliterateRangeOp(opArgs);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tdefault: {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tupdateMinSeq(minSeq: number): void {\n\t\tthis._mergeTree.setMinSeq(minSeq);\n\t}\n\n\tgetContainingSegment<T extends ISegment>(\n\t\tpos: number,\n\t\tsequenceArgs?: Pick<ISequencedDocumentMessage, \"referenceSequenceNumber\" | \"clientId\">,\n\t\tlocalSeq?: number,\n\t): {\n\t\tsegment: T | undefined;\n\t\toffset: number | undefined;\n\t} {\n\t\tconst { referenceSequenceNumber, clientId } =\n\t\t\tthis.getClientSequenceArgsForMessage(sequenceArgs);\n\t\treturn this._mergeTree.getContainingSegment(\n\t\t\tpos,\n\t\t\treferenceSequenceNumber,\n\t\t\tclientId,\n\t\t\tlocalSeq,\n\t\t) as {\n\t\t\tsegment: T | undefined;\n\t\t\toffset: number | undefined;\n\t\t};\n\t}\n\n\tgetPropertiesAtPosition(pos: number): PropertySet | undefined {\n\t\tlet propertiesAtPosition: PropertySet | undefined;\n\t\tconst segoff = this.getContainingSegment(pos);\n\t\tconst seg = segoff.segment;\n\t\tif (seg) {\n\t\t\tpropertiesAtPosition = seg.properties;\n\t\t}\n\t\treturn propertiesAtPosition;\n\t}\n\n\tgetRangeExtentsOfPosition(pos: number): {\n\t\tposStart: number | undefined;\n\t\tposAfterEnd: number | undefined;\n\t} {\n\t\tlet posStart: number | undefined;\n\t\tlet posAfterEnd: number | undefined;\n\n\t\tconst segoff = this.getContainingSegment(pos);\n\t\tconst seg = segoff.segment;\n\t\tif (seg) {\n\t\t\tposStart = this.getPosition(seg);\n\t\t\tposAfterEnd = posStart + seg.cachedLength;\n\t\t}\n\t\treturn { posStart, posAfterEnd };\n\t}\n\n\tgetCurrentSeq(): number {\n\t\treturn this.getCollabWindow().currentSeq;\n\t}\n\n\tgetClientId(): number {\n\t\treturn this.getCollabWindow().clientId;\n\t}\n\n\tgetLength(): number {\n\t\treturn this._mergeTree.length ?? 0;\n\t}\n\n\tstartOrUpdateCollaboration(\n\t\tlongClientId: string | undefined,\n\t\tminSeq = 0,\n\t\tcurrentSeq = 0,\n\t): void {\n\t\t// we should always have a client id if we are collaborating\n\t\t// if the client id is undefined we are likely bound to a detached\n\t\t// container, so we should keep going in local mode. once\n\t\t// the container attaches this will be called again on connect with the\n\t\t// client id\n\t\tif (longClientId !== undefined) {\n\t\t\tif (this.longClientId === undefined) {\n\t\t\t\tthis.longClientId = longClientId;\n\t\t\t\tthis.addLongClientId(this.longClientId);\n\t\t\t\tthis._mergeTree.startCollaboration(\n\t\t\t\t\tthis.getShortClientId(this.longClientId),\n\t\t\t\t\tminSeq,\n\t\t\t\t\tcurrentSeq,\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tconst oldClientId = this.longClientId;\n\t\t\t\tconst oldData = this.clientNameToIds.get(oldClientId)!.data;\n\t\t\t\tthis.longClientId = longClientId;\n\t\t\t\tthis.clientNameToIds.put(longClientId, oldData);\n\t\t\t\tthis.shortClientIdMap[oldData] = longClientId;\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Searches a string for the nearest marker in either direction to a given start position.\n\t * The search will include the start position, so markers at the start position are valid\n\t * results of the search. Makes use of block-accelerated search functions for log(n) complexity.\n\t *\n\t * @param startPos - Position at which to start the search\n\t * @param markerLabel - Label of the marker to search for\n\t * @param forwards - Whether the desired marker comes before (false) or after (true) `startPos`\n\t */\n\tsearchForMarker(startPos: number, markerLabel: string, forwards = true): Marker | undefined {\n\t\tconst clientId = this.getClientId();\n\t\treturn this._mergeTree.searchForMarker(startPos, clientId, markerLabel, forwards);\n\t}\n}\n"]}
@@ -5,6 +5,7 @@
5
5
  import { LocalReferenceCollection } from "./localReference.js";
6
6
  import { MergeTree } from "./mergeTree.js";
7
7
  import { ISegment, type MergeBlock } from "./mergeTreeNodes.js";
8
+ import { type IMergeNodeInfo } from "./segmentInfos.js";
8
9
  /**
9
10
  * This is a special segment that is not bound or known by the merge tree itself,
10
11
  * but the segment itself pretends to be a removed segment at an endpoint of the
@@ -26,7 +27,7 @@ import { ISegment, type MergeBlock } from "./mergeTreeNodes.js";
26
27
  * must be possible in some way to refer to a position before or after the tree
27
28
  * respectively. The endpoint segments allow us to support such behavior.
28
29
  */
29
- declare abstract class BaseEndpointSegment {
30
+ declare abstract class BaseEndpointSegment implements IMergeNodeInfo {
30
31
  protected readonly mergeTree: MergeTree;
31
32
  constructor(mergeTree: MergeTree);
32
33
  removedSeq: number;