@fluidframework/merge-tree 2.1.0-276985 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (524) hide show
  1. package/.eslintrc.cjs +2 -4
  2. package/CHANGELOG.md +15 -0
  3. package/README.md +109 -1
  4. package/api-extractor/api-extractor.current.json +5 -0
  5. package/api-extractor/api-extractor.legacy.json +1 -1
  6. package/api-extractor.json +1 -1
  7. package/api-report/merge-tree.legacy.alpha.api.md +10 -22
  8. package/api-report/merge-tree.legacy.public.api.md +9 -0
  9. package/dist/MergeTreeTextHelper.d.ts.map +1 -1
  10. package/dist/MergeTreeTextHelper.js +1 -1
  11. package/dist/MergeTreeTextHelper.js.map +1 -1
  12. package/dist/attributionCollection.d.ts.map +1 -1
  13. package/dist/attributionCollection.js +65 -17
  14. package/dist/attributionCollection.js.map +1 -1
  15. package/dist/attributionPolicy.d.ts +2 -1
  16. package/dist/attributionPolicy.d.ts.map +1 -1
  17. package/dist/attributionPolicy.js +10 -3
  18. package/dist/attributionPolicy.js.map +1 -1
  19. package/dist/client.d.ts +3 -1
  20. package/dist/client.d.ts.map +1 -1
  21. package/dist/client.js +65 -37
  22. package/dist/client.js.map +1 -1
  23. package/dist/collections/list.d.ts.map +1 -1
  24. package/dist/collections/list.js +5 -2
  25. package/dist/collections/list.js.map +1 -1
  26. package/dist/collections/rbTree.d.ts +2 -2
  27. package/dist/collections/rbTree.d.ts.map +1 -1
  28. package/dist/collections/rbTree.js +23 -35
  29. package/dist/collections/rbTree.js.map +1 -1
  30. package/dist/endOfTreeSegment.d.ts.map +1 -1
  31. package/dist/endOfTreeSegment.js +4 -1
  32. package/dist/endOfTreeSegment.js.map +1 -1
  33. package/dist/legacy.d.ts +1 -1
  34. package/dist/localReference.d.ts +16 -6
  35. package/dist/localReference.d.ts.map +1 -1
  36. package/dist/localReference.js +31 -20
  37. package/dist/localReference.js.map +1 -1
  38. package/dist/mergeTree.d.ts +0 -1
  39. package/dist/mergeTree.d.ts.map +1 -1
  40. package/dist/mergeTree.js +127 -112
  41. package/dist/mergeTree.js.map +1 -1
  42. package/dist/mergeTreeNodeWalk.d.ts.map +1 -1
  43. package/dist/mergeTreeNodeWalk.js +1 -1
  44. package/dist/mergeTreeNodeWalk.js.map +1 -1
  45. package/dist/mergeTreeNodes.d.ts +6 -5
  46. package/dist/mergeTreeNodes.d.ts.map +1 -1
  47. package/dist/mergeTreeNodes.js +29 -20
  48. package/dist/mergeTreeNodes.js.map +1 -1
  49. package/dist/mergeTreeTracking.js +3 -3
  50. package/dist/mergeTreeTracking.js.map +1 -1
  51. package/dist/opBuilder.d.ts +6 -1
  52. package/dist/opBuilder.d.ts.map +1 -1
  53. package/dist/opBuilder.js +5 -0
  54. package/dist/opBuilder.js.map +1 -1
  55. package/dist/ops.d.ts.map +1 -1
  56. package/dist/ops.js.map +1 -1
  57. package/dist/ordinal.d.ts.map +1 -1
  58. package/dist/ordinal.js +7 -0
  59. package/dist/ordinal.js.map +1 -1
  60. package/dist/partialLengths.d.ts +4 -2
  61. package/dist/partialLengths.d.ts.map +1 -1
  62. package/dist/partialLengths.js +101 -53
  63. package/dist/partialLengths.js.map +1 -1
  64. package/dist/perspective.d.ts +4 -1
  65. package/dist/perspective.d.ts.map +1 -1
  66. package/dist/perspective.js +7 -6
  67. package/dist/perspective.js.map +1 -1
  68. package/dist/properties.d.ts +13 -10
  69. package/dist/properties.d.ts.map +1 -1
  70. package/dist/properties.js +22 -11
  71. package/dist/properties.js.map +1 -1
  72. package/dist/public.d.ts +1 -1
  73. package/dist/referencePositions.d.ts +7 -0
  74. package/dist/referencePositions.d.ts.map +1 -1
  75. package/dist/referencePositions.js +7 -0
  76. package/dist/referencePositions.js.map +1 -1
  77. package/dist/revertibles.d.ts +6 -0
  78. package/dist/revertibles.d.ts.map +1 -1
  79. package/dist/revertibles.js +50 -21
  80. package/dist/revertibles.js.map +1 -1
  81. package/dist/segmentGroupCollection.d.ts.map +1 -1
  82. package/dist/segmentGroupCollection.js +2 -0
  83. package/dist/segmentGroupCollection.js.map +1 -1
  84. package/dist/segmentPropertiesManager.d.ts +7 -3
  85. package/dist/segmentPropertiesManager.d.ts.map +1 -1
  86. package/dist/segmentPropertiesManager.js +20 -15
  87. package/dist/segmentPropertiesManager.js.map +1 -1
  88. package/dist/snapshotChunks.d.ts.map +1 -1
  89. package/dist/snapshotChunks.js +10 -5
  90. package/dist/snapshotChunks.js.map +1 -1
  91. package/dist/snapshotLoader.d.ts.map +1 -1
  92. package/dist/snapshotLoader.js +14 -10
  93. package/dist/snapshotLoader.js.map +1 -1
  94. package/dist/snapshotV1.d.ts.map +1 -1
  95. package/dist/snapshotV1.js +20 -8
  96. package/dist/snapshotV1.js.map +1 -1
  97. package/dist/snapshotlegacy.d.ts.map +1 -1
  98. package/dist/snapshotlegacy.js +4 -2
  99. package/dist/snapshotlegacy.js.map +1 -1
  100. package/dist/sortedSegmentSet.d.ts.map +1 -1
  101. package/dist/sortedSegmentSet.js +8 -1
  102. package/dist/sortedSegmentSet.js.map +1 -1
  103. package/dist/sortedSet.d.ts.map +1 -1
  104. package/dist/sortedSet.js +4 -0
  105. package/dist/sortedSet.js.map +1 -1
  106. package/dist/test/Insertion.perf.spec.js.map +1 -1
  107. package/dist/test/Removal.perf.spec.js.map +1 -1
  108. package/dist/test/Snapshot.perf.spec.js +1 -0
  109. package/dist/test/Snapshot.perf.spec.js.map +1 -1
  110. package/dist/test/attributionCollection.perf.spec.js +3 -1
  111. package/dist/test/attributionCollection.perf.spec.js.map +1 -1
  112. package/dist/test/attributionCollection.spec.js +69 -68
  113. package/dist/test/attributionCollection.spec.js.map +1 -1
  114. package/dist/test/attributionPolicy.spec.js +29 -27
  115. package/dist/test/attributionPolicy.spec.js.map +1 -1
  116. package/dist/test/beastTest.spec.d.ts +1 -4
  117. package/dist/test/beastTest.spec.d.ts.map +1 -1
  118. package/dist/test/beastTest.spec.js +32 -30
  119. package/dist/test/beastTest.spec.js.map +1 -1
  120. package/dist/test/client.annotateMarker.spec.js +5 -5
  121. package/dist/test/client.annotateMarker.spec.js.map +1 -1
  122. package/dist/test/client.apis.spec.d.ts.map +1 -1
  123. package/dist/test/client.apis.spec.js +5 -7
  124. package/dist/test/client.apis.spec.js.map +1 -1
  125. package/dist/test/client.applyMsg.spec.js +125 -103
  126. package/dist/test/client.applyMsg.spec.js.map +1 -1
  127. package/dist/test/client.applyStashedOpFarm.spec.js +18 -10
  128. package/dist/test/client.applyStashedOpFarm.spec.js.map +1 -1
  129. package/dist/test/client.attributionFarm.spec.js +13 -8
  130. package/dist/test/client.attributionFarm.spec.js.map +1 -1
  131. package/dist/test/client.conflictFarm.spec.js +4 -2
  132. package/dist/test/client.conflictFarm.spec.js.map +1 -1
  133. package/dist/test/client.getPosition.spec.js +10 -10
  134. package/dist/test/client.getPosition.spec.js.map +1 -1
  135. package/dist/test/client.localReference.spec.js +111 -104
  136. package/dist/test/client.localReference.spec.js.map +1 -1
  137. package/dist/test/client.localReferenceFarm.spec.js +14 -10
  138. package/dist/test/client.localReferenceFarm.spec.js.map +1 -1
  139. package/dist/test/client.rebasePosition.spec.js +12 -12
  140. package/dist/test/client.rebasePosition.spec.js.map +1 -1
  141. package/dist/test/client.reconnectFarm.spec.js +12 -9
  142. package/dist/test/client.reconnectFarm.spec.js.map +1 -1
  143. package/dist/test/client.replay.spec.js +11 -10
  144. package/dist/test/client.replay.spec.js.map +1 -1
  145. package/dist/test/client.rollback.spec.js +87 -84
  146. package/dist/test/client.rollback.spec.js.map +1 -1
  147. package/dist/test/client.rollbackFarm.spec.js +3 -1
  148. package/dist/test/client.rollbackFarm.spec.js.map +1 -1
  149. package/dist/test/client.searchForMarker.spec.js +122 -112
  150. package/dist/test/client.searchForMarker.spec.js.map +1 -1
  151. package/dist/test/client.walkSegments.spec.js +7 -7
  152. package/dist/test/client.walkSegments.spec.js.map +1 -1
  153. package/dist/test/collections.list.spec.js +14 -14
  154. package/dist/test/collections.list.spec.js.map +1 -1
  155. package/dist/test/createInsertOnlyAttributionPolicy.spec.js +3 -3
  156. package/dist/test/createInsertOnlyAttributionPolicy.spec.js.map +1 -1
  157. package/dist/test/dirname.cjs +1 -0
  158. package/dist/test/dirname.cjs.map +1 -1
  159. package/dist/test/dirname.d.cts.map +1 -1
  160. package/dist/test/mergeTree.annotate.deltaCallback.spec.js +7 -7
  161. package/dist/test/mergeTree.annotate.deltaCallback.spec.js.map +1 -1
  162. package/dist/test/mergeTree.annotate.spec.js +87 -87
  163. package/dist/test/mergeTree.annotate.spec.js.map +1 -1
  164. package/dist/test/mergeTree.insert.deltaCallback.spec.js +6 -6
  165. package/dist/test/mergeTree.insert.deltaCallback.spec.js.map +1 -1
  166. package/dist/test/mergeTree.insertingWalk.spec.js +24 -24
  167. package/dist/test/mergeTree.insertingWalk.spec.js.map +1 -1
  168. package/dist/test/mergeTree.markRangeRemoved.deltaCallback.spec.js +6 -6
  169. package/dist/test/mergeTree.markRangeRemoved.deltaCallback.spec.js.map +1 -1
  170. package/dist/test/mergeTree.markRangeRemoved.spec.js +23 -23
  171. package/dist/test/mergeTree.markRangeRemoved.spec.js.map +1 -1
  172. package/dist/test/mergeTree.walk.spec.js +3 -3
  173. package/dist/test/mergeTree.walk.spec.js.map +1 -1
  174. package/dist/test/mergeTree.zamboni.spec.js +10 -10
  175. package/dist/test/mergeTree.zamboni.spec.js.map +1 -1
  176. package/dist/test/mergeTreeOperationRunner.d.ts.map +1 -1
  177. package/dist/test/mergeTreeOperationRunner.js +28 -16
  178. package/dist/test/mergeTreeOperationRunner.js.map +1 -1
  179. package/dist/test/mergeTreeOperationRunner.spec.js +9 -5
  180. package/dist/test/mergeTreeOperationRunner.spec.js.map +1 -1
  181. package/dist/test/obliterate.concurrent.spec.js +165 -165
  182. package/dist/test/obliterate.concurrent.spec.js.map +1 -1
  183. package/dist/test/obliterate.deltaCallback.spec.js +20 -21
  184. package/dist/test/obliterate.deltaCallback.spec.js.map +1 -1
  185. package/dist/test/obliterate.partialLength.spec.js +7 -7
  186. package/dist/test/obliterate.partialLength.spec.js.map +1 -1
  187. package/dist/test/obliterate.reconnect.spec.js +13 -13
  188. package/dist/test/obliterate.reconnect.spec.js.map +1 -1
  189. package/dist/test/obliterate.spec.js +9 -9
  190. package/dist/test/obliterate.spec.js.map +1 -1
  191. package/dist/test/ordinal.spec.js +10 -4
  192. package/dist/test/ordinal.spec.js.map +1 -1
  193. package/dist/test/partialLength.spec.js.map +1 -1
  194. package/dist/test/properties.spec.js +15 -15
  195. package/dist/test/properties.spec.js.map +1 -1
  196. package/dist/test/reconnectHelper.d.ts +4 -4
  197. package/dist/test/reconnectHelper.d.ts.map +1 -1
  198. package/dist/test/reconnectHelper.js +28 -20
  199. package/dist/test/reconnectHelper.js.map +1 -1
  200. package/dist/test/resetPendingSegmentsToOp.spec.js +35 -29
  201. package/dist/test/resetPendingSegmentsToOp.spec.js.map +1 -1
  202. package/dist/test/revertibleFarm.spec.js +11 -10
  203. package/dist/test/revertibleFarm.spec.js.map +1 -1
  204. package/dist/test/revertibles.spec.d.ts.map +1 -1
  205. package/dist/test/revertibles.spec.js +96 -57
  206. package/dist/test/revertibles.spec.js.map +1 -1
  207. package/dist/test/segmentGroupCollection.spec.js +17 -17
  208. package/dist/test/segmentGroupCollection.spec.js.map +1 -1
  209. package/dist/test/snapshot.spec.js +5 -5
  210. package/dist/test/snapshot.spec.js.map +1 -1
  211. package/dist/test/snapshot.utils.d.ts.map +1 -1
  212. package/dist/test/snapshot.utils.js +6 -6
  213. package/dist/test/snapshot.utils.js.map +1 -1
  214. package/dist/test/snapshotlegacy.spec.js +18 -13
  215. package/dist/test/snapshotlegacy.spec.js.map +1 -1
  216. package/dist/test/sortedSegmentSet.spec.js +22 -18
  217. package/dist/test/sortedSegmentSet.spec.js.map +1 -1
  218. package/dist/test/testClient.d.ts +6 -5
  219. package/dist/test/testClient.d.ts.map +1 -1
  220. package/dist/test/testClient.js +30 -32
  221. package/dist/test/testClient.js.map +1 -1
  222. package/dist/test/testClientLogger.d.ts.map +1 -1
  223. package/dist/test/testClientLogger.js +39 -38
  224. package/dist/test/testClientLogger.js.map +1 -1
  225. package/dist/test/testSerializer.d.ts +5 -5
  226. package/dist/test/testSerializer.d.ts.map +1 -1
  227. package/dist/test/testSerializer.js +0 -1
  228. package/dist/test/testSerializer.js.map +1 -1
  229. package/dist/test/testServer.d.ts.map +1 -1
  230. package/dist/test/testServer.js.map +1 -1
  231. package/dist/test/testUtils.d.ts +1 -1
  232. package/dist/test/testUtils.d.ts.map +1 -1
  233. package/dist/test/testUtils.js +15 -17
  234. package/dist/test/testUtils.js.map +1 -1
  235. package/dist/test/text.d.ts.map +1 -1
  236. package/dist/test/text.js +1 -1
  237. package/dist/test/text.js.map +1 -1
  238. package/dist/test/tracking.spec.js +50 -46
  239. package/dist/test/tracking.spec.js.map +1 -1
  240. package/dist/test/wordUnitTests.spec.d.ts.map +1 -1
  241. package/dist/test/wordUnitTests.spec.js +10 -10
  242. package/dist/test/wordUnitTests.spec.js.map +1 -1
  243. package/dist/textSegment.d.ts +1 -1
  244. package/dist/textSegment.d.ts.map +1 -1
  245. package/dist/textSegment.js +3 -3
  246. package/dist/textSegment.js.map +1 -1
  247. package/dist/zamboni.d.ts.map +1 -1
  248. package/dist/zamboni.js +7 -2
  249. package/dist/zamboni.js.map +1 -1
  250. package/internal.d.ts +1 -1
  251. package/legacy.d.ts +1 -1
  252. package/lib/MergeTreeTextHelper.d.ts.map +1 -1
  253. package/lib/MergeTreeTextHelper.js +1 -1
  254. package/lib/MergeTreeTextHelper.js.map +1 -1
  255. package/lib/attributionCollection.d.ts.map +1 -1
  256. package/lib/attributionCollection.js +65 -17
  257. package/lib/attributionCollection.js.map +1 -1
  258. package/lib/attributionPolicy.d.ts +2 -1
  259. package/lib/attributionPolicy.d.ts.map +1 -1
  260. package/lib/attributionPolicy.js +10 -3
  261. package/lib/attributionPolicy.js.map +1 -1
  262. package/lib/client.d.ts +3 -1
  263. package/lib/client.d.ts.map +1 -1
  264. package/lib/client.js +65 -37
  265. package/lib/client.js.map +1 -1
  266. package/lib/collections/list.d.ts.map +1 -1
  267. package/lib/collections/list.js +5 -2
  268. package/lib/collections/list.js.map +1 -1
  269. package/lib/collections/rbTree.d.ts +2 -2
  270. package/lib/collections/rbTree.d.ts.map +1 -1
  271. package/lib/collections/rbTree.js +23 -35
  272. package/lib/collections/rbTree.js.map +1 -1
  273. package/lib/endOfTreeSegment.d.ts.map +1 -1
  274. package/lib/endOfTreeSegment.js +4 -1
  275. package/lib/endOfTreeSegment.js.map +1 -1
  276. package/lib/legacy.d.ts +1 -1
  277. package/lib/localReference.d.ts +16 -6
  278. package/lib/localReference.d.ts.map +1 -1
  279. package/lib/localReference.js +31 -20
  280. package/lib/localReference.js.map +1 -1
  281. package/lib/mergeTree.d.ts +0 -1
  282. package/lib/mergeTree.d.ts.map +1 -1
  283. package/lib/mergeTree.js +127 -112
  284. package/lib/mergeTree.js.map +1 -1
  285. package/lib/mergeTreeNodeWalk.d.ts.map +1 -1
  286. package/lib/mergeTreeNodeWalk.js +1 -1
  287. package/lib/mergeTreeNodeWalk.js.map +1 -1
  288. package/lib/mergeTreeNodes.d.ts +6 -5
  289. package/lib/mergeTreeNodes.d.ts.map +1 -1
  290. package/lib/mergeTreeNodes.js +29 -20
  291. package/lib/mergeTreeNodes.js.map +1 -1
  292. package/lib/mergeTreeTracking.js +3 -3
  293. package/lib/mergeTreeTracking.js.map +1 -1
  294. package/lib/opBuilder.d.ts +6 -1
  295. package/lib/opBuilder.d.ts.map +1 -1
  296. package/lib/opBuilder.js +5 -0
  297. package/lib/opBuilder.js.map +1 -1
  298. package/lib/ops.d.ts.map +1 -1
  299. package/lib/ops.js.map +1 -1
  300. package/lib/ordinal.d.ts.map +1 -1
  301. package/lib/ordinal.js +7 -0
  302. package/lib/ordinal.js.map +1 -1
  303. package/lib/partialLengths.d.ts +4 -2
  304. package/lib/partialLengths.d.ts.map +1 -1
  305. package/lib/partialLengths.js +101 -53
  306. package/lib/partialLengths.js.map +1 -1
  307. package/lib/perspective.d.ts +4 -1
  308. package/lib/perspective.d.ts.map +1 -1
  309. package/lib/perspective.js +7 -6
  310. package/lib/perspective.js.map +1 -1
  311. package/lib/properties.d.ts +13 -10
  312. package/lib/properties.d.ts.map +1 -1
  313. package/lib/properties.js +22 -11
  314. package/lib/properties.js.map +1 -1
  315. package/lib/public.d.ts +1 -1
  316. package/lib/referencePositions.d.ts +7 -0
  317. package/lib/referencePositions.d.ts.map +1 -1
  318. package/lib/referencePositions.js +7 -0
  319. package/lib/referencePositions.js.map +1 -1
  320. package/lib/revertibles.d.ts +6 -0
  321. package/lib/revertibles.d.ts.map +1 -1
  322. package/lib/revertibles.js +50 -21
  323. package/lib/revertibles.js.map +1 -1
  324. package/lib/segmentGroupCollection.d.ts.map +1 -1
  325. package/lib/segmentGroupCollection.js +2 -0
  326. package/lib/segmentGroupCollection.js.map +1 -1
  327. package/lib/segmentPropertiesManager.d.ts +7 -3
  328. package/lib/segmentPropertiesManager.d.ts.map +1 -1
  329. package/lib/segmentPropertiesManager.js +20 -15
  330. package/lib/segmentPropertiesManager.js.map +1 -1
  331. package/lib/snapshotChunks.d.ts.map +1 -1
  332. package/lib/snapshotChunks.js +10 -5
  333. package/lib/snapshotChunks.js.map +1 -1
  334. package/lib/snapshotLoader.d.ts.map +1 -1
  335. package/lib/snapshotLoader.js +14 -10
  336. package/lib/snapshotLoader.js.map +1 -1
  337. package/lib/snapshotV1.d.ts.map +1 -1
  338. package/lib/snapshotV1.js +20 -8
  339. package/lib/snapshotV1.js.map +1 -1
  340. package/lib/snapshotlegacy.d.ts.map +1 -1
  341. package/lib/snapshotlegacy.js +4 -2
  342. package/lib/snapshotlegacy.js.map +1 -1
  343. package/lib/sortedSegmentSet.d.ts.map +1 -1
  344. package/lib/sortedSegmentSet.js +8 -1
  345. package/lib/sortedSegmentSet.js.map +1 -1
  346. package/lib/sortedSet.d.ts.map +1 -1
  347. package/lib/sortedSet.js +4 -0
  348. package/lib/sortedSet.js.map +1 -1
  349. package/lib/test/Insertion.perf.spec.js.map +1 -1
  350. package/lib/test/Removal.perf.spec.js.map +1 -1
  351. package/lib/test/Snapshot.perf.spec.js +1 -0
  352. package/lib/test/Snapshot.perf.spec.js.map +1 -1
  353. package/lib/test/attributionCollection.perf.spec.js +3 -1
  354. package/lib/test/attributionCollection.perf.spec.js.map +1 -1
  355. package/lib/test/attributionCollection.spec.js +3 -2
  356. package/lib/test/attributionCollection.spec.js.map +1 -1
  357. package/lib/test/attributionPolicy.spec.js +3 -1
  358. package/lib/test/attributionPolicy.spec.js.map +1 -1
  359. package/lib/test/beastTest.spec.d.ts +1 -4
  360. package/lib/test/beastTest.spec.d.ts.map +1 -1
  361. package/lib/test/beastTest.spec.js +26 -24
  362. package/lib/test/beastTest.spec.js.map +1 -1
  363. package/lib/test/client.annotateMarker.spec.js +1 -1
  364. package/lib/test/client.annotateMarker.spec.js.map +1 -1
  365. package/lib/test/client.apis.spec.d.ts.map +1 -1
  366. package/lib/test/client.apis.spec.js +4 -6
  367. package/lib/test/client.apis.spec.js.map +1 -1
  368. package/lib/test/client.applyMsg.spec.js +72 -50
  369. package/lib/test/client.applyMsg.spec.js.map +1 -1
  370. package/lib/test/client.applyStashedOpFarm.spec.js +18 -10
  371. package/lib/test/client.applyStashedOpFarm.spec.js.map +1 -1
  372. package/lib/test/client.attributionFarm.spec.js +12 -7
  373. package/lib/test/client.attributionFarm.spec.js.map +1 -1
  374. package/lib/test/client.conflictFarm.spec.js +4 -2
  375. package/lib/test/client.conflictFarm.spec.js.map +1 -1
  376. package/lib/test/client.getPosition.spec.js +1 -1
  377. package/lib/test/client.getPosition.spec.js.map +1 -1
  378. package/lib/test/client.localReference.spec.js +14 -7
  379. package/lib/test/client.localReference.spec.js.map +1 -1
  380. package/lib/test/client.localReferenceFarm.spec.js +13 -9
  381. package/lib/test/client.localReferenceFarm.spec.js.map +1 -1
  382. package/lib/test/client.rebasePosition.spec.js +1 -1
  383. package/lib/test/client.rebasePosition.spec.js.map +1 -1
  384. package/lib/test/client.reconnectFarm.spec.js +11 -8
  385. package/lib/test/client.reconnectFarm.spec.js.map +1 -1
  386. package/lib/test/client.replay.spec.js +8 -7
  387. package/lib/test/client.replay.spec.js.map +1 -1
  388. package/lib/test/client.rollback.spec.js +14 -11
  389. package/lib/test/client.rollback.spec.js.map +1 -1
  390. package/lib/test/client.rollbackFarm.spec.js +3 -1
  391. package/lib/test/client.rollbackFarm.spec.js.map +1 -1
  392. package/lib/test/client.searchForMarker.spec.js +29 -19
  393. package/lib/test/client.searchForMarker.spec.js.map +1 -1
  394. package/lib/test/client.walkSegments.spec.js +1 -1
  395. package/lib/test/client.walkSegments.spec.js.map +1 -1
  396. package/lib/test/collections.list.spec.js +1 -1
  397. package/lib/test/collections.list.spec.js.map +1 -1
  398. package/lib/test/createInsertOnlyAttributionPolicy.spec.js +1 -1
  399. package/lib/test/createInsertOnlyAttributionPolicy.spec.js.map +1 -1
  400. package/lib/test/dirname.cjs +1 -0
  401. package/lib/test/dirname.cjs.map +1 -1
  402. package/lib/test/dirname.d.cts.map +1 -1
  403. package/lib/test/mergeTree.annotate.deltaCallback.spec.js +1 -1
  404. package/lib/test/mergeTree.annotate.deltaCallback.spec.js.map +1 -1
  405. package/lib/test/mergeTree.annotate.spec.js +1 -1
  406. package/lib/test/mergeTree.annotate.spec.js.map +1 -1
  407. package/lib/test/mergeTree.insert.deltaCallback.spec.js +1 -1
  408. package/lib/test/mergeTree.insert.deltaCallback.spec.js.map +1 -1
  409. package/lib/test/mergeTree.insertingWalk.spec.js +8 -8
  410. package/lib/test/mergeTree.insertingWalk.spec.js.map +1 -1
  411. package/lib/test/mergeTree.markRangeRemoved.deltaCallback.spec.js +1 -1
  412. package/lib/test/mergeTree.markRangeRemoved.deltaCallback.spec.js.map +1 -1
  413. package/lib/test/mergeTree.markRangeRemoved.spec.js +1 -1
  414. package/lib/test/mergeTree.markRangeRemoved.spec.js.map +1 -1
  415. package/lib/test/mergeTree.walk.spec.js +1 -1
  416. package/lib/test/mergeTree.walk.spec.js.map +1 -1
  417. package/lib/test/mergeTree.zamboni.spec.js +1 -1
  418. package/lib/test/mergeTree.zamboni.spec.js.map +1 -1
  419. package/lib/test/mergeTreeOperationRunner.d.ts.map +1 -1
  420. package/lib/test/mergeTreeOperationRunner.js +27 -15
  421. package/lib/test/mergeTreeOperationRunner.js.map +1 -1
  422. package/lib/test/mergeTreeOperationRunner.spec.js +5 -1
  423. package/lib/test/mergeTreeOperationRunner.spec.js.map +1 -1
  424. package/lib/test/obliterate.concurrent.spec.js +4 -4
  425. package/lib/test/obliterate.concurrent.spec.js.map +1 -1
  426. package/lib/test/obliterate.deltaCallback.spec.js +2 -3
  427. package/lib/test/obliterate.deltaCallback.spec.js.map +1 -1
  428. package/lib/test/obliterate.partialLength.spec.js +1 -1
  429. package/lib/test/obliterate.partialLength.spec.js.map +1 -1
  430. package/lib/test/obliterate.reconnect.spec.js +1 -1
  431. package/lib/test/obliterate.reconnect.spec.js.map +1 -1
  432. package/lib/test/obliterate.spec.js +1 -1
  433. package/lib/test/obliterate.spec.js.map +1 -1
  434. package/lib/test/ordinal.spec.js +7 -1
  435. package/lib/test/ordinal.spec.js.map +1 -1
  436. package/lib/test/partialLength.spec.js.map +1 -1
  437. package/lib/test/properties.spec.js +1 -1
  438. package/lib/test/properties.spec.js.map +1 -1
  439. package/lib/test/reconnectHelper.d.ts +4 -4
  440. package/lib/test/reconnectHelper.d.ts.map +1 -1
  441. package/lib/test/reconnectHelper.js +22 -14
  442. package/lib/test/reconnectHelper.js.map +1 -1
  443. package/lib/test/resetPendingSegmentsToOp.spec.js +8 -2
  444. package/lib/test/resetPendingSegmentsToOp.spec.js.map +1 -1
  445. package/lib/test/revertibleFarm.spec.js +8 -7
  446. package/lib/test/revertibleFarm.spec.js.map +1 -1
  447. package/lib/test/revertibles.spec.d.ts.map +1 -1
  448. package/lib/test/revertibles.spec.js +93 -54
  449. package/lib/test/revertibles.spec.js.map +1 -1
  450. package/lib/test/segmentGroupCollection.spec.js +1 -1
  451. package/lib/test/segmentGroupCollection.spec.js.map +1 -1
  452. package/lib/test/snapshot.spec.js +1 -1
  453. package/lib/test/snapshot.spec.js.map +1 -1
  454. package/lib/test/snapshot.utils.d.ts.map +1 -1
  455. package/lib/test/snapshot.utils.js +1 -1
  456. package/lib/test/snapshot.utils.js.map +1 -1
  457. package/lib/test/snapshotlegacy.spec.js +10 -5
  458. package/lib/test/snapshotlegacy.spec.js.map +1 -1
  459. package/lib/test/sortedSegmentSet.spec.js +6 -2
  460. package/lib/test/sortedSegmentSet.spec.js.map +1 -1
  461. package/lib/test/testClient.d.ts +6 -5
  462. package/lib/test/testClient.d.ts.map +1 -1
  463. package/lib/test/testClient.js +25 -27
  464. package/lib/test/testClient.js.map +1 -1
  465. package/lib/test/testClientLogger.d.ts.map +1 -1
  466. package/lib/test/testClientLogger.js +37 -36
  467. package/lib/test/testClientLogger.js.map +1 -1
  468. package/lib/test/testSerializer.d.ts +5 -5
  469. package/lib/test/testSerializer.d.ts.map +1 -1
  470. package/lib/test/testSerializer.js +0 -1
  471. package/lib/test/testSerializer.js.map +1 -1
  472. package/lib/test/testServer.d.ts.map +1 -1
  473. package/lib/test/testServer.js.map +1 -1
  474. package/lib/test/testUtils.d.ts +1 -1
  475. package/lib/test/testUtils.d.ts.map +1 -1
  476. package/lib/test/testUtils.js +6 -8
  477. package/lib/test/testUtils.js.map +1 -1
  478. package/lib/test/text.d.ts.map +1 -1
  479. package/lib/test/text.js +1 -1
  480. package/lib/test/text.js.map +1 -1
  481. package/lib/test/tracking.spec.js +9 -5
  482. package/lib/test/tracking.spec.js.map +1 -1
  483. package/lib/test/wordUnitTests.spec.d.ts.map +1 -1
  484. package/lib/test/wordUnitTests.spec.js +9 -9
  485. package/lib/test/wordUnitTests.spec.js.map +1 -1
  486. package/lib/textSegment.d.ts +1 -1
  487. package/lib/textSegment.d.ts.map +1 -1
  488. package/lib/textSegment.js +3 -3
  489. package/lib/textSegment.js.map +1 -1
  490. package/lib/zamboni.d.ts.map +1 -1
  491. package/lib/zamboni.js +7 -2
  492. package/lib/zamboni.js.map +1 -1
  493. package/package.json +29 -27
  494. package/src/MergeTreeTextHelper.ts +2 -2
  495. package/src/attributionCollection.ts +71 -28
  496. package/src/attributionPolicy.ts +14 -9
  497. package/src/client.ts +120 -71
  498. package/src/collections/list.ts +9 -6
  499. package/src/collections/rbTree.ts +62 -71
  500. package/src/endOfTreeSegment.ts +21 -10
  501. package/src/localReference.ts +61 -43
  502. package/src/mergeTree.ts +229 -178
  503. package/src/mergeTreeNodeWalk.ts +2 -1
  504. package/src/mergeTreeNodes.ts +59 -46
  505. package/src/mergeTreeTracking.ts +3 -3
  506. package/src/opBuilder.ts +6 -1
  507. package/src/ops.ts +5 -0
  508. package/src/ordinal.ts +8 -1
  509. package/src/partialLengths.ts +143 -87
  510. package/src/perspective.ts +10 -7
  511. package/src/properties.ts +36 -18
  512. package/src/referencePositions.ts +7 -0
  513. package/src/revertibles.ts +71 -41
  514. package/src/segmentGroupCollection.ts +8 -6
  515. package/src/segmentPropertiesManager.ts +28 -24
  516. package/src/snapshotChunks.ts +12 -7
  517. package/src/snapshotLoader.ts +20 -17
  518. package/src/snapshotV1.ts +36 -18
  519. package/src/snapshotlegacy.ts +7 -5
  520. package/src/sortedSegmentSet.ts +9 -3
  521. package/src/sortedSet.ts +7 -3
  522. package/src/textSegment.ts +9 -9
  523. package/src/zamboni.ts +14 -10
  524. package/tsconfig.json +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"snapshot.spec.js","sourceRoot":"","sources":["../../src/test/snapshot.spec.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { strict as assert } from \"assert\";\n\nimport {\n\tcreateInsertOnlyAttributionPolicy,\n\tcreatePropertyTrackingAttributionPolicyFactory,\n} from \"../attributionPolicy.js\";\nimport { IMergeTreeOptions } from \"../mergeTree.js\";\nimport { SnapshotV1 } from \"../snapshotV1.js\";\n\nimport { TestString, loadSnapshot } from \"./snapshot.utils.js\";\n\nfunction makeSnapshotSuite(options?: IMergeTreeOptions): void {\n\tdescribe(\"from an empty initial state\", () => {\n\t\tlet str: TestString;\n\t\tbeforeEach(() => {\n\t\t\tstr = new TestString(\"fakeId\", options);\n\t\t});\n\n\t\tafterEach(async () => {\n\t\t\t// Paranoid check that ensures `str` roundtrips through snapshot/load. This helps to catch\n\t\t\t// bugs that might be missed if the test case forgets to call/await `str.expect()`.\n\t\t\tawait str.checkSnapshot({\n\t\t\t\tattribution: { policyFactory: createInsertOnlyAttributionPolicy },\n\t\t\t});\n\t\t});\n\n\t\tit(\"excludes un-acked segments\", async () => {\n\t\t\tstr.append(\"0\", /* increaseMsn: */ false);\n\n\t\t\t// Invoke `load/getSnapshot()` directly instead of `str.expect()` to avoid ACKing the\n\t\t\t// pending insert op.\n\t\t\tconst client2 = await loadSnapshot(str.getSummary(), options);\n\n\t\t\t// Original client has inserted text, but the one loaded from the snapshot should be empty.\n\t\t\t// This is because un-ACKed ops are not included in snapshots. Instead, these ops are\n\t\t\t// retransmitted and applied after the snapshot has loaded.\n\t\t\tassert.equal(str.getText(), \"0\");\n\t\t\tassert.equal(client2.getText(), \"\");\n\t\t});\n\n\t\tit(\"includes segments below MSN\", async () => {\n\t\t\tstr.append(\"0\", /* increaseMsn: */ true);\n\t\t\tawait str.expect(\"0\");\n\t\t});\n\n\t\tit(\"includes ACKed segments above the MSN\", async () => {\n\t\t\tstr.append(\"0\", /* increaseMsn: */ false);\n\t\t\tawait str.expect(\"0\");\n\t\t});\n\n\t\tit(\"includes removals of segments above the MSN\", async () => {\n\t\t\tstr.append(\"0x\", /* increaseMsn: */ false);\n\t\t\tstr.removeRange(1, 2, /* increaseMsn: */ false);\n\t\t\tawait str.expect(\"0\");\n\t\t});\n\n\t\tit(\"includes removals above the MSN of segments below the MSN\", async () => {\n\t\t\tstr.append(\"0x\", /* increaseMsn: */ true);\n\t\t\tstr.removeRange(1, 2, /* increaseMsn: */ false);\n\t\t\tawait str.expect(\"0\");\n\t\t});\n\n\t\tit(\"can insert segments after loading removed segment\", async () => {\n\t\t\tstr.append(\"0x\", /* increaseMsn: */ true);\n\t\t\tstr.removeRange(1, 2, /* increaseMsn: */ false);\n\t\t\tawait str.expect(\"0\");\n\t\t\tstr.append(\"1\", /* increaseMsn: */ false);\n\t\t\tawait str.expect(\"01\");\n\t\t});\n\n\t\tit(\"can insert segments relative to removed segment\", async () => {\n\t\t\tstr.append(\"0x\", /* increaseMsn: */ false);\n\t\t\tstr.append(\"2\", /* increaseMsn: */ false);\n\t\t\tstr.removeRange(1, 2, /* increaseMsn: */ false);\n\t\t\tstr.insert(1, \"1\", /* increaseMsn: */ false);\n\t\t\tstr.append(\"3\", /* increaseMsn: */ false);\n\t\t\tawait str.expect(\"0123\");\n\t\t});\n\n\t\tit(\"can insert segments relative to removed segment loaded from snapshot\", async () => {\n\t\t\tstr.append(\"0x\", /* increaseMsn: */ false);\n\t\t\tstr.append(\"2\", /* increaseMsn: */ false);\n\t\t\tstr.removeRange(1, 2, /* increaseMsn: */ false);\n\n\t\t\t// Note that calling str.expect() switches the underlying client to the one loaded from the snapshot.\n\t\t\tawait str.expect(\"02\");\n\n\t\t\tstr.insert(1, \"1\", /* increaseMsn: */ false);\n\t\t\tstr.append(\"3\", /* increaseMsn: */ false);\n\t\t\tawait str.expect(\"0123\");\n\t\t});\n\n\t\tit(\"includes obliterates above the MSN of segments below the MSN\", async () => {\n\t\t\tstr.append(\"0x\", /* increaseMsn: */ true);\n\t\t\tstr.obliterateRange(1, 2, /* increaseMsn: */ false);\n\t\t\tawait str.expect(\"0\");\n\t\t});\n\n\t\tit(\"can insert segments after loading obliterated segment\", async () => {\n\t\t\tstr.append(\"0x\", /* increaseMsn: */ true);\n\t\t\tstr.obliterateRange(1, 2, /* increaseMsn: */ false);\n\t\t\tawait str.expect(\"0\");\n\t\t\tstr.append(\"1\", /* increaseMsn: */ false);\n\t\t\tawait str.expect(\"01\");\n\t\t});\n\n\t\tit(\"can insert segments relative to obliterated segment\", async () => {\n\t\t\tstr.append(\"0x\", /* increaseMsn: */ false);\n\t\t\tstr.append(\"2\", /* increaseMsn: */ false);\n\t\t\tstr.obliterateRange(1, 2, /* increaseMsn: */ false);\n\t\t\tstr.insert(1, \"1\", /* increaseMsn: */ false);\n\t\t\tstr.append(\"3\", /* increaseMsn: */ false);\n\t\t\tawait str.expect(\"0123\");\n\t\t});\n\n\t\tit(\"can insert segments relative to obliterated segment loaded from snapshot\", async () => {\n\t\t\tstr.append(\"0x\", /* increaseMsn: */ false);\n\t\t\tstr.append(\"2\", /* increaseMsn: */ false);\n\t\t\tstr.obliterateRange(1, 2, /* increaseMsn: */ false);\n\n\t\t\t// Note that calling str.expect() switches the underlying client to the one loaded from the snapshot.\n\t\t\tawait str.expect(\"02\");\n\n\t\t\tstr.insert(1, \"1\", /* increaseMsn: */ false);\n\t\t\tstr.append(\"3\", /* increaseMsn: */ false);\n\t\t\tawait str.expect(\"0123\");\n\t\t});\n\n\t\tit(\"includes ACKed segments below MSN in body\", async () => {\n\t\t\tfor (let i = 0; i < SnapshotV1.chunkSize + 10; i++) {\n\t\t\t\tstr.append(`${i % 10}`, /* increaseMsn: */ true);\n\t\t\t}\n\n\t\t\tawait str.checkSnapshot();\n\t\t});\n\n\t\tit(\"includes ACKed segments above MSN in body\", async () => {\n\t\t\tfor (let i = 0; i < SnapshotV1.chunkSize + 10; i++) {\n\t\t\t\tstr.append(`${i % 10}`, /* increaseMsn: */ false);\n\t\t\t}\n\n\t\t\tawait str.checkSnapshot();\n\t\t});\n\n\t\tit(\"recovers annotated segments\", async () => {\n\t\t\tstr.append(\"123\", false);\n\t\t\tstr.annotate(1, 2, { foo: 1 }, false);\n\n\t\t\tawait str.checkSnapshot();\n\t\t});\n\t});\n\n\tdescribe(\"from a non-empty initial state\", () => {\n\t\tit(\"includes segments submitted while detached\", async () => {\n\t\t\tconst str = new TestString(\"A\", options, \"starting text\");\n\t\t\tawait str.expect(\"starting text\");\n\t\t});\n\t});\n}\n\ndescribe(\"snapshot\", () => {\n\tdescribe(\"with attribution\", () => {\n\t\tmakeSnapshotSuite({\n\t\t\tattribution: { track: true, policyFactory: createInsertOnlyAttributionPolicy },\n\t\t\tmergeTreeEnableObliterate: true,\n\t\t});\n\t});\n\n\tdescribe(\"with attribution and custom channels\", () => {\n\t\tmakeSnapshotSuite({\n\t\t\tattribution: {\n\t\t\t\ttrack: true,\n\t\t\t\tpolicyFactory: createPropertyTrackingAttributionPolicyFactory(\"foo\"),\n\t\t\t},\n\t\t\tmergeTreeEnableObliterate: true,\n\t\t});\n\t});\n\n\tdescribe(\"without attribution\", () => {\n\t\tmakeSnapshotSuite({\n\t\t\tattribution: { track: false },\n\t\t\tmergeTreeEnableObliterate: true,\n\t\t});\n\t});\n\n\tit(\"presence of attribution overrides merge-tree initialization value\", async () => {\n\t\tconst str = new TestString(\"id\", {\n\t\t\tattribution: { track: true, policyFactory: createInsertOnlyAttributionPolicy },\n\t\t});\n\t\tstr.append(\"hello world\", /* increaseMsn: */ true);\n\t\tawait str.checkSnapshot({\n\t\t\tattribution: { track: false, policyFactory: createInsertOnlyAttributionPolicy },\n\t\t});\n\t\tstr.insert(0, \"should have attribution\", false);\n\t\tstr.applyPendingOps();\n\t\tassert(\n\t\t\tstr.getSegment(0).attribution !== undefined,\n\t\t\t\"Attribution should be created on new segments\",\n\t\t);\n\t});\n\n\tit(\"lack of attribution overrides merge-tree initialization\", async () => {\n\t\tconst str = new TestString(\"id\", { attribution: { track: false } });\n\t\tstr.append(\"hello world\", /* increaseMsn: */ true);\n\t\tawait str.checkSnapshot({\n\t\t\tattribution: { track: true, policyFactory: createInsertOnlyAttributionPolicy },\n\t\t});\n\t\tstr.insert(0, \"should not have attribution\", false);\n\t\tstr.applyPendingOps();\n\t\tassert(\n\t\t\tstr.getSegment(0).attribution === undefined,\n\t\t\t\"No attribution should be created on new segments\",\n\t\t);\n\t});\n});\n"]}
1
+ {"version":3,"file":"snapshot.spec.js","sourceRoot":"","sources":["../../src/test/snapshot.spec.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { strict as assert } from \"node:assert\";\n\nimport {\n\tcreateInsertOnlyAttributionPolicy,\n\tcreatePropertyTrackingAttributionPolicyFactory,\n} from \"../attributionPolicy.js\";\nimport { IMergeTreeOptions } from \"../mergeTree.js\";\nimport { SnapshotV1 } from \"../snapshotV1.js\";\n\nimport { TestString, loadSnapshot } from \"./snapshot.utils.js\";\n\nfunction makeSnapshotSuite(options?: IMergeTreeOptions): void {\n\tdescribe(\"from an empty initial state\", () => {\n\t\tlet str: TestString;\n\t\tbeforeEach(() => {\n\t\t\tstr = new TestString(\"fakeId\", options);\n\t\t});\n\n\t\tafterEach(async () => {\n\t\t\t// Paranoid check that ensures `str` roundtrips through snapshot/load. This helps to catch\n\t\t\t// bugs that might be missed if the test case forgets to call/await `str.expect()`.\n\t\t\tawait str.checkSnapshot({\n\t\t\t\tattribution: { policyFactory: createInsertOnlyAttributionPolicy },\n\t\t\t});\n\t\t});\n\n\t\tit(\"excludes un-acked segments\", async () => {\n\t\t\tstr.append(\"0\", /* increaseMsn: */ false);\n\n\t\t\t// Invoke `load/getSnapshot()` directly instead of `str.expect()` to avoid ACKing the\n\t\t\t// pending insert op.\n\t\t\tconst client2 = await loadSnapshot(str.getSummary(), options);\n\n\t\t\t// Original client has inserted text, but the one loaded from the snapshot should be empty.\n\t\t\t// This is because un-ACKed ops are not included in snapshots. Instead, these ops are\n\t\t\t// retransmitted and applied after the snapshot has loaded.\n\t\t\tassert.equal(str.getText(), \"0\");\n\t\t\tassert.equal(client2.getText(), \"\");\n\t\t});\n\n\t\tit(\"includes segments below MSN\", async () => {\n\t\t\tstr.append(\"0\", /* increaseMsn: */ true);\n\t\t\tawait str.expect(\"0\");\n\t\t});\n\n\t\tit(\"includes ACKed segments above the MSN\", async () => {\n\t\t\tstr.append(\"0\", /* increaseMsn: */ false);\n\t\t\tawait str.expect(\"0\");\n\t\t});\n\n\t\tit(\"includes removals of segments above the MSN\", async () => {\n\t\t\tstr.append(\"0x\", /* increaseMsn: */ false);\n\t\t\tstr.removeRange(1, 2, /* increaseMsn: */ false);\n\t\t\tawait str.expect(\"0\");\n\t\t});\n\n\t\tit(\"includes removals above the MSN of segments below the MSN\", async () => {\n\t\t\tstr.append(\"0x\", /* increaseMsn: */ true);\n\t\t\tstr.removeRange(1, 2, /* increaseMsn: */ false);\n\t\t\tawait str.expect(\"0\");\n\t\t});\n\n\t\tit(\"can insert segments after loading removed segment\", async () => {\n\t\t\tstr.append(\"0x\", /* increaseMsn: */ true);\n\t\t\tstr.removeRange(1, 2, /* increaseMsn: */ false);\n\t\t\tawait str.expect(\"0\");\n\t\t\tstr.append(\"1\", /* increaseMsn: */ false);\n\t\t\tawait str.expect(\"01\");\n\t\t});\n\n\t\tit(\"can insert segments relative to removed segment\", async () => {\n\t\t\tstr.append(\"0x\", /* increaseMsn: */ false);\n\t\t\tstr.append(\"2\", /* increaseMsn: */ false);\n\t\t\tstr.removeRange(1, 2, /* increaseMsn: */ false);\n\t\t\tstr.insert(1, \"1\", /* increaseMsn: */ false);\n\t\t\tstr.append(\"3\", /* increaseMsn: */ false);\n\t\t\tawait str.expect(\"0123\");\n\t\t});\n\n\t\tit(\"can insert segments relative to removed segment loaded from snapshot\", async () => {\n\t\t\tstr.append(\"0x\", /* increaseMsn: */ false);\n\t\t\tstr.append(\"2\", /* increaseMsn: */ false);\n\t\t\tstr.removeRange(1, 2, /* increaseMsn: */ false);\n\n\t\t\t// Note that calling str.expect() switches the underlying client to the one loaded from the snapshot.\n\t\t\tawait str.expect(\"02\");\n\n\t\t\tstr.insert(1, \"1\", /* increaseMsn: */ false);\n\t\t\tstr.append(\"3\", /* increaseMsn: */ false);\n\t\t\tawait str.expect(\"0123\");\n\t\t});\n\n\t\tit(\"includes obliterates above the MSN of segments below the MSN\", async () => {\n\t\t\tstr.append(\"0x\", /* increaseMsn: */ true);\n\t\t\tstr.obliterateRange(1, 2, /* increaseMsn: */ false);\n\t\t\tawait str.expect(\"0\");\n\t\t});\n\n\t\tit(\"can insert segments after loading obliterated segment\", async () => {\n\t\t\tstr.append(\"0x\", /* increaseMsn: */ true);\n\t\t\tstr.obliterateRange(1, 2, /* increaseMsn: */ false);\n\t\t\tawait str.expect(\"0\");\n\t\t\tstr.append(\"1\", /* increaseMsn: */ false);\n\t\t\tawait str.expect(\"01\");\n\t\t});\n\n\t\tit(\"can insert segments relative to obliterated segment\", async () => {\n\t\t\tstr.append(\"0x\", /* increaseMsn: */ false);\n\t\t\tstr.append(\"2\", /* increaseMsn: */ false);\n\t\t\tstr.obliterateRange(1, 2, /* increaseMsn: */ false);\n\t\t\tstr.insert(1, \"1\", /* increaseMsn: */ false);\n\t\t\tstr.append(\"3\", /* increaseMsn: */ false);\n\t\t\tawait str.expect(\"0123\");\n\t\t});\n\n\t\tit(\"can insert segments relative to obliterated segment loaded from snapshot\", async () => {\n\t\t\tstr.append(\"0x\", /* increaseMsn: */ false);\n\t\t\tstr.append(\"2\", /* increaseMsn: */ false);\n\t\t\tstr.obliterateRange(1, 2, /* increaseMsn: */ false);\n\n\t\t\t// Note that calling str.expect() switches the underlying client to the one loaded from the snapshot.\n\t\t\tawait str.expect(\"02\");\n\n\t\t\tstr.insert(1, \"1\", /* increaseMsn: */ false);\n\t\t\tstr.append(\"3\", /* increaseMsn: */ false);\n\t\t\tawait str.expect(\"0123\");\n\t\t});\n\n\t\tit(\"includes ACKed segments below MSN in body\", async () => {\n\t\t\tfor (let i = 0; i < SnapshotV1.chunkSize + 10; i++) {\n\t\t\t\tstr.append(`${i % 10}`, /* increaseMsn: */ true);\n\t\t\t}\n\n\t\t\tawait str.checkSnapshot();\n\t\t});\n\n\t\tit(\"includes ACKed segments above MSN in body\", async () => {\n\t\t\tfor (let i = 0; i < SnapshotV1.chunkSize + 10; i++) {\n\t\t\t\tstr.append(`${i % 10}`, /* increaseMsn: */ false);\n\t\t\t}\n\n\t\t\tawait str.checkSnapshot();\n\t\t});\n\n\t\tit(\"recovers annotated segments\", async () => {\n\t\t\tstr.append(\"123\", false);\n\t\t\tstr.annotate(1, 2, { foo: 1 }, false);\n\n\t\t\tawait str.checkSnapshot();\n\t\t});\n\t});\n\n\tdescribe(\"from a non-empty initial state\", () => {\n\t\tit(\"includes segments submitted while detached\", async () => {\n\t\t\tconst str = new TestString(\"A\", options, \"starting text\");\n\t\t\tawait str.expect(\"starting text\");\n\t\t});\n\t});\n}\n\ndescribe(\"snapshot\", () => {\n\tdescribe(\"with attribution\", () => {\n\t\tmakeSnapshotSuite({\n\t\t\tattribution: { track: true, policyFactory: createInsertOnlyAttributionPolicy },\n\t\t\tmergeTreeEnableObliterate: true,\n\t\t});\n\t});\n\n\tdescribe(\"with attribution and custom channels\", () => {\n\t\tmakeSnapshotSuite({\n\t\t\tattribution: {\n\t\t\t\ttrack: true,\n\t\t\t\tpolicyFactory: createPropertyTrackingAttributionPolicyFactory(\"foo\"),\n\t\t\t},\n\t\t\tmergeTreeEnableObliterate: true,\n\t\t});\n\t});\n\n\tdescribe(\"without attribution\", () => {\n\t\tmakeSnapshotSuite({\n\t\t\tattribution: { track: false },\n\t\t\tmergeTreeEnableObliterate: true,\n\t\t});\n\t});\n\n\tit(\"presence of attribution overrides merge-tree initialization value\", async () => {\n\t\tconst str = new TestString(\"id\", {\n\t\t\tattribution: { track: true, policyFactory: createInsertOnlyAttributionPolicy },\n\t\t});\n\t\tstr.append(\"hello world\", /* increaseMsn: */ true);\n\t\tawait str.checkSnapshot({\n\t\t\tattribution: { track: false, policyFactory: createInsertOnlyAttributionPolicy },\n\t\t});\n\t\tstr.insert(0, \"should have attribution\", false);\n\t\tstr.applyPendingOps();\n\t\tassert(\n\t\t\tstr.getSegment(0).attribution !== undefined,\n\t\t\t\"Attribution should be created on new segments\",\n\t\t);\n\t});\n\n\tit(\"lack of attribution overrides merge-tree initialization\", async () => {\n\t\tconst str = new TestString(\"id\", { attribution: { track: false } });\n\t\tstr.append(\"hello world\", /* increaseMsn: */ true);\n\t\tawait str.checkSnapshot({\n\t\t\tattribution: { track: true, policyFactory: createInsertOnlyAttributionPolicy },\n\t\t});\n\t\tstr.insert(0, \"should not have attribution\", false);\n\t\tstr.applyPendingOps();\n\t\tassert(\n\t\t\tstr.getSegment(0).attribution === undefined,\n\t\t\t\"No attribution should be created on new segments\",\n\t\t);\n\t});\n});\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"snapshot.utils.d.ts","sourceRoot":"","sources":["../../src/test/snapshot.utils.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAOH,OAAO,EAAE,YAAY,EAAE,MAAM,oCAAoC,CAAC;AAIlE,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAEhD,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAG/C,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAK7C,wBAAsB,YAAY,CAAC,OAAO,EAAE,YAAY,EAAE,OAAO,CAAC,EAAE,iBAAiB,uBAepF;AAGD,qBAAa,UAAU;IAQrB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC;IAP1B,OAAO,CAAC,MAAM,CAAa;IAC3B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAmC;IAC3D,OAAO,CAAC,GAAG,CAAK;IAChB,OAAO,CAAC,MAAM,CAAK;gBAGlB,EAAE,EAAE,MAAM,EACO,OAAO,CAAC,+BAAmB,EAC5C,YAAY,GAAE,MAAW;IAMnB,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO;IAOtD,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,OAAO;IAI7E,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO;IAIzC,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO;IAS9C,YAAY,CAAC,WAAW,EAAE,OAAO;IAIjC,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO;IAI5D,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO;IAO1D,MAAM,CAAC,QAAQ,EAAE,MAAM;IAWvB,aAAa,CAAC,OAAO,CAAC,EAAE,iBAAiB;IA8B/C,UAAU,IAAI,YAAY;IAS1B,OAAO;IAIP,eAAe;IAOtB,OAAO,CAAC,KAAK;IAeN,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,QAAQ;CAKxC"}
1
+ {"version":3,"file":"snapshot.utils.d.ts","sourceRoot":"","sources":["../../src/test/snapshot.utils.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAOH,OAAO,EAAE,YAAY,EAAE,MAAM,oCAAoC,CAAC;AAIlE,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAEhD,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAG/C,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAK7C,wBAAsB,YAAY,CACjC,OAAO,EAAE,YAAY,EACrB,OAAO,CAAC,EAAE,iBAAiB,GACzB,OAAO,CAAC,UAAU,CAAC,CAerB;AAGD,qBAAa,UAAU;IAQrB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC;IAP1B,OAAO,CAAC,MAAM,CAAa;IAC3B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAmC;IAC3D,OAAO,CAAC,GAAG,CAAK;IAChB,OAAO,CAAC,MAAM,CAAK;gBAGlB,EAAE,EAAE,MAAM,EACO,OAAO,CAAC,+BAAmB,EAC5C,YAAY,GAAE,MAAW;IAMnB,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO,GAAG,IAAI;IAO7D,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,OAAO,GAAG,IAAI;IAIpF,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO,GAAG,IAAI;IAIhD,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO,GAAG,IAAI;IASrD,YAAY,CAAC,WAAW,EAAE,OAAO,GAAG,IAAI;IAIxC,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO,GAAG,IAAI;IAInE,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO,GAAG,IAAI;IAOjE,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAWvC,aAAa,CAAC,OAAO,CAAC,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IA8B/D,UAAU,IAAI,YAAY;IAS1B,OAAO,IAAI,MAAM;IAIjB,eAAe,IAAI,IAAI;IAO9B,OAAO,CAAC,KAAK;IAeN,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,QAAQ;CAKxC"}
@@ -3,7 +3,7 @@
3
3
  * Licensed under the MIT License.
4
4
  */
5
5
  /* eslint-disable @typescript-eslint/no-non-null-assertion */
6
- import { strict as assert } from "assert";
6
+ import { strict as assert } from "node:assert";
7
7
  import { MockStorage } from "@fluidframework/test-runtime-utils/internal";
8
8
  import { ReferenceType } from "../ops.js";
9
9
  import { SnapshotV1 } from "../snapshotV1.js";
@@ -1 +1 @@
1
- {"version":3,"file":"snapshot.utils.js","sourceRoot":"","sources":["../../src/test/snapshot.utils.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\n/* eslint-disable @typescript-eslint/no-non-null-assertion */\n\nimport { strict as assert } from \"assert\";\n\nimport { IFluidDataStoreRuntime } from \"@fluidframework/datastore-definitions/internal\";\nimport { ISummaryTree } from \"@fluidframework/driver-definitions\";\nimport { ISequencedDocumentMessage } from \"@fluidframework/driver-definitions/internal\";\nimport { MockStorage } from \"@fluidframework/test-runtime-utils/internal\";\n\nimport { IMergeTreeOptions } from \"../mergeTree.js\";\nimport { ISegment } from \"../mergeTreeNodes.js\";\nimport { IMergeTreeOp, ReferenceType } from \"../ops.js\";\nimport { PropertySet } from \"../properties.js\";\nimport { SnapshotV1 } from \"../snapshotV1.js\";\n\nimport { TestClient } from \"./testClient.js\";\nimport { createClientsAtInitialState } from \"./testClientLogger.js\";\nimport { TestSerializer } from \"./testSerializer.js\";\n\n// Reconstitutes a MergeTree client from a summary\nexport async function loadSnapshot(summary: ISummaryTree, options?: IMergeTreeOptions) {\n\tconst services = MockStorage.createFromSummary(summary);\n\tconst client2 = new TestClient(options);\n\tconst runtime: Partial<IFluidDataStoreRuntime> = {\n\t\tlogger: client2.logger,\n\t\tclientId: \"1\",\n\t};\n\n\tconst { catchupOpsP } = await client2.load(\n\t\truntime as IFluidDataStoreRuntime,\n\t\tservices,\n\t\tnew TestSerializer(),\n\t);\n\tawait catchupOpsP;\n\treturn client2;\n}\n\n// Wrapper around MergeTree client that provides a convenient SharedString-like API for tests.\nexport class TestString {\n\tprivate client: TestClient;\n\tprivate readonly pending: ISequencedDocumentMessage[] = [];\n\tprivate seq = 0;\n\tprivate minSeq = 0;\n\n\tconstructor(\n\t\tid: string,\n\t\tprivate readonly options?: IMergeTreeOptions,\n\t\tinitialState: string = \"\",\n\t) {\n\t\tthis.client = createClientsAtInitialState({ initialState, options }, id)[id];\n\t\tthis.client.startOrUpdateCollaboration(id);\n\t}\n\n\tpublic insert(pos: number, text: string, increaseMsn: boolean) {\n\t\tthis.queue(\n\t\t\tthis.client.insertTextLocal(pos, text, { segment: this.pending.length })!,\n\t\t\tincreaseMsn,\n\t\t);\n\t}\n\n\tpublic annotate(start: number, end: number, props: PropertySet, increaseMsn: boolean) {\n\t\tthis.queue(this.client.annotateRangeLocal(start, end, props)!, increaseMsn);\n\t}\n\n\tpublic append(text: string, increaseMsn: boolean) {\n\t\tthis.insert(this.client.getLength(), text, increaseMsn);\n\t}\n\n\tpublic insertMarker(pos: number, increaseMsn: boolean) {\n\t\tthis.queue(\n\t\t\tthis.client.insertMarkerLocal(pos, ReferenceType.Simple, {\n\t\t\t\tsegment: this.pending.length,\n\t\t\t})!,\n\t\t\tincreaseMsn,\n\t\t);\n\t}\n\n\tpublic appendMarker(increaseMsn: boolean) {\n\t\tthis.insertMarker(this.client.getLength(), increaseMsn);\n\t}\n\n\tpublic removeRange(start: number, end: number, increaseMsn: boolean) {\n\t\tthis.queue(this.client.removeRangeLocal(start, end)!, increaseMsn);\n\t}\n\n\tpublic obliterateRange(start: number, end: number, increaseMsn: boolean) {\n\t\tthis.queue(this.client.obliterateRangeLocal(start, end)!, increaseMsn);\n\t}\n\n\t// Ensures the client's text matches the `expected` string and round-trips through a snapshot\n\t// into a new client. The current client is then replaced with the loaded client in the hope\n\t// that it will help detect corruption bugs as further ops are applied.\n\tpublic async expect(expected: string) {\n\t\tassert.equal(\n\t\t\tthis.client.getText(),\n\t\t\texpected,\n\t\t\t\"MergeTree must contain the expected text prior to applying ops.\",\n\t\t);\n\n\t\tawait this.checkSnapshot(this.options);\n\t}\n\n\t// Ensures the MergeTree client's contents successfully roundtrip through a snapshot.\n\tpublic async checkSnapshot(options?: IMergeTreeOptions) {\n\t\tthis.applyPendingOps();\n\t\tconst expectedAttributionKeys = this.client.getAllAttributionSeqs();\n\t\tconst summary = this.getSummary();\n\t\tconst client2 = await loadSnapshot(summary, options ?? this.options);\n\n\t\tassert.equal(\n\t\t\tthis.client.getText(),\n\t\t\tclient2.getText(),\n\t\t\t\"Snapshot must produce a MergeTree with the same text as the original\",\n\t\t);\n\n\t\t// Also check the length as weak test for non-TextSegments.\n\t\tassert.equal(\n\t\t\tthis.client.getLength(),\n\t\t\tclient2.getLength(),\n\t\t\t\"Snapshot must produce a MergeTree with the same length as the original\",\n\t\t);\n\n\t\tconst actualAttributionKeys = client2.getAllAttributionSeqs();\n\t\tassert.deepEqual(\n\t\t\tactualAttributionKeys,\n\t\t\texpectedAttributionKeys,\n\t\t\t\"Snapshot must produce a MergeTree with identical attribution as the original\",\n\t\t);\n\n\t\t// Replace our client with the one loaded by the snapshot.\n\t\tthis.client = client2;\n\t}\n\n\tpublic getSummary(): ISummaryTree {\n\t\tconst snapshot = new SnapshotV1(this.client.mergeTree, this.client.logger, (id) =>\n\t\t\tthis.client.getLongClientId(id),\n\t\t);\n\n\t\tsnapshot.extractSync();\n\t\treturn snapshot.emit(TestClient.serializer, undefined!).summary;\n\t}\n\n\tpublic getText() {\n\t\treturn this.client.getText();\n\t}\n\n\tpublic applyPendingOps() {\n\t\tfor (const msg of this.pending) {\n\t\t\tthis.client.applyMsg(msg);\n\t\t}\n\t\tthis.pending.splice(0, this.pending.length);\n\t}\n\n\tprivate queue(op: IMergeTreeOp, increaseMsn: boolean) {\n\t\tconst refSeq = this.seq;\n\t\tconst seq = ++this.seq;\n\n\t\tthis.pending.push(\n\t\t\tthis.client.makeOpMessage(\n\t\t\t\top,\n\t\t\t\tseq,\n\t\t\t\trefSeq,\n\t\t\t\tthis.client.longClientId,\n\t\t\t\t(this.minSeq = increaseMsn ? seq : this.minSeq),\n\t\t\t),\n\t\t);\n\t}\n\n\tpublic getSegment(pos: number): ISegment {\n\t\tconst { segment } = this.client.getContainingSegment(pos);\n\t\tassert(segment !== undefined);\n\t\treturn segment;\n\t}\n}\n"]}
1
+ {"version":3,"file":"snapshot.utils.js","sourceRoot":"","sources":["../../src/test/snapshot.utils.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\n/* eslint-disable @typescript-eslint/no-non-null-assertion */\n\nimport { strict as assert } from \"node:assert\";\n\nimport { IFluidDataStoreRuntime } from \"@fluidframework/datastore-definitions/internal\";\nimport { ISummaryTree } from \"@fluidframework/driver-definitions\";\nimport { ISequencedDocumentMessage } from \"@fluidframework/driver-definitions/internal\";\nimport { MockStorage } from \"@fluidframework/test-runtime-utils/internal\";\n\nimport { IMergeTreeOptions } from \"../mergeTree.js\";\nimport { ISegment } from \"../mergeTreeNodes.js\";\nimport { IMergeTreeOp, ReferenceType } from \"../ops.js\";\nimport { PropertySet } from \"../properties.js\";\nimport { SnapshotV1 } from \"../snapshotV1.js\";\n\nimport { TestClient } from \"./testClient.js\";\nimport { createClientsAtInitialState } from \"./testClientLogger.js\";\nimport { TestSerializer } from \"./testSerializer.js\";\n\n// Reconstitutes a MergeTree client from a summary\nexport async function loadSnapshot(\n\tsummary: ISummaryTree,\n\toptions?: IMergeTreeOptions,\n): Promise<TestClient> {\n\tconst services = MockStorage.createFromSummary(summary);\n\tconst client2 = new TestClient(options);\n\tconst runtime: Partial<IFluidDataStoreRuntime> = {\n\t\tlogger: client2.logger,\n\t\tclientId: \"1\",\n\t};\n\n\tconst { catchupOpsP } = await client2.load(\n\t\truntime as IFluidDataStoreRuntime,\n\t\tservices,\n\t\tnew TestSerializer(),\n\t);\n\tawait catchupOpsP;\n\treturn client2;\n}\n\n// Wrapper around MergeTree client that provides a convenient SharedString-like API for tests.\nexport class TestString {\n\tprivate client: TestClient;\n\tprivate readonly pending: ISequencedDocumentMessage[] = [];\n\tprivate seq = 0;\n\tprivate minSeq = 0;\n\n\tconstructor(\n\t\tid: string,\n\t\tprivate readonly options?: IMergeTreeOptions,\n\t\tinitialState: string = \"\",\n\t) {\n\t\tthis.client = createClientsAtInitialState({ initialState, options }, id)[id];\n\t\tthis.client.startOrUpdateCollaboration(id);\n\t}\n\n\tpublic insert(pos: number, text: string, increaseMsn: boolean): void {\n\t\tthis.queue(\n\t\t\tthis.client.insertTextLocal(pos, text, { segment: this.pending.length })!,\n\t\t\tincreaseMsn,\n\t\t);\n\t}\n\n\tpublic annotate(start: number, end: number, props: PropertySet, increaseMsn: boolean): void {\n\t\tthis.queue(this.client.annotateRangeLocal(start, end, props)!, increaseMsn);\n\t}\n\n\tpublic append(text: string, increaseMsn: boolean): void {\n\t\tthis.insert(this.client.getLength(), text, increaseMsn);\n\t}\n\n\tpublic insertMarker(pos: number, increaseMsn: boolean): void {\n\t\tthis.queue(\n\t\t\tthis.client.insertMarkerLocal(pos, ReferenceType.Simple, {\n\t\t\t\tsegment: this.pending.length,\n\t\t\t})!,\n\t\t\tincreaseMsn,\n\t\t);\n\t}\n\n\tpublic appendMarker(increaseMsn: boolean): void {\n\t\tthis.insertMarker(this.client.getLength(), increaseMsn);\n\t}\n\n\tpublic removeRange(start: number, end: number, increaseMsn: boolean): void {\n\t\tthis.queue(this.client.removeRangeLocal(start, end)!, increaseMsn);\n\t}\n\n\tpublic obliterateRange(start: number, end: number, increaseMsn: boolean): void {\n\t\tthis.queue(this.client.obliterateRangeLocal(start, end)!, increaseMsn);\n\t}\n\n\t// Ensures the client's text matches the `expected` string and round-trips through a snapshot\n\t// into a new client. The current client is then replaced with the loaded client in the hope\n\t// that it will help detect corruption bugs as further ops are applied.\n\tpublic async expect(expected: string): Promise<void> {\n\t\tassert.equal(\n\t\t\tthis.client.getText(),\n\t\t\texpected,\n\t\t\t\"MergeTree must contain the expected text prior to applying ops.\",\n\t\t);\n\n\t\tawait this.checkSnapshot(this.options);\n\t}\n\n\t// Ensures the MergeTree client's contents successfully roundtrip through a snapshot.\n\tpublic async checkSnapshot(options?: IMergeTreeOptions): Promise<void> {\n\t\tthis.applyPendingOps();\n\t\tconst expectedAttributionKeys = this.client.getAllAttributionSeqs();\n\t\tconst summary = this.getSummary();\n\t\tconst client2 = await loadSnapshot(summary, options ?? this.options);\n\n\t\tassert.equal(\n\t\t\tthis.client.getText(),\n\t\t\tclient2.getText(),\n\t\t\t\"Snapshot must produce a MergeTree with the same text as the original\",\n\t\t);\n\n\t\t// Also check the length as weak test for non-TextSegments.\n\t\tassert.equal(\n\t\t\tthis.client.getLength(),\n\t\t\tclient2.getLength(),\n\t\t\t\"Snapshot must produce a MergeTree with the same length as the original\",\n\t\t);\n\n\t\tconst actualAttributionKeys = client2.getAllAttributionSeqs();\n\t\tassert.deepEqual(\n\t\t\tactualAttributionKeys,\n\t\t\texpectedAttributionKeys,\n\t\t\t\"Snapshot must produce a MergeTree with identical attribution as the original\",\n\t\t);\n\n\t\t// Replace our client with the one loaded by the snapshot.\n\t\tthis.client = client2;\n\t}\n\n\tpublic getSummary(): ISummaryTree {\n\t\tconst snapshot = new SnapshotV1(this.client.mergeTree, this.client.logger, (id) =>\n\t\t\tthis.client.getLongClientId(id),\n\t\t);\n\n\t\tsnapshot.extractSync();\n\t\treturn snapshot.emit(TestClient.serializer, undefined!).summary;\n\t}\n\n\tpublic getText(): string {\n\t\treturn this.client.getText();\n\t}\n\n\tpublic applyPendingOps(): void {\n\t\tfor (const msg of this.pending) {\n\t\t\tthis.client.applyMsg(msg);\n\t\t}\n\t\tthis.pending.splice(0, this.pending.length);\n\t}\n\n\tprivate queue(op: IMergeTreeOp, increaseMsn: boolean): void {\n\t\tconst refSeq = this.seq;\n\t\tconst seq = ++this.seq;\n\n\t\tthis.pending.push(\n\t\t\tthis.client.makeOpMessage(\n\t\t\t\top,\n\t\t\t\tseq,\n\t\t\t\trefSeq,\n\t\t\t\tthis.client.longClientId,\n\t\t\t\t(this.minSeq = increaseMsn ? seq : this.minSeq),\n\t\t\t),\n\t\t);\n\t}\n\n\tpublic getSegment(pos: number): ISegment {\n\t\tconst { segment } = this.client.getContainingSegment(pos);\n\t\tassert(segment !== undefined);\n\t\treturn segment;\n\t}\n}\n"]}
@@ -3,7 +3,7 @@
3
3
  * Licensed under the MIT License.
4
4
  */
5
5
  /* eslint-disable @typescript-eslint/no-non-null-assertion */
6
- import { strict as assert } from "assert";
6
+ import { strict as assert } from "node:assert";
7
7
  import { MockStorage } from "@fluidframework/test-runtime-utils/internal";
8
8
  import { createInsertOnlyAttributionPolicy, createPropertyTrackingAndInsertionAttributionPolicyFactory, } from "../attributionPolicy.js";
9
9
  import { SnapshotLegacy } from "../snapshotlegacy.js";
@@ -102,13 +102,15 @@ describe("snapshot", () => {
102
102
  },
103
103
  }, "A", "B");
104
104
  const ops = [];
105
- const applyAllOps = () => ops.splice(0).forEach((op) => clients.all.map((client) => client.applyMsg(op)));
105
+ const applyAllOps = () => {
106
+ for (const op of ops.splice(0))
107
+ clients.all.map((client) => client.applyMsg(op));
108
+ };
106
109
  ops.push(clients.A.makeOpMessage(clients.A.insertTextLocal(0, "hello world"), /* seq */ 1));
107
110
  applyAllOps();
108
111
  ops.push(clients.B.makeOpMessage(clients.B.insertTextLocal(6, "new "),
109
112
  /* seq */ 2,
110
- /* refSeq */ 1));
111
- ops.push(clients.B.makeOpMessage(clients.B.annotateRangeLocal(0, 14, { foo: "bar" }),
113
+ /* refSeq */ 1), clients.B.makeOpMessage(clients.B.annotateRangeLocal(0, 14, { foo: "bar" }),
112
114
  /* seq */ 3,
113
115
  /* refSeq */ 2));
114
116
  applyAllOps();
@@ -126,7 +128,10 @@ describe("snapshot", () => {
126
128
  options: { attribution: { track: false } },
127
129
  }, "A");
128
130
  const ops = [];
129
- const applyAllOps = () => ops.splice(0).forEach((op) => clients.all.map((client) => client.applyMsg(op)));
131
+ const applyAllOps = () => {
132
+ for (const op of ops.splice(0))
133
+ clients.all.map((client) => client.applyMsg(op));
134
+ };
130
135
  ops.push(clients.A.makeOpMessage(clients.A.insertTextLocal(0, "hello world"), /* seq */ 1));
131
136
  applyAllOps();
132
137
  await assertAttributionKeysMatch(clients.A, {
@@ -1 +1 @@
1
- {"version":3,"file":"snapshotlegacy.spec.js","sourceRoot":"","sources":["../../src/test/snapshotlegacy.spec.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\n/* eslint-disable @typescript-eslint/no-non-null-assertion */\n\nimport { strict as assert } from \"assert\";\n\nimport { IFluidDataStoreRuntime } from \"@fluidframework/datastore-definitions/internal\";\nimport { ISequencedDocumentMessage } from \"@fluidframework/driver-definitions/internal\";\nimport { MockStorage } from \"@fluidframework/test-runtime-utils/internal\";\n\nimport {\n\tcreateInsertOnlyAttributionPolicy,\n\tcreatePropertyTrackingAndInsertionAttributionPolicyFactory,\n} from \"../attributionPolicy.js\";\nimport { SnapshotLegacy } from \"../snapshotlegacy.js\";\n\nimport { TestClient } from \"./testClient.js\";\nimport { createClientsAtInitialState } from \"./testClientLogger.js\";\nimport { TestSerializer } from \"./testSerializer.js\";\n\ndescribe(\"snapshot\", () => {\n\tit(\"header only\", async () => {\n\t\tconst client1 = new TestClient();\n\t\tclient1.startOrUpdateCollaboration(\"0\");\n\t\tfor (let i = 0; i < SnapshotLegacy.sizeOfFirstChunk; i++) {\n\t\t\tconst op = client1.insertTextLocal(client1.getLength(), `${i % 10}`, { segment: i });\n\t\t\tconst msg = client1.makeOpMessage(op, i + 1);\n\t\t\tmsg.minimumSequenceNumber = i + 1;\n\t\t\tclient1.applyMsg(msg);\n\t\t}\n\n\t\tconst serializer = new TestSerializer();\n\n\t\tconst snapshot = new SnapshotLegacy(client1.mergeTree, client1.logger);\n\t\tsnapshot.extractSync();\n\t\tconst summaryTree = snapshot.emit([], serializer, undefined!);\n\t\tconst services = MockStorage.createFromSummary(summaryTree.summary);\n\n\t\tconst client2 = new TestClient(undefined);\n\t\tconst runtime: Partial<IFluidDataStoreRuntime> = {\n\t\t\tlogger: client2.logger,\n\t\t\tclientId: \"1\",\n\t\t};\n\t\tawait client2.load(runtime as IFluidDataStoreRuntime, services, serializer);\n\n\t\tassert.equal(client2.getLength(), client1.getLength());\n\t\tassert.equal(client2.getText(), client1.getText());\n\t}).timeout(5000);\n\n\tit(\"header and body\", async () => {\n\t\tconst clients = [new TestClient(), new TestClient(), new TestClient()];\n\t\tclients[0].startOrUpdateCollaboration(\"0\");\n\t\tfor (let i = 0; i < SnapshotLegacy.sizeOfFirstChunk + 10; i++) {\n\t\t\tconst op = clients[0].insertTextLocal(clients[0].getLength(), `${i % 10}`, {\n\t\t\t\tsegment: i,\n\t\t\t})!;\n\t\t\tconst msg = clients[0].makeOpMessage(op, i + 1);\n\t\t\tmsg.minimumSequenceNumber = i + 1;\n\t\t\tclients[0].applyMsg(msg);\n\t\t}\n\n\t\tconst serializer = new TestSerializer();\n\t\tfor (let i = 0; i < clients.length - 1; i++) {\n\t\t\tconst client1 = clients[i];\n\t\t\tconst client2 = clients[i + 1];\n\t\t\tconst snapshot = new SnapshotLegacy(client1.mergeTree, client1.logger);\n\t\t\tsnapshot.extractSync();\n\t\t\tconst summaryTree = snapshot.emit([], serializer, undefined!);\n\t\t\tconst services = MockStorage.createFromSummary(summaryTree.summary);\n\t\t\tconst runtime: Partial<IFluidDataStoreRuntime> = {\n\t\t\t\tlogger: client2.logger,\n\t\t\t\tclientId: (i + 1).toString(),\n\t\t\t};\n\t\t\tawait client2.load(runtime as IFluidDataStoreRuntime, services, serializer);\n\n\t\t\tconst client2Len = client2.getLength();\n\t\t\tassert.equal(\n\t\t\t\tclient2Len,\n\t\t\t\tclient1.getLength(),\n\t\t\t\t`client${client2.longClientId} and client${client1.longClientId} lengths don't match`,\n\t\t\t);\n\n\t\t\tassert.equal(\n\t\t\t\tclient2.getText(SnapshotLegacy.sizeOfFirstChunk - 1),\n\t\t\t\tclient1.getText(SnapshotLegacy.sizeOfFirstChunk - 1),\n\t\t\t);\n\t\t}\n\t}).timeout(5000);\n\n\tasync function assertAttributionKeysMatch(\n\t\tclient: TestClient,\n\t\texpected: {\n\t\t\troot: (number | undefined)[];\n\t\t\tchannels?: { [name: string]: (number | undefined)[] };\n\t\t},\n\t): Promise<void> {\n\t\tassert.deepEqual(\n\t\t\tclient.getAllAttributionSeqs(),\n\t\t\texpected.root,\n\t\t\t\"Keys don't match before round-tripping\",\n\t\t);\n\t\tfor (const [channel, channelExpectation] of Object.entries(expected.channels ?? {})) {\n\t\t\tassert.deepEqual(\n\t\t\t\tclient.getAllAttributionSeqs(channel),\n\t\t\t\tchannelExpectation,\n\t\t\t\t`Keys for channel ${channel} don't match before round-trip.`,\n\t\t\t);\n\t\t}\n\t\tconst serializer = new TestSerializer();\n\t\t// This avoids necessitating handling catchup ops.\n\t\tclient.mergeTree.setMinSeq(client.mergeTree.collabWindow.currentSeq);\n\t\tconst snapshot = new SnapshotLegacy(client.mergeTree, client.logger);\n\t\tsnapshot.extractSync();\n\t\tconst summaryTree = snapshot.emit([], serializer, undefined!);\n\t\tconst services = MockStorage.createFromSummary(summaryTree.summary);\n\n\t\tconst roundTripClient = new TestClient({\n\t\t\tattribution: {\n\t\t\t\ttrack: true,\n\t\t\t\tpolicyFactory: createInsertOnlyAttributionPolicy,\n\t\t\t},\n\t\t});\n\t\tconst runtime: Partial<IFluidDataStoreRuntime> = {\n\t\t\tlogger: roundTripClient.logger,\n\t\t\tclientId: \"round-trips summary\",\n\t\t};\n\t\tawait roundTripClient.load(runtime as IFluidDataStoreRuntime, services, serializer);\n\t\tassert.deepEqual(\n\t\t\troundTripClient.getAllAttributionSeqs(),\n\t\t\texpected.root,\n\t\t\t\"Keys don't match after round-tripping\",\n\t\t);\n\t\tfor (const [channel, channelExpectation] of Object.entries(expected.channels ?? {})) {\n\t\t\tassert.deepEqual(\n\t\t\t\troundTripClient.getAllAttributionSeqs(channel),\n\t\t\t\tchannelExpectation,\n\t\t\t\t`Keys for channel ${channel} don't match after round-trip.`,\n\t\t\t);\n\t\t}\n\t}\n\n\tit(\"preserves attribution information\", async () => {\n\t\tconst clients = createClientsAtInitialState(\n\t\t\t{\n\t\t\t\tinitialState: \"\",\n\t\t\t\toptions: {\n\t\t\t\t\tattribution: {\n\t\t\t\t\t\ttrack: true,\n\t\t\t\t\t\tpolicyFactory: createPropertyTrackingAndInsertionAttributionPolicyFactory(\"foo\"),\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\t\"A\",\n\t\t\t\"B\",\n\t\t);\n\n\t\tconst ops: ISequencedDocumentMessage[] = [];\n\t\tconst applyAllOps = () =>\n\t\t\tops.splice(0).forEach((op) => clients.all.map((client) => client.applyMsg(op)));\n\n\t\tops.push(\n\t\t\tclients.A.makeOpMessage(clients.A.insertTextLocal(0, \"hello world\"), /* seq */ 1),\n\t\t);\n\n\t\tapplyAllOps();\n\n\t\tops.push(\n\t\t\tclients.B.makeOpMessage(\n\t\t\t\tclients.B.insertTextLocal(6, \"new \"),\n\t\t\t\t/* seq */ 2,\n\t\t\t\t/* refSeq */ 1,\n\t\t\t),\n\t\t);\n\n\t\tops.push(\n\t\t\tclients.B.makeOpMessage(\n\t\t\t\tclients.B.annotateRangeLocal(0, 14, { foo: \"bar\" }),\n\t\t\t\t/* seq */ 3,\n\t\t\t\t/* refSeq */ 2,\n\t\t\t),\n\t\t);\n\n\t\tapplyAllOps();\n\n\t\tawait assertAttributionKeysMatch(clients.A, {\n\t\t\t// \"hello \" has key 1 (i.e. seq 1), \"new \" has key 2 (i.e. seq 2), \"world\" has key 1.\n\t\t\troot: [1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 1, 1, 1, 1, 1],\n\t\t\tchannels: {\n\t\t\t\tfoo: Array.from({ length: \"hello new world\".length }, (_, i) =>\n\t\t\t\t\ti < 14 ? 3 : undefined,\n\t\t\t\t),\n\t\t\t},\n\t\t});\n\t});\n\n\tit(\"doesn't include attribution information when attribution tracking is false on doc creation\", async () => {\n\t\tconst clients = createClientsAtInitialState(\n\t\t\t{\n\t\t\t\tinitialState: \"\",\n\t\t\t\toptions: { attribution: { track: false } },\n\t\t\t},\n\t\t\t\"A\",\n\t\t);\n\n\t\tconst ops: ISequencedDocumentMessage[] = [];\n\t\tconst applyAllOps = () =>\n\t\t\tops.splice(0).forEach((op) => clients.all.map((client) => client.applyMsg(op)));\n\n\t\tops.push(\n\t\t\tclients.A.makeOpMessage(clients.A.insertTextLocal(0, \"hello world\"), /* seq */ 1),\n\t\t);\n\n\t\tapplyAllOps();\n\n\t\tawait assertAttributionKeysMatch(clients.A, {\n\t\t\troot: Array.from({ length: \"hello world\".length }, () => undefined),\n\t\t});\n\t});\n});\n"]}
1
+ {"version":3,"file":"snapshotlegacy.spec.js","sourceRoot":"","sources":["../../src/test/snapshotlegacy.spec.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\n/* eslint-disable @typescript-eslint/no-non-null-assertion */\n\nimport { strict as assert } from \"node:assert\";\n\nimport { IFluidDataStoreRuntime } from \"@fluidframework/datastore-definitions/internal\";\nimport { ISequencedDocumentMessage } from \"@fluidframework/driver-definitions/internal\";\nimport { MockStorage } from \"@fluidframework/test-runtime-utils/internal\";\n\nimport {\n\tcreateInsertOnlyAttributionPolicy,\n\tcreatePropertyTrackingAndInsertionAttributionPolicyFactory,\n} from \"../attributionPolicy.js\";\nimport { SnapshotLegacy } from \"../snapshotlegacy.js\";\n\nimport { TestClient } from \"./testClient.js\";\nimport { createClientsAtInitialState } from \"./testClientLogger.js\";\nimport { TestSerializer } from \"./testSerializer.js\";\n\ndescribe(\"snapshot\", () => {\n\tit(\"header only\", async () => {\n\t\tconst client1 = new TestClient();\n\t\tclient1.startOrUpdateCollaboration(\"0\");\n\t\tfor (let i = 0; i < SnapshotLegacy.sizeOfFirstChunk; i++) {\n\t\t\tconst op = client1.insertTextLocal(client1.getLength(), `${i % 10}`, { segment: i });\n\t\t\tconst msg = client1.makeOpMessage(op, i + 1);\n\t\t\tmsg.minimumSequenceNumber = i + 1;\n\t\t\tclient1.applyMsg(msg);\n\t\t}\n\n\t\tconst serializer = new TestSerializer();\n\n\t\tconst snapshot = new SnapshotLegacy(client1.mergeTree, client1.logger);\n\t\tsnapshot.extractSync();\n\t\tconst summaryTree = snapshot.emit([], serializer, undefined!);\n\t\tconst services = MockStorage.createFromSummary(summaryTree.summary);\n\n\t\tconst client2 = new TestClient(undefined);\n\t\tconst runtime: Partial<IFluidDataStoreRuntime> = {\n\t\t\tlogger: client2.logger,\n\t\t\tclientId: \"1\",\n\t\t};\n\t\tawait client2.load(runtime as IFluidDataStoreRuntime, services, serializer);\n\n\t\tassert.equal(client2.getLength(), client1.getLength());\n\t\tassert.equal(client2.getText(), client1.getText());\n\t}).timeout(5000);\n\n\tit(\"header and body\", async () => {\n\t\tconst clients = [new TestClient(), new TestClient(), new TestClient()];\n\t\tclients[0].startOrUpdateCollaboration(\"0\");\n\t\tfor (let i = 0; i < SnapshotLegacy.sizeOfFirstChunk + 10; i++) {\n\t\t\tconst op = clients[0].insertTextLocal(clients[0].getLength(), `${i % 10}`, {\n\t\t\t\tsegment: i,\n\t\t\t})!;\n\t\t\tconst msg = clients[0].makeOpMessage(op, i + 1);\n\t\t\tmsg.minimumSequenceNumber = i + 1;\n\t\t\tclients[0].applyMsg(msg);\n\t\t}\n\n\t\tconst serializer = new TestSerializer();\n\t\tfor (let i = 0; i < clients.length - 1; i++) {\n\t\t\tconst client1 = clients[i];\n\t\t\tconst client2 = clients[i + 1];\n\t\t\tconst snapshot = new SnapshotLegacy(client1.mergeTree, client1.logger);\n\t\t\tsnapshot.extractSync();\n\t\t\tconst summaryTree = snapshot.emit([], serializer, undefined!);\n\t\t\tconst services = MockStorage.createFromSummary(summaryTree.summary);\n\t\t\tconst runtime: Partial<IFluidDataStoreRuntime> = {\n\t\t\t\tlogger: client2.logger,\n\t\t\t\tclientId: (i + 1).toString(),\n\t\t\t};\n\t\t\tawait client2.load(runtime as IFluidDataStoreRuntime, services, serializer);\n\n\t\t\tconst client2Len = client2.getLength();\n\t\t\tassert.equal(\n\t\t\t\tclient2Len,\n\t\t\t\tclient1.getLength(),\n\t\t\t\t`client${client2.longClientId} and client${client1.longClientId} lengths don't match`,\n\t\t\t);\n\n\t\t\tassert.equal(\n\t\t\t\tclient2.getText(SnapshotLegacy.sizeOfFirstChunk - 1),\n\t\t\t\tclient1.getText(SnapshotLegacy.sizeOfFirstChunk - 1),\n\t\t\t);\n\t\t}\n\t}).timeout(5000);\n\n\tasync function assertAttributionKeysMatch(\n\t\tclient: TestClient,\n\t\texpected: {\n\t\t\troot: (number | undefined)[];\n\t\t\tchannels?: { [name: string]: (number | undefined)[] };\n\t\t},\n\t): Promise<void> {\n\t\tassert.deepEqual(\n\t\t\tclient.getAllAttributionSeqs(),\n\t\t\texpected.root,\n\t\t\t\"Keys don't match before round-tripping\",\n\t\t);\n\t\tfor (const [channel, channelExpectation] of Object.entries(expected.channels ?? {})) {\n\t\t\tassert.deepEqual(\n\t\t\t\tclient.getAllAttributionSeqs(channel),\n\t\t\t\tchannelExpectation,\n\t\t\t\t`Keys for channel ${channel} don't match before round-trip.`,\n\t\t\t);\n\t\t}\n\t\tconst serializer = new TestSerializer();\n\t\t// This avoids necessitating handling catchup ops.\n\t\tclient.mergeTree.setMinSeq(client.mergeTree.collabWindow.currentSeq);\n\t\tconst snapshot = new SnapshotLegacy(client.mergeTree, client.logger);\n\t\tsnapshot.extractSync();\n\t\tconst summaryTree = snapshot.emit([], serializer, undefined!);\n\t\tconst services = MockStorage.createFromSummary(summaryTree.summary);\n\n\t\tconst roundTripClient = new TestClient({\n\t\t\tattribution: {\n\t\t\t\ttrack: true,\n\t\t\t\tpolicyFactory: createInsertOnlyAttributionPolicy,\n\t\t\t},\n\t\t});\n\t\tconst runtime: Partial<IFluidDataStoreRuntime> = {\n\t\t\tlogger: roundTripClient.logger,\n\t\t\tclientId: \"round-trips summary\",\n\t\t};\n\t\tawait roundTripClient.load(runtime as IFluidDataStoreRuntime, services, serializer);\n\t\tassert.deepEqual(\n\t\t\troundTripClient.getAllAttributionSeqs(),\n\t\t\texpected.root,\n\t\t\t\"Keys don't match after round-tripping\",\n\t\t);\n\t\tfor (const [channel, channelExpectation] of Object.entries(expected.channels ?? {})) {\n\t\t\tassert.deepEqual(\n\t\t\t\troundTripClient.getAllAttributionSeqs(channel),\n\t\t\t\tchannelExpectation,\n\t\t\t\t`Keys for channel ${channel} don't match after round-trip.`,\n\t\t\t);\n\t\t}\n\t}\n\n\tit(\"preserves attribution information\", async () => {\n\t\tconst clients = createClientsAtInitialState(\n\t\t\t{\n\t\t\t\tinitialState: \"\",\n\t\t\t\toptions: {\n\t\t\t\t\tattribution: {\n\t\t\t\t\t\ttrack: true,\n\t\t\t\t\t\tpolicyFactory: createPropertyTrackingAndInsertionAttributionPolicyFactory(\"foo\"),\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\t\"A\",\n\t\t\t\"B\",\n\t\t);\n\n\t\tconst ops: ISequencedDocumentMessage[] = [];\n\t\tconst applyAllOps = (): void => {\n\t\t\tfor (const op of ops.splice(0)) clients.all.map((client) => client.applyMsg(op));\n\t\t};\n\n\t\tops.push(\n\t\t\tclients.A.makeOpMessage(clients.A.insertTextLocal(0, \"hello world\"), /* seq */ 1),\n\t\t);\n\n\t\tapplyAllOps();\n\n\t\tops.push(\n\t\t\tclients.B.makeOpMessage(\n\t\t\t\tclients.B.insertTextLocal(6, \"new \"),\n\t\t\t\t/* seq */ 2,\n\t\t\t\t/* refSeq */ 1,\n\t\t\t),\n\t\t\tclients.B.makeOpMessage(\n\t\t\t\tclients.B.annotateRangeLocal(0, 14, { foo: \"bar\" }),\n\t\t\t\t/* seq */ 3,\n\t\t\t\t/* refSeq */ 2,\n\t\t\t),\n\t\t);\n\n\t\tapplyAllOps();\n\n\t\tawait assertAttributionKeysMatch(clients.A, {\n\t\t\t// \"hello \" has key 1 (i.e. seq 1), \"new \" has key 2 (i.e. seq 2), \"world\" has key 1.\n\t\t\troot: [1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 1, 1, 1, 1, 1],\n\t\t\tchannels: {\n\t\t\t\tfoo: Array.from({ length: \"hello new world\".length }, (_, i) =>\n\t\t\t\t\ti < 14 ? 3 : undefined,\n\t\t\t\t),\n\t\t\t},\n\t\t});\n\t});\n\n\tit(\"doesn't include attribution information when attribution tracking is false on doc creation\", async () => {\n\t\tconst clients = createClientsAtInitialState(\n\t\t\t{\n\t\t\t\tinitialState: \"\",\n\t\t\t\toptions: { attribution: { track: false } },\n\t\t\t},\n\t\t\t\"A\",\n\t\t);\n\n\t\tconst ops: ISequencedDocumentMessage[] = [];\n\t\tconst applyAllOps = (): void => {\n\t\t\tfor (const op of ops.splice(0)) clients.all.map((client) => client.applyMsg(op));\n\t\t};\n\n\t\tops.push(\n\t\t\tclients.A.makeOpMessage(clients.A.insertTextLocal(0, \"hello world\"), /* seq */ 1),\n\t\t);\n\n\t\tapplyAllOps();\n\n\t\tawait assertAttributionKeysMatch(clients.A, {\n\t\t\troot: Array.from({ length: \"hello world\".length }, () => undefined),\n\t\t});\n\t});\n});\n"]}
@@ -2,7 +2,7 @@
2
2
  * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
3
  * Licensed under the MIT License.
4
4
  */
5
- import { strict as assert } from "assert";
5
+ import { strict as assert } from "node:assert";
6
6
  import { TrackingGroup } from "../mergeTreeTracking.js";
7
7
  import { ReferenceType } from "../ops.js";
8
8
  import { SortedSegmentSet } from "../sortedSegmentSet.js";
@@ -87,7 +87,11 @@ describe("SortedSegmentSet", () => {
87
87
  }
88
88
  }
89
89
  assert.equal(set.size, client.getLength() * 2);
90
- validateSet(client, set.trackedSet, (i) => i.getSegment()?.ordinal);
90
+ validateSet(client,
91
+ // Cast to any because we are validating a set of local references, but the instantiated type of trackedSet
92
+ // on TrackingGroup is SortedSegmentSet<Trackable>.
93
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-argument, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-explicit-any
94
+ set.trackedSet, (i) => i.getSegment()?.ordinal);
91
95
  });
92
96
  });
93
97
  //# sourceMappingURL=sortedSegmentSet.spec.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"sortedSegmentSet.spec.js","sourceRoot":"","sources":["../../src/test/sortedSegmentSet.spec.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { strict as assert } from \"assert\";\n\nimport { LocalReferencePosition } from \"../localReference.js\";\nimport { ISegment } from \"../mergeTreeNodes.js\";\nimport { TrackingGroup } from \"../mergeTreeTracking.js\";\nimport { ReferenceType } from \"../ops.js\";\nimport { SortedSegmentSet, SortedSegmentSetItem } from \"../sortedSegmentSet.js\";\n\nimport { TestClient } from \"./testClient.js\";\nconst segmentCount = 15;\n\nfunction validateSorted<T extends SortedSegmentSetItem>(\n\tset: SortedSegmentSet<T>,\n\tgetOrdinal: (item: T) => string | undefined,\n\tprefix: string,\n) {\n\tfor (let i = 0; i < set.size - 1; i++) {\n\t\tconst a = getOrdinal(set.items[i]);\n\t\tconst b = getOrdinal(set.items[i + 1]);\n\t\tassert(a !== undefined, `${prefix}: Undefined ordinal ${i}`);\n\t\tassert(b !== undefined, `${prefix}: Undefined ordinal ${i + 1}`);\n\t\tassert(a <= b, `${prefix}: Not sorted at item ${i}`);\n\t}\n}\n\nfunction validateSet<T extends SortedSegmentSetItem>(\n\tclient: TestClient,\n\tset: SortedSegmentSet<T>,\n\tgetOrdinal: (item: T) => string | undefined,\n) {\n\tvalidateSorted(set, getOrdinal, \"initial\");\n\n\t// add content to shift ordinals in tree\n\tfor (let i = 0; i < segmentCount * 5; i++) {\n\t\tclient.insertTextLocal((i * 3) % client.getLength(), `X`);\n\t}\n\tvalidateSorted(set, getOrdinal, \"after insert\");\n\n\tfor (let i = set.size; set.size > 0; i += set.size) {\n\t\t// jump around the list a bit, so its not just an in-order remove\n\t\tconst item = set.items[i % set.size];\n\t\tassert.equal(set.remove(item), true, \"remove failed\");\n\t\tassert.equal(set.has(item), false);\n\t\tvalidateSorted(set, getOrdinal, \"during remove\");\n\t}\n}\n\ndescribe(\"SortedSegmentSet\", () => {\n\tconst localUserLongId = \"localUser\";\n\tlet client: TestClient;\n\tbeforeEach(() => {\n\t\tclient = new TestClient();\n\t\tfor (let i = 0; i < segmentCount; i++) {\n\t\t\tclient.insertTextLocal(client.getLength(), i.toString()[0].repeat(i + 1));\n\t\t}\n\t\tclient.startOrUpdateCollaboration(localUserLongId);\n\t});\n\n\tit(\"SortedSegmentSet of objects with segments\", () => {\n\t\tconst set = new SortedSegmentSet<{ segment: ISegment }>();\n\t\tfor (let i = 0; i < client.getLength(); i++) {\n\t\t\tfor (const pos of [i, client.getLength() - 1 - i]) {\n\t\t\t\tconst segment = client.getContainingSegment(pos).segment;\n\t\t\t\tassert(segment);\n\t\t\t\tconst item = { segment };\n\t\t\t\tassert.equal(set.has(item), false);\n\t\t\t\tset.addOrUpdate(item);\n\t\t\t\tassert.equal(set.has(item), true);\n\t\t\t}\n\t\t}\n\t\tassert.equal(set.size, client.getLength() * 2);\n\t\tvalidateSet(client, set, (i) => i.segment.ordinal);\n\t});\n\n\tit(\"SortedSegmentSet of segments\", () => {\n\t\tconst set = new SortedSegmentSet();\n\t\tfor (let i = 0; i < client.getLength(); i++) {\n\t\t\tfor (const pos of [i, client.getLength() - 1 - i]) {\n\t\t\t\tconst segment = client.getContainingSegment(pos).segment;\n\t\t\t\tassert(segment);\n\t\t\t\tset.addOrUpdate(segment);\n\t\t\t\tassert.equal(set.has(segment), true);\n\t\t\t}\n\t\t}\n\t\tassert.equal(set.size, segmentCount);\n\t\tvalidateSet(client, set, (i) => i.ordinal);\n\t});\n\n\tit(\"SortedSegmentSet of local references\", () => {\n\t\t// using a sorted segment set directly creates problems,\n\t\t// as we don't correctly split, or merge, so leverage\n\t\t// the tracking group for correct behavior in those case\n\t\t// and spy it's internal set\n\t\tconst set = new TrackingGroup();\n\t\tfor (let i = 0; i < client.getLength(); i++) {\n\t\t\tfor (const pos of [i, client.getLength() - 1 - i]) {\n\t\t\t\tconst segmentInfo = client.getContainingSegment(pos);\n\t\t\t\tassert(segmentInfo?.segment);\n\t\t\t\tconst lref = client.createLocalReferencePosition(\n\t\t\t\t\tsegmentInfo.segment,\n\t\t\t\t\tsegmentInfo.offset,\n\t\t\t\t\tReferenceType.SlideOnRemove,\n\t\t\t\t\tundefined,\n\t\t\t\t);\n\t\t\t\tassert.equal(set.has(lref), false);\n\t\t\t\tset.link(lref);\n\t\t\t\tassert.equal(set.has(lref), true);\n\t\t\t}\n\t\t}\n\t\tassert.equal(set.size, client.getLength() * 2);\n\t\tvalidateSet<LocalReferencePosition>(\n\t\t\tclient,\n\t\t\t(set as any).trackedSet,\n\t\t\t(i) => i.getSegment()?.ordinal,\n\t\t);\n\t});\n});\n"]}
1
+ {"version":3,"file":"sortedSegmentSet.spec.js","sourceRoot":"","sources":["../../src/test/sortedSegmentSet.spec.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { strict as assert } from \"node:assert\";\n\nimport { LocalReferencePosition } from \"../localReference.js\";\nimport { ISegment } from \"../mergeTreeNodes.js\";\nimport { TrackingGroup } from \"../mergeTreeTracking.js\";\nimport { ReferenceType } from \"../ops.js\";\nimport { SortedSegmentSet, SortedSegmentSetItem } from \"../sortedSegmentSet.js\";\n\nimport { TestClient } from \"./testClient.js\";\nconst segmentCount = 15;\n\nfunction validateSorted<T extends SortedSegmentSetItem>(\n\tset: SortedSegmentSet<T>,\n\tgetOrdinal: (item: T) => string | undefined,\n\tprefix: string,\n): void {\n\tfor (let i = 0; i < set.size - 1; i++) {\n\t\tconst a = getOrdinal(set.items[i]);\n\t\tconst b = getOrdinal(set.items[i + 1]);\n\t\tassert(a !== undefined, `${prefix}: Undefined ordinal ${i}`);\n\t\tassert(b !== undefined, `${prefix}: Undefined ordinal ${i + 1}`);\n\t\tassert(a <= b, `${prefix}: Not sorted at item ${i}`);\n\t}\n}\n\nfunction validateSet<T extends SortedSegmentSetItem>(\n\tclient: TestClient,\n\tset: SortedSegmentSet<T>,\n\tgetOrdinal: (item: T) => string | undefined,\n): void {\n\tvalidateSorted(set, getOrdinal, \"initial\");\n\n\t// add content to shift ordinals in tree\n\tfor (let i = 0; i < segmentCount * 5; i++) {\n\t\tclient.insertTextLocal((i * 3) % client.getLength(), `X`);\n\t}\n\tvalidateSorted(set, getOrdinal, \"after insert\");\n\n\tfor (let i = set.size; set.size > 0; i += set.size) {\n\t\t// jump around the list a bit, so its not just an in-order remove\n\t\tconst item = set.items[i % set.size];\n\t\tassert.equal(set.remove(item), true, \"remove failed\");\n\t\tassert.equal(set.has(item), false);\n\t\tvalidateSorted(set, getOrdinal, \"during remove\");\n\t}\n}\n\ndescribe(\"SortedSegmentSet\", () => {\n\tconst localUserLongId = \"localUser\";\n\tlet client: TestClient;\n\tbeforeEach(() => {\n\t\tclient = new TestClient();\n\t\tfor (let i = 0; i < segmentCount; i++) {\n\t\t\tclient.insertTextLocal(client.getLength(), i.toString()[0].repeat(i + 1));\n\t\t}\n\t\tclient.startOrUpdateCollaboration(localUserLongId);\n\t});\n\n\tit(\"SortedSegmentSet of objects with segments\", () => {\n\t\tconst set = new SortedSegmentSet<{ segment: ISegment }>();\n\t\tfor (let i = 0; i < client.getLength(); i++) {\n\t\t\tfor (const pos of [i, client.getLength() - 1 - i]) {\n\t\t\t\tconst segment = client.getContainingSegment(pos).segment;\n\t\t\t\tassert(segment);\n\t\t\t\tconst item = { segment };\n\t\t\t\tassert.equal(set.has(item), false);\n\t\t\t\tset.addOrUpdate(item);\n\t\t\t\tassert.equal(set.has(item), true);\n\t\t\t}\n\t\t}\n\t\tassert.equal(set.size, client.getLength() * 2);\n\t\tvalidateSet(client, set, (i) => i.segment.ordinal);\n\t});\n\n\tit(\"SortedSegmentSet of segments\", () => {\n\t\tconst set = new SortedSegmentSet();\n\t\tfor (let i = 0; i < client.getLength(); i++) {\n\t\t\tfor (const pos of [i, client.getLength() - 1 - i]) {\n\t\t\t\tconst segment = client.getContainingSegment(pos).segment;\n\t\t\t\tassert(segment);\n\t\t\t\tset.addOrUpdate(segment);\n\t\t\t\tassert.equal(set.has(segment), true);\n\t\t\t}\n\t\t}\n\t\tassert.equal(set.size, segmentCount);\n\t\tvalidateSet(client, set, (i) => i.ordinal);\n\t});\n\n\tit(\"SortedSegmentSet of local references\", () => {\n\t\t// using a sorted segment set directly creates problems,\n\t\t// as we don't correctly split, or merge, so leverage\n\t\t// the tracking group for correct behavior in those case\n\t\t// and spy it's internal set\n\t\tconst set = new TrackingGroup();\n\t\tfor (let i = 0; i < client.getLength(); i++) {\n\t\t\tfor (const pos of [i, client.getLength() - 1 - i]) {\n\t\t\t\tconst segmentInfo = client.getContainingSegment(pos);\n\t\t\t\tassert(segmentInfo?.segment);\n\t\t\t\tconst lref = client.createLocalReferencePosition(\n\t\t\t\t\tsegmentInfo.segment,\n\t\t\t\t\tsegmentInfo.offset,\n\t\t\t\t\tReferenceType.SlideOnRemove,\n\t\t\t\t\tundefined,\n\t\t\t\t);\n\t\t\t\tassert.equal(set.has(lref), false);\n\t\t\t\tset.link(lref);\n\t\t\t\tassert.equal(set.has(lref), true);\n\t\t\t}\n\t\t}\n\t\tassert.equal(set.size, client.getLength() * 2);\n\t\tvalidateSet<LocalReferencePosition>(\n\t\t\tclient,\n\t\t\t// Cast to any because we are validating a set of local references, but the instantiated type of trackedSet\n\t\t\t// on TrackingGroup is SortedSegmentSet<Trackable>.\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-argument, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-explicit-any\n\t\t\t(set as any).trackedSet,\n\t\t\t(i) => i.getSegment()?.ordinal,\n\t\t);\n\t});\n});\n"]}
@@ -12,7 +12,7 @@ import { IMergeTreeOptions, ReferencePosition } from "../index.js";
12
12
  import { MergeTree } from "../mergeTree.js";
13
13
  import { IMergeTreeDeltaOpArgs } from "../mergeTreeDeltaCallback.js";
14
14
  import { ISegment } from "../mergeTreeNodes.js";
15
- import { IJSONSegment, IMarkerDef, IMergeTreeOp, ReferenceType } from "../ops.js";
15
+ import { IJSONSegment, IMarkerDef, IMergeTreeOp, ReferenceType, type IMergeTreeInsertMsg } from "../ops.js";
16
16
  import { PropertySet } from "../properties.js";
17
17
  import { MergeTreeRevertibleDriver } from "../revertibles.js";
18
18
  import { TestSerializer } from "./testSerializer.js";
@@ -54,11 +54,11 @@ export declare class TestClient extends Client {
54
54
  enqueueMsg(msg: ISequencedDocumentMessage): void;
55
55
  dequeueMsg(): ISequencedDocumentMessage | undefined;
56
56
  applyMessages(msgCount: number): boolean;
57
- insertTextLocal(pos: number, text: string, props?: PropertySet): import("../ops.js").IMergeTreeInsertMsg | undefined;
57
+ insertTextLocal(pos: number, text: string, props?: PropertySet): IMergeTreeInsertMsg | undefined;
58
58
  insertTextRemote(pos: number, text: string, props: PropertySet | undefined, seq: number, refSeq: number, longClientId: string): void;
59
59
  removeRangeRemote(start: number, end: number, seq: number, refSeq: number, longClientId: string): void;
60
60
  annotateRangeRemote(start: number, end: number, props: PropertySet, seq: number, refSeq: number, longClientId: string): void;
61
- insertMarkerLocal(pos: number, behaviors: ReferenceType, props?: PropertySet): import("../ops.js").IMergeTreeInsertMsg | undefined;
61
+ insertMarkerLocal(pos: number, behaviors: ReferenceType, props?: PropertySet): IMergeTreeInsertMsg | undefined;
62
62
  insertMarkerRemote(pos: number, markerDef: IMarkerDef, props: PropertySet, seq: number, refSeq: number, longClientId: string): void;
63
63
  relText(clientId: number, refSeq: number): string;
64
64
  makeOpMessage(op: IMergeTreeOp | undefined, seq?: number, refSeq?: number, longClientId?: string, minSeqNumber?: number): ISequencedDocumentMessage;
@@ -80,11 +80,12 @@ export declare class TestClient extends Client {
80
80
  rebasePosition(pos: number, seqNumberFrom: number, localSeq: number): number;
81
81
  findReconnectionPosition(segment: ISegment, localSeq: number): number;
82
82
  /**
83
+ * Validates segments either all have attribution information or none of them.
84
+ * If no segment has attribution information, returns undefined.
85
+ *
83
86
  * @param channel - Attribution channel name to request information from.
84
87
  * @returns an array of all attribution seq#s from the current perspective.
85
88
  * The `i`th entry of the array is the attribution key for the character at position `i`.
86
- * Validates segments either all have attribution information or none of them.
87
- * If no segment has attribution information, returns undefined.
88
89
  */
89
90
  getAllAttributionSeqs(channel?: string): (number | AttributionKey | undefined)[];
90
91
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"testClient.d.ts","sourceRoot":"","sources":["../../src/test/testClient.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"testClient.d.ts","sourceRoot":"","sources":["../../src/test/testClient.ts"],"names":[],"mappings":"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"}
@@ -2,7 +2,7 @@
2
2
  * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
3
  * Licensed under the MIT License.
4
4
  */
5
- import { strict as assert } from "assert";
5
+ import { strict as assert } from "node:assert";
6
6
  import { Trace } from "@fluid-internal/client-utils";
7
7
  import { makeRandom } from "@fluid-private/stochastic-test-utils";
8
8
  import { MessageType, } from "@fluidframework/driver-definitions/internal";
@@ -72,12 +72,12 @@ export class TestClient extends Client {
72
72
  // Validate by default
73
73
  this.on("delta", (o, d) => {
74
74
  // assert.notEqual(d.deltaSegments.length, 0);
75
- d.deltaSegments.forEach((s) => {
75
+ for (const s of d.deltaSegments) {
76
76
  if (d.operation === MergeTreeDeltaType.INSERT) {
77
77
  const seg = s.segment;
78
78
  assert.notEqual(seg.parent, undefined);
79
79
  }
80
- });
80
+ }
81
81
  });
82
82
  }
83
83
  obliterateRange({ start, end, refSeq, clientId, seq, overwrite = false, opArgs, }) {
@@ -193,12 +193,13 @@ export class TestClient extends Client {
193
193
  const test = [];
194
194
  walkAllChildSegments(tree.root, (segment) => {
195
195
  const prefixes = [];
196
- prefixes.push(segment.seq !== UnassignedSequenceNumber ? segment.seq : `L${segment.localSeq}`);
196
+ prefixes.push(segment.seq === UnassignedSequenceNumber ? `L${segment.localSeq}` : segment.seq);
197
197
  if (segment.removedSeq !== undefined) {
198
- prefixes.push(segment.removedSeq !== UnassignedSequenceNumber
199
- ? segment.removedSeq
200
- : `L${segment.localRemovedSeq}`);
198
+ prefixes.push(segment.removedSeq === UnassignedSequenceNumber
199
+ ? `L${segment.localRemovedSeq}`
200
+ : segment.removedSeq);
201
201
  }
202
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-explicit-any
202
203
  test.push(`${prefixes.join(",")}:${segment.text}`);
203
204
  });
204
205
  }
@@ -272,11 +273,12 @@ export class TestClient extends Client {
272
273
  return segmentPosition;
273
274
  }
274
275
  /**
276
+ * Validates segments either all have attribution information or none of them.
277
+ * If no segment has attribution information, returns undefined.
278
+ *
275
279
  * @param channel - Attribution channel name to request information from.
276
280
  * @returns an array of all attribution seq#s from the current perspective.
277
281
  * The `i`th entry of the array is the attribution key for the character at position `i`.
278
- * Validates segments either all have attribution information or none of them.
279
- * If no segment has attribution information, returns undefined.
280
282
  */
281
283
  getAllAttributionSeqs(channel) {
282
284
  const seqs = [];
@@ -334,21 +336,17 @@ export class TestClient extends Client {
334
336
  else {
335
337
  if (forwards) {
336
338
  forwardExcursion(segWithParent, (seg) => {
337
- if (Marker.is(seg)) {
338
- if (refHasTileLabel(seg, markerLabel)) {
339
- foundMarker = seg;
340
- return false;
341
- }
339
+ if (Marker.is(seg) && refHasTileLabel(seg, markerLabel)) {
340
+ foundMarker = seg;
341
+ return false;
342
342
  }
343
343
  });
344
344
  }
345
345
  else {
346
346
  backwardExcursion(segWithParent, (seg) => {
347
- if (Marker.is(seg)) {
348
- if (refHasTileLabel(seg, markerLabel)) {
349
- foundMarker = seg;
350
- return false;
351
- }
347
+ if (Marker.is(seg) && refHasTileLabel(seg, markerLabel)) {
348
+ foundMarker = seg;
349
+ return false;
352
350
  }
353
351
  });
354
352
  }
@@ -397,7 +395,14 @@ export function getStats(tree) {
397
395
  for (let i = 0; i < block.childCount; i++) {
398
396
  const child = block.children[i];
399
397
  let height = 1;
400
- if (!child.isLeaf()) {
398
+ if (child.isLeaf()) {
399
+ stats.leafCount++;
400
+ const segment = child;
401
+ if (segment.removedSeq !== undefined) {
402
+ stats.removedLeafCount++;
403
+ }
404
+ }
405
+ else {
401
406
  const childStats = nodeGetStats(child);
402
407
  height = 1 + childStats.maxHeight;
403
408
  stats.nodeCount += childStats.nodeCount;
@@ -408,13 +413,6 @@ export function getStats(tree) {
408
413
  stats.histo[j] += childStats.histo[j];
409
414
  }
410
415
  }
411
- else {
412
- stats.leafCount++;
413
- const segment = child;
414
- if (segment.removedSeq !== undefined) {
415
- stats.removedLeafCount++;
416
- }
417
- }
418
416
  if (height > stats.maxHeight) {
419
417
  stats.maxHeight = height;
420
418
  }