@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.
- package/CHANGELOG.md +506 -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 +19 -22
- 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
|
@@ -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,
|
|
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,
|
|
13
|
-
import {
|
|
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,
|
|
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
|
|
82
|
+
this.overlappingIntervalsIndex = new OverlappingIntervalsIndex(client);
|
|
92
83
|
this.idIntervalIndex = createIdIntervalIndex();
|
|
93
|
-
this.endIntervalIndex = new EndpointIndex(client
|
|
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
|
|
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
|
-
|
|
173
|
-
|
|
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
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
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
|
-
|
|
238
|
-
interval.removePositionChangeListeners();
|
|
239
|
-
}
|
|
227
|
+
interval.removePositionChangeListeners();
|
|
240
228
|
}
|
|
241
229
|
}
|
|
242
230
|
LocalIntervalCollection.legacyIdPrefix = "legacy";
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
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
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
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
|
-
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(
|
|
302
|
+
constructor(submitDelta, serializedIntervals, options = {}) {
|
|
375
303
|
super();
|
|
376
|
-
this.
|
|
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
|
|
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.
|
|
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 =
|
|
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
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
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
|
|
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
|
-
|
|
568
|
-
|
|
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.
|
|
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
|
|
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.
|
|
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
|
-
|
|
668
|
-
|
|
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.
|