@fluidframework/merge-tree 2.1.0-276985 → 2.1.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 (524) hide show
  1. package/.eslintrc.cjs +2 -4
  2. package/CHANGELOG.md +15 -0
  3. package/README.md +109 -1
  4. package/api-extractor/api-extractor.current.json +5 -0
  5. package/api-extractor/api-extractor.legacy.json +1 -1
  6. package/api-extractor.json +1 -1
  7. package/api-report/merge-tree.legacy.alpha.api.md +10 -22
  8. package/api-report/merge-tree.legacy.public.api.md +9 -0
  9. package/dist/MergeTreeTextHelper.d.ts.map +1 -1
  10. package/dist/MergeTreeTextHelper.js +1 -1
  11. package/dist/MergeTreeTextHelper.js.map +1 -1
  12. package/dist/attributionCollection.d.ts.map +1 -1
  13. package/dist/attributionCollection.js +65 -17
  14. package/dist/attributionCollection.js.map +1 -1
  15. package/dist/attributionPolicy.d.ts +2 -1
  16. package/dist/attributionPolicy.d.ts.map +1 -1
  17. package/dist/attributionPolicy.js +10 -3
  18. package/dist/attributionPolicy.js.map +1 -1
  19. package/dist/client.d.ts +3 -1
  20. package/dist/client.d.ts.map +1 -1
  21. package/dist/client.js +65 -37
  22. package/dist/client.js.map +1 -1
  23. package/dist/collections/list.d.ts.map +1 -1
  24. package/dist/collections/list.js +5 -2
  25. package/dist/collections/list.js.map +1 -1
  26. package/dist/collections/rbTree.d.ts +2 -2
  27. package/dist/collections/rbTree.d.ts.map +1 -1
  28. package/dist/collections/rbTree.js +23 -35
  29. package/dist/collections/rbTree.js.map +1 -1
  30. package/dist/endOfTreeSegment.d.ts.map +1 -1
  31. package/dist/endOfTreeSegment.js +4 -1
  32. package/dist/endOfTreeSegment.js.map +1 -1
  33. package/dist/legacy.d.ts +1 -1
  34. package/dist/localReference.d.ts +16 -6
  35. package/dist/localReference.d.ts.map +1 -1
  36. package/dist/localReference.js +31 -20
  37. package/dist/localReference.js.map +1 -1
  38. package/dist/mergeTree.d.ts +0 -1
  39. package/dist/mergeTree.d.ts.map +1 -1
  40. package/dist/mergeTree.js +127 -112
  41. package/dist/mergeTree.js.map +1 -1
  42. package/dist/mergeTreeNodeWalk.d.ts.map +1 -1
  43. package/dist/mergeTreeNodeWalk.js +1 -1
  44. package/dist/mergeTreeNodeWalk.js.map +1 -1
  45. package/dist/mergeTreeNodes.d.ts +6 -5
  46. package/dist/mergeTreeNodes.d.ts.map +1 -1
  47. package/dist/mergeTreeNodes.js +29 -20
  48. package/dist/mergeTreeNodes.js.map +1 -1
  49. package/dist/mergeTreeTracking.js +3 -3
  50. package/dist/mergeTreeTracking.js.map +1 -1
  51. package/dist/opBuilder.d.ts +6 -1
  52. package/dist/opBuilder.d.ts.map +1 -1
  53. package/dist/opBuilder.js +5 -0
  54. package/dist/opBuilder.js.map +1 -1
  55. package/dist/ops.d.ts.map +1 -1
  56. package/dist/ops.js.map +1 -1
  57. package/dist/ordinal.d.ts.map +1 -1
  58. package/dist/ordinal.js +7 -0
  59. package/dist/ordinal.js.map +1 -1
  60. package/dist/partialLengths.d.ts +4 -2
  61. package/dist/partialLengths.d.ts.map +1 -1
  62. package/dist/partialLengths.js +101 -53
  63. package/dist/partialLengths.js.map +1 -1
  64. package/dist/perspective.d.ts +4 -1
  65. package/dist/perspective.d.ts.map +1 -1
  66. package/dist/perspective.js +7 -6
  67. package/dist/perspective.js.map +1 -1
  68. package/dist/properties.d.ts +13 -10
  69. package/dist/properties.d.ts.map +1 -1
  70. package/dist/properties.js +22 -11
  71. package/dist/properties.js.map +1 -1
  72. package/dist/public.d.ts +1 -1
  73. package/dist/referencePositions.d.ts +7 -0
  74. package/dist/referencePositions.d.ts.map +1 -1
  75. package/dist/referencePositions.js +7 -0
  76. package/dist/referencePositions.js.map +1 -1
  77. package/dist/revertibles.d.ts +6 -0
  78. package/dist/revertibles.d.ts.map +1 -1
  79. package/dist/revertibles.js +50 -21
  80. package/dist/revertibles.js.map +1 -1
  81. package/dist/segmentGroupCollection.d.ts.map +1 -1
  82. package/dist/segmentGroupCollection.js +2 -0
  83. package/dist/segmentGroupCollection.js.map +1 -1
  84. package/dist/segmentPropertiesManager.d.ts +7 -3
  85. package/dist/segmentPropertiesManager.d.ts.map +1 -1
  86. package/dist/segmentPropertiesManager.js +20 -15
  87. package/dist/segmentPropertiesManager.js.map +1 -1
  88. package/dist/snapshotChunks.d.ts.map +1 -1
  89. package/dist/snapshotChunks.js +10 -5
  90. package/dist/snapshotChunks.js.map +1 -1
  91. package/dist/snapshotLoader.d.ts.map +1 -1
  92. package/dist/snapshotLoader.js +14 -10
  93. package/dist/snapshotLoader.js.map +1 -1
  94. package/dist/snapshotV1.d.ts.map +1 -1
  95. package/dist/snapshotV1.js +20 -8
  96. package/dist/snapshotV1.js.map +1 -1
  97. package/dist/snapshotlegacy.d.ts.map +1 -1
  98. package/dist/snapshotlegacy.js +4 -2
  99. package/dist/snapshotlegacy.js.map +1 -1
  100. package/dist/sortedSegmentSet.d.ts.map +1 -1
  101. package/dist/sortedSegmentSet.js +8 -1
  102. package/dist/sortedSegmentSet.js.map +1 -1
  103. package/dist/sortedSet.d.ts.map +1 -1
  104. package/dist/sortedSet.js +4 -0
  105. package/dist/sortedSet.js.map +1 -1
  106. package/dist/test/Insertion.perf.spec.js.map +1 -1
  107. package/dist/test/Removal.perf.spec.js.map +1 -1
  108. package/dist/test/Snapshot.perf.spec.js +1 -0
  109. package/dist/test/Snapshot.perf.spec.js.map +1 -1
  110. package/dist/test/attributionCollection.perf.spec.js +3 -1
  111. package/dist/test/attributionCollection.perf.spec.js.map +1 -1
  112. package/dist/test/attributionCollection.spec.js +69 -68
  113. package/dist/test/attributionCollection.spec.js.map +1 -1
  114. package/dist/test/attributionPolicy.spec.js +29 -27
  115. package/dist/test/attributionPolicy.spec.js.map +1 -1
  116. package/dist/test/beastTest.spec.d.ts +1 -4
  117. package/dist/test/beastTest.spec.d.ts.map +1 -1
  118. package/dist/test/beastTest.spec.js +32 -30
  119. package/dist/test/beastTest.spec.js.map +1 -1
  120. package/dist/test/client.annotateMarker.spec.js +5 -5
  121. package/dist/test/client.annotateMarker.spec.js.map +1 -1
  122. package/dist/test/client.apis.spec.d.ts.map +1 -1
  123. package/dist/test/client.apis.spec.js +5 -7
  124. package/dist/test/client.apis.spec.js.map +1 -1
  125. package/dist/test/client.applyMsg.spec.js +125 -103
  126. package/dist/test/client.applyMsg.spec.js.map +1 -1
  127. package/dist/test/client.applyStashedOpFarm.spec.js +18 -10
  128. package/dist/test/client.applyStashedOpFarm.spec.js.map +1 -1
  129. package/dist/test/client.attributionFarm.spec.js +13 -8
  130. package/dist/test/client.attributionFarm.spec.js.map +1 -1
  131. package/dist/test/client.conflictFarm.spec.js +4 -2
  132. package/dist/test/client.conflictFarm.spec.js.map +1 -1
  133. package/dist/test/client.getPosition.spec.js +10 -10
  134. package/dist/test/client.getPosition.spec.js.map +1 -1
  135. package/dist/test/client.localReference.spec.js +111 -104
  136. package/dist/test/client.localReference.spec.js.map +1 -1
  137. package/dist/test/client.localReferenceFarm.spec.js +14 -10
  138. package/dist/test/client.localReferenceFarm.spec.js.map +1 -1
  139. package/dist/test/client.rebasePosition.spec.js +12 -12
  140. package/dist/test/client.rebasePosition.spec.js.map +1 -1
  141. package/dist/test/client.reconnectFarm.spec.js +12 -9
  142. package/dist/test/client.reconnectFarm.spec.js.map +1 -1
  143. package/dist/test/client.replay.spec.js +11 -10
  144. package/dist/test/client.replay.spec.js.map +1 -1
  145. package/dist/test/client.rollback.spec.js +87 -84
  146. package/dist/test/client.rollback.spec.js.map +1 -1
  147. package/dist/test/client.rollbackFarm.spec.js +3 -1
  148. package/dist/test/client.rollbackFarm.spec.js.map +1 -1
  149. package/dist/test/client.searchForMarker.spec.js +122 -112
  150. package/dist/test/client.searchForMarker.spec.js.map +1 -1
  151. package/dist/test/client.walkSegments.spec.js +7 -7
  152. package/dist/test/client.walkSegments.spec.js.map +1 -1
  153. package/dist/test/collections.list.spec.js +14 -14
  154. package/dist/test/collections.list.spec.js.map +1 -1
  155. package/dist/test/createInsertOnlyAttributionPolicy.spec.js +3 -3
  156. package/dist/test/createInsertOnlyAttributionPolicy.spec.js.map +1 -1
  157. package/dist/test/dirname.cjs +1 -0
  158. package/dist/test/dirname.cjs.map +1 -1
  159. package/dist/test/dirname.d.cts.map +1 -1
  160. package/dist/test/mergeTree.annotate.deltaCallback.spec.js +7 -7
  161. package/dist/test/mergeTree.annotate.deltaCallback.spec.js.map +1 -1
  162. package/dist/test/mergeTree.annotate.spec.js +87 -87
  163. package/dist/test/mergeTree.annotate.spec.js.map +1 -1
  164. package/dist/test/mergeTree.insert.deltaCallback.spec.js +6 -6
  165. package/dist/test/mergeTree.insert.deltaCallback.spec.js.map +1 -1
  166. package/dist/test/mergeTree.insertingWalk.spec.js +24 -24
  167. package/dist/test/mergeTree.insertingWalk.spec.js.map +1 -1
  168. package/dist/test/mergeTree.markRangeRemoved.deltaCallback.spec.js +6 -6
  169. package/dist/test/mergeTree.markRangeRemoved.deltaCallback.spec.js.map +1 -1
  170. package/dist/test/mergeTree.markRangeRemoved.spec.js +23 -23
  171. package/dist/test/mergeTree.markRangeRemoved.spec.js.map +1 -1
  172. package/dist/test/mergeTree.walk.spec.js +3 -3
  173. package/dist/test/mergeTree.walk.spec.js.map +1 -1
  174. package/dist/test/mergeTree.zamboni.spec.js +10 -10
  175. package/dist/test/mergeTree.zamboni.spec.js.map +1 -1
  176. package/dist/test/mergeTreeOperationRunner.d.ts.map +1 -1
  177. package/dist/test/mergeTreeOperationRunner.js +28 -16
  178. package/dist/test/mergeTreeOperationRunner.js.map +1 -1
  179. package/dist/test/mergeTreeOperationRunner.spec.js +9 -5
  180. package/dist/test/mergeTreeOperationRunner.spec.js.map +1 -1
  181. package/dist/test/obliterate.concurrent.spec.js +165 -165
  182. package/dist/test/obliterate.concurrent.spec.js.map +1 -1
  183. package/dist/test/obliterate.deltaCallback.spec.js +20 -21
  184. package/dist/test/obliterate.deltaCallback.spec.js.map +1 -1
  185. package/dist/test/obliterate.partialLength.spec.js +7 -7
  186. package/dist/test/obliterate.partialLength.spec.js.map +1 -1
  187. package/dist/test/obliterate.reconnect.spec.js +13 -13
  188. package/dist/test/obliterate.reconnect.spec.js.map +1 -1
  189. package/dist/test/obliterate.spec.js +9 -9
  190. package/dist/test/obliterate.spec.js.map +1 -1
  191. package/dist/test/ordinal.spec.js +10 -4
  192. package/dist/test/ordinal.spec.js.map +1 -1
  193. package/dist/test/partialLength.spec.js.map +1 -1
  194. package/dist/test/properties.spec.js +15 -15
  195. package/dist/test/properties.spec.js.map +1 -1
  196. package/dist/test/reconnectHelper.d.ts +4 -4
  197. package/dist/test/reconnectHelper.d.ts.map +1 -1
  198. package/dist/test/reconnectHelper.js +28 -20
  199. package/dist/test/reconnectHelper.js.map +1 -1
  200. package/dist/test/resetPendingSegmentsToOp.spec.js +35 -29
  201. package/dist/test/resetPendingSegmentsToOp.spec.js.map +1 -1
  202. package/dist/test/revertibleFarm.spec.js +11 -10
  203. package/dist/test/revertibleFarm.spec.js.map +1 -1
  204. package/dist/test/revertibles.spec.d.ts.map +1 -1
  205. package/dist/test/revertibles.spec.js +96 -57
  206. package/dist/test/revertibles.spec.js.map +1 -1
  207. package/dist/test/segmentGroupCollection.spec.js +17 -17
  208. package/dist/test/segmentGroupCollection.spec.js.map +1 -1
  209. package/dist/test/snapshot.spec.js +5 -5
  210. package/dist/test/snapshot.spec.js.map +1 -1
  211. package/dist/test/snapshot.utils.d.ts.map +1 -1
  212. package/dist/test/snapshot.utils.js +6 -6
  213. package/dist/test/snapshot.utils.js.map +1 -1
  214. package/dist/test/snapshotlegacy.spec.js +18 -13
  215. package/dist/test/snapshotlegacy.spec.js.map +1 -1
  216. package/dist/test/sortedSegmentSet.spec.js +22 -18
  217. package/dist/test/sortedSegmentSet.spec.js.map +1 -1
  218. package/dist/test/testClient.d.ts +6 -5
  219. package/dist/test/testClient.d.ts.map +1 -1
  220. package/dist/test/testClient.js +30 -32
  221. package/dist/test/testClient.js.map +1 -1
  222. package/dist/test/testClientLogger.d.ts.map +1 -1
  223. package/dist/test/testClientLogger.js +39 -38
  224. package/dist/test/testClientLogger.js.map +1 -1
  225. package/dist/test/testSerializer.d.ts +5 -5
  226. package/dist/test/testSerializer.d.ts.map +1 -1
  227. package/dist/test/testSerializer.js +0 -1
  228. package/dist/test/testSerializer.js.map +1 -1
  229. package/dist/test/testServer.d.ts.map +1 -1
  230. package/dist/test/testServer.js.map +1 -1
  231. package/dist/test/testUtils.d.ts +1 -1
  232. package/dist/test/testUtils.d.ts.map +1 -1
  233. package/dist/test/testUtils.js +15 -17
  234. package/dist/test/testUtils.js.map +1 -1
  235. package/dist/test/text.d.ts.map +1 -1
  236. package/dist/test/text.js +1 -1
  237. package/dist/test/text.js.map +1 -1
  238. package/dist/test/tracking.spec.js +50 -46
  239. package/dist/test/tracking.spec.js.map +1 -1
  240. package/dist/test/wordUnitTests.spec.d.ts.map +1 -1
  241. package/dist/test/wordUnitTests.spec.js +10 -10
  242. package/dist/test/wordUnitTests.spec.js.map +1 -1
  243. package/dist/textSegment.d.ts +1 -1
  244. package/dist/textSegment.d.ts.map +1 -1
  245. package/dist/textSegment.js +3 -3
  246. package/dist/textSegment.js.map +1 -1
  247. package/dist/zamboni.d.ts.map +1 -1
  248. package/dist/zamboni.js +7 -2
  249. package/dist/zamboni.js.map +1 -1
  250. package/internal.d.ts +1 -1
  251. package/legacy.d.ts +1 -1
  252. package/lib/MergeTreeTextHelper.d.ts.map +1 -1
  253. package/lib/MergeTreeTextHelper.js +1 -1
  254. package/lib/MergeTreeTextHelper.js.map +1 -1
  255. package/lib/attributionCollection.d.ts.map +1 -1
  256. package/lib/attributionCollection.js +65 -17
  257. package/lib/attributionCollection.js.map +1 -1
  258. package/lib/attributionPolicy.d.ts +2 -1
  259. package/lib/attributionPolicy.d.ts.map +1 -1
  260. package/lib/attributionPolicy.js +10 -3
  261. package/lib/attributionPolicy.js.map +1 -1
  262. package/lib/client.d.ts +3 -1
  263. package/lib/client.d.ts.map +1 -1
  264. package/lib/client.js +65 -37
  265. package/lib/client.js.map +1 -1
  266. package/lib/collections/list.d.ts.map +1 -1
  267. package/lib/collections/list.js +5 -2
  268. package/lib/collections/list.js.map +1 -1
  269. package/lib/collections/rbTree.d.ts +2 -2
  270. package/lib/collections/rbTree.d.ts.map +1 -1
  271. package/lib/collections/rbTree.js +23 -35
  272. package/lib/collections/rbTree.js.map +1 -1
  273. package/lib/endOfTreeSegment.d.ts.map +1 -1
  274. package/lib/endOfTreeSegment.js +4 -1
  275. package/lib/endOfTreeSegment.js.map +1 -1
  276. package/lib/legacy.d.ts +1 -1
  277. package/lib/localReference.d.ts +16 -6
  278. package/lib/localReference.d.ts.map +1 -1
  279. package/lib/localReference.js +31 -20
  280. package/lib/localReference.js.map +1 -1
  281. package/lib/mergeTree.d.ts +0 -1
  282. package/lib/mergeTree.d.ts.map +1 -1
  283. package/lib/mergeTree.js +127 -112
  284. package/lib/mergeTree.js.map +1 -1
  285. package/lib/mergeTreeNodeWalk.d.ts.map +1 -1
  286. package/lib/mergeTreeNodeWalk.js +1 -1
  287. package/lib/mergeTreeNodeWalk.js.map +1 -1
  288. package/lib/mergeTreeNodes.d.ts +6 -5
  289. package/lib/mergeTreeNodes.d.ts.map +1 -1
  290. package/lib/mergeTreeNodes.js +29 -20
  291. package/lib/mergeTreeNodes.js.map +1 -1
  292. package/lib/mergeTreeTracking.js +3 -3
  293. package/lib/mergeTreeTracking.js.map +1 -1
  294. package/lib/opBuilder.d.ts +6 -1
  295. package/lib/opBuilder.d.ts.map +1 -1
  296. package/lib/opBuilder.js +5 -0
  297. package/lib/opBuilder.js.map +1 -1
  298. package/lib/ops.d.ts.map +1 -1
  299. package/lib/ops.js.map +1 -1
  300. package/lib/ordinal.d.ts.map +1 -1
  301. package/lib/ordinal.js +7 -0
  302. package/lib/ordinal.js.map +1 -1
  303. package/lib/partialLengths.d.ts +4 -2
  304. package/lib/partialLengths.d.ts.map +1 -1
  305. package/lib/partialLengths.js +101 -53
  306. package/lib/partialLengths.js.map +1 -1
  307. package/lib/perspective.d.ts +4 -1
  308. package/lib/perspective.d.ts.map +1 -1
  309. package/lib/perspective.js +7 -6
  310. package/lib/perspective.js.map +1 -1
  311. package/lib/properties.d.ts +13 -10
  312. package/lib/properties.d.ts.map +1 -1
  313. package/lib/properties.js +22 -11
  314. package/lib/properties.js.map +1 -1
  315. package/lib/public.d.ts +1 -1
  316. package/lib/referencePositions.d.ts +7 -0
  317. package/lib/referencePositions.d.ts.map +1 -1
  318. package/lib/referencePositions.js +7 -0
  319. package/lib/referencePositions.js.map +1 -1
  320. package/lib/revertibles.d.ts +6 -0
  321. package/lib/revertibles.d.ts.map +1 -1
  322. package/lib/revertibles.js +50 -21
  323. package/lib/revertibles.js.map +1 -1
  324. package/lib/segmentGroupCollection.d.ts.map +1 -1
  325. package/lib/segmentGroupCollection.js +2 -0
  326. package/lib/segmentGroupCollection.js.map +1 -1
  327. package/lib/segmentPropertiesManager.d.ts +7 -3
  328. package/lib/segmentPropertiesManager.d.ts.map +1 -1
  329. package/lib/segmentPropertiesManager.js +20 -15
  330. package/lib/segmentPropertiesManager.js.map +1 -1
  331. package/lib/snapshotChunks.d.ts.map +1 -1
  332. package/lib/snapshotChunks.js +10 -5
  333. package/lib/snapshotChunks.js.map +1 -1
  334. package/lib/snapshotLoader.d.ts.map +1 -1
  335. package/lib/snapshotLoader.js +14 -10
  336. package/lib/snapshotLoader.js.map +1 -1
  337. package/lib/snapshotV1.d.ts.map +1 -1
  338. package/lib/snapshotV1.js +20 -8
  339. package/lib/snapshotV1.js.map +1 -1
  340. package/lib/snapshotlegacy.d.ts.map +1 -1
  341. package/lib/snapshotlegacy.js +4 -2
  342. package/lib/snapshotlegacy.js.map +1 -1
  343. package/lib/sortedSegmentSet.d.ts.map +1 -1
  344. package/lib/sortedSegmentSet.js +8 -1
  345. package/lib/sortedSegmentSet.js.map +1 -1
  346. package/lib/sortedSet.d.ts.map +1 -1
  347. package/lib/sortedSet.js +4 -0
  348. package/lib/sortedSet.js.map +1 -1
  349. package/lib/test/Insertion.perf.spec.js.map +1 -1
  350. package/lib/test/Removal.perf.spec.js.map +1 -1
  351. package/lib/test/Snapshot.perf.spec.js +1 -0
  352. package/lib/test/Snapshot.perf.spec.js.map +1 -1
  353. package/lib/test/attributionCollection.perf.spec.js +3 -1
  354. package/lib/test/attributionCollection.perf.spec.js.map +1 -1
  355. package/lib/test/attributionCollection.spec.js +3 -2
  356. package/lib/test/attributionCollection.spec.js.map +1 -1
  357. package/lib/test/attributionPolicy.spec.js +3 -1
  358. package/lib/test/attributionPolicy.spec.js.map +1 -1
  359. package/lib/test/beastTest.spec.d.ts +1 -4
  360. package/lib/test/beastTest.spec.d.ts.map +1 -1
  361. package/lib/test/beastTest.spec.js +26 -24
  362. package/lib/test/beastTest.spec.js.map +1 -1
  363. package/lib/test/client.annotateMarker.spec.js +1 -1
  364. package/lib/test/client.annotateMarker.spec.js.map +1 -1
  365. package/lib/test/client.apis.spec.d.ts.map +1 -1
  366. package/lib/test/client.apis.spec.js +4 -6
  367. package/lib/test/client.apis.spec.js.map +1 -1
  368. package/lib/test/client.applyMsg.spec.js +72 -50
  369. package/lib/test/client.applyMsg.spec.js.map +1 -1
  370. package/lib/test/client.applyStashedOpFarm.spec.js +18 -10
  371. package/lib/test/client.applyStashedOpFarm.spec.js.map +1 -1
  372. package/lib/test/client.attributionFarm.spec.js +12 -7
  373. package/lib/test/client.attributionFarm.spec.js.map +1 -1
  374. package/lib/test/client.conflictFarm.spec.js +4 -2
  375. package/lib/test/client.conflictFarm.spec.js.map +1 -1
  376. package/lib/test/client.getPosition.spec.js +1 -1
  377. package/lib/test/client.getPosition.spec.js.map +1 -1
  378. package/lib/test/client.localReference.spec.js +14 -7
  379. package/lib/test/client.localReference.spec.js.map +1 -1
  380. package/lib/test/client.localReferenceFarm.spec.js +13 -9
  381. package/lib/test/client.localReferenceFarm.spec.js.map +1 -1
  382. package/lib/test/client.rebasePosition.spec.js +1 -1
  383. package/lib/test/client.rebasePosition.spec.js.map +1 -1
  384. package/lib/test/client.reconnectFarm.spec.js +11 -8
  385. package/lib/test/client.reconnectFarm.spec.js.map +1 -1
  386. package/lib/test/client.replay.spec.js +8 -7
  387. package/lib/test/client.replay.spec.js.map +1 -1
  388. package/lib/test/client.rollback.spec.js +14 -11
  389. package/lib/test/client.rollback.spec.js.map +1 -1
  390. package/lib/test/client.rollbackFarm.spec.js +3 -1
  391. package/lib/test/client.rollbackFarm.spec.js.map +1 -1
  392. package/lib/test/client.searchForMarker.spec.js +29 -19
  393. package/lib/test/client.searchForMarker.spec.js.map +1 -1
  394. package/lib/test/client.walkSegments.spec.js +1 -1
  395. package/lib/test/client.walkSegments.spec.js.map +1 -1
  396. package/lib/test/collections.list.spec.js +1 -1
  397. package/lib/test/collections.list.spec.js.map +1 -1
  398. package/lib/test/createInsertOnlyAttributionPolicy.spec.js +1 -1
  399. package/lib/test/createInsertOnlyAttributionPolicy.spec.js.map +1 -1
  400. package/lib/test/dirname.cjs +1 -0
  401. package/lib/test/dirname.cjs.map +1 -1
  402. package/lib/test/dirname.d.cts.map +1 -1
  403. package/lib/test/mergeTree.annotate.deltaCallback.spec.js +1 -1
  404. package/lib/test/mergeTree.annotate.deltaCallback.spec.js.map +1 -1
  405. package/lib/test/mergeTree.annotate.spec.js +1 -1
  406. package/lib/test/mergeTree.annotate.spec.js.map +1 -1
  407. package/lib/test/mergeTree.insert.deltaCallback.spec.js +1 -1
  408. package/lib/test/mergeTree.insert.deltaCallback.spec.js.map +1 -1
  409. package/lib/test/mergeTree.insertingWalk.spec.js +8 -8
  410. package/lib/test/mergeTree.insertingWalk.spec.js.map +1 -1
  411. package/lib/test/mergeTree.markRangeRemoved.deltaCallback.spec.js +1 -1
  412. package/lib/test/mergeTree.markRangeRemoved.deltaCallback.spec.js.map +1 -1
  413. package/lib/test/mergeTree.markRangeRemoved.spec.js +1 -1
  414. package/lib/test/mergeTree.markRangeRemoved.spec.js.map +1 -1
  415. package/lib/test/mergeTree.walk.spec.js +1 -1
  416. package/lib/test/mergeTree.walk.spec.js.map +1 -1
  417. package/lib/test/mergeTree.zamboni.spec.js +1 -1
  418. package/lib/test/mergeTree.zamboni.spec.js.map +1 -1
  419. package/lib/test/mergeTreeOperationRunner.d.ts.map +1 -1
  420. package/lib/test/mergeTreeOperationRunner.js +27 -15
  421. package/lib/test/mergeTreeOperationRunner.js.map +1 -1
  422. package/lib/test/mergeTreeOperationRunner.spec.js +5 -1
  423. package/lib/test/mergeTreeOperationRunner.spec.js.map +1 -1
  424. package/lib/test/obliterate.concurrent.spec.js +4 -4
  425. package/lib/test/obliterate.concurrent.spec.js.map +1 -1
  426. package/lib/test/obliterate.deltaCallback.spec.js +2 -3
  427. package/lib/test/obliterate.deltaCallback.spec.js.map +1 -1
  428. package/lib/test/obliterate.partialLength.spec.js +1 -1
  429. package/lib/test/obliterate.partialLength.spec.js.map +1 -1
  430. package/lib/test/obliterate.reconnect.spec.js +1 -1
  431. package/lib/test/obliterate.reconnect.spec.js.map +1 -1
  432. package/lib/test/obliterate.spec.js +1 -1
  433. package/lib/test/obliterate.spec.js.map +1 -1
  434. package/lib/test/ordinal.spec.js +7 -1
  435. package/lib/test/ordinal.spec.js.map +1 -1
  436. package/lib/test/partialLength.spec.js.map +1 -1
  437. package/lib/test/properties.spec.js +1 -1
  438. package/lib/test/properties.spec.js.map +1 -1
  439. package/lib/test/reconnectHelper.d.ts +4 -4
  440. package/lib/test/reconnectHelper.d.ts.map +1 -1
  441. package/lib/test/reconnectHelper.js +22 -14
  442. package/lib/test/reconnectHelper.js.map +1 -1
  443. package/lib/test/resetPendingSegmentsToOp.spec.js +8 -2
  444. package/lib/test/resetPendingSegmentsToOp.spec.js.map +1 -1
  445. package/lib/test/revertibleFarm.spec.js +8 -7
  446. package/lib/test/revertibleFarm.spec.js.map +1 -1
  447. package/lib/test/revertibles.spec.d.ts.map +1 -1
  448. package/lib/test/revertibles.spec.js +93 -54
  449. package/lib/test/revertibles.spec.js.map +1 -1
  450. package/lib/test/segmentGroupCollection.spec.js +1 -1
  451. package/lib/test/segmentGroupCollection.spec.js.map +1 -1
  452. package/lib/test/snapshot.spec.js +1 -1
  453. package/lib/test/snapshot.spec.js.map +1 -1
  454. package/lib/test/snapshot.utils.d.ts.map +1 -1
  455. package/lib/test/snapshot.utils.js +1 -1
  456. package/lib/test/snapshot.utils.js.map +1 -1
  457. package/lib/test/snapshotlegacy.spec.js +10 -5
  458. package/lib/test/snapshotlegacy.spec.js.map +1 -1
  459. package/lib/test/sortedSegmentSet.spec.js +6 -2
  460. package/lib/test/sortedSegmentSet.spec.js.map +1 -1
  461. package/lib/test/testClient.d.ts +6 -5
  462. package/lib/test/testClient.d.ts.map +1 -1
  463. package/lib/test/testClient.js +25 -27
  464. package/lib/test/testClient.js.map +1 -1
  465. package/lib/test/testClientLogger.d.ts.map +1 -1
  466. package/lib/test/testClientLogger.js +37 -36
  467. package/lib/test/testClientLogger.js.map +1 -1
  468. package/lib/test/testSerializer.d.ts +5 -5
  469. package/lib/test/testSerializer.d.ts.map +1 -1
  470. package/lib/test/testSerializer.js +0 -1
  471. package/lib/test/testSerializer.js.map +1 -1
  472. package/lib/test/testServer.d.ts.map +1 -1
  473. package/lib/test/testServer.js.map +1 -1
  474. package/lib/test/testUtils.d.ts +1 -1
  475. package/lib/test/testUtils.d.ts.map +1 -1
  476. package/lib/test/testUtils.js +6 -8
  477. package/lib/test/testUtils.js.map +1 -1
  478. package/lib/test/text.d.ts.map +1 -1
  479. package/lib/test/text.js +1 -1
  480. package/lib/test/text.js.map +1 -1
  481. package/lib/test/tracking.spec.js +9 -5
  482. package/lib/test/tracking.spec.js.map +1 -1
  483. package/lib/test/wordUnitTests.spec.d.ts.map +1 -1
  484. package/lib/test/wordUnitTests.spec.js +9 -9
  485. package/lib/test/wordUnitTests.spec.js.map +1 -1
  486. package/lib/textSegment.d.ts +1 -1
  487. package/lib/textSegment.d.ts.map +1 -1
  488. package/lib/textSegment.js +3 -3
  489. package/lib/textSegment.js.map +1 -1
  490. package/lib/zamboni.d.ts.map +1 -1
  491. package/lib/zamboni.js +7 -2
  492. package/lib/zamboni.js.map +1 -1
  493. package/package.json +29 -27
  494. package/src/MergeTreeTextHelper.ts +2 -2
  495. package/src/attributionCollection.ts +71 -28
  496. package/src/attributionPolicy.ts +14 -9
  497. package/src/client.ts +120 -71
  498. package/src/collections/list.ts +9 -6
  499. package/src/collections/rbTree.ts +62 -71
  500. package/src/endOfTreeSegment.ts +21 -10
  501. package/src/localReference.ts +61 -43
  502. package/src/mergeTree.ts +229 -178
  503. package/src/mergeTreeNodeWalk.ts +2 -1
  504. package/src/mergeTreeNodes.ts +59 -46
  505. package/src/mergeTreeTracking.ts +3 -3
  506. package/src/opBuilder.ts +6 -1
  507. package/src/ops.ts +5 -0
  508. package/src/ordinal.ts +8 -1
  509. package/src/partialLengths.ts +143 -87
  510. package/src/perspective.ts +10 -7
  511. package/src/properties.ts +36 -18
  512. package/src/referencePositions.ts +7 -0
  513. package/src/revertibles.ts +71 -41
  514. package/src/segmentGroupCollection.ts +8 -6
  515. package/src/segmentPropertiesManager.ts +28 -24
  516. package/src/snapshotChunks.ts +12 -7
  517. package/src/snapshotLoader.ts +20 -17
  518. package/src/snapshotV1.ts +36 -18
  519. package/src/snapshotlegacy.ts +7 -5
  520. package/src/sortedSegmentSet.ts +9 -3
  521. package/src/sortedSet.ts +7 -3
  522. package/src/textSegment.ts +9 -9
  523. package/src/zamboni.ts +14 -10
  524. package/tsconfig.json +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"client.localReference.spec.js","sourceRoot":"","sources":["../../src/test/client.localReference.spec.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 { strict as assert } from \"assert\";\n\nimport { ISequencedDocumentMessage } from \"@fluidframework/driver-definitions/internal\";\n\nimport { Client } from \"../client.js\";\nimport {\n\tLocalReferencePosition,\n\tSlidingPreference,\n\tsetValidateRefCount,\n} from \"../localReference.js\";\nimport { getSlideToSegoff } from \"../mergeTree.js\";\nimport { toRemovalInfo } from \"../mergeTreeNodes.js\";\nimport { TrackingGroup, UnorderedTrackingGroup } from \"../mergeTreeTracking.js\";\nimport { MergeTreeDeltaType, ReferenceType } from \"../ops.js\";\nimport { DetachedReferencePosition } from \"../referencePositions.js\";\nimport { TextSegment } from \"../textSegment.js\";\n\nimport { TestClient } from \"./testClient.js\";\nimport { createClientsAtInitialState } from \"./testClientLogger.js\";\nimport { validateRefCount } from \"./testUtils.js\";\n\nfunction getSlideOnRemoveReferencePosition(\n\tclient: Client,\n\tpos: number,\n\top: ISequencedDocumentMessage,\n) {\n\tlet segoff = client.getContainingSegment(pos, {\n\t\treferenceSequenceNumber: op.referenceSequenceNumber,\n\t\tclientId: op.clientId,\n\t});\n\tsegoff = getSlideToSegoff(segoff);\n\treturn segoff;\n}\n\ndescribe(\"MergeTree.Client\", () => {\n\tbeforeEach(() => {\n\t\tsetValidateRefCount(validateRefCount);\n\t});\n\n\tafterEach(() => {\n\t\tsetValidateRefCount(undefined);\n\t});\n\n\tit(\"Remove segment of non-sliding local reference\", () => {\n\t\tconst client1 = new TestClient();\n\t\tconst client2 = new TestClient();\n\n\t\tclient1.startOrUpdateCollaboration(\"1\");\n\t\tclient2.startOrUpdateCollaboration(\"2\");\n\t\tlet seq = 0;\n\t\tfor (let i = 0; i < 5; i++) {\n\t\t\tconst insert = client1.makeOpMessage(\n\t\t\t\tclient1.insertTextLocal(client1.getLength(), i.toString()),\n\t\t\t\t++seq,\n\t\t\t);\n\t\t\tinsert.minimumSequenceNumber = seq - 1;\n\t\t\tclient1.applyMsg(insert);\n\t\t\tclient2.applyMsg(insert);\n\t\t}\n\n\t\tconst segInfo = client1.getContainingSegment(2);\n\t\tconst c1LocalRef = client1.createLocalReferencePosition(\n\t\t\tsegInfo.segment!,\n\t\t\tsegInfo.offset,\n\t\t\tReferenceType.Simple,\n\t\t\tundefined,\n\t\t);\n\n\t\tassert.equal(client1.localReferencePositionToPosition(c1LocalRef), 2, \"create position\");\n\n\t\tconst remove = client2.makeOpMessage(client2.removeRangeLocal(2, 3), ++seq);\n\t\tremove.minimumSequenceNumber = seq - 1;\n\t\tclient1.applyMsg(remove);\n\t\tclient2.applyMsg(remove);\n\n\t\t// this only works because zamboni hasn't run yet\n\t\tassert.equal(\n\t\t\tclient1.localReferencePositionToPosition(c1LocalRef),\n\t\t\tDetachedReferencePosition,\n\t\t\t\"after remove\",\n\t\t);\n\n\t\t// this will force Zamboni to run\n\t\tfor (let i = 0; i < 5; i++) {\n\t\t\tconst insert = client1.makeOpMessage(\n\t\t\t\tclient1.insertTextLocal(client1.getLength(), i.toString()),\n\t\t\t\t++seq,\n\t\t\t);\n\t\t\tinsert.minimumSequenceNumber = seq - 1;\n\t\t\tclient1.applyMsg(insert);\n\t\t\tclient2.applyMsg(insert);\n\t\t}\n\t\tassert.equal(\n\t\t\tclient1.localReferencePositionToPosition(c1LocalRef),\n\t\t\tDetachedReferencePosition,\n\t\t\t\"after zamboni\",\n\t\t);\n\t});\n\n\tit(\"Remove segment of sliding local reference\", () => {\n\t\tconst client1 = new TestClient();\n\t\tconst client2 = new TestClient();\n\n\t\tclient1.startOrUpdateCollaboration(\"1\");\n\t\tclient2.startOrUpdateCollaboration(\"2\");\n\t\tlet seq = 0;\n\t\tfor (let i = 0; i < 5; i++) {\n\t\t\tconst insert = client1.makeOpMessage(\n\t\t\t\tclient1.insertTextLocal(client1.getLength(), i.toString()),\n\t\t\t\t++seq,\n\t\t\t);\n\t\t\tinsert.minimumSequenceNumber = seq - 1;\n\t\t\tclient1.applyMsg(insert);\n\t\t\tclient2.applyMsg(insert);\n\t\t}\n\n\t\tconst segInfo = client1.getContainingSegment(2);\n\t\tconst c1LocalRef = client1.createLocalReferencePosition(\n\t\t\tsegInfo.segment!,\n\t\t\tsegInfo.offset,\n\t\t\tReferenceType.SlideOnRemove,\n\t\t\tundefined,\n\t\t);\n\n\t\tassert.equal(client1.localReferencePositionToPosition(c1LocalRef), 2);\n\n\t\tconst remove = client2.makeOpMessage(client2.removeRangeLocal(2, 3), ++seq);\n\t\tremove.minimumSequenceNumber = seq - 1;\n\t\tclient1.applyMsg(remove);\n\t\tclient2.applyMsg(remove);\n\n\t\tassert.equal(client1.localReferencePositionToPosition(c1LocalRef), 2);\n\n\t\tfor (let i = 0; i < 5; i++) {\n\t\t\tconst insert = client1.makeOpMessage(\n\t\t\t\tclient1.insertTextLocal(client1.getLength(), i.toString()),\n\t\t\t\t++seq,\n\t\t\t);\n\t\t\tinsert.minimumSequenceNumber = seq - 1;\n\t\t\tclient1.applyMsg(insert);\n\t\t\tclient2.applyMsg(insert);\n\t\t}\n\n\t\tassert.equal(client1.localReferencePositionToPosition(c1LocalRef), 2);\n\t});\n\n\tit(\"Remove segments to end with sliding local reference\", () => {\n\t\tconst client1 = new TestClient();\n\t\tconst client2 = new TestClient();\n\n\t\tclient1.startOrUpdateCollaboration(\"1\");\n\t\tclient2.startOrUpdateCollaboration(\"2\");\n\t\tlet seq = 0;\n\t\tfor (let i = 0; i < 5; i++) {\n\t\t\tconst insert = client1.makeOpMessage(\n\t\t\t\tclient1.insertTextLocal(client1.getLength(), i.toString()),\n\t\t\t\t++seq,\n\t\t\t);\n\t\t\tinsert.minimumSequenceNumber = seq - 1;\n\t\t\tclient1.applyMsg(insert);\n\t\t\tclient2.applyMsg(insert);\n\t\t}\n\n\t\tconst segInfo = client1.getContainingSegment(2);\n\t\tconst c1LocalRef = client1.createLocalReferencePosition(\n\t\t\tsegInfo.segment!,\n\t\t\tsegInfo.offset,\n\t\t\tReferenceType.SlideOnRemove,\n\t\t\tundefined,\n\t\t);\n\n\t\tassert.equal(client1.localReferencePositionToPosition(c1LocalRef), 2);\n\n\t\tconst remove = client2.makeOpMessage(\n\t\t\tclient2.removeRangeLocal(2, client2.getLength()),\n\t\t\t++seq,\n\t\t);\n\t\tremove.minimumSequenceNumber = seq - 1;\n\t\tclient1.applyMsg(remove);\n\t\tclient2.applyMsg(remove);\n\n\t\tassert.equal(\n\t\t\tclient1.localReferencePositionToPosition(c1LocalRef),\n\t\t\tclient2.getLength() - 1,\n\t\t);\n\t});\n\n\tit(\"Remove segments from end with sliding local reference\", () => {\n\t\tconst client1 = new TestClient();\n\n\t\tclient1.startOrUpdateCollaboration(\"1\");\n\t\tlet seq = 0;\n\t\tconst insert = client1.makeOpMessage(client1.insertTextLocal(0, \"ABCD\"), ++seq);\n\t\tinsert.minimumSequenceNumber = seq - 1;\n\t\tclient1.applyMsg(insert);\n\n\t\tconst segInfo = client1.getContainingSegment(3);\n\t\tconst c1LocalRef = client1.createLocalReferencePosition(\n\t\t\tsegInfo.segment!,\n\t\t\tsegInfo.offset,\n\t\t\tReferenceType.SlideOnRemove,\n\t\t\tundefined,\n\t\t);\n\n\t\tassert.equal(client1.localReferencePositionToPosition(c1LocalRef), 3, \"ref created\");\n\n\t\tconst remove1 = client1.makeOpMessage(client1.removeRangeLocal(3, 4), ++seq);\n\t\tremove1.minimumSequenceNumber = seq - 1;\n\t\tassert.equal(client1.localReferencePositionToPosition(c1LocalRef), 3, \"after remove\");\n\n\t\tconst remove2 = client1.makeOpMessage(client1.removeRangeLocal(1, 3), ++seq);\n\t\tremove2.minimumSequenceNumber = seq - 1;\n\t\tassert.equal(\n\t\t\tclient1.localReferencePositionToPosition(c1LocalRef),\n\t\t\t1,\n\t\t\t\"after second remove\",\n\t\t);\n\n\t\tclient1.applyMsg(remove1);\n\t\tclient1.applyMsg(remove2);\n\n\t\tassert.equal(client1.localReferencePositionToPosition(c1LocalRef), 0, \"ops applied\");\n\t});\n\n\tit(\"getSlideOnRemoveReferencePosition\", () => {\n\t\tconst client1 = new TestClient();\n\t\tconst client2 = new TestClient();\n\t\tclient1.startOrUpdateCollaboration(\"1\");\n\t\tclient2.startOrUpdateCollaboration(\"2\");\n\n\t\tlet seq = 0;\n\t\tconst insert1 = client1.makeOpMessage(client1.insertTextLocal(0, \"XYZ\"), ++seq);\n\t\tclient1.applyMsg(insert1);\n\n\t\tconst insert2 = client1.makeOpMessage(client1.insertTextLocal(0, \"ABC\"), ++seq);\n\t\tclient1.applyMsg(insert2);\n\n\t\t// Position depends on op\n\t\tconst createReference1 = client2.makeOpMessage(\n\t\t\t{ type: MergeTreeDeltaType.INSERT },\n\t\t\t++seq,\n\t\t\tinsert1.sequenceNumber,\n\t\t);\n\t\tlet segoff = getSlideOnRemoveReferencePosition(client1, 1, createReference1);\n\t\tassert(segoff.segment);\n\t\tassert.equal(client1.getPosition(segoff.segment), 3);\n\t\tassert.equal(segoff.offset, 1);\n\n\t\tconst createReference2 = client2.makeOpMessage(\n\t\t\t{ type: MergeTreeDeltaType.INSERT },\n\t\t\t++seq,\n\t\t\tinsert2.sequenceNumber,\n\t\t);\n\t\tsegoff = getSlideOnRemoveReferencePosition(client1, 2, createReference2);\n\t\tassert(segoff.segment);\n\t\tassert.equal(client1.getPosition(segoff.segment), 0);\n\t\tassert.equal(segoff.offset, 2);\n\n\t\t// On a removed, unacked segment\n\t\tlet remove = client1.makeOpMessage(client1.removeRangeLocal(2, 5), ++seq);\n\t\tsegoff = getSlideOnRemoveReferencePosition(client1, 3, createReference2);\n\t\tassert(segoff.segment);\n\t\tassert.notEqual(toRemovalInfo(segoff.segment), undefined);\n\t\tassert.equal(client1.getPosition(segoff.segment), 2);\n\t\tassert.equal(segoff.offset, 0);\n\n\t\t// Slid from a removed, acked segment\n\t\tclient1.applyMsg(remove);\n\t\tsegoff = getSlideOnRemoveReferencePosition(client1, 3, createReference2);\n\t\tassert(segoff.segment);\n\t\tassert.equal(toRemovalInfo(segoff.segment), undefined);\n\t\tassert.equal(client1.getPosition(segoff.segment), 2);\n\t\tassert.equal(segoff.offset, 0);\n\n\t\t// On a removed, unacked segment, end of string\n\t\tremove = client1.makeOpMessage(client1.removeRangeLocal(2, 3), ++seq);\n\t\tsegoff = getSlideOnRemoveReferencePosition(client1, 3, createReference2);\n\t\tassert(segoff.segment);\n\t\tassert.notEqual(toRemovalInfo(segoff.segment), undefined);\n\t\tassert.equal(client1.getPosition(segoff.segment), 2);\n\t\tassert.equal(segoff.offset, 0);\n\n\t\t// Slid from a removed, acked segment, end of string\n\t\tclient1.applyMsg(remove);\n\t\tsegoff = getSlideOnRemoveReferencePosition(client1, 3, createReference2);\n\t\tassert(segoff.segment);\n\t\tassert.equal(toRemovalInfo(segoff.segment), undefined);\n\t\tassert.equal(client1.getPosition(segoff.segment), 0);\n\t\tassert.equal(segoff.offset, 1);\n\t});\n\n\tit(\"Remove all segments with sliding local reference\", () => {\n\t\tconst client1 = new TestClient();\n\t\tconst client2 = new TestClient();\n\n\t\tclient1.startOrUpdateCollaboration(\"1\");\n\t\tclient2.startOrUpdateCollaboration(\"2\");\n\t\tlet seq = 0;\n\t\tfor (let i = 0; i < 5; i++) {\n\t\t\tconst insert = client1.makeOpMessage(\n\t\t\t\tclient1.insertTextLocal(client1.getLength(), i.toString()),\n\t\t\t\t++seq,\n\t\t\t);\n\t\t\tinsert.minimumSequenceNumber = seq - 1;\n\t\t\tclient1.applyMsg(insert);\n\t\t\tclient2.applyMsg(insert);\n\t\t}\n\n\t\tconst segInfo = client1.getContainingSegment(2);\n\t\tconst c1LocalRef = client1.createLocalReferencePosition(\n\t\t\tsegInfo.segment!,\n\t\t\tsegInfo.offset,\n\t\t\tReferenceType.SlideOnRemove,\n\t\t\tundefined,\n\t\t);\n\n\t\tassert.equal(client1.localReferencePositionToPosition(c1LocalRef), 2);\n\n\t\tconst remove = client2.makeOpMessage(\n\t\t\tclient2.removeRangeLocal(0, client2.getLength()),\n\t\t\t++seq,\n\t\t);\n\t\tremove.minimumSequenceNumber = seq - 1;\n\t\tclient1.applyMsg(remove);\n\t\tclient2.applyMsg(remove);\n\n\t\tassert.equal(\n\t\t\tclient1.localReferencePositionToPosition(c1LocalRef),\n\t\t\tDetachedReferencePosition,\n\t\t);\n\t\tassert.equal(c1LocalRef.getSegment(), undefined);\n\t});\n\n\tit(\"References can have offsets on removed segment\", () => {\n\t\tconst client1 = new TestClient();\n\t\tconst client2 = new TestClient();\n\n\t\tclient1.startOrUpdateCollaboration(\"1\");\n\t\tclient2.startOrUpdateCollaboration(\"2\");\n\n\t\tlet seq = 0;\n\t\tconst insert1 = client1.makeOpMessage(client1.insertTextLocal(0, \"ABCD\"), ++seq);\n\t\tclient1.applyMsg(insert1);\n\t\tclient2.applyMsg(insert1);\n\n\t\tconst segInfo1 = client1.getContainingSegment(1);\n\t\tconst LocalRef1 = client1.createLocalReferencePosition(\n\t\t\tsegInfo1.segment!,\n\t\t\tsegInfo1.offset,\n\t\t\tReferenceType.SlideOnRemove,\n\t\t\tundefined,\n\t\t);\n\t\tconst segInfo3 = client1.getContainingSegment(3);\n\t\tconst LocalRef2 = client1.createLocalReferencePosition(\n\t\t\tsegInfo3.segment!,\n\t\t\tsegInfo3.offset,\n\t\t\tReferenceType.SlideOnRemove,\n\t\t\tundefined,\n\t\t);\n\n\t\tconst insert2 = client1.makeOpMessage(client1.insertTextLocal(2, \"XY\"), ++seq);\n\n\t\tassert.equal(client1.localReferencePositionToPosition(LocalRef1), 1);\n\t\tassert.equal(client1.localReferencePositionToPosition(LocalRef2), 5);\n\n\t\tconst c2SegInfo1 = client2.getContainingSegment(1);\n\t\tconst c2SegInfo3 = client2.getContainingSegment(3);\n\t\tconst remove = client2.makeOpMessage(\n\t\t\tclient2.removeRangeLocal(0, client2.getLength()),\n\t\t\t++seq,\n\t\t);\n\n\t\tconst c2LocalRef1 = client2.createLocalReferencePosition(\n\t\t\tc2SegInfo1.segment!,\n\t\t\tc2SegInfo1.offset,\n\t\t\tReferenceType.SlideOnRemove,\n\t\t\tundefined,\n\t\t);\n\t\tconst c2LocalRef2 = client2.createLocalReferencePosition(\n\t\t\tc2SegInfo3.segment!,\n\t\t\tc2SegInfo3.offset,\n\t\t\tReferenceType.SlideOnRemove,\n\t\t\tundefined,\n\t\t);\n\n\t\tassert.equal(client2.localReferencePositionToPosition(c2LocalRef1), 0);\n\t\tassert.equal(client2.localReferencePositionToPosition(c2LocalRef2), 0);\n\n\t\tclient1.applyMsg(insert2);\n\t\tclient2.applyMsg(insert2);\n\n\t\tassert.equal(client1.localReferencePositionToPosition(LocalRef1), 1);\n\t\tassert.equal(client1.localReferencePositionToPosition(LocalRef2), 5);\n\t\tassert.equal(client2.localReferencePositionToPosition(c2LocalRef1), 0);\n\t\tassert.equal(client2.localReferencePositionToPosition(c2LocalRef2), 2);\n\n\t\tclient1.applyMsg(remove);\n\t\tclient2.applyMsg(remove);\n\n\t\tassert.equal(client1.localReferencePositionToPosition(LocalRef1), 0);\n\t\tassert.equal(client1.localReferencePositionToPosition(LocalRef2), 1);\n\t\tassert.equal(client2.localReferencePositionToPosition(c2LocalRef1), 0);\n\t\tassert.equal(client2.localReferencePositionToPosition(c2LocalRef2), 1);\n\t});\n\n\tit(\"Transient references can be created on removed segments\", () => {\n\t\tconst client1 = new TestClient();\n\t\tconst client2 = new TestClient();\n\t\tclient1.startOrUpdateCollaboration(\"1\");\n\t\tclient2.startOrUpdateCollaboration(\"2\");\n\t\tlet seq = 0;\n\t\tconst insertOp = client1.makeOpMessage(client1.insertTextLocal(0, \"ABCD\"), ++seq);\n\t\tclient1.applyMsg(insertOp);\n\t\tclient2.applyMsg(insertOp);\n\t\tclient1.removeRangeLocal(0, 2);\n\n\t\tconst opFromBeforeRemovePerspective = client2.makeOpMessage(\n\t\t\tclient2.insertTextLocal(3, \"X\"),\n\t\t);\n\t\tconst { segment, offset } = client1.getContainingSegment(0, {\n\t\t\treferenceSequenceNumber: opFromBeforeRemovePerspective.referenceSequenceNumber,\n\t\t\tclientId: opFromBeforeRemovePerspective.clientId,\n\t\t});\n\t\tassert(segment && toRemovalInfo(segment) !== undefined);\n\t\tconst transientRef = client1.createLocalReferencePosition(\n\t\t\tsegment,\n\t\t\toffset,\n\t\t\tReferenceType.Transient,\n\t\t\t{},\n\t\t);\n\t\tassert.equal(transientRef.getSegment(), segment);\n\t\tassert.equal(transientRef.getOffset(), 0);\n\t});\n\n\tit(\"References can have offsets when slid to locally removed segment\", () => {\n\t\tconst client1 = new TestClient();\n\t\tconst client2 = new TestClient();\n\n\t\tclient1.startOrUpdateCollaboration(\"1\");\n\t\tclient2.startOrUpdateCollaboration(\"2\");\n\n\t\tlet seq = 0;\n\t\tconst insert1 = client1.makeOpMessage(client1.insertTextLocal(0, \"ABCDE\"), ++seq);\n\t\tclient1.applyMsg(insert1);\n\t\tclient2.applyMsg(insert1);\n\n\t\tconst segInfo = client1.getContainingSegment(4);\n\t\tconst localRef = client1.createLocalReferencePosition(\n\t\t\tsegInfo.segment!,\n\t\t\tsegInfo.offset,\n\t\t\tReferenceType.SlideOnRemove,\n\t\t\tundefined,\n\t\t);\n\t\tconst createReference1 = client1.makeOpMessage(\n\t\t\t{ type: MergeTreeDeltaType.INSERT },\n\t\t\t++seq,\n\t\t\tinsert1.sequenceNumber,\n\t\t);\n\n\t\tconst remove1 = client2.makeOpMessage(client2.removeRangeLocal(4, 5), ++seq);\n\n\t\tconst insert2 = client1.makeOpMessage(client1.insertTextLocal(2, \"XY\"), ++seq);\n\n\t\tconst remove2 = client2.makeOpMessage(client2.removeRangeLocal(1, 4), ++seq);\n\n\t\tconst segoff = getSlideOnRemoveReferencePosition(client2, 4, createReference1);\n\t\tconst c2LocalRef = client2.createLocalReferencePosition(\n\t\t\tsegoff.segment!,\n\t\t\tsegoff.offset,\n\t\t\tReferenceType.SlideOnRemove,\n\t\t\tundefined,\n\t\t);\n\t\tassert.equal(client1.localReferencePositionToPosition(localRef), 6);\n\t\tassert.equal(client2.localReferencePositionToPosition(c2LocalRef), 1);\n\n\t\tclient1.applyMsg(remove1);\n\t\tclient2.applyMsg(remove1);\n\n\t\tassert.equal(client1.localReferencePositionToPosition(localRef), 5);\n\t\tassert.equal(client2.localReferencePositionToPosition(c2LocalRef), 1);\n\n\t\tclient1.applyMsg(insert2);\n\t\tclient2.applyMsg(insert2);\n\n\t\tassert.equal(client1.localReferencePositionToPosition(localRef), 5);\n\t\tassert.equal(client2.getText(), \"AXY\");\n\t\tassert.equal(client2.localReferencePositionToPosition(c2LocalRef), 3);\n\n\t\tclient1.applyMsg(remove2);\n\t\tclient2.applyMsg(remove2);\n\n\t\tassert.equal(client1.localReferencePositionToPosition(localRef), 2);\n\t\tassert.equal(client2.localReferencePositionToPosition(c2LocalRef), 2);\n\t});\n\n\tit(\"Split segment with no references and append to segment with references\", () => {\n\t\tconst clients = createClientsAtInitialState({ initialState: \"\" }, \"A\", \"B\");\n\n\t\tconst messages: ISequencedDocumentMessage[] = [];\n\t\tlet seq = 0;\n\t\tmessages.push(clients.A.makeOpMessage(clients.A.insertTextLocal(0, \"0123456789\"), ++seq));\n\t\t// initialize the local reference collection on the segment, but keep it empty\n\t\t{\n\t\t\tconst segInfo = clients.A.getContainingSegment(9);\n\t\t\tconst segment = segInfo.segment;\n\t\t\tassert(segment !== undefined && TextSegment.is(segment));\n\t\t\tassert.strictEqual(segment.text[segInfo.offset!], \"9\");\n\t\t\tconst localRef = clients.A.createLocalReferencePosition(\n\t\t\t\tsegment,\n\t\t\t\tsegInfo.offset,\n\t\t\t\tReferenceType.Simple,\n\t\t\t\tundefined,\n\t\t\t);\n\t\t\tclients.A.removeLocalReferencePosition(localRef);\n\t\t}\n\t\t// split the segment\n\t\tmessages.push(clients.A.makeOpMessage(clients.A.insertTextLocal(5, \"ABCD\"), ++seq));\n\n\t\t// add a local reference to the newly inserted segment that caused the split\n\t\t{\n\t\t\tconst segInfo = clients.A.getContainingSegment(6);\n\t\t\tconst segment = segInfo.segment;\n\t\t\tassert(segment !== undefined && TextSegment.is(segment));\n\t\t\tassert.strictEqual(segment.text[segInfo.offset!], \"B\");\n\t\t\tclients.A.createLocalReferencePosition(\n\t\t\t\tsegment,\n\t\t\t\tsegInfo.offset,\n\t\t\t\tReferenceType.Simple,\n\t\t\t\tundefined,\n\t\t\t);\n\t\t}\n\t\t// apply all the ops\n\t\twhile (messages.length > 0) {\n\t\t\tconst msg = messages.shift()!;\n\t\t\tclients.all.forEach((c) => c.applyMsg(msg));\n\t\t}\n\n\t\t// regression: would fire 0x2be on zamboni during segment append\n\t\tclients.all.forEach((c) => c.updateMinSeq(seq));\n\t});\n\n\tdescribe(\"avoids removing StayOnRemove references on local + remote concurrent delete\", () => {\n\t\tlet client: TestClient;\n\t\tlet localRefA: LocalReferencePosition;\n\t\tlet localRefB: LocalReferencePosition;\n\t\tlet seq: number;\n\t\tbeforeEach(() => {\n\t\t\tseq = 0;\n\t\t\tclient = new TestClient();\n\t\t\tclient.startOrUpdateCollaboration(\"1\");\n\t\t\tclient.enqueueMsg(client.makeOpMessage(client.insertTextLocal(0, \"B\"), ++seq));\n\t\t\tclient.enqueueMsg(client.makeOpMessage(client.insertTextLocal(0, \"A\"), ++seq));\n\t\t\tclient.applyMessages(2);\n\t\t\tassert.equal(client.getText(), \"AB\");\n\t\t\tlocalRefA = client.createLocalReferencePosition(\n\t\t\t\tclient.getContainingSegment(0).segment!,\n\t\t\t\t0,\n\t\t\t\tReferenceType.StayOnRemove,\n\t\t\t\t{},\n\t\t\t);\n\t\t\tlocalRefB = client.createLocalReferencePosition(\n\t\t\t\tclient.getContainingSegment(1).segment!,\n\t\t\t\t0,\n\t\t\t\tReferenceType.StayOnRemove,\n\t\t\t\t{},\n\t\t\t);\n\t\t\tfor (const ref of [localRefA, localRefB]) {\n\t\t\t\tref.callbacks = {\n\t\t\t\t\tbeforeSlide: () => assert.fail(\"Unexpected slide\"),\n\t\t\t\t\tafterSlide: () => assert.fail(\"Unexpected slide\"),\n\t\t\t\t};\n\t\t\t}\n\t\t});\n\n\t\tit(\"when references would slide forward\", () => {\n\t\t\tconst originalSegment = localRefA.getSegment();\n\t\t\tclient.removeRangeLocal(0, 1);\n\t\t\tclient.removeRangeRemote(0, 1, ++seq, seq - 1, \"2\");\n\t\t\tassert(localRefA.getSegment() === originalSegment, \"ref was removed\");\n\t\t});\n\n\t\tit(\"when references would slide backward\", () => {\n\t\t\tconst originalSegment = localRefB.getSegment();\n\t\t\tclient.removeRangeLocal(1, 2);\n\t\t\tclient.removeRangeRemote(1, 2, ++seq, seq - 1, \"2\");\n\t\t\tassert(localRefB.getSegment() === originalSegment, \"ref was removed\");\n\t\t});\n\n\t\tit(\"when references would slide off the string\", () => {\n\t\t\tconst originalSegment = localRefA.getSegment();\n\t\t\tclient.removeRangeLocal(0, 2);\n\t\t\tclient.removeRangeRemote(0, 2, ++seq, seq - 1, \"2\");\n\t\t\tassert(localRefA.getSegment() === originalSegment, \"ref was removed\");\n\t\t});\n\t});\n\n\tit(\"slides to correct position with backward sliding preference\", () => {\n\t\tconst client1 = new TestClient();\n\t\tconst client2 = new TestClient();\n\n\t\tclient1.startOrUpdateCollaboration(\"1\");\n\t\tclient2.startOrUpdateCollaboration(\"2\");\n\n\t\tlet seq = 0;\n\t\tconst insert1 = client1.makeOpMessage(client1.insertTextLocal(0, \"abcXdef\"), ++seq);\n\t\tclient1.applyMsg(insert1);\n\t\tclient2.applyMsg(insert1);\n\n\t\tconst segInfo = client1.getContainingSegment(3);\n\n\t\tconst localRef = client1.createLocalReferencePosition(\n\t\t\tsegInfo.segment!,\n\t\t\tsegInfo.offset,\n\t\t\tReferenceType.SlideOnRemove,\n\t\t\tundefined,\n\t\t\tSlidingPreference.BACKWARD,\n\t\t);\n\n\t\tassert.equal(client1.localReferencePositionToPosition(localRef), 3);\n\n\t\tconst insert2 = client1.makeOpMessage(client1.insertTextLocal(4, \"ghi\"), ++seq);\n\t\tclient1.applyMsg(insert2);\n\t\tclient2.applyMsg(insert2);\n\n\t\tassert.equal(client1.localReferencePositionToPosition(localRef), 3);\n\n\t\tconst remove1 = client1.makeOpMessage(client1.removeRangeLocal(1, 4), ++seq);\n\t\tclient1.applyMsg(remove1);\n\t\tclient2.applyMsg(remove1);\n\n\t\tassert.equal(client1.getText(), \"aghidef\");\n\t\tassert.equal(client1.localReferencePositionToPosition(localRef), 0);\n\t\tassert.equal(client2.getText(), \"aghidef\");\n\t\tassert.equal(client2.localReferencePositionToPosition(localRef), 0);\n\t});\n\n\tconst tgCases = [\n\t\t{\n\t\t\tname: \"when the ref is not in a tracking group\",\n\t\t\taddRef: () => {},\n\t\t},\n\t\t{\n\t\t\tname: \"when the ref is in a TrackingGroup\",\n\t\t\taddRef: (ref: LocalReferencePosition) => {\n\t\t\t\tconst tg = new TrackingGroup();\n\t\t\t\ttg.link(ref);\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"when the ref is in an UnorderedTrackingGroup\",\n\t\t\taddRef: (ref: LocalReferencePosition) => {\n\t\t\t\tconst tg = new UnorderedTrackingGroup();\n\t\t\t\ttg.link(ref);\n\t\t\t},\n\t\t},\n\t];\n\n\tdescribe(\"doesn't crash for remove ref then link to undefined\", () => {\n\t\ttgCases.forEach(({ name, addRef }) => {\n\t\t\tit(name, () => {\n\t\t\t\tconst client1 = new TestClient();\n\t\t\t\tconst client2 = new TestClient();\n\n\t\t\t\tclient1.startOrUpdateCollaboration(\"1\");\n\t\t\t\tclient2.startOrUpdateCollaboration(\"2\");\n\n\t\t\t\tlet seq = 0;\n\t\t\t\tconst insert1 = client1.makeOpMessage(client1.insertTextLocal(0, \"abcdef\"), ++seq);\n\t\t\t\tclient1.applyMsg(insert1);\n\t\t\t\tclient2.applyMsg(insert1);\n\n\t\t\t\tconst segInfo = client1.getContainingSegment(3);\n\n\t\t\t\tassert(segInfo.segment);\n\n\t\t\t\tconst localRef = client1.createLocalReferencePosition(\n\t\t\t\t\tsegInfo.segment,\n\t\t\t\t\tsegInfo.offset,\n\t\t\t\t\tReferenceType.SlideOnRemove,\n\t\t\t\t\tundefined,\n\t\t\t\t);\n\t\t\t\taddRef(localRef);\n\n\t\t\t\tassert.equal(localRef.getSegment(), segInfo.segment);\n\n\t\t\t\tassert(segInfo.segment.localRefs);\n\t\t\t\tassert(!segInfo.segment.localRefs.empty);\n\n\t\t\t\tsegInfo.segment.localRefs.removeLocalRef(localRef);\n\t\t\t\tassert(segInfo.segment.localRefs.empty);\n\t\t\t\t(localRef as any).link(undefined, 0, undefined);\n\t\t\t\tassert(segInfo.segment.localRefs.empty);\n\n\t\t\t\tassert.equal(segInfo.segment.localRefs.empty, true);\n\t\t\t\tassert.equal(segInfo.segment.localRefs.has(localRef), false);\n\t\t\t\tassert.equal(localRef.getSegment(), undefined);\n\t\t\t\tassert.equal(localRef.getOffset(), 0);\n\t\t\t});\n\t\t});\n\t});\n\n\tdescribe(\"doesn't crash for link to undefined then remove ref\", () => {\n\t\ttgCases.forEach(({ name, addRef }) => {\n\t\t\tit(name, () => {\n\t\t\t\tconst client1 = new TestClient();\n\t\t\t\tconst client2 = new TestClient();\n\n\t\t\t\tclient1.startOrUpdateCollaboration(\"1\");\n\t\t\t\tclient2.startOrUpdateCollaboration(\"2\");\n\n\t\t\t\tlet seq = 0;\n\t\t\t\tconst insert1 = client1.makeOpMessage(client1.insertTextLocal(0, \"abcdef\"), ++seq);\n\t\t\t\tclient1.applyMsg(insert1);\n\t\t\t\tclient2.applyMsg(insert1);\n\n\t\t\t\tconst segInfo = client1.getContainingSegment(3);\n\n\t\t\t\tassert(segInfo.segment);\n\n\t\t\t\tconst localRef = client1.createLocalReferencePosition(\n\t\t\t\t\tsegInfo.segment,\n\t\t\t\t\tsegInfo.offset,\n\t\t\t\t\tReferenceType.SlideOnRemove,\n\t\t\t\t\tundefined,\n\t\t\t\t);\n\t\t\t\taddRef(localRef);\n\n\t\t\t\tassert.equal(localRef.getSegment(), segInfo.segment);\n\n\t\t\t\tassert(segInfo.segment.localRefs);\n\t\t\t\tassert(!segInfo.segment.localRefs.empty);\n\n\t\t\t\t(localRef as any).link(undefined, 0, undefined);\n\t\t\t\tassert(segInfo.segment.localRefs.empty);\n\t\t\t\tsegInfo.segment.localRefs.removeLocalRef(localRef);\n\t\t\t\tassert(segInfo.segment.localRefs.empty);\n\n\t\t\t\tassert.equal(segInfo.segment.localRefs.empty, true);\n\t\t\t\tassert.equal(segInfo.segment.localRefs.has(localRef), false);\n\t\t\t\tassert.equal(localRef.getSegment(), undefined);\n\t\t\t\tassert.equal(localRef.getOffset(), 0);\n\t\t\t});\n\t\t});\n\t});\n});\n"]}
1
+ {"version":3,"file":"client.localReference.spec.js","sourceRoot":"","sources":["../../src/test/client.localReference.spec.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-unsafe-call */\n/* eslint-disable @typescript-eslint/no-non-null-assertion */\n\nimport { strict as assert } from \"node:assert\";\n\nimport { ISequencedDocumentMessage } from \"@fluidframework/driver-definitions/internal\";\n\nimport { Client } from \"../client.js\";\nimport {\n\tLocalReferencePosition,\n\tSlidingPreference,\n\tsetValidateRefCount,\n} from \"../localReference.js\";\nimport { getSlideToSegoff } from \"../mergeTree.js\";\nimport { toRemovalInfo, type ISegment } from \"../mergeTreeNodes.js\";\nimport { TrackingGroup, UnorderedTrackingGroup } from \"../mergeTreeTracking.js\";\nimport { MergeTreeDeltaType, ReferenceType } from \"../ops.js\";\nimport { DetachedReferencePosition } from \"../referencePositions.js\";\nimport { TextSegment } from \"../textSegment.js\";\n\nimport { TestClient } from \"./testClient.js\";\nimport { createClientsAtInitialState } from \"./testClientLogger.js\";\nimport { validateRefCount } from \"./testUtils.js\";\n\nfunction getSlideOnRemoveReferencePosition(\n\tclient: Client,\n\tpos: number,\n\top: ISequencedDocumentMessage,\n): {\n\tsegment: ISegment | undefined;\n\toffset: number | undefined;\n} {\n\tlet segoff = client.getContainingSegment(pos, {\n\t\treferenceSequenceNumber: op.referenceSequenceNumber,\n\t\tclientId: op.clientId,\n\t});\n\tsegoff = getSlideToSegoff(segoff);\n\treturn segoff;\n}\n\ndescribe(\"MergeTree.Client\", () => {\n\tbeforeEach(() => {\n\t\tsetValidateRefCount(validateRefCount);\n\t});\n\n\tafterEach(() => {\n\t\tsetValidateRefCount(undefined);\n\t});\n\n\tit(\"Remove segment of non-sliding local reference\", () => {\n\t\tconst client1 = new TestClient();\n\t\tconst client2 = new TestClient();\n\n\t\tclient1.startOrUpdateCollaboration(\"1\");\n\t\tclient2.startOrUpdateCollaboration(\"2\");\n\t\tlet seq = 0;\n\t\tfor (let i = 0; i < 5; i++) {\n\t\t\tconst insert = client1.makeOpMessage(\n\t\t\t\tclient1.insertTextLocal(client1.getLength(), i.toString()),\n\t\t\t\t++seq,\n\t\t\t);\n\t\t\tinsert.minimumSequenceNumber = seq - 1;\n\t\t\tclient1.applyMsg(insert);\n\t\t\tclient2.applyMsg(insert);\n\t\t}\n\n\t\tconst segInfo = client1.getContainingSegment(2);\n\t\tconst c1LocalRef = client1.createLocalReferencePosition(\n\t\t\tsegInfo.segment!,\n\t\t\tsegInfo.offset,\n\t\t\tReferenceType.Simple,\n\t\t\tundefined,\n\t\t);\n\n\t\tassert.equal(client1.localReferencePositionToPosition(c1LocalRef), 2, \"create position\");\n\n\t\tconst remove = client2.makeOpMessage(client2.removeRangeLocal(2, 3), ++seq);\n\t\tremove.minimumSequenceNumber = seq - 1;\n\t\tclient1.applyMsg(remove);\n\t\tclient2.applyMsg(remove);\n\n\t\t// this only works because zamboni hasn't run yet\n\t\tassert.equal(\n\t\t\tclient1.localReferencePositionToPosition(c1LocalRef),\n\t\t\tDetachedReferencePosition,\n\t\t\t\"after remove\",\n\t\t);\n\n\t\t// this will force Zamboni to run\n\t\tfor (let i = 0; i < 5; i++) {\n\t\t\tconst insert = client1.makeOpMessage(\n\t\t\t\tclient1.insertTextLocal(client1.getLength(), i.toString()),\n\t\t\t\t++seq,\n\t\t\t);\n\t\t\tinsert.minimumSequenceNumber = seq - 1;\n\t\t\tclient1.applyMsg(insert);\n\t\t\tclient2.applyMsg(insert);\n\t\t}\n\t\tassert.equal(\n\t\t\tclient1.localReferencePositionToPosition(c1LocalRef),\n\t\t\tDetachedReferencePosition,\n\t\t\t\"after zamboni\",\n\t\t);\n\t});\n\n\tit(\"Remove segment of sliding local reference\", () => {\n\t\tconst client1 = new TestClient();\n\t\tconst client2 = new TestClient();\n\n\t\tclient1.startOrUpdateCollaboration(\"1\");\n\t\tclient2.startOrUpdateCollaboration(\"2\");\n\t\tlet seq = 0;\n\t\tfor (let i = 0; i < 5; i++) {\n\t\t\tconst insert = client1.makeOpMessage(\n\t\t\t\tclient1.insertTextLocal(client1.getLength(), i.toString()),\n\t\t\t\t++seq,\n\t\t\t);\n\t\t\tinsert.minimumSequenceNumber = seq - 1;\n\t\t\tclient1.applyMsg(insert);\n\t\t\tclient2.applyMsg(insert);\n\t\t}\n\n\t\tconst segInfo = client1.getContainingSegment(2);\n\t\tconst c1LocalRef = client1.createLocalReferencePosition(\n\t\t\tsegInfo.segment!,\n\t\t\tsegInfo.offset,\n\t\t\tReferenceType.SlideOnRemove,\n\t\t\tundefined,\n\t\t);\n\n\t\tassert.equal(client1.localReferencePositionToPosition(c1LocalRef), 2);\n\n\t\tconst remove = client2.makeOpMessage(client2.removeRangeLocal(2, 3), ++seq);\n\t\tremove.minimumSequenceNumber = seq - 1;\n\t\tclient1.applyMsg(remove);\n\t\tclient2.applyMsg(remove);\n\n\t\tassert.equal(client1.localReferencePositionToPosition(c1LocalRef), 2);\n\n\t\tfor (let i = 0; i < 5; i++) {\n\t\t\tconst insert = client1.makeOpMessage(\n\t\t\t\tclient1.insertTextLocal(client1.getLength(), i.toString()),\n\t\t\t\t++seq,\n\t\t\t);\n\t\t\tinsert.minimumSequenceNumber = seq - 1;\n\t\t\tclient1.applyMsg(insert);\n\t\t\tclient2.applyMsg(insert);\n\t\t}\n\n\t\tassert.equal(client1.localReferencePositionToPosition(c1LocalRef), 2);\n\t});\n\n\tit(\"Remove segments to end with sliding local reference\", () => {\n\t\tconst client1 = new TestClient();\n\t\tconst client2 = new TestClient();\n\n\t\tclient1.startOrUpdateCollaboration(\"1\");\n\t\tclient2.startOrUpdateCollaboration(\"2\");\n\t\tlet seq = 0;\n\t\tfor (let i = 0; i < 5; i++) {\n\t\t\tconst insert = client1.makeOpMessage(\n\t\t\t\tclient1.insertTextLocal(client1.getLength(), i.toString()),\n\t\t\t\t++seq,\n\t\t\t);\n\t\t\tinsert.minimumSequenceNumber = seq - 1;\n\t\t\tclient1.applyMsg(insert);\n\t\t\tclient2.applyMsg(insert);\n\t\t}\n\n\t\tconst segInfo = client1.getContainingSegment(2);\n\t\tconst c1LocalRef = client1.createLocalReferencePosition(\n\t\t\tsegInfo.segment!,\n\t\t\tsegInfo.offset,\n\t\t\tReferenceType.SlideOnRemove,\n\t\t\tundefined,\n\t\t);\n\n\t\tassert.equal(client1.localReferencePositionToPosition(c1LocalRef), 2);\n\n\t\tconst remove = client2.makeOpMessage(\n\t\t\tclient2.removeRangeLocal(2, client2.getLength()),\n\t\t\t++seq,\n\t\t);\n\t\tremove.minimumSequenceNumber = seq - 1;\n\t\tclient1.applyMsg(remove);\n\t\tclient2.applyMsg(remove);\n\n\t\tassert.equal(\n\t\t\tclient1.localReferencePositionToPosition(c1LocalRef),\n\t\t\tclient2.getLength() - 1,\n\t\t);\n\t});\n\n\tit(\"Remove segments from end with sliding local reference\", () => {\n\t\tconst client1 = new TestClient();\n\n\t\tclient1.startOrUpdateCollaboration(\"1\");\n\t\tlet seq = 0;\n\t\tconst insert = client1.makeOpMessage(client1.insertTextLocal(0, \"ABCD\"), ++seq);\n\t\tinsert.minimumSequenceNumber = seq - 1;\n\t\tclient1.applyMsg(insert);\n\n\t\tconst segInfo = client1.getContainingSegment(3);\n\t\tconst c1LocalRef = client1.createLocalReferencePosition(\n\t\t\tsegInfo.segment!,\n\t\t\tsegInfo.offset,\n\t\t\tReferenceType.SlideOnRemove,\n\t\t\tundefined,\n\t\t);\n\n\t\tassert.equal(client1.localReferencePositionToPosition(c1LocalRef), 3, \"ref created\");\n\n\t\tconst remove1 = client1.makeOpMessage(client1.removeRangeLocal(3, 4), ++seq);\n\t\tremove1.minimumSequenceNumber = seq - 1;\n\t\tassert.equal(client1.localReferencePositionToPosition(c1LocalRef), 3, \"after remove\");\n\n\t\tconst remove2 = client1.makeOpMessage(client1.removeRangeLocal(1, 3), ++seq);\n\t\tremove2.minimumSequenceNumber = seq - 1;\n\t\tassert.equal(\n\t\t\tclient1.localReferencePositionToPosition(c1LocalRef),\n\t\t\t1,\n\t\t\t\"after second remove\",\n\t\t);\n\n\t\tclient1.applyMsg(remove1);\n\t\tclient1.applyMsg(remove2);\n\n\t\tassert.equal(client1.localReferencePositionToPosition(c1LocalRef), 0, \"ops applied\");\n\t});\n\n\tit(\"getSlideOnRemoveReferencePosition\", () => {\n\t\tconst client1 = new TestClient();\n\t\tconst client2 = new TestClient();\n\t\tclient1.startOrUpdateCollaboration(\"1\");\n\t\tclient2.startOrUpdateCollaboration(\"2\");\n\n\t\tlet seq = 0;\n\t\tconst insert1 = client1.makeOpMessage(client1.insertTextLocal(0, \"XYZ\"), ++seq);\n\t\tclient1.applyMsg(insert1);\n\n\t\tconst insert2 = client1.makeOpMessage(client1.insertTextLocal(0, \"ABC\"), ++seq);\n\t\tclient1.applyMsg(insert2);\n\n\t\t// Position depends on op\n\t\tconst createReference1 = client2.makeOpMessage(\n\t\t\t{ type: MergeTreeDeltaType.INSERT },\n\t\t\t++seq,\n\t\t\tinsert1.sequenceNumber,\n\t\t);\n\t\tlet segoff = getSlideOnRemoveReferencePosition(client1, 1, createReference1);\n\t\tassert(segoff.segment);\n\t\tassert.equal(client1.getPosition(segoff.segment), 3);\n\t\tassert.equal(segoff.offset, 1);\n\n\t\tconst createReference2 = client2.makeOpMessage(\n\t\t\t{ type: MergeTreeDeltaType.INSERT },\n\t\t\t++seq,\n\t\t\tinsert2.sequenceNumber,\n\t\t);\n\t\tsegoff = getSlideOnRemoveReferencePosition(client1, 2, createReference2);\n\t\tassert(segoff.segment);\n\t\tassert.equal(client1.getPosition(segoff.segment), 0);\n\t\tassert.equal(segoff.offset, 2);\n\n\t\t// On a removed, unacked segment\n\t\tlet remove = client1.makeOpMessage(client1.removeRangeLocal(2, 5), ++seq);\n\t\tsegoff = getSlideOnRemoveReferencePosition(client1, 3, createReference2);\n\t\tassert(segoff.segment);\n\t\tassert.notEqual(toRemovalInfo(segoff.segment), undefined);\n\t\tassert.equal(client1.getPosition(segoff.segment), 2);\n\t\tassert.equal(segoff.offset, 0);\n\n\t\t// Slid from a removed, acked segment\n\t\tclient1.applyMsg(remove);\n\t\tsegoff = getSlideOnRemoveReferencePosition(client1, 3, createReference2);\n\t\tassert(segoff.segment);\n\t\tassert.equal(toRemovalInfo(segoff.segment), undefined);\n\t\tassert.equal(client1.getPosition(segoff.segment), 2);\n\t\tassert.equal(segoff.offset, 0);\n\n\t\t// On a removed, unacked segment, end of string\n\t\tremove = client1.makeOpMessage(client1.removeRangeLocal(2, 3), ++seq);\n\t\tsegoff = getSlideOnRemoveReferencePosition(client1, 3, createReference2);\n\t\tassert(segoff.segment);\n\t\tassert.notEqual(toRemovalInfo(segoff.segment), undefined);\n\t\tassert.equal(client1.getPosition(segoff.segment), 2);\n\t\tassert.equal(segoff.offset, 0);\n\n\t\t// Slid from a removed, acked segment, end of string\n\t\tclient1.applyMsg(remove);\n\t\tsegoff = getSlideOnRemoveReferencePosition(client1, 3, createReference2);\n\t\tassert(segoff.segment);\n\t\tassert.equal(toRemovalInfo(segoff.segment), undefined);\n\t\tassert.equal(client1.getPosition(segoff.segment), 0);\n\t\tassert.equal(segoff.offset, 1);\n\t});\n\n\tit(\"Remove all segments with sliding local reference\", () => {\n\t\tconst client1 = new TestClient();\n\t\tconst client2 = new TestClient();\n\n\t\tclient1.startOrUpdateCollaboration(\"1\");\n\t\tclient2.startOrUpdateCollaboration(\"2\");\n\t\tlet seq = 0;\n\t\tfor (let i = 0; i < 5; i++) {\n\t\t\tconst insert = client1.makeOpMessage(\n\t\t\t\tclient1.insertTextLocal(client1.getLength(), i.toString()),\n\t\t\t\t++seq,\n\t\t\t);\n\t\t\tinsert.minimumSequenceNumber = seq - 1;\n\t\t\tclient1.applyMsg(insert);\n\t\t\tclient2.applyMsg(insert);\n\t\t}\n\n\t\tconst segInfo = client1.getContainingSegment(2);\n\t\tconst c1LocalRef = client1.createLocalReferencePosition(\n\t\t\tsegInfo.segment!,\n\t\t\tsegInfo.offset,\n\t\t\tReferenceType.SlideOnRemove,\n\t\t\tundefined,\n\t\t);\n\n\t\tassert.equal(client1.localReferencePositionToPosition(c1LocalRef), 2);\n\n\t\tconst remove = client2.makeOpMessage(\n\t\t\tclient2.removeRangeLocal(0, client2.getLength()),\n\t\t\t++seq,\n\t\t);\n\t\tremove.minimumSequenceNumber = seq - 1;\n\t\tclient1.applyMsg(remove);\n\t\tclient2.applyMsg(remove);\n\n\t\tassert.equal(\n\t\t\tclient1.localReferencePositionToPosition(c1LocalRef),\n\t\t\tDetachedReferencePosition,\n\t\t);\n\t\tassert.equal(c1LocalRef.getSegment(), undefined);\n\t});\n\n\tit(\"References can have offsets on removed segment\", () => {\n\t\tconst client1 = new TestClient();\n\t\tconst client2 = new TestClient();\n\n\t\tclient1.startOrUpdateCollaboration(\"1\");\n\t\tclient2.startOrUpdateCollaboration(\"2\");\n\n\t\tlet seq = 0;\n\t\tconst insert1 = client1.makeOpMessage(client1.insertTextLocal(0, \"ABCD\"), ++seq);\n\t\tclient1.applyMsg(insert1);\n\t\tclient2.applyMsg(insert1);\n\n\t\tconst segInfo1 = client1.getContainingSegment(1);\n\t\tconst LocalRef1 = client1.createLocalReferencePosition(\n\t\t\tsegInfo1.segment!,\n\t\t\tsegInfo1.offset,\n\t\t\tReferenceType.SlideOnRemove,\n\t\t\tundefined,\n\t\t);\n\t\tconst segInfo3 = client1.getContainingSegment(3);\n\t\tconst LocalRef2 = client1.createLocalReferencePosition(\n\t\t\tsegInfo3.segment!,\n\t\t\tsegInfo3.offset,\n\t\t\tReferenceType.SlideOnRemove,\n\t\t\tundefined,\n\t\t);\n\n\t\tconst insert2 = client1.makeOpMessage(client1.insertTextLocal(2, \"XY\"), ++seq);\n\n\t\tassert.equal(client1.localReferencePositionToPosition(LocalRef1), 1);\n\t\tassert.equal(client1.localReferencePositionToPosition(LocalRef2), 5);\n\n\t\tconst c2SegInfo1 = client2.getContainingSegment(1);\n\t\tconst c2SegInfo3 = client2.getContainingSegment(3);\n\t\tconst remove = client2.makeOpMessage(\n\t\t\tclient2.removeRangeLocal(0, client2.getLength()),\n\t\t\t++seq,\n\t\t);\n\n\t\tconst c2LocalRef1 = client2.createLocalReferencePosition(\n\t\t\tc2SegInfo1.segment!,\n\t\t\tc2SegInfo1.offset,\n\t\t\tReferenceType.SlideOnRemove,\n\t\t\tundefined,\n\t\t);\n\t\tconst c2LocalRef2 = client2.createLocalReferencePosition(\n\t\t\tc2SegInfo3.segment!,\n\t\t\tc2SegInfo3.offset,\n\t\t\tReferenceType.SlideOnRemove,\n\t\t\tundefined,\n\t\t);\n\n\t\tassert.equal(client2.localReferencePositionToPosition(c2LocalRef1), 0);\n\t\tassert.equal(client2.localReferencePositionToPosition(c2LocalRef2), 0);\n\n\t\tclient1.applyMsg(insert2);\n\t\tclient2.applyMsg(insert2);\n\n\t\tassert.equal(client1.localReferencePositionToPosition(LocalRef1), 1);\n\t\tassert.equal(client1.localReferencePositionToPosition(LocalRef2), 5);\n\t\tassert.equal(client2.localReferencePositionToPosition(c2LocalRef1), 0);\n\t\tassert.equal(client2.localReferencePositionToPosition(c2LocalRef2), 2);\n\n\t\tclient1.applyMsg(remove);\n\t\tclient2.applyMsg(remove);\n\n\t\tassert.equal(client1.localReferencePositionToPosition(LocalRef1), 0);\n\t\tassert.equal(client1.localReferencePositionToPosition(LocalRef2), 1);\n\t\tassert.equal(client2.localReferencePositionToPosition(c2LocalRef1), 0);\n\t\tassert.equal(client2.localReferencePositionToPosition(c2LocalRef2), 1);\n\t});\n\n\tit(\"Transient references can be created on removed segments\", () => {\n\t\tconst client1 = new TestClient();\n\t\tconst client2 = new TestClient();\n\t\tclient1.startOrUpdateCollaboration(\"1\");\n\t\tclient2.startOrUpdateCollaboration(\"2\");\n\t\tlet seq = 0;\n\t\tconst insertOp = client1.makeOpMessage(client1.insertTextLocal(0, \"ABCD\"), ++seq);\n\t\tclient1.applyMsg(insertOp);\n\t\tclient2.applyMsg(insertOp);\n\t\tclient1.removeRangeLocal(0, 2);\n\n\t\tconst opFromBeforeRemovePerspective = client2.makeOpMessage(\n\t\t\tclient2.insertTextLocal(3, \"X\"),\n\t\t);\n\t\tconst { segment, offset } = client1.getContainingSegment(0, {\n\t\t\treferenceSequenceNumber: opFromBeforeRemovePerspective.referenceSequenceNumber,\n\t\t\tclientId: opFromBeforeRemovePerspective.clientId,\n\t\t});\n\t\tassert(segment && toRemovalInfo(segment) !== undefined);\n\t\tconst transientRef = client1.createLocalReferencePosition(\n\t\t\tsegment,\n\t\t\toffset,\n\t\t\tReferenceType.Transient,\n\t\t\t{},\n\t\t);\n\t\tassert.equal(transientRef.getSegment(), segment);\n\t\tassert.equal(transientRef.getOffset(), 0);\n\t});\n\n\tit(\"References can have offsets when slid to locally removed segment\", () => {\n\t\tconst client1 = new TestClient();\n\t\tconst client2 = new TestClient();\n\n\t\tclient1.startOrUpdateCollaboration(\"1\");\n\t\tclient2.startOrUpdateCollaboration(\"2\");\n\n\t\tlet seq = 0;\n\t\tconst insert1 = client1.makeOpMessage(client1.insertTextLocal(0, \"ABCDE\"), ++seq);\n\t\tclient1.applyMsg(insert1);\n\t\tclient2.applyMsg(insert1);\n\n\t\tconst segInfo = client1.getContainingSegment(4);\n\t\tconst localRef = client1.createLocalReferencePosition(\n\t\t\tsegInfo.segment!,\n\t\t\tsegInfo.offset,\n\t\t\tReferenceType.SlideOnRemove,\n\t\t\tundefined,\n\t\t);\n\t\tconst createReference1 = client1.makeOpMessage(\n\t\t\t{ type: MergeTreeDeltaType.INSERT },\n\t\t\t++seq,\n\t\t\tinsert1.sequenceNumber,\n\t\t);\n\n\t\tconst remove1 = client2.makeOpMessage(client2.removeRangeLocal(4, 5), ++seq);\n\n\t\tconst insert2 = client1.makeOpMessage(client1.insertTextLocal(2, \"XY\"), ++seq);\n\n\t\tconst remove2 = client2.makeOpMessage(client2.removeRangeLocal(1, 4), ++seq);\n\n\t\tconst segoff = getSlideOnRemoveReferencePosition(client2, 4, createReference1);\n\t\tconst c2LocalRef = client2.createLocalReferencePosition(\n\t\t\tsegoff.segment!,\n\t\t\tsegoff.offset,\n\t\t\tReferenceType.SlideOnRemove,\n\t\t\tundefined,\n\t\t);\n\t\tassert.equal(client1.localReferencePositionToPosition(localRef), 6);\n\t\tassert.equal(client2.localReferencePositionToPosition(c2LocalRef), 1);\n\n\t\tclient1.applyMsg(remove1);\n\t\tclient2.applyMsg(remove1);\n\n\t\tassert.equal(client1.localReferencePositionToPosition(localRef), 5);\n\t\tassert.equal(client2.localReferencePositionToPosition(c2LocalRef), 1);\n\n\t\tclient1.applyMsg(insert2);\n\t\tclient2.applyMsg(insert2);\n\n\t\tassert.equal(client1.localReferencePositionToPosition(localRef), 5);\n\t\tassert.equal(client2.getText(), \"AXY\");\n\t\tassert.equal(client2.localReferencePositionToPosition(c2LocalRef), 3);\n\n\t\tclient1.applyMsg(remove2);\n\t\tclient2.applyMsg(remove2);\n\n\t\tassert.equal(client1.localReferencePositionToPosition(localRef), 2);\n\t\tassert.equal(client2.localReferencePositionToPosition(c2LocalRef), 2);\n\t});\n\n\tit(\"Split segment with no references and append to segment with references\", () => {\n\t\tconst clients = createClientsAtInitialState({ initialState: \"\" }, \"A\", \"B\");\n\n\t\tconst messages: ISequencedDocumentMessage[] = [];\n\t\tlet seq = 0;\n\t\tmessages.push(clients.A.makeOpMessage(clients.A.insertTextLocal(0, \"0123456789\"), ++seq));\n\t\t// initialize the local reference collection on the segment, but keep it empty\n\t\t{\n\t\t\tconst segInfo = clients.A.getContainingSegment(9);\n\t\t\tconst segment = segInfo.segment;\n\t\t\tassert(segment !== undefined && TextSegment.is(segment));\n\t\t\tassert.strictEqual(segment.text[segInfo.offset!], \"9\");\n\t\t\tconst localRef = clients.A.createLocalReferencePosition(\n\t\t\t\tsegment,\n\t\t\t\tsegInfo.offset,\n\t\t\t\tReferenceType.Simple,\n\t\t\t\tundefined,\n\t\t\t);\n\t\t\tclients.A.removeLocalReferencePosition(localRef);\n\t\t}\n\t\t// split the segment\n\t\tmessages.push(clients.A.makeOpMessage(clients.A.insertTextLocal(5, \"ABCD\"), ++seq));\n\n\t\t// add a local reference to the newly inserted segment that caused the split\n\t\t{\n\t\t\tconst segInfo = clients.A.getContainingSegment(6);\n\t\t\tconst segment = segInfo.segment;\n\t\t\tassert(segment !== undefined && TextSegment.is(segment));\n\t\t\tassert.strictEqual(segment.text[segInfo.offset!], \"B\");\n\t\t\tclients.A.createLocalReferencePosition(\n\t\t\t\tsegment,\n\t\t\t\tsegInfo.offset,\n\t\t\t\tReferenceType.Simple,\n\t\t\t\tundefined,\n\t\t\t);\n\t\t}\n\t\t// apply all the ops\n\t\twhile (messages.length > 0) {\n\t\t\tconst msg = messages.shift()!;\n\t\t\tfor (const c of clients.all) c.applyMsg(msg);\n\t\t}\n\n\t\t// regression: would fire 0x2be on zamboni during segment append\n\t\tfor (const c of clients.all) c.updateMinSeq(seq);\n\t});\n\n\tdescribe(\"avoids removing StayOnRemove references on local + remote concurrent delete\", () => {\n\t\tlet client: TestClient;\n\t\tlet localRefA: LocalReferencePosition;\n\t\tlet localRefB: LocalReferencePosition;\n\t\tlet seq: number;\n\t\tbeforeEach(() => {\n\t\t\tseq = 0;\n\t\t\tclient = new TestClient();\n\t\t\tclient.startOrUpdateCollaboration(\"1\");\n\t\t\tclient.enqueueMsg(client.makeOpMessage(client.insertTextLocal(0, \"B\"), ++seq));\n\t\t\tclient.enqueueMsg(client.makeOpMessage(client.insertTextLocal(0, \"A\"), ++seq));\n\t\t\tclient.applyMessages(2);\n\t\t\tassert.equal(client.getText(), \"AB\");\n\t\t\tlocalRefA = client.createLocalReferencePosition(\n\t\t\t\tclient.getContainingSegment(0).segment!,\n\t\t\t\t0,\n\t\t\t\tReferenceType.StayOnRemove,\n\t\t\t\t{},\n\t\t\t);\n\t\t\tlocalRefB = client.createLocalReferencePosition(\n\t\t\t\tclient.getContainingSegment(1).segment!,\n\t\t\t\t0,\n\t\t\t\tReferenceType.StayOnRemove,\n\t\t\t\t{},\n\t\t\t);\n\t\t\tfor (const ref of [localRefA, localRefB]) {\n\t\t\t\tref.callbacks = {\n\t\t\t\t\tbeforeSlide: (): void => assert.fail(\"Unexpected slide\"),\n\t\t\t\t\tafterSlide: (): void => assert.fail(\"Unexpected slide\"),\n\t\t\t\t};\n\t\t\t}\n\t\t});\n\n\t\tit(\"when references would slide forward\", () => {\n\t\t\tconst originalSegment = localRefA.getSegment();\n\t\t\tclient.removeRangeLocal(0, 1);\n\t\t\tclient.removeRangeRemote(0, 1, ++seq, seq - 1, \"2\");\n\t\t\tassert(localRefA.getSegment() === originalSegment, \"ref was removed\");\n\t\t});\n\n\t\tit(\"when references would slide backward\", () => {\n\t\t\tconst originalSegment = localRefB.getSegment();\n\t\t\tclient.removeRangeLocal(1, 2);\n\t\t\tclient.removeRangeRemote(1, 2, ++seq, seq - 1, \"2\");\n\t\t\tassert(localRefB.getSegment() === originalSegment, \"ref was removed\");\n\t\t});\n\n\t\tit(\"when references would slide off the string\", () => {\n\t\t\tconst originalSegment = localRefA.getSegment();\n\t\t\tclient.removeRangeLocal(0, 2);\n\t\t\tclient.removeRangeRemote(0, 2, ++seq, seq - 1, \"2\");\n\t\t\tassert(localRefA.getSegment() === originalSegment, \"ref was removed\");\n\t\t});\n\t});\n\n\tit(\"slides to correct position with backward sliding preference\", () => {\n\t\tconst client1 = new TestClient();\n\t\tconst client2 = new TestClient();\n\n\t\tclient1.startOrUpdateCollaboration(\"1\");\n\t\tclient2.startOrUpdateCollaboration(\"2\");\n\n\t\tlet seq = 0;\n\t\tconst insert1 = client1.makeOpMessage(client1.insertTextLocal(0, \"abcXdef\"), ++seq);\n\t\tclient1.applyMsg(insert1);\n\t\tclient2.applyMsg(insert1);\n\n\t\tconst segInfo = client1.getContainingSegment(3);\n\n\t\tconst localRef = client1.createLocalReferencePosition(\n\t\t\tsegInfo.segment!,\n\t\t\tsegInfo.offset,\n\t\t\tReferenceType.SlideOnRemove,\n\t\t\tundefined,\n\t\t\tSlidingPreference.BACKWARD,\n\t\t);\n\n\t\tassert.equal(client1.localReferencePositionToPosition(localRef), 3);\n\n\t\tconst insert2 = client1.makeOpMessage(client1.insertTextLocal(4, \"ghi\"), ++seq);\n\t\tclient1.applyMsg(insert2);\n\t\tclient2.applyMsg(insert2);\n\n\t\tassert.equal(client1.localReferencePositionToPosition(localRef), 3);\n\n\t\tconst remove1 = client1.makeOpMessage(client1.removeRangeLocal(1, 4), ++seq);\n\t\tclient1.applyMsg(remove1);\n\t\tclient2.applyMsg(remove1);\n\n\t\tassert.equal(client1.getText(), \"aghidef\");\n\t\tassert.equal(client1.localReferencePositionToPosition(localRef), 0);\n\t\tassert.equal(client2.getText(), \"aghidef\");\n\t\tassert.equal(client2.localReferencePositionToPosition(localRef), 0);\n\t});\n\n\tconst tgCases = [\n\t\t{\n\t\t\tname: \"when the ref is not in a tracking group\",\n\t\t\taddRef: (): void => {},\n\t\t},\n\t\t{\n\t\t\tname: \"when the ref is in a TrackingGroup\",\n\t\t\taddRef: (ref: LocalReferencePosition): void => {\n\t\t\t\tconst tg = new TrackingGroup();\n\t\t\t\ttg.link(ref);\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"when the ref is in an UnorderedTrackingGroup\",\n\t\t\taddRef: (ref: LocalReferencePosition): void => {\n\t\t\t\tconst tg = new UnorderedTrackingGroup();\n\t\t\t\ttg.link(ref);\n\t\t\t},\n\t\t},\n\t];\n\n\tdescribe(\"doesn't crash for remove ref then link to undefined\", () => {\n\t\tfor (const { name, addRef } of tgCases) {\n\t\t\tit(name, () => {\n\t\t\t\tconst client1 = new TestClient();\n\t\t\t\tconst client2 = new TestClient();\n\n\t\t\t\tclient1.startOrUpdateCollaboration(\"1\");\n\t\t\t\tclient2.startOrUpdateCollaboration(\"2\");\n\n\t\t\t\tlet seq = 0;\n\t\t\t\tconst insert1 = client1.makeOpMessage(client1.insertTextLocal(0, \"abcdef\"), ++seq);\n\t\t\t\tclient1.applyMsg(insert1);\n\t\t\t\tclient2.applyMsg(insert1);\n\n\t\t\t\tconst segInfo = client1.getContainingSegment(3);\n\n\t\t\t\tassert(segInfo.segment);\n\n\t\t\t\tconst localRef = client1.createLocalReferencePosition(\n\t\t\t\t\tsegInfo.segment,\n\t\t\t\t\tsegInfo.offset,\n\t\t\t\t\tReferenceType.SlideOnRemove,\n\t\t\t\t\tundefined,\n\t\t\t\t);\n\t\t\t\taddRef(localRef);\n\n\t\t\t\tassert.equal(localRef.getSegment(), segInfo.segment);\n\n\t\t\t\tassert(segInfo.segment.localRefs);\n\t\t\t\tassert(!segInfo.segment.localRefs.empty);\n\n\t\t\t\tsegInfo.segment.localRefs.removeLocalRef(localRef);\n\t\t\t\tassert(segInfo.segment.localRefs.empty);\n\t\t\t\t// Cast is necessary because LocalReference is not exported, so we can't directly call link.\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-explicit-any\n\t\t\t\t(localRef as any).link(undefined, 0, undefined);\n\t\t\t\tassert(segInfo.segment.localRefs.empty);\n\n\t\t\t\tassert.equal(segInfo.segment.localRefs.empty, true);\n\t\t\t\tassert.equal(segInfo.segment.localRefs.has(localRef), false);\n\t\t\t\tassert.equal(localRef.getSegment(), undefined);\n\t\t\t\tassert.equal(localRef.getOffset(), 0);\n\t\t\t});\n\t\t}\n\t});\n\n\tdescribe(\"doesn't crash for link to undefined then remove ref\", () => {\n\t\tfor (const { name, addRef } of tgCases) {\n\t\t\tit(name, () => {\n\t\t\t\tconst client1 = new TestClient();\n\t\t\t\tconst client2 = new TestClient();\n\n\t\t\t\tclient1.startOrUpdateCollaboration(\"1\");\n\t\t\t\tclient2.startOrUpdateCollaboration(\"2\");\n\n\t\t\t\tlet seq = 0;\n\t\t\t\tconst insert1 = client1.makeOpMessage(client1.insertTextLocal(0, \"abcdef\"), ++seq);\n\t\t\t\tclient1.applyMsg(insert1);\n\t\t\t\tclient2.applyMsg(insert1);\n\n\t\t\t\tconst segInfo = client1.getContainingSegment(3);\n\n\t\t\t\tassert(segInfo.segment);\n\n\t\t\t\tconst localRef = client1.createLocalReferencePosition(\n\t\t\t\t\tsegInfo.segment,\n\t\t\t\t\tsegInfo.offset,\n\t\t\t\t\tReferenceType.SlideOnRemove,\n\t\t\t\t\tundefined,\n\t\t\t\t);\n\t\t\t\taddRef(localRef);\n\n\t\t\t\tassert.equal(localRef.getSegment(), segInfo.segment);\n\n\t\t\t\tassert(segInfo.segment.localRefs);\n\t\t\t\tassert(!segInfo.segment.localRefs.empty);\n\t\t\t\t// Cast is necessary because LocalReference is not exported, so we can't directly call link\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-explicit-any\n\t\t\t\t(localRef as any).link(undefined, 0, undefined);\n\t\t\t\tassert(segInfo.segment.localRefs.empty);\n\t\t\t\tsegInfo.segment.localRefs.removeLocalRef(localRef);\n\t\t\t\tassert(segInfo.segment.localRefs.empty);\n\n\t\t\t\tassert.equal(segInfo.segment.localRefs.empty, true);\n\t\t\t\tassert.equal(segInfo.segment.localRefs.has(localRef), false);\n\t\t\t\tassert.equal(localRef.getSegment(), undefined);\n\t\t\t\tassert.equal(localRef.getOffset(), 0);\n\t\t\t});\n\t\t}\n\t});\n});\n"]}
@@ -5,7 +5,7 @@
5
5
  */
6
6
  Object.defineProperty(exports, "__esModule", { value: true });
7
7
  /* eslint-disable @typescript-eslint/no-non-null-assertion */
8
- const assert_1 = require("assert");
8
+ const node_assert_1 = require("node:assert");
9
9
  const stochastic_test_utils_1 = require("@fluid-private/stochastic-test-utils");
10
10
  const localReference_js_1 = require("../localReference.js");
11
11
  const ops_js_1 = require("../ops.js");
@@ -33,8 +33,11 @@ describe("MergeTree.Client", () => {
33
33
  (0, mergeTreeOperationRunner_js_1.doOverRanges)(defaultOptions, ({ initLen, modLen }) => {
34
34
  it(`LocalReferenceFarm_${initLen}_${modLen}`, async () => {
35
35
  const random = (0, stochastic_test_utils_1.makeRandom)(0xdeadbeef, 0xfeedbed, initLen, modLen);
36
- const clients = new Array(3).fill(0).map(() => new testClient_js_1.TestClient());
37
- clients.forEach((c, i) => c.startOrUpdateCollaboration(clientNames[i]));
36
+ const clients = Array.from({ length: 3 })
37
+ .fill(0)
38
+ .map(() => new testClient_js_1.TestClient());
39
+ for (const [i, c] of clients.entries())
40
+ c.startOrUpdateCollaboration(clientNames[i]);
38
41
  let seq = 0;
39
42
  // init with random values
40
43
  seq = (0, mergeTreeOperationRunner_js_1.runMergeTreeOperationRunner)(random, seq, clients, initLen, defaultOptions);
@@ -48,28 +51,28 @@ describe("MergeTree.Client", () => {
48
51
  const pos0 = clients[0].localReferencePositionToPosition(refs[0][r]);
49
52
  const posC = clients[c].localReferencePositionToPosition(refs[c][r]);
50
53
  if (pos0 !== posC) {
51
- assert_1.strict.equal(pos0, posC, `${reason}:\n${preWorkload}\n${testClientLogger_js_1.TestClientLogger.toString(clients)}`);
54
+ node_assert_1.strict.equal(pos0, posC, `${reason}:\n${preWorkload}\n${testClientLogger_js_1.TestClientLogger.toString(clients)}`);
52
55
  }
53
56
  }
54
57
  }
55
58
  // console.log(`${reason}:\n${preWorkload}\n${TestClientLogger.toString(clients)}`)
56
59
  };
57
60
  validateRefs("Initialize", () => {
58
- clients.forEach((c, i) => {
61
+ for (const [i, c] of clients.entries()) {
59
62
  refs.push([]);
60
63
  for (let t = 0; t < c.getLength(); t++) {
61
64
  const seg = c.getContainingSegment(t);
62
65
  const forwardLref = c.createLocalReferencePosition(seg.segment, seg.offset, ops_js_1.ReferenceType.SlideOnRemove, { t }, localReference_js_1.SlidingPreference.FORWARD);
63
66
  const backwardLref = c.createLocalReferencePosition(seg.segment, seg.offset, ops_js_1.ReferenceType.SlideOnRemove, { t }, localReference_js_1.SlidingPreference.BACKWARD);
64
- refs[i].push(forwardLref);
65
- refs[i].push(backwardLref);
67
+ refs[i].push(forwardLref, backwardLref);
66
68
  }
67
- });
69
+ }
68
70
  });
69
71
  validateRefs("After Init Zamboni", () => {
70
72
  // trigger zamboni multiple times as it is incremental
71
73
  for (let i = clients[0].getCollabWindow().minSeq; i <= seq; i++) {
72
- clients.forEach((c) => c.updateMinSeq(i));
74
+ for (const c of clients)
75
+ c.updateMinSeq(i);
73
76
  }
74
77
  });
75
78
  validateRefs("After More Ops", () => {
@@ -79,7 +82,8 @@ describe("MergeTree.Client", () => {
79
82
  validateRefs("After Final Zamboni", () => {
80
83
  // trigger zamboni multiple times as it is incremental
81
84
  for (let i = clients[0].getCollabWindow().minSeq; i <= seq; i++) {
82
- clients.forEach((c) => c.updateMinSeq(i));
85
+ for (const c of clients)
86
+ c.updateMinSeq(i);
83
87
  }
84
88
  });
85
89
  });
@@ -1 +1 @@
1
- {"version":3,"file":"client.localReferenceFarm.spec.js","sourceRoot":"","sources":["../../src/test/client.localReferenceFarm.spec.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 { strict as assert } from \"assert\";\n\nimport { makeRandom } from \"@fluid-private/stochastic-test-utils\";\n\nimport { SlidingPreference, setValidateRefCount } from \"../localReference.js\";\nimport { ReferenceType } from \"../ops.js\";\nimport { ReferencePosition } from \"../referencePositions.js\";\n\nimport {\n\tIConfigRange,\n\tIMergeTreeOperationRunnerConfig,\n\tdoOverRanges,\n\tgenerateClientNames,\n\tremoveRange,\n\trunMergeTreeOperationRunner,\n} from \"./mergeTreeOperationRunner.js\";\nimport { TestClient } from \"./testClient.js\";\nimport { TestClientLogger } from \"./testClientLogger.js\";\nimport { validateRefCount } from \"./testUtils.js\";\n\nconst defaultOptions: Record<\"initLen\" | \"modLen\", IConfigRange> &\n\tIMergeTreeOperationRunnerConfig = {\n\tinitLen: { min: 2, max: 256 },\n\tmodLen: { min: 1, max: 256 },\n\topsPerRoundRange: { min: 10, max: 10 },\n\trounds: 10,\n\toperations: [removeRange],\n\tgrowthFunc: (input: number) => input * 2,\n};\n\ndescribe(\"MergeTree.Client\", () => {\n\tbeforeEach(() => {\n\t\tsetValidateRefCount(validateRefCount);\n\t});\n\n\tafterEach(() => {\n\t\tsetValidateRefCount(undefined);\n\t});\n\n\t// Generate a list of single character client names, support up to 69 clients\n\tconst clientNames = generateClientNames();\n\n\tdoOverRanges(defaultOptions, ({ initLen, modLen }) => {\n\t\tit(`LocalReferenceFarm_${initLen}_${modLen}`, async () => {\n\t\t\tconst random = makeRandom(0xdeadbeef, 0xfeedbed, initLen, modLen);\n\n\t\t\tconst clients: TestClient[] = new Array(3).fill(0).map(() => new TestClient());\n\t\t\tclients.forEach((c, i) => c.startOrUpdateCollaboration(clientNames[i]));\n\n\t\t\tlet seq = 0;\n\t\t\t// init with random values\n\t\t\tseq = runMergeTreeOperationRunner(random, seq, clients, initLen, defaultOptions);\n\t\t\t// add local references\n\t\t\tconst refs: ReferencePosition[][] = [];\n\n\t\t\tconst validateRefs = (reason: string, workload: () => void) => {\n\t\t\t\tconst preWorkload = TestClientLogger.toString(clients);\n\t\t\t\tworkload();\n\t\t\t\tfor (let c = 1; c < clients.length; c++) {\n\t\t\t\t\tfor (let r = 0; r < refs[c].length; r++) {\n\t\t\t\t\t\tconst pos0 = clients[0].localReferencePositionToPosition(refs[0][r]);\n\t\t\t\t\t\tconst posC = clients[c].localReferencePositionToPosition(refs[c][r]);\n\t\t\t\t\t\tif (pos0 !== posC) {\n\t\t\t\t\t\t\tassert.equal(\n\t\t\t\t\t\t\t\tpos0,\n\t\t\t\t\t\t\t\tposC,\n\t\t\t\t\t\t\t\t`${reason}:\\n${preWorkload}\\n${TestClientLogger.toString(clients)}`,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// console.log(`${reason}:\\n${preWorkload}\\n${TestClientLogger.toString(clients)}`)\n\t\t\t};\n\n\t\t\tvalidateRefs(\"Initialize\", () => {\n\t\t\t\tclients.forEach((c, i) => {\n\t\t\t\t\trefs.push([]);\n\t\t\t\t\tfor (let t = 0; t < c.getLength(); t++) {\n\t\t\t\t\t\tconst seg = c.getContainingSegment(t);\n\t\t\t\t\t\tconst forwardLref = c.createLocalReferencePosition(\n\t\t\t\t\t\t\tseg.segment!,\n\t\t\t\t\t\t\tseg.offset,\n\t\t\t\t\t\t\tReferenceType.SlideOnRemove,\n\t\t\t\t\t\t\t{ t },\n\t\t\t\t\t\t\tSlidingPreference.FORWARD,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tconst backwardLref = c.createLocalReferencePosition(\n\t\t\t\t\t\t\tseg.segment!,\n\t\t\t\t\t\t\tseg.offset,\n\t\t\t\t\t\t\tReferenceType.SlideOnRemove,\n\t\t\t\t\t\t\t{ t },\n\t\t\t\t\t\t\tSlidingPreference.BACKWARD,\n\t\t\t\t\t\t);\n\t\t\t\t\t\trefs[i].push(forwardLref);\n\t\t\t\t\t\trefs[i].push(backwardLref);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t});\n\n\t\t\tvalidateRefs(\"After Init Zamboni\", () => {\n\t\t\t\t// trigger zamboni multiple times as it is incremental\n\t\t\t\tfor (let i = clients[0].getCollabWindow().minSeq; i <= seq; i++) {\n\t\t\t\t\tclients.forEach((c) => c.updateMinSeq(i));\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tvalidateRefs(\"After More Ops\", () => {\n\t\t\t\t// init with random values\n\t\t\t\tseq = runMergeTreeOperationRunner(random, seq, clients, modLen, defaultOptions);\n\t\t\t});\n\n\t\t\tvalidateRefs(\"After Final Zamboni\", () => {\n\t\t\t\t// trigger zamboni multiple times as it is incremental\n\t\t\t\tfor (let i = clients[0].getCollabWindow().minSeq; i <= seq; i++) {\n\t\t\t\t\tclients.forEach((c) => c.updateMinSeq(i));\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t});\n});\n"]}
1
+ {"version":3,"file":"client.localReferenceFarm.spec.js","sourceRoot":"","sources":["../../src/test/client.localReferenceFarm.spec.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 { strict as assert } from \"node:assert\";\n\nimport { makeRandom } from \"@fluid-private/stochastic-test-utils\";\n\nimport { SlidingPreference, setValidateRefCount } from \"../localReference.js\";\nimport { ReferenceType } from \"../ops.js\";\nimport { ReferencePosition } from \"../referencePositions.js\";\n\nimport {\n\tIConfigRange,\n\tIMergeTreeOperationRunnerConfig,\n\tdoOverRanges,\n\tgenerateClientNames,\n\tremoveRange,\n\trunMergeTreeOperationRunner,\n} from \"./mergeTreeOperationRunner.js\";\nimport { TestClient } from \"./testClient.js\";\nimport { TestClientLogger } from \"./testClientLogger.js\";\nimport { validateRefCount } from \"./testUtils.js\";\n\nconst defaultOptions: Record<\"initLen\" | \"modLen\", IConfigRange> &\n\tIMergeTreeOperationRunnerConfig = {\n\tinitLen: { min: 2, max: 256 },\n\tmodLen: { min: 1, max: 256 },\n\topsPerRoundRange: { min: 10, max: 10 },\n\trounds: 10,\n\toperations: [removeRange],\n\tgrowthFunc: (input: number) => input * 2,\n};\n\ndescribe(\"MergeTree.Client\", () => {\n\tbeforeEach(() => {\n\t\tsetValidateRefCount(validateRefCount);\n\t});\n\n\tafterEach(() => {\n\t\tsetValidateRefCount(undefined);\n\t});\n\n\t// Generate a list of single character client names, support up to 69 clients\n\tconst clientNames = generateClientNames();\n\n\tdoOverRanges(defaultOptions, ({ initLen, modLen }) => {\n\t\tit(`LocalReferenceFarm_${initLen}_${modLen}`, async () => {\n\t\t\tconst random = makeRandom(0xdeadbeef, 0xfeedbed, initLen, modLen);\n\n\t\t\tconst clients: TestClient[] = Array.from({ length: 3 })\n\t\t\t\t.fill(0)\n\t\t\t\t.map(() => new TestClient());\n\t\t\tfor (const [i, c] of clients.entries()) c.startOrUpdateCollaboration(clientNames[i]);\n\n\t\t\tlet seq = 0;\n\t\t\t// init with random values\n\t\t\tseq = runMergeTreeOperationRunner(random, seq, clients, initLen, defaultOptions);\n\t\t\t// add local references\n\t\t\tconst refs: ReferencePosition[][] = [];\n\n\t\t\tconst validateRefs = (reason: string, workload: () => void): void => {\n\t\t\t\tconst preWorkload = TestClientLogger.toString(clients);\n\t\t\t\tworkload();\n\t\t\t\tfor (let c = 1; c < clients.length; c++) {\n\t\t\t\t\tfor (let r = 0; r < refs[c].length; r++) {\n\t\t\t\t\t\tconst pos0 = clients[0].localReferencePositionToPosition(refs[0][r]);\n\t\t\t\t\t\tconst posC = clients[c].localReferencePositionToPosition(refs[c][r]);\n\t\t\t\t\t\tif (pos0 !== posC) {\n\t\t\t\t\t\t\tassert.equal(\n\t\t\t\t\t\t\t\tpos0,\n\t\t\t\t\t\t\t\tposC,\n\t\t\t\t\t\t\t\t`${reason}:\\n${preWorkload}\\n${TestClientLogger.toString(clients)}`,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// console.log(`${reason}:\\n${preWorkload}\\n${TestClientLogger.toString(clients)}`)\n\t\t\t};\n\n\t\t\tvalidateRefs(\"Initialize\", () => {\n\t\t\t\tfor (const [i, c] of clients.entries()) {\n\t\t\t\t\trefs.push([]);\n\t\t\t\t\tfor (let t = 0; t < c.getLength(); t++) {\n\t\t\t\t\t\tconst seg = c.getContainingSegment(t);\n\t\t\t\t\t\tconst forwardLref = c.createLocalReferencePosition(\n\t\t\t\t\t\t\tseg.segment!,\n\t\t\t\t\t\t\tseg.offset,\n\t\t\t\t\t\t\tReferenceType.SlideOnRemove,\n\t\t\t\t\t\t\t{ t },\n\t\t\t\t\t\t\tSlidingPreference.FORWARD,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tconst backwardLref = c.createLocalReferencePosition(\n\t\t\t\t\t\t\tseg.segment!,\n\t\t\t\t\t\t\tseg.offset,\n\t\t\t\t\t\t\tReferenceType.SlideOnRemove,\n\t\t\t\t\t\t\t{ t },\n\t\t\t\t\t\t\tSlidingPreference.BACKWARD,\n\t\t\t\t\t\t);\n\t\t\t\t\t\trefs[i].push(forwardLref, backwardLref);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tvalidateRefs(\"After Init Zamboni\", () => {\n\t\t\t\t// trigger zamboni multiple times as it is incremental\n\t\t\t\tfor (let i = clients[0].getCollabWindow().minSeq; i <= seq; i++) {\n\t\t\t\t\tfor (const c of clients) c.updateMinSeq(i);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tvalidateRefs(\"After More Ops\", () => {\n\t\t\t\t// init with random values\n\t\t\t\tseq = runMergeTreeOperationRunner(random, seq, clients, modLen, defaultOptions);\n\t\t\t});\n\n\t\t\tvalidateRefs(\"After Final Zamboni\", () => {\n\t\t\t\t// trigger zamboni multiple times as it is incremental\n\t\t\t\tfor (let i = clients[0].getCollabWindow().minSeq; i <= seq; i++) {\n\t\t\t\t\tfor (const c of clients) c.updateMinSeq(i);\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t});\n});\n"]}
@@ -4,7 +4,7 @@
4
4
  * Licensed under the MIT License.
5
5
  */
6
6
  Object.defineProperty(exports, "__esModule", { value: true });
7
- const assert_1 = require("assert");
7
+ const node_assert_1 = require("node:assert");
8
8
  const testClient_js_1 = require("./testClient.js");
9
9
  describe("client.rebasePosition", () => {
10
10
  const localUserLongId = "localUser";
@@ -22,13 +22,13 @@ describe("client.rebasePosition", () => {
22
22
  client.insertTextRemote(0, "abc", undefined, ++seq, 0, remoteUserLongId);
23
23
  const rebasedPos = client.rebasePosition(6 /* "w" */, 0, 0);
24
24
  const text = getTextAt(rebasedPos);
25
- assert_1.strict.equal(text, "w", "rebased pos should still refer to 'w'");
25
+ node_assert_1.strict.equal(text, "w", "rebased pos should still refer to 'w'");
26
26
  });
27
27
  it("rebase past remote delete", () => {
28
28
  client.removeRangeRemote(0, 3, ++seq, 0, remoteUserLongId);
29
29
  const rebasedPos = client.rebasePosition(6 /* w */, 0, 0);
30
30
  const text = getTextAt(rebasedPos);
31
- assert_1.strict.equal(text, "w", "rebased pos should still refer to 'w'");
31
+ node_assert_1.strict.equal(text, "w", "rebased pos should still refer to 'w'");
32
32
  });
33
33
  it("rebase on a variety of seqNumberFrom values", () => {
34
34
  client.insertTextRemote(0, "abc", undefined, ++seq, 0, remoteUserLongId);
@@ -38,10 +38,10 @@ describe("client.rebasePosition", () => {
38
38
  const rebasedPos1 = client.rebasePosition(6 /* into "abchello world" */, 1, 0);
39
39
  const rebasedPos2 = client.rebasePosition(6 /* into "bchello world" */, 2, 0);
40
40
  const rebasedPos3 = client.rebasePosition(6 /* into "bXYZ@chello world" */, 3, 0);
41
- assert_1.strict.equal(getTextAt(rebasedPos0), "w");
42
- assert_1.strict.equal(getTextAt(rebasedPos1), "l");
43
- assert_1.strict.equal(getTextAt(rebasedPos2), "o");
44
- assert_1.strict.equal(getTextAt(rebasedPos3), "h");
41
+ node_assert_1.strict.equal(getTextAt(rebasedPos0), "w");
42
+ node_assert_1.strict.equal(getTextAt(rebasedPos1), "l");
43
+ node_assert_1.strict.equal(getTextAt(rebasedPos2), "o");
44
+ node_assert_1.strict.equal(getTextAt(rebasedPos3), "h");
45
45
  });
46
46
  describe("with subsequent local changes", () => {
47
47
  // Rebasing is made more complicated from the client perspective when there are local changes applied
@@ -59,9 +59,9 @@ describe("client.rebasePosition", () => {
59
59
  // the local client to resolve that remote position and confirm the text matches what's expected.
60
60
  const expectTextAtRebasedPosMatches = (pos, expected, message) => {
61
61
  const localViewOfRebasedPos = client.resolveRemoteClientPosition(pos, seq, remoteUserLongId);
62
- (0, assert_1.strict)(localViewOfRebasedPos !== undefined, "pos should be defined");
62
+ (0, node_assert_1.strict)(localViewOfRebasedPos !== undefined, "pos should be defined");
63
63
  const text = getTextAt(localViewOfRebasedPos);
64
- assert_1.strict.equal(text, expected, message);
64
+ node_assert_1.strict.equal(text, expected, message);
65
65
  };
66
66
  it("rebase past remote insert", () => {
67
67
  client.insertTextRemote(0, "abc", undefined, ++seq, 0, remoteUserLongId);
@@ -93,9 +93,9 @@ describe("client.rebasePosition", () => {
93
93
  const rebasedPos = client.rebasePosition(4 /* index 4 into "hello world" */, 0, 0);
94
94
  const rebasedPos1 = client.rebasePosition(4 /* index 4 into "hello123456 world" */, 0, 1);
95
95
  const rebasedPos2 = client.rebasePosition(4 /* index 4 into "hel123456 world" */, 0, 2);
96
- assert_1.strict.equal(rebasedPos, 2);
97
- assert_1.strict.equal(rebasedPos1, 2);
98
- assert_1.strict.equal(rebasedPos2, 2);
96
+ node_assert_1.strict.equal(rebasedPos, 2);
97
+ node_assert_1.strict.equal(rebasedPos1, 2);
98
+ node_assert_1.strict.equal(rebasedPos2, 2);
99
99
  });
100
100
  });
101
101
  });
@@ -1 +1 @@
1
- {"version":3,"file":"client.rebasePosition.spec.js","sourceRoot":"","sources":["../../src/test/client.rebasePosition.spec.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\nimport { strict as assert } from \"assert\";\n\nimport { IMergeTreeOp } from \"../ops.js\";\n\nimport { TestClient } from \"./testClient.js\";\n\ndescribe(\"client.rebasePosition\", () => {\n\tconst localUserLongId = \"localUser\";\n\tconst remoteUserLongId = \"remoteUser\";\n\tlet client: TestClient;\n\tlet seq: number;\n\n\tconst getTextAt = (pos: number): string => client.getText(pos, pos + 1);\n\n\tbeforeEach(() => {\n\t\tclient = new TestClient();\n\t\tclient.insertTextLocal(0, \"hello world\");\n\t\tclient.startOrUpdateCollaboration(localUserLongId);\n\t\tseq = 0;\n\t});\n\n\tit(\"rebase past remote insert\", () => {\n\t\tclient.insertTextRemote(0, \"abc\", undefined, ++seq, 0, remoteUserLongId);\n\t\tconst rebasedPos = client.rebasePosition(6 /* \"w\" */, 0, 0);\n\t\tconst text = getTextAt(rebasedPos);\n\t\tassert.equal(text, \"w\", \"rebased pos should still refer to 'w'\");\n\t});\n\n\tit(\"rebase past remote delete\", () => {\n\t\tclient.removeRangeRemote(0, 3, ++seq, 0, remoteUserLongId);\n\t\tconst rebasedPos = client.rebasePosition(6 /* w */, 0, 0);\n\t\tconst text = getTextAt(rebasedPos);\n\t\tassert.equal(text, \"w\", \"rebased pos should still refer to 'w'\");\n\t});\n\n\tit(\"rebase on a variety of seqNumberFrom values\", () => {\n\t\tclient.insertTextRemote(0, \"abc\", undefined, ++seq, 0, remoteUserLongId);\n\t\tclient.removeRangeRemote(0, 1, ++seq, seq - 1, remoteUserLongId);\n\t\tclient.insertTextRemote(1, \"XYZ@\", undefined, ++seq, seq - 1, remoteUserLongId);\n\n\t\tconst rebasedPos0 = client.rebasePosition(6 /* into \"hello world\" */, 0, 0);\n\t\tconst rebasedPos1 = client.rebasePosition(6 /* into \"abchello world\" */, 1, 0);\n\t\tconst rebasedPos2 = client.rebasePosition(6 /* into \"bchello world\" */, 2, 0);\n\t\tconst rebasedPos3 = client.rebasePosition(6 /* into \"bXYZ@chello world\" */, 3, 0);\n\n\t\tassert.equal(getTextAt(rebasedPos0), \"w\");\n\t\tassert.equal(getTextAt(rebasedPos1), \"l\");\n\t\tassert.equal(getTextAt(rebasedPos2), \"o\");\n\t\tassert.equal(getTextAt(rebasedPos3), \"h\");\n\t});\n\n\tdescribe(\"with subsequent local changes\", () => {\n\t\t// Rebasing is made more complicated from the client perspective when there are local changes applied\n\t\t// meanwhile, since the local state of the string contains segments that should not be considered\n\t\t// when computing the position to rebase to (since they wouldn't be visible remotely)\n\n\t\tlet op1: IMergeTreeOp | undefined;\n\t\tlet op2: IMergeTreeOp | undefined;\n\t\tbeforeEach(() => {\n\t\t\top1 = client.insertTextLocal(5, \"123456\");\n\t\t\top2 = client.removeRangeLocal(3, 5);\n\t\t});\n\n\t\t// For these tests, rebasedPos conceptually refers to a position that a *remote* client should use in order\n\t\t// to get an equivalent position to the one that was applied locally with a different refSeq.\n\t\t// Since this suite doesn't actually spin up a remote client, we verify this equivalence by asking\n\t\t// the local client to resolve that remote position and confirm the text matches what's expected.\n\t\tconst expectTextAtRebasedPosMatches = (\n\t\t\tpos: number,\n\t\t\texpected: string,\n\t\t\tmessage?: string,\n\t\t) => {\n\t\t\tconst localViewOfRebasedPos = client.resolveRemoteClientPosition(\n\t\t\t\tpos,\n\t\t\t\tseq,\n\t\t\t\tremoteUserLongId,\n\t\t\t);\n\t\t\tassert(localViewOfRebasedPos !== undefined, \"pos should be defined\");\n\t\t\tconst text = getTextAt(localViewOfRebasedPos);\n\t\t\tassert.equal(text, expected, message);\n\t\t};\n\n\t\tit(\"rebase past remote insert\", () => {\n\t\t\tclient.insertTextRemote(0, \"abc\", undefined, ++seq, 0, remoteUserLongId);\n\t\t\tconst rebasedPos = client.rebasePosition(6 /* index 6 into \"hello world\" */, 0, 0);\n\t\t\tconst rebasedPos1 = client.rebasePosition(\n\t\t\t\t6 /* index 6 into \"hello123456 world\" */,\n\t\t\t\t0,\n\t\t\t\t1,\n\t\t\t);\n\t\t\tconst rebasedPos2 = client.rebasePosition(6 /* index 6 into \"hel123456 world\" */, 0, 2);\n\n\t\t\texpectTextAtRebasedPosMatches(rebasedPos, \"w\");\n\n\t\t\tclient.applyMsg(client.makeOpMessage(op1, ++seq, 0, localUserLongId), true);\n\t\t\texpectTextAtRebasedPosMatches(rebasedPos1, \"2\");\n\n\t\t\tclient.applyMsg(client.makeOpMessage(op2, ++seq, 0, localUserLongId), true);\n\t\t\texpectTextAtRebasedPosMatches(rebasedPos2, \"4\");\n\t\t});\n\n\t\tit(\"rebase past remote delete\", () => {\n\t\t\tclient.removeRangeRemote(0, 2, ++seq, 0, remoteUserLongId);\n\t\t\tconst rebasedPos = client.rebasePosition(6 /* index 6 into \"hello world\" */, 0, 0);\n\t\t\tconst rebasedPos1 = client.rebasePosition(\n\t\t\t\t6 /* index 6 into \"hello123456 world\" */,\n\t\t\t\t0,\n\t\t\t\t1,\n\t\t\t);\n\t\t\tconst rebasedPos2 = client.rebasePosition(6 /* index 6 into \"hel123456 world\" */, 0, 2);\n\n\t\t\texpectTextAtRebasedPosMatches(rebasedPos, \"w\");\n\n\t\t\tclient.applyMsg(client.makeOpMessage(op1, ++seq, 0, localUserLongId), true);\n\t\t\texpectTextAtRebasedPosMatches(rebasedPos1, \"2\");\n\n\t\t\tclient.applyMsg(client.makeOpMessage(op2, ++seq, 0, localUserLongId), true);\n\t\t\texpectTextAtRebasedPosMatches(rebasedPos2, \"4\");\n\t\t});\n\n\t\t// Mid-remote delete with meanwhile local edits isn't particularly more interesting than the cases\n\t\t// handled above. Instead we include some rebased positions amid the local delete (removal of \"lo\")\n\t\t// as this caught a bug with the original implementation.\n\t\tit(\"rebase mid local delete\", () => {\n\t\t\tclient.removeRangeRemote(0, 2, ++seq, 0, remoteUserLongId);\n\t\t\tconst rebasedPos = client.rebasePosition(4 /* index 4 into \"hello world\" */, 0, 0);\n\t\t\tconst rebasedPos1 = client.rebasePosition(\n\t\t\t\t4 /* index 4 into \"hello123456 world\" */,\n\t\t\t\t0,\n\t\t\t\t1,\n\t\t\t);\n\t\t\tconst rebasedPos2 = client.rebasePosition(4 /* index 4 into \"hel123456 world\" */, 0, 2);\n\n\t\t\tassert.equal(rebasedPos, 2);\n\t\t\tassert.equal(rebasedPos1, 2);\n\t\t\tassert.equal(rebasedPos2, 2);\n\t\t});\n\t});\n});\n"]}
1
+ {"version":3,"file":"client.rebasePosition.spec.js","sourceRoot":"","sources":["../../src/test/client.rebasePosition.spec.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\nimport { strict as assert } from \"node:assert\";\n\nimport { IMergeTreeOp } from \"../ops.js\";\n\nimport { TestClient } from \"./testClient.js\";\n\ndescribe(\"client.rebasePosition\", () => {\n\tconst localUserLongId = \"localUser\";\n\tconst remoteUserLongId = \"remoteUser\";\n\tlet client: TestClient;\n\tlet seq: number;\n\n\tconst getTextAt = (pos: number): string => client.getText(pos, pos + 1);\n\n\tbeforeEach(() => {\n\t\tclient = new TestClient();\n\t\tclient.insertTextLocal(0, \"hello world\");\n\t\tclient.startOrUpdateCollaboration(localUserLongId);\n\t\tseq = 0;\n\t});\n\n\tit(\"rebase past remote insert\", () => {\n\t\tclient.insertTextRemote(0, \"abc\", undefined, ++seq, 0, remoteUserLongId);\n\t\tconst rebasedPos = client.rebasePosition(6 /* \"w\" */, 0, 0);\n\t\tconst text = getTextAt(rebasedPos);\n\t\tassert.equal(text, \"w\", \"rebased pos should still refer to 'w'\");\n\t});\n\n\tit(\"rebase past remote delete\", () => {\n\t\tclient.removeRangeRemote(0, 3, ++seq, 0, remoteUserLongId);\n\t\tconst rebasedPos = client.rebasePosition(6 /* w */, 0, 0);\n\t\tconst text = getTextAt(rebasedPos);\n\t\tassert.equal(text, \"w\", \"rebased pos should still refer to 'w'\");\n\t});\n\n\tit(\"rebase on a variety of seqNumberFrom values\", () => {\n\t\tclient.insertTextRemote(0, \"abc\", undefined, ++seq, 0, remoteUserLongId);\n\t\tclient.removeRangeRemote(0, 1, ++seq, seq - 1, remoteUserLongId);\n\t\tclient.insertTextRemote(1, \"XYZ@\", undefined, ++seq, seq - 1, remoteUserLongId);\n\n\t\tconst rebasedPos0 = client.rebasePosition(6 /* into \"hello world\" */, 0, 0);\n\t\tconst rebasedPos1 = client.rebasePosition(6 /* into \"abchello world\" */, 1, 0);\n\t\tconst rebasedPos2 = client.rebasePosition(6 /* into \"bchello world\" */, 2, 0);\n\t\tconst rebasedPos3 = client.rebasePosition(6 /* into \"bXYZ@chello world\" */, 3, 0);\n\n\t\tassert.equal(getTextAt(rebasedPos0), \"w\");\n\t\tassert.equal(getTextAt(rebasedPos1), \"l\");\n\t\tassert.equal(getTextAt(rebasedPos2), \"o\");\n\t\tassert.equal(getTextAt(rebasedPos3), \"h\");\n\t});\n\n\tdescribe(\"with subsequent local changes\", () => {\n\t\t// Rebasing is made more complicated from the client perspective when there are local changes applied\n\t\t// meanwhile, since the local state of the string contains segments that should not be considered\n\t\t// when computing the position to rebase to (since they wouldn't be visible remotely)\n\n\t\tlet op1: IMergeTreeOp | undefined;\n\t\tlet op2: IMergeTreeOp | undefined;\n\t\tbeforeEach(() => {\n\t\t\top1 = client.insertTextLocal(5, \"123456\");\n\t\t\top2 = client.removeRangeLocal(3, 5);\n\t\t});\n\n\t\t// For these tests, rebasedPos conceptually refers to a position that a *remote* client should use in order\n\t\t// to get an equivalent position to the one that was applied locally with a different refSeq.\n\t\t// Since this suite doesn't actually spin up a remote client, we verify this equivalence by asking\n\t\t// the local client to resolve that remote position and confirm the text matches what's expected.\n\t\tconst expectTextAtRebasedPosMatches = (\n\t\t\tpos: number,\n\t\t\texpected: string,\n\t\t\tmessage?: string,\n\t\t): void => {\n\t\t\tconst localViewOfRebasedPos = client.resolveRemoteClientPosition(\n\t\t\t\tpos,\n\t\t\t\tseq,\n\t\t\t\tremoteUserLongId,\n\t\t\t);\n\t\t\tassert(localViewOfRebasedPos !== undefined, \"pos should be defined\");\n\t\t\tconst text = getTextAt(localViewOfRebasedPos);\n\t\t\tassert.equal(text, expected, message);\n\t\t};\n\n\t\tit(\"rebase past remote insert\", () => {\n\t\t\tclient.insertTextRemote(0, \"abc\", undefined, ++seq, 0, remoteUserLongId);\n\t\t\tconst rebasedPos = client.rebasePosition(6 /* index 6 into \"hello world\" */, 0, 0);\n\t\t\tconst rebasedPos1 = client.rebasePosition(\n\t\t\t\t6 /* index 6 into \"hello123456 world\" */,\n\t\t\t\t0,\n\t\t\t\t1,\n\t\t\t);\n\t\t\tconst rebasedPos2 = client.rebasePosition(6 /* index 6 into \"hel123456 world\" */, 0, 2);\n\n\t\t\texpectTextAtRebasedPosMatches(rebasedPos, \"w\");\n\n\t\t\tclient.applyMsg(client.makeOpMessage(op1, ++seq, 0, localUserLongId), true);\n\t\t\texpectTextAtRebasedPosMatches(rebasedPos1, \"2\");\n\n\t\t\tclient.applyMsg(client.makeOpMessage(op2, ++seq, 0, localUserLongId), true);\n\t\t\texpectTextAtRebasedPosMatches(rebasedPos2, \"4\");\n\t\t});\n\n\t\tit(\"rebase past remote delete\", () => {\n\t\t\tclient.removeRangeRemote(0, 2, ++seq, 0, remoteUserLongId);\n\t\t\tconst rebasedPos = client.rebasePosition(6 /* index 6 into \"hello world\" */, 0, 0);\n\t\t\tconst rebasedPos1 = client.rebasePosition(\n\t\t\t\t6 /* index 6 into \"hello123456 world\" */,\n\t\t\t\t0,\n\t\t\t\t1,\n\t\t\t);\n\t\t\tconst rebasedPos2 = client.rebasePosition(6 /* index 6 into \"hel123456 world\" */, 0, 2);\n\n\t\t\texpectTextAtRebasedPosMatches(rebasedPos, \"w\");\n\n\t\t\tclient.applyMsg(client.makeOpMessage(op1, ++seq, 0, localUserLongId), true);\n\t\t\texpectTextAtRebasedPosMatches(rebasedPos1, \"2\");\n\n\t\t\tclient.applyMsg(client.makeOpMessage(op2, ++seq, 0, localUserLongId), true);\n\t\t\texpectTextAtRebasedPosMatches(rebasedPos2, \"4\");\n\t\t});\n\n\t\t// Mid-remote delete with meanwhile local edits isn't particularly more interesting than the cases\n\t\t// handled above. Instead we include some rebased positions amid the local delete (removal of \"lo\")\n\t\t// as this caught a bug with the original implementation.\n\t\tit(\"rebase mid local delete\", () => {\n\t\t\tclient.removeRangeRemote(0, 2, ++seq, 0, remoteUserLongId);\n\t\t\tconst rebasedPos = client.rebasePosition(4 /* index 4 into \"hello world\" */, 0, 0);\n\t\t\tconst rebasedPos1 = client.rebasePosition(\n\t\t\t\t4 /* index 4 into \"hello123456 world\" */,\n\t\t\t\t0,\n\t\t\t\t1,\n\t\t\t);\n\t\t\tconst rebasedPos2 = client.rebasePosition(4 /* index 4 into \"hel123456 world\" */, 0, 2);\n\n\t\t\tassert.equal(rebasedPos, 2);\n\t\t\tassert.equal(rebasedPos1, 2);\n\t\t\tassert.equal(rebasedPos2, 2);\n\t\t});\n\t});\n});\n"]}
@@ -6,7 +6,7 @@
6
6
  Object.defineProperty(exports, "__esModule", { value: true });
7
7
  exports.defaultOptions = void 0;
8
8
  /* eslint-disable @typescript-eslint/no-non-null-assertion */
9
- const assert_1 = require("assert");
9
+ const node_assert_1 = require("node:assert");
10
10
  const stochastic_test_utils_1 = require("@fluid-private/stochastic-test-utils");
11
11
  const mergeTreeOperationRunner_js_1 = require("./mergeTreeOperationRunner.js");
12
12
  const testClient_js_1 = require("./testClient.js");
@@ -20,26 +20,27 @@ function applyMessagesWithReconnect(startingSeq, messageDatas, clients, logger,
20
20
  // log and apply all the ops created in the round
21
21
  while (messageDatas.length > 0) {
22
22
  const [message, sg] = messageDatas.shift();
23
- (0, assert_1.strict)(message.clientId, "expected clientId to be defined");
23
+ (0, node_assert_1.strict)(message.clientId, "expected clientId to be defined");
24
24
  if (reconnectingClientIds.includes(message.clientId)) {
25
25
  reconnectClientMsgs.get(message.clientId).push([message.contents, sg]);
26
26
  }
27
27
  else {
28
28
  message.sequenceNumber = ++seq;
29
- clients.forEach((c) => c.applyMsg(message));
29
+ for (const c of clients)
30
+ c.applyMsg(message);
30
31
  minSeq = message.minimumSequenceNumber;
31
32
  }
32
33
  }
33
34
  const reconnectMsgs = [];
34
- reconnectClientMsgs.forEach((messageData, clientId) => {
35
+ for (const [clientId, messageData] of reconnectClientMsgs.entries()) {
35
36
  const client = clients.find(({ longClientId }) => longClientId === clientId);
36
- messageData.forEach(([op, segmentGroup]) => {
37
+ for (const [op, segmentGroup] of messageData) {
37
38
  const newMsg = client.makeOpMessage(client.regeneratePendingOp(op, segmentGroup));
38
39
  newMsg.minimumSequenceNumber = minSeq;
39
40
  // apply message doesn't use the segment group, so just pass undefined
40
41
  reconnectMsgs.push([newMsg, undefined]);
41
- });
42
- });
42
+ }
43
+ }
43
44
  return (0, mergeTreeOperationRunner_js_1.applyMessages)(seq, reconnectMsgs, clients, logger);
44
45
  }
45
46
  exports.defaultOptions = {
@@ -62,9 +63,11 @@ function runReconnectFarmTests(opts, extraSeed) {
62
63
  testOpts.resultsFilePostfix += extraSeed;
63
64
  }
64
65
  const clients = [new testClient_js_1.TestClient()];
65
- clients.forEach((c, i) => c.startOrUpdateCollaboration(clientNames[i]));
66
+ for (const [i, c] of clients.entries())
67
+ c.startOrUpdateCollaboration(clientNames[i]);
66
68
  let seq = 0;
67
- clients.forEach((c) => c.updateMinSeq(seq));
69
+ for (const c of clients)
70
+ c.updateMinSeq(seq);
68
71
  // Add double the number of clients each iteration
69
72
  const targetClients = Math.max(opts.clients.min, clientCount);
70
73
  for (let cc = clients.length; cc < targetClients; cc++) {
@@ -1 +1 @@
1
- {"version":3,"file":"client.reconnectFarm.spec.js","sourceRoot":"","sources":["../../src/test/client.reconnectFarm.spec.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 { strict as assert } from \"assert\";\n\nimport { IRandom, describeFuzz, makeRandom } from \"@fluid-private/stochastic-test-utils\";\nimport { ISequencedDocumentMessage } from \"@fluidframework/driver-definitions/internal\";\n\nimport { SegmentGroup } from \"../mergeTreeNodes.js\";\nimport { IMergeTreeOp } from \"../ops.js\";\n\nimport {\n\tIConfigRange,\n\tIMergeTreeOperationRunnerConfig,\n\tannotateRange,\n\tapplyMessages,\n\tdoOverRange,\n\tgenerateClientNames,\n\tinsert,\n\tremoveRange,\n\trunMergeTreeOperationRunner,\n} from \"./mergeTreeOperationRunner.js\";\nimport { TestClient } from \"./testClient.js\";\nimport { TestClientLogger } from \"./testClientLogger.js\";\n\nfunction applyMessagesWithReconnect(\n\tstartingSeq: number,\n\tmessageDatas: [ISequencedDocumentMessage, SegmentGroup | SegmentGroup[]][],\n\tclients: readonly TestClient[],\n\tlogger: TestClientLogger,\n\trandom: IRandom,\n) {\n\tlet seq = startingSeq;\n\tconst reconnectingClientIds =\n\t\tclients.length > 2 && random.bool()\n\t\t\t? [clients[1].longClientId!, clients[2].longClientId!]\n\t\t\t: [clients[1].longClientId!];\n\tconst reconnectClientMsgs: Map<string, [IMergeTreeOp, SegmentGroup | SegmentGroup[]][]> =\n\t\tnew Map(reconnectingClientIds.map((id) => [id, []]));\n\tlet minSeq = 0;\n\t// log and apply all the ops created in the round\n\twhile (messageDatas.length > 0) {\n\t\tconst [message, sg] = messageDatas.shift()!;\n\t\tassert(message.clientId, \"expected clientId to be defined\");\n\t\tif (reconnectingClientIds.includes(message.clientId)) {\n\t\t\treconnectClientMsgs.get(message.clientId)!.push([message.contents as IMergeTreeOp, sg]);\n\t\t} else {\n\t\t\tmessage.sequenceNumber = ++seq;\n\t\t\tclients.forEach((c) => c.applyMsg(message));\n\t\t\tminSeq = message.minimumSequenceNumber;\n\t\t}\n\t}\n\n\tconst reconnectMsgs: [ISequencedDocumentMessage, SegmentGroup | SegmentGroup[]][] = [];\n\treconnectClientMsgs.forEach((messageData, clientId) => {\n\t\tconst client = clients.find(({ longClientId }) => longClientId === clientId)!;\n\t\tmessageData.forEach(([op, segmentGroup]) => {\n\t\t\tconst newMsg = client.makeOpMessage(client.regeneratePendingOp(op, segmentGroup));\n\t\t\tnewMsg.minimumSequenceNumber = minSeq;\n\t\t\t// apply message doesn't use the segment group, so just pass undefined\n\t\t\treconnectMsgs.push([newMsg, undefined as any]);\n\t\t});\n\t});\n\n\treturn applyMessages(seq, reconnectMsgs, clients, logger);\n}\n\ninterface IReconnectFarmConfig extends IMergeTreeOperationRunnerConfig {\n\tminLength: number;\n\tclients: IConfigRange;\n}\n\nexport const defaultOptions: IReconnectFarmConfig = {\n\tminLength: 16,\n\tclients: { min: 2, max: 8 },\n\topsPerRoundRange: { min: 40, max: 320 },\n\trounds: 3,\n\toperations: [annotateRange, removeRange, insert],\n\tgrowthFunc: (input: number) => input * 2,\n};\n\n// Generate a list of single character client names, support up to 69 clients\nconst clientNames = generateClientNames();\n\nfunction runReconnectFarmTests(opts: IReconnectFarmConfig, extraSeed?: number): void {\n\tdoOverRange(opts.clients, opts.growthFunc.bind(opts), (clientCount) => {\n\t\tit(`ReconnectFarm_${clientCount}_${extraSeed ?? 0}`, async () => {\n\t\t\tconst random = makeRandom(0xdeadbeef, 0xfeedbed, clientCount, extraSeed ?? 0);\n\t\t\tconst testOpts = { ...opts };\n\t\t\tif (extraSeed) {\n\t\t\t\ttestOpts.resultsFilePostfix ??= \"\";\n\t\t\t\ttestOpts.resultsFilePostfix += extraSeed;\n\t\t\t}\n\n\t\t\tconst clients: TestClient[] = [new TestClient()];\n\t\t\tclients.forEach((c, i) => c.startOrUpdateCollaboration(clientNames[i]));\n\n\t\t\tlet seq = 0;\n\t\t\tclients.forEach((c) => c.updateMinSeq(seq));\n\n\t\t\t// Add double the number of clients each iteration\n\t\t\tconst targetClients = Math.max(opts.clients.min, clientCount);\n\t\t\tfor (let cc = clients.length; cc < targetClients; cc++) {\n\t\t\t\tconst newClient = await TestClient.createFromClientSnapshot(\n\t\t\t\t\tclients[0],\n\t\t\t\t\tclientNames[cc],\n\t\t\t\t);\n\t\t\t\tclients.push(newClient);\n\t\t\t}\n\n\t\t\tseq = runMergeTreeOperationRunner(\n\t\t\t\trandom,\n\t\t\t\tseq,\n\t\t\t\tclients,\n\t\t\t\ttestOpts.minLength,\n\t\t\t\ttestOpts,\n\t\t\t\tapplyMessagesWithReconnect,\n\t\t\t);\n\t\t}).timeout(30 * 1000);\n\t});\n}\n\ndescribeFuzz(\"MergeTree.Client\", ({ testCount }) => {\n\tconst opts = defaultOptions;\n\n\tif (testCount > 1) {\n\t\tdoOverRange(\n\t\t\t{ min: 0, max: testCount - 1 },\n\t\t\t(x) => x + 1,\n\t\t\t(seed) => {\n\t\t\t\tdescribe(`with seed ${seed}`, () => {\n\t\t\t\t\trunReconnectFarmTests(opts, seed);\n\t\t\t\t});\n\t\t\t},\n\t\t);\n\t} else {\n\t\trunReconnectFarmTests(opts);\n\t}\n});\n"]}
1
+ {"version":3,"file":"client.reconnectFarm.spec.js","sourceRoot":"","sources":["../../src/test/client.reconnectFarm.spec.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 { strict as assert } from \"node:assert\";\n\nimport { IRandom, describeFuzz, makeRandom } from \"@fluid-private/stochastic-test-utils\";\nimport { ISequencedDocumentMessage } from \"@fluidframework/driver-definitions/internal\";\n\nimport { SegmentGroup } from \"../mergeTreeNodes.js\";\nimport { IMergeTreeOp } from \"../ops.js\";\n\nimport {\n\tIConfigRange,\n\tIMergeTreeOperationRunnerConfig,\n\tannotateRange,\n\tapplyMessages,\n\tdoOverRange,\n\tgenerateClientNames,\n\tinsert,\n\tremoveRange,\n\trunMergeTreeOperationRunner,\n} from \"./mergeTreeOperationRunner.js\";\nimport { TestClient } from \"./testClient.js\";\nimport { TestClientLogger } from \"./testClientLogger.js\";\n\nfunction applyMessagesWithReconnect(\n\tstartingSeq: number,\n\tmessageDatas: [ISequencedDocumentMessage, SegmentGroup | SegmentGroup[]][],\n\tclients: readonly TestClient[],\n\tlogger: TestClientLogger,\n\trandom: IRandom,\n): number {\n\tlet seq = startingSeq;\n\tconst reconnectingClientIds =\n\t\tclients.length > 2 && random.bool()\n\t\t\t? [clients[1].longClientId!, clients[2].longClientId!]\n\t\t\t: [clients[1].longClientId!];\n\tconst reconnectClientMsgs: Map<string, [IMergeTreeOp, SegmentGroup | SegmentGroup[]][]> =\n\t\tnew Map(reconnectingClientIds.map((id) => [id, []]));\n\tlet minSeq = 0;\n\t// log and apply all the ops created in the round\n\twhile (messageDatas.length > 0) {\n\t\tconst [message, sg] = messageDatas.shift()!;\n\t\tassert(message.clientId, \"expected clientId to be defined\");\n\t\tif (reconnectingClientIds.includes(message.clientId)) {\n\t\t\treconnectClientMsgs.get(message.clientId)!.push([message.contents as IMergeTreeOp, sg]);\n\t\t} else {\n\t\t\tmessage.sequenceNumber = ++seq;\n\t\t\tfor (const c of clients) c.applyMsg(message);\n\t\t\tminSeq = message.minimumSequenceNumber;\n\t\t}\n\t}\n\n\tconst reconnectMsgs: [ISequencedDocumentMessage, SegmentGroup | SegmentGroup[]][] = [];\n\tfor (const [clientId, messageData] of reconnectClientMsgs.entries()) {\n\t\tconst client = clients.find(({ longClientId }) => longClientId === clientId)!;\n\t\tfor (const [op, segmentGroup] of messageData) {\n\t\t\tconst newMsg = client.makeOpMessage(client.regeneratePendingOp(op, segmentGroup));\n\t\t\tnewMsg.minimumSequenceNumber = minSeq;\n\t\t\t// apply message doesn't use the segment group, so just pass undefined\n\t\t\treconnectMsgs.push([newMsg, undefined as never]);\n\t\t}\n\t}\n\n\treturn applyMessages(seq, reconnectMsgs, clients, logger);\n}\n\ninterface IReconnectFarmConfig extends IMergeTreeOperationRunnerConfig {\n\tminLength: number;\n\tclients: IConfigRange;\n}\n\nexport const defaultOptions: IReconnectFarmConfig = {\n\tminLength: 16,\n\tclients: { min: 2, max: 8 },\n\topsPerRoundRange: { min: 40, max: 320 },\n\trounds: 3,\n\toperations: [annotateRange, removeRange, insert],\n\tgrowthFunc: (input: number) => input * 2,\n};\n\n// Generate a list of single character client names, support up to 69 clients\nconst clientNames = generateClientNames();\n\nfunction runReconnectFarmTests(opts: IReconnectFarmConfig, extraSeed?: number): void {\n\tdoOverRange(opts.clients, opts.growthFunc.bind(opts), (clientCount) => {\n\t\tit(`ReconnectFarm_${clientCount}_${extraSeed ?? 0}`, async () => {\n\t\t\tconst random = makeRandom(0xdeadbeef, 0xfeedbed, clientCount, extraSeed ?? 0);\n\t\t\tconst testOpts = { ...opts };\n\t\t\tif (extraSeed) {\n\t\t\t\ttestOpts.resultsFilePostfix ??= \"\";\n\t\t\t\ttestOpts.resultsFilePostfix += extraSeed;\n\t\t\t}\n\n\t\t\tconst clients: TestClient[] = [new TestClient()];\n\t\t\tfor (const [i, c] of clients.entries()) c.startOrUpdateCollaboration(clientNames[i]);\n\n\t\t\tlet seq = 0;\n\t\t\tfor (const c of clients) c.updateMinSeq(seq);\n\n\t\t\t// Add double the number of clients each iteration\n\t\t\tconst targetClients = Math.max(opts.clients.min, clientCount);\n\t\t\tfor (let cc = clients.length; cc < targetClients; cc++) {\n\t\t\t\tconst newClient = await TestClient.createFromClientSnapshot(\n\t\t\t\t\tclients[0],\n\t\t\t\t\tclientNames[cc],\n\t\t\t\t);\n\t\t\t\tclients.push(newClient);\n\t\t\t}\n\n\t\t\tseq = runMergeTreeOperationRunner(\n\t\t\t\trandom,\n\t\t\t\tseq,\n\t\t\t\tclients,\n\t\t\t\ttestOpts.minLength,\n\t\t\t\ttestOpts,\n\t\t\t\tapplyMessagesWithReconnect,\n\t\t\t);\n\t\t}).timeout(30 * 1000);\n\t});\n}\n\ndescribeFuzz(\"MergeTree.Client\", ({ testCount }) => {\n\tconst opts = defaultOptions;\n\n\tif (testCount > 1) {\n\t\tdoOverRange(\n\t\t\t{ min: 0, max: testCount - 1 },\n\t\t\t(x) => x + 1,\n\t\t\t(seed) => {\n\t\t\t\tdescribe(`with seed ${seed}`, () => {\n\t\t\t\t\trunReconnectFarmTests(opts, seed);\n\t\t\t\t});\n\t\t\t},\n\t\t);\n\t} else {\n\t\trunReconnectFarmTests(opts);\n\t}\n});\n"]}