@fluidframework/merge-tree 2.0.0-internal.2.2.1 → 2.0.0-internal.2.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.eslintrc.js +1 -1
- package/dist/attributionCollection.d.ts +49 -14
- package/dist/attributionCollection.d.ts.map +1 -1
- package/dist/attributionCollection.js +16 -16
- package/dist/attributionCollection.js.map +1 -1
- package/dist/client.d.ts +1 -0
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +16 -26
- package/dist/client.js.map +1 -1
- package/dist/endOfTreeSegment.d.ts +3 -3
- package/dist/endOfTreeSegment.d.ts.map +1 -1
- package/dist/endOfTreeSegment.js +5 -4
- package/dist/endOfTreeSegment.js.map +1 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/mergeTree.d.ts +58 -4
- package/dist/mergeTree.d.ts.map +1 -1
- package/dist/mergeTree.js +39 -20
- package/dist/mergeTree.js.map +1 -1
- package/dist/mergeTreeDeltaCallback.d.ts.map +1 -1
- package/dist/mergeTreeDeltaCallback.js.map +1 -1
- package/dist/mergeTreeNodes.d.ts +48 -7
- package/dist/mergeTreeNodes.d.ts.map +1 -1
- package/dist/mergeTreeNodes.js +15 -4
- package/dist/mergeTreeNodes.js.map +1 -1
- package/dist/partialLengths.d.ts +6 -4
- package/dist/partialLengths.d.ts.map +1 -1
- package/dist/partialLengths.js +10 -14
- package/dist/partialLengths.js.map +1 -1
- package/dist/snapshotChunks.d.ts +3 -0
- package/dist/snapshotChunks.d.ts.map +1 -1
- package/dist/snapshotChunks.js +1 -0
- package/dist/snapshotChunks.js.map +1 -1
- package/dist/snapshotLoader.d.ts +1 -0
- package/dist/snapshotLoader.d.ts.map +1 -1
- package/dist/snapshotLoader.js +29 -8
- package/dist/snapshotLoader.js.map +1 -1
- package/dist/snapshotV1.d.ts +1 -0
- package/dist/snapshotV1.d.ts.map +1 -1
- package/dist/snapshotV1.js +21 -6
- package/dist/snapshotV1.js.map +1 -1
- package/dist/snapshotlegacy.d.ts +2 -3
- package/dist/snapshotlegacy.d.ts.map +1 -1
- package/dist/snapshotlegacy.js +16 -12
- package/dist/snapshotlegacy.js.map +1 -1
- package/lib/attributionCollection.d.ts +49 -14
- package/lib/attributionCollection.d.ts.map +1 -1
- package/lib/attributionCollection.js +16 -16
- package/lib/attributionCollection.js.map +1 -1
- package/lib/client.d.ts +1 -0
- package/lib/client.d.ts.map +1 -1
- package/lib/client.js +16 -26
- package/lib/client.js.map +1 -1
- package/lib/endOfTreeSegment.d.ts +3 -3
- package/lib/endOfTreeSegment.d.ts.map +1 -1
- package/lib/endOfTreeSegment.js +5 -4
- package/lib/endOfTreeSegment.js.map +1 -1
- package/lib/index.d.ts +3 -1
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js.map +1 -1
- package/lib/mergeTree.d.ts +58 -4
- package/lib/mergeTree.d.ts.map +1 -1
- package/lib/mergeTree.js +39 -20
- package/lib/mergeTree.js.map +1 -1
- package/lib/mergeTreeDeltaCallback.d.ts.map +1 -1
- package/lib/mergeTreeDeltaCallback.js.map +1 -1
- package/lib/mergeTreeNodes.d.ts +48 -7
- package/lib/mergeTreeNodes.d.ts.map +1 -1
- package/lib/mergeTreeNodes.js +15 -4
- package/lib/mergeTreeNodes.js.map +1 -1
- package/lib/partialLengths.d.ts +6 -4
- package/lib/partialLengths.d.ts.map +1 -1
- package/lib/partialLengths.js +9 -14
- package/lib/partialLengths.js.map +1 -1
- package/lib/snapshotChunks.d.ts +3 -0
- package/lib/snapshotChunks.d.ts.map +1 -1
- package/lib/snapshotChunks.js +1 -0
- package/lib/snapshotChunks.js.map +1 -1
- package/lib/snapshotLoader.d.ts +1 -0
- package/lib/snapshotLoader.d.ts.map +1 -1
- package/lib/snapshotLoader.js +29 -8
- package/lib/snapshotLoader.js.map +1 -1
- package/lib/snapshotV1.d.ts +1 -0
- package/lib/snapshotV1.d.ts.map +1 -1
- package/lib/snapshotV1.js +21 -6
- package/lib/snapshotV1.js.map +1 -1
- package/lib/snapshotlegacy.d.ts +2 -3
- package/lib/snapshotlegacy.d.ts.map +1 -1
- package/lib/snapshotlegacy.js +16 -12
- package/lib/snapshotlegacy.js.map +1 -1
- package/package.json +17 -15
- package/src/attributionCollection.ts +67 -33
- package/src/client.ts +53 -63
- package/src/endOfTreeSegment.ts +10 -8
- package/src/index.ts +6 -0
- package/src/mergeTree.ts +108 -25
- package/src/mergeTreeDeltaCallback.ts +0 -1
- package/src/mergeTreeNodes.ts +67 -9
- package/src/partialLengths.ts +11 -13
- package/src/snapshotChunks.ts +4 -0
- package/src/snapshotLoader.ts +34 -8
- package/src/snapshotV1.ts +27 -4
- package/src/snapshotlegacy.ts +22 -18
package/.eslintrc.js
CHANGED
|
@@ -2,31 +2,64 @@
|
|
|
2
2
|
* Copyright (c) Microsoft Corporation and contributors. All rights reserved.
|
|
3
3
|
* Licensed under the MIT License.
|
|
4
4
|
*/
|
|
5
|
-
import { ISegment
|
|
6
|
-
interface ISegment extends ISegmentCurrent {
|
|
7
|
-
attribution?: AttributionCollection<unknown>;
|
|
8
|
-
}
|
|
5
|
+
import { AttributionKey, ISegment } from "./mergeTreeNodes";
|
|
9
6
|
export interface SerializedAttributionCollection {
|
|
10
|
-
|
|
7
|
+
/**
|
|
8
|
+
* Parallel array with posBreakpoints which tracks the seq of insertion.
|
|
9
|
+
* Ex: if seqs is [45, 46] and posBreakpoints is [0, 3], the section of the string
|
|
10
|
+
* between offsets 0 and 3 was inserted at seq 45 and the section of the string between
|
|
11
|
+
* 3 and the length of the string was inserted at seq 46.
|
|
12
|
+
*/
|
|
13
|
+
seqs: number[];
|
|
11
14
|
posBreakpoints: number[];
|
|
12
15
|
length: number;
|
|
13
16
|
}
|
|
14
|
-
|
|
17
|
+
/**
|
|
18
|
+
* @alpha
|
|
19
|
+
*/
|
|
20
|
+
export interface IAttributionCollection<T> {
|
|
21
|
+
/**
|
|
22
|
+
* Retrieves the attribution key associated with the provided offset.
|
|
23
|
+
*/
|
|
24
|
+
getAtOffset(offset: number): T;
|
|
25
|
+
/**
|
|
26
|
+
* Total length of all attribution keys in this collection.
|
|
27
|
+
*/
|
|
28
|
+
readonly length: number;
|
|
29
|
+
/**
|
|
30
|
+
* Retrieve all key/offset pairs stored on this segment. Entries should be ordered by offset, such that
|
|
31
|
+
* the `i`th result's attribution key applies to offsets in the open range between the `i`th offset and the
|
|
32
|
+
* `i+1`th offset.
|
|
33
|
+
* The last entry's key applies to the open interval from the last entry's offset to this collection's length.
|
|
34
|
+
* @internal
|
|
35
|
+
*/
|
|
36
|
+
getAll(): Iterable<{
|
|
37
|
+
offset: number;
|
|
38
|
+
key: T;
|
|
39
|
+
}>;
|
|
40
|
+
/** @internal */
|
|
41
|
+
splitAt(pos: number): IAttributionCollection<T>;
|
|
42
|
+
/** @internal */
|
|
43
|
+
append(other: IAttributionCollection<T>): void;
|
|
44
|
+
/** @internal */
|
|
45
|
+
clone(): IAttributionCollection<T>;
|
|
46
|
+
}
|
|
47
|
+
export declare class AttributionCollection implements IAttributionCollection<AttributionKey> {
|
|
15
48
|
private _length;
|
|
16
49
|
private readonly entries;
|
|
17
|
-
constructor(baseEntry:
|
|
18
|
-
getAtOffset(offset: number):
|
|
50
|
+
constructor(baseEntry: number, _length: number);
|
|
51
|
+
getAtOffset(offset: number): AttributionKey;
|
|
19
52
|
get length(): number;
|
|
20
53
|
/**
|
|
21
54
|
* Splits this attribution collection into two with entries for [0, pos) and [pos, length).
|
|
22
55
|
*/
|
|
23
|
-
splitAt(pos: number): AttributionCollection
|
|
24
|
-
append(other: AttributionCollection
|
|
56
|
+
splitAt(pos: number): AttributionCollection;
|
|
57
|
+
append(other: AttributionCollection): void;
|
|
25
58
|
getAll(): {
|
|
26
59
|
offset: number;
|
|
27
|
-
key:
|
|
60
|
+
key: AttributionKey;
|
|
28
61
|
}[];
|
|
29
|
-
clone(): AttributionCollection
|
|
62
|
+
clone(): AttributionCollection;
|
|
30
63
|
/**
|
|
31
64
|
* Rehydrates attribution information from its serialized form into the provided iterable of consecutive segments.
|
|
32
65
|
*/
|
|
@@ -34,7 +67,9 @@ export declare class AttributionCollection<T> {
|
|
|
34
67
|
/**
|
|
35
68
|
* Condenses attribution information on consecutive segments into a `SerializedAttributionCollection`
|
|
36
69
|
*/
|
|
37
|
-
static serializeAttributionCollections(segments: Iterable<
|
|
70
|
+
static serializeAttributionCollections(segments: Iterable<{
|
|
71
|
+
attribution?: IAttributionCollection<AttributionKey>;
|
|
72
|
+
cachedLength: number;
|
|
73
|
+
}>): SerializedAttributionCollection;
|
|
38
74
|
}
|
|
39
|
-
export {};
|
|
40
75
|
//# sourceMappingURL=attributionCollection.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"attributionCollection.d.ts","sourceRoot":"","sources":["../src/attributionCollection.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,EAAkB,QAAQ,IAAI,
|
|
1
|
+
{"version":3,"file":"attributionCollection.d.ts","sourceRoot":"","sources":["../src/attributionCollection.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,EAAE,cAAc,EAAkB,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAE5E,MAAM,WAAW,+BAA+B;IAC5C;;;;;OAKG;IACH,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,cAAc,EAAE,MAAM,EAAE,CAAC;IAEzB,MAAM,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,sBAAsB,CAAC,CAAC;IACrC;;OAEG;IACH,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,CAAC,CAAC;IAE/B;;OAEG;IACH,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IAExB;;;;;;OAMG;IACH,MAAM,IAAI,QAAQ,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,CAAC,CAAC;KAAE,CAAC,CAAC;IAEhD,gBAAgB;IAChB,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,sBAAsB,CAAC,CAAC,CAAC,CAAC;IAEhD,gBAAgB;IAChB,MAAM,CAAC,KAAK,EAAE,sBAAsB,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;IAE/C,gBAAgB;IAChB,KAAK,IAAI,sBAAsB,CAAC,CAAC,CAAC,CAAC;CACtC;AAED,qBAAa,qBAAsB,YAAW,sBAAsB,CAAC,cAAc,CAAC;IAG1C,OAAO,CAAC,OAAO;IAFrD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAkE;gBAEvE,SAAS,EAAE,MAAM,EAAU,OAAO,EAAE,MAAM;IAItD,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,cAAc;IAOlD,IAAW,MAAM,IAAI,MAAM,CAE1B;IAED;;OAEG;IACI,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,qBAAqB;IAc3C,MAAM,CAAC,KAAK,EAAE,qBAAqB,GAAG,IAAI;IAW1C,MAAM,IAAI;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,cAAc,CAAC;KAAE,EAAE;IASpD,KAAK,IAAI,qBAAqB;IASrC;;OAEG;WACW,8BAA8B,CACxC,QAAQ,EAAE,QAAQ,CAAC,QAAQ,CAAC,EAC5B,OAAO,EAAE,+BAA+B,GACzC,IAAI;IAsBP;;OAEG;WACW,+BAA+B,CACzC,QAAQ,EAAE,QAAQ,CAAC;QAAE,WAAW,CAAC,EAAE,sBAAsB,CAAC,cAAc,CAAC,CAAC;QAAC,YAAY,EAAE,MAAM,CAAC;KAAE,CAAC,GACpG,+BAA+B;CA+BrC"}
|
|
@@ -18,7 +18,7 @@ class AttributionCollection {
|
|
|
18
18
|
(0, common_utils_1.assert)(offset >= 0 && offset < this._length, 0x443 /* Requested offset should be valid */);
|
|
19
19
|
const node = this.entries.floor(offset);
|
|
20
20
|
(0, common_utils_1.assert)(node !== undefined, 0x444 /* Collection should have at least one entry */);
|
|
21
|
-
return node.data;
|
|
21
|
+
return { type: "op", seq: node.data };
|
|
22
22
|
}
|
|
23
23
|
get length() {
|
|
24
24
|
return this._length;
|
|
@@ -28,7 +28,7 @@ class AttributionCollection {
|
|
|
28
28
|
*/
|
|
29
29
|
splitAt(pos) {
|
|
30
30
|
const splitBaseEntry = this.getAtOffset(pos);
|
|
31
|
-
const splitCollection = new AttributionCollection(splitBaseEntry, this.length - pos);
|
|
31
|
+
const splitCollection = new AttributionCollection(splitBaseEntry.seq, this.length - pos);
|
|
32
32
|
for (let current = this.entries.ceil(pos); current !== undefined; current = this.entries.ceil(pos)) {
|
|
33
33
|
// If there happened to be an attribution change at exactly pos, it's already set in the base entry
|
|
34
34
|
if (current.key !== pos) {
|
|
@@ -40,7 +40,7 @@ class AttributionCollection {
|
|
|
40
40
|
return splitCollection;
|
|
41
41
|
}
|
|
42
42
|
append(other) {
|
|
43
|
-
const lastEntry = this.getAtOffset(this.length - 1);
|
|
43
|
+
const lastEntry = this.getAtOffset(this.length - 1).seq;
|
|
44
44
|
other.entries.map(({ key, data }) => {
|
|
45
45
|
if (key !== 0 || lastEntry !== data) {
|
|
46
46
|
this.entries.put(key + this.length, data);
|
|
@@ -52,13 +52,13 @@ class AttributionCollection {
|
|
|
52
52
|
getAll() {
|
|
53
53
|
const results = [];
|
|
54
54
|
this.entries.map(({ key, data }) => {
|
|
55
|
-
results.push({ offset: key, key: data });
|
|
55
|
+
results.push({ offset: key, key: { type: "op", seq: data } });
|
|
56
56
|
return true;
|
|
57
57
|
});
|
|
58
58
|
return results;
|
|
59
59
|
}
|
|
60
60
|
clone() {
|
|
61
|
-
const copy = new AttributionCollection(this.getAtOffset(0), this.length);
|
|
61
|
+
const copy = new AttributionCollection(this.getAtOffset(0).seq, this.length);
|
|
62
62
|
this.entries.map(({ key, data }) => {
|
|
63
63
|
copy.entries.put(key, data);
|
|
64
64
|
return true;
|
|
@@ -69,15 +69,15 @@ class AttributionCollection {
|
|
|
69
69
|
* Rehydrates attribution information from its serialized form into the provided iterable of consecutive segments.
|
|
70
70
|
*/
|
|
71
71
|
static populateAttributionCollections(segments, summary) {
|
|
72
|
-
const {
|
|
73
|
-
(0, common_utils_1.assert)(
|
|
72
|
+
const { seqs, posBreakpoints } = summary;
|
|
73
|
+
(0, common_utils_1.assert)(seqs.length === posBreakpoints.length && seqs.length > 0, 0x445 /* Invalid attribution summary blob provided */);
|
|
74
74
|
let curIndex = 0;
|
|
75
75
|
let cumulativeSegPos = 0;
|
|
76
|
-
let currentInfo =
|
|
76
|
+
let currentInfo = seqs[curIndex];
|
|
77
77
|
for (const segment of segments) {
|
|
78
78
|
const attribution = new AttributionCollection(currentInfo, segment.cachedLength);
|
|
79
79
|
while (posBreakpoints[curIndex] < cumulativeSegPos + segment.cachedLength) {
|
|
80
|
-
currentInfo =
|
|
80
|
+
currentInfo = seqs[curIndex];
|
|
81
81
|
attribution.entries.put(posBreakpoints[curIndex] - cumulativeSegPos, currentInfo);
|
|
82
82
|
curIndex++;
|
|
83
83
|
}
|
|
@@ -89,9 +89,9 @@ class AttributionCollection {
|
|
|
89
89
|
* Condenses attribution information on consecutive segments into a `SerializedAttributionCollection`
|
|
90
90
|
*/
|
|
91
91
|
static serializeAttributionCollections(segments) {
|
|
92
|
-
var _a;
|
|
92
|
+
var _a, _b;
|
|
93
93
|
const posBreakpoints = [];
|
|
94
|
-
const
|
|
94
|
+
const seqs = [];
|
|
95
95
|
let mostRecentAttributionKey;
|
|
96
96
|
let cumulativePos = 0;
|
|
97
97
|
let segmentsWithAttribution = 0;
|
|
@@ -99,12 +99,12 @@ class AttributionCollection {
|
|
|
99
99
|
for (const segment of segments) {
|
|
100
100
|
if (segment.attribution) {
|
|
101
101
|
segmentsWithAttribution++;
|
|
102
|
-
for (const { offset, key: info } of (_a = segment.attribution.getAll()) !== null &&
|
|
103
|
-
if (info !== mostRecentAttributionKey) {
|
|
102
|
+
for (const { offset, key: info } of (_b = (_a = segment.attribution) === null || _a === void 0 ? void 0 : _a.getAll()) !== null && _b !== void 0 ? _b : []) {
|
|
103
|
+
if (info.seq !== mostRecentAttributionKey) {
|
|
104
104
|
posBreakpoints.push(offset + cumulativePos);
|
|
105
|
-
|
|
105
|
+
seqs.push(info.seq);
|
|
106
106
|
}
|
|
107
|
-
mostRecentAttributionKey = info;
|
|
107
|
+
mostRecentAttributionKey = info.seq;
|
|
108
108
|
}
|
|
109
109
|
}
|
|
110
110
|
else {
|
|
@@ -113,7 +113,7 @@ class AttributionCollection {
|
|
|
113
113
|
cumulativePos += segment.cachedLength;
|
|
114
114
|
}
|
|
115
115
|
(0, common_utils_1.assert)(segmentsWithAttribution === 0 || segmentsWithoutAttribution === 0, 0x446 /* Expected either all segments or no segments to have attribution information. */);
|
|
116
|
-
const blobContents = {
|
|
116
|
+
const blobContents = { seqs, posBreakpoints, length: cumulativePos };
|
|
117
117
|
return blobContents;
|
|
118
118
|
}
|
|
119
119
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"attributionCollection.js","sourceRoot":"","sources":["../src/attributionCollection.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\nimport { assert } from \"@fluidframework/common-utils\";\nimport { RedBlackTree } from \"./collections\";\nimport { compareNumbers, ISegment as ISegmentCurrent } from \"./mergeTreeNodes\";\n\n// TODO: Once integrated into merge-tree, this interface can be removed\ninterface ISegment extends ISegmentCurrent {\n attribution?: AttributionCollection<unknown>;\n}\n\nexport interface SerializedAttributionCollection {\n keys: unknown[];\n posBreakpoints: number[];\n /* Total length; only necessary for validation */\n length: number;\n}\n\nexport class AttributionCollection<T> {\n private readonly entries: RedBlackTree<number, T> = new RedBlackTree(compareNumbers);\n\n public constructor(baseEntry: T, private _length: number) {\n this.entries.put(0, baseEntry);\n }\n\n public getAtOffset(offset: number): T {\n assert(offset >= 0 && offset < this._length, 0x443 /* Requested offset should be valid */);\n const node = this.entries.floor(offset);\n assert(node !== undefined, 0x444 /* Collection should have at least one entry */);\n return node.data;\n }\n\n public get length(): number {\n return this._length;\n }\n\n /**\n * Splits this attribution collection into two with entries for [0, pos) and [pos, length).\n */\n public splitAt(pos: number): AttributionCollection<T> {\n const splitBaseEntry = this.getAtOffset(pos);\n const splitCollection = new AttributionCollection(splitBaseEntry, this.length - pos);\n for (let current = this.entries.ceil(pos); current !== undefined; current = this.entries.ceil(pos)) {\n // If there happened to be an attribution change at exactly pos, it's already set in the base entry\n if (current.key !== pos) {\n splitCollection.entries.put(current.key - pos, current.data);\n }\n this.entries.remove(current.key);\n }\n this._length = pos;\n return splitCollection;\n }\n\n public append(other: AttributionCollection<T>): void {\n const lastEntry = this.getAtOffset(this.length - 1);\n other.entries.map(({ key, data }) => {\n if (key !== 0 || lastEntry !== data) {\n this.entries.put(key + this.length, data);\n }\n return true;\n });\n this._length += other.length;\n }\n\n public getAll(): { offset: number; key: T; }[] {\n const results: { offset: number; key: T; }[] = [];\n this.entries.map(({ key, data }) => {\n results.push({ offset: key, key: data });\n return true;\n });\n return results;\n }\n\n public clone(): AttributionCollection<T> {\n const copy = new AttributionCollection(this.getAtOffset(0), this.length);\n this.entries.map(({ key, data }) => {\n copy.entries.put(key, data);\n return true;\n });\n return copy;\n }\n\n /**\n * Rehydrates attribution information from its serialized form into the provided iterable of consecutive segments.\n */\n public static populateAttributionCollections(\n segments: Iterable<ISegment>,\n summary: SerializedAttributionCollection,\n ): void {\n const { keys, posBreakpoints } = summary;\n assert(\n keys.length === posBreakpoints.length && keys.length > 0,\n 0x445 /* Invalid attribution summary blob provided */);\n let curIndex = 0;\n let cumulativeSegPos = 0;\n let currentInfo = keys[curIndex];\n\n for (const segment of segments) {\n const attribution = new AttributionCollection(currentInfo, segment.cachedLength);\n while (posBreakpoints[curIndex] < cumulativeSegPos + segment.cachedLength) {\n currentInfo = keys[curIndex];\n attribution.entries.put(posBreakpoints[curIndex] - cumulativeSegPos, currentInfo);\n curIndex++;\n }\n\n segment.attribution = attribution;\n cumulativeSegPos += segment.cachedLength;\n }\n }\n\n /**\n * Condenses attribution information on consecutive segments into a `SerializedAttributionCollection`\n */\n public static serializeAttributionCollections(\n segments: Iterable<ISegment>,\n ): SerializedAttributionCollection {\n const posBreakpoints: number[] = [];\n const keys: unknown[] = [];\n let mostRecentAttributionKey: unknown | undefined;\n let cumulativePos = 0;\n\n let segmentsWithAttribution = 0;\n let segmentsWithoutAttribution = 0;\n for (const segment of segments) {\n if (segment.attribution) {\n segmentsWithAttribution++;\n for (const { offset, key: info } of segment.attribution.getAll() ?? []) {\n if (info !== mostRecentAttributionKey) {\n posBreakpoints.push(offset + cumulativePos);\n keys.push(info);\n }\n mostRecentAttributionKey = info;\n }\n } else {\n segmentsWithoutAttribution++;\n }\n\n cumulativePos += segment.cachedLength;\n }\n\n assert(segmentsWithAttribution === 0 || segmentsWithoutAttribution === 0,\n 0x446 /* Expected either all segments or no segments to have attribution information. */);\n\n const blobContents: SerializedAttributionCollection = { keys, posBreakpoints, length: cumulativePos };\n return blobContents;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"attributionCollection.js","sourceRoot":"","sources":["../src/attributionCollection.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\nimport { assert } from \"@fluidframework/common-utils\";\nimport { RedBlackTree } from \"./collections\";\nimport { AttributionKey, compareNumbers, ISegment } from \"./mergeTreeNodes\";\n\nexport interface SerializedAttributionCollection {\n /**\n * Parallel array with posBreakpoints which tracks the seq of insertion.\n * Ex: if seqs is [45, 46] and posBreakpoints is [0, 3], the section of the string\n * between offsets 0 and 3 was inserted at seq 45 and the section of the string between\n * 3 and the length of the string was inserted at seq 46.\n */\n seqs: number[];\n posBreakpoints: number[];\n /* Total length; only necessary for validation */\n length: number;\n}\n\n/**\n * @alpha\n */\nexport interface IAttributionCollection<T> {\n /**\n * Retrieves the attribution key associated with the provided offset.\n */\n getAtOffset(offset: number): T;\n\n /**\n * Total length of all attribution keys in this collection.\n */\n readonly length: number;\n\n /**\n * Retrieve all key/offset pairs stored on this segment. Entries should be ordered by offset, such that\n * the `i`th result's attribution key applies to offsets in the open range between the `i`th offset and the\n * `i+1`th offset.\n * The last entry's key applies to the open interval from the last entry's offset to this collection's length.\n * @internal\n */\n getAll(): Iterable<{ offset: number; key: T; }>;\n\n /** @internal */\n splitAt(pos: number): IAttributionCollection<T>;\n\n /** @internal */\n append(other: IAttributionCollection<T>): void;\n\n /** @internal */\n clone(): IAttributionCollection<T>;\n}\n\nexport class AttributionCollection implements IAttributionCollection<AttributionKey> {\n private readonly entries: RedBlackTree<number, number> = new RedBlackTree(compareNumbers);\n\n public constructor(baseEntry: number, private _length: number) {\n this.entries.put(0, baseEntry);\n }\n\n public getAtOffset(offset: number): AttributionKey {\n assert(offset >= 0 && offset < this._length, 0x443 /* Requested offset should be valid */);\n const node = this.entries.floor(offset);\n assert(node !== undefined, 0x444 /* Collection should have at least one entry */);\n return { type: \"op\", seq: node.data };\n }\n\n public get length(): number {\n return this._length;\n }\n\n /**\n * Splits this attribution collection into two with entries for [0, pos) and [pos, length).\n */\n public splitAt(pos: number): AttributionCollection {\n const splitBaseEntry = this.getAtOffset(pos);\n const splitCollection = new AttributionCollection(splitBaseEntry.seq, this.length - pos);\n for (let current = this.entries.ceil(pos); current !== undefined; current = this.entries.ceil(pos)) {\n // If there happened to be an attribution change at exactly pos, it's already set in the base entry\n if (current.key !== pos) {\n splitCollection.entries.put(current.key - pos, current.data);\n }\n this.entries.remove(current.key);\n }\n this._length = pos;\n return splitCollection;\n }\n\n public append(other: AttributionCollection): void {\n const lastEntry = this.getAtOffset(this.length - 1).seq;\n other.entries.map(({ key, data }) => {\n if (key !== 0 || lastEntry !== data) {\n this.entries.put(key + this.length, data);\n }\n return true;\n });\n this._length += other.length;\n }\n\n public getAll(): { offset: number; key: AttributionKey; }[] {\n const results: { offset: number; key: AttributionKey; }[] = [];\n this.entries.map(({ key, data }) => {\n results.push({ offset: key, key: { type: \"op\", seq: data } });\n return true;\n });\n return results;\n }\n\n public clone(): AttributionCollection {\n const copy = new AttributionCollection(this.getAtOffset(0).seq, this.length);\n this.entries.map(({ key, data }) => {\n copy.entries.put(key, data);\n return true;\n });\n return copy;\n }\n\n /**\n * Rehydrates attribution information from its serialized form into the provided iterable of consecutive segments.\n */\n public static populateAttributionCollections(\n segments: Iterable<ISegment>,\n summary: SerializedAttributionCollection,\n ): void {\n const { seqs, posBreakpoints } = summary;\n assert(\n seqs.length === posBreakpoints.length && seqs.length > 0,\n 0x445 /* Invalid attribution summary blob provided */);\n let curIndex = 0;\n let cumulativeSegPos = 0;\n let currentInfo = seqs[curIndex];\n\n for (const segment of segments) {\n const attribution = new AttributionCollection(currentInfo, segment.cachedLength);\n while (posBreakpoints[curIndex] < cumulativeSegPos + segment.cachedLength) {\n currentInfo = seqs[curIndex];\n attribution.entries.put(posBreakpoints[curIndex] - cumulativeSegPos, currentInfo);\n curIndex++;\n }\n\n segment.attribution = attribution;\n cumulativeSegPos += segment.cachedLength;\n }\n }\n\n /**\n * Condenses attribution information on consecutive segments into a `SerializedAttributionCollection`\n */\n public static serializeAttributionCollections(\n segments: Iterable<{ attribution?: IAttributionCollection<AttributionKey>; cachedLength: number; }>,\n ): SerializedAttributionCollection {\n const posBreakpoints: number[] = [];\n const seqs: number[] = [];\n let mostRecentAttributionKey: number | undefined;\n let cumulativePos = 0;\n\n let segmentsWithAttribution = 0;\n let segmentsWithoutAttribution = 0;\n for (const segment of segments) {\n if (segment.attribution) {\n segmentsWithAttribution++;\n for (const { offset, key: info } of segment.attribution?.getAll() ?? []) {\n if (info.seq !== mostRecentAttributionKey) {\n posBreakpoints.push(offset + cumulativePos);\n seqs.push(info.seq);\n }\n mostRecentAttributionKey = info.seq;\n }\n } else {\n segmentsWithoutAttribution++;\n }\n\n cumulativePos += segment.cachedLength;\n }\n\n assert(segmentsWithAttribution === 0 || segmentsWithoutAttribution === 0,\n 0x446 /* Expected either all segments or no segments to have attribution information. */);\n\n const blobContents: SerializedAttributionCollection = { seqs, posBreakpoints, length: cumulativePos };\n return blobContents;\n }\n}\n"]}
|
package/dist/client.d.ts
CHANGED
|
@@ -87,6 +87,7 @@ export declare class Client {
|
|
|
87
87
|
* @param segment - The segment to insert
|
|
88
88
|
*/
|
|
89
89
|
insertAtReferencePositionLocal(refPos: ReferencePosition, segment: ISegment): IMergeTreeInsertMsg | undefined;
|
|
90
|
+
private traceOp;
|
|
90
91
|
walkSegments<TClientData>(handler: ISegmentAction<TClientData>, start: number | undefined, end: number | undefined, accum: TClientData, splitRange?: boolean): void;
|
|
91
92
|
walkSegments<undefined>(handler: ISegmentAction<undefined>, start?: number, end?: number, accum?: undefined, splitRange?: boolean): void;
|
|
92
93
|
protected walkAllSegments<TClientData>(action: (segment: ISegment, accum?: TClientData) => boolean, accum?: TClientData): boolean;
|
package/dist/client.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|
package/dist/client.js
CHANGED
|
@@ -158,13 +158,16 @@ class Client {
|
|
|
158
158
|
}
|
|
159
159
|
const op = (0, opBuilder_1.createInsertSegmentOp)(pos, segment);
|
|
160
160
|
const opArgs = { op };
|
|
161
|
+
this.traceOp(opArgs, () => this._mergeTree.insertAtReferencePosition(refPos, segment, opArgs));
|
|
162
|
+
return op;
|
|
163
|
+
}
|
|
164
|
+
traceOp(opArgs, applyOp) {
|
|
161
165
|
let traceStart;
|
|
162
166
|
if (this.measureOps) {
|
|
163
167
|
traceStart = common_utils_1.Trace.start();
|
|
164
168
|
}
|
|
165
|
-
|
|
166
|
-
this.completeAndLogOp(opArgs,
|
|
167
|
-
return op;
|
|
169
|
+
applyOp();
|
|
170
|
+
this.completeAndLogOp(opArgs, traceStart);
|
|
168
171
|
}
|
|
169
172
|
walkSegments(handler, start, end, accum, splitRange = false) {
|
|
170
173
|
this._mergeTree.mapRange(handler, this.getCurrentSeq(), this.getClientId(), accum, start, end, splitRange);
|
|
@@ -198,7 +201,7 @@ class Client {
|
|
|
198
201
|
}
|
|
199
202
|
}
|
|
200
203
|
getCollabWindow() {
|
|
201
|
-
return this._mergeTree.
|
|
204
|
+
return this._mergeTree.collabWindow;
|
|
202
205
|
}
|
|
203
206
|
/**
|
|
204
207
|
* Returns the current position of a segment, and -1 if the segment
|
|
@@ -261,12 +264,7 @@ class Client {
|
|
|
261
264
|
const op = opArgs.op;
|
|
262
265
|
const clientArgs = this.getClientSequenceArgs(opArgs);
|
|
263
266
|
const range = this.getValidOpRange(op, clientArgs);
|
|
264
|
-
|
|
265
|
-
if (this.measureOps) {
|
|
266
|
-
traceStart = common_utils_1.Trace.start();
|
|
267
|
-
}
|
|
268
|
-
this._mergeTree.markRangeRemoved(range.start, range.end, clientArgs.referenceSequenceNumber, clientArgs.clientId, clientArgs.sequenceNumber, false, opArgs);
|
|
269
|
-
this.completeAndLogOp(opArgs, clientArgs, range, traceStart);
|
|
267
|
+
this.traceOp(opArgs, () => this._mergeTree.markRangeRemoved(range.start, range.end, clientArgs.referenceSequenceNumber, clientArgs.clientId, clientArgs.sequenceNumber, false, opArgs));
|
|
270
268
|
return true;
|
|
271
269
|
}
|
|
272
270
|
/**
|
|
@@ -282,12 +280,7 @@ class Client {
|
|
|
282
280
|
if (!range) {
|
|
283
281
|
return false;
|
|
284
282
|
}
|
|
285
|
-
|
|
286
|
-
if (this.measureOps) {
|
|
287
|
-
traceStart = common_utils_1.Trace.start();
|
|
288
|
-
}
|
|
289
|
-
this._mergeTree.annotateRange(range.start, range.end, op.props, op.combiningOp, clientArgs.referenceSequenceNumber, clientArgs.clientId, clientArgs.sequenceNumber, opArgs);
|
|
290
|
-
this.completeAndLogOp(opArgs, clientArgs, range, traceStart);
|
|
283
|
+
this.traceOp(opArgs, () => this._mergeTree.annotateRange(range.start, range.end, op.props, op.combiningOp, clientArgs.referenceSequenceNumber, clientArgs.clientId, clientArgs.sequenceNumber, opArgs));
|
|
291
284
|
return true;
|
|
292
285
|
}
|
|
293
286
|
/**
|
|
@@ -310,12 +303,7 @@ class Client {
|
|
|
310
303
|
if (!segments || segments.length === 0) {
|
|
311
304
|
return false;
|
|
312
305
|
}
|
|
313
|
-
|
|
314
|
-
if (this.measureOps) {
|
|
315
|
-
traceStart = common_utils_1.Trace.start();
|
|
316
|
-
}
|
|
317
|
-
this._mergeTree.insertSegments(range.start, segments, clientArgs.referenceSequenceNumber, clientArgs.clientId, clientArgs.sequenceNumber, opArgs);
|
|
318
|
-
this.completeAndLogOp(opArgs, clientArgs, range, traceStart);
|
|
306
|
+
this.traceOp(opArgs, () => this._mergeTree.insertSegments(range.start, segments, clientArgs.referenceSequenceNumber, clientArgs.clientId, clientArgs.sequenceNumber, opArgs));
|
|
319
307
|
return true;
|
|
320
308
|
}
|
|
321
309
|
/**
|
|
@@ -325,7 +313,7 @@ class Client {
|
|
|
325
313
|
* @param range - The range the op applied to
|
|
326
314
|
* @param clockStart - Optional. The clock start if timing data should be updated.
|
|
327
315
|
*/
|
|
328
|
-
completeAndLogOp(opArgs,
|
|
316
|
+
completeAndLogOp(opArgs, traceStart) {
|
|
329
317
|
if (!opArgs.sequencedMessage) {
|
|
330
318
|
if (traceStart) {
|
|
331
319
|
this.localTime += elapsedMicroseconds(traceStart);
|
|
@@ -333,8 +321,10 @@ class Client {
|
|
|
333
321
|
}
|
|
334
322
|
}
|
|
335
323
|
else {
|
|
336
|
-
|
|
337
|
-
|
|
324
|
+
const { currentSeq, minSeq } = this.getCollabWindow();
|
|
325
|
+
const { minimumSequenceNumber, sequenceNumber } = opArgs.sequencedMessage;
|
|
326
|
+
(0, common_utils_1.assert)(currentSeq < sequenceNumber, 0x030 /* "Incoming remote op sequence# <= local collabWindow's currentSequence#" */);
|
|
327
|
+
(0, common_utils_1.assert)(minSeq <= minimumSequenceNumber, 0x031 /* "Incoming remote op minSequence# < local collabWindow's minSequence#" */);
|
|
338
328
|
if (traceStart) {
|
|
339
329
|
this.accumTime += elapsedMicroseconds(traceStart);
|
|
340
330
|
this.accumOps++;
|
|
@@ -676,7 +666,7 @@ class Client {
|
|
|
676
666
|
this.updateSeqNumbers(msg.minimumSequenceNumber, msg.sequenceNumber);
|
|
677
667
|
}
|
|
678
668
|
updateSeqNumbers(min, seq) {
|
|
679
|
-
const collabWindow = this.
|
|
669
|
+
const collabWindow = this.getCollabWindow();
|
|
680
670
|
// Equal is fine here due to SharedSegmentSequence<>.snapshotContent() potentially updating with same #
|
|
681
671
|
(0, common_utils_1.assert)(collabWindow.currentSeq <= seq, 0x038 /* "Incoming op sequence# < local collabWindow's currentSequence#" */);
|
|
682
672
|
collabWindow.currentSeq = seq;
|