@fluidframework/merge-tree 2.0.0-rc.1.0.3 → 2.0.0-rc.2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (770) hide show
  1. package/{.eslintrc.js → .eslintrc.cjs} +4 -1
  2. package/{.mocharc.js → .mocharc.cjs} +1 -1
  3. package/CHANGELOG.md +4 -0
  4. package/api-extractor-cjs.json +8 -0
  5. package/api-extractor-lint.json +1 -1
  6. package/api-extractor.json +1 -9
  7. package/api-report/merge-tree.api.md +6 -12
  8. package/dist/MergeTreeTextHelper.d.ts +2 -2
  9. package/dist/MergeTreeTextHelper.d.ts.map +1 -1
  10. package/dist/MergeTreeTextHelper.js +3 -3
  11. package/dist/MergeTreeTextHelper.js.map +1 -1
  12. package/dist/attributionCollection.d.ts +1 -1
  13. package/dist/attributionCollection.d.ts.map +1 -1
  14. package/dist/attributionCollection.js.map +1 -1
  15. package/dist/attributionPolicy.d.ts +1 -1
  16. package/dist/attributionPolicy.d.ts.map +1 -1
  17. package/dist/attributionPolicy.js +15 -15
  18. package/dist/attributionPolicy.js.map +1 -1
  19. package/dist/client.d.ts +31 -12
  20. package/dist/client.d.ts.map +1 -1
  21. package/dist/client.js +103 -92
  22. package/dist/client.js.map +1 -1
  23. package/dist/collections/index.d.ts +2 -2
  24. package/dist/collections/index.d.ts.map +1 -1
  25. package/dist/collections/index.js +6 -6
  26. package/dist/collections/index.js.map +1 -1
  27. package/dist/endOfTreeSegment.d.ts +3 -3
  28. package/dist/endOfTreeSegment.d.ts.map +1 -1
  29. package/dist/endOfTreeSegment.js +8 -8
  30. package/dist/endOfTreeSegment.js.map +1 -1
  31. package/dist/index.d.ts +20 -20
  32. package/dist/index.d.ts.map +1 -1
  33. package/dist/index.js +71 -71
  34. package/dist/index.js.map +1 -1
  35. package/dist/localReference.d.ts +9 -39
  36. package/dist/localReference.d.ts.map +1 -1
  37. package/dist/localReference.js +29 -24
  38. package/dist/localReference.js.map +1 -1
  39. package/dist/merge-tree-alpha.d.ts +28 -450
  40. package/dist/merge-tree-beta.d.ts +0 -438
  41. package/dist/merge-tree-public.d.ts +0 -438
  42. package/dist/merge-tree-untrimmed.d.ts +28 -787
  43. package/dist/mergeTree.d.ts +11 -19
  44. package/dist/mergeTree.d.ts.map +1 -1
  45. package/dist/mergeTree.js +201 -189
  46. package/dist/mergeTree.js.map +1 -1
  47. package/dist/mergeTreeDeltaCallback.d.ts +3 -7
  48. package/dist/mergeTreeDeltaCallback.d.ts.map +1 -1
  49. package/dist/mergeTreeDeltaCallback.js.map +1 -1
  50. package/dist/mergeTreeNodeWalk.d.ts +1 -1
  51. package/dist/mergeTreeNodeWalk.d.ts.map +1 -1
  52. package/dist/mergeTreeNodeWalk.js.map +1 -1
  53. package/dist/mergeTreeNodes.d.ts +17 -14
  54. package/dist/mergeTreeNodes.d.ts.map +1 -1
  55. package/dist/mergeTreeNodes.js +32 -32
  56. package/dist/mergeTreeNodes.js.map +1 -1
  57. package/dist/mergeTreeTracking.d.ts +2 -2
  58. package/dist/mergeTreeTracking.d.ts.map +1 -1
  59. package/dist/mergeTreeTracking.js +2 -2
  60. package/dist/mergeTreeTracking.js.map +1 -1
  61. package/dist/opBuilder.d.ts +3 -3
  62. package/dist/opBuilder.d.ts.map +1 -1
  63. package/dist/opBuilder.js +7 -7
  64. package/dist/opBuilder.js.map +1 -1
  65. package/dist/package.json +3 -0
  66. package/dist/partialLengths.d.ts +5 -5
  67. package/dist/partialLengths.d.ts.map +1 -1
  68. package/dist/partialLengths.js +29 -29
  69. package/dist/partialLengths.js.map +1 -1
  70. package/dist/referencePositions.d.ts +4 -4
  71. package/dist/referencePositions.d.ts.map +1 -1
  72. package/dist/referencePositions.js +2 -2
  73. package/dist/referencePositions.js.map +1 -1
  74. package/dist/revertibles.d.ts +7 -7
  75. package/dist/revertibles.d.ts.map +1 -1
  76. package/dist/revertibles.js +39 -39
  77. package/dist/revertibles.js.map +1 -1
  78. package/dist/segmentGroupCollection.d.ts +1 -1
  79. package/dist/segmentGroupCollection.d.ts.map +1 -1
  80. package/dist/segmentGroupCollection.js +3 -3
  81. package/dist/segmentGroupCollection.js.map +1 -1
  82. package/dist/segmentPropertiesManager.d.ts +2 -2
  83. package/dist/segmentPropertiesManager.d.ts.map +1 -1
  84. package/dist/segmentPropertiesManager.js +8 -8
  85. package/dist/segmentPropertiesManager.js.map +1 -1
  86. package/dist/snapshotChunks.d.ts +3 -3
  87. package/dist/snapshotChunks.d.ts.map +1 -1
  88. package/dist/snapshotChunks.js +5 -5
  89. package/dist/snapshotChunks.js.map +1 -1
  90. package/dist/snapshotLoader.d.ts +3 -3
  91. package/dist/snapshotLoader.d.ts.map +1 -1
  92. package/dist/snapshotLoader.js +19 -19
  93. package/dist/snapshotLoader.js.map +1 -1
  94. package/dist/snapshotV1.d.ts +3 -3
  95. package/dist/snapshotV1.d.ts.map +1 -1
  96. package/dist/snapshotV1.js +35 -18
  97. package/dist/snapshotV1.js.map +1 -1
  98. package/dist/snapshotlegacy.d.ts +2 -2
  99. package/dist/snapshotlegacy.d.ts.map +1 -1
  100. package/dist/snapshotlegacy.js +22 -10
  101. package/dist/snapshotlegacy.js.map +1 -1
  102. package/dist/sortedSegmentSet.d.ts +3 -3
  103. package/dist/sortedSegmentSet.d.ts.map +1 -1
  104. package/dist/sortedSegmentSet.js +7 -5
  105. package/dist/sortedSegmentSet.js.map +1 -1
  106. package/dist/test/Insertion.perf.spec.js +15 -15
  107. package/dist/test/Insertion.perf.spec.js.map +1 -1
  108. package/dist/test/PartialLengths.perf.spec.js +13 -13
  109. package/dist/test/PartialLengths.perf.spec.js.map +1 -1
  110. package/dist/test/Removal.perf.spec.js +25 -25
  111. package/dist/test/Removal.perf.spec.js.map +1 -1
  112. package/dist/test/Snapshot.perf.spec.js +3 -3
  113. package/dist/test/Snapshot.perf.spec.js.map +1 -1
  114. package/dist/test/attributionCollection.perf.spec.js +9 -9
  115. package/dist/test/attributionCollection.perf.spec.js.map +1 -1
  116. package/dist/test/attributionCollection.spec.js +46 -46
  117. package/dist/test/attributionCollection.spec.js.map +1 -1
  118. package/dist/test/attributionPolicy.spec.js +13 -13
  119. package/dist/test/attributionPolicy.spec.js.map +1 -1
  120. package/dist/test/{beastTest.d.ts → beastTest.spec.d.ts} +3 -3
  121. package/dist/test/beastTest.spec.d.ts.map +1 -0
  122. package/dist/test/{beastTest.js → beastTest.spec.js} +120 -119
  123. package/dist/test/beastTest.spec.js.map +1 -0
  124. package/dist/test/client.annotateMarker.spec.js +13 -13
  125. package/dist/test/client.annotateMarker.spec.js.map +1 -1
  126. package/dist/test/{client.apis.d.ts → client.apis.spec.d.ts} +1 -1
  127. package/dist/test/client.apis.spec.d.ts.map +1 -0
  128. package/dist/test/{client.apis.js → client.apis.spec.js} +8 -8
  129. package/dist/test/client.apis.spec.js.map +1 -0
  130. package/dist/test/client.applyMsg.spec.js +106 -43
  131. package/dist/test/client.applyMsg.spec.js.map +1 -1
  132. package/dist/test/client.applyStashedOpFarm.spec.d.ts +1 -1
  133. package/dist/test/client.applyStashedOpFarm.spec.d.ts.map +1 -1
  134. package/dist/test/client.applyStashedOpFarm.spec.js +33 -21
  135. package/dist/test/client.applyStashedOpFarm.spec.js.map +1 -1
  136. package/dist/test/client.attributionFarm.spec.d.ts +1 -1
  137. package/dist/test/client.attributionFarm.spec.d.ts.map +1 -1
  138. package/dist/test/client.attributionFarm.spec.js +13 -13
  139. package/dist/test/client.attributionFarm.spec.js.map +1 -1
  140. package/dist/test/client.conflictFarm.spec.d.ts +1 -1
  141. package/dist/test/client.conflictFarm.spec.d.ts.map +1 -1
  142. package/dist/test/client.conflictFarm.spec.js +9 -9
  143. package/dist/test/client.conflictFarm.spec.js.map +1 -1
  144. package/dist/test/client.getPosition.spec.js +4 -4
  145. package/dist/test/client.getPosition.spec.js.map +1 -1
  146. package/dist/test/client.localReference.spec.js +140 -109
  147. package/dist/test/client.localReference.spec.js.map +1 -1
  148. package/dist/test/client.localReferenceFarm.spec.js +18 -18
  149. package/dist/test/client.localReferenceFarm.spec.js.map +1 -1
  150. package/dist/test/client.rebasePosition.spec.js +2 -2
  151. package/dist/test/client.rebasePosition.spec.js.map +1 -1
  152. package/dist/test/client.reconnectFarm.spec.d.ts +1 -1
  153. package/dist/test/client.reconnectFarm.spec.d.ts.map +1 -1
  154. package/dist/test/client.reconnectFarm.spec.js +10 -10
  155. package/dist/test/client.reconnectFarm.spec.js.map +1 -1
  156. package/dist/test/client.replay.spec.js +11 -11
  157. package/dist/test/client.replay.spec.js.map +1 -1
  158. package/dist/test/client.rollback.spec.js +83 -83
  159. package/dist/test/client.rollback.spec.js.map +1 -1
  160. package/dist/test/client.rollbackFarm.spec.js +9 -9
  161. package/dist/test/client.rollbackFarm.spec.js.map +1 -1
  162. package/dist/test/client.searchForMarker.spec.js +137 -137
  163. package/dist/test/client.searchForMarker.spec.js.map +1 -1
  164. package/dist/test/client.walkSegments.spec.js +2 -2
  165. package/dist/test/client.walkSegments.spec.js.map +1 -1
  166. package/dist/test/collections.list.spec.js +4 -4
  167. package/dist/test/collections.list.spec.js.map +1 -1
  168. package/dist/test/createInsertOnlyAttributionPolicy.spec.js +4 -4
  169. package/dist/test/createInsertOnlyAttributionPolicy.spec.js.map +1 -1
  170. package/dist/test/dirname.cjs +16 -0
  171. package/dist/test/dirname.cjs.map +1 -0
  172. package/dist/test/dirname.d.cts +6 -0
  173. package/dist/test/dirname.d.cts.map +1 -0
  174. package/dist/test/index.d.ts +8 -8
  175. package/dist/test/index.d.ts.map +1 -1
  176. package/dist/test/index.js +82 -81
  177. package/dist/test/index.js.map +1 -1
  178. package/dist/test/mergeTree.annotate.deltaCallback.spec.js +39 -39
  179. package/dist/test/mergeTree.annotate.deltaCallback.spec.js.map +1 -1
  180. package/dist/test/mergeTree.annotate.spec.js +39 -39
  181. package/dist/test/mergeTree.annotate.spec.js.map +1 -1
  182. package/dist/test/mergeTree.insert.deltaCallback.spec.js +35 -35
  183. package/dist/test/mergeTree.insert.deltaCallback.spec.js.map +1 -1
  184. package/dist/test/mergeTree.insertingWalk.spec.js +77 -77
  185. package/dist/test/mergeTree.insertingWalk.spec.js.map +1 -1
  186. package/dist/test/mergeTree.markRangeRemoved.deltaCallback.spec.js +42 -42
  187. package/dist/test/mergeTree.markRangeRemoved.deltaCallback.spec.js.map +1 -1
  188. package/dist/test/mergeTree.markRangeRemoved.spec.js +15 -15
  189. package/dist/test/mergeTree.markRangeRemoved.spec.js.map +1 -1
  190. package/dist/test/mergeTree.walk.spec.js +14 -14
  191. package/dist/test/mergeTree.walk.spec.js.map +1 -1
  192. package/dist/test/mergeTree.zamboni.spec.js +9 -9
  193. package/dist/test/mergeTree.zamboni.spec.js.map +1 -1
  194. package/dist/test/mergeTreeOperationRunner.d.ts +4 -4
  195. package/dist/test/mergeTreeOperationRunner.d.ts.map +1 -1
  196. package/dist/test/mergeTreeOperationRunner.js +16 -15
  197. package/dist/test/mergeTreeOperationRunner.js.map +1 -1
  198. package/dist/test/mergeTreeOperationRunner.spec.js +5 -5
  199. package/dist/test/mergeTreeOperationRunner.spec.js.map +1 -1
  200. package/dist/test/obliterate.concurrent.spec.js +85 -88
  201. package/dist/test/obliterate.concurrent.spec.js.map +1 -1
  202. package/dist/test/obliterate.deltaCallback.spec.d.ts +6 -0
  203. package/dist/test/obliterate.deltaCallback.spec.d.ts.map +1 -0
  204. package/dist/test/obliterate.deltaCallback.spec.js +146 -0
  205. package/dist/test/obliterate.deltaCallback.spec.js.map +1 -0
  206. package/dist/test/obliterate.partialLength.spec.js +39 -44
  207. package/dist/test/obliterate.partialLength.spec.js.map +1 -1
  208. package/dist/test/obliterate.reconnect.spec.js +15 -18
  209. package/dist/test/obliterate.reconnect.spec.js.map +1 -1
  210. package/dist/test/obliterate.spec.js +16 -16
  211. package/dist/test/obliterate.spec.js.map +1 -1
  212. package/dist/test/ordinal.spec.js +5 -5
  213. package/dist/test/ordinal.spec.js.map +1 -1
  214. package/dist/test/partialLength.spec.js +58 -64
  215. package/dist/test/partialLength.spec.js.map +1 -1
  216. package/dist/test/properties.spec.js +15 -15
  217. package/dist/test/properties.spec.js.map +1 -1
  218. package/dist/test/reconnectHelper.d.ts +8 -8
  219. package/dist/test/reconnectHelper.d.ts.map +1 -1
  220. package/dist/test/reconnectHelper.js +3 -3
  221. package/dist/test/reconnectHelper.js.map +1 -1
  222. package/dist/test/resetPendingSegmentsToOp.spec.js +18 -18
  223. package/dist/test/resetPendingSegmentsToOp.spec.js.map +1 -1
  224. package/dist/test/revertibleFarm.spec.js +21 -21
  225. package/dist/test/revertibleFarm.spec.js.map +1 -1
  226. package/dist/test/revertibles.spec.js +67 -67
  227. package/dist/test/revertibles.spec.js.map +1 -1
  228. package/dist/test/segmentGroupCollection.spec.js +3 -3
  229. package/dist/test/segmentGroupCollection.spec.js.map +1 -1
  230. package/dist/test/snapshot.spec.js +16 -16
  231. package/dist/test/snapshot.spec.js.map +1 -1
  232. package/dist/test/snapshot.utils.d.ts +4 -4
  233. package/dist/test/snapshot.utils.d.ts.map +1 -1
  234. package/dist/test/snapshot.utils.js +11 -11
  235. package/dist/test/snapshot.utils.js.map +1 -1
  236. package/dist/test/snapshotlegacy.spec.js +22 -22
  237. package/dist/test/snapshotlegacy.spec.js.map +1 -1
  238. package/dist/test/sortedSegmentSet.spec.js +9 -9
  239. package/dist/test/sortedSegmentSet.spec.js.map +1 -1
  240. package/dist/test/testClient.d.ts +13 -16
  241. package/dist/test/testClient.d.ts.map +1 -1
  242. package/dist/test/testClient.js +57 -59
  243. package/dist/test/testClient.js.map +1 -1
  244. package/dist/test/testClientLogger.d.ts +3 -3
  245. package/dist/test/testClientLogger.d.ts.map +1 -1
  246. package/dist/test/testClientLogger.js +19 -19
  247. package/dist/test/testClientLogger.js.map +1 -1
  248. package/dist/test/testServer.d.ts +3 -3
  249. package/dist/test/testServer.d.ts.map +1 -1
  250. package/dist/test/testServer.js +8 -8
  251. package/dist/test/testServer.js.map +1 -1
  252. package/dist/test/testUtils.d.ts +14 -6
  253. package/dist/test/testUtils.d.ts.map +1 -1
  254. package/dist/test/testUtils.js +36 -17
  255. package/dist/test/testUtils.js.map +1 -1
  256. package/dist/test/text.d.ts +2 -2
  257. package/dist/test/text.d.ts.map +1 -1
  258. package/dist/test/text.js +10 -10
  259. package/dist/test/text.js.map +1 -1
  260. package/dist/test/tracking.spec.js +12 -12
  261. package/dist/test/tracking.spec.js.map +1 -1
  262. package/dist/test/{wordUnitTests.d.ts → wordUnitTests.spec.d.ts} +1 -1
  263. package/dist/test/wordUnitTests.spec.d.ts.map +1 -0
  264. package/dist/test/{wordUnitTests.js → wordUnitTests.spec.js} +16 -15
  265. package/dist/test/wordUnitTests.spec.js.map +1 -0
  266. package/dist/textSegment.d.ts +3 -3
  267. package/dist/textSegment.d.ts.map +1 -1
  268. package/dist/textSegment.js +2 -2
  269. package/dist/textSegment.js.map +1 -1
  270. package/dist/tsdoc-metadata.json +1 -1
  271. package/dist/zamboni.d.ts +2 -2
  272. package/dist/zamboni.d.ts.map +1 -1
  273. package/dist/zamboni.js +19 -19
  274. package/dist/zamboni.js.map +1 -1
  275. package/lib/{MergeTreeTextHelper.d.mts → MergeTreeTextHelper.d.ts} +3 -3
  276. package/lib/MergeTreeTextHelper.d.ts.map +1 -0
  277. package/lib/{MergeTreeTextHelper.mjs → MergeTreeTextHelper.js} +3 -2
  278. package/lib/MergeTreeTextHelper.js.map +1 -0
  279. package/lib/{attributionCollection.d.mts → attributionCollection.d.ts} +2 -2
  280. package/lib/attributionCollection.d.ts.map +1 -0
  281. package/lib/{attributionCollection.mjs → attributionCollection.js} +1 -1
  282. package/lib/attributionCollection.js.map +1 -0
  283. package/lib/{attributionPolicy.d.mts → attributionPolicy.d.ts} +2 -2
  284. package/lib/attributionPolicy.d.ts.map +1 -0
  285. package/lib/{attributionPolicy.mjs → attributionPolicy.js} +4 -4
  286. package/lib/attributionPolicy.js.map +1 -0
  287. package/lib/{client.d.mts → client.d.ts} +32 -13
  288. package/lib/client.d.ts.map +1 -0
  289. package/lib/{client.mjs → client.js} +42 -31
  290. package/lib/client.js.map +1 -0
  291. package/lib/collections/{index.d.mts → index.d.ts} +3 -3
  292. package/lib/collections/index.d.ts.map +1 -0
  293. package/lib/collections/index.js +7 -0
  294. package/lib/collections/index.js.map +1 -0
  295. package/lib/collections/{list.d.mts → list.d.ts} +1 -1
  296. package/lib/collections/list.d.ts.map +1 -0
  297. package/lib/collections/{list.mjs → list.js} +1 -1
  298. package/lib/collections/list.js.map +1 -0
  299. package/lib/collections/{rbTree.d.mts → rbTree.d.ts} +1 -1
  300. package/lib/collections/rbTree.d.ts.map +1 -0
  301. package/lib/collections/{rbTree.mjs → rbTree.js} +1 -1
  302. package/lib/collections/rbTree.js.map +1 -0
  303. package/lib/{constants.d.mts → constants.d.ts} +1 -1
  304. package/lib/constants.d.ts.map +1 -0
  305. package/lib/{constants.mjs → constants.js} +1 -1
  306. package/lib/constants.js.map +1 -0
  307. package/lib/{endOfTreeSegment.d.mts → endOfTreeSegment.d.ts} +4 -4
  308. package/lib/endOfTreeSegment.d.ts.map +1 -0
  309. package/lib/{endOfTreeSegment.mjs → endOfTreeSegment.js} +3 -3
  310. package/lib/endOfTreeSegment.js.map +1 -0
  311. package/lib/{index.d.mts → index.d.ts} +21 -21
  312. package/lib/index.d.ts.map +1 -0
  313. package/lib/{index.mjs → index.js} +20 -20
  314. package/lib/index.js.map +1 -0
  315. package/lib/{localReference.d.mts → localReference.d.ts} +10 -40
  316. package/lib/localReference.d.ts.map +1 -0
  317. package/lib/{localReference.mjs → localReference.js} +12 -6
  318. package/lib/localReference.js.map +1 -0
  319. package/lib/{merge-tree-alpha.d.mts → merge-tree-alpha.d.ts} +28 -450
  320. package/lib/merge-tree-beta.d.ts +230 -0
  321. package/lib/merge-tree-public.d.ts +230 -0
  322. package/lib/{merge-tree-untrimmed.d.mts → merge-tree-untrimmed.d.ts} +28 -787
  323. package/lib/{mergeTree.d.mts → mergeTree.d.ts} +12 -20
  324. package/lib/mergeTree.d.ts.map +1 -0
  325. package/lib/{mergeTree.mjs → mergeTree.js} +47 -32
  326. package/lib/mergeTree.js.map +1 -0
  327. package/lib/{mergeTreeDeltaCallback.d.mts → mergeTreeDeltaCallback.d.ts} +8 -8
  328. package/lib/mergeTreeDeltaCallback.d.ts.map +1 -0
  329. package/lib/{mergeTreeDeltaCallback.mjs → mergeTreeDeltaCallback.js} +1 -1
  330. package/lib/mergeTreeDeltaCallback.js.map +1 -0
  331. package/lib/{mergeTreeNodeWalk.d.mts → mergeTreeNodeWalk.d.ts} +2 -2
  332. package/lib/mergeTreeNodeWalk.d.ts.map +1 -0
  333. package/lib/{mergeTreeNodeWalk.mjs → mergeTreeNodeWalk.js} +1 -1
  334. package/lib/mergeTreeNodeWalk.js.map +1 -0
  335. package/lib/{mergeTreeNodes.d.mts → mergeTreeNodes.d.ts} +18 -15
  336. package/lib/mergeTreeNodes.d.ts.map +1 -0
  337. package/lib/{mergeTreeNodes.mjs → mergeTreeNodes.js} +12 -10
  338. package/lib/mergeTreeNodes.js.map +1 -0
  339. package/lib/{mergeTreeTracking.d.mts → mergeTreeTracking.d.ts} +3 -3
  340. package/lib/mergeTreeTracking.d.ts.map +1 -0
  341. package/lib/{mergeTreeTracking.mjs → mergeTreeTracking.js} +3 -2
  342. package/lib/mergeTreeTracking.js.map +1 -0
  343. package/lib/{opBuilder.d.mts → opBuilder.d.ts} +4 -4
  344. package/lib/{opBuilder.d.mts.map → opBuilder.d.ts.map} +1 -1
  345. package/lib/{opBuilder.mjs → opBuilder.js} +2 -2
  346. package/lib/opBuilder.js.map +1 -0
  347. package/lib/{ops.d.mts → ops.d.ts} +1 -1
  348. package/lib/ops.d.ts.map +1 -0
  349. package/lib/{ops.mjs → ops.js} +1 -1
  350. package/lib/ops.js.map +1 -0
  351. package/lib/{ordinal.d.mts → ordinal.d.ts} +1 -1
  352. package/lib/ordinal.d.ts.map +1 -0
  353. package/lib/{ordinal.mjs → ordinal.js} +2 -1
  354. package/lib/ordinal.js.map +1 -0
  355. package/lib/{partialLengths.d.mts → partialLengths.d.ts} +6 -6
  356. package/lib/partialLengths.d.ts.map +1 -0
  357. package/lib/{partialLengths.mjs → partialLengths.js} +11 -10
  358. package/lib/partialLengths.js.map +1 -0
  359. package/lib/{properties.d.mts → properties.d.ts} +1 -1
  360. package/lib/properties.d.ts.map +1 -0
  361. package/lib/{properties.mjs → properties.js} +1 -1
  362. package/lib/properties.js.map +1 -0
  363. package/lib/{referencePositions.d.mts → referencePositions.d.ts} +5 -5
  364. package/lib/referencePositions.d.ts.map +1 -0
  365. package/lib/{referencePositions.mjs → referencePositions.js} +2 -2
  366. package/lib/referencePositions.js.map +1 -0
  367. package/lib/{revertibles.d.mts → revertibles.d.ts} +8 -8
  368. package/lib/revertibles.d.ts.map +1 -0
  369. package/lib/{revertibles.mjs → revertibles.js} +13 -13
  370. package/lib/revertibles.js.map +1 -0
  371. package/lib/{segmentGroupCollection.d.mts → segmentGroupCollection.d.ts} +2 -2
  372. package/lib/segmentGroupCollection.d.ts.map +1 -0
  373. package/lib/{segmentGroupCollection.mjs → segmentGroupCollection.js} +2 -2
  374. package/lib/segmentGroupCollection.js.map +1 -0
  375. package/lib/{segmentPropertiesManager.d.mts → segmentPropertiesManager.d.ts} +3 -3
  376. package/lib/segmentPropertiesManager.d.ts.map +1 -0
  377. package/lib/{segmentPropertiesManager.mjs → segmentPropertiesManager.js} +5 -3
  378. package/lib/segmentPropertiesManager.js.map +1 -0
  379. package/lib/{snapshotChunks.d.mts → snapshotChunks.d.ts} +4 -4
  380. package/lib/snapshotChunks.d.ts.map +1 -0
  381. package/lib/{snapshotChunks.mjs → snapshotChunks.js} +2 -2
  382. package/lib/snapshotChunks.js.map +1 -0
  383. package/lib/{snapshotLoader.d.mts → snapshotLoader.d.ts} +4 -4
  384. package/lib/snapshotLoader.d.ts.map +1 -0
  385. package/lib/{snapshotLoader.mjs → snapshotLoader.js} +10 -9
  386. package/lib/snapshotLoader.js.map +1 -0
  387. package/lib/{snapshotV1.d.mts → snapshotV1.d.ts} +4 -4
  388. package/lib/snapshotV1.d.ts.map +1 -0
  389. package/lib/{snapshotV1.mjs → snapshotV1.js} +24 -7
  390. package/lib/snapshotV1.js.map +1 -0
  391. package/lib/{snapshotlegacy.d.mts → snapshotlegacy.d.ts} +3 -3
  392. package/lib/snapshotlegacy.d.ts.map +1 -0
  393. package/lib/{snapshotlegacy.mjs → snapshotlegacy.js} +17 -4
  394. package/lib/snapshotlegacy.js.map +1 -0
  395. package/lib/{sortedSegmentSet.d.mts → sortedSegmentSet.d.ts} +4 -4
  396. package/lib/sortedSegmentSet.d.ts.map +1 -0
  397. package/lib/{sortedSegmentSet.mjs → sortedSegmentSet.js} +8 -5
  398. package/lib/sortedSegmentSet.js.map +1 -0
  399. package/lib/{sortedSet.d.mts → sortedSet.d.ts} +1 -1
  400. package/lib/sortedSet.d.ts.map +1 -0
  401. package/lib/{sortedSet.mjs → sortedSet.js} +1 -1
  402. package/lib/sortedSet.js.map +1 -0
  403. package/lib/test/Insertion.perf.spec.d.ts +6 -0
  404. package/lib/test/Insertion.perf.spec.d.ts.map +1 -0
  405. package/lib/test/Insertion.perf.spec.js +111 -0
  406. package/lib/test/Insertion.perf.spec.js.map +1 -0
  407. package/lib/test/PartialLengths.perf.spec.d.ts +6 -0
  408. package/lib/test/PartialLengths.perf.spec.d.ts.map +1 -0
  409. package/lib/test/PartialLengths.perf.spec.js +65 -0
  410. package/lib/test/PartialLengths.perf.spec.js.map +1 -0
  411. package/lib/test/Removal.perf.spec.d.ts +6 -0
  412. package/lib/test/Removal.perf.spec.d.ts.map +1 -0
  413. package/lib/test/Removal.perf.spec.js +164 -0
  414. package/lib/test/Removal.perf.spec.js.map +1 -0
  415. package/lib/test/Snapshot.perf.spec.d.ts +6 -0
  416. package/lib/test/Snapshot.perf.spec.d.ts.map +1 -0
  417. package/lib/test/Snapshot.perf.spec.js +31 -0
  418. package/lib/test/Snapshot.perf.spec.js.map +1 -0
  419. package/lib/test/attributionCollection.perf.spec.d.ts +6 -0
  420. package/lib/test/attributionCollection.perf.spec.d.ts.map +1 -0
  421. package/lib/test/attributionCollection.perf.spec.js +229 -0
  422. package/lib/test/attributionCollection.perf.spec.js.map +1 -0
  423. package/lib/test/attributionCollection.spec.d.ts +6 -0
  424. package/lib/test/attributionCollection.spec.d.ts.map +1 -0
  425. package/lib/test/attributionCollection.spec.js +484 -0
  426. package/lib/test/attributionCollection.spec.js.map +1 -0
  427. package/lib/test/attributionPolicy.spec.d.ts +6 -0
  428. package/lib/test/attributionPolicy.spec.d.ts.map +1 -0
  429. package/lib/test/attributionPolicy.spec.js +187 -0
  430. package/lib/test/attributionPolicy.spec.js.map +1 -0
  431. package/lib/test/beastTest.spec.d.ts +54 -0
  432. package/lib/test/beastTest.spec.d.ts.map +1 -0
  433. package/lib/test/beastTest.spec.js +1318 -0
  434. package/lib/test/beastTest.spec.js.map +1 -0
  435. package/lib/test/client.annotateMarker.spec.d.ts +6 -0
  436. package/lib/test/client.annotateMarker.spec.d.ts.map +1 -0
  437. package/lib/test/client.annotateMarker.spec.js +43 -0
  438. package/lib/test/client.annotateMarker.spec.js.map +1 -0
  439. package/lib/test/client.apis.spec.d.ts +7 -0
  440. package/lib/test/client.apis.spec.d.ts.map +1 -0
  441. package/lib/test/client.apis.spec.js +67 -0
  442. package/lib/test/client.apis.spec.js.map +1 -0
  443. package/lib/test/client.applyMsg.spec.d.ts +6 -0
  444. package/lib/test/client.applyMsg.spec.d.ts.map +1 -0
  445. package/lib/test/client.applyMsg.spec.js +561 -0
  446. package/lib/test/client.applyMsg.spec.js.map +1 -0
  447. package/lib/test/client.applyStashedOpFarm.spec.d.ts +12 -0
  448. package/lib/test/client.applyStashedOpFarm.spec.d.ts.map +1 -0
  449. package/lib/test/client.applyStashedOpFarm.spec.js +153 -0
  450. package/lib/test/client.applyStashedOpFarm.spec.js.map +1 -0
  451. package/lib/test/client.attributionFarm.spec.d.ts +7 -0
  452. package/lib/test/client.attributionFarm.spec.d.ts.map +1 -0
  453. package/lib/test/client.attributionFarm.spec.js +92 -0
  454. package/lib/test/client.attributionFarm.spec.js.map +1 -0
  455. package/lib/test/client.conflictFarm.spec.d.ts +15 -0
  456. package/lib/test/client.conflictFarm.spec.d.ts.map +1 -0
  457. package/lib/test/client.conflictFarm.spec.js +85 -0
  458. package/lib/test/client.conflictFarm.spec.js.map +1 -0
  459. package/lib/test/client.getPosition.spec.d.ts +6 -0
  460. package/lib/test/client.getPosition.spec.d.ts.map +1 -0
  461. package/lib/test/client.getPosition.spec.js +52 -0
  462. package/lib/test/client.getPosition.spec.js.map +1 -0
  463. package/lib/test/client.localReference.spec.d.ts +6 -0
  464. package/lib/test/client.localReference.spec.d.ts.map +1 -0
  465. package/lib/test/client.localReference.spec.js +468 -0
  466. package/lib/test/client.localReference.spec.js.map +1 -0
  467. package/lib/test/client.localReferenceFarm.spec.d.ts +6 -0
  468. package/lib/test/client.localReferenceFarm.spec.d.ts.map +1 -0
  469. package/lib/test/client.localReferenceFarm.spec.js +86 -0
  470. package/lib/test/client.localReferenceFarm.spec.js.map +1 -0
  471. package/lib/test/client.rebasePosition.spec.d.ts +6 -0
  472. package/lib/test/client.rebasePosition.spec.d.ts.map +1 -0
  473. package/lib/test/client.rebasePosition.spec.js +100 -0
  474. package/lib/test/client.rebasePosition.spec.js.map +1 -0
  475. package/lib/test/client.reconnectFarm.spec.d.ts +12 -0
  476. package/lib/test/client.reconnectFarm.spec.d.ts.map +1 -0
  477. package/lib/test/client.reconnectFarm.spec.js +88 -0
  478. package/lib/test/client.reconnectFarm.spec.js.map +1 -0
  479. package/lib/test/client.replay.spec.d.ts +6 -0
  480. package/lib/test/client.replay.spec.d.ts.map +1 -0
  481. package/lib/test/client.replay.spec.js +57 -0
  482. package/lib/test/client.replay.spec.js.map +1 -0
  483. package/lib/test/client.rollback.spec.d.ts +6 -0
  484. package/lib/test/client.rollback.spec.d.ts.map +1 -0
  485. package/lib/test/client.rollback.spec.js +451 -0
  486. package/lib/test/client.rollback.spec.js.map +1 -0
  487. package/lib/test/client.rollbackFarm.spec.d.ts +6 -0
  488. package/lib/test/client.rollbackFarm.spec.d.ts.map +1 -0
  489. package/lib/test/client.rollbackFarm.spec.js +46 -0
  490. package/lib/test/client.rollbackFarm.spec.js.map +1 -0
  491. package/lib/test/client.searchForMarker.spec.d.ts +6 -0
  492. package/lib/test/client.searchForMarker.spec.d.ts.map +1 -0
  493. package/lib/test/client.searchForMarker.spec.js +495 -0
  494. package/lib/test/client.searchForMarker.spec.js.map +1 -0
  495. package/lib/test/client.walkSegments.spec.d.ts +6 -0
  496. package/lib/test/client.walkSegments.spec.d.ts.map +1 -0
  497. package/lib/test/client.walkSegments.spec.js +52 -0
  498. package/lib/test/client.walkSegments.spec.js.map +1 -0
  499. package/lib/test/collections.list.spec.d.ts +6 -0
  500. package/lib/test/collections.list.spec.d.ts.map +1 -0
  501. package/lib/test/collections.list.spec.js +82 -0
  502. package/lib/test/collections.list.spec.js.map +1 -0
  503. package/lib/test/createInsertOnlyAttributionPolicy.spec.d.ts +6 -0
  504. package/lib/test/createInsertOnlyAttributionPolicy.spec.d.ts.map +1 -0
  505. package/lib/test/createInsertOnlyAttributionPolicy.spec.js +33 -0
  506. package/lib/test/createInsertOnlyAttributionPolicy.spec.js.map +1 -0
  507. package/lib/test/dirname.cjs +16 -0
  508. package/lib/test/dirname.cjs.map +1 -0
  509. package/lib/test/dirname.d.cts +6 -0
  510. package/lib/test/dirname.d.cts.map +1 -0
  511. package/lib/test/index.d.ts +13 -0
  512. package/lib/test/index.d.ts.map +1 -0
  513. package/lib/test/index.js +13 -0
  514. package/lib/test/index.js.map +1 -0
  515. package/lib/test/mergeTree.annotate.deltaCallback.spec.d.ts +6 -0
  516. package/lib/test/mergeTree.annotate.deltaCallback.spec.d.ts.map +1 -0
  517. package/lib/test/mergeTree.annotate.deltaCallback.spec.js +140 -0
  518. package/lib/test/mergeTree.annotate.deltaCallback.spec.js.map +1 -0
  519. package/lib/test/mergeTree.annotate.spec.d.ts +6 -0
  520. package/lib/test/mergeTree.annotate.spec.d.ts.map +1 -0
  521. package/lib/test/mergeTree.annotate.spec.js +446 -0
  522. package/lib/test/mergeTree.annotate.spec.js.map +1 -0
  523. package/lib/test/mergeTree.insert.deltaCallback.spec.d.ts +6 -0
  524. package/lib/test/mergeTree.insert.deltaCallback.spec.d.ts.map +1 -0
  525. package/lib/test/mergeTree.insert.deltaCallback.spec.js +124 -0
  526. package/lib/test/mergeTree.insert.deltaCallback.spec.js.map +1 -0
  527. package/lib/test/mergeTree.insertingWalk.spec.d.ts +6 -0
  528. package/lib/test/mergeTree.insertingWalk.spec.d.ts.map +1 -0
  529. package/lib/test/mergeTree.insertingWalk.spec.js +277 -0
  530. package/lib/test/mergeTree.insertingWalk.spec.js.map +1 -0
  531. package/lib/test/mergeTree.markRangeRemoved.deltaCallback.spec.d.ts +6 -0
  532. package/lib/test/mergeTree.markRangeRemoved.deltaCallback.spec.d.ts.map +1 -0
  533. package/lib/test/mergeTree.markRangeRemoved.deltaCallback.spec.js +176 -0
  534. package/lib/test/mergeTree.markRangeRemoved.deltaCallback.spec.js.map +1 -0
  535. package/lib/test/mergeTree.markRangeRemoved.spec.d.ts +6 -0
  536. package/lib/test/mergeTree.markRangeRemoved.spec.d.ts.map +1 -0
  537. package/lib/test/mergeTree.markRangeRemoved.spec.js +128 -0
  538. package/lib/test/mergeTree.markRangeRemoved.spec.js.map +1 -0
  539. package/lib/test/mergeTree.walk.spec.d.ts +6 -0
  540. package/lib/test/mergeTree.walk.spec.d.ts.map +1 -0
  541. package/lib/test/mergeTree.walk.spec.js +61 -0
  542. package/lib/test/mergeTree.walk.spec.js.map +1 -0
  543. package/lib/test/mergeTree.zamboni.spec.d.ts +6 -0
  544. package/lib/test/mergeTree.zamboni.spec.d.ts.map +1 -0
  545. package/lib/test/mergeTree.zamboni.spec.js +50 -0
  546. package/lib/test/mergeTree.zamboni.spec.js.map +1 -0
  547. package/lib/test/mergeTreeOperationRunner.d.ts +63 -0
  548. package/lib/test/mergeTreeOperationRunner.d.ts.map +1 -0
  549. package/lib/test/mergeTreeOperationRunner.js +207 -0
  550. package/lib/test/mergeTreeOperationRunner.js.map +1 -0
  551. package/lib/test/mergeTreeOperationRunner.spec.d.ts +6 -0
  552. package/lib/test/mergeTreeOperationRunner.spec.d.ts.map +1 -0
  553. package/lib/test/mergeTreeOperationRunner.spec.js +154 -0
  554. package/lib/test/mergeTreeOperationRunner.spec.js.map +1 -0
  555. package/lib/test/obliterate.concurrent.spec.d.ts +6 -0
  556. package/lib/test/obliterate.concurrent.spec.d.ts.map +1 -0
  557. package/lib/test/obliterate.concurrent.spec.js +1441 -0
  558. package/lib/test/obliterate.concurrent.spec.js.map +1 -0
  559. package/lib/test/obliterate.deltaCallback.spec.d.ts +6 -0
  560. package/lib/test/obliterate.deltaCallback.spec.d.ts.map +1 -0
  561. package/lib/test/obliterate.deltaCallback.spec.js +144 -0
  562. package/lib/test/obliterate.deltaCallback.spec.js.map +1 -0
  563. package/lib/test/obliterate.partialLength.spec.d.ts +6 -0
  564. package/lib/test/obliterate.partialLength.spec.d.ts.map +1 -0
  565. package/lib/test/obliterate.partialLength.spec.js +272 -0
  566. package/lib/test/obliterate.partialLength.spec.js.map +1 -0
  567. package/lib/test/obliterate.reconnect.spec.d.ts +6 -0
  568. package/lib/test/obliterate.reconnect.spec.d.ts.map +1 -0
  569. package/lib/test/obliterate.reconnect.spec.js +159 -0
  570. package/lib/test/obliterate.reconnect.spec.js.map +1 -0
  571. package/lib/test/obliterate.spec.d.ts +6 -0
  572. package/lib/test/obliterate.spec.d.ts.map +1 -0
  573. package/lib/test/obliterate.spec.js +160 -0
  574. package/lib/test/obliterate.spec.js.map +1 -0
  575. package/lib/test/ordinal.spec.d.ts +2 -0
  576. package/lib/test/ordinal.spec.d.ts.map +1 -0
  577. package/lib/test/ordinal.spec.js +38 -0
  578. package/lib/test/ordinal.spec.js.map +1 -0
  579. package/lib/test/partialLength.spec.d.ts +6 -0
  580. package/lib/test/partialLength.spec.d.ts.map +1 -0
  581. package/lib/test/partialLength.spec.js +274 -0
  582. package/lib/test/partialLength.spec.js.map +1 -0
  583. package/lib/test/properties.spec.d.ts +6 -0
  584. package/lib/test/properties.spec.d.ts.map +1 -0
  585. package/lib/test/properties.spec.js +53 -0
  586. package/lib/test/properties.spec.js.map +1 -0
  587. package/lib/test/reconnectHelper.d.ts +48 -0
  588. package/lib/test/reconnectHelper.d.ts.map +1 -0
  589. package/lib/test/reconnectHelper.js +82 -0
  590. package/lib/test/reconnectHelper.js.map +1 -0
  591. package/lib/test/resetPendingSegmentsToOp.spec.d.ts +6 -0
  592. package/lib/test/resetPendingSegmentsToOp.spec.d.ts.map +1 -0
  593. package/lib/test/resetPendingSegmentsToOp.spec.js +235 -0
  594. package/lib/test/resetPendingSegmentsToOp.spec.js.map +1 -0
  595. package/lib/test/revertibleFarm.spec.d.ts +6 -0
  596. package/lib/test/revertibleFarm.spec.d.ts.map +1 -0
  597. package/lib/test/revertibleFarm.spec.js +119 -0
  598. package/lib/test/revertibleFarm.spec.js.map +1 -0
  599. package/lib/test/revertibles.spec.d.ts +17 -0
  600. package/lib/test/revertibles.spec.d.ts.map +1 -0
  601. package/lib/test/revertibles.spec.js +381 -0
  602. package/lib/test/revertibles.spec.js.map +1 -0
  603. package/lib/test/segmentGroupCollection.spec.d.ts +6 -0
  604. package/lib/test/segmentGroupCollection.spec.d.ts.map +1 -0
  605. package/lib/test/segmentGroupCollection.spec.js +58 -0
  606. package/lib/test/segmentGroupCollection.spec.js.map +1 -0
  607. package/lib/test/snapshot.spec.d.ts +6 -0
  608. package/lib/test/snapshot.spec.d.ts.map +1 -0
  609. package/lib/test/snapshot.spec.js +176 -0
  610. package/lib/test/snapshot.spec.js.map +1 -0
  611. package/lib/test/snapshot.utils.d.ts +33 -0
  612. package/lib/test/snapshot.utils.d.ts.map +1 -0
  613. package/lib/test/snapshot.utils.js +104 -0
  614. package/lib/test/snapshot.utils.js.map +1 -0
  615. package/lib/test/snapshotlegacy.spec.d.ts +6 -0
  616. package/lib/test/snapshotlegacy.spec.d.ts.map +1 -0
  617. package/lib/test/snapshotlegacy.spec.js +137 -0
  618. package/lib/test/snapshotlegacy.spec.js.map +1 -0
  619. package/lib/test/sortedSegmentSet.spec.d.ts +6 -0
  620. package/lib/test/sortedSegmentSet.spec.d.ts.map +1 -0
  621. package/lib/test/sortedSegmentSet.spec.js +93 -0
  622. package/lib/test/sortedSegmentSet.spec.js.map +1 -0
  623. package/lib/test/testClient.d.ts +116 -0
  624. package/lib/test/testClient.d.ts.map +1 -0
  625. package/lib/test/testClient.js +430 -0
  626. package/lib/test/testClient.js.map +1 -0
  627. package/lib/test/testClientLogger.d.ts +44 -0
  628. package/lib/test/testClientLogger.d.ts.map +1 -0
  629. package/lib/test/testClientLogger.js +282 -0
  630. package/lib/test/testClientLogger.js.map +1 -0
  631. package/lib/test/testSerializer.d.ts +18 -0
  632. package/lib/test/testSerializer.d.ts.map +1 -0
  633. package/lib/test/testSerializer.js +29 -0
  634. package/lib/test/testSerializer.js.map +1 -0
  635. package/lib/test/testServer.d.ts +36 -0
  636. package/lib/test/testServer.d.ts.map +1 -0
  637. package/lib/test/testServer.js +133 -0
  638. package/lib/test/testServer.js.map +1 -0
  639. package/lib/test/testUtils.d.ts +77 -0
  640. package/lib/test/testUtils.d.ts.map +1 -0
  641. package/lib/test/testUtils.js +151 -0
  642. package/lib/test/testUtils.js.map +1 -0
  643. package/lib/test/text.d.ts +9 -0
  644. package/lib/test/text.d.ts.map +1 -0
  645. package/lib/test/text.js +71 -0
  646. package/lib/test/text.js.map +1 -0
  647. package/lib/test/tracking.spec.d.ts +6 -0
  648. package/lib/test/tracking.spec.d.ts.map +1 -0
  649. package/lib/test/tracking.spec.js +118 -0
  650. package/lib/test/tracking.spec.js.map +1 -0
  651. package/lib/test/types/validateMergeTreePrevious.generated.d.ts +2 -0
  652. package/lib/test/types/validateMergeTreePrevious.generated.d.ts.map +1 -0
  653. package/lib/test/types/validateMergeTreePrevious.generated.js +228 -0
  654. package/lib/test/types/validateMergeTreePrevious.generated.js.map +1 -0
  655. package/lib/test/wordUnitTests.spec.d.ts +6 -0
  656. package/lib/test/wordUnitTests.spec.d.ts.map +1 -0
  657. package/lib/test/wordUnitTests.spec.js +166 -0
  658. package/lib/test/wordUnitTests.spec.js.map +1 -0
  659. package/lib/{textSegment.d.mts → textSegment.d.ts} +4 -4
  660. package/lib/textSegment.d.ts.map +1 -0
  661. package/lib/{textSegment.mjs → textSegment.js} +2 -2
  662. package/lib/textSegment.js.map +1 -0
  663. package/lib/{zamboni.d.mts → zamboni.d.ts} +3 -3
  664. package/lib/zamboni.d.ts.map +1 -0
  665. package/lib/{zamboni.mjs → zamboni.js} +7 -6
  666. package/lib/zamboni.js.map +1 -0
  667. package/package.json +50 -57
  668. package/src/MergeTreeTextHelper.ts +4 -4
  669. package/src/attributionCollection.ts +1 -1
  670. package/src/attributionPolicy.ts +5 -5
  671. package/src/client.ts +50 -41
  672. package/src/collections/index.ts +2 -2
  673. package/src/endOfTreeSegment.ts +5 -5
  674. package/src/index.ts +20 -20
  675. package/src/localReference.ts +13 -7
  676. package/src/mergeTree.ts +53 -44
  677. package/src/mergeTreeDeltaCallback.ts +3 -8
  678. package/src/mergeTreeNodeWalk.ts +1 -1
  679. package/src/mergeTreeNodes.ts +21 -19
  680. package/src/mergeTreeTracking.ts +3 -3
  681. package/src/opBuilder.ts +3 -3
  682. package/src/partialLengths.ts +10 -10
  683. package/src/referencePositions.ts +4 -4
  684. package/src/revertibles.ts +14 -18
  685. package/src/segmentGroupCollection.ts +2 -2
  686. package/src/segmentPropertiesManager.ts +3 -3
  687. package/src/snapshotChunks.ts +4 -4
  688. package/src/snapshotLoader.ts +14 -11
  689. package/src/snapshotV1.ts +29 -9
  690. package/src/snapshotlegacy.ts +19 -5
  691. package/src/sortedSegmentSet.ts +8 -6
  692. package/src/textSegment.ts +3 -3
  693. package/src/zamboni.ts +7 -7
  694. package/tsconfig.cjs.json +7 -0
  695. package/tsconfig.json +2 -5
  696. package/api-extractor-esm.json +0 -17
  697. package/dist/test/beastTest.d.ts.map +0 -1
  698. package/dist/test/beastTest.js.map +0 -1
  699. package/dist/test/client.apis.d.ts.map +0 -1
  700. package/dist/test/client.apis.js.map +0 -1
  701. package/dist/test/wordUnitTests.d.ts.map +0 -1
  702. package/dist/test/wordUnitTests.js.map +0 -1
  703. package/lib/MergeTreeTextHelper.d.mts.map +0 -1
  704. package/lib/MergeTreeTextHelper.mjs.map +0 -1
  705. package/lib/attributionCollection.d.mts.map +0 -1
  706. package/lib/attributionCollection.mjs.map +0 -1
  707. package/lib/attributionPolicy.d.mts.map +0 -1
  708. package/lib/attributionPolicy.mjs.map +0 -1
  709. package/lib/client.d.mts.map +0 -1
  710. package/lib/client.mjs.map +0 -1
  711. package/lib/collections/index.d.mts.map +0 -1
  712. package/lib/collections/index.mjs +0 -7
  713. package/lib/collections/index.mjs.map +0 -1
  714. package/lib/collections/list.d.mts.map +0 -1
  715. package/lib/collections/list.mjs.map +0 -1
  716. package/lib/collections/rbTree.d.mts.map +0 -1
  717. package/lib/collections/rbTree.mjs.map +0 -1
  718. package/lib/constants.d.mts.map +0 -1
  719. package/lib/constants.mjs.map +0 -1
  720. package/lib/endOfTreeSegment.d.mts.map +0 -1
  721. package/lib/endOfTreeSegment.mjs.map +0 -1
  722. package/lib/index.d.mts.map +0 -1
  723. package/lib/index.mjs.map +0 -1
  724. package/lib/localReference.d.mts.map +0 -1
  725. package/lib/localReference.mjs.map +0 -1
  726. package/lib/merge-tree-beta.d.mts +0 -668
  727. package/lib/merge-tree-public.d.mts +0 -668
  728. package/lib/mergeTree.d.mts.map +0 -1
  729. package/lib/mergeTree.mjs.map +0 -1
  730. package/lib/mergeTreeDeltaCallback.d.mts.map +0 -1
  731. package/lib/mergeTreeDeltaCallback.mjs.map +0 -1
  732. package/lib/mergeTreeNodeWalk.d.mts.map +0 -1
  733. package/lib/mergeTreeNodeWalk.mjs.map +0 -1
  734. package/lib/mergeTreeNodes.d.mts.map +0 -1
  735. package/lib/mergeTreeNodes.mjs.map +0 -1
  736. package/lib/mergeTreeTracking.d.mts.map +0 -1
  737. package/lib/mergeTreeTracking.mjs.map +0 -1
  738. package/lib/opBuilder.mjs.map +0 -1
  739. package/lib/ops.d.mts.map +0 -1
  740. package/lib/ops.mjs.map +0 -1
  741. package/lib/ordinal.d.mts.map +0 -1
  742. package/lib/ordinal.mjs.map +0 -1
  743. package/lib/partialLengths.d.mts.map +0 -1
  744. package/lib/partialLengths.mjs.map +0 -1
  745. package/lib/properties.d.mts.map +0 -1
  746. package/lib/properties.mjs.map +0 -1
  747. package/lib/referencePositions.d.mts.map +0 -1
  748. package/lib/referencePositions.mjs.map +0 -1
  749. package/lib/revertibles.d.mts.map +0 -1
  750. package/lib/revertibles.mjs.map +0 -1
  751. package/lib/segmentGroupCollection.d.mts.map +0 -1
  752. package/lib/segmentGroupCollection.mjs.map +0 -1
  753. package/lib/segmentPropertiesManager.d.mts.map +0 -1
  754. package/lib/segmentPropertiesManager.mjs.map +0 -1
  755. package/lib/snapshotChunks.d.mts.map +0 -1
  756. package/lib/snapshotChunks.mjs.map +0 -1
  757. package/lib/snapshotLoader.d.mts.map +0 -1
  758. package/lib/snapshotLoader.mjs.map +0 -1
  759. package/lib/snapshotV1.d.mts.map +0 -1
  760. package/lib/snapshotV1.mjs.map +0 -1
  761. package/lib/snapshotlegacy.d.mts.map +0 -1
  762. package/lib/snapshotlegacy.mjs.map +0 -1
  763. package/lib/sortedSegmentSet.d.mts.map +0 -1
  764. package/lib/sortedSegmentSet.mjs.map +0 -1
  765. package/lib/sortedSet.d.mts.map +0 -1
  766. package/lib/sortedSet.mjs.map +0 -1
  767. package/lib/textSegment.d.mts.map +0 -1
  768. package/lib/textSegment.mjs.map +0 -1
  769. package/lib/zamboni.d.mts.map +0 -1
  770. package/lib/zamboni.mjs.map +0 -1
package/lib/ops.mjs.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"ops.mjs","sourceRoot":"","sources":["../src/ops.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;GAGG;AACH,MAAM,CAAN,IAAY,aAsCX;AAtCD,WAAY,aAAa;IACxB,qDAAY,CAAA;IACZ;;OAEG;IACH,iDAAU,CAAA;IAEV;;;;OAIG;IACH,8DAAiB,CAAA;IAEjB;;;;OAIG;IACH,0DAAe,CAAA;IAEf;;;;;;OAMG;IACH,oEAAoB,CAAA;IACpB;;OAEG;IACH,mEAAmB,CAAA;IACnB;;;OAGG;IACH,6DAAiB,CAAA;AAClB,CAAC,EAtCW,aAAa,KAAb,aAAa,QAsCxB;AASD,mFAAmF;AACnF;;GAEG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG;IACjC,MAAM,EAAE,CAAC;IACT,MAAM,EAAE,CAAC;IACT,QAAQ,EAAE,CAAC;IACX;;OAEG;IACH,KAAK,EAAE,CAAC;IACR,UAAU,EAAE,CAAC;CACJ,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\n/**\n * Flags enum that dictates behavior of a {@link ReferencePosition}\n * @alpha\n */\nexport enum ReferenceType {\n\tSimple = 0x0,\n\t/**\n\t * Allows this reference to be located using the `searchForMarker` API on merge-tree.\n\t */\n\tTile = 0x1,\n\n\t/**\n\t * Denotes that this reference begins the start of an interval. This is\n\t * generally not meaningful outside the context of interval collections\n\t * on SharedString.\n\t */\n\tRangeBegin = 0x10,\n\n\t/**\n\t * Denotes that this reference is the end of an interval. This is\n\t * generally not meaningful outside the context of interval collections\n\t * on SharedString.\n\t */\n\tRangeEnd = 0x20,\n\n\t/**\n\t * When a segment is marked removed (locally or with ack), this reference will slide to the first\n\t * valid option of:\n\t * 1. the start of the next furthest segment\n\t * 2. the end of the next nearest segment\n\t * 3. DetachedReferencePosition\n\t */\n\tSlideOnRemove = 0x40,\n\t/**\n\t * When a segment is marked removed (locally or with ack), this reference will remain on that segment.\n\t */\n\tStayOnRemove = 0x80,\n\t/**\n\t * Specifies that the reference position should never be added to the segment it refers to.\n\t * This is useful for comparison/iteration purposes\n\t */\n\tTransient = 0x100,\n}\n\n/**\n * @alpha\n */\nexport interface IMarkerDef {\n\trefType?: ReferenceType;\n}\n\n// Note: Assigned positive integers to avoid clashing with MergeTreeMaintenanceType\n/**\n * @alpha\n */\nexport const MergeTreeDeltaType = {\n\tINSERT: 0,\n\tREMOVE: 1,\n\tANNOTATE: 2,\n\t/**\n\t * @deprecated The ability to create group ops will be removed in an upcoming release, as group ops are redundant with he native batching capabilities of the runtime\n\t */\n\tGROUP: 3,\n\tOBLITERATE: 4,\n} as const;\n\n/**\n * @alpha\n */\nexport type MergeTreeDeltaType = (typeof MergeTreeDeltaType)[keyof typeof MergeTreeDeltaType];\n\n/**\n * @alpha\n */\nexport interface IMergeTreeDelta {\n\t/**\n\t * Type of this change.\n\t */\n\ttype: MergeTreeDeltaType;\n}\n\n/**\n * A position specified relative to a segment.\n * @alpha\n */\nexport interface IRelativePosition {\n\t/**\n\t * String identifier specifying a segment.\n\t */\n\tid?: string;\n\t/**\n\t * If true, insert before the specified segment. If false or not defined,\n\t * insert after the specified segment.\n\t */\n\tbefore?: boolean;\n\t/**\n\t * A positive number \\>= 1. If before is false, offset is added to the position.\n\t * If before is true, offset is subtracted from the position.\n\t */\n\toffset?: number;\n}\n\n/**\n * @alpha\n */\nexport interface IMergeTreeInsertMsg extends IMergeTreeDelta {\n\ttype: typeof MergeTreeDeltaType.INSERT;\n\tpos1?: number;\n\trelativePos1?: IRelativePosition;\n\tpos2?: number;\n\trelativePos2?: IRelativePosition;\n\tseg?: any;\n}\n\n/**\n * @alpha\n */\nexport interface IMergeTreeRemoveMsg extends IMergeTreeDelta {\n\ttype: typeof MergeTreeDeltaType.REMOVE;\n\tpos1?: number;\n\trelativePos1?: IRelativePosition;\n\tpos2?: number;\n\trelativePos2?: IRelativePosition;\n}\n\n/**\n * @deprecated We no longer intend to support this functionality and it will\n * be removed in a future release. There is no replacement for this\n * functionality.\n * @alpha\n */\nexport interface IMergeTreeObliterateMsg extends IMergeTreeDelta {\n\ttype: typeof MergeTreeDeltaType.OBLITERATE;\n\tpos1?: number;\n\t/**\n\t * This field is currently unused, but we keep it around to make the union\n\t * type of all merge-tree messages have the same fields\n\t */\n\trelativePos1?: never;\n\tpos2?: number;\n\t/**\n\t * This field is currently unused, but we keep it around to make the union\n\t * type of all merge-tree messages have the same fields\n\t */\n\trelativePos2?: never;\n}\n\n/**\n * @alpha\n */\nexport interface IMergeTreeAnnotateMsg extends IMergeTreeDelta {\n\ttype: typeof MergeTreeDeltaType.ANNOTATE;\n\tpos1?: number;\n\trelativePos1?: IRelativePosition;\n\tpos2?: number;\n\trelativePos2?: IRelativePosition;\n\tprops: Record<string, any>;\n}\n\n/**\n * @deprecated The ability to create group ops will be removed in an upcoming\n * release, as group ops are redundant with the native batching capabilities\n * of the runtime\n *\n * @alpha\n */\nexport interface IMergeTreeGroupMsg extends IMergeTreeDelta {\n\ttype: typeof MergeTreeDeltaType.GROUP;\n\tops: IMergeTreeDeltaOp[];\n}\n\n/**\n * @alpha\n */\nexport interface IJSONSegment {\n\tprops?: Record<string, any>;\n}\n\n/**\n * @alpha\n */\nexport type IMergeTreeDeltaOp =\n\t| IMergeTreeInsertMsg\n\t| IMergeTreeRemoveMsg\n\t| IMergeTreeAnnotateMsg\n\t| IMergeTreeObliterateMsg;\n\n/**\n * @alpha\n */\nexport type IMergeTreeOp = IMergeTreeDeltaOp | IMergeTreeGroupMsg;\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"ordinal.d.mts","sourceRoot":"","sources":["../src/ordinal.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,wBAAgB,0BAA0B,CACzC,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,EACnB,aAAa,EAAE,MAAM,EACrB,eAAe,EAAE,MAAM,GAAG,SAAS,UAkBnC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"ordinal.mjs","sourceRoot":"","sources":["../src/ordinal.ts"],"names":[],"mappings":"AAAA;;;GAGG;OAGI,EAAE,MAAM,EAAE,MAAM,4BAA4B;AAEnD,MAAM,UAAU,0BAA0B,CACzC,QAAgB,EAChB,WAAmB,EACnB,aAAqB,EACrB,eAAmC;IAEnC,MAAM,CACL,QAAQ,IAAI,EAAE,IAAI,WAAW,IAAI,QAAQ,EACzC,KAAK,CAAC,6DAA6D,CACnE,CAAC;IAEF,MAAM,YAAY,GAAG,CAAC,IAAI,CAAC,QAAQ,GAAG,WAAW,CAAC,CAAC;IACnD,IAAI,OAAe,CAAC;IACpB,IAAI,eAAe,KAAK,SAAS,EAAE;QAClC,OAAO,GAAG,aAAa,GAAG,MAAM,CAAC,YAAY,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC;KAChE;SAAM;QACN,MAAM,WAAW,GAAG,eAAe,CAAC,UAAU,CAAC,eAAe,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAC3E,MAAM,YAAY,GAAG,WAAW,GAAG,YAAY,CAAC;QAChD,OAAO,GAAG,aAAa,GAAG,MAAM,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC;KAC5D;IAED,OAAO,OAAO,CAAC;AAChB,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\n/* eslint-disable no-bitwise */\nimport { assert } from \"@fluidframework/core-utils\";\n\nexport function computeHierarchicalOrdinal(\n\tmaxCount: number,\n\tactualCount: number,\n\tparentOrdinal: string,\n\tpreviousOrdinal: string | undefined,\n) {\n\tassert(\n\t\tmaxCount <= 16 && actualCount <= maxCount,\n\t\t0x3f0 /* count must be less than max, and max must be 16 or less */,\n\t);\n\n\tconst ordinalWidth = 1 << (maxCount - actualCount);\n\tlet ordinal: string;\n\tif (previousOrdinal === undefined) {\n\t\tordinal = parentOrdinal + String.fromCharCode(ordinalWidth - 1);\n\t} else {\n\t\tconst prevOrdCode = previousOrdinal.charCodeAt(previousOrdinal.length - 1);\n\t\tconst localOrdinal = prevOrdCode + ordinalWidth;\n\t\tordinal = parentOrdinal + String.fromCharCode(localOrdinal);\n\t}\n\n\treturn ordinal;\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"partialLengths.d.mts","sourceRoot":"","sources":["../src/partialLengths.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"partialLengths.mjs","sourceRoot":"","sources":["../src/partialLengths.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 { assert } from \"@fluidframework/core-utils\";\nimport { Property, RedBlackTree } from \"./collections\";\nimport { UnassignedSequenceNumber } from \"./constants\";\nimport { MergeTree } from \"./mergeTree\";\nimport {\n\t// eslint-disable-next-line import/no-deprecated\n\tCollaborationWindow,\n\tcompareNumbers,\n\tIMergeBlock,\n\tIMergeNode,\n\tIMoveInfo,\n\tIRemovalInfo,\n\tISegment,\n\ttoMoveInfo,\n\tseqLTE,\n\ttoRemovalInfo,\n} from \"./mergeTreeNodes\";\n// eslint-disable-next-line import/no-deprecated\nimport { SortedSet } from \"./sortedSet\";\n\n// eslint-disable-next-line import/no-deprecated\nclass PartialSequenceLengthsSet extends SortedSet<PartialSequenceLength, number> {\n\tprotected getKey(item: PartialSequenceLength): number {\n\t\treturn item.seq;\n\t}\n\n\tpublic addOrUpdate(\n\t\tnewItem: PartialSequenceLength,\n\t\tupdate?: (existingItem: PartialSequenceLength, newItem: PartialSequenceLength) => void,\n\t) {\n\t\tconst prev = this.latestLeq(newItem.seq);\n\n\t\tif (prev?.seq !== newItem.seq) {\n\t\t\t// new element, update len\n\t\t\tnewItem.len = (prev?.len ?? 0) + newItem.seglen;\n\t\t}\n\n\t\t// update the len of all following elements\n\t\tfor (let i = this.keySortedItems.length - 1; i >= 0; i--) {\n\t\t\tconst element = this.keySortedItems[i];\n\t\t\tif (!element || element.seq <= newItem.seq) {\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\telement.len += newItem.seglen;\n\t\t}\n\n\t\tsuper.addOrUpdate(newItem, (currentPartial, partialLength) => {\n\t\t\tcurrentPartial.seglen += partialLength.seglen;\n\n\t\t\tif (partialLength.remoteObliteratedLen) {\n\t\t\t\tcurrentPartial.remoteObliteratedLen ??= 0;\n\t\t\t\tcurrentPartial.remoteObliteratedLen += partialLength.remoteObliteratedLen;\n\t\t\t}\n\n\t\t\tcurrentPartial.len += partialLength.seglen;\n\t\t\tcombineOverlapClients(currentPartial, partialLength);\n\t\t});\n\t}\n\n\t/**\n\t * Returns the partial length whose sequence number is the greatest sequence\n\t * number that is less than or equal to key.\n\t * @param key - sequence number\n\t */\n\tlatestLeq(key: number): PartialSequenceLength | undefined {\n\t\treturn this.keySortedItems[this.latestLeqIndex(key)];\n\t}\n\n\t/**\n\t * Returns the partial length whose sequence number is the lowest sequence\n\t * number that is greater than or equal to key.\n\t * @param key - sequence number\n\t */\n\tfirstGte(key: number): PartialSequenceLength | undefined {\n\t\tconst { index } = this.findItemPosition({ seq: key, len: 0, seglen: 0 });\n\t\treturn this.keySortedItems[index];\n\t}\n\n\tprivate latestLeqIndex(key: number): number {\n\t\tconst { exists, index } = this.findItemPosition({ seq: key, len: 0, seglen: 0 });\n\t\treturn exists ? index : index - 1;\n\t}\n\n\tcopyDown(minSeq: number): number {\n\t\tconst mindex = this.latestLeqIndex(minSeq);\n\t\tlet minLength = 0;\n\t\tif (mindex >= 0) {\n\t\t\tminLength = this.keySortedItems[mindex].len;\n\t\t\tconst seqCount = this.size;\n\t\t\tif (mindex <= seqCount - 1) {\n\t\t\t\t// Still some entries remaining\n\t\t\t\tconst remainingCount = seqCount - mindex - 1;\n\t\t\t\t// Copy down\n\t\t\t\tfor (let i = 0; i < remainingCount; i++) {\n\t\t\t\t\tthis.keySortedItems[i] = this.keySortedItems[i + mindex + 1];\n\t\t\t\t\tthis.keySortedItems[i].len -= minLength;\n\t\t\t\t}\n\t\t\t\tthis.keySortedItems.length = remainingCount;\n\t\t\t}\n\t\t}\n\t\treturn minLength;\n\t}\n}\n\ninterface IOverlapClient {\n\tclientId: number;\n\tseglen: number;\n}\n\n/**\n * Tracks length information for a part of a MergeTree (block) at a given time (seq).\n * These objects are associated with internal nodes (i.e. blocks).\n */\nexport interface PartialSequenceLength {\n\t/**\n\t * Sequence number\n\t */\n\tseq: number;\n\t/**\n\t * The length of the associated block.\n\t */\n\tlen: number;\n\t/**\n\t * The delta between the current length of the associated block and its length at the previous seq number.\n\t */\n\tseglen: number;\n\t/**\n\t * clientId for the client that submitted the op with sequence number `seq`.\n\t */\n\tclientId?: number;\n\t/**\n\t * If this partial length obliterated remote segments, this is the length of\n\t * those segments\n\t */\n\tremoteObliteratedLen?: number;\n\t/**\n\t * This field maps each client to the size of the intersection between segments deleted at this seq\n\t * and segments concurrently deleted by that client.\n\t *\n\t * For example, this PartialSequenceLength:\n\t * ```typescript\n\t * {\n\t * seq: 5,\n\t * len: 100,\n\t * seglen: -10,\n\t * clientId: 0,\n\t * overlapRemoveClients: <RedBlack tree with key-values expressed by>{\n\t * 1: { clientId: 1, seglen: -5 },\n\t * 3: { clientId: 3, seglen: -10 }\n\t * }\n\t * }\n\t * ```\n\t *\n\t * corresponds to an op submitted by client 0 which:\n\t * - reduces the length of this block by 10 (it may have deleted a single segment of length 10,\n\t * several segments totalling length 10, or even delete and add content for a total reduction of 10 length)\n\t * - was concurrent to one or more ops submitted by client 1 that also removed some of the same segments,\n\t * whose length totalled 5\n\t * - was concurrent to one or more ops submitted by client 3 that removed some of the same segments,\n\t * whose length totalled 10\n\t */\n\toverlapRemoveClients?: RedBlackTree<number, IOverlapClient>;\n\t/**\n\t * This field is the same as `overlapRemoveClients`, except that it tracks\n\t * overlapping obliterates rather than removes.\n\t */\n\toverlapObliterateClients?: RedBlackTree<number, IOverlapClient>;\n}\n\ninterface UnsequencedPartialLengthInfo {\n\t/**\n\t * Contains entries for all local operations.\n\t * The \"seq\" field of each entry actually corresponds to the delta at that localSeq on the local client.\n\t */\n\tpartialLengths: PartialSequenceLengthsSet;\n\n\t/**\n\t * Only contains entries for segments (or aggregates thereof) which were concurrently deleted\n\t * by another client. Ordered by `seq` of the removing client.\n\t *\n\t * The \"length\" field of these entries is not populated. This is because pre-computing the lengths\n\t * of segments doesn't help given the usage pattern.\n\t *\n\t * These entries need both `seq` and `localSeq`, because a given segment remove is double-counted iff\n\t * the refSeq exceeds the seq of the remote remove AND the localSeq exceeds the localSeq of the local remove.\n\t */\n\toverlappingRemoves: LocalPartialSequenceLength[];\n\n\t/**\n\t * Cached keyed on refSeq which stores length information for the total overlap of removed segments at\n\t * that refSeq.\n\t * This information is derivable from the entries of `overlappingRemoves`.\n\t *\n\t * Like the `partialLengths` field, `seq` on each entry is actually the local seq.\n\t * See `computeOverlappingLocalRemoves` for more information.\n\t */\n\tcachedOverlappingByRefSeq: Map<number, PartialSequenceLengthsSet>;\n}\n\ninterface LocalPartialSequenceLength extends PartialSequenceLength {\n\t/**\n\t * Local sequence number\n\t */\n\tlocalSeq: number;\n}\n\nexport interface PartialSequenceLengthsOptions {\n\tverifier?: (partialLengths: PartialSequenceLengths) => void;\n\tverifyExpected?: (\n\t\tmergeTree: MergeTree,\n\t\tnode: IMergeBlock,\n\t\trefSeq: number,\n\t\tclientId: number,\n\t\tlocalSeq?: number,\n\t) => void;\n\tzamboni: boolean;\n}\n\n/**\n * Keeps track of partial sums of segment lengths for all sequence numbers in the current collaboration window.\n * Only used during active collaboration.\n *\n * This class is associated with an internal node (block) of a MergeTree. It efficiently answers queries of the form\n * \"What is the length of `block` from the perspective of some particular seq and clientId?\".\n *\n * It also supports incremental updating of state for newly-sequenced ops that don't affect the structure of the\n * MergeTree.\n *\n * To answer these queries, it pre-builds several lists which track the length of the block at a per-sequence-number\n * level. These lists are:\n *\n * 1. (`partialLengths`): Stores the total length of the block.\n * 2. (`clientSeqNumbers[clientId]`): Stores only the total lengths of segments submitted by `clientId`. [see footnote]\n *\n * The reason both lists are necessary is that resolving the length of the block from the perspective of\n * (clientId, refSeq) requires including both of the following types of segments:\n * 1. Segments sequenced before `refSeq`\n * 2. Segments submitted by `clientId`\n *\n * This is possible with the above bookkeeping, using:\n *\n * (length of the block at the minimum sequence number)\n * + (partialLengths total length at refSeq)\n * + (clientSeqNumbers total length at most recent op)\n * - (clientSeqNumbers total length at refSeq)\n *\n * where the subtraction avoids double-counting segments submitted by clientId sequenced within the collab window.\n *\n * To enable reconnect, if constructed with `computeLocalPartials === true` it also supports querying for the length of\n * the block from the perspective of the local client at a particular `refSeq` and `localSeq`. This computation is\n * similar to the above:\n *\n * (length of the block at the minimum sequence number)\n * + (partialLengths total length at refSeq)\n * + (unsequenced edits' total length submitted before localSeq)\n * - (overlapping remove of the unsequenced edits' total length at refSeq)\n *\n * This algorithm scales roughly linearly with number of editing clients and the size of the collab window.\n * (certain unlikely sequences of operations may introduce log factors on those variables)\n *\n * Note: there is some slight complication with clientSeqNumbers resulting from the possibility of different clients\n * concurrently removing the same segment. See the field's documentation for more details.\n */\nexport class PartialSequenceLengths {\n\tpublic static options: PartialSequenceLengthsOptions = {\n\t\tzamboni: true,\n\t};\n\n\t/**\n\t * Combine the partial lengths of block's children\n\t * @param block - an interior node. If `recur` is false, it is assumed that each interior node child of this block\n\t * has its partials up to date.\n\t * @param collabWindow - segment window of the segment tree containing `block`.\n\t * @param recur - whether to recursively compute partial lengths for internal children of `block`.\n\t * This incurs more work, but gives correct bookkeeping in the case that a descendant in the merge tree has been\n\t * modified without bubbling up the resulting partial length change to this block's partials.\n\t * @param computeLocalPartials - whether to compute partial length information about local unsequenced ops.\n\t * This enables querying for the length of the block at a given localSeq, but incurs extra work.\n\t * Local partial information doesn't support `update`.\n\t */\n\tpublic static combine(\n\t\tblock: IMergeBlock,\n\t\t// eslint-disable-next-line import/no-deprecated\n\t\tcollabWindow: CollaborationWindow,\n\t\trecur = false,\n\t\tcomputeLocalPartials = false,\n\t): PartialSequenceLengths {\n\t\tconst leafPartialLengths = PartialSequenceLengths.fromLeaves(\n\t\t\tblock,\n\t\t\tcollabWindow,\n\t\t\tcomputeLocalPartials,\n\t\t);\n\n\t\tlet hasInternalChild = false;\n\t\tconst childPartials: PartialSequenceLengths[] = [];\n\t\tfor (let i = 0; i < block.childCount; i++) {\n\t\t\tconst child = block.children[i];\n\t\t\tif (!child.isLeaf()) {\n\t\t\t\thasInternalChild = true;\n\t\t\t\tif (recur) {\n\t\t\t\t\tchild.partialLengths = PartialSequenceLengths.combine(\n\t\t\t\t\t\tchild,\n\t\t\t\t\t\tcollabWindow,\n\t\t\t\t\t\ttrue,\n\t\t\t\t\t\tcomputeLocalPartials,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\t\t\tchildPartials.push(child.partialLengths!);\n\t\t\t}\n\t\t}\n\n\t\t// If there are no internal children, the PartialSequenceLengths returns from `fromLeaves` is exactly correct.\n\t\t// Otherwise, we must additively combine all of the children partial lengths to get this block's totals.\n\t\tconst combinedPartialLengths = hasInternalChild\n\t\t\t? new PartialSequenceLengths(collabWindow.minSeq, computeLocalPartials)\n\t\t\t: leafPartialLengths;\n\t\tif (hasInternalChild) {\n\t\t\tif (leafPartialLengths.partialLengths.size > 0) {\n\t\t\t\t// Some children were leaves; add combined partials from these segments\n\t\t\t\tchildPartials.push(leafPartialLengths);\n\t\t\t}\n\n\t\t\tconst childPartialsLen = childPartials.length;\n\n\t\t\tconst childPartialLengths: PartialSequenceLength[][] = [];\n\t\t\tconst childUnsequencedPartialLengths: PartialSequenceLength[][] = [];\n\t\t\tconst childOverlapRemoves: LocalPartialSequenceLength[][] = [];\n\t\t\tfor (let i = 0; i < childPartialsLen; i++) {\n\t\t\t\tconst { segmentCount, minLength, partialLengths, unsequencedRecords } =\n\t\t\t\t\tchildPartials[i];\n\t\t\t\tcombinedPartialLengths.segmentCount += segmentCount;\n\t\t\t\tcombinedPartialLengths.minLength += minLength;\n\t\t\t\tchildPartialLengths.push(partialLengths.items as PartialSequenceLength[]);\n\t\t\t\tif (unsequencedRecords) {\n\t\t\t\t\tchildUnsequencedPartialLengths.push(\n\t\t\t\t\t\tunsequencedRecords.partialLengths.items as PartialSequenceLength[],\n\t\t\t\t\t);\n\t\t\t\t\tchildOverlapRemoves.push(unsequencedRecords.overlappingRemoves);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tmergePartialLengths(childPartialLengths, combinedPartialLengths.partialLengths);\n\n\t\t\tif (computeLocalPartials) {\n\t\t\t\tcombinedPartialLengths.unsequencedRecords = {\n\t\t\t\t\tpartialLengths: mergePartialLengths(childUnsequencedPartialLengths),\n\t\t\t\t\toverlappingRemoves: Array.from(mergeSortedListsBySeq(childOverlapRemoves)),\n\t\t\t\t\tcachedOverlappingByRefSeq: new Map(),\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tfor (const partial of combinedPartialLengths.partialLengths.items) {\n\t\t\t\tcombinedPartialLengths.addClientSeqNumberFromPartial(partial);\n\t\t\t}\n\t\t}\n\t\t// TODO: incremental zamboni during build\n\t\tif (PartialSequenceLengths.options.zamboni) {\n\t\t\tcombinedPartialLengths.zamboni(collabWindow);\n\t\t}\n\n\t\tPartialSequenceLengths.options.verifier?.(combinedPartialLengths);\n\t\treturn combinedPartialLengths;\n\t}\n\n\t/**\n\t * @returns a PartialSequenceLengths structure which tracks only lengths of leaf children of the provided\n\t * IMergeBlock.\n\t */\n\tprivate static fromLeaves(\n\t\tblock: IMergeBlock,\n\t\t// eslint-disable-next-line import/no-deprecated\n\t\tcollabWindow: CollaborationWindow,\n\t\tcomputeLocalPartials: boolean,\n\t): PartialSequenceLengths {\n\t\tconst combinedPartialLengths = new PartialSequenceLengths(\n\t\t\tcollabWindow.minSeq,\n\t\t\tcomputeLocalPartials,\n\t\t);\n\t\tcombinedPartialLengths.segmentCount = block.childCount;\n\n\t\tfor (let i = 0; i < block.childCount; i++) {\n\t\t\tconst child = block.children[i];\n\t\t\tif (child.isLeaf()) {\n\t\t\t\t// Leaf segment\n\t\t\t\tconst segment = child;\n\t\t\t\tif (segment.seq !== undefined && seqLTE(segment.seq, collabWindow.minSeq)) {\n\t\t\t\t\tcombinedPartialLengths.minLength += segment.cachedLength;\n\t\t\t\t} else {\n\t\t\t\t\tPartialSequenceLengths.insertSegment(combinedPartialLengths, segment);\n\t\t\t\t}\n\t\t\t\tconst removalInfo = toRemovalInfo(segment);\n\t\t\t\tconst moveInfo = toMoveInfo(segment);\n\t\t\t\tif (\n\t\t\t\t\t(removalInfo?.removedSeq !== undefined &&\n\t\t\t\t\t\tseqLTE(removalInfo.removedSeq, collabWindow.minSeq)) ||\n\t\t\t\t\t(moveInfo?.movedSeq !== undefined &&\n\t\t\t\t\t\tseqLTE(moveInfo.movedSeq, collabWindow.minSeq))\n\t\t\t\t) {\n\t\t\t\t\tcombinedPartialLengths.minLength -= segment.cachedLength;\n\t\t\t\t} else if (removalInfo !== undefined || moveInfo !== undefined) {\n\t\t\t\t\tPartialSequenceLengths.insertSegment(\n\t\t\t\t\t\tcombinedPartialLengths,\n\t\t\t\t\t\tsegment,\n\t\t\t\t\t\tremovalInfo,\n\t\t\t\t\t\tmoveInfo,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t// Post-process correctly-ordered partials computing sums and creating\n\t\t// lists for each present client id\n\t\tconst seqPartials = combinedPartialLengths.partialLengths;\n\n\t\tlet prevLen = 0;\n\t\tfor (const partial of seqPartials.items) {\n\t\t\tpartial.len = prevLen + partial.seglen;\n\t\t\tprevLen = partial.len;\n\t\t\tcombinedPartialLengths.addClientSeqNumberFromPartial(partial);\n\t\t}\n\t\tprevLen = 0;\n\n\t\tif (combinedPartialLengths.unsequencedRecords !== undefined) {\n\t\t\tconst localPartials = combinedPartialLengths.unsequencedRecords.partialLengths;\n\t\t\tfor (const partial of localPartials.items) {\n\t\t\t\tpartial.len = prevLen + partial.seglen;\n\t\t\t\tprevLen = partial.len;\n\t\t\t}\n\t\t}\n\n\t\tPartialSequenceLengths.options.verifier?.(combinedPartialLengths);\n\t\treturn combinedPartialLengths;\n\t}\n\n\tprivate static getOverlapClients(overlapClientIds: number[], seglen: number) {\n\t\tconst bst = new RedBlackTree<number, IOverlapClient>(compareNumbers);\n\t\tfor (const clientId of overlapClientIds) {\n\t\t\tbst.put(clientId, { clientId, seglen });\n\t\t}\n\t\treturn bst;\n\t}\n\n\tprivate static accumulateRemoveClientOverlap(\n\t\tpartialLength: PartialSequenceLength,\n\t\toverlapRemoveClientIds: number[],\n\t\tseglen: number,\n\t) {\n\t\tif (partialLength.overlapRemoveClients) {\n\t\t\tfor (const clientId of overlapRemoveClientIds) {\n\t\t\t\tconst overlapClientNode = partialLength.overlapRemoveClients.get(clientId);\n\t\t\t\tif (!overlapClientNode) {\n\t\t\t\t\tpartialLength.overlapRemoveClients.put(clientId, { clientId, seglen });\n\t\t\t\t} else {\n\t\t\t\t\toverlapClientNode.data.seglen += seglen;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tpartialLength.overlapRemoveClients = PartialSequenceLengths.getOverlapClients(\n\t\t\t\toverlapRemoveClientIds,\n\t\t\t\tseglen,\n\t\t\t);\n\t\t}\n\t}\n\n\tprivate static accumulateMoveClientOverlap(\n\t\tpartialLength: PartialSequenceLength,\n\t\toverlapMoveClientIds: number[],\n\t\tseglen: number,\n\t) {\n\t\tif (partialLength.overlapObliterateClients) {\n\t\t\tfor (const clientId of overlapMoveClientIds) {\n\t\t\t\tconst overlapClientNode = partialLength.overlapObliterateClients.get(clientId);\n\t\t\t\tif (!overlapClientNode) {\n\t\t\t\t\tpartialLength.overlapObliterateClients.put(clientId, { clientId, seglen });\n\t\t\t\t} else {\n\t\t\t\t\toverlapClientNode.data.seglen += seglen;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tpartialLength.overlapObliterateClients = PartialSequenceLengths.getOverlapClients(\n\t\t\t\toverlapMoveClientIds,\n\t\t\t\tseglen,\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Coalesce overlapping move lengths for a partial length entry that already\n\t * exists\n\t *\n\t * @param segmentLen - Length of segment with overlapping moves\n\t * @param segment - Segment with overlapping moves\n\t * @param firstGte - Existing partial length entry\n\t * @param clientIds - Ids of clients that concurrently obliterated this segment\n\t */\n\tstatic accumulateMoveOverlapForExisting(\n\t\tsegmentLen: number,\n\t\tsegment: ISegment,\n\t\tfirstGte: PartialSequenceLength,\n\t\tclientIds: number[],\n\t) {\n\t\tconst nonInsertingClientIds = clientIds.filter((id) => id !== segment.clientId);\n\n\t\tPartialSequenceLengths.accumulateMoveClientOverlap(\n\t\t\tfirstGte,\n\t\t\tnonInsertingClientIds,\n\t\t\tsegmentLen,\n\t\t);\n\n\t\t// if this segment was obliterated by the client that inserted it,\n\t\t// and if it overlaps with the obliterate of another client, we need to\n\t\t// take into account whether it was obliterated on insert by the other\n\t\t// client\n\t\tif (clientIds.length !== nonInsertingClientIds.length) {\n\t\t\tPartialSequenceLengths.accumulateMoveClientOverlap(\n\t\t\t\tfirstGte,\n\t\t\t\t[segment.clientId],\n\t\t\t\tsegment.wasMovedOnInsert ? -segment.cachedLength : segmentLen,\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * @param obliterateOverlapLen - Length of segment with overlap\n\t * @param clientIds - Ids of clients that have concurrently obliterated this\n\t * segment\n\t */\n\tprivate static getMoveOverlapForExisting(\n\t\tsegment: ISegment,\n\t\tobliterateOverlapLen: number,\n\t\tclientIds: number[],\n\t): RedBlackTree<number, IOverlapClient> {\n\t\tconst nonInsertingClientIds = clientIds.filter((id) => id !== segment.clientId);\n\t\tconst overlapObliterateClients = PartialSequenceLengths.getOverlapClients(\n\t\t\tnonInsertingClientIds,\n\t\t\tobliterateOverlapLen,\n\t\t);\n\n\t\tif (clientIds.length !== nonInsertingClientIds.length) {\n\t\t\toverlapObliterateClients.put(segment.clientId, {\n\t\t\t\tclientId: segment.clientId,\n\t\t\t\tseglen: segment.wasMovedOnInsert ? -segment.cachedLength : obliterateOverlapLen,\n\t\t\t});\n\t\t}\n\n\t\treturn overlapObliterateClients;\n\t}\n\n\tprivate static updatePartialsAfterInsertion(\n\t\tsegment: ISegment,\n\t\tsegmentLen: number,\n\t\tremoteObliteratedLen: number | undefined,\n\t\tobliterateOverlapLen: number = segmentLen,\n\t\tpartials: PartialSequenceLengthsSet,\n\t\tseq: number,\n\t\tclientId: number,\n\t\tremoveClientOverlap: number[] | undefined,\n\t\tmoveClientOverlap: number[] | undefined,\n\t) {\n\t\tconst firstGte = partials.firstGte(seq);\n\n\t\tlet partialLengthEntry: PartialSequenceLength;\n\t\tif (firstGte?.seq === seq) {\n\t\t\tpartialLengthEntry = firstGte;\n\t\t\t// Existing entry at this seq--this occurs for ops that insert/delete\n\t\t\t// more than one segment.\n\t\t\tpartialLengthEntry.seglen += segmentLen;\n\t\t\tif (remoteObliteratedLen) {\n\t\t\t\tpartialLengthEntry.remoteObliteratedLen ??= 0;\n\t\t\t\tpartialLengthEntry.remoteObliteratedLen += remoteObliteratedLen;\n\t\t\t}\n\t\t\tif (removeClientOverlap) {\n\t\t\t\tPartialSequenceLengths.accumulateRemoveClientOverlap(\n\t\t\t\t\tfirstGte,\n\t\t\t\t\tremoveClientOverlap,\n\t\t\t\t\tobliterateOverlapLen,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tif (moveClientOverlap) {\n\t\t\t\tPartialSequenceLengths.accumulateMoveOverlapForExisting(\n\t\t\t\t\tobliterateOverlapLen,\n\t\t\t\t\tsegment,\n\t\t\t\t\tfirstGte,\n\t\t\t\t\tmoveClientOverlap,\n\t\t\t\t);\n\t\t\t}\n\t\t} else {\n\t\t\tconst overlapObliterateClients = moveClientOverlap\n\t\t\t\t? PartialSequenceLengths.getMoveOverlapForExisting(\n\t\t\t\t\t\tsegment,\n\t\t\t\t\t\tobliterateOverlapLen,\n\t\t\t\t\t\tmoveClientOverlap,\n\t\t\t\t )\n\t\t\t\t: undefined;\n\n\t\t\tpartialLengthEntry = {\n\t\t\t\tseq,\n\t\t\t\tclientId,\n\t\t\t\tlen: 0,\n\t\t\t\tseglen: segmentLen,\n\t\t\t\tremoteObliteratedLen,\n\t\t\t\toverlapRemoveClients: removeClientOverlap\n\t\t\t\t\t? PartialSequenceLengths.getOverlapClients(\n\t\t\t\t\t\t\tremoveClientOverlap,\n\t\t\t\t\t\t\tobliterateOverlapLen,\n\t\t\t\t\t )\n\t\t\t\t\t: undefined,\n\t\t\t\toverlapObliterateClients,\n\t\t\t};\n\n\t\t\tpartials.addOrUpdate(partialLengthEntry);\n\t\t}\n\t}\n\n\t/**\n\t * Inserts length information about the insertion of `segment` into\n\t * `combinedPartialLengths.partialLengths`.\n\t *\n\t * Does not update the clientSeqNumbers field to account for this segment.\n\t *\n\t * If `removalInfo` or `moveInfo` are defined, this operation updates the\n\t * bookkeeping to account for the (re)moval of this segment at the (re)movedSeq\n\t * instead.\n\t *\n\t * When the insertion or (re)moval of the segment is un-acked and\n\t * `combinedPartialLengths` is meant to compute such records, this does the\n\t * analogous addition to the bookkeeping for the local segment in\n\t * `combinedPartialLengths.unsequencedRecords`.\n\t */\n\tprivate static insertSegment(\n\t\tcombinedPartialLengths: PartialSequenceLengths,\n\t\tsegment: ISegment,\n\t\tremovalInfo?: IRemovalInfo,\n\t\tmoveInfo?: IMoveInfo,\n\t) {\n\t\tconst removalIsLocal = !!removalInfo && removalInfo.removedSeq === UnassignedSequenceNumber;\n\t\tconst moveIsLocal = !!moveInfo && moveInfo.movedSeq === UnassignedSequenceNumber;\n\t\tconst isLocal =\n\t\t\tsegment.seq === UnassignedSequenceNumber ||\n\t\t\t(!!removalInfo && removalIsLocal && (!moveInfo || moveIsLocal)) ||\n\t\t\t(!!moveInfo && moveIsLocal && (!removalInfo || removalIsLocal));\n\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\tlet seqOrLocalSeq = isLocal ? segment.localSeq! : segment.seq!;\n\t\tlet segmentLen = segment.cachedLength;\n\t\tlet clientId = segment.clientId;\n\t\tlet removeClientOverlap: number[] | undefined;\n\t\tlet moveClientOverlap: number[] | undefined;\n\t\tlet remoteObliteratedLen: number | undefined;\n\n\t\t// it's not possible to have an overlapping obliterate and remove that are both local\n\t\tassert(\n\t\t\t(!moveIsLocal && !removalIsLocal) || moveIsLocal !== removalIsLocal,\n\t\t\t0x870 /* overlapping local obliterate and remove */,\n\t\t);\n\n\t\tconst removeHappenedFirst =\n\t\t\tremovalInfo &&\n\t\t\t(!moveInfo ||\n\t\t\t\tmoveIsLocal ||\n\t\t\t\t(!removalIsLocal && moveInfo.movedSeq > removalInfo.removedSeq));\n\n\t\tif (removeHappenedFirst) {\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\t\tseqOrLocalSeq = removalIsLocal ? removalInfo.localRemovedSeq! : removalInfo.removedSeq;\n\t\t\tsegmentLen = -segmentLen;\n\t\t\t// The client who performed the remove is always stored\n\t\t\t// in the first position of removalInfo.\n\t\t\tclientId = removalInfo.removedClientIds[0];\n\t\t\tconst hasOverlap = removalInfo.removedClientIds.length > 1;\n\t\t\tremoveClientOverlap = hasOverlap ? removalInfo.removedClientIds : undefined;\n\t\t} else if (moveInfo) {\n\t\t\t// The client who performed the move is always stored\n\t\t\t// in the first position of moveInfo.\n\t\t\tclientId = moveInfo.movedClientIds[0];\n\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\t\tseqOrLocalSeq = moveIsLocal ? moveInfo.localMovedSeq! : moveInfo.movedSeq;\n\n\t\t\tif (segment.wasMovedOnInsert) {\n\t\t\t\tassert(\n\t\t\t\t\tmoveInfo.movedSeq !== -1,\n\t\t\t\t\t0x871 /* wasMovedOnInsert should only be set on acked obliterates */,\n\t\t\t\t);\n\t\t\t\tsegmentLen = 0;\n\t\t\t} else {\n\t\t\t\tsegmentLen = -segmentLen;\n\t\t\t}\n\n\t\t\tconst hasOverlap = moveInfo.movedClientIds.length > 1;\n\t\t\tmoveClientOverlap = hasOverlap ? moveInfo.movedClientIds : undefined;\n\t\t} else if (segment.wasMovedOnInsert) {\n\t\t\t// if this segment was obliterated on insert, its length is only\n\t\t\t// visible to the client that inserted it\n\t\t\tsegmentLen = 0;\n\t\t\tremoteObliteratedLen = segment.cachedLength;\n\t\t}\n\n\t\tconst partials = isLocal\n\t\t\t? combinedPartialLengths.unsequencedRecords?.partialLengths\n\t\t\t: combinedPartialLengths.partialLengths;\n\t\tif (partials === undefined) {\n\t\t\t// Local partial but its computation isn't required\n\t\t\treturn;\n\t\t}\n\n\t\t// overlapping move and remove, remove happened first\n\t\tif (moveInfo && removalInfo && removeHappenedFirst && !moveIsLocal) {\n\t\t\t// The client who performed the remove is always stored\n\t\t\t// in the first position of removalInfo.\n\t\t\tconst moveClientId = moveInfo.movedClientIds[0];\n\t\t\tconst hasOverlap = moveInfo.movedClientIds.length > 1;\n\n\t\t\tPartialSequenceLengths.updatePartialsAfterInsertion(\n\t\t\t\tsegment,\n\t\t\t\t0,\n\t\t\t\t-segment.cachedLength,\n\t\t\t\tsegmentLen,\n\t\t\t\tpartials,\n\t\t\t\tmoveInfo.movedSeq,\n\t\t\t\tmoveClientId,\n\t\t\t\tundefined,\n\t\t\t\thasOverlap ? moveInfo.movedClientIds : undefined,\n\t\t\t);\n\t\t}\n\n\t\tif (removalInfo && !removeHappenedFirst && !removalIsLocal) {\n\t\t\tconst removeSeqOrLocalSeq = removalIsLocal\n\t\t\t\t? // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\t\t\t removalInfo.localRemovedSeq!\n\t\t\t\t: removalInfo.removedSeq;\n\t\t\t// The client who performed the remove is always stored\n\t\t\t// in the first position of removalInfo.\n\t\t\tconst removeClientId = removalInfo.removedClientIds[0];\n\t\t\tconst hasOverlap = removalInfo.removedClientIds.length > 1;\n\n\t\t\tPartialSequenceLengths.updatePartialsAfterInsertion(\n\t\t\t\tsegment,\n\t\t\t\t0,\n\t\t\t\t-segment.cachedLength,\n\t\t\t\tsegmentLen,\n\t\t\t\tpartials,\n\t\t\t\tremoveSeqOrLocalSeq,\n\t\t\t\tremoveClientId,\n\t\t\t\thasOverlap ? removalInfo.removedClientIds : undefined,\n\t\t\t\tundefined,\n\t\t\t);\n\t\t}\n\n\t\tPartialSequenceLengths.updatePartialsAfterInsertion(\n\t\t\tsegment,\n\t\t\tsegmentLen,\n\t\t\tremoteObliteratedLen,\n\t\t\tundefined,\n\t\t\tpartials,\n\t\t\tseqOrLocalSeq,\n\t\t\tclientId,\n\t\t\tremoveClientOverlap,\n\t\t\tmoveClientOverlap,\n\t\t);\n\n\t\t// todo: the below block needs to be changed to handle obliterate, which\n\t\t// doesn't have great support for reconnect at the moment. see ADO #3714\n\t\tconst { unsequencedRecords } = combinedPartialLengths;\n\t\tif (unsequencedRecords && removeClientOverlap && segment.localRemovedSeq !== undefined) {\n\t\t\tconst localSeq = segment.localRemovedSeq;\n\t\t\tconst localPartialLengthEntry: LocalPartialSequenceLength = {\n\t\t\t\tseq: seqOrLocalSeq,\n\t\t\t\tlocalSeq,\n\t\t\t\tclientId,\n\t\t\t\tlen: 0,\n\t\t\t\tseglen: segmentLen,\n\t\t\t};\n\t\t\tlet localIndexFirstGTE = 0;\n\t\t\tfor (\n\t\t\t\t;\n\t\t\t\tlocalIndexFirstGTE < unsequencedRecords.overlappingRemoves.length;\n\t\t\t\tlocalIndexFirstGTE++\n\t\t\t) {\n\t\t\t\tif (\n\t\t\t\t\tunsequencedRecords.overlappingRemoves[localIndexFirstGTE].seq >= seqOrLocalSeq\n\t\t\t\t) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tinsertIntoList(\n\t\t\t\tunsequencedRecords.overlappingRemoves,\n\t\t\t\tlocalIndexFirstGTE,\n\t\t\t\tlocalPartialLengthEntry,\n\t\t\t);\n\n\t\t\tconst tweakedLocalPartialEntry = {\n\t\t\t\t...localPartialLengthEntry,\n\t\t\t\tseq: localSeq,\n\t\t\t};\n\n\t\t\tunsequencedRecords.partialLengths.addOrUpdate(tweakedLocalPartialEntry);\n\t\t}\n\t}\n\n\tprivate static addSeq(\n\t\tpartialLengths: PartialSequenceLengthsSet,\n\t\tseq: number,\n\t\tseqSeglen: number,\n\t\tremoteObliteratedLen?: number,\n\t\tclientId?: number,\n\t) {\n\t\tlet seqPartialLen: PartialSequenceLength | undefined;\n\t\tlet penultPartialLen: PartialSequenceLength | undefined;\n\t\tlet pLen = partialLengths.latestLeq(seq);\n\t\tif (pLen) {\n\t\t\tif (pLen.seq === seq) {\n\t\t\t\tseqPartialLen = pLen;\n\t\t\t\tpLen = partialLengths.latestLeq(seq - 1);\n\t\t\t\tif (pLen) {\n\t\t\t\t\tpenultPartialLen = pLen;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tpenultPartialLen = pLen;\n\t\t\t}\n\t\t}\n\t\tconst len = penultPartialLen !== undefined ? penultPartialLen.len + seqSeglen : seqSeglen;\n\t\tif (seqPartialLen === undefined) {\n\t\t\tseqPartialLen = {\n\t\t\t\tclientId,\n\t\t\t\tlen,\n\t\t\t\tseglen: seqSeglen,\n\t\t\t\tseq,\n\t\t\t\tremoteObliteratedLen,\n\t\t\t};\n\t\t\tpartialLengths.addOrUpdate(seqPartialLen);\n\t\t} else {\n\t\t\tseqPartialLen.remoteObliteratedLen = remoteObliteratedLen;\n\t\t\tseqPartialLen.seglen = seqSeglen;\n\t\t\tseqPartialLen.len = len;\n\t\t\t// Assert client id matches\n\t\t}\n\t}\n\n\t/**\n\t * Length of the block this PartialSequenceLength corresponds to when viewed at `minSeq`.\n\t */\n\tprivate minLength = 0;\n\n\t/**\n\t * Total number of segments in the subtree rooted at the block this PartialSequenceLength corresponds to.\n\t */\n\tprivate segmentCount = 0;\n\n\t/**\n\t * List of PartialSequenceLength objects--ordered by increasing seq--giving length information about\n\t * the block associated with this PartialSequenceLengths object.\n\t *\n\t * `partialLengths[i].len` contains the length of this block considering only sequenced segments with\n\t * `sequenceNumber <= partialLengths[i].seq`.\n\t */\n\tprivate readonly partialLengths: PartialSequenceLengthsSet = new PartialSequenceLengthsSet();\n\n\t/**\n\t * clientSeqNumbers[clientId] is a list of partial lengths for sequenced ops which either:\n\t * - were submitted by `clientId`.\n\t * - deleted a range containing segments that were concurrently deleted by `clientId`\n\t *\n\t * The second case is referred to as the \"overlapping delete\" case. It is necessary to avoid double-counting\n\t * the removal of those segments in queries including clientId.\n\t */\n\tprivate readonly clientSeqNumbers: PartialSequenceLengthsSet[] = [];\n\n\t/**\n\t * Contains information required to answer queries for the length of this segment from the perspective of\n\t * the local client but not including all local segments (i.e., `localSeq !== collabWindow.localSeq`).\n\t * This field is only computed if requested in the constructor (i.e. `computeLocalPartials === true`).\n\t */\n\tprivate unsequencedRecords: UnsequencedPartialLengthInfo | undefined;\n\n\tconstructor(\n\t\t/**\n\t\t * The minimumSequenceNumber as defined by the collab window used in the last call to `update`,\n\t\t * or if no such calls have been made, the one used on construction.\n\t\t */\n\t\tpublic minSeq: number,\n\t\tcomputeLocalPartials: boolean,\n\t) {\n\t\tif (computeLocalPartials) {\n\t\t\tthis.unsequencedRecords = {\n\t\t\t\tpartialLengths: new PartialSequenceLengthsSet(),\n\t\t\t\toverlappingRemoves: [],\n\t\t\t\tcachedOverlappingByRefSeq: new Map(),\n\t\t\t};\n\t\t}\n\t}\n\n\t// Assume: seq is latest sequence number; no structural change to sub-tree, but a segment\n\t// with sequence number seq has been added within the sub-tree (and `update` has been called\n\t// on all descendant PartialSequenceLengths)\n\t// TODO: assert client id matches\n\tpublic update(\n\t\tnode: IMergeBlock,\n\t\tseq: number,\n\t\tclientId: number,\n\t\t// eslint-disable-next-line import/no-deprecated\n\t\tcollabWindow: CollaborationWindow,\n\t) {\n\t\tlet seqSeglen = 0;\n\t\tlet remoteObliteratedLen = 0;\n\t\tlet segCount = 0;\n\t\t// Compute length for seq across children\n\t\tfor (let i = 0; i < node.childCount; i++) {\n\t\t\tconst child = node.children[i];\n\t\t\tif (!child.isLeaf()) {\n\t\t\t\tconst childBlock = child;\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\t\t\tconst branchPartialLengths = childBlock.partialLengths!;\n\t\t\t\tconst partialLengths = branchPartialLengths.partialLengths;\n\t\t\t\tconst leqPartial = partialLengths.latestLeq(seq);\n\t\t\t\tif (leqPartial && leqPartial.seq === seq) {\n\t\t\t\t\tseqSeglen += leqPartial.seglen;\n\t\t\t\t\tremoteObliteratedLen += leqPartial.remoteObliteratedLen ?? 0;\n\t\t\t\t}\n\t\t\t\tsegCount += branchPartialLengths.segmentCount;\n\t\t\t} else {\n\t\t\t\tconst segment = child;\n\t\t\t\tconst removalInfo = toRemovalInfo(segment);\n\t\t\t\tconst moveInfo = toMoveInfo(segment);\n\n\t\t\t\tconst removalIsLocal =\n\t\t\t\t\t!!removalInfo && removalInfo.removedSeq === UnassignedSequenceNumber;\n\t\t\t\tconst moveIsLocal = !!moveInfo && moveInfo.movedSeq === UnassignedSequenceNumber;\n\n\t\t\t\tconst removeHappenedFirst =\n\t\t\t\t\tremovalInfo &&\n\t\t\t\t\t(!moveInfo ||\n\t\t\t\t\t\tmoveIsLocal ||\n\t\t\t\t\t\t(!removalIsLocal && moveInfo.movedSeq > removalInfo.removedSeq));\n\n\t\t\t\tif (seq === segment.seq) {\n\t\t\t\t\t// if this segment was moved on insert, its length should\n\t\t\t\t\t// only be visible to the inserting client\n\t\t\t\t\tif (\n\t\t\t\t\t\tsegment.wasMovedOnInsert &&\n\t\t\t\t\t\tsegment.seq !== undefined &&\n\t\t\t\t\t\tmoveInfo &&\n\t\t\t\t\t\tmoveInfo.movedSeq < segment.seq\n\t\t\t\t\t) {\n\t\t\t\t\t\tremoteObliteratedLen += segment.cachedLength;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tseqSeglen += segment.cachedLength;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (seq === removalInfo?.removedSeq) {\n\t\t\t\t\t// if the remove op happened before an overlapping obliterate,\n\t\t\t\t\t// all clients can see the remove at this seq. otherwise, only\n\t\t\t\t\t// the removing client is aware of the remove\n\t\t\t\t\tif (removeHappenedFirst) {\n\t\t\t\t\t\tseqSeglen -= segment.cachedLength;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tremoteObliteratedLen -= segment.cachedLength;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (seq === moveInfo?.movedSeq) {\n\t\t\t\t\tif (removeHappenedFirst) {\n\t\t\t\t\t\tremoteObliteratedLen -= segment.cachedLength;\n\t\t\t\t\t} else if (\n\t\t\t\t\t\tsegment.wasMovedOnInsert &&\n\t\t\t\t\t\tsegment.seq !== UnassignedSequenceNumber &&\n\t\t\t\t\t\tsegment.seq !== undefined &&\n\t\t\t\t\t\tmoveInfo.movedSeq > segment.seq\n\t\t\t\t\t) {\n\t\t\t\t\t\tremoteObliteratedLen += segment.cachedLength;\n\t\t\t\t\t\tseqSeglen -= segment.cachedLength;\n\t\t\t\t\t} else if (segment.seq !== UnassignedSequenceNumber) {\n\t\t\t\t\t\tseqSeglen -= segment.cachedLength;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tsegCount++;\n\t\t\t}\n\t\t}\n\t\tthis.segmentCount = segCount;\n\t\tthis.unsequencedRecords = undefined;\n\n\t\tPartialSequenceLengths.addSeq(\n\t\t\tthis.partialLengths,\n\t\t\tseq,\n\t\t\tseqSeglen,\n\t\t\tremoteObliteratedLen,\n\t\t\tclientId,\n\t\t);\n\t\tthis.clientSeqNumbers[clientId] ??= new PartialSequenceLengthsSet();\n\t\tPartialSequenceLengths.addSeq(\n\t\t\tthis.clientSeqNumbers[clientId],\n\t\t\tseq,\n\t\t\tseqSeglen + remoteObliteratedLen,\n\t\t\tundefined,\n\t\t\tclientId,\n\t\t);\n\t\tif (PartialSequenceLengths.options.zamboni) {\n\t\t\tthis.zamboni(collabWindow);\n\t\t}\n\n\t\tPartialSequenceLengths.options.verifier?.(this);\n\t}\n\n\t/**\n\t * Returns the length of this block as viewed from the perspective of `clientId` at `refSeq`.\n\t * This is the total length of all segments sequenced at or before refSeq OR submitted by `clientId`.\n\t * If `clientId` is the local client, `localSeq` can also be provided. In that case, it is the total\n\t * length of all segments submitted at or before `refSeq` in addition to any local, unacked segments\n\t * with `segment.localSeq <= localSeq`.\n\t *\n\t * Note: the local case (where `localSeq !== undefined`) is only supported on a PartialSequenceLength object\n\t * constructed with `computeLocalPartials` set to true and not subsequently updated with `update`.\n\t */\n\tpublic getPartialLength(refSeq: number, clientId: number, localSeq?: number) {\n\t\tlet pLen = this.minLength;\n\t\tconst cliLatestIndex = this.cliLatest(clientId);\n\t\tconst cliSeq = this.clientSeqNumbers[clientId];\n\t\tpLen += this.partialLengths.latestLeq(refSeq)?.len ?? 0;\n\n\t\tif (localSeq === undefined) {\n\t\t\tif (cliLatestIndex >= 0) {\n\t\t\t\tconst cliLatest = cliSeq.items[cliLatestIndex];\n\t\t\t\tif (cliLatest.seq > refSeq) {\n\t\t\t\t\t// The client has local edits after refSeq, add in the length adjustments\n\t\t\t\t\tpLen += cliLatest.len;\n\t\t\t\t\tconst precedingCli = this.cliLatestLEQ(clientId, refSeq);\n\t\t\t\t\tif (precedingCli) {\n\t\t\t\t\t\t// Subtract out double-counted lengths: segments still in the collab window but before\n\t\t\t\t\t\t// the refSeq submitted by the client we're querying for were counted in each addition above.\n\t\t\t\t\t\tpLen -= precedingCli.len;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tassert(\n\t\t\t\tthis.unsequencedRecords !== undefined,\n\t\t\t\t0x39f /* Local getPartialLength invoked without computing local partials. */,\n\t\t\t);\n\t\t\tconst unsequencedPartialLengths = this.unsequencedRecords.partialLengths;\n\t\t\t// Local segments at or before localSeq should also be included\n\t\t\tconst local = unsequencedPartialLengths.latestLeq(localSeq);\n\t\t\tif (local) {\n\t\t\t\tpLen += local.len;\n\n\t\t\t\t// Lastly, we must subtract out any double-counted removes, which occur if a currently un-acked local\n\t\t\t\t// remove overlaps with a remote client's remove that occurred at sequence number <=refSeq.\n\t\t\t\tpLen -= this.computeOverlappingLocalRemoves(refSeq, localSeq);\n\t\t\t}\n\t\t}\n\t\treturn pLen;\n\t}\n\n\t/**\n\t * Computes the seglen for the double-counted removed overlap at (refSeq, localSeq). This logic is equivalent\n\t * to the following:\n\t *\n\t * ```typescript\n\t * let total = 0;\n\t * for (const partialLength of this.unsequencedRecords!.overlappingRemoves) {\n\t * if (partialLength.seq > refSeq) {\n\t * break;\n\t * }\n\t *\n\t * if (partialLength.localSeq <= localSeq) {\n\t * total += partialLength.seglen;\n\t * }\n\t * }\n\t *\n\t * return total;\n\t * ```\n\t *\n\t * Reconnect happens to only need to compute these lengths for two refSeq values: before and\n\t * after the rebase. Since these lists potentially scale with O(collab window * number of local edits)\n\t * and potentially need to be queried for each local op that gets rebased,\n\t * we cache the results for a given refSeq in `this.unsequencedRecords.cachedOverlappingByRefSeq` so\n\t * that they can be binary-searched the same way the usual partialLengths lists are.\n\t */\n\tprivate computeOverlappingLocalRemoves(refSeq: number, localSeq: number): number {\n\t\tif (this.unsequencedRecords === undefined) {\n\t\t\treturn 0;\n\t\t}\n\n\t\tlet cachedOverlapPartials = this.unsequencedRecords.cachedOverlappingByRefSeq.get(refSeq);\n\t\tif (!cachedOverlapPartials) {\n\t\t\tconst partials: PartialSequenceLengthsSet = new PartialSequenceLengthsSet();\n\t\t\tfor (const partial of this.unsequencedRecords.overlappingRemoves) {\n\t\t\t\tif (partial.seq > refSeq) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tpartials.addOrUpdate({ ...partial, seq: partial.localSeq, len: 0 });\n\t\t\t}\n\t\t\t// This coalesces entries with the same localSeq as well as computes overall lengths.\n\t\t\tcachedOverlapPartials = partials;\n\t\t\tthis.unsequencedRecords.cachedOverlappingByRefSeq.set(refSeq, cachedOverlapPartials);\n\t\t}\n\n\t\tconst overlap = cachedOverlapPartials.latestLeq(localSeq);\n\t\treturn overlap?.len ?? 0;\n\t}\n\n\tpublic toString(glc?: (id: number) => string, indentCount = 0) {\n\t\tlet buf = \"\";\n\t\tfor (const partial of this.partialLengths.items) {\n\t\t\tbuf += `(${partial.seq},${partial.len}) `;\n\t\t}\n\n\t\t// eslint-disable-next-line @typescript-eslint/no-for-in-array, no-restricted-syntax\n\t\tfor (const clientId in this.clientSeqNumbers) {\n\t\t\tif (this.clientSeqNumbers[clientId].size > 0) {\n\t\t\t\tbuf += `Client `;\n\t\t\t\tbuf += glc ? `${glc(+clientId)}` : `${clientId}`;\n\t\t\t\tbuf += \"[\";\n\t\t\t\tfor (const partial of this.clientSeqNumbers[clientId].items) {\n\t\t\t\t\tbuf += `(${partial.seq},${partial.len})`;\n\t\t\t\t}\n\t\t\t\tbuf += \"]\";\n\t\t\t}\n\t\t}\n\t\tbuf = `min(seq ${this.minSeq}): ${this.minLength}; sc: ${this.segmentCount};${buf}`;\n\t\treturn buf;\n\t}\n\n\t// Clear away partial sums for sequence numbers earlier than the current window\n\t// eslint-disable-next-line import/no-deprecated\n\tprivate zamboni(segmentWindow: CollaborationWindow) {\n\t\tthis.minLength += this.partialLengths.copyDown(segmentWindow.minSeq);\n\t\tthis.minSeq = segmentWindow.minSeq;\n\t\t// eslint-disable-next-line @typescript-eslint/no-for-in-array, guard-for-in, no-restricted-syntax\n\t\tfor (const clientId in this.clientSeqNumbers) {\n\t\t\tconst cliPartials = this.clientSeqNumbers[clientId];\n\t\t\tif (cliPartials) {\n\t\t\t\tcliPartials.copyDown(segmentWindow.minSeq);\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate addClientSeqNumber(clientId: number, seq: number, seglen: number) {\n\t\tthis.clientSeqNumbers[clientId] ??= new PartialSequenceLengthsSet();\n\t\tconst cli = this.clientSeqNumbers[clientId];\n\t\tcli.addOrUpdate({ seq, len: 0, seglen });\n\t}\n\n\t// Assumes sequence number already coalesced and that this is called in increasing `seq` order.\n\tprivate addClientSeqNumberFromPartial(partialLength: PartialSequenceLength) {\n\t\tconst seglen = partialLength.seglen + (partialLength.remoteObliteratedLen ?? 0);\n\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\tthis.addClientSeqNumber(partialLength.clientId!, partialLength.seq, seglen);\n\t\tif (partialLength.overlapRemoveClients) {\n\t\t\tpartialLength.overlapRemoveClients.map((oc: Property<number, IOverlapClient>) => {\n\t\t\t\t// Original client entry was handled above\n\t\t\t\tif (partialLength.clientId !== oc.data.clientId) {\n\t\t\t\t\tthis.addClientSeqNumber(oc.data.clientId, partialLength.seq, oc.data.seglen);\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t});\n\t\t}\n\t\tif (partialLength.overlapObliterateClients) {\n\t\t\tpartialLength.overlapObliterateClients.map((oc: Property<number, IOverlapClient>) => {\n\t\t\t\t// Original client entry was handled above\n\t\t\t\tif (partialLength.clientId !== oc.data.clientId) {\n\t\t\t\t\tthis.addClientSeqNumber(oc.data.clientId, partialLength.seq, oc.data.seglen);\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t});\n\t\t}\n\t}\n\n\tprivate cliLatestLEQ(clientId: number, refSeq: number): PartialSequenceLength | undefined {\n\t\treturn this.clientSeqNumbers[clientId]?.latestLeq(refSeq);\n\t}\n\n\tprivate cliLatest(clientId: number) {\n\t\tconst cliSeqs = this.clientSeqNumbers[clientId];\n\t\treturn cliSeqs && cliSeqs.size > 0 ? cliSeqs.size - 1 : -1;\n\t}\n}\n\n/* eslint-disable @typescript-eslint/dot-notation */\nfunction verifyPartialLengths(\n\tpartialSeqLengths: PartialSequenceLengths,\n\tpartialLengths: PartialSequenceLengthsSet,\n\tclientPartials: boolean,\n): number {\n\tif (partialLengths.size === 0) {\n\t\treturn 0;\n\t}\n\n\tlet lastSeqNum = 0;\n\tlet accumSegLen = 0;\n\tlet count = 0;\n\n\tfor (const partialLength of partialLengths.items) {\n\t\t// Count total number of partial length entries\n\t\tcount++;\n\n\t\t// Sequence number should be larger or equal to minseq\n\t\tassert(\n\t\t\tpartialSeqLengths.minSeq <= partialLength.seq,\n\t\t\t0x054 /* \"Sequence number less than minSeq!\" */,\n\t\t);\n\n\t\t// Sequence number should be sorted\n\t\tassert(lastSeqNum < partialLength.seq, 0x055 /* \"Sequence number is not sorted!\" */);\n\t\tlastSeqNum = partialLength.seq;\n\n\t\t// Len is a accumulation of all the seglen adjustments\n\t\taccumSegLen += partialLength.seglen;\n\t\tif (accumSegLen !== partialLength.len) {\n\t\t\tassert(\n\t\t\t\tfalse,\n\t\t\t\t0x056 /* \"Unexpected total for accumulation of all seglen adjustments!\" */,\n\t\t\t);\n\t\t}\n\n\t\tif (clientPartials) {\n\t\t\t// Client partials used to track local edits so we can account for them some refSeq.\n\t\t\t// But the information we keep track of are since minSeq, so we keep track of more history\n\t\t\t// then needed, and some of them doesn't make sense to be used for length calculations\n\t\t\t// e.g. if you have this sequence, where the minSeq is #5 because of other clients\n\t\t\t// seq 10: client 1: insert seg #1\n\t\t\t// seq 11: client 2: delete seg #2 refseq: 10\n\t\t\t// minLength is 0, we would have keep a record of seglen: -1 for clientPartialLengths for client 2\n\t\t\t// So if you ask for partial length for client 2 @ seq 5, we will have return -1.\n\t\t\t// However, that combination is invalid, since we should never see any ops with refseq < 10 for\n\t\t\t// client 2 after seq 11.\n\t\t} else {\n\t\t\t// Len adjustment should not make length negative\n\t\t\tif (partialSeqLengths[\"minLength\"] + partialLength.len < 0) {\n\t\t\t\tassert(false, 0x057 /* \"Negative length after length adjustment!\" */);\n\t\t\t}\n\t\t}\n\n\t\tif (partialLength.overlapRemoveClients) {\n\t\t\t// Only the flat partialLengths can have overlapRemoveClients, the per client view shouldn't\n\t\t\tassert(\n\t\t\t\t!clientPartials,\n\t\t\t\t0x058 /* \"Both overlapRemoveClients and clientPartials are set!\" */,\n\t\t\t);\n\n\t\t\t// Each overlap client counts as one, but the first remove to sequence was already counted.\n\t\t\t// (this aligns with the logic to omit the removing client in `addClientSeqNumberFromPartial`)\n\t\t\tcount += partialLength.overlapRemoveClients.size() - 1;\n\t\t}\n\n\t\tif (partialLength.overlapObliterateClients) {\n\t\t\t// Only the flat partialLengths can have overlapObliterateClients, the per client view shouldn't\n\t\t\tassert(\n\t\t\t\t!clientPartials,\n\t\t\t\t0x872 /* Both overlapObliterateClients and clientPartials are set! */,\n\t\t\t);\n\n\t\t\t// Each overlap client counts as one, but the first move to sequence was already counted.\n\t\t\t// (this aligns with the logic to omit the moving client in `addClientSeqNumberFromPartial`)\n\t\t\tcount += partialLength.overlapObliterateClients.size() - 1;\n\t\t}\n\t}\n\treturn count;\n}\n\nexport function verifyExpected(\n\tmergeTree: MergeTree,\n\tnode: IMergeBlock,\n\trefSeq: number,\n\tclientId: number,\n\tlocalSeq?: number,\n) {\n\tif (\n\t\t(!mergeTree.collabWindow.collaborating || mergeTree.collabWindow.clientId === clientId) &&\n\t\t(node.isLeaf() || localSeq === undefined)\n\t) {\n\t\treturn;\n\t}\n\n\tconst partialLen = node.partialLengths?.getPartialLength(refSeq, clientId, localSeq);\n\n\tlet expected = 0;\n\tconst nodesToVisit: IMergeNode[] = [node];\n\n\twhile (nodesToVisit.length > 0) {\n\t\tconst thisNode = nodesToVisit.pop();\n\t\tif (!thisNode) {\n\t\t\tcontinue;\n\t\t}\n\t\tif (thisNode.isLeaf()) {\n\t\t\texpected += mergeTree[\"nodeLength\"](thisNode, refSeq, clientId, localSeq) ?? 0;\n\t\t} else {\n\t\t\tnodesToVisit.push(...thisNode.children.slice(0, thisNode.childCount));\n\t\t}\n\t}\n\n\tif (expected !== partialLen) {\n\t\tnode.partialLengths?.getPartialLength(refSeq, clientId, localSeq);\n\t\tthrow new Error(\n\t\t\t`expected partial length of ${expected} but found ${partialLen}. refSeq: ${refSeq}, clientId: ${clientId}`,\n\t\t);\n\t}\n}\n\nexport function verify(partialSeqLengths: PartialSequenceLengths) {\n\tif (partialSeqLengths[\"clientSeqNumbers\"]) {\n\t\tfor (const cliSeq of partialSeqLengths[\"clientSeqNumbers\"]) {\n\t\t\tif (cliSeq) {\n\t\t\t\tverifyPartialLengths(partialSeqLengths, cliSeq, true);\n\t\t\t}\n\t\t}\n\n\t\t// If we have client view, we should have the flat view\n\t\tassert(\n\t\t\t!!partialSeqLengths[\"partialLengths\"],\n\t\t\t0x059 /* \"Client view exists but flat view does not!\" */,\n\t\t);\n\n\t\tverifyPartialLengths(partialSeqLengths, partialSeqLengths[\"partialLengths\"], false);\n\t} else {\n\t\t// If we don't have a client view, we shouldn't have the flat view either\n\t\tassert(\n\t\t\t!partialSeqLengths[\"partialLengths\"],\n\t\t\t0x05b /* \"Flat view exists but client view does not!\" */,\n\t\t);\n\t}\n}\n/* eslint-enable @typescript-eslint/dot-notation */\n\n/**\n * Clones an `overlapRemoveClients` red-black tree.\n */\nfunction cloneOverlapRemoveClients(\n\toldTree: RedBlackTree<number, IOverlapClient> | undefined,\n): RedBlackTree<number, IOverlapClient> | undefined {\n\tif (!oldTree) {\n\t\treturn undefined;\n\t}\n\tconst newTree = new RedBlackTree<number, IOverlapClient>(compareNumbers);\n\toldTree.map((bProp: Property<number, IOverlapClient>) => {\n\t\tnewTree.put(bProp.data.clientId, { ...bProp.data });\n\t\treturn true;\n\t});\n\treturn newTree;\n}\n\n/**\n * Combines the `overlapRemoveClients` and `overlapObliterateClients` fields of\n * two `PartialSequenceLength` objects, modifying the first PartialSequenceLength's\n * bookkeeping in-place.\n *\n * Combination is performed additively on `seglen` on a per-client basis.\n */\nexport function combineOverlapClients(a: PartialSequenceLength, b: PartialSequenceLength) {\n\tfunction combine(\n\t\ttreeA: RedBlackTree<number, IOverlapClient> | undefined,\n\t\ttreeB: RedBlackTree<number, IOverlapClient> | undefined,\n\t): RedBlackTree<number, IOverlapClient> | undefined {\n\t\tif (treeA) {\n\t\t\tif (treeB) {\n\t\t\t\ttreeB.map((bProp: Property<number, IOverlapClient>) => {\n\t\t\t\t\tconst aProp = treeA.get(bProp.key);\n\t\t\t\t\tif (aProp) {\n\t\t\t\t\t\taProp.data.seglen += bProp.data.seglen;\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttreeA.put(bProp.data.clientId, { ...bProp.data });\n\t\t\t\t\t}\n\t\t\t\t\treturn true;\n\t\t\t\t});\n\t\t\t}\n\t\t} else {\n\t\t\treturn cloneOverlapRemoveClients(treeB);\n\t\t}\n\t}\n\n\tconst overlapRemoveClients = combine(a.overlapRemoveClients, b.overlapRemoveClients);\n\tif (overlapRemoveClients) {\n\t\ta.overlapRemoveClients = overlapRemoveClients;\n\t}\n\n\tconst overlapObliterateClients = combine(\n\t\ta.overlapObliterateClients,\n\t\tb.overlapObliterateClients,\n\t);\n\tif (overlapObliterateClients) {\n\t\ta.overlapObliterateClients = overlapObliterateClients;\n\t}\n}\n\n/**\n * Given a number of seq-sorted `partialLength` lists, merges them into a combined seq-sorted `partialLength`\n * list. This merge includes coalescing `PartialSequenceLength` entries at the same seq.\n *\n * Ex: merging the following two lists (some information omitted on each PartialSequenceLength):\n * ```typescript\n * [{ seq: 1, seglen: 5 }, { seq: 3, seglen: -1 }]\n * [{ seq: 1, seglen: -3 }, { seq: 2: seglen: 4 }]\n * ```\n * would produce\n * ```typescript\n * [{ seq: 1, seglen: 2 }, { seq: 2, seglen: 4 }, { seq: 3, seglen: -1 }]\n * ```\n */\nfunction mergePartialLengths(\n\tchildPartialLengths: PartialSequenceLength[][],\n\tmergedLengths: PartialSequenceLengthsSet = new PartialSequenceLengthsSet(),\n): PartialSequenceLengthsSet {\n\tfor (const partialLength of mergeSortedListsBySeq(childPartialLengths)) {\n\t\tmergedLengths.addOrUpdate({\n\t\t\t...partialLength,\n\t\t\toverlapRemoveClients: cloneOverlapRemoveClients(partialLength.overlapRemoveClients),\n\t\t\toverlapObliterateClients: cloneOverlapRemoveClients(\n\t\t\t\tpartialLength.overlapObliterateClients,\n\t\t\t),\n\t\t});\n\t}\n\treturn mergedLengths;\n}\n\n/**\n * Given a collection of PartialSequenceLength lists--each sorted by sequence number--returns an iterable that yields\n * each PartialSequenceLength in sequence order.\n *\n * This is equivalent to flattening the input list and sorting it by sequence number. If the number of lists to merge is\n * a constant, however, this approach is advantageous asymptotically.\n */\nfunction mergeSortedListsBySeq<T extends PartialSequenceLength>(lists: T[][]): Iterable<T> {\n\tclass PartialSequenceLengthIterator {\n\t\t/**\n\t\t * nextSmallestIndex[i] is the next element of sublists[i] to check.\n\t\t * In other words, the iterator has already yielded elements of sublists[i] *up through*\n\t\t * sublists[i][nextSmallestIndex[i] - 1].\n\t\t */\n\t\tprivate readonly nextSmallestIndex: number[];\n\n\t\tconstructor(private readonly sublists: T[][]) {\n\t\t\tthis.nextSmallestIndex = new Array(sublists.length);\n\t\t\tfor (let i = 0; i < sublists.length; i++) {\n\t\t\t\tthis.nextSmallestIndex[i] = 0;\n\t\t\t}\n\t\t}\n\n\t\tpublic next(): { value: T; done: false } | { value: undefined; done: true } {\n\t\t\tconst len = this.sublists.length;\n\t\t\tlet currentMin: T | undefined;\n\t\t\tlet currentMinIndex: number | undefined;\n\t\t\tfor (let i = 0; i < len; i++) {\n\t\t\t\tconst candidateIndex = this.nextSmallestIndex[i];\n\t\t\t\tif (candidateIndex < this.sublists[i].length) {\n\t\t\t\t\tconst candidate = this.sublists[i][candidateIndex];\n\t\t\t\t\tif (!currentMin || candidate.seq < currentMin.seq) {\n\t\t\t\t\t\tcurrentMin = candidate;\n\t\t\t\t\t\tcurrentMinIndex = i;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (currentMin) {\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\t\t\tthis.nextSmallestIndex[currentMinIndex!]++;\n\t\t\t\treturn { value: currentMin, done: false };\n\t\t\t} else {\n\t\t\t\treturn { value: undefined, done: true };\n\t\t\t}\n\t\t}\n\t}\n\n\treturn { [Symbol.iterator]: () => new PartialSequenceLengthIterator(lists) };\n}\n\nfunction insertIntoList<T>(list: T[], index: number, elem: T): void {\n\tif (index < list.length) {\n\t\tfor (let k = list.length; k > index; k--) {\n\t\t\tlist[k] = list[k - 1];\n\t\t}\n\t\tlist[index] = elem;\n\t} else {\n\t\tlist.push(elem);\n\t}\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"properties.d.mts","sourceRoot":"","sources":["../src/properties.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;GAGG;AACH,MAAM,WAAW,OAAO,CAAC,CAAC;IACzB,CAAC,KAAK,EAAE,MAAM,GAAG,CAAC,CAAC;CACnB;AAED;;;;;;;;;GASG;AACH,MAAM,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;AAEvC;;GAEG;AACH,wBAAgB,eAAe,CAAC,CAAC,EAAE,WAAW,GAAG,SAAS,EAAE,CAAC,EAAE,WAAW,GAAG,SAAS,WAyBrF;AAED;;;;GAIG;AACH,wBAAgB,MAAM,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,SAAS,cAc5E;AAED;;;;GAIG;AACH,wBAAgB,KAAK,CAAC,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,SAAS,0BAazD;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,WAAW,GAAG,SAAS,EAAE,QAAQ,EAAE,WAAW,eAIrF;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,SAAS,cAUvF;AAED;;;;GAIG;AAEH,wBAAgB,SAAS,CAAC,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,CAEzC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"properties.mjs","sourceRoot":"","sources":["../src/properties.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAsBH;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,CAA0B,EAAE,CAA0B;IACrF,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE;QACb,OAAO,IAAI,CAAC;KACZ;IAED,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACtC,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAEtC,IAAI,KAAK,CAAC,MAAM,KAAK,KAAK,CAAC,MAAM,EAAE;QAClC,OAAO,KAAK,CAAC;KACb;IAED,KAAK,MAAM,GAAG,IAAI,KAAK,EAAE;QACxB,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK,SAAS,EAAE;YAC3B,OAAO,KAAK,CAAC;SACb;aAAM,IAAI,OAAO,CAAC,CAAC,GAAG,CAAC,KAAK,QAAQ,EAAE;YACtC,IAAI,CAAC,eAAe,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE;gBACvC,OAAO,KAAK,CAAC;aACb;SACD;aAAM,IAAI,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE;YAC/B,OAAO,KAAK,CAAC;SACb;KACD;IAED,OAAO,IAAI,CAAC;AACb,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,MAAM,CAAI,IAAgB,EAAE,SAAiC;IAC5E,IAAI,SAAS,KAAK,SAAS,EAAE;QAC5B,8DAA8D;QAC9D,KAAK,MAAM,GAAG,IAAI,SAAS,EAAE;YAC5B,MAAM,CAAC,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC;YACzB,IAAI,CAAC,KAAK,IAAI,EAAE;gBACf,gEAAgE;gBAChE,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC;aACjB;iBAAM;gBACN,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;aACd;SACD;KACD;IACD,OAAO,IAAI,CAAC;AACb,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,KAAK,CAAI,SAAiC;IACzD,IAAI,SAAS,KAAK,SAAS,EAAE;QAC5B,OAAO,SAAS,CAAC;KACjB;IACD,MAAM,QAAQ,GAAG,SAAS,EAAK,CAAC;IAChC,8DAA8D;IAC9D,KAAK,MAAM,GAAG,IAAI,SAAS,EAAE;QAC5B,MAAM,CAAC,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC;QACzB,IAAI,CAAC,KAAK,IAAI,EAAE;YACf,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;SAClB;KACD;IACD,OAAO,QAAQ,CAAC;AACjB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,aAAa,CAAC,QAAiC,EAAE,QAAqB;IACrF,MAAM,SAAS,GAAG,QAAQ,IAAI,SAAS,EAAO,CAAC;IAC/C,MAAM,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IAC5B,OAAO,SAAS,CAAC;AAClB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAAI,IAAgB,EAAE,SAAiC;IACvF,IAAI,SAAS,KAAK,SAAS,EAAE;QAC5B,gDAAgD;QAChD,KAAK,MAAM,GAAG,IAAI,SAAS,EAAE;YAC5B,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,SAAS,EAAE;gBAC5B,IAAI,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC;aAC3B;SACD;KACD;IACD,OAAO,IAAI,CAAC;AACb,CAAC;AAED;;;;GAIG;AACH,0CAA0C;AAC1C,MAAM,UAAU,SAAS;IACxB,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI,CAAe,CAAC;AAC1C,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\n/**\n * Any mapping from a string to values of type `T`\n * @alpha\n */\nexport interface MapLike<T> {\n\t[index: string]: T;\n}\n\n/**\n * A loosely-typed mapping from strings to any value.\n *\n * @remarks Property sets are expected to be JSON-stringify-able.\n *\n * @privateRemarks PropertySet is typed using `any` because when you include\n * custom methods such as toJSON(), JSON.stringify accepts most types other than\n * functions\n * @alpha\n */\nexport type PropertySet = MapLike<any>;\n\n/**\n * @internal\n */\nexport function matchProperties(a: PropertySet | undefined, b: PropertySet | undefined) {\n\tif (!a && !b) {\n\t\treturn true;\n\t}\n\n\tconst keysA = a ? Object.keys(a) : [];\n\tconst keysB = b ? Object.keys(b) : [];\n\n\tif (keysA.length !== keysB.length) {\n\t\treturn false;\n\t}\n\n\tfor (const key of keysA) {\n\t\tif (b?.[key] === undefined) {\n\t\t\treturn false;\n\t\t} else if (typeof b[key] === \"object\") {\n\t\t\tif (!matchProperties(a?.[key], b[key])) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t} else if (b[key] !== a?.[key]) {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\treturn true;\n}\n\n/**\n * @deprecated This functionality was not intended for public export and will\n * be removed in a future release.\n * @internal\n */\nexport function extend<T>(base: MapLike<T>, extension: MapLike<T> | undefined) {\n\tif (extension !== undefined) {\n\t\t// eslint-disable-next-line guard-for-in, no-restricted-syntax\n\t\tfor (const key in extension) {\n\t\t\tconst v = extension[key];\n\t\t\tif (v === null) {\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n\t\t\t\tdelete base[key];\n\t\t\t} else {\n\t\t\t\tbase[key] = v;\n\t\t\t}\n\t\t}\n\t}\n\treturn base;\n}\n\n/**\n * @deprecated This functionality was not intended for public export and will\n * be removed in a future release.\n * @internal\n */\nexport function clone<T>(extension: MapLike<T> | undefined) {\n\tif (extension === undefined) {\n\t\treturn undefined;\n\t}\n\tconst cloneMap = createMap<T>();\n\t// eslint-disable-next-line guard-for-in, no-restricted-syntax\n\tfor (const key in extension) {\n\t\tconst v = extension[key];\n\t\tif (v !== null) {\n\t\t\tcloneMap[key] = v;\n\t\t}\n\t}\n\treturn cloneMap;\n}\n\n/**\n * @deprecated This functionality was not intended for public export and will\n * be removed in a future release.\n * @internal\n */\nexport function addProperties(oldProps: PropertySet | undefined, newProps: PropertySet) {\n\tconst _oldProps = oldProps ?? createMap<any>();\n\textend(_oldProps, newProps);\n\treturn _oldProps;\n}\n\n/**\n * @deprecated This functionality was not intended for public export and will\n * be removed in a future release.\n * @internal\n */\nexport function extendIfUndefined<T>(base: MapLike<T>, extension: MapLike<T> | undefined) {\n\tif (extension !== undefined) {\n\t\t// eslint-disable-next-line no-restricted-syntax\n\t\tfor (const key in extension) {\n\t\t\tif (base[key] === undefined) {\n\t\t\t\tbase[key] = extension[key];\n\t\t\t}\n\t\t}\n\t}\n\treturn base;\n}\n\n/**\n * @deprecated This functionality was not intended for public export and will\n * be removed in a future release.\n * @internal\n */\n// Create a MapLike with good performance.\nexport function createMap<T>(): MapLike<T> {\n\treturn Object.create(null) as MapLike<T>;\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"referencePositions.d.mts","sourceRoot":"","sources":["../src/referencePositions.ts"],"names":[],"mappings":"AAAA;;;GAGG;OAEI,EAAE,iBAAiB,EAAE;OACrB,EAAE,QAAQ,EAAE;OACZ,EAAE,aAAa,EAAE;OACjB,EAAE,WAAW,EAAE;AAEtB;;GAEG;AACH,eAAO,MAAM,qBAAqB,wBAAwB,CAAC;AAC3D;;GAEG;AACH,eAAO,MAAM,sBAAsB,yBAAyB,CAAC;AAE7D;;GAEG;AACH,wBAAgB,mBAAmB,CAClC,YAAY,EAAE,iBAAiB,GAAG,aAAa,EAC/C,KAAK,EAAE,aAAa,GAClB,OAAO,CAIT;AAED;;GAEG;AACH,eAAO,MAAM,gBAAgB,WAAY,iBAAiB,KAAG,MAAM,EAAE,GAAG,SAG3D,CAAC;AAEd;;GAEG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,iBAAiB,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAGjF;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,iBAAiB,GAAG,OAAO,CAEnE;AAED;;;;;GAKG;AACH,MAAM,WAAW,iBAAiB;IACjC;;OAEG;IACH,UAAU,CAAC,EAAE,WAAW,CAAC;IAEzB;;;;;OAKG;IACH,iBAAiB,CAAC,EAAE,iBAAiB,CAAC;IAEtC,OAAO,EAAE,aAAa,CAAC;IAEvB;;;OAGG;IACH,UAAU,IAAI,QAAQ,GAAG,SAAS,CAAC;IAEnC;;;;;;;OAOG;IACH,SAAS,IAAI,MAAM,CAAC;IAEpB;;;;OAIG;IACH,aAAa,CAAC,QAAQ,EAAE,WAAW,GAAG,IAAI,CAAC;IAC3C,MAAM,IAAI,IAAI,IAAI,QAAQ,CAAC;CAC3B;AAED;;GAEG;AACH,eAAO,MAAM,yBAAyB,KAAK,CAAC;AAE5C;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,CAAC,SAAS,iBAAiB,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,CAE/E;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,CAAC,SAAS,iBAAiB,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,CAE/E;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,CAAC,EAAE,iBAAiB,EAAE,CAAC,EAAE,iBAAiB,GAAG,MAAM,CAQ5F"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"referencePositions.mjs","sourceRoot":"","sources":["../src/referencePositions.ts"],"names":[],"mappings":"AAAA;;;GAGG;OAII,EAAE,aAAa,EAAE;AAGxB;;GAEG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,qBAAqB,CAAC;AAC3D;;GAEG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,sBAAsB,CAAC;AAE7D;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAClC,YAA+C,EAC/C,KAAoB;IAEpB,MAAM,OAAO,GAAG,OAAO,YAAY,KAAK,QAAQ,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,YAAY,CAAC,OAAO,CAAC;IACvF,sCAAsC;IACtC,OAAO,CAAC,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC;AAChC,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,MAAyB,EAAwB,EAAE,CACnF,mBAAmB,CAAC,MAAM,EAAE,aAAa,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,UAAU;IACnE,CAAC,CAAE,MAAM,CAAC,UAAU,CAAC,qBAAqB,CAAc;IACxD,CAAC,CAAC,SAAS,CAAC;AAEd;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,MAAyB,EAAE,KAAa;IACvE,MAAM,UAAU,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC;IAC5C,OAAO,UAAU,EAAE,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC;AAC7C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,MAAyB;IACzD,OAAO,gBAAgB,CAAC,MAAM,CAAC,KAAK,SAAS,CAAC;AAC/C,CAAC;AAiDD;;GAEG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,CAAC,CAAC;AAE5C;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAA8B,CAAI,EAAE,CAAI;IAC3E,OAAO,yBAAyB,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACpD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAA8B,CAAI,EAAE,CAAI;IAC3E,OAAO,yBAAyB,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACpD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,yBAAyB,CAAC,CAAoB,EAAE,CAAoB;IACnF,MAAM,IAAI,GAAG,CAAC,CAAC,UAAU,EAAE,CAAC;IAC5B,MAAM,IAAI,GAAG,CAAC,CAAC,UAAU,EAAE,CAAC;IAC5B,IAAI,IAAI,KAAK,IAAI,EAAE;QAClB,OAAO,CAAC,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC,SAAS,EAAE,CAAC;KACrC;SAAM;QACN,OAAO,IAAI,KAAK,SAAS,IAAI,CAAC,IAAI,KAAK,SAAS,IAAI,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;KAC1F;AACF,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { SlidingPreference } from \"./localReference\";\nimport { ISegment } from \"./mergeTreeNodes\";\nimport { ReferenceType } from \"./ops\";\nimport { PropertySet } from \"./properties\";\n\n/**\n * @internal\n */\nexport const reservedTileLabelsKey = \"referenceTileLabels\";\n/**\n * @internal\n */\nexport const reservedRangeLabelsKey = \"referenceRangeLabels\";\n\n/**\n * @internal\n */\nexport function refTypeIncludesFlag(\n\trefPosOrType: ReferencePosition | ReferenceType,\n\tflags: ReferenceType,\n): boolean {\n\tconst refType = typeof refPosOrType === \"number\" ? refPosOrType : refPosOrType.refType;\n\t// eslint-disable-next-line no-bitwise\n\treturn (refType & flags) !== 0;\n}\n\n/**\n * @internal\n */\nexport const refGetTileLabels = (refPos: ReferencePosition): string[] | undefined =>\n\trefTypeIncludesFlag(refPos, ReferenceType.Tile) && refPos.properties\n\t\t? (refPos.properties[reservedTileLabelsKey] as string[])\n\t\t: undefined;\n\n/**\n * @internal\n */\nexport function refHasTileLabel(refPos: ReferencePosition, label: string): boolean {\n\tconst tileLabels = refGetTileLabels(refPos);\n\treturn tileLabels?.includes(label) ?? false;\n}\n\n/**\n * @internal\n */\nexport function refHasTileLabels(refPos: ReferencePosition): boolean {\n\treturn refGetTileLabels(refPos) !== undefined;\n}\n\n/**\n * Represents a reference to a place within a merge tree. This place conceptually remains stable over time\n * by referring to a particular segment and offset within that segment.\n * Thus, this reference's character position changes as the tree is edited.\n * @alpha\n */\nexport interface ReferencePosition {\n\t/**\n\t * Properties associated with this reference\n\t */\n\tproperties?: PropertySet;\n\n\t/**\n\t * The direction for this reference position to slide when the segment it\n\t * points to is removed. See {@link (SlidingPreference:type)} for additional context.\n\t *\n\t * Defaults to SlidingPreference.Forward\n\t */\n\tslidingPreference?: SlidingPreference;\n\n\trefType: ReferenceType;\n\n\t/**\n\t * Gets the segment that this reference position is semantically associated with. Returns undefined iff the\n\t * reference became detached from the string.\n\t */\n\tgetSegment(): ISegment | undefined;\n\n\t/**\n\t * Gets the offset for this reference position within its associated segment.\n\t *\n\t * @example\n\t *\n\t * If a merge-tree has 3 leaf segments [\"hello\", \" \", \"world\"] and a ReferencePosition refers to the \"l\"\n\t * in \"world\", that reference's offset would be 3 as \"l\" is the character at index 3 within \"world\".\n\t */\n\tgetOffset(): number;\n\n\t/**\n\t * @param newProps - Properties to add to this reference.\n\t * @remarks Note that merge-tree does not broadcast changes to other clients. It is up to the consumer\n\t * to ensure broadcast happens if that is desired.\n\t */\n\taddProperties(newProps: PropertySet): void;\n\tisLeaf(): this is ISegment;\n}\n\n/**\n * @internal\n */\nexport const DetachedReferencePosition = -1;\n\n/**\n * @internal\n */\nexport function minReferencePosition<T extends ReferencePosition>(a: T, b: T): T {\n\treturn compareReferencePositions(a, b) < 0 ? a : b;\n}\n\n/**\n * @internal\n */\nexport function maxReferencePosition<T extends ReferencePosition>(a: T, b: T): T {\n\treturn compareReferencePositions(a, b) > 0 ? a : b;\n}\n\n/**\n * @internal\n */\nexport function compareReferencePositions(a: ReferencePosition, b: ReferencePosition): number {\n\tconst aSeg = a.getSegment();\n\tconst bSeg = b.getSegment();\n\tif (aSeg === bSeg) {\n\t\treturn a.getOffset() - b.getOffset();\n\t} else {\n\t\treturn aSeg === undefined || (bSeg !== undefined && aSeg.ordinal < bSeg.ordinal) ? -1 : 1;\n\t}\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"revertibles.d.mts","sourceRoot":"","sources":["../src/revertibles.ts"],"names":[],"mappings":"AAAA;;;GAGG;OAKI,EAAE,gBAAgB,EAAE;OACpB,EAA4B,sBAAsB,EAAE;OACpD,EAAE,2BAA2B,EAAE;OAG/B,EAAE,cAAc,EAAqC;OACrD,EAAE,YAAY,EAAE,kBAAkB,EAAiB;OACnD,EAAmB,WAAW,EAAE;OAEhC,EAAE,SAAS,EAAsB;AAExC;;GAEG;AACH,MAAM,MAAM,wBAAwB,GACjC;IACA,SAAS,EAAE,OAAO,kBAAkB,CAAC,MAAM,CAAC;IAC5C,aAAa,EAAE,cAAc,CAAC;CAC7B,GACD;IACA,SAAS,EAAE,OAAO,kBAAkB,CAAC,MAAM,CAAC;IAC5C,aAAa,EAAE,cAAc,CAAC;CAC7B,GACD;IACA,SAAS,EAAE,OAAO,kBAAkB,CAAC,QAAQ,CAAC;IAC9C,aAAa,EAAE,cAAc,CAAC;IAC9B,cAAc,EAAE,WAAW,CAAC;CAC3B,CAAC;AAEL;;;GAGG;AACH,wBAAgB,0BAA0B,CAAC,CAAC,EAAE,OAAO,GAAG,CAAC,IAAI,wBAAwB,CAEpF;AAiBD;;GAEG;AACH,MAAM,WAAW,yBAAyB;IACzC,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY,GAAG,IAAI,CAAC;IACtD,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9C,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,GAAG,IAAI,CAAC;CACpE;AAED;;;GAGG;AACH,MAAM,WAAW,mBAAoB,SAAQ,SAAS;IACrD,qBAAqB,EAAE;QACtB,kBAAkB,EAAE,gBAAgB,CAAC;QACrC,YAAY,EAAE,sBAAsB,CAAC,WAAW,CAAC,CAAC;KAClD,CAAC;CACF;AAED,MAAM,MAAM,WAAW,CAAC,CAAC,EAAE,CAAC,SAAS,MAAM,CAAC,IAAI,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AA8GjF;;GAEG;AACH,wBAAgB,iCAAiC,CAChD,SAAS,EAAE,2BAA2B,EACtC,WAAW,EAAE,wBAAwB,EAAE,QAuBvC;AAED;;GAEG;AACH,wBAAgB,+BAA+B,CAAC,WAAW,EAAE,wBAAwB,EAAE,QAUtF;AAuJD;;GAEG;AACH,wBAAgB,+BAA+B,CAC9C,MAAM,EAAE,yBAAyB,EACjC,WAAW,EAAE,wBAAwB,EAAE,QAyBvC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"revertibles.mjs","sourceRoot":"","sources":["../src/revertibles.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 { assert, unreachableCase } from \"@fluidframework/core-utils\";\nimport { UsageError } from \"@fluidframework/telemetry-utils\";\nimport { DoublyLinkedList } from \"./collections\";\nimport { EndOfTreeSegment } from \"./endOfTreeSegment\";\nimport { LocalReferenceCollection, LocalReferencePosition } from \"./localReference\";\nimport { IMergeTreeDeltaCallbackArgs } from \"./mergeTreeDeltaCallback\";\nimport { IMergeLeaf, ISegment, toRemovalInfo } from \"./mergeTreeNodes\";\nimport { depthFirstNodeWalk } from \"./mergeTreeNodeWalk\";\nimport { ITrackingGroup, Trackable, UnorderedTrackingGroup } from \"./mergeTreeTracking\";\nimport { IJSONSegment, MergeTreeDeltaType, ReferenceType } from \"./ops\";\nimport { matchProperties, PropertySet } from \"./properties\";\nimport { DetachedReferencePosition } from \"./referencePositions\";\nimport { MergeTree, findRootMergeBlock } from \"./mergeTree\";\n\n/**\n * @alpha\n */\nexport type MergeTreeDeltaRevertible =\n\t| {\n\t\t\toperation: typeof MergeTreeDeltaType.INSERT;\n\t\t\ttrackingGroup: ITrackingGroup;\n\t }\n\t| {\n\t\t\toperation: typeof MergeTreeDeltaType.REMOVE;\n\t\t\ttrackingGroup: ITrackingGroup;\n\t }\n\t| {\n\t\t\toperation: typeof MergeTreeDeltaType.ANNOTATE;\n\t\t\ttrackingGroup: ITrackingGroup;\n\t\t\tpropertyDeltas: PropertySet;\n\t };\n\n/**\n * Tests whether x is a MergeTreeDeltaRevertible\n * @internal\n */\nexport function isMergeTreeDeltaRevertible(x: unknown): x is MergeTreeDeltaRevertible {\n\treturn !!x && typeof x === \"object\" && \"operation\" in x && \"trackingGroup\" in x;\n}\n\ntype TypedRevertible<T extends MergeTreeDeltaRevertible[\"operation\"]> = MergeTreeDeltaRevertible & {\n\toperation: T;\n};\n\ninterface RemoveSegmentRefProperties {\n\t/**\n\t * the serialized form of the segment, so it can be re-inserted\n\t */\n\tsegSpec: IJSONSegment;\n\t/**\n\t * a tag so the reference can be identified as being created for revert\n\t */\n\treferenceSpace: \"mergeTreeDeltaRevertible\";\n}\n\n/**\n * @alpha\n */\nexport interface MergeTreeRevertibleDriver {\n\tinsertFromSpec(pos: number, spec: IJSONSegment): void;\n\tremoveRange(start: number, end: number): void;\n\tannotateRange(start: number, end: number, props: PropertySet): void;\n}\n\n/**\n * exported for test only. should not be exported out the the package\n * @internal\n */\nexport interface MergeTreeWithRevert extends MergeTree {\n\t__mergeTreeRevertible: {\n\t\tdetachedReferences: EndOfTreeSegment;\n\t\trefCallbacks: LocalReferencePosition[\"callbacks\"];\n\t};\n}\n\nexport type PickPartial<T, K extends keyof T> = Omit<T, K> & Partial<Pick<T, K>>;\nfunction findMergeTreeWithRevert(trackable: Trackable): MergeTreeWithRevert {\n\tconst segmentOrNode = trackable.isLeaf() ? trackable : trackable.getSegment();\n\tconst maybeRoot = findRootMergeBlock(segmentOrNode);\n\tassert(\n\t\tmaybeRoot?.mergeTree !== undefined,\n\t\t0x5c2 /* trackable is invalid as it is not in a rooted merge tree. */,\n\t);\n\tconst mergeTree: PickPartial<MergeTreeWithRevert, \"__mergeTreeRevertible\"> =\n\t\tmaybeRoot.mergeTree;\n\n\tif (mergeTree.__mergeTreeRevertible === undefined) {\n\t\tconst detachedReferences = new EndOfTreeSegment(maybeRoot.mergeTree);\n\t\tconst refCallbacks: MergeTreeWithRevert[\"__mergeTreeRevertible\"][\"refCallbacks\"] = {\n\t\t\tafterSlide: (r: LocalReferencePosition) => {\n\t\t\t\tif (mergeTree.referencePositionToLocalPosition(r) === DetachedReferencePosition) {\n\t\t\t\t\tconst refs = (detachedReferences.localRefs ??= new LocalReferenceCollection(\n\t\t\t\t\t\tdetachedReferences,\n\t\t\t\t\t));\n\t\t\t\t\trefs.addAfterTombstones([r]);\n\t\t\t\t}\n\t\t\t},\n\t\t};\n\t\tmergeTree.__mergeTreeRevertible = {\n\t\t\trefCallbacks,\n\t\t\tdetachedReferences,\n\t\t};\n\t}\n\treturn mergeTree as MergeTreeWithRevert;\n}\n\nfunction appendLocalInsertToRevertibles(\n\tdeltaArgs: IMergeTreeDeltaCallbackArgs,\n\trevertibles: MergeTreeDeltaRevertible[],\n) {\n\tif (revertibles[revertibles.length - 1]?.operation !== MergeTreeDeltaType.INSERT) {\n\t\trevertibles.push({\n\t\t\toperation: MergeTreeDeltaType.INSERT,\n\t\t\ttrackingGroup: new UnorderedTrackingGroup(),\n\t\t});\n\t}\n\tconst last = revertibles[revertibles.length - 1];\n\tdeltaArgs.deltaSegments.forEach((t) => last.trackingGroup.link(t.segment));\n\n\treturn revertibles;\n}\n\nfunction appendLocalRemoveToRevertibles(\n\tdeltaArgs: IMergeTreeDeltaCallbackArgs,\n\trevertibles: MergeTreeDeltaRevertible[],\n) {\n\tif (revertibles[revertibles.length - 1]?.operation !== MergeTreeDeltaType.REMOVE) {\n\t\trevertibles.push({\n\t\t\toperation: MergeTreeDeltaType.REMOVE,\n\t\t\ttrackingGroup: new UnorderedTrackingGroup(),\n\t\t});\n\t}\n\tconst last = revertibles[revertibles.length - 1];\n\n\tconst mergeTreeWithRevert = findMergeTreeWithRevert(deltaArgs.deltaSegments[0].segment);\n\n\tdeltaArgs.deltaSegments.forEach((t) => {\n\t\tconst props: RemoveSegmentRefProperties = {\n\t\t\tsegSpec: t.segment.toJSONObject(),\n\t\t\treferenceSpace: \"mergeTreeDeltaRevertible\",\n\t\t};\n\t\tconst ref = mergeTreeWithRevert.createLocalReferencePosition(\n\t\t\tt.segment,\n\t\t\t0,\n\t\t\tReferenceType.SlideOnRemove,\n\t\t\tprops,\n\t\t);\n\t\tref.callbacks = mergeTreeWithRevert.__mergeTreeRevertible.refCallbacks;\n\t\tt.segment.trackingCollection.trackingGroups.forEach((tg) => {\n\t\t\ttg.link(ref);\n\t\t\ttg.unlink(t.segment);\n\t\t});\n\n\t\tlast.trackingGroup.link(ref);\n\t});\n\treturn revertibles;\n}\n\nfunction appendLocalAnnotateToRevertibles(\n\tdeltaArgs: IMergeTreeDeltaCallbackArgs,\n\trevertibles: MergeTreeDeltaRevertible[],\n) {\n\tlet last = revertibles[revertibles.length - 1];\n\tdeltaArgs.deltaSegments.forEach((ds) => {\n\t\tconst propertyDeltas = ds.propertyDeltas;\n\t\tif (propertyDeltas) {\n\t\t\tif (\n\t\t\t\tlast?.operation === MergeTreeDeltaType.ANNOTATE &&\n\t\t\t\tmatchProperties(last?.propertyDeltas, propertyDeltas)\n\t\t\t) {\n\t\t\t\tlast.trackingGroup.link(ds.segment);\n\t\t\t} else {\n\t\t\t\tlast = {\n\t\t\t\t\toperation: MergeTreeDeltaType.ANNOTATE,\n\t\t\t\t\tpropertyDeltas,\n\t\t\t\t\ttrackingGroup: new UnorderedTrackingGroup(),\n\t\t\t\t};\n\t\t\t\tlast.trackingGroup.link(ds.segment);\n\t\t\t\trevertibles.push(last);\n\t\t\t}\n\t\t}\n\t});\n\treturn revertibles;\n}\n\n/**\n * @alpha\n */\nexport function appendToMergeTreeDeltaRevertibles(\n\tdeltaArgs: IMergeTreeDeltaCallbackArgs,\n\trevertibles: MergeTreeDeltaRevertible[],\n) {\n\tif (deltaArgs.deltaSegments.length === 0) {\n\t\treturn;\n\t}\n\tswitch (deltaArgs.operation) {\n\t\tcase MergeTreeDeltaType.INSERT:\n\t\t\tappendLocalInsertToRevertibles(deltaArgs, revertibles);\n\t\t\tbreak;\n\n\t\tcase MergeTreeDeltaType.REMOVE:\n\t\t\tappendLocalRemoveToRevertibles(deltaArgs, revertibles);\n\t\t\tbreak;\n\n\t\tcase MergeTreeDeltaType.ANNOTATE:\n\t\t\tappendLocalAnnotateToRevertibles(deltaArgs, revertibles);\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tthrow new UsageError(\"Unsupported event delta type\", {\n\t\t\t\toperation: deltaArgs.operation,\n\t\t\t});\n\t}\n}\n\n/**\n * @alpha\n */\nexport function discardMergeTreeDeltaRevertible(revertibles: MergeTreeDeltaRevertible[]) {\n\trevertibles.forEach((r) => {\n\t\tr.trackingGroup.tracked.forEach((t) => {\n\t\t\tt.trackingCollection.unlink(r.trackingGroup);\n\t\t\t// remove untracked local references\n\t\t\tif (t.trackingCollection.empty && !t.isLeaf()) {\n\t\t\t\tt.getSegment()?.localRefs?.removeLocalRef(t);\n\t\t\t}\n\t\t});\n\t});\n}\n\nfunction revertLocalInsert(\n\tdriver: MergeTreeRevertibleDriver,\n\tmergeTreeWithRevert: MergeTreeWithRevert,\n\trevertible: TypedRevertible<typeof MergeTreeDeltaType.INSERT>,\n) {\n\twhile (revertible.trackingGroup.size > 0) {\n\t\tconst tracked = revertible.trackingGroup.tracked[0];\n\t\tassert(\n\t\t\ttracked.trackingCollection.unlink(revertible.trackingGroup),\n\t\t\t0x3f1 /* tracking group removed */,\n\t\t);\n\t\tassert(tracked.isLeaf(), 0x3f2 /* inserts must track segments */);\n\t\tif (toRemovalInfo(tracked) === undefined) {\n\t\t\tconst start = getPosition(mergeTreeWithRevert, tracked);\n\t\t\tdriver.removeRange(start, start + tracked.cachedLength);\n\t\t}\n\t}\n}\n\nfunction revertLocalRemove(\n\tdriver: MergeTreeRevertibleDriver,\n\tmergeTreeWithRevert: MergeTreeWithRevert,\n\trevertible: TypedRevertible<typeof MergeTreeDeltaType.REMOVE>,\n) {\n\twhile (revertible.trackingGroup.size > 0) {\n\t\tconst tracked = revertible.trackingGroup.tracked[0];\n\n\t\tassert(\n\t\t\ttracked.trackingCollection.unlink(revertible.trackingGroup),\n\t\t\t0x3f3 /* tracking group removed */,\n\t\t);\n\n\t\tassert(!tracked.isLeaf(), 0x3f4 /* removes must track local refs */);\n\n\t\tconst refSeg = tracked.getSegment();\n\t\tlet realPos = mergeTreeWithRevert.referencePositionToLocalPosition(tracked);\n\n\t\t// References which are on EndOfStringSegment don't return detached for pos,\n\t\t// they will return the length of the merge-tree. this case just catches\n\t\t// random references, likely not created in the revertible flow,\n\t\t// that are tying to be reverted for some reason.\n\t\tif (realPos === DetachedReferencePosition || refSeg === undefined) {\n\t\t\tthrow new UsageError(\"Cannot insert at detached references position\");\n\t\t}\n\n\t\tif (toRemovalInfo(refSeg) === undefined && refSeg.localRefs?.isAfterTombstone(tracked)) {\n\t\t\trealPos++;\n\t\t}\n\n\t\tconst props = tracked.properties as RemoveSegmentRefProperties;\n\t\tdriver.insertFromSpec(realPos, props.segSpec);\n\t\tconst insertSegment: IMergeLeaf | undefined = mergeTreeWithRevert.getContainingSegment(\n\t\t\trealPos,\n\t\t\tmergeTreeWithRevert.collabWindow.currentSeq,\n\t\t\tmergeTreeWithRevert.collabWindow.clientId,\n\t\t).segment;\n\t\tassert(insertSegment !== undefined, 0x3f5 /* insert segment must exist at position */);\n\n\t\tconst localSlideFilter = (lref: LocalReferencePosition) =>\n\t\t\t(lref.properties as Partial<RemoveSegmentRefProperties>)?.referenceSpace ===\n\t\t\t\"mergeTreeDeltaRevertible\";\n\n\t\tconst insertRef: Partial<\n\t\t\tRecord<\"before\" | \"after\", DoublyLinkedList<LocalReferencePosition>>\n\t\t> = {};\n\t\tconst forward = insertSegment.ordinal < refSeg.ordinal;\n\t\tconst refHandler = (lref: LocalReferencePosition) => {\n\t\t\t// once we reach it keep the original reference where it is\n\t\t\t// we'll move tracking groups, and remove it as a last step.\n\t\t\tif (tracked === lref) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tif (localSlideFilter(lref)) {\n\t\t\t\tif (forward) {\n\t\t\t\t\tconst before = (insertRef.before ??= new DoublyLinkedList());\n\t\t\t\t\tbefore.push(lref);\n\t\t\t\t} else {\n\t\t\t\t\tconst after = (insertRef.after ??= new DoublyLinkedList());\n\t\t\t\t\tafter.unshift(lref);\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t\tdepthFirstNodeWalk(\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\t\tinsertSegment.parent!,\n\t\t\tinsertSegment,\n\t\t\tundefined,\n\t\t\t(seg) => {\n\t\t\t\tif (seg.localRefs?.empty === false) {\n\t\t\t\t\treturn seg.localRefs.walkReferences(refHandler, undefined, forward);\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t},\n\t\t\tundefined,\n\t\t\tforward,\n\t\t);\n\t\tif (\n\t\t\tmergeTreeWithRevert?.__mergeTreeRevertible?.detachedReferences?.localRefs?.has(tracked)\n\t\t) {\n\t\t\tassert(forward, 0x3f6 /* forward should always be true when detached */);\n\t\t\tmergeTreeWithRevert?.__mergeTreeRevertible.detachedReferences.localRefs.walkReferences(\n\t\t\t\trefHandler,\n\t\t\t);\n\t\t}\n\n\t\tif (insertRef !== undefined) {\n\t\t\tconst localRefs = (insertSegment.localRefs ??= new LocalReferenceCollection(\n\t\t\t\tinsertSegment,\n\t\t\t));\n\t\t\tif (insertRef.before?.empty === false) {\n\t\t\t\tlocalRefs.addBeforeTombstones(insertRef.before.map((n) => n.data));\n\t\t\t}\n\t\t\tif (insertRef.after?.empty === false) {\n\t\t\t\tlocalRefs.addAfterTombstones(insertRef.after.map((n) => n.data));\n\t\t\t}\n\t\t}\n\n\t\ttracked.trackingCollection.trackingGroups.forEach((tg) => {\n\t\t\ttg.link(insertSegment);\n\t\t\ttg.unlink(tracked);\n\t\t});\n\t\ttracked.getSegment()?.localRefs?.removeLocalRef(tracked);\n\t}\n}\n\nfunction revertLocalAnnotate(\n\tdriver: MergeTreeRevertibleDriver,\n\tmergeTreeWithRevert: MergeTreeWithRevert,\n\trevertible: TypedRevertible<typeof MergeTreeDeltaType.ANNOTATE>,\n) {\n\twhile (revertible.trackingGroup.size > 0) {\n\t\tconst tracked = revertible.trackingGroup.tracked[0];\n\t\tconst unlinked = tracked.trackingCollection.unlink(revertible.trackingGroup);\n\t\tassert(unlinked && tracked.isLeaf(), 0x3f7 /* annotates must track segments */);\n\t\tif (toRemovalInfo(tracked) === undefined) {\n\t\t\tconst start = getPosition(mergeTreeWithRevert, tracked);\n\t\t\tdriver.annotateRange(start, start + tracked.cachedLength, revertible.propertyDeltas);\n\t\t}\n\t}\n}\n\nfunction getPosition(mergeTreeWithRevert: MergeTreeWithRevert, segment: ISegment) {\n\treturn mergeTreeWithRevert.getPosition(\n\t\tsegment,\n\t\tmergeTreeWithRevert.collabWindow.currentSeq,\n\t\tmergeTreeWithRevert.collabWindow.clientId,\n\t);\n}\n\n/**\n * @alpha\n */\nexport function revertMergeTreeDeltaRevertibles(\n\tdriver: MergeTreeRevertibleDriver,\n\trevertibles: MergeTreeDeltaRevertible[],\n) {\n\tlet mergeTreeWithRevert: MergeTreeWithRevert | undefined;\n\n\twhile (revertibles.length > 0) {\n\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\tconst r = revertibles.pop()!;\n\t\tconst operation = r.operation;\n\t\tif (r.trackingGroup.size > 0) {\n\t\t\tmergeTreeWithRevert ??= findMergeTreeWithRevert(r.trackingGroup.tracked[0]);\n\t\t\tswitch (operation) {\n\t\t\t\tcase MergeTreeDeltaType.INSERT:\n\t\t\t\t\trevertLocalInsert(driver, mergeTreeWithRevert, r);\n\t\t\t\t\tbreak;\n\t\t\t\tcase MergeTreeDeltaType.REMOVE:\n\t\t\t\t\trevertLocalRemove(driver, mergeTreeWithRevert, r);\n\t\t\t\t\tbreak;\n\t\t\t\tcase MergeTreeDeltaType.ANNOTATE:\n\t\t\t\t\trevertLocalAnnotate(driver, mergeTreeWithRevert, r);\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tunreachableCase(operation);\n\t\t\t}\n\t\t}\n\t}\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"segmentGroupCollection.d.mts","sourceRoot":"","sources":["../src/segmentGroupCollection.ts"],"names":[],"mappings":"AAAA;;;GAGG;OAII,EAAE,QAAQ,EAAE,YAAY,EAAE;AAEjC;;GAEG;AACH,qBAAa,sBAAsB;IAItB,OAAO,CAAC,QAAQ,CAAC,OAAO;IAFpC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAiC;gBAElC,OAAO,EAAE,QAAQ;IAK9C,IAAW,IAAI,WAEd;IAED,IAAW,KAAK,YAEf;IAGM,OAAO,CAAC,YAAY,EAAE,YAAY;IAMlC,OAAO,IAAI,YAAY,GAAG,SAAS;IAKnC,MAAM,CAAC,CAAC,YAAY,EAAE,YAAY,GAAG,OAAO;IAU5C,GAAG,CAAC,IAAI,YAAY,GAAG,SAAS;IAIhC,MAAM,CAAC,OAAO,EAAE,QAAQ;IAO/B,OAAO,CAAC,aAAa;CAUrB"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"segmentGroupCollection.mjs","sourceRoot":"","sources":["../src/segmentGroupCollection.ts"],"names":[],"mappings":"AAAA;;;GAGG;OAEI,EAAE,gBAAgB,EAAE,QAAQ,EAAE;AAIrC;;GAEG;AACH,MAAM,OAAO,sBAAsB;IAIlC,YAA6B,OAAiB;QAAjB,YAAO,GAAP,OAAO,CAAU;QAC7C,gDAAgD;QAChD,IAAI,CAAC,aAAa,GAAG,IAAI,gBAAgB,EAAgB,CAAC;IAC3D,CAAC;IAED,IAAW,IAAI;QACd,OAAO,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC;IAClC,CAAC;IAED,IAAW,KAAK;QACf,OAAO,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC;IACjC,CAAC;IAED,gDAAgD;IACzC,OAAO,CAAC,YAA0B;QACxC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACtC,YAAY,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC1C,CAAC;IAED,gDAAgD;IACzC,OAAO;QACb,OAAO,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,EAAE,IAAI,CAAC;IACzC,CAAC;IAED,gDAAgD;IACzC,MAAM,CAAE,YAA0B;QACxC,MAAM,KAAK,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,YAAY,CAAC,CAAC;QACtE,IAAI,KAAK,KAAK,SAAS,EAAE;YACxB,OAAO,KAAK,CAAC;SACb;QACD,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACjC,OAAO,IAAI,CAAC;IACb,CAAC;IAED,gDAAgD;IACzC,GAAG;QACT,OAAO,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;IAC5E,CAAC;IAEM,MAAM,CAAC,OAAiB;QAC9B,QAAQ,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,EAAE,EAAE,EAAE,CACnC,OAAO,CAAC,aAAa,CAAC,aAAa,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,CAC1D,CAAC;IACH,CAAC;IAED,gDAAgD;IACxC,aAAa,CAAC,YAA0B,EAAE,aAAuB;QACxE,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;QAC3B,IAAI,YAAY,CAAC,aAAa,EAAE;YAC/B,+CAA+C;YAC/C,MAAM,KAAK,GAAG,YAAY,CAAC,QAAQ,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;YAC3D,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE;gBACjB,YAAY,CAAC,aAAa,CAAC,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC;aACnE;SACD;IACF,CAAC;CACD","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { DoublyLinkedList, walkList } from \"./collections\";\n// eslint-disable-next-line import/no-deprecated\nimport { ISegment, SegmentGroup } from \"./mergeTreeNodes\";\n\n/**\n * @alpha\n */\nexport class SegmentGroupCollection {\n\t// eslint-disable-next-line import/no-deprecated\n\tprivate readonly segmentGroups: DoublyLinkedList<SegmentGroup>;\n\n\tconstructor(private readonly segment: ISegment) {\n\t\t// eslint-disable-next-line import/no-deprecated\n\t\tthis.segmentGroups = new DoublyLinkedList<SegmentGroup>();\n\t}\n\n\tpublic get size() {\n\t\treturn this.segmentGroups.length;\n\t}\n\n\tpublic get empty() {\n\t\treturn this.segmentGroups.empty;\n\t}\n\n\t// eslint-disable-next-line import/no-deprecated\n\tpublic enqueue(segmentGroup: SegmentGroup) {\n\t\tthis.segmentGroups.push(segmentGroup);\n\t\tsegmentGroup.segments.push(this.segment);\n\t}\n\n\t// eslint-disable-next-line import/no-deprecated\n\tpublic dequeue(): SegmentGroup | undefined {\n\t\treturn this.segmentGroups.shift()?.data;\n\t}\n\n\t// eslint-disable-next-line import/no-deprecated\n\tpublic remove?(segmentGroup: SegmentGroup): boolean {\n\t\tconst found = this.segmentGroups.find((v) => v.data === segmentGroup);\n\t\tif (found === undefined) {\n\t\t\treturn false;\n\t\t}\n\t\tthis.segmentGroups.remove(found);\n\t\treturn true;\n\t}\n\n\t// eslint-disable-next-line import/no-deprecated\n\tpublic pop?(): SegmentGroup | undefined {\n\t\treturn this.segmentGroups.pop ? this.segmentGroups.pop()?.data : undefined;\n\t}\n\n\tpublic copyTo(segment: ISegment) {\n\t\twalkList(this.segmentGroups, (sg) =>\n\t\t\tsegment.segmentGroups.enqueueOnCopy(sg.data, this.segment),\n\t\t);\n\t}\n\n\t// eslint-disable-next-line import/no-deprecated\n\tprivate enqueueOnCopy(segmentGroup: SegmentGroup, sourceSegment: ISegment) {\n\t\tthis.enqueue(segmentGroup);\n\t\tif (segmentGroup.previousProps) {\n\t\t\t// duplicate the previousProps for this segment\n\t\t\tconst index = segmentGroup.segments.indexOf(sourceSegment);\n\t\t\tif (index !== -1) {\n\t\t\t\tsegmentGroup.previousProps.push(segmentGroup.previousProps[index]);\n\t\t\t}\n\t\t}\n\t}\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"segmentPropertiesManager.d.mts","sourceRoot":"","sources":["../src/segmentPropertiesManager.ts"],"names":[],"mappings":"AAAA;;;GAGG;OAMI,EAAE,qBAAqB,EAAE;OAEzB,EAAsB,WAAW,EAAE;AAE1C;;GAEG;AACH,oBAAY,kBAAkB;IAC7B,wBAAwB;IACxB,IAAI,IAAA;IAEJ,eAAe;IACf,QAAQ,IAAA;CACR;AAED;;GAEG;AACH,qBAAa,iBAAiB;IAC7B,OAAO,CAAC,qBAAqB,CAA8B;IAEpD,oBAAoB,CAAC,UAAU,EAAE,qBAAqB;IAI7D,OAAO,CAAC,sBAAsB;IAgBvB,aAAa,CACnB,QAAQ,EAAE,WAAW,EACrB,QAAQ,EAAE,WAAW,EACrB,GAAG,CAAC,EAAE,MAAM,EACZ,aAAa,GAAE,OAAe,EAC9B,QAAQ,GAAE,kBAA4C,GACpD,WAAW;IAiDP,MAAM,CACZ,QAAQ,EAAE,WAAW,EACrB,QAAQ,EAAE,WAAW,GAAG,SAAS,EACjC,UAAU,EAAE,iBAAiB,GAC3B,WAAW,GAAG,SAAS;IAmBnB,oBAAoB;IAIpB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;CAG/C"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"segmentPropertiesManager.mjs","sourceRoot":"","sources":["../src/segmentPropertiesManager.ts"],"names":[],"mappings":"AAAA;;;GAGG;OAII,EAAE,MAAM,EAAE,MAAM,4BAA4B;OAC5C,EAAE,wBAAwB,EAAE,uBAAuB,EAAE;OAGrD,EAAE,SAAS,EAAwB;AAE1C;;GAEG;AACH,MAAM,CAAN,IAAY,kBAMX;AAND,WAAY,kBAAkB;IAC7B,wBAAwB;IACxB,2DAAI,CAAA;IAEJ,eAAe;IACf,mEAAQ,CAAA;AACT,CAAC,EANW,kBAAkB,KAAlB,kBAAkB,QAM7B;AAED;;GAEG;AACH,MAAM,OAAO,iBAAiB;IAGtB,oBAAoB,CAAC,UAAiC;QAC5D,IAAI,CAAC,sBAAsB,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;IAC/C,CAAC;IAEO,sBAAsB,CAAC,KAAkB;QAChD,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE;YACrC,IAAI,IAAI,CAAC,qBAAqB,EAAE,CAAC,GAAG,CAAC,KAAK,SAAS,EAAE;gBACpD,MAAM,CACL,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,GAAG,CAAC,EACnC,KAAK,CAAC,2DAA2D,CACjE,CAAC;gBACF,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,EAAE,CAAC;gBAClC,IAAI,IAAI,CAAC,qBAAqB,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE;oBAC5C,gEAAgE;oBAChE,OAAO,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,CAAC;iBACvC;aACD;SACD;IACF,CAAC;IAEM,aAAa,CACnB,QAAqB,EACrB,QAAqB,EACrB,GAAY,EACZ,gBAAyB,KAAK,EAC9B,WAA+B,kBAAkB,CAAC,IAAI;QAEtD,gDAAgD;QAChD,IAAI,CAAC,qBAAqB,KAA1B,IAAI,CAAC,qBAAqB,GAAK,SAAS,EAAU,EAAC;QAEnD,kEAAkE;QAClE,IAAI,aAAa,IAAI,QAAQ,KAAK,kBAAkB,CAAC,QAAQ,EAAE;YAC9D,IAAI,CAAC,sBAAsB,CAAC,QAAQ,CAAC,CAAC;SACtC;QAED,MAAM,eAAe,GAAG,CAAC,GAAW,EAAW,EAAE;YAChD,IACC,GAAG,KAAK,wBAAwB;gBAChC,GAAG,KAAK,uBAAuB;gBAC/B,IAAI,CAAC,qBAAqB,EAAE,CAAC,GAAG,CAAC,KAAK,SAAS,EAC9C;gBACD,OAAO,IAAI,CAAC;aACZ;YACD,OAAO,KAAK,CAAC;QACd,CAAC,CAAC;QAEF,MAAM,MAAM,GAAgB,EAAE,CAAC;QAE/B,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE;YACxC,IAAI,aAAa,EAAE;gBAClB,IAAI,GAAG,KAAK,wBAAwB,EAAE;oBACrC,IAAI,IAAI,CAAC,qBAAqB,EAAE,CAAC,GAAG,CAAC,KAAK,SAAS,EAAE;wBACpD,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;qBACpC;oBACD,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,EAAE,CAAC;iBAClC;qBAAM,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,EAAE;oBACjC,SAAS;iBACT;aACD;YAED,MAAM,aAAa,GAAQ,QAAQ,CAAC,GAAG,CAAC,CAAC;YACzC,wEAAwE;YACxE,MAAM,CAAC,GAAG,CAAC,GAAG,aAAa,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,aAAa,CAAC;YACjE,MAAM,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC;YAC/B,IAAI,QAAQ,KAAK,IAAI,EAAE;gBACtB,gEAAgE;gBAChE,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC;aACrB;iBAAM;gBACN,QAAQ,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC;aACzB;SACD;QAED,OAAO,MAAM,CAAC;IACf,CAAC;IAEM,MAAM,CACZ,QAAqB,EACrB,QAAiC,EACjC,UAA6B;QAE7B,IAAI,QAAQ,EAAE;YACb,mEAAmE;YACnE,QAAQ,KAAR,QAAQ,GAAK,SAAS,EAAO,EAAC;YAC9B,IAAI,CAAC,UAAU,EAAE;gBAChB,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;aACpD;YACD,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE;gBACxC,QAAQ,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC;aAC9B;YACD,gDAAgD;YAChD,UAAU,CAAC,qBAAqB,GAAG,SAAS,EAAU,CAAC;YACvD,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,qBAAsB,CAAC,EAAE;gBAC3D,UAAU,CAAC,qBAAqB,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,qBAAsB,CAAC,GAAG,CAAC,CAAC;aACzE;SACD;QACD,OAAO,QAAQ,CAAC;IACjB,CAAC;IAEM,oBAAoB;QAC1B,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,qBAAsB,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;IAC5D,CAAC;IAEM,kBAAkB,CAAC,GAAW;QACpC,OAAO,CAAC,IAAI,CAAC,qBAAqB,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;IACrD,CAAC;CACD","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 { assert } from \"@fluidframework/core-utils\";\nimport { UnassignedSequenceNumber, UniversalSequenceNumber } from \"./constants\";\nimport { IMergeTreeAnnotateMsg } from \"./ops\";\n// eslint-disable-next-line import/no-deprecated\nimport { createMap, MapLike, PropertySet } from \"./properties\";\n\n/**\n * @alpha\n */\nexport enum PropertiesRollback {\n\t/** Not in a rollback */\n\tNone,\n\n\t/** Rollback */\n\tRollback,\n}\n\n/**\n * @alpha\n */\nexport class PropertiesManager {\n\tprivate pendingKeyUpdateCount: MapLike<number> | undefined;\n\n\tpublic ackPendingProperties(annotateOp: IMergeTreeAnnotateMsg) {\n\t\tthis.decrementPendingCounts(annotateOp.props);\n\t}\n\n\tprivate decrementPendingCounts(props: PropertySet) {\n\t\tfor (const key of Object.keys(props)) {\n\t\t\tif (this.pendingKeyUpdateCount?.[key] !== undefined) {\n\t\t\t\tassert(\n\t\t\t\t\tthis.pendingKeyUpdateCount[key] > 0,\n\t\t\t\t\t0x05c /* \"Trying to update more annotate props than do exist!\" */,\n\t\t\t\t);\n\t\t\t\tthis.pendingKeyUpdateCount[key]--;\n\t\t\t\tif (this.pendingKeyUpdateCount?.[key] === 0) {\n\t\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n\t\t\t\t\tdelete this.pendingKeyUpdateCount[key];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic addProperties(\n\t\toldProps: PropertySet,\n\t\tnewProps: PropertySet,\n\t\tseq?: number,\n\t\tcollaborating: boolean = false,\n\t\trollback: PropertiesRollback = PropertiesRollback.None,\n\t): PropertySet {\n\t\t// eslint-disable-next-line import/no-deprecated\n\t\tthis.pendingKeyUpdateCount ??= createMap<number>();\n\n\t\t// Clean up counts for rolled back edits before modifying oldProps\n\t\tif (collaborating && rollback === PropertiesRollback.Rollback) {\n\t\t\tthis.decrementPendingCounts(newProps);\n\t\t}\n\n\t\tconst shouldModifyKey = (key: string): boolean => {\n\t\t\tif (\n\t\t\t\tseq === UnassignedSequenceNumber ||\n\t\t\t\tseq === UniversalSequenceNumber ||\n\t\t\t\tthis.pendingKeyUpdateCount?.[key] === undefined\n\t\t\t) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\treturn false;\n\t\t};\n\n\t\tconst deltas: PropertySet = {};\n\n\t\tfor (const key of Object.keys(newProps)) {\n\t\t\tif (collaborating) {\n\t\t\t\tif (seq === UnassignedSequenceNumber) {\n\t\t\t\t\tif (this.pendingKeyUpdateCount?.[key] === undefined) {\n\t\t\t\t\t\tthis.pendingKeyUpdateCount[key] = 0;\n\t\t\t\t\t}\n\t\t\t\t\tthis.pendingKeyUpdateCount[key]++;\n\t\t\t\t} else if (!shouldModifyKey(key)) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst previousValue: any = oldProps[key];\n\t\t\t// The delta should be null if undefined, as that's how we encode delete\n\t\t\tdeltas[key] = previousValue === undefined ? null : previousValue;\n\t\t\tconst newValue = newProps[key];\n\t\t\tif (newValue === null) {\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n\t\t\t\tdelete oldProps[key];\n\t\t\t} else {\n\t\t\t\toldProps[key] = newValue;\n\t\t\t}\n\t\t}\n\n\t\treturn deltas;\n\t}\n\n\tpublic copyTo(\n\t\toldProps: PropertySet,\n\t\tnewProps: PropertySet | undefined,\n\t\tnewManager: PropertiesManager,\n\t): PropertySet | undefined {\n\t\tif (oldProps) {\n\t\t\t// eslint-disable-next-line no-param-reassign, import/no-deprecated\n\t\t\tnewProps ??= createMap<any>();\n\t\t\tif (!newManager) {\n\t\t\t\tthrow new Error(\"Must provide new PropertyManager\");\n\t\t\t}\n\t\t\tfor (const key of Object.keys(oldProps)) {\n\t\t\t\tnewProps[key] = oldProps[key];\n\t\t\t}\n\t\t\t// eslint-disable-next-line import/no-deprecated\n\t\t\tnewManager.pendingKeyUpdateCount = createMap<number>();\n\t\t\tfor (const key of Object.keys(this.pendingKeyUpdateCount!)) {\n\t\t\t\tnewManager.pendingKeyUpdateCount[key] = this.pendingKeyUpdateCount![key];\n\t\t\t}\n\t\t}\n\t\treturn newProps;\n\t}\n\n\tpublic hasPendingProperties() {\n\t\treturn Object.keys(this.pendingKeyUpdateCount!).length > 0;\n\t}\n\n\tpublic hasPendingProperty(key: string): boolean {\n\t\treturn (this.pendingKeyUpdateCount?.[key] ?? 0) > 0;\n\t}\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"snapshotChunks.d.mts","sourceRoot":"","sources":["../src/snapshotChunks.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"snapshotChunks.mjs","sourceRoot":"","sources":["../src/snapshotChunks.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 { IFluidHandle } from \"@fluidframework/core-interfaces\";\nimport { IFluidSerializer } from \"@fluidframework/shared-object-base\";\nimport { ITelemetryLoggerExt } from \"@fluidframework/telemetry-utils\";\nimport { PropertySet } from \"./properties\";\nimport { SnapshotLegacy } from \"./snapshotlegacy\";\nimport { IJSONSegment } from \"./ops\";\nimport { SerializedAttributionCollection } from \"./attributionCollection\";\n\nexport interface VersionedMergeTreeChunk {\n\tversion: undefined | \"1\";\n}\n\nexport type JsonSegmentSpecs = IJSONSegment | IJSONSegmentWithMergeInfo;\n\nexport interface MergeTreeChunkLegacy extends VersionedMergeTreeChunk {\n\tversion: undefined;\n\tchunkStartSegmentIndex: number;\n\tchunkSegmentCount: number;\n\tchunkLengthChars: number;\n\ttotalLengthChars?: number;\n\ttotalSegmentCount?: number;\n\tchunkSequenceNumber?: number;\n\tchunkMinSequenceNumber?: number;\n\tsegmentTexts: JsonSegmentSpecs[];\n\theaderMetadata?: MergeTreeHeaderMetadata;\n\tattribution?: SerializedAttributionCollection;\n}\n\nexport interface MergeTreeHeaderChunkMetadata {\n\tid: string;\n}\n\nexport interface MergeTreeHeaderMetadata {\n\ttotalLength: number;\n\ttotalSegmentCount: number;\n\torderedChunkMetadata: MergeTreeHeaderChunkMetadata[];\n\tsequenceNumber: number;\n\tminSequenceNumber: number;\n}\n\nexport interface MergeTreeChunkV1 extends VersionedMergeTreeChunk {\n\tversion: \"1\";\n\tstartIndex: number;\n\tsegmentCount: number;\n\tlength: number;\n\tsegments: JsonSegmentSpecs[];\n\theaderMetadata: MergeTreeHeaderMetadata | undefined;\n\tattribution?: SerializedAttributionCollection;\n}\n\n/**\n * Used during snapshotting to record the metadata required to merge segments above the MSN\n * to the raw output of `ISegment.toJSONObject()`. (Note that IJSONSegment may be a raw\n * string or array, which is why this interface wraps the original IJSONSegment instead of\n * extending it.)\n */\nexport interface IJSONSegmentWithMergeInfo {\n\tjson: IJSONSegment;\n\tclient?: string;\n\tseq?: number;\n\tremovedClientIds?: string[];\n\tremovedSeq?: number;\n\tmovedClientIds?: string[];\n\tmovedSeq?: number;\n\tmovedSeqs?: number[];\n}\n\n/**\n * Returns true if the given 'spec' is an IJSONSegmentWithMergeInfo.\n */\nexport function hasMergeInfo(\n\tspec: IJSONSegment | IJSONSegmentWithMergeInfo,\n): spec is IJSONSegmentWithMergeInfo {\n\treturn !!spec && typeof spec === \"object\" && \"json\" in spec;\n}\n\nexport function serializeAsMinSupportedVersion(\n\tpath: string,\n\tchunk: VersionedMergeTreeChunk,\n\tlogger: ITelemetryLoggerExt,\n\toptions: PropertySet | undefined,\n\tserializer: IFluidSerializer,\n\tbind: IFluidHandle,\n) {\n\tlet targetChuck: MergeTreeChunkLegacy;\n\n\tif (chunk.version !== undefined) {\n\t\tlogger.send({\n\t\t\teventName: \"MergeTreeChunk:serializeAsMinSupportedVersion\",\n\t\t\tcategory: \"generic\",\n\t\t\tfromChunkVersion: chunk.version,\n\t\t\ttoChunkVersion: undefined,\n\t\t});\n\t}\n\n\tswitch (chunk.version) {\n\t\tcase undefined:\n\t\t\ttargetChuck = chunk as MergeTreeChunkLegacy;\n\t\t\ttargetChuck.headerMetadata = buildHeaderMetadataForLegacyChunk(\n\t\t\t\tpath,\n\t\t\t\ttargetChuck,\n\t\t\t\toptions,\n\t\t\t);\n\t\t\tbreak;\n\n\t\tcase \"1\":\n\t\t\tconst chunkV1 = chunk as MergeTreeChunkV1;\n\t\t\tconst headerMetadata =\n\t\t\t\tpath === SnapshotLegacy.header ? chunkV1.headerMetadata : undefined;\n\t\t\ttargetChuck = {\n\t\t\t\tversion: undefined,\n\t\t\t\tchunkStartSegmentIndex: chunkV1.startIndex,\n\t\t\t\tchunkLengthChars: chunkV1.length,\n\t\t\t\tchunkSegmentCount: chunkV1.segmentCount,\n\t\t\t\tsegmentTexts: chunkV1.segments,\n\t\t\t\ttotalLengthChars: headerMetadata?.totalLength,\n\t\t\t\ttotalSegmentCount: headerMetadata?.totalSegmentCount,\n\t\t\t\tchunkSequenceNumber: headerMetadata?.sequenceNumber,\n\t\t\t\tchunkMinSequenceNumber: headerMetadata?.minSequenceNumber,\n\t\t\t\theaderMetadata,\n\t\t\t};\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tthrow new Error(`Unsupported chunk path: ${path} version: ${chunk.version}`);\n\t}\n\treturn serializer.stringify(targetChuck, bind);\n}\n\nexport function serializeAsMaxSupportedVersion(\n\tpath: string,\n\tchunk: VersionedMergeTreeChunk,\n\tlogger: ITelemetryLoggerExt,\n\toptions: PropertySet | undefined,\n\tserializer: IFluidSerializer,\n\tbind: IFluidHandle,\n) {\n\tconst targetChuck = toLatestVersion(path, chunk, logger, options);\n\treturn serializer.stringify(targetChuck, bind);\n}\n\nexport function toLatestVersion(\n\tpath: string,\n\tchunk: VersionedMergeTreeChunk,\n\tlogger: ITelemetryLoggerExt,\n\toptions: PropertySet | undefined,\n): MergeTreeChunkV1 {\n\tswitch (chunk.version) {\n\t\tcase undefined: {\n\t\t\tconst chunkLegacy = chunk as MergeTreeChunkLegacy;\n\t\t\treturn {\n\t\t\t\tversion: \"1\",\n\t\t\t\tlength: chunkLegacy.chunkLengthChars,\n\t\t\t\tsegmentCount: chunkLegacy.chunkSegmentCount,\n\t\t\t\theaderMetadata: buildHeaderMetadataForLegacyChunk(path, chunkLegacy, options),\n\t\t\t\tsegments: chunkLegacy.segmentTexts,\n\t\t\t\tstartIndex: chunkLegacy.chunkStartSegmentIndex,\n\t\t\t\tattribution: chunkLegacy.attribution,\n\t\t\t};\n\t\t}\n\t\tcase \"1\":\n\t\t\treturn chunk as MergeTreeChunkV1;\n\n\t\tdefault:\n\t\t\tthrow new Error(`Unsupported chunk path: ${path} version: ${chunk.version}`);\n\t}\n}\n\nfunction buildHeaderMetadataForLegacyChunk(\n\tpath: string,\n\tchunk: MergeTreeChunkLegacy,\n\toptions: PropertySet | undefined,\n): MergeTreeHeaderMetadata | undefined {\n\tif (path === SnapshotLegacy.header) {\n\t\tif (chunk.headerMetadata !== undefined) {\n\t\t\treturn chunk.headerMetadata;\n\t\t}\n\t\tconst chunkIds: MergeTreeHeaderChunkMetadata[] = [{ id: SnapshotLegacy.header }];\n\t\tif (chunk.chunkLengthChars < chunk.totalLengthChars!) {\n\t\t\tchunkIds.push({ id: SnapshotLegacy.body });\n\t\t}\n\t\treturn {\n\t\t\torderedChunkMetadata: chunkIds,\n\t\t\tminSequenceNumber: chunk.chunkMinSequenceNumber!,\n\t\t\tsequenceNumber: chunk.chunkSequenceNumber!,\n\t\t\ttotalLength: chunk.totalLengthChars!,\n\t\t\ttotalSegmentCount: chunk.totalSegmentCount!,\n\t\t};\n\t}\n\treturn undefined;\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"snapshotLoader.d.mts","sourceRoot":"","sources":["../src/snapshotLoader.ts"],"names":[],"mappings":"AAAA;;;GAGG;OAMI,EAAE,gBAAgB,EAAE,MAAM,oCAAoC;OAC9D,EAEN,mBAAmB,EAEnB,MAAM,iCAAiC;OACjC,EAAE,yBAAyB,EAAE,MAAM,sCAAsC;OACzE,EACN,sBAAsB,EACtB,sBAAsB,EACtB,MAAM,uCAAuC;OAGvC,EAAE,MAAM,EAAE;OAOV,EAAE,SAAS,EAAE;AAEpB,qBAAa,cAAc;IAIzB,OAAO,CAAC,QAAQ,CAAC,OAAO;IAExB,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAE1B,OAAO,CAAC,QAAQ,CAAC,UAAU;IAR5B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAsB;gBAG3B,OAAO,EAAE,sBAAsB,EAE/B,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,SAAS,EACrC,MAAM,EAAE,mBAAmB,EACV,UAAU,EAAE,gBAAgB;IAKjC,UAAU,CACtB,QAAQ,EAAE,sBAAsB,GAC9B,OAAO,CAAC;QAAE,WAAW,EAAE,OAAO,CAAC,yBAAyB,EAAE,CAAC,CAAA;KAAE,CAAC;YAiBnD,qBAAqB;IA4BnC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAsD5B;IAEF,OAAO,CAAC,UAAU;YAsCJ,QAAQ;IA0FtB,OAAO,CAAC,kBAAkB;IAwB1B;;;;;OAKG;YACW,cAAc;CAK5B"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"snapshotLoader.mjs","sourceRoot":"","sources":["../src/snapshotLoader.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 { bufferToString } from \"@fluid-internal/client-utils\";\nimport { assert } from \"@fluidframework/core-utils\";\nimport { IFluidSerializer } from \"@fluidframework/shared-object-base\";\nimport {\n\tcreateChildLogger,\n\tITelemetryLoggerExt,\n\tUsageError,\n} from \"@fluidframework/telemetry-utils\";\nimport { ISequencedDocumentMessage } from \"@fluidframework/protocol-definitions\";\nimport {\n\tIFluidDataStoreRuntime,\n\tIChannelStorageService,\n} from \"@fluidframework/datastore-definitions\";\nimport { AttachState } from \"@fluidframework/container-definitions\";\n// eslint-disable-next-line import/no-deprecated\nimport { Client } from \"./client\";\nimport { NonCollabClient, UniversalSequenceNumber } from \"./constants\";\nimport { ISegment } from \"./mergeTreeNodes\";\nimport { IJSONSegment } from \"./ops\";\nimport { IJSONSegmentWithMergeInfo, hasMergeInfo, MergeTreeChunkV1 } from \"./snapshotChunks\";\nimport { SnapshotV1 } from \"./snapshotV1\";\nimport { SnapshotLegacy } from \"./snapshotlegacy\";\nimport { MergeTree } from \"./mergeTree\";\n\nexport class SnapshotLoader {\n\tprivate readonly logger: ITelemetryLoggerExt;\n\n\tconstructor(\n\t\tprivate readonly runtime: IFluidDataStoreRuntime,\n\t\t// eslint-disable-next-line import/no-deprecated\n\t\tprivate readonly client: Client,\n\t\tprivate readonly mergeTree: MergeTree,\n\t\tlogger: ITelemetryLoggerExt,\n\t\tprivate readonly serializer: IFluidSerializer,\n\t) {\n\t\tthis.logger = createChildLogger({ logger, namespace: \"SnapshotLoader\" });\n\t}\n\n\tpublic async initialize(\n\t\tservices: IChannelStorageService,\n\t): Promise<{ catchupOpsP: Promise<ISequencedDocumentMessage[]> }> {\n\t\tconst headerLoadedP = services.readBlob(SnapshotLegacy.header).then((header) => {\n\t\t\tassert(!!header, 0x05f /* \"Missing blob header on legacy snapshot!\" */);\n\t\t\treturn this.loadHeader(bufferToString(header, \"utf8\"));\n\t\t});\n\n\t\tconst catchupOpsP = this.loadBodyAndCatchupOps(headerLoadedP, services);\n\n\t\tcatchupOpsP.catch((err) =>\n\t\t\tthis.logger.sendErrorEvent({ eventName: \"CatchupOpsLoadFailure\" }, err),\n\t\t);\n\n\t\tawait headerLoadedP;\n\n\t\treturn { catchupOpsP };\n\t}\n\n\tprivate async loadBodyAndCatchupOps(\n\t\theaderChunkP: Promise<MergeTreeChunkV1>,\n\t\tservices: IChannelStorageService,\n\t): Promise<ISequencedDocumentMessage[]> {\n\t\tconst blobsP = services.list(\"\");\n\t\tconst headerChunk = await headerChunkP;\n\n\t\t// TODO we shouldn't need to wait on the body being complete to finish initialization.\n\t\t// To fully support this we need to be able to process inbound ops for pending segments.\n\t\tawait this.loadBody(headerChunk, services);\n\n\t\tconst blobs = await blobsP;\n\t\tif (blobs.length === headerChunk.headerMetadata!.orderedChunkMetadata.length + 1) {\n\t\t\theaderChunk.headerMetadata!.orderedChunkMetadata.forEach((md) =>\n\t\t\t\tblobs.splice(blobs.indexOf(md.id), 1),\n\t\t\t);\n\t\t\tassert(blobs.length === 1, 0x060 /* There should be only one blob with catch up ops */);\n\n\t\t\t// TODO: The 'Snapshot.catchupOps' tree entry is purely for backwards compatibility.\n\t\t\t// (See https://github.com/microsoft/FluidFramework/issues/84)\n\n\t\t\treturn this.loadCatchupOps(services.readBlob(blobs[0]));\n\t\t} else if (blobs.length !== headerChunk.headerMetadata!.orderedChunkMetadata.length) {\n\t\t\tthrow new Error(\"Unexpected blobs in snapshot\");\n\t\t}\n\t\treturn [];\n\t}\n\n\tprivate readonly specToSegment = (spec: IJSONSegment | IJSONSegmentWithMergeInfo) => {\n\t\tlet seg: ISegment;\n\n\t\tif (hasMergeInfo(spec)) {\n\t\t\tseg = this.client.specToSegment(spec.json);\n\n\t\t\t// `specToSegment()` initializes `seg` with the LocalClientId. Overwrite this with\n\t\t\t// the `spec` client (if specified). Otherwise overwrite with `NonCollabClient`.\n\t\t\tseg.clientId =\n\t\t\t\tspec.client !== undefined\n\t\t\t\t\t? this.client.getOrAddShortClientId(spec.client)\n\t\t\t\t\t: NonCollabClient;\n\n\t\t\tseg.seq = spec.seq ?? UniversalSequenceNumber;\n\n\t\t\tif (spec.removedSeq !== undefined) {\n\t\t\t\tseg.removedSeq = spec.removedSeq;\n\t\t\t}\n\t\t\tif (spec.movedSeq !== undefined) {\n\t\t\t\tseg.movedSeq = spec.movedSeq;\n\t\t\t}\n\t\t\tif (spec.movedSeqs !== undefined) {\n\t\t\t\tseg.movedSeqs = spec.movedSeqs;\n\t\t\t}\n\t\t\t// this format had a bug where it didn't store all the overlap clients\n\t\t\t// this is for back compat, so we change the singular id to an array\n\t\t\t// this will only cause problems if there is an overlapping delete\n\t\t\t// spanning the snapshot, which should be rare\n\t\t\tconst specAsBuggyFormat: IJSONSegmentWithMergeInfo & { removedClient?: string } = spec;\n\t\t\tif (specAsBuggyFormat.removedClient !== undefined) {\n\t\t\t\tseg.removedClientIds = [\n\t\t\t\t\tthis.client.getOrAddShortClientId(specAsBuggyFormat.removedClient),\n\t\t\t\t];\n\t\t\t}\n\t\t\tif (spec.removedClientIds !== undefined) {\n\t\t\t\tseg.removedClientIds = spec.removedClientIds?.map((sid) =>\n\t\t\t\t\tthis.client.getOrAddShortClientId(sid),\n\t\t\t\t);\n\t\t\t}\n\t\t\tif (spec.movedClientIds !== undefined) {\n\t\t\t\tseg.movedClientIds = spec.movedClientIds?.map((sid) =>\n\t\t\t\t\tthis.client.getOrAddShortClientId(sid),\n\t\t\t\t);\n\t\t\t}\n\t\t} else {\n\t\t\tseg = this.client.specToSegment(spec);\n\t\t\tseg.seq = UniversalSequenceNumber;\n\n\t\t\t// `specToSegment()` initializes `seg` with the LocalClientId. We must overwrite this with\n\t\t\t// `NonCollabClient`.\n\t\t\tseg.clientId = NonCollabClient;\n\t\t}\n\n\t\treturn seg;\n\t};\n\n\tprivate loadHeader(header: string): MergeTreeChunkV1 {\n\t\tconst chunk = SnapshotV1.processChunk(\n\t\t\tSnapshotLegacy.header,\n\t\t\theader,\n\t\t\tthis.logger,\n\t\t\tthis.mergeTree.options,\n\t\t\tthis.serializer,\n\t\t);\n\t\tconst segs = chunk.segments.map(this.specToSegment);\n\t\tthis.extractAttribution(segs, chunk);\n\n\t\tthis.mergeTree.reloadFromSegments(segs);\n\n\t\tif (chunk.headerMetadata === undefined) {\n\t\t\tthrow new Error(\"header metadata not available\");\n\t\t}\n\t\t// If we load a detached container from snapshot, then we don't supply a default clientId\n\t\t// because we don't want to start collaboration.\n\t\tif (this.runtime.attachState !== AttachState.Detached) {\n\t\t\t// specify a default client id, \"snapshot\" here as we\n\t\t\t// should enter collaboration/op sending mode if we load\n\t\t\t// a snapshot in any case (summary or attach message)\n\t\t\t// once we get a client id this will be called with that\n\t\t\t// clientId in the connected event\n\t\t\tthis.client.startOrUpdateCollaboration(\n\t\t\t\tthis.runtime.clientId ?? \"snapshot\",\n\n\t\t\t\t// TODO: Make 'minSeq' non-optional once the new snapshot format becomes the default?\n\t\t\t\t// (See https://github.com/microsoft/FluidFramework/issues/84)\n\t\t\t\t/* minSeq: */ chunk.headerMetadata.minSequenceNumber ??\n\t\t\t\t\tchunk.headerMetadata.sequenceNumber,\n\t\t\t\t/* currentSeq: */ chunk.headerMetadata.sequenceNumber,\n\t\t\t);\n\t\t}\n\n\t\treturn chunk;\n\t}\n\n\tprivate async loadBody(\n\t\tchunk1: MergeTreeChunkV1,\n\t\tservices: IChannelStorageService,\n\t): Promise<void> {\n\t\tconst headerMetadata = chunk1.headerMetadata!;\n\t\tassert(chunk1.length <= headerMetadata.totalLength, 0x061 /* \"Mismatch in totalLength\" */);\n\n\t\tassert(\n\t\t\tchunk1.segmentCount <= headerMetadata.totalSegmentCount,\n\t\t\t0x062 /* \"Mismatch in totalSegmentCount\" */,\n\t\t);\n\n\t\tif (chunk1.segmentCount === headerMetadata.totalSegmentCount) {\n\t\t\treturn;\n\t\t}\n\n\t\tlet chunksWithAttribution = chunk1.attribution !== undefined ? 1 : 0;\n\t\tconst segs: ISegment[] = [];\n\t\tlet lengthSofar = chunk1.length;\n\t\tfor (\n\t\t\tlet chunkIndex = 1;\n\t\t\tchunkIndex < headerMetadata.orderedChunkMetadata.length;\n\t\t\tchunkIndex++\n\t\t) {\n\t\t\tconst chunk = await SnapshotV1.loadChunk(\n\t\t\t\tservices,\n\t\t\t\theaderMetadata.orderedChunkMetadata[chunkIndex].id,\n\t\t\t\tthis.logger,\n\t\t\t\tthis.mergeTree.options,\n\t\t\t\tthis.serializer,\n\t\t\t);\n\t\t\tlengthSofar += chunk.length;\n\t\t\t// Deserialize each chunk segment and append it to the end of the MergeTree.\n\t\t\tconst newSegs = chunk.segments.map(this.specToSegment);\n\t\t\tthis.extractAttribution(newSegs, chunk);\n\t\t\tchunksWithAttribution += chunk.attribution !== undefined ? 1 : 0;\n\t\t\tsegs.push(...newSegs);\n\t\t}\n\n\t\tassert(\n\t\t\tchunksWithAttribution === 0 ||\n\t\t\t\tchunksWithAttribution === headerMetadata.orderedChunkMetadata.length,\n\t\t\t0x4c0 /* all or no chunks should have attribution information */,\n\t\t);\n\n\t\tassert(lengthSofar === headerMetadata.totalLength, 0x063 /* \"Mismatch in totalLength\" */);\n\n\t\tassert(\n\t\t\tchunk1.segmentCount + segs.length === headerMetadata.totalSegmentCount,\n\t\t\t0x064 /* \"Mismatch in totalSegmentCount\" */,\n\t\t);\n\n\t\t// Helper to insert segments at the end of the MergeTree.\n\t\tconst mergeTree = this.mergeTree;\n\t\tconst append = (segments: ISegment[], cli: number, seq: number) => {\n\t\t\tmergeTree.insertSegments(\n\t\t\t\tmergeTree.root.cachedLength ?? 0,\n\t\t\t\tsegments,\n\t\t\t\t/* refSeq: */ UniversalSequenceNumber,\n\t\t\t\tcli,\n\t\t\t\tseq,\n\t\t\t\tundefined,\n\t\t\t);\n\t\t};\n\n\t\t// Helpers to batch-insert segments that are below the min seq\n\t\tconst batch: ISegment[] = [];\n\t\tconst flushBatch = () => {\n\t\t\tif (batch.length > 0) {\n\t\t\t\tappend(batch, NonCollabClient, UniversalSequenceNumber);\n\t\t\t}\n\t\t};\n\n\t\tfor (const seg of segs) {\n\t\t\tconst cli = seg.clientId;\n\t\t\tconst seq = seg.seq;\n\n\t\t\t// If the segment can be batch inserted, add it to the 'batch' array. Otherwise, flush\n\t\t\t// any batched segments and then insert the current segment individually.\n\t\t\tif (cli === NonCollabClient && seq === UniversalSequenceNumber) {\n\t\t\t\tbatch.push(seg);\n\t\t\t} else {\n\t\t\t\tflushBatch();\n\t\t\t\tappend([seg], cli, seq!);\n\t\t\t}\n\t\t}\n\n\t\tflushBatch();\n\t}\n\n\tprivate extractAttribution(segments: ISegment[], chunk: MergeTreeChunkV1): void {\n\t\tthis.mergeTree.options ??= {};\n\t\tthis.mergeTree.options.attribution ??= {};\n\t\tif (chunk.attribution) {\n\t\t\tconst { attributionPolicy } = this.mergeTree;\n\t\t\tif (attributionPolicy === undefined) {\n\t\t\t\tthrow new UsageError(\n\t\t\t\t\t\"Attribution policy must be provided when loading a document with attribution information.\",\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst { isAttached, attach, serializer } = attributionPolicy;\n\t\t\tif (!isAttached) {\n\t\t\t\tattach(this.client);\n\t\t\t}\n\t\t\tserializer.populateAttributionCollections(segments, chunk.attribution);\n\t\t} else {\n\t\t\tconst { attributionPolicy } = this.mergeTree;\n\t\t\tif (attributionPolicy?.isAttached) {\n\t\t\t\tattributionPolicy?.detach();\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * If loading from a snapshot, get the catchup messages.\n\t * @param rawMessages - The messages in original encoding\n\t * @returns The decoded messages, but handles aren't parsed. Matches the format that will be passed in\n\t * SharedObject.processCore.\n\t */\n\tprivate async loadCatchupOps(\n\t\trawMessages: Promise<ArrayBufferLike>,\n\t): Promise<ISequencedDocumentMessage[]> {\n\t\treturn JSON.parse(bufferToString(await rawMessages, \"utf8\")) as ISequencedDocumentMessage[];\n\t}\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"snapshotV1.d.mts","sourceRoot":"","sources":["../src/snapshotV1.ts"],"names":[],"mappings":"AAAA;;;GAGG;OAEI,EAAE,mBAAmB,EAAqB,MAAM,iCAAiC;OACjF,EAAE,YAAY,EAAE,MAAM,iCAAiC;OACvD,EAAE,gBAAgB,EAAE,MAAM,oCAAoC;OAG9D,EAAE,sBAAsB,EAAE,MAAM,uCAAuC;OACvE,EAAkB,qBAAqB,EAAE,MAAM,qCAAqC;OAIpF,EAAmB,WAAW,EAAE;OAChC,EAEN,gBAAgB,EAEhB,gBAAgB,EAGhB;OAEM,EAAE,SAAS,EAAE;AAIpB,qBAAa,UAAU;IAiBd,SAAS,EAAE,SAAS;IAE3B,OAAO,CAAC,QAAQ,CAAC,eAAe;IACzB,QAAQ,CAAC;IACT,YAAY,CAAC,SAAQ,IAAI;IAdjC,gBAAuB,SAAS,EAAE,MAAM,CAAS;IAEjD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA0B;IACjD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAqB;IAC9C,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAW;IAC1C,OAAO,CAAC,QAAQ,CAAC,sBAAsB,CAA2C;IAClF,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAsB;IAC7C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;gBAG3B,SAAS,EAAE,SAAS,EAC3B,MAAM,EAAE,mBAAmB,EACV,eAAe,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,MAAM,EACjD,QAAQ,CAAC,oBAAQ,EACjB,YAAY,CAAC,SAAQ,IAAI,aAAA;IAmBjC,OAAO,CAAC,gBAAgB;IAgDxB;;;OAGG;IACH,IAAI,CAAC,UAAU,EAAE,gBAAgB,EAAE,IAAI,EAAE,YAAY,GAAG,qBAAqB;IA0D7E,WAAW;WA+JS,SAAS,CAC5B,OAAO,EAAE,sBAAsB,EAC/B,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,mBAAmB,EAC3B,OAAO,EAAE,WAAW,GAAG,SAAS,EAChC,UAAU,CAAC,EAAE,gBAAgB,GAC3B,OAAO,CAAC,gBAAgB,CAAC;WAMd,YAAY,CACzB,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,mBAAmB,EAC3B,OAAO,EAAE,WAAW,GAAG,SAAS,EAChC,UAAU,CAAC,EAAE,gBAAgB,GAC3B,gBAAgB;CAInB"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"snapshotV1.mjs","sourceRoot":"","sources":["../src/snapshotV1.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 { ITelemetryLoggerExt, createChildLogger } from \"@fluidframework/telemetry-utils\";\nimport { IFluidHandle } from \"@fluidframework/core-interfaces\";\nimport { IFluidSerializer } from \"@fluidframework/shared-object-base\";\nimport { assert } from \"@fluidframework/core-utils\";\nimport { bufferToString } from \"@fluid-internal/client-utils\";\nimport { IChannelStorageService } from \"@fluidframework/datastore-definitions\";\nimport { AttributionKey, ISummaryTreeWithStats } from \"@fluidframework/runtime-definitions\";\nimport { SummaryTreeBuilder } from \"@fluidframework/runtime-utils\";\nimport { UnassignedSequenceNumber } from \"./constants\";\nimport { ISegment } from \"./mergeTreeNodes\";\nimport { matchProperties, PropertySet } from \"./properties\";\nimport {\n\tIJSONSegmentWithMergeInfo,\n\tJsonSegmentSpecs,\n\tMergeTreeHeaderMetadata,\n\tMergeTreeChunkV1,\n\ttoLatestVersion,\n\tserializeAsMaxSupportedVersion,\n} from \"./snapshotChunks\";\nimport { SnapshotLegacy } from \"./snapshotlegacy\";\nimport { MergeTree } from \"./mergeTree\";\nimport { walkAllChildSegments } from \"./mergeTreeNodeWalk\";\nimport { IAttributionCollection } from \"./attributionCollection\";\n\nexport class SnapshotV1 {\n\t// Split snapshot into two entries - headers (small) and body (overflow) for faster loading initial content\n\t// Please note that this number has no direct relationship to anything other than size of raw text (characters).\n\t// As we produce json for the blob (and then send over the wire compressed), this number\n\t// is really hard to correlate with any actual metric that matters (like bytes over the wire).\n\t// For test with small number of chunks it would be closer to blob size,\n\t// for very chunky text, blob size can easily be 4x-8x of that number.\n\tpublic static readonly chunkSize: number = 10000;\n\n\tprivate readonly header: MergeTreeHeaderMetadata;\n\tprivate readonly segments: JsonSegmentSpecs[];\n\tprivate readonly segmentLengths: number[];\n\tprivate readonly attributionCollections: IAttributionCollection<AttributionKey>[];\n\tprivate readonly logger: ITelemetryLoggerExt;\n\tprivate readonly chunkSize: number;\n\n\tconstructor(\n\t\tpublic mergeTree: MergeTree,\n\t\tlogger: ITelemetryLoggerExt,\n\t\tprivate readonly getLongClientId: (id: number) => string,\n\t\tpublic filename?: string,\n\t\tpublic onCompletion?: () => void,\n\t) {\n\t\tthis.logger = createChildLogger({ logger, namespace: \"Snapshot\" });\n\t\tthis.chunkSize = mergeTree?.options?.mergeTreeSnapshotChunkSize ?? SnapshotV1.chunkSize;\n\n\t\tconst { currentSeq, minSeq } = mergeTree.collabWindow;\n\t\tthis.header = {\n\t\t\tminSequenceNumber: minSeq,\n\t\t\tsequenceNumber: currentSeq,\n\t\t\torderedChunkMetadata: [],\n\t\t\ttotalLength: 0,\n\t\t\ttotalSegmentCount: 0,\n\t\t};\n\n\t\tthis.segments = [];\n\t\tthis.segmentLengths = [];\n\t\tthis.attributionCollections = [];\n\t}\n\n\tprivate getSeqLengthSegs(\n\t\tallSegments: JsonSegmentSpecs[],\n\t\tallLengths: number[],\n\t\tattributionCollections: IAttributionCollection<AttributionKey>[],\n\t\tapproxSequenceLength: number,\n\t\tstartIndex = 0,\n\t): MergeTreeChunkV1 {\n\t\tconst segments: JsonSegmentSpecs[] = [];\n\t\tconst collections: {\n\t\t\tattribution: IAttributionCollection<AttributionKey>;\n\t\t\tcachedLength: number;\n\t\t}[] = [];\n\t\tlet length = 0;\n\t\tlet segmentCount = 0;\n\t\tlet hasAttribution = false;\n\t\twhile (length < approxSequenceLength && startIndex + segmentCount < allSegments.length) {\n\t\t\tconst pseg = allSegments[startIndex + segmentCount];\n\t\t\tsegments.push(pseg);\n\t\t\tlength += allLengths[startIndex + segmentCount];\n\t\t\tif (attributionCollections[startIndex + segmentCount]) {\n\t\t\t\thasAttribution = true;\n\t\t\t\tcollections.push({\n\t\t\t\t\tattribution: attributionCollections[startIndex + segmentCount],\n\t\t\t\t\tcachedLength: allLengths[startIndex + segmentCount],\n\t\t\t\t});\n\t\t\t}\n\t\t\tsegmentCount++;\n\t\t}\n\n\t\tconst attributionSerializer = this.mergeTree.attributionPolicy?.serializer;\n\t\tassert(\n\t\t\t!hasAttribution || attributionSerializer !== undefined,\n\t\t\t0x55a /* attribution serializer must be provided when there are segments with attribution. */,\n\t\t);\n\n\t\treturn {\n\t\t\tversion: \"1\",\n\t\t\tsegmentCount,\n\t\t\tlength,\n\t\t\tsegments,\n\t\t\tstartIndex,\n\t\t\theaderMetadata: undefined,\n\t\t\tattribution: hasAttribution\n\t\t\t\t? attributionSerializer?.serializeAttributionCollections(collections)\n\t\t\t\t: undefined,\n\t\t};\n\t}\n\n\t/**\n\t * Emits the snapshot to an ISummarizeResult. If provided the optional IFluidSerializer will be used when\n\t * serializing the summary data rather than JSON.stringify.\n\t */\n\temit(serializer: IFluidSerializer, bind: IFluidHandle): ISummaryTreeWithStats {\n\t\tconst chunks: MergeTreeChunkV1[] = [];\n\t\tthis.header.totalSegmentCount = 0;\n\t\tthis.header.totalLength = 0;\n\t\tdo {\n\t\t\tconst chunk = this.getSeqLengthSegs(\n\t\t\t\tthis.segments,\n\t\t\t\tthis.segmentLengths,\n\t\t\t\tthis.attributionCollections,\n\t\t\t\tthis.chunkSize,\n\t\t\t\tthis.header.totalSegmentCount,\n\t\t\t);\n\t\t\tchunks.push(chunk);\n\t\t\tthis.header.totalSegmentCount += chunk.segmentCount;\n\t\t\tthis.header.totalLength += chunk.length;\n\t\t} while (this.header.totalSegmentCount < this.segments.length);\n\n\t\t// The do while loop should have added at least one chunk\n\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\tconst headerChunk = chunks.shift()!;\n\t\theaderChunk.headerMetadata = this.header;\n\t\theaderChunk.headerMetadata.orderedChunkMetadata = [{ id: SnapshotLegacy.header }];\n\t\tconst blobs: [key: string, content: string][] = [];\n\t\tchunks.forEach((chunk, index) => {\n\t\t\tconst id = `${SnapshotLegacy.body}_${index}`;\n\t\t\tthis.header.orderedChunkMetadata.push({ id });\n\t\t\tblobs.push([\n\t\t\t\tid,\n\t\t\t\tserializeAsMaxSupportedVersion(\n\t\t\t\t\tid,\n\t\t\t\t\tchunk,\n\t\t\t\t\tthis.logger,\n\t\t\t\t\tthis.mergeTree.options,\n\t\t\t\t\tserializer,\n\t\t\t\t\tbind,\n\t\t\t\t),\n\t\t\t]);\n\t\t});\n\n\t\tconst builder = new SummaryTreeBuilder();\n\t\tbuilder.addBlob(\n\t\t\tSnapshotLegacy.header,\n\t\t\tserializeAsMaxSupportedVersion(\n\t\t\t\tSnapshotLegacy.header,\n\t\t\t\theaderChunk,\n\t\t\t\tthis.logger,\n\t\t\t\tthis.mergeTree.options,\n\t\t\t\tserializer,\n\t\t\t\tbind,\n\t\t\t),\n\t\t);\n\t\tblobs.forEach((value) => {\n\t\t\tbuilder.addBlob(value[0], value[1]);\n\t\t});\n\n\t\treturn builder.getSummaryTree();\n\t}\n\n\textractSync() {\n\t\tconst mergeTree = this.mergeTree;\n\t\tconst minSeq = this.header.minSequenceNumber;\n\n\t\t// Helper to add the given `MergeTreeChunkV0SegmentSpec` to the snapshot.\n\t\tconst pushSegRaw = (\n\t\t\tjson: JsonSegmentSpecs,\n\t\t\tlength: number,\n\t\t\tattribution: IAttributionCollection<AttributionKey> | undefined,\n\t\t) => {\n\t\t\tthis.segments.push(json);\n\t\t\tthis.segmentLengths.push(length);\n\t\t\tif (attribution) {\n\t\t\t\tthis.attributionCollections.push(attribution);\n\t\t\t}\n\t\t};\n\n\t\t// Helper to serialize the given `segment` and add it to the snapshot (if a segment is provided).\n\t\tconst pushSeg = (segment?: ISegment) => {\n\t\t\tif (segment) {\n\t\t\t\tif (\n\t\t\t\t\tsegment.properties !== undefined &&\n\t\t\t\t\tObject.keys(segment.properties).length === 0\n\t\t\t\t) {\n\t\t\t\t\tsegment.properties = undefined;\n\t\t\t\t\tsegment.propertyManager = undefined;\n\t\t\t\t}\n\t\t\t\tpushSegRaw(segment.toJSONObject(), segment.cachedLength, segment.attribution);\n\t\t\t}\n\t\t};\n\n\t\tlet prev: ISegment | undefined;\n\t\tconst extractSegment = (segment: ISegment) => {\n\t\t\t// Elide segments that do not need to be included in the snapshot. A segment may be elided if\n\t\t\t// either condition is true:\n\t\t\t// a) The segment has not yet been ACKed. We do not need to snapshot unACKed segments because\n\t\t\t// there is a pending insert op that will deliver the segment on reconnection.\n\t\t\t// b) The segment was removed at or below the MSN. Pending ops can no longer reference this\n\t\t\t// segment, and therefore we can discard it.\n\t\t\tif (\n\t\t\t\tsegment.seq === UnassignedSequenceNumber ||\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\t\t\tsegment.removedSeq! <= minSeq ||\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\t\t\tsegment.movedSeq! <= minSeq\n\t\t\t) {\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\t// Next determine if the snapshot needs to preserve information required for merging the segment\n\t\t\t// (seq, client, etc.) This information is only needed if the segment is above the MSN (and doesn't\n\t\t\t// have a pending remove.)\n\t\t\tif (\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\t\t\tsegment.seq! <= minSeq && // Segment is below the MSN, and...\n\t\t\t\t(segment.removedSeq === undefined || // .. Segment has not been removed, or...\n\t\t\t\t\tsegment.removedSeq === UnassignedSequenceNumber) && // .. Removal op to be delivered on reconnect\n\t\t\t\t(segment.movedSeq === undefined || segment.movedSeq === UnassignedSequenceNumber)\n\t\t\t) {\n\t\t\t\t// This segment is below the MSN, which means that future ops will not reference it. Attempt to\n\t\t\t\t// coalesce the new segment with the previous (if any).\n\t\t\t\tif (!prev) {\n\t\t\t\t\t// We do not have a previous candidate for coalescing. Make the current segment the new candidate.\n\t\t\t\t\tprev = segment;\n\t\t\t\t} else if (\n\t\t\t\t\tprev.canAppend(segment) &&\n\t\t\t\t\tmatchProperties(prev.properties, segment.properties)\n\t\t\t\t) {\n\t\t\t\t\t// We have a compatible pair. Replace `prev` with the coalesced segment. Clone to avoid\n\t\t\t\t\t// modifying the segment instances currently in the MergeTree.\n\t\t\t\t\tprev = prev.clone();\n\t\t\t\t\tprev.append(segment.clone());\n\t\t\t\t} else {\n\t\t\t\t\t// The segment pair could not be coalesced. Record the `prev` segment in the snapshot\n\t\t\t\t\t// and make the current segment the new candidate for coalescing.\n\t\t\t\t\tpushSeg(prev);\n\t\t\t\t\tprev = segment;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// This segment needs to preserve its metadata as it may be referenced by future ops. It's ineligible\n\t\t\t\t// for coalescing, so emit the 'prev' segment now (if any).\n\t\t\t\tpushSeg(prev);\n\t\t\t\tprev = undefined;\n\n\t\t\t\tif (\n\t\t\t\t\tsegment.properties !== undefined &&\n\t\t\t\t\tObject.keys(segment.properties).length === 0\n\t\t\t\t) {\n\t\t\t\t\tsegment.properties = undefined;\n\t\t\t\t\tsegment.propertyManager = undefined;\n\t\t\t\t}\n\t\t\t\tconst raw: IJSONSegmentWithMergeInfo & { removedClient?: string } = {\n\t\t\t\t\tjson: segment.toJSONObject(),\n\t\t\t\t};\n\t\t\t\t// If the segment insertion is above the MSN, record the insertion merge info.\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\t\t\tif (segment.seq! > minSeq) {\n\t\t\t\t\traw.seq = segment.seq;\n\t\t\t\t\traw.client = this.getLongClientId(segment.clientId);\n\t\t\t\t}\n\t\t\t\t// We have already dispensed with removed segments below the MSN and removed segments with unassigned\n\t\t\t\t// sequence numbers. Any remaining removal info should be preserved.\n\t\t\t\tif (segment.removedSeq !== undefined) {\n\t\t\t\t\tassert(\n\t\t\t\t\t\tsegment.removedSeq !== UnassignedSequenceNumber &&\n\t\t\t\t\t\t\tsegment.removedSeq > minSeq,\n\t\t\t\t\t\t0x065 /* \"On removal info preservation, segment has invalid removed sequence number!\" */,\n\t\t\t\t\t);\n\t\t\t\t\traw.removedSeq = segment.removedSeq;\n\n\t\t\t\t\t// back compat for when we split overlap and removed client\n\t\t\t\t\traw.removedClient =\n\t\t\t\t\t\tsegment.removedClientIds !== undefined\n\t\t\t\t\t\t\t? this.getLongClientId(segment.removedClientIds[0])\n\t\t\t\t\t\t\t: undefined;\n\n\t\t\t\t\traw.removedClientIds = segment.removedClientIds?.map((id) =>\n\t\t\t\t\t\tthis.getLongClientId(id),\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tif (segment.movedSeq !== undefined) {\n\t\t\t\t\tassert(\n\t\t\t\t\t\tsegment.movedSeq !== UnassignedSequenceNumber && segment.movedSeq > minSeq,\n\t\t\t\t\t\t0x873 /* On move info preservation, segment has invalid moved sequence number! */,\n\t\t\t\t\t);\n\t\t\t\t\traw.movedSeq = segment.movedSeq;\n\t\t\t\t\traw.movedSeqs = segment.movedSeqs;\n\t\t\t\t\traw.movedClientIds = segment.movedClientIds?.map((id) =>\n\t\t\t\t\t\tthis.getLongClientId(id),\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\t// Sanity check that we are preserving either the seq > minSeq or a (re)moved segment's info.\n\t\t\t\tassert(\n\t\t\t\t\t(raw.seq !== undefined && raw.client !== undefined) ||\n\t\t\t\t\t\t(raw.removedSeq !== undefined && raw.removedClientIds !== undefined) ||\n\t\t\t\t\t\t(raw.movedSeq !== undefined &&\n\t\t\t\t\t\t\traw.movedClientIds !== undefined &&\n\t\t\t\t\t\t\traw.movedClientIds.length > 0 &&\n\t\t\t\t\t\t\traw.movedSeqs !== undefined &&\n\t\t\t\t\t\t\traw.movedSeqs.length > 0),\n\t\t\t\t\t0x066 /* \"Corrupted preservation of segment metadata!\" */,\n\t\t\t\t);\n\n\t\t\t\t// Record the segment with it's required metadata.\n\t\t\t\tpushSegRaw(raw, segment.cachedLength, segment.attribution);\n\t\t\t}\n\t\t\treturn true;\n\t\t};\n\n\t\twalkAllChildSegments(mergeTree.root, extractSegment);\n\n\t\t// If the last segment in the walk was coalescable, push it now.\n\t\tpushSeg(prev);\n\n\t\treturn this.segments;\n\t}\n\n\tpublic static async loadChunk(\n\t\tstorage: IChannelStorageService,\n\t\tpath: string,\n\t\tlogger: ITelemetryLoggerExt,\n\t\toptions: PropertySet | undefined,\n\t\tserializer?: IFluidSerializer,\n\t): Promise<MergeTreeChunkV1> {\n\t\tconst blob = await storage.readBlob(path);\n\t\tconst chunkAsString = bufferToString(blob, \"utf8\");\n\t\treturn SnapshotV1.processChunk(path, chunkAsString, logger, options, serializer);\n\t}\n\n\tpublic static processChunk(\n\t\tpath: string,\n\t\tchunk: string,\n\t\tlogger: ITelemetryLoggerExt,\n\t\toptions: PropertySet | undefined,\n\t\tserializer?: IFluidSerializer,\n\t): MergeTreeChunkV1 {\n\t\tconst chunkObj = serializer ? serializer.parse(chunk) : JSON.parse(chunk);\n\t\treturn toLatestVersion(path, chunkObj, logger, options);\n\t}\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"snapshotlegacy.d.mts","sourceRoot":"","sources":["../src/snapshotlegacy.ts"],"names":[],"mappings":"AAAA;;;GAGG;OAII,EAAE,mBAAmB,EAAqB,MAAM,iCAAiC;OAEjF,EAAE,YAAY,EAAE,MAAM,iCAAiC;OACvD,EAAE,gBAAgB,EAAE,MAAM,oCAAoC;OAC9D,EAAE,qBAAqB,EAAE,MAAM,qCAAqC;OACpE,EAAE,yBAAyB,EAAE,MAAM,sCAAsC;OAGzE,EAAE,QAAQ,EAAE;OAOZ,EAAE,SAAS,EAAE;AAapB;;GAEG;AACH,qBAAa,cAAc;IAoBlB,SAAS,EAAE,SAAS;IAEpB,QAAQ,CAAC;IACT,YAAY,CAAC,SAAQ,IAAI;IAtBjC,gBAAuB,MAAM,YAAY;IACzC,gBAAuB,IAAI,UAAU;IACrC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAgB;IAQlD,gBAAuB,gBAAgB,EAAE,MAAM,CAAS;IAExD,OAAO,CAAC,MAAM,CAA6B;IAC3C,OAAO,CAAC,GAAG,CAAqB;IAChC,OAAO,CAAC,QAAQ,CAAyB;IACzC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAsB;IAC7C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;gBAG3B,SAAS,EAAE,SAAS,EAC3B,MAAM,EAAE,mBAAmB,EACpB,QAAQ,CAAC,oBAAQ,EACjB,YAAY,CAAC,SAAQ,IAAI,aAAA;IAOjC,OAAO,CAAC,gBAAgB;IAgDxB;;;OAGG;IACH,IAAI,CACH,WAAW,EAAE,yBAAyB,EAAE,EACxC,UAAU,EAAE,gBAAgB,EAC5B,IAAI,EAAE,YAAY,GAChB,qBAAqB;IAgExB,WAAW;CA4EX"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"snapshotlegacy.mjs","sourceRoot":"","sources":["../src/snapshotlegacy.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 { ITelemetryLoggerExt, createChildLogger } from \"@fluidframework/telemetry-utils\";\nimport { assert } from \"@fluidframework/core-utils\";\nimport { IFluidHandle } from \"@fluidframework/core-interfaces\";\nimport { IFluidSerializer } from \"@fluidframework/shared-object-base\";\nimport { ISummaryTreeWithStats } from \"@fluidframework/runtime-definitions\";\nimport { ISequencedDocumentMessage } from \"@fluidframework/protocol-definitions\";\nimport { SummaryTreeBuilder } from \"@fluidframework/runtime-utils\";\nimport { NonCollabClient, UnassignedSequenceNumber } from \"./constants\";\nimport { ISegment } from \"./mergeTreeNodes\";\nimport { matchProperties } from \"./properties\";\nimport {\n\tJsonSegmentSpecs,\n\tMergeTreeChunkLegacy,\n\tserializeAsMinSupportedVersion,\n} from \"./snapshotChunks\";\nimport { MergeTree } from \"./mergeTree\";\n\ninterface SnapshotHeader {\n\tchunkCount?: number;\n\tsegmentsTotalLength: number;\n\tindexOffset?: number;\n\tsegmentsOffset?: number;\n\tseq: number;\n\t// TODO: Make 'minSeq' non-optional once the new snapshot format becomes the default?\n\t// (See https://github.com/microsoft/FluidFramework/issues/84)\n\tminSeq?: number;\n}\n\n/**\n * @internal\n */\nexport class SnapshotLegacy {\n\tpublic static readonly header = \"header\";\n\tpublic static readonly body = \"body\";\n\tprivate static readonly catchupOps = \"catchupOps\";\n\n\t// Split snapshot into two entries - headers (small) and body (overflow) for faster loading initial content\n\t// Please note that this number has no direct relationship to anything other than size of raw text (characters).\n\t// As we produce json for the blob (and then send over the wire compressed), this number\n\t// is really hard to correlate with any actual metric that matters (like bytes over the wire).\n\t// For test with small number of chunks it would be closer to blob size,\n\t// for very chunky text, blob size can easily be 4x-8x of that number.\n\tpublic static readonly sizeOfFirstChunk: number = 10000;\n\n\tprivate header: SnapshotHeader | undefined;\n\tprivate seq: number | undefined;\n\tprivate segments: ISegment[] | undefined;\n\tprivate readonly logger: ITelemetryLoggerExt;\n\tprivate readonly chunkSize: number;\n\n\tconstructor(\n\t\tpublic mergeTree: MergeTree,\n\t\tlogger: ITelemetryLoggerExt,\n\t\tpublic filename?: string,\n\t\tpublic onCompletion?: () => void,\n\t) {\n\t\tthis.logger = createChildLogger({ logger, namespace: \"Snapshot\" });\n\t\tthis.chunkSize =\n\t\t\tmergeTree?.options?.mergeTreeSnapshotChunkSize ?? SnapshotLegacy.sizeOfFirstChunk;\n\t}\n\n\tprivate getSeqLengthSegs(\n\t\tallSegments: ISegment[],\n\t\tapproxSequenceLength: number,\n\t\tstartIndex = 0,\n\t): MergeTreeChunkLegacy {\n\t\tconst segs: ISegment[] = [];\n\t\tlet sequenceLength = 0;\n\t\tlet segCount = 0;\n\t\tlet segsWithAttribution = 0;\n\t\twhile (\n\t\t\tsequenceLength < approxSequenceLength &&\n\t\t\tstartIndex + segCount < allSegments.length\n\t\t) {\n\t\t\tconst pseg = allSegments[startIndex + segCount];\n\t\t\tsegs.push(pseg);\n\t\t\tif (pseg.attribution) {\n\t\t\t\tsegsWithAttribution++;\n\t\t\t}\n\t\t\tsequenceLength += pseg.cachedLength;\n\t\t\tsegCount++;\n\t\t}\n\n\t\tassert(\n\t\t\tsegsWithAttribution === 0 || segsWithAttribution === segCount,\n\t\t\t0x4bf /* all or no segments should have attribution */,\n\t\t);\n\n\t\tconst attributionSerializer = this.mergeTree.attributionPolicy?.serializer;\n\t\tassert(\n\t\t\tsegsWithAttribution === 0 || attributionSerializer !== undefined,\n\t\t\t0x559 /* attribution serializer must be provided when there are segments with attribution. */,\n\t\t);\n\t\treturn {\n\t\t\tversion: undefined,\n\t\t\tchunkStartSegmentIndex: startIndex,\n\t\t\tchunkSegmentCount: segCount,\n\t\t\tchunkLengthChars: sequenceLength,\n\t\t\ttotalLengthChars: this.header!.segmentsTotalLength,\n\t\t\ttotalSegmentCount: allSegments.length,\n\t\t\tchunkSequenceNumber: this.header!.seq,\n\t\t\tsegmentTexts: segs.map((seg) => seg.toJSONObject() as JsonSegmentSpecs),\n\t\t\tattribution:\n\t\t\t\tsegsWithAttribution > 0\n\t\t\t\t\t? attributionSerializer?.serializeAttributionCollections(segs)\n\t\t\t\t\t: undefined,\n\t\t};\n\t}\n\n\t/**\n\t * Emits the snapshot to an ISummarizeResult. If provided the optional IFluidSerializer will be used when\n\t * serializing the summary data rather than JSON.stringify.\n\t */\n\temit(\n\t\tcatchUpMsgs: ISequencedDocumentMessage[],\n\t\tserializer: IFluidSerializer,\n\t\tbind: IFluidHandle,\n\t): ISummaryTreeWithStats {\n\t\tconst chunk1 = this.getSeqLengthSegs(this.segments!, this.chunkSize);\n\t\tlet length: number = chunk1.chunkLengthChars;\n\t\tlet segments: number = chunk1.chunkSegmentCount;\n\t\tconst builder = new SummaryTreeBuilder();\n\t\tbuilder.addBlob(\n\t\t\tSnapshotLegacy.header,\n\t\t\tserializeAsMinSupportedVersion(\n\t\t\t\tSnapshotLegacy.header,\n\t\t\t\tchunk1,\n\t\t\t\tthis.logger,\n\t\t\t\tthis.mergeTree.options,\n\t\t\t\tserializer,\n\t\t\t\tbind,\n\t\t\t),\n\t\t);\n\n\t\tif (chunk1.chunkSegmentCount < chunk1.totalSegmentCount!) {\n\t\t\tconst chunk2 = this.getSeqLengthSegs(\n\t\t\t\tthis.segments!,\n\t\t\t\tthis.header!.segmentsTotalLength,\n\t\t\t\tchunk1.chunkSegmentCount,\n\t\t\t);\n\t\t\tlength += chunk2.chunkLengthChars;\n\t\t\tsegments += chunk2.chunkSegmentCount;\n\t\t\tbuilder.addBlob(\n\t\t\t\tSnapshotLegacy.body,\n\t\t\t\tserializeAsMinSupportedVersion(\n\t\t\t\t\tSnapshotLegacy.body,\n\t\t\t\t\tchunk2,\n\t\t\t\t\tthis.logger,\n\t\t\t\t\tthis.mergeTree.options,\n\t\t\t\t\tserializer,\n\t\t\t\t\tbind,\n\t\t\t\t),\n\t\t\t);\n\t\t}\n\n\t\tassert(\n\t\t\tlength === this.header!.segmentsTotalLength,\n\t\t\t0x05d /* \"emit: mismatch in segmentsTotalLength\" */,\n\t\t);\n\n\t\tassert(\n\t\t\tsegments === chunk1.totalSegmentCount,\n\t\t\t0x05e /* \"emit: mismatch in totalSegmentCount\" */,\n\t\t);\n\n\t\tif (catchUpMsgs !== undefined && catchUpMsgs.length > 0) {\n\t\t\t// Messages used to have a \"term\" property which has since been removed.\n\t\t\t// It is benign so it doesn't really need to be deleted here, but doing so permits snapshot tests\n\t\t\t// to pass with an exact match (and matching the updated definition of ISequencedDocumentMessage).\n\t\t\tcatchUpMsgs.forEach((message) => {\n\t\t\t\tdelete (message as any).term;\n\t\t\t});\n\t\t\tbuilder.addBlob(\n\t\t\t\tthis.mergeTree.options?.catchUpBlobName ?? SnapshotLegacy.catchupOps,\n\t\t\t\tserializer ? serializer.stringify(catchUpMsgs, bind) : JSON.stringify(catchUpMsgs),\n\t\t\t);\n\t\t}\n\n\t\treturn builder.getSummaryTree();\n\t}\n\n\textractSync() {\n\t\tconst collabWindow = this.mergeTree.collabWindow;\n\t\tthis.seq = collabWindow.minSeq;\n\t\tthis.header = {\n\t\t\tsegmentsTotalLength: this.mergeTree.getLength(\n\t\t\t\tthis.mergeTree.collabWindow.minSeq,\n\t\t\t\tNonCollabClient,\n\t\t\t),\n\t\t\tseq: this.mergeTree.collabWindow.minSeq,\n\t\t};\n\n\t\tconst segs: ISegment[] = [];\n\t\tlet prev: ISegment | undefined;\n\t\tconst extractSegment = (\n\t\t\tsegment: ISegment,\n\t\t\tpos: number,\n\t\t\trefSeq: number,\n\t\t\tclientId: number,\n\t\t\tstart: number | undefined,\n\t\t\tend: number | undefined,\n\t\t) => {\n\t\t\tif (\n\t\t\t\tsegment.seq !== UnassignedSequenceNumber &&\n\t\t\t\tsegment.seq! <= this.seq! &&\n\t\t\t\t(segment.removedSeq === undefined ||\n\t\t\t\t\tsegment.removedSeq === UnassignedSequenceNumber ||\n\t\t\t\t\tsegment.removedSeq > this.seq!)\n\t\t\t) {\n\t\t\t\tif (\n\t\t\t\t\tprev?.canAppend(segment) &&\n\t\t\t\t\tmatchProperties(prev.properties, segment.properties)\n\t\t\t\t) {\n\t\t\t\t\tprev = prev.clone();\n\t\t\t\t\tprev.append(segment.clone());\n\t\t\t\t} else {\n\t\t\t\t\tif (prev) {\n\t\t\t\t\t\tsegs.push(prev);\n\t\t\t\t\t}\n\t\t\t\t\tprev = segment;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t};\n\n\t\tthis.mergeTree.mapRange(extractSegment, this.seq, NonCollabClient, undefined);\n\t\tif (prev) {\n\t\t\tsegs.push(prev);\n\t\t}\n\n\t\tthis.segments = [];\n\t\tlet totalLength: number = 0;\n\t\tsegs.map((segment) => {\n\t\t\ttotalLength += segment.cachedLength;\n\t\t\tif (segment.properties !== undefined && Object.keys(segment.properties).length === 0) {\n\t\t\t\tsegment.properties = undefined;\n\t\t\t\tsegment.propertyManager = undefined;\n\t\t\t}\n\t\t\tthis.segments!.push(segment);\n\t\t});\n\n\t\t// We observed this.header.segmentsTotalLength < totalLength to happen in some cases\n\t\t// When this condition happens, we might not write out all segments in getSeqLengthSegs()\n\t\t// when writing out \"body\". Issue #1995 tracks following up on the core of the problem.\n\t\t// In the meantime, this code makes sure we will write out all segments properly\n\n\t\tif (this.header.segmentsTotalLength !== totalLength) {\n\t\t\tthis.logger.sendErrorEvent({\n\t\t\t\teventName: \"SegmentsTotalLengthMismatch\",\n\t\t\t\ttotalLength,\n\t\t\t\tsegmentsTotalLength: this.header.segmentsTotalLength,\n\t\t\t});\n\t\t\tthis.header.segmentsTotalLength = totalLength;\n\t\t}\n\n\t\treturn this.segments;\n\t}\n}\n"]}