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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (770) hide show
  1. package/{.eslintrc.js → .eslintrc.cjs} +4 -1
  2. package/{.mocharc.js → .mocharc.cjs} +1 -1
  3. package/CHANGELOG.md +4 -0
  4. package/api-extractor-cjs.json +8 -0
  5. package/api-extractor-lint.json +1 -1
  6. package/api-extractor.json +1 -9
  7. package/api-report/merge-tree.api.md +6 -12
  8. package/dist/MergeTreeTextHelper.d.ts +2 -2
  9. package/dist/MergeTreeTextHelper.d.ts.map +1 -1
  10. package/dist/MergeTreeTextHelper.js +3 -3
  11. package/dist/MergeTreeTextHelper.js.map +1 -1
  12. package/dist/attributionCollection.d.ts +1 -1
  13. package/dist/attributionCollection.d.ts.map +1 -1
  14. package/dist/attributionCollection.js.map +1 -1
  15. package/dist/attributionPolicy.d.ts +1 -1
  16. package/dist/attributionPolicy.d.ts.map +1 -1
  17. package/dist/attributionPolicy.js +15 -15
  18. package/dist/attributionPolicy.js.map +1 -1
  19. package/dist/client.d.ts +31 -12
  20. package/dist/client.d.ts.map +1 -1
  21. package/dist/client.js +103 -92
  22. package/dist/client.js.map +1 -1
  23. package/dist/collections/index.d.ts +2 -2
  24. package/dist/collections/index.d.ts.map +1 -1
  25. package/dist/collections/index.js +6 -6
  26. package/dist/collections/index.js.map +1 -1
  27. package/dist/endOfTreeSegment.d.ts +3 -3
  28. package/dist/endOfTreeSegment.d.ts.map +1 -1
  29. package/dist/endOfTreeSegment.js +8 -8
  30. package/dist/endOfTreeSegment.js.map +1 -1
  31. package/dist/index.d.ts +20 -20
  32. package/dist/index.d.ts.map +1 -1
  33. package/dist/index.js +71 -71
  34. package/dist/index.js.map +1 -1
  35. package/dist/localReference.d.ts +9 -39
  36. package/dist/localReference.d.ts.map +1 -1
  37. package/dist/localReference.js +29 -24
  38. package/dist/localReference.js.map +1 -1
  39. package/dist/merge-tree-alpha.d.ts +28 -450
  40. package/dist/merge-tree-beta.d.ts +0 -438
  41. package/dist/merge-tree-public.d.ts +0 -438
  42. package/dist/merge-tree-untrimmed.d.ts +28 -787
  43. package/dist/mergeTree.d.ts +11 -19
  44. package/dist/mergeTree.d.ts.map +1 -1
  45. package/dist/mergeTree.js +201 -189
  46. package/dist/mergeTree.js.map +1 -1
  47. package/dist/mergeTreeDeltaCallback.d.ts +3 -7
  48. package/dist/mergeTreeDeltaCallback.d.ts.map +1 -1
  49. package/dist/mergeTreeDeltaCallback.js.map +1 -1
  50. package/dist/mergeTreeNodeWalk.d.ts +1 -1
  51. package/dist/mergeTreeNodeWalk.d.ts.map +1 -1
  52. package/dist/mergeTreeNodeWalk.js.map +1 -1
  53. package/dist/mergeTreeNodes.d.ts +17 -14
  54. package/dist/mergeTreeNodes.d.ts.map +1 -1
  55. package/dist/mergeTreeNodes.js +32 -32
  56. package/dist/mergeTreeNodes.js.map +1 -1
  57. package/dist/mergeTreeTracking.d.ts +2 -2
  58. package/dist/mergeTreeTracking.d.ts.map +1 -1
  59. package/dist/mergeTreeTracking.js +2 -2
  60. package/dist/mergeTreeTracking.js.map +1 -1
  61. package/dist/opBuilder.d.ts +3 -3
  62. package/dist/opBuilder.d.ts.map +1 -1
  63. package/dist/opBuilder.js +7 -7
  64. package/dist/opBuilder.js.map +1 -1
  65. package/dist/package.json +3 -0
  66. package/dist/partialLengths.d.ts +5 -5
  67. package/dist/partialLengths.d.ts.map +1 -1
  68. package/dist/partialLengths.js +29 -29
  69. package/dist/partialLengths.js.map +1 -1
  70. package/dist/referencePositions.d.ts +4 -4
  71. package/dist/referencePositions.d.ts.map +1 -1
  72. package/dist/referencePositions.js +2 -2
  73. package/dist/referencePositions.js.map +1 -1
  74. package/dist/revertibles.d.ts +7 -7
  75. package/dist/revertibles.d.ts.map +1 -1
  76. package/dist/revertibles.js +39 -39
  77. package/dist/revertibles.js.map +1 -1
  78. package/dist/segmentGroupCollection.d.ts +1 -1
  79. package/dist/segmentGroupCollection.d.ts.map +1 -1
  80. package/dist/segmentGroupCollection.js +3 -3
  81. package/dist/segmentGroupCollection.js.map +1 -1
  82. package/dist/segmentPropertiesManager.d.ts +2 -2
  83. package/dist/segmentPropertiesManager.d.ts.map +1 -1
  84. package/dist/segmentPropertiesManager.js +8 -8
  85. package/dist/segmentPropertiesManager.js.map +1 -1
  86. package/dist/snapshotChunks.d.ts +3 -3
  87. package/dist/snapshotChunks.d.ts.map +1 -1
  88. package/dist/snapshotChunks.js +5 -5
  89. package/dist/snapshotChunks.js.map +1 -1
  90. package/dist/snapshotLoader.d.ts +3 -3
  91. package/dist/snapshotLoader.d.ts.map +1 -1
  92. package/dist/snapshotLoader.js +19 -19
  93. package/dist/snapshotLoader.js.map +1 -1
  94. package/dist/snapshotV1.d.ts +3 -3
  95. package/dist/snapshotV1.d.ts.map +1 -1
  96. package/dist/snapshotV1.js +35 -18
  97. package/dist/snapshotV1.js.map +1 -1
  98. package/dist/snapshotlegacy.d.ts +2 -2
  99. package/dist/snapshotlegacy.d.ts.map +1 -1
  100. package/dist/snapshotlegacy.js +22 -10
  101. package/dist/snapshotlegacy.js.map +1 -1
  102. package/dist/sortedSegmentSet.d.ts +3 -3
  103. package/dist/sortedSegmentSet.d.ts.map +1 -1
  104. package/dist/sortedSegmentSet.js +7 -5
  105. package/dist/sortedSegmentSet.js.map +1 -1
  106. package/dist/test/Insertion.perf.spec.js +15 -15
  107. package/dist/test/Insertion.perf.spec.js.map +1 -1
  108. package/dist/test/PartialLengths.perf.spec.js +13 -13
  109. package/dist/test/PartialLengths.perf.spec.js.map +1 -1
  110. package/dist/test/Removal.perf.spec.js +25 -25
  111. package/dist/test/Removal.perf.spec.js.map +1 -1
  112. package/dist/test/Snapshot.perf.spec.js +3 -3
  113. package/dist/test/Snapshot.perf.spec.js.map +1 -1
  114. package/dist/test/attributionCollection.perf.spec.js +9 -9
  115. package/dist/test/attributionCollection.perf.spec.js.map +1 -1
  116. package/dist/test/attributionCollection.spec.js +46 -46
  117. package/dist/test/attributionCollection.spec.js.map +1 -1
  118. package/dist/test/attributionPolicy.spec.js +13 -13
  119. package/dist/test/attributionPolicy.spec.js.map +1 -1
  120. package/dist/test/{beastTest.d.ts → beastTest.spec.d.ts} +3 -3
  121. package/dist/test/beastTest.spec.d.ts.map +1 -0
  122. package/dist/test/{beastTest.js → beastTest.spec.js} +120 -119
  123. package/dist/test/beastTest.spec.js.map +1 -0
  124. package/dist/test/client.annotateMarker.spec.js +13 -13
  125. package/dist/test/client.annotateMarker.spec.js.map +1 -1
  126. package/dist/test/{client.apis.d.ts → client.apis.spec.d.ts} +1 -1
  127. package/dist/test/client.apis.spec.d.ts.map +1 -0
  128. package/dist/test/{client.apis.js → client.apis.spec.js} +8 -8
  129. package/dist/test/client.apis.spec.js.map +1 -0
  130. package/dist/test/client.applyMsg.spec.js +106 -43
  131. package/dist/test/client.applyMsg.spec.js.map +1 -1
  132. package/dist/test/client.applyStashedOpFarm.spec.d.ts +1 -1
  133. package/dist/test/client.applyStashedOpFarm.spec.d.ts.map +1 -1
  134. package/dist/test/client.applyStashedOpFarm.spec.js +33 -21
  135. package/dist/test/client.applyStashedOpFarm.spec.js.map +1 -1
  136. package/dist/test/client.attributionFarm.spec.d.ts +1 -1
  137. package/dist/test/client.attributionFarm.spec.d.ts.map +1 -1
  138. package/dist/test/client.attributionFarm.spec.js +13 -13
  139. package/dist/test/client.attributionFarm.spec.js.map +1 -1
  140. package/dist/test/client.conflictFarm.spec.d.ts +1 -1
  141. package/dist/test/client.conflictFarm.spec.d.ts.map +1 -1
  142. package/dist/test/client.conflictFarm.spec.js +9 -9
  143. package/dist/test/client.conflictFarm.spec.js.map +1 -1
  144. package/dist/test/client.getPosition.spec.js +4 -4
  145. package/dist/test/client.getPosition.spec.js.map +1 -1
  146. package/dist/test/client.localReference.spec.js +140 -109
  147. package/dist/test/client.localReference.spec.js.map +1 -1
  148. package/dist/test/client.localReferenceFarm.spec.js +18 -18
  149. package/dist/test/client.localReferenceFarm.spec.js.map +1 -1
  150. package/dist/test/client.rebasePosition.spec.js +2 -2
  151. package/dist/test/client.rebasePosition.spec.js.map +1 -1
  152. package/dist/test/client.reconnectFarm.spec.d.ts +1 -1
  153. package/dist/test/client.reconnectFarm.spec.d.ts.map +1 -1
  154. package/dist/test/client.reconnectFarm.spec.js +10 -10
  155. package/dist/test/client.reconnectFarm.spec.js.map +1 -1
  156. package/dist/test/client.replay.spec.js +11 -11
  157. package/dist/test/client.replay.spec.js.map +1 -1
  158. package/dist/test/client.rollback.spec.js +83 -83
  159. package/dist/test/client.rollback.spec.js.map +1 -1
  160. package/dist/test/client.rollbackFarm.spec.js +9 -9
  161. package/dist/test/client.rollbackFarm.spec.js.map +1 -1
  162. package/dist/test/client.searchForMarker.spec.js +137 -137
  163. package/dist/test/client.searchForMarker.spec.js.map +1 -1
  164. package/dist/test/client.walkSegments.spec.js +2 -2
  165. package/dist/test/client.walkSegments.spec.js.map +1 -1
  166. package/dist/test/collections.list.spec.js +4 -4
  167. package/dist/test/collections.list.spec.js.map +1 -1
  168. package/dist/test/createInsertOnlyAttributionPolicy.spec.js +4 -4
  169. package/dist/test/createInsertOnlyAttributionPolicy.spec.js.map +1 -1
  170. package/dist/test/dirname.cjs +16 -0
  171. package/dist/test/dirname.cjs.map +1 -0
  172. package/dist/test/dirname.d.cts +6 -0
  173. package/dist/test/dirname.d.cts.map +1 -0
  174. package/dist/test/index.d.ts +8 -8
  175. package/dist/test/index.d.ts.map +1 -1
  176. package/dist/test/index.js +82 -81
  177. package/dist/test/index.js.map +1 -1
  178. package/dist/test/mergeTree.annotate.deltaCallback.spec.js +39 -39
  179. package/dist/test/mergeTree.annotate.deltaCallback.spec.js.map +1 -1
  180. package/dist/test/mergeTree.annotate.spec.js +39 -39
  181. package/dist/test/mergeTree.annotate.spec.js.map +1 -1
  182. package/dist/test/mergeTree.insert.deltaCallback.spec.js +35 -35
  183. package/dist/test/mergeTree.insert.deltaCallback.spec.js.map +1 -1
  184. package/dist/test/mergeTree.insertingWalk.spec.js +77 -77
  185. package/dist/test/mergeTree.insertingWalk.spec.js.map +1 -1
  186. package/dist/test/mergeTree.markRangeRemoved.deltaCallback.spec.js +42 -42
  187. package/dist/test/mergeTree.markRangeRemoved.deltaCallback.spec.js.map +1 -1
  188. package/dist/test/mergeTree.markRangeRemoved.spec.js +15 -15
  189. package/dist/test/mergeTree.markRangeRemoved.spec.js.map +1 -1
  190. package/dist/test/mergeTree.walk.spec.js +14 -14
  191. package/dist/test/mergeTree.walk.spec.js.map +1 -1
  192. package/dist/test/mergeTree.zamboni.spec.js +9 -9
  193. package/dist/test/mergeTree.zamboni.spec.js.map +1 -1
  194. package/dist/test/mergeTreeOperationRunner.d.ts +4 -4
  195. package/dist/test/mergeTreeOperationRunner.d.ts.map +1 -1
  196. package/dist/test/mergeTreeOperationRunner.js +16 -15
  197. package/dist/test/mergeTreeOperationRunner.js.map +1 -1
  198. package/dist/test/mergeTreeOperationRunner.spec.js +5 -5
  199. package/dist/test/mergeTreeOperationRunner.spec.js.map +1 -1
  200. package/dist/test/obliterate.concurrent.spec.js +85 -88
  201. package/dist/test/obliterate.concurrent.spec.js.map +1 -1
  202. package/dist/test/obliterate.deltaCallback.spec.d.ts +6 -0
  203. package/dist/test/obliterate.deltaCallback.spec.d.ts.map +1 -0
  204. package/dist/test/obliterate.deltaCallback.spec.js +146 -0
  205. package/dist/test/obliterate.deltaCallback.spec.js.map +1 -0
  206. package/dist/test/obliterate.partialLength.spec.js +39 -44
  207. package/dist/test/obliterate.partialLength.spec.js.map +1 -1
  208. package/dist/test/obliterate.reconnect.spec.js +15 -18
  209. package/dist/test/obliterate.reconnect.spec.js.map +1 -1
  210. package/dist/test/obliterate.spec.js +16 -16
  211. package/dist/test/obliterate.spec.js.map +1 -1
  212. package/dist/test/ordinal.spec.js +5 -5
  213. package/dist/test/ordinal.spec.js.map +1 -1
  214. package/dist/test/partialLength.spec.js +58 -64
  215. package/dist/test/partialLength.spec.js.map +1 -1
  216. package/dist/test/properties.spec.js +15 -15
  217. package/dist/test/properties.spec.js.map +1 -1
  218. package/dist/test/reconnectHelper.d.ts +8 -8
  219. package/dist/test/reconnectHelper.d.ts.map +1 -1
  220. package/dist/test/reconnectHelper.js +3 -3
  221. package/dist/test/reconnectHelper.js.map +1 -1
  222. package/dist/test/resetPendingSegmentsToOp.spec.js +18 -18
  223. package/dist/test/resetPendingSegmentsToOp.spec.js.map +1 -1
  224. package/dist/test/revertibleFarm.spec.js +21 -21
  225. package/dist/test/revertibleFarm.spec.js.map +1 -1
  226. package/dist/test/revertibles.spec.js +67 -67
  227. package/dist/test/revertibles.spec.js.map +1 -1
  228. package/dist/test/segmentGroupCollection.spec.js +3 -3
  229. package/dist/test/segmentGroupCollection.spec.js.map +1 -1
  230. package/dist/test/snapshot.spec.js +16 -16
  231. package/dist/test/snapshot.spec.js.map +1 -1
  232. package/dist/test/snapshot.utils.d.ts +4 -4
  233. package/dist/test/snapshot.utils.d.ts.map +1 -1
  234. package/dist/test/snapshot.utils.js +11 -11
  235. package/dist/test/snapshot.utils.js.map +1 -1
  236. package/dist/test/snapshotlegacy.spec.js +22 -22
  237. package/dist/test/snapshotlegacy.spec.js.map +1 -1
  238. package/dist/test/sortedSegmentSet.spec.js +9 -9
  239. package/dist/test/sortedSegmentSet.spec.js.map +1 -1
  240. package/dist/test/testClient.d.ts +13 -16
  241. package/dist/test/testClient.d.ts.map +1 -1
  242. package/dist/test/testClient.js +57 -59
  243. package/dist/test/testClient.js.map +1 -1
  244. package/dist/test/testClientLogger.d.ts +3 -3
  245. package/dist/test/testClientLogger.d.ts.map +1 -1
  246. package/dist/test/testClientLogger.js +19 -19
  247. package/dist/test/testClientLogger.js.map +1 -1
  248. package/dist/test/testServer.d.ts +3 -3
  249. package/dist/test/testServer.d.ts.map +1 -1
  250. package/dist/test/testServer.js +8 -8
  251. package/dist/test/testServer.js.map +1 -1
  252. package/dist/test/testUtils.d.ts +14 -6
  253. package/dist/test/testUtils.d.ts.map +1 -1
  254. package/dist/test/testUtils.js +36 -17
  255. package/dist/test/testUtils.js.map +1 -1
  256. package/dist/test/text.d.ts +2 -2
  257. package/dist/test/text.d.ts.map +1 -1
  258. package/dist/test/text.js +10 -10
  259. package/dist/test/text.js.map +1 -1
  260. package/dist/test/tracking.spec.js +12 -12
  261. package/dist/test/tracking.spec.js.map +1 -1
  262. package/dist/test/{wordUnitTests.d.ts → wordUnitTests.spec.d.ts} +1 -1
  263. package/dist/test/wordUnitTests.spec.d.ts.map +1 -0
  264. package/dist/test/{wordUnitTests.js → wordUnitTests.spec.js} +16 -15
  265. package/dist/test/wordUnitTests.spec.js.map +1 -0
  266. package/dist/textSegment.d.ts +3 -3
  267. package/dist/textSegment.d.ts.map +1 -1
  268. package/dist/textSegment.js +2 -2
  269. package/dist/textSegment.js.map +1 -1
  270. package/dist/tsdoc-metadata.json +1 -1
  271. package/dist/zamboni.d.ts +2 -2
  272. package/dist/zamboni.d.ts.map +1 -1
  273. package/dist/zamboni.js +19 -19
  274. package/dist/zamboni.js.map +1 -1
  275. package/lib/{MergeTreeTextHelper.d.mts → MergeTreeTextHelper.d.ts} +3 -3
  276. package/lib/MergeTreeTextHelper.d.ts.map +1 -0
  277. package/lib/{MergeTreeTextHelper.mjs → MergeTreeTextHelper.js} +3 -2
  278. package/lib/MergeTreeTextHelper.js.map +1 -0
  279. package/lib/{attributionCollection.d.mts → attributionCollection.d.ts} +2 -2
  280. package/lib/attributionCollection.d.ts.map +1 -0
  281. package/lib/{attributionCollection.mjs → attributionCollection.js} +1 -1
  282. package/lib/attributionCollection.js.map +1 -0
  283. package/lib/{attributionPolicy.d.mts → attributionPolicy.d.ts} +2 -2
  284. package/lib/attributionPolicy.d.ts.map +1 -0
  285. package/lib/{attributionPolicy.mjs → attributionPolicy.js} +4 -4
  286. package/lib/attributionPolicy.js.map +1 -0
  287. package/lib/{client.d.mts → client.d.ts} +32 -13
  288. package/lib/client.d.ts.map +1 -0
  289. package/lib/{client.mjs → client.js} +42 -31
  290. package/lib/client.js.map +1 -0
  291. package/lib/collections/{index.d.mts → index.d.ts} +3 -3
  292. package/lib/collections/index.d.ts.map +1 -0
  293. package/lib/collections/index.js +7 -0
  294. package/lib/collections/index.js.map +1 -0
  295. package/lib/collections/{list.d.mts → list.d.ts} +1 -1
  296. package/lib/collections/list.d.ts.map +1 -0
  297. package/lib/collections/{list.mjs → list.js} +1 -1
  298. package/lib/collections/list.js.map +1 -0
  299. package/lib/collections/{rbTree.d.mts → rbTree.d.ts} +1 -1
  300. package/lib/collections/rbTree.d.ts.map +1 -0
  301. package/lib/collections/{rbTree.mjs → rbTree.js} +1 -1
  302. package/lib/collections/rbTree.js.map +1 -0
  303. package/lib/{constants.d.mts → constants.d.ts} +1 -1
  304. package/lib/constants.d.ts.map +1 -0
  305. package/lib/{constants.mjs → constants.js} +1 -1
  306. package/lib/constants.js.map +1 -0
  307. package/lib/{endOfTreeSegment.d.mts → endOfTreeSegment.d.ts} +4 -4
  308. package/lib/endOfTreeSegment.d.ts.map +1 -0
  309. package/lib/{endOfTreeSegment.mjs → endOfTreeSegment.js} +3 -3
  310. package/lib/endOfTreeSegment.js.map +1 -0
  311. package/lib/{index.d.mts → index.d.ts} +21 -21
  312. package/lib/index.d.ts.map +1 -0
  313. package/lib/{index.mjs → index.js} +20 -20
  314. package/lib/index.js.map +1 -0
  315. package/lib/{localReference.d.mts → localReference.d.ts} +10 -40
  316. package/lib/localReference.d.ts.map +1 -0
  317. package/lib/{localReference.mjs → localReference.js} +12 -6
  318. package/lib/localReference.js.map +1 -0
  319. package/lib/{merge-tree-alpha.d.mts → merge-tree-alpha.d.ts} +28 -450
  320. package/lib/merge-tree-beta.d.ts +230 -0
  321. package/lib/merge-tree-public.d.ts +230 -0
  322. package/lib/{merge-tree-untrimmed.d.mts → merge-tree-untrimmed.d.ts} +28 -787
  323. package/lib/{mergeTree.d.mts → mergeTree.d.ts} +12 -20
  324. package/lib/mergeTree.d.ts.map +1 -0
  325. package/lib/{mergeTree.mjs → mergeTree.js} +47 -32
  326. package/lib/mergeTree.js.map +1 -0
  327. package/lib/{mergeTreeDeltaCallback.d.mts → mergeTreeDeltaCallback.d.ts} +8 -8
  328. package/lib/mergeTreeDeltaCallback.d.ts.map +1 -0
  329. package/lib/{mergeTreeDeltaCallback.mjs → mergeTreeDeltaCallback.js} +1 -1
  330. package/lib/mergeTreeDeltaCallback.js.map +1 -0
  331. package/lib/{mergeTreeNodeWalk.d.mts → mergeTreeNodeWalk.d.ts} +2 -2
  332. package/lib/mergeTreeNodeWalk.d.ts.map +1 -0
  333. package/lib/{mergeTreeNodeWalk.mjs → mergeTreeNodeWalk.js} +1 -1
  334. package/lib/mergeTreeNodeWalk.js.map +1 -0
  335. package/lib/{mergeTreeNodes.d.mts → mergeTreeNodes.d.ts} +18 -15
  336. package/lib/mergeTreeNodes.d.ts.map +1 -0
  337. package/lib/{mergeTreeNodes.mjs → mergeTreeNodes.js} +12 -10
  338. package/lib/mergeTreeNodes.js.map +1 -0
  339. package/lib/{mergeTreeTracking.d.mts → mergeTreeTracking.d.ts} +3 -3
  340. package/lib/mergeTreeTracking.d.ts.map +1 -0
  341. package/lib/{mergeTreeTracking.mjs → mergeTreeTracking.js} +3 -2
  342. package/lib/mergeTreeTracking.js.map +1 -0
  343. package/lib/{opBuilder.d.mts → opBuilder.d.ts} +4 -4
  344. package/lib/{opBuilder.d.mts.map → opBuilder.d.ts.map} +1 -1
  345. package/lib/{opBuilder.mjs → opBuilder.js} +2 -2
  346. package/lib/opBuilder.js.map +1 -0
  347. package/lib/{ops.d.mts → ops.d.ts} +1 -1
  348. package/lib/ops.d.ts.map +1 -0
  349. package/lib/{ops.mjs → ops.js} +1 -1
  350. package/lib/ops.js.map +1 -0
  351. package/lib/{ordinal.d.mts → ordinal.d.ts} +1 -1
  352. package/lib/ordinal.d.ts.map +1 -0
  353. package/lib/{ordinal.mjs → ordinal.js} +2 -1
  354. package/lib/ordinal.js.map +1 -0
  355. package/lib/{partialLengths.d.mts → partialLengths.d.ts} +6 -6
  356. package/lib/partialLengths.d.ts.map +1 -0
  357. package/lib/{partialLengths.mjs → partialLengths.js} +11 -10
  358. package/lib/partialLengths.js.map +1 -0
  359. package/lib/{properties.d.mts → properties.d.ts} +1 -1
  360. package/lib/properties.d.ts.map +1 -0
  361. package/lib/{properties.mjs → properties.js} +1 -1
  362. package/lib/properties.js.map +1 -0
  363. package/lib/{referencePositions.d.mts → referencePositions.d.ts} +5 -5
  364. package/lib/referencePositions.d.ts.map +1 -0
  365. package/lib/{referencePositions.mjs → referencePositions.js} +2 -2
  366. package/lib/referencePositions.js.map +1 -0
  367. package/lib/{revertibles.d.mts → revertibles.d.ts} +8 -8
  368. package/lib/revertibles.d.ts.map +1 -0
  369. package/lib/{revertibles.mjs → revertibles.js} +13 -13
  370. package/lib/revertibles.js.map +1 -0
  371. package/lib/{segmentGroupCollection.d.mts → segmentGroupCollection.d.ts} +2 -2
  372. package/lib/segmentGroupCollection.d.ts.map +1 -0
  373. package/lib/{segmentGroupCollection.mjs → segmentGroupCollection.js} +2 -2
  374. package/lib/segmentGroupCollection.js.map +1 -0
  375. package/lib/{segmentPropertiesManager.d.mts → segmentPropertiesManager.d.ts} +3 -3
  376. package/lib/segmentPropertiesManager.d.ts.map +1 -0
  377. package/lib/{segmentPropertiesManager.mjs → segmentPropertiesManager.js} +5 -3
  378. package/lib/segmentPropertiesManager.js.map +1 -0
  379. package/lib/{snapshotChunks.d.mts → snapshotChunks.d.ts} +4 -4
  380. package/lib/snapshotChunks.d.ts.map +1 -0
  381. package/lib/{snapshotChunks.mjs → snapshotChunks.js} +2 -2
  382. package/lib/snapshotChunks.js.map +1 -0
  383. package/lib/{snapshotLoader.d.mts → snapshotLoader.d.ts} +4 -4
  384. package/lib/snapshotLoader.d.ts.map +1 -0
  385. package/lib/{snapshotLoader.mjs → snapshotLoader.js} +10 -9
  386. package/lib/snapshotLoader.js.map +1 -0
  387. package/lib/{snapshotV1.d.mts → snapshotV1.d.ts} +4 -4
  388. package/lib/snapshotV1.d.ts.map +1 -0
  389. package/lib/{snapshotV1.mjs → snapshotV1.js} +24 -7
  390. package/lib/snapshotV1.js.map +1 -0
  391. package/lib/{snapshotlegacy.d.mts → snapshotlegacy.d.ts} +3 -3
  392. package/lib/snapshotlegacy.d.ts.map +1 -0
  393. package/lib/{snapshotlegacy.mjs → snapshotlegacy.js} +17 -4
  394. package/lib/snapshotlegacy.js.map +1 -0
  395. package/lib/{sortedSegmentSet.d.mts → sortedSegmentSet.d.ts} +4 -4
  396. package/lib/sortedSegmentSet.d.ts.map +1 -0
  397. package/lib/{sortedSegmentSet.mjs → sortedSegmentSet.js} +8 -5
  398. package/lib/sortedSegmentSet.js.map +1 -0
  399. package/lib/{sortedSet.d.mts → sortedSet.d.ts} +1 -1
  400. package/lib/sortedSet.d.ts.map +1 -0
  401. package/lib/{sortedSet.mjs → sortedSet.js} +1 -1
  402. package/lib/sortedSet.js.map +1 -0
  403. package/lib/test/Insertion.perf.spec.d.ts +6 -0
  404. package/lib/test/Insertion.perf.spec.d.ts.map +1 -0
  405. package/lib/test/Insertion.perf.spec.js +111 -0
  406. package/lib/test/Insertion.perf.spec.js.map +1 -0
  407. package/lib/test/PartialLengths.perf.spec.d.ts +6 -0
  408. package/lib/test/PartialLengths.perf.spec.d.ts.map +1 -0
  409. package/lib/test/PartialLengths.perf.spec.js +65 -0
  410. package/lib/test/PartialLengths.perf.spec.js.map +1 -0
  411. package/lib/test/Removal.perf.spec.d.ts +6 -0
  412. package/lib/test/Removal.perf.spec.d.ts.map +1 -0
  413. package/lib/test/Removal.perf.spec.js +164 -0
  414. package/lib/test/Removal.perf.spec.js.map +1 -0
  415. package/lib/test/Snapshot.perf.spec.d.ts +6 -0
  416. package/lib/test/Snapshot.perf.spec.d.ts.map +1 -0
  417. package/lib/test/Snapshot.perf.spec.js +31 -0
  418. package/lib/test/Snapshot.perf.spec.js.map +1 -0
  419. package/lib/test/attributionCollection.perf.spec.d.ts +6 -0
  420. package/lib/test/attributionCollection.perf.spec.d.ts.map +1 -0
  421. package/lib/test/attributionCollection.perf.spec.js +229 -0
  422. package/lib/test/attributionCollection.perf.spec.js.map +1 -0
  423. package/lib/test/attributionCollection.spec.d.ts +6 -0
  424. package/lib/test/attributionCollection.spec.d.ts.map +1 -0
  425. package/lib/test/attributionCollection.spec.js +484 -0
  426. package/lib/test/attributionCollection.spec.js.map +1 -0
  427. package/lib/test/attributionPolicy.spec.d.ts +6 -0
  428. package/lib/test/attributionPolicy.spec.d.ts.map +1 -0
  429. package/lib/test/attributionPolicy.spec.js +187 -0
  430. package/lib/test/attributionPolicy.spec.js.map +1 -0
  431. package/lib/test/beastTest.spec.d.ts +54 -0
  432. package/lib/test/beastTest.spec.d.ts.map +1 -0
  433. package/lib/test/beastTest.spec.js +1318 -0
  434. package/lib/test/beastTest.spec.js.map +1 -0
  435. package/lib/test/client.annotateMarker.spec.d.ts +6 -0
  436. package/lib/test/client.annotateMarker.spec.d.ts.map +1 -0
  437. package/lib/test/client.annotateMarker.spec.js +43 -0
  438. package/lib/test/client.annotateMarker.spec.js.map +1 -0
  439. package/lib/test/client.apis.spec.d.ts +7 -0
  440. package/lib/test/client.apis.spec.d.ts.map +1 -0
  441. package/lib/test/client.apis.spec.js +67 -0
  442. package/lib/test/client.apis.spec.js.map +1 -0
  443. package/lib/test/client.applyMsg.spec.d.ts +6 -0
  444. package/lib/test/client.applyMsg.spec.d.ts.map +1 -0
  445. package/lib/test/client.applyMsg.spec.js +561 -0
  446. package/lib/test/client.applyMsg.spec.js.map +1 -0
  447. package/lib/test/client.applyStashedOpFarm.spec.d.ts +12 -0
  448. package/lib/test/client.applyStashedOpFarm.spec.d.ts.map +1 -0
  449. package/lib/test/client.applyStashedOpFarm.spec.js +153 -0
  450. package/lib/test/client.applyStashedOpFarm.spec.js.map +1 -0
  451. package/lib/test/client.attributionFarm.spec.d.ts +7 -0
  452. package/lib/test/client.attributionFarm.spec.d.ts.map +1 -0
  453. package/lib/test/client.attributionFarm.spec.js +92 -0
  454. package/lib/test/client.attributionFarm.spec.js.map +1 -0
  455. package/lib/test/client.conflictFarm.spec.d.ts +15 -0
  456. package/lib/test/client.conflictFarm.spec.d.ts.map +1 -0
  457. package/lib/test/client.conflictFarm.spec.js +85 -0
  458. package/lib/test/client.conflictFarm.spec.js.map +1 -0
  459. package/lib/test/client.getPosition.spec.d.ts +6 -0
  460. package/lib/test/client.getPosition.spec.d.ts.map +1 -0
  461. package/lib/test/client.getPosition.spec.js +52 -0
  462. package/lib/test/client.getPosition.spec.js.map +1 -0
  463. package/lib/test/client.localReference.spec.d.ts +6 -0
  464. package/lib/test/client.localReference.spec.d.ts.map +1 -0
  465. package/lib/test/client.localReference.spec.js +468 -0
  466. package/lib/test/client.localReference.spec.js.map +1 -0
  467. package/lib/test/client.localReferenceFarm.spec.d.ts +6 -0
  468. package/lib/test/client.localReferenceFarm.spec.d.ts.map +1 -0
  469. package/lib/test/client.localReferenceFarm.spec.js +86 -0
  470. package/lib/test/client.localReferenceFarm.spec.js.map +1 -0
  471. package/lib/test/client.rebasePosition.spec.d.ts +6 -0
  472. package/lib/test/client.rebasePosition.spec.d.ts.map +1 -0
  473. package/lib/test/client.rebasePosition.spec.js +100 -0
  474. package/lib/test/client.rebasePosition.spec.js.map +1 -0
  475. package/lib/test/client.reconnectFarm.spec.d.ts +12 -0
  476. package/lib/test/client.reconnectFarm.spec.d.ts.map +1 -0
  477. package/lib/test/client.reconnectFarm.spec.js +88 -0
  478. package/lib/test/client.reconnectFarm.spec.js.map +1 -0
  479. package/lib/test/client.replay.spec.d.ts +6 -0
  480. package/lib/test/client.replay.spec.d.ts.map +1 -0
  481. package/lib/test/client.replay.spec.js +57 -0
  482. package/lib/test/client.replay.spec.js.map +1 -0
  483. package/lib/test/client.rollback.spec.d.ts +6 -0
  484. package/lib/test/client.rollback.spec.d.ts.map +1 -0
  485. package/lib/test/client.rollback.spec.js +451 -0
  486. package/lib/test/client.rollback.spec.js.map +1 -0
  487. package/lib/test/client.rollbackFarm.spec.d.ts +6 -0
  488. package/lib/test/client.rollbackFarm.spec.d.ts.map +1 -0
  489. package/lib/test/client.rollbackFarm.spec.js +46 -0
  490. package/lib/test/client.rollbackFarm.spec.js.map +1 -0
  491. package/lib/test/client.searchForMarker.spec.d.ts +6 -0
  492. package/lib/test/client.searchForMarker.spec.d.ts.map +1 -0
  493. package/lib/test/client.searchForMarker.spec.js +495 -0
  494. package/lib/test/client.searchForMarker.spec.js.map +1 -0
  495. package/lib/test/client.walkSegments.spec.d.ts +6 -0
  496. package/lib/test/client.walkSegments.spec.d.ts.map +1 -0
  497. package/lib/test/client.walkSegments.spec.js +52 -0
  498. package/lib/test/client.walkSegments.spec.js.map +1 -0
  499. package/lib/test/collections.list.spec.d.ts +6 -0
  500. package/lib/test/collections.list.spec.d.ts.map +1 -0
  501. package/lib/test/collections.list.spec.js +82 -0
  502. package/lib/test/collections.list.spec.js.map +1 -0
  503. package/lib/test/createInsertOnlyAttributionPolicy.spec.d.ts +6 -0
  504. package/lib/test/createInsertOnlyAttributionPolicy.spec.d.ts.map +1 -0
  505. package/lib/test/createInsertOnlyAttributionPolicy.spec.js +33 -0
  506. package/lib/test/createInsertOnlyAttributionPolicy.spec.js.map +1 -0
  507. package/lib/test/dirname.cjs +16 -0
  508. package/lib/test/dirname.cjs.map +1 -0
  509. package/lib/test/dirname.d.cts +6 -0
  510. package/lib/test/dirname.d.cts.map +1 -0
  511. package/lib/test/index.d.ts +13 -0
  512. package/lib/test/index.d.ts.map +1 -0
  513. package/lib/test/index.js +13 -0
  514. package/lib/test/index.js.map +1 -0
  515. package/lib/test/mergeTree.annotate.deltaCallback.spec.d.ts +6 -0
  516. package/lib/test/mergeTree.annotate.deltaCallback.spec.d.ts.map +1 -0
  517. package/lib/test/mergeTree.annotate.deltaCallback.spec.js +140 -0
  518. package/lib/test/mergeTree.annotate.deltaCallback.spec.js.map +1 -0
  519. package/lib/test/mergeTree.annotate.spec.d.ts +6 -0
  520. package/lib/test/mergeTree.annotate.spec.d.ts.map +1 -0
  521. package/lib/test/mergeTree.annotate.spec.js +446 -0
  522. package/lib/test/mergeTree.annotate.spec.js.map +1 -0
  523. package/lib/test/mergeTree.insert.deltaCallback.spec.d.ts +6 -0
  524. package/lib/test/mergeTree.insert.deltaCallback.spec.d.ts.map +1 -0
  525. package/lib/test/mergeTree.insert.deltaCallback.spec.js +124 -0
  526. package/lib/test/mergeTree.insert.deltaCallback.spec.js.map +1 -0
  527. package/lib/test/mergeTree.insertingWalk.spec.d.ts +6 -0
  528. package/lib/test/mergeTree.insertingWalk.spec.d.ts.map +1 -0
  529. package/lib/test/mergeTree.insertingWalk.spec.js +277 -0
  530. package/lib/test/mergeTree.insertingWalk.spec.js.map +1 -0
  531. package/lib/test/mergeTree.markRangeRemoved.deltaCallback.spec.d.ts +6 -0
  532. package/lib/test/mergeTree.markRangeRemoved.deltaCallback.spec.d.ts.map +1 -0
  533. package/lib/test/mergeTree.markRangeRemoved.deltaCallback.spec.js +176 -0
  534. package/lib/test/mergeTree.markRangeRemoved.deltaCallback.spec.js.map +1 -0
  535. package/lib/test/mergeTree.markRangeRemoved.spec.d.ts +6 -0
  536. package/lib/test/mergeTree.markRangeRemoved.spec.d.ts.map +1 -0
  537. package/lib/test/mergeTree.markRangeRemoved.spec.js +128 -0
  538. package/lib/test/mergeTree.markRangeRemoved.spec.js.map +1 -0
  539. package/lib/test/mergeTree.walk.spec.d.ts +6 -0
  540. package/lib/test/mergeTree.walk.spec.d.ts.map +1 -0
  541. package/lib/test/mergeTree.walk.spec.js +61 -0
  542. package/lib/test/mergeTree.walk.spec.js.map +1 -0
  543. package/lib/test/mergeTree.zamboni.spec.d.ts +6 -0
  544. package/lib/test/mergeTree.zamboni.spec.d.ts.map +1 -0
  545. package/lib/test/mergeTree.zamboni.spec.js +50 -0
  546. package/lib/test/mergeTree.zamboni.spec.js.map +1 -0
  547. package/lib/test/mergeTreeOperationRunner.d.ts +63 -0
  548. package/lib/test/mergeTreeOperationRunner.d.ts.map +1 -0
  549. package/lib/test/mergeTreeOperationRunner.js +207 -0
  550. package/lib/test/mergeTreeOperationRunner.js.map +1 -0
  551. package/lib/test/mergeTreeOperationRunner.spec.d.ts +6 -0
  552. package/lib/test/mergeTreeOperationRunner.spec.d.ts.map +1 -0
  553. package/lib/test/mergeTreeOperationRunner.spec.js +154 -0
  554. package/lib/test/mergeTreeOperationRunner.spec.js.map +1 -0
  555. package/lib/test/obliterate.concurrent.spec.d.ts +6 -0
  556. package/lib/test/obliterate.concurrent.spec.d.ts.map +1 -0
  557. package/lib/test/obliterate.concurrent.spec.js +1441 -0
  558. package/lib/test/obliterate.concurrent.spec.js.map +1 -0
  559. package/lib/test/obliterate.deltaCallback.spec.d.ts +6 -0
  560. package/lib/test/obliterate.deltaCallback.spec.d.ts.map +1 -0
  561. package/lib/test/obliterate.deltaCallback.spec.js +144 -0
  562. package/lib/test/obliterate.deltaCallback.spec.js.map +1 -0
  563. package/lib/test/obliterate.partialLength.spec.d.ts +6 -0
  564. package/lib/test/obliterate.partialLength.spec.d.ts.map +1 -0
  565. package/lib/test/obliterate.partialLength.spec.js +272 -0
  566. package/lib/test/obliterate.partialLength.spec.js.map +1 -0
  567. package/lib/test/obliterate.reconnect.spec.d.ts +6 -0
  568. package/lib/test/obliterate.reconnect.spec.d.ts.map +1 -0
  569. package/lib/test/obliterate.reconnect.spec.js +159 -0
  570. package/lib/test/obliterate.reconnect.spec.js.map +1 -0
  571. package/lib/test/obliterate.spec.d.ts +6 -0
  572. package/lib/test/obliterate.spec.d.ts.map +1 -0
  573. package/lib/test/obliterate.spec.js +160 -0
  574. package/lib/test/obliterate.spec.js.map +1 -0
  575. package/lib/test/ordinal.spec.d.ts +2 -0
  576. package/lib/test/ordinal.spec.d.ts.map +1 -0
  577. package/lib/test/ordinal.spec.js +38 -0
  578. package/lib/test/ordinal.spec.js.map +1 -0
  579. package/lib/test/partialLength.spec.d.ts +6 -0
  580. package/lib/test/partialLength.spec.d.ts.map +1 -0
  581. package/lib/test/partialLength.spec.js +274 -0
  582. package/lib/test/partialLength.spec.js.map +1 -0
  583. package/lib/test/properties.spec.d.ts +6 -0
  584. package/lib/test/properties.spec.d.ts.map +1 -0
  585. package/lib/test/properties.spec.js +53 -0
  586. package/lib/test/properties.spec.js.map +1 -0
  587. package/lib/test/reconnectHelper.d.ts +48 -0
  588. package/lib/test/reconnectHelper.d.ts.map +1 -0
  589. package/lib/test/reconnectHelper.js +82 -0
  590. package/lib/test/reconnectHelper.js.map +1 -0
  591. package/lib/test/resetPendingSegmentsToOp.spec.d.ts +6 -0
  592. package/lib/test/resetPendingSegmentsToOp.spec.d.ts.map +1 -0
  593. package/lib/test/resetPendingSegmentsToOp.spec.js +235 -0
  594. package/lib/test/resetPendingSegmentsToOp.spec.js.map +1 -0
  595. package/lib/test/revertibleFarm.spec.d.ts +6 -0
  596. package/lib/test/revertibleFarm.spec.d.ts.map +1 -0
  597. package/lib/test/revertibleFarm.spec.js +119 -0
  598. package/lib/test/revertibleFarm.spec.js.map +1 -0
  599. package/lib/test/revertibles.spec.d.ts +17 -0
  600. package/lib/test/revertibles.spec.d.ts.map +1 -0
  601. package/lib/test/revertibles.spec.js +381 -0
  602. package/lib/test/revertibles.spec.js.map +1 -0
  603. package/lib/test/segmentGroupCollection.spec.d.ts +6 -0
  604. package/lib/test/segmentGroupCollection.spec.d.ts.map +1 -0
  605. package/lib/test/segmentGroupCollection.spec.js +58 -0
  606. package/lib/test/segmentGroupCollection.spec.js.map +1 -0
  607. package/lib/test/snapshot.spec.d.ts +6 -0
  608. package/lib/test/snapshot.spec.d.ts.map +1 -0
  609. package/lib/test/snapshot.spec.js +176 -0
  610. package/lib/test/snapshot.spec.js.map +1 -0
  611. package/lib/test/snapshot.utils.d.ts +33 -0
  612. package/lib/test/snapshot.utils.d.ts.map +1 -0
  613. package/lib/test/snapshot.utils.js +104 -0
  614. package/lib/test/snapshot.utils.js.map +1 -0
  615. package/lib/test/snapshotlegacy.spec.d.ts +6 -0
  616. package/lib/test/snapshotlegacy.spec.d.ts.map +1 -0
  617. package/lib/test/snapshotlegacy.spec.js +137 -0
  618. package/lib/test/snapshotlegacy.spec.js.map +1 -0
  619. package/lib/test/sortedSegmentSet.spec.d.ts +6 -0
  620. package/lib/test/sortedSegmentSet.spec.d.ts.map +1 -0
  621. package/lib/test/sortedSegmentSet.spec.js +93 -0
  622. package/lib/test/sortedSegmentSet.spec.js.map +1 -0
  623. package/lib/test/testClient.d.ts +116 -0
  624. package/lib/test/testClient.d.ts.map +1 -0
  625. package/lib/test/testClient.js +430 -0
  626. package/lib/test/testClient.js.map +1 -0
  627. package/lib/test/testClientLogger.d.ts +44 -0
  628. package/lib/test/testClientLogger.d.ts.map +1 -0
  629. package/lib/test/testClientLogger.js +282 -0
  630. package/lib/test/testClientLogger.js.map +1 -0
  631. package/lib/test/testSerializer.d.ts +18 -0
  632. package/lib/test/testSerializer.d.ts.map +1 -0
  633. package/lib/test/testSerializer.js +29 -0
  634. package/lib/test/testSerializer.js.map +1 -0
  635. package/lib/test/testServer.d.ts +36 -0
  636. package/lib/test/testServer.d.ts.map +1 -0
  637. package/lib/test/testServer.js +133 -0
  638. package/lib/test/testServer.js.map +1 -0
  639. package/lib/test/testUtils.d.ts +77 -0
  640. package/lib/test/testUtils.d.ts.map +1 -0
  641. package/lib/test/testUtils.js +151 -0
  642. package/lib/test/testUtils.js.map +1 -0
  643. package/lib/test/text.d.ts +9 -0
  644. package/lib/test/text.d.ts.map +1 -0
  645. package/lib/test/text.js +71 -0
  646. package/lib/test/text.js.map +1 -0
  647. package/lib/test/tracking.spec.d.ts +6 -0
  648. package/lib/test/tracking.spec.d.ts.map +1 -0
  649. package/lib/test/tracking.spec.js +118 -0
  650. package/lib/test/tracking.spec.js.map +1 -0
  651. package/lib/test/types/validateMergeTreePrevious.generated.d.ts +2 -0
  652. package/lib/test/types/validateMergeTreePrevious.generated.d.ts.map +1 -0
  653. package/lib/test/types/validateMergeTreePrevious.generated.js +228 -0
  654. package/lib/test/types/validateMergeTreePrevious.generated.js.map +1 -0
  655. package/lib/test/wordUnitTests.spec.d.ts +6 -0
  656. package/lib/test/wordUnitTests.spec.d.ts.map +1 -0
  657. package/lib/test/wordUnitTests.spec.js +166 -0
  658. package/lib/test/wordUnitTests.spec.js.map +1 -0
  659. package/lib/{textSegment.d.mts → textSegment.d.ts} +4 -4
  660. package/lib/textSegment.d.ts.map +1 -0
  661. package/lib/{textSegment.mjs → textSegment.js} +2 -2
  662. package/lib/textSegment.js.map +1 -0
  663. package/lib/{zamboni.d.mts → zamboni.d.ts} +3 -3
  664. package/lib/zamboni.d.ts.map +1 -0
  665. package/lib/{zamboni.mjs → zamboni.js} +7 -6
  666. package/lib/zamboni.js.map +1 -0
  667. package/package.json +50 -57
  668. package/src/MergeTreeTextHelper.ts +4 -4
  669. package/src/attributionCollection.ts +1 -1
  670. package/src/attributionPolicy.ts +5 -5
  671. package/src/client.ts +50 -41
  672. package/src/collections/index.ts +2 -2
  673. package/src/endOfTreeSegment.ts +5 -5
  674. package/src/index.ts +20 -20
  675. package/src/localReference.ts +13 -7
  676. package/src/mergeTree.ts +53 -44
  677. package/src/mergeTreeDeltaCallback.ts +3 -8
  678. package/src/mergeTreeNodeWalk.ts +1 -1
  679. package/src/mergeTreeNodes.ts +21 -19
  680. package/src/mergeTreeTracking.ts +3 -3
  681. package/src/opBuilder.ts +3 -3
  682. package/src/partialLengths.ts +10 -10
  683. package/src/referencePositions.ts +4 -4
  684. package/src/revertibles.ts +14 -18
  685. package/src/segmentGroupCollection.ts +2 -2
  686. package/src/segmentPropertiesManager.ts +3 -3
  687. package/src/snapshotChunks.ts +4 -4
  688. package/src/snapshotLoader.ts +14 -11
  689. package/src/snapshotV1.ts +29 -9
  690. package/src/snapshotlegacy.ts +19 -5
  691. package/src/sortedSegmentSet.ts +8 -6
  692. package/src/textSegment.ts +3 -3
  693. package/src/zamboni.ts +7 -7
  694. package/tsconfig.cjs.json +7 -0
  695. package/tsconfig.json +2 -5
  696. package/api-extractor-esm.json +0 -17
  697. package/dist/test/beastTest.d.ts.map +0 -1
  698. package/dist/test/beastTest.js.map +0 -1
  699. package/dist/test/client.apis.d.ts.map +0 -1
  700. package/dist/test/client.apis.js.map +0 -1
  701. package/dist/test/wordUnitTests.d.ts.map +0 -1
  702. package/dist/test/wordUnitTests.js.map +0 -1
  703. package/lib/MergeTreeTextHelper.d.mts.map +0 -1
  704. package/lib/MergeTreeTextHelper.mjs.map +0 -1
  705. package/lib/attributionCollection.d.mts.map +0 -1
  706. package/lib/attributionCollection.mjs.map +0 -1
  707. package/lib/attributionPolicy.d.mts.map +0 -1
  708. package/lib/attributionPolicy.mjs.map +0 -1
  709. package/lib/client.d.mts.map +0 -1
  710. package/lib/client.mjs.map +0 -1
  711. package/lib/collections/index.d.mts.map +0 -1
  712. package/lib/collections/index.mjs +0 -7
  713. package/lib/collections/index.mjs.map +0 -1
  714. package/lib/collections/list.d.mts.map +0 -1
  715. package/lib/collections/list.mjs.map +0 -1
  716. package/lib/collections/rbTree.d.mts.map +0 -1
  717. package/lib/collections/rbTree.mjs.map +0 -1
  718. package/lib/constants.d.mts.map +0 -1
  719. package/lib/constants.mjs.map +0 -1
  720. package/lib/endOfTreeSegment.d.mts.map +0 -1
  721. package/lib/endOfTreeSegment.mjs.map +0 -1
  722. package/lib/index.d.mts.map +0 -1
  723. package/lib/index.mjs.map +0 -1
  724. package/lib/localReference.d.mts.map +0 -1
  725. package/lib/localReference.mjs.map +0 -1
  726. package/lib/merge-tree-beta.d.mts +0 -668
  727. package/lib/merge-tree-public.d.mts +0 -668
  728. package/lib/mergeTree.d.mts.map +0 -1
  729. package/lib/mergeTree.mjs.map +0 -1
  730. package/lib/mergeTreeDeltaCallback.d.mts.map +0 -1
  731. package/lib/mergeTreeDeltaCallback.mjs.map +0 -1
  732. package/lib/mergeTreeNodeWalk.d.mts.map +0 -1
  733. package/lib/mergeTreeNodeWalk.mjs.map +0 -1
  734. package/lib/mergeTreeNodes.d.mts.map +0 -1
  735. package/lib/mergeTreeNodes.mjs.map +0 -1
  736. package/lib/mergeTreeTracking.d.mts.map +0 -1
  737. package/lib/mergeTreeTracking.mjs.map +0 -1
  738. package/lib/opBuilder.mjs.map +0 -1
  739. package/lib/ops.d.mts.map +0 -1
  740. package/lib/ops.mjs.map +0 -1
  741. package/lib/ordinal.d.mts.map +0 -1
  742. package/lib/ordinal.mjs.map +0 -1
  743. package/lib/partialLengths.d.mts.map +0 -1
  744. package/lib/partialLengths.mjs.map +0 -1
  745. package/lib/properties.d.mts.map +0 -1
  746. package/lib/properties.mjs.map +0 -1
  747. package/lib/referencePositions.d.mts.map +0 -1
  748. package/lib/referencePositions.mjs.map +0 -1
  749. package/lib/revertibles.d.mts.map +0 -1
  750. package/lib/revertibles.mjs.map +0 -1
  751. package/lib/segmentGroupCollection.d.mts.map +0 -1
  752. package/lib/segmentGroupCollection.mjs.map +0 -1
  753. package/lib/segmentPropertiesManager.d.mts.map +0 -1
  754. package/lib/segmentPropertiesManager.mjs.map +0 -1
  755. package/lib/snapshotChunks.d.mts.map +0 -1
  756. package/lib/snapshotChunks.mjs.map +0 -1
  757. package/lib/snapshotLoader.d.mts.map +0 -1
  758. package/lib/snapshotLoader.mjs.map +0 -1
  759. package/lib/snapshotV1.d.mts.map +0 -1
  760. package/lib/snapshotV1.mjs.map +0 -1
  761. package/lib/snapshotlegacy.d.mts.map +0 -1
  762. package/lib/snapshotlegacy.mjs.map +0 -1
  763. package/lib/sortedSegmentSet.d.mts.map +0 -1
  764. package/lib/sortedSegmentSet.mjs.map +0 -1
  765. package/lib/sortedSet.d.mts.map +0 -1
  766. package/lib/sortedSet.mjs.map +0 -1
  767. package/lib/textSegment.d.mts.map +0 -1
  768. package/lib/textSegment.mjs.map +0 -1
  769. package/lib/zamboni.d.mts.map +0 -1
  770. package/lib/zamboni.mjs.map +0 -1
@@ -0,0 +1,1318 @@
1
+ /*!
2
+ * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
+ * Licensed under the MIT License.
4
+ */
5
+ /* eslint-disable @typescript-eslint/consistent-type-assertions, no-bitwise */
6
+ /* eslint-disable @typescript-eslint/no-unnecessary-type-assertion */
7
+ /* eslint-disable @typescript-eslint/no-non-null-assertion */
8
+ /* eslint-disable @typescript-eslint/no-base-to-string */
9
+ import { strict as assert } from "assert";
10
+ import fs from "fs";
11
+ import path from "path";
12
+ import { makeRandom } from "@fluid-private/stochastic-test-utils";
13
+ import { Trace } from "@fluid-internal/client-utils";
14
+ import { createChildLogger } from "@fluidframework/telemetry-utils";
15
+ import JsDiff from "diff";
16
+ import { RedBlackTree, } from "../collections/index.js";
17
+ import { LocalClientId, UnassignedSequenceNumber, UniversalSequenceNumber } from "../constants.js";
18
+ import { reservedMarkerIdKey, compareNumbers, compareStrings, } from "../mergeTreeNodes.js";
19
+ import { createRemoveRangeOp } from "../opBuilder.js";
20
+ import { MergeTreeDeltaType, ReferenceType } from "../ops.js";
21
+ import { SnapshotLegacy } from "../snapshotlegacy.js";
22
+ import { TextSegment } from "../textSegment.js";
23
+ import { reservedRangeLabelsKey, reservedTileLabelsKey } from "../referencePositions.js";
24
+ import { MergeTree } from "../mergeTree.js";
25
+ import { MergeTreeTextHelper } from "../MergeTreeTextHelper.js";
26
+ import { getStats, specToSegment, TestClient } from "./testClient.js";
27
+ import { TestServer } from "./testServer.js";
28
+ import { insertText, loadTextFromFile, nodeOrdinalsHaveIntegrity } from "./testUtils.js";
29
+ import { _dirname } from "./dirname.cjs";
30
+ function LinearDictionary(compareKeys) {
31
+ const props = [];
32
+ const compareProps = (a, b) => compareKeys(a.key, b.key);
33
+ function mapRange(action, accum, start, end) {
34
+ let _start = start;
35
+ let _end = end;
36
+ if (props.length !== 0) {
37
+ return;
38
+ }
39
+ if (_start === undefined) {
40
+ _start = min().key;
41
+ }
42
+ if (_end === undefined) {
43
+ _end = max().key;
44
+ }
45
+ for (let i = 0, len = props.length; i < len; i++) {
46
+ if (compareKeys(_start, props[i].key) <= 0) {
47
+ const ecmp = compareKeys(_end, props[i].key);
48
+ if (ecmp < 0) {
49
+ break;
50
+ }
51
+ if (!action(props[i], accum)) {
52
+ break;
53
+ }
54
+ }
55
+ }
56
+ }
57
+ function map(action, accum) {
58
+ mapRange(action, accum);
59
+ }
60
+ function min() {
61
+ if (props.length > 0) {
62
+ return props[0];
63
+ }
64
+ }
65
+ function max() {
66
+ if (props.length > 0) {
67
+ return props[props.length - 1];
68
+ }
69
+ }
70
+ function get(key) {
71
+ for (let i = 0, len = props.length; i < len; i++) {
72
+ if (props[i].key === key) {
73
+ return props[i];
74
+ }
75
+ }
76
+ }
77
+ function put(key, data) {
78
+ if (key !== undefined) {
79
+ if (data === undefined) {
80
+ remove(key);
81
+ }
82
+ else {
83
+ props.push({ key, data });
84
+ props.sort(compareProps); // Go to insertion sort if too slow
85
+ }
86
+ }
87
+ }
88
+ function remove(key) {
89
+ if (key !== undefined) {
90
+ for (let i = 0, len = props.length; i < len; i++) {
91
+ if (props[i].key === key) {
92
+ props[i] = props[len - 1];
93
+ props.length--;
94
+ props.sort(compareProps);
95
+ break;
96
+ }
97
+ }
98
+ }
99
+ }
100
+ return {
101
+ min,
102
+ max,
103
+ map,
104
+ mapRange,
105
+ remove,
106
+ get,
107
+ put,
108
+ };
109
+ }
110
+ let logLines;
111
+ function log(message) {
112
+ if (logLines) {
113
+ logLines.push(message.toString());
114
+ }
115
+ }
116
+ function printStringProperty(p) {
117
+ log(`[${p?.key}, ${p?.data}]`);
118
+ return true;
119
+ }
120
+ function printStringNumProperty(p) {
121
+ log(`[${p.key}, ${p.data}]`);
122
+ return true;
123
+ }
124
+ export function simpleTest() {
125
+ const a = ["Aardvark", "cute", "Baboon", "big", "Chameleon", "colorful", "Dingo", "wild"];
126
+ const beast = new RedBlackTree(compareStrings);
127
+ for (let i = 0; i < a.length; i += 2) {
128
+ beast.put(a[i], a[i + 1]);
129
+ }
130
+ beast.map(printStringProperty);
131
+ log("Map B D");
132
+ log("Map Aardvark Dingo");
133
+ log("Map Baboon Chameleon");
134
+ printStringProperty(beast.get("Chameleon"));
135
+ }
136
+ const clock = () => Trace.start();
137
+ function took(desc, trace) {
138
+ const duration = trace.trace().duration;
139
+ log(`${desc} took ${duration} ms`);
140
+ return duration;
141
+ }
142
+ function elapsedMicroseconds(trace) {
143
+ return trace.trace().duration * 1000;
144
+ }
145
+ export function integerTest1() {
146
+ const random = makeRandom(0xdeadbeef, 0xfeedbed);
147
+ const imin = 0;
148
+ const imax = 10000000;
149
+ const intCount = 1100000;
150
+ const beast = new RedBlackTree(compareNumbers);
151
+ const randInt = () => random.integer(imin, imax);
152
+ const pos = new Array(intCount);
153
+ let i = 0;
154
+ let redo = false;
155
+ function onConflict(key, currentKey) {
156
+ redo = true;
157
+ return { data: currentKey };
158
+ }
159
+ let conflictCount = 0;
160
+ let start = clock();
161
+ while (i < intCount) {
162
+ pos[i] = randInt();
163
+ beast.put(pos[i], i, onConflict);
164
+ if (!redo) {
165
+ i++;
166
+ }
167
+ else {
168
+ conflictCount++;
169
+ redo = false;
170
+ }
171
+ }
172
+ took("test gen", start);
173
+ const errorCount = 0;
174
+ start = clock();
175
+ for (let j = 0, len = pos.length; j < len; j++) {
176
+ const cp = pos[j];
177
+ /* let prop = */ beast.get(cp);
178
+ }
179
+ const getdur = took("get all keys", start);
180
+ log(`cost per get is ${((1000.0 * getdur) / intCount).toFixed(3)} us`);
181
+ log(`duplicates ${conflictCount}, errors ${errorCount}`);
182
+ return errorCount;
183
+ }
184
+ export function fileTest1() {
185
+ const content = fs.readFileSync(path.join(_dirname, "../../../public/literature/shakespeare.txt"), "utf8");
186
+ const a = content.split("\n");
187
+ const iterCount = a.length >> 2;
188
+ const removeCount = 10;
189
+ log(`len: ${a.length}`);
190
+ for (let k = 0; k < iterCount; k++) {
191
+ const beast = new RedBlackTree(compareStrings);
192
+ const linearBeast = LinearDictionary(compareStrings);
193
+ for (let i = 0, len = a.length; i < len; i++) {
194
+ a[i] = a[i].trim();
195
+ if (a[i].length > 0) {
196
+ beast.put(a[i], i);
197
+ linearBeast.put(a[i], i);
198
+ }
199
+ }
200
+ if (k === 0) {
201
+ beast.map(printStringNumProperty);
202
+ log("BTREE...");
203
+ }
204
+ const removedAnimals = [];
205
+ for (let j = 0; j < removeCount; j++) {
206
+ const removeIndex = Math.floor(Math.random() * a.length);
207
+ log(`Removing: ${a[removeIndex]} at ${removeIndex}`);
208
+ beast.remove(a[removeIndex]);
209
+ linearBeast.remove(a[removeIndex]);
210
+ removedAnimals.push(a[removeIndex]);
211
+ }
212
+ for (const animal of a) {
213
+ if (animal.length > 0 && !removedAnimals.includes(animal)) {
214
+ const prop = beast.get(animal);
215
+ const linProp = linearBeast.get(animal);
216
+ // log(`Trying key ${animal}`);
217
+ if (prop) {
218
+ // printStringNumProperty(prop);
219
+ if (linProp === undefined ||
220
+ prop.key !== linProp.key ||
221
+ prop.data !== linProp.data) {
222
+ log(`Linear BST does not match RB BST at key ${animal}`);
223
+ }
224
+ }
225
+ else {
226
+ log(`hmm...bad key: ${animal}`);
227
+ }
228
+ }
229
+ }
230
+ }
231
+ }
232
+ function printTextSegment(textSegment, pos) {
233
+ log(textSegment.toString());
234
+ log(`at [${pos}, ${pos + textSegment.cachedLength})`);
235
+ return true;
236
+ }
237
+ export function makeTextSegment(text) {
238
+ return new TextSegment(text);
239
+ }
240
+ function makeCollabTextSegment(text) {
241
+ return new TextSegment(text);
242
+ }
243
+ function editFlat(source, s, dl, nt = "") {
244
+ return source.substring(0, s) + nt + source.substring(s + dl, source.length);
245
+ }
246
+ let accumTime = 0;
247
+ function checkInsertMergeTree(mergeTree, pos, textSegment, verbose = false) {
248
+ let checkText = new MergeTreeTextHelper(mergeTree).getText(UniversalSequenceNumber, LocalClientId);
249
+ checkText = editFlat(checkText, pos, 0, textSegment.text);
250
+ const clockStart = clock();
251
+ insertText({
252
+ mergeTree,
253
+ pos,
254
+ refSeq: UniversalSequenceNumber,
255
+ clientId: LocalClientId,
256
+ seq: UniversalSequenceNumber,
257
+ text: textSegment.text,
258
+ props: undefined,
259
+ opArgs: undefined,
260
+ });
261
+ accumTime += elapsedMicroseconds(clockStart);
262
+ const updatedText = new MergeTreeTextHelper(mergeTree).getText(UniversalSequenceNumber, LocalClientId);
263
+ const result = checkText === updatedText;
264
+ if (!result && verbose) {
265
+ log(`mismatch(o): ${checkText}`);
266
+ log(`mismatch(u): ${updatedText}`);
267
+ }
268
+ return result;
269
+ }
270
+ function checkMarkRemoveMergeTree(mergeTree, start, end, verbose = false) {
271
+ const helper = new MergeTreeTextHelper(mergeTree);
272
+ const origText = helper.getText(UniversalSequenceNumber, LocalClientId);
273
+ const checkText = editFlat(origText, start, end - start);
274
+ const clockStart = clock();
275
+ mergeTree.markRangeRemoved(start, end, UniversalSequenceNumber, LocalClientId, UniversalSequenceNumber, false, { op: createRemoveRangeOp(start, end) });
276
+ accumTime += elapsedMicroseconds(clockStart);
277
+ const updatedText = helper.getText(UniversalSequenceNumber, LocalClientId);
278
+ const result = checkText === updatedText;
279
+ if (!result && verbose) {
280
+ log(`mismatch(o): ${origText}`);
281
+ log(`mismatch(c): ${checkText}`);
282
+ log(`mismatch(u): ${updatedText}`);
283
+ }
284
+ return result;
285
+ }
286
+ export function mergeTreeTest1() {
287
+ const mergeTree = new MergeTree();
288
+ mergeTree.insertSegments(0, [TextSegment.make("the cat is on the mat")], UniversalSequenceNumber, LocalClientId, UniversalSequenceNumber, undefined);
289
+ mergeTree.mapRange(printTextSegment, UniversalSequenceNumber, LocalClientId, undefined);
290
+ let fuzzySeg = makeCollabTextSegment("fuzzy, fuzzy ");
291
+ checkInsertMergeTree(mergeTree, 4, fuzzySeg);
292
+ fuzzySeg = makeCollabTextSegment("fuzzy, fuzzy ");
293
+ checkInsertMergeTree(mergeTree, 4, fuzzySeg);
294
+ checkMarkRemoveMergeTree(mergeTree, 4, 13);
295
+ // checkRemoveSegTree(segTree, 4, 13);
296
+ checkInsertMergeTree(mergeTree, 4, makeCollabTextSegment("fi"));
297
+ mergeTree.mapRange(printTextSegment, UniversalSequenceNumber, LocalClientId, undefined);
298
+ const segoff = mergeTree.getContainingSegment(4, UniversalSequenceNumber, LocalClientId);
299
+ log(mergeTree.getPosition(segoff.segment, UniversalSequenceNumber, LocalClientId));
300
+ log(new MergeTreeTextHelper(mergeTree).getText(UniversalSequenceNumber, LocalClientId));
301
+ log(mergeTree.toString());
302
+ TestPack().firstTest();
303
+ }
304
+ export function mergeTreeLargeTest() {
305
+ const mergeTree = new MergeTree();
306
+ mergeTree.insertSegments(0, [TextSegment.make("the cat is on the mat")], UniversalSequenceNumber, LocalClientId, UniversalSequenceNumber, undefined);
307
+ const insertCount = 1000000;
308
+ const removeCount = 980000;
309
+ const random = makeRandom(0xdeadbeef, 0xfeedbed);
310
+ const imin = 1;
311
+ const imax = 9;
312
+ const randInt = () => random.integer(imin, imax);
313
+ function randomString(len, c) {
314
+ let str = "";
315
+ for (let i = 0; i < len; i++) {
316
+ str += c;
317
+ }
318
+ return str;
319
+ }
320
+ accumTime = 0;
321
+ let accumTreeSize = 0;
322
+ let treeCount = 0;
323
+ for (let i = 0; i < insertCount; i++) {
324
+ const slen = randInt();
325
+ const s = randomString(slen, String.fromCharCode(48 + slen));
326
+ const preLen = mergeTree.getLength(UniversalSequenceNumber, LocalClientId);
327
+ const pos = random.integer(0, preLen);
328
+ const clockStart = clock();
329
+ insertText({
330
+ mergeTree,
331
+ pos,
332
+ refSeq: UniversalSequenceNumber,
333
+ clientId: LocalClientId,
334
+ seq: UniversalSequenceNumber,
335
+ text: s,
336
+ props: undefined,
337
+ opArgs: undefined,
338
+ });
339
+ accumTime += elapsedMicroseconds(clockStart);
340
+ if (i > 0 && 0 === i % 50000) {
341
+ const perIter = (accumTime / (i + 1)).toFixed(3);
342
+ treeCount++;
343
+ accumTreeSize += mergeTree.getLength(UniversalSequenceNumber, LocalClientId);
344
+ const averageTreeSize = (accumTreeSize / treeCount).toFixed(3);
345
+ log(`i: ${i} time: ${accumTime}us which is average ${perIter} per insert with average tree size ${averageTreeSize}`);
346
+ }
347
+ }
348
+ log(process.memoryUsage().heapUsed);
349
+ accumTime = 0;
350
+ accumTreeSize = 0;
351
+ treeCount = 0;
352
+ for (let i = 0; i < removeCount; i++) {
353
+ const dlen = randInt();
354
+ const preLen = mergeTree.getLength(UniversalSequenceNumber, LocalClientId);
355
+ const pos = random.integer(0, preLen);
356
+ // Log(itree.toString());
357
+ const clockStart = clock();
358
+ mergeTree.markRangeRemoved(pos, pos + dlen, UniversalSequenceNumber, LocalClientId, UniversalSequenceNumber, false, undefined);
359
+ accumTime += elapsedMicroseconds(clockStart);
360
+ if (i > 0 && 0 === i % 50000) {
361
+ const perIter = (accumTime / (i + 1)).toFixed(3);
362
+ treeCount++;
363
+ accumTreeSize += mergeTree.getLength(UniversalSequenceNumber, LocalClientId);
364
+ const averageTreeSize = (accumTreeSize / treeCount).toFixed(3);
365
+ log(`i: ${i} time: ${accumTime}us which is average ${perIter} per del with average tree size ${averageTreeSize}`);
366
+ }
367
+ }
368
+ }
369
+ export function mergeTreeCheckedTest() {
370
+ const mergeTree = new MergeTree();
371
+ mergeTree.insertSegments(0, [TextSegment.make("the cat is on the mat")], UniversalSequenceNumber, LocalClientId, UniversalSequenceNumber, undefined);
372
+ const insertCount = 2000;
373
+ const removeCount = 1400;
374
+ const largeRemoveCount = 20;
375
+ const random = makeRandom(0xdeadbeef, 0xfeedbed);
376
+ const imin = 1;
377
+ const imax = 9;
378
+ const randInt = () => random.integer(imin, imax);
379
+ const randLargeInt = () => random.integer(10, 1000);
380
+ function randomString(len, c) {
381
+ let str = "";
382
+ for (let i = 0; i < len; i++) {
383
+ str += c;
384
+ }
385
+ return str;
386
+ }
387
+ accumTime = 0;
388
+ let accumTreeSize = 0;
389
+ let treeCount = 0;
390
+ let errorCount = 0;
391
+ for (let i = 0; i < insertCount; i++) {
392
+ const slen = randInt();
393
+ const s = randomString(slen, String.fromCharCode(48 + slen));
394
+ const preLen = mergeTree.getLength(UniversalSequenceNumber, LocalClientId);
395
+ const pos = random.integer(0, preLen);
396
+ if (!checkInsertMergeTree(mergeTree, pos, makeCollabTextSegment(s), true)) {
397
+ log(`i: ${i} preLen ${preLen} pos: ${pos} slen: ${slen} s: ${s} itree len: ${mergeTree.getLength(UniversalSequenceNumber, LocalClientId)}`);
398
+ log(mergeTree.toString());
399
+ errorCount++;
400
+ break;
401
+ }
402
+ if (i > 0 && 0 === i % 1000) {
403
+ const perIter = (accumTime / (i + 1)).toFixed(3);
404
+ treeCount++;
405
+ accumTreeSize += mergeTree.getLength(UniversalSequenceNumber, LocalClientId);
406
+ const averageTreeSize = (accumTreeSize / treeCount).toFixed(3);
407
+ log(`i: ${i} time: ${accumTime}us which is average ${perIter} per insert with average tree size ${averageTreeSize}`);
408
+ }
409
+ }
410
+ accumTime = 0;
411
+ accumTreeSize = 0;
412
+ treeCount = 0;
413
+ for (let i = 0; i < largeRemoveCount; i++) {
414
+ const dlen = randLargeInt();
415
+ const preLen = mergeTree.getLength(UniversalSequenceNumber, LocalClientId);
416
+ const pos = random.integer(0, preLen);
417
+ // log(itree.toString());
418
+ if (!checkMarkRemoveMergeTree(mergeTree, pos, pos + dlen, true)) {
419
+ log(`i: ${i} preLen ${preLen} pos: ${pos} dlen: ${dlen} itree len: ${mergeTree.getLength(UniversalSequenceNumber, LocalClientId)}`);
420
+ log(mergeTree.toString());
421
+ break;
422
+ }
423
+ if (i > 0 && 0 === i % 10) {
424
+ const perIter = (accumTime / (i + 1)).toFixed(3);
425
+ treeCount++;
426
+ accumTreeSize += mergeTree.getLength(UniversalSequenceNumber, LocalClientId);
427
+ const averageTreeSize = (accumTreeSize / treeCount).toFixed(3);
428
+ log(`i: ${i} time: ${accumTime}us which is average ${perIter} per large del with average tree size ${averageTreeSize}`);
429
+ }
430
+ }
431
+ accumTime = 0;
432
+ accumTreeSize = 0;
433
+ treeCount = 0;
434
+ for (let i = 0; i < removeCount; i++) {
435
+ const dlen = randInt();
436
+ const preLen = mergeTree.getLength(UniversalSequenceNumber, LocalClientId);
437
+ const pos = random.integer(0, preLen);
438
+ // log(itree.toString());
439
+ if (i & 1) {
440
+ if (!checkMarkRemoveMergeTree(mergeTree, pos, pos + dlen, true)) {
441
+ log(`mr i: ${i} preLen ${preLen} pos: ${pos} dlen: ${dlen} itree len: ${mergeTree.getLength(UniversalSequenceNumber, LocalClientId)}`);
442
+ log(mergeTree.toString());
443
+ errorCount++;
444
+ break;
445
+ }
446
+ }
447
+ else {
448
+ if (!checkMarkRemoveMergeTree(mergeTree, pos, pos + dlen, true)) {
449
+ log(`i: ${i} preLen ${preLen} pos: ${pos} dlen: ${dlen} itree len: ${mergeTree.getLength(UniversalSequenceNumber, LocalClientId)}`);
450
+ log(mergeTree.toString());
451
+ errorCount++;
452
+ break;
453
+ }
454
+ }
455
+ if (i > 0 && 0 === i % 1000) {
456
+ const perIter = (accumTime / (i + 1)).toFixed(3);
457
+ treeCount++;
458
+ accumTreeSize += mergeTree.getLength(UniversalSequenceNumber, LocalClientId);
459
+ const averageTreeSize = (accumTreeSize / treeCount).toFixed(3);
460
+ log(`i: ${i} time: ${accumTime}us which is average ${perIter} per del with average tree size ${averageTreeSize}`);
461
+ }
462
+ }
463
+ accumTime = 0;
464
+ accumTreeSize = 0;
465
+ treeCount = 0;
466
+ for (let i = 0; i < insertCount; i++) {
467
+ const slen = randInt();
468
+ const s = randomString(slen, String.fromCharCode(48 + slen));
469
+ const preLen = mergeTree.getLength(UniversalSequenceNumber, LocalClientId);
470
+ const pos = random.integer(0, preLen);
471
+ if (!checkInsertMergeTree(mergeTree, pos, makeCollabTextSegment(s), true)) {
472
+ log(`i: ${i} preLen ${preLen} pos: ${pos} slen: ${slen} s: ${s} itree len: ${mergeTree.getLength(UniversalSequenceNumber, LocalClientId)}`);
473
+ log(mergeTree.toString());
474
+ errorCount++;
475
+ break;
476
+ }
477
+ if (i > 0 && 0 === i % 1000) {
478
+ const perIter = (accumTime / (i + 1)).toFixed(3);
479
+ treeCount++;
480
+ accumTreeSize += mergeTree.getLength(UniversalSequenceNumber, LocalClientId);
481
+ const averageTreeSize = (accumTreeSize / treeCount).toFixed(3);
482
+ log(`i: ${i} time: ${accumTime}us which is average ${perIter} per insert with average tree size ${averageTreeSize}`);
483
+ }
484
+ }
485
+ accumTime = 0;
486
+ accumTreeSize = 0;
487
+ treeCount = 0;
488
+ for (let i = 0; i < removeCount; i++) {
489
+ const dlen = randInt();
490
+ const preLen = mergeTree.getLength(UniversalSequenceNumber, LocalClientId);
491
+ const pos = random.integer(0, preLen);
492
+ // log(itree.toString());
493
+ if (i & 1) {
494
+ if (!checkMarkRemoveMergeTree(mergeTree, pos, pos + dlen, true)) {
495
+ log(`i: ${i} preLen ${preLen} pos: ${pos} dlen: ${dlen} itree len: ${mergeTree.getLength(UniversalSequenceNumber, LocalClientId)}`);
496
+ log(mergeTree.toString());
497
+ errorCount++;
498
+ break;
499
+ }
500
+ }
501
+ else {
502
+ if (!checkMarkRemoveMergeTree(mergeTree, pos, pos + dlen, true)) {
503
+ log(`i: ${i} preLen ${preLen} pos: ${pos} dlen: ${dlen} itree len: ${mergeTree.getLength(UniversalSequenceNumber, LocalClientId)}`);
504
+ log(mergeTree.toString());
505
+ errorCount++;
506
+ break;
507
+ }
508
+ }
509
+ if (i > 0 && 0 === i % 1000) {
510
+ const perIter = (accumTime / (i + 1)).toFixed(3);
511
+ treeCount++;
512
+ accumTreeSize += mergeTree.getLength(UniversalSequenceNumber, LocalClientId);
513
+ const averageTreeSize = (accumTreeSize / treeCount).toFixed(3);
514
+ log(`i: ${i} time: ${accumTime}us which is average ${perIter} per del with average tree size ${averageTreeSize}`);
515
+ }
516
+ }
517
+ return errorCount;
518
+ }
519
+ export function TestPack(verbose = true) {
520
+ const random = makeRandom(0xdeadbeef, 0xfeedbed);
521
+ const minSegCount = 1;
522
+ const maxSegCount = 1000;
523
+ const randSmallSegmentCount = () => random.integer(1, 4);
524
+ const randSegmentCount = () => random.integer(minSegCount, maxSegCount);
525
+ const randTextLength = () => random.integer(1, 5);
526
+ const zedCode = 48;
527
+ function randomString(len, c) {
528
+ let str = "";
529
+ for (let i = 0; i < len; i++) {
530
+ str += c;
531
+ }
532
+ return str;
533
+ }
534
+ let getTextTime = 0;
535
+ let getTextCalls = 0;
536
+ const catchUpTime = 0;
537
+ const catchUps = 0;
538
+ function reportTiming(client) {
539
+ if (!verbose) {
540
+ return;
541
+ }
542
+ const aveTime = (client.accumTime / client.accumOps).toFixed(1);
543
+ const stats = getStats(client.mergeTree);
544
+ const windowTime = stats.windowTime;
545
+ const packTime = stats.packTime;
546
+ const aveWindowTime = ((windowTime || 0) / client.accumOps).toFixed(1);
547
+ const avePackTime = ((packTime ?? 0) / client.accumOps).toFixed(1);
548
+ const aveExtraWindowTime = (client.accumWindowTime / client.accumOps).toFixed(1);
549
+ const aveWindow = (client.accumWindow / client.accumOps).toFixed(1);
550
+ const adjTime = ((client.accumTime - (windowTime - client.accumWindowTime)) /
551
+ client.accumOps).toFixed(1);
552
+ const aveGetTextTime = (getTextTime / getTextCalls).toFixed(1);
553
+ let aveCatchUpTime = "off";
554
+ if (catchUps > 0) {
555
+ aveCatchUpTime = (catchUpTime / catchUps).toFixed(1);
556
+ }
557
+ log(`get text time: ${aveGetTextTime} catch up ${aveCatchUpTime}`);
558
+ log(`accum time ${client.accumTime} us ops: ${client.accumOps} ave time ${aveTime} - wtime ${adjTime} pack ${avePackTime} ave window ${aveWindow}`);
559
+ log(`accum window time ${client.accumWindowTime} us ave window time total ${aveWindowTime} not in ops ${aveExtraWindowTime}; max ${client.maxWindowTime}`);
560
+ }
561
+ function manyMergeTrees() {
562
+ const mergeTreeCount = 2000000;
563
+ const a = Array(mergeTreeCount);
564
+ for (let i = 0; i < mergeTreeCount; i++) {
565
+ a[i] = new MergeTree();
566
+ }
567
+ for (;;) { }
568
+ }
569
+ function clientServer(startFile, initRounds = 1000) {
570
+ const clientCount = 5;
571
+ const fileSegCount = 0;
572
+ let initString = "";
573
+ if (!startFile) {
574
+ initString = "don't ask for whom the bell tolls; it tolls for thee";
575
+ }
576
+ const server = new TestServer();
577
+ server.insertTextLocal(0, initString);
578
+ server.measureOps = true;
579
+ if (startFile) {
580
+ loadTextFromFile(startFile, server.mergeTree, fileSegCount);
581
+ }
582
+ const clients = new Array(clientCount);
583
+ for (let i = 0; i < clientCount; i++) {
584
+ clients[i] = new TestClient();
585
+ clients[i].insertTextLocal(0, initString);
586
+ clients[i].measureOps = true;
587
+ if (startFile) {
588
+ loadTextFromFile(startFile, clients[i].mergeTree, fileSegCount);
589
+ }
590
+ clients[i].startOrUpdateCollaboration(`Fred${i}`);
591
+ }
592
+ server.startOrUpdateCollaboration("theServer");
593
+ server.addClients(clients);
594
+ function checkTextMatch() {
595
+ // log(`checking text match @${server.getCurrentSeq()}`);
596
+ const clockStart = clock();
597
+ const serverText = server.getText();
598
+ getTextTime += elapsedMicroseconds(clockStart);
599
+ getTextCalls++;
600
+ for (const client of clients) {
601
+ const cliText = client.getText();
602
+ if (cliText !== serverText) {
603
+ log(`mismatch @${server.getCurrentSeq()} client @${client.getCurrentSeq()} id: ${client.getClientId()}`);
604
+ // log(serverText);
605
+ // log(cliText);
606
+ const diffParts = JsDiff.diffChars(serverText, cliText);
607
+ for (const diffPart of diffParts) {
608
+ let annotes = "";
609
+ if (diffPart.added) {
610
+ annotes += "added ";
611
+ }
612
+ else if (diffPart.removed) {
613
+ annotes += "removed ";
614
+ }
615
+ if (diffPart.count) {
616
+ annotes += `count: ${diffPart.count}`;
617
+ }
618
+ log(`text: ${diffPart.value} ${annotes}`);
619
+ }
620
+ log(server.mergeTree.toString());
621
+ log(client.mergeTree.toString());
622
+ return true;
623
+ }
624
+ }
625
+ return false;
626
+ }
627
+ const rounds = initRounds;
628
+ function clientProcessSome(client, all = false) {
629
+ const cliMsgCount = client.getMessageCount();
630
+ const countToApply = all
631
+ ? cliMsgCount
632
+ : random.integer(Math.floor((2 * cliMsgCount) / 3), cliMsgCount);
633
+ client.applyMessages(countToApply);
634
+ }
635
+ function serverProcessSome(_server, all = false) {
636
+ const svrMsgCount = _server.getMessageCount();
637
+ const countToApply = all
638
+ ? svrMsgCount
639
+ : random.integer(Math.floor((2 * svrMsgCount) / 3), svrMsgCount);
640
+ return _server.applyMessages(countToApply);
641
+ }
642
+ function randomSpateOfInserts(client, charIndex) {
643
+ const textLen = randTextLength();
644
+ const text = randomString(textLen, String.fromCharCode(zedCode + ((client.getCurrentSeq() + charIndex) % 50)));
645
+ const preLen = client.getLength();
646
+ const pos = random.integer(0, preLen);
647
+ const insertTextOp = client.insertTextLocal(pos, text);
648
+ server.enqueueMsg(client.makeOpMessage(insertTextOp, UnassignedSequenceNumber));
649
+ if (TestClient.useCheckQ) {
650
+ client.enqueueTestString();
651
+ }
652
+ }
653
+ function randomSpateOfRemoves(client) {
654
+ const dlen = randTextLength();
655
+ const preLen = client.getLength();
656
+ const pos = random.integer(0, preLen);
657
+ const op = client.removeRangeLocal(pos, pos + dlen);
658
+ server.enqueueMsg(client.makeOpMessage(op));
659
+ if (TestClient.useCheckQ) {
660
+ client.enqueueTestString();
661
+ }
662
+ }
663
+ function randomWordMove(client) {
664
+ const word1 = client.findRandomWord();
665
+ if (word1) {
666
+ const removeStart = word1.pos;
667
+ const removeEnd = removeStart + word1.text.length;
668
+ const removeOp = client.removeRangeLocal(removeStart, removeEnd);
669
+ server.enqueueMsg(client.makeOpMessage(removeOp, UnassignedSequenceNumber));
670
+ if (TestClient.useCheckQ) {
671
+ client.enqueueTestString();
672
+ }
673
+ let word2 = client.findRandomWord();
674
+ while (!word2) {
675
+ word2 = client.findRandomWord();
676
+ }
677
+ const pos = word2.pos + word2.text.length;
678
+ const insertOp = client.insertTextLocal(pos, word1.text);
679
+ server.enqueueMsg(client.makeOpMessage(insertOp, UnassignedSequenceNumber));
680
+ if (TestClient.useCheckQ) {
681
+ client.enqueueTestString();
682
+ }
683
+ }
684
+ }
685
+ let errorCount = 0;
686
+ const extractSnapTime = 0;
687
+ const extractSnapOps = 0;
688
+ function finishRound(roundCount) {
689
+ // Process remaining messages
690
+ if (serverProcessSome(server, true)) {
691
+ return;
692
+ }
693
+ for (const client of clients) {
694
+ clientProcessSome(client, true);
695
+ }
696
+ if (0 === roundCount % 100) {
697
+ const clockStart = clock();
698
+ if (checkTextMatch()) {
699
+ log(`round: ${roundCount} BREAK`);
700
+ errorCount++;
701
+ return errorCount;
702
+ }
703
+ checkTime += elapsedMicroseconds(clockStart);
704
+ if (verbose) {
705
+ log(`wall clock is ${((Date.now() - startTime) / 1000.0).toFixed(1)}`);
706
+ }
707
+ const stats = getStats(server.mergeTree);
708
+ const liveAve = (stats.liveCount / stats.nodeCount).toFixed(1);
709
+ const posLeaves = stats.leafCount - stats.removedLeafCount;
710
+ let aveExtractSnapTime = "off";
711
+ if (extractSnapOps > 0) {
712
+ aveExtractSnapTime = (extractSnapTime / extractSnapOps).toFixed(1);
713
+ }
714
+ log(`round: ${roundCount} seq ${server.seq} char count ${server.getLength()} height ${stats.maxHeight} lv ${stats.leafCount} rml ${stats.removedLeafCount} p ${posLeaves} nodes ${stats.nodeCount} pop ${liveAve} histo ${stats.histo}`);
715
+ if (extractSnapOps > 0) {
716
+ aveExtractSnapTime = (extractSnapTime / extractSnapOps).toFixed(1);
717
+ log(`ave extract snap time ${aveExtractSnapTime}`);
718
+ }
719
+ reportTiming(server);
720
+ reportTiming(clients[2]);
721
+ let totalTime = server.accumTime + server.accumWindowTime;
722
+ for (const client of clients) {
723
+ totalTime += client.accumTime + client.accumWindowTime;
724
+ }
725
+ if (verbose) {
726
+ log(`total time ${(totalTime / 1000000.0).toFixed(1)} check time ${(checkTime / 1000000.0).toFixed(1)}`);
727
+ }
728
+ // log(server.getText());
729
+ // log(server.mergeTree.toString());
730
+ }
731
+ return errorCount;
732
+ }
733
+ function round(roundCount) {
734
+ for (const client of clients) {
735
+ const insertSegmentCount = randSmallSegmentCount();
736
+ for (let j = 0; j < insertSegmentCount; j++) {
737
+ if (startFile) {
738
+ randomWordMove(client);
739
+ }
740
+ else {
741
+ randomSpateOfInserts(client, j);
742
+ }
743
+ }
744
+ if (serverProcessSome(server)) {
745
+ return;
746
+ }
747
+ clientProcessSome(client);
748
+ let removeSegmentCount = Math.floor((3 * insertSegmentCount) / 4);
749
+ if (removeSegmentCount < 1) {
750
+ removeSegmentCount = 1;
751
+ }
752
+ for (let j = 0; j < removeSegmentCount; j++) {
753
+ if (startFile) {
754
+ randomWordMove(client);
755
+ }
756
+ else {
757
+ randomSpateOfRemoves(client);
758
+ }
759
+ }
760
+ if (serverProcessSome(server)) {
761
+ return;
762
+ }
763
+ clientProcessSome(client);
764
+ }
765
+ finishRound(roundCount);
766
+ }
767
+ const startTime = Date.now();
768
+ let checkTime = 0;
769
+ for (let i = 0; i < rounds; i++) {
770
+ round(i);
771
+ if (errorCount > 0) {
772
+ break;
773
+ }
774
+ }
775
+ tail();
776
+ function tail() {
777
+ reportTiming(server);
778
+ reportTiming(clients[2]);
779
+ // log(server.getText());
780
+ // log(server.mergeTree.toString());
781
+ }
782
+ return errorCount;
783
+ }
784
+ function randolicious() {
785
+ const insertRounds = 40;
786
+ const removeRounds = 32;
787
+ const cliA = new TestClient();
788
+ cliA.insertTextLocal(0, "a stitch in time saves nine");
789
+ cliA.startOrUpdateCollaboration("FredA");
790
+ const cliB = new TestClient();
791
+ cliB.insertTextLocal(0, "a stitch in time saves nine");
792
+ cliB.startOrUpdateCollaboration("FredB");
793
+ function checkTextMatch(checkSeq) {
794
+ let error = false;
795
+ if (cliA.getCurrentSeq() !== checkSeq) {
796
+ log(`client A has seq number ${cliA.getCurrentSeq()} mismatch with ${checkSeq}`);
797
+ error = true;
798
+ }
799
+ if (cliB.getCurrentSeq() !== checkSeq) {
800
+ log(`client B has seq number ${cliB.getCurrentSeq()} mismatch with ${checkSeq}`);
801
+ error = true;
802
+ }
803
+ const aText = cliA.getText();
804
+ const bText = cliB.getText();
805
+ if (aText !== bText) {
806
+ log(`mismatch @${checkSeq}:`);
807
+ log(aText);
808
+ log(bText);
809
+ error = true;
810
+ }
811
+ if (!nodeOrdinalsHaveIntegrity(cliA.mergeTree.root)) {
812
+ error = true;
813
+ }
814
+ if (!nodeOrdinalsHaveIntegrity(cliB.mergeTree.root)) {
815
+ error = true;
816
+ }
817
+ return error;
818
+ }
819
+ let min = 0;
820
+ cliA.accumTime = 0;
821
+ cliB.accumTime = 0;
822
+ function insertTest() {
823
+ for (let i = 0; i < insertRounds; i++) {
824
+ let insertCount = randSegmentCount();
825
+ let sequenceNumber = cliA.getCurrentSeq() + 1;
826
+ let firstSeq = sequenceNumber;
827
+ const cliAMsgs = [];
828
+ for (let j = 0; j < insertCount; j++) {
829
+ const textLen = randTextLength();
830
+ const text = randomString(textLen, String.fromCharCode(zedCode + (sequenceNumber % 50)));
831
+ const preLen = cliA.getLength();
832
+ const pos = random.integer(0, preLen);
833
+ const msg = cliA.makeOpMessage(cliA.insertTextLocal(pos, text), sequenceNumber++);
834
+ msg.minimumSequenceNumber = min;
835
+ cliAMsgs.push(msg);
836
+ cliB.applyMsg(msg);
837
+ }
838
+ for (let k = firstSeq; k < sequenceNumber; k++) {
839
+ cliA.applyMsg(cliAMsgs.shift());
840
+ }
841
+ if (checkTextMatch(sequenceNumber - 1)) {
842
+ return true;
843
+ }
844
+ min = sequenceNumber - 1;
845
+ insertCount = randSegmentCount();
846
+ sequenceNumber = cliA.getCurrentSeq() + 1;
847
+ firstSeq = sequenceNumber;
848
+ const cliBMsgs = [];
849
+ for (let j = 0; j < insertCount; j++) {
850
+ const textLen = randTextLength();
851
+ const text = randomString(textLen, String.fromCharCode(zedCode + (sequenceNumber % 50)));
852
+ const preLen = cliB.getLength();
853
+ const pos = random.integer(0, preLen);
854
+ const msg = cliB.makeOpMessage(cliB.insertTextLocal(pos, text), sequenceNumber++);
855
+ msg.minimumSequenceNumber = min;
856
+ cliBMsgs.push(msg);
857
+ cliA.applyMsg(msg);
858
+ }
859
+ for (let k = firstSeq; k < sequenceNumber; k++) {
860
+ cliB.applyMsg(cliBMsgs.shift());
861
+ }
862
+ if (checkTextMatch(sequenceNumber - 1)) {
863
+ return true;
864
+ }
865
+ min = sequenceNumber - 1;
866
+ }
867
+ return false;
868
+ }
869
+ function removeTest() {
870
+ for (let i = 0; i < removeRounds; i++) {
871
+ let removeCount = randSegmentCount();
872
+ let sequenceNumber = cliA.getCurrentSeq() + 1;
873
+ let firstSeq = sequenceNumber;
874
+ const cliAMsgs = [];
875
+ for (let j = 0; j < removeCount; j++) {
876
+ const dlen = randTextLength();
877
+ const maxStartPos = cliA.getLength() - dlen;
878
+ const pos = random.integer(0, maxStartPos);
879
+ const msg = cliA.makeOpMessage(cliA.removeRangeLocal(pos, pos + dlen), sequenceNumber++);
880
+ msg.minimumSequenceNumber = min;
881
+ cliAMsgs.push(msg);
882
+ cliB.applyMsg(msg);
883
+ }
884
+ for (let k = firstSeq; k < sequenceNumber; k++) {
885
+ cliA.applyMsg(cliAMsgs.shift());
886
+ }
887
+ if (checkTextMatch(sequenceNumber - 1)) {
888
+ return true;
889
+ }
890
+ min = sequenceNumber - 1;
891
+ removeCount = randSegmentCount();
892
+ sequenceNumber = cliA.getCurrentSeq() + 1;
893
+ firstSeq = sequenceNumber;
894
+ const cliBMsgs = [];
895
+ for (let j = 0; j < removeCount; j++) {
896
+ const dlen = randTextLength();
897
+ const maxStartPos = cliB.getLength() - dlen;
898
+ const pos = random.integer(0, maxStartPos);
899
+ const msg = cliB.makeOpMessage(cliB.removeRangeLocal(pos, pos + dlen), sequenceNumber++);
900
+ msg.minimumSequenceNumber = min;
901
+ cliBMsgs.push(msg);
902
+ cliA.applyMsg(msg);
903
+ }
904
+ for (let k = firstSeq; k < sequenceNumber; k++) {
905
+ cliB.applyMsg(cliBMsgs.shift());
906
+ }
907
+ if (checkTextMatch(sequenceNumber - 1)) {
908
+ return true;
909
+ }
910
+ min = sequenceNumber - 1;
911
+ }
912
+ return false;
913
+ }
914
+ let errorCount = 0;
915
+ if (insertTest()) {
916
+ log(cliA.mergeTree.toString());
917
+ log(cliB.mergeTree.toString());
918
+ errorCount++;
919
+ }
920
+ else {
921
+ log(`sequence number: ${cliA.getCurrentSeq()} min: ${cliA.getCollabWindow().minSeq}`);
922
+ // log(cliA.mergeTree.toString());
923
+ log(`testing remove at ${cliA.getCurrentSeq()} and ${cliB.getCurrentSeq()}`);
924
+ if (removeTest()) {
925
+ log(cliA.mergeTree.toString());
926
+ log(cliB.mergeTree.toString());
927
+ errorCount++;
928
+ }
929
+ }
930
+ log(`sequence number: ${cliA.getCurrentSeq()} min: ${cliA.getCollabWindow().minSeq}`);
931
+ // log(cliA.mergeTree.toString());
932
+ // log(cliB.mergeTree.toString());
933
+ // log(cliA.getText());
934
+ const aveWindow = ((minSegCount + maxSegCount) / 2).toFixed(1);
935
+ const aveTime = (cliA.accumTime / cliA.accumOps).toFixed(3);
936
+ const aveWindowTime = (cliA.accumWindowTime / cliA.accumOps).toFixed(3);
937
+ if (verbose) {
938
+ log(`accum time ${cliA.accumTime} us ops: ${cliA.accumOps} ave window ${aveWindow} ave time ${aveTime}`);
939
+ log(`accum window time ${cliA.accumWindowTime} us ave window time ${aveWindowTime}; max ${cliA.maxWindowTime}`);
940
+ }
941
+ // log(cliB.getText());
942
+ return errorCount;
943
+ }
944
+ const clientNames = ["Ed", "Ted", "Ned", "Harv", "Marv", "Glenda", "Susan"];
945
+ function firstTest() {
946
+ let cli = new TestClient();
947
+ cli.insertTextLocal(0, "on the mat.");
948
+ cli.startOrUpdateCollaboration("Fred1");
949
+ for (const cname of clientNames) {
950
+ cli.addLongClientId(cname);
951
+ }
952
+ cli.insertTextRemote(0, "that ", undefined, 1, 0, "1");
953
+ if (verbose) {
954
+ log(cli.mergeTree.toString());
955
+ }
956
+ cli.insertTextRemote(0, "fat ", undefined, 2, 0, "2");
957
+ if (verbose) {
958
+ log(cli.mergeTree.toString());
959
+ }
960
+ cli.insertTextLocal(5, "cat ");
961
+ if (verbose) {
962
+ log(cli.mergeTree.toString());
963
+ }
964
+ if (verbose) {
965
+ for (let i = 0; i < 4; i++) {
966
+ for (let j = 0; j < 3; j++) {
967
+ log(cli.relText(i, j));
968
+ }
969
+ }
970
+ }
971
+ cli.mergeTree.ackPendingSegment(createLocalOpArgs(MergeTreeDeltaType.INSERT, 3));
972
+ if (verbose) {
973
+ log(cli.mergeTree.toString());
974
+ for (let clientId = 0; clientId < 4; clientId++) {
975
+ for (let refSeq = 0; refSeq < 4; refSeq++) {
976
+ log(cli.relText(clientId, refSeq));
977
+ }
978
+ }
979
+ }
980
+ cli.insertMarkerRemote(0, { refType: ReferenceType.Tile }, { [reservedTileLabelsKey]: ["peach"] }, 5, 0, "2");
981
+ cli.insertTextRemote(6, "very ", undefined, 6, 2, "2");
982
+ if (verbose) {
983
+ log(cli.mergeTree.toString());
984
+ for (let clientId = 0; clientId < 4; clientId++) {
985
+ for (let refSeq = 0; refSeq < 7; refSeq++) {
986
+ log(cli.relText(clientId, refSeq));
987
+ }
988
+ }
989
+ }
990
+ const segs = (new SnapshotLegacy(cli.mergeTree, createChildLogger({ namespace: "fluid:snapshot" }))
991
+ .extractSync()
992
+ .map((seg) => seg.toJSONObject()));
993
+ if (verbose) {
994
+ for (const seg of segs) {
995
+ log(`${specToSegment(seg)}`);
996
+ }
997
+ }
998
+ cli = new TestClient();
999
+ cli.insertTextLocal(0, " old sock!");
1000
+ cli.startOrUpdateCollaboration("Fred2");
1001
+ for (const cname of clientNames) {
1002
+ cli.addLongClientId(cname);
1003
+ }
1004
+ cli.insertTextRemote(0, "abcde", undefined, 1, 0, "2");
1005
+ cli.insertTextRemote(0, "yyy", undefined, 2, 0, "1");
1006
+ cli.insertTextRemote(2, "zzz", undefined, 3, 1, "3");
1007
+ cli.insertTextRemote(1, "EAGLE", undefined, 4, 1, "4");
1008
+ cli.insertTextRemote(4, "HAS", undefined, 5, 1, "5");
1009
+ cli.insertTextLocal(19, " LANDED");
1010
+ cli.insertTextRemote(0, "yowza: ", undefined, 6, 4, "2");
1011
+ cli.mergeTree.ackPendingSegment(createLocalOpArgs(MergeTreeDeltaType.INSERT, 7));
1012
+ if (verbose) {
1013
+ log(cli.mergeTree.toString());
1014
+ for (let clientId = 0; clientId < 6; clientId++) {
1015
+ for (let refSeq = 0; refSeq < 8; refSeq++) {
1016
+ log(cli.relText(clientId, refSeq));
1017
+ }
1018
+ }
1019
+ }
1020
+ cli.applyMsg(cli.makeOpMessage(createRemoveRangeOp(3, 5), 8, 6, "1"));
1021
+ if (verbose) {
1022
+ log(cli.mergeTree.toString());
1023
+ for (let clientId = 0; clientId < 6; clientId++) {
1024
+ for (let refSeq = 0; refSeq < 9; refSeq++) {
1025
+ log(cli.relText(clientId, refSeq));
1026
+ }
1027
+ }
1028
+ }
1029
+ cli = new TestClient();
1030
+ cli.insertTextLocal(0, "abcdefgh");
1031
+ cli.startOrUpdateCollaboration("Fred3");
1032
+ for (const cname of clientNames) {
1033
+ cli.addLongClientId(cname);
1034
+ }
1035
+ cli.applyMsg(cli.makeOpMessage(createRemoveRangeOp(1, 3), 1, 0, "3"));
1036
+ if (verbose) {
1037
+ log(cli.mergeTree.toString());
1038
+ }
1039
+ cli.insertTextRemote(2, "zzz", undefined, 2, 0, "2");
1040
+ if (verbose) {
1041
+ log(cli.mergeTree.toString());
1042
+ }
1043
+ cli.insertTextRemote(9, " chaser", undefined, 3, 2, "3");
1044
+ cli.removeRangeLocal(12, 14);
1045
+ cli.mergeTree.ackPendingSegment(createLocalOpArgs(MergeTreeDeltaType.REMOVE, 4));
1046
+ if (verbose) {
1047
+ log(cli.mergeTree.toString());
1048
+ for (let clientId = 0; clientId < 4; clientId++) {
1049
+ for (let refSeq = 0; refSeq < 5; refSeq++) {
1050
+ log(cli.relText(clientId, refSeq));
1051
+ }
1052
+ }
1053
+ }
1054
+ cli.insertTextLocal(14, "*yolumba*");
1055
+ cli.insertTextLocal(17, "-zanzibar-");
1056
+ cli.mergeTree.ackPendingSegment(createLocalOpArgs(MergeTreeDeltaType.INSERT, 5));
1057
+ cli.insertTextRemote(2, "(aaa)", undefined, 6, 4, "2");
1058
+ cli.mergeTree.ackPendingSegment(createLocalOpArgs(MergeTreeDeltaType.INSERT, 7));
1059
+ if (verbose) {
1060
+ log(cli.mergeTree.toString());
1061
+ for (let clientId = 0; clientId < 4; clientId++) {
1062
+ for (let refSeq = 0; refSeq < 8; refSeq++) {
1063
+ log(cli.relText(clientId, refSeq));
1064
+ }
1065
+ }
1066
+ }
1067
+ /*
1068
+ cli.removeRangeLocal(3,8);
1069
+ cli.removeRangeLocal(5,7);
1070
+ cli.ackPendingSegment(8);
1071
+ cli.ackPendingSegment(9);
1072
+ */
1073
+ cli.applyMsg(cli.makeOpMessage(createRemoveRangeOp(3, 8), 8, 7, "2"));
1074
+ cli.applyMsg(cli.makeOpMessage(createRemoveRangeOp(5, 7), 9, 7, "2"));
1075
+ if (verbose) {
1076
+ log(cli.mergeTree.toString());
1077
+ for (let clientId = 0; clientId < 4; clientId++) {
1078
+ for (let refSeq = 0; refSeq < 10; refSeq++) {
1079
+ log(cli.relText(clientId, refSeq));
1080
+ }
1081
+ }
1082
+ }
1083
+ const removeOp = cli.removeRangeLocal(3, 5);
1084
+ cli.applyMsg(cli.makeOpMessage(createRemoveRangeOp(3, 6), 10, 9, "2"));
1085
+ cli.applyMsg(cli.makeOpMessage(removeOp, 11));
1086
+ if (verbose) {
1087
+ log(cli.mergeTree.toString());
1088
+ for (let clientId = 0; clientId < 4; clientId++) {
1089
+ for (let refSeq = 0; refSeq < 12; refSeq++) {
1090
+ log(cli.relText(clientId, refSeq));
1091
+ }
1092
+ }
1093
+ }
1094
+ }
1095
+ return {
1096
+ firstTest,
1097
+ randolicious,
1098
+ clientServer,
1099
+ manyMergeTrees,
1100
+ };
1101
+ }
1102
+ const createLocalOpArgs = (type, sequenceNumber) => ({
1103
+ op: { type },
1104
+ sequencedMessage: {
1105
+ sequenceNumber,
1106
+ },
1107
+ });
1108
+ export class RandomPack {
1109
+ constructor() {
1110
+ this.random = makeRandom(0xdeadbeef, 0xfeedbed);
1111
+ }
1112
+ randInteger(min, max) {
1113
+ return this.random.integer(min, max);
1114
+ }
1115
+ randString(wordCount) {
1116
+ const exampleWords = [
1117
+ "giraffe",
1118
+ "hut",
1119
+ "aardvark",
1120
+ "gold",
1121
+ "hover",
1122
+ "yurt",
1123
+ "hot",
1124
+ "antelope",
1125
+ "gift",
1126
+ "banana",
1127
+ "book",
1128
+ "airplane",
1129
+ "kitten",
1130
+ "moniker",
1131
+ "lemma",
1132
+ "doughnut",
1133
+ "orange",
1134
+ "tangerine",
1135
+ ];
1136
+ let buf = "";
1137
+ for (let i = 0; i < wordCount; i++) {
1138
+ const exampleWord = exampleWords[this.randInteger(0, exampleWords.length - 1)];
1139
+ if (i > 0) {
1140
+ buf += " ";
1141
+ }
1142
+ buf += exampleWord;
1143
+ }
1144
+ return buf;
1145
+ }
1146
+ }
1147
+ /**
1148
+ * Generate and model documents from the following tree grammar:
1149
+ * Row -\> row[Box*];
1150
+ * Box -\> box[Content];
1151
+ * Content -\> (Row|Paragraph)*;
1152
+ * Paragraph -\> pgtile text;
1153
+ * Document -\> Content
1154
+ */
1155
+ export class DocumentTree {
1156
+ constructor(name, children) {
1157
+ this.name = name;
1158
+ this.children = children;
1159
+ this.pos = 0;
1160
+ this.ids = { box: 0, row: 0 };
1161
+ }
1162
+ addToMergeTree(client, docNode) {
1163
+ if (typeof docNode === "string") {
1164
+ const text = docNode;
1165
+ client.insertTextLocal(this.pos, text);
1166
+ this.pos += text.length;
1167
+ }
1168
+ else {
1169
+ let id;
1170
+ if (docNode.name === "pg") {
1171
+ client.insertMarkerLocal(this.pos, ReferenceType.Tile, {
1172
+ [reservedTileLabelsKey]: [docNode.name],
1173
+ });
1174
+ this.pos++;
1175
+ }
1176
+ else {
1177
+ const trid = docNode.name + this.ids[docNode.name].toString();
1178
+ docNode.id = trid;
1179
+ id = this.ids[docNode.name]++;
1180
+ const props = {
1181
+ [reservedMarkerIdKey]: trid,
1182
+ [reservedRangeLabelsKey]: [docNode.name],
1183
+ };
1184
+ let behaviors = ReferenceType.Simple;
1185
+ if (docNode.name === "row") {
1186
+ props[reservedTileLabelsKey] = ["pg"];
1187
+ behaviors |= ReferenceType.Tile;
1188
+ }
1189
+ client.insertMarkerLocal(this.pos, behaviors, props);
1190
+ this.pos++;
1191
+ }
1192
+ for (const child of docNode.children) {
1193
+ this.addToMergeTree(client, child);
1194
+ }
1195
+ if (docNode.name !== "pg") {
1196
+ const etrid = `end-${docNode.name}${id?.toString()}`;
1197
+ client.insertMarkerLocal(this.pos, ReferenceType.Simple, {
1198
+ [reservedMarkerIdKey]: etrid,
1199
+ [reservedRangeLabelsKey]: [docNode.name],
1200
+ });
1201
+ this.pos++;
1202
+ }
1203
+ }
1204
+ }
1205
+ static generateDocument() {
1206
+ const tree = new DocumentTree("Document", DocumentTree.generateContent(0.6));
1207
+ return tree;
1208
+ }
1209
+ static generateContent(rowProbability) {
1210
+ let _rowProbability = rowProbability;
1211
+ const items = [];
1212
+ const docLen = DocumentTree.randPack.randInteger(7, 25);
1213
+ for (let i = 0; i < docLen; i++) {
1214
+ const rowThreshold = _rowProbability * 1000;
1215
+ const selector = DocumentTree.randPack.randInteger(1, 1000);
1216
+ if (selector >= rowThreshold) {
1217
+ const pg = DocumentTree.generateParagraph();
1218
+ items.push(pg);
1219
+ }
1220
+ else {
1221
+ _rowProbability /= 2;
1222
+ if (_rowProbability < 0.08) {
1223
+ _rowProbability = 0;
1224
+ }
1225
+ const row = DocumentTree.generateRow(_rowProbability);
1226
+ items.push(row);
1227
+ }
1228
+ }
1229
+ return items;
1230
+ }
1231
+ // Model pg tile as tree with single child
1232
+ static generateParagraph() {
1233
+ const wordCount = DocumentTree.randPack.randInteger(1, 6);
1234
+ const text = DocumentTree.randPack.randString(wordCount);
1235
+ const pgTree = new DocumentTree("pg", [text]);
1236
+ return pgTree;
1237
+ }
1238
+ static generateRow(rowProbability) {
1239
+ const items = [];
1240
+ const rowLen = DocumentTree.randPack.randInteger(1, 5);
1241
+ for (let i = 0; i < rowLen; i++) {
1242
+ const item = DocumentTree.generateBox(rowProbability);
1243
+ items.push(item);
1244
+ }
1245
+ return new DocumentTree("row", items);
1246
+ }
1247
+ static generateBox(rowProbability) {
1248
+ return new DocumentTree("box", DocumentTree.generateContent(rowProbability));
1249
+ }
1250
+ }
1251
+ DocumentTree.randPack = new RandomPack();
1252
+ function findReplacePerf(filename) {
1253
+ const client = new TestClient();
1254
+ loadTextFromFile(filename, client.mergeTree);
1255
+ const clockStart = clock();
1256
+ let cFetches = 0;
1257
+ let cReplaces = 0;
1258
+ for (let pos = 0; pos < client.getLength();) {
1259
+ const curSegOff = client.getContainingSegment(pos);
1260
+ cFetches++;
1261
+ const curSeg = curSegOff.segment;
1262
+ const textSeg = curSeg;
1263
+ if (textSeg !== null) {
1264
+ const text = textSeg.text;
1265
+ const i = text.indexOf("the");
1266
+ if (i >= 0) {
1267
+ client.mergeTree.markRangeRemoved(pos + i, pos + i + 3, UniversalSequenceNumber, client.getClientId(), 1, false, undefined);
1268
+ insertText({
1269
+ mergeTree: client.mergeTree,
1270
+ pos: pos + i,
1271
+ refSeq: UniversalSequenceNumber,
1272
+ clientId: client.getClientId(),
1273
+ seq: 1,
1274
+ text: "teh",
1275
+ props: undefined,
1276
+ opArgs: undefined,
1277
+ });
1278
+ pos = pos + i + 3;
1279
+ cReplaces++;
1280
+ }
1281
+ else {
1282
+ pos += curSeg.cachedLength - curSegOff.offset;
1283
+ }
1284
+ }
1285
+ }
1286
+ const elapsed = elapsedMicroseconds(clockStart);
1287
+ log(`${cFetches} fetches and ${cReplaces} replaces took ${elapsed} microseconds`);
1288
+ }
1289
+ const baseDir = "../../src/test/literature";
1290
+ const testTimeout = 60000;
1291
+ describe("Routerlicious", () => {
1292
+ describe("merge-tree", () => {
1293
+ beforeEach(() => {
1294
+ logLines = [];
1295
+ });
1296
+ it("firstTest", () => {
1297
+ const testPack = TestPack(true);
1298
+ testPack.firstTest();
1299
+ });
1300
+ it("randolicious", () => {
1301
+ const testPack = TestPack(false);
1302
+ assert(testPack.randolicious() === 0, logLines.join("\n"));
1303
+ }).timeout(testTimeout);
1304
+ it("mergeTreeCheckedTest", () => {
1305
+ assert(mergeTreeCheckedTest() === 0, logLines.join("\n"));
1306
+ }).timeout(testTimeout);
1307
+ it("beastTest", () => {
1308
+ const testPack = TestPack(false);
1309
+ const filename = path.join(_dirname, baseDir, "pp.txt");
1310
+ assert(testPack.clientServer(filename, 250) === 0, logLines.join("\n"));
1311
+ }).timeout(testTimeout);
1312
+ it("findReplPerf", () => {
1313
+ const filename = path.join(_dirname, baseDir, "pp10.txt");
1314
+ findReplacePerf(filename);
1315
+ }).timeout(testTimeout);
1316
+ });
1317
+ });
1318
+ //# sourceMappingURL=beastTest.spec.js.map