@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
@@ -4,9 +4,8 @@
4
4
  * Licensed under the MIT License.
5
5
  */
6
6
  Object.defineProperty(exports, "__esModule", { value: true });
7
- exports.intervalLocatorFromEndpoint = exports.IntervalCollection = exports.makeOpsMap = exports.IntervalCollectionValueType = exports.SequenceIntervalCollectionValueType = exports.LocalIntervalCollection = exports.createIntervalIndex = exports.computeStickinessFromSide = exports.toOptionalSequencePlace = exports.toSequencePlace = exports.sidesFromStickiness = exports.reservedIntervalIdKey = void 0;
7
+ exports.intervalLocatorFromEndpoint = exports.IntervalCollection = exports.opsMap = exports.LocalIntervalCollection = exports.computeStickinessFromSide = exports.toOptionalSequencePlace = exports.toSequencePlace = exports.sidesFromStickiness = exports.reservedIntervalIdKey = void 0;
8
8
  /* eslint-disable no-bitwise */
9
- /* eslint-disable import/no-deprecated */
10
9
  const client_utils_1 = require("@fluid-internal/client-utils");
11
10
  const internal_1 = require("@fluidframework/core-utils/internal");
12
11
  const internal_2 = require("@fluidframework/merge-tree/internal");
@@ -79,26 +78,17 @@ function computeStickinessFromSide(startPos = -1, startSide = internal_2.Side.Be
79
78
  return stickiness;
80
79
  }
81
80
  exports.computeStickinessFromSide = computeStickinessFromSide;
82
- function createIntervalIndex() {
83
- const helpers = {
84
- create: index_js_2.createInterval,
85
- };
86
- const lc = new LocalIntervalCollection(undefined, "", helpers, {});
87
- return lc;
88
- }
89
- exports.createIntervalIndex = createIntervalIndex;
90
81
  class LocalIntervalCollection {
91
- constructor(client, label, helpers, options,
82
+ constructor(client, label, options,
92
83
  /** Callback invoked each time one of the endpoints of an interval slides. */
93
84
  onPositionChange) {
94
85
  this.client = client;
95
86
  this.label = label;
96
- this.helpers = helpers;
97
87
  this.options = options;
98
88
  this.onPositionChange = onPositionChange;
99
- this.overlappingIntervalsIndex = new index_js_1.OverlappingIntervalsIndex(client, helpers);
89
+ this.overlappingIntervalsIndex = new index_js_1.OverlappingIntervalsIndex(client);
100
90
  this.idIntervalIndex = (0, index_js_1.createIdIntervalIndex)();
101
- this.endIntervalIndex = new index_js_1.EndpointIndex(client, helpers);
91
+ this.endIntervalIndex = new index_js_1.EndpointIndex(client);
102
92
  this.indexes = new Set([
103
93
  this.overlappingIntervalsIndex,
104
94
  this.idIntervalIndex,
@@ -153,7 +143,7 @@ class LocalIntervalCollection {
153
143
  this.removeIntervalListeners(interval);
154
144
  }
155
145
  createInterval(start, end, intervalType, op) {
156
- return this.helpers.create(this.label, start, end, this.client, intervalType, op, undefined, this.options.mergeTreeReferencesCanSlideToEndpoint);
146
+ return (0, index_js_2.createSequenceInterval)(this.label, start, end, this.client, intervalType, op, undefined, this.options.mergeTreeReferencesCanSlideToEndpoint);
157
147
  }
158
148
  addInterval(start, end, intervalType, props, op) {
159
149
  const interval = this.createInterval(start, end, intervalType, op);
@@ -177,10 +167,8 @@ class LocalIntervalCollection {
177
167
  return interval;
178
168
  }
179
169
  linkEndpointsToInterval(interval) {
180
- if (interval instanceof index_js_2.SequenceIntervalClass) {
181
- interval.start.addProperties({ interval });
182
- interval.end.addProperties({ interval });
183
- }
170
+ interval.start.addProperties({ interval });
171
+ interval.end.addProperties({ interval });
184
172
  }
185
173
  addIntervalToIndexes(interval) {
186
174
  for (const index of this.indexes) {
@@ -200,7 +188,10 @@ class LocalIntervalCollection {
200
188
  }
201
189
  return newInterval;
202
190
  }
203
- serialize() {
191
+ serialize(version) {
192
+ if (version === "1") {
193
+ return Array.from(this.idIntervalIndex, (interval) => interval.serialize());
194
+ }
204
195
  return {
205
196
  label: this.label,
206
197
  intervals: Array.from(this.idIntervalIndex, (interval) => compressInterval(interval.serialize())),
@@ -218,145 +209,78 @@ class LocalIntervalCollection {
218
209
  }
219
210
  return this.client.createLocalReferencePosition(segment, ref.getOffset(), internal_2.ReferenceType.Transient, ref.properties, ref.slidingPreference, ref.canSlideToEndpoint);
220
211
  };
221
- if (interval instanceof index_js_2.SequenceIntervalClass) {
222
- let previousInterval;
223
- let pendingChanges = 0;
224
- interval.addPositionChangeListeners(() => {
225
- pendingChanges++;
226
- // Note: both start and end can change and invoke beforeSlide on each endpoint before afterSlide.
227
- if (!previousInterval) {
228
- previousInterval = interval.clone();
229
- previousInterval.start = cloneRef(previousInterval.start);
230
- previousInterval.end = cloneRef(previousInterval.end);
231
- this.removeIntervalFromIndexes(interval);
232
- }
233
- }, () => {
234
- (0, internal_1.assert)(previousInterval !== undefined, 0x3fa /* Invalid interleaving of before/after slide */);
235
- pendingChanges--;
236
- if (pendingChanges === 0) {
237
- this.addIntervalToIndexes(interval);
238
- this.onPositionChange?.(interval, previousInterval);
239
- previousInterval = undefined;
240
- }
241
- });
242
- }
212
+ let previousInterval;
213
+ let pendingChanges = 0;
214
+ interval.addPositionChangeListeners(() => {
215
+ pendingChanges++;
216
+ // Note: both start and end can change and invoke beforeSlide on each endpoint before afterSlide.
217
+ if (!previousInterval) {
218
+ previousInterval = interval.clone();
219
+ previousInterval.start = cloneRef(previousInterval.start);
220
+ previousInterval.end = cloneRef(previousInterval.end);
221
+ this.removeIntervalFromIndexes(interval);
222
+ }
223
+ }, () => {
224
+ (0, internal_1.assert)(previousInterval !== undefined, 0x3fa /* Invalid interleaving of before/after slide */);
225
+ pendingChanges--;
226
+ if (pendingChanges === 0) {
227
+ this.addIntervalToIndexes(interval);
228
+ this.onPositionChange?.(interval, previousInterval);
229
+ previousInterval = undefined;
230
+ }
231
+ });
243
232
  }
244
233
  removeIntervalListeners(interval) {
245
- if (interval instanceof index_js_2.SequenceIntervalClass) {
246
- interval.removePositionChangeListeners();
247
- }
234
+ interval.removePositionChangeListeners();
248
235
  }
249
236
  }
250
237
  exports.LocalIntervalCollection = LocalIntervalCollection;
251
238
  LocalIntervalCollection.legacyIdPrefix = "legacy";
252
- class SequenceIntervalCollectionFactory {
253
- load(emitter, raw = [], options) {
254
- return new IntervalCollection(index_js_2.sequenceIntervalHelpers, true, emitter, raw, options);
255
- }
256
- store(value) {
257
- return value.serializeInternal();
258
- }
259
- }
260
- class SequenceIntervalCollectionValueType {
261
- get name() {
262
- return SequenceIntervalCollectionValueType.Name;
263
- }
264
- get factory() {
265
- return SequenceIntervalCollectionValueType._factory;
266
- }
267
- get ops() {
268
- return SequenceIntervalCollectionValueType._ops;
269
- }
270
- }
271
- exports.SequenceIntervalCollectionValueType = SequenceIntervalCollectionValueType;
272
- SequenceIntervalCollectionValueType.Name = "sharedStringIntervalCollection";
273
- SequenceIntervalCollectionValueType._factory = new SequenceIntervalCollectionFactory();
274
- SequenceIntervalCollectionValueType._ops = makeOpsMap();
275
- class IntervalCollectionFactory {
276
- load(emitter, raw = [], options) {
277
- const helpers = {
278
- create: index_js_2.createInterval,
279
- };
280
- const collection = new IntervalCollection(helpers, false, emitter, raw, options);
281
- collection.attachGraph(undefined, "");
282
- return collection;
283
- }
284
- store(value) {
285
- return value.serializeInternal();
286
- }
287
- }
288
- class IntervalCollectionValueType {
289
- get name() {
290
- return IntervalCollectionValueType.Name;
291
- }
292
- get factory() {
293
- return IntervalCollectionValueType._factory;
294
- }
295
- get ops() {
296
- return IntervalCollectionValueType._ops;
239
+ const rebase = (collection, op, localOpMetadata) => {
240
+ const { localSeq } = localOpMetadata;
241
+ const rebasedValue = collection.rebaseLocalInterval(op.opName, op.value, localSeq);
242
+ if (rebasedValue === undefined) {
243
+ return undefined;
297
244
  }
298
- }
299
- exports.IntervalCollectionValueType = IntervalCollectionValueType;
300
- IntervalCollectionValueType.Name = "sharedIntervalCollection";
301
- IntervalCollectionValueType._factory = new IntervalCollectionFactory();
302
- IntervalCollectionValueType._ops = makeOpsMap();
303
- function makeOpsMap() {
304
- const rebase = (collection, op, localOpMetadata) => {
305
- const { localSeq } = localOpMetadata;
306
- const rebasedValue = collection.rebaseLocalInterval(op.opName, op.value, localSeq);
307
- if (rebasedValue === undefined) {
308
- return undefined;
309
- }
310
- const rebasedOp = { ...op, value: rebasedValue };
311
- return { rebasedOp, rebasedLocalOpMetadata: localOpMetadata };
312
- };
313
- return new Map([
314
- [
315
- index_js_2.IntervalOpType.ADD,
316
- {
317
- process: (collection, params, local, op, localOpMetadata) => {
318
- // if params is undefined, the interval was deleted during
319
- // rebasing
320
- if (!params) {
321
- return;
322
- }
323
- (0, internal_1.assert)(op !== undefined, 0x3fb /* op should exist here */);
324
- collection.ackAdd(params, local, op, localOpMetadata);
325
- },
326
- rebase,
327
- },
328
- ],
329
- [
330
- index_js_2.IntervalOpType.DELETE,
331
- {
332
- process: (collection, params, local, op) => {
333
- (0, internal_1.assert)(op !== undefined, 0x3fc /* op should exist here */);
334
- collection.ackDelete(params, local, op);
335
- },
336
- rebase: (collection, op, localOpMetadata) => {
337
- // Deletion of intervals is based on id, so requires no rebasing.
338
- return { rebasedOp: op, rebasedLocalOpMetadata: localOpMetadata };
339
- },
340
- },
341
- ],
342
- [
343
- index_js_2.IntervalOpType.CHANGE,
344
- {
345
- process: (collection, params, local, op, localOpMetadata) => {
346
- // if params is undefined, the interval was deleted during
347
- // rebasing
348
- if (!params) {
349
- return;
350
- }
351
- (0, internal_1.assert)(op !== undefined, 0x3fd /* op should exist here */);
352
- collection.ackChange(params, local, op, localOpMetadata);
353
- },
354
- rebase,
355
- },
356
- ],
357
- ]);
358
- }
359
- exports.makeOpsMap = makeOpsMap;
245
+ const rebasedOp = { ...op, value: rebasedValue };
246
+ return { rebasedOp, rebasedLocalOpMetadata: localOpMetadata };
247
+ };
248
+ exports.opsMap = {
249
+ [index_js_2.IntervalDeltaOpType.ADD]: {
250
+ process: (collection, params, local, op, localOpMetadata) => {
251
+ // if params is undefined, the interval was deleted during
252
+ // rebasing
253
+ if (!params) {
254
+ return;
255
+ }
256
+ (0, internal_1.assert)(op !== undefined, 0x3fb /* op should exist here */);
257
+ collection.ackAdd(params, local, op, localOpMetadata);
258
+ },
259
+ rebase,
260
+ },
261
+ [index_js_2.IntervalDeltaOpType.DELETE]: {
262
+ process: (collection, params, local, op) => {
263
+ (0, internal_1.assert)(op !== undefined, 0x3fc /* op should exist here */);
264
+ collection.ackDelete(params, local, op);
265
+ },
266
+ rebase: (collection, op, localOpMetadata) => {
267
+ // Deletion of intervals is based on id, so requires no rebasing.
268
+ return { rebasedOp: op, rebasedLocalOpMetadata: localOpMetadata };
269
+ },
270
+ },
271
+ [index_js_2.IntervalDeltaOpType.CHANGE]: {
272
+ process: (collection, params, local, op, localOpMetadata) => {
273
+ // if params is undefined, the interval was deleted during
274
+ // rebasing
275
+ if (!params) {
276
+ return;
277
+ }
278
+ (0, internal_1.assert)(op !== undefined, 0x3fd /* op should exist here */);
279
+ collection.ackChange(params, local, op, localOpMetadata);
280
+ },
281
+ rebase,
282
+ },
283
+ };
360
284
  class IntervalCollectionIterator {
361
285
  constructor(collection, iteratesForward = true, start, end) {
362
286
  this.results = [];
@@ -383,11 +307,9 @@ class IntervalCollection extends client_utils_1.TypedEventEmitter {
383
307
  get attached() {
384
308
  return !!this.localCollection;
385
309
  }
386
- constructor(helpers, requiresClient, emitter, serializedIntervals, options = {}) {
310
+ constructor(submitDelta, serializedIntervals, options = {}) {
387
311
  super();
388
- this.helpers = helpers;
389
- this.requiresClient = requiresClient;
390
- this.emitter = emitter;
312
+ this.submitDelta = submitDelta;
391
313
  this.options = options;
392
314
  this.localSeqToSerializedInterval = new Map();
393
315
  this.localSeqToRebasedInterval = new Map();
@@ -465,7 +387,7 @@ class IntervalCollection extends client_utils_1.TypedEventEmitter {
465
387
  if (this.attached) {
466
388
  throw new internal_3.LoggingError("Only supports one Sequence attach");
467
389
  }
468
- if (client === undefined && this.requiresClient) {
390
+ if (client === undefined) {
469
391
  throw new internal_3.LoggingError("Client required for this collection");
470
392
  }
471
393
  // Instantiate the local interval collection based on the saved intervals
@@ -477,7 +399,7 @@ class IntervalCollection extends client_utils_1.TypedEventEmitter {
477
399
  }
478
400
  });
479
401
  }
480
- this.localCollection = new LocalIntervalCollection(client, label, this.helpers, this.options, (interval, previousInterval) => this.emitChange(interval, previousInterval, true, true));
402
+ this.localCollection = new LocalIntervalCollection(client, label, this.options, (interval, previousInterval) => this.emitChange(interval, previousInterval, true, true));
481
403
  if (this.savedSerializedIntervals) {
482
404
  for (const serializedInterval of this.savedSerializedIntervals) {
483
405
  this.localCollection.ensureSerializedId(serializedInterval);
@@ -488,7 +410,7 @@ class IntervalCollection extends client_utils_1.TypedEventEmitter {
488
410
  const end = typeof endPos === "number" && endSide !== undefined
489
411
  ? { pos: endPos, side: endSide }
490
412
  : endPos;
491
- const interval = this.helpers.create(label, start, end, client, intervalType, undefined, true, this.options.mergeTreeReferencesCanSlideToEndpoint);
413
+ const interval = (0, index_js_2.createSequenceInterval)(label, start, end, client, intervalType, undefined, true, this.options.mergeTreeReferencesCanSlideToEndpoint);
492
414
  if (properties) {
493
415
  interval.properties = (0, internal_2.addProperties)(interval.properties, properties);
494
416
  }
@@ -510,22 +432,14 @@ class IntervalCollection extends client_utils_1.TypedEventEmitter {
510
432
  // Temporarily make references transient so that positional queries work (non-transient refs
511
433
  // on resolve to DetachedPosition on any segments that don't contain them). The original refType
512
434
  // is restored as single-endpoint changes re-use previous references.
513
- let startRefType;
514
- let endRefType;
515
- if (previousInterval instanceof index_js_2.SequenceIntervalClass) {
516
- startRefType = previousInterval.start.refType;
517
- endRefType = previousInterval.end.refType;
518
- previousInterval.start.refType = internal_2.ReferenceType.Transient;
519
- previousInterval.end.refType = internal_2.ReferenceType.Transient;
520
- this.emit("changeInterval", interval, previousInterval, local, op, slide);
521
- this.emit("changed", interval, undefined, previousInterval ?? undefined, local, slide);
522
- previousInterval.start.refType = startRefType;
523
- previousInterval.end.refType = endRefType;
524
- }
525
- else {
526
- this.emit("changeInterval", interval, previousInterval, local, op, slide);
527
- this.emit("changed", interval, undefined, previousInterval ?? undefined, local, slide);
528
- }
435
+ const startRefType = previousInterval.start.refType;
436
+ const endRefType = previousInterval.end.refType;
437
+ previousInterval.start.refType = internal_2.ReferenceType.Transient;
438
+ previousInterval.end.refType = internal_2.ReferenceType.Transient;
439
+ this.emit("changeInterval", interval, previousInterval, local, op, slide);
440
+ this.emit("changed", interval, undefined, previousInterval ?? undefined, local, slide);
441
+ previousInterval.start.refType = startRefType;
442
+ previousInterval.end.refType = endRefType;
529
443
  }
530
444
  /**
531
445
  * {@inheritdoc IIntervalCollection.getIntervalById}
@@ -558,7 +472,7 @@ class IntervalCollection extends client_utils_1.TypedEventEmitter {
558
472
  this.assertStickinessEnabled(start, end);
559
473
  const interval = this.localCollection.addInterval(toSequencePlace(startPos, startSide), toSequencePlace(endPos, endSide), index_js_2.IntervalType.SlideOnRemove, props);
560
474
  if (interval) {
561
- if (!this.isCollaborating && interval instanceof index_js_2.SequenceIntervalClass) {
475
+ if (!this.isCollaborating) {
562
476
  setSlideOnRemove(interval.start);
563
477
  setSlideOnRemove(interval.end);
564
478
  }
@@ -576,8 +490,12 @@ class IntervalCollection extends client_utils_1.TypedEventEmitter {
576
490
  if (this.isCollaborating) {
577
491
  this.localSeqToSerializedInterval.set(localSeq, serializedInterval);
578
492
  }
579
- // Local ops get submitted to the server. Remote ops have the deserializer run.
580
- this.emitter.emit("add", undefined, serializedInterval, { localSeq });
493
+ this.submitDelta({
494
+ opName: "add",
495
+ value: serializedInterval,
496
+ }, {
497
+ localSeq,
498
+ });
581
499
  }
582
500
  this.emit("addInterval", interval, true, undefined);
583
501
  return interval;
@@ -591,7 +509,10 @@ class IntervalCollection extends client_utils_1.TypedEventEmitter {
591
509
  if (interval) {
592
510
  // Local ops get submitted to the server. Remote ops have the deserializer run.
593
511
  if (local) {
594
- this.emitter.emit("delete", undefined, interval.serialize(), {
512
+ this.submitDelta({
513
+ opName: "delete",
514
+ value: interval.serialize(),
515
+ }, {
595
516
  localSeq: this.getNextLocalSeq(),
596
517
  });
597
518
  }
@@ -646,7 +567,7 @@ class IntervalCollection extends client_utils_1.TypedEventEmitter {
646
567
  }
647
568
  if (start !== undefined && end !== undefined) {
648
569
  newInterval = this.localCollection.changeInterval(interval, start, end);
649
- if (!this.isCollaborating && newInterval instanceof index_js_2.SequenceIntervalClass) {
570
+ if (!this.isCollaborating && newInterval !== undefined) {
650
571
  setSlideOnRemove(newInterval.start);
651
572
  setSlideOnRemove(newInterval.end);
652
573
  }
@@ -668,7 +589,12 @@ class IntervalCollection extends client_utils_1.TypedEventEmitter {
668
589
  if (this.isCollaborating) {
669
590
  this.localSeqToSerializedInterval.set(localSeq, serializedInterval);
670
591
  }
671
- this.emitter.emit("change", undefined, serializedInterval, { localSeq });
592
+ this.submitDelta({
593
+ opName: "change",
594
+ value: serializedInterval,
595
+ }, {
596
+ localSeq,
597
+ });
672
598
  if (deltaProps !== undefined) {
673
599
  this.emit("propertyChanged", interval, deltaProps, true, undefined);
674
600
  this.emit("changed", newInterval ?? interval, deltaProps, newInterval ? interval : undefined, true, false);
@@ -676,10 +602,8 @@ class IntervalCollection extends client_utils_1.TypedEventEmitter {
676
602
  if (newInterval) {
677
603
  this.addPendingChange(id, serializedInterval);
678
604
  this.emitChange(newInterval, interval, true, false);
679
- if (interval instanceof index_js_2.SequenceIntervalClass) {
680
- this.client?.removeLocalReferencePosition(interval.start);
681
- this.client?.removeLocalReferencePosition(interval.end);
682
- }
605
+ this.client?.removeLocalReferencePosition(interval.start);
606
+ this.client?.removeLocalReferencePosition(interval.end);
683
607
  }
684
608
  return newInterval;
685
609
  }
@@ -859,8 +783,6 @@ class IntervalCollection extends client_utils_1.TypedEventEmitter {
859
783
  return undefined;
860
784
  }
861
785
  if (localInterval !== undefined) {
862
- // we know we must be using `SequenceInterval` because `this.client` exists
863
- (0, internal_1.assert)(localInterval instanceof index_js_2.SequenceIntervalClass, 0x3a0 /* localInterval must be `SequenceInterval` when used with client */);
864
786
  // The rebased op may place this interval's endpoints on different segments. Calling `changeInterval` here
865
787
  // updates the local client's state to be consistent with the emitted op.
866
788
  this.localCollection?.changeInterval(localInterval, toOptionalSequencePlace(startRebased, startSide ?? internal_2.Side.Before), toOptionalSequencePlace(endRebased, endSide ?? internal_2.Side.Before), undefined, localSeq);
@@ -885,10 +807,6 @@ class IntervalCollection extends client_utils_1.TypedEventEmitter {
885
807
  return value;
886
808
  }
887
809
  ackInterval(interval, op) {
888
- // Only SequenceIntervals need potential sliding
889
- if (!(interval instanceof index_js_2.SequenceIntervalClass)) {
890
- return;
891
- }
892
810
  if (!(0, internal_2.refTypeIncludesFlag)(interval.start, internal_2.ReferenceType.StayOnRemove) &&
893
811
  !(0, internal_2.refTypeIncludesFlag)(interval.end, internal_2.ReferenceType.StayOnRemove)) {
894
812
  return;
@@ -987,11 +905,11 @@ class IntervalCollection extends client_utils_1.TypedEventEmitter {
987
905
  this.deleteExistingInterval(interval, local, op);
988
906
  }
989
907
  }
990
- serializeInternal() {
908
+ serializeInternal(version) {
991
909
  if (!this.localCollection) {
992
910
  throw new internal_3.LoggingError("attachSequence must be called");
993
911
  }
994
- return this.localCollection.serialize();
912
+ return this.localCollection.serialize(version);
995
913
  }
996
914
  /**
997
915
  * @returns an iterator over all intervals in this collection.