@fluidframework/sequence 2.23.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.
- package/CHANGELOG.md +510 -495
- package/api-report/sequence.legacy.alpha.api.md +67 -5
- package/dist/IntervalCollectionValues.d.ts +3 -51
- package/dist/IntervalCollectionValues.d.ts.map +1 -1
- package/dist/IntervalCollectionValues.js +6 -49
- package/dist/IntervalCollectionValues.js.map +1 -1
- package/dist/index.d.ts +4 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -8
- package/dist/index.js.map +1 -1
- package/dist/intervalCollection.d.ts +292 -63
- package/dist/intervalCollection.d.ts.map +1 -1
- package/dist/intervalCollection.js +111 -193
- package/dist/intervalCollection.js.map +1 -1
- package/dist/intervalCollectionMap.d.ts +11 -32
- package/dist/intervalCollectionMap.d.ts.map +1 -1
- package/dist/intervalCollectionMap.js +37 -90
- package/dist/intervalCollectionMap.js.map +1 -1
- package/dist/intervalCollectionMapInterfaces.d.ts +10 -83
- package/dist/intervalCollectionMapInterfaces.d.ts.map +1 -1
- package/dist/intervalCollectionMapInterfaces.js.map +1 -1
- package/dist/intervalIndex/endpointInRangeIndex.d.ts +10 -11
- package/dist/intervalIndex/endpointInRangeIndex.d.ts.map +1 -1
- package/dist/intervalIndex/endpointInRangeIndex.js +4 -5
- package/dist/intervalIndex/endpointInRangeIndex.js.map +1 -1
- package/dist/intervalIndex/endpointIndex.d.ts +12 -13
- package/dist/intervalIndex/endpointIndex.d.ts.map +1 -1
- package/dist/intervalIndex/endpointIndex.js +4 -5
- package/dist/intervalIndex/endpointIndex.js.map +1 -1
- package/dist/intervalIndex/idIntervalIndex.d.ts +6 -12
- package/dist/intervalIndex/idIntervalIndex.d.ts.map +1 -1
- package/dist/intervalIndex/idIntervalIndex.js +0 -3
- package/dist/intervalIndex/idIntervalIndex.js.map +1 -1
- package/dist/intervalIndex/index.d.ts +2 -2
- package/dist/intervalIndex/index.d.ts.map +1 -1
- package/dist/intervalIndex/index.js.map +1 -1
- package/dist/intervalIndex/intervalIndex.d.ts +28 -1
- package/dist/intervalIndex/intervalIndex.d.ts.map +1 -1
- package/dist/intervalIndex/intervalIndex.js.map +1 -1
- package/dist/intervalIndex/overlappingIntervalsIndex.d.ts +30 -13
- package/dist/intervalIndex/overlappingIntervalsIndex.d.ts.map +1 -1
- package/dist/intervalIndex/overlappingIntervalsIndex.js +4 -5
- package/dist/intervalIndex/overlappingIntervalsIndex.js.map +1 -1
- package/dist/intervalIndex/overlappingSequenceIntervalsIndex.d.ts.map +1 -1
- package/dist/intervalIndex/overlappingSequenceIntervalsIndex.js +1 -1
- package/dist/intervalIndex/overlappingSequenceIntervalsIndex.js.map +1 -1
- package/dist/intervalIndex/sequenceIntervalIndexes.d.ts +2 -2
- package/dist/intervalIndex/sequenceIntervalIndexes.d.ts.map +1 -1
- package/dist/intervalIndex/sequenceIntervalIndexes.js.map +1 -1
- package/dist/intervalIndex/startpointInRangeIndex.d.ts +10 -11
- package/dist/intervalIndex/startpointInRangeIndex.d.ts.map +1 -1
- package/dist/intervalIndex/startpointInRangeIndex.js +4 -5
- package/dist/intervalIndex/startpointInRangeIndex.js.map +1 -1
- package/dist/intervals/index.d.ts +2 -3
- package/dist/intervals/index.d.ts.map +1 -1
- package/dist/intervals/index.js +1 -6
- package/dist/intervals/index.js.map +1 -1
- package/dist/intervals/intervalUtils.d.ts +3 -25
- package/dist/intervals/intervalUtils.d.ts.map +1 -1
- package/dist/intervals/intervalUtils.js.map +1 -1
- package/dist/intervals/sequenceInterval.d.ts +3 -8
- package/dist/intervals/sequenceInterval.d.ts.map +1 -1
- package/dist/intervals/sequenceInterval.js +1 -9
- package/dist/intervals/sequenceInterval.js.map +1 -1
- package/dist/legacy.d.ts +4 -0
- package/dist/packageVersion.d.ts +1 -1
- package/dist/packageVersion.js +1 -1
- package/dist/packageVersion.js.map +1 -1
- package/dist/sequence.d.ts +4 -6
- package/dist/sequence.d.ts.map +1 -1
- package/dist/sequence.js +3 -5
- package/dist/sequence.js.map +1 -1
- package/dist/sharedIntervalCollection.d.ts +2 -63
- package/dist/sharedIntervalCollection.d.ts.map +1 -1
- package/dist/sharedIntervalCollection.js +0 -113
- package/dist/sharedIntervalCollection.js.map +1 -1
- package/dist/sharedString.d.ts.map +1 -1
- package/dist/sharedString.js +6 -6
- package/dist/sharedString.js.map +1 -1
- package/lib/IntervalCollectionValues.d.ts +3 -51
- package/lib/IntervalCollectionValues.d.ts.map +1 -1
- package/lib/IntervalCollectionValues.js +5 -47
- package/lib/IntervalCollectionValues.js.map +1 -1
- package/lib/index.d.ts +4 -4
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +2 -3
- package/lib/index.js.map +1 -1
- package/lib/intervalCollection.d.ts +292 -63
- package/lib/intervalCollection.d.ts.map +1 -1
- package/lib/intervalCollection.js +113 -191
- package/lib/intervalCollection.js.map +1 -1
- package/lib/intervalCollectionMap.d.ts +11 -32
- package/lib/intervalCollectionMap.d.ts.map +1 -1
- package/lib/intervalCollectionMap.js +39 -92
- package/lib/intervalCollectionMap.js.map +1 -1
- package/lib/intervalCollectionMapInterfaces.d.ts +10 -83
- package/lib/intervalCollectionMapInterfaces.d.ts.map +1 -1
- package/lib/intervalCollectionMapInterfaces.js.map +1 -1
- package/lib/intervalIndex/endpointInRangeIndex.d.ts +10 -11
- package/lib/intervalIndex/endpointInRangeIndex.d.ts.map +1 -1
- package/lib/intervalIndex/endpointInRangeIndex.js +5 -6
- package/lib/intervalIndex/endpointInRangeIndex.js.map +1 -1
- package/lib/intervalIndex/endpointIndex.d.ts +12 -13
- package/lib/intervalIndex/endpointIndex.d.ts.map +1 -1
- package/lib/intervalIndex/endpointIndex.js +5 -6
- package/lib/intervalIndex/endpointIndex.js.map +1 -1
- package/lib/intervalIndex/idIntervalIndex.d.ts +6 -12
- package/lib/intervalIndex/idIntervalIndex.d.ts.map +1 -1
- package/lib/intervalIndex/idIntervalIndex.js +0 -3
- package/lib/intervalIndex/idIntervalIndex.js.map +1 -1
- package/lib/intervalIndex/index.d.ts +2 -2
- package/lib/intervalIndex/index.d.ts.map +1 -1
- package/lib/intervalIndex/index.js.map +1 -1
- package/lib/intervalIndex/intervalIndex.d.ts +28 -1
- package/lib/intervalIndex/intervalIndex.d.ts.map +1 -1
- package/lib/intervalIndex/intervalIndex.js.map +1 -1
- package/lib/intervalIndex/overlappingIntervalsIndex.d.ts +30 -13
- package/lib/intervalIndex/overlappingIntervalsIndex.d.ts.map +1 -1
- package/lib/intervalIndex/overlappingIntervalsIndex.js +5 -6
- package/lib/intervalIndex/overlappingIntervalsIndex.js.map +1 -1
- package/lib/intervalIndex/overlappingSequenceIntervalsIndex.d.ts.map +1 -1
- package/lib/intervalIndex/overlappingSequenceIntervalsIndex.js +2 -2
- package/lib/intervalIndex/overlappingSequenceIntervalsIndex.js.map +1 -1
- package/lib/intervalIndex/sequenceIntervalIndexes.d.ts +2 -2
- package/lib/intervalIndex/sequenceIntervalIndexes.d.ts.map +1 -1
- package/lib/intervalIndex/sequenceIntervalIndexes.js.map +1 -1
- package/lib/intervalIndex/startpointInRangeIndex.d.ts +10 -11
- package/lib/intervalIndex/startpointInRangeIndex.d.ts.map +1 -1
- package/lib/intervalIndex/startpointInRangeIndex.js +5 -6
- package/lib/intervalIndex/startpointInRangeIndex.js.map +1 -1
- package/lib/intervals/index.d.ts +2 -3
- package/lib/intervals/index.d.ts.map +1 -1
- package/lib/intervals/index.js +1 -2
- package/lib/intervals/index.js.map +1 -1
- package/lib/intervals/intervalUtils.d.ts +3 -25
- package/lib/intervals/intervalUtils.d.ts.map +1 -1
- package/lib/intervals/intervalUtils.js.map +1 -1
- package/lib/intervals/sequenceInterval.d.ts +3 -8
- package/lib/intervals/sequenceInterval.d.ts.map +1 -1
- package/lib/intervals/sequenceInterval.js +0 -8
- package/lib/intervals/sequenceInterval.js.map +1 -1
- package/lib/legacy.d.ts +4 -0
- package/lib/packageVersion.d.ts +1 -1
- package/lib/packageVersion.js +1 -1
- package/lib/packageVersion.js.map +1 -1
- package/lib/sequence.d.ts +4 -6
- package/lib/sequence.d.ts.map +1 -1
- package/lib/sequence.js +3 -5
- package/lib/sequence.js.map +1 -1
- package/lib/sharedIntervalCollection.d.ts +2 -63
- package/lib/sharedIntervalCollection.d.ts.map +1 -1
- package/lib/sharedIntervalCollection.js +1 -110
- package/lib/sharedIntervalCollection.js.map +1 -1
- package/lib/sharedString.d.ts.map +1 -1
- package/lib/sharedString.js +6 -6
- package/lib/sharedString.js.map +1 -1
- package/lib/tsdoc-metadata.json +1 -1
- package/package.json +20 -23
- package/src/IntervalCollectionValues.ts +10 -93
- package/src/index.ts +6 -17
- package/src/intervalCollection.ts +524 -343
- package/src/intervalCollectionMap.ts +72 -140
- package/src/intervalCollectionMapInterfaces.ts +13 -104
- package/src/intervalIndex/endpointInRangeIndex.ts +17 -29
- package/src/intervalIndex/endpointIndex.ts +19 -31
- package/src/intervalIndex/idIntervalIndex.ts +15 -25
- package/src/intervalIndex/index.ts +2 -1
- package/src/intervalIndex/intervalIndex.ts +30 -1
- package/src/intervalIndex/overlappingIntervalsIndex.ts +50 -27
- package/src/intervalIndex/overlappingSequenceIntervalsIndex.ts +2 -3
- package/src/intervalIndex/sequenceIntervalIndexes.ts +2 -2
- package/src/intervalIndex/startpointInRangeIndex.ts +17 -29
- package/src/intervals/index.ts +0 -3
- package/src/intervals/intervalUtils.ts +3 -38
- package/src/intervals/sequenceInterval.ts +2 -12
- package/src/packageVersion.ts +1 -1
- package/src/sequence.ts +8 -20
- package/src/sharedIntervalCollection.ts +5 -183
- package/src/sharedString.ts +6 -24
- package/dist/intervals/interval.d.ts +0 -76
- package/dist/intervals/interval.d.ts.map +0 -1
- package/dist/intervals/interval.js +0 -167
- package/dist/intervals/interval.js.map +0 -1
- package/lib/intervals/interval.d.ts +0 -76
- package/lib/intervals/interval.d.ts.map +0 -1
- package/lib/intervals/interval.js +0 -162
- package/lib/intervals/interval.js.map +0 -1
- package/prettier.config.cjs +0 -8
- 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.
|
|
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,
|
|
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
|
|
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
|
|
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
|
|
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
|
-
|
|
181
|
-
|
|
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
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
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
|
-
|
|
246
|
-
interval.removePositionChangeListeners();
|
|
247
|
-
}
|
|
234
|
+
interval.removePositionChangeListeners();
|
|
248
235
|
}
|
|
249
236
|
}
|
|
250
237
|
exports.LocalIntervalCollection = LocalIntervalCollection;
|
|
251
238
|
LocalIntervalCollection.legacyIdPrefix = "legacy";
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
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
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
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(
|
|
310
|
+
constructor(submitDelta, serializedIntervals, options = {}) {
|
|
387
311
|
super();
|
|
388
|
-
this.
|
|
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
|
|
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.
|
|
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 =
|
|
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
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
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
|
|
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
|
-
|
|
580
|
-
|
|
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.
|
|
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
|
|
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.
|
|
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
|
-
|
|
680
|
-
|
|
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.
|