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