@fluidframework/merge-tree 2.30.0 → 2.31.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 (308) hide show
  1. package/CHANGELOG.md +403 -399
  2. package/api-report/merge-tree.legacy.alpha.api.md +1 -0
  3. package/dist/MergeTreeTextHelper.d.ts +9 -3
  4. package/dist/MergeTreeTextHelper.d.ts.map +1 -1
  5. package/dist/MergeTreeTextHelper.js +5 -5
  6. package/dist/MergeTreeTextHelper.js.map +1 -1
  7. package/dist/client.d.ts +7 -13
  8. package/dist/client.d.ts.map +1 -1
  9. package/dist/client.js +136 -110
  10. package/dist/client.js.map +1 -1
  11. package/dist/endOfTreeSegment.d.ts +12 -8
  12. package/dist/endOfTreeSegment.d.ts.map +1 -1
  13. package/dist/endOfTreeSegment.js +2 -4
  14. package/dist/endOfTreeSegment.js.map +1 -1
  15. package/dist/index.d.ts +6 -3
  16. package/dist/index.d.ts.map +1 -1
  17. package/dist/index.js +2 -3
  18. package/dist/index.js.map +1 -1
  19. package/dist/mergeTree.d.ts +37 -23
  20. package/dist/mergeTree.d.ts.map +1 -1
  21. package/dist/mergeTree.js +400 -483
  22. package/dist/mergeTree.js.map +1 -1
  23. package/dist/mergeTreeDeltaCallback.d.ts +4 -8
  24. package/dist/mergeTreeDeltaCallback.d.ts.map +1 -1
  25. package/dist/mergeTreeDeltaCallback.js.map +1 -1
  26. package/dist/mergeTreeNodes.d.ts +32 -10
  27. package/dist/mergeTreeNodes.d.ts.map +1 -1
  28. package/dist/mergeTreeNodes.js +43 -28
  29. package/dist/mergeTreeNodes.js.map +1 -1
  30. package/dist/partialLengths.d.ts +2 -2
  31. package/dist/partialLengths.d.ts.map +1 -1
  32. package/dist/partialLengths.js +181 -109
  33. package/dist/partialLengths.js.map +1 -1
  34. package/dist/perspective.d.ts +8 -27
  35. package/dist/perspective.d.ts.map +1 -1
  36. package/dist/perspective.js +7 -67
  37. package/dist/perspective.js.map +1 -1
  38. package/dist/revertibles.d.ts.map +1 -1
  39. package/dist/revertibles.js +2 -2
  40. package/dist/revertibles.js.map +1 -1
  41. package/dist/segmentInfos.d.ts +20 -106
  42. package/dist/segmentInfos.d.ts.map +1 -1
  43. package/dist/segmentInfos.js +28 -42
  44. package/dist/segmentInfos.js.map +1 -1
  45. package/dist/segmentPropertiesManager.d.ts +1 -14
  46. package/dist/segmentPropertiesManager.d.ts.map +1 -1
  47. package/dist/segmentPropertiesManager.js +3 -17
  48. package/dist/segmentPropertiesManager.js.map +1 -1
  49. package/dist/snapshotLoader.d.ts.map +1 -1
  50. package/dist/snapshotLoader.js +62 -19
  51. package/dist/snapshotLoader.js.map +1 -1
  52. package/dist/snapshotV1.d.ts.map +1 -1
  53. package/dist/snapshotV1.js +55 -24
  54. package/dist/snapshotV1.js.map +1 -1
  55. package/dist/snapshotlegacy.d.ts.map +1 -1
  56. package/dist/snapshotlegacy.js +6 -9
  57. package/dist/snapshotlegacy.js.map +1 -1
  58. package/dist/stamps.d.ts +1 -1
  59. package/dist/stamps.js +1 -1
  60. package/dist/stamps.js.map +1 -1
  61. package/dist/test/Insertion.perf.spec.js +6 -51
  62. package/dist/test/Insertion.perf.spec.js.map +1 -1
  63. package/dist/test/PartialLengths.perf.spec.js +18 -25
  64. package/dist/test/PartialLengths.perf.spec.js.map +1 -1
  65. package/dist/test/Removal.perf.spec.js +13 -41
  66. package/dist/test/Removal.perf.spec.js.map +1 -1
  67. package/dist/test/beastTest.spec.d.ts.map +1 -1
  68. package/dist/test/beastTest.spec.js +41 -66
  69. package/dist/test/beastTest.spec.js.map +1 -1
  70. package/dist/test/client.annotateMarker.spec.js +1 -11
  71. package/dist/test/client.annotateMarker.spec.js.map +1 -1
  72. package/dist/test/client.applyMsg.spec.js +14 -14
  73. package/dist/test/client.applyMsg.spec.js.map +1 -1
  74. package/dist/test/client.getPosition.spec.js +1 -1
  75. package/dist/test/client.getPosition.spec.js.map +1 -1
  76. package/dist/test/client.localReference.spec.js +1 -1
  77. package/dist/test/client.localReference.spec.js.map +1 -1
  78. package/dist/test/client.rollback.spec.js +49 -58
  79. package/dist/test/client.rollback.spec.js.map +1 -1
  80. package/dist/test/client.rollbackFarm.spec.js +1 -1
  81. package/dist/test/client.rollbackFarm.spec.js.map +1 -1
  82. package/dist/test/client.searchForMarker.spec.js +4 -21
  83. package/dist/test/client.searchForMarker.spec.js.map +1 -1
  84. package/dist/test/index.d.ts +2 -2
  85. package/dist/test/index.d.ts.map +1 -1
  86. package/dist/test/index.js +2 -6
  87. package/dist/test/index.js.map +1 -1
  88. package/dist/test/mergeTree.annotate.deltaCallback.spec.js +14 -59
  89. package/dist/test/mergeTree.annotate.deltaCallback.spec.js.map +1 -1
  90. package/dist/test/mergeTree.annotate.spec.js +47 -63
  91. package/dist/test/mergeTree.annotate.spec.js.map +1 -1
  92. package/dist/test/mergeTree.insert.deltaCallback.spec.js +9 -62
  93. package/dist/test/mergeTree.insert.deltaCallback.spec.js.map +1 -1
  94. package/dist/test/mergeTree.insertingWalk.spec.js +59 -125
  95. package/dist/test/mergeTree.insertingWalk.spec.js.map +1 -1
  96. package/dist/test/mergeTree.markRangeRemoved.deltaCallback.spec.js +12 -93
  97. package/dist/test/mergeTree.markRangeRemoved.deltaCallback.spec.js.map +1 -1
  98. package/dist/test/mergeTree.markRangeRemoved.spec.js +10 -7
  99. package/dist/test/mergeTree.markRangeRemoved.spec.js.map +1 -1
  100. package/dist/test/mergeTree.walk.spec.js +2 -14
  101. package/dist/test/mergeTree.walk.spec.js.map +1 -1
  102. package/dist/test/mergeTreeOperationRunner.js +2 -2
  103. package/dist/test/mergeTreeOperationRunner.js.map +1 -1
  104. package/dist/test/obliterate.concurrent.spec.js +18 -23
  105. package/dist/test/obliterate.concurrent.spec.js.map +1 -1
  106. package/dist/test/obliterate.partialLength.spec.js +166 -136
  107. package/dist/test/obliterate.partialLength.spec.js.map +1 -1
  108. package/dist/test/obliterate.spec.js +16 -126
  109. package/dist/test/obliterate.spec.js.map +1 -1
  110. package/dist/test/partialLength.spec.js +28 -196
  111. package/dist/test/partialLength.spec.js.map +1 -1
  112. package/dist/test/perspective.spec.js +34 -0
  113. package/dist/test/perspective.spec.js.map +1 -1
  114. package/dist/test/propertyManager.spec.js +1 -1
  115. package/dist/test/propertyManager.spec.js.map +1 -1
  116. package/dist/test/resetPendingSegmentsToOp.spec.js +0 -2
  117. package/dist/test/resetPendingSegmentsToOp.spec.js.map +1 -1
  118. package/dist/test/segmentGroupCollection.spec.js +10 -4
  119. package/dist/test/segmentGroupCollection.spec.js.map +1 -1
  120. package/dist/test/testClient.d.ts +1 -0
  121. package/dist/test/testClient.d.ts.map +1 -1
  122. package/dist/test/testClient.js +16 -26
  123. package/dist/test/testClient.js.map +1 -1
  124. package/dist/test/testClientLogger.d.ts.map +1 -1
  125. package/dist/test/testClientLogger.js +3 -10
  126. package/dist/test/testClientLogger.js.map +1 -1
  127. package/dist/test/testServer.d.ts +2 -1
  128. package/dist/test/testServer.d.ts.map +1 -1
  129. package/dist/test/testServer.js +7 -5
  130. package/dist/test/testServer.js.map +1 -1
  131. package/dist/test/testUtils.d.ts +36 -56
  132. package/dist/test/testUtils.d.ts.map +1 -1
  133. package/dist/test/testUtils.js +68 -77
  134. package/dist/test/testUtils.js.map +1 -1
  135. package/dist/test/text.d.ts +2 -2
  136. package/dist/test/text.d.ts.map +1 -1
  137. package/dist/test/text.js +5 -2
  138. package/dist/test/text.js.map +1 -1
  139. package/dist/textSegment.d.ts +0 -6
  140. package/dist/textSegment.d.ts.map +1 -1
  141. package/dist/textSegment.js.map +1 -1
  142. package/dist/zamboni.d.ts.map +1 -1
  143. package/dist/zamboni.js +53 -26
  144. package/dist/zamboni.js.map +1 -1
  145. package/lib/MergeTreeTextHelper.d.ts +9 -3
  146. package/lib/MergeTreeTextHelper.d.ts.map +1 -1
  147. package/lib/MergeTreeTextHelper.js +5 -5
  148. package/lib/MergeTreeTextHelper.js.map +1 -1
  149. package/lib/client.d.ts +7 -13
  150. package/lib/client.d.ts.map +1 -1
  151. package/lib/client.js +117 -116
  152. package/lib/client.js.map +1 -1
  153. package/lib/endOfTreeSegment.d.ts +12 -8
  154. package/lib/endOfTreeSegment.d.ts.map +1 -1
  155. package/lib/endOfTreeSegment.js +2 -4
  156. package/lib/endOfTreeSegment.js.map +1 -1
  157. package/lib/index.d.ts +6 -3
  158. package/lib/index.d.ts.map +1 -1
  159. package/lib/index.js +1 -1
  160. package/lib/index.js.map +1 -1
  161. package/lib/mergeTree.d.ts +37 -23
  162. package/lib/mergeTree.d.ts.map +1 -1
  163. package/lib/mergeTree.js +381 -488
  164. package/lib/mergeTree.js.map +1 -1
  165. package/lib/mergeTreeDeltaCallback.d.ts +4 -8
  166. package/lib/mergeTreeDeltaCallback.d.ts.map +1 -1
  167. package/lib/mergeTreeDeltaCallback.js.map +1 -1
  168. package/lib/mergeTreeNodes.d.ts +32 -10
  169. package/lib/mergeTreeNodes.d.ts.map +1 -1
  170. package/lib/mergeTreeNodes.js +42 -29
  171. package/lib/mergeTreeNodes.js.map +1 -1
  172. package/lib/partialLengths.d.ts +2 -2
  173. package/lib/partialLengths.d.ts.map +1 -1
  174. package/lib/partialLengths.js +160 -111
  175. package/lib/partialLengths.js.map +1 -1
  176. package/lib/perspective.d.ts +8 -27
  177. package/lib/perspective.d.ts.map +1 -1
  178. package/lib/perspective.js +8 -68
  179. package/lib/perspective.js.map +1 -1
  180. package/lib/revertibles.d.ts.map +1 -1
  181. package/lib/revertibles.js +2 -2
  182. package/lib/revertibles.js.map +1 -1
  183. package/lib/segmentInfos.d.ts +20 -106
  184. package/lib/segmentInfos.d.ts.map +1 -1
  185. package/lib/segmentInfos.js +26 -37
  186. package/lib/segmentInfos.js.map +1 -1
  187. package/lib/segmentPropertiesManager.d.ts +1 -14
  188. package/lib/segmentPropertiesManager.d.ts.map +1 -1
  189. package/lib/segmentPropertiesManager.js +2 -16
  190. package/lib/segmentPropertiesManager.js.map +1 -1
  191. package/lib/snapshotLoader.d.ts.map +1 -1
  192. package/lib/snapshotLoader.js +39 -19
  193. package/lib/snapshotLoader.js.map +1 -1
  194. package/lib/snapshotV1.d.ts.map +1 -1
  195. package/lib/snapshotV1.js +34 -26
  196. package/lib/snapshotV1.js.map +1 -1
  197. package/lib/snapshotlegacy.d.ts.map +1 -1
  198. package/lib/snapshotlegacy.js +7 -10
  199. package/lib/snapshotlegacy.js.map +1 -1
  200. package/lib/stamps.d.ts +1 -1
  201. package/lib/stamps.js +1 -1
  202. package/lib/stamps.js.map +1 -1
  203. package/lib/test/Insertion.perf.spec.js +6 -51
  204. package/lib/test/Insertion.perf.spec.js.map +1 -1
  205. package/lib/test/PartialLengths.perf.spec.js +18 -25
  206. package/lib/test/PartialLengths.perf.spec.js.map +1 -1
  207. package/lib/test/Removal.perf.spec.js +13 -41
  208. package/lib/test/Removal.perf.spec.js.map +1 -1
  209. package/lib/test/beastTest.spec.d.ts.map +1 -1
  210. package/lib/test/beastTest.spec.js +42 -67
  211. package/lib/test/beastTest.spec.js.map +1 -1
  212. package/lib/test/client.annotateMarker.spec.js +1 -11
  213. package/lib/test/client.annotateMarker.spec.js.map +1 -1
  214. package/lib/test/client.applyMsg.spec.js +14 -14
  215. package/lib/test/client.applyMsg.spec.js.map +1 -1
  216. package/lib/test/client.getPosition.spec.js +1 -1
  217. package/lib/test/client.getPosition.spec.js.map +1 -1
  218. package/lib/test/client.localReference.spec.js +1 -1
  219. package/lib/test/client.localReference.spec.js.map +1 -1
  220. package/lib/test/client.rollback.spec.js +50 -59
  221. package/lib/test/client.rollback.spec.js.map +1 -1
  222. package/lib/test/client.rollbackFarm.spec.js +1 -1
  223. package/lib/test/client.rollbackFarm.spec.js.map +1 -1
  224. package/lib/test/client.searchForMarker.spec.js +4 -21
  225. package/lib/test/client.searchForMarker.spec.js.map +1 -1
  226. package/lib/test/index.d.ts +2 -2
  227. package/lib/test/index.d.ts.map +1 -1
  228. package/lib/test/index.js +1 -1
  229. package/lib/test/index.js.map +1 -1
  230. package/lib/test/mergeTree.annotate.deltaCallback.spec.js +15 -60
  231. package/lib/test/mergeTree.annotate.deltaCallback.spec.js.map +1 -1
  232. package/lib/test/mergeTree.annotate.spec.js +48 -64
  233. package/lib/test/mergeTree.annotate.spec.js.map +1 -1
  234. package/lib/test/mergeTree.insert.deltaCallback.spec.js +10 -63
  235. package/lib/test/mergeTree.insert.deltaCallback.spec.js.map +1 -1
  236. package/lib/test/mergeTree.insertingWalk.spec.js +61 -127
  237. package/lib/test/mergeTree.insertingWalk.spec.js.map +1 -1
  238. package/lib/test/mergeTree.markRangeRemoved.deltaCallback.spec.js +13 -94
  239. package/lib/test/mergeTree.markRangeRemoved.deltaCallback.spec.js.map +1 -1
  240. package/lib/test/mergeTree.markRangeRemoved.spec.js +10 -7
  241. package/lib/test/mergeTree.markRangeRemoved.spec.js.map +1 -1
  242. package/lib/test/mergeTree.walk.spec.js +2 -14
  243. package/lib/test/mergeTree.walk.spec.js.map +1 -1
  244. package/lib/test/mergeTreeOperationRunner.js +3 -3
  245. package/lib/test/mergeTreeOperationRunner.js.map +1 -1
  246. package/lib/test/obliterate.concurrent.spec.js +18 -23
  247. package/lib/test/obliterate.concurrent.spec.js.map +1 -1
  248. package/lib/test/obliterate.partialLength.spec.js +167 -137
  249. package/lib/test/obliterate.partialLength.spec.js.map +1 -1
  250. package/lib/test/obliterate.spec.js +17 -127
  251. package/lib/test/obliterate.spec.js.map +1 -1
  252. package/lib/test/partialLength.spec.js +29 -197
  253. package/lib/test/partialLength.spec.js.map +1 -1
  254. package/lib/test/perspective.spec.js +34 -0
  255. package/lib/test/perspective.spec.js.map +1 -1
  256. package/lib/test/propertyManager.spec.js +2 -2
  257. package/lib/test/propertyManager.spec.js.map +1 -1
  258. package/lib/test/resetPendingSegmentsToOp.spec.js +0 -2
  259. package/lib/test/resetPendingSegmentsToOp.spec.js.map +1 -1
  260. package/lib/test/segmentGroupCollection.spec.js +10 -4
  261. package/lib/test/segmentGroupCollection.spec.js.map +1 -1
  262. package/lib/test/testClient.d.ts +1 -0
  263. package/lib/test/testClient.d.ts.map +1 -1
  264. package/lib/test/testClient.js +18 -28
  265. package/lib/test/testClient.js.map +1 -1
  266. package/lib/test/testClientLogger.d.ts.map +1 -1
  267. package/lib/test/testClientLogger.js +3 -10
  268. package/lib/test/testClientLogger.js.map +1 -1
  269. package/lib/test/testServer.d.ts +2 -1
  270. package/lib/test/testServer.d.ts.map +1 -1
  271. package/lib/test/testServer.js +7 -5
  272. package/lib/test/testServer.js.map +1 -1
  273. package/lib/test/testUtils.d.ts +36 -56
  274. package/lib/test/testUtils.d.ts.map +1 -1
  275. package/lib/test/testUtils.js +66 -48
  276. package/lib/test/testUtils.js.map +1 -1
  277. package/lib/test/text.d.ts +2 -2
  278. package/lib/test/text.d.ts.map +1 -1
  279. package/lib/test/text.js +6 -3
  280. package/lib/test/text.js.map +1 -1
  281. package/lib/textSegment.d.ts +0 -6
  282. package/lib/textSegment.d.ts.map +1 -1
  283. package/lib/textSegment.js.map +1 -1
  284. package/lib/tsdoc-metadata.json +1 -1
  285. package/lib/zamboni.d.ts.map +1 -1
  286. package/lib/zamboni.js +32 -28
  287. package/lib/zamboni.js.map +1 -1
  288. package/package.json +17 -20
  289. package/src/MergeTreeTextHelper.ts +17 -12
  290. package/src/client.ts +141 -197
  291. package/src/endOfTreeSegment.ts +11 -8
  292. package/src/index.ts +4 -3
  293. package/src/mergeTree.ts +482 -633
  294. package/src/mergeTreeDeltaCallback.ts +4 -8
  295. package/src/mergeTreeNodes.ts +66 -45
  296. package/src/partialLengths.ts +181 -137
  297. package/src/perspective.ts +17 -95
  298. package/src/revertibles.ts +2 -7
  299. package/src/segmentInfos.ts +48 -141
  300. package/src/segmentPropertiesManager.ts +2 -16
  301. package/src/snapshotLoader.ts +62 -30
  302. package/src/snapshotV1.ts +36 -28
  303. package/src/snapshotlegacy.ts +7 -16
  304. package/src/stamps.ts +1 -1
  305. package/src/textSegment.ts +0 -13
  306. package/src/zamboni.ts +38 -32
  307. package/tsconfig.json +1 -0
  308. package/prettier.config.cjs +0 -8
@@ -4,9 +4,9 @@
4
4
  */
5
5
  import { BenchmarkType, benchmark } from "@fluid-tools/benchmark";
6
6
  import { MergeTreeDeltaType } from "../ops.js";
7
+ import { PriorPerspective } from "../perspective.js";
7
8
  import { appendToMergeTreeDeltaRevertibles, } from "../revertibles.js";
8
9
  import { TestString, loadSnapshot } from "./snapshot.utils.js";
9
- import { markRangeRemoved } from "./testUtils.js";
10
10
  describe("MergeTree remove", () => {
11
11
  let summary;
12
12
  benchmark({
@@ -42,16 +42,9 @@ describe("MergeTree remove", () => {
42
42
  },
43
43
  benchmarkFnAsync: async () => {
44
44
  const str = await loadSnapshot(summary);
45
- markRangeRemoved({
46
- mergeTree: str.mergeTree,
47
- start: 0,
48
- end: 1000,
49
- refSeq: 1000,
50
- clientId: 0,
51
- seq: 1001,
52
- opArgs: { op: { type: MergeTreeDeltaType.REMOVE } },
53
- overwrite: false,
54
- });
45
+ const refSeq = 1000;
46
+ const clientId = 0;
47
+ str.mergeTree.markRangeRemoved(0, 1000, new PriorPerspective(refSeq, clientId), { seq: 1001, clientId }, { op: { type: MergeTreeDeltaType.REMOVE } });
55
48
  },
56
49
  });
57
50
  for (const length of [10, 100, 1000]) {
@@ -96,16 +89,9 @@ describe("MergeTree remove", () => {
96
89
  },
97
90
  benchmarkFnAsync: async () => {
98
91
  const str = await loadSnapshot(summary);
99
- markRangeRemoved({
100
- mergeTree: str.mergeTree,
101
- start: 0,
102
- end: 1,
103
- refSeq: 1000,
104
- clientId: 0,
105
- seq: 1001,
106
- opArgs: { op: { type: MergeTreeDeltaType.REMOVE } },
107
- overwrite: false,
108
- });
92
+ const refSeq = 1000;
93
+ const clientId = 0;
94
+ str.mergeTree.markRangeRemoved(0, 1, new PriorPerspective(refSeq, clientId), { seq: 1001, clientId }, { op: { type: MergeTreeDeltaType.REMOVE } });
109
95
  },
110
96
  });
111
97
  benchmark({
@@ -122,16 +108,9 @@ describe("MergeTree remove", () => {
122
108
  },
123
109
  benchmarkFnAsync: async () => {
124
110
  const str = await loadSnapshot(summary);
125
- markRangeRemoved({
126
- mergeTree: str.mergeTree,
127
- start: 499,
128
- end: 501,
129
- refSeq: 1000,
130
- clientId: 0,
131
- seq: 1001,
132
- opArgs: { op: { type: MergeTreeDeltaType.REMOVE } },
133
- overwrite: false,
134
- });
111
+ const refSeq = 1000;
112
+ const clientId = 0;
113
+ str.mergeTree.markRangeRemoved(499, 501, new PriorPerspective(refSeq, clientId), { seq: 1001, clientId }, { op: { type: MergeTreeDeltaType.REMOVE } });
135
114
  },
136
115
  });
137
116
  benchmark({
@@ -148,16 +127,9 @@ describe("MergeTree remove", () => {
148
127
  },
149
128
  benchmarkFnAsync: async () => {
150
129
  const str = await loadSnapshot(summary);
151
- markRangeRemoved({
152
- mergeTree: str.mergeTree,
153
- start: 999,
154
- end: 1000,
155
- refSeq: 1000,
156
- clientId: 0,
157
- seq: 1001,
158
- opArgs: { op: { type: MergeTreeDeltaType.REMOVE } },
159
- overwrite: false,
160
- });
130
+ const refSeq = 1000;
131
+ const clientId = 0;
132
+ str.mergeTree.markRangeRemoved(999, 1000, new PriorPerspective(refSeq, clientId), { seq: 1001, clientId }, { op: { type: MergeTreeDeltaType.REMOVE } });
161
133
  },
162
134
  });
163
135
  });
@@ -1 +1 @@
1
- {"version":3,"file":"Removal.perf.spec.js","sourceRoot":"","sources":["../../src/test/Removal.perf.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 { BenchmarkType, benchmark } from \"@fluid-tools/benchmark\";\nimport type { ISummaryTree } from \"@fluidframework/driver-definitions\";\n\nimport { MergeTreeDeltaType } from \"../ops.js\";\nimport {\n\tMergeTreeDeltaRevertible,\n\tappendToMergeTreeDeltaRevertibles,\n} from \"../revertibles.js\";\n\nimport { TestString, loadSnapshot } from \"./snapshot.utils.js\";\nimport { markRangeRemoved } from \"./testUtils.js\";\n\ndescribe(\"MergeTree remove\", () => {\n\tlet summary: ISummaryTree;\n\n\tbenchmark({\n\t\ttype: BenchmarkType.Measurement,\n\t\t// baseline summary benchmark to compare to other remove tests. such a\n\t\t// comparison should give a (rough) sense of overhead caused by summary\n\t\t// loading\n\t\ttitle: \"baseline summary load\",\n\t\tcategory: \"remove\",\n\t\tbefore: () => {\n\t\t\tconst str = new TestString(\"id\", {});\n\t\t\tfor (let i = 0; i < 1000; i++) {\n\t\t\t\tstr.append(\"a\", false);\n\t\t\t}\n\n\t\t\tstr.applyPendingOps();\n\t\t\tsummary = str.getSummary();\n\t\t},\n\t\tbenchmarkFnAsync: async () => {\n\t\t\tawait loadSnapshot(summary);\n\t\t},\n\t});\n\n\tbenchmark({\n\t\ttype: BenchmarkType.Measurement,\n\t\ttitle: \"remove large range of large tree\",\n\t\tcategory: \"remove\",\n\t\tbefore: () => {\n\t\t\tconst str = new TestString(\"id\", {});\n\t\t\tfor (let i = 0; i < 1000; i++) {\n\t\t\t\tstr.append(\"a\", false);\n\t\t\t}\n\n\t\t\tstr.applyPendingOps();\n\t\t\tsummary = str.getSummary();\n\t\t},\n\t\tbenchmarkFnAsync: async () => {\n\t\t\tconst str = await loadSnapshot(summary);\n\n\t\t\tmarkRangeRemoved({\n\t\t\t\tmergeTree: str.mergeTree,\n\t\t\t\tstart: 0,\n\t\t\t\tend: 1000,\n\t\t\t\trefSeq: 1000,\n\t\t\t\tclientId: 0,\n\t\t\t\tseq: 1001,\n\t\t\t\topArgs: { op: { type: MergeTreeDeltaType.REMOVE } },\n\t\t\t\toverwrite: false,\n\t\t\t});\n\t\t},\n\t});\n\n\tfor (const length of [10, 100, 1000]) {\n\t\tbenchmark({\n\t\t\ttype: BenchmarkType.Measurement,\n\t\t\ttitle: \"remove large range of large tree with undo-redo\",\n\t\t\tcategory: \"remove\",\n\t\t\tbefore: () => {\n\t\t\t\tconst str = new TestString(\"id\", {});\n\t\t\t\tfor (let i = 0; i < length / 2; i++) {\n\t\t\t\t\tstr.append(\"a\", true);\n\t\t\t\t\tstr.appendMarker(true);\n\t\t\t\t}\n\n\t\t\t\tstr.applyPendingOps();\n\t\t\t\tsummary = str.getSummary();\n\t\t\t},\n\t\t\tbenchmarkFnAsync: async () => {\n\t\t\t\tconst str = await loadSnapshot(summary);\n\n\t\t\t\tconst revertibles: MergeTreeDeltaRevertible[] = [];\n\t\t\t\tstr.on(\"delta\", (_op, delta) => {\n\t\t\t\t\tappendToMergeTreeDeltaRevertibles(delta, revertibles);\n\t\t\t\t});\n\n\t\t\t\tconst op = str.removeRangeLocal(0, length - 1);\n\t\t\t\tstr.applyMsg(\n\t\t\t\t\tstr.makeOpMessage(\n\t\t\t\t\t\top,\n\t\t\t\t\t\t/* seq */ length + 1,\n\t\t\t\t\t\t/* refSeq */ length,\n\t\t\t\t\t\tstr.longClientId,\n\t\t\t\t\t\t/* minSeq */ length,\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t},\n\t\t});\n\t}\n\n\tbenchmark({\n\t\ttype: BenchmarkType.Measurement,\n\t\ttitle: \"remove start of large tree\",\n\t\tcategory: \"remove\",\n\t\tbefore: () => {\n\t\t\tconst str = new TestString(\"id\", {});\n\t\t\tfor (let i = 0; i < 1000; i++) {\n\t\t\t\tstr.append(\"a\", false);\n\t\t\t}\n\n\t\t\tstr.applyPendingOps();\n\t\t\tsummary = str.getSummary();\n\t\t},\n\t\tbenchmarkFnAsync: async () => {\n\t\t\tconst str = await loadSnapshot(summary);\n\n\t\t\tmarkRangeRemoved({\n\t\t\t\tmergeTree: str.mergeTree,\n\t\t\t\tstart: 0,\n\t\t\t\tend: 1,\n\t\t\t\trefSeq: 1000,\n\t\t\t\tclientId: 0,\n\t\t\t\tseq: 1001,\n\t\t\t\topArgs: { op: { type: MergeTreeDeltaType.REMOVE } },\n\t\t\t\toverwrite: false,\n\t\t\t});\n\t\t},\n\t});\n\n\tbenchmark({\n\t\ttype: BenchmarkType.Measurement,\n\t\ttitle: \"remove middle of large tree\",\n\t\tcategory: \"remove\",\n\t\tbefore: () => {\n\t\t\tconst str = new TestString(\"id\", {});\n\t\t\tfor (let i = 0; i < 1000; i++) {\n\t\t\t\tstr.append(\"a\", false);\n\t\t\t}\n\n\t\t\tstr.applyPendingOps();\n\t\t\tsummary = str.getSummary();\n\t\t},\n\t\tbenchmarkFnAsync: async () => {\n\t\t\tconst str = await loadSnapshot(summary);\n\n\t\t\tmarkRangeRemoved({\n\t\t\t\tmergeTree: str.mergeTree,\n\t\t\t\tstart: 499,\n\t\t\t\tend: 501,\n\t\t\t\trefSeq: 1000,\n\t\t\t\tclientId: 0,\n\t\t\t\tseq: 1001,\n\t\t\t\topArgs: { op: { type: MergeTreeDeltaType.REMOVE } },\n\t\t\t\toverwrite: false,\n\t\t\t});\n\t\t},\n\t});\n\n\tbenchmark({\n\t\ttype: BenchmarkType.Measurement,\n\t\ttitle: \"remove end of large tree\",\n\t\tcategory: \"remove\",\n\t\tbefore: () => {\n\t\t\tconst str = new TestString(\"id\", {});\n\t\t\tfor (let i = 0; i < 1000; i++) {\n\t\t\t\tstr.append(\"a\", false);\n\t\t\t}\n\n\t\t\tstr.applyPendingOps();\n\t\t\tsummary = str.getSummary();\n\t\t},\n\t\tbenchmarkFnAsync: async () => {\n\t\t\tconst str = await loadSnapshot(summary);\n\n\t\t\tmarkRangeRemoved({\n\t\t\t\tmergeTree: str.mergeTree,\n\t\t\t\tstart: 999,\n\t\t\t\tend: 1000,\n\t\t\t\trefSeq: 1000,\n\t\t\t\tclientId: 0,\n\t\t\t\tseq: 1001,\n\t\t\t\topArgs: { op: { type: MergeTreeDeltaType.REMOVE } },\n\t\t\t\toverwrite: false,\n\t\t\t});\n\t\t},\n\t});\n});\n"]}
1
+ {"version":3,"file":"Removal.perf.spec.js","sourceRoot":"","sources":["../../src/test/Removal.perf.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 { BenchmarkType, benchmark } from \"@fluid-tools/benchmark\";\nimport type { ISummaryTree } from \"@fluidframework/driver-definitions\";\n\nimport { MergeTreeDeltaType } from \"../ops.js\";\nimport { PriorPerspective } from \"../perspective.js\";\nimport {\n\tMergeTreeDeltaRevertible,\n\tappendToMergeTreeDeltaRevertibles,\n} from \"../revertibles.js\";\n\nimport { TestString, loadSnapshot } from \"./snapshot.utils.js\";\n\ndescribe(\"MergeTree remove\", () => {\n\tlet summary: ISummaryTree;\n\n\tbenchmark({\n\t\ttype: BenchmarkType.Measurement,\n\t\t// baseline summary benchmark to compare to other remove tests. such a\n\t\t// comparison should give a (rough) sense of overhead caused by summary\n\t\t// loading\n\t\ttitle: \"baseline summary load\",\n\t\tcategory: \"remove\",\n\t\tbefore: () => {\n\t\t\tconst str = new TestString(\"id\", {});\n\t\t\tfor (let i = 0; i < 1000; i++) {\n\t\t\t\tstr.append(\"a\", false);\n\t\t\t}\n\n\t\t\tstr.applyPendingOps();\n\t\t\tsummary = str.getSummary();\n\t\t},\n\t\tbenchmarkFnAsync: async () => {\n\t\t\tawait loadSnapshot(summary);\n\t\t},\n\t});\n\n\tbenchmark({\n\t\ttype: BenchmarkType.Measurement,\n\t\ttitle: \"remove large range of large tree\",\n\t\tcategory: \"remove\",\n\t\tbefore: () => {\n\t\t\tconst str = new TestString(\"id\", {});\n\t\t\tfor (let i = 0; i < 1000; i++) {\n\t\t\t\tstr.append(\"a\", false);\n\t\t\t}\n\n\t\t\tstr.applyPendingOps();\n\t\t\tsummary = str.getSummary();\n\t\t},\n\t\tbenchmarkFnAsync: async () => {\n\t\t\tconst str = await loadSnapshot(summary);\n\n\t\t\tconst refSeq = 1000;\n\t\t\tconst clientId = 0;\n\t\t\tstr.mergeTree.markRangeRemoved(\n\t\t\t\t0,\n\t\t\t\t1000,\n\t\t\t\tnew PriorPerspective(refSeq, clientId),\n\t\t\t\t{ seq: 1001, clientId },\n\t\t\t\t{ op: { type: MergeTreeDeltaType.REMOVE } },\n\t\t\t);\n\t\t},\n\t});\n\n\tfor (const length of [10, 100, 1000]) {\n\t\tbenchmark({\n\t\t\ttype: BenchmarkType.Measurement,\n\t\t\ttitle: \"remove large range of large tree with undo-redo\",\n\t\t\tcategory: \"remove\",\n\t\t\tbefore: () => {\n\t\t\t\tconst str = new TestString(\"id\", {});\n\t\t\t\tfor (let i = 0; i < length / 2; i++) {\n\t\t\t\t\tstr.append(\"a\", true);\n\t\t\t\t\tstr.appendMarker(true);\n\t\t\t\t}\n\n\t\t\t\tstr.applyPendingOps();\n\t\t\t\tsummary = str.getSummary();\n\t\t\t},\n\t\t\tbenchmarkFnAsync: async () => {\n\t\t\t\tconst str = await loadSnapshot(summary);\n\n\t\t\t\tconst revertibles: MergeTreeDeltaRevertible[] = [];\n\t\t\t\tstr.on(\"delta\", (_op, delta) => {\n\t\t\t\t\tappendToMergeTreeDeltaRevertibles(delta, revertibles);\n\t\t\t\t});\n\n\t\t\t\tconst op = str.removeRangeLocal(0, length - 1);\n\t\t\t\tstr.applyMsg(\n\t\t\t\t\tstr.makeOpMessage(\n\t\t\t\t\t\top,\n\t\t\t\t\t\t/* seq */ length + 1,\n\t\t\t\t\t\t/* refSeq */ length,\n\t\t\t\t\t\tstr.longClientId,\n\t\t\t\t\t\t/* minSeq */ length,\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t},\n\t\t});\n\t}\n\n\tbenchmark({\n\t\ttype: BenchmarkType.Measurement,\n\t\ttitle: \"remove start of large tree\",\n\t\tcategory: \"remove\",\n\t\tbefore: () => {\n\t\t\tconst str = new TestString(\"id\", {});\n\t\t\tfor (let i = 0; i < 1000; i++) {\n\t\t\t\tstr.append(\"a\", false);\n\t\t\t}\n\n\t\t\tstr.applyPendingOps();\n\t\t\tsummary = str.getSummary();\n\t\t},\n\t\tbenchmarkFnAsync: async () => {\n\t\t\tconst str = await loadSnapshot(summary);\n\n\t\t\tconst refSeq = 1000;\n\t\t\tconst clientId = 0;\n\t\t\tstr.mergeTree.markRangeRemoved(\n\t\t\t\t0,\n\t\t\t\t1,\n\t\t\t\tnew PriorPerspective(refSeq, clientId),\n\t\t\t\t{ seq: 1001, clientId },\n\t\t\t\t{ op: { type: MergeTreeDeltaType.REMOVE } },\n\t\t\t);\n\t\t},\n\t});\n\n\tbenchmark({\n\t\ttype: BenchmarkType.Measurement,\n\t\ttitle: \"remove middle of large tree\",\n\t\tcategory: \"remove\",\n\t\tbefore: () => {\n\t\t\tconst str = new TestString(\"id\", {});\n\t\t\tfor (let i = 0; i < 1000; i++) {\n\t\t\t\tstr.append(\"a\", false);\n\t\t\t}\n\n\t\t\tstr.applyPendingOps();\n\t\t\tsummary = str.getSummary();\n\t\t},\n\t\tbenchmarkFnAsync: async () => {\n\t\t\tconst str = await loadSnapshot(summary);\n\n\t\t\tconst refSeq = 1000;\n\t\t\tconst clientId = 0;\n\t\t\tstr.mergeTree.markRangeRemoved(\n\t\t\t\t499,\n\t\t\t\t501,\n\t\t\t\tnew PriorPerspective(refSeq, clientId),\n\t\t\t\t{ seq: 1001, clientId },\n\t\t\t\t{ op: { type: MergeTreeDeltaType.REMOVE } },\n\t\t\t);\n\t\t},\n\t});\n\n\tbenchmark({\n\t\ttype: BenchmarkType.Measurement,\n\t\ttitle: \"remove end of large tree\",\n\t\tcategory: \"remove\",\n\t\tbefore: () => {\n\t\t\tconst str = new TestString(\"id\", {});\n\t\t\tfor (let i = 0; i < 1000; i++) {\n\t\t\t\tstr.append(\"a\", false);\n\t\t\t}\n\n\t\t\tstr.applyPendingOps();\n\t\t\tsummary = str.getSummary();\n\t\t},\n\t\tbenchmarkFnAsync: async () => {\n\t\t\tconst str = await loadSnapshot(summary);\n\n\t\t\tconst refSeq = 1000;\n\t\t\tconst clientId = 0;\n\t\t\tstr.mergeTree.markRangeRemoved(\n\t\t\t\t999,\n\t\t\t\t1000,\n\t\t\t\tnew PriorPerspective(refSeq, clientId),\n\t\t\t\t{ seq: 1001, clientId },\n\t\t\t\t{ op: { type: MergeTreeDeltaType.REMOVE } },\n\t\t\t);\n\t\t},\n\t});\n});\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"beastTest.spec.d.ts","sourceRoot":"","sources":["../../src/test/beastTest.spec.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAYH,OAAO,EAAE,OAAO,EAAc,MAAM,sCAAsC,CAAC;AAmC3E,OAAO,EAAE,UAAU,EAA2B,MAAM,iBAAiB,CAAC;AAmHtE,wBAAgB,UAAU,IAAI,IAAI,CAYjC;AAcD,wBAAgB,YAAY,IAAI,MAAM,CAsCrC;AAED,wBAAgB,SAAS,IAAI,IAAI,CAoDhC;AAkFD,wBAAgB,cAAc,IAAI,IAAI,CAwBrC;AAED,wBAAgB,kBAAkB,IAAI,IAAI,CAmFzC;AAED,wBAAgB,oBAAoB,IAAI,MAAM,CAwM7C;AAID,wBAAgB,QAAQ,CAAC,OAAO,UAAO,GAAG;IACzC,SAAS,EAAE,MAAM,IAAI,CAAC;IACtB,YAAY,EAAE,MAAM,MAAM,CAAC;IAC3B,YAAY,EAAE,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;IAClE,cAAc,EAAE,MAAM,IAAI,CAAC;CAC3B,CAqpBA;AAYD,qBAAa,UAAU;IACtB,MAAM,EAAE,OAAO,CAAC;;IAKhB,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM;IAI7C,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM;CA+BrC;AAED,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,YAAY,CAAC;AACjD;;;;;;;GAOG;AACH,qBAAa,YAAY;IAOhB,IAAI,EAAE,MAAM;IACZ,QAAQ,EAAE,YAAY,EAAE;IAPhC,GAAG,SAAK;IACR,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAsB;IACjD,EAAE,EAAE,MAAM,GAAG,SAAS,CAAC;IACvB,MAAM,CAAC,QAAQ,aAAoB;gBAG3B,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,YAAY,EAAE;IAGhC,cAAc,CAAC,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,YAAY,GAAG,IAAI;IA2C/D,MAAM,CAAC,gBAAgB,IAAI,YAAY;IAKvC,MAAM,CAAC,eAAe,CAAC,cAAc,EAAE,MAAM,GAAG,YAAY,EAAE;IAuB9D,MAAM,CAAC,iBAAiB,IAAI,YAAY;IAOxC,MAAM,CAAC,WAAW,CAAC,cAAc,EAAE,MAAM,GAAG,YAAY;IAUxD,MAAM,CAAC,WAAW,CAAC,cAAc,EAAE,MAAM,GAAG,YAAY;CAGxD"}
1
+ {"version":3,"file":"beastTest.spec.d.ts","sourceRoot":"","sources":["../../src/test/beastTest.spec.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAYH,OAAO,EAAE,OAAO,EAAc,MAAM,sCAAsC,CAAC;AAoC3E,OAAO,EAAE,UAAU,EAA2B,MAAM,iBAAiB,CAAC;AAmHtE,wBAAgB,UAAU,IAAI,IAAI,CAYjC;AAcD,wBAAgB,YAAY,IAAI,MAAM,CAsCrC;AAED,wBAAgB,SAAS,IAAI,IAAI,CAoDhC;AAwED,wBAAgB,cAAc,IAAI,IAAI,CAwBrC;AAED,wBAAgB,kBAAkB,IAAI,IAAI,CA8EzC;AAED,wBAAgB,oBAAoB,IAAI,MAAM,CAgM7C;AAID,wBAAgB,QAAQ,CAAC,OAAO,UAAO,GAAG;IACzC,SAAS,EAAE,MAAM,IAAI,CAAC;IACtB,YAAY,EAAE,MAAM,MAAM,CAAC;IAC3B,YAAY,EAAE,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;IAClE,cAAc,EAAE,MAAM,IAAI,CAAC;CAC3B,CAqpBA;AAYD,qBAAa,UAAU;IACtB,MAAM,EAAE,OAAO,CAAC;;IAKhB,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM;IAI7C,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM;CA+BrC;AAED,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,YAAY,CAAC;AACjD;;;;;;;GAOG;AACH,qBAAa,YAAY;IAOhB,IAAI,EAAE,MAAM;IACZ,QAAQ,EAAE,YAAY,EAAE;IAPhC,GAAG,SAAK;IACR,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAsB;IACjD,EAAE,EAAE,MAAM,GAAG,SAAS,CAAC;IACvB,MAAM,CAAC,QAAQ,aAAoB;gBAG3B,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,YAAY,EAAE;IAGhC,cAAc,CAAC,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,YAAY,GAAG,IAAI;IA2C/D,MAAM,CAAC,gBAAgB,IAAI,YAAY;IAKvC,MAAM,CAAC,eAAe,CAAC,cAAc,EAAE,MAAM,GAAG,YAAY,EAAE;IAuB9D,MAAM,CAAC,iBAAiB,IAAI,YAAY;IAOxC,MAAM,CAAC,WAAW,CAAC,cAAc,EAAE,MAAM,GAAG,YAAY;IAUxD,MAAM,CAAC,WAAW,CAAC,cAAc,EAAE,MAAM,GAAG,YAAY;CAGxD"}
@@ -20,13 +20,14 @@ import { MergeTree } from "../mergeTree.js";
20
20
  import { compareNumbers, compareStrings, reservedMarkerIdKey, } from "../mergeTreeNodes.js";
21
21
  import { createRemoveRangeOp } from "../opBuilder.js";
22
22
  import { MergeTreeDeltaType, ReferenceType } from "../ops.js";
23
+ import { LocalDefaultPerspective } from "../perspective.js";
23
24
  import { reservedRangeLabelsKey, reservedTileLabelsKey } from "../referencePositions.js";
24
25
  import { SnapshotLegacy } from "../snapshotlegacy.js";
25
26
  import { TextSegment } from "../textSegment.js";
26
27
  import { _dirname } from "./dirname.cjs";
27
28
  import { TestClient, getStats, specToSegment } from "./testClient.js";
28
29
  import { TestServer } from "./testServer.js";
29
- import { insertText, loadTextFromFile, nodeOrdinalsHaveIntegrity } from "./testUtils.js";
30
+ import { loadTextFromFile, nodeOrdinalsHaveIntegrity } from "./testUtils.js";
30
31
  function LinearDictionary(compareKeys) {
31
32
  const props = [];
32
33
  const compareProps = (a, b) => compareKeys(a.key, b.key);
@@ -242,21 +243,12 @@ function editFlat(source, s, dl, nt = "") {
242
243
  }
243
244
  let accumTime = 0;
244
245
  function checkInsertMergeTree(mergeTree, pos, textSegment, verbose = false) {
245
- let checkText = new MergeTreeTextHelper(mergeTree).getText(UniversalSequenceNumber, LocalClientId);
246
+ let checkText = new MergeTreeTextHelper(mergeTree).getText(mergeTree.localPerspective);
246
247
  checkText = editFlat(checkText, pos, 0, textSegment.text);
247
248
  const clockStart = clock();
248
- insertText({
249
- mergeTree,
250
- pos,
251
- refSeq: UniversalSequenceNumber,
252
- clientId: LocalClientId,
253
- seq: UniversalSequenceNumber,
254
- text: textSegment.text,
255
- props: undefined,
256
- opArgs: undefined,
257
- });
249
+ mergeTree.insertSegments(pos, [textSegment], mergeTree.localPerspective, { clientId: LocalClientId, seq: UniversalSequenceNumber }, undefined);
258
250
  accumTime += elapsedMicroseconds(clockStart);
259
- const updatedText = new MergeTreeTextHelper(mergeTree).getText(UniversalSequenceNumber, LocalClientId);
251
+ const updatedText = new MergeTreeTextHelper(mergeTree).getText(mergeTree.localPerspective);
260
252
  const result = checkText === updatedText;
261
253
  if (!result && verbose) {
262
254
  log(`mismatch(o): ${checkText}`);
@@ -266,12 +258,12 @@ function checkInsertMergeTree(mergeTree, pos, textSegment, verbose = false) {
266
258
  }
267
259
  function checkMarkRemoveMergeTree(mergeTree, start, end, verbose = false) {
268
260
  const helper = new MergeTreeTextHelper(mergeTree);
269
- const origText = helper.getText(UniversalSequenceNumber, LocalClientId);
261
+ const origText = helper.getText(mergeTree.localPerspective);
270
262
  const checkText = editFlat(origText, start, end - start);
271
263
  const clockStart = clock();
272
- mergeTree.markRangeRemoved(start, end, UniversalSequenceNumber, LocalClientId, UniversalSequenceNumber, { op: createRemoveRangeOp(start, end) });
264
+ mergeTree.markRangeRemoved(start, end, mergeTree.localPerspective, { clientId: LocalClientId, seq: UniversalSequenceNumber }, { op: createRemoveRangeOp(start, end) });
273
265
  accumTime += elapsedMicroseconds(clockStart);
274
- const updatedText = helper.getText(UniversalSequenceNumber, LocalClientId);
266
+ const updatedText = helper.getText(mergeTree.localPerspective);
275
267
  const result = checkText === updatedText;
276
268
  if (!result && verbose) {
277
269
  log(`mismatch(o): ${origText}`);
@@ -282,8 +274,9 @@ function checkMarkRemoveMergeTree(mergeTree, start, end, verbose = false) {
282
274
  }
283
275
  export function mergeTreeTest1() {
284
276
  const mergeTree = new MergeTree();
285
- mergeTree.insertSegments(0, [TextSegment.make("the cat is on the mat")], UniversalSequenceNumber, LocalClientId, UniversalSequenceNumber, undefined);
286
- mergeTree.mapRange(printTextSegment, UniversalSequenceNumber, LocalClientId, undefined);
277
+ mergeTree.insertSegments(0, [TextSegment.make("the cat is on the mat")], mergeTree.localPerspective, mergeTree.collabWindow.mintNextLocalOperationStamp(), undefined);
278
+ const localPerspective = new LocalDefaultPerspective(mergeTree.collabWindow.clientId);
279
+ mergeTree.mapRange(printTextSegment, localPerspective, undefined);
287
280
  let fuzzySeg = makeCollabTextSegment("fuzzy, fuzzy ");
288
281
  checkInsertMergeTree(mergeTree, 4, fuzzySeg);
289
282
  fuzzySeg = makeCollabTextSegment("fuzzy, fuzzy ");
@@ -291,16 +284,16 @@ export function mergeTreeTest1() {
291
284
  checkMarkRemoveMergeTree(mergeTree, 4, 13);
292
285
  // checkRemoveSegTree(segTree, 4, 13);
293
286
  checkInsertMergeTree(mergeTree, 4, makeCollabTextSegment("fi"));
294
- mergeTree.mapRange(printTextSegment, UniversalSequenceNumber, LocalClientId, undefined);
295
- const segoff = mergeTree.getContainingSegment(4, UniversalSequenceNumber, LocalClientId);
296
- log(mergeTree.getPosition(segoff.segment, UniversalSequenceNumber, LocalClientId));
297
- log(new MergeTreeTextHelper(mergeTree).getText(UniversalSequenceNumber, LocalClientId));
287
+ mergeTree.mapRange(printTextSegment, localPerspective, undefined);
288
+ const segoff = mergeTree.getContainingSegment(4, mergeTree.localPerspective);
289
+ log(mergeTree.getPosition(segoff.segment, mergeTree.localPerspective));
290
+ log(new MergeTreeTextHelper(mergeTree).getText(mergeTree.localPerspective));
298
291
  log(mergeTree.toString());
299
292
  TestPack().firstTest();
300
293
  }
301
294
  export function mergeTreeLargeTest() {
302
295
  const mergeTree = new MergeTree();
303
- mergeTree.insertSegments(0, [TextSegment.make("the cat is on the mat")], UniversalSequenceNumber, LocalClientId, UniversalSequenceNumber, undefined);
296
+ mergeTree.insertSegments(0, [TextSegment.make("the cat is on the mat")], mergeTree.localPerspective, mergeTree.collabWindow.mintNextLocalOperationStamp(), undefined);
304
297
  const insertCount = 1000000;
305
298
  const removeCount = 980000;
306
299
  const random = makeRandom(0xdeadbeef, 0xfeedbed);
@@ -320,24 +313,15 @@ export function mergeTreeLargeTest() {
320
313
  for (let i = 0; i < insertCount; i++) {
321
314
  const slen = randInt();
322
315
  const s = randomString(slen, String.fromCodePoint(48 + slen));
323
- const preLen = mergeTree.getLength(UniversalSequenceNumber, LocalClientId);
316
+ const preLen = mergeTree.getLength(mergeTree.localPerspective);
324
317
  const pos = random.integer(0, preLen);
325
318
  const clockStart = clock();
326
- insertText({
327
- mergeTree,
328
- pos,
329
- refSeq: UniversalSequenceNumber,
330
- clientId: LocalClientId,
331
- seq: UniversalSequenceNumber,
332
- text: s,
333
- props: undefined,
334
- opArgs: undefined,
335
- });
319
+ mergeTree.insertSegments(pos, [TextSegment.make(s)], mergeTree.localPerspective, { clientId: LocalClientId, seq: UniversalSequenceNumber }, undefined);
336
320
  accumTime += elapsedMicroseconds(clockStart);
337
321
  if (i > 0 && 0 === i % 50000) {
338
322
  const perIter = (accumTime / (i + 1)).toFixed(3);
339
323
  treeCount++;
340
- accumTreeSize += mergeTree.getLength(UniversalSequenceNumber, LocalClientId);
324
+ accumTreeSize += mergeTree.getLength(mergeTree.localPerspective);
341
325
  const averageTreeSize = (accumTreeSize / treeCount).toFixed(3);
342
326
  log(`i: ${i} time: ${accumTime}us which is average ${perIter} per insert with average tree size ${averageTreeSize}`);
343
327
  }
@@ -348,16 +332,16 @@ export function mergeTreeLargeTest() {
348
332
  treeCount = 0;
349
333
  for (let i = 0; i < removeCount; i++) {
350
334
  const dlen = randInt();
351
- const preLen = mergeTree.getLength(UniversalSequenceNumber, LocalClientId);
335
+ const preLen = mergeTree.getLength(mergeTree.localPerspective);
352
336
  const pos = random.integer(0, preLen);
353
337
  // Log(itree.toString());
354
338
  const clockStart = clock();
355
- mergeTree.markRangeRemoved(pos, pos + dlen, UniversalSequenceNumber, LocalClientId, UniversalSequenceNumber, undefined);
339
+ mergeTree.markRangeRemoved(pos, pos + dlen, mergeTree.localPerspective, { clientId: LocalClientId, seq: UniversalSequenceNumber }, undefined);
356
340
  accumTime += elapsedMicroseconds(clockStart);
357
341
  if (i > 0 && 0 === i % 50000) {
358
342
  const perIter = (accumTime / (i + 1)).toFixed(3);
359
343
  treeCount++;
360
- accumTreeSize += mergeTree.getLength(UniversalSequenceNumber, LocalClientId);
344
+ accumTreeSize += mergeTree.getLength(mergeTree.localPerspective);
361
345
  const averageTreeSize = (accumTreeSize / treeCount).toFixed(3);
362
346
  log(`i: ${i} time: ${accumTime}us which is average ${perIter} per del with average tree size ${averageTreeSize}`);
363
347
  }
@@ -365,7 +349,7 @@ export function mergeTreeLargeTest() {
365
349
  }
366
350
  export function mergeTreeCheckedTest() {
367
351
  const mergeTree = new MergeTree();
368
- mergeTree.insertSegments(0, [TextSegment.make("the cat is on the mat")], UniversalSequenceNumber, LocalClientId, UniversalSequenceNumber, undefined);
352
+ mergeTree.insertSegments(0, [TextSegment.make("the cat is on the mat")], mergeTree.localPerspective, mergeTree.collabWindow.mintNextLocalOperationStamp(), undefined);
369
353
  const insertCount = 2000;
370
354
  const removeCount = 1400;
371
355
  const largeRemoveCount = 20;
@@ -388,10 +372,10 @@ export function mergeTreeCheckedTest() {
388
372
  for (let i = 0; i < insertCount; i++) {
389
373
  const slen = randInt();
390
374
  const s = randomString(slen, String.fromCodePoint(48 + slen));
391
- const preLen = mergeTree.getLength(UniversalSequenceNumber, LocalClientId);
375
+ const preLen = mergeTree.getLength(mergeTree.localPerspective);
392
376
  const pos = random.integer(0, preLen);
393
377
  if (!checkInsertMergeTree(mergeTree, pos, makeCollabTextSegment(s), true)) {
394
- log(`i: ${i} preLen ${preLen} pos: ${pos} slen: ${slen} s: ${s} itree len: ${mergeTree.getLength(UniversalSequenceNumber, LocalClientId)}`);
378
+ log(`i: ${i} preLen ${preLen} pos: ${pos} slen: ${slen} s: ${s} itree len: ${mergeTree.getLength(mergeTree.localPerspective)}`);
395
379
  log(mergeTree.toString());
396
380
  errorCount++;
397
381
  break;
@@ -399,7 +383,7 @@ export function mergeTreeCheckedTest() {
399
383
  if (i > 0 && 0 === i % 1000) {
400
384
  const perIter = (accumTime / (i + 1)).toFixed(3);
401
385
  treeCount++;
402
- accumTreeSize += mergeTree.getLength(UniversalSequenceNumber, LocalClientId);
386
+ accumTreeSize += mergeTree.getLength(mergeTree.localPerspective);
403
387
  const averageTreeSize = (accumTreeSize / treeCount).toFixed(3);
404
388
  log(`i: ${i} time: ${accumTime}us which is average ${perIter} per insert with average tree size ${averageTreeSize}`);
405
389
  }
@@ -409,18 +393,18 @@ export function mergeTreeCheckedTest() {
409
393
  treeCount = 0;
410
394
  for (let i = 0; i < largeRemoveCount; i++) {
411
395
  const dlen = randLargeInt();
412
- const preLen = mergeTree.getLength(UniversalSequenceNumber, LocalClientId);
396
+ const preLen = mergeTree.getLength(mergeTree.localPerspective);
413
397
  const pos = random.integer(0, preLen);
414
398
  // log(itree.toString());
415
399
  if (!checkMarkRemoveMergeTree(mergeTree, pos, pos + dlen, true)) {
416
- log(`i: ${i} preLen ${preLen} pos: ${pos} dlen: ${dlen} itree len: ${mergeTree.getLength(UniversalSequenceNumber, LocalClientId)}`);
400
+ log(`i: ${i} preLen ${preLen} pos: ${pos} dlen: ${dlen} itree len: ${mergeTree.getLength(mergeTree.localPerspective)}`);
417
401
  log(mergeTree.toString());
418
402
  break;
419
403
  }
420
404
  if (i > 0 && 0 === i % 10) {
421
405
  const perIter = (accumTime / (i + 1)).toFixed(3);
422
406
  treeCount++;
423
- accumTreeSize += mergeTree.getLength(UniversalSequenceNumber, LocalClientId);
407
+ accumTreeSize += mergeTree.getLength(mergeTree.localPerspective);
424
408
  const averageTreeSize = (accumTreeSize / treeCount).toFixed(3);
425
409
  log(`i: ${i} time: ${accumTime}us which is average ${perIter} per large del with average tree size ${averageTreeSize}`);
426
410
  }
@@ -430,12 +414,12 @@ export function mergeTreeCheckedTest() {
430
414
  treeCount = 0;
431
415
  for (let i = 0; i < removeCount; i++) {
432
416
  const dlen = randInt();
433
- const preLen = mergeTree.getLength(UniversalSequenceNumber, LocalClientId);
417
+ const preLen = mergeTree.getLength(mergeTree.localPerspective);
434
418
  const pos = random.integer(0, preLen);
435
419
  // log(itree.toString());
436
420
  if (i & 1) {
437
421
  if (!checkMarkRemoveMergeTree(mergeTree, pos, pos + dlen, true)) {
438
- log(`mr i: ${i} preLen ${preLen} pos: ${pos} dlen: ${dlen} itree len: ${mergeTree.getLength(UniversalSequenceNumber, LocalClientId)}`);
422
+ log(`mr i: ${i} preLen ${preLen} pos: ${pos} dlen: ${dlen} itree len: ${mergeTree.getLength(mergeTree.localPerspective)}`);
439
423
  log(mergeTree.toString());
440
424
  errorCount++;
441
425
  break;
@@ -443,7 +427,7 @@ export function mergeTreeCheckedTest() {
443
427
  }
444
428
  else {
445
429
  if (!checkMarkRemoveMergeTree(mergeTree, pos, pos + dlen, true)) {
446
- log(`i: ${i} preLen ${preLen} pos: ${pos} dlen: ${dlen} itree len: ${mergeTree.getLength(UniversalSequenceNumber, LocalClientId)}`);
430
+ log(`i: ${i} preLen ${preLen} pos: ${pos} dlen: ${dlen} itree len: ${mergeTree.getLength(mergeTree.localPerspective)}`);
447
431
  log(mergeTree.toString());
448
432
  errorCount++;
449
433
  break;
@@ -452,7 +436,7 @@ export function mergeTreeCheckedTest() {
452
436
  if (i > 0 && 0 === i % 1000) {
453
437
  const perIter = (accumTime / (i + 1)).toFixed(3);
454
438
  treeCount++;
455
- accumTreeSize += mergeTree.getLength(UniversalSequenceNumber, LocalClientId);
439
+ accumTreeSize += mergeTree.getLength(mergeTree.localPerspective);
456
440
  const averageTreeSize = (accumTreeSize / treeCount).toFixed(3);
457
441
  log(`i: ${i} time: ${accumTime}us which is average ${perIter} per del with average tree size ${averageTreeSize}`);
458
442
  }
@@ -463,10 +447,10 @@ export function mergeTreeCheckedTest() {
463
447
  for (let i = 0; i < insertCount; i++) {
464
448
  const slen = randInt();
465
449
  const s = randomString(slen, String.fromCodePoint(48 + slen));
466
- const preLen = mergeTree.getLength(UniversalSequenceNumber, LocalClientId);
450
+ const preLen = mergeTree.getLength(mergeTree.localPerspective);
467
451
  const pos = random.integer(0, preLen);
468
452
  if (!checkInsertMergeTree(mergeTree, pos, makeCollabTextSegment(s), true)) {
469
- log(`i: ${i} preLen ${preLen} pos: ${pos} slen: ${slen} s: ${s} itree len: ${mergeTree.getLength(UniversalSequenceNumber, LocalClientId)}`);
453
+ log(`i: ${i} preLen ${preLen} pos: ${pos} slen: ${slen} s: ${s} itree len: ${mergeTree.getLength(mergeTree.localPerspective)}`);
470
454
  log(mergeTree.toString());
471
455
  errorCount++;
472
456
  break;
@@ -474,7 +458,7 @@ export function mergeTreeCheckedTest() {
474
458
  if (i > 0 && 0 === i % 1000) {
475
459
  const perIter = (accumTime / (i + 1)).toFixed(3);
476
460
  treeCount++;
477
- accumTreeSize += mergeTree.getLength(UniversalSequenceNumber, LocalClientId);
461
+ accumTreeSize += mergeTree.getLength(mergeTree.localPerspective);
478
462
  const averageTreeSize = (accumTreeSize / treeCount).toFixed(3);
479
463
  log(`i: ${i} time: ${accumTime}us which is average ${perIter} per insert with average tree size ${averageTreeSize}`);
480
464
  }
@@ -484,12 +468,12 @@ export function mergeTreeCheckedTest() {
484
468
  treeCount = 0;
485
469
  for (let i = 0; i < removeCount; i++) {
486
470
  const dlen = randInt();
487
- const preLen = mergeTree.getLength(UniversalSequenceNumber, LocalClientId);
471
+ const preLen = mergeTree.getLength(mergeTree.localPerspective);
488
472
  const pos = random.integer(0, preLen);
489
473
  // log(itree.toString());
490
474
  if (i & 1) {
491
475
  if (!checkMarkRemoveMergeTree(mergeTree, pos, pos + dlen, true)) {
492
- log(`i: ${i} preLen ${preLen} pos: ${pos} dlen: ${dlen} itree len: ${mergeTree.getLength(UniversalSequenceNumber, LocalClientId)}`);
476
+ log(`i: ${i} preLen ${preLen} pos: ${pos} dlen: ${dlen} itree len: ${mergeTree.getLength(mergeTree.localPerspective)}`);
493
477
  log(mergeTree.toString());
494
478
  errorCount++;
495
479
  break;
@@ -497,7 +481,7 @@ export function mergeTreeCheckedTest() {
497
481
  }
498
482
  else {
499
483
  if (!checkMarkRemoveMergeTree(mergeTree, pos, pos + dlen, true)) {
500
- log(`i: ${i} preLen ${preLen} pos: ${pos} dlen: ${dlen} itree len: ${mergeTree.getLength(UniversalSequenceNumber, LocalClientId)}`);
484
+ log(`i: ${i} preLen ${preLen} pos: ${pos} dlen: ${dlen} itree len: ${mergeTree.getLength(mergeTree.localPerspective)}`);
501
485
  log(mergeTree.toString());
502
486
  errorCount++;
503
487
  break;
@@ -506,7 +490,7 @@ export function mergeTreeCheckedTest() {
506
490
  if (i > 0 && 0 === i % 1000) {
507
491
  const perIter = (accumTime / (i + 1)).toFixed(3);
508
492
  treeCount++;
509
- accumTreeSize += mergeTree.getLength(UniversalSequenceNumber, LocalClientId);
493
+ accumTreeSize += mergeTree.getLength(mergeTree.localPerspective);
510
494
  const averageTreeSize = (accumTreeSize / treeCount).toFixed(3);
511
495
  log(`i: ${i} time: ${accumTime}us which is average ${perIter} per del with average tree size ${averageTreeSize}`);
512
496
  }
@@ -1263,17 +1247,8 @@ function findReplacePerf(filename) {
1263
1247
  const text = textSeg.text;
1264
1248
  const i = text.indexOf("the");
1265
1249
  if (i >= 0) {
1266
- client.mergeTree.markRangeRemoved(pos + i, pos + i + 3, UniversalSequenceNumber, client.getClientId(), 1, undefined);
1267
- insertText({
1268
- mergeTree: client.mergeTree,
1269
- pos: pos + i,
1270
- refSeq: UniversalSequenceNumber,
1271
- clientId: client.getClientId(),
1272
- seq: 1,
1273
- text: "teh",
1274
- props: undefined,
1275
- opArgs: undefined,
1276
- });
1250
+ client.mergeTree.markRangeRemoved(pos + i, pos + i + 3, client.mergeTree.localPerspective, { clientId: client.getClientId(), seq: 1 }, undefined);
1251
+ client.mergeTree.insertSegments(pos + i, [TextSegment.make("teh")], client.mergeTree.localPerspective, { seq: 1, clientId: client.getClientId() }, undefined);
1277
1252
  pos = pos + i + 3;
1278
1253
  cReplaces++;
1279
1254
  }