@fluidframework/merge-tree 1.2.1 → 2.0.0-internal.1.0.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/DEV.md +2 -2
- package/README.md +1 -1
- package/REFERENCEPOSITIONS.md +2 -2
- package/dist/MergeTreeTextHelper.d.ts +23 -0
- package/dist/MergeTreeTextHelper.d.ts.map +1 -0
- package/dist/MergeTreeTextHelper.js +136 -0
- package/dist/MergeTreeTextHelper.js.map +1 -0
- package/dist/base.d.ts +2 -26
- package/dist/base.d.ts.map +1 -1
- package/dist/base.js.map +1 -1
- package/dist/client.d.ts +21 -12
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +87 -27
- package/dist/client.js.map +1 -1
- package/dist/collections/heap.d.ts +28 -0
- package/dist/collections/heap.d.ts.map +1 -0
- package/dist/collections/heap.js +65 -0
- package/dist/collections/heap.js.map +1 -0
- package/dist/collections/index.d.ts +11 -0
- package/dist/collections/index.d.ts.map +1 -0
- package/dist/collections/index.js +23 -0
- package/dist/collections/index.js.map +1 -0
- package/dist/collections/intervalTree.d.ts +60 -0
- package/dist/collections/intervalTree.d.ts.map +1 -0
- package/dist/collections/intervalTree.js +99 -0
- package/dist/collections/intervalTree.js.map +1 -0
- package/dist/collections/list.d.ts +39 -0
- package/dist/collections/list.d.ts.map +1 -0
- package/dist/collections/list.js +155 -0
- package/dist/collections/list.js.map +1 -0
- package/dist/collections/rbTree.d.ts +154 -0
- package/dist/collections/rbTree.d.ts.map +1 -0
- package/dist/{collections.js → collections/rbTree.js} +10 -448
- package/dist/collections/rbTree.js.map +1 -0
- package/dist/collections/stack.d.ts +16 -0
- package/dist/collections/stack.d.ts.map +1 -0
- package/dist/collections/stack.js +30 -0
- package/dist/collections/stack.js.map +1 -0
- package/dist/collections/tst.d.ts +55 -0
- package/dist/collections/tst.d.ts.map +1 -0
- package/dist/collections/tst.js +171 -0
- package/dist/collections/tst.js.map +1 -0
- package/dist/index.d.ts +3 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -2
- package/dist/index.js.map +1 -1
- package/dist/localReference.d.ts +48 -99
- package/dist/localReference.d.ts.map +1 -1
- package/dist/localReference.js +132 -169
- package/dist/localReference.js.map +1 -1
- package/dist/mergeTree.d.ts +38 -299
- package/dist/mergeTree.d.ts.map +1 -1
- package/dist/mergeTree.js +214 -598
- package/dist/mergeTree.js.map +1 -1
- package/dist/mergeTreeDeltaCallback.d.ts +1 -1
- package/dist/mergeTreeDeltaCallback.d.ts.map +1 -1
- package/dist/mergeTreeDeltaCallback.js.map +1 -1
- package/dist/mergeTreeNodes.d.ts +269 -0
- package/dist/mergeTreeNodes.d.ts.map +1 -0
- package/dist/mergeTreeNodes.js +383 -0
- package/dist/mergeTreeNodes.js.map +1 -0
- package/dist/mergeTreeTracking.d.ts +1 -1
- package/dist/mergeTreeTracking.d.ts.map +1 -1
- package/dist/mergeTreeTracking.js.map +1 -1
- package/dist/opBuilder.d.ts +1 -1
- package/dist/opBuilder.d.ts.map +1 -1
- package/dist/opBuilder.js.map +1 -1
- package/dist/partialLengths.d.ts +130 -15
- package/dist/partialLengths.d.ts.map +1 -1
- package/dist/partialLengths.js +230 -138
- package/dist/partialLengths.js.map +1 -1
- package/dist/properties.d.ts.map +1 -1
- package/dist/properties.js.map +1 -1
- package/dist/referencePositions.d.ts +6 -26
- package/dist/referencePositions.d.ts.map +1 -1
- package/dist/referencePositions.js.map +1 -1
- package/dist/segmentGroupCollection.d.ts +2 -1
- package/dist/segmentGroupCollection.d.ts.map +1 -1
- package/dist/segmentGroupCollection.js +3 -0
- package/dist/segmentGroupCollection.js.map +1 -1
- package/dist/segmentPropertiesManager.d.ts +10 -1
- package/dist/segmentPropertiesManager.d.ts.map +1 -1
- package/dist/segmentPropertiesManager.js +41 -6
- package/dist/segmentPropertiesManager.js.map +1 -1
- package/dist/snapshotLoader.d.ts.map +1 -1
- package/dist/snapshotLoader.js.map +1 -1
- package/dist/snapshotV1.d.ts +1 -1
- package/dist/snapshotV1.d.ts.map +1 -1
- package/dist/snapshotV1.js.map +1 -1
- package/dist/snapshotlegacy.d.ts +5 -1
- package/dist/snapshotlegacy.d.ts.map +1 -1
- package/dist/snapshotlegacy.js +4 -0
- package/dist/snapshotlegacy.js.map +1 -1
- package/dist/sortedSegmentSet.d.ts +1 -1
- package/dist/sortedSegmentSet.d.ts.map +1 -1
- package/dist/sortedSegmentSet.js.map +1 -1
- package/dist/textSegment.d.ts +7 -7
- package/dist/textSegment.d.ts.map +1 -1
- package/dist/textSegment.js +3 -125
- package/dist/textSegment.js.map +1 -1
- package/lib/MergeTreeTextHelper.d.ts +23 -0
- package/lib/MergeTreeTextHelper.d.ts.map +1 -0
- package/lib/MergeTreeTextHelper.js +132 -0
- package/lib/MergeTreeTextHelper.js.map +1 -0
- package/lib/base.d.ts +2 -26
- package/lib/base.d.ts.map +1 -1
- package/lib/base.js.map +1 -1
- package/lib/client.d.ts +21 -12
- package/lib/client.d.ts.map +1 -1
- package/lib/client.js +85 -25
- package/lib/client.js.map +1 -1
- package/lib/collections/heap.d.ts +28 -0
- package/lib/collections/heap.d.ts.map +1 -0
- package/lib/collections/heap.js +61 -0
- package/lib/collections/heap.js.map +1 -0
- package/lib/collections/index.d.ts +11 -0
- package/lib/collections/index.d.ts.map +1 -0
- package/lib/collections/index.js +11 -0
- package/lib/collections/index.js.map +1 -0
- package/lib/collections/intervalTree.d.ts +60 -0
- package/lib/collections/intervalTree.d.ts.map +1 -0
- package/lib/collections/intervalTree.js +94 -0
- package/lib/collections/intervalTree.js.map +1 -0
- package/lib/collections/list.d.ts +39 -0
- package/lib/collections/list.d.ts.map +1 -0
- package/lib/collections/list.js +149 -0
- package/lib/collections/list.js.map +1 -0
- package/lib/collections/rbTree.d.ts +154 -0
- package/lib/collections/rbTree.d.ts.map +1 -0
- package/lib/{collections.js → collections/rbTree.js} +9 -439
- package/lib/collections/rbTree.js.map +1 -0
- package/lib/collections/stack.d.ts +16 -0
- package/lib/collections/stack.d.ts.map +1 -0
- package/lib/collections/stack.js +26 -0
- package/lib/collections/stack.js.map +1 -0
- package/lib/collections/tst.d.ts +55 -0
- package/lib/collections/tst.d.ts.map +1 -0
- package/lib/collections/tst.js +167 -0
- package/lib/collections/tst.js.map +1 -0
- package/lib/index.d.ts +3 -1
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +3 -1
- package/lib/index.js.map +1 -1
- package/lib/localReference.d.ts +48 -99
- package/lib/localReference.d.ts.map +1 -1
- package/lib/localReference.js +132 -170
- package/lib/localReference.js.map +1 -1
- package/lib/mergeTree.d.ts +38 -299
- package/lib/mergeTree.d.ts.map +1 -1
- package/lib/mergeTree.js +190 -563
- package/lib/mergeTree.js.map +1 -1
- package/lib/mergeTreeDeltaCallback.d.ts +1 -1
- package/lib/mergeTreeDeltaCallback.d.ts.map +1 -1
- package/lib/mergeTreeDeltaCallback.js.map +1 -1
- package/lib/mergeTreeNodes.d.ts +269 -0
- package/lib/mergeTreeNodes.d.ts.map +1 -0
- package/lib/mergeTreeNodes.js +369 -0
- package/lib/mergeTreeNodes.js.map +1 -0
- package/lib/mergeTreeTracking.d.ts +1 -1
- package/lib/mergeTreeTracking.d.ts.map +1 -1
- package/lib/mergeTreeTracking.js.map +1 -1
- package/lib/opBuilder.d.ts +1 -1
- package/lib/opBuilder.d.ts.map +1 -1
- package/lib/opBuilder.js.map +1 -1
- package/lib/partialLengths.d.ts +130 -15
- package/lib/partialLengths.d.ts.map +1 -1
- package/lib/partialLengths.js +227 -135
- package/lib/partialLengths.js.map +1 -1
- package/lib/properties.d.ts.map +1 -1
- package/lib/properties.js.map +1 -1
- package/lib/referencePositions.d.ts +6 -26
- package/lib/referencePositions.d.ts.map +1 -1
- package/lib/referencePositions.js.map +1 -1
- package/lib/segmentGroupCollection.d.ts +2 -1
- package/lib/segmentGroupCollection.d.ts.map +1 -1
- package/lib/segmentGroupCollection.js +3 -0
- package/lib/segmentGroupCollection.js.map +1 -1
- package/lib/segmentPropertiesManager.d.ts +10 -1
- package/lib/segmentPropertiesManager.d.ts.map +1 -1
- package/lib/segmentPropertiesManager.js +41 -6
- package/lib/segmentPropertiesManager.js.map +1 -1
- package/lib/snapshotLoader.d.ts.map +1 -1
- package/lib/snapshotLoader.js.map +1 -1
- package/lib/snapshotV1.d.ts +1 -1
- package/lib/snapshotV1.d.ts.map +1 -1
- package/lib/snapshotV1.js.map +1 -1
- package/lib/snapshotlegacy.d.ts +5 -1
- package/lib/snapshotlegacy.d.ts.map +1 -1
- package/lib/snapshotlegacy.js +4 -0
- package/lib/snapshotlegacy.js.map +1 -1
- package/lib/sortedSegmentSet.d.ts +1 -1
- package/lib/sortedSegmentSet.d.ts.map +1 -1
- package/lib/sortedSegmentSet.js.map +1 -1
- package/lib/textSegment.d.ts +7 -7
- package/lib/textSegment.d.ts.map +1 -1
- package/lib/textSegment.js +1 -122
- package/lib/textSegment.js.map +1 -1
- package/package.json +93 -17
- package/src/MergeTreeTextHelper.ts +172 -0
- package/src/base.ts +2 -35
- package/src/client.ts +114 -30
- package/src/collections/heap.ts +75 -0
- package/src/collections/index.ts +11 -0
- package/src/collections/intervalTree.ts +140 -0
- package/src/collections/list.ts +165 -0
- package/src/{collections.ts → collections/rbTree.ts} +79 -538
- package/src/collections/stack.ts +27 -0
- package/src/collections/tst.ts +212 -0
- package/src/index.ts +8 -2
- package/src/localReference.ts +152 -203
- package/src/mergeTree.ts +265 -868
- package/src/mergeTreeDeltaCallback.ts +1 -1
- package/src/mergeTreeNodes.ts +676 -0
- package/src/mergeTreeTracking.ts +1 -1
- package/src/opBuilder.ts +1 -1
- package/src/partialLengths.ts +295 -150
- package/src/properties.ts +1 -0
- package/src/referencePositions.ts +7 -27
- package/src/segmentGroupCollection.ts +5 -1
- package/src/segmentPropertiesManager.ts +45 -6
- package/src/snapshotLoader.ts +2 -1
- package/src/snapshotV1.ts +2 -2
- package/src/snapshotlegacy.ts +6 -2
- package/src/sortedSegmentSet.ts +1 -1
- package/src/textSegment.ts +10 -157
- package/dist/collections.d.ts +0 -197
- package/dist/collections.d.ts.map +0 -1
- package/dist/collections.js.map +0 -1
- package/lib/collections.d.ts +0 -197
- package/lib/collections.d.ts.map +0 -1
- package/lib/collections.js.map +0 -1
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
/* eslint-disable @typescript-eslint/no-non-null-assertion */
|
|
7
7
|
|
|
8
8
|
import { assert } from "@fluidframework/common-utils";
|
|
9
|
-
import { UnassignedSequenceNumber } from "./constants";
|
|
9
|
+
import { UnassignedSequenceNumber, UniversalSequenceNumber } from "./constants";
|
|
10
10
|
import { ICombiningOp, IMergeTreeAnnotateMsg } from "./ops";
|
|
11
11
|
import {
|
|
12
12
|
combine,
|
|
@@ -15,6 +15,17 @@ import {
|
|
|
15
15
|
PropertySet,
|
|
16
16
|
} from "./properties";
|
|
17
17
|
|
|
18
|
+
export enum PropertiesRollback {
|
|
19
|
+
/** Not in a rollback */
|
|
20
|
+
None,
|
|
21
|
+
|
|
22
|
+
/** Rollback */
|
|
23
|
+
Rollback,
|
|
24
|
+
|
|
25
|
+
/** Rollback of a rewrite */
|
|
26
|
+
Rewrite,
|
|
27
|
+
}
|
|
28
|
+
|
|
18
29
|
export class PropertiesManager {
|
|
19
30
|
private pendingKeyUpdateCount: MapLike<number> | undefined;
|
|
20
31
|
private pendingRewriteCount: number;
|
|
@@ -24,11 +35,20 @@ export class PropertiesManager {
|
|
|
24
35
|
}
|
|
25
36
|
|
|
26
37
|
public ackPendingProperties(annotateOp: IMergeTreeAnnotateMsg) {
|
|
27
|
-
|
|
38
|
+
const rewrite = !!annotateOp.combiningOp && annotateOp.combiningOp.name === "rewrite";
|
|
39
|
+
this.decrementPendingCounts(rewrite, annotateOp.props);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
private decrementPendingCounts(rewrite: boolean, props: PropertySet) {
|
|
43
|
+
if (rewrite) {
|
|
28
44
|
this.pendingRewriteCount--;
|
|
29
45
|
}
|
|
30
|
-
for (const key of Object.keys(
|
|
46
|
+
for (const key of Object.keys(props)) {
|
|
31
47
|
if (this.pendingKeyUpdateCount?.[key] !== undefined) {
|
|
48
|
+
if (rewrite && props[key] === null) {
|
|
49
|
+
// We don't track the pending count for this redundant case
|
|
50
|
+
continue;
|
|
51
|
+
}
|
|
32
52
|
assert(this.pendingKeyUpdateCount[key] > 0,
|
|
33
53
|
0x05c /* "Trying to update more annotate props than do exist!" */);
|
|
34
54
|
this.pendingKeyUpdateCount[key]--;
|
|
@@ -45,21 +65,35 @@ export class PropertiesManager {
|
|
|
45
65
|
newProps: PropertySet,
|
|
46
66
|
op?: ICombiningOp,
|
|
47
67
|
seq?: number,
|
|
48
|
-
collaborating: boolean = false
|
|
68
|
+
collaborating: boolean = false,
|
|
69
|
+
rollback: PropertiesRollback = PropertiesRollback.None): PropertySet | undefined {
|
|
49
70
|
if (!this.pendingKeyUpdateCount) {
|
|
50
71
|
this.pendingKeyUpdateCount = createMap<number>();
|
|
51
72
|
}
|
|
52
73
|
|
|
53
74
|
// There are outstanding local rewrites, so block all non-local changes
|
|
54
|
-
if (this.pendingRewriteCount > 0 && seq !== UnassignedSequenceNumber &&
|
|
75
|
+
if (this.pendingRewriteCount > 0 && seq !== UnassignedSequenceNumber && seq !== UniversalSequenceNumber
|
|
76
|
+
&& collaborating) {
|
|
55
77
|
return undefined;
|
|
56
78
|
}
|
|
57
79
|
|
|
80
|
+
// Clean up counts for rolled back edits before modifying oldProps
|
|
81
|
+
if (collaborating) {
|
|
82
|
+
if (rollback === PropertiesRollback.Rollback) {
|
|
83
|
+
this.decrementPendingCounts(false, newProps);
|
|
84
|
+
} else if (rollback === PropertiesRollback.Rewrite) {
|
|
85
|
+
// oldProps is the correct props for tracking counts on rewrite because the ones in newProps include
|
|
86
|
+
// those that were implicitly cleared by the rewrite for which we don't track pending counts.
|
|
87
|
+
this.decrementPendingCounts(true, oldProps);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
|
|
58
91
|
const rewrite = (op && op.name === "rewrite");
|
|
59
92
|
const combiningOp = !rewrite ? op ? op : undefined : undefined;
|
|
60
93
|
|
|
61
94
|
const shouldModifyKey = (key: string): boolean => {
|
|
62
95
|
if (seq === UnassignedSequenceNumber
|
|
96
|
+
|| seq === UniversalSequenceNumber
|
|
63
97
|
|| this.pendingKeyUpdateCount?.[key] === undefined
|
|
64
98
|
|| combiningOp) {
|
|
65
99
|
return true;
|
|
@@ -87,6 +121,11 @@ export class PropertiesManager {
|
|
|
87
121
|
for (const key of Object.keys(newProps)) {
|
|
88
122
|
if (collaborating) {
|
|
89
123
|
if (seq === UnassignedSequenceNumber) {
|
|
124
|
+
if (rewrite && newProps[key] === null) {
|
|
125
|
+
// This case has already been handled above and
|
|
126
|
+
// we don't want to track the pending count for it in case of rollback
|
|
127
|
+
continue;
|
|
128
|
+
}
|
|
90
129
|
if (this.pendingKeyUpdateCount?.[key] === undefined) {
|
|
91
130
|
this.pendingKeyUpdateCount[key] = 0;
|
|
92
131
|
}
|
|
@@ -97,7 +136,7 @@ export class PropertiesManager {
|
|
|
97
136
|
}
|
|
98
137
|
|
|
99
138
|
const previousValue: any = oldProps[key];
|
|
100
|
-
// The delta should be null if undefined, as
|
|
139
|
+
// The delta should be null if undefined, as that's how we encode delete
|
|
101
140
|
deltas[key] = (previousValue === undefined) ? null : previousValue;
|
|
102
141
|
let newValue: any;
|
|
103
142
|
if (combiningOp) {
|
package/src/snapshotLoader.ts
CHANGED
|
@@ -14,7 +14,7 @@ import { ITelemetryLogger } from "@fluidframework/common-definitions";
|
|
|
14
14
|
import { AttachState } from "@fluidframework/container-definitions";
|
|
15
15
|
import { Client } from "./client";
|
|
16
16
|
import { NonCollabClient, UniversalSequenceNumber } from "./constants";
|
|
17
|
-
import { ISegment
|
|
17
|
+
import { ISegment } from "./mergeTreeNodes";
|
|
18
18
|
import { IJSONSegment } from "./ops";
|
|
19
19
|
import {
|
|
20
20
|
IJSONSegmentWithMergeInfo,
|
|
@@ -23,6 +23,7 @@ import {
|
|
|
23
23
|
} from "./snapshotChunks";
|
|
24
24
|
import { SnapshotV1 } from "./snapshotV1";
|
|
25
25
|
import { SnapshotLegacy } from "./snapshotlegacy";
|
|
26
|
+
import { MergeTree } from "./mergeTree";
|
|
26
27
|
|
|
27
28
|
export class SnapshotLoader {
|
|
28
29
|
private readonly logger: ITelemetryLogger;
|
package/src/snapshotV1.ts
CHANGED
|
@@ -14,8 +14,7 @@ import { SummaryTreeBuilder } from "@fluidframework/runtime-utils";
|
|
|
14
14
|
import { UnassignedSequenceNumber } from "./constants";
|
|
15
15
|
import {
|
|
16
16
|
ISegment,
|
|
17
|
-
|
|
18
|
-
} from "./mergeTree";
|
|
17
|
+
} from "./mergeTreeNodes";
|
|
19
18
|
import {
|
|
20
19
|
matchProperties,
|
|
21
20
|
PropertySet,
|
|
@@ -29,6 +28,7 @@ import {
|
|
|
29
28
|
serializeAsMaxSupportedVersion,
|
|
30
29
|
} from "./snapshotChunks";
|
|
31
30
|
import { SnapshotLegacy } from "./snapshotlegacy";
|
|
31
|
+
import { MergeTree } from "./mergeTree";
|
|
32
32
|
|
|
33
33
|
export class SnapshotV1 {
|
|
34
34
|
// Split snapshot into two entries - headers (small) and body (overflow) for faster loading initial content
|
package/src/snapshotlegacy.ts
CHANGED
|
@@ -16,14 +16,14 @@ import { SummaryTreeBuilder } from "@fluidframework/runtime-utils";
|
|
|
16
16
|
import { NonCollabClient, UnassignedSequenceNumber } from "./constants";
|
|
17
17
|
import {
|
|
18
18
|
ISegment,
|
|
19
|
-
|
|
20
|
-
} from "./mergeTree";
|
|
19
|
+
} from "./mergeTreeNodes";
|
|
21
20
|
import { IJSONSegment } from "./ops";
|
|
22
21
|
import { matchProperties } from "./properties";
|
|
23
22
|
import {
|
|
24
23
|
MergeTreeChunkLegacy,
|
|
25
24
|
serializeAsMinSupportedVersion,
|
|
26
25
|
} from "./snapshotChunks";
|
|
26
|
+
import { MergeTree } from "./mergeTree";
|
|
27
27
|
|
|
28
28
|
interface SnapshotHeader {
|
|
29
29
|
chunkCount?: number;
|
|
@@ -36,6 +36,10 @@ interface SnapshotHeader {
|
|
|
36
36
|
minSeq?: number;
|
|
37
37
|
}
|
|
38
38
|
|
|
39
|
+
/**
|
|
40
|
+
* @deprecated for internal use only. public export will be removed.
|
|
41
|
+
* @internal
|
|
42
|
+
*/
|
|
39
43
|
export class SnapshotLegacy {
|
|
40
44
|
public static readonly header = "header";
|
|
41
45
|
public static readonly body = "body";
|
package/src/sortedSegmentSet.ts
CHANGED
package/src/textSegment.ts
CHANGED
|
@@ -3,8 +3,7 @@
|
|
|
3
3
|
* Licensed under the MIT License.
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
|
-
import {
|
|
7
|
-
import { BaseSegment, ISegment, Marker, MergeTree } from "./mergeTree";
|
|
6
|
+
import { BaseSegment, ISegment, Marker } from "./mergeTreeNodes";
|
|
8
7
|
import { IJSONSegment } from "./ops";
|
|
9
8
|
import { PropertySet } from "./properties";
|
|
10
9
|
import { LocalReferenceCollection } from "./localReference";
|
|
@@ -121,159 +120,13 @@ export class TextSegment extends BaseSegment {
|
|
|
121
120
|
}
|
|
122
121
|
}
|
|
123
122
|
|
|
124
|
-
interface
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
parallelMarkers: Marker[];
|
|
134
|
-
parallelMarkerLabel: string;
|
|
135
|
-
tagsInProgress: string[];
|
|
136
|
-
}
|
|
137
|
-
|
|
138
|
-
function isTextAndMarkerAccumulator(accum: ITextAccumulator): accum is ITextAndMarkerAccumulator {
|
|
139
|
-
return accum.parallelArrays === true;
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
type ITextAccumulatorType = ITextAccumulator | ITextAndMarkerAccumulator;
|
|
143
|
-
export class MergeTreeTextHelper {
|
|
144
|
-
constructor(private readonly mergeTree: MergeTree) { }
|
|
145
|
-
|
|
146
|
-
public getTextAndMarkers(refSeq: number, clientId: number, label: string, start?: number, end?: number) {
|
|
147
|
-
const range = this.getValidRange(start, end, refSeq, clientId);
|
|
148
|
-
const accum: ITextAndMarkerAccumulator = {
|
|
149
|
-
parallelArrays: true,
|
|
150
|
-
parallelMarkerLabel: label,
|
|
151
|
-
parallelMarkers: [],
|
|
152
|
-
parallelText: [],
|
|
153
|
-
tagsInProgress: [],
|
|
154
|
-
textSegment: new TextSegment(""),
|
|
155
|
-
};
|
|
156
|
-
|
|
157
|
-
this.mergeTree.mapRange<ITextAndMarkerAccumulator>(
|
|
158
|
-
{ leaf: this.gatherText },
|
|
159
|
-
refSeq,
|
|
160
|
-
clientId,
|
|
161
|
-
accum,
|
|
162
|
-
range.start,
|
|
163
|
-
range.end);
|
|
164
|
-
|
|
165
|
-
return { parallelText: accum.parallelText, parallelMarkers: accum.parallelMarkers };
|
|
166
|
-
}
|
|
167
|
-
|
|
168
|
-
public getText(refSeq: number, clientId: number, placeholder = "", start?: number, end?: number) {
|
|
169
|
-
const range = this.getValidRange(start, end, refSeq, clientId);
|
|
170
|
-
|
|
171
|
-
const accum: ITextAccumulator = { textSegment: new TextSegment(""), placeholder };
|
|
172
|
-
|
|
173
|
-
this.mergeTree.mapRange<ITextAccumulator>(
|
|
174
|
-
{ leaf: this.gatherText },
|
|
175
|
-
refSeq,
|
|
176
|
-
clientId,
|
|
177
|
-
accum,
|
|
178
|
-
range.start,
|
|
179
|
-
range.end);
|
|
180
|
-
return accum.textSegment.text;
|
|
181
|
-
}
|
|
182
|
-
|
|
183
|
-
private getValidRange(
|
|
184
|
-
start: number | undefined,
|
|
185
|
-
end: number | undefined,
|
|
186
|
-
refSeq: number,
|
|
187
|
-
clientId: number,
|
|
188
|
-
): IIntegerRange {
|
|
189
|
-
const range: IIntegerRange = {
|
|
190
|
-
end: end ?? this.mergeTree.getLength(refSeq, clientId),
|
|
191
|
-
start: start ?? 0,
|
|
192
|
-
};
|
|
193
|
-
return range;
|
|
194
|
-
}
|
|
195
|
-
|
|
196
|
-
private readonly gatherText = (segment: ISegment, pos: number, refSeq: number, clientId: number, start: number,
|
|
197
|
-
end: number, accumText: ITextAccumulatorType) => {
|
|
198
|
-
let _start = start;
|
|
199
|
-
if (TextSegment.is(segment)) {
|
|
200
|
-
let beginTags = "";
|
|
201
|
-
let endTags = "";
|
|
202
|
-
if (isTextAndMarkerAccumulator(accumText)) {
|
|
203
|
-
// TODO: let clients pass in function to get tag
|
|
204
|
-
const tags = [] as string[];
|
|
205
|
-
const initTags = [] as string[];
|
|
206
|
-
|
|
207
|
-
if (segment.properties?.["font-weight"]) {
|
|
208
|
-
tags.push("b");
|
|
209
|
-
}
|
|
210
|
-
if (segment.properties?.["text-decoration"]) {
|
|
211
|
-
tags.push("u");
|
|
212
|
-
}
|
|
213
|
-
const remTags = [] as string[];
|
|
214
|
-
if (tags.length > 0) {
|
|
215
|
-
for (const tag of tags) {
|
|
216
|
-
if (!accumText.tagsInProgress.includes(tag)) {
|
|
217
|
-
beginTags += `<${tag}>`;
|
|
218
|
-
initTags.push(tag);
|
|
219
|
-
}
|
|
220
|
-
}
|
|
221
|
-
for (const accumTag of accumText.tagsInProgress) {
|
|
222
|
-
if (!tags.includes(accumTag)) {
|
|
223
|
-
endTags += `</${accumTag}>`;
|
|
224
|
-
remTags.push(accumTag);
|
|
225
|
-
}
|
|
226
|
-
}
|
|
227
|
-
for (const initTag of initTags.reverse()) {
|
|
228
|
-
accumText.tagsInProgress.push(initTag);
|
|
229
|
-
}
|
|
230
|
-
} else {
|
|
231
|
-
for (const accumTag of accumText.tagsInProgress) {
|
|
232
|
-
endTags += `</${accumTag}>`;
|
|
233
|
-
remTags.push(accumTag);
|
|
234
|
-
}
|
|
235
|
-
}
|
|
236
|
-
for (const remTag of remTags) {
|
|
237
|
-
const remdex = accumText.tagsInProgress.indexOf(remTag);
|
|
238
|
-
if (remdex >= 0) {
|
|
239
|
-
accumText.tagsInProgress.splice(remdex, 1);
|
|
240
|
-
}
|
|
241
|
-
}
|
|
242
|
-
}
|
|
243
|
-
accumText.textSegment.text += endTags;
|
|
244
|
-
accumText.textSegment.text += beginTags;
|
|
245
|
-
if ((_start <= 0) && (end >= segment.text.length)) {
|
|
246
|
-
accumText.textSegment.text += segment.text;
|
|
247
|
-
} else {
|
|
248
|
-
if (_start < 0) {
|
|
249
|
-
_start = 0;
|
|
250
|
-
}
|
|
251
|
-
if (end >= segment.text.length) {
|
|
252
|
-
accumText.textSegment.text += segment.text.substring(_start);
|
|
253
|
-
} else {
|
|
254
|
-
accumText.textSegment.text += segment.text.substring(_start, end);
|
|
255
|
-
}
|
|
256
|
-
}
|
|
257
|
-
} else {
|
|
258
|
-
if (accumText.placeholder && (accumText.placeholder.length > 0)) {
|
|
259
|
-
if (accumText.placeholder === "*") {
|
|
260
|
-
const marker = segment as Marker;
|
|
261
|
-
accumText.textSegment.text += `\n${marker.toString()}`;
|
|
262
|
-
} else {
|
|
263
|
-
for (let i = 0; i < segment.cachedLength; i++) {
|
|
264
|
-
accumText.textSegment.text += accumText.placeholder;
|
|
265
|
-
}
|
|
266
|
-
}
|
|
267
|
-
} else if (isTextAndMarkerAccumulator(accumText)) {
|
|
268
|
-
const marker = segment as Marker;
|
|
269
|
-
if (marker.hasTileLabel(accumText.parallelMarkerLabel)) {
|
|
270
|
-
accumText.parallelMarkers.push(marker);
|
|
271
|
-
accumText.parallelText.push(accumText.textSegment.text);
|
|
272
|
-
accumText.textSegment.text = "";
|
|
273
|
-
}
|
|
274
|
-
}
|
|
275
|
-
}
|
|
276
|
-
|
|
277
|
-
return true;
|
|
278
|
-
};
|
|
123
|
+
export interface IMergeTreeTextHelper{
|
|
124
|
+
/**
|
|
125
|
+
* @deprecated - If consuming via sequence, use `getTextAndMarkers` exported from \@fluidframework/sequence.
|
|
126
|
+
* Otherwise, define your own accumulation model and use `Client.walkSegments`.
|
|
127
|
+
*/
|
|
128
|
+
getTextAndMarkers(refSeq: number, clientId: number, label: string, start?: number, end?: number): {
|
|
129
|
+
parallelText: string[];
|
|
130
|
+
parallelMarkers: Marker[]; };
|
|
131
|
+
getText(refSeq: number, clientId: number, placeholder: string, start?: number, end?: number): string;
|
|
279
132
|
}
|
package/dist/collections.d.ts
DELETED
|
@@ -1,197 +0,0 @@
|
|
|
1
|
-
/*!
|
|
2
|
-
* Copyright (c) Microsoft Corporation and contributors. All rights reserved.
|
|
3
|
-
* Licensed under the MIT License.
|
|
4
|
-
*/
|
|
5
|
-
import { ISequencedDocumentMessage } from "@fluidframework/protocol-definitions";
|
|
6
|
-
import { ConflictAction, IIntegerRange, KeyComparer, PropertyAction, SortedDictionary } from "./base";
|
|
7
|
-
export declare class Stack<T> {
|
|
8
|
-
items: T[];
|
|
9
|
-
push(val: T): void;
|
|
10
|
-
empty(): boolean;
|
|
11
|
-
top(): T | undefined;
|
|
12
|
-
pop(): T | undefined;
|
|
13
|
-
}
|
|
14
|
-
export declare function ListRemoveEntry<U>(entry: List<U>): List<U> | undefined;
|
|
15
|
-
export declare function ListMakeHead<U>(): List<U>;
|
|
16
|
-
export declare class List<T> {
|
|
17
|
-
isHead: boolean;
|
|
18
|
-
data: T | undefined;
|
|
19
|
-
next: List<T>;
|
|
20
|
-
prev: List<T>;
|
|
21
|
-
constructor(isHead: boolean, data: T | undefined);
|
|
22
|
-
clear(): void;
|
|
23
|
-
private add;
|
|
24
|
-
dequeue(): T | undefined;
|
|
25
|
-
enqueue(data: T): List<T>;
|
|
26
|
-
walk(fn: (data: T, l: List<T>) => void): void;
|
|
27
|
-
some(fn: (data: T, l: List<T>) => boolean, rev?: boolean): T[];
|
|
28
|
-
count(): number;
|
|
29
|
-
first(): T | undefined;
|
|
30
|
-
last(): T | undefined;
|
|
31
|
-
empty(): boolean;
|
|
32
|
-
/**
|
|
33
|
-
* @deprecated - use unshift
|
|
34
|
-
*/
|
|
35
|
-
push(data: T): void;
|
|
36
|
-
unshift(data: T): void;
|
|
37
|
-
[Symbol.iterator](): IterableIterator<T>;
|
|
38
|
-
}
|
|
39
|
-
export interface Comparer<T> {
|
|
40
|
-
compare(a: T, b: T): number;
|
|
41
|
-
min: T;
|
|
42
|
-
}
|
|
43
|
-
export declare class Heap<T> {
|
|
44
|
-
comp: Comparer<T>;
|
|
45
|
-
private L;
|
|
46
|
-
count(): number;
|
|
47
|
-
constructor(a: T[], comp: Comparer<T>);
|
|
48
|
-
peek(): T;
|
|
49
|
-
get(): T;
|
|
50
|
-
add(x: T): void;
|
|
51
|
-
private fixup;
|
|
52
|
-
private fixDown;
|
|
53
|
-
}
|
|
54
|
-
export declare const RBColor: {
|
|
55
|
-
readonly RED: 0;
|
|
56
|
-
readonly BLACK: 1;
|
|
57
|
-
};
|
|
58
|
-
export declare type RBColor = typeof RBColor[keyof typeof RBColor];
|
|
59
|
-
export interface RBNode<TKey, TData> {
|
|
60
|
-
key: TKey;
|
|
61
|
-
data: TData;
|
|
62
|
-
left: RBNode<TKey, TData> | undefined;
|
|
63
|
-
right: RBNode<TKey, TData> | undefined;
|
|
64
|
-
color: RBColor;
|
|
65
|
-
size: number;
|
|
66
|
-
}
|
|
67
|
-
export interface IRBAugmentation<TKey, TData> {
|
|
68
|
-
update(node: RBNode<TKey, TData>): void;
|
|
69
|
-
}
|
|
70
|
-
export interface IRBMatcher<TKey, TData> {
|
|
71
|
-
continueSubtree(node: RBNode<TKey, TData> | undefined, key: TKey): boolean;
|
|
72
|
-
matchNode(node: RBNode<TKey, TData> | undefined, key: TKey): boolean;
|
|
73
|
-
}
|
|
74
|
-
export interface RBNodeActions<TKey, TData> {
|
|
75
|
-
infix?(node: RBNode<TKey, TData>): boolean;
|
|
76
|
-
pre?(node: RBNode<TKey, TData>): boolean;
|
|
77
|
-
post?(node: RBNode<TKey, TData>): boolean;
|
|
78
|
-
showStructure?: boolean;
|
|
79
|
-
}
|
|
80
|
-
export declare class RedBlackTree<TKey, TData> implements SortedDictionary<TKey, TData> {
|
|
81
|
-
private readonly compareKeys;
|
|
82
|
-
private readonly aug?;
|
|
83
|
-
private root;
|
|
84
|
-
constructor(compareKeys: KeyComparer<TKey>, aug?: IRBAugmentation<TKey, TData> | undefined);
|
|
85
|
-
private makeNode;
|
|
86
|
-
private isRed;
|
|
87
|
-
private nodeSize;
|
|
88
|
-
size(): number;
|
|
89
|
-
isEmpty(): boolean;
|
|
90
|
-
get(key: TKey): RBNode<TKey, TData> | undefined;
|
|
91
|
-
private nodeGet;
|
|
92
|
-
private contains;
|
|
93
|
-
gather(key: TKey, matcher: IRBMatcher<TKey, TData>): RBNode<TKey, TData>[];
|
|
94
|
-
private nodeGather;
|
|
95
|
-
walkExactMatchesForward(compareFn: (node: RBNode<TKey, TData>) => number, actionFn: (node: RBNode<TKey, TData>) => void, continueLeftFn: (number: number) => boolean, continueRightFn: (number: number) => boolean): void;
|
|
96
|
-
private nodeWalkExactMatchesForward;
|
|
97
|
-
walkExactMatchesBackward(compareFn: (node: RBNode<TKey, TData>) => number, actionFn: (node: RBNode<TKey, TData>) => void, continueLeftFn: (number: number) => boolean, continueRightFn: (number: number) => boolean): void;
|
|
98
|
-
private nodeWalkExactMatchesBackward;
|
|
99
|
-
put(key: TKey, data: TData, conflict?: ConflictAction<TKey, TData>): void;
|
|
100
|
-
private nodePut;
|
|
101
|
-
private updateLocal;
|
|
102
|
-
private nodeRemoveMin;
|
|
103
|
-
remove(key: TKey): void;
|
|
104
|
-
removeExisting(key: TKey): void;
|
|
105
|
-
private nodeRemove;
|
|
106
|
-
floor(key: TKey): RBNode<TKey, TData> | undefined;
|
|
107
|
-
private nodeFloor;
|
|
108
|
-
ceil(key: TKey): RBNode<TKey, TData> | undefined;
|
|
109
|
-
private nodeCeil;
|
|
110
|
-
min(): RBNode<TKey, TData> | undefined;
|
|
111
|
-
private nodeMin;
|
|
112
|
-
max(): RBNode<TKey, TData> | undefined;
|
|
113
|
-
private nodeMax;
|
|
114
|
-
private rotateRight;
|
|
115
|
-
private rotateLeft;
|
|
116
|
-
private oppositeColor;
|
|
117
|
-
private flipColors;
|
|
118
|
-
private moveRedLeft;
|
|
119
|
-
private moveRedRight;
|
|
120
|
-
private balance;
|
|
121
|
-
mapRange<TAccum>(action: PropertyAction<TKey, TData>, accum?: TAccum, start?: TKey, end?: TKey): void;
|
|
122
|
-
map<TAccum>(action: PropertyAction<TKey, TData>, accum?: TAccum): void;
|
|
123
|
-
keys(): TKey[];
|
|
124
|
-
/**
|
|
125
|
-
* Depth-first traversal with custom action; if action returns
|
|
126
|
-
* false, traversal is halted.
|
|
127
|
-
* @param action - action to apply to each node
|
|
128
|
-
*/
|
|
129
|
-
walk(actions: RBNodeActions<TKey, TData>): void;
|
|
130
|
-
walkBackward(actions: RBNodeActions<TKey, TData>): void;
|
|
131
|
-
private nodeWalk;
|
|
132
|
-
private nodeWalkBackward;
|
|
133
|
-
private nodeMap;
|
|
134
|
-
}
|
|
135
|
-
export interface AugmentedIntervalNode {
|
|
136
|
-
minmax: IInterval;
|
|
137
|
-
}
|
|
138
|
-
export declare const integerRangeToString: (range: IIntegerRange) => string;
|
|
139
|
-
export interface IInterval {
|
|
140
|
-
clone(): IInterval;
|
|
141
|
-
compare(b: IInterval): number;
|
|
142
|
-
compareStart(b: IInterval): number;
|
|
143
|
-
compareEnd(b: IInterval): number;
|
|
144
|
-
modify(label: string, start: number, end: number, op?: ISequencedDocumentMessage): IInterval | undefined;
|
|
145
|
-
overlaps(b: IInterval): boolean;
|
|
146
|
-
union(b: IInterval): IInterval;
|
|
147
|
-
}
|
|
148
|
-
export declare type IntervalNode<T extends IInterval> = RBNode<T, AugmentedIntervalNode>;
|
|
149
|
-
export declare type IntervalConflictResolver<TInterval> = (a: TInterval, b: TInterval) => TInterval;
|
|
150
|
-
export declare class IntervalTree<T extends IInterval> implements IRBAugmentation<T, AugmentedIntervalNode>, IRBMatcher<T, AugmentedIntervalNode> {
|
|
151
|
-
intervals: RedBlackTree<T, AugmentedIntervalNode>;
|
|
152
|
-
remove(x: T): void;
|
|
153
|
-
removeExisting(x: T): void;
|
|
154
|
-
put(x: T, conflict?: IntervalConflictResolver<T>): void;
|
|
155
|
-
map(fn: (x: T) => void): void;
|
|
156
|
-
mapUntil(fn: (X: T) => boolean): void;
|
|
157
|
-
mapBackward(fn: (x: T) => void): void;
|
|
158
|
-
match(x: T): RBNode<T, AugmentedIntervalNode>[];
|
|
159
|
-
matchNode(node: IntervalNode<T> | undefined, key: T): boolean;
|
|
160
|
-
continueSubtree(node: IntervalNode<T> | undefined, key: T): boolean;
|
|
161
|
-
update(node: IntervalNode<T>): void;
|
|
162
|
-
}
|
|
163
|
-
export interface TSTResult<T> {
|
|
164
|
-
key: string;
|
|
165
|
-
val: T;
|
|
166
|
-
}
|
|
167
|
-
export interface TSTNode<T> {
|
|
168
|
-
c: string;
|
|
169
|
-
left?: TSTNode<T>;
|
|
170
|
-
mid?: TSTNode<T>;
|
|
171
|
-
right?: TSTNode<T>;
|
|
172
|
-
val?: T;
|
|
173
|
-
}
|
|
174
|
-
export interface ProxString<T> {
|
|
175
|
-
text: string;
|
|
176
|
-
invDistance: number;
|
|
177
|
-
val: T;
|
|
178
|
-
}
|
|
179
|
-
export declare class TST<T> {
|
|
180
|
-
private n;
|
|
181
|
-
private root;
|
|
182
|
-
size(): number;
|
|
183
|
-
private contains;
|
|
184
|
-
get(key: string): T | undefined;
|
|
185
|
-
private nodeGet;
|
|
186
|
-
put(key: string, val: T): void;
|
|
187
|
-
private nodePut;
|
|
188
|
-
neighbors(text: string, distance?: number): ProxString<T>[];
|
|
189
|
-
keysWithPrefix(text: string): string[];
|
|
190
|
-
private collect;
|
|
191
|
-
private mapNode;
|
|
192
|
-
map(fn: (key: string, val: T) => void): void;
|
|
193
|
-
pairsWithPrefix(text: string): TSTResult<T>[];
|
|
194
|
-
private collectPairs;
|
|
195
|
-
private nodeProximity;
|
|
196
|
-
}
|
|
197
|
-
//# sourceMappingURL=collections.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"collections.d.ts","sourceRoot":"","sources":["../src/collections.ts"],"names":[],"mappings":"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"}
|