@fluidframework/sequence 2.30.0 → 2.31.1

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 (189) hide show
  1. package/CHANGELOG.md +506 -495
  2. package/api-report/sequence.legacy.alpha.api.md +67 -5
  3. package/dist/IntervalCollectionValues.d.ts +3 -51
  4. package/dist/IntervalCollectionValues.d.ts.map +1 -1
  5. package/dist/IntervalCollectionValues.js +6 -49
  6. package/dist/IntervalCollectionValues.js.map +1 -1
  7. package/dist/index.d.ts +4 -4
  8. package/dist/index.d.ts.map +1 -1
  9. package/dist/index.js +1 -8
  10. package/dist/index.js.map +1 -1
  11. package/dist/intervalCollection.d.ts +292 -63
  12. package/dist/intervalCollection.d.ts.map +1 -1
  13. package/dist/intervalCollection.js +111 -193
  14. package/dist/intervalCollection.js.map +1 -1
  15. package/dist/intervalCollectionMap.d.ts +11 -32
  16. package/dist/intervalCollectionMap.d.ts.map +1 -1
  17. package/dist/intervalCollectionMap.js +37 -90
  18. package/dist/intervalCollectionMap.js.map +1 -1
  19. package/dist/intervalCollectionMapInterfaces.d.ts +10 -83
  20. package/dist/intervalCollectionMapInterfaces.d.ts.map +1 -1
  21. package/dist/intervalCollectionMapInterfaces.js.map +1 -1
  22. package/dist/intervalIndex/endpointInRangeIndex.d.ts +10 -11
  23. package/dist/intervalIndex/endpointInRangeIndex.d.ts.map +1 -1
  24. package/dist/intervalIndex/endpointInRangeIndex.js +4 -5
  25. package/dist/intervalIndex/endpointInRangeIndex.js.map +1 -1
  26. package/dist/intervalIndex/endpointIndex.d.ts +12 -13
  27. package/dist/intervalIndex/endpointIndex.d.ts.map +1 -1
  28. package/dist/intervalIndex/endpointIndex.js +4 -5
  29. package/dist/intervalIndex/endpointIndex.js.map +1 -1
  30. package/dist/intervalIndex/idIntervalIndex.d.ts +6 -12
  31. package/dist/intervalIndex/idIntervalIndex.d.ts.map +1 -1
  32. package/dist/intervalIndex/idIntervalIndex.js +0 -3
  33. package/dist/intervalIndex/idIntervalIndex.js.map +1 -1
  34. package/dist/intervalIndex/index.d.ts +2 -2
  35. package/dist/intervalIndex/index.d.ts.map +1 -1
  36. package/dist/intervalIndex/index.js.map +1 -1
  37. package/dist/intervalIndex/intervalIndex.d.ts +28 -1
  38. package/dist/intervalIndex/intervalIndex.d.ts.map +1 -1
  39. package/dist/intervalIndex/intervalIndex.js.map +1 -1
  40. package/dist/intervalIndex/overlappingIntervalsIndex.d.ts +30 -13
  41. package/dist/intervalIndex/overlappingIntervalsIndex.d.ts.map +1 -1
  42. package/dist/intervalIndex/overlappingIntervalsIndex.js +4 -5
  43. package/dist/intervalIndex/overlappingIntervalsIndex.js.map +1 -1
  44. package/dist/intervalIndex/overlappingSequenceIntervalsIndex.d.ts.map +1 -1
  45. package/dist/intervalIndex/overlappingSequenceIntervalsIndex.js +1 -1
  46. package/dist/intervalIndex/overlappingSequenceIntervalsIndex.js.map +1 -1
  47. package/dist/intervalIndex/sequenceIntervalIndexes.d.ts +2 -2
  48. package/dist/intervalIndex/sequenceIntervalIndexes.d.ts.map +1 -1
  49. package/dist/intervalIndex/sequenceIntervalIndexes.js.map +1 -1
  50. package/dist/intervalIndex/startpointInRangeIndex.d.ts +10 -11
  51. package/dist/intervalIndex/startpointInRangeIndex.d.ts.map +1 -1
  52. package/dist/intervalIndex/startpointInRangeIndex.js +4 -5
  53. package/dist/intervalIndex/startpointInRangeIndex.js.map +1 -1
  54. package/dist/intervals/index.d.ts +2 -3
  55. package/dist/intervals/index.d.ts.map +1 -1
  56. package/dist/intervals/index.js +1 -6
  57. package/dist/intervals/index.js.map +1 -1
  58. package/dist/intervals/intervalUtils.d.ts +3 -25
  59. package/dist/intervals/intervalUtils.d.ts.map +1 -1
  60. package/dist/intervals/intervalUtils.js.map +1 -1
  61. package/dist/intervals/sequenceInterval.d.ts +3 -8
  62. package/dist/intervals/sequenceInterval.d.ts.map +1 -1
  63. package/dist/intervals/sequenceInterval.js +1 -9
  64. package/dist/intervals/sequenceInterval.js.map +1 -1
  65. package/dist/legacy.d.ts +4 -0
  66. package/dist/packageVersion.d.ts +1 -1
  67. package/dist/packageVersion.js +1 -1
  68. package/dist/packageVersion.js.map +1 -1
  69. package/dist/sequence.d.ts +4 -6
  70. package/dist/sequence.d.ts.map +1 -1
  71. package/dist/sequence.js +3 -5
  72. package/dist/sequence.js.map +1 -1
  73. package/dist/sharedIntervalCollection.d.ts +2 -63
  74. package/dist/sharedIntervalCollection.d.ts.map +1 -1
  75. package/dist/sharedIntervalCollection.js +0 -113
  76. package/dist/sharedIntervalCollection.js.map +1 -1
  77. package/dist/sharedString.d.ts.map +1 -1
  78. package/dist/sharedString.js +6 -6
  79. package/dist/sharedString.js.map +1 -1
  80. package/lib/IntervalCollectionValues.d.ts +3 -51
  81. package/lib/IntervalCollectionValues.d.ts.map +1 -1
  82. package/lib/IntervalCollectionValues.js +5 -47
  83. package/lib/IntervalCollectionValues.js.map +1 -1
  84. package/lib/index.d.ts +4 -4
  85. package/lib/index.d.ts.map +1 -1
  86. package/lib/index.js +2 -3
  87. package/lib/index.js.map +1 -1
  88. package/lib/intervalCollection.d.ts +292 -63
  89. package/lib/intervalCollection.d.ts.map +1 -1
  90. package/lib/intervalCollection.js +113 -191
  91. package/lib/intervalCollection.js.map +1 -1
  92. package/lib/intervalCollectionMap.d.ts +11 -32
  93. package/lib/intervalCollectionMap.d.ts.map +1 -1
  94. package/lib/intervalCollectionMap.js +39 -92
  95. package/lib/intervalCollectionMap.js.map +1 -1
  96. package/lib/intervalCollectionMapInterfaces.d.ts +10 -83
  97. package/lib/intervalCollectionMapInterfaces.d.ts.map +1 -1
  98. package/lib/intervalCollectionMapInterfaces.js.map +1 -1
  99. package/lib/intervalIndex/endpointInRangeIndex.d.ts +10 -11
  100. package/lib/intervalIndex/endpointInRangeIndex.d.ts.map +1 -1
  101. package/lib/intervalIndex/endpointInRangeIndex.js +5 -6
  102. package/lib/intervalIndex/endpointInRangeIndex.js.map +1 -1
  103. package/lib/intervalIndex/endpointIndex.d.ts +12 -13
  104. package/lib/intervalIndex/endpointIndex.d.ts.map +1 -1
  105. package/lib/intervalIndex/endpointIndex.js +5 -6
  106. package/lib/intervalIndex/endpointIndex.js.map +1 -1
  107. package/lib/intervalIndex/idIntervalIndex.d.ts +6 -12
  108. package/lib/intervalIndex/idIntervalIndex.d.ts.map +1 -1
  109. package/lib/intervalIndex/idIntervalIndex.js +0 -3
  110. package/lib/intervalIndex/idIntervalIndex.js.map +1 -1
  111. package/lib/intervalIndex/index.d.ts +2 -2
  112. package/lib/intervalIndex/index.d.ts.map +1 -1
  113. package/lib/intervalIndex/index.js.map +1 -1
  114. package/lib/intervalIndex/intervalIndex.d.ts +28 -1
  115. package/lib/intervalIndex/intervalIndex.d.ts.map +1 -1
  116. package/lib/intervalIndex/intervalIndex.js.map +1 -1
  117. package/lib/intervalIndex/overlappingIntervalsIndex.d.ts +30 -13
  118. package/lib/intervalIndex/overlappingIntervalsIndex.d.ts.map +1 -1
  119. package/lib/intervalIndex/overlappingIntervalsIndex.js +5 -6
  120. package/lib/intervalIndex/overlappingIntervalsIndex.js.map +1 -1
  121. package/lib/intervalIndex/overlappingSequenceIntervalsIndex.d.ts.map +1 -1
  122. package/lib/intervalIndex/overlappingSequenceIntervalsIndex.js +2 -2
  123. package/lib/intervalIndex/overlappingSequenceIntervalsIndex.js.map +1 -1
  124. package/lib/intervalIndex/sequenceIntervalIndexes.d.ts +2 -2
  125. package/lib/intervalIndex/sequenceIntervalIndexes.d.ts.map +1 -1
  126. package/lib/intervalIndex/sequenceIntervalIndexes.js.map +1 -1
  127. package/lib/intervalIndex/startpointInRangeIndex.d.ts +10 -11
  128. package/lib/intervalIndex/startpointInRangeIndex.d.ts.map +1 -1
  129. package/lib/intervalIndex/startpointInRangeIndex.js +5 -6
  130. package/lib/intervalIndex/startpointInRangeIndex.js.map +1 -1
  131. package/lib/intervals/index.d.ts +2 -3
  132. package/lib/intervals/index.d.ts.map +1 -1
  133. package/lib/intervals/index.js +1 -2
  134. package/lib/intervals/index.js.map +1 -1
  135. package/lib/intervals/intervalUtils.d.ts +3 -25
  136. package/lib/intervals/intervalUtils.d.ts.map +1 -1
  137. package/lib/intervals/intervalUtils.js.map +1 -1
  138. package/lib/intervals/sequenceInterval.d.ts +3 -8
  139. package/lib/intervals/sequenceInterval.d.ts.map +1 -1
  140. package/lib/intervals/sequenceInterval.js +0 -8
  141. package/lib/intervals/sequenceInterval.js.map +1 -1
  142. package/lib/legacy.d.ts +4 -0
  143. package/lib/packageVersion.d.ts +1 -1
  144. package/lib/packageVersion.js +1 -1
  145. package/lib/packageVersion.js.map +1 -1
  146. package/lib/sequence.d.ts +4 -6
  147. package/lib/sequence.d.ts.map +1 -1
  148. package/lib/sequence.js +3 -5
  149. package/lib/sequence.js.map +1 -1
  150. package/lib/sharedIntervalCollection.d.ts +2 -63
  151. package/lib/sharedIntervalCollection.d.ts.map +1 -1
  152. package/lib/sharedIntervalCollection.js +1 -110
  153. package/lib/sharedIntervalCollection.js.map +1 -1
  154. package/lib/sharedString.d.ts.map +1 -1
  155. package/lib/sharedString.js +6 -6
  156. package/lib/sharedString.js.map +1 -1
  157. package/lib/tsdoc-metadata.json +1 -1
  158. package/package.json +19 -22
  159. package/src/IntervalCollectionValues.ts +10 -93
  160. package/src/index.ts +6 -17
  161. package/src/intervalCollection.ts +524 -343
  162. package/src/intervalCollectionMap.ts +72 -140
  163. package/src/intervalCollectionMapInterfaces.ts +13 -104
  164. package/src/intervalIndex/endpointInRangeIndex.ts +17 -29
  165. package/src/intervalIndex/endpointIndex.ts +19 -31
  166. package/src/intervalIndex/idIntervalIndex.ts +15 -25
  167. package/src/intervalIndex/index.ts +2 -1
  168. package/src/intervalIndex/intervalIndex.ts +30 -1
  169. package/src/intervalIndex/overlappingIntervalsIndex.ts +50 -27
  170. package/src/intervalIndex/overlappingSequenceIntervalsIndex.ts +2 -3
  171. package/src/intervalIndex/sequenceIntervalIndexes.ts +2 -2
  172. package/src/intervalIndex/startpointInRangeIndex.ts +17 -29
  173. package/src/intervals/index.ts +0 -3
  174. package/src/intervals/intervalUtils.ts +3 -38
  175. package/src/intervals/sequenceInterval.ts +2 -12
  176. package/src/packageVersion.ts +1 -1
  177. package/src/sequence.ts +8 -20
  178. package/src/sharedIntervalCollection.ts +5 -183
  179. package/src/sharedString.ts +6 -24
  180. package/dist/intervals/interval.d.ts +0 -76
  181. package/dist/intervals/interval.d.ts.map +0 -1
  182. package/dist/intervals/interval.js +0 -167
  183. package/dist/intervals/interval.js.map +0 -1
  184. package/lib/intervals/interval.d.ts +0 -76
  185. package/lib/intervals/interval.d.ts.map +0 -1
  186. package/lib/intervals/interval.js +0 -162
  187. package/lib/intervals/interval.js.map +0 -1
  188. package/prettier.config.cjs +0 -8
  189. package/src/intervals/interval.ts +0 -226
@@ -3,14 +3,13 @@
3
3
  * Licensed under the MIT License.
4
4
  */
5
5
  /* eslint-disable no-bitwise */
6
- /* eslint-disable import/no-deprecated */
7
6
  import { TypedEventEmitter } from "@fluid-internal/client-utils";
8
7
  import { assert } from "@fluidframework/core-utils/internal";
9
- import { DetachedReferencePosition, ReferenceType, SlidingPreference, UnassignedSequenceNumber, UniversalSequenceNumber, addProperties, createMap, getSlideToSegoff, refTypeIncludesFlag, reservedRangeLabelsKey, Side, endpointPosAndSide, PropertiesManager, } from "@fluidframework/merge-tree/internal";
8
+ import { DetachedReferencePosition, ReferenceType, SlidingPreference, UnassignedSequenceNumber, UniversalSequenceNumber, addProperties, getSlideToSegoff, refTypeIncludesFlag, reservedRangeLabelsKey, Side, endpointPosAndSide, PropertiesManager, createMap, } from "@fluidframework/merge-tree/internal";
10
9
  import { LoggingError, UsageError } from "@fluidframework/telemetry-utils/internal";
11
10
  import { v4 as uuid } from "uuid";
12
- import { EndpointIndex, OverlappingIntervalsIndex, createIdIntervalIndex, } from "./intervalIndex/index.js";
13
- import { IntervalOpType, IntervalStickiness, IntervalType, SequenceIntervalClass, createInterval, createPositionReferenceFromSegoff, endReferenceSlidingPreference, sequenceIntervalHelpers, startReferenceSlidingPreference, } from "./intervals/index.js";
11
+ import { createIdIntervalIndex, EndpointIndex, OverlappingIntervalsIndex, } from "./intervalIndex/index.js";
12
+ import { IntervalDeltaOpType, IntervalStickiness, IntervalType, createPositionReferenceFromSegoff, createSequenceInterval, endReferenceSlidingPreference, startReferenceSlidingPreference, } from "./intervals/index.js";
14
13
  export const reservedIntervalIdKey = "intervalId";
15
14
  export function sidesFromStickiness(stickiness) {
16
15
  const startSide = (stickiness & IntervalStickiness.START) !== 0 ? Side.After : Side.Before;
@@ -72,25 +71,17 @@ export function computeStickinessFromSide(startPos = -1, startSide = Side.Before
72
71
  }
73
72
  return stickiness;
74
73
  }
75
- export function createIntervalIndex() {
76
- const helpers = {
77
- create: createInterval,
78
- };
79
- const lc = new LocalIntervalCollection(undefined, "", helpers, {});
80
- return lc;
81
- }
82
74
  export class LocalIntervalCollection {
83
- constructor(client, label, helpers, options,
75
+ constructor(client, label, options,
84
76
  /** Callback invoked each time one of the endpoints of an interval slides. */
85
77
  onPositionChange) {
86
78
  this.client = client;
87
79
  this.label = label;
88
- this.helpers = helpers;
89
80
  this.options = options;
90
81
  this.onPositionChange = onPositionChange;
91
- this.overlappingIntervalsIndex = new OverlappingIntervalsIndex(client, helpers);
82
+ this.overlappingIntervalsIndex = new OverlappingIntervalsIndex(client);
92
83
  this.idIntervalIndex = createIdIntervalIndex();
93
- this.endIntervalIndex = new EndpointIndex(client, helpers);
84
+ this.endIntervalIndex = new EndpointIndex(client);
94
85
  this.indexes = new Set([
95
86
  this.overlappingIntervalsIndex,
96
87
  this.idIntervalIndex,
@@ -145,7 +136,7 @@ export class LocalIntervalCollection {
145
136
  this.removeIntervalListeners(interval);
146
137
  }
147
138
  createInterval(start, end, intervalType, op) {
148
- return this.helpers.create(this.label, start, end, this.client, intervalType, op, undefined, this.options.mergeTreeReferencesCanSlideToEndpoint);
139
+ return createSequenceInterval(this.label, start, end, this.client, intervalType, op, undefined, this.options.mergeTreeReferencesCanSlideToEndpoint);
149
140
  }
150
141
  addInterval(start, end, intervalType, props, op) {
151
142
  const interval = this.createInterval(start, end, intervalType, op);
@@ -169,10 +160,8 @@ export class LocalIntervalCollection {
169
160
  return interval;
170
161
  }
171
162
  linkEndpointsToInterval(interval) {
172
- if (interval instanceof SequenceIntervalClass) {
173
- interval.start.addProperties({ interval });
174
- interval.end.addProperties({ interval });
175
- }
163
+ interval.start.addProperties({ interval });
164
+ interval.end.addProperties({ interval });
176
165
  }
177
166
  addIntervalToIndexes(interval) {
178
167
  for (const index of this.indexes) {
@@ -192,7 +181,10 @@ export class LocalIntervalCollection {
192
181
  }
193
182
  return newInterval;
194
183
  }
195
- serialize() {
184
+ serialize(version) {
185
+ if (version === "1") {
186
+ return Array.from(this.idIntervalIndex, (interval) => interval.serialize());
187
+ }
196
188
  return {
197
189
  label: this.label,
198
190
  intervals: Array.from(this.idIntervalIndex, (interval) => compressInterval(interval.serialize())),
@@ -210,141 +202,77 @@ export class LocalIntervalCollection {
210
202
  }
211
203
  return this.client.createLocalReferencePosition(segment, ref.getOffset(), ReferenceType.Transient, ref.properties, ref.slidingPreference, ref.canSlideToEndpoint);
212
204
  };
213
- if (interval instanceof SequenceIntervalClass) {
214
- let previousInterval;
215
- let pendingChanges = 0;
216
- interval.addPositionChangeListeners(() => {
217
- pendingChanges++;
218
- // Note: both start and end can change and invoke beforeSlide on each endpoint before afterSlide.
219
- if (!previousInterval) {
220
- previousInterval = interval.clone();
221
- previousInterval.start = cloneRef(previousInterval.start);
222
- previousInterval.end = cloneRef(previousInterval.end);
223
- this.removeIntervalFromIndexes(interval);
224
- }
225
- }, () => {
226
- assert(previousInterval !== undefined, 0x3fa /* Invalid interleaving of before/after slide */);
227
- pendingChanges--;
228
- if (pendingChanges === 0) {
229
- this.addIntervalToIndexes(interval);
230
- this.onPositionChange?.(interval, previousInterval);
231
- previousInterval = undefined;
232
- }
233
- });
234
- }
205
+ let previousInterval;
206
+ let pendingChanges = 0;
207
+ interval.addPositionChangeListeners(() => {
208
+ pendingChanges++;
209
+ // Note: both start and end can change and invoke beforeSlide on each endpoint before afterSlide.
210
+ if (!previousInterval) {
211
+ previousInterval = interval.clone();
212
+ previousInterval.start = cloneRef(previousInterval.start);
213
+ previousInterval.end = cloneRef(previousInterval.end);
214
+ this.removeIntervalFromIndexes(interval);
215
+ }
216
+ }, () => {
217
+ assert(previousInterval !== undefined, 0x3fa /* Invalid interleaving of before/after slide */);
218
+ pendingChanges--;
219
+ if (pendingChanges === 0) {
220
+ this.addIntervalToIndexes(interval);
221
+ this.onPositionChange?.(interval, previousInterval);
222
+ previousInterval = undefined;
223
+ }
224
+ });
235
225
  }
236
226
  removeIntervalListeners(interval) {
237
- if (interval instanceof SequenceIntervalClass) {
238
- interval.removePositionChangeListeners();
239
- }
227
+ interval.removePositionChangeListeners();
240
228
  }
241
229
  }
242
230
  LocalIntervalCollection.legacyIdPrefix = "legacy";
243
- class SequenceIntervalCollectionFactory {
244
- load(emitter, raw = [], options) {
245
- return new IntervalCollection(sequenceIntervalHelpers, true, emitter, raw, options);
246
- }
247
- store(value) {
248
- return value.serializeInternal();
249
- }
250
- }
251
- export class SequenceIntervalCollectionValueType {
252
- get name() {
253
- return SequenceIntervalCollectionValueType.Name;
254
- }
255
- get factory() {
256
- return SequenceIntervalCollectionValueType._factory;
257
- }
258
- get ops() {
259
- return SequenceIntervalCollectionValueType._ops;
260
- }
261
- }
262
- SequenceIntervalCollectionValueType.Name = "sharedStringIntervalCollection";
263
- SequenceIntervalCollectionValueType._factory = new SequenceIntervalCollectionFactory();
264
- SequenceIntervalCollectionValueType._ops = makeOpsMap();
265
- class IntervalCollectionFactory {
266
- load(emitter, raw = [], options) {
267
- const helpers = {
268
- create: createInterval,
269
- };
270
- const collection = new IntervalCollection(helpers, false, emitter, raw, options);
271
- collection.attachGraph(undefined, "");
272
- return collection;
273
- }
274
- store(value) {
275
- return value.serializeInternal();
276
- }
277
- }
278
- export class IntervalCollectionValueType {
279
- get name() {
280
- return IntervalCollectionValueType.Name;
281
- }
282
- get factory() {
283
- return IntervalCollectionValueType._factory;
284
- }
285
- get ops() {
286
- return IntervalCollectionValueType._ops;
231
+ const rebase = (collection, op, localOpMetadata) => {
232
+ const { localSeq } = localOpMetadata;
233
+ const rebasedValue = collection.rebaseLocalInterval(op.opName, op.value, localSeq);
234
+ if (rebasedValue === undefined) {
235
+ return undefined;
287
236
  }
288
- }
289
- IntervalCollectionValueType.Name = "sharedIntervalCollection";
290
- IntervalCollectionValueType._factory = new IntervalCollectionFactory();
291
- IntervalCollectionValueType._ops = makeOpsMap();
292
- export function makeOpsMap() {
293
- const rebase = (collection, op, localOpMetadata) => {
294
- const { localSeq } = localOpMetadata;
295
- const rebasedValue = collection.rebaseLocalInterval(op.opName, op.value, localSeq);
296
- if (rebasedValue === undefined) {
297
- return undefined;
298
- }
299
- const rebasedOp = { ...op, value: rebasedValue };
300
- return { rebasedOp, rebasedLocalOpMetadata: localOpMetadata };
301
- };
302
- return new Map([
303
- [
304
- IntervalOpType.ADD,
305
- {
306
- process: (collection, params, local, op, localOpMetadata) => {
307
- // if params is undefined, the interval was deleted during
308
- // rebasing
309
- if (!params) {
310
- return;
311
- }
312
- assert(op !== undefined, 0x3fb /* op should exist here */);
313
- collection.ackAdd(params, local, op, localOpMetadata);
314
- },
315
- rebase,
316
- },
317
- ],
318
- [
319
- IntervalOpType.DELETE,
320
- {
321
- process: (collection, params, local, op) => {
322
- assert(op !== undefined, 0x3fc /* op should exist here */);
323
- collection.ackDelete(params, local, op);
324
- },
325
- rebase: (collection, op, localOpMetadata) => {
326
- // Deletion of intervals is based on id, so requires no rebasing.
327
- return { rebasedOp: op, rebasedLocalOpMetadata: localOpMetadata };
328
- },
329
- },
330
- ],
331
- [
332
- IntervalOpType.CHANGE,
333
- {
334
- process: (collection, params, local, op, localOpMetadata) => {
335
- // if params is undefined, the interval was deleted during
336
- // rebasing
337
- if (!params) {
338
- return;
339
- }
340
- assert(op !== undefined, 0x3fd /* op should exist here */);
341
- collection.ackChange(params, local, op, localOpMetadata);
342
- },
343
- rebase,
344
- },
345
- ],
346
- ]);
347
- }
237
+ const rebasedOp = { ...op, value: rebasedValue };
238
+ return { rebasedOp, rebasedLocalOpMetadata: localOpMetadata };
239
+ };
240
+ export const opsMap = {
241
+ [IntervalDeltaOpType.ADD]: {
242
+ process: (collection, params, local, op, localOpMetadata) => {
243
+ // if params is undefined, the interval was deleted during
244
+ // rebasing
245
+ if (!params) {
246
+ return;
247
+ }
248
+ assert(op !== undefined, 0x3fb /* op should exist here */);
249
+ collection.ackAdd(params, local, op, localOpMetadata);
250
+ },
251
+ rebase,
252
+ },
253
+ [IntervalDeltaOpType.DELETE]: {
254
+ process: (collection, params, local, op) => {
255
+ assert(op !== undefined, 0x3fc /* op should exist here */);
256
+ collection.ackDelete(params, local, op);
257
+ },
258
+ rebase: (collection, op, localOpMetadata) => {
259
+ // Deletion of intervals is based on id, so requires no rebasing.
260
+ return { rebasedOp: op, rebasedLocalOpMetadata: localOpMetadata };
261
+ },
262
+ },
263
+ [IntervalDeltaOpType.CHANGE]: {
264
+ process: (collection, params, local, op, localOpMetadata) => {
265
+ // if params is undefined, the interval was deleted during
266
+ // rebasing
267
+ if (!params) {
268
+ return;
269
+ }
270
+ assert(op !== undefined, 0x3fd /* op should exist here */);
271
+ collection.ackChange(params, local, op, localOpMetadata);
272
+ },
273
+ rebase,
274
+ },
275
+ };
348
276
  class IntervalCollectionIterator {
349
277
  constructor(collection, iteratesForward = true, start, end) {
350
278
  this.results = [];
@@ -371,11 +299,9 @@ export class IntervalCollection extends TypedEventEmitter {
371
299
  get attached() {
372
300
  return !!this.localCollection;
373
301
  }
374
- constructor(helpers, requiresClient, emitter, serializedIntervals, options = {}) {
302
+ constructor(submitDelta, serializedIntervals, options = {}) {
375
303
  super();
376
- this.helpers = helpers;
377
- this.requiresClient = requiresClient;
378
- this.emitter = emitter;
304
+ this.submitDelta = submitDelta;
379
305
  this.options = options;
380
306
  this.localSeqToSerializedInterval = new Map();
381
307
  this.localSeqToRebasedInterval = new Map();
@@ -453,7 +379,7 @@ export class IntervalCollection extends TypedEventEmitter {
453
379
  if (this.attached) {
454
380
  throw new LoggingError("Only supports one Sequence attach");
455
381
  }
456
- if (client === undefined && this.requiresClient) {
382
+ if (client === undefined) {
457
383
  throw new LoggingError("Client required for this collection");
458
384
  }
459
385
  // Instantiate the local interval collection based on the saved intervals
@@ -465,7 +391,7 @@ export class IntervalCollection extends TypedEventEmitter {
465
391
  }
466
392
  });
467
393
  }
468
- this.localCollection = new LocalIntervalCollection(client, label, this.helpers, this.options, (interval, previousInterval) => this.emitChange(interval, previousInterval, true, true));
394
+ this.localCollection = new LocalIntervalCollection(client, label, this.options, (interval, previousInterval) => this.emitChange(interval, previousInterval, true, true));
469
395
  if (this.savedSerializedIntervals) {
470
396
  for (const serializedInterval of this.savedSerializedIntervals) {
471
397
  this.localCollection.ensureSerializedId(serializedInterval);
@@ -476,7 +402,7 @@ export class IntervalCollection extends TypedEventEmitter {
476
402
  const end = typeof endPos === "number" && endSide !== undefined
477
403
  ? { pos: endPos, side: endSide }
478
404
  : endPos;
479
- const interval = this.helpers.create(label, start, end, client, intervalType, undefined, true, this.options.mergeTreeReferencesCanSlideToEndpoint);
405
+ const interval = createSequenceInterval(label, start, end, client, intervalType, undefined, true, this.options.mergeTreeReferencesCanSlideToEndpoint);
480
406
  if (properties) {
481
407
  interval.properties = addProperties(interval.properties, properties);
482
408
  }
@@ -498,22 +424,14 @@ export class IntervalCollection extends TypedEventEmitter {
498
424
  // Temporarily make references transient so that positional queries work (non-transient refs
499
425
  // on resolve to DetachedPosition on any segments that don't contain them). The original refType
500
426
  // is restored as single-endpoint changes re-use previous references.
501
- let startRefType;
502
- let endRefType;
503
- if (previousInterval instanceof SequenceIntervalClass) {
504
- startRefType = previousInterval.start.refType;
505
- endRefType = previousInterval.end.refType;
506
- previousInterval.start.refType = ReferenceType.Transient;
507
- previousInterval.end.refType = ReferenceType.Transient;
508
- this.emit("changeInterval", interval, previousInterval, local, op, slide);
509
- this.emit("changed", interval, undefined, previousInterval ?? undefined, local, slide);
510
- previousInterval.start.refType = startRefType;
511
- previousInterval.end.refType = endRefType;
512
- }
513
- else {
514
- this.emit("changeInterval", interval, previousInterval, local, op, slide);
515
- this.emit("changed", interval, undefined, previousInterval ?? undefined, local, slide);
516
- }
427
+ const startRefType = previousInterval.start.refType;
428
+ const endRefType = previousInterval.end.refType;
429
+ previousInterval.start.refType = ReferenceType.Transient;
430
+ previousInterval.end.refType = ReferenceType.Transient;
431
+ this.emit("changeInterval", interval, previousInterval, local, op, slide);
432
+ this.emit("changed", interval, undefined, previousInterval ?? undefined, local, slide);
433
+ previousInterval.start.refType = startRefType;
434
+ previousInterval.end.refType = endRefType;
517
435
  }
518
436
  /**
519
437
  * {@inheritdoc IIntervalCollection.getIntervalById}
@@ -546,7 +464,7 @@ export class IntervalCollection extends TypedEventEmitter {
546
464
  this.assertStickinessEnabled(start, end);
547
465
  const interval = this.localCollection.addInterval(toSequencePlace(startPos, startSide), toSequencePlace(endPos, endSide), IntervalType.SlideOnRemove, props);
548
466
  if (interval) {
549
- if (!this.isCollaborating && interval instanceof SequenceIntervalClass) {
467
+ if (!this.isCollaborating) {
550
468
  setSlideOnRemove(interval.start);
551
469
  setSlideOnRemove(interval.end);
552
470
  }
@@ -564,8 +482,12 @@ export class IntervalCollection extends TypedEventEmitter {
564
482
  if (this.isCollaborating) {
565
483
  this.localSeqToSerializedInterval.set(localSeq, serializedInterval);
566
484
  }
567
- // Local ops get submitted to the server. Remote ops have the deserializer run.
568
- this.emitter.emit("add", undefined, serializedInterval, { localSeq });
485
+ this.submitDelta({
486
+ opName: "add",
487
+ value: serializedInterval,
488
+ }, {
489
+ localSeq,
490
+ });
569
491
  }
570
492
  this.emit("addInterval", interval, true, undefined);
571
493
  return interval;
@@ -579,7 +501,10 @@ export class IntervalCollection extends TypedEventEmitter {
579
501
  if (interval) {
580
502
  // Local ops get submitted to the server. Remote ops have the deserializer run.
581
503
  if (local) {
582
- this.emitter.emit("delete", undefined, interval.serialize(), {
504
+ this.submitDelta({
505
+ opName: "delete",
506
+ value: interval.serialize(),
507
+ }, {
583
508
  localSeq: this.getNextLocalSeq(),
584
509
  });
585
510
  }
@@ -634,7 +559,7 @@ export class IntervalCollection extends TypedEventEmitter {
634
559
  }
635
560
  if (start !== undefined && end !== undefined) {
636
561
  newInterval = this.localCollection.changeInterval(interval, start, end);
637
- if (!this.isCollaborating && newInterval instanceof SequenceIntervalClass) {
562
+ if (!this.isCollaborating && newInterval !== undefined) {
638
563
  setSlideOnRemove(newInterval.start);
639
564
  setSlideOnRemove(newInterval.end);
640
565
  }
@@ -656,7 +581,12 @@ export class IntervalCollection extends TypedEventEmitter {
656
581
  if (this.isCollaborating) {
657
582
  this.localSeqToSerializedInterval.set(localSeq, serializedInterval);
658
583
  }
659
- this.emitter.emit("change", undefined, serializedInterval, { localSeq });
584
+ this.submitDelta({
585
+ opName: "change",
586
+ value: serializedInterval,
587
+ }, {
588
+ localSeq,
589
+ });
660
590
  if (deltaProps !== undefined) {
661
591
  this.emit("propertyChanged", interval, deltaProps, true, undefined);
662
592
  this.emit("changed", newInterval ?? interval, deltaProps, newInterval ? interval : undefined, true, false);
@@ -664,10 +594,8 @@ export class IntervalCollection extends TypedEventEmitter {
664
594
  if (newInterval) {
665
595
  this.addPendingChange(id, serializedInterval);
666
596
  this.emitChange(newInterval, interval, true, false);
667
- if (interval instanceof SequenceIntervalClass) {
668
- this.client?.removeLocalReferencePosition(interval.start);
669
- this.client?.removeLocalReferencePosition(interval.end);
670
- }
597
+ this.client?.removeLocalReferencePosition(interval.start);
598
+ this.client?.removeLocalReferencePosition(interval.end);
671
599
  }
672
600
  return newInterval;
673
601
  }
@@ -847,8 +775,6 @@ export class IntervalCollection extends TypedEventEmitter {
847
775
  return undefined;
848
776
  }
849
777
  if (localInterval !== undefined) {
850
- // we know we must be using `SequenceInterval` because `this.client` exists
851
- assert(localInterval instanceof SequenceIntervalClass, 0x3a0 /* localInterval must be `SequenceInterval` when used with client */);
852
778
  // The rebased op may place this interval's endpoints on different segments. Calling `changeInterval` here
853
779
  // updates the local client's state to be consistent with the emitted op.
854
780
  this.localCollection?.changeInterval(localInterval, toOptionalSequencePlace(startRebased, startSide ?? Side.Before), toOptionalSequencePlace(endRebased, endSide ?? Side.Before), undefined, localSeq);
@@ -873,10 +799,6 @@ export class IntervalCollection extends TypedEventEmitter {
873
799
  return value;
874
800
  }
875
801
  ackInterval(interval, op) {
876
- // Only SequenceIntervals need potential sliding
877
- if (!(interval instanceof SequenceIntervalClass)) {
878
- return;
879
- }
880
802
  if (!refTypeIncludesFlag(interval.start, ReferenceType.StayOnRemove) &&
881
803
  !refTypeIncludesFlag(interval.end, ReferenceType.StayOnRemove)) {
882
804
  return;
@@ -975,11 +897,11 @@ export class IntervalCollection extends TypedEventEmitter {
975
897
  this.deleteExistingInterval(interval, local, op);
976
898
  }
977
899
  }
978
- serializeInternal() {
900
+ serializeInternal(version) {
979
901
  if (!this.localCollection) {
980
902
  throw new LoggingError("attachSequence must be called");
981
903
  }
982
- return this.localCollection.serialize();
904
+ return this.localCollection.serialize(version);
983
905
  }
984
906
  /**
985
907
  * @returns an iterator over all intervals in this collection.