@fluidframework/merge-tree 2.12.0 → 2.13.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 (285) hide show
  1. package/CHANGELOG.md +4 -0
  2. package/dist/MergeTreeTextHelper.d.ts.map +1 -1
  3. package/dist/MergeTreeTextHelper.js +0 -2
  4. package/dist/MergeTreeTextHelper.js.map +1 -1
  5. package/dist/attributionPolicy.d.ts.map +1 -1
  6. package/dist/attributionPolicy.js +6 -16
  7. package/dist/attributionPolicy.js.map +1 -1
  8. package/dist/client.d.ts +3 -4
  9. package/dist/client.d.ts.map +1 -1
  10. package/dist/client.js +39 -28
  11. package/dist/client.js.map +1 -1
  12. package/dist/endOfTreeSegment.d.ts +2 -1
  13. package/dist/endOfTreeSegment.d.ts.map +1 -1
  14. package/dist/endOfTreeSegment.js.map +1 -1
  15. package/dist/index.d.ts +2 -1
  16. package/dist/index.d.ts.map +1 -1
  17. package/dist/index.js +2 -4
  18. package/dist/index.js.map +1 -1
  19. package/dist/mergeTree.d.ts +8 -7
  20. package/dist/mergeTree.d.ts.map +1 -1
  21. package/dist/mergeTree.js +190 -216
  22. package/dist/mergeTree.js.map +1 -1
  23. package/dist/mergeTreeNodeWalk.d.ts.map +1 -1
  24. package/dist/mergeTreeNodeWalk.js +3 -2
  25. package/dist/mergeTreeNodeWalk.js.map +1 -1
  26. package/dist/mergeTreeNodes.d.ts +76 -162
  27. package/dist/mergeTreeNodes.d.ts.map +1 -1
  28. package/dist/mergeTreeNodes.js +100 -112
  29. package/dist/mergeTreeNodes.js.map +1 -1
  30. package/dist/mergeTreeTracking.d.ts.map +1 -1
  31. package/dist/mergeTreeTracking.js +0 -2
  32. package/dist/mergeTreeTracking.js.map +1 -1
  33. package/dist/partialLengths.d.ts +2 -2
  34. package/dist/partialLengths.d.ts.map +1 -1
  35. package/dist/partialLengths.js +28 -26
  36. package/dist/partialLengths.js.map +1 -1
  37. package/dist/perspective.d.ts +3 -2
  38. package/dist/perspective.d.ts.map +1 -1
  39. package/dist/perspective.js +11 -4
  40. package/dist/perspective.js.map +1 -1
  41. package/dist/referencePositions.d.ts.map +1 -1
  42. package/dist/referencePositions.js +4 -1
  43. package/dist/referencePositions.js.map +1 -1
  44. package/dist/revertibles.d.ts.map +1 -1
  45. package/dist/revertibles.js +10 -11
  46. package/dist/revertibles.js.map +1 -1
  47. package/dist/segmentGroupCollection.d.ts +4 -4
  48. package/dist/segmentGroupCollection.d.ts.map +1 -1
  49. package/dist/segmentGroupCollection.js +0 -6
  50. package/dist/segmentGroupCollection.js.map +1 -1
  51. package/dist/segmentInfos.d.ts +257 -0
  52. package/dist/segmentInfos.d.ts.map +1 -0
  53. package/dist/segmentInfos.js +166 -0
  54. package/dist/segmentInfos.js.map +1 -0
  55. package/dist/snapshotLoader.d.ts.map +1 -1
  56. package/dist/snapshotLoader.js +38 -44
  57. package/dist/snapshotLoader.js.map +1 -1
  58. package/dist/snapshotV1.d.ts.map +1 -1
  59. package/dist/snapshotV1.js +9 -12
  60. package/dist/snapshotV1.js.map +1 -1
  61. package/dist/snapshotlegacy.d.ts +2 -2
  62. package/dist/snapshotlegacy.d.ts.map +1 -1
  63. package/dist/snapshotlegacy.js +5 -3
  64. package/dist/snapshotlegacy.js.map +1 -1
  65. package/dist/sortedSegmentSet.d.ts.map +1 -1
  66. package/dist/sortedSegmentSet.js +5 -8
  67. package/dist/sortedSegmentSet.js.map +1 -1
  68. package/dist/test/beastTest.spec.d.ts +0 -2
  69. package/dist/test/beastTest.spec.d.ts.map +1 -1
  70. package/dist/test/beastTest.spec.js +1 -5
  71. package/dist/test/beastTest.spec.js.map +1 -1
  72. package/dist/test/client.annotateMarker.spec.js.map +1 -1
  73. package/dist/test/client.applyMsg.spec.js +15 -12
  74. package/dist/test/client.applyMsg.spec.js.map +1 -1
  75. package/dist/test/client.attributionFarm.spec.js.map +1 -1
  76. package/dist/test/client.getPosition.spec.js +3 -2
  77. package/dist/test/client.getPosition.spec.js.map +1 -1
  78. package/dist/test/client.localReference.spec.js +6 -6
  79. package/dist/test/client.localReference.spec.js.map +1 -1
  80. package/dist/test/client.localReferenceFarm.spec.js.map +1 -1
  81. package/dist/test/client.rollback.spec.js.map +1 -1
  82. package/dist/test/dirname.cjs +0 -1
  83. package/dist/test/dirname.cjs.map +1 -1
  84. package/dist/test/index.d.ts +1 -1
  85. package/dist/test/index.d.ts.map +1 -1
  86. package/dist/test/index.js +2 -4
  87. package/dist/test/index.js.map +1 -1
  88. package/dist/test/mergeTree.annotate.spec.js +3 -0
  89. package/dist/test/mergeTree.annotate.spec.js.map +1 -1
  90. package/dist/test/mergeTree.insertingWalk.spec.js +1 -1
  91. package/dist/test/mergeTree.insertingWalk.spec.js.map +1 -1
  92. package/dist/test/mergeTree.markRangeRemoved.spec.js +2 -0
  93. package/dist/test/mergeTree.markRangeRemoved.spec.js.map +1 -1
  94. package/dist/test/mergeTree.walk.spec.js.map +1 -1
  95. package/dist/test/mergeTreeOperationRunner.d.ts.map +1 -1
  96. package/dist/test/mergeTreeOperationRunner.js +2 -3
  97. package/dist/test/mergeTreeOperationRunner.js.map +1 -1
  98. package/dist/test/obliterate.spec.js.map +1 -1
  99. package/dist/test/propertyManager.spec.js.map +1 -1
  100. package/dist/test/reconnectHelper.d.ts +2 -1
  101. package/dist/test/reconnectHelper.d.ts.map +1 -1
  102. package/dist/test/reconnectHelper.js.map +1 -1
  103. package/dist/test/resetPendingSegmentsToOp.spec.js.map +1 -1
  104. package/dist/test/revertibleFarm.spec.js.map +1 -1
  105. package/dist/test/segmentGroupCollection.spec.js +15 -3
  106. package/dist/test/segmentGroupCollection.spec.js.map +1 -1
  107. package/dist/test/snapshot.utils.d.ts +2 -2
  108. package/dist/test/snapshot.utils.d.ts.map +1 -1
  109. package/dist/test/snapshot.utils.js.map +1 -1
  110. package/dist/test/sortedSegmentSet.spec.js +4 -3
  111. package/dist/test/sortedSegmentSet.spec.js.map +1 -1
  112. package/dist/test/testClient.d.ts +8 -6
  113. package/dist/test/testClient.d.ts.map +1 -1
  114. package/dist/test/testClient.js +29 -27
  115. package/dist/test/testClient.js.map +1 -1
  116. package/dist/test/testClientLogger.d.ts.map +1 -1
  117. package/dist/test/testClientLogger.js +6 -4
  118. package/dist/test/testClientLogger.js.map +1 -1
  119. package/dist/test/testUtils.d.ts +2 -2
  120. package/dist/test/testUtils.d.ts.map +1 -1
  121. package/dist/test/testUtils.js +32 -8
  122. package/dist/test/testUtils.js.map +1 -1
  123. package/dist/test/text.d.ts +2 -2
  124. package/dist/test/text.d.ts.map +1 -1
  125. package/dist/test/text.js +12 -6
  126. package/dist/test/text.js.map +1 -1
  127. package/dist/test/tracking.spec.js.map +1 -1
  128. package/dist/test/wordUnitTests.spec.js +1 -1
  129. package/dist/test/wordUnitTests.spec.js.map +1 -1
  130. package/dist/zamboni.d.ts.map +1 -1
  131. package/dist/zamboni.js +8 -7
  132. package/dist/zamboni.js.map +1 -1
  133. package/lib/MergeTreeTextHelper.d.ts.map +1 -1
  134. package/lib/MergeTreeTextHelper.js +0 -2
  135. package/lib/MergeTreeTextHelper.js.map +1 -1
  136. package/lib/attributionPolicy.d.ts.map +1 -1
  137. package/lib/attributionPolicy.js +6 -16
  138. package/lib/attributionPolicy.js.map +1 -1
  139. package/lib/client.d.ts +3 -4
  140. package/lib/client.d.ts.map +1 -1
  141. package/lib/client.js +40 -29
  142. package/lib/client.js.map +1 -1
  143. package/lib/endOfTreeSegment.d.ts +2 -1
  144. package/lib/endOfTreeSegment.d.ts.map +1 -1
  145. package/lib/endOfTreeSegment.js.map +1 -1
  146. package/lib/index.d.ts +2 -1
  147. package/lib/index.d.ts.map +1 -1
  148. package/lib/index.js +1 -1
  149. package/lib/index.js.map +1 -1
  150. package/lib/mergeTree.d.ts +8 -7
  151. package/lib/mergeTree.d.ts.map +1 -1
  152. package/lib/mergeTree.js +177 -205
  153. package/lib/mergeTree.js.map +1 -1
  154. package/lib/mergeTreeNodeWalk.d.ts.map +1 -1
  155. package/lib/mergeTreeNodeWalk.js +3 -2
  156. package/lib/mergeTreeNodeWalk.js.map +1 -1
  157. package/lib/mergeTreeNodes.d.ts +76 -162
  158. package/lib/mergeTreeNodes.d.ts.map +1 -1
  159. package/lib/mergeTreeNodes.js +95 -108
  160. package/lib/mergeTreeNodes.js.map +1 -1
  161. package/lib/mergeTreeTracking.d.ts.map +1 -1
  162. package/lib/mergeTreeTracking.js +0 -2
  163. package/lib/mergeTreeTracking.js.map +1 -1
  164. package/lib/partialLengths.d.ts +2 -2
  165. package/lib/partialLengths.d.ts.map +1 -1
  166. package/lib/partialLengths.js +25 -23
  167. package/lib/partialLengths.js.map +1 -1
  168. package/lib/perspective.d.ts +3 -2
  169. package/lib/perspective.d.ts.map +1 -1
  170. package/lib/perspective.js +11 -4
  171. package/lib/perspective.js.map +1 -1
  172. package/lib/referencePositions.d.ts.map +1 -1
  173. package/lib/referencePositions.js +4 -1
  174. package/lib/referencePositions.js.map +1 -1
  175. package/lib/revertibles.d.ts.map +1 -1
  176. package/lib/revertibles.js +8 -9
  177. package/lib/revertibles.js.map +1 -1
  178. package/lib/segmentGroupCollection.d.ts +4 -4
  179. package/lib/segmentGroupCollection.d.ts.map +1 -1
  180. package/lib/segmentGroupCollection.js +0 -6
  181. package/lib/segmentGroupCollection.js.map +1 -1
  182. package/lib/segmentInfos.d.ts +257 -0
  183. package/lib/segmentInfos.d.ts.map +1 -0
  184. package/lib/segmentInfos.js +145 -0
  185. package/lib/segmentInfos.js.map +1 -0
  186. package/lib/snapshotLoader.d.ts.map +1 -1
  187. package/lib/snapshotLoader.js +38 -44
  188. package/lib/snapshotLoader.js.map +1 -1
  189. package/lib/snapshotV1.d.ts.map +1 -1
  190. package/lib/snapshotV1.js +9 -12
  191. package/lib/snapshotV1.js.map +1 -1
  192. package/lib/snapshotlegacy.d.ts +2 -2
  193. package/lib/snapshotlegacy.d.ts.map +1 -1
  194. package/lib/snapshotlegacy.js +5 -3
  195. package/lib/snapshotlegacy.js.map +1 -1
  196. package/lib/sortedSegmentSet.d.ts.map +1 -1
  197. package/lib/sortedSegmentSet.js +5 -8
  198. package/lib/sortedSegmentSet.js.map +1 -1
  199. package/lib/test/beastTest.spec.d.ts +0 -2
  200. package/lib/test/beastTest.spec.d.ts.map +1 -1
  201. package/lib/test/beastTest.spec.js +0 -3
  202. package/lib/test/beastTest.spec.js.map +1 -1
  203. package/lib/test/client.annotateMarker.spec.js.map +1 -1
  204. package/lib/test/client.applyMsg.spec.js +15 -12
  205. package/lib/test/client.applyMsg.spec.js.map +1 -1
  206. package/lib/test/client.attributionFarm.spec.js.map +1 -1
  207. package/lib/test/client.getPosition.spec.js +3 -2
  208. package/lib/test/client.getPosition.spec.js.map +1 -1
  209. package/lib/test/client.localReference.spec.js +1 -1
  210. package/lib/test/client.localReference.spec.js.map +1 -1
  211. package/lib/test/client.localReferenceFarm.spec.js.map +1 -1
  212. package/lib/test/client.rollback.spec.js +1 -1
  213. package/lib/test/client.rollback.spec.js.map +1 -1
  214. package/lib/test/dirname.cjs +0 -1
  215. package/lib/test/dirname.cjs.map +1 -1
  216. package/lib/test/index.d.ts +1 -1
  217. package/lib/test/index.d.ts.map +1 -1
  218. package/lib/test/index.js +1 -1
  219. package/lib/test/index.js.map +1 -1
  220. package/lib/test/mergeTree.annotate.spec.js +3 -0
  221. package/lib/test/mergeTree.annotate.spec.js.map +1 -1
  222. package/lib/test/mergeTree.insertingWalk.spec.js +2 -2
  223. package/lib/test/mergeTree.insertingWalk.spec.js.map +1 -1
  224. package/lib/test/mergeTree.markRangeRemoved.spec.js +2 -0
  225. package/lib/test/mergeTree.markRangeRemoved.spec.js.map +1 -1
  226. package/lib/test/mergeTree.walk.spec.js.map +1 -1
  227. package/lib/test/mergeTreeOperationRunner.d.ts.map +1 -1
  228. package/lib/test/mergeTreeOperationRunner.js +1 -2
  229. package/lib/test/mergeTreeOperationRunner.js.map +1 -1
  230. package/lib/test/obliterate.spec.js.map +1 -1
  231. package/lib/test/propertyManager.spec.js.map +1 -1
  232. package/lib/test/reconnectHelper.d.ts +2 -1
  233. package/lib/test/reconnectHelper.d.ts.map +1 -1
  234. package/lib/test/reconnectHelper.js.map +1 -1
  235. package/lib/test/resetPendingSegmentsToOp.spec.js.map +1 -1
  236. package/lib/test/revertibleFarm.spec.js.map +1 -1
  237. package/lib/test/segmentGroupCollection.spec.js +15 -3
  238. package/lib/test/segmentGroupCollection.spec.js.map +1 -1
  239. package/lib/test/snapshot.utils.d.ts +2 -2
  240. package/lib/test/snapshot.utils.d.ts.map +1 -1
  241. package/lib/test/snapshot.utils.js.map +1 -1
  242. package/lib/test/sortedSegmentSet.spec.js +4 -3
  243. package/lib/test/sortedSegmentSet.spec.js.map +1 -1
  244. package/lib/test/testClient.d.ts +8 -6
  245. package/lib/test/testClient.d.ts.map +1 -1
  246. package/lib/test/testClient.js +30 -28
  247. package/lib/test/testClient.js.map +1 -1
  248. package/lib/test/testClientLogger.d.ts.map +1 -1
  249. package/lib/test/testClientLogger.js +5 -3
  250. package/lib/test/testClientLogger.js.map +1 -1
  251. package/lib/test/testUtils.d.ts +2 -2
  252. package/lib/test/testUtils.d.ts.map +1 -1
  253. package/lib/test/testUtils.js +9 -8
  254. package/lib/test/testUtils.js.map +1 -1
  255. package/lib/test/text.d.ts +2 -2
  256. package/lib/test/text.d.ts.map +1 -1
  257. package/lib/test/text.js +12 -6
  258. package/lib/test/text.js.map +1 -1
  259. package/lib/test/tracking.spec.js.map +1 -1
  260. package/lib/test/wordUnitTests.spec.js +1 -1
  261. package/lib/test/wordUnitTests.spec.js.map +1 -1
  262. package/lib/zamboni.d.ts.map +1 -1
  263. package/lib/zamboni.js +7 -6
  264. package/lib/zamboni.js.map +1 -1
  265. package/package.json +17 -17
  266. package/src/MergeTreeTextHelper.ts +2 -4
  267. package/src/attributionPolicy.ts +5 -13
  268. package/src/client.ts +55 -44
  269. package/src/endOfTreeSegment.ts +3 -3
  270. package/src/index.ts +4 -6
  271. package/src/mergeTree.ts +245 -282
  272. package/src/mergeTreeNodeWalk.ts +3 -2
  273. package/src/mergeTreeNodes.ts +190 -322
  274. package/src/mergeTreeTracking.ts +0 -3
  275. package/src/partialLengths.ts +42 -27
  276. package/src/perspective.ts +27 -4
  277. package/src/referencePositions.ts +4 -1
  278. package/src/revertibles.ts +19 -13
  279. package/src/segmentGroupCollection.ts +7 -18
  280. package/src/segmentInfos.ts +377 -0
  281. package/src/snapshotLoader.ts +60 -57
  282. package/src/snapshotV1.ts +14 -16
  283. package/src/snapshotlegacy.ts +12 -17
  284. package/src/sortedSegmentSet.ts +6 -8
  285. package/src/zamboni.ts +10 -12
@@ -1 +1 @@
1
- {"version":3,"file":"segmentGroupCollection.spec.js","sourceRoot":"","sources":["../../src/test/segmentGroupCollection.spec.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { strict as assert } from \"node:assert\";\n\nimport { type ISegmentLeaf } from \"../mergeTreeNodes.js\";\nimport { SegmentGroupCollection } from \"../segmentGroupCollection.js\";\nimport { TextSegment } from \"../textSegment.js\";\n\ndescribe(\"segmentGroupCollection\", () => {\n\tlet segment: ISegmentLeaf;\n\tlet segmentGroups: SegmentGroupCollection;\n\tbeforeEach(() => {\n\t\tsegment = TextSegment.make(\"abc\");\n\t\tsegmentGroups = segment.segmentGroups = new SegmentGroupCollection(segment);\n\t});\n\tit(\".empty\", () => {\n\t\tassert(segmentGroups.empty);\n\t});\n\n\tit(\".size\", () => {\n\t\tassert.equal(segmentGroups.size, 0);\n\t});\n\n\tit(\".enqueue\", () => {\n\t\tconst segmentGroup = { segments: [], localSeq: 1, refSeq: 0 };\n\t\tsegmentGroups.enqueue(segmentGroup);\n\n\t\tassert(!segmentGroups.empty);\n\t\tassert.equal(segmentGroups.size, 1);\n\t\tassert.equal(segmentGroup.segments.length, 1);\n\t\tassert.equal(segmentGroup.segments[0], segment);\n\t});\n\n\tit(\".dequeue\", () => {\n\t\tconst segmentGroup = { segments: [], localSeq: 1, refSeq: 0 };\n\t\tsegmentGroups.enqueue(segmentGroup);\n\t\tconst segmentGroupCount = 6;\n\t\twhile (segmentGroups.size < segmentGroupCount) {\n\t\t\tsegmentGroups.enqueue({ segments: [], localSeq: 1, refSeq: 0 });\n\t\t}\n\n\t\tconst dequeuedSegmentGroup = segmentGroups.dequeue();\n\n\t\tassert.equal(segmentGroups.size, segmentGroupCount - 1);\n\t\tassert.equal(dequeuedSegmentGroup?.segments.length, 1);\n\t\tassert.equal(dequeuedSegmentGroup.segments[0], segment);\n\t\tassert.equal(dequeuedSegmentGroup, segmentGroup);\n\t});\n\n\tit(\".copyTo\", () => {\n\t\tconst segmentGroupCount = 6;\n\t\twhile (segmentGroups.size < segmentGroupCount) {\n\t\t\tsegmentGroups.enqueue({ segments: [], localSeq: 1, refSeq: 0 });\n\t\t}\n\n\t\tconst segmentCopy = TextSegment.make(\"\");\n\t\tconst segmentGroupCopy = new SegmentGroupCollection(segmentCopy);\n\t\tsegmentGroups.copyTo(segmentGroupCopy);\n\n\t\tassert.equal(segmentGroups.size, segmentGroupCount);\n\t\tassert.equal(segmentGroupCopy.size, segmentGroupCount);\n\n\t\twhile (!segmentGroups.empty || !segmentGroupCopy.empty) {\n\t\t\tconst segmentGroup = segmentGroups.dequeue();\n\t\t\tconst copySegmentGroup = segmentGroupCopy.dequeue();\n\n\t\t\tassert.equal(segmentGroup, copySegmentGroup);\n\t\t\tassert.equal(segmentGroup?.segments.length, 2);\n\t\t\tassert.equal(segmentGroup.segments[0], segment);\n\t\t\tassert.equal(segmentGroup.segments[1], segmentCopy);\n\t\t}\n\t});\n});\n"]}
1
+ {"version":3,"file":"segmentGroupCollection.spec.js","sourceRoot":"","sources":["../../src/test/segmentGroupCollection.spec.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { strict as assert } from \"node:assert\";\n\nimport { assignChild, MergeBlock, type ISegmentPrivate } from \"../mergeTreeNodes.js\";\nimport { SegmentGroupCollection } from \"../segmentGroupCollection.js\";\nimport { IInsertionInfo, overwriteInfo } from \"../segmentInfos.js\";\nimport { TextSegment } from \"../textSegment.js\";\n\ndescribe(\"segmentGroupCollection\", () => {\n\tlet parent: MergeBlock;\n\tlet segment: ISegmentPrivate;\n\tlet segmentGroups: SegmentGroupCollection;\n\tbeforeEach(() => {\n\t\tparent = new MergeBlock(1);\n\t\tconst newSeg = (segment = overwriteInfo<IInsertionInfo>(TextSegment.make(\"abc\"), {\n\t\t\tclientId: 0,\n\t\t\tseq: 1,\n\t\t}));\n\t\tassignChild(parent, newSeg, 0);\n\n\t\tsegmentGroups = segment.segmentGroups = new SegmentGroupCollection(newSeg);\n\t});\n\tit(\".empty\", () => {\n\t\tassert(segmentGroups.empty);\n\t});\n\n\tit(\".size\", () => {\n\t\tassert.equal(segmentGroups.size, 0);\n\t});\n\n\tit(\".enqueue\", () => {\n\t\tconst segmentGroup = { segments: [], localSeq: 1, refSeq: 0 };\n\t\tsegmentGroups.enqueue(segmentGroup);\n\n\t\tassert(!segmentGroups.empty);\n\t\tassert.equal(segmentGroups.size, 1);\n\t\tassert.equal(segmentGroup.segments.length, 1);\n\t\tassert.equal(segmentGroup.segments[0], segment);\n\t});\n\n\tit(\".dequeue\", () => {\n\t\tconst segmentGroup = { segments: [], localSeq: 1, refSeq: 0 };\n\t\tsegmentGroups.enqueue(segmentGroup);\n\t\tconst segmentGroupCount = 6;\n\t\twhile (segmentGroups.size < segmentGroupCount) {\n\t\t\tsegmentGroups.enqueue({ segments: [], localSeq: 1, refSeq: 0 });\n\t\t}\n\n\t\tconst dequeuedSegmentGroup = segmentGroups.dequeue();\n\n\t\tassert.equal(segmentGroups.size, segmentGroupCount - 1);\n\t\tassert.equal(dequeuedSegmentGroup?.segments.length, 1);\n\t\tassert.equal(dequeuedSegmentGroup.segments[0], segment);\n\t\tassert.equal(dequeuedSegmentGroup, segmentGroup);\n\t});\n\n\tit(\".copyTo\", () => {\n\t\tconst segmentGroupCount = 6;\n\t\twhile (segmentGroups.size < segmentGroupCount) {\n\t\t\tsegmentGroups.enqueue({ segments: [], localSeq: 1, refSeq: 0 });\n\t\t}\n\n\t\tconst segmentCopy = overwriteInfo<IInsertionInfo>(TextSegment.make(\"\"), {\n\t\t\tclientId: 0,\n\t\t\tseq: 1,\n\t\t});\n\t\tassignChild(parent, segmentCopy, parent.childCount++);\n\n\t\tconst segmentGroupCopy = new SegmentGroupCollection(segmentCopy);\n\t\tsegmentGroups.copyTo(segmentGroupCopy);\n\n\t\tassert.equal(segmentGroups.size, segmentGroupCount);\n\t\tassert.equal(segmentGroupCopy.size, segmentGroupCount);\n\n\t\twhile (!segmentGroups.empty || !segmentGroupCopy.empty) {\n\t\t\tconst segmentGroup = segmentGroups.dequeue();\n\t\t\tconst copySegmentGroup = segmentGroupCopy.dequeue();\n\n\t\t\tassert.equal(segmentGroup, copySegmentGroup);\n\t\t\tassert.equal(segmentGroup?.segments.length, 2);\n\t\t\tassert.equal(segmentGroup.segments[0], segment);\n\t\t\tassert.equal(segmentGroup.segments[1], segmentCopy);\n\t\t}\n\t});\n});\n"]}
@@ -4,7 +4,7 @@
4
4
  */
5
5
  import { ISummaryTree } from "@fluidframework/driver-definitions";
6
6
  import { type IMergeTreeOptionsInternal } from "../mergeTree.js";
7
- import { type ISegmentLeaf } from "../mergeTreeNodes.js";
7
+ import { type ISegmentPrivate } from "../mergeTreeNodes.js";
8
8
  import { PropertySet } from "../properties.js";
9
9
  import { TestClient } from "./testClient.js";
10
10
  export declare function loadSnapshot(summary: ISummaryTree, options?: IMergeTreeOptionsInternal): Promise<TestClient>;
@@ -28,6 +28,6 @@ export declare class TestString {
28
28
  getText(): string;
29
29
  applyPendingOps(): void;
30
30
  private queue;
31
- getSegment(pos: number): ISegmentLeaf;
31
+ getSegment(pos: number): ISegmentPrivate;
32
32
  }
33
33
  //# sourceMappingURL=snapshot.utils.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"snapshot.utils.d.ts","sourceRoot":"","sources":["../../src/test/snapshot.utils.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAOH,OAAO,EAAE,YAAY,EAAE,MAAM,oCAAoC,CAAC;AAIlE,OAAO,EAAE,KAAK,yBAAyB,EAAE,MAAM,iBAAiB,CAAC;AACjE,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEzD,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAG/C,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAK7C,wBAAsB,YAAY,CACjC,OAAO,EAAE,YAAY,EACrB,OAAO,CAAC,EAAE,yBAAyB,GACjC,OAAO,CAAC,UAAU,CAAC,CAerB;AAGD,qBAAa,UAAU;IAQrB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC;IAP1B,OAAO,CAAC,MAAM,CAAa;IAC3B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAmC;IAC3D,OAAO,CAAC,GAAG,CAAK;IAChB,OAAO,CAAC,MAAM,CAAK;gBAGlB,EAAE,EAAE,MAAM,EACO,OAAO,CAAC,uCAA2B,EACpD,YAAY,GAAE,MAAW;IAMnB,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO,GAAG,IAAI;IAO7D,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,OAAO,GAAG,IAAI;IAIpF,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO,GAAG,IAAI;IAIhD,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO,GAAG,IAAI;IASrD,YAAY,CAAC,WAAW,EAAE,OAAO,GAAG,IAAI;IAIxC,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO,GAAG,IAAI;IAInE,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO,GAAG,IAAI;IAOjE,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAWvC,aAAa,CAAC,OAAO,CAAC,EAAE,yBAAyB,GAAG,OAAO,CAAC,IAAI,CAAC;IA8BvE,UAAU,IAAI,YAAY;IAS1B,OAAO,IAAI,MAAM;IAIjB,eAAe,IAAI,IAAI;IAO9B,OAAO,CAAC,KAAK;IAeN,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,YAAY;CAK5C"}
1
+ {"version":3,"file":"snapshot.utils.d.ts","sourceRoot":"","sources":["../../src/test/snapshot.utils.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAOH,OAAO,EAAE,YAAY,EAAE,MAAM,oCAAoC,CAAC;AAIlE,OAAO,EAAE,KAAK,yBAAyB,EAAE,MAAM,iBAAiB,CAAC;AACjE,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAE5D,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAG/C,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAK7C,wBAAsB,YAAY,CACjC,OAAO,EAAE,YAAY,EACrB,OAAO,CAAC,EAAE,yBAAyB,GACjC,OAAO,CAAC,UAAU,CAAC,CAerB;AAGD,qBAAa,UAAU;IAQrB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC;IAP1B,OAAO,CAAC,MAAM,CAAa;IAC3B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAmC;IAC3D,OAAO,CAAC,GAAG,CAAK;IAChB,OAAO,CAAC,MAAM,CAAK;gBAGlB,EAAE,EAAE,MAAM,EACO,OAAO,CAAC,uCAA2B,EACpD,YAAY,GAAE,MAAW;IAMnB,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO,GAAG,IAAI;IAO7D,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,OAAO,GAAG,IAAI;IAIpF,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO,GAAG,IAAI;IAIhD,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO,GAAG,IAAI;IASrD,YAAY,CAAC,WAAW,EAAE,OAAO,GAAG,IAAI;IAIxC,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO,GAAG,IAAI;IAInE,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO,GAAG,IAAI;IAOjE,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAWvC,aAAa,CAAC,OAAO,CAAC,EAAE,yBAAyB,GAAG,OAAO,CAAC,IAAI,CAAC;IA8BvE,UAAU,IAAI,YAAY;IAS1B,OAAO,IAAI,MAAM;IAIjB,eAAe,IAAI,IAAI;IAO9B,OAAO,CAAC,KAAK;IAeN,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,eAAe;CAK/C"}
@@ -1 +1 @@
1
- {"version":3,"file":"snapshot.utils.js","sourceRoot":"","sources":["../../src/test/snapshot.utils.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\n/* eslint-disable @typescript-eslint/no-non-null-assertion */\n\nimport { strict as assert } from \"node:assert\";\n\nimport { IFluidDataStoreRuntime } from \"@fluidframework/datastore-definitions/internal\";\nimport { ISummaryTree } from \"@fluidframework/driver-definitions\";\nimport { ISequencedDocumentMessage } from \"@fluidframework/driver-definitions/internal\";\nimport { MockStorage } from \"@fluidframework/test-runtime-utils/internal\";\n\nimport { type IMergeTreeOptionsInternal } from \"../mergeTree.js\";\nimport { type ISegmentLeaf } from \"../mergeTreeNodes.js\";\nimport { IMergeTreeOp, ReferenceType } from \"../ops.js\";\nimport { PropertySet } from \"../properties.js\";\nimport { SnapshotV1 } from \"../snapshotV1.js\";\n\nimport { TestClient } from \"./testClient.js\";\nimport { createClientsAtInitialState } from \"./testClientLogger.js\";\nimport { TestSerializer } from \"./testSerializer.js\";\n\n// Reconstitutes a MergeTree client from a summary\nexport async function loadSnapshot(\n\tsummary: ISummaryTree,\n\toptions?: IMergeTreeOptionsInternal,\n): Promise<TestClient> {\n\tconst services = MockStorage.createFromSummary(summary);\n\tconst client2 = new TestClient(options);\n\tconst runtime: Partial<IFluidDataStoreRuntime> = {\n\t\tlogger: client2.logger,\n\t\tclientId: \"1\",\n\t};\n\n\tconst { catchupOpsP } = await client2.load(\n\t\truntime as IFluidDataStoreRuntime,\n\t\tservices,\n\t\tnew TestSerializer(),\n\t);\n\tawait catchupOpsP;\n\treturn client2;\n}\n\n// Wrapper around MergeTree client that provides a convenient SharedString-like API for tests.\nexport class TestString {\n\tprivate client: TestClient;\n\tprivate readonly pending: ISequencedDocumentMessage[] = [];\n\tprivate seq = 0;\n\tprivate minSeq = 0;\n\n\tconstructor(\n\t\tid: string,\n\t\tprivate readonly options?: IMergeTreeOptionsInternal,\n\t\tinitialState: string = \"\",\n\t) {\n\t\tthis.client = createClientsAtInitialState({ initialState, options }, id)[id]!;\n\t\tthis.client.startOrUpdateCollaboration(id);\n\t}\n\n\tpublic insert(pos: number, text: string, increaseMsn: boolean): void {\n\t\tthis.queue(\n\t\t\tthis.client.insertTextLocal(pos, text, { segment: this.pending.length })!,\n\t\t\tincreaseMsn,\n\t\t);\n\t}\n\n\tpublic annotate(start: number, end: number, props: PropertySet, increaseMsn: boolean): void {\n\t\tthis.queue(this.client.annotateRangeLocal(start, end, props)!, increaseMsn);\n\t}\n\n\tpublic append(text: string, increaseMsn: boolean): void {\n\t\tthis.insert(this.client.getLength(), text, increaseMsn);\n\t}\n\n\tpublic insertMarker(pos: number, increaseMsn: boolean): void {\n\t\tthis.queue(\n\t\t\tthis.client.insertMarkerLocal(pos, ReferenceType.Simple, {\n\t\t\t\tsegment: this.pending.length,\n\t\t\t})!,\n\t\t\tincreaseMsn,\n\t\t);\n\t}\n\n\tpublic appendMarker(increaseMsn: boolean): void {\n\t\tthis.insertMarker(this.client.getLength(), increaseMsn);\n\t}\n\n\tpublic removeRange(start: number, end: number, increaseMsn: boolean): void {\n\t\tthis.queue(this.client.removeRangeLocal(start, end)!, increaseMsn);\n\t}\n\n\tpublic obliterateRange(start: number, end: number, increaseMsn: boolean): void {\n\t\tthis.queue(this.client.obliterateRangeLocal(start, end)!, increaseMsn);\n\t}\n\n\t// Ensures the client's text matches the `expected` string and round-trips through a snapshot\n\t// into a new client. The current client is then replaced with the loaded client in the hope\n\t// that it will help detect corruption bugs as further ops are applied.\n\tpublic async expect(expected: string): Promise<void> {\n\t\tassert.equal(\n\t\t\tthis.client.getText(),\n\t\t\texpected,\n\t\t\t\"MergeTree must contain the expected text prior to applying ops.\",\n\t\t);\n\n\t\tawait this.checkSnapshot(this.options);\n\t}\n\n\t// Ensures the MergeTree client's contents successfully roundtrip through a snapshot.\n\tpublic async checkSnapshot(options?: IMergeTreeOptionsInternal): Promise<void> {\n\t\tthis.applyPendingOps();\n\t\tconst expectedAttributionKeys = this.client.getAllAttributionSeqs();\n\t\tconst summary = this.getSummary();\n\t\tconst client2 = await loadSnapshot(summary, options ?? this.options);\n\n\t\tassert.equal(\n\t\t\tthis.client.getText(),\n\t\t\tclient2.getText(),\n\t\t\t\"Snapshot must produce a MergeTree with the same text as the original\",\n\t\t);\n\n\t\t// Also check the length as weak test for non-TextSegments.\n\t\tassert.equal(\n\t\t\tthis.client.getLength(),\n\t\t\tclient2.getLength(),\n\t\t\t\"Snapshot must produce a MergeTree with the same length as the original\",\n\t\t);\n\n\t\tconst actualAttributionKeys = client2.getAllAttributionSeqs();\n\t\tassert.deepEqual(\n\t\t\tactualAttributionKeys,\n\t\t\texpectedAttributionKeys,\n\t\t\t\"Snapshot must produce a MergeTree with identical attribution as the original\",\n\t\t);\n\n\t\t// Replace our client with the one loaded by the snapshot.\n\t\tthis.client = client2;\n\t}\n\n\tpublic getSummary(): ISummaryTree {\n\t\tconst snapshot = new SnapshotV1(this.client.mergeTree, this.client.logger, (id) =>\n\t\t\tthis.client.getLongClientId(id),\n\t\t);\n\n\t\tsnapshot.extractSync();\n\t\treturn snapshot.emit(TestClient.serializer, undefined!).summary;\n\t}\n\n\tpublic getText(): string {\n\t\treturn this.client.getText();\n\t}\n\n\tpublic applyPendingOps(): void {\n\t\tfor (const msg of this.pending) {\n\t\t\tthis.client.applyMsg(msg);\n\t\t}\n\t\tthis.pending.splice(0, this.pending.length);\n\t}\n\n\tprivate queue(op: IMergeTreeOp, increaseMsn: boolean): void {\n\t\tconst refSeq = this.seq;\n\t\tconst seq = ++this.seq;\n\n\t\tthis.pending.push(\n\t\t\tthis.client.makeOpMessage(\n\t\t\t\top,\n\t\t\t\tseq,\n\t\t\t\trefSeq,\n\t\t\t\tthis.client.longClientId,\n\t\t\t\t(this.minSeq = increaseMsn ? seq : this.minSeq),\n\t\t\t),\n\t\t);\n\t}\n\n\tpublic getSegment(pos: number): ISegmentLeaf {\n\t\tconst { segment } = this.client.getContainingSegment<ISegmentLeaf>(pos);\n\t\tassert(segment !== undefined);\n\t\treturn segment;\n\t}\n}\n"]}
1
+ {"version":3,"file":"snapshot.utils.js","sourceRoot":"","sources":["../../src/test/snapshot.utils.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\n/* eslint-disable @typescript-eslint/no-non-null-assertion */\n\nimport { strict as assert } from \"node:assert\";\n\nimport { IFluidDataStoreRuntime } from \"@fluidframework/datastore-definitions/internal\";\nimport { ISummaryTree } from \"@fluidframework/driver-definitions\";\nimport { ISequencedDocumentMessage } from \"@fluidframework/driver-definitions/internal\";\nimport { MockStorage } from \"@fluidframework/test-runtime-utils/internal\";\n\nimport { type IMergeTreeOptionsInternal } from \"../mergeTree.js\";\nimport { type ISegmentPrivate } from \"../mergeTreeNodes.js\";\nimport { IMergeTreeOp, ReferenceType } from \"../ops.js\";\nimport { PropertySet } from \"../properties.js\";\nimport { SnapshotV1 } from \"../snapshotV1.js\";\n\nimport { TestClient } from \"./testClient.js\";\nimport { createClientsAtInitialState } from \"./testClientLogger.js\";\nimport { TestSerializer } from \"./testSerializer.js\";\n\n// Reconstitutes a MergeTree client from a summary\nexport async function loadSnapshot(\n\tsummary: ISummaryTree,\n\toptions?: IMergeTreeOptionsInternal,\n): Promise<TestClient> {\n\tconst services = MockStorage.createFromSummary(summary);\n\tconst client2 = new TestClient(options);\n\tconst runtime: Partial<IFluidDataStoreRuntime> = {\n\t\tlogger: client2.logger,\n\t\tclientId: \"1\",\n\t};\n\n\tconst { catchupOpsP } = await client2.load(\n\t\truntime as IFluidDataStoreRuntime,\n\t\tservices,\n\t\tnew TestSerializer(),\n\t);\n\tawait catchupOpsP;\n\treturn client2;\n}\n\n// Wrapper around MergeTree client that provides a convenient SharedString-like API for tests.\nexport class TestString {\n\tprivate client: TestClient;\n\tprivate readonly pending: ISequencedDocumentMessage[] = [];\n\tprivate seq = 0;\n\tprivate minSeq = 0;\n\n\tconstructor(\n\t\tid: string,\n\t\tprivate readonly options?: IMergeTreeOptionsInternal,\n\t\tinitialState: string = \"\",\n\t) {\n\t\tthis.client = createClientsAtInitialState({ initialState, options }, id)[id]!;\n\t\tthis.client.startOrUpdateCollaboration(id);\n\t}\n\n\tpublic insert(pos: number, text: string, increaseMsn: boolean): void {\n\t\tthis.queue(\n\t\t\tthis.client.insertTextLocal(pos, text, { segment: this.pending.length })!,\n\t\t\tincreaseMsn,\n\t\t);\n\t}\n\n\tpublic annotate(start: number, end: number, props: PropertySet, increaseMsn: boolean): void {\n\t\tthis.queue(this.client.annotateRangeLocal(start, end, props)!, increaseMsn);\n\t}\n\n\tpublic append(text: string, increaseMsn: boolean): void {\n\t\tthis.insert(this.client.getLength(), text, increaseMsn);\n\t}\n\n\tpublic insertMarker(pos: number, increaseMsn: boolean): void {\n\t\tthis.queue(\n\t\t\tthis.client.insertMarkerLocal(pos, ReferenceType.Simple, {\n\t\t\t\tsegment: this.pending.length,\n\t\t\t})!,\n\t\t\tincreaseMsn,\n\t\t);\n\t}\n\n\tpublic appendMarker(increaseMsn: boolean): void {\n\t\tthis.insertMarker(this.client.getLength(), increaseMsn);\n\t}\n\n\tpublic removeRange(start: number, end: number, increaseMsn: boolean): void {\n\t\tthis.queue(this.client.removeRangeLocal(start, end)!, increaseMsn);\n\t}\n\n\tpublic obliterateRange(start: number, end: number, increaseMsn: boolean): void {\n\t\tthis.queue(this.client.obliterateRangeLocal(start, end)!, increaseMsn);\n\t}\n\n\t// Ensures the client's text matches the `expected` string and round-trips through a snapshot\n\t// into a new client. The current client is then replaced with the loaded client in the hope\n\t// that it will help detect corruption bugs as further ops are applied.\n\tpublic async expect(expected: string): Promise<void> {\n\t\tassert.equal(\n\t\t\tthis.client.getText(),\n\t\t\texpected,\n\t\t\t\"MergeTree must contain the expected text prior to applying ops.\",\n\t\t);\n\n\t\tawait this.checkSnapshot(this.options);\n\t}\n\n\t// Ensures the MergeTree client's contents successfully roundtrip through a snapshot.\n\tpublic async checkSnapshot(options?: IMergeTreeOptionsInternal): Promise<void> {\n\t\tthis.applyPendingOps();\n\t\tconst expectedAttributionKeys = this.client.getAllAttributionSeqs();\n\t\tconst summary = this.getSummary();\n\t\tconst client2 = await loadSnapshot(summary, options ?? this.options);\n\n\t\tassert.equal(\n\t\t\tthis.client.getText(),\n\t\t\tclient2.getText(),\n\t\t\t\"Snapshot must produce a MergeTree with the same text as the original\",\n\t\t);\n\n\t\t// Also check the length as weak test for non-TextSegments.\n\t\tassert.equal(\n\t\t\tthis.client.getLength(),\n\t\t\tclient2.getLength(),\n\t\t\t\"Snapshot must produce a MergeTree with the same length as the original\",\n\t\t);\n\n\t\tconst actualAttributionKeys = client2.getAllAttributionSeqs();\n\t\tassert.deepEqual(\n\t\t\tactualAttributionKeys,\n\t\t\texpectedAttributionKeys,\n\t\t\t\"Snapshot must produce a MergeTree with identical attribution as the original\",\n\t\t);\n\n\t\t// Replace our client with the one loaded by the snapshot.\n\t\tthis.client = client2;\n\t}\n\n\tpublic getSummary(): ISummaryTree {\n\t\tconst snapshot = new SnapshotV1(this.client.mergeTree, this.client.logger, (id) =>\n\t\t\tthis.client.getLongClientId(id),\n\t\t);\n\n\t\tsnapshot.extractSync();\n\t\treturn snapshot.emit(TestClient.serializer, undefined!).summary;\n\t}\n\n\tpublic getText(): string {\n\t\treturn this.client.getText();\n\t}\n\n\tpublic applyPendingOps(): void {\n\t\tfor (const msg of this.pending) {\n\t\t\tthis.client.applyMsg(msg);\n\t\t}\n\t\tthis.pending.splice(0, this.pending.length);\n\t}\n\n\tprivate queue(op: IMergeTreeOp, increaseMsn: boolean): void {\n\t\tconst refSeq = this.seq;\n\t\tconst seq = ++this.seq;\n\n\t\tthis.pending.push(\n\t\t\tthis.client.makeOpMessage(\n\t\t\t\top,\n\t\t\t\tseq,\n\t\t\t\trefSeq,\n\t\t\t\tthis.client.longClientId,\n\t\t\t\t(this.minSeq = increaseMsn ? seq : this.minSeq),\n\t\t\t),\n\t\t);\n\t}\n\n\tpublic getSegment(pos: number): ISegmentPrivate {\n\t\tconst { segment } = this.client.getContainingSegment<ISegmentPrivate>(pos);\n\t\tassert(segment !== undefined);\n\t\treturn segment;\n\t}\n}\n"]}
@@ -7,6 +7,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
7
7
  const node_assert_1 = require("node:assert");
8
8
  const mergeTreeTracking_js_1 = require("../mergeTreeTracking.js");
9
9
  const ops_js_1 = require("../ops.js");
10
+ const segmentInfos_js_1 = require("../segmentInfos.js");
10
11
  const sortedSegmentSet_js_1 = require("../sortedSegmentSet.js");
11
12
  const testClient_js_1 = require("./testClient.js");
12
13
  const segmentCount = 15;
@@ -57,7 +58,7 @@ describe("SortedSegmentSet", () => {
57
58
  }
58
59
  }
59
60
  node_assert_1.strict.equal(set.size, client.getLength() * 2);
60
- validateSet(client, set, (i) => i.segment.ordinal);
61
+ validateSet(client, set, (i) => (0, segmentInfos_js_1.toMergeNodeInfo)(i.segment)?.ordinal);
61
62
  });
62
63
  it("SortedSegmentSet of segments", () => {
63
64
  const set = new sortedSegmentSet_js_1.SortedSegmentSet();
@@ -70,7 +71,7 @@ describe("SortedSegmentSet", () => {
70
71
  }
71
72
  }
72
73
  node_assert_1.strict.equal(set.size, segmentCount);
73
- validateSet(client, set, (i) => i.ordinal);
74
+ validateSet(client, set, (i) => (0, segmentInfos_js_1.toMergeNodeInfo)(i)?.ordinal);
74
75
  });
75
76
  it("SortedSegmentSet of local references", () => {
76
77
  // using a sorted segment set directly creates problems,
@@ -93,7 +94,7 @@ describe("SortedSegmentSet", () => {
93
94
  // Cast to any because we are validating a set of local references, but the instantiated type of trackedSet
94
95
  // on TrackingGroup is SortedSegmentSet<Trackable>.
95
96
  // eslint-disable-next-line @typescript-eslint/no-unsafe-argument, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-explicit-any
96
- set.trackedSet, (i) => i.getSegment()?.ordinal);
97
+ set.trackedSet, (i) => (0, segmentInfos_js_1.toMergeNodeInfo)(i.getSegment())?.ordinal);
97
98
  });
98
99
  });
99
100
  //# sourceMappingURL=sortedSegmentSet.spec.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"sortedSegmentSet.spec.js","sourceRoot":"","sources":["../../src/test/sortedSegmentSet.spec.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { strict as assert } from \"node:assert\";\n\nimport { LocalReferencePosition } from \"../localReference.js\";\nimport { ISegment, type ISegmentLeaf } from \"../mergeTreeNodes.js\";\nimport { TrackingGroup } from \"../mergeTreeTracking.js\";\nimport { ReferenceType } from \"../ops.js\";\nimport { SortedSegmentSet, SortedSegmentSetItem } from \"../sortedSegmentSet.js\";\n\nimport { TestClient } from \"./testClient.js\";\nconst segmentCount = 15;\n\nfunction validateSorted<T extends SortedSegmentSetItem>(\n\tset: SortedSegmentSet<T>,\n\tgetOrdinal: (item: T) => string | undefined,\n\tprefix: string,\n): void {\n\tfor (let i = 0; i < set.size - 1; i++) {\n\t\tconst a = getOrdinal(set.items[i]);\n\t\tconst b = getOrdinal(set.items[i + 1]);\n\t\tassert(a !== undefined, `${prefix}: Undefined ordinal ${i}`);\n\t\tassert(b !== undefined, `${prefix}: Undefined ordinal ${i + 1}`);\n\t\tassert(a <= b, `${prefix}: Not sorted at item ${i}`);\n\t}\n}\n\nfunction validateSet<T extends SortedSegmentSetItem>(\n\tclient: TestClient,\n\tset: SortedSegmentSet<T>,\n\tgetOrdinal: (item: T) => string | undefined,\n): void {\n\tvalidateSorted(set, getOrdinal, \"initial\");\n\n\t// add content to shift ordinals in tree\n\tfor (let i = 0; i < segmentCount * 5; i++) {\n\t\tclient.insertTextLocal((i * 3) % client.getLength(), `X`);\n\t}\n\tvalidateSorted(set, getOrdinal, \"after insert\");\n\n\tfor (let i = set.size; set.size > 0; i += set.size) {\n\t\t// jump around the list a bit, so its not just an in-order remove\n\t\tconst item = set.items[i % set.size];\n\t\tassert.equal(set.remove(item), true, \"remove failed\");\n\t\tassert.equal(set.has(item), false);\n\t\tvalidateSorted(set, getOrdinal, \"during remove\");\n\t}\n}\n\ndescribe(\"SortedSegmentSet\", () => {\n\tconst localUserLongId = \"localUser\";\n\tlet client: TestClient;\n\tbeforeEach(() => {\n\t\tclient = new TestClient();\n\t\tfor (let i = 0; i < segmentCount; i++) {\n\t\t\tclient.insertTextLocal(client.getLength(), i.toString()[0].repeat(i + 1));\n\t\t}\n\t\tclient.startOrUpdateCollaboration(localUserLongId);\n\t});\n\n\tit(\"SortedSegmentSet of objects with segments\", () => {\n\t\tconst set = new SortedSegmentSet<{ segment: ISegment }>();\n\t\tfor (let i = 0; i < client.getLength(); i++) {\n\t\t\tfor (const pos of [i, client.getLength() - 1 - i]) {\n\t\t\t\tconst segment = client.getContainingSegment<ISegmentLeaf>(pos).segment;\n\t\t\t\tassert(segment);\n\t\t\t\tconst item = { segment };\n\t\t\t\tassert.equal(set.has(item), false);\n\t\t\t\tset.addOrUpdate(item);\n\t\t\t\tassert.equal(set.has(item), true);\n\t\t\t}\n\t\t}\n\t\tassert.equal(set.size, client.getLength() * 2);\n\t\tvalidateSet(client, set, (i) => i.segment.ordinal);\n\t});\n\n\tit(\"SortedSegmentSet of segments\", () => {\n\t\tconst set = new SortedSegmentSet();\n\t\tfor (let i = 0; i < client.getLength(); i++) {\n\t\t\tfor (const pos of [i, client.getLength() - 1 - i]) {\n\t\t\t\tconst segment = client.getContainingSegment<ISegmentLeaf>(pos).segment;\n\t\t\t\tassert(segment);\n\t\t\t\tset.addOrUpdate(segment);\n\t\t\t\tassert.equal(set.has(segment), true);\n\t\t\t}\n\t\t}\n\t\tassert.equal(set.size, segmentCount);\n\t\tvalidateSet(client, set, (i) => i.ordinal);\n\t});\n\n\tit(\"SortedSegmentSet of local references\", () => {\n\t\t// using a sorted segment set directly creates problems,\n\t\t// as we don't correctly split, or merge, so leverage\n\t\t// the tracking group for correct behavior in those case\n\t\t// and spy it's internal set\n\t\tconst set = new TrackingGroup();\n\t\tfor (let i = 0; i < client.getLength(); i++) {\n\t\t\tfor (const pos of [i, client.getLength() - 1 - i]) {\n\t\t\t\tconst segmentInfo = client.getContainingSegment<ISegmentLeaf>(pos);\n\t\t\t\tassert(segmentInfo?.segment);\n\t\t\t\tconst lref = client.createLocalReferencePosition(\n\t\t\t\t\tsegmentInfo.segment,\n\t\t\t\t\tsegmentInfo.offset,\n\t\t\t\t\tReferenceType.SlideOnRemove,\n\t\t\t\t\tundefined,\n\t\t\t\t);\n\t\t\t\tassert.equal(set.has(lref), false);\n\t\t\t\tset.link(lref);\n\t\t\t\tassert.equal(set.has(lref), true);\n\t\t\t}\n\t\t}\n\t\tassert.equal(set.size, client.getLength() * 2);\n\t\tvalidateSet<LocalReferencePosition>(\n\t\t\tclient,\n\t\t\t// Cast to any because we are validating a set of local references, but the instantiated type of trackedSet\n\t\t\t// on TrackingGroup is SortedSegmentSet<Trackable>.\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-argument, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-explicit-any\n\t\t\t(set as any).trackedSet,\n\t\t\t(i) => i.getSegment()?.ordinal,\n\t\t);\n\t});\n});\n"]}
1
+ {"version":3,"file":"sortedSegmentSet.spec.js","sourceRoot":"","sources":["../../src/test/sortedSegmentSet.spec.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { strict as assert } from \"node:assert\";\n\nimport { LocalReferencePosition } from \"../localReference.js\";\nimport { ISegment, type ISegmentPrivate } from \"../mergeTreeNodes.js\";\nimport { TrackingGroup } from \"../mergeTreeTracking.js\";\nimport { ReferenceType } from \"../ops.js\";\nimport { toMergeNodeInfo } from \"../segmentInfos.js\";\nimport { SortedSegmentSet, SortedSegmentSetItem } from \"../sortedSegmentSet.js\";\n\nimport { TestClient } from \"./testClient.js\";\nconst segmentCount = 15;\n\nfunction validateSorted<T extends SortedSegmentSetItem>(\n\tset: SortedSegmentSet<T>,\n\tgetOrdinal: (item: T) => string | undefined,\n\tprefix: string,\n): void {\n\tfor (let i = 0; i < set.size - 1; i++) {\n\t\tconst a = getOrdinal(set.items[i]);\n\t\tconst b = getOrdinal(set.items[i + 1]);\n\t\tassert(a !== undefined, `${prefix}: Undefined ordinal ${i}`);\n\t\tassert(b !== undefined, `${prefix}: Undefined ordinal ${i + 1}`);\n\t\tassert(a <= b, `${prefix}: Not sorted at item ${i}`);\n\t}\n}\n\nfunction validateSet<T extends SortedSegmentSetItem>(\n\tclient: TestClient,\n\tset: SortedSegmentSet<T>,\n\tgetOrdinal: (item: T) => string | undefined,\n): void {\n\tvalidateSorted(set, getOrdinal, \"initial\");\n\n\t// add content to shift ordinals in tree\n\tfor (let i = 0; i < segmentCount * 5; i++) {\n\t\tclient.insertTextLocal((i * 3) % client.getLength(), `X`);\n\t}\n\tvalidateSorted(set, getOrdinal, \"after insert\");\n\n\tfor (let i = set.size; set.size > 0; i += set.size) {\n\t\t// jump around the list a bit, so its not just an in-order remove\n\t\tconst item = set.items[i % set.size];\n\t\tassert.equal(set.remove(item), true, \"remove failed\");\n\t\tassert.equal(set.has(item), false);\n\t\tvalidateSorted(set, getOrdinal, \"during remove\");\n\t}\n}\n\ndescribe(\"SortedSegmentSet\", () => {\n\tconst localUserLongId = \"localUser\";\n\tlet client: TestClient;\n\tbeforeEach(() => {\n\t\tclient = new TestClient();\n\t\tfor (let i = 0; i < segmentCount; i++) {\n\t\t\tclient.insertTextLocal(client.getLength(), i.toString()[0].repeat(i + 1));\n\t\t}\n\t\tclient.startOrUpdateCollaboration(localUserLongId);\n\t});\n\n\tit(\"SortedSegmentSet of objects with segments\", () => {\n\t\tconst set = new SortedSegmentSet<{ segment: ISegment }>();\n\t\tfor (let i = 0; i < client.getLength(); i++) {\n\t\t\tfor (const pos of [i, client.getLength() - 1 - i]) {\n\t\t\t\tconst segment = client.getContainingSegment<ISegmentPrivate>(pos).segment;\n\t\t\t\tassert(segment);\n\t\t\t\tconst item = { segment };\n\t\t\t\tassert.equal(set.has(item), false);\n\t\t\t\tset.addOrUpdate(item);\n\t\t\t\tassert.equal(set.has(item), true);\n\t\t\t}\n\t\t}\n\t\tassert.equal(set.size, client.getLength() * 2);\n\t\tvalidateSet(client, set, (i) => toMergeNodeInfo(i.segment)?.ordinal);\n\t});\n\n\tit(\"SortedSegmentSet of segments\", () => {\n\t\tconst set = new SortedSegmentSet();\n\t\tfor (let i = 0; i < client.getLength(); i++) {\n\t\t\tfor (const pos of [i, client.getLength() - 1 - i]) {\n\t\t\t\tconst segment = client.getContainingSegment<ISegmentPrivate>(pos).segment;\n\t\t\t\tassert(segment);\n\t\t\t\tset.addOrUpdate(segment);\n\t\t\t\tassert.equal(set.has(segment), true);\n\t\t\t}\n\t\t}\n\t\tassert.equal(set.size, segmentCount);\n\t\tvalidateSet(client, set, (i) => toMergeNodeInfo(i)?.ordinal);\n\t});\n\n\tit(\"SortedSegmentSet of local references\", () => {\n\t\t// using a sorted segment set directly creates problems,\n\t\t// as we don't correctly split, or merge, so leverage\n\t\t// the tracking group for correct behavior in those case\n\t\t// and spy it's internal set\n\t\tconst set = new TrackingGroup();\n\t\tfor (let i = 0; i < client.getLength(); i++) {\n\t\t\tfor (const pos of [i, client.getLength() - 1 - i]) {\n\t\t\t\tconst segmentInfo = client.getContainingSegment<ISegmentPrivate>(pos);\n\t\t\t\tassert(segmentInfo?.segment);\n\t\t\t\tconst lref = client.createLocalReferencePosition(\n\t\t\t\t\tsegmentInfo.segment,\n\t\t\t\t\tsegmentInfo.offset,\n\t\t\t\t\tReferenceType.SlideOnRemove,\n\t\t\t\t\tundefined,\n\t\t\t\t);\n\t\t\t\tassert.equal(set.has(lref), false);\n\t\t\t\tset.link(lref);\n\t\t\t\tassert.equal(set.has(lref), true);\n\t\t\t}\n\t\t}\n\t\tassert.equal(set.size, client.getLength() * 2);\n\t\tvalidateSet<LocalReferencePosition>(\n\t\t\tclient,\n\t\t\t// Cast to any because we are validating a set of local references, but the instantiated type of trackedSet\n\t\t\t// on TrackingGroup is SortedSegmentSet<Trackable>.\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-argument, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-explicit-any\n\t\t\t(set as any).trackedSet,\n\t\t\t(i) => toMergeNodeInfo(i.getSegment())?.ordinal,\n\t\t);\n\t});\n});\n"]}
@@ -10,12 +10,12 @@ import { Client } from "../client.js";
10
10
  import { DoublyLinkedList } from "../collections/index.js";
11
11
  import { IMergeTreeOptions, ReferencePosition } from "../index.js";
12
12
  import { MergeTree } from "../mergeTree.js";
13
- import { ISegmentLeaf } from "../mergeTreeNodes.js";
13
+ import { ISegmentPrivate, type SegmentGroup } from "../mergeTreeNodes.js";
14
14
  import { IJSONSegment, IMarkerDef, IMergeTreeOp, ReferenceType, type IMergeTreeInsertMsg } from "../ops.js";
15
15
  import { PropertySet } from "../properties.js";
16
16
  import { MergeTreeRevertibleDriver } from "../revertibles.js";
17
17
  import { TestSerializer } from "./testSerializer.js";
18
- export declare function specToSegment(spec: IJSONSegment): ISegmentLeaf;
18
+ export declare function specToSegment(spec: IJSONSegment): ISegmentPrivate;
19
19
  export declare class TestClient extends Client {
20
20
  static searchChunkSize: number;
21
21
  static readonly serializer: TestSerializer;
@@ -30,9 +30,9 @@ export declare class TestClient extends Client {
30
30
  */
31
31
  static useCheckQ: boolean;
32
32
  static createFromClientSnapshot(client1: TestClient, newLongClientId: string): Promise<TestClient>;
33
- static createFromSnapshot(snapshotTree: ITree, newLongClientId: string, specToSeg: (spec: IJSONSegment) => ISegmentLeaf, options?: PropertySet): Promise<TestClient>;
34
- static createFromSummary(summaryTree: ISummaryTree, newLongClientId: string, specToSeg: (spec: IJSONSegment) => ISegmentLeaf, options?: PropertySet): Promise<TestClient>;
35
- static createFromStorage(storage: MockStorage, newLongClientId: string, specToSeg: (spec: IJSONSegment) => ISegmentLeaf, options?: PropertySet): Promise<TestClient>;
33
+ static createFromSnapshot(snapshotTree: ITree, newLongClientId: string, specToSeg: (spec: IJSONSegment) => ISegmentPrivate, options?: PropertySet): Promise<TestClient>;
34
+ static createFromSummary(summaryTree: ISummaryTree, newLongClientId: string, specToSeg: (spec: IJSONSegment) => ISegmentPrivate, options?: PropertySet): Promise<TestClient>;
35
+ static createFromStorage(storage: MockStorage, newLongClientId: string, specToSeg: (spec: IJSONSegment) => ISegmentPrivate, options?: PropertySet): Promise<TestClient>;
36
36
  readonly mergeTree: MergeTree;
37
37
  readonly checkQ: DoublyLinkedList<string>;
38
38
  protected readonly q: DoublyLinkedList<ISequencedDocumentMessage>;
@@ -68,7 +68,7 @@ export declare class TestClient extends Client {
68
68
  * slow-path computations in this function without leveraging the merge-tree's structure
69
69
  */
70
70
  rebasePosition(pos: number, seqNumberFrom: number, localSeq: number): number;
71
- findReconnectionPosition(segment: ISegmentLeaf, localSeq: number): number;
71
+ findReconnectionPosition(segment: ISegmentPrivate, localSeq: number): number;
72
72
  /**
73
73
  * Validates segments either all have attribution information or none of them.
74
74
  * If no segment has attribution information, returns undefined.
@@ -78,6 +78,8 @@ export declare class TestClient extends Client {
78
78
  * The `i`th entry of the array is the attribution key for the character at position `i`.
79
79
  */
80
80
  getAllAttributionSeqs(channel?: string): (number | AttributionKey | undefined)[];
81
+ peekPendingSegmentGroups(): SegmentGroup | undefined;
82
+ peekPendingSegmentGroups(count: number): SegmentGroup | SegmentGroup[] | undefined;
81
83
  /**
82
84
  * Override and add some test only metrics
83
85
  */
@@ -1 +1 @@
1
- {"version":3,"file":"testClient.d.ts","sourceRoot":"","sources":["../../src/test/testClient.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"testClient.d.ts","sourceRoot":"","sources":["../../src/test/testClient.ts"],"names":[],"mappings":"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"}
@@ -21,6 +21,7 @@ const mergeTreeNodes_js_1 = require("../mergeTreeNodes.js");
21
21
  const opBuilder_js_1 = require("../opBuilder.js");
22
22
  const ops_js_1 = require("../ops.js");
23
23
  const referencePositions_js_1 = require("../referencePositions.js");
24
+ const segmentInfos_js_1 = require("../segmentInfos.js");
24
25
  const snapshotlegacy_js_1 = require("../snapshotlegacy.js");
25
26
  const textSegment_js_1 = require("../textSegment.js");
26
27
  const testSerializer_js_1 = require("./testSerializer.js");
@@ -78,8 +79,7 @@ class TestClient extends client_js_1.Client {
78
79
  // assert.notEqual(d.deltaSegments.length, 0);
79
80
  for (const s of d.deltaSegments) {
80
81
  if (d.operation === ops_js_1.MergeTreeDeltaType.INSERT) {
81
- const seg = s.segment;
82
- node_assert_1.strict.notEqual(seg.parent, undefined);
82
+ (0, segmentInfos_js_1.assertMergeNode)(s.segment);
83
83
  }
84
84
  }
85
85
  });
@@ -182,8 +182,9 @@ class TestClient extends client_js_1.Client {
182
182
  const test = [];
183
183
  (0, mergeTreeNodeWalk_js_1.walkAllChildSegments)(tree.root, (segment) => {
184
184
  const prefixes = [];
185
+ (0, segmentInfos_js_1.assertInserted)(segment);
185
186
  prefixes.push(segment.seq === constants_js_1.UnassignedSequenceNumber ? `L${segment.localSeq}` : segment.seq);
186
- if (segment.removedSeq !== undefined) {
187
+ if ((0, segmentInfos_js_1.isRemoved)(segment)) {
187
188
  prefixes.push(segment.removedSeq === constants_js_1.UnassignedSequenceNumber
188
189
  ? `L${segment.localRemovedSeq}`
189
190
  : segment.removedSeq);
@@ -201,16 +202,14 @@ class TestClient extends client_js_1.Client {
201
202
  let segment;
202
203
  let posAccumulated = 0;
203
204
  let offset = pos;
204
- const isInsertedInView = (seg) => (seg.seq !== undefined &&
205
- seg.seq !== constants_js_1.UnassignedSequenceNumber &&
206
- seg.seq <= seqNumberFrom) ||
207
- (seg.localSeq !== undefined && seg.localSeq <= localSeq);
208
- const isRemovedFromView = ({ removedSeq, localRemovedSeq }) => (removedSeq !== undefined &&
209
- removedSeq !== constants_js_1.UnassignedSequenceNumber &&
210
- removedSeq <= seqNumberFrom) ||
211
- (localRemovedSeq !== undefined && localRemovedSeq <= localSeq);
205
+ const isInsertedInView = (seg) => (0, segmentInfos_js_1.isInserted)(seg) &&
206
+ ((seg.seq !== constants_js_1.UnassignedSequenceNumber && seg.seq <= seqNumberFrom) ||
207
+ (seg.localSeq !== undefined && seg.localSeq <= localSeq));
208
+ const isRemovedFromView = (s) => (0, segmentInfos_js_1.isRemoved)(s) &&
209
+ ((s.removedSeq !== constants_js_1.UnassignedSequenceNumber && s.removedSeq <= seqNumberFrom) ||
210
+ (s.localRemovedSeq !== undefined && s.localRemovedSeq <= localSeq));
212
211
  (0, mergeTreeNodeWalk_js_1.walkAllChildSegments)(this.mergeTree.root, (seg) => {
213
- (0, node_assert_1.strict)(seg.seq !== undefined || seg.localSeq !== undefined, "either seq or localSeq should be defined");
212
+ (0, segmentInfos_js_1.assertInserted)(seg);
214
213
  segment = seg;
215
214
  if (isInsertedInView(seg) && !isRemovedFromView(seg)) {
216
215
  posAccumulated += seg.cachedLength;
@@ -231,13 +230,13 @@ class TestClient extends client_js_1.Client {
231
230
  findReconnectionPosition(segment, localSeq) {
232
231
  const fasterComputedPosition = super.findReconnectionPosition(segment, localSeq);
233
232
  let segmentPosition = 0;
234
- const isInsertedInView = (seg) => seg.localSeq === undefined || seg.localSeq <= localSeq;
235
- const isRemovedFromView = ({ removedSeq, localRemovedSeq }) => removedSeq !== undefined &&
236
- (removedSeq !== constants_js_1.UnassignedSequenceNumber ||
237
- (localRemovedSeq !== undefined && localRemovedSeq <= localSeq));
238
- const isMovedFromView = ({ movedSeq, localMovedSeq }) => movedSeq !== undefined &&
239
- (movedSeq !== constants_js_1.UnassignedSequenceNumber ||
240
- (localMovedSeq !== undefined && localMovedSeq <= localSeq));
233
+ const isInsertedInView = (seg) => (0, segmentInfos_js_1.isInserted)(seg) && (seg.localSeq === undefined || seg.localSeq <= localSeq);
234
+ const isRemovedFromView = (s) => (0, segmentInfos_js_1.isRemoved)(s) &&
235
+ (s.removedSeq !== constants_js_1.UnassignedSequenceNumber ||
236
+ (s.localRemovedSeq !== undefined && s.localRemovedSeq <= localSeq));
237
+ const isMovedFromView = (s) => (0, segmentInfos_js_1.isMoved)(s) &&
238
+ (s.movedSeq !== constants_js_1.UnassignedSequenceNumber ||
239
+ (s.localMovedSeq !== undefined && s.localMovedSeq <= localSeq));
241
240
  /*
242
241
  Walk the segments up to the current segment, and calculate its
243
242
  position taking into account local segments that were modified,
@@ -280,6 +279,10 @@ class TestClient extends client_js_1.Client {
280
279
  });
281
280
  return seqs;
282
281
  }
282
+ peekPendingSegmentGroups(count = 1) {
283
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion
284
+ return super.peekPendingSegmentGroups(count);
285
+ }
283
286
  /**
284
287
  * Override and add some test only metrics
285
288
  */
@@ -315,16 +318,15 @@ class TestClient extends client_js_1.Client {
315
318
  slowSearchForMarker(startPos, markerLabel, forwards = true) {
316
319
  let foundMarker;
317
320
  const { segment } = this.getContainingSegment(startPos);
318
- // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
319
- const segWithParent = segment;
320
- if (mergeTreeNodes_js_1.Marker.is(segWithParent)) {
321
- if ((0, referencePositions_js_1.refHasTileLabel)(segWithParent, markerLabel)) {
322
- foundMarker = segWithParent;
321
+ (0, mergeTreeNodes_js_1.assertSegmentLeaf)(segment);
322
+ if (mergeTreeNodes_js_1.Marker.is(segment)) {
323
+ if ((0, referencePositions_js_1.refHasTileLabel)(segment, markerLabel)) {
324
+ foundMarker = segment;
323
325
  }
324
326
  }
325
327
  else {
326
328
  if (forwards) {
327
- (0, mergeTreeNodeWalk_js_1.forwardExcursion)(segWithParent, (seg) => {
329
+ (0, mergeTreeNodeWalk_js_1.forwardExcursion)(segment, (seg) => {
328
330
  if (mergeTreeNodes_js_1.Marker.is(seg) && (0, referencePositions_js_1.refHasTileLabel)(seg, markerLabel)) {
329
331
  foundMarker = seg;
330
332
  return false;
@@ -332,7 +334,7 @@ class TestClient extends client_js_1.Client {
332
334
  });
333
335
  }
334
336
  else {
335
- (0, mergeTreeNodeWalk_js_1.backwardExcursion)(segWithParent, (seg) => {
337
+ (0, mergeTreeNodeWalk_js_1.backwardExcursion)(segment, (seg) => {
336
338
  if (mergeTreeNodes_js_1.Marker.is(seg) && (0, referencePositions_js_1.refHasTileLabel)(seg, markerLabel)) {
337
339
  foundMarker = seg;
338
340
  return false;
@@ -389,7 +391,7 @@ function getStats(tree) {
389
391
  if (child.isLeaf()) {
390
392
  stats.leafCount++;
391
393
  const segment = child;
392
- if (segment.removedSeq !== undefined) {
394
+ if ((0, segmentInfos_js_1.isRemoved)(segment)) {
393
395
  stats.removedLeafCount++;
394
396
  }
395
397
  }
@@ -1 +1 @@
1
- {"version":3,"file":"testClient.js","sourceRoot":"","sources":["../../src/test/testClient.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { strict as assert } from \"node:assert\";\n\nimport { Trace } from \"@fluid-internal/client-utils\";\nimport { makeRandom } from \"@fluid-private/stochastic-test-utils\";\nimport { IFluidDataStoreRuntime } from \"@fluidframework/datastore-definitions/internal\";\nimport { ISummaryTree } from \"@fluidframework/driver-definitions\";\nimport {\n\tITree,\n\tMessageType,\n\tISequencedDocumentMessage,\n} from \"@fluidframework/driver-definitions/internal\";\nimport { AttributionKey } from \"@fluidframework/runtime-definitions/internal\";\nimport { createChildLogger } from \"@fluidframework/telemetry-utils/internal\";\nimport { MockStorage } from \"@fluidframework/test-runtime-utils/internal\";\n\nimport { MergeTreeTextHelper } from \"../MergeTreeTextHelper.js\";\nimport { Client } from \"../client.js\";\nimport { DoublyLinkedList } from \"../collections/index.js\";\nimport { UnassignedSequenceNumber } from \"../constants.js\";\nimport { IMergeTreeOptions, ReferencePosition } from \"../index.js\";\nimport { MergeTree, getSlideToSegoff } from \"../mergeTree.js\";\nimport {\n\tbackwardExcursion,\n\tforwardExcursion,\n\twalkAllChildSegments,\n} from \"../mergeTreeNodeWalk.js\";\nimport { MergeBlock, ISegmentLeaf, Marker, MaxNodesInBlock } from \"../mergeTreeNodes.js\";\nimport {\n\tcreateAnnotateRangeOp,\n\tcreateInsertSegmentOp,\n\tcreateRemoveRangeOp,\n} from \"../opBuilder.js\";\nimport {\n\tIJSONSegment,\n\tIMarkerDef,\n\tIMergeTreeOp,\n\tMergeTreeDeltaType,\n\tReferenceType,\n\ttype IMergeTreeInsertMsg,\n} from \"../ops.js\";\nimport { PropertySet } from \"../properties.js\";\nimport { DetachedReferencePosition, refHasTileLabel } from \"../referencePositions.js\";\nimport { MergeTreeRevertibleDriver } from \"../revertibles.js\";\nimport { SnapshotLegacy } from \"../snapshotlegacy.js\";\nimport { TextSegment } from \"../textSegment.js\";\n\nimport { TestSerializer } from \"./testSerializer.js\";\nimport { nodeOrdinalsHaveIntegrity } from \"./testUtils.js\";\n\nexport function specToSegment(spec: IJSONSegment): ISegmentLeaf {\n\tconst maybeText = TextSegment.fromJSONObject(spec);\n\tif (maybeText) {\n\t\treturn maybeText;\n\t}\n\n\tconst maybeMarker = Marker.fromJSONObject(spec);\n\tif (maybeMarker) {\n\t\treturn maybeMarker;\n\t}\n\n\tthrow new Error(`Unrecognized IJSONSegment type: '${JSON.stringify(spec)}'`);\n}\n\nconst random = makeRandom(0xdeadbeef, 0xfeedbed);\n\nexport class TestClient extends Client {\n\tpublic static searchChunkSize = 256;\n\tpublic static readonly serializer = new TestSerializer();\n\tpublic measureOps = false;\n\tpublic accumTime = 0;\n\tpublic accumWindowTime = 0;\n\tpublic accumWindow = 0;\n\tpublic accumOps = 0;\n\tpublic maxWindowTime = 0;\n\n\t/**\n\t * Used for in-memory testing. This will queue a reference string for each client message.\n\t */\n\tpublic static useCheckQ = false;\n\n\tpublic static async createFromClientSnapshot(\n\t\tclient1: TestClient,\n\t\tnewLongClientId: string,\n\t): Promise<TestClient> {\n\t\tconst snapshot = new SnapshotLegacy(\n\t\t\tclient1.mergeTree,\n\t\t\tcreateChildLogger({ namespace: \"fluid:snapshot\" }),\n\t\t);\n\t\tsnapshot.extractSync();\n\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\tconst summaryTree = snapshot.emit([], TestClient.serializer, undefined!).summary;\n\t\treturn TestClient.createFromSummary(\n\t\t\tsummaryTree,\n\t\t\tnewLongClientId,\n\t\t\tclient1.specToSegment,\n\t\t\tclient1.mergeTree.options,\n\t\t);\n\t}\n\n\tpublic static async createFromSnapshot(\n\t\tsnapshotTree: ITree,\n\t\tnewLongClientId: string,\n\t\tspecToSeg: (spec: IJSONSegment) => ISegmentLeaf,\n\t\toptions?: PropertySet,\n\t): Promise<TestClient> {\n\t\treturn TestClient.createFromStorage(\n\t\t\tnew MockStorage(snapshotTree),\n\t\t\tnewLongClientId,\n\t\t\tspecToSeg,\n\t\t\toptions,\n\t\t);\n\t}\n\n\tpublic static async createFromSummary(\n\t\tsummaryTree: ISummaryTree,\n\t\tnewLongClientId: string,\n\t\tspecToSeg: (spec: IJSONSegment) => ISegmentLeaf,\n\t\toptions?: PropertySet,\n\t): Promise<TestClient> {\n\t\treturn TestClient.createFromStorage(\n\t\t\tMockStorage.createFromSummary(summaryTree),\n\t\t\tnewLongClientId,\n\t\t\tspecToSeg,\n\t\t\toptions,\n\t\t);\n\t}\n\n\tpublic static async createFromStorage(\n\t\tstorage: MockStorage,\n\t\tnewLongClientId: string,\n\t\tspecToSeg: (spec: IJSONSegment) => ISegmentLeaf,\n\t\toptions?: PropertySet,\n\t): Promise<TestClient> {\n\t\tconst client2 = new TestClient(options, specToSeg);\n\t\tconst { catchupOpsP } = await client2.load(\n\t\t\t{\n\t\t\t\tlogger: client2.logger,\n\t\t\t\tclientId: newLongClientId,\n\t\t\t} as unknown as IFluidDataStoreRuntime,\n\t\t\tstorage,\n\t\t\tTestClient.serializer,\n\t\t);\n\t\tawait catchupOpsP;\n\t\treturn client2;\n\t}\n\n\tpublic readonly mergeTree: MergeTree;\n\n\tpublic readonly checkQ: DoublyLinkedList<string> = new DoublyLinkedList<string>();\n\tprotected readonly q: DoublyLinkedList<ISequencedDocumentMessage> =\n\t\tnew DoublyLinkedList<ISequencedDocumentMessage>();\n\n\tprivate readonly textHelper: MergeTreeTextHelper;\n\tconstructor(\n\t\toptions?: IMergeTreeOptions & PropertySet,\n\t\tspecToSeg = specToSegment,\n\t\tgetMinInFlightRefSeq: () => number | undefined = (): undefined => undefined,\n\t) {\n\t\tsuper(\n\t\t\tspecToSeg,\n\t\t\tcreateChildLogger({ namespace: \"fluid:testClient\" }),\n\t\t\toptions,\n\t\t\tgetMinInFlightRefSeq,\n\t\t);\n\t\tthis.mergeTree = (this as Record<\"_mergeTree\", MergeTree>)._mergeTree;\n\t\tthis.textHelper = new MergeTreeTextHelper(this.mergeTree);\n\n\t\t// Validate by default\n\t\tthis.on(\"delta\", (o, d) => {\n\t\t\t// assert.notEqual(d.deltaSegments.length, 0);\n\t\t\tfor (const s of d.deltaSegments) {\n\t\t\t\tif (d.operation === MergeTreeDeltaType.INSERT) {\n\t\t\t\t\tconst seg: ISegmentLeaf = s.segment;\n\t\t\t\t\tassert.notEqual(seg.parent, undefined);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\n\tpublic getText(start?: number, end?: number): string {\n\t\treturn this.textHelper.getText(this.getCurrentSeq(), this.getClientId(), \"\", start, end);\n\t}\n\n\tpublic enqueueTestString(): void {\n\t\tthis.checkQ.push(this.getText());\n\t}\n\tpublic getMessageCount(): number {\n\t\treturn this.q.length;\n\t}\n\tpublic enqueueMsg(msg: ISequencedDocumentMessage): void {\n\t\tthis.q.push(msg);\n\t}\n\tpublic dequeueMsg(): ISequencedDocumentMessage | undefined {\n\t\treturn this.q.shift()?.data;\n\t}\n\tpublic applyMessages(msgCount: number): boolean {\n\t\tlet currMsgCount = msgCount;\n\t\twhile (currMsgCount > 0) {\n\t\t\tconst msg = this.dequeueMsg();\n\t\t\tif (msg) {\n\t\t\t\tthis.applyMsg(msg);\n\t\t\t} else {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcurrMsgCount--;\n\t\t}\n\n\t\treturn true;\n\t}\n\n\tpublic insertTextLocal(\n\t\tpos: number,\n\t\ttext: string,\n\t\tprops?: PropertySet,\n\t): IMergeTreeInsertMsg | undefined {\n\t\tconst segment = TextSegment.make(text, props);\n\t\treturn this.insertSegmentLocal(pos, segment);\n\t}\n\n\tpublic insertTextRemote(\n\t\tpos: number,\n\t\ttext: string,\n\t\tprops: PropertySet | undefined,\n\t\tseq: number,\n\t\trefSeq: number,\n\t\tlongClientId: string,\n\t): void {\n\t\tconst segment = TextSegment.make(text, props);\n\t\tthis.applyMsg(\n\t\t\tthis.makeOpMessage(createInsertSegmentOp(pos, segment), seq, refSeq, longClientId),\n\t\t);\n\t}\n\n\tpublic removeRangeRemote(\n\t\tstart: number,\n\t\tend: number,\n\t\tseq: number,\n\t\trefSeq: number,\n\t\tlongClientId: string,\n\t): void {\n\t\tthis.applyMsg(\n\t\t\tthis.makeOpMessage(createRemoveRangeOp(start, end), seq, refSeq, longClientId),\n\t\t);\n\t}\n\n\tpublic annotateRangeRemote(\n\t\tstart: number,\n\t\tend: number,\n\t\tprops: PropertySet,\n\t\tseq: number,\n\t\trefSeq: number,\n\t\tlongClientId: string,\n\t): void {\n\t\tthis.applyMsg(\n\t\t\tthis.makeOpMessage(createAnnotateRangeOp(start, end, props), seq, refSeq, longClientId),\n\t\t);\n\t}\n\n\tpublic insertMarkerLocal(\n\t\tpos: number,\n\t\tbehaviors: ReferenceType,\n\t\tprops?: PropertySet,\n\t): IMergeTreeInsertMsg | undefined {\n\t\tconst segment = Marker.make(behaviors, props);\n\n\t\treturn this.insertSegmentLocal(pos, segment);\n\t}\n\n\tpublic insertMarkerRemote(\n\t\tpos: number,\n\t\tmarkerDef: IMarkerDef,\n\t\tprops: PropertySet,\n\t\tseq: number,\n\t\trefSeq: number,\n\t\tlongClientId: string,\n\t): void {\n\t\tconst segment = Marker.make(markerDef.refType ?? ReferenceType.Tile, props);\n\n\t\tthis.applyMsg(\n\t\t\tthis.makeOpMessage(createInsertSegmentOp(pos, segment), seq, refSeq, longClientId),\n\t\t);\n\t}\n\n\tpublic relText(clientId: number, refSeq: number): string {\n\t\treturn `cli: ${this.getLongClientId(\n\t\t\tclientId,\n\t\t)} refSeq: ${refSeq}: ${this.textHelper.getText(refSeq, clientId)}`;\n\t}\n\n\tpublic makeOpMessage(\n\t\top: IMergeTreeOp | undefined,\n\t\tseq: number = UnassignedSequenceNumber,\n\t\trefSeq: number = this.getCurrentSeq(),\n\t\tlongClientId?: string,\n\t\tminSeqNumber = 0,\n\t): ISequencedDocumentMessage {\n\t\tif (op === undefined) {\n\t\t\tthrow new Error(\"op cannot be undefined\");\n\t\t}\n\t\tconst msg: ISequencedDocumentMessage = {\n\t\t\tclientId: longClientId ?? this.longClientId ?? \"\",\n\t\t\tclientSequenceNumber: 1,\n\t\t\tcontents: op,\n\t\t\tmetadata: undefined,\n\t\t\tminimumSequenceNumber: minSeqNumber,\n\t\t\treferenceSequenceNumber: refSeq,\n\t\t\tsequenceNumber: seq,\n\t\t\ttimestamp: Date.now(),\n\t\t\ttraces: [],\n\t\t\ttype: MessageType.Operation,\n\t\t};\n\t\treturn msg;\n\t}\n\n\tpublic validate(): void {\n\t\tassert(nodeOrdinalsHaveIntegrity(this.mergeTree.root));\n\t}\n\n\tpublic searchFromPos(\n\t\tpos: number,\n\t\ttarget: RegExp,\n\t): { text: string; pos: number } | undefined {\n\t\tlet start = pos;\n\t\tlet chunk = \"\";\n\t\twhile (start < this.getLength()) {\n\t\t\tchunk = this.getText(start, start + TestClient.searchChunkSize);\n\n\t\t\tconst result = chunk.match(target);\n\t\t\tif (result?.index) {\n\t\t\t\treturn { text: result[0], pos: result.index + start };\n\t\t\t}\n\t\t\tstart += TestClient.searchChunkSize;\n\t\t}\n\t}\n\n\tpublic findRandomWord(): { text: string; pos: number } | undefined {\n\t\tconst len = this.getLength();\n\t\tconst pos = random.integer(0, len);\n\t\tconst nextWord = this.searchFromPos(pos, /\\s\\w+\\b/);\n\t\treturn nextWord;\n\t}\n\n\tpublic debugDumpTree(tree: MergeTree): void {\n\t\t// want the segment's content and the state of insert/remove\n\t\tconst test: string[] = [];\n\t\twalkAllChildSegments(tree.root, (segment: ISegmentLeaf) => {\n\t\t\tconst prefixes: (string | undefined | number)[] = [];\n\t\t\tprefixes.push(\n\t\t\t\tsegment.seq === UnassignedSequenceNumber ? `L${segment.localSeq}` : segment.seq,\n\t\t\t);\n\t\t\tif (segment.removedSeq !== undefined) {\n\t\t\t\tprefixes.push(\n\t\t\t\t\tsegment.removedSeq === UnassignedSequenceNumber\n\t\t\t\t\t\t? `L${segment.localRemovedSeq}`\n\t\t\t\t\t\t: segment.removedSeq,\n\t\t\t\t);\n\t\t\t}\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-explicit-any\n\t\t\ttest.push(`${prefixes.join(\",\")}:${(segment as any).text}`);\n\t\t});\n\t}\n\n\t/**\n\t * Rebases a (local) position from the perspective `{ seq: seqNumberFrom, localSeq }` to the perspective\n\t * of the current sequence number. This is desirable when rebasing operations for reconnection. Perform\n\t * slow-path computations in this function without leveraging the merge-tree's structure\n\t */\n\tpublic rebasePosition(pos: number, seqNumberFrom: number, localSeq: number): number {\n\t\tlet segment: ISegmentLeaf | undefined;\n\t\tlet posAccumulated = 0;\n\t\tlet offset = pos;\n\t\tconst isInsertedInView = (seg: ISegmentLeaf): boolean =>\n\t\t\t(seg.seq !== undefined &&\n\t\t\t\tseg.seq !== UnassignedSequenceNumber &&\n\t\t\t\tseg.seq <= seqNumberFrom) ||\n\t\t\t(seg.localSeq !== undefined && seg.localSeq <= localSeq);\n\n\t\tconst isRemovedFromView = ({ removedSeq, localRemovedSeq }: ISegmentLeaf): boolean =>\n\t\t\t(removedSeq !== undefined &&\n\t\t\t\tremovedSeq !== UnassignedSequenceNumber &&\n\t\t\t\tremovedSeq <= seqNumberFrom) ||\n\t\t\t(localRemovedSeq !== undefined && localRemovedSeq <= localSeq);\n\n\t\twalkAllChildSegments(this.mergeTree.root, (seg) => {\n\t\t\tassert(\n\t\t\t\tseg.seq !== undefined || seg.localSeq !== undefined,\n\t\t\t\t\"either seq or localSeq should be defined\",\n\t\t\t);\n\t\t\tsegment = seg;\n\n\t\t\tif (isInsertedInView(seg) && !isRemovedFromView(seg)) {\n\t\t\t\tposAccumulated += seg.cachedLength;\n\t\t\t\tif (offset >= seg.cachedLength) {\n\t\t\t\t\toffset -= seg.cachedLength;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Keep going while we've yet to reach the segment at the desired position\n\t\t\treturn posAccumulated <= pos;\n\t\t});\n\n\t\tassert(segment !== undefined, \"No segment found\");\n\t\tconst segoff = getSlideToSegoff({ segment, offset }) ?? segment;\n\t\tif (segoff.segment === undefined || segoff.offset === undefined) {\n\t\t\treturn DetachedReferencePosition;\n\t\t}\n\n\t\treturn this.findReconnectionPosition(segoff.segment, localSeq) + segoff.offset;\n\t}\n\n\tpublic findReconnectionPosition(segment: ISegmentLeaf, localSeq: number): number {\n\t\tconst fasterComputedPosition = super.findReconnectionPosition(segment, localSeq);\n\n\t\tlet segmentPosition = 0;\n\t\tconst isInsertedInView = (seg: ISegmentLeaf): boolean =>\n\t\t\tseg.localSeq === undefined || seg.localSeq <= localSeq;\n\t\tconst isRemovedFromView = ({ removedSeq, localRemovedSeq }: ISegmentLeaf): boolean =>\n\t\t\tremovedSeq !== undefined &&\n\t\t\t(removedSeq !== UnassignedSequenceNumber ||\n\t\t\t\t(localRemovedSeq !== undefined && localRemovedSeq <= localSeq));\n\t\tconst isMovedFromView = ({ movedSeq, localMovedSeq }: ISegmentLeaf): boolean =>\n\t\t\tmovedSeq !== undefined &&\n\t\t\t(movedSeq !== UnassignedSequenceNumber ||\n\t\t\t\t(localMovedSeq !== undefined && localMovedSeq <= localSeq));\n\t\t/*\n Walk the segments up to the current segment, and calculate its\n position taking into account local segments that were modified,\n after the current segment.\n */\n\t\twalkAllChildSegments(this.mergeTree.root, (seg) => {\n\t\t\t// If we've found the desired segment, terminate the walk and return 'segmentPosition'.\n\t\t\tif (seg === segment) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\t// Otherwise, advance segmentPosition if the segment has been inserted and not removed\n\t\t\t// with respect to the given 'localSeq'.\n\t\t\t//\n\t\t\t// Note that all ACKed / remote ops are applied and we only need concern ourself with\n\t\t\t// determining if locally pending ops fall before/after the given 'localSeq'.\n\t\t\tif (isInsertedInView(seg) && !isRemovedFromView(seg) && !isMovedFromView(seg)) {\n\t\t\t\tsegmentPosition += seg.cachedLength;\n\t\t\t}\n\n\t\t\treturn true;\n\t\t});\n\n\t\tassert.equal(\n\t\t\tfasterComputedPosition,\n\t\t\tsegmentPosition,\n\t\t\t\"Expected fast-path computation to match result from walk all segments\",\n\t\t);\n\t\treturn segmentPosition;\n\t}\n\n\t/**\n\t * Validates segments either all have attribution information or none of them.\n\t * If no segment has attribution information, returns undefined.\n\t *\n\t * @param channel - Attribution channel name to request information from.\n\t * @returns an array of all attribution seq#s from the current perspective.\n\t * The `i`th entry of the array is the attribution key for the character at position `i`.\n\t */\n\tpublic getAllAttributionSeqs(channel?: string): (number | AttributionKey | undefined)[] {\n\t\tconst seqs: (number | AttributionKey | undefined)[] = [];\n\t\tthis.walkAllSegments((segment) => {\n\t\t\tfor (let i = 0; i < segment.cachedLength; i++) {\n\t\t\t\tconst key = segment.attribution?.getAtOffset(i, channel);\n\t\t\t\tseqs.push(key?.type === \"op\" ? key.seq : key);\n\t\t\t}\n\t\t\treturn true;\n\t\t});\n\n\t\treturn seqs;\n\t}\n\n\t/**\n\t * Override and add some test only metrics\n\t */\n\tpublic applyMsg(msg: ISequencedDocumentMessage, local: boolean = false): void {\n\t\tlet traceStart: Trace | undefined;\n\t\tif (this.measureOps) {\n\t\t\ttraceStart = Trace.start();\n\t\t}\n\n\t\tsuper.applyMsg(msg, local);\n\n\t\tif (traceStart) {\n\t\t\tthis.accumTime += elapsedMicroseconds(traceStart);\n\t\t\tthis.accumOps++;\n\t\t\tthis.accumWindow += this.getCurrentSeq() - this.getCollabWindow().minSeq;\n\t\t}\n\t}\n\n\t/**\n\t * Override and add some test only metrics\n\t */\n\tupdateMinSeq(minSeq: number): void {\n\t\tlet trace: Trace | undefined;\n\t\tif (this.measureOps) {\n\t\t\ttrace = Trace.start();\n\t\t}\n\n\t\tsuper.updateMinSeq(minSeq);\n\t\tif (trace) {\n\t\t\tconst elapsed = elapsedMicroseconds(trace);\n\t\t\tthis.accumWindowTime += elapsed;\n\t\t\tif (elapsed > this.maxWindowTime) {\n\t\t\t\tthis.maxWindowTime = elapsed;\n\t\t\t}\n\t\t}\n\t}\n\n\tslowSearchForMarker(\n\t\tstartPos: number,\n\t\tmarkerLabel: string,\n\t\tforwards = true,\n\t): ReferencePosition | undefined {\n\t\tlet foundMarker: Marker | undefined;\n\n\t\tconst { segment } = this.getContainingSegment<ISegmentLeaf>(startPos);\n\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\tconst segWithParent: ISegmentLeaf = segment!;\n\n\t\tif (Marker.is(segWithParent)) {\n\t\t\tif (refHasTileLabel(segWithParent, markerLabel)) {\n\t\t\t\tfoundMarker = segWithParent;\n\t\t\t}\n\t\t} else {\n\t\t\tif (forwards) {\n\t\t\t\tforwardExcursion(segWithParent, (seg) => {\n\t\t\t\t\tif (Marker.is(seg) && refHasTileLabel(seg, markerLabel)) {\n\t\t\t\t\t\tfoundMarker = seg;\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tbackwardExcursion(segWithParent, (seg) => {\n\t\t\t\t\tif (Marker.is(seg) && refHasTileLabel(seg, markerLabel)) {\n\t\t\t\t\t\tfoundMarker = seg;\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\treturn foundMarker;\n\t}\n}\n\nfunction elapsedMicroseconds(trace: Trace): number {\n\treturn trace.trace().duration * 1000;\n}\n\n// the client doesn't submit ops, so this adds a callback to capture them\nexport type TestClientRevertibleDriver = MergeTreeRevertibleDriver &\n\tPartial<{ submitOpCallback?: (op: IMergeTreeOp | undefined) => void }>;\n\nexport const createRevertDriver = (client: TestClient): TestClientRevertibleDriver => {\n\treturn {\n\t\tremoveRange(start: number, end: number): void {\n\t\t\tconst op = client.removeRangeLocal(start, end);\n\t\t\tthis.submitOpCallback?.(op);\n\t\t},\n\t\tannotateRange(start: number, end: number, props: PropertySet): void {\n\t\t\tconst op = client.annotateRangeLocal(start, end, props);\n\t\t\tthis.submitOpCallback?.(op);\n\t\t},\n\t\tinsertFromSpec(pos: number, spec: IJSONSegment): void {\n\t\t\tconst op = client.insertSegmentLocal(pos, client.specToSegment(spec));\n\t\t\tthis.submitOpCallback?.(op);\n\t\t},\n\t};\n};\n\nexport interface MergeTreeStats {\n\tmaxHeight: number;\n\tnodeCount: number;\n\tleafCount: number;\n\tremovedLeafCount: number;\n\tliveCount: number;\n\thisto: number[];\n\twindowTime?: number;\n\tpackTime?: number;\n\tordTime?: number;\n\tmaxOrdTime?: number;\n}\n\nexport function getStats(tree: MergeTree): MergeTreeStats {\n\tconst nodeGetStats = (block: MergeBlock): MergeTreeStats => {\n\t\tconst stats: MergeTreeStats = {\n\t\t\tmaxHeight: 0,\n\t\t\tnodeCount: 0,\n\t\t\tleafCount: 0,\n\t\t\tremovedLeafCount: 0,\n\t\t\tliveCount: 0,\n\t\t\thisto: [],\n\t\t};\n\t\tfor (let k = 0; k < MaxNodesInBlock; k++) {\n\t\t\tstats.histo[k] = 0;\n\t\t}\n\t\tfor (let i = 0; i < block.childCount; i++) {\n\t\t\tconst child = block.children[i];\n\t\t\tlet height = 1;\n\t\t\tif (child.isLeaf()) {\n\t\t\t\tstats.leafCount++;\n\t\t\t\tconst segment = child;\n\t\t\t\tif (segment.removedSeq !== undefined) {\n\t\t\t\t\tstats.removedLeafCount++;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tconst childStats = nodeGetStats(child);\n\t\t\t\theight = 1 + childStats.maxHeight;\n\t\t\t\tstats.nodeCount += childStats.nodeCount;\n\t\t\t\tstats.leafCount += childStats.leafCount;\n\t\t\t\tstats.removedLeafCount += childStats.removedLeafCount;\n\t\t\t\tstats.liveCount += childStats.liveCount;\n\t\t\t\tfor (let j = 0; j < MaxNodesInBlock; j++) {\n\t\t\t\t\tstats.histo[j] += childStats.histo[j];\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (height > stats.maxHeight) {\n\t\t\t\tstats.maxHeight = height;\n\t\t\t}\n\t\t}\n\t\tstats.histo[block.childCount]++;\n\t\tstats.nodeCount++;\n\t\tstats.liveCount += block.childCount;\n\t\treturn stats;\n\t};\n\tconst rootStats = nodeGetStats(tree.root);\n\treturn rootStats;\n}\n"]}
1
+ {"version":3,"file":"testClient.js","sourceRoot":"","sources":["../../src/test/testClient.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { strict as assert } from \"node:assert\";\n\nimport { Trace } from \"@fluid-internal/client-utils\";\nimport { makeRandom } from \"@fluid-private/stochastic-test-utils\";\nimport { IFluidDataStoreRuntime } from \"@fluidframework/datastore-definitions/internal\";\nimport { ISummaryTree } from \"@fluidframework/driver-definitions\";\nimport {\n\tITree,\n\tMessageType,\n\tISequencedDocumentMessage,\n} from \"@fluidframework/driver-definitions/internal\";\nimport { AttributionKey } from \"@fluidframework/runtime-definitions/internal\";\nimport { createChildLogger } from \"@fluidframework/telemetry-utils/internal\";\nimport { MockStorage } from \"@fluidframework/test-runtime-utils/internal\";\n\nimport { MergeTreeTextHelper } from \"../MergeTreeTextHelper.js\";\nimport { Client } from \"../client.js\";\nimport { DoublyLinkedList } from \"../collections/index.js\";\nimport { UnassignedSequenceNumber } from \"../constants.js\";\nimport { IMergeTreeOptions, ReferencePosition } from \"../index.js\";\nimport { MergeTree, getSlideToSegoff } from \"../mergeTree.js\";\nimport {\n\tbackwardExcursion,\n\tforwardExcursion,\n\twalkAllChildSegments,\n} from \"../mergeTreeNodeWalk.js\";\nimport {\n\tMergeBlock,\n\tISegmentPrivate,\n\tMarker,\n\tMaxNodesInBlock,\n\ttype SegmentGroup,\n\tassertSegmentLeaf,\n} from \"../mergeTreeNodes.js\";\nimport {\n\tcreateAnnotateRangeOp,\n\tcreateInsertSegmentOp,\n\tcreateRemoveRangeOp,\n} from \"../opBuilder.js\";\nimport {\n\tIJSONSegment,\n\tIMarkerDef,\n\tIMergeTreeOp,\n\tMergeTreeDeltaType,\n\tReferenceType,\n\ttype IMergeTreeInsertMsg,\n} from \"../ops.js\";\nimport { PropertySet } from \"../properties.js\";\nimport { DetachedReferencePosition, refHasTileLabel } from \"../referencePositions.js\";\nimport { MergeTreeRevertibleDriver } from \"../revertibles.js\";\nimport {\n\tassertInserted,\n\tassertMergeNode,\n\tisInserted,\n\tisMoved,\n\tisRemoved,\n} from \"../segmentInfos.js\";\nimport { SnapshotLegacy } from \"../snapshotlegacy.js\";\nimport { TextSegment } from \"../textSegment.js\";\n\nimport { TestSerializer } from \"./testSerializer.js\";\nimport { nodeOrdinalsHaveIntegrity } from \"./testUtils.js\";\n\nexport function specToSegment(spec: IJSONSegment): ISegmentPrivate {\n\tconst maybeText = TextSegment.fromJSONObject(spec);\n\tif (maybeText) {\n\t\treturn maybeText;\n\t}\n\n\tconst maybeMarker = Marker.fromJSONObject(spec);\n\tif (maybeMarker) {\n\t\treturn maybeMarker;\n\t}\n\n\tthrow new Error(`Unrecognized IJSONSegment type: '${JSON.stringify(spec)}'`);\n}\n\nconst random = makeRandom(0xdeadbeef, 0xfeedbed);\n\nexport class TestClient extends Client {\n\tpublic static searchChunkSize = 256;\n\tpublic static readonly serializer = new TestSerializer();\n\tpublic measureOps = false;\n\tpublic accumTime = 0;\n\tpublic accumWindowTime = 0;\n\tpublic accumWindow = 0;\n\tpublic accumOps = 0;\n\tpublic maxWindowTime = 0;\n\n\t/**\n\t * Used for in-memory testing. This will queue a reference string for each client message.\n\t */\n\tpublic static useCheckQ = false;\n\n\tpublic static async createFromClientSnapshot(\n\t\tclient1: TestClient,\n\t\tnewLongClientId: string,\n\t): Promise<TestClient> {\n\t\tconst snapshot = new SnapshotLegacy(\n\t\t\tclient1.mergeTree,\n\t\t\tcreateChildLogger({ namespace: \"fluid:snapshot\" }),\n\t\t);\n\t\tsnapshot.extractSync();\n\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\tconst summaryTree = snapshot.emit([], TestClient.serializer, undefined!).summary;\n\t\treturn TestClient.createFromSummary(\n\t\t\tsummaryTree,\n\t\t\tnewLongClientId,\n\t\t\tclient1.specToSegment,\n\t\t\tclient1.mergeTree.options,\n\t\t);\n\t}\n\n\tpublic static async createFromSnapshot(\n\t\tsnapshotTree: ITree,\n\t\tnewLongClientId: string,\n\t\tspecToSeg: (spec: IJSONSegment) => ISegmentPrivate,\n\t\toptions?: PropertySet,\n\t): Promise<TestClient> {\n\t\treturn TestClient.createFromStorage(\n\t\t\tnew MockStorage(snapshotTree),\n\t\t\tnewLongClientId,\n\t\t\tspecToSeg,\n\t\t\toptions,\n\t\t);\n\t}\n\n\tpublic static async createFromSummary(\n\t\tsummaryTree: ISummaryTree,\n\t\tnewLongClientId: string,\n\t\tspecToSeg: (spec: IJSONSegment) => ISegmentPrivate,\n\t\toptions?: PropertySet,\n\t): Promise<TestClient> {\n\t\treturn TestClient.createFromStorage(\n\t\t\tMockStorage.createFromSummary(summaryTree),\n\t\t\tnewLongClientId,\n\t\t\tspecToSeg,\n\t\t\toptions,\n\t\t);\n\t}\n\n\tpublic static async createFromStorage(\n\t\tstorage: MockStorage,\n\t\tnewLongClientId: string,\n\t\tspecToSeg: (spec: IJSONSegment) => ISegmentPrivate,\n\t\toptions?: PropertySet,\n\t): Promise<TestClient> {\n\t\tconst client2 = new TestClient(options, specToSeg);\n\t\tconst { catchupOpsP } = await client2.load(\n\t\t\t{\n\t\t\t\tlogger: client2.logger,\n\t\t\t\tclientId: newLongClientId,\n\t\t\t} as unknown as IFluidDataStoreRuntime,\n\t\t\tstorage,\n\t\t\tTestClient.serializer,\n\t\t);\n\t\tawait catchupOpsP;\n\t\treturn client2;\n\t}\n\n\tpublic readonly mergeTree: MergeTree;\n\n\tpublic readonly checkQ: DoublyLinkedList<string> = new DoublyLinkedList<string>();\n\tprotected readonly q: DoublyLinkedList<ISequencedDocumentMessage> =\n\t\tnew DoublyLinkedList<ISequencedDocumentMessage>();\n\n\tprivate readonly textHelper: MergeTreeTextHelper;\n\tconstructor(\n\t\toptions?: IMergeTreeOptions & PropertySet,\n\t\tspecToSeg = specToSegment,\n\t\tgetMinInFlightRefSeq: () => number | undefined = (): undefined => undefined,\n\t) {\n\t\tsuper(\n\t\t\tspecToSeg,\n\t\t\tcreateChildLogger({ namespace: \"fluid:testClient\" }),\n\t\t\toptions,\n\t\t\tgetMinInFlightRefSeq,\n\t\t);\n\t\tthis.mergeTree = (this as Record<\"_mergeTree\", MergeTree>)._mergeTree;\n\t\tthis.textHelper = new MergeTreeTextHelper(this.mergeTree);\n\n\t\t// Validate by default\n\t\tthis.on(\"delta\", (o, d) => {\n\t\t\t// assert.notEqual(d.deltaSegments.length, 0);\n\t\t\tfor (const s of d.deltaSegments) {\n\t\t\t\tif (d.operation === MergeTreeDeltaType.INSERT) {\n\t\t\t\t\tassertMergeNode(s.segment);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\n\tpublic getText(start?: number, end?: number): string {\n\t\treturn this.textHelper.getText(this.getCurrentSeq(), this.getClientId(), \"\", start, end);\n\t}\n\n\tpublic enqueueTestString(): void {\n\t\tthis.checkQ.push(this.getText());\n\t}\n\tpublic getMessageCount(): number {\n\t\treturn this.q.length;\n\t}\n\tpublic enqueueMsg(msg: ISequencedDocumentMessage): void {\n\t\tthis.q.push(msg);\n\t}\n\tpublic dequeueMsg(): ISequencedDocumentMessage | undefined {\n\t\treturn this.q.shift()?.data;\n\t}\n\tpublic applyMessages(msgCount: number): boolean {\n\t\tlet currMsgCount = msgCount;\n\t\twhile (currMsgCount > 0) {\n\t\t\tconst msg = this.dequeueMsg();\n\t\t\tif (msg) {\n\t\t\t\tthis.applyMsg(msg);\n\t\t\t} else {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcurrMsgCount--;\n\t\t}\n\n\t\treturn true;\n\t}\n\n\tpublic insertTextLocal(\n\t\tpos: number,\n\t\ttext: string,\n\t\tprops?: PropertySet,\n\t): IMergeTreeInsertMsg | undefined {\n\t\tconst segment = TextSegment.make(text, props);\n\t\treturn this.insertSegmentLocal(pos, segment);\n\t}\n\n\tpublic insertTextRemote(\n\t\tpos: number,\n\t\ttext: string,\n\t\tprops: PropertySet | undefined,\n\t\tseq: number,\n\t\trefSeq: number,\n\t\tlongClientId: string,\n\t): void {\n\t\tconst segment = TextSegment.make(text, props);\n\t\tthis.applyMsg(\n\t\t\tthis.makeOpMessage(createInsertSegmentOp(pos, segment), seq, refSeq, longClientId),\n\t\t);\n\t}\n\n\tpublic removeRangeRemote(\n\t\tstart: number,\n\t\tend: number,\n\t\tseq: number,\n\t\trefSeq: number,\n\t\tlongClientId: string,\n\t): void {\n\t\tthis.applyMsg(\n\t\t\tthis.makeOpMessage(createRemoveRangeOp(start, end), seq, refSeq, longClientId),\n\t\t);\n\t}\n\n\tpublic annotateRangeRemote(\n\t\tstart: number,\n\t\tend: number,\n\t\tprops: PropertySet,\n\t\tseq: number,\n\t\trefSeq: number,\n\t\tlongClientId: string,\n\t): void {\n\t\tthis.applyMsg(\n\t\t\tthis.makeOpMessage(createAnnotateRangeOp(start, end, props), seq, refSeq, longClientId),\n\t\t);\n\t}\n\n\tpublic insertMarkerLocal(\n\t\tpos: number,\n\t\tbehaviors: ReferenceType,\n\t\tprops?: PropertySet,\n\t): IMergeTreeInsertMsg | undefined {\n\t\tconst segment = Marker.make(behaviors, props);\n\n\t\treturn this.insertSegmentLocal(pos, segment);\n\t}\n\n\tpublic insertMarkerRemote(\n\t\tpos: number,\n\t\tmarkerDef: IMarkerDef,\n\t\tprops: PropertySet,\n\t\tseq: number,\n\t\trefSeq: number,\n\t\tlongClientId: string,\n\t): void {\n\t\tconst segment = Marker.make(markerDef.refType ?? ReferenceType.Tile, props);\n\n\t\tthis.applyMsg(\n\t\t\tthis.makeOpMessage(createInsertSegmentOp(pos, segment), seq, refSeq, longClientId),\n\t\t);\n\t}\n\n\tpublic relText(clientId: number, refSeq: number): string {\n\t\treturn `cli: ${this.getLongClientId(\n\t\t\tclientId,\n\t\t)} refSeq: ${refSeq}: ${this.textHelper.getText(refSeq, clientId)}`;\n\t}\n\n\tpublic makeOpMessage(\n\t\top: IMergeTreeOp | undefined,\n\t\tseq: number = UnassignedSequenceNumber,\n\t\trefSeq: number = this.getCurrentSeq(),\n\t\tlongClientId?: string,\n\t\tminSeqNumber = 0,\n\t): ISequencedDocumentMessage {\n\t\tif (op === undefined) {\n\t\t\tthrow new Error(\"op cannot be undefined\");\n\t\t}\n\t\tconst msg: ISequencedDocumentMessage = {\n\t\t\tclientId: longClientId ?? this.longClientId ?? \"\",\n\t\t\tclientSequenceNumber: 1,\n\t\t\tcontents: op,\n\t\t\tmetadata: undefined,\n\t\t\tminimumSequenceNumber: minSeqNumber,\n\t\t\treferenceSequenceNumber: refSeq,\n\t\t\tsequenceNumber: seq,\n\t\t\ttimestamp: Date.now(),\n\t\t\ttraces: [],\n\t\t\ttype: MessageType.Operation,\n\t\t};\n\t\treturn msg;\n\t}\n\n\tpublic validate(): void {\n\t\tassert(nodeOrdinalsHaveIntegrity(this.mergeTree.root));\n\t}\n\n\tpublic searchFromPos(\n\t\tpos: number,\n\t\ttarget: RegExp,\n\t): { text: string; pos: number } | undefined {\n\t\tlet start = pos;\n\t\tlet chunk = \"\";\n\t\twhile (start < this.getLength()) {\n\t\t\tchunk = this.getText(start, start + TestClient.searchChunkSize);\n\n\t\t\tconst result = chunk.match(target);\n\t\t\tif (result?.index) {\n\t\t\t\treturn { text: result[0], pos: result.index + start };\n\t\t\t}\n\t\t\tstart += TestClient.searchChunkSize;\n\t\t}\n\t}\n\n\tpublic findRandomWord(): { text: string; pos: number } | undefined {\n\t\tconst len = this.getLength();\n\t\tconst pos = random.integer(0, len);\n\t\tconst nextWord = this.searchFromPos(pos, /\\s\\w+\\b/);\n\t\treturn nextWord;\n\t}\n\n\tpublic debugDumpTree(tree: MergeTree): void {\n\t\t// want the segment's content and the state of insert/remove\n\t\tconst test: string[] = [];\n\t\twalkAllChildSegments(tree.root, (segment: ISegmentPrivate) => {\n\t\t\tconst prefixes: (string | undefined | number)[] = [];\n\t\t\tassertInserted(segment);\n\t\t\tprefixes.push(\n\t\t\t\tsegment.seq === UnassignedSequenceNumber ? `L${segment.localSeq}` : segment.seq,\n\t\t\t);\n\t\t\tif (isRemoved(segment)) {\n\t\t\t\tprefixes.push(\n\t\t\t\t\tsegment.removedSeq === UnassignedSequenceNumber\n\t\t\t\t\t\t? `L${segment.localRemovedSeq}`\n\t\t\t\t\t\t: segment.removedSeq,\n\t\t\t\t);\n\t\t\t}\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-explicit-any\n\t\t\ttest.push(`${prefixes.join(\",\")}:${(segment as any).text}`);\n\t\t});\n\t}\n\n\t/**\n\t * Rebases a (local) position from the perspective `{ seq: seqNumberFrom, localSeq }` to the perspective\n\t * of the current sequence number. This is desirable when rebasing operations for reconnection. Perform\n\t * slow-path computations in this function without leveraging the merge-tree's structure\n\t */\n\tpublic rebasePosition(pos: number, seqNumberFrom: number, localSeq: number): number {\n\t\tlet segment: ISegmentPrivate | undefined;\n\t\tlet posAccumulated = 0;\n\t\tlet offset = pos;\n\t\tconst isInsertedInView = (seg: ISegmentPrivate): boolean =>\n\t\t\tisInserted(seg) &&\n\t\t\t((seg.seq !== UnassignedSequenceNumber && seg.seq <= seqNumberFrom) ||\n\t\t\t\t(seg.localSeq !== undefined && seg.localSeq <= localSeq));\n\n\t\tconst isRemovedFromView = (s: ISegmentPrivate): boolean =>\n\t\t\tisRemoved(s) &&\n\t\t\t((s.removedSeq !== UnassignedSequenceNumber && s.removedSeq <= seqNumberFrom) ||\n\t\t\t\t(s.localRemovedSeq !== undefined && s.localRemovedSeq <= localSeq));\n\n\t\twalkAllChildSegments(this.mergeTree.root, (seg) => {\n\t\t\tassertInserted(seg);\n\t\t\tsegment = seg;\n\n\t\t\tif (isInsertedInView(seg) && !isRemovedFromView(seg)) {\n\t\t\t\tposAccumulated += seg.cachedLength;\n\t\t\t\tif (offset >= seg.cachedLength) {\n\t\t\t\t\toffset -= seg.cachedLength;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Keep going while we've yet to reach the segment at the desired position\n\t\t\treturn posAccumulated <= pos;\n\t\t});\n\n\t\tassert(segment !== undefined, \"No segment found\");\n\t\tconst segoff = getSlideToSegoff({ segment, offset }) ?? segment;\n\t\tif (segoff.segment === undefined || segoff.offset === undefined) {\n\t\t\treturn DetachedReferencePosition;\n\t\t}\n\n\t\treturn this.findReconnectionPosition(segoff.segment, localSeq) + segoff.offset;\n\t}\n\n\tpublic findReconnectionPosition(segment: ISegmentPrivate, localSeq: number): number {\n\t\tconst fasterComputedPosition = super.findReconnectionPosition(segment, localSeq);\n\n\t\tlet segmentPosition = 0;\n\t\tconst isInsertedInView = (seg: ISegmentPrivate): boolean =>\n\t\t\tisInserted(seg) && (seg.localSeq === undefined || seg.localSeq <= localSeq);\n\t\tconst isRemovedFromView = (s: ISegmentPrivate): boolean =>\n\t\t\tisRemoved(s) &&\n\t\t\t(s.removedSeq !== UnassignedSequenceNumber ||\n\t\t\t\t(s.localRemovedSeq !== undefined && s.localRemovedSeq <= localSeq));\n\t\tconst isMovedFromView = (s: ISegmentPrivate): boolean =>\n\t\t\tisMoved(s) &&\n\t\t\t(s.movedSeq !== UnassignedSequenceNumber ||\n\t\t\t\t(s.localMovedSeq !== undefined && s.localMovedSeq <= localSeq));\n\t\t/*\n Walk the segments up to the current segment, and calculate its\n position taking into account local segments that were modified,\n after the current segment.\n */\n\t\twalkAllChildSegments(this.mergeTree.root, (seg) => {\n\t\t\t// If we've found the desired segment, terminate the walk and return 'segmentPosition'.\n\t\t\tif (seg === segment) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\t// Otherwise, advance segmentPosition if the segment has been inserted and not removed\n\t\t\t// with respect to the given 'localSeq'.\n\t\t\t//\n\t\t\t// Note that all ACKed / remote ops are applied and we only need concern ourself with\n\t\t\t// determining if locally pending ops fall before/after the given 'localSeq'.\n\t\t\tif (isInsertedInView(seg) && !isRemovedFromView(seg) && !isMovedFromView(seg)) {\n\t\t\t\tsegmentPosition += seg.cachedLength;\n\t\t\t}\n\n\t\t\treturn true;\n\t\t});\n\n\t\tassert.equal(\n\t\t\tfasterComputedPosition,\n\t\t\tsegmentPosition,\n\t\t\t\"Expected fast-path computation to match result from walk all segments\",\n\t\t);\n\t\treturn segmentPosition;\n\t}\n\n\t/**\n\t * Validates segments either all have attribution information or none of them.\n\t * If no segment has attribution information, returns undefined.\n\t *\n\t * @param channel - Attribution channel name to request information from.\n\t * @returns an array of all attribution seq#s from the current perspective.\n\t * The `i`th entry of the array is the attribution key for the character at position `i`.\n\t */\n\tpublic getAllAttributionSeqs(channel?: string): (number | AttributionKey | undefined)[] {\n\t\tconst seqs: (number | AttributionKey | undefined)[] = [];\n\t\tthis.walkAllSegments((segment) => {\n\t\t\tfor (let i = 0; i < segment.cachedLength; i++) {\n\t\t\t\tconst key = segment.attribution?.getAtOffset(i, channel);\n\t\t\t\tseqs.push(key?.type === \"op\" ? key.seq : key);\n\t\t\t}\n\t\t\treturn true;\n\t\t});\n\n\t\treturn seqs;\n\t}\n\n\tpublic peekPendingSegmentGroups(): SegmentGroup | undefined;\n\tpublic peekPendingSegmentGroups(count: number): SegmentGroup | SegmentGroup[] | undefined;\n\tpublic peekPendingSegmentGroups(\n\t\tcount: number = 1,\n\t): SegmentGroup | SegmentGroup[] | undefined {\n\t\t// eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion\n\t\treturn super.peekPendingSegmentGroups(count) as SegmentGroup | SegmentGroup[] | undefined;\n\t}\n\n\t/**\n\t * Override and add some test only metrics\n\t */\n\tpublic applyMsg(msg: ISequencedDocumentMessage, local: boolean = false): void {\n\t\tlet traceStart: Trace | undefined;\n\t\tif (this.measureOps) {\n\t\t\ttraceStart = Trace.start();\n\t\t}\n\n\t\tsuper.applyMsg(msg, local);\n\n\t\tif (traceStart) {\n\t\t\tthis.accumTime += elapsedMicroseconds(traceStart);\n\t\t\tthis.accumOps++;\n\t\t\tthis.accumWindow += this.getCurrentSeq() - this.getCollabWindow().minSeq;\n\t\t}\n\t}\n\n\t/**\n\t * Override and add some test only metrics\n\t */\n\tupdateMinSeq(minSeq: number): void {\n\t\tlet trace: Trace | undefined;\n\t\tif (this.measureOps) {\n\t\t\ttrace = Trace.start();\n\t\t}\n\n\t\tsuper.updateMinSeq(minSeq);\n\t\tif (trace) {\n\t\t\tconst elapsed = elapsedMicroseconds(trace);\n\t\t\tthis.accumWindowTime += elapsed;\n\t\t\tif (elapsed > this.maxWindowTime) {\n\t\t\t\tthis.maxWindowTime = elapsed;\n\t\t\t}\n\t\t}\n\t}\n\n\tslowSearchForMarker(\n\t\tstartPos: number,\n\t\tmarkerLabel: string,\n\t\tforwards = true,\n\t): ReferencePosition | undefined {\n\t\tlet foundMarker: Marker | undefined;\n\n\t\tconst { segment } = this.getContainingSegment<ISegmentPrivate>(startPos);\n\t\tassertSegmentLeaf(segment);\n\t\tif (Marker.is(segment)) {\n\t\t\tif (refHasTileLabel(segment, markerLabel)) {\n\t\t\t\tfoundMarker = segment;\n\t\t\t}\n\t\t} else {\n\t\t\tif (forwards) {\n\t\t\t\tforwardExcursion(segment, (seg) => {\n\t\t\t\t\tif (Marker.is(seg) && refHasTileLabel(seg, markerLabel)) {\n\t\t\t\t\t\tfoundMarker = seg;\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tbackwardExcursion(segment, (seg) => {\n\t\t\t\t\tif (Marker.is(seg) && refHasTileLabel(seg, markerLabel)) {\n\t\t\t\t\t\tfoundMarker = seg;\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\treturn foundMarker;\n\t}\n}\n\nfunction elapsedMicroseconds(trace: Trace): number {\n\treturn trace.trace().duration * 1000;\n}\n\n// the client doesn't submit ops, so this adds a callback to capture them\nexport type TestClientRevertibleDriver = MergeTreeRevertibleDriver &\n\tPartial<{ submitOpCallback?: (op: IMergeTreeOp | undefined) => void }>;\n\nexport const createRevertDriver = (client: TestClient): TestClientRevertibleDriver => {\n\treturn {\n\t\tremoveRange(start: number, end: number): void {\n\t\t\tconst op = client.removeRangeLocal(start, end);\n\t\t\tthis.submitOpCallback?.(op);\n\t\t},\n\t\tannotateRange(start: number, end: number, props: PropertySet): void {\n\t\t\tconst op = client.annotateRangeLocal(start, end, props);\n\t\t\tthis.submitOpCallback?.(op);\n\t\t},\n\t\tinsertFromSpec(pos: number, spec: IJSONSegment): void {\n\t\t\tconst op = client.insertSegmentLocal(pos, client.specToSegment(spec));\n\t\t\tthis.submitOpCallback?.(op);\n\t\t},\n\t};\n};\n\nexport interface MergeTreeStats {\n\tmaxHeight: number;\n\tnodeCount: number;\n\tleafCount: number;\n\tremovedLeafCount: number;\n\tliveCount: number;\n\thisto: number[];\n\twindowTime?: number;\n\tpackTime?: number;\n\tordTime?: number;\n\tmaxOrdTime?: number;\n}\n\nexport function getStats(tree: MergeTree): MergeTreeStats {\n\tconst nodeGetStats = (block: MergeBlock): MergeTreeStats => {\n\t\tconst stats: MergeTreeStats = {\n\t\t\tmaxHeight: 0,\n\t\t\tnodeCount: 0,\n\t\t\tleafCount: 0,\n\t\t\tremovedLeafCount: 0,\n\t\t\tliveCount: 0,\n\t\t\thisto: [],\n\t\t};\n\t\tfor (let k = 0; k < MaxNodesInBlock; k++) {\n\t\t\tstats.histo[k] = 0;\n\t\t}\n\t\tfor (let i = 0; i < block.childCount; i++) {\n\t\t\tconst child = block.children[i];\n\t\t\tlet height = 1;\n\t\t\tif (child.isLeaf()) {\n\t\t\t\tstats.leafCount++;\n\t\t\t\tconst segment = child;\n\t\t\t\tif (isRemoved(segment)) {\n\t\t\t\t\tstats.removedLeafCount++;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tconst childStats = nodeGetStats(child);\n\t\t\t\theight = 1 + childStats.maxHeight;\n\t\t\t\tstats.nodeCount += childStats.nodeCount;\n\t\t\t\tstats.leafCount += childStats.leafCount;\n\t\t\t\tstats.removedLeafCount += childStats.removedLeafCount;\n\t\t\t\tstats.liveCount += childStats.liveCount;\n\t\t\t\tfor (let j = 0; j < MaxNodesInBlock; j++) {\n\t\t\t\t\tstats.histo[j] += childStats.histo[j];\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (height > stats.maxHeight) {\n\t\t\t\tstats.maxHeight = height;\n\t\t\t}\n\t\t}\n\t\tstats.histo[block.childCount]++;\n\t\tstats.nodeCount++;\n\t\tstats.liveCount += block.childCount;\n\t\treturn stats;\n\t};\n\tconst rootStats = nodeGetStats(tree.root);\n\treturn rootStats;\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"testClientLogger.d.ts","sourceRoot":"","sources":["../../src/test/testClientLogger.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAQH,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAehD,OAAO,EAAE,WAAW,EAAmB,MAAM,kBAAkB,CAAC;AAGhE,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AA4C7C,KAAK,SAAS,CAAC,WAAW,SAAS,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC,CAAC;AAEtF,wBAAgB,2BAA2B,CAC1C,QAAQ,SAAS,SAAS,CAAC,WAAW,CAAC,EACvC,WAAW,SAAS,MAAM,GAAG,MAAM,GAAG,MAAM,QAAQ,EAEpD,IAAI,EAAE;IACL,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,iBAAiB,GAAG,WAAW,CAAC;CAC1C,EACD,GAAG,SAAS,EAAE,WAAW,EAAE,GACzB,MAAM,CAAC,MAAM,QAAQ,EAAE,UAAU,CAAC,GAAG;IAAE,GAAG,EAAE,UAAU,EAAE,CAAA;CAAE,CAuB5D;AACD,qBAAa,gBAAgB;IA0C3B,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC;WA1CV,QAAQ,CAAC,OAAO,EAAE,SAAS,UAAU,EAAE,GAAG,MAAM;IAiB9D,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;IAExC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAgB;IACzC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAkB;IAEhD,OAAO,CAAC,SAAS,CAAgB;IACjC,OAAO,CAAC,SAAS,CAAgB;IAEjC,OAAO,CAAC,aAAa,CAAoC;IAEzD,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAsB;IAEvD;;;OAGG;IACI,OAAO,IAAI,IAAI;gBAQJ,OAAO,EAAE,SAAS,UAAU,EAAE,EAC9B,KAAK,CAAC,oBAAQ;IA4DhC,OAAO,CAAC,aAAa;IA+Bd,QAAQ,CAAC,IAAI,CAAC,EAAE;QACtB,KAAK,CAAC,EAAE,OAAO,CAAC;QAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,WAAW,CAAC,EAAE,MAAM,CAAC;KACrB,GAAG,MAAM;IA+DV,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,SAAS,UAAU,EAAE,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM;IAOhE,QAAQ,CAAC,aAAa,GAAE,OAAe,GAAG,MAAM;IAyBhD,cAAc,CAAC,CAAC,EAAE,OAAO,GAAG,KAAK;IASxC,OAAO,CAAC,MAAM,CAAC,YAAY;CAkD3B"}
1
+ {"version":3,"file":"testClientLogger.d.ts","sourceRoot":"","sources":["../../src/test/testClientLogger.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAQH,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAShD,OAAO,EAAE,WAAW,EAAmB,MAAM,kBAAkB,CAAC;AAIhE,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AA4C7C,KAAK,SAAS,CAAC,WAAW,SAAS,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC,CAAC;AAEtF,wBAAgB,2BAA2B,CAC1C,QAAQ,SAAS,SAAS,CAAC,WAAW,CAAC,EACvC,WAAW,SAAS,MAAM,GAAG,MAAM,GAAG,MAAM,QAAQ,EAEpD,IAAI,EAAE;IACL,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,iBAAiB,GAAG,WAAW,CAAC;CAC1C,EACD,GAAG,SAAS,EAAE,WAAW,EAAE,GACzB,MAAM,CAAC,MAAM,QAAQ,EAAE,UAAU,CAAC,GAAG;IAAE,GAAG,EAAE,UAAU,EAAE,CAAA;CAAE,CAuB5D;AACD,qBAAa,gBAAgB;IA0C3B,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC;WA1CV,QAAQ,CAAC,OAAO,EAAE,SAAS,UAAU,EAAE,GAAG,MAAM;IAiB9D,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;IAExC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAgB;IACzC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAkB;IAEhD,OAAO,CAAC,SAAS,CAAgB;IACjC,OAAO,CAAC,SAAS,CAAgB;IAEjC,OAAO,CAAC,aAAa,CAAoC;IAEzD,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAsB;IAEvD;;;OAGG;IACI,OAAO,IAAI,IAAI;gBAQJ,OAAO,EAAE,SAAS,UAAU,EAAE,EAC9B,KAAK,CAAC,oBAAQ;IA4DhC,OAAO,CAAC,aAAa;IA+Bd,QAAQ,CAAC,IAAI,CAAC,EAAE;QACtB,KAAK,CAAC,EAAE,OAAO,CAAC;QAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,WAAW,CAAC,EAAE,MAAM,CAAC;KACrB,GAAG,MAAM;IA+DV,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,SAAS,UAAU,EAAE,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM;IAOhE,QAAQ,CAAC,aAAa,GAAE,OAAe,GAAG,MAAM;IAyBhD,cAAc,CAAC,CAAC,EAAE,OAAO,GAAG,KAAK;IASxC,OAAO,CAAC,MAAM,CAAC,YAAY;CAmD3B"}