@fluidframework/sequence 2.0.0-internal.7.2.2 → 2.0.0-internal.7.4.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 +61 -0
- package/api-extractor-lint.json +13 -0
- package/api-extractor.json +9 -1
- package/api-report/sequence.api.md +87 -84
- package/dist/defaultMap.d.ts +3 -3
- package/dist/defaultMap.d.ts.map +1 -1
- package/dist/defaultMap.js +7 -2
- package/dist/defaultMap.js.map +1 -1
- package/dist/defaultMapInterfaces.d.ts +11 -10
- package/dist/defaultMapInterfaces.d.ts.map +1 -1
- package/dist/defaultMapInterfaces.js.map +1 -1
- package/dist/intervalCollection.d.ts +68 -14
- package/dist/intervalCollection.d.ts.map +1 -1
- package/dist/intervalCollection.js +50 -45
- package/dist/intervalCollection.js.map +1 -1
- package/dist/intervalIndex/endpointInRangeIndex.d.ts +2 -2
- package/dist/intervalIndex/endpointInRangeIndex.js +1 -1
- package/dist/intervalIndex/endpointInRangeIndex.js.map +1 -1
- package/dist/intervalIndex/endpointIndex.d.ts +2 -2
- package/dist/intervalIndex/endpointIndex.js +1 -1
- package/dist/intervalIndex/endpointIndex.js.map +1 -1
- package/dist/intervalIndex/idIntervalIndex.d.ts +2 -2
- package/dist/intervalIndex/idIntervalIndex.js +1 -1
- package/dist/intervalIndex/idIntervalIndex.js.map +1 -1
- package/dist/intervalIndex/intervalIndex.d.ts +1 -1
- package/dist/intervalIndex/intervalIndex.js.map +1 -1
- package/dist/intervalIndex/overlappingIntervalsIndex.d.ts +2 -2
- package/dist/intervalIndex/overlappingIntervalsIndex.js +1 -1
- package/dist/intervalIndex/overlappingIntervalsIndex.js.map +1 -1
- package/dist/intervalIndex/overlappingSequenceIntervalsIndex.d.ts +1 -1
- package/dist/intervalIndex/overlappingSequenceIntervalsIndex.js +1 -1
- package/dist/intervalIndex/overlappingSequenceIntervalsIndex.js.map +1 -1
- package/dist/intervalIndex/sequenceIntervalIndexes.d.ts +2 -1
- package/dist/intervalIndex/sequenceIntervalIndexes.d.ts.map +1 -1
- package/dist/intervalIndex/sequenceIntervalIndexes.js.map +1 -1
- package/dist/intervalIndex/startpointInRangeIndex.d.ts +2 -2
- package/dist/intervalIndex/startpointInRangeIndex.js +1 -1
- package/dist/intervalIndex/startpointInRangeIndex.js.map +1 -1
- package/dist/intervals/interval.d.ts +2 -7
- package/dist/intervals/interval.d.ts.map +1 -1
- package/dist/intervals/interval.js +1 -5
- package/dist/intervals/interval.js.map +1 -1
- package/dist/intervals/intervalUtils.d.ts +15 -14
- package/dist/intervals/intervalUtils.d.ts.map +1 -1
- package/dist/intervals/intervalUtils.js +4 -3
- package/dist/intervals/intervalUtils.js.map +1 -1
- package/dist/intervals/sequenceInterval.d.ts +3 -12
- package/dist/intervals/sequenceInterval.d.ts.map +1 -1
- package/dist/intervals/sequenceInterval.js +3 -11
- package/dist/intervals/sequenceInterval.js.map +1 -1
- package/dist/localValues.d.ts +2 -1
- package/dist/localValues.d.ts.map +1 -1
- package/dist/localValues.js.map +1 -1
- package/dist/packageVersion.d.ts +1 -1
- package/dist/packageVersion.js +1 -1
- package/dist/packageVersion.js.map +1 -1
- package/dist/revertibles.d.ts +9 -15
- package/dist/revertibles.d.ts.map +1 -1
- package/dist/revertibles.js +41 -21
- package/dist/revertibles.js.map +1 -1
- package/dist/sequence-alpha.d.ts +1306 -0
- package/dist/sequence-beta.d.ts +270 -0
- package/dist/sequence-public.d.ts +270 -0
- package/dist/sequence-untrimmed.d.ts +1790 -0
- package/dist/sequence.d.ts +2 -3
- package/dist/sequence.d.ts.map +1 -1
- package/dist/sequence.js +4 -5
- package/dist/sequence.js.map +1 -1
- package/dist/sequenceDeltaEvent.d.ts +4 -4
- package/dist/sequenceDeltaEvent.d.ts.map +1 -1
- package/dist/sequenceDeltaEvent.js +4 -3
- package/dist/sequenceDeltaEvent.js.map +1 -1
- package/dist/sequenceFactory.d.ts +1 -1
- package/dist/sequenceFactory.js +1 -1
- package/dist/sequenceFactory.js.map +1 -1
- package/dist/sharedIntervalCollection.d.ts +3 -3
- package/dist/sharedIntervalCollection.js +2 -2
- package/dist/sharedIntervalCollection.js.map +1 -1
- package/dist/sharedSequence.d.ts +3 -3
- package/dist/sharedSequence.js +2 -2
- package/dist/sharedSequence.js.map +1 -1
- package/dist/sharedString.d.ts +8 -5
- package/dist/sharedString.d.ts.map +1 -1
- package/dist/sharedString.js +6 -3
- package/dist/sharedString.js.map +1 -1
- package/dist/tsdoc-metadata.json +1 -1
- package/lib/defaultMap.d.ts +3 -3
- package/lib/defaultMap.d.ts.map +1 -1
- package/lib/defaultMap.js +29 -20
- package/lib/defaultMap.js.map +1 -1
- package/lib/defaultMapInterfaces.d.ts +11 -10
- package/lib/defaultMapInterfaces.d.ts.map +1 -1
- package/lib/defaultMapInterfaces.js +2 -1
- package/lib/defaultMapInterfaces.js.map +1 -1
- package/lib/index.js +45 -10
- package/lib/index.js.map +1 -1
- package/lib/intervalCollection.d.ts +68 -14
- package/lib/intervalCollection.d.ts.map +1 -1
- package/lib/intervalCollection.js +174 -156
- package/lib/intervalCollection.js.map +1 -1
- package/lib/intervalIndex/endpointInRangeIndex.d.ts +2 -2
- package/lib/intervalIndex/endpointInRangeIndex.js +18 -13
- package/lib/intervalIndex/endpointInRangeIndex.js.map +1 -1
- package/lib/intervalIndex/endpointIndex.d.ts +2 -2
- package/lib/intervalIndex/endpointIndex.js +14 -9
- package/lib/intervalIndex/endpointIndex.js.map +1 -1
- package/lib/intervalIndex/idIntervalIndex.d.ts +2 -2
- package/lib/intervalIndex/idIntervalIndex.js +9 -5
- package/lib/intervalIndex/idIntervalIndex.js.map +1 -1
- package/lib/intervalIndex/index.js +19 -6
- package/lib/intervalIndex/index.js.map +1 -1
- package/lib/intervalIndex/intervalIndex.d.ts +1 -1
- package/lib/intervalIndex/intervalIndex.js +2 -1
- package/lib/intervalIndex/intervalIndex.js.map +1 -1
- package/lib/intervalIndex/intervalIndexUtils.js +8 -4
- package/lib/intervalIndex/intervalIndexUtils.js.map +1 -1
- package/lib/intervalIndex/overlappingIntervalsIndex.d.ts +2 -2
- package/lib/intervalIndex/overlappingIntervalsIndex.js +16 -11
- package/lib/intervalIndex/overlappingIntervalsIndex.js.map +1 -1
- package/lib/intervalIndex/overlappingSequenceIntervalsIndex.d.ts +1 -1
- package/lib/intervalIndex/overlappingSequenceIntervalsIndex.js +15 -11
- package/lib/intervalIndex/overlappingSequenceIntervalsIndex.js.map +1 -1
- package/lib/intervalIndex/sequenceIntervalIndexes.d.ts +2 -1
- package/lib/intervalIndex/sequenceIntervalIndexes.d.ts.map +1 -1
- package/lib/intervalIndex/sequenceIntervalIndexes.js +2 -1
- package/lib/intervalIndex/sequenceIntervalIndexes.js.map +1 -1
- package/lib/intervalIndex/startpointInRangeIndex.d.ts +2 -2
- package/lib/intervalIndex/startpointInRangeIndex.js +18 -13
- package/lib/intervalIndex/startpointInRangeIndex.js.map +1 -1
- package/lib/intervalTree.js +9 -4
- package/lib/intervalTree.js.map +1 -1
- package/lib/intervals/index.js +18 -3
- package/lib/intervals/index.js.map +1 -1
- package/lib/intervals/interval.d.ts +2 -7
- package/lib/intervals/interval.d.ts.map +1 -1
- package/lib/intervals/interval.js +19 -18
- package/lib/intervals/interval.js.map +1 -1
- package/lib/intervals/intervalUtils.d.ts +15 -14
- package/lib/intervals/intervalUtils.d.ts.map +1 -1
- package/lib/intervals/intervalUtils.js +22 -16
- package/lib/intervals/intervalUtils.js.map +1 -1
- package/lib/intervals/sequenceInterval.d.ts +3 -12
- package/lib/intervals/sequenceInterval.d.ts.map +1 -1
- package/lib/intervals/sequenceInterval.js +68 -70
- package/lib/intervals/sequenceInterval.js.map +1 -1
- package/lib/localValues.d.ts +2 -1
- package/lib/localValues.d.ts.map +1 -1
- package/lib/localValues.js +9 -4
- package/lib/localValues.js.map +1 -1
- package/lib/packageVersion.d.ts +1 -1
- package/lib/packageVersion.js +5 -2
- package/lib/packageVersion.js.map +1 -1
- package/lib/revertibles.d.ts +9 -15
- package/lib/revertibles.d.ts.map +1 -1
- package/lib/revertibles.js +98 -68
- package/lib/revertibles.js.map +1 -1
- package/lib/sequence-alpha.d.ts +1306 -0
- package/lib/sequence-beta.d.ts +270 -0
- package/lib/sequence-public.d.ts +270 -0
- package/lib/sequence-untrimmed.d.ts +1790 -0
- package/lib/sequence.d.ts +2 -3
- package/lib/sequence.d.ts.map +1 -1
- package/lib/sequence.js +46 -46
- package/lib/sequence.js.map +1 -1
- package/lib/sequenceDeltaEvent.d.ts +4 -4
- package/lib/sequenceDeltaEvent.d.ts.map +1 -1
- package/lib/sequenceDeltaEvent.js +17 -10
- package/lib/sequenceDeltaEvent.js.map +1 -1
- package/lib/sequenceFactory.d.ts +1 -1
- package/lib/sequenceFactory.js +14 -10
- package/lib/sequenceFactory.js.map +1 -1
- package/lib/sharedIntervalCollection.d.ts +3 -3
- package/lib/sharedIntervalCollection.js +20 -15
- package/lib/sharedIntervalCollection.js.map +1 -1
- package/lib/sharedSequence.d.ts +3 -3
- package/lib/sharedSequence.js +13 -8
- package/lib/sharedSequence.js.map +1 -1
- package/lib/sharedString.d.ts +8 -5
- package/lib/sharedString.d.ts.map +1 -1
- package/lib/sharedString.js +27 -19
- package/lib/sharedString.js.map +1 -1
- package/package.json +43 -29
- package/sequence.test-files.tar +0 -0
- package/src/defaultMap.ts +22 -16
- package/src/defaultMapInterfaces.ts +15 -12
- package/src/intervalCollection.ts +131 -67
- package/src/intervalIndex/endpointInRangeIndex.ts +2 -2
- package/src/intervalIndex/endpointIndex.ts +2 -2
- package/src/intervalIndex/idIntervalIndex.ts +2 -2
- package/src/intervalIndex/intervalIndex.ts +1 -1
- package/src/intervalIndex/overlappingIntervalsIndex.ts +2 -2
- package/src/intervalIndex/overlappingSequenceIntervalsIndex.ts +1 -1
- package/src/intervalIndex/sequenceIntervalIndexes.ts +2 -1
- package/src/intervalIndex/startpointInRangeIndex.ts +2 -2
- package/src/intervals/interval.ts +2 -7
- package/src/intervals/intervalUtils.ts +16 -15
- package/src/intervals/sequenceInterval.ts +3 -12
- package/src/localValues.ts +2 -1
- package/src/packageVersion.ts +1 -1
- package/src/revertibles.ts +95 -24
- package/src/sequence.ts +5 -7
- package/src/sequenceDeltaEvent.ts +6 -4
- package/src/sequenceFactory.ts +1 -1
- package/src/sharedIntervalCollection.ts +3 -3
- package/src/sharedSequence.ts +3 -3
- package/src/sharedString.ts +8 -5
- package/tsconfig.esnext.json +1 -2
- package/tsconfig.json +5 -3
|
@@ -1,46 +1,50 @@
|
|
|
1
|
+
"use strict";
|
|
1
2
|
/*!
|
|
2
3
|
* Copyright (c) Microsoft Corporation and contributors. All rights reserved.
|
|
3
4
|
* Licensed under the MIT License.
|
|
4
5
|
*/
|
|
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.endpointPosAndSide = exports.sidesFromStickiness = exports.Side = void 0;
|
|
5
8
|
/* eslint-disable no-bitwise */
|
|
6
9
|
/* eslint-disable import/no-deprecated */
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
10
|
+
const client_utils_1 = require("@fluid-internal/client-utils");
|
|
11
|
+
const core_utils_1 = require("@fluidframework/core-utils");
|
|
12
|
+
const merge_tree_1 = require("@fluidframework/merge-tree");
|
|
13
|
+
const telemetry_utils_1 = require("@fluidframework/telemetry-utils");
|
|
14
|
+
const uuid_1 = require("uuid");
|
|
15
|
+
const intervals_1 = require("./intervals");
|
|
16
|
+
const intervalIndex_1 = require("./intervalIndex");
|
|
14
17
|
/**
|
|
15
18
|
* Defines a side relative to a character in a sequence.
|
|
16
19
|
*
|
|
17
20
|
* @remarks See {@link SequencePlace} for additional context on usage.
|
|
18
|
-
* @
|
|
21
|
+
* @alpha
|
|
19
22
|
*/
|
|
20
|
-
|
|
23
|
+
var Side;
|
|
21
24
|
(function (Side) {
|
|
22
25
|
Side[Side["Before"] = 0] = "Before";
|
|
23
26
|
Side[Side["After"] = 1] = "After";
|
|
24
|
-
})(Side || (Side = {}));
|
|
27
|
+
})(Side || (exports.Side = Side = {}));
|
|
25
28
|
const reservedIntervalIdKey = "intervalId";
|
|
26
|
-
|
|
27
|
-
const startSide = (stickiness & IntervalStickiness.START) !== 0 ? Side.After : Side.Before;
|
|
28
|
-
const endSide = (stickiness & IntervalStickiness.END) !== 0 ? Side.Before : Side.After;
|
|
29
|
+
function sidesFromStickiness(stickiness) {
|
|
30
|
+
const startSide = (stickiness & intervals_1.IntervalStickiness.START) !== 0 ? Side.After : Side.Before;
|
|
31
|
+
const endSide = (stickiness & intervals_1.IntervalStickiness.END) !== 0 ? Side.Before : Side.After;
|
|
29
32
|
return { startSide, endSide };
|
|
30
33
|
}
|
|
34
|
+
exports.sidesFromStickiness = sidesFromStickiness;
|
|
31
35
|
/**
|
|
32
36
|
* Decompress an interval after loading a summary from JSON. The exact format
|
|
33
37
|
* of this compression is unspecified and subject to change
|
|
34
38
|
*/
|
|
35
39
|
function decompressInterval(interval, label) {
|
|
36
|
-
const stickiness = interval[5] ?? IntervalStickiness.END;
|
|
40
|
+
const stickiness = interval[5] ?? intervals_1.IntervalStickiness.END;
|
|
37
41
|
const { startSide, endSide } = sidesFromStickiness(stickiness);
|
|
38
42
|
return {
|
|
39
43
|
start: interval[0],
|
|
40
44
|
end: interval[1],
|
|
41
45
|
sequenceNumber: interval[2],
|
|
42
46
|
intervalType: interval[3],
|
|
43
|
-
properties: { ...interval[4], [reservedRangeLabelsKey]: [label] },
|
|
47
|
+
properties: { ...interval[4], [merge_tree_1.reservedRangeLabelsKey]: [label] },
|
|
44
48
|
stickiness,
|
|
45
49
|
startSide,
|
|
46
50
|
endSide,
|
|
@@ -59,15 +63,15 @@ function compressInterval(interval) {
|
|
|
59
63
|
intervalType,
|
|
60
64
|
// remove the `referenceRangeLabels` property as it is already stored
|
|
61
65
|
// in the `label` field of the summary
|
|
62
|
-
{ ...properties, [reservedRangeLabelsKey]: undefined },
|
|
66
|
+
{ ...properties, [merge_tree_1.reservedRangeLabelsKey]: undefined },
|
|
63
67
|
];
|
|
64
|
-
if (interval.stickiness !== undefined && interval.stickiness !== IntervalStickiness.END) {
|
|
68
|
+
if (interval.stickiness !== undefined && interval.stickiness !== intervals_1.IntervalStickiness.END) {
|
|
65
69
|
// reassignment to make it easier for typescript to reason about types
|
|
66
70
|
base = [...base, interval.stickiness];
|
|
67
71
|
}
|
|
68
72
|
return base;
|
|
69
73
|
}
|
|
70
|
-
|
|
74
|
+
function endpointPosAndSide(start, end) {
|
|
71
75
|
const startIsPlainEndpoint = typeof start === "number" || start === "start" || start === "end";
|
|
72
76
|
const endIsPlainEndpoint = typeof end === "number" || end === "start" || end === "end";
|
|
73
77
|
const startSide = startIsPlainEndpoint ? Side.Before : start?.side;
|
|
@@ -81,30 +85,33 @@ export function endpointPosAndSide(start, end) {
|
|
|
81
85
|
endPos,
|
|
82
86
|
};
|
|
83
87
|
}
|
|
88
|
+
exports.endpointPosAndSide = endpointPosAndSide;
|
|
84
89
|
function toSequencePlace(pos, side) {
|
|
85
90
|
return typeof pos === "number" ? { pos, side } : pos;
|
|
86
91
|
}
|
|
87
92
|
function toOptionalSequencePlace(pos, side = Side.Before) {
|
|
88
93
|
return typeof pos === "number" ? { pos, side } : pos;
|
|
89
94
|
}
|
|
90
|
-
|
|
91
|
-
let stickiness = IntervalStickiness.NONE;
|
|
95
|
+
function computeStickinessFromSide(startPos = -1, startSide = Side.Before, endPos = -1, endSide = Side.Before) {
|
|
96
|
+
let stickiness = intervals_1.IntervalStickiness.NONE;
|
|
92
97
|
if (startSide === Side.After || startPos === "start") {
|
|
93
|
-
stickiness |= IntervalStickiness.START;
|
|
98
|
+
stickiness |= intervals_1.IntervalStickiness.START;
|
|
94
99
|
}
|
|
95
100
|
if (endSide === Side.Before || endPos === "end") {
|
|
96
|
-
stickiness |= IntervalStickiness.END;
|
|
101
|
+
stickiness |= intervals_1.IntervalStickiness.END;
|
|
97
102
|
}
|
|
98
103
|
return stickiness;
|
|
99
104
|
}
|
|
100
|
-
|
|
105
|
+
exports.computeStickinessFromSide = computeStickinessFromSide;
|
|
106
|
+
function createIntervalIndex() {
|
|
101
107
|
const helpers = {
|
|
102
|
-
create: createInterval,
|
|
108
|
+
create: intervals_1.createInterval,
|
|
103
109
|
};
|
|
104
110
|
const lc = new LocalIntervalCollection(undefined, "", helpers, {});
|
|
105
111
|
return lc;
|
|
106
112
|
}
|
|
107
|
-
|
|
113
|
+
exports.createIntervalIndex = createIntervalIndex;
|
|
114
|
+
class LocalIntervalCollection {
|
|
108
115
|
constructor(client, label, helpers, options,
|
|
109
116
|
/** Callback invoked each time one of the endpoints of an interval slides. */
|
|
110
117
|
onPositionChange) {
|
|
@@ -113,9 +120,9 @@ export class LocalIntervalCollection {
|
|
|
113
120
|
this.helpers = helpers;
|
|
114
121
|
this.options = options;
|
|
115
122
|
this.onPositionChange = onPositionChange;
|
|
116
|
-
this.overlappingIntervalsIndex = new OverlappingIntervalsIndex(client, helpers);
|
|
117
|
-
this.idIntervalIndex = createIdIntervalIndex();
|
|
118
|
-
this.endIntervalIndex = new EndpointIndex(client, helpers);
|
|
123
|
+
this.overlappingIntervalsIndex = new intervalIndex_1.OverlappingIntervalsIndex(client, helpers);
|
|
124
|
+
this.idIntervalIndex = (0, intervalIndex_1.createIdIntervalIndex)();
|
|
125
|
+
this.endIntervalIndex = new intervalIndex_1.EndpointIndex(client, helpers);
|
|
119
126
|
this.indexes = new Set([
|
|
120
127
|
this.overlappingIntervalsIndex,
|
|
121
128
|
this.idIntervalIndex,
|
|
@@ -144,7 +151,7 @@ export class LocalIntervalCollection {
|
|
|
144
151
|
const newProps = {
|
|
145
152
|
[reservedIntervalIdKey]: id,
|
|
146
153
|
};
|
|
147
|
-
serializedInterval.properties = addProperties(serializedInterval.properties, newProps);
|
|
154
|
+
serializedInterval.properties = (0, merge_tree_1.addProperties)(serializedInterval.properties, newProps);
|
|
148
155
|
}
|
|
149
156
|
// Make the ID immutable for safety's sake.
|
|
150
157
|
Object.defineProperty(serializedInterval.properties, reservedIntervalIdKey, {
|
|
@@ -177,25 +184,25 @@ export class LocalIntervalCollection {
|
|
|
177
184
|
const interval = this.createInterval(start, end, intervalType, op);
|
|
178
185
|
if (interval) {
|
|
179
186
|
if (!interval.properties) {
|
|
180
|
-
interval.properties = createMap();
|
|
187
|
+
interval.properties = (0, merge_tree_1.createMap)();
|
|
181
188
|
}
|
|
182
189
|
if (props) {
|
|
183
190
|
// This check is intended to prevent scenarios where a random interval is created and then
|
|
184
191
|
// inserted into a collection. The aim is to ensure that the collection is created first
|
|
185
192
|
// then the user can create/add intervals based on the collection
|
|
186
|
-
if (props[reservedRangeLabelsKey] !== undefined &&
|
|
187
|
-
props[reservedRangeLabelsKey][0] !== this.label) {
|
|
188
|
-
throw new LoggingError("Adding an interval that belongs to another interval collection is not permitted");
|
|
193
|
+
if (props[merge_tree_1.reservedRangeLabelsKey] !== undefined &&
|
|
194
|
+
props[merge_tree_1.reservedRangeLabelsKey][0] !== this.label) {
|
|
195
|
+
throw new telemetry_utils_1.LoggingError("Adding an interval that belongs to another interval collection is not permitted");
|
|
189
196
|
}
|
|
190
197
|
interval.addProperties(props);
|
|
191
198
|
}
|
|
192
|
-
(_a = interval.properties)[reservedIntervalIdKey] ?? (_a[reservedIntervalIdKey] =
|
|
199
|
+
(_a = interval.properties)[reservedIntervalIdKey] ?? (_a[reservedIntervalIdKey] = (0, uuid_1.v4)());
|
|
193
200
|
this.add(interval);
|
|
194
201
|
}
|
|
195
202
|
return interval;
|
|
196
203
|
}
|
|
197
204
|
linkEndpointsToInterval(interval) {
|
|
198
|
-
if (interval instanceof SequenceInterval) {
|
|
205
|
+
if (interval instanceof intervals_1.SequenceInterval) {
|
|
199
206
|
interval.start.addProperties({ interval });
|
|
200
207
|
interval.end.addProperties({ interval });
|
|
201
208
|
}
|
|
@@ -234,9 +241,9 @@ export class LocalIntervalCollection {
|
|
|
234
241
|
// either, so this must be special-cased.
|
|
235
242
|
return ref;
|
|
236
243
|
}
|
|
237
|
-
return this.client.createLocalReferencePosition(segment, ref.getOffset(), ReferenceType.Transient, ref.properties, ref.slidingPreference, ref.canSlideToEndpoint);
|
|
244
|
+
return this.client.createLocalReferencePosition(segment, ref.getOffset(), merge_tree_1.ReferenceType.Transient, ref.properties, ref.slidingPreference, ref.canSlideToEndpoint);
|
|
238
245
|
};
|
|
239
|
-
if (interval instanceof SequenceInterval) {
|
|
246
|
+
if (interval instanceof intervals_1.SequenceInterval) {
|
|
240
247
|
let previousInterval;
|
|
241
248
|
let pendingChanges = 0;
|
|
242
249
|
interval.addPositionChangeListeners(() => {
|
|
@@ -249,7 +256,7 @@ export class LocalIntervalCollection {
|
|
|
249
256
|
this.removeIntervalFromIndexes(interval);
|
|
250
257
|
}
|
|
251
258
|
}, () => {
|
|
252
|
-
assert(previousInterval !== undefined, 0x3fa /* Invalid interleaving of before/after slide */);
|
|
259
|
+
(0, core_utils_1.assert)(previousInterval !== undefined, 0x3fa /* Invalid interleaving of before/after slide */);
|
|
253
260
|
pendingChanges--;
|
|
254
261
|
if (pendingChanges === 0) {
|
|
255
262
|
this.addIntervalToIndexes(interval);
|
|
@@ -260,21 +267,22 @@ export class LocalIntervalCollection {
|
|
|
260
267
|
}
|
|
261
268
|
}
|
|
262
269
|
removeIntervalListeners(interval) {
|
|
263
|
-
if (interval instanceof SequenceInterval) {
|
|
270
|
+
if (interval instanceof intervals_1.SequenceInterval) {
|
|
264
271
|
interval.removePositionChangeListeners();
|
|
265
272
|
}
|
|
266
273
|
}
|
|
267
274
|
}
|
|
275
|
+
exports.LocalIntervalCollection = LocalIntervalCollection;
|
|
268
276
|
LocalIntervalCollection.legacyIdPrefix = "legacy";
|
|
269
277
|
class SequenceIntervalCollectionFactory {
|
|
270
278
|
load(emitter, raw = [], options) {
|
|
271
|
-
return new IntervalCollection(sequenceIntervalHelpers, true, emitter, raw, options);
|
|
279
|
+
return new IntervalCollection(intervals_1.sequenceIntervalHelpers, true, emitter, raw, options);
|
|
272
280
|
}
|
|
273
281
|
store(value) {
|
|
274
282
|
return value.serializeInternal();
|
|
275
283
|
}
|
|
276
284
|
}
|
|
277
|
-
|
|
285
|
+
class SequenceIntervalCollectionValueType {
|
|
278
286
|
get name() {
|
|
279
287
|
return SequenceIntervalCollectionValueType.Name;
|
|
280
288
|
}
|
|
@@ -285,13 +293,14 @@ export class SequenceIntervalCollectionValueType {
|
|
|
285
293
|
return SequenceIntervalCollectionValueType._ops;
|
|
286
294
|
}
|
|
287
295
|
}
|
|
296
|
+
exports.SequenceIntervalCollectionValueType = SequenceIntervalCollectionValueType;
|
|
288
297
|
SequenceIntervalCollectionValueType.Name = "sharedStringIntervalCollection";
|
|
289
298
|
SequenceIntervalCollectionValueType._factory = new SequenceIntervalCollectionFactory();
|
|
290
299
|
SequenceIntervalCollectionValueType._ops = makeOpsMap();
|
|
291
300
|
class IntervalCollectionFactory {
|
|
292
301
|
load(emitter, raw = [], options) {
|
|
293
302
|
const helpers = {
|
|
294
|
-
create: createInterval,
|
|
303
|
+
create: intervals_1.createInterval,
|
|
295
304
|
};
|
|
296
305
|
const collection = new IntervalCollection(helpers, false, emitter, raw, options);
|
|
297
306
|
collection.attachGraph(undefined, "");
|
|
@@ -301,7 +310,7 @@ class IntervalCollectionFactory {
|
|
|
301
310
|
return value.serializeInternal();
|
|
302
311
|
}
|
|
303
312
|
}
|
|
304
|
-
|
|
313
|
+
class IntervalCollectionValueType {
|
|
305
314
|
get name() {
|
|
306
315
|
return IntervalCollectionValueType.Name;
|
|
307
316
|
}
|
|
@@ -312,19 +321,23 @@ export class IntervalCollectionValueType {
|
|
|
312
321
|
return IntervalCollectionValueType._ops;
|
|
313
322
|
}
|
|
314
323
|
}
|
|
324
|
+
exports.IntervalCollectionValueType = IntervalCollectionValueType;
|
|
315
325
|
IntervalCollectionValueType.Name = "sharedIntervalCollection";
|
|
316
326
|
IntervalCollectionValueType._factory = new IntervalCollectionFactory();
|
|
317
327
|
IntervalCollectionValueType._ops = makeOpsMap();
|
|
318
|
-
|
|
328
|
+
function makeOpsMap() {
|
|
319
329
|
const rebase = (collection, op, localOpMetadata) => {
|
|
320
330
|
const { localSeq } = localOpMetadata;
|
|
321
331
|
const rebasedValue = collection.rebaseLocalInterval(op.opName, op.value, localSeq);
|
|
332
|
+
if (rebasedValue === undefined) {
|
|
333
|
+
return undefined;
|
|
334
|
+
}
|
|
322
335
|
const rebasedOp = { ...op, value: rebasedValue };
|
|
323
336
|
return { rebasedOp, rebasedLocalOpMetadata: localOpMetadata };
|
|
324
337
|
};
|
|
325
338
|
return new Map([
|
|
326
339
|
[
|
|
327
|
-
IntervalOpType.ADD,
|
|
340
|
+
intervals_1.IntervalOpType.ADD,
|
|
328
341
|
{
|
|
329
342
|
process: (collection, params, local, op, localOpMetadata) => {
|
|
330
343
|
// if params is undefined, the interval was deleted during
|
|
@@ -332,17 +345,17 @@ export function makeOpsMap() {
|
|
|
332
345
|
if (!params) {
|
|
333
346
|
return;
|
|
334
347
|
}
|
|
335
|
-
assert(op !== undefined, 0x3fb /* op should exist here */);
|
|
348
|
+
(0, core_utils_1.assert)(op !== undefined, 0x3fb /* op should exist here */);
|
|
336
349
|
collection.ackAdd(params, local, op, localOpMetadata);
|
|
337
350
|
},
|
|
338
351
|
rebase,
|
|
339
352
|
},
|
|
340
353
|
],
|
|
341
354
|
[
|
|
342
|
-
IntervalOpType.DELETE,
|
|
355
|
+
intervals_1.IntervalOpType.DELETE,
|
|
343
356
|
{
|
|
344
357
|
process: (collection, params, local, op) => {
|
|
345
|
-
assert(op !== undefined, 0x3fc /* op should exist here */);
|
|
358
|
+
(0, core_utils_1.assert)(op !== undefined, 0x3fc /* op should exist here */);
|
|
346
359
|
collection.ackDelete(params, local, op);
|
|
347
360
|
},
|
|
348
361
|
rebase: (collection, op, localOpMetadata) => {
|
|
@@ -352,7 +365,7 @@ export function makeOpsMap() {
|
|
|
352
365
|
},
|
|
353
366
|
],
|
|
354
367
|
[
|
|
355
|
-
IntervalOpType.CHANGE,
|
|
368
|
+
intervals_1.IntervalOpType.CHANGE,
|
|
356
369
|
{
|
|
357
370
|
process: (collection, params, local, op, localOpMetadata) => {
|
|
358
371
|
// if params is undefined, the interval was deleted during
|
|
@@ -360,7 +373,7 @@ export function makeOpsMap() {
|
|
|
360
373
|
if (!params) {
|
|
361
374
|
return;
|
|
362
375
|
}
|
|
363
|
-
assert(op !== undefined, 0x3fd /* op should exist here */);
|
|
376
|
+
(0, core_utils_1.assert)(op !== undefined, 0x3fd /* op should exist here */);
|
|
364
377
|
collection.ackChange(params, local, op, localOpMetadata);
|
|
365
378
|
},
|
|
366
379
|
rebase,
|
|
@@ -368,6 +381,7 @@ export function makeOpsMap() {
|
|
|
368
381
|
],
|
|
369
382
|
]);
|
|
370
383
|
}
|
|
384
|
+
exports.makeOpsMap = makeOpsMap;
|
|
371
385
|
class IntervalCollectionIterator {
|
|
372
386
|
constructor(collection, iteratesForward = true, start, end) {
|
|
373
387
|
this.results = [];
|
|
@@ -395,7 +409,7 @@ const isSequencePlace = (place) => {
|
|
|
395
409
|
/**
|
|
396
410
|
* {@inheritdoc IIntervalCollection}
|
|
397
411
|
*/
|
|
398
|
-
|
|
412
|
+
class IntervalCollection extends client_utils_1.TypedEventEmitter {
|
|
399
413
|
get attached() {
|
|
400
414
|
return !!this.localCollection;
|
|
401
415
|
}
|
|
@@ -419,7 +433,7 @@ export class IntervalCollection extends TypedEventEmitter {
|
|
|
419
433
|
*/
|
|
420
434
|
attachIndex(index) {
|
|
421
435
|
if (!this.attached) {
|
|
422
|
-
throw new LoggingError("The local interval collection must exist");
|
|
436
|
+
throw new telemetry_utils_1.LoggingError("The local interval collection must exist");
|
|
423
437
|
}
|
|
424
438
|
for (const interval of this) {
|
|
425
439
|
index.add(interval);
|
|
@@ -431,7 +445,7 @@ export class IntervalCollection extends TypedEventEmitter {
|
|
|
431
445
|
*/
|
|
432
446
|
detachIndex(index) {
|
|
433
447
|
if (!this.attached) {
|
|
434
|
-
throw new LoggingError("The local interval collection must exist");
|
|
448
|
+
throw new telemetry_utils_1.LoggingError("The local interval collection must exist");
|
|
435
449
|
}
|
|
436
450
|
// Avoid removing intervals if the index does not exist
|
|
437
451
|
if (!this.localCollection?.removeIndex(index)) {
|
|
@@ -444,7 +458,7 @@ export class IntervalCollection extends TypedEventEmitter {
|
|
|
444
458
|
}
|
|
445
459
|
rebasePositionWithSegmentSlide(pos, seqNumberFrom, localSeq) {
|
|
446
460
|
if (!this.client) {
|
|
447
|
-
throw new LoggingError("mergeTree client must exist");
|
|
461
|
+
throw new telemetry_utils_1.LoggingError("mergeTree client must exist");
|
|
448
462
|
}
|
|
449
463
|
if (pos === "start" || pos === "end") {
|
|
450
464
|
return pos;
|
|
@@ -455,19 +469,19 @@ export class IntervalCollection extends TypedEventEmitter {
|
|
|
455
469
|
clientId: this.client.getLongClientId(clientId),
|
|
456
470
|
}, localSeq);
|
|
457
471
|
// if segment is undefined, it slid off the string
|
|
458
|
-
assert(segment !== undefined, 0x54e /* No segment found */);
|
|
459
|
-
const segoff = getSlideToSegoff({ segment, offset }, undefined, this.options.mergeTreeReferencesCanSlideToEndpoint) ?? segment;
|
|
472
|
+
(0, core_utils_1.assert)(segment !== undefined, 0x54e /* No segment found */);
|
|
473
|
+
const segoff = (0, merge_tree_1.getSlideToSegoff)({ segment, offset }, undefined, this.options.mergeTreeReferencesCanSlideToEndpoint) ?? segment;
|
|
460
474
|
// case happens when rebasing op, but concurrently entire string has been deleted
|
|
461
475
|
if (segoff.segment === undefined || segoff.offset === undefined) {
|
|
462
|
-
return DetachedReferencePosition;
|
|
476
|
+
return merge_tree_1.DetachedReferencePosition;
|
|
463
477
|
}
|
|
464
|
-
assert(offset !== undefined && 0 <= offset && offset < segment.cachedLength, 0x54f /* Invalid offset */);
|
|
478
|
+
(0, core_utils_1.assert)(offset !== undefined && 0 <= offset && offset < segment.cachedLength, 0x54f /* Invalid offset */);
|
|
465
479
|
return this.client.findReconnectionPosition(segoff.segment, localSeq) + segoff.offset;
|
|
466
480
|
}
|
|
467
481
|
computeRebasedPositions(localSeq) {
|
|
468
|
-
assert(this.client !== undefined, 0x550 /* Client should be defined when computing rebased position */);
|
|
482
|
+
(0, core_utils_1.assert)(this.client !== undefined, 0x550 /* Client should be defined when computing rebased position */);
|
|
469
483
|
const original = this.localSeqToSerializedInterval.get(localSeq);
|
|
470
|
-
assert(original !== undefined, 0x551 /* Failed to store pending serialized interval info for this localSeq. */);
|
|
484
|
+
(0, core_utils_1.assert)(original !== undefined, 0x551 /* Failed to store pending serialized interval info for this localSeq. */);
|
|
471
485
|
const rebased = { ...original };
|
|
472
486
|
const { start, end, sequenceNumber } = original;
|
|
473
487
|
if (start !== undefined) {
|
|
@@ -481,10 +495,10 @@ export class IntervalCollection extends TypedEventEmitter {
|
|
|
481
495
|
/** @internal */
|
|
482
496
|
attachGraph(client, label) {
|
|
483
497
|
if (this.attached) {
|
|
484
|
-
throw new LoggingError("Only supports one Sequence attach");
|
|
498
|
+
throw new telemetry_utils_1.LoggingError("Only supports one Sequence attach");
|
|
485
499
|
}
|
|
486
500
|
if (client === undefined && this.requiresClient) {
|
|
487
|
-
throw new LoggingError("Client required for this collection");
|
|
501
|
+
throw new telemetry_utils_1.LoggingError("Client required for this collection");
|
|
488
502
|
}
|
|
489
503
|
// Instantiate the local interval collection based on the saved intervals
|
|
490
504
|
this.client = client;
|
|
@@ -530,11 +544,11 @@ export class IntervalCollection extends TypedEventEmitter {
|
|
|
530
544
|
// is restored as single-endpoint changes re-use previous references.
|
|
531
545
|
let startRefType;
|
|
532
546
|
let endRefType;
|
|
533
|
-
if (previousInterval instanceof SequenceInterval) {
|
|
547
|
+
if (previousInterval instanceof intervals_1.SequenceInterval) {
|
|
534
548
|
startRefType = previousInterval.start.refType;
|
|
535
549
|
endRefType = previousInterval.end.refType;
|
|
536
|
-
previousInterval.start.refType = ReferenceType.Transient;
|
|
537
|
-
previousInterval.end.refType = ReferenceType.Transient;
|
|
550
|
+
previousInterval.start.refType = merge_tree_1.ReferenceType.Transient;
|
|
551
|
+
previousInterval.end.refType = merge_tree_1.ReferenceType.Transient;
|
|
538
552
|
this.emit("changeInterval", interval, previousInterval, local, op, slide);
|
|
539
553
|
previousInterval.start.refType = startRefType;
|
|
540
554
|
previousInterval.end.refType = endRefType;
|
|
@@ -548,14 +562,14 @@ export class IntervalCollection extends TypedEventEmitter {
|
|
|
548
562
|
*/
|
|
549
563
|
getIntervalById(id) {
|
|
550
564
|
if (!this.localCollection) {
|
|
551
|
-
throw new LoggingError("attach must be called before accessing intervals");
|
|
565
|
+
throw new telemetry_utils_1.LoggingError("attach must be called before accessing intervals");
|
|
552
566
|
}
|
|
553
567
|
return this.localCollection.idIntervalIndex.getIntervalById(id);
|
|
554
568
|
}
|
|
555
569
|
assertStickinessEnabled(start, end) {
|
|
556
570
|
if (!(typeof start === "number" && typeof end === "number") &&
|
|
557
571
|
!this.options.intervalStickinessEnabled) {
|
|
558
|
-
throw new UsageError("attempted to set interval stickiness without enabling `intervalStickinessEnabled` feature flag");
|
|
572
|
+
throw new telemetry_utils_1.UsageError("attempted to set interval stickiness without enabling `intervalStickinessEnabled` feature flag");
|
|
559
573
|
}
|
|
560
574
|
}
|
|
561
575
|
add(start, end, intervalType, props) {
|
|
@@ -565,26 +579,26 @@ export class IntervalCollection extends TypedEventEmitter {
|
|
|
565
579
|
let properties;
|
|
566
580
|
if (isSequencePlace(start)) {
|
|
567
581
|
intStart = start;
|
|
568
|
-
assert(end !== undefined, 0x7c0 /* end must be defined */);
|
|
582
|
+
(0, core_utils_1.assert)(end !== undefined, 0x7c0 /* end must be defined */);
|
|
569
583
|
intEnd = end;
|
|
570
|
-
assert(intervalType !== undefined, 0x7c1 /* intervalType must be defined */);
|
|
584
|
+
(0, core_utils_1.assert)(intervalType !== undefined, 0x7c1 /* intervalType must be defined */);
|
|
571
585
|
type = intervalType;
|
|
572
586
|
properties = props;
|
|
573
587
|
}
|
|
574
588
|
else {
|
|
575
589
|
intStart = start.start;
|
|
576
590
|
intEnd = start.end;
|
|
577
|
-
type = IntervalType.SlideOnRemove;
|
|
591
|
+
type = intervals_1.IntervalType.SlideOnRemove;
|
|
578
592
|
properties = start.props;
|
|
579
593
|
}
|
|
580
594
|
if (!this.localCollection) {
|
|
581
|
-
throw new LoggingError("attach must be called prior to adding intervals");
|
|
595
|
+
throw new telemetry_utils_1.LoggingError("attach must be called prior to adding intervals");
|
|
582
596
|
}
|
|
583
|
-
if (type & IntervalType.Transient) {
|
|
584
|
-
throw new LoggingError("Can not add transient intervals");
|
|
597
|
+
if (type & intervals_1.IntervalType.Transient) {
|
|
598
|
+
throw new telemetry_utils_1.LoggingError("Can not add transient intervals");
|
|
585
599
|
}
|
|
586
600
|
const { startSide, endSide, startPos, endPos } = endpointPosAndSide(intStart, intEnd);
|
|
587
|
-
assert(startPos !== undefined &&
|
|
601
|
+
(0, core_utils_1.assert)(startPos !== undefined &&
|
|
588
602
|
endPos !== undefined &&
|
|
589
603
|
startSide !== undefined &&
|
|
590
604
|
endSide !== undefined, 0x793 /* start and end cannot be undefined because they were not passed in as undefined */);
|
|
@@ -592,7 +606,7 @@ export class IntervalCollection extends TypedEventEmitter {
|
|
|
592
606
|
this.assertStickinessEnabled(intStart, intEnd);
|
|
593
607
|
const interval = this.localCollection.addInterval(toSequencePlace(startPos, startSide), toSequencePlace(endPos, endSide), type, properties);
|
|
594
608
|
if (interval) {
|
|
595
|
-
if (!this.isCollaborating && interval instanceof SequenceInterval) {
|
|
609
|
+
if (!this.isCollaborating && interval instanceof intervals_1.SequenceInterval) {
|
|
596
610
|
setSlideOnRemove(interval.start);
|
|
597
611
|
setSlideOnRemove(interval.end);
|
|
598
612
|
}
|
|
@@ -616,7 +630,7 @@ export class IntervalCollection extends TypedEventEmitter {
|
|
|
616
630
|
}
|
|
617
631
|
deleteExistingInterval(interval, local, op) {
|
|
618
632
|
if (!this.localCollection) {
|
|
619
|
-
throw new LoggingError("Attach must be called before accessing intervals");
|
|
633
|
+
throw new telemetry_utils_1.LoggingError("Attach must be called before accessing intervals");
|
|
620
634
|
}
|
|
621
635
|
// The given interval is known to exist in the collection.
|
|
622
636
|
this.localCollection.removeExistingInterval(interval);
|
|
@@ -640,7 +654,7 @@ export class IntervalCollection extends TypedEventEmitter {
|
|
|
640
654
|
*/
|
|
641
655
|
removeIntervalById(id) {
|
|
642
656
|
if (!this.localCollection) {
|
|
643
|
-
throw new LoggingError("Attach must be called before accessing intervals");
|
|
657
|
+
throw new telemetry_utils_1.LoggingError("Attach must be called before accessing intervals");
|
|
644
658
|
}
|
|
645
659
|
const interval = this.localCollection.idIntervalIndex.getIntervalById(id);
|
|
646
660
|
if (interval) {
|
|
@@ -650,58 +664,54 @@ export class IntervalCollection extends TypedEventEmitter {
|
|
|
650
664
|
}
|
|
651
665
|
/**
|
|
652
666
|
* {@inheritdoc IIntervalCollection.changeProperties}
|
|
667
|
+
* @deprecated - call change with the id and an object containing the new props values
|
|
653
668
|
*/
|
|
654
669
|
changeProperties(id, props) {
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
// once it has been inserted into the collection.
|
|
666
|
-
if (props[reservedRangeLabelsKey] !== undefined) {
|
|
667
|
-
throw new LoggingError("The label property should not be modified once inserted to the collection");
|
|
670
|
+
this.change(id, { props });
|
|
671
|
+
}
|
|
672
|
+
change(arg1, arg2, arg3) {
|
|
673
|
+
const id = arg1;
|
|
674
|
+
let start;
|
|
675
|
+
let end;
|
|
676
|
+
let props;
|
|
677
|
+
if (isSequencePlace(arg2)) {
|
|
678
|
+
start = arg2;
|
|
679
|
+
end = arg3;
|
|
668
680
|
}
|
|
669
|
-
|
|
670
|
-
|
|
671
|
-
|
|
672
|
-
|
|
673
|
-
// Emit a change op that will only change properties. Add the ID to
|
|
674
|
-
// the property bag provided by the caller.
|
|
675
|
-
serializedInterval.start = undefined;
|
|
676
|
-
serializedInterval.end = undefined;
|
|
677
|
-
serializedInterval.properties = props;
|
|
678
|
-
serializedInterval.properties[reservedIntervalIdKey] = interval.getIntervalId();
|
|
679
|
-
const localSeq = this.getNextLocalSeq();
|
|
680
|
-
this.localSeqToSerializedInterval.set(localSeq, serializedInterval);
|
|
681
|
-
this.emitter.emit("change", undefined, serializedInterval, { localSeq });
|
|
682
|
-
this.emit("propertyChanged", interval, deltaProps, true, undefined);
|
|
681
|
+
else {
|
|
682
|
+
start = arg2.start;
|
|
683
|
+
end = arg2.end;
|
|
684
|
+
props = arg2.props;
|
|
683
685
|
}
|
|
684
|
-
}
|
|
685
|
-
/**
|
|
686
|
-
* {@inheritdoc IIntervalCollection.change}
|
|
687
|
-
*/
|
|
688
|
-
change(id, start, end) {
|
|
689
686
|
if (!this.localCollection) {
|
|
690
|
-
throw new LoggingError("Attach must be called before accessing intervals");
|
|
687
|
+
throw new telemetry_utils_1.LoggingError("Attach must be called before accessing intervals");
|
|
691
688
|
}
|
|
692
689
|
// Force id to be a string.
|
|
693
690
|
if (typeof id !== "string") {
|
|
694
|
-
throw new
|
|
691
|
+
throw new telemetry_utils_1.UsageError("Change API requires an ID that is a string");
|
|
692
|
+
}
|
|
693
|
+
// Ensure that both start and end are defined or both are undefined.
|
|
694
|
+
if ((start === undefined) !== (end === undefined)) {
|
|
695
|
+
throw new telemetry_utils_1.UsageError("Change API requires both start and end to be defined or undefined");
|
|
696
|
+
}
|
|
697
|
+
// prevent the overwriting of an interval label, it should remain unchanged
|
|
698
|
+
// once it has been inserted into the collection.
|
|
699
|
+
if (props?.[merge_tree_1.reservedRangeLabelsKey] !== undefined) {
|
|
700
|
+
throw new telemetry_utils_1.UsageError("The label property should not be modified once inserted to the collection");
|
|
695
701
|
}
|
|
696
702
|
const interval = this.getIntervalById(id);
|
|
697
703
|
if (interval) {
|
|
698
|
-
|
|
699
|
-
|
|
700
|
-
|
|
704
|
+
let deltaProps;
|
|
705
|
+
let newInterval;
|
|
706
|
+
if (props !== undefined) {
|
|
707
|
+
deltaProps = interval.addProperties(props, true, this.isCollaborating ? merge_tree_1.UnassignedSequenceNumber : merge_tree_1.UniversalSequenceNumber);
|
|
701
708
|
}
|
|
702
|
-
if (
|
|
703
|
-
|
|
704
|
-
|
|
709
|
+
if (start !== undefined && end !== undefined) {
|
|
710
|
+
newInterval = this.localCollection.changeInterval(interval, start, end);
|
|
711
|
+
if (!this.isCollaborating && newInterval instanceof intervals_1.SequenceInterval) {
|
|
712
|
+
setSlideOnRemove(newInterval.start);
|
|
713
|
+
setSlideOnRemove(newInterval.end);
|
|
714
|
+
}
|
|
705
715
|
}
|
|
706
716
|
const serializedInterval = interval.serialize();
|
|
707
717
|
const { startPos, startSide, endPos, endSide } = endpointPosAndSide(start, end);
|
|
@@ -711,15 +721,21 @@ export class IntervalCollection extends TypedEventEmitter {
|
|
|
711
721
|
serializedInterval.startSide = startSide;
|
|
712
722
|
serializedInterval.endSide = endSide;
|
|
713
723
|
serializedInterval.stickiness = stickiness;
|
|
714
|
-
// Emit a property bag containing
|
|
724
|
+
// Emit a property bag containing the ID and the other (if any) properties changed
|
|
715
725
|
serializedInterval.properties = {
|
|
716
726
|
[reservedIntervalIdKey]: interval.getIntervalId(),
|
|
727
|
+
...props,
|
|
717
728
|
};
|
|
718
729
|
const localSeq = this.getNextLocalSeq();
|
|
719
730
|
this.localSeqToSerializedInterval.set(localSeq, serializedInterval);
|
|
720
731
|
this.emitter.emit("change", undefined, serializedInterval, { localSeq });
|
|
721
|
-
|
|
722
|
-
|
|
732
|
+
if (deltaProps !== undefined) {
|
|
733
|
+
this.emit("propertyChanged", interval, deltaProps, true, undefined);
|
|
734
|
+
}
|
|
735
|
+
if (newInterval) {
|
|
736
|
+
this.addPendingChange(id, serializedInterval);
|
|
737
|
+
this.emitChange(newInterval, interval, true, false);
|
|
738
|
+
}
|
|
723
739
|
return newInterval;
|
|
724
740
|
}
|
|
725
741
|
// No interval to change
|
|
@@ -766,7 +782,7 @@ export class IntervalCollection extends TypedEventEmitter {
|
|
|
766
782
|
}
|
|
767
783
|
if (pendingChange?.start !== serializedInterval.start ||
|
|
768
784
|
pendingChange?.end !== serializedInterval.end) {
|
|
769
|
-
throw new LoggingError("Mismatch in pending changes");
|
|
785
|
+
throw new telemetry_utils_1.LoggingError("Mismatch in pending changes");
|
|
770
786
|
}
|
|
771
787
|
}
|
|
772
788
|
}
|
|
@@ -781,10 +797,10 @@ export class IntervalCollection extends TypedEventEmitter {
|
|
|
781
797
|
/** @internal */
|
|
782
798
|
ackChange(serializedInterval, local, op, localOpMetadata) {
|
|
783
799
|
if (!this.localCollection) {
|
|
784
|
-
throw new LoggingError("Attach must be called before accessing intervals");
|
|
800
|
+
throw new telemetry_utils_1.LoggingError("Attach must be called before accessing intervals");
|
|
785
801
|
}
|
|
786
802
|
if (local) {
|
|
787
|
-
assert(localOpMetadata !== undefined, 0x552 /* op metadata should be defined for local op */);
|
|
803
|
+
(0, core_utils_1.assert)(localOpMetadata !== undefined, 0x552 /* op metadata should be defined for local op */);
|
|
788
804
|
this.localSeqToSerializedInterval.delete(localOpMetadata?.localSeq);
|
|
789
805
|
// This is an ack from the server. Remove the pending change.
|
|
790
806
|
this.removePendingChange(serializedInterval);
|
|
@@ -793,7 +809,7 @@ export class IntervalCollection extends TypedEventEmitter {
|
|
|
793
809
|
// This API cannot change the ID, and writing to the ID property will result in an exception. So we
|
|
794
810
|
// strip it out of the properties here.
|
|
795
811
|
const { [reservedIntervalIdKey]: id, ...newProps } = serializedInterval.properties ?? {};
|
|
796
|
-
assert(id !== undefined, 0x3fe /* id must exist on the interval */);
|
|
812
|
+
(0, core_utils_1.assert)(id !== undefined, 0x3fe /* id must exist on the interval */);
|
|
797
813
|
const interval = this.getIntervalById(id);
|
|
798
814
|
if (!interval) {
|
|
799
815
|
// The interval has been removed locally; no-op.
|
|
@@ -802,7 +818,7 @@ export class IntervalCollection extends TypedEventEmitter {
|
|
|
802
818
|
if (local) {
|
|
803
819
|
// Let the propertyManager prune its pending change-properties set.
|
|
804
820
|
interval.propertyManager?.ackPendingProperties({
|
|
805
|
-
type: MergeTreeDeltaType.ANNOTATE,
|
|
821
|
+
type: merge_tree_1.MergeTreeDeltaType.ANNOTATE,
|
|
806
822
|
props: serializedInterval.properties ?? {},
|
|
807
823
|
});
|
|
808
824
|
this.ackInterval(interval, op);
|
|
@@ -867,7 +883,7 @@ export class IntervalCollection extends TypedEventEmitter {
|
|
|
867
883
|
return serializedInterval;
|
|
868
884
|
}
|
|
869
885
|
if (!this.attached) {
|
|
870
|
-
throw new LoggingError("attachSequence must be called");
|
|
886
|
+
throw new telemetry_utils_1.LoggingError("attachSequence must be called");
|
|
871
887
|
}
|
|
872
888
|
const { intervalType, properties, stickiness, startSide, endSide } = serializedInterval;
|
|
873
889
|
const { start: startRebased, end: endRebased } = this.localSeqToRebasedInterval.get(localSeq) ?? this.computeRebasedPositions(localSeq);
|
|
@@ -890,8 +906,8 @@ export class IntervalCollection extends TypedEventEmitter {
|
|
|
890
906
|
this.addPendingChange(intervalId, rebased);
|
|
891
907
|
}
|
|
892
908
|
// if the interval slid off the string, rebase the op to be a noop and delete the interval.
|
|
893
|
-
if (startRebased === DetachedReferencePosition ||
|
|
894
|
-
endRebased === DetachedReferencePosition) {
|
|
909
|
+
if (startRebased === merge_tree_1.DetachedReferencePosition ||
|
|
910
|
+
endRebased === merge_tree_1.DetachedReferencePosition) {
|
|
895
911
|
if (localInterval) {
|
|
896
912
|
this.localCollection?.removeExistingInterval(localInterval);
|
|
897
913
|
}
|
|
@@ -899,7 +915,7 @@ export class IntervalCollection extends TypedEventEmitter {
|
|
|
899
915
|
}
|
|
900
916
|
if (localInterval !== undefined) {
|
|
901
917
|
// we know we must be using `SequenceInterval` because `this.client` exists
|
|
902
|
-
assert(localInterval instanceof SequenceInterval, 0x3a0 /* localInterval must be `SequenceInterval` when used with client */);
|
|
918
|
+
(0, core_utils_1.assert)(localInterval instanceof intervals_1.SequenceInterval, 0x3a0 /* localInterval must be `SequenceInterval` when used with client */);
|
|
903
919
|
// The rebased op may place this interval's endpoints on different segments. Calling `changeInterval` here
|
|
904
920
|
// updates the local client's state to be consistent with the emitted op.
|
|
905
921
|
this.localCollection?.changeInterval(localInterval, toOptionalSequencePlace(startRebased, startSide), toOptionalSequencePlace(endRebased, endSide), undefined, localSeq);
|
|
@@ -908,13 +924,13 @@ export class IntervalCollection extends TypedEventEmitter {
|
|
|
908
924
|
}
|
|
909
925
|
getSlideToSegment(lref) {
|
|
910
926
|
if (!this.client) {
|
|
911
|
-
throw new LoggingError("client does not exist");
|
|
927
|
+
throw new telemetry_utils_1.LoggingError("client does not exist");
|
|
912
928
|
}
|
|
913
929
|
const segoff = { segment: lref.getSegment(), offset: lref.getOffset() };
|
|
914
930
|
if (segoff.segment?.localRefs?.has(lref) !== true) {
|
|
915
931
|
return undefined;
|
|
916
932
|
}
|
|
917
|
-
const newSegoff = getSlideToSegoff(segoff, undefined, this.options.mergeTreeReferencesCanSlideToEndpoint);
|
|
933
|
+
const newSegoff = (0, merge_tree_1.getSlideToSegoff)(segoff, undefined, this.options.mergeTreeReferencesCanSlideToEndpoint);
|
|
918
934
|
const value = segoff.segment === newSegoff.segment && segoff.offset === newSegoff.offset
|
|
919
935
|
? undefined
|
|
920
936
|
: newSegoff;
|
|
@@ -922,11 +938,11 @@ export class IntervalCollection extends TypedEventEmitter {
|
|
|
922
938
|
}
|
|
923
939
|
ackInterval(interval, op) {
|
|
924
940
|
// Only SequenceIntervals need potential sliding
|
|
925
|
-
if (!(interval instanceof SequenceInterval)) {
|
|
941
|
+
if (!(interval instanceof intervals_1.SequenceInterval)) {
|
|
926
942
|
return;
|
|
927
943
|
}
|
|
928
|
-
if (!refTypeIncludesFlag(interval.start, ReferenceType.StayOnRemove) &&
|
|
929
|
-
!refTypeIncludesFlag(interval.end, ReferenceType.StayOnRemove)) {
|
|
944
|
+
if (!(0, merge_tree_1.refTypeIncludesFlag)(interval.start, merge_tree_1.ReferenceType.StayOnRemove) &&
|
|
945
|
+
!(0, merge_tree_1.refTypeIncludesFlag)(interval.end, merge_tree_1.ReferenceType.StayOnRemove)) {
|
|
930
946
|
return;
|
|
931
947
|
}
|
|
932
948
|
const newStart = this.getSlideToSegment(interval.start);
|
|
@@ -944,7 +960,7 @@ export class IntervalCollection extends TypedEventEmitter {
|
|
|
944
960
|
const needsEndUpdate = newEnd !== undefined && !hasPendingEndChange;
|
|
945
961
|
if (needsStartUpdate || needsEndUpdate) {
|
|
946
962
|
if (!this.localCollection) {
|
|
947
|
-
throw new LoggingError("Attach must be called before accessing intervals");
|
|
963
|
+
throw new telemetry_utils_1.LoggingError("Attach must be called before accessing intervals");
|
|
948
964
|
}
|
|
949
965
|
// `interval`'s endpoints will get modified in-place, so clone it prior to doing so for event emission.
|
|
950
966
|
const oldInterval = interval.clone();
|
|
@@ -953,32 +969,32 @@ export class IntervalCollection extends TypedEventEmitter {
|
|
|
953
969
|
// This ensures that the correct listeners are added to the LocalReferencePosition.
|
|
954
970
|
this.localCollection.removeExistingInterval(interval);
|
|
955
971
|
if (!this.client) {
|
|
956
|
-
throw new LoggingError("client does not exist");
|
|
972
|
+
throw new telemetry_utils_1.LoggingError("client does not exist");
|
|
957
973
|
}
|
|
958
974
|
if (needsStartUpdate) {
|
|
959
975
|
const props = interval.start.properties;
|
|
960
|
-
interval.start = createPositionReferenceFromSegoff(this.client, newStart, interval.start.refType, op, undefined, undefined, startReferenceSlidingPreference(interval.stickiness), startReferenceSlidingPreference(interval.stickiness) ===
|
|
961
|
-
SlidingPreference.BACKWARD);
|
|
976
|
+
interval.start = (0, intervals_1.createPositionReferenceFromSegoff)(this.client, newStart, interval.start.refType, op, undefined, undefined, (0, intervals_1.startReferenceSlidingPreference)(interval.stickiness), (0, intervals_1.startReferenceSlidingPreference)(interval.stickiness) ===
|
|
977
|
+
merge_tree_1.SlidingPreference.BACKWARD);
|
|
962
978
|
if (props) {
|
|
963
979
|
interval.start.addProperties(props);
|
|
964
980
|
}
|
|
965
981
|
const oldSeg = oldInterval.start.getSegment();
|
|
966
982
|
// remove and rebuild start interval as transient for event
|
|
967
983
|
this.client.removeLocalReferencePosition(oldInterval.start);
|
|
968
|
-
oldInterval.start.refType = ReferenceType.Transient;
|
|
984
|
+
oldInterval.start.refType = merge_tree_1.ReferenceType.Transient;
|
|
969
985
|
oldSeg?.localRefs?.addLocalRef(oldInterval.start, oldInterval.start.getOffset());
|
|
970
986
|
}
|
|
971
987
|
if (needsEndUpdate) {
|
|
972
988
|
const props = interval.end.properties;
|
|
973
|
-
interval.end = createPositionReferenceFromSegoff(this.client, newEnd, interval.end.refType, op, undefined, undefined, endReferenceSlidingPreference(interval.stickiness), endReferenceSlidingPreference(interval.stickiness) ===
|
|
974
|
-
SlidingPreference.FORWARD);
|
|
989
|
+
interval.end = (0, intervals_1.createPositionReferenceFromSegoff)(this.client, newEnd, interval.end.refType, op, undefined, undefined, (0, intervals_1.endReferenceSlidingPreference)(interval.stickiness), (0, intervals_1.endReferenceSlidingPreference)(interval.stickiness) ===
|
|
990
|
+
merge_tree_1.SlidingPreference.FORWARD);
|
|
975
991
|
if (props) {
|
|
976
992
|
interval.end.addProperties(props);
|
|
977
993
|
}
|
|
978
994
|
// remove and rebuild end interval as transient for event
|
|
979
995
|
const oldSeg = oldInterval.end.getSegment();
|
|
980
996
|
this.client.removeLocalReferencePosition(oldInterval.end);
|
|
981
|
-
oldInterval.end.refType = ReferenceType.Transient;
|
|
997
|
+
oldInterval.end.refType = merge_tree_1.ReferenceType.Transient;
|
|
982
998
|
oldSeg?.localRefs?.addLocalRef(oldInterval.end, oldInterval.end.getOffset());
|
|
983
999
|
}
|
|
984
1000
|
this.localCollection.add(interval);
|
|
@@ -988,7 +1004,7 @@ export class IntervalCollection extends TypedEventEmitter {
|
|
|
988
1004
|
/** @internal */
|
|
989
1005
|
ackAdd(serializedInterval, local, op, localOpMetadata) {
|
|
990
1006
|
if (local) {
|
|
991
|
-
assert(localOpMetadata !== undefined, 0x553 /* op metadata should be defined for local op */);
|
|
1007
|
+
(0, core_utils_1.assert)(localOpMetadata !== undefined, 0x553 /* op metadata should be defined for local op */);
|
|
992
1008
|
this.localSeqToSerializedInterval.delete(localOpMetadata.localSeq);
|
|
993
1009
|
const id = serializedInterval.properties?.[reservedIntervalIdKey];
|
|
994
1010
|
const localInterval = this.getIntervalById(id);
|
|
@@ -998,7 +1014,7 @@ export class IntervalCollection extends TypedEventEmitter {
|
|
|
998
1014
|
return;
|
|
999
1015
|
}
|
|
1000
1016
|
if (!this.localCollection) {
|
|
1001
|
-
throw new LoggingError("attachSequence must be called");
|
|
1017
|
+
throw new telemetry_utils_1.LoggingError("attachSequence must be called");
|
|
1002
1018
|
}
|
|
1003
1019
|
this.localCollection.ensureSerializedId(serializedInterval);
|
|
1004
1020
|
const interval = this.localCollection.addInterval(toSequencePlace(serializedInterval.start, serializedInterval.startSide ?? Side.Before), toSequencePlace(serializedInterval.end, serializedInterval.endSide ?? Side.Before), serializedInterval.intervalType, serializedInterval.properties, op);
|
|
@@ -1014,12 +1030,12 @@ export class IntervalCollection extends TypedEventEmitter {
|
|
|
1014
1030
|
ackDelete(serializedInterval, local, op) {
|
|
1015
1031
|
if (local) {
|
|
1016
1032
|
// Local ops were applied when the message was created and there's no "pending delete"
|
|
1017
|
-
// state to
|
|
1033
|
+
// state to book keep: remote operation application takes into account possibility of
|
|
1018
1034
|
// locally deleted interval whenever a lookup happens.
|
|
1019
1035
|
return;
|
|
1020
1036
|
}
|
|
1021
1037
|
if (!this.localCollection) {
|
|
1022
|
-
throw new LoggingError("attach must be called prior to deleting intervals");
|
|
1038
|
+
throw new telemetry_utils_1.LoggingError("attach must be called prior to deleting intervals");
|
|
1023
1039
|
}
|
|
1024
1040
|
const id = this.localCollection.ensureSerializedId(serializedInterval);
|
|
1025
1041
|
const interval = this.localCollection.idIntervalIndex.getIntervalById(id);
|
|
@@ -1032,7 +1048,7 @@ export class IntervalCollection extends TypedEventEmitter {
|
|
|
1032
1048
|
*/
|
|
1033
1049
|
serializeInternal() {
|
|
1034
1050
|
if (!this.localCollection) {
|
|
1035
|
-
throw new LoggingError("attachSequence must be called");
|
|
1051
|
+
throw new telemetry_utils_1.LoggingError("attachSequence must be called");
|
|
1036
1052
|
}
|
|
1037
1053
|
return this.localCollection.serialize();
|
|
1038
1054
|
}
|
|
@@ -1085,7 +1101,7 @@ export class IntervalCollection extends TypedEventEmitter {
|
|
|
1085
1101
|
*/
|
|
1086
1102
|
findOverlappingIntervals(startPosition, endPosition) {
|
|
1087
1103
|
if (!this.localCollection) {
|
|
1088
|
-
throw new LoggingError("attachSequence must be called");
|
|
1104
|
+
throw new telemetry_utils_1.LoggingError("attachSequence must be called");
|
|
1089
1105
|
}
|
|
1090
1106
|
return this.localCollection.overlappingIntervalsIndex.findOverlappingIntervals(startPosition, endPosition);
|
|
1091
1107
|
}
|
|
@@ -1094,7 +1110,7 @@ export class IntervalCollection extends TypedEventEmitter {
|
|
|
1094
1110
|
*/
|
|
1095
1111
|
map(fn) {
|
|
1096
1112
|
if (!this.localCollection) {
|
|
1097
|
-
throw new LoggingError("attachSequence must be called");
|
|
1113
|
+
throw new telemetry_utils_1.LoggingError("attachSequence must be called");
|
|
1098
1114
|
}
|
|
1099
1115
|
for (const interval of this.localCollection.idIntervalIndex) {
|
|
1100
1116
|
fn(interval);
|
|
@@ -1105,7 +1121,7 @@ export class IntervalCollection extends TypedEventEmitter {
|
|
|
1105
1121
|
*/
|
|
1106
1122
|
previousInterval(pos) {
|
|
1107
1123
|
if (!this.localCollection) {
|
|
1108
|
-
throw new LoggingError("attachSequence must be called");
|
|
1124
|
+
throw new telemetry_utils_1.LoggingError("attachSequence must be called");
|
|
1109
1125
|
}
|
|
1110
1126
|
return this.localCollection.endIntervalIndex.previousInterval(pos);
|
|
1111
1127
|
}
|
|
@@ -1114,15 +1130,16 @@ export class IntervalCollection extends TypedEventEmitter {
|
|
|
1114
1130
|
*/
|
|
1115
1131
|
nextInterval(pos) {
|
|
1116
1132
|
if (!this.localCollection) {
|
|
1117
|
-
throw new LoggingError("attachSequence must be called");
|
|
1133
|
+
throw new telemetry_utils_1.LoggingError("attachSequence must be called");
|
|
1118
1134
|
}
|
|
1119
1135
|
return this.localCollection.endIntervalIndex.nextInterval(pos);
|
|
1120
1136
|
}
|
|
1121
1137
|
}
|
|
1138
|
+
exports.IntervalCollection = IntervalCollection;
|
|
1122
1139
|
function setSlideOnRemove(lref) {
|
|
1123
1140
|
let refType = lref.refType;
|
|
1124
|
-
refType = refType & ~ReferenceType.StayOnRemove;
|
|
1125
|
-
refType = refType | ReferenceType.SlideOnRemove;
|
|
1141
|
+
refType = refType & ~merge_tree_1.ReferenceType.StayOnRemove;
|
|
1142
|
+
refType = refType | merge_tree_1.ReferenceType.SlideOnRemove;
|
|
1126
1143
|
lref.refType = refType;
|
|
1127
1144
|
}
|
|
1128
1145
|
/**
|
|
@@ -1130,12 +1147,13 @@ function setSlideOnRemove(lref) {
|
|
|
1130
1147
|
* @returns undefined if the reference position is not the endpoint of any interval (e.g. it was created
|
|
1131
1148
|
* on the merge tree directly by app code), otherwise an {@link IntervalLocator} for the interval this
|
|
1132
1149
|
* endpoint is a part of.
|
|
1133
|
-
* @
|
|
1150
|
+
* @internal
|
|
1134
1151
|
*/
|
|
1135
|
-
|
|
1136
|
-
const { interval, [reservedRangeLabelsKey]: collectionNameArray } = potentialEndpoint.properties ?? {};
|
|
1152
|
+
function intervalLocatorFromEndpoint(potentialEndpoint) {
|
|
1153
|
+
const { interval, [merge_tree_1.reservedRangeLabelsKey]: collectionNameArray } = potentialEndpoint.properties ?? {};
|
|
1137
1154
|
return interval && collectionNameArray?.length === 1
|
|
1138
1155
|
? { label: collectionNameArray[0], interval }
|
|
1139
1156
|
: undefined;
|
|
1140
1157
|
}
|
|
1158
|
+
exports.intervalLocatorFromEndpoint = intervalLocatorFromEndpoint;
|
|
1141
1159
|
//# sourceMappingURL=intervalCollection.js.map
|