@fluidframework/sequence 2.0.0-dev.5.2.0.169897 → 2.0.0-dev.6.4.0.191258
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 +142 -0
- package/README.md +4 -3
- package/dist/defaultMap.d.ts +1 -1
- package/dist/defaultMap.d.ts.map +1 -1
- package/dist/defaultMap.js +9 -10
- package/dist/defaultMap.js.map +1 -1
- package/dist/defaultMapInterfaces.d.ts +1 -1
- package/dist/defaultMapInterfaces.d.ts.map +1 -1
- package/dist/defaultMapInterfaces.js.map +1 -1
- package/dist/index.d.ts +3 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +15 -9
- package/dist/index.js.map +1 -1
- package/dist/intervalCollection.d.ts +14 -437
- package/dist/intervalCollection.d.ts.map +1 -1
- package/dist/intervalCollection.js +96 -916
- package/dist/intervalCollection.js.map +1 -1
- package/dist/intervalIndex/endpointInRangeIndex.d.ts +20 -0
- package/dist/intervalIndex/endpointInRangeIndex.d.ts.map +1 -0
- package/dist/intervalIndex/endpointInRangeIndex.js +60 -0
- package/dist/intervalIndex/endpointInRangeIndex.js.map +1 -0
- package/dist/intervalIndex/endpointIndex.d.ts +21 -0
- package/dist/intervalIndex/endpointIndex.d.ts.map +1 -0
- package/dist/intervalIndex/endpointIndex.js +42 -0
- package/dist/intervalIndex/endpointIndex.js.map +1 -0
- package/dist/intervalIndex/idIntervalIndex.d.ts +12 -0
- package/dist/intervalIndex/idIntervalIndex.d.ts.map +1 -0
- package/dist/intervalIndex/idIntervalIndex.js +41 -0
- package/dist/intervalIndex/idIntervalIndex.js.map +1 -0
- package/dist/intervalIndex/index.d.ts +13 -0
- package/dist/intervalIndex/index.d.ts.map +1 -0
- package/dist/intervalIndex/index.js +20 -0
- package/dist/intervalIndex/index.js.map +1 -0
- package/dist/intervalIndex/intervalIndex.d.ts +29 -0
- package/dist/intervalIndex/intervalIndex.d.ts.map +1 -0
- package/dist/intervalIndex/intervalIndex.js +7 -0
- package/dist/intervalIndex/intervalIndex.js.map +1 -0
- package/dist/intervalIndex/intervalIndexUtils.d.ts +17 -0
- package/dist/intervalIndex/intervalIndexUtils.d.ts.map +1 -0
- package/dist/intervalIndex/intervalIndexUtils.js +22 -0
- package/dist/intervalIndex/intervalIndexUtils.js.map +1 -0
- package/dist/intervalIndex/overlappingIntervalsIndex.d.ts +33 -0
- package/dist/intervalIndex/overlappingIntervalsIndex.d.ts.map +1 -0
- package/dist/intervalIndex/overlappingIntervalsIndex.js +103 -0
- package/dist/intervalIndex/overlappingIntervalsIndex.js.map +1 -0
- package/dist/intervalIndex/overlappingSequenceIntervalsIndex.d.ts +8 -0
- package/dist/intervalIndex/overlappingSequenceIntervalsIndex.d.ts.map +1 -0
- package/dist/intervalIndex/overlappingSequenceIntervalsIndex.js +33 -0
- package/dist/intervalIndex/overlappingSequenceIntervalsIndex.js.map +1 -0
- package/dist/intervalIndex/sequenceIntervalIndexes.d.ts +33 -0
- package/dist/intervalIndex/sequenceIntervalIndexes.d.ts.map +1 -0
- package/dist/intervalIndex/sequenceIntervalIndexes.js +7 -0
- package/dist/intervalIndex/sequenceIntervalIndexes.js.map +1 -0
- package/dist/intervalIndex/startpointInRangeIndex.d.ts +20 -0
- package/dist/intervalIndex/startpointInRangeIndex.d.ts.map +1 -0
- package/dist/intervalIndex/startpointInRangeIndex.js +62 -0
- package/dist/intervalIndex/startpointInRangeIndex.js.map +1 -0
- package/dist/intervalTree.d.ts +2 -56
- package/dist/intervalTree.d.ts.map +1 -1
- package/dist/intervalTree.js +2 -11
- package/dist/intervalTree.js.map +1 -1
- package/dist/intervals/index.d.ts +8 -0
- package/dist/intervals/index.d.ts.map +1 -0
- package/dist/intervals/index.js +23 -0
- package/dist/intervals/index.js.map +1 -0
- package/dist/intervals/interval.d.ts +88 -0
- package/dist/intervals/interval.d.ts.map +1 -0
- package/dist/intervals/interval.js +180 -0
- package/dist/intervals/interval.js.map +1 -0
- package/dist/intervals/intervalUtils.d.ts +200 -0
- package/dist/intervals/intervalUtils.d.ts.map +1 -0
- package/dist/intervals/intervalUtils.js +79 -0
- package/dist/intervals/intervalUtils.js.map +1 -0
- package/dist/intervals/sequenceInterval.d.ts +132 -0
- package/dist/intervals/sequenceInterval.d.ts.map +1 -0
- package/dist/intervals/sequenceInterval.js +313 -0
- package/dist/intervals/sequenceInterval.js.map +1 -0
- 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 +1 -1
- package/dist/revertibles.d.ts.map +1 -1
- package/dist/revertibles.js +85 -52
- package/dist/revertibles.js.map +1 -1
- package/dist/sequence.d.ts +33 -4
- package/dist/sequence.d.ts.map +1 -1
- package/dist/sequence.js +91 -47
- package/dist/sequence.js.map +1 -1
- package/dist/sequenceDeltaEvent.d.ts +8 -3
- package/dist/sequenceDeltaEvent.d.ts.map +1 -1
- package/dist/sequenceDeltaEvent.js +3 -4
- package/dist/sequenceDeltaEvent.js.map +1 -1
- package/dist/sharedIntervalCollection.d.ts +2 -1
- package/dist/sharedIntervalCollection.d.ts.map +1 -1
- package/dist/sharedIntervalCollection.js +2 -2
- package/dist/sharedIntervalCollection.js.map +1 -1
- package/dist/sharedSequence.d.ts +9 -0
- package/dist/sharedSequence.d.ts.map +1 -1
- package/dist/sharedSequence.js +9 -6
- package/dist/sharedSequence.js.map +1 -1
- package/dist/sharedString.d.ts.map +1 -1
- package/dist/sharedString.js +9 -29
- package/dist/sharedString.js.map +1 -1
- package/lib/defaultMap.d.ts +1 -1
- package/lib/defaultMap.d.ts.map +1 -1
- package/lib/defaultMap.js +5 -6
- package/lib/defaultMap.js.map +1 -1
- package/lib/defaultMapInterfaces.d.ts +1 -1
- package/lib/defaultMapInterfaces.d.ts.map +1 -1
- package/lib/defaultMapInterfaces.js.map +1 -1
- package/lib/index.d.ts +3 -2
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +3 -1
- package/lib/index.js.map +1 -1
- package/lib/intervalCollection.d.ts +14 -437
- package/lib/intervalCollection.d.ts.map +1 -1
- package/lib/intervalCollection.js +64 -877
- package/lib/intervalCollection.js.map +1 -1
- package/lib/intervalIndex/endpointInRangeIndex.d.ts +20 -0
- package/lib/intervalIndex/endpointInRangeIndex.d.ts.map +1 -0
- package/lib/intervalIndex/endpointInRangeIndex.js +56 -0
- package/lib/intervalIndex/endpointInRangeIndex.js.map +1 -0
- package/lib/intervalIndex/endpointIndex.d.ts +21 -0
- package/lib/intervalIndex/endpointIndex.d.ts.map +1 -0
- package/lib/intervalIndex/endpointIndex.js +38 -0
- package/lib/intervalIndex/endpointIndex.js.map +1 -0
- package/lib/intervalIndex/idIntervalIndex.d.ts +12 -0
- package/lib/intervalIndex/idIntervalIndex.d.ts.map +1 -0
- package/lib/intervalIndex/idIntervalIndex.js +37 -0
- package/lib/intervalIndex/idIntervalIndex.js.map +1 -0
- package/lib/intervalIndex/index.d.ts +13 -0
- package/lib/intervalIndex/index.d.ts.map +1 -0
- package/lib/intervalIndex/index.js +11 -0
- package/lib/intervalIndex/index.js.map +1 -0
- package/lib/intervalIndex/intervalIndex.d.ts +29 -0
- package/lib/intervalIndex/intervalIndex.d.ts.map +1 -0
- package/lib/intervalIndex/intervalIndex.js +6 -0
- package/lib/intervalIndex/intervalIndex.js.map +1 -0
- package/lib/intervalIndex/intervalIndexUtils.d.ts +17 -0
- package/lib/intervalIndex/intervalIndexUtils.d.ts.map +1 -0
- package/lib/intervalIndex/intervalIndexUtils.js +18 -0
- package/lib/intervalIndex/intervalIndexUtils.js.map +1 -0
- package/lib/intervalIndex/overlappingIntervalsIndex.d.ts +33 -0
- package/lib/intervalIndex/overlappingIntervalsIndex.d.ts.map +1 -0
- package/lib/intervalIndex/overlappingIntervalsIndex.js +98 -0
- package/lib/intervalIndex/overlappingIntervalsIndex.js.map +1 -0
- package/lib/intervalIndex/overlappingSequenceIntervalsIndex.d.ts +8 -0
- package/lib/intervalIndex/overlappingSequenceIntervalsIndex.d.ts.map +1 -0
- package/lib/intervalIndex/overlappingSequenceIntervalsIndex.js +29 -0
- package/lib/intervalIndex/overlappingSequenceIntervalsIndex.js.map +1 -0
- package/lib/intervalIndex/sequenceIntervalIndexes.d.ts +33 -0
- package/lib/intervalIndex/sequenceIntervalIndexes.d.ts.map +1 -0
- package/lib/intervalIndex/sequenceIntervalIndexes.js +6 -0
- package/lib/intervalIndex/sequenceIntervalIndexes.js.map +1 -0
- package/lib/intervalIndex/startpointInRangeIndex.d.ts +20 -0
- package/lib/intervalIndex/startpointInRangeIndex.d.ts.map +1 -0
- package/lib/intervalIndex/startpointInRangeIndex.js +58 -0
- package/lib/intervalIndex/startpointInRangeIndex.js.map +1 -0
- package/lib/intervalTree.d.ts +2 -56
- package/lib/intervalTree.d.ts.map +1 -1
- package/lib/intervalTree.js +2 -11
- package/lib/intervalTree.js.map +1 -1
- package/lib/intervals/index.d.ts +8 -0
- package/lib/intervals/index.d.ts.map +1 -0
- package/lib/intervals/index.js +8 -0
- package/lib/intervals/index.js.map +1 -0
- package/lib/intervals/interval.d.ts +88 -0
- package/lib/intervals/interval.d.ts.map +1 -0
- package/lib/intervals/interval.js +175 -0
- package/lib/intervals/interval.js.map +1 -0
- package/lib/intervals/intervalUtils.d.ts +200 -0
- package/lib/intervals/intervalUtils.d.ts.map +1 -0
- package/lib/intervals/intervalUtils.js +74 -0
- package/lib/intervals/intervalUtils.js.map +1 -0
- package/lib/intervals/sequenceInterval.d.ts +132 -0
- package/lib/intervals/sequenceInterval.d.ts.map +1 -0
- package/lib/intervals/sequenceInterval.js +305 -0
- package/lib/intervals/sequenceInterval.js.map +1 -0
- package/lib/packageVersion.d.ts +1 -1
- package/lib/packageVersion.js +1 -1
- package/lib/packageVersion.js.map +1 -1
- package/lib/revertibles.d.ts +1 -1
- package/lib/revertibles.d.ts.map +1 -1
- package/lib/revertibles.js +69 -36
- package/lib/revertibles.js.map +1 -1
- package/lib/sequence.d.ts +33 -4
- package/lib/sequence.d.ts.map +1 -1
- package/lib/sequence.js +86 -41
- package/lib/sequence.js.map +1 -1
- package/lib/sequenceDeltaEvent.d.ts +8 -3
- package/lib/sequenceDeltaEvent.d.ts.map +1 -1
- package/lib/sequenceDeltaEvent.js +2 -3
- package/lib/sequenceDeltaEvent.js.map +1 -1
- package/lib/sharedIntervalCollection.d.ts +2 -1
- package/lib/sharedIntervalCollection.d.ts.map +1 -1
- package/lib/sharedIntervalCollection.js +1 -1
- package/lib/sharedIntervalCollection.js.map +1 -1
- package/lib/sharedSequence.d.ts +9 -0
- package/lib/sharedSequence.d.ts.map +1 -1
- package/lib/sharedSequence.js +8 -5
- package/lib/sharedSequence.js.map +1 -1
- package/lib/sharedString.d.ts.map +1 -1
- package/lib/sharedString.js +9 -29
- package/lib/sharedString.js.map +1 -1
- package/package.json +31 -34
- package/src/defaultMap.ts +2 -1
- package/src/defaultMapInterfaces.ts +1 -1
- package/src/index.ts +21 -9
- package/src/intervalCollection.ts +118 -1403
- package/src/intervalIndex/endpointInRangeIndex.ts +104 -0
- package/src/intervalIndex/endpointIndex.ts +78 -0
- package/src/intervalIndex/idIntervalIndex.ts +58 -0
- package/src/intervalIndex/index.ts +16 -0
- package/src/intervalIndex/intervalIndex.ts +31 -0
- package/src/intervalIndex/intervalIndexUtils.ts +27 -0
- package/src/intervalIndex/overlappingIntervalsIndex.ts +162 -0
- package/src/intervalIndex/overlappingSequenceIntervalsIndex.ts +71 -0
- package/src/intervalIndex/sequenceIntervalIndexes.ts +32 -0
- package/src/intervalIndex/startpointInRangeIndex.ts +109 -0
- package/src/intervalTree.ts +3 -75
- package/src/intervals/index.ts +25 -0
- package/src/intervals/interval.ts +230 -0
- package/src/intervals/intervalUtils.ts +256 -0
- package/src/intervals/sequenceInterval.ts +494 -0
- package/src/packageVersion.ts +1 -1
- package/src/revertibles.ts +81 -16
- package/src/sequence.ts +100 -35
- package/src/sequenceDeltaEvent.ts +12 -4
- package/src/sharedIntervalCollection.ts +2 -3
- package/src/sharedSequence.ts +11 -5
- package/src/sharedString.ts +8 -25
package/dist/revertibles.js
CHANGED
|
@@ -4,30 +4,18 @@
|
|
|
4
4
|
* Licensed under the MIT License.
|
|
5
5
|
*/
|
|
6
6
|
/* eslint-disable no-bitwise */
|
|
7
|
-
var __rest = (this && this.__rest) || function (s, e) {
|
|
8
|
-
var t = {};
|
|
9
|
-
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
|
|
10
|
-
t[p] = s[p];
|
|
11
|
-
if (s != null && typeof Object.getOwnPropertySymbols === "function")
|
|
12
|
-
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
|
|
13
|
-
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
|
|
14
|
-
t[p[i]] = s[p[i]];
|
|
15
|
-
}
|
|
16
|
-
return t;
|
|
17
|
-
};
|
|
18
7
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
19
8
|
exports.revertSharedStringRevertibles = exports.discardSharedStringRevertibles = exports.appendSharedStringDeltaToRevertibles = exports.appendIntervalPropertyChangedToRevertibles = exports.appendChangeIntervalToRevertibles = exports.appendDeleteIntervalToRevertibles = exports.appendAddIntervalToRevertibles = void 0;
|
|
20
|
-
const
|
|
9
|
+
const core_utils_1 = require("@fluidframework/core-utils");
|
|
21
10
|
const merge_tree_1 = require("@fluidframework/merge-tree");
|
|
22
|
-
const
|
|
11
|
+
const intervals_1 = require("./intervals");
|
|
23
12
|
const idMap = new Map();
|
|
24
13
|
function getUpdatedIdFromInterval(interval) {
|
|
25
14
|
const maybeId = interval.getIntervalId();
|
|
26
15
|
return getUpdatedId(maybeId);
|
|
27
16
|
}
|
|
28
17
|
function getUpdatedId(intervalId) {
|
|
29
|
-
|
|
30
|
-
return (_a = idMap.get(intervalId)) !== null && _a !== void 0 ? _a : intervalId;
|
|
18
|
+
return idMap.get(intervalId) ?? intervalId;
|
|
31
19
|
}
|
|
32
20
|
/**
|
|
33
21
|
* Create revertibles for adding an interval
|
|
@@ -35,7 +23,7 @@ function getUpdatedId(intervalId) {
|
|
|
35
23
|
*/
|
|
36
24
|
function appendAddIntervalToRevertibles(interval, revertibles) {
|
|
37
25
|
revertibles.push({
|
|
38
|
-
event:
|
|
26
|
+
event: intervals_1.IntervalOpType.ADD,
|
|
39
27
|
interval,
|
|
40
28
|
});
|
|
41
29
|
return revertibles;
|
|
@@ -47,11 +35,17 @@ exports.appendAddIntervalToRevertibles = appendAddIntervalToRevertibles;
|
|
|
47
35
|
*/
|
|
48
36
|
function appendDeleteIntervalToRevertibles(string, interval, revertibles) {
|
|
49
37
|
const startSeg = interval.start.getSegment();
|
|
38
|
+
const startType = startSeg.removedSeq !== undefined
|
|
39
|
+
? merge_tree_1.ReferenceType.SlideOnRemove | merge_tree_1.ReferenceType.RangeBegin
|
|
40
|
+
: merge_tree_1.ReferenceType.StayOnRemove | merge_tree_1.ReferenceType.RangeBegin;
|
|
50
41
|
const endSeg = interval.end.getSegment();
|
|
51
|
-
const
|
|
52
|
-
|
|
42
|
+
const endType = endSeg.removedSeq !== undefined
|
|
43
|
+
? merge_tree_1.ReferenceType.SlideOnRemove | merge_tree_1.ReferenceType.RangeEnd
|
|
44
|
+
: merge_tree_1.ReferenceType.StayOnRemove | merge_tree_1.ReferenceType.RangeEnd;
|
|
45
|
+
const startRef = string.createLocalReferencePosition(startSeg, interval.start.getOffset(), startType, undefined, interval.start.slidingPreference);
|
|
46
|
+
const endRef = string.createLocalReferencePosition(endSeg, interval.end.getOffset(), endType, undefined, interval.end.slidingPreference);
|
|
53
47
|
const revertible = {
|
|
54
|
-
event:
|
|
48
|
+
event: intervals_1.IntervalOpType.DELETE,
|
|
55
49
|
interval,
|
|
56
50
|
start: startRef,
|
|
57
51
|
end: endRef,
|
|
@@ -68,11 +62,20 @@ exports.appendDeleteIntervalToRevertibles = appendDeleteIntervalToRevertibles;
|
|
|
68
62
|
*/
|
|
69
63
|
function appendChangeIntervalToRevertibles(string, newInterval, previousInterval, revertibles) {
|
|
70
64
|
const startSeg = previousInterval.start.getSegment();
|
|
65
|
+
// This logic is needed because the ReferenceType StayOnRemove cannot be used
|
|
66
|
+
// on removed segments. This works for revertibles because the old position of the
|
|
67
|
+
// interval within the removed segment is handled by the remove range revertible.
|
|
68
|
+
const startType = startSeg.removedSeq !== undefined
|
|
69
|
+
? merge_tree_1.ReferenceType.SlideOnRemove | merge_tree_1.ReferenceType.RangeBegin
|
|
70
|
+
: merge_tree_1.ReferenceType.StayOnRemove | merge_tree_1.ReferenceType.RangeBegin;
|
|
71
71
|
const endSeg = previousInterval.end.getSegment();
|
|
72
|
-
const
|
|
73
|
-
|
|
72
|
+
const endType = endSeg.removedSeq !== undefined
|
|
73
|
+
? merge_tree_1.ReferenceType.SlideOnRemove | merge_tree_1.ReferenceType.RangeEnd
|
|
74
|
+
: merge_tree_1.ReferenceType.StayOnRemove | merge_tree_1.ReferenceType.RangeEnd;
|
|
75
|
+
const prevStartRef = string.createLocalReferencePosition(startSeg, previousInterval.start.getOffset(), startType, undefined, previousInterval.start.slidingPreference);
|
|
76
|
+
const prevEndRef = string.createLocalReferencePosition(endSeg, previousInterval.end.getOffset(), endType, undefined, previousInterval.end.slidingPreference);
|
|
74
77
|
const revertible = {
|
|
75
|
-
event:
|
|
78
|
+
event: intervals_1.IntervalOpType.CHANGE,
|
|
76
79
|
interval: newInterval,
|
|
77
80
|
start: prevStartRef,
|
|
78
81
|
end: prevEndRef,
|
|
@@ -89,7 +92,7 @@ exports.appendChangeIntervalToRevertibles = appendChangeIntervalToRevertibles;
|
|
|
89
92
|
*/
|
|
90
93
|
function appendIntervalPropertyChangedToRevertibles(interval, deltas, revertibles) {
|
|
91
94
|
revertibles.push({
|
|
92
|
-
event:
|
|
95
|
+
event: intervals_1.IntervalOpType.PROPERTY_CHANGED,
|
|
93
96
|
interval,
|
|
94
97
|
propertyDeltas: deltas,
|
|
95
98
|
});
|
|
@@ -97,17 +100,16 @@ function appendIntervalPropertyChangedToRevertibles(interval, deltas, revertible
|
|
|
97
100
|
}
|
|
98
101
|
exports.appendIntervalPropertyChangedToRevertibles = appendIntervalPropertyChangedToRevertibles;
|
|
99
102
|
function addIfIntervalEndpoint(ref, segmentLengths, startIntervals, endIntervals) {
|
|
100
|
-
var _a, _b;
|
|
101
103
|
if ((0, merge_tree_1.refTypeIncludesFlag)(ref.refType, merge_tree_1.ReferenceType.RangeBegin)) {
|
|
102
|
-
const interval =
|
|
103
|
-
if (interval && interval instanceof
|
|
104
|
+
const interval = ref.properties?.interval;
|
|
105
|
+
if (interval && interval instanceof intervals_1.SequenceInterval) {
|
|
104
106
|
startIntervals.push({ offset: segmentLengths + interval.start.getOffset(), interval });
|
|
105
107
|
return true;
|
|
106
108
|
}
|
|
107
109
|
}
|
|
108
110
|
else if ((0, merge_tree_1.refTypeIncludesFlag)(ref.refType, merge_tree_1.ReferenceType.RangeEnd)) {
|
|
109
|
-
const interval =
|
|
110
|
-
if (interval && interval instanceof
|
|
111
|
+
const interval = ref.properties?.interval;
|
|
112
|
+
if (interval && interval instanceof intervals_1.SequenceInterval) {
|
|
111
113
|
endIntervals.push({ offset: segmentLengths + interval.end.getOffset(), interval });
|
|
112
114
|
return true;
|
|
113
115
|
}
|
|
@@ -115,8 +117,7 @@ function addIfIntervalEndpoint(ref, segmentLengths, startIntervals, endIntervals
|
|
|
115
117
|
return false;
|
|
116
118
|
}
|
|
117
119
|
function addIfRevertibleRef(ref, segmentLengths, revertibleRefs) {
|
|
118
|
-
|
|
119
|
-
const revertible = (_a = ref.properties) === null || _a === void 0 ? void 0 : _a.revertible;
|
|
120
|
+
const revertible = ref.properties?.revertible;
|
|
120
121
|
if (revertible) {
|
|
121
122
|
revertibleRefs.push({
|
|
122
123
|
revertible,
|
|
@@ -157,9 +158,9 @@ function appendSharedStringDeltaToRevertibles(string, delta, revertibles) {
|
|
|
157
158
|
if (startIntervals.length > 0 || endIntervals.length > 0 || revertibleRefs.length > 0) {
|
|
158
159
|
const removeRevertibles = [];
|
|
159
160
|
(0, merge_tree_1.appendToMergeTreeDeltaRevertibles)(delta.deltaArgs, removeRevertibles);
|
|
160
|
-
(0,
|
|
161
|
+
(0, core_utils_1.assert)(removeRevertibles.length === 1, 0x6c4 /* Remove revertible should be a single delta */);
|
|
161
162
|
const revertible = {
|
|
162
|
-
event:
|
|
163
|
+
event: intervals_1.IntervalOpType.POSITION_REMOVE,
|
|
163
164
|
intervals: [],
|
|
164
165
|
revertibleRefs,
|
|
165
166
|
mergeTreeRevertible: removeRevertibles[0],
|
|
@@ -213,14 +214,29 @@ function discardSharedStringRevertibles(sharedString, revertibles) {
|
|
|
213
214
|
if ((0, merge_tree_1.isMergeTreeDeltaRevertible)(r)) {
|
|
214
215
|
(0, merge_tree_1.discardMergeTreeDeltaRevertible)([r]);
|
|
215
216
|
}
|
|
216
|
-
else if (r.event ===
|
|
217
|
+
else if (r.event === intervals_1.IntervalOpType.CHANGE || r.event === intervals_1.IntervalOpType.DELETE) {
|
|
217
218
|
sharedString.removeLocalReferencePosition(r.start);
|
|
218
219
|
sharedString.removeLocalReferencePosition(r.end);
|
|
219
220
|
}
|
|
220
221
|
});
|
|
221
222
|
}
|
|
222
223
|
exports.discardSharedStringRevertibles = discardSharedStringRevertibles;
|
|
223
|
-
|
|
224
|
+
function getSlidePosition(string, lref, pos) {
|
|
225
|
+
const slide = (0, merge_tree_1.getSlideToSegoff)({ segment: lref.getSegment(), offset: undefined }, lref.slidingPreference);
|
|
226
|
+
return slide?.segment !== undefined &&
|
|
227
|
+
slide.offset !== undefined &&
|
|
228
|
+
string.getPosition(slide.segment) !== -1 &&
|
|
229
|
+
(pos < 0 || pos >= string.getLength())
|
|
230
|
+
? string.getPosition(slide.segment) + slide.offset
|
|
231
|
+
: pos;
|
|
232
|
+
}
|
|
233
|
+
function isValidRange(start, end, string) {
|
|
234
|
+
return (start >= 0 &&
|
|
235
|
+
start < string.getLength() &&
|
|
236
|
+
end >= 0 &&
|
|
237
|
+
end < string.getLength() &&
|
|
238
|
+
start <= end);
|
|
239
|
+
}
|
|
224
240
|
function revertLocalAdd(string, revertible) {
|
|
225
241
|
const id = getUpdatedIdFromInterval(revertible.interval);
|
|
226
242
|
const label = revertible.interval.properties.referenceRangeLabels[0];
|
|
@@ -228,27 +244,37 @@ function revertLocalAdd(string, revertible) {
|
|
|
228
244
|
}
|
|
229
245
|
function revertLocalDelete(string, revertible) {
|
|
230
246
|
const label = revertible.interval.properties.referenceRangeLabels[0];
|
|
247
|
+
const collection = string.getIntervalCollection(label);
|
|
231
248
|
const start = string.localReferencePositionToPosition(revertible.start);
|
|
249
|
+
const startSlidePos = getSlidePosition(string, revertible.start, start);
|
|
232
250
|
const end = string.localReferencePositionToPosition(revertible.end);
|
|
251
|
+
const endSlidePos = getSlidePosition(string, revertible.end, end);
|
|
233
252
|
const type = revertible.interval.intervalType;
|
|
234
253
|
// reusing the id causes eventual consistency bugs, so it is removed here and recreated in add
|
|
235
|
-
const
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
254
|
+
const { intervalId, ...props } = revertible.interval.properties;
|
|
255
|
+
if (isValidRange(startSlidePos, endSlidePos, string)) {
|
|
256
|
+
const int = collection.add(startSlidePos, endSlidePos, type, props);
|
|
257
|
+
idMap.forEach((newId, oldId) => {
|
|
258
|
+
if (intervalId === newId) {
|
|
259
|
+
idMap.set(oldId, getUpdatedIdFromInterval(int));
|
|
260
|
+
}
|
|
261
|
+
});
|
|
262
|
+
idMap.set(intervalId, int.getIntervalId());
|
|
263
|
+
}
|
|
243
264
|
string.removeLocalReferencePosition(revertible.start);
|
|
244
265
|
string.removeLocalReferencePosition(revertible.end);
|
|
245
266
|
}
|
|
246
267
|
function revertLocalChange(string, revertible) {
|
|
247
268
|
const label = revertible.interval.properties.referenceRangeLabels[0];
|
|
269
|
+
const collection = string.getIntervalCollection(label);
|
|
248
270
|
const id = getUpdatedIdFromInterval(revertible.interval);
|
|
249
271
|
const start = string.localReferencePositionToPosition(revertible.start);
|
|
272
|
+
const startSlidePos = getSlidePosition(string, revertible.start, start);
|
|
250
273
|
const end = string.localReferencePositionToPosition(revertible.end);
|
|
251
|
-
string
|
|
274
|
+
const endSlidePos = getSlidePosition(string, revertible.end, end);
|
|
275
|
+
if (isValidRange(startSlidePos, endSlidePos, string)) {
|
|
276
|
+
collection.change(id, startSlidePos, endSlidePos);
|
|
277
|
+
}
|
|
252
278
|
string.removeLocalReferencePosition(revertible.start);
|
|
253
279
|
string.removeLocalReferencePosition(revertible.end);
|
|
254
280
|
}
|
|
@@ -307,15 +333,22 @@ function revertLocalSequenceRemove(sharedString, revertible) {
|
|
|
307
333
|
if (interval !== undefined) {
|
|
308
334
|
const newStart = newEndpointPosition(intervalInfo.startOffset, restoredRanges, sharedString);
|
|
309
335
|
const newEnd = newEndpointPosition(intervalInfo.endOffset, restoredRanges, sharedString);
|
|
310
|
-
|
|
336
|
+
// only move interval if start <= end
|
|
337
|
+
if ((newStart === undefined &&
|
|
338
|
+
newEnd !== undefined &&
|
|
339
|
+
sharedString.localReferencePositionToPosition(interval.start) <= newEnd) ||
|
|
340
|
+
(newEnd === undefined &&
|
|
341
|
+
newStart !== undefined &&
|
|
342
|
+
sharedString.localReferencePositionToPosition(interval.end) >= newStart) ||
|
|
343
|
+
(newStart !== undefined && newEnd !== undefined && newStart <= newEnd)) {
|
|
311
344
|
intervalCollection.change(intervalId, newStart, newEnd);
|
|
312
345
|
}
|
|
313
346
|
}
|
|
314
347
|
});
|
|
315
348
|
// fix up the local references used by delete and change revertibles
|
|
316
349
|
revertible.revertibleRefs.forEach((revertibleRef) => {
|
|
317
|
-
(0,
|
|
318
|
-
revertibleRef.revertible.event ===
|
|
350
|
+
(0, core_utils_1.assert)(revertibleRef.revertible.event === intervals_1.IntervalOpType.CHANGE ||
|
|
351
|
+
revertibleRef.revertible.event === intervals_1.IntervalOpType.DELETE, 0x6c5 /* revertible is not delete or change */);
|
|
319
352
|
const pos = newPosition(revertibleRef.offset, restoredRanges);
|
|
320
353
|
if (pos !== undefined) {
|
|
321
354
|
if (revertibleRef.isStart) {
|
|
@@ -346,23 +379,23 @@ function revertSharedStringRevertibles(sharedString, revertibles) {
|
|
|
346
379
|
if ("event" in r) {
|
|
347
380
|
const event = r.event;
|
|
348
381
|
switch (event) {
|
|
349
|
-
case
|
|
382
|
+
case intervals_1.IntervalOpType.ADD:
|
|
350
383
|
revertLocalAdd(sharedString, r);
|
|
351
384
|
break;
|
|
352
|
-
case
|
|
385
|
+
case intervals_1.IntervalOpType.DELETE:
|
|
353
386
|
revertLocalDelete(sharedString, r);
|
|
354
387
|
break;
|
|
355
|
-
case
|
|
388
|
+
case intervals_1.IntervalOpType.CHANGE:
|
|
356
389
|
revertLocalChange(sharedString, r);
|
|
357
390
|
break;
|
|
358
|
-
case
|
|
391
|
+
case intervals_1.IntervalOpType.PROPERTY_CHANGED:
|
|
359
392
|
revertLocalPropertyChanged(sharedString, r);
|
|
360
393
|
break;
|
|
361
|
-
case
|
|
394
|
+
case intervals_1.IntervalOpType.POSITION_REMOVE:
|
|
362
395
|
revertLocalSequenceRemove(sharedString, r);
|
|
363
396
|
break;
|
|
364
397
|
default:
|
|
365
|
-
(0,
|
|
398
|
+
(0, core_utils_1.unreachableCase)(event);
|
|
366
399
|
}
|
|
367
400
|
}
|
|
368
401
|
else {
|
package/dist/revertibles.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"revertibles.js","sourceRoot":"","sources":["../src/revertibles.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n/* eslint-disable no-bitwise */\n\nimport { assert, unreachableCase } from \"@fluidframework/common-utils\";\nimport {\n\tappendToMergeTreeDeltaRevertibles,\n\tdiscardMergeTreeDeltaRevertible,\n\tisMergeTreeDeltaRevertible,\n\tLocalReferencePosition,\n\tMergeTreeDeltaOperationType,\n\tMergeTreeDeltaRevertible,\n\tMergeTreeDeltaType,\n\tPropertySet,\n\tReferenceType,\n\trefTypeIncludesFlag,\n\trevertMergeTreeDeltaRevertibles,\n\tSortedSet,\n} from \"@fluidframework/merge-tree\";\nimport { IntervalOpType, SequenceInterval } from \"./intervalCollection\";\nimport { SharedString, SharedStringSegment } from \"./sharedString\";\nimport { ISequenceDeltaRange, SequenceDeltaEvent } from \"./sequenceDeltaEvent\";\n\n/**\n * Data for undoing edits on SharedStrings and Intervals.\n *\n * Revertibles are new and require the option mergeTreeUseNewLengthCalculations to\n * be set as true on the underlying merge tree in order to function correctly.\n *\n * @alpha\n */\nexport type SharedStringRevertible = MergeTreeDeltaRevertible | IntervalRevertible;\n\nconst idMap = new Map<string, string>();\n\ntype IntervalOpType = typeof IntervalOpType[keyof typeof IntervalOpType];\n\n/**\n * Data for undoing edits affecting Intervals.\n *\n * Revertibles are new and require the option mergeTreeUseNewLengthCalculations to\n * be set as true on the underlying merge tree in order to function correctly.\n *\n * @alpha\n */\nexport type IntervalRevertible =\n\t| {\n\t\t\tevent: typeof IntervalOpType.CHANGE;\n\t\t\tinterval: SequenceInterval;\n\t\t\tstart: LocalReferencePosition;\n\t\t\tend: LocalReferencePosition;\n\t }\n\t| {\n\t\t\tevent: typeof IntervalOpType.ADD;\n\t\t\tinterval: SequenceInterval;\n\t }\n\t| {\n\t\t\tevent: typeof IntervalOpType.DELETE;\n\t\t\tinterval: SequenceInterval;\n\t\t\tstart: LocalReferencePosition;\n\t\t\tend: LocalReferencePosition;\n\t }\n\t| {\n\t\t\tevent: typeof IntervalOpType.PROPERTY_CHANGED;\n\t\t\tinterval: SequenceInterval;\n\t\t\tpropertyDeltas: PropertySet;\n\t }\n\t| {\n\t\t\tevent: typeof IntervalOpType.POSITION_REMOVE;\n\t\t\tintervals: {\n\t\t\t\tintervalId: string;\n\t\t\t\tlabel: string;\n\t\t\t\tstartOffset?: number; // interval start index within a removed range\n\t\t\t\tendOffset?: number; // interval end index within a removed range\n\t\t\t}[];\n\t\t\t// local refs used by IntervalOpType.CHANGE and DELETE revertibles\n\t\t\trevertibleRefs: {\n\t\t\t\trevertible: IntervalRevertible;\n\t\t\t\toffset: number;\n\t\t\t\tisStart: boolean;\n\t\t\t}[];\n\t\t\tmergeTreeRevertible: MergeTreeDeltaRevertible;\n\t };\n\ntype TypedRevertible<T extends IntervalRevertible[\"event\"]> = IntervalRevertible & { event: T };\n\nfunction getUpdatedIdFromInterval(interval: SequenceInterval): string {\n\tconst maybeId = interval.getIntervalId();\n\treturn getUpdatedId(maybeId);\n}\n\nfunction getUpdatedId(intervalId: string): string {\n\treturn idMap.get(intervalId) ?? intervalId;\n}\n\n/**\n * Create revertibles for adding an interval\n * @alpha\n */\nexport function appendAddIntervalToRevertibles(\n\tinterval: SequenceInterval,\n\trevertibles: SharedStringRevertible[],\n) {\n\trevertibles.push({\n\t\tevent: IntervalOpType.ADD,\n\t\tinterval,\n\t});\n\n\treturn revertibles;\n}\n\n/**\n * Create revertibles for deleting an interval\n * @alpha\n */\nexport function appendDeleteIntervalToRevertibles(\n\tstring: SharedString,\n\tinterval: SequenceInterval,\n\trevertibles: SharedStringRevertible[],\n) {\n\tconst startSeg = interval.start.getSegment() as SharedStringSegment;\n\tconst endSeg = interval.end.getSegment() as SharedStringSegment;\n\tconst startRef = string.createLocalReferencePosition(\n\t\tstartSeg,\n\t\tinterval.start.getOffset(),\n\t\tReferenceType.StayOnRemove | ReferenceType.RangeBegin,\n\t\tundefined,\n\t);\n\tconst endRef = string.createLocalReferencePosition(\n\t\tendSeg,\n\t\tinterval.end.getOffset(),\n\t\tReferenceType.StayOnRemove | ReferenceType.RangeEnd,\n\t\tundefined,\n\t);\n\tconst revertible = {\n\t\tevent: IntervalOpType.DELETE,\n\t\tinterval,\n\t\tstart: startRef,\n\t\tend: endRef,\n\t};\n\trevertible.start.addProperties({ revertible });\n\trevertible.end.addProperties({ revertible });\n\trevertibles.push(revertible);\n\n\treturn revertibles;\n}\n\n/**\n * Create revertibles for moving endpoints of an interval\n * @alpha\n */\nexport function appendChangeIntervalToRevertibles(\n\tstring: SharedString,\n\tnewInterval: SequenceInterval,\n\tpreviousInterval: SequenceInterval,\n\trevertibles: SharedStringRevertible[],\n) {\n\tconst startSeg = previousInterval.start.getSegment() as SharedStringSegment;\n\tconst endSeg = previousInterval.end.getSegment() as SharedStringSegment;\n\tconst prevStartRef = string.createLocalReferencePosition(\n\t\tstartSeg,\n\t\tpreviousInterval.start.getOffset(),\n\t\tReferenceType.StayOnRemove | ReferenceType.RangeBegin,\n\t\tundefined,\n\t);\n\tconst prevEndRef = string.createLocalReferencePosition(\n\t\tendSeg,\n\t\tpreviousInterval.end.getOffset(),\n\t\tReferenceType.StayOnRemove | ReferenceType.RangeEnd,\n\t\tundefined,\n\t);\n\tconst revertible = {\n\t\tevent: IntervalOpType.CHANGE,\n\t\tinterval: newInterval,\n\t\tstart: prevStartRef,\n\t\tend: prevEndRef,\n\t};\n\trevertible.start.addProperties({ revertible });\n\trevertible.end.addProperties({ revertible });\n\trevertibles.push(revertible);\n\n\treturn revertibles;\n}\n\n/**\n * Create revertibles for changing properties of an interval\n * @alpha\n */\nexport function appendIntervalPropertyChangedToRevertibles(\n\tinterval: SequenceInterval,\n\tdeltas: PropertySet,\n\trevertibles: SharedStringRevertible[],\n) {\n\trevertibles.push({\n\t\tevent: IntervalOpType.PROPERTY_CHANGED,\n\t\tinterval,\n\t\tpropertyDeltas: deltas,\n\t});\n\n\treturn revertibles;\n}\n\nfunction addIfIntervalEndpoint(\n\tref: LocalReferencePosition,\n\tsegmentLengths: number,\n\tstartIntervals: { offset: number; interval: SequenceInterval }[],\n\tendIntervals: { offset: number; interval: SequenceInterval }[],\n) {\n\tif (refTypeIncludesFlag(ref.refType, ReferenceType.RangeBegin)) {\n\t\tconst interval = ref.properties?.interval;\n\t\tif (interval && interval instanceof SequenceInterval) {\n\t\t\tstartIntervals.push({ offset: segmentLengths + interval.start.getOffset(), interval });\n\t\t\treturn true;\n\t\t}\n\t} else if (refTypeIncludesFlag(ref.refType, ReferenceType.RangeEnd)) {\n\t\tconst interval = ref.properties?.interval;\n\t\tif (interval && interval instanceof SequenceInterval) {\n\t\t\tendIntervals.push({ offset: segmentLengths + interval.end.getOffset(), interval });\n\t\t\treturn true;\n\t\t}\n\t}\n\treturn false;\n}\n\nfunction addIfRevertibleRef(\n\tref: LocalReferencePosition,\n\tsegmentLengths: number,\n\trevertibleRefs: {\n\t\trevertible: IntervalRevertible;\n\t\toffset: number;\n\t\tisStart: boolean;\n\t}[],\n) {\n\tconst revertible = ref.properties?.revertible;\n\tif (revertible) {\n\t\trevertibleRefs.push({\n\t\t\trevertible,\n\t\t\toffset: segmentLengths + ref.getOffset(),\n\t\t\tisStart: refTypeIncludesFlag(ref.refType, ReferenceType.RangeBegin),\n\t\t});\n\t}\n}\n\n/**\n * Create revertibles for SharedStringDeltas, handling indirectly modified intervals\n * (e.g. reverting remove of a range that contains an interval will move the interval back)\n *\n * Revertibles are new and require the option mergeTreeUseNewLengthCalculations to\n * be set as true on the underlying merge tree in order to function correctly.\n *\n * @alpha\n */\nexport function appendSharedStringDeltaToRevertibles(\n\tstring: SharedString,\n\tdelta: SequenceDeltaEvent,\n\trevertibles: SharedStringRevertible[],\n) {\n\tif (delta.ranges.length === 0) {\n\t\treturn;\n\t}\n\tif (delta.deltaOperation === MergeTreeDeltaType.REMOVE) {\n\t\tconst startIntervals: { offset: number; interval: SequenceInterval }[] = [];\n\t\tconst endIntervals: { offset: number; interval: SequenceInterval }[] = [];\n\t\tconst revertibleRefs: {\n\t\t\trevertible: IntervalRevertible;\n\t\t\toffset: number;\n\t\t\tisStart: boolean;\n\t\t}[] = [];\n\t\tlet segmentLengths = 0;\n\n\t\t// find interval endpoints in each segment\n\t\tfor (const deltaRange of delta.ranges) {\n\t\t\tconst refs = deltaRange.segment.localRefs;\n\t\t\tif (refs !== undefined && deltaRange.position !== -1) {\n\t\t\t\tfor (const ref of refs) {\n\t\t\t\t\taddIfIntervalEndpoint(ref, segmentLengths, startIntervals, endIntervals);\n\t\t\t\t\taddIfRevertibleRef(ref, segmentLengths, revertibleRefs);\n\t\t\t\t}\n\t\t\t}\n\t\t\tsegmentLengths += deltaRange.segment.cachedLength;\n\t\t}\n\n\t\tif (startIntervals.length > 0 || endIntervals.length > 0 || revertibleRefs.length > 0) {\n\t\t\tconst removeRevertibles: MergeTreeDeltaRevertible[] = [];\n\t\t\tappendToMergeTreeDeltaRevertibles(delta.deltaArgs, removeRevertibles);\n\t\t\tassert(\n\t\t\t\tremoveRevertibles.length === 1,\n\t\t\t\t0x6c4 /* Remove revertible should be a single delta */,\n\t\t\t);\n\n\t\t\tconst revertible: TypedRevertible<typeof IntervalOpType.POSITION_REMOVE> = {\n\t\t\t\tevent: IntervalOpType.POSITION_REMOVE,\n\t\t\t\tintervals: [],\n\t\t\t\trevertibleRefs,\n\t\t\t\tmergeTreeRevertible: removeRevertibles[0],\n\t\t\t};\n\n\t\t\t// add an interval for each startInterval, accounting for any corresponding endIntervals\n\t\t\tstartIntervals.forEach(({ interval, offset }) => {\n\t\t\t\t// find any corresponding end for this interval\n\t\t\t\tconst endIntervalIndex = endIntervals.findIndex((end) => {\n\t\t\t\t\treturn end.interval === interval;\n\t\t\t\t});\n\t\t\t\tlet endOffset: number | undefined;\n\t\t\t\tif (endIntervalIndex !== -1) {\n\t\t\t\t\tendOffset = endIntervals[endIntervalIndex].offset;\n\t\t\t\t\tendIntervals.splice(endIntervalIndex, 1);\n\t\t\t\t}\n\n\t\t\t\trevertible.intervals.push({\n\t\t\t\t\tintervalId: interval.getIntervalId(),\n\t\t\t\t\tlabel: interval.properties.referenceRangeLabels[0],\n\t\t\t\t\tstartOffset: offset,\n\t\t\t\t\tendOffset,\n\t\t\t\t});\n\t\t\t});\n\n\t\t\t// add any remaining endIntervals that aren't matched with a startInterval\n\t\t\tendIntervals.forEach(({ interval, offset }) => {\n\t\t\t\trevertible.intervals.push({\n\t\t\t\t\tintervalId: interval.getIntervalId(),\n\t\t\t\t\tlabel: interval.properties.referenceRangeLabels[0],\n\t\t\t\t\tendOffset: offset,\n\t\t\t\t});\n\t\t\t});\n\n\t\t\trevertibles.push(revertible);\n\t\t\treturn;\n\t\t}\n\t}\n\n\t// Handle any merge tree delta that is not REMOVE or is REMOVE with no interval endpoints\n\tconst mergeTreeRevertibles: MergeTreeDeltaRevertible[] = [];\n\t// Allow merging MergeTreeDeltaRevertible with previous\n\tif (revertibles.length > 0 && isMergeTreeDeltaRevertible(revertibles[revertibles.length - 1])) {\n\t\tmergeTreeRevertibles.push(revertibles.pop() as MergeTreeDeltaRevertible);\n\t}\n\tappendToMergeTreeDeltaRevertibles(delta.deltaArgs, mergeTreeRevertibles);\n\trevertibles.push(...mergeTreeRevertibles);\n}\n\n/**\n * Clean up resources held by revertibles that are no longer needed.\n * @alpha\n */\nexport function discardSharedStringRevertibles(\n\tsharedString: SharedString,\n\trevertibles: SharedStringRevertible[],\n) {\n\trevertibles.forEach((r) => {\n\t\tif (isMergeTreeDeltaRevertible(r)) {\n\t\t\tdiscardMergeTreeDeltaRevertible([r]);\n\t\t} else if (r.event === IntervalOpType.CHANGE || r.event === IntervalOpType.DELETE) {\n\t\t\tsharedString.removeLocalReferencePosition(r.start);\n\t\t\tsharedString.removeLocalReferencePosition(r.end);\n\t\t}\n\t});\n}\n\n// Uses of referenceRangeLabels will be removed once AB#4081 is completed.\nfunction revertLocalAdd(\n\tstring: SharedString,\n\trevertible: TypedRevertible<typeof IntervalOpType.ADD>,\n) {\n\tconst id = getUpdatedIdFromInterval(revertible.interval);\n\tconst label = revertible.interval.properties.referenceRangeLabels[0];\n\tstring.getIntervalCollection(label).removeIntervalById(id);\n}\n\nfunction revertLocalDelete(\n\tstring: SharedString,\n\trevertible: TypedRevertible<typeof IntervalOpType.DELETE>,\n) {\n\tconst label = revertible.interval.properties.referenceRangeLabels[0];\n\tconst start = string.localReferencePositionToPosition(revertible.start);\n\tconst end = string.localReferencePositionToPosition(revertible.end);\n\tconst type = revertible.interval.intervalType;\n\t// reusing the id causes eventual consistency bugs, so it is removed here and recreated in add\n\tconst { intervalId, ...props } = revertible.interval.properties;\n\tconst int = string.getIntervalCollection(label).add(start, end, type, props);\n\n\tidMap.forEach((newId, oldId) => {\n\t\tif (intervalId === newId) {\n\t\t\tidMap.set(oldId, getUpdatedIdFromInterval(int));\n\t\t}\n\t});\n\tidMap.set(intervalId, int.getIntervalId());\n\n\tstring.removeLocalReferencePosition(revertible.start);\n\tstring.removeLocalReferencePosition(revertible.end);\n}\n\nfunction revertLocalChange(\n\tstring: SharedString,\n\trevertible: TypedRevertible<typeof IntervalOpType.CHANGE>,\n) {\n\tconst label = revertible.interval.properties.referenceRangeLabels[0];\n\tconst id = getUpdatedIdFromInterval(revertible.interval);\n\tconst start = string.localReferencePositionToPosition(revertible.start);\n\tconst end = string.localReferencePositionToPosition(revertible.end);\n\tstring.getIntervalCollection(label).change(id, start, end);\n\n\tstring.removeLocalReferencePosition(revertible.start);\n\tstring.removeLocalReferencePosition(revertible.end);\n}\n\nfunction revertLocalPropertyChanged(\n\tstring: SharedString,\n\trevertible: TypedRevertible<typeof IntervalOpType.PROPERTY_CHANGED>,\n) {\n\tconst label = revertible.interval.properties.referenceRangeLabels[0];\n\tconst id = getUpdatedIdFromInterval(revertible.interval);\n\tconst newProps = revertible.propertyDeltas;\n\tstring.getIntervalCollection(label).changeProperties(id, newProps);\n}\n\nfunction newPosition(offset: number | undefined, restoredRanges: SortedRangeSet) {\n\tif (offset === undefined) {\n\t\treturn undefined;\n\t}\n\n\tlet offsetFromSegment = offset;\n\tfor (const rangeInfo of restoredRanges.items) {\n\t\tif (offsetFromSegment < rangeInfo.length) {\n\t\t\t// find the segment inside the range\n\t\t\tfor (const range of rangeInfo.ranges) {\n\t\t\t\tif (range.segment.cachedLength > offsetFromSegment) {\n\t\t\t\t\treturn { segment: range.segment, offset: offsetFromSegment };\n\t\t\t\t}\n\t\t\t\toffsetFromSegment -= range.segment.cachedLength;\n\t\t\t}\n\t\t}\n\t\toffsetFromSegment -= rangeInfo.length;\n\t}\n\n\treturn undefined;\n}\n\nfunction newEndpointPosition(\n\toffset: number | undefined,\n\trestoredRanges: SortedRangeSet,\n\tsharedString: SharedString,\n) {\n\tconst pos = newPosition(offset, restoredRanges);\n\treturn pos === undefined ? undefined : sharedString.getPosition(pos.segment) + pos.offset;\n}\n\ninterface RangeInfo {\n\tranges: readonly Readonly<ISequenceDeltaRange<MergeTreeDeltaOperationType>>[];\n\tlength: number;\n}\n\nclass SortedRangeSet extends SortedSet<RangeInfo, string> {\n\tprotected getKey(item: RangeInfo): string {\n\t\treturn item.ranges[0].segment.ordinal;\n\t}\n}\n\nfunction revertLocalSequenceRemove(\n\tsharedString: SharedString,\n\trevertible: TypedRevertible<typeof IntervalOpType.POSITION_REMOVE>,\n) {\n\tconst restoredRanges = new SortedRangeSet();\n\tconst saveSegments = (event: SequenceDeltaEvent) => {\n\t\tif (event.ranges.length > 0) {\n\t\t\tlet length = 0;\n\t\t\tevent.ranges.forEach((range) => {\n\t\t\t\tlength += range.segment.cachedLength;\n\t\t\t});\n\t\t\trestoredRanges.addOrUpdate({ ranges: event.ranges, length });\n\t\t}\n\t};\n\tsharedString.on(\"sequenceDelta\", saveSegments);\n\trevertMergeTreeDeltaRevertibles(sharedString, [revertible.mergeTreeRevertible]);\n\tsharedString.off(\"sequenceDelta\", saveSegments);\n\n\trevertible.intervals.forEach((intervalInfo) => {\n\t\tconst intervalCollection = sharedString.getIntervalCollection(intervalInfo.label);\n\t\tconst intervalId = getUpdatedId(intervalInfo.intervalId);\n\t\tconst interval = intervalCollection.getIntervalById(intervalId);\n\t\tif (interval !== undefined) {\n\t\t\tconst newStart = newEndpointPosition(\n\t\t\t\tintervalInfo.startOffset,\n\t\t\t\trestoredRanges,\n\t\t\t\tsharedString,\n\t\t\t);\n\t\t\tconst newEnd = newEndpointPosition(\n\t\t\t\tintervalInfo.endOffset,\n\t\t\t\trestoredRanges,\n\t\t\t\tsharedString,\n\t\t\t);\n\t\t\tif (newStart !== undefined || newEnd !== undefined) {\n\t\t\t\tintervalCollection.change(intervalId, newStart, newEnd);\n\t\t\t}\n\t\t}\n\t});\n\n\t// fix up the local references used by delete and change revertibles\n\trevertible.revertibleRefs.forEach((revertibleRef) => {\n\t\tassert(\n\t\t\trevertibleRef.revertible.event === IntervalOpType.CHANGE ||\n\t\t\t\trevertibleRef.revertible.event === IntervalOpType.DELETE,\n\t\t\t0x6c5 /* revertible is not delete or change */,\n\t\t);\n\t\tconst pos = newPosition(revertibleRef.offset, restoredRanges);\n\t\tif (pos !== undefined) {\n\t\t\tif (revertibleRef.isStart) {\n\t\t\t\tsharedString.removeLocalReferencePosition(revertibleRef.revertible.start);\n\t\t\t\tconst newRef = sharedString.createLocalReferencePosition(\n\t\t\t\t\tpos.segment as SharedStringSegment,\n\t\t\t\t\tpos.offset,\n\t\t\t\t\tReferenceType.StayOnRemove | ReferenceType.RangeBegin,\n\t\t\t\t\t{ revertible: revertibleRef.revertible },\n\t\t\t\t);\n\t\t\t\trevertibleRef.revertible.start = newRef;\n\t\t\t} else {\n\t\t\t\tsharedString.removeLocalReferencePosition(revertibleRef.revertible.end);\n\t\t\t\tconst newRef = sharedString.createLocalReferencePosition(\n\t\t\t\t\tpos.segment as SharedStringSegment,\n\t\t\t\t\tpos.offset,\n\t\t\t\t\tReferenceType.StayOnRemove | ReferenceType.RangeEnd,\n\t\t\t\t\t{ revertible: revertibleRef.revertible },\n\t\t\t\t);\n\t\t\t\trevertibleRef.revertible.end = newRef;\n\t\t\t}\n\t\t}\n\t});\n}\n\n/**\n * Invoke revertibles to reverse prior edits\n *\n * Revertibles are new and require the option mergeTreeUseNewLengthCalculations to\n * be set as true on the underlying merge tree in order to function correctly.\n *\n * @alpha\n */\nexport function revertSharedStringRevertibles(\n\tsharedString: SharedString,\n\trevertibles: SharedStringRevertible[],\n) {\n\twhile (revertibles.length > 0) {\n\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\tconst r = revertibles.pop()!;\n\t\tif (\"event\" in r) {\n\t\t\tconst event = r.event;\n\t\t\tswitch (event) {\n\t\t\t\tcase IntervalOpType.ADD:\n\t\t\t\t\trevertLocalAdd(sharedString, r);\n\t\t\t\t\tbreak;\n\t\t\t\tcase IntervalOpType.DELETE:\n\t\t\t\t\trevertLocalDelete(sharedString, r);\n\t\t\t\t\tbreak;\n\t\t\t\tcase IntervalOpType.CHANGE:\n\t\t\t\t\trevertLocalChange(sharedString, r);\n\t\t\t\t\tbreak;\n\t\t\t\tcase IntervalOpType.PROPERTY_CHANGED:\n\t\t\t\t\trevertLocalPropertyChanged(sharedString, r);\n\t\t\t\t\tbreak;\n\t\t\t\tcase IntervalOpType.POSITION_REMOVE:\n\t\t\t\t\trevertLocalSequenceRemove(sharedString, r);\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tunreachableCase(event);\n\t\t\t}\n\t\t} else {\n\t\t\trevertMergeTreeDeltaRevertibles(sharedString, [r]);\n\t\t}\n\t}\n}\n"]}
|
|
1
|
+
{"version":3,"file":"revertibles.js","sourceRoot":"","sources":["../src/revertibles.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n/* eslint-disable no-bitwise */\n\nimport { assert, unreachableCase } from \"@fluidframework/core-utils\";\nimport {\n\tappendToMergeTreeDeltaRevertibles,\n\tdiscardMergeTreeDeltaRevertible,\n\tisMergeTreeDeltaRevertible,\n\tLocalReferencePosition,\n\tMergeTreeDeltaOperationType,\n\tMergeTreeDeltaRevertible,\n\tMergeTreeDeltaType,\n\tPropertySet,\n\tReferenceType,\n\trefTypeIncludesFlag,\n\trevertMergeTreeDeltaRevertibles,\n\tSortedSet,\n\tgetSlideToSegoff,\n} from \"@fluidframework/merge-tree\";\nimport { IntervalOpType, SequenceInterval } from \"./intervals\";\nimport { SharedString, SharedStringSegment } from \"./sharedString\";\nimport { ISequenceDeltaRange, SequenceDeltaEvent } from \"./sequenceDeltaEvent\";\n\n/**\n * Data for undoing edits on SharedStrings and Intervals.\n *\n * Revertibles are new and require the option mergeTreeUseNewLengthCalculations to\n * be set as true on the underlying merge tree in order to function correctly.\n *\n * @alpha\n */\nexport type SharedStringRevertible = MergeTreeDeltaRevertible | IntervalRevertible;\n\nconst idMap = new Map<string, string>();\n\ntype IntervalOpType = typeof IntervalOpType[keyof typeof IntervalOpType];\n\n/**\n * Data for undoing edits affecting Intervals.\n *\n * Revertibles are new and require the option mergeTreeUseNewLengthCalculations to\n * be set as true on the underlying merge tree in order to function correctly.\n *\n * @alpha\n */\nexport type IntervalRevertible =\n\t| {\n\t\t\tevent: typeof IntervalOpType.CHANGE;\n\t\t\tinterval: SequenceInterval;\n\t\t\tstart: LocalReferencePosition;\n\t\t\tend: LocalReferencePosition;\n\t }\n\t| {\n\t\t\tevent: typeof IntervalOpType.ADD;\n\t\t\tinterval: SequenceInterval;\n\t }\n\t| {\n\t\t\tevent: typeof IntervalOpType.DELETE;\n\t\t\tinterval: SequenceInterval;\n\t\t\tstart: LocalReferencePosition;\n\t\t\tend: LocalReferencePosition;\n\t }\n\t| {\n\t\t\tevent: typeof IntervalOpType.PROPERTY_CHANGED;\n\t\t\tinterval: SequenceInterval;\n\t\t\tpropertyDeltas: PropertySet;\n\t }\n\t| {\n\t\t\tevent: typeof IntervalOpType.POSITION_REMOVE;\n\t\t\tintervals: {\n\t\t\t\tintervalId: string;\n\t\t\t\tlabel: string;\n\t\t\t\tstartOffset?: number; // interval start index within a removed range\n\t\t\t\tendOffset?: number; // interval end index within a removed range\n\t\t\t}[];\n\t\t\t// local refs used by IntervalOpType.CHANGE and DELETE revertibles\n\t\t\trevertibleRefs: {\n\t\t\t\trevertible: IntervalRevertible;\n\t\t\t\toffset: number;\n\t\t\t\tisStart: boolean;\n\t\t\t}[];\n\t\t\tmergeTreeRevertible: MergeTreeDeltaRevertible;\n\t };\n\ntype TypedRevertible<T extends IntervalRevertible[\"event\"]> = IntervalRevertible & { event: T };\n\nfunction getUpdatedIdFromInterval(interval: SequenceInterval): string {\n\tconst maybeId = interval.getIntervalId();\n\treturn getUpdatedId(maybeId);\n}\n\nfunction getUpdatedId(intervalId: string): string {\n\treturn idMap.get(intervalId) ?? intervalId;\n}\n\n/**\n * Create revertibles for adding an interval\n * @alpha\n */\nexport function appendAddIntervalToRevertibles(\n\tinterval: SequenceInterval,\n\trevertibles: SharedStringRevertible[],\n) {\n\trevertibles.push({\n\t\tevent: IntervalOpType.ADD,\n\t\tinterval,\n\t});\n\n\treturn revertibles;\n}\n\n/**\n * Create revertibles for deleting an interval\n * @alpha\n */\nexport function appendDeleteIntervalToRevertibles(\n\tstring: SharedString,\n\tinterval: SequenceInterval,\n\trevertibles: SharedStringRevertible[],\n) {\n\tconst startSeg = interval.start.getSegment() as SharedStringSegment;\n\tconst startType =\n\t\tstartSeg.removedSeq !== undefined\n\t\t\t? ReferenceType.SlideOnRemove | ReferenceType.RangeBegin\n\t\t\t: ReferenceType.StayOnRemove | ReferenceType.RangeBegin;\n\tconst endSeg = interval.end.getSegment() as SharedStringSegment;\n\tconst endType =\n\t\tendSeg.removedSeq !== undefined\n\t\t\t? ReferenceType.SlideOnRemove | ReferenceType.RangeEnd\n\t\t\t: ReferenceType.StayOnRemove | ReferenceType.RangeEnd;\n\tconst startRef = string.createLocalReferencePosition(\n\t\tstartSeg,\n\t\tinterval.start.getOffset(),\n\t\tstartType,\n\t\tundefined,\n\t\tinterval.start.slidingPreference,\n\t);\n\tconst endRef = string.createLocalReferencePosition(\n\t\tendSeg,\n\t\tinterval.end.getOffset(),\n\t\tendType,\n\t\tundefined,\n\t\tinterval.end.slidingPreference,\n\t);\n\tconst revertible = {\n\t\tevent: IntervalOpType.DELETE,\n\t\tinterval,\n\t\tstart: startRef,\n\t\tend: endRef,\n\t};\n\trevertible.start.addProperties({ revertible });\n\trevertible.end.addProperties({ revertible });\n\trevertibles.push(revertible);\n\n\treturn revertibles;\n}\n\n/**\n * Create revertibles for moving endpoints of an interval\n * @alpha\n */\nexport function appendChangeIntervalToRevertibles(\n\tstring: SharedString,\n\tnewInterval: SequenceInterval,\n\tpreviousInterval: SequenceInterval,\n\trevertibles: SharedStringRevertible[],\n) {\n\tconst startSeg = previousInterval.start.getSegment() as SharedStringSegment;\n\t// This logic is needed because the ReferenceType StayOnRemove cannot be used\n\t// on removed segments. This works for revertibles because the old position of the\n\t// interval within the removed segment is handled by the remove range revertible.\n\tconst startType =\n\t\tstartSeg.removedSeq !== undefined\n\t\t\t? ReferenceType.SlideOnRemove | ReferenceType.RangeBegin\n\t\t\t: ReferenceType.StayOnRemove | ReferenceType.RangeBegin;\n\tconst endSeg = previousInterval.end.getSegment() as SharedStringSegment;\n\tconst endType =\n\t\tendSeg.removedSeq !== undefined\n\t\t\t? ReferenceType.SlideOnRemove | ReferenceType.RangeEnd\n\t\t\t: ReferenceType.StayOnRemove | ReferenceType.RangeEnd;\n\tconst prevStartRef = string.createLocalReferencePosition(\n\t\tstartSeg,\n\t\tpreviousInterval.start.getOffset(),\n\t\tstartType,\n\t\tundefined,\n\t\tpreviousInterval.start.slidingPreference,\n\t);\n\tconst prevEndRef = string.createLocalReferencePosition(\n\t\tendSeg,\n\t\tpreviousInterval.end.getOffset(),\n\t\tendType,\n\t\tundefined,\n\t\tpreviousInterval.end.slidingPreference,\n\t);\n\tconst revertible = {\n\t\tevent: IntervalOpType.CHANGE,\n\t\tinterval: newInterval,\n\t\tstart: prevStartRef,\n\t\tend: prevEndRef,\n\t};\n\trevertible.start.addProperties({ revertible });\n\trevertible.end.addProperties({ revertible });\n\trevertibles.push(revertible);\n\n\treturn revertibles;\n}\n\n/**\n * Create revertibles for changing properties of an interval\n * @alpha\n */\nexport function appendIntervalPropertyChangedToRevertibles(\n\tinterval: SequenceInterval,\n\tdeltas: PropertySet,\n\trevertibles: SharedStringRevertible[],\n) {\n\trevertibles.push({\n\t\tevent: IntervalOpType.PROPERTY_CHANGED,\n\t\tinterval,\n\t\tpropertyDeltas: deltas,\n\t});\n\n\treturn revertibles;\n}\n\nfunction addIfIntervalEndpoint(\n\tref: LocalReferencePosition,\n\tsegmentLengths: number,\n\tstartIntervals: { offset: number; interval: SequenceInterval }[],\n\tendIntervals: { offset: number; interval: SequenceInterval }[],\n) {\n\tif (refTypeIncludesFlag(ref.refType, ReferenceType.RangeBegin)) {\n\t\tconst interval = ref.properties?.interval;\n\t\tif (interval && interval instanceof SequenceInterval) {\n\t\t\tstartIntervals.push({ offset: segmentLengths + interval.start.getOffset(), interval });\n\t\t\treturn true;\n\t\t}\n\t} else if (refTypeIncludesFlag(ref.refType, ReferenceType.RangeEnd)) {\n\t\tconst interval = ref.properties?.interval;\n\t\tif (interval && interval instanceof SequenceInterval) {\n\t\t\tendIntervals.push({ offset: segmentLengths + interval.end.getOffset(), interval });\n\t\t\treturn true;\n\t\t}\n\t}\n\treturn false;\n}\n\nfunction addIfRevertibleRef(\n\tref: LocalReferencePosition,\n\tsegmentLengths: number,\n\trevertibleRefs: {\n\t\trevertible: IntervalRevertible;\n\t\toffset: number;\n\t\tisStart: boolean;\n\t}[],\n) {\n\tconst revertible = ref.properties?.revertible;\n\tif (revertible) {\n\t\trevertibleRefs.push({\n\t\t\trevertible,\n\t\t\toffset: segmentLengths + ref.getOffset(),\n\t\t\tisStart: refTypeIncludesFlag(ref.refType, ReferenceType.RangeBegin),\n\t\t});\n\t}\n}\n\n/**\n * Create revertibles for SharedStringDeltas, handling indirectly modified intervals\n * (e.g. reverting remove of a range that contains an interval will move the interval back)\n *\n * Revertibles are new and require the option mergeTreeUseNewLengthCalculations to\n * be set as true on the underlying merge tree in order to function correctly.\n *\n * @alpha\n */\nexport function appendSharedStringDeltaToRevertibles(\n\tstring: SharedString,\n\tdelta: SequenceDeltaEvent,\n\trevertibles: SharedStringRevertible[],\n) {\n\tif (delta.ranges.length === 0) {\n\t\treturn;\n\t}\n\tif (delta.deltaOperation === MergeTreeDeltaType.REMOVE) {\n\t\tconst startIntervals: { offset: number; interval: SequenceInterval }[] = [];\n\t\tconst endIntervals: { offset: number; interval: SequenceInterval }[] = [];\n\t\tconst revertibleRefs: {\n\t\t\trevertible: IntervalRevertible;\n\t\t\toffset: number;\n\t\t\tisStart: boolean;\n\t\t}[] = [];\n\t\tlet segmentLengths = 0;\n\n\t\t// find interval endpoints in each segment\n\t\tfor (const deltaRange of delta.ranges) {\n\t\t\tconst refs = deltaRange.segment.localRefs;\n\t\t\tif (refs !== undefined && deltaRange.position !== -1) {\n\t\t\t\tfor (const ref of refs) {\n\t\t\t\t\taddIfIntervalEndpoint(ref, segmentLengths, startIntervals, endIntervals);\n\t\t\t\t\taddIfRevertibleRef(ref, segmentLengths, revertibleRefs);\n\t\t\t\t}\n\t\t\t}\n\t\t\tsegmentLengths += deltaRange.segment.cachedLength;\n\t\t}\n\n\t\tif (startIntervals.length > 0 || endIntervals.length > 0 || revertibleRefs.length > 0) {\n\t\t\tconst removeRevertibles: MergeTreeDeltaRevertible[] = [];\n\t\t\tappendToMergeTreeDeltaRevertibles(delta.deltaArgs, removeRevertibles);\n\t\t\tassert(\n\t\t\t\tremoveRevertibles.length === 1,\n\t\t\t\t0x6c4 /* Remove revertible should be a single delta */,\n\t\t\t);\n\n\t\t\tconst revertible: TypedRevertible<typeof IntervalOpType.POSITION_REMOVE> = {\n\t\t\t\tevent: IntervalOpType.POSITION_REMOVE,\n\t\t\t\tintervals: [],\n\t\t\t\trevertibleRefs,\n\t\t\t\tmergeTreeRevertible: removeRevertibles[0],\n\t\t\t};\n\n\t\t\t// add an interval for each startInterval, accounting for any corresponding endIntervals\n\t\t\tstartIntervals.forEach(({ interval, offset }) => {\n\t\t\t\t// find any corresponding end for this interval\n\t\t\t\tconst endIntervalIndex = endIntervals.findIndex((end) => {\n\t\t\t\t\treturn end.interval === interval;\n\t\t\t\t});\n\t\t\t\tlet endOffset: number | undefined;\n\t\t\t\tif (endIntervalIndex !== -1) {\n\t\t\t\t\tendOffset = endIntervals[endIntervalIndex].offset;\n\t\t\t\t\tendIntervals.splice(endIntervalIndex, 1);\n\t\t\t\t}\n\n\t\t\t\trevertible.intervals.push({\n\t\t\t\t\tintervalId: interval.getIntervalId(),\n\t\t\t\t\tlabel: interval.properties.referenceRangeLabels[0],\n\t\t\t\t\tstartOffset: offset,\n\t\t\t\t\tendOffset,\n\t\t\t\t});\n\t\t\t});\n\n\t\t\t// add any remaining endIntervals that aren't matched with a startInterval\n\t\t\tendIntervals.forEach(({ interval, offset }) => {\n\t\t\t\trevertible.intervals.push({\n\t\t\t\t\tintervalId: interval.getIntervalId(),\n\t\t\t\t\tlabel: interval.properties.referenceRangeLabels[0],\n\t\t\t\t\tendOffset: offset,\n\t\t\t\t});\n\t\t\t});\n\n\t\t\trevertibles.push(revertible);\n\t\t\treturn;\n\t\t}\n\t}\n\n\t// Handle any merge tree delta that is not REMOVE or is REMOVE with no interval endpoints\n\tconst mergeTreeRevertibles: MergeTreeDeltaRevertible[] = [];\n\t// Allow merging MergeTreeDeltaRevertible with previous\n\tif (revertibles.length > 0 && isMergeTreeDeltaRevertible(revertibles[revertibles.length - 1])) {\n\t\tmergeTreeRevertibles.push(revertibles.pop() as MergeTreeDeltaRevertible);\n\t}\n\tappendToMergeTreeDeltaRevertibles(delta.deltaArgs, mergeTreeRevertibles);\n\trevertibles.push(...mergeTreeRevertibles);\n}\n\n/**\n * Clean up resources held by revertibles that are no longer needed.\n * @alpha\n */\nexport function discardSharedStringRevertibles(\n\tsharedString: SharedString,\n\trevertibles: SharedStringRevertible[],\n) {\n\trevertibles.forEach((r) => {\n\t\tif (isMergeTreeDeltaRevertible(r)) {\n\t\t\tdiscardMergeTreeDeltaRevertible([r]);\n\t\t} else if (r.event === IntervalOpType.CHANGE || r.event === IntervalOpType.DELETE) {\n\t\t\tsharedString.removeLocalReferencePosition(r.start);\n\t\t\tsharedString.removeLocalReferencePosition(r.end);\n\t\t}\n\t});\n}\n\nfunction getSlidePosition(string: SharedString, lref: LocalReferencePosition, pos: number): number {\n\tconst slide = getSlideToSegoff(\n\t\t{ segment: lref.getSegment(), offset: undefined },\n\t\tlref.slidingPreference,\n\t);\n\treturn slide?.segment !== undefined &&\n\t\tslide.offset !== undefined &&\n\t\tstring.getPosition(slide.segment) !== -1 &&\n\t\t(pos < 0 || pos >= string.getLength())\n\t\t? string.getPosition(slide.segment) + slide.offset\n\t\t: pos;\n}\n\nfunction isValidRange(start: number, end: number, string: SharedString) {\n\treturn (\n\t\tstart >= 0 &&\n\t\tstart < string.getLength() &&\n\t\tend >= 0 &&\n\t\tend < string.getLength() &&\n\t\tstart <= end\n\t);\n}\n\nfunction revertLocalAdd(\n\tstring: SharedString,\n\trevertible: TypedRevertible<typeof IntervalOpType.ADD>,\n) {\n\tconst id = getUpdatedIdFromInterval(revertible.interval);\n\tconst label = revertible.interval.properties.referenceRangeLabels[0];\n\tstring.getIntervalCollection(label).removeIntervalById(id);\n}\n\nfunction revertLocalDelete(\n\tstring: SharedString,\n\trevertible: TypedRevertible<typeof IntervalOpType.DELETE>,\n) {\n\tconst label = revertible.interval.properties.referenceRangeLabels[0];\n\tconst collection = string.getIntervalCollection(label);\n\tconst start = string.localReferencePositionToPosition(revertible.start);\n\tconst startSlidePos = getSlidePosition(string, revertible.start, start);\n\tconst end = string.localReferencePositionToPosition(revertible.end);\n\tconst endSlidePos = getSlidePosition(string, revertible.end, end);\n\tconst type = revertible.interval.intervalType;\n\t// reusing the id causes eventual consistency bugs, so it is removed here and recreated in add\n\tconst { intervalId, ...props } = revertible.interval.properties;\n\tif (isValidRange(startSlidePos, endSlidePos, string)) {\n\t\tconst int = collection.add(startSlidePos, endSlidePos, type, props);\n\n\t\tidMap.forEach((newId, oldId) => {\n\t\t\tif (intervalId === newId) {\n\t\t\t\tidMap.set(oldId, getUpdatedIdFromInterval(int));\n\t\t\t}\n\t\t});\n\t\tidMap.set(intervalId, int.getIntervalId());\n\t}\n\n\tstring.removeLocalReferencePosition(revertible.start);\n\tstring.removeLocalReferencePosition(revertible.end);\n}\n\nfunction revertLocalChange(\n\tstring: SharedString,\n\trevertible: TypedRevertible<typeof IntervalOpType.CHANGE>,\n) {\n\tconst label = revertible.interval.properties.referenceRangeLabels[0];\n\tconst collection = string.getIntervalCollection(label);\n\tconst id = getUpdatedIdFromInterval(revertible.interval);\n\tconst start = string.localReferencePositionToPosition(revertible.start);\n\tconst startSlidePos = getSlidePosition(string, revertible.start, start);\n\tconst end = string.localReferencePositionToPosition(revertible.end);\n\tconst endSlidePos = getSlidePosition(string, revertible.end, end);\n\tif (isValidRange(startSlidePos, endSlidePos, string)) {\n\t\tcollection.change(id, startSlidePos, endSlidePos);\n\t}\n\n\tstring.removeLocalReferencePosition(revertible.start);\n\tstring.removeLocalReferencePosition(revertible.end);\n}\n\nfunction revertLocalPropertyChanged(\n\tstring: SharedString,\n\trevertible: TypedRevertible<typeof IntervalOpType.PROPERTY_CHANGED>,\n) {\n\tconst label = revertible.interval.properties.referenceRangeLabels[0];\n\tconst id = getUpdatedIdFromInterval(revertible.interval);\n\tconst newProps = revertible.propertyDeltas;\n\tstring.getIntervalCollection(label).changeProperties(id, newProps);\n}\n\nfunction newPosition(offset: number | undefined, restoredRanges: SortedRangeSet) {\n\tif (offset === undefined) {\n\t\treturn undefined;\n\t}\n\n\tlet offsetFromSegment = offset;\n\tfor (const rangeInfo of restoredRanges.items) {\n\t\tif (offsetFromSegment < rangeInfo.length) {\n\t\t\t// find the segment inside the range\n\t\t\tfor (const range of rangeInfo.ranges) {\n\t\t\t\tif (range.segment.cachedLength > offsetFromSegment) {\n\t\t\t\t\treturn { segment: range.segment, offset: offsetFromSegment };\n\t\t\t\t}\n\t\t\t\toffsetFromSegment -= range.segment.cachedLength;\n\t\t\t}\n\t\t}\n\t\toffsetFromSegment -= rangeInfo.length;\n\t}\n\n\treturn undefined;\n}\n\nfunction newEndpointPosition(\n\toffset: number | undefined,\n\trestoredRanges: SortedRangeSet,\n\tsharedString: SharedString,\n) {\n\tconst pos = newPosition(offset, restoredRanges);\n\treturn pos === undefined ? undefined : sharedString.getPosition(pos.segment) + pos.offset;\n}\n\ninterface RangeInfo {\n\tranges: readonly Readonly<ISequenceDeltaRange<MergeTreeDeltaOperationType>>[];\n\tlength: number;\n}\n\nclass SortedRangeSet extends SortedSet<RangeInfo, string> {\n\tprotected getKey(item: RangeInfo): string {\n\t\treturn item.ranges[0].segment.ordinal;\n\t}\n}\n\nfunction revertLocalSequenceRemove(\n\tsharedString: SharedString,\n\trevertible: TypedRevertible<typeof IntervalOpType.POSITION_REMOVE>,\n) {\n\tconst restoredRanges = new SortedRangeSet();\n\tconst saveSegments = (event: SequenceDeltaEvent) => {\n\t\tif (event.ranges.length > 0) {\n\t\t\tlet length = 0;\n\t\t\tevent.ranges.forEach((range) => {\n\t\t\t\tlength += range.segment.cachedLength;\n\t\t\t});\n\t\t\trestoredRanges.addOrUpdate({ ranges: event.ranges, length });\n\t\t}\n\t};\n\tsharedString.on(\"sequenceDelta\", saveSegments);\n\trevertMergeTreeDeltaRevertibles(sharedString, [revertible.mergeTreeRevertible]);\n\tsharedString.off(\"sequenceDelta\", saveSegments);\n\n\trevertible.intervals.forEach((intervalInfo) => {\n\t\tconst intervalCollection = sharedString.getIntervalCollection(intervalInfo.label);\n\t\tconst intervalId = getUpdatedId(intervalInfo.intervalId);\n\t\tconst interval = intervalCollection.getIntervalById(intervalId);\n\t\tif (interval !== undefined) {\n\t\t\tconst newStart = newEndpointPosition(\n\t\t\t\tintervalInfo.startOffset,\n\t\t\t\trestoredRanges,\n\t\t\t\tsharedString,\n\t\t\t);\n\t\t\tconst newEnd = newEndpointPosition(\n\t\t\t\tintervalInfo.endOffset,\n\t\t\t\trestoredRanges,\n\t\t\t\tsharedString,\n\t\t\t);\n\t\t\t// only move interval if start <= end\n\t\t\tif (\n\t\t\t\t(newStart === undefined &&\n\t\t\t\t\tnewEnd !== undefined &&\n\t\t\t\t\tsharedString.localReferencePositionToPosition(interval.start) <= newEnd) ||\n\t\t\t\t(newEnd === undefined &&\n\t\t\t\t\tnewStart !== undefined &&\n\t\t\t\t\tsharedString.localReferencePositionToPosition(interval.end) >= newStart) ||\n\t\t\t\t(newStart !== undefined && newEnd !== undefined && newStart <= newEnd)\n\t\t\t) {\n\t\t\t\tintervalCollection.change(intervalId, newStart, newEnd);\n\t\t\t}\n\t\t}\n\t});\n\n\t// fix up the local references used by delete and change revertibles\n\trevertible.revertibleRefs.forEach((revertibleRef) => {\n\t\tassert(\n\t\t\trevertibleRef.revertible.event === IntervalOpType.CHANGE ||\n\t\t\t\trevertibleRef.revertible.event === IntervalOpType.DELETE,\n\t\t\t0x6c5 /* revertible is not delete or change */,\n\t\t);\n\t\tconst pos = newPosition(revertibleRef.offset, restoredRanges);\n\t\tif (pos !== undefined) {\n\t\t\tif (revertibleRef.isStart) {\n\t\t\t\tsharedString.removeLocalReferencePosition(revertibleRef.revertible.start);\n\t\t\t\tconst newRef = sharedString.createLocalReferencePosition(\n\t\t\t\t\tpos.segment as SharedStringSegment,\n\t\t\t\t\tpos.offset,\n\t\t\t\t\tReferenceType.StayOnRemove | ReferenceType.RangeBegin,\n\t\t\t\t\t{ revertible: revertibleRef.revertible },\n\t\t\t\t);\n\t\t\t\trevertibleRef.revertible.start = newRef;\n\t\t\t} else {\n\t\t\t\tsharedString.removeLocalReferencePosition(revertibleRef.revertible.end);\n\t\t\t\tconst newRef = sharedString.createLocalReferencePosition(\n\t\t\t\t\tpos.segment as SharedStringSegment,\n\t\t\t\t\tpos.offset,\n\t\t\t\t\tReferenceType.StayOnRemove | ReferenceType.RangeEnd,\n\t\t\t\t\t{ revertible: revertibleRef.revertible },\n\t\t\t\t);\n\t\t\t\trevertibleRef.revertible.end = newRef;\n\t\t\t}\n\t\t}\n\t});\n}\n\n/**\n * Invoke revertibles to reverse prior edits\n *\n * Revertibles are new and require the option mergeTreeUseNewLengthCalculations to\n * be set as true on the underlying merge tree in order to function correctly.\n *\n * @alpha\n */\nexport function revertSharedStringRevertibles(\n\tsharedString: SharedString,\n\trevertibles: SharedStringRevertible[],\n) {\n\twhile (revertibles.length > 0) {\n\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\tconst r = revertibles.pop()!;\n\t\tif (\"event\" in r) {\n\t\t\tconst event = r.event;\n\t\t\tswitch (event) {\n\t\t\t\tcase IntervalOpType.ADD:\n\t\t\t\t\trevertLocalAdd(sharedString, r);\n\t\t\t\t\tbreak;\n\t\t\t\tcase IntervalOpType.DELETE:\n\t\t\t\t\trevertLocalDelete(sharedString, r);\n\t\t\t\t\tbreak;\n\t\t\t\tcase IntervalOpType.CHANGE:\n\t\t\t\t\trevertLocalChange(sharedString, r);\n\t\t\t\t\tbreak;\n\t\t\t\tcase IntervalOpType.PROPERTY_CHANGED:\n\t\t\t\t\trevertLocalPropertyChanged(sharedString, r);\n\t\t\t\t\tbreak;\n\t\t\t\tcase IntervalOpType.POSITION_REMOVE:\n\t\t\t\t\trevertLocalSequenceRemove(sharedString, r);\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tunreachableCase(event);\n\t\t\t}\n\t\t} else {\n\t\t\trevertMergeTreeDeltaRevertibles(sharedString, [r]);\n\t\t}\n\t}\n}\n"]}
|
package/dist/sequence.d.ts
CHANGED
|
@@ -2,14 +2,15 @@
|
|
|
2
2
|
* Copyright (c) Microsoft Corporation and contributors. All rights reserved.
|
|
3
3
|
* Licensed under the MIT License.
|
|
4
4
|
*/
|
|
5
|
-
import { Deferred } from "@fluidframework/
|
|
5
|
+
import { Deferred } from "@fluidframework/core-utils";
|
|
6
6
|
import { ISequencedDocumentMessage } from "@fluidframework/protocol-definitions";
|
|
7
7
|
import { IChannelAttributes, IFluidDataStoreRuntime, IChannelStorageService } from "@fluidframework/datastore-definitions";
|
|
8
8
|
import { Client, ICombiningOp, IJSONSegment, IMergeTreeGroupMsg, IMergeTreeOp, IMergeTreeRemoveMsg, IRelativePosition, ISegment, ISegmentAction, LocalReferencePosition, PropertySet, RangeStackMap, ReferencePosition, ReferenceType, MergeTreeRevertibleDriver, SlidingPreference } from "@fluidframework/merge-tree";
|
|
9
9
|
import { IFluidSerializer, SharedObject, ISharedObjectEvents, SummarySerializer } from "@fluidframework/shared-object-base";
|
|
10
|
-
import { IEventThisPlaceHolder } from "@fluidframework/
|
|
10
|
+
import { IEventThisPlaceHolder } from "@fluidframework/core-interfaces";
|
|
11
11
|
import { ISummaryTreeWithStats, ITelemetryContext } from "@fluidframework/runtime-definitions";
|
|
12
|
-
import {
|
|
12
|
+
import { SequenceInterval } from "./intervals";
|
|
13
|
+
import { IIntervalCollection } from "./intervalCollection";
|
|
13
14
|
import { SequenceDeltaEvent, SequenceMaintenanceEvent } from "./sequenceDeltaEvent";
|
|
14
15
|
import { ISharedIntervalCollection } from "./sharedIntervalCollection";
|
|
15
16
|
/**
|
|
@@ -55,6 +56,20 @@ export declare abstract class SharedSegmentSequence<T extends ISegment> extends
|
|
|
55
56
|
id: string;
|
|
56
57
|
readonly segmentFromSpec: (spec: IJSONSegment) => ISegment;
|
|
57
58
|
get loaded(): Promise<void>;
|
|
59
|
+
/**
|
|
60
|
+
* This is a safeguard to avoid problematic reentrancy of local ops. This type of scenario occurs if the user of SharedString subscribes
|
|
61
|
+
* to the `sequenceDelta` event and uses the callback for a local op to submit further local ops.
|
|
62
|
+
* Historically (before 2.0.0-internal.6.1.0), doing so would result in eventual consistency issues or a corrupted document.
|
|
63
|
+
* These issues were fixed in #16815 which makes such reentrancy no different from applying the ops in order but not from within the change events,
|
|
64
|
+
* but there is still little test coverage for reentrant scenarios.
|
|
65
|
+
* Additionally, applications submitting ops from inside change events need to take extreme care that their data models also support reentrancy.
|
|
66
|
+
* Since this is likely not the case, by default SharedString throws when encountering reentrant ops.
|
|
67
|
+
*
|
|
68
|
+
* An application using SharedString which explicitly wants to opt in to allowing reentrancy anyway can set `sharedStringPreventReentrancy`
|
|
69
|
+
* on the data store options to `false`.
|
|
70
|
+
* @internal
|
|
71
|
+
*/
|
|
72
|
+
protected guardReentrancy: <TRet>(callback: () => TRet) => TRet;
|
|
58
73
|
private static createOpsFromDelta;
|
|
59
74
|
protected client: Client;
|
|
60
75
|
/** `Deferred` that triggers once the object is loaded */
|
|
@@ -70,6 +85,9 @@ export declare abstract class SharedSegmentSequence<T extends ISegment> extends
|
|
|
70
85
|
* @param end - The exclusive end of the range to remove
|
|
71
86
|
*/
|
|
72
87
|
removeRange(start: number, end: number): IMergeTreeRemoveMsg;
|
|
88
|
+
/**
|
|
89
|
+
* @deprecated - The ability to create group ops will be removed in an upcoming release, as group ops are redundant with the native batching capabilities of the runtime
|
|
90
|
+
*/
|
|
73
91
|
groupOperation(groupOp: IMergeTreeGroupMsg): void;
|
|
74
92
|
/**
|
|
75
93
|
* Finds the segment information (i.e. segment + offset) corresponding to a character position in the SharedString.
|
|
@@ -137,6 +155,9 @@ export declare abstract class SharedSegmentSequence<T extends ISegment> extends
|
|
|
137
155
|
* @param remoteClientId - The client id of the remote client
|
|
138
156
|
*/
|
|
139
157
|
resolveRemoteClientPosition(remoteClientPosition: number, remoteClientRefSeq: number, remoteClientId: string): number | undefined;
|
|
158
|
+
/**
|
|
159
|
+
* @deprecated - This method will no longer be public in an upcoming release as it is not safe to use outside of this class
|
|
160
|
+
*/
|
|
140
161
|
submitSequenceMessage(message: IMergeTreeOp): void;
|
|
141
162
|
/**
|
|
142
163
|
* Given a position specified relative to a marker id, lookup the marker
|
|
@@ -158,9 +179,12 @@ export declare abstract class SharedSegmentSequence<T extends ISegment> extends
|
|
|
158
179
|
* @param splitRange - Optional. Splits boundary segments on the range boundaries
|
|
159
180
|
*/
|
|
160
181
|
walkSegments<TClientData>(handler: ISegmentAction<TClientData>, start?: number, end?: number, accum?: TClientData, splitRange?: boolean): void;
|
|
182
|
+
/**
|
|
183
|
+
* @deprecated - this functionality is no longer supported and will be removed
|
|
184
|
+
*/
|
|
161
185
|
getStackContext(startPos: number, rangeLabels: string[]): RangeStackMap;
|
|
162
186
|
/**
|
|
163
|
-
* @returns
|
|
187
|
+
* @returns The most recent sequence number which has been acked by the server and processed by this
|
|
164
188
|
* SharedSegmentSequence.
|
|
165
189
|
*/
|
|
166
190
|
getCurrentSeq(): number;
|
|
@@ -185,6 +209,7 @@ export declare abstract class SharedSegmentSequence<T extends ISegment> extends
|
|
|
185
209
|
* @returns An iterable object that enumerates the IntervalCollection labels.
|
|
186
210
|
*
|
|
187
211
|
* @example
|
|
212
|
+
*
|
|
188
213
|
* ```typescript
|
|
189
214
|
* const iter = this.getIntervalCollectionKeys();
|
|
190
215
|
* for (key of iter)
|
|
@@ -250,4 +275,8 @@ export declare abstract class SharedSegmentSequence<T extends ISegment> extends
|
|
|
250
275
|
private loadFinished;
|
|
251
276
|
private initializeIntervalCollections;
|
|
252
277
|
}
|
|
278
|
+
/**
|
|
279
|
+
* Resets the reentrancy log counter. Test-only API.
|
|
280
|
+
*/
|
|
281
|
+
export declare function resetReentrancyLogCounter(): void;
|
|
253
282
|
//# sourceMappingURL=sequence.d.ts.map
|
package/dist/sequence.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sequence.d.ts","sourceRoot":"","sources":["../src/sequence.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,
|
|
1
|
+
{"version":3,"file":"sequence.d.ts","sourceRoot":"","sources":["../src/sequence.ts"],"names":[],"mappings":"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"}
|