@fluidframework/merge-tree 2.30.0 → 2.31.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (308) hide show
  1. package/CHANGELOG.md +403 -399
  2. package/api-report/merge-tree.legacy.alpha.api.md +1 -0
  3. package/dist/MergeTreeTextHelper.d.ts +9 -3
  4. package/dist/MergeTreeTextHelper.d.ts.map +1 -1
  5. package/dist/MergeTreeTextHelper.js +5 -5
  6. package/dist/MergeTreeTextHelper.js.map +1 -1
  7. package/dist/client.d.ts +7 -13
  8. package/dist/client.d.ts.map +1 -1
  9. package/dist/client.js +136 -110
  10. package/dist/client.js.map +1 -1
  11. package/dist/endOfTreeSegment.d.ts +12 -8
  12. package/dist/endOfTreeSegment.d.ts.map +1 -1
  13. package/dist/endOfTreeSegment.js +2 -4
  14. package/dist/endOfTreeSegment.js.map +1 -1
  15. package/dist/index.d.ts +6 -3
  16. package/dist/index.d.ts.map +1 -1
  17. package/dist/index.js +2 -3
  18. package/dist/index.js.map +1 -1
  19. package/dist/mergeTree.d.ts +37 -23
  20. package/dist/mergeTree.d.ts.map +1 -1
  21. package/dist/mergeTree.js +400 -483
  22. package/dist/mergeTree.js.map +1 -1
  23. package/dist/mergeTreeDeltaCallback.d.ts +4 -8
  24. package/dist/mergeTreeDeltaCallback.d.ts.map +1 -1
  25. package/dist/mergeTreeDeltaCallback.js.map +1 -1
  26. package/dist/mergeTreeNodes.d.ts +32 -10
  27. package/dist/mergeTreeNodes.d.ts.map +1 -1
  28. package/dist/mergeTreeNodes.js +43 -28
  29. package/dist/mergeTreeNodes.js.map +1 -1
  30. package/dist/partialLengths.d.ts +2 -2
  31. package/dist/partialLengths.d.ts.map +1 -1
  32. package/dist/partialLengths.js +181 -109
  33. package/dist/partialLengths.js.map +1 -1
  34. package/dist/perspective.d.ts +8 -27
  35. package/dist/perspective.d.ts.map +1 -1
  36. package/dist/perspective.js +7 -67
  37. package/dist/perspective.js.map +1 -1
  38. package/dist/revertibles.d.ts.map +1 -1
  39. package/dist/revertibles.js +2 -2
  40. package/dist/revertibles.js.map +1 -1
  41. package/dist/segmentInfos.d.ts +20 -106
  42. package/dist/segmentInfos.d.ts.map +1 -1
  43. package/dist/segmentInfos.js +28 -42
  44. package/dist/segmentInfos.js.map +1 -1
  45. package/dist/segmentPropertiesManager.d.ts +1 -14
  46. package/dist/segmentPropertiesManager.d.ts.map +1 -1
  47. package/dist/segmentPropertiesManager.js +3 -17
  48. package/dist/segmentPropertiesManager.js.map +1 -1
  49. package/dist/snapshotLoader.d.ts.map +1 -1
  50. package/dist/snapshotLoader.js +62 -19
  51. package/dist/snapshotLoader.js.map +1 -1
  52. package/dist/snapshotV1.d.ts.map +1 -1
  53. package/dist/snapshotV1.js +55 -24
  54. package/dist/snapshotV1.js.map +1 -1
  55. package/dist/snapshotlegacy.d.ts.map +1 -1
  56. package/dist/snapshotlegacy.js +6 -9
  57. package/dist/snapshotlegacy.js.map +1 -1
  58. package/dist/stamps.d.ts +1 -1
  59. package/dist/stamps.js +1 -1
  60. package/dist/stamps.js.map +1 -1
  61. package/dist/test/Insertion.perf.spec.js +6 -51
  62. package/dist/test/Insertion.perf.spec.js.map +1 -1
  63. package/dist/test/PartialLengths.perf.spec.js +18 -25
  64. package/dist/test/PartialLengths.perf.spec.js.map +1 -1
  65. package/dist/test/Removal.perf.spec.js +13 -41
  66. package/dist/test/Removal.perf.spec.js.map +1 -1
  67. package/dist/test/beastTest.spec.d.ts.map +1 -1
  68. package/dist/test/beastTest.spec.js +41 -66
  69. package/dist/test/beastTest.spec.js.map +1 -1
  70. package/dist/test/client.annotateMarker.spec.js +1 -11
  71. package/dist/test/client.annotateMarker.spec.js.map +1 -1
  72. package/dist/test/client.applyMsg.spec.js +14 -14
  73. package/dist/test/client.applyMsg.spec.js.map +1 -1
  74. package/dist/test/client.getPosition.spec.js +1 -1
  75. package/dist/test/client.getPosition.spec.js.map +1 -1
  76. package/dist/test/client.localReference.spec.js +1 -1
  77. package/dist/test/client.localReference.spec.js.map +1 -1
  78. package/dist/test/client.rollback.spec.js +49 -58
  79. package/dist/test/client.rollback.spec.js.map +1 -1
  80. package/dist/test/client.rollbackFarm.spec.js +1 -1
  81. package/dist/test/client.rollbackFarm.spec.js.map +1 -1
  82. package/dist/test/client.searchForMarker.spec.js +4 -21
  83. package/dist/test/client.searchForMarker.spec.js.map +1 -1
  84. package/dist/test/index.d.ts +2 -2
  85. package/dist/test/index.d.ts.map +1 -1
  86. package/dist/test/index.js +2 -6
  87. package/dist/test/index.js.map +1 -1
  88. package/dist/test/mergeTree.annotate.deltaCallback.spec.js +14 -59
  89. package/dist/test/mergeTree.annotate.deltaCallback.spec.js.map +1 -1
  90. package/dist/test/mergeTree.annotate.spec.js +47 -63
  91. package/dist/test/mergeTree.annotate.spec.js.map +1 -1
  92. package/dist/test/mergeTree.insert.deltaCallback.spec.js +9 -62
  93. package/dist/test/mergeTree.insert.deltaCallback.spec.js.map +1 -1
  94. package/dist/test/mergeTree.insertingWalk.spec.js +59 -125
  95. package/dist/test/mergeTree.insertingWalk.spec.js.map +1 -1
  96. package/dist/test/mergeTree.markRangeRemoved.deltaCallback.spec.js +12 -93
  97. package/dist/test/mergeTree.markRangeRemoved.deltaCallback.spec.js.map +1 -1
  98. package/dist/test/mergeTree.markRangeRemoved.spec.js +10 -7
  99. package/dist/test/mergeTree.markRangeRemoved.spec.js.map +1 -1
  100. package/dist/test/mergeTree.walk.spec.js +2 -14
  101. package/dist/test/mergeTree.walk.spec.js.map +1 -1
  102. package/dist/test/mergeTreeOperationRunner.js +2 -2
  103. package/dist/test/mergeTreeOperationRunner.js.map +1 -1
  104. package/dist/test/obliterate.concurrent.spec.js +18 -23
  105. package/dist/test/obliterate.concurrent.spec.js.map +1 -1
  106. package/dist/test/obliterate.partialLength.spec.js +166 -136
  107. package/dist/test/obliterate.partialLength.spec.js.map +1 -1
  108. package/dist/test/obliterate.spec.js +16 -126
  109. package/dist/test/obliterate.spec.js.map +1 -1
  110. package/dist/test/partialLength.spec.js +28 -196
  111. package/dist/test/partialLength.spec.js.map +1 -1
  112. package/dist/test/perspective.spec.js +34 -0
  113. package/dist/test/perspective.spec.js.map +1 -1
  114. package/dist/test/propertyManager.spec.js +1 -1
  115. package/dist/test/propertyManager.spec.js.map +1 -1
  116. package/dist/test/resetPendingSegmentsToOp.spec.js +0 -2
  117. package/dist/test/resetPendingSegmentsToOp.spec.js.map +1 -1
  118. package/dist/test/segmentGroupCollection.spec.js +10 -4
  119. package/dist/test/segmentGroupCollection.spec.js.map +1 -1
  120. package/dist/test/testClient.d.ts +1 -0
  121. package/dist/test/testClient.d.ts.map +1 -1
  122. package/dist/test/testClient.js +16 -26
  123. package/dist/test/testClient.js.map +1 -1
  124. package/dist/test/testClientLogger.d.ts.map +1 -1
  125. package/dist/test/testClientLogger.js +3 -10
  126. package/dist/test/testClientLogger.js.map +1 -1
  127. package/dist/test/testServer.d.ts +2 -1
  128. package/dist/test/testServer.d.ts.map +1 -1
  129. package/dist/test/testServer.js +7 -5
  130. package/dist/test/testServer.js.map +1 -1
  131. package/dist/test/testUtils.d.ts +36 -56
  132. package/dist/test/testUtils.d.ts.map +1 -1
  133. package/dist/test/testUtils.js +68 -77
  134. package/dist/test/testUtils.js.map +1 -1
  135. package/dist/test/text.d.ts +2 -2
  136. package/dist/test/text.d.ts.map +1 -1
  137. package/dist/test/text.js +5 -2
  138. package/dist/test/text.js.map +1 -1
  139. package/dist/textSegment.d.ts +0 -6
  140. package/dist/textSegment.d.ts.map +1 -1
  141. package/dist/textSegment.js.map +1 -1
  142. package/dist/zamboni.d.ts.map +1 -1
  143. package/dist/zamboni.js +53 -26
  144. package/dist/zamboni.js.map +1 -1
  145. package/lib/MergeTreeTextHelper.d.ts +9 -3
  146. package/lib/MergeTreeTextHelper.d.ts.map +1 -1
  147. package/lib/MergeTreeTextHelper.js +5 -5
  148. package/lib/MergeTreeTextHelper.js.map +1 -1
  149. package/lib/client.d.ts +7 -13
  150. package/lib/client.d.ts.map +1 -1
  151. package/lib/client.js +117 -116
  152. package/lib/client.js.map +1 -1
  153. package/lib/endOfTreeSegment.d.ts +12 -8
  154. package/lib/endOfTreeSegment.d.ts.map +1 -1
  155. package/lib/endOfTreeSegment.js +2 -4
  156. package/lib/endOfTreeSegment.js.map +1 -1
  157. package/lib/index.d.ts +6 -3
  158. package/lib/index.d.ts.map +1 -1
  159. package/lib/index.js +1 -1
  160. package/lib/index.js.map +1 -1
  161. package/lib/mergeTree.d.ts +37 -23
  162. package/lib/mergeTree.d.ts.map +1 -1
  163. package/lib/mergeTree.js +381 -488
  164. package/lib/mergeTree.js.map +1 -1
  165. package/lib/mergeTreeDeltaCallback.d.ts +4 -8
  166. package/lib/mergeTreeDeltaCallback.d.ts.map +1 -1
  167. package/lib/mergeTreeDeltaCallback.js.map +1 -1
  168. package/lib/mergeTreeNodes.d.ts +32 -10
  169. package/lib/mergeTreeNodes.d.ts.map +1 -1
  170. package/lib/mergeTreeNodes.js +42 -29
  171. package/lib/mergeTreeNodes.js.map +1 -1
  172. package/lib/partialLengths.d.ts +2 -2
  173. package/lib/partialLengths.d.ts.map +1 -1
  174. package/lib/partialLengths.js +160 -111
  175. package/lib/partialLengths.js.map +1 -1
  176. package/lib/perspective.d.ts +8 -27
  177. package/lib/perspective.d.ts.map +1 -1
  178. package/lib/perspective.js +8 -68
  179. package/lib/perspective.js.map +1 -1
  180. package/lib/revertibles.d.ts.map +1 -1
  181. package/lib/revertibles.js +2 -2
  182. package/lib/revertibles.js.map +1 -1
  183. package/lib/segmentInfos.d.ts +20 -106
  184. package/lib/segmentInfos.d.ts.map +1 -1
  185. package/lib/segmentInfos.js +26 -37
  186. package/lib/segmentInfos.js.map +1 -1
  187. package/lib/segmentPropertiesManager.d.ts +1 -14
  188. package/lib/segmentPropertiesManager.d.ts.map +1 -1
  189. package/lib/segmentPropertiesManager.js +2 -16
  190. package/lib/segmentPropertiesManager.js.map +1 -1
  191. package/lib/snapshotLoader.d.ts.map +1 -1
  192. package/lib/snapshotLoader.js +39 -19
  193. package/lib/snapshotLoader.js.map +1 -1
  194. package/lib/snapshotV1.d.ts.map +1 -1
  195. package/lib/snapshotV1.js +34 -26
  196. package/lib/snapshotV1.js.map +1 -1
  197. package/lib/snapshotlegacy.d.ts.map +1 -1
  198. package/lib/snapshotlegacy.js +7 -10
  199. package/lib/snapshotlegacy.js.map +1 -1
  200. package/lib/stamps.d.ts +1 -1
  201. package/lib/stamps.js +1 -1
  202. package/lib/stamps.js.map +1 -1
  203. package/lib/test/Insertion.perf.spec.js +6 -51
  204. package/lib/test/Insertion.perf.spec.js.map +1 -1
  205. package/lib/test/PartialLengths.perf.spec.js +18 -25
  206. package/lib/test/PartialLengths.perf.spec.js.map +1 -1
  207. package/lib/test/Removal.perf.spec.js +13 -41
  208. package/lib/test/Removal.perf.spec.js.map +1 -1
  209. package/lib/test/beastTest.spec.d.ts.map +1 -1
  210. package/lib/test/beastTest.spec.js +42 -67
  211. package/lib/test/beastTest.spec.js.map +1 -1
  212. package/lib/test/client.annotateMarker.spec.js +1 -11
  213. package/lib/test/client.annotateMarker.spec.js.map +1 -1
  214. package/lib/test/client.applyMsg.spec.js +14 -14
  215. package/lib/test/client.applyMsg.spec.js.map +1 -1
  216. package/lib/test/client.getPosition.spec.js +1 -1
  217. package/lib/test/client.getPosition.spec.js.map +1 -1
  218. package/lib/test/client.localReference.spec.js +1 -1
  219. package/lib/test/client.localReference.spec.js.map +1 -1
  220. package/lib/test/client.rollback.spec.js +50 -59
  221. package/lib/test/client.rollback.spec.js.map +1 -1
  222. package/lib/test/client.rollbackFarm.spec.js +1 -1
  223. package/lib/test/client.rollbackFarm.spec.js.map +1 -1
  224. package/lib/test/client.searchForMarker.spec.js +4 -21
  225. package/lib/test/client.searchForMarker.spec.js.map +1 -1
  226. package/lib/test/index.d.ts +2 -2
  227. package/lib/test/index.d.ts.map +1 -1
  228. package/lib/test/index.js +1 -1
  229. package/lib/test/index.js.map +1 -1
  230. package/lib/test/mergeTree.annotate.deltaCallback.spec.js +15 -60
  231. package/lib/test/mergeTree.annotate.deltaCallback.spec.js.map +1 -1
  232. package/lib/test/mergeTree.annotate.spec.js +48 -64
  233. package/lib/test/mergeTree.annotate.spec.js.map +1 -1
  234. package/lib/test/mergeTree.insert.deltaCallback.spec.js +10 -63
  235. package/lib/test/mergeTree.insert.deltaCallback.spec.js.map +1 -1
  236. package/lib/test/mergeTree.insertingWalk.spec.js +61 -127
  237. package/lib/test/mergeTree.insertingWalk.spec.js.map +1 -1
  238. package/lib/test/mergeTree.markRangeRemoved.deltaCallback.spec.js +13 -94
  239. package/lib/test/mergeTree.markRangeRemoved.deltaCallback.spec.js.map +1 -1
  240. package/lib/test/mergeTree.markRangeRemoved.spec.js +10 -7
  241. package/lib/test/mergeTree.markRangeRemoved.spec.js.map +1 -1
  242. package/lib/test/mergeTree.walk.spec.js +2 -14
  243. package/lib/test/mergeTree.walk.spec.js.map +1 -1
  244. package/lib/test/mergeTreeOperationRunner.js +3 -3
  245. package/lib/test/mergeTreeOperationRunner.js.map +1 -1
  246. package/lib/test/obliterate.concurrent.spec.js +18 -23
  247. package/lib/test/obliterate.concurrent.spec.js.map +1 -1
  248. package/lib/test/obliterate.partialLength.spec.js +167 -137
  249. package/lib/test/obliterate.partialLength.spec.js.map +1 -1
  250. package/lib/test/obliterate.spec.js +17 -127
  251. package/lib/test/obliterate.spec.js.map +1 -1
  252. package/lib/test/partialLength.spec.js +29 -197
  253. package/lib/test/partialLength.spec.js.map +1 -1
  254. package/lib/test/perspective.spec.js +34 -0
  255. package/lib/test/perspective.spec.js.map +1 -1
  256. package/lib/test/propertyManager.spec.js +2 -2
  257. package/lib/test/propertyManager.spec.js.map +1 -1
  258. package/lib/test/resetPendingSegmentsToOp.spec.js +0 -2
  259. package/lib/test/resetPendingSegmentsToOp.spec.js.map +1 -1
  260. package/lib/test/segmentGroupCollection.spec.js +10 -4
  261. package/lib/test/segmentGroupCollection.spec.js.map +1 -1
  262. package/lib/test/testClient.d.ts +1 -0
  263. package/lib/test/testClient.d.ts.map +1 -1
  264. package/lib/test/testClient.js +18 -28
  265. package/lib/test/testClient.js.map +1 -1
  266. package/lib/test/testClientLogger.d.ts.map +1 -1
  267. package/lib/test/testClientLogger.js +3 -10
  268. package/lib/test/testClientLogger.js.map +1 -1
  269. package/lib/test/testServer.d.ts +2 -1
  270. package/lib/test/testServer.d.ts.map +1 -1
  271. package/lib/test/testServer.js +7 -5
  272. package/lib/test/testServer.js.map +1 -1
  273. package/lib/test/testUtils.d.ts +36 -56
  274. package/lib/test/testUtils.d.ts.map +1 -1
  275. package/lib/test/testUtils.js +66 -48
  276. package/lib/test/testUtils.js.map +1 -1
  277. package/lib/test/text.d.ts +2 -2
  278. package/lib/test/text.d.ts.map +1 -1
  279. package/lib/test/text.js +6 -3
  280. package/lib/test/text.js.map +1 -1
  281. package/lib/textSegment.d.ts +0 -6
  282. package/lib/textSegment.d.ts.map +1 -1
  283. package/lib/textSegment.js.map +1 -1
  284. package/lib/tsdoc-metadata.json +1 -1
  285. package/lib/zamboni.d.ts.map +1 -1
  286. package/lib/zamboni.js +32 -28
  287. package/lib/zamboni.js.map +1 -1
  288. package/package.json +17 -20
  289. package/src/MergeTreeTextHelper.ts +17 -12
  290. package/src/client.ts +141 -197
  291. package/src/endOfTreeSegment.ts +11 -8
  292. package/src/index.ts +4 -3
  293. package/src/mergeTree.ts +482 -633
  294. package/src/mergeTreeDeltaCallback.ts +4 -8
  295. package/src/mergeTreeNodes.ts +66 -45
  296. package/src/partialLengths.ts +181 -137
  297. package/src/perspective.ts +17 -95
  298. package/src/revertibles.ts +2 -7
  299. package/src/segmentInfos.ts +48 -141
  300. package/src/segmentPropertiesManager.ts +2 -16
  301. package/src/snapshotLoader.ts +62 -30
  302. package/src/snapshotV1.ts +36 -28
  303. package/src/snapshotlegacy.ts +7 -16
  304. package/src/stamps.ts +1 -1
  305. package/src/textSegment.ts +0 -13
  306. package/src/zamboni.ts +38 -32
  307. package/tsconfig.json +1 -0
  308. package/prettier.config.cjs +0 -8
@@ -140,15 +140,11 @@ export interface IMergeTreeDeltaOpArgs {
140
140
  * This field is omitted for deltas corresponding to unacknowledged changes.
141
141
  */
142
142
  readonly sequencedMessage?: ISequencedDocumentMessage;
143
- }
144
143
 
145
- /**
146
- * @internal
147
- */
148
- export interface IMergeTreeClientSequenceArgs {
149
- readonly clientId: number;
150
- readonly referenceSequenceNumber: number;
151
- readonly sequenceNumber: number;
144
+ /**
145
+ * Set to true if this delta is being performed as part of a rollback of unsent local changes.
146
+ */
147
+ readonly rollback?: true;
152
148
  }
153
149
 
154
150
  /**
@@ -7,12 +7,18 @@ import { assert } from "@fluidframework/core-utils/internal";
7
7
  import { AttributionKey } from "@fluidframework/runtime-definitions/internal";
8
8
 
9
9
  import { IAttributionCollection } from "./attributionCollection.js";
10
- import { LocalClientId, UnassignedSequenceNumber } from "./constants.js";
10
+ import {
11
+ LocalClientId,
12
+ NonCollabClient,
13
+ UnassignedSequenceNumber,
14
+ UniversalSequenceNumber,
15
+ } from "./constants.js";
11
16
  import { LocalReferenceCollection, type LocalReferencePosition } from "./localReference.js";
12
17
  import { TrackingGroupCollection } from "./mergeTreeTracking.js";
13
18
  import { IJSONSegment, IMarkerDef, ReferenceType } from "./ops.js";
14
19
  import { computeHierarchicalOrdinal } from "./ordinal.js";
15
20
  import type { PartialSequenceLengths } from "./partialLengths.js";
21
+ import { LocalDefaultPerspective, PriorPerspective, type Perspective } from "./perspective.js";
16
22
  import { PropertySet, clone, createMap, type MapLike } from "./properties.js";
17
23
  import { ReferencePosition } from "./referencePositions.js";
18
24
  import { SegmentGroupCollection } from "./segmentGroupCollection.js";
@@ -20,16 +26,15 @@ import {
20
26
  hasProp,
21
27
  isInserted,
22
28
  isMergeNodeInfo as isMergeNode,
23
- isMoved,
24
29
  isRemoved,
25
30
  overwriteInfo,
26
- type IInsertionInfo,
31
+ type IHasInsertionInfo,
27
32
  type IMergeNodeInfo,
28
- type IMoveInfo,
29
- type IRemovalInfo,
33
+ type IHasRemovalInfo,
30
34
  type SegmentWithInfo,
31
35
  } from "./segmentInfos.js";
32
36
  import { PropertiesManager } from "./segmentPropertiesManager.js";
37
+ import type { OperationStamp, SliceRemoveOperationStamp } from "./stamps.js";
33
38
 
34
39
  /**
35
40
  * This interface exposes internal things to dds that leverage merge tree,
@@ -91,7 +96,7 @@ export interface ISegmentPrivate extends ISegmentInternal {
91
96
  obliteratePrecedingInsertion?: ObliterateInfo;
92
97
  }
93
98
  /**
94
- * Segment leafs are segments that have both IMergeNodeInfo and IInsertionInfo. This means they
99
+ * Segment leafs are segments that have both IMergeNodeInfo and IHasInsertionInfo. This means they
95
100
  * are inserted at a position, and bound via their parent MergeBlock to the merge tree. MergeBlocks'
96
101
  * children are either a segment leaf, or another merge block for interior nodes of the tree. When working
97
102
  * within the tree it is generally unnecessary to use type coercions methods common to the infos, and segment
@@ -99,7 +104,7 @@ export interface ISegmentPrivate extends ISegmentInternal {
99
104
  * merge tree, like via client's public methods, it becomes necessary to use the type coercions methods
100
105
  * to ensure the passed in segment objects are correctly bound to the merge tree.
101
106
  */
102
- export type ISegmentLeaf = SegmentWithInfo<IMergeNodeInfo & IInsertionInfo>;
107
+ export type ISegmentLeaf = SegmentWithInfo<IMergeNodeInfo & IHasInsertionInfo>;
103
108
  /**
104
109
  * A type-guard which determines if the segment has segment leaf, and
105
110
  * returns true if it does, along with applying strong typing.
@@ -130,7 +135,7 @@ export const assertSegmentLeaf: (segmentLike: unknown) => asserts segmentLike is
130
135
  * type as segments may not yet be bound to the tree, so lack merge node info which is required for
131
136
  * segment leafs.
132
137
  */
133
- export type IMergeNodeBuilder = MergeBlock | SegmentWithInfo<IInsertionInfo>;
138
+ export type IMergeNodeBuilder = MergeBlock | SegmentWithInfo<IHasInsertionInfo>;
134
139
 
135
140
  /**
136
141
  * This type is used by MergeBlocks to define their children, which are either segments or other
@@ -211,12 +216,12 @@ export interface ISegmentAction<TClientData> {
211
216
  ): boolean;
212
217
  }
213
218
  export interface ISegmentChanges {
214
- next?: SegmentWithInfo<IInsertionInfo>;
215
- replaceCurrent?: SegmentWithInfo<IInsertionInfo>;
219
+ next?: SegmentWithInfo<IHasInsertionInfo>;
220
+ replaceCurrent?: SegmentWithInfo<IHasInsertionInfo>;
216
221
  }
217
222
 
218
223
  export interface InsertContext {
219
- candidateSegment?: SegmentWithInfo<IInsertionInfo>;
224
+ candidateSegment?: SegmentWithInfo<IHasInsertionInfo>;
220
225
  leaf: (segment: ISegmentLeaf | undefined, pos: number, ic: InsertContext) => ISegmentChanges;
221
226
  continuePredicate?: (continueFromBlock: MergeBlock) => boolean;
222
227
  }
@@ -225,9 +230,7 @@ export interface ObliterateInfo {
225
230
  start: LocalReferencePosition;
226
231
  end: LocalReferencePosition;
227
232
  refSeq: number;
228
- clientId: number;
229
- seq: number;
230
- localSeq: number | undefined;
233
+ stamp: SliceRemoveOperationStamp;
231
234
  segmentGroup: SegmentGroup | undefined;
232
235
  }
233
236
 
@@ -358,26 +361,18 @@ export abstract class BaseSegment implements ISegment {
358
361
  protected cloneInto(b: ISegment): void {
359
362
  const seg: ISegmentPrivate = b;
360
363
  if (isInserted(this)) {
361
- overwriteInfo<IInsertionInfo>(seg, {
362
- clientId: this.clientId,
363
- seq: this.seq,
364
+ overwriteInfo<IHasInsertionInfo>(seg, {
365
+ insert: this.insert,
364
366
  });
365
367
  }
366
368
  // TODO: deep clone properties
367
369
  seg.properties = clone(this.properties);
368
370
  if (isRemoved(this)) {
369
- overwriteInfo<IRemovalInfo>(seg, {
370
- removedSeq: this.removedSeq,
371
- removedClientIds: [...this.removedClientIds],
372
- });
373
- }
374
- if (isMoved(this)) {
375
- overwriteInfo<IMoveInfo>(seg, {
376
- movedSeq: this.movedSeq,
377
- movedSeqs: [...this.movedSeqs],
378
- movedClientIds: [...this.movedClientIds],
371
+ overwriteInfo<IHasRemovalInfo>(seg, {
372
+ removes: [...this.removes],
379
373
  });
380
374
  }
375
+
381
376
  seg.attribution = this.attribution?.clone();
382
377
  }
383
378
 
@@ -421,25 +416,11 @@ export abstract class BaseSegment implements ISegment {
421
416
  }
422
417
 
423
418
  if (isInserted(this)) {
424
- overwriteInfo<IInsertionInfo>(leafSegment, {
425
- seq: this.seq,
426
- localSeq: this.localSeq,
427
- clientId: this.clientId,
428
- });
419
+ overwriteInfo<IHasInsertionInfo>(leafSegment, { insert: this.insert });
429
420
  }
430
421
  if (isRemoved(this)) {
431
- overwriteInfo<IRemovalInfo>(leafSegment, {
432
- removedClientIds: [...this.removedClientIds],
433
- removedSeq: this.removedSeq,
434
- localRemovedSeq: this.localRemovedSeq,
435
- });
436
- }
437
- if (isMoved(this)) {
438
- overwriteInfo<IMoveInfo>(leafSegment, {
439
- movedClientIds: [...this.movedClientIds],
440
- movedSeq: this.movedSeq,
441
- movedSeqs: [...this.movedSeqs],
442
- localMovedSeq: this.localMovedSeq,
422
+ overwriteInfo<IHasRemovalInfo>(leafSegment, {
423
+ removes: [...this.removes],
443
424
  });
444
425
  }
445
426
 
@@ -583,6 +564,32 @@ export class Marker extends BaseSegment implements ReferencePosition, ISegment {
583
564
  }
584
565
  }
585
566
 
567
+ /**
568
+ * Returns a stamp that occurs at the minimum sequence number.
569
+ * @privateRemarks
570
+ * This is a free function over something obtainable on CollaborationWindow to avoid exposing Perspective
571
+ * and OperationStamp from the package (even internally), at least for now.
572
+ * If/when `Client`'s API is refactored to be structured similarly to MergeTree (so that SharedString passes in
573
+ * things closer to `Perspective`s when calling methods on `Client` rather than refSeq/localSeq/clientId etc),
574
+ * it may be more reasonable to expose this more directly on `CollaborationWindow`.
575
+ */
576
+ export function getMinSeqStamp(collabWindow: CollaborationWindow): OperationStamp {
577
+ return { seq: collabWindow.minSeq, clientId: NonCollabClient };
578
+ }
579
+
580
+ /**
581
+ * Returns a perspective representing a readonly client's view of the tree at the minimum sequence number.
582
+ * @privateRemarks
583
+ * This is a free function over something obtainable on CollaborationWindow to avoid exposing Perspective
584
+ * and OperationStamp from the package (even internally), at least for now.
585
+ * If/when `Client`'s API is refactored to be structured similarly to MergeTree (so that SharedString passes in
586
+ * things closer to `Perspective`s when calling methods on `Client` rather than refSeq/localSeq/clientId etc),
587
+ * it may be more reasonable to expose this more directly on `CollaborationWindow`.
588
+ */
589
+ export function getMinSeqPerspective(collabWindow: CollaborationWindow): Perspective {
590
+ return new PriorPerspective(collabWindow.minSeq, NonCollabClient);
591
+ }
592
+
586
593
  /**
587
594
  * This class is used to track facts about the current window of collaboration. This window is defined by the server
588
595
  * specified minimum sequence number to the last sequence number seen. Additionally, it track state for outstanding
@@ -667,12 +674,26 @@ export class CollaborationWindow {
667
674
  */
668
675
  localSeq = 0;
669
676
 
670
- loadFrom(a: CollaborationWindow): void {
677
+ public localPerspective: Perspective = new LocalDefaultPerspective(this.clientId);
678
+
679
+ public loadFrom(a: CollaborationWindow): void {
671
680
  this.clientId = a.clientId;
672
681
  this.collaborating = a.collaborating;
673
682
  this.minSeq = a.minSeq;
674
683
  this.currentSeq = a.currentSeq;
675
684
  }
685
+
686
+ public mintNextLocalOperationStamp(): OperationStamp {
687
+ if (this.collaborating) {
688
+ this.localSeq++;
689
+ }
690
+
691
+ return {
692
+ seq: this.collaborating ? UnassignedSequenceNumber : UniversalSequenceNumber,
693
+ clientId: this.clientId,
694
+ localSeq: this.localSeq,
695
+ };
696
+ }
676
697
  }
677
698
 
678
699
  /**