@fluidframework/sequence 2.0.0-internal.5.3.4 → 2.0.0-internal.5.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/CHANGELOG.md +38 -0
- package/dist/index.d.ts +4 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +12 -9
- package/dist/index.js.map +1 -1
- package/dist/intervalCollection.d.ts +46 -410
- package/dist/intervalCollection.d.ts.map +1 -1
- package/dist/intervalCollection.js +44 -732
- 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 +5 -0
- package/dist/intervalIndex/index.d.ts.map +1 -1
- package/dist/intervalIndex/index.js +9 -1
- package/dist/intervalIndex/index.js.map +1 -1
- 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 +23 -0
- package/dist/intervalIndex/intervalIndexUtils.js.map +1 -0
- package/dist/intervalIndex/overlappingIntervalsIndex.d.ts +2 -1
- package/dist/intervalIndex/overlappingIntervalsIndex.d.ts.map +1 -1
- package/dist/intervalIndex/overlappingIntervalsIndex.js +3 -3
- package/dist/intervalIndex/overlappingIntervalsIndex.js.map +1 -1
- package/dist/intervalIndex/overlappingSequenceIntervalsIndex.js +5 -5
- package/dist/intervalIndex/overlappingSequenceIntervalsIndex.js.map +1 -1
- package/dist/intervalIndex/sequenceIntervalIndexes.d.ts +1 -1
- package/dist/intervalIndex/sequenceIntervalIndexes.d.ts.map +1 -1
- package/dist/intervalIndex/sequenceIntervalIndexes.js.map +1 -1
- 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 +1 -47
- package/dist/intervalTree.d.ts.map +1 -1
- 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 +182 -0
- package/dist/intervals/interval.js.map +1 -0
- package/dist/intervals/intervalUtils.d.ts +194 -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 +315 -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 +36 -29
- package/dist/revertibles.js.map +1 -1
- package/dist/sequence.d.ts +2 -1
- package/dist/sequence.d.ts.map +1 -1
- package/dist/sequence.js +4 -1
- package/dist/sequence.js.map +1 -1
- package/dist/sharedIntervalCollection.d.ts +2 -1
- package/dist/sharedIntervalCollection.d.ts.map +1 -1
- package/dist/sharedIntervalCollection.js.map +1 -1
- package/lib/index.d.ts +4 -3
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +3 -2
- package/lib/index.js.map +1 -1
- package/lib/intervalCollection.d.ts +46 -410
- package/lib/intervalCollection.d.ts.map +1 -1
- package/lib/intervalCollection.js +25 -705
- 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 +5 -0
- package/lib/intervalIndex/index.d.ts.map +1 -1
- package/lib/intervalIndex/index.js +4 -0
- package/lib/intervalIndex/index.js.map +1 -1
- 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 +19 -0
- package/lib/intervalIndex/intervalIndexUtils.js.map +1 -0
- package/lib/intervalIndex/overlappingIntervalsIndex.d.ts +2 -1
- package/lib/intervalIndex/overlappingIntervalsIndex.d.ts.map +1 -1
- package/lib/intervalIndex/overlappingIntervalsIndex.js +1 -1
- package/lib/intervalIndex/overlappingIntervalsIndex.js.map +1 -1
- package/lib/intervalIndex/overlappingSequenceIntervalsIndex.js +1 -1
- package/lib/intervalIndex/overlappingSequenceIntervalsIndex.js.map +1 -1
- package/lib/intervalIndex/sequenceIntervalIndexes.d.ts +1 -1
- package/lib/intervalIndex/sequenceIntervalIndexes.d.ts.map +1 -1
- package/lib/intervalIndex/sequenceIntervalIndexes.js.map +1 -1
- 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 +1 -47
- package/lib/intervalTree.d.ts.map +1 -1
- 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 +177 -0
- package/lib/intervals/interval.js.map +1 -0
- package/lib/intervals/intervalUtils.d.ts +194 -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 +307 -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 +21 -14
- package/lib/revertibles.js.map +1 -1
- package/lib/sequence.d.ts +2 -1
- package/lib/sequence.d.ts.map +1 -1
- package/lib/sequence.js +5 -2
- package/lib/sequence.js.map +1 -1
- package/lib/sharedIntervalCollection.d.ts +2 -1
- package/lib/sharedIntervalCollection.d.ts.map +1 -1
- package/lib/sharedIntervalCollection.js.map +1 -1
- package/package.json +15 -15
- package/src/index.ts +19 -12
- package/src/intervalCollection.ts +75 -1204
- 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 +5 -0
- package/src/intervalIndex/intervalIndex.ts +31 -0
- package/src/intervalIndex/intervalIndexUtils.ts +27 -0
- package/src/intervalIndex/overlappingIntervalsIndex.ts +2 -6
- package/src/intervalIndex/overlappingSequenceIntervalsIndex.ts +1 -1
- package/src/intervalIndex/sequenceIntervalIndexes.ts +1 -1
- package/src/intervalIndex/startpointInRangeIndex.ts +109 -0
- package/src/intervalTree.ts +1 -54
- package/src/intervals/index.ts +25 -0
- package/src/intervals/interval.ts +230 -0
- package/src/intervals/intervalUtils.ts +249 -0
- package/src/intervals/sequenceInterval.ts +494 -0
- package/src/packageVersion.ts +1 -1
- package/src/revertibles.ts +23 -12
- package/src/sequence.ts +6 -3
- package/src/sharedIntervalCollection.ts +1 -2
|
@@ -0,0 +1,315 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/*!
|
|
3
|
+
* Copyright (c) Microsoft Corporation and contributors. All rights reserved.
|
|
4
|
+
* Licensed under the MIT License.
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.sequenceIntervalHelpers = exports.compareSequenceIntervalStarts = exports.compareSequenceIntervalEnds = exports.createSequenceInterval = exports.createPositionReferenceFromSegoff = exports.SequenceInterval = void 0;
|
|
8
|
+
/* eslint-disable no-bitwise */
|
|
9
|
+
const merge_tree_1 = require("@fluidframework/merge-tree");
|
|
10
|
+
const common_utils_1 = require("@fluidframework/common-utils");
|
|
11
|
+
const container_utils_1 = require("@fluidframework/container-utils");
|
|
12
|
+
const intervalUtils_1 = require("./intervalUtils");
|
|
13
|
+
const reservedIntervalIdKey = "intervalId";
|
|
14
|
+
/**
|
|
15
|
+
* Interval implementation whose ends are associated with positions in a mutatable sequence.
|
|
16
|
+
* As such, when content is inserted into the middle of the interval, the interval expands to
|
|
17
|
+
* include that content.
|
|
18
|
+
*
|
|
19
|
+
* @remarks - The endpoint's position should be treated exclusively to get reasonable behavior--i.e.
|
|
20
|
+
* an interval referring to "hello" in "hello world" should have a start position of 0 and an end
|
|
21
|
+
* position of 5.
|
|
22
|
+
*
|
|
23
|
+
* To see why, consider what happens if "llo wor" is removed from the string to make "held".
|
|
24
|
+
* The interval's startpoint remains on the "h" (it isn't altered), but the interval's endpoint
|
|
25
|
+
* slides forward to the next unremoved position, which is the "l" in "held".
|
|
26
|
+
* Users would generally expect the interval to now refer to "he" (as it is the subset of content
|
|
27
|
+
* remaining after the removal), hence the "l" should be excluded.
|
|
28
|
+
* If the interval endpoint was treated inclusively, the interval would now refer to "hel", which
|
|
29
|
+
* is undesirable.
|
|
30
|
+
*
|
|
31
|
+
* Since the end of an interval is treated exclusively but cannot be greater than or equal to the
|
|
32
|
+
* length of the associated sequence, application models which leverage interval collections should
|
|
33
|
+
* consider inserting a marker at the end of the sequence to represent the end of the content.
|
|
34
|
+
*/
|
|
35
|
+
class SequenceInterval {
|
|
36
|
+
constructor(client,
|
|
37
|
+
/**
|
|
38
|
+
* Start endpoint of this interval.
|
|
39
|
+
* @remarks - This endpoint can be resolved into a character position using the SharedString it's a part of.
|
|
40
|
+
*/
|
|
41
|
+
start,
|
|
42
|
+
/**
|
|
43
|
+
* End endpoint of this interval.
|
|
44
|
+
* @remarks - This endpoint can be resolved into a character position using the SharedString it's a part of.
|
|
45
|
+
*/
|
|
46
|
+
end, intervalType, props, stickiness = intervalUtils_1.IntervalStickiness.END) {
|
|
47
|
+
this.client = client;
|
|
48
|
+
this.start = start;
|
|
49
|
+
this.end = end;
|
|
50
|
+
this.intervalType = intervalType;
|
|
51
|
+
this.stickiness = stickiness;
|
|
52
|
+
this.propertyManager = new merge_tree_1.PropertiesManager();
|
|
53
|
+
this.properties = {};
|
|
54
|
+
if (props) {
|
|
55
|
+
this.addProperties(props);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Subscribes to position change events on this interval if there are no current listeners.
|
|
60
|
+
* @internal
|
|
61
|
+
*/
|
|
62
|
+
addPositionChangeListeners(beforePositionChange, afterPositionChange) {
|
|
63
|
+
var _a, _b;
|
|
64
|
+
var _c, _d;
|
|
65
|
+
if (this.callbacks === undefined) {
|
|
66
|
+
this.callbacks = {
|
|
67
|
+
beforePositionChange,
|
|
68
|
+
afterPositionChange,
|
|
69
|
+
};
|
|
70
|
+
const startCbs = ((_a = (_c = this.start).callbacks) !== null && _a !== void 0 ? _a : (_c.callbacks = {}));
|
|
71
|
+
const endCbs = ((_b = (_d = this.end).callbacks) !== null && _b !== void 0 ? _b : (_d.callbacks = {}));
|
|
72
|
+
startCbs.beforeSlide = endCbs.beforeSlide = beforePositionChange;
|
|
73
|
+
startCbs.afterSlide = endCbs.afterSlide = afterPositionChange;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Removes the currently subscribed position change listeners.
|
|
78
|
+
* @internal
|
|
79
|
+
*/
|
|
80
|
+
removePositionChangeListeners() {
|
|
81
|
+
if (this.callbacks) {
|
|
82
|
+
this.callbacks = undefined;
|
|
83
|
+
this.start.callbacks = undefined;
|
|
84
|
+
this.end.callbacks = undefined;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* {@inheritDoc ISerializableInterval.serialize}
|
|
89
|
+
* @internal
|
|
90
|
+
*/
|
|
91
|
+
serialize() {
|
|
92
|
+
const startPosition = this.client.localReferencePositionToPosition(this.start);
|
|
93
|
+
const endPosition = this.client.localReferencePositionToPosition(this.end);
|
|
94
|
+
const serializedInterval = {
|
|
95
|
+
end: endPosition,
|
|
96
|
+
intervalType: this.intervalType,
|
|
97
|
+
sequenceNumber: this.client.getCurrentSeq(),
|
|
98
|
+
start: startPosition,
|
|
99
|
+
};
|
|
100
|
+
if (this.properties) {
|
|
101
|
+
serializedInterval.properties = this.properties;
|
|
102
|
+
}
|
|
103
|
+
if (this.stickiness !== intervalUtils_1.IntervalStickiness.END) {
|
|
104
|
+
serializedInterval.stickiness = this.stickiness;
|
|
105
|
+
}
|
|
106
|
+
return serializedInterval;
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* {@inheritDoc IInterval.clone}
|
|
110
|
+
*/
|
|
111
|
+
clone() {
|
|
112
|
+
return new SequenceInterval(this.client, this.start, this.end, this.intervalType, this.properties, this.stickiness);
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* {@inheritDoc IInterval.compare}
|
|
116
|
+
*/
|
|
117
|
+
compare(b) {
|
|
118
|
+
const startResult = this.compareStart(b);
|
|
119
|
+
if (startResult === 0) {
|
|
120
|
+
const endResult = this.compareEnd(b);
|
|
121
|
+
if (endResult === 0) {
|
|
122
|
+
const thisId = this.getIntervalId();
|
|
123
|
+
if (thisId) {
|
|
124
|
+
const bId = b.getIntervalId();
|
|
125
|
+
if (bId) {
|
|
126
|
+
return thisId > bId ? 1 : thisId < bId ? -1 : 0;
|
|
127
|
+
}
|
|
128
|
+
return 0;
|
|
129
|
+
}
|
|
130
|
+
return 0;
|
|
131
|
+
}
|
|
132
|
+
else {
|
|
133
|
+
return endResult;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
else {
|
|
137
|
+
return startResult;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* {@inheritDoc IInterval.compareStart}
|
|
142
|
+
*/
|
|
143
|
+
compareStart(b) {
|
|
144
|
+
return (0, merge_tree_1.compareReferencePositions)(this.start, b.start);
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* {@inheritDoc IInterval.compareEnd}
|
|
148
|
+
*/
|
|
149
|
+
compareEnd(b) {
|
|
150
|
+
return (0, merge_tree_1.compareReferencePositions)(this.end, b.end);
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* {@inheritDoc IInterval.overlaps}
|
|
154
|
+
*/
|
|
155
|
+
overlaps(b) {
|
|
156
|
+
const result = (0, merge_tree_1.compareReferencePositions)(this.start, b.end) <= 0 &&
|
|
157
|
+
(0, merge_tree_1.compareReferencePositions)(this.end, b.start) >= 0;
|
|
158
|
+
return result;
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* {@inheritDoc ISerializableInterval.getIntervalId}
|
|
162
|
+
*/
|
|
163
|
+
getIntervalId() {
|
|
164
|
+
var _a;
|
|
165
|
+
const id = (_a = this.properties) === null || _a === void 0 ? void 0 : _a[reservedIntervalIdKey];
|
|
166
|
+
(0, common_utils_1.assert)(id !== undefined, 0x5e2 /* interval ID should not be undefined */);
|
|
167
|
+
return `${id}`;
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* {@inheritDoc IInterval.union}
|
|
171
|
+
* @deprecated - This API was never intended to be public and will be marked internal in a future release.
|
|
172
|
+
*/
|
|
173
|
+
union(b) {
|
|
174
|
+
return new SequenceInterval(this.client, (0, merge_tree_1.minReferencePosition)(this.start, b.start), (0, merge_tree_1.maxReferencePosition)(this.end, b.end), this.intervalType);
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* {@inheritDoc ISerializableInterval.addProperties}
|
|
178
|
+
* @deprecated - This API was never intended to be public and will be marked internal in a future release.
|
|
179
|
+
*/
|
|
180
|
+
addProperties(newProps, collab = false, seq, op) {
|
|
181
|
+
this.initializeProperties();
|
|
182
|
+
return this.propertyManager.addProperties(this.properties, newProps, op, seq, collab);
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* @returns whether this interval overlaps two numerical positions.
|
|
186
|
+
*/
|
|
187
|
+
overlapsPos(bstart, bend) {
|
|
188
|
+
const startPos = this.client.localReferencePositionToPosition(this.start);
|
|
189
|
+
const endPos = this.client.localReferencePositionToPosition(this.end);
|
|
190
|
+
return endPos > bstart && startPos < bend;
|
|
191
|
+
}
|
|
192
|
+
/**
|
|
193
|
+
* {@inheritDoc IInterval.modify}
|
|
194
|
+
* @deprecated - This API was never intended to be public and will be marked internal in a future release.
|
|
195
|
+
*/
|
|
196
|
+
modify(label, start, end, op, localSeq, stickiness = intervalUtils_1.IntervalStickiness.END) {
|
|
197
|
+
const getRefType = (baseType) => {
|
|
198
|
+
let refType = baseType;
|
|
199
|
+
if (op === undefined) {
|
|
200
|
+
refType &= ~merge_tree_1.ReferenceType.SlideOnRemove;
|
|
201
|
+
refType |= merge_tree_1.ReferenceType.StayOnRemove;
|
|
202
|
+
}
|
|
203
|
+
return refType;
|
|
204
|
+
};
|
|
205
|
+
let startRef = this.start;
|
|
206
|
+
if (start !== undefined) {
|
|
207
|
+
startRef = createPositionReference(this.client, start, getRefType(this.start.refType), op, undefined, localSeq, (0, intervalUtils_1.startReferenceSlidingPreference)(stickiness));
|
|
208
|
+
if (this.start.properties) {
|
|
209
|
+
startRef.addProperties(this.start.properties);
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
let endRef = this.end;
|
|
213
|
+
if (end !== undefined) {
|
|
214
|
+
endRef = createPositionReference(this.client, end, getRefType(this.end.refType), op, undefined, localSeq, (0, intervalUtils_1.endReferenceSlidingPreference)(stickiness));
|
|
215
|
+
if (this.end.properties) {
|
|
216
|
+
endRef.addProperties(this.end.properties);
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
const newInterval = new SequenceInterval(this.client, startRef, endRef, this.intervalType);
|
|
220
|
+
if (this.properties) {
|
|
221
|
+
newInterval.initializeProperties();
|
|
222
|
+
this.propertyManager.copyTo(this.properties, newInterval.properties, newInterval.propertyManager);
|
|
223
|
+
}
|
|
224
|
+
return newInterval;
|
|
225
|
+
}
|
|
226
|
+
initializeProperties() {
|
|
227
|
+
if (!this.propertyManager) {
|
|
228
|
+
this.propertyManager = new merge_tree_1.PropertiesManager();
|
|
229
|
+
}
|
|
230
|
+
if (!this.properties) {
|
|
231
|
+
this.properties = (0, merge_tree_1.createMap)();
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
exports.SequenceInterval = SequenceInterval;
|
|
236
|
+
function createPositionReferenceFromSegoff(client, segoff, refType, op, localSeq, fromSnapshot, slidingPreference) {
|
|
237
|
+
if (segoff.segment) {
|
|
238
|
+
const ref = client.createLocalReferencePosition(segoff.segment, segoff.offset, refType, undefined, slidingPreference);
|
|
239
|
+
return ref;
|
|
240
|
+
}
|
|
241
|
+
// Creating references on detached segments is allowed for:
|
|
242
|
+
// - Transient segments
|
|
243
|
+
// - References coming from a remote client (location may have been concurrently removed)
|
|
244
|
+
// - References being rebased to a new sequence number
|
|
245
|
+
// (segment they originally referred to may have been removed with no suitable replacement)
|
|
246
|
+
if (!op &&
|
|
247
|
+
!localSeq &&
|
|
248
|
+
!fromSnapshot &&
|
|
249
|
+
!(0, merge_tree_1.refTypeIncludesFlag)(refType, merge_tree_1.ReferenceType.Transient)) {
|
|
250
|
+
throw new container_utils_1.UsageError("Non-transient references need segment");
|
|
251
|
+
}
|
|
252
|
+
return (0, merge_tree_1.createDetachedLocalReferencePosition)(refType);
|
|
253
|
+
}
|
|
254
|
+
exports.createPositionReferenceFromSegoff = createPositionReferenceFromSegoff;
|
|
255
|
+
function createPositionReference(client, pos, refType, op, fromSnapshot, localSeq, slidingPreference) {
|
|
256
|
+
let segoff;
|
|
257
|
+
if (op) {
|
|
258
|
+
(0, common_utils_1.assert)((refType & merge_tree_1.ReferenceType.SlideOnRemove) !== 0, 0x2f5 /* op create references must be SlideOnRemove */);
|
|
259
|
+
segoff = client.getContainingSegment(pos, {
|
|
260
|
+
referenceSequenceNumber: op.referenceSequenceNumber,
|
|
261
|
+
clientId: op.clientId,
|
|
262
|
+
});
|
|
263
|
+
segoff = (0, merge_tree_1.getSlideToSegoff)(segoff);
|
|
264
|
+
}
|
|
265
|
+
else {
|
|
266
|
+
(0, common_utils_1.assert)((refType & merge_tree_1.ReferenceType.SlideOnRemove) === 0 || !!fromSnapshot, 0x2f6 /* SlideOnRemove references must be op created */);
|
|
267
|
+
segoff = client.getContainingSegment(pos, undefined, localSeq);
|
|
268
|
+
}
|
|
269
|
+
return createPositionReferenceFromSegoff(client, segoff, refType, op, localSeq, fromSnapshot, slidingPreference);
|
|
270
|
+
}
|
|
271
|
+
function createSequenceInterval(label, start, end, client, intervalType, op, fromSnapshot, stickiness = intervalUtils_1.IntervalStickiness.END) {
|
|
272
|
+
let beginRefType = merge_tree_1.ReferenceType.RangeBegin;
|
|
273
|
+
let endRefType = merge_tree_1.ReferenceType.RangeEnd;
|
|
274
|
+
if (intervalType === intervalUtils_1.IntervalType.Transient) {
|
|
275
|
+
beginRefType = merge_tree_1.ReferenceType.Transient;
|
|
276
|
+
endRefType = merge_tree_1.ReferenceType.Transient;
|
|
277
|
+
}
|
|
278
|
+
else {
|
|
279
|
+
if (intervalType === intervalUtils_1.IntervalType.Nest) {
|
|
280
|
+
beginRefType = merge_tree_1.ReferenceType.NestBegin;
|
|
281
|
+
endRefType = merge_tree_1.ReferenceType.NestEnd;
|
|
282
|
+
}
|
|
283
|
+
// All non-transient interval references must eventually be SlideOnRemove
|
|
284
|
+
// To ensure eventual consistency, they must start as StayOnRemove when
|
|
285
|
+
// pending (created locally and creation op is not acked)
|
|
286
|
+
if (op || fromSnapshot) {
|
|
287
|
+
beginRefType |= merge_tree_1.ReferenceType.SlideOnRemove;
|
|
288
|
+
endRefType |= merge_tree_1.ReferenceType.SlideOnRemove;
|
|
289
|
+
}
|
|
290
|
+
else {
|
|
291
|
+
beginRefType |= merge_tree_1.ReferenceType.StayOnRemove;
|
|
292
|
+
endRefType |= merge_tree_1.ReferenceType.StayOnRemove;
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
const startLref = createPositionReference(client, start, beginRefType, op, fromSnapshot, undefined, (0, intervalUtils_1.startReferenceSlidingPreference)(stickiness));
|
|
296
|
+
const endLref = createPositionReference(client, end, endRefType, op, fromSnapshot, undefined, (0, intervalUtils_1.endReferenceSlidingPreference)(stickiness));
|
|
297
|
+
const rangeProp = {
|
|
298
|
+
[merge_tree_1.reservedRangeLabelsKey]: [label],
|
|
299
|
+
};
|
|
300
|
+
startLref.addProperties(rangeProp);
|
|
301
|
+
endLref.addProperties(rangeProp);
|
|
302
|
+
const ival = new SequenceInterval(client, startLref, endLref, intervalType, rangeProp, stickiness);
|
|
303
|
+
return ival;
|
|
304
|
+
}
|
|
305
|
+
exports.createSequenceInterval = createSequenceInterval;
|
|
306
|
+
const compareSequenceIntervalEnds = (a, b) => (0, merge_tree_1.compareReferencePositions)(a.end, b.end);
|
|
307
|
+
exports.compareSequenceIntervalEnds = compareSequenceIntervalEnds;
|
|
308
|
+
const compareSequenceIntervalStarts = (a, b) => (0, merge_tree_1.compareReferencePositions)(a.start, b.start);
|
|
309
|
+
exports.compareSequenceIntervalStarts = compareSequenceIntervalStarts;
|
|
310
|
+
exports.sequenceIntervalHelpers = {
|
|
311
|
+
compareEnds: exports.compareSequenceIntervalEnds,
|
|
312
|
+
compareStarts: exports.compareSequenceIntervalStarts,
|
|
313
|
+
create: createSequenceInterval,
|
|
314
|
+
};
|
|
315
|
+
//# sourceMappingURL=sequenceInterval.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sequenceInterval.js","sourceRoot":"","sources":["../../src/intervals/sequenceInterval.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\n/* eslint-disable no-bitwise */\n\nimport {\n\tClient,\n\tICombiningOp,\n\tISegment,\n\tLocalReferencePosition,\n\tPropertiesManager,\n\tPropertySet,\n\tReferenceType,\n\tSlidingPreference,\n\tcompareReferencePositions,\n\tcreateDetachedLocalReferencePosition,\n\tcreateMap,\n\tgetSlideToSegoff,\n\tmaxReferencePosition,\n\tminReferencePosition,\n\trefTypeIncludesFlag,\n\treservedRangeLabelsKey,\n} from \"@fluidframework/merge-tree\";\nimport { assert } from \"@fluidframework/common-utils\";\nimport { ISequencedDocumentMessage } from \"@fluidframework/protocol-definitions\";\nimport { UsageError } from \"@fluidframework/container-utils\";\nimport {\n\tIIntervalHelpers,\n\tISerializableInterval,\n\tISerializedInterval,\n\tIntervalStickiness,\n\tIntervalType,\n\tendReferenceSlidingPreference,\n\tstartReferenceSlidingPreference,\n} from \"./intervalUtils\";\n\nconst reservedIntervalIdKey = \"intervalId\";\n\n/**\n * Interval implementation whose ends are associated with positions in a mutatable sequence.\n * As such, when content is inserted into the middle of the interval, the interval expands to\n * include that content.\n *\n * @remarks - The endpoint's position should be treated exclusively to get reasonable behavior--i.e.\n * an interval referring to \"hello\" in \"hello world\" should have a start position of 0 and an end\n * position of 5.\n *\n * To see why, consider what happens if \"llo wor\" is removed from the string to make \"held\".\n * The interval's startpoint remains on the \"h\" (it isn't altered), but the interval's endpoint\n * slides forward to the next unremoved position, which is the \"l\" in \"held\".\n * Users would generally expect the interval to now refer to \"he\" (as it is the subset of content\n * remaining after the removal), hence the \"l\" should be excluded.\n * If the interval endpoint was treated inclusively, the interval would now refer to \"hel\", which\n * is undesirable.\n *\n * Since the end of an interval is treated exclusively but cannot be greater than or equal to the\n * length of the associated sequence, application models which leverage interval collections should\n * consider inserting a marker at the end of the sequence to represent the end of the content.\n */\nexport class SequenceInterval implements ISerializableInterval {\n\t/**\n\t * {@inheritDoc ISerializableInterval.properties}\n\t */\n\tpublic properties: PropertySet;\n\t/**\n\t * {@inheritDoc ISerializableInterval.propertyManager}\n\t * @deprecated - This API was never intended to be public and will be marked internal in a future release.\n\t */\n\tpublic propertyManager: PropertiesManager;\n\n\tconstructor(\n\t\tprivate readonly client: Client,\n\t\t/**\n\t\t * Start endpoint of this interval.\n\t\t * @remarks - This endpoint can be resolved into a character position using the SharedString it's a part of.\n\t\t */\n\t\tpublic start: LocalReferencePosition,\n\t\t/**\n\t\t * End endpoint of this interval.\n\t\t * @remarks - This endpoint can be resolved into a character position using the SharedString it's a part of.\n\t\t */\n\t\tpublic end: LocalReferencePosition,\n\t\tpublic intervalType: IntervalType,\n\t\tprops?: PropertySet,\n\t\tpublic readonly stickiness: IntervalStickiness = IntervalStickiness.END,\n\t) {\n\t\tthis.propertyManager = new PropertiesManager();\n\t\tthis.properties = {};\n\n\t\tif (props) {\n\t\t\tthis.addProperties(props);\n\t\t}\n\t}\n\n\tprivate callbacks?: Record<\"beforePositionChange\" | \"afterPositionChange\", () => void>;\n\n\t/**\n\t * Subscribes to position change events on this interval if there are no current listeners.\n\t * @internal\n\t */\n\tpublic addPositionChangeListeners(\n\t\tbeforePositionChange: () => void,\n\t\tafterPositionChange: () => void,\n\t): void {\n\t\tif (this.callbacks === undefined) {\n\t\t\tthis.callbacks = {\n\t\t\t\tbeforePositionChange,\n\t\t\t\tafterPositionChange,\n\t\t\t};\n\n\t\t\tconst startCbs = (this.start.callbacks ??= {});\n\t\t\tconst endCbs = (this.end.callbacks ??= {});\n\t\t\tstartCbs.beforeSlide = endCbs.beforeSlide = beforePositionChange;\n\t\t\tstartCbs.afterSlide = endCbs.afterSlide = afterPositionChange;\n\t\t}\n\t}\n\n\t/**\n\t * Removes the currently subscribed position change listeners.\n\t * @internal\n\t */\n\tpublic removePositionChangeListeners(): void {\n\t\tif (this.callbacks) {\n\t\t\tthis.callbacks = undefined;\n\t\t\tthis.start.callbacks = undefined;\n\t\t\tthis.end.callbacks = undefined;\n\t\t}\n\t}\n\n\t/**\n\t * {@inheritDoc ISerializableInterval.serialize}\n\t * @internal\n\t */\n\tpublic serialize(): ISerializedInterval {\n\t\tconst startPosition = this.client.localReferencePositionToPosition(this.start);\n\t\tconst endPosition = this.client.localReferencePositionToPosition(this.end);\n\t\tconst serializedInterval: ISerializedInterval = {\n\t\t\tend: endPosition,\n\t\t\tintervalType: this.intervalType,\n\t\t\tsequenceNumber: this.client.getCurrentSeq(),\n\t\t\tstart: startPosition,\n\t\t};\n\n\t\tif (this.properties) {\n\t\t\tserializedInterval.properties = this.properties;\n\t\t}\n\t\tif (this.stickiness !== IntervalStickiness.END) {\n\t\t\tserializedInterval.stickiness = this.stickiness;\n\t\t}\n\n\t\treturn serializedInterval;\n\t}\n\n\t/**\n\t * {@inheritDoc IInterval.clone}\n\t */\n\tpublic clone() {\n\t\treturn new SequenceInterval(\n\t\t\tthis.client,\n\t\t\tthis.start,\n\t\t\tthis.end,\n\t\t\tthis.intervalType,\n\t\t\tthis.properties,\n\t\t\tthis.stickiness,\n\t\t);\n\t}\n\n\t/**\n\t * {@inheritDoc IInterval.compare}\n\t */\n\tpublic compare(b: SequenceInterval) {\n\t\tconst startResult = this.compareStart(b);\n\t\tif (startResult === 0) {\n\t\t\tconst endResult = this.compareEnd(b);\n\t\t\tif (endResult === 0) {\n\t\t\t\tconst thisId = this.getIntervalId();\n\t\t\t\tif (thisId) {\n\t\t\t\t\tconst bId = b.getIntervalId();\n\t\t\t\t\tif (bId) {\n\t\t\t\t\t\treturn thisId > bId ? 1 : thisId < bId ? -1 : 0;\n\t\t\t\t\t}\n\t\t\t\t\treturn 0;\n\t\t\t\t}\n\t\t\t\treturn 0;\n\t\t\t} else {\n\t\t\t\treturn endResult;\n\t\t\t}\n\t\t} else {\n\t\t\treturn startResult;\n\t\t}\n\t}\n\n\t/**\n\t * {@inheritDoc IInterval.compareStart}\n\t */\n\tpublic compareStart(b: SequenceInterval) {\n\t\treturn compareReferencePositions(this.start, b.start);\n\t}\n\n\t/**\n\t * {@inheritDoc IInterval.compareEnd}\n\t */\n\tpublic compareEnd(b: SequenceInterval) {\n\t\treturn compareReferencePositions(this.end, b.end);\n\t}\n\n\t/**\n\t * {@inheritDoc IInterval.overlaps}\n\t */\n\tpublic overlaps(b: SequenceInterval) {\n\t\tconst result =\n\t\t\tcompareReferencePositions(this.start, b.end) <= 0 &&\n\t\t\tcompareReferencePositions(this.end, b.start) >= 0;\n\t\treturn result;\n\t}\n\n\t/**\n\t * {@inheritDoc ISerializableInterval.getIntervalId}\n\t */\n\tpublic getIntervalId(): string {\n\t\tconst id = this.properties?.[reservedIntervalIdKey];\n\t\tassert(id !== undefined, 0x5e2 /* interval ID should not be undefined */);\n\t\treturn `${id}`;\n\t}\n\n\t/**\n\t * {@inheritDoc IInterval.union}\n\t * @deprecated - This API was never intended to be public and will be marked internal in a future release.\n\t */\n\tpublic union(b: SequenceInterval) {\n\t\treturn new SequenceInterval(\n\t\t\tthis.client,\n\t\t\tminReferencePosition(this.start, b.start),\n\t\t\tmaxReferencePosition(this.end, b.end),\n\t\t\tthis.intervalType,\n\t\t);\n\t}\n\n\t/**\n\t * {@inheritDoc ISerializableInterval.addProperties}\n\t * @deprecated - This API was never intended to be public and will be marked internal in a future release.\n\t */\n\tpublic addProperties(\n\t\tnewProps: PropertySet,\n\t\tcollab: boolean = false,\n\t\tseq?: number,\n\t\top?: ICombiningOp,\n\t): PropertySet | undefined {\n\t\tthis.initializeProperties();\n\t\treturn this.propertyManager.addProperties(this.properties, newProps, op, seq, collab);\n\t}\n\n\t/**\n\t * @returns whether this interval overlaps two numerical positions.\n\t */\n\tpublic overlapsPos(bstart: number, bend: number) {\n\t\tconst startPos = this.client.localReferencePositionToPosition(this.start);\n\t\tconst endPos = this.client.localReferencePositionToPosition(this.end);\n\t\treturn endPos > bstart && startPos < bend;\n\t}\n\n\t/**\n\t * {@inheritDoc IInterval.modify}\n\t * @deprecated - This API was never intended to be public and will be marked internal in a future release.\n\t */\n\tpublic modify(\n\t\tlabel: string,\n\t\tstart: number,\n\t\tend: number,\n\t\top?: ISequencedDocumentMessage,\n\t\tlocalSeq?: number,\n\t\tstickiness: IntervalStickiness = IntervalStickiness.END,\n\t) {\n\t\tconst getRefType = (baseType: ReferenceType): ReferenceType => {\n\t\t\tlet refType = baseType;\n\t\t\tif (op === undefined) {\n\t\t\t\trefType &= ~ReferenceType.SlideOnRemove;\n\t\t\t\trefType |= ReferenceType.StayOnRemove;\n\t\t\t}\n\t\t\treturn refType;\n\t\t};\n\n\t\tlet startRef = this.start;\n\t\tif (start !== undefined) {\n\t\t\tstartRef = createPositionReference(\n\t\t\t\tthis.client,\n\t\t\t\tstart,\n\t\t\t\tgetRefType(this.start.refType),\n\t\t\t\top,\n\t\t\t\tundefined,\n\t\t\t\tlocalSeq,\n\t\t\t\tstartReferenceSlidingPreference(stickiness),\n\t\t\t);\n\t\t\tif (this.start.properties) {\n\t\t\t\tstartRef.addProperties(this.start.properties);\n\t\t\t}\n\t\t}\n\n\t\tlet endRef = this.end;\n\t\tif (end !== undefined) {\n\t\t\tendRef = createPositionReference(\n\t\t\t\tthis.client,\n\t\t\t\tend,\n\t\t\t\tgetRefType(this.end.refType),\n\t\t\t\top,\n\t\t\t\tundefined,\n\t\t\t\tlocalSeq,\n\t\t\t\tendReferenceSlidingPreference(stickiness),\n\t\t\t);\n\t\t\tif (this.end.properties) {\n\t\t\t\tendRef.addProperties(this.end.properties);\n\t\t\t}\n\t\t}\n\n\t\tconst newInterval = new SequenceInterval(this.client, startRef, endRef, this.intervalType);\n\t\tif (this.properties) {\n\t\t\tnewInterval.initializeProperties();\n\t\t\tthis.propertyManager.copyTo(\n\t\t\t\tthis.properties,\n\t\t\t\tnewInterval.properties,\n\t\t\t\tnewInterval.propertyManager,\n\t\t\t);\n\t\t}\n\t\treturn newInterval;\n\t}\n\n\tprivate initializeProperties(): void {\n\t\tif (!this.propertyManager) {\n\t\t\tthis.propertyManager = new PropertiesManager();\n\t\t}\n\t\tif (!this.properties) {\n\t\t\tthis.properties = createMap<any>();\n\t\t}\n\t}\n}\n\nexport function createPositionReferenceFromSegoff(\n\tclient: Client,\n\tsegoff: { segment: ISegment | undefined; offset: number | undefined },\n\trefType: ReferenceType,\n\top?: ISequencedDocumentMessage,\n\tlocalSeq?: number,\n\tfromSnapshot?: boolean,\n\tslidingPreference?: SlidingPreference,\n): LocalReferencePosition {\n\tif (segoff.segment) {\n\t\tconst ref = client.createLocalReferencePosition(\n\t\t\tsegoff.segment,\n\t\t\tsegoff.offset,\n\t\t\trefType,\n\t\t\tundefined,\n\t\t\tslidingPreference,\n\t\t);\n\t\treturn ref;\n\t}\n\n\t// Creating references on detached segments is allowed for:\n\t// - Transient segments\n\t// - References coming from a remote client (location may have been concurrently removed)\n\t// - References being rebased to a new sequence number\n\t// (segment they originally referred to may have been removed with no suitable replacement)\n\tif (\n\t\t!op &&\n\t\t!localSeq &&\n\t\t!fromSnapshot &&\n\t\t!refTypeIncludesFlag(refType, ReferenceType.Transient)\n\t) {\n\t\tthrow new UsageError(\"Non-transient references need segment\");\n\t}\n\n\treturn createDetachedLocalReferencePosition(refType);\n}\n\nfunction createPositionReference(\n\tclient: Client,\n\tpos: number,\n\trefType: ReferenceType,\n\top?: ISequencedDocumentMessage,\n\tfromSnapshot?: boolean,\n\tlocalSeq?: number,\n\tslidingPreference?: SlidingPreference,\n): LocalReferencePosition {\n\tlet segoff;\n\tif (op) {\n\t\tassert(\n\t\t\t(refType & ReferenceType.SlideOnRemove) !== 0,\n\t\t\t0x2f5 /* op create references must be SlideOnRemove */,\n\t\t);\n\t\tsegoff = client.getContainingSegment(pos, {\n\t\t\treferenceSequenceNumber: op.referenceSequenceNumber,\n\t\t\tclientId: op.clientId,\n\t\t});\n\t\tsegoff = getSlideToSegoff(segoff);\n\t} else {\n\t\tassert(\n\t\t\t(refType & ReferenceType.SlideOnRemove) === 0 || !!fromSnapshot,\n\t\t\t0x2f6 /* SlideOnRemove references must be op created */,\n\t\t);\n\t\tsegoff = client.getContainingSegment(pos, undefined, localSeq);\n\t}\n\n\treturn createPositionReferenceFromSegoff(\n\t\tclient,\n\t\tsegoff,\n\t\trefType,\n\t\top,\n\t\tlocalSeq,\n\t\tfromSnapshot,\n\t\tslidingPreference,\n\t);\n}\n\nexport function createSequenceInterval(\n\tlabel: string,\n\tstart: number,\n\tend: number,\n\tclient: Client,\n\tintervalType: IntervalType,\n\top?: ISequencedDocumentMessage,\n\tfromSnapshot?: boolean,\n\tstickiness: IntervalStickiness = IntervalStickiness.END,\n): SequenceInterval {\n\tlet beginRefType = ReferenceType.RangeBegin;\n\tlet endRefType = ReferenceType.RangeEnd;\n\tif (intervalType === IntervalType.Transient) {\n\t\tbeginRefType = ReferenceType.Transient;\n\t\tendRefType = ReferenceType.Transient;\n\t} else {\n\t\tif (intervalType === IntervalType.Nest) {\n\t\t\tbeginRefType = ReferenceType.NestBegin;\n\t\t\tendRefType = ReferenceType.NestEnd;\n\t\t}\n\t\t// All non-transient interval references must eventually be SlideOnRemove\n\t\t// To ensure eventual consistency, they must start as StayOnRemove when\n\t\t// pending (created locally and creation op is not acked)\n\t\tif (op || fromSnapshot) {\n\t\t\tbeginRefType |= ReferenceType.SlideOnRemove;\n\t\t\tendRefType |= ReferenceType.SlideOnRemove;\n\t\t} else {\n\t\t\tbeginRefType |= ReferenceType.StayOnRemove;\n\t\t\tendRefType |= ReferenceType.StayOnRemove;\n\t\t}\n\t}\n\n\tconst startLref = createPositionReference(\n\t\tclient,\n\t\tstart,\n\t\tbeginRefType,\n\t\top,\n\t\tfromSnapshot,\n\t\tundefined,\n\t\tstartReferenceSlidingPreference(stickiness),\n\t);\n\n\tconst endLref = createPositionReference(\n\t\tclient,\n\t\tend,\n\t\tendRefType,\n\t\top,\n\t\tfromSnapshot,\n\t\tundefined,\n\t\tendReferenceSlidingPreference(stickiness),\n\t);\n\n\tconst rangeProp = {\n\t\t[reservedRangeLabelsKey]: [label],\n\t};\n\tstartLref.addProperties(rangeProp);\n\tendLref.addProperties(rangeProp);\n\n\tconst ival = new SequenceInterval(\n\t\tclient,\n\t\tstartLref,\n\t\tendLref,\n\t\tintervalType,\n\t\trangeProp,\n\t\tstickiness,\n\t);\n\treturn ival;\n}\n\nexport const compareSequenceIntervalEnds = (a: SequenceInterval, b: SequenceInterval): number =>\n\tcompareReferencePositions(a.end, b.end);\n\nexport const compareSequenceIntervalStarts = (a: SequenceInterval, b: SequenceInterval): number =>\n\tcompareReferencePositions(a.start, b.start);\n\nexport const sequenceIntervalHelpers: IIntervalHelpers<SequenceInterval> = {\n\tcompareEnds: compareSequenceIntervalEnds,\n\tcompareStarts: compareSequenceIntervalStarts,\n\tcreate: createSequenceInterval,\n};\n"]}
|
package/dist/packageVersion.d.ts
CHANGED
|
@@ -5,5 +5,5 @@
|
|
|
5
5
|
* THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY
|
|
6
6
|
*/
|
|
7
7
|
export declare const pkgName = "@fluidframework/sequence";
|
|
8
|
-
export declare const pkgVersion = "2.0.0-internal.5.
|
|
8
|
+
export declare const pkgVersion = "2.0.0-internal.5.4.2";
|
|
9
9
|
//# sourceMappingURL=packageVersion.d.ts.map
|
package/dist/packageVersion.js
CHANGED
|
@@ -8,5 +8,5 @@
|
|
|
8
8
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
9
|
exports.pkgVersion = exports.pkgName = void 0;
|
|
10
10
|
exports.pkgName = "@fluidframework/sequence";
|
|
11
|
-
exports.pkgVersion = "2.0.0-internal.5.
|
|
11
|
+
exports.pkgVersion = "2.0.0-internal.5.4.2";
|
|
12
12
|
//# sourceMappingURL=packageVersion.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"packageVersion.js","sourceRoot":"","sources":["../src/packageVersion.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;AAEU,QAAA,OAAO,GAAG,0BAA0B,CAAC;AACrC,QAAA,UAAU,GAAG,sBAAsB,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n *\n * THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY\n */\n\nexport const pkgName = \"@fluidframework/sequence\";\nexport const pkgVersion = \"2.0.0-internal.5.
|
|
1
|
+
{"version":3,"file":"packageVersion.js","sourceRoot":"","sources":["../src/packageVersion.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;AAEU,QAAA,OAAO,GAAG,0BAA0B,CAAC;AACrC,QAAA,UAAU,GAAG,sBAAsB,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n *\n * THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY\n */\n\nexport const pkgName = \"@fluidframework/sequence\";\nexport const pkgVersion = \"2.0.0-internal.5.4.2\";\n"]}
|
package/dist/revertibles.d.ts
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
* Licensed under the MIT License.
|
|
4
4
|
*/
|
|
5
5
|
import { LocalReferencePosition, MergeTreeDeltaRevertible, PropertySet } from "@fluidframework/merge-tree";
|
|
6
|
-
import { IntervalOpType, SequenceInterval } from "./
|
|
6
|
+
import { IntervalOpType, SequenceInterval } from "./intervals";
|
|
7
7
|
import { SharedString } from "./sharedString";
|
|
8
8
|
import { SequenceDeltaEvent } from "./sequenceDeltaEvent";
|
|
9
9
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"revertibles.d.ts","sourceRoot":"","sources":["../src/revertibles.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,EAIN,sBAAsB,EAEtB,wBAAwB,EAExB,WAAW,EAMX,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"revertibles.d.ts","sourceRoot":"","sources":["../src/revertibles.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,EAIN,sBAAsB,EAEtB,wBAAwB,EAExB,WAAW,EAMX,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/D,OAAO,EAAE,YAAY,EAAuB,MAAM,gBAAgB,CAAC;AACnE,OAAO,EAAuB,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAE/E;;;;;;;GAOG;AACH,oBAAY,sBAAsB,GAAG,wBAAwB,GAAG,kBAAkB,CAAC;AAInF,aAAK,cAAc,GAAG,OAAO,cAAc,CAAC,MAAM,OAAO,cAAc,CAAC,CAAC;AAEzE;;;;;;;GAOG;AACH,oBAAY,kBAAkB,GAC3B;IACA,KAAK,EAAE,OAAO,cAAc,CAAC,MAAM,CAAC;IACpC,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,KAAK,EAAE,sBAAsB,CAAC;IAC9B,GAAG,EAAE,sBAAsB,CAAC;CAC3B,GACD;IACA,KAAK,EAAE,OAAO,cAAc,CAAC,GAAG,CAAC;IACjC,QAAQ,EAAE,gBAAgB,CAAC;CAC1B,GACD;IACA,KAAK,EAAE,OAAO,cAAc,CAAC,MAAM,CAAC;IACpC,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,KAAK,EAAE,sBAAsB,CAAC;IAC9B,GAAG,EAAE,sBAAsB,CAAC;CAC3B,GACD;IACA,KAAK,EAAE,OAAO,cAAc,CAAC,gBAAgB,CAAC;IAC9C,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,cAAc,EAAE,WAAW,CAAC;CAC3B,GACD;IACA,KAAK,EAAE,OAAO,cAAc,CAAC,eAAe,CAAC;IAC7C,SAAS,EAAE;QACV,UAAU,EAAE,MAAM,CAAC;QACnB,KAAK,EAAE,MAAM,CAAC;QACd,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,SAAS,CAAC,EAAE,MAAM,CAAC;KACnB,EAAE,CAAC;IAEJ,cAAc,EAAE;QACf,UAAU,EAAE,kBAAkB,CAAC;QAC/B,MAAM,EAAE,MAAM,CAAC;QACf,OAAO,EAAE,OAAO,CAAC;KACjB,EAAE,CAAC;IACJ,mBAAmB,EAAE,wBAAwB,CAAC;CAC7C,CAAC;AAaL;;;GAGG;AACH,wBAAgB,8BAA8B,CAC7C,QAAQ,EAAE,gBAAgB,EAC1B,WAAW,EAAE,sBAAsB,EAAE,4BAQrC;AAED;;;GAGG;AACH,wBAAgB,iCAAiC,CAChD,MAAM,EAAE,YAAY,EACpB,QAAQ,EAAE,gBAAgB,EAC1B,WAAW,EAAE,sBAAsB,EAAE,4BAqCrC;AAED;;;GAGG;AACH,wBAAgB,iCAAiC,CAChD,MAAM,EAAE,YAAY,EACpB,WAAW,EAAE,gBAAgB,EAC7B,gBAAgB,EAAE,gBAAgB,EAClC,WAAW,EAAE,sBAAsB,EAAE,4BAwCrC;AAED;;;GAGG;AACH,wBAAgB,0CAA0C,CACzD,QAAQ,EAAE,gBAAgB,EAC1B,MAAM,EAAE,WAAW,EACnB,WAAW,EAAE,sBAAsB,EAAE,4BASrC;AA2CD;;;;;;;;GAQG;AACH,wBAAgB,oCAAoC,CACnD,MAAM,EAAE,YAAY,EACpB,KAAK,EAAE,kBAAkB,EACzB,WAAW,EAAE,sBAAsB,EAAE,QAoFrC;AAED;;;GAGG;AACH,wBAAgB,8BAA8B,CAC7C,YAAY,EAAE,YAAY,EAC1B,WAAW,EAAE,sBAAsB,EAAE,QAUrC;AAqND;;;;;;;GAOG;AACH,wBAAgB,6BAA6B,CAC5C,YAAY,EAAE,YAAY,EAC1B,WAAW,EAAE,sBAAsB,EAAE,QA8BrC"}
|
package/dist/revertibles.js
CHANGED
|
@@ -19,7 +19,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
19
19
|
exports.revertSharedStringRevertibles = exports.discardSharedStringRevertibles = exports.appendSharedStringDeltaToRevertibles = exports.appendIntervalPropertyChangedToRevertibles = exports.appendChangeIntervalToRevertibles = exports.appendDeleteIntervalToRevertibles = exports.appendAddIntervalToRevertibles = void 0;
|
|
20
20
|
const common_utils_1 = require("@fluidframework/common-utils");
|
|
21
21
|
const merge_tree_1 = require("@fluidframework/merge-tree");
|
|
22
|
-
const
|
|
22
|
+
const intervals_1 = require("./intervals");
|
|
23
23
|
const idMap = new Map();
|
|
24
24
|
function getUpdatedIdFromInterval(interval) {
|
|
25
25
|
const maybeId = interval.getIntervalId();
|
|
@@ -35,7 +35,7 @@ function getUpdatedId(intervalId) {
|
|
|
35
35
|
*/
|
|
36
36
|
function appendAddIntervalToRevertibles(interval, revertibles) {
|
|
37
37
|
revertibles.push({
|
|
38
|
-
event:
|
|
38
|
+
event: intervals_1.IntervalOpType.ADD,
|
|
39
39
|
interval,
|
|
40
40
|
});
|
|
41
41
|
return revertibles;
|
|
@@ -57,7 +57,7 @@ function appendDeleteIntervalToRevertibles(string, interval, revertibles) {
|
|
|
57
57
|
const startRef = string.createLocalReferencePosition(startSeg, interval.start.getOffset(), startType, undefined, interval.start.slidingPreference);
|
|
58
58
|
const endRef = string.createLocalReferencePosition(endSeg, interval.end.getOffset(), endType, undefined, interval.end.slidingPreference);
|
|
59
59
|
const revertible = {
|
|
60
|
-
event:
|
|
60
|
+
event: intervals_1.IntervalOpType.DELETE,
|
|
61
61
|
interval,
|
|
62
62
|
start: startRef,
|
|
63
63
|
end: endRef,
|
|
@@ -87,7 +87,7 @@ function appendChangeIntervalToRevertibles(string, newInterval, previousInterval
|
|
|
87
87
|
const prevStartRef = string.createLocalReferencePosition(startSeg, previousInterval.start.getOffset(), startType, undefined, previousInterval.start.slidingPreference);
|
|
88
88
|
const prevEndRef = string.createLocalReferencePosition(endSeg, previousInterval.end.getOffset(), endType, undefined, previousInterval.end.slidingPreference);
|
|
89
89
|
const revertible = {
|
|
90
|
-
event:
|
|
90
|
+
event: intervals_1.IntervalOpType.CHANGE,
|
|
91
91
|
interval: newInterval,
|
|
92
92
|
start: prevStartRef,
|
|
93
93
|
end: prevEndRef,
|
|
@@ -104,7 +104,7 @@ exports.appendChangeIntervalToRevertibles = appendChangeIntervalToRevertibles;
|
|
|
104
104
|
*/
|
|
105
105
|
function appendIntervalPropertyChangedToRevertibles(interval, deltas, revertibles) {
|
|
106
106
|
revertibles.push({
|
|
107
|
-
event:
|
|
107
|
+
event: intervals_1.IntervalOpType.PROPERTY_CHANGED,
|
|
108
108
|
interval,
|
|
109
109
|
propertyDeltas: deltas,
|
|
110
110
|
});
|
|
@@ -115,14 +115,14 @@ function addIfIntervalEndpoint(ref, segmentLengths, startIntervals, endIntervals
|
|
|
115
115
|
var _a, _b;
|
|
116
116
|
if ((0, merge_tree_1.refTypeIncludesFlag)(ref.refType, merge_tree_1.ReferenceType.RangeBegin)) {
|
|
117
117
|
const interval = (_a = ref.properties) === null || _a === void 0 ? void 0 : _a.interval;
|
|
118
|
-
if (interval && interval instanceof
|
|
118
|
+
if (interval && interval instanceof intervals_1.SequenceInterval) {
|
|
119
119
|
startIntervals.push({ offset: segmentLengths + interval.start.getOffset(), interval });
|
|
120
120
|
return true;
|
|
121
121
|
}
|
|
122
122
|
}
|
|
123
123
|
else if ((0, merge_tree_1.refTypeIncludesFlag)(ref.refType, merge_tree_1.ReferenceType.RangeEnd)) {
|
|
124
124
|
const interval = (_b = ref.properties) === null || _b === void 0 ? void 0 : _b.interval;
|
|
125
|
-
if (interval && interval instanceof
|
|
125
|
+
if (interval && interval instanceof intervals_1.SequenceInterval) {
|
|
126
126
|
endIntervals.push({ offset: segmentLengths + interval.end.getOffset(), interval });
|
|
127
127
|
return true;
|
|
128
128
|
}
|
|
@@ -174,7 +174,7 @@ function appendSharedStringDeltaToRevertibles(string, delta, revertibles) {
|
|
|
174
174
|
(0, merge_tree_1.appendToMergeTreeDeltaRevertibles)(delta.deltaArgs, removeRevertibles);
|
|
175
175
|
(0, common_utils_1.assert)(removeRevertibles.length === 1, 0x6c4 /* Remove revertible should be a single delta */);
|
|
176
176
|
const revertible = {
|
|
177
|
-
event:
|
|
177
|
+
event: intervals_1.IntervalOpType.POSITION_REMOVE,
|
|
178
178
|
intervals: [],
|
|
179
179
|
revertibleRefs,
|
|
180
180
|
mergeTreeRevertible: removeRevertibles[0],
|
|
@@ -228,7 +228,7 @@ function discardSharedStringRevertibles(sharedString, revertibles) {
|
|
|
228
228
|
if ((0, merge_tree_1.isMergeTreeDeltaRevertible)(r)) {
|
|
229
229
|
(0, merge_tree_1.discardMergeTreeDeltaRevertible)([r]);
|
|
230
230
|
}
|
|
231
|
-
else if (r.event ===
|
|
231
|
+
else if (r.event === intervals_1.IntervalOpType.CHANGE || r.event === intervals_1.IntervalOpType.DELETE) {
|
|
232
232
|
sharedString.removeLocalReferencePosition(r.start);
|
|
233
233
|
sharedString.removeLocalReferencePosition(r.end);
|
|
234
234
|
}
|
|
@@ -266,15 +266,15 @@ function revertLocalDelete(string, revertible) {
|
|
|
266
266
|
const type = revertible.interval.intervalType;
|
|
267
267
|
// reusing the id causes eventual consistency bugs, so it is removed here and recreated in add
|
|
268
268
|
const _a = revertible.interval.properties, { intervalId } = _a, props = __rest(_a, ["intervalId"]);
|
|
269
|
-
if (
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
}
|
|
276
|
-
|
|
277
|
-
|
|
269
|
+
if (isValidRange(startSlidePos, endSlidePos, string)) {
|
|
270
|
+
const int = collection.add(startSlidePos, endSlidePos, type, props);
|
|
271
|
+
idMap.forEach((newId, oldId) => {
|
|
272
|
+
if (intervalId === newId) {
|
|
273
|
+
idMap.set(oldId, getUpdatedIdFromInterval(int));
|
|
274
|
+
}
|
|
275
|
+
});
|
|
276
|
+
idMap.set(intervalId, int.getIntervalId());
|
|
277
|
+
}
|
|
278
278
|
string.removeLocalReferencePosition(revertible.start);
|
|
279
279
|
string.removeLocalReferencePosition(revertible.end);
|
|
280
280
|
}
|
|
@@ -286,9 +286,9 @@ function revertLocalChange(string, revertible) {
|
|
|
286
286
|
const startSlidePos = getSlidePosition(string, revertible.start, start);
|
|
287
287
|
const end = string.localReferencePositionToPosition(revertible.end);
|
|
288
288
|
const endSlidePos = getSlidePosition(string, revertible.end, end);
|
|
289
|
-
if (
|
|
290
|
-
|
|
291
|
-
|
|
289
|
+
if (isValidRange(startSlidePos, endSlidePos, string)) {
|
|
290
|
+
collection.change(id, startSlidePos, endSlidePos);
|
|
291
|
+
}
|
|
292
292
|
string.removeLocalReferencePosition(revertible.start);
|
|
293
293
|
string.removeLocalReferencePosition(revertible.end);
|
|
294
294
|
}
|
|
@@ -347,15 +347,22 @@ function revertLocalSequenceRemove(sharedString, revertible) {
|
|
|
347
347
|
if (interval !== undefined) {
|
|
348
348
|
const newStart = newEndpointPosition(intervalInfo.startOffset, restoredRanges, sharedString);
|
|
349
349
|
const newEnd = newEndpointPosition(intervalInfo.endOffset, restoredRanges, sharedString);
|
|
350
|
-
|
|
350
|
+
// only move interval if start <= end
|
|
351
|
+
if ((newStart === undefined &&
|
|
352
|
+
newEnd !== undefined &&
|
|
353
|
+
sharedString.localReferencePositionToPosition(interval.start) <= newEnd) ||
|
|
354
|
+
(newEnd === undefined &&
|
|
355
|
+
newStart !== undefined &&
|
|
356
|
+
sharedString.localReferencePositionToPosition(interval.end) >= newStart) ||
|
|
357
|
+
(newStart !== undefined && newEnd !== undefined && newStart <= newEnd)) {
|
|
351
358
|
intervalCollection.change(intervalId, newStart, newEnd);
|
|
352
359
|
}
|
|
353
360
|
}
|
|
354
361
|
});
|
|
355
362
|
// fix up the local references used by delete and change revertibles
|
|
356
363
|
revertible.revertibleRefs.forEach((revertibleRef) => {
|
|
357
|
-
(0, common_utils_1.assert)(revertibleRef.revertible.event ===
|
|
358
|
-
revertibleRef.revertible.event ===
|
|
364
|
+
(0, common_utils_1.assert)(revertibleRef.revertible.event === intervals_1.IntervalOpType.CHANGE ||
|
|
365
|
+
revertibleRef.revertible.event === intervals_1.IntervalOpType.DELETE, 0x6c5 /* revertible is not delete or change */);
|
|
359
366
|
const pos = newPosition(revertibleRef.offset, restoredRanges);
|
|
360
367
|
if (pos !== undefined) {
|
|
361
368
|
if (revertibleRef.isStart) {
|
|
@@ -386,19 +393,19 @@ function revertSharedStringRevertibles(sharedString, revertibles) {
|
|
|
386
393
|
if ("event" in r) {
|
|
387
394
|
const event = r.event;
|
|
388
395
|
switch (event) {
|
|
389
|
-
case
|
|
396
|
+
case intervals_1.IntervalOpType.ADD:
|
|
390
397
|
revertLocalAdd(sharedString, r);
|
|
391
398
|
break;
|
|
392
|
-
case
|
|
399
|
+
case intervals_1.IntervalOpType.DELETE:
|
|
393
400
|
revertLocalDelete(sharedString, r);
|
|
394
401
|
break;
|
|
395
|
-
case
|
|
402
|
+
case intervals_1.IntervalOpType.CHANGE:
|
|
396
403
|
revertLocalChange(sharedString, r);
|
|
397
404
|
break;
|
|
398
|
-
case
|
|
405
|
+
case intervals_1.IntervalOpType.PROPERTY_CHANGED:
|
|
399
406
|
revertLocalPropertyChanged(sharedString, r);
|
|
400
407
|
break;
|
|
401
|
-
case
|
|
408
|
+
case intervals_1.IntervalOpType.POSITION_REMOVE:
|
|
402
409
|
revertLocalSequenceRemove(sharedString, r);
|
|
403
410
|
break;
|
|
404
411
|
default:
|