@fluidframework/merge-tree 2.5.0 → 2.10.0-304831
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/api-report/merge-tree.legacy.alpha.api.md +0 -230
- package/dist/client.d.ts +9 -8
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +7 -6
- package/dist/client.js.map +1 -1
- package/dist/index.d.ts +3 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -5
- package/dist/index.js.map +1 -1
- package/dist/legacy.d.ts +0 -12
- package/dist/mergeTree.d.ts +14 -13
- package/dist/mergeTree.d.ts.map +1 -1
- package/dist/mergeTree.js +51 -20
- package/dist/mergeTree.js.map +1 -1
- package/dist/mergeTreeNodes.d.ts +13 -79
- package/dist/mergeTreeNodes.d.ts.map +1 -1
- package/dist/mergeTreeNodes.js +5 -95
- package/dist/mergeTreeNodes.js.map +1 -1
- package/dist/referencePositions.d.ts +0 -12
- package/dist/referencePositions.d.ts.map +1 -1
- package/dist/referencePositions.js.map +1 -1
- package/dist/segmentGroupCollection.d.ts +7 -14
- package/dist/segmentGroupCollection.d.ts.map +1 -1
- package/dist/segmentGroupCollection.js +2 -9
- package/dist/segmentGroupCollection.js.map +1 -1
- package/dist/segmentPropertiesManager.d.ts +13 -12
- package/dist/segmentPropertiesManager.d.ts.map +1 -1
- package/dist/segmentPropertiesManager.js +19 -13
- package/dist/segmentPropertiesManager.js.map +1 -1
- package/dist/sortedSegmentSet.d.ts +0 -1
- package/dist/sortedSegmentSet.d.ts.map +1 -1
- package/dist/sortedSegmentSet.js.map +1 -1
- package/dist/sortedSet.d.ts +0 -1
- package/dist/sortedSet.d.ts.map +1 -1
- package/dist/sortedSet.js +0 -1
- package/dist/sortedSet.js.map +1 -1
- package/dist/test/index.d.ts +2 -2
- package/dist/test/index.d.ts.map +1 -1
- package/dist/test/index.js +2 -4
- package/dist/test/index.js.map +1 -1
- package/dist/test/mergeTree.annotate.spec.js +4 -4
- package/dist/test/mergeTree.annotate.spec.js.map +1 -1
- package/dist/test/segmentGroupCollection.spec.js +22 -18
- package/dist/test/segmentGroupCollection.spec.js.map +1 -1
- package/dist/test/snapshot.spec.js.map +1 -1
- package/dist/test/snapshot.utils.d.ts +4 -4
- package/dist/test/snapshot.utils.d.ts.map +1 -1
- package/dist/test/snapshot.utils.js.map +1 -1
- package/dist/textSegment.d.ts +1 -3
- package/dist/textSegment.d.ts.map +1 -1
- package/dist/textSegment.js.map +1 -1
- package/lib/client.d.ts +9 -8
- package/lib/client.d.ts.map +1 -1
- package/lib/client.js +8 -7
- package/lib/client.js.map +1 -1
- package/lib/index.d.ts +3 -4
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +2 -3
- package/lib/index.js.map +1 -1
- package/lib/legacy.d.ts +0 -12
- package/lib/mergeTree.d.ts +14 -13
- package/lib/mergeTree.d.ts.map +1 -1
- package/lib/mergeTree.js +53 -22
- package/lib/mergeTree.js.map +1 -1
- package/lib/mergeTreeNodes.d.ts +13 -79
- package/lib/mergeTreeNodes.d.ts.map +1 -1
- package/lib/mergeTreeNodes.js +5 -94
- package/lib/mergeTreeNodes.js.map +1 -1
- package/lib/referencePositions.d.ts +0 -12
- package/lib/referencePositions.d.ts.map +1 -1
- package/lib/referencePositions.js.map +1 -1
- package/lib/segmentGroupCollection.d.ts +7 -14
- package/lib/segmentGroupCollection.d.ts.map +1 -1
- package/lib/segmentGroupCollection.js +2 -9
- package/lib/segmentGroupCollection.js.map +1 -1
- package/lib/segmentPropertiesManager.d.ts +13 -12
- package/lib/segmentPropertiesManager.d.ts.map +1 -1
- package/lib/segmentPropertiesManager.js +17 -12
- package/lib/segmentPropertiesManager.js.map +1 -1
- package/lib/sortedSegmentSet.d.ts +0 -1
- package/lib/sortedSegmentSet.d.ts.map +1 -1
- package/lib/sortedSegmentSet.js.map +1 -1
- package/lib/sortedSet.d.ts +0 -1
- package/lib/sortedSet.d.ts.map +1 -1
- package/lib/sortedSet.js +0 -1
- package/lib/sortedSet.js.map +1 -1
- package/lib/test/index.d.ts +2 -2
- package/lib/test/index.d.ts.map +1 -1
- package/lib/test/index.js +2 -2
- package/lib/test/index.js.map +1 -1
- package/lib/test/mergeTree.annotate.spec.js +4 -4
- package/lib/test/mergeTree.annotate.spec.js.map +1 -1
- package/lib/test/segmentGroupCollection.spec.js +22 -18
- package/lib/test/segmentGroupCollection.spec.js.map +1 -1
- package/lib/test/snapshot.spec.js.map +1 -1
- package/lib/test/snapshot.utils.d.ts +4 -4
- package/lib/test/snapshot.utils.d.ts.map +1 -1
- package/lib/test/snapshot.utils.js.map +1 -1
- package/lib/textSegment.d.ts +1 -3
- package/lib/textSegment.d.ts.map +1 -1
- package/lib/textSegment.js.map +1 -1
- package/package.json +91 -19
- package/src/client.ts +15 -12
- package/src/index.ts +6 -3
- package/src/mergeTree.ts +87 -38
- package/src/mergeTreeNodes.ts +16 -177
- package/src/referencePositions.ts +0 -12
- package/src/segmentGroupCollection.ts +14 -20
- package/src/segmentPropertiesManager.ts +30 -12
- package/src/sortedSegmentSet.ts +0 -1
- package/src/sortedSet.ts +0 -1
- package/src/textSegment.ts +1 -3
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@fluidframework/merge-tree",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.10.0-304831",
|
|
4
4
|
"description": "Merge tree",
|
|
5
5
|
"homepage": "https://fluidframework.com",
|
|
6
6
|
"repository": {
|
|
@@ -81,30 +81,30 @@
|
|
|
81
81
|
"temp-directory": "nyc/.nyc_output"
|
|
82
82
|
},
|
|
83
83
|
"dependencies": {
|
|
84
|
-
"@fluid-internal/client-utils": "
|
|
85
|
-
"@fluidframework/container-definitions": "
|
|
86
|
-
"@fluidframework/core-interfaces": "
|
|
87
|
-
"@fluidframework/core-utils": "
|
|
88
|
-
"@fluidframework/datastore-definitions": "
|
|
89
|
-
"@fluidframework/driver-definitions": "
|
|
90
|
-
"@fluidframework/runtime-definitions": "
|
|
91
|
-
"@fluidframework/runtime-utils": "
|
|
92
|
-
"@fluidframework/shared-object-base": "
|
|
93
|
-
"@fluidframework/telemetry-utils": "
|
|
84
|
+
"@fluid-internal/client-utils": "2.10.0-304831",
|
|
85
|
+
"@fluidframework/container-definitions": "2.10.0-304831",
|
|
86
|
+
"@fluidframework/core-interfaces": "2.10.0-304831",
|
|
87
|
+
"@fluidframework/core-utils": "2.10.0-304831",
|
|
88
|
+
"@fluidframework/datastore-definitions": "2.10.0-304831",
|
|
89
|
+
"@fluidframework/driver-definitions": "2.10.0-304831",
|
|
90
|
+
"@fluidframework/runtime-definitions": "2.10.0-304831",
|
|
91
|
+
"@fluidframework/runtime-utils": "2.10.0-304831",
|
|
92
|
+
"@fluidframework/shared-object-base": "2.10.0-304831",
|
|
93
|
+
"@fluidframework/telemetry-utils": "2.10.0-304831"
|
|
94
94
|
},
|
|
95
95
|
"devDependencies": {
|
|
96
96
|
"@arethetypeswrong/cli": "^0.16.4",
|
|
97
97
|
"@biomejs/biome": "~1.9.3",
|
|
98
|
-
"@fluid-internal/mocha-test-setup": "
|
|
99
|
-
"@fluid-private/stochastic-test-utils": "
|
|
100
|
-
"@fluid-private/test-pairwise-generator": "
|
|
98
|
+
"@fluid-internal/mocha-test-setup": "2.10.0-304831",
|
|
99
|
+
"@fluid-private/stochastic-test-utils": "2.10.0-304831",
|
|
100
|
+
"@fluid-private/test-pairwise-generator": "2.10.0-304831",
|
|
101
101
|
"@fluid-tools/benchmark": "^0.50.0",
|
|
102
|
-
"@fluid-tools/build-cli": "^0.
|
|
102
|
+
"@fluid-tools/build-cli": "^0.50.0",
|
|
103
103
|
"@fluidframework/build-common": "^2.0.3",
|
|
104
|
-
"@fluidframework/build-tools": "^0.
|
|
104
|
+
"@fluidframework/build-tools": "^0.50.0",
|
|
105
105
|
"@fluidframework/eslint-config-fluid": "^5.4.0",
|
|
106
|
-
"@fluidframework/merge-tree-previous": "npm:@fluidframework/merge-tree
|
|
107
|
-
"@fluidframework/test-runtime-utils": "
|
|
106
|
+
"@fluidframework/merge-tree-previous": "npm:@fluidframework/merge-tree@2.5.0",
|
|
107
|
+
"@fluidframework/test-runtime-utils": "2.10.0-304831",
|
|
108
108
|
"@microsoft/api-extractor": "7.47.8",
|
|
109
109
|
"@types/diff": "^3.5.1",
|
|
110
110
|
"@types/mocha": "^9.1.1",
|
|
@@ -124,7 +124,79 @@
|
|
|
124
124
|
"typescript": "~5.4.5"
|
|
125
125
|
},
|
|
126
126
|
"typeValidation": {
|
|
127
|
-
"broken": {
|
|
127
|
+
"broken": {
|
|
128
|
+
"Class_BaseSegment": {
|
|
129
|
+
"backCompat": false
|
|
130
|
+
},
|
|
131
|
+
"Class_Marker": {
|
|
132
|
+
"backCompat": false
|
|
133
|
+
},
|
|
134
|
+
"Class_MergeNode": {
|
|
135
|
+
"backCompat": false,
|
|
136
|
+
"forwardCompat": false
|
|
137
|
+
},
|
|
138
|
+
"Class_TextSegment": {
|
|
139
|
+
"backCompat": false
|
|
140
|
+
},
|
|
141
|
+
"Class_TrackingGroup": {
|
|
142
|
+
"backCompat": false
|
|
143
|
+
},
|
|
144
|
+
"Class_SegmentGroupCollection": {
|
|
145
|
+
"backCompat": false,
|
|
146
|
+
"forwardCompat": false
|
|
147
|
+
},
|
|
148
|
+
"ClassStatics_BaseSegment": {
|
|
149
|
+
"backCompat": false
|
|
150
|
+
},
|
|
151
|
+
"ClassStatics_Marker": {
|
|
152
|
+
"backCompat": false
|
|
153
|
+
},
|
|
154
|
+
"ClassStatics_MergeNode": {
|
|
155
|
+
"backCompat": false
|
|
156
|
+
},
|
|
157
|
+
"ClassStatics_TextSegment": {
|
|
158
|
+
"backCompat": false
|
|
159
|
+
},
|
|
160
|
+
"ClassStatics_TrackingGroup": {
|
|
161
|
+
"backCompat": false
|
|
162
|
+
},
|
|
163
|
+
"ClassStatics_SegmentGroupCollection": {
|
|
164
|
+
"backCompat": false
|
|
165
|
+
},
|
|
166
|
+
"Interface_IMergeTreeDeltaCallbackArgs": {
|
|
167
|
+
"backCompat": false
|
|
168
|
+
},
|
|
169
|
+
"Interface_IMergeTreeMaintenanceCallbackArgs": {
|
|
170
|
+
"backCompat": false
|
|
171
|
+
},
|
|
172
|
+
"Interface_IMergeTreeSegmentDelta": {
|
|
173
|
+
"backCompat": false
|
|
174
|
+
},
|
|
175
|
+
"Interface_IMoveInfo": {
|
|
176
|
+
"backCompat": false
|
|
177
|
+
},
|
|
178
|
+
"Interface_ISegment": {
|
|
179
|
+
"backCompat": false
|
|
180
|
+
},
|
|
181
|
+
"Interface_ITrackingGroup": {
|
|
182
|
+
"backCompat": false
|
|
183
|
+
},
|
|
184
|
+
"Interface_ObliterateInfo": {
|
|
185
|
+
"backCompat": false
|
|
186
|
+
},
|
|
187
|
+
"Interface_ReferencePosition": {
|
|
188
|
+
"backCompat": false
|
|
189
|
+
},
|
|
190
|
+
"Interface_SegmentGroup": {
|
|
191
|
+
"backCompat": false
|
|
192
|
+
},
|
|
193
|
+
"TypeAlias_MergeTreeDeltaRevertible": {
|
|
194
|
+
"backCompat": false
|
|
195
|
+
},
|
|
196
|
+
"TypeAlias_Trackable": {
|
|
197
|
+
"backCompat": false
|
|
198
|
+
}
|
|
199
|
+
},
|
|
128
200
|
"entrypoint": "legacy"
|
|
129
201
|
},
|
|
130
202
|
"scripts": {
|
package/src/client.ts
CHANGED
|
@@ -29,7 +29,11 @@ import { MergeTreeTextHelper } from "./MergeTreeTextHelper.js";
|
|
|
29
29
|
import { DoublyLinkedList, RedBlackTree } from "./collections/index.js";
|
|
30
30
|
import { UnassignedSequenceNumber, UniversalSequenceNumber } from "./constants.js";
|
|
31
31
|
import { LocalReferencePosition, SlidingPreference } from "./localReference.js";
|
|
32
|
-
import {
|
|
32
|
+
import {
|
|
33
|
+
MergeTree,
|
|
34
|
+
errorIfOptionNotTrue,
|
|
35
|
+
type IMergeTreeOptionsInternal,
|
|
36
|
+
} from "./mergeTree.js";
|
|
33
37
|
import type {
|
|
34
38
|
IMergeTreeClientSequenceArgs,
|
|
35
39
|
IMergeTreeDeltaCallbackArgs,
|
|
@@ -100,9 +104,7 @@ export interface IIntegerRange {
|
|
|
100
104
|
* Emitted before this client's merge-tree normalizes its segments on reconnect, potentially
|
|
101
105
|
* ordering them. Useful for DDS-like consumers built atop the merge-tree to compute any information
|
|
102
106
|
* they need for rebasing their ops on reconnection.
|
|
103
|
-
* @
|
|
104
|
-
* @alpha
|
|
105
|
-
* @deprecated This functionality was not meant to be exported and will be removed in a future release
|
|
107
|
+
* @internal
|
|
106
108
|
*/
|
|
107
109
|
export interface IClientEvents {
|
|
108
110
|
(event: "normalize", listener: (target: IEventThisPlaceHolder) => void): void;
|
|
@@ -125,9 +127,12 @@ export interface IClientEvents {
|
|
|
125
127
|
}
|
|
126
128
|
|
|
127
129
|
/**
|
|
128
|
-
*
|
|
129
|
-
*
|
|
130
|
-
*
|
|
130
|
+
* This class encapsulates a merge-tree, and provides a local client specific view over it and
|
|
131
|
+
* the capability to modify it as the local client. Additionally it provides
|
|
132
|
+
* binding for processing remote ops on the encapsulated merge tree, and projects local and remote events
|
|
133
|
+
* caused by all modification to the underlying merge-tree.
|
|
134
|
+
*
|
|
135
|
+
* @internal
|
|
131
136
|
*/
|
|
132
137
|
export class Client extends TypedEventEmitter<IClientEvents> {
|
|
133
138
|
public longClientId: string | undefined;
|
|
@@ -155,7 +160,7 @@ export class Client extends TypedEventEmitter<IClientEvents> {
|
|
|
155
160
|
constructor(
|
|
156
161
|
public readonly specToSegment: (spec: IJSONSegment) => ISegment,
|
|
157
162
|
public readonly logger: ITelemetryLoggerExt,
|
|
158
|
-
options?:
|
|
163
|
+
options?: IMergeTreeOptionsInternal & PropertySet,
|
|
159
164
|
private readonly getMinInFlightRefSeq: () => number | undefined = (): undefined =>
|
|
160
165
|
undefined,
|
|
161
166
|
) {
|
|
@@ -857,7 +862,7 @@ export class Client extends TypedEventEmitter<IClientEvents> {
|
|
|
857
862
|
private resetPendingDeltaToOps(
|
|
858
863
|
resetOp: IMergeTreeDeltaOp,
|
|
859
864
|
// eslint-disable-next-line import/no-deprecated
|
|
860
|
-
segmentGroup: SegmentGroup
|
|
865
|
+
segmentGroup: SegmentGroup<ISegmentLeaf>,
|
|
861
866
|
): IMergeTreeDeltaOp[] {
|
|
862
867
|
assert(!!segmentGroup, 0x033 /* "Segment group undefined" */);
|
|
863
868
|
const NACKedSegmentGroup = this.pendingRebase?.shift()?.data;
|
|
@@ -890,7 +895,7 @@ export class Client extends TypedEventEmitter<IClientEvents> {
|
|
|
890
895
|
a.ordinal < b.ordinal ? -1 : 1,
|
|
891
896
|
)) {
|
|
892
897
|
assert(
|
|
893
|
-
segment.segmentGroups
|
|
898
|
+
segment.segmentGroups?.remove?.(segmentGroup) === true,
|
|
894
899
|
0x035 /* "Segment group not in segment pending queue" */,
|
|
895
900
|
);
|
|
896
901
|
assert(
|
|
@@ -1010,7 +1015,6 @@ export class Client extends TypedEventEmitter<IClientEvents> {
|
|
|
1010
1015
|
opList.push(newOp);
|
|
1011
1016
|
}
|
|
1012
1017
|
} else if (newOp) {
|
|
1013
|
-
// eslint-disable-next-line import/no-deprecated
|
|
1014
1018
|
const newSegmentGroup: SegmentGroup = {
|
|
1015
1019
|
segments: [],
|
|
1016
1020
|
localSeq: segmentGroup.localSeq,
|
|
@@ -1174,7 +1178,6 @@ export class Client extends TypedEventEmitter<IClientEvents> {
|
|
|
1174
1178
|
segmentGroup: SegmentGroup | SegmentGroup[],
|
|
1175
1179
|
): IMergeTreeOp {
|
|
1176
1180
|
if (this.pendingRebase === undefined || this.pendingRebase.empty) {
|
|
1177
|
-
// eslint-disable-next-line import/no-deprecated
|
|
1178
1181
|
let firstGroup: SegmentGroup;
|
|
1179
1182
|
if (Array.isArray(segmentGroup)) {
|
|
1180
1183
|
if (segmentGroup.length === 0) {
|
package/src/index.ts
CHANGED
|
@@ -42,6 +42,7 @@ export {
|
|
|
42
42
|
AttributionPolicy,
|
|
43
43
|
IMergeTreeAttributionOptions,
|
|
44
44
|
IMergeTreeOptions,
|
|
45
|
+
IMergeTreeOptionsInternal,
|
|
45
46
|
getSlideToSegoff,
|
|
46
47
|
} from "./mergeTree.js";
|
|
47
48
|
export {
|
|
@@ -65,7 +66,6 @@ export {
|
|
|
65
66
|
ISegment,
|
|
66
67
|
ISegmentAction,
|
|
67
68
|
Marker,
|
|
68
|
-
MergeNode,
|
|
69
69
|
reservedMarkerIdKey,
|
|
70
70
|
reservedMarkerSimpleTypeKey,
|
|
71
71
|
SegmentGroup,
|
|
@@ -123,8 +123,11 @@ export {
|
|
|
123
123
|
reservedRangeLabelsKey,
|
|
124
124
|
reservedTileLabelsKey,
|
|
125
125
|
} from "./referencePositions.js";
|
|
126
|
-
export {
|
|
127
|
-
|
|
126
|
+
export {
|
|
127
|
+
copyPropertiesAndManager,
|
|
128
|
+
PropertiesManager,
|
|
129
|
+
PropertiesRollback,
|
|
130
|
+
} from "./segmentPropertiesManager.js";
|
|
128
131
|
export {
|
|
129
132
|
InteriorSequencePlace,
|
|
130
133
|
Side,
|
package/src/mergeTree.ts
CHANGED
|
@@ -10,7 +10,6 @@ import { assert, Heap, IComparer } from "@fluidframework/core-utils/internal";
|
|
|
10
10
|
import { DataProcessingError, UsageError } from "@fluidframework/telemetry-utils/internal";
|
|
11
11
|
|
|
12
12
|
import { IAttributionCollectionSerializer } from "./attributionCollection.js";
|
|
13
|
-
// eslint-disable-next-line import/no-deprecated
|
|
14
13
|
import { Client } from "./client.js";
|
|
15
14
|
import { DoublyLinkedList, ListNode } from "./collections/index.js";
|
|
16
15
|
import {
|
|
@@ -80,7 +79,7 @@ import {
|
|
|
80
79
|
} from "./ops.js";
|
|
81
80
|
import { PartialSequenceLengths } from "./partialLengths.js";
|
|
82
81
|
import { PerspectiveImpl, isSegmentPresent } from "./perspective.js";
|
|
83
|
-
import { PropertySet,
|
|
82
|
+
import { PropertySet, createMap, extend, extendIfUndefined } from "./properties.js";
|
|
84
83
|
import {
|
|
85
84
|
DetachedReferencePosition,
|
|
86
85
|
ReferencePosition,
|
|
@@ -91,7 +90,11 @@ import {
|
|
|
91
90
|
// eslint-disable-next-line import/no-deprecated
|
|
92
91
|
import { SegmentGroupCollection } from "./segmentGroupCollection.js";
|
|
93
92
|
// eslint-disable-next-line import/no-deprecated
|
|
94
|
-
import {
|
|
93
|
+
import {
|
|
94
|
+
copyPropertiesAndManager,
|
|
95
|
+
PropertiesManager,
|
|
96
|
+
PropertiesRollback,
|
|
97
|
+
} from "./segmentPropertiesManager.js";
|
|
95
98
|
import { Side, type InteriorSequencePlace } from "./sequencePlace.js";
|
|
96
99
|
import { SortedSegmentSet } from "./sortedSegmentSet.js";
|
|
97
100
|
import { zamboniSegments } from "./zamboni.js";
|
|
@@ -143,6 +146,70 @@ const LRUSegmentComparer: IComparer<LRUSegment> = {
|
|
|
143
146
|
compare: (a, b) => a.maxSeq - b.maxSeq,
|
|
144
147
|
};
|
|
145
148
|
|
|
149
|
+
function ackSegment(
|
|
150
|
+
segment: ISegmentLeaf,
|
|
151
|
+
segmentGroup: SegmentGroup,
|
|
152
|
+
opArgs: IMergeTreeDeltaOpArgs,
|
|
153
|
+
): boolean {
|
|
154
|
+
const currentSegmentGroup = segment.segmentGroups?.dequeue();
|
|
155
|
+
assert(currentSegmentGroup === segmentGroup, 0x043 /* "On ack, unexpected segmentGroup!" */);
|
|
156
|
+
switch (opArgs.op.type) {
|
|
157
|
+
case MergeTreeDeltaType.ANNOTATE: {
|
|
158
|
+
assert(
|
|
159
|
+
!!segment.propertyManager,
|
|
160
|
+
0x044 /* "On annotate ack, missing segment property manager!" */,
|
|
161
|
+
);
|
|
162
|
+
segment.propertyManager.ackPendingProperties(opArgs.op);
|
|
163
|
+
return true;
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
case MergeTreeDeltaType.INSERT: {
|
|
167
|
+
assert(
|
|
168
|
+
segment.seq === UnassignedSequenceNumber,
|
|
169
|
+
0x045 /* "On insert, seq number already assigned!" */,
|
|
170
|
+
);
|
|
171
|
+
segment.seq = opArgs.sequencedMessage!.sequenceNumber;
|
|
172
|
+
segment.localSeq = undefined;
|
|
173
|
+
return true;
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
case MergeTreeDeltaType.REMOVE: {
|
|
177
|
+
const removalInfo: IRemovalInfo | undefined = toRemovalInfo(segment);
|
|
178
|
+
assert(removalInfo !== undefined, 0x046 /* "On remove ack, missing removal info!" */);
|
|
179
|
+
segment.localRemovedSeq = undefined;
|
|
180
|
+
if (removalInfo.removedSeq === UnassignedSequenceNumber) {
|
|
181
|
+
removalInfo.removedSeq = opArgs.sequencedMessage!.sequenceNumber;
|
|
182
|
+
return true;
|
|
183
|
+
}
|
|
184
|
+
return false;
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
case MergeTreeDeltaType.OBLITERATE:
|
|
188
|
+
case MergeTreeDeltaType.OBLITERATE_SIDED: {
|
|
189
|
+
const moveInfo: IMoveInfo | undefined = toMoveInfo(segment);
|
|
190
|
+
assert(moveInfo !== undefined, 0x86e /* On obliterate ack, missing move info! */);
|
|
191
|
+
const obliterateInfo = segmentGroup.obliterateInfo;
|
|
192
|
+
assert(obliterateInfo !== undefined, 0xa40 /* must have obliterate info */);
|
|
193
|
+
segment.localMovedSeq = obliterateInfo.localSeq = undefined;
|
|
194
|
+
const seqIdx = moveInfo.movedSeqs.indexOf(UnassignedSequenceNumber);
|
|
195
|
+
assert(seqIdx !== -1, 0x86f /* expected movedSeqs to contain unacked seq */);
|
|
196
|
+
moveInfo.movedSeqs[seqIdx] = obliterateInfo.seq =
|
|
197
|
+
opArgs.sequencedMessage!.sequenceNumber;
|
|
198
|
+
|
|
199
|
+
if (moveInfo.movedSeq === UnassignedSequenceNumber) {
|
|
200
|
+
moveInfo.movedSeq = opArgs.sequencedMessage!.sequenceNumber;
|
|
201
|
+
return true;
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
return false;
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
default: {
|
|
208
|
+
throw new Error(`${opArgs.op.type} is in unrecognized operation type`);
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
|
|
146
213
|
/**
|
|
147
214
|
* @legacy
|
|
148
215
|
* @alpha
|
|
@@ -177,11 +244,6 @@ export interface IMergeTreeOptions {
|
|
|
177
244
|
*/
|
|
178
245
|
newMergeTreeSnapshotFormat?: boolean;
|
|
179
246
|
|
|
180
|
-
/**
|
|
181
|
-
* Options related to attribution
|
|
182
|
-
*/
|
|
183
|
-
attribution?: IMergeTreeAttributionOptions;
|
|
184
|
-
|
|
185
247
|
/**
|
|
186
248
|
* Enables support for the obliterate operation -- a stronger form of remove
|
|
187
249
|
* which deletes concurrently inserted segments
|
|
@@ -212,6 +274,17 @@ export interface IMergeTreeOptions {
|
|
|
212
274
|
*/
|
|
213
275
|
mergeTreeEnableSidedObliterate?: boolean;
|
|
214
276
|
}
|
|
277
|
+
|
|
278
|
+
/**
|
|
279
|
+
* @internal
|
|
280
|
+
*/
|
|
281
|
+
export interface IMergeTreeOptionsInternal extends IMergeTreeOptions {
|
|
282
|
+
/**
|
|
283
|
+
* Options related to attribution
|
|
284
|
+
*/
|
|
285
|
+
attribution?: IMergeTreeAttributionOptions;
|
|
286
|
+
}
|
|
287
|
+
|
|
215
288
|
export function errorIfOptionNotTrue(
|
|
216
289
|
options: IMergeTreeOptions | undefined,
|
|
217
290
|
option: keyof IMergeTreeOptions,
|
|
@@ -222,9 +295,7 @@ export function errorIfOptionNotTrue(
|
|
|
222
295
|
}
|
|
223
296
|
|
|
224
297
|
/**
|
|
225
|
-
* @
|
|
226
|
-
* @alpha
|
|
227
|
-
* @deprecated This functionality was not meant to be exported and will be removed in a future release
|
|
298
|
+
* @internal
|
|
228
299
|
*/
|
|
229
300
|
export interface IMergeTreeAttributionOptions {
|
|
230
301
|
/**
|
|
@@ -250,9 +321,7 @@ export interface IMergeTreeAttributionOptions {
|
|
|
250
321
|
/**
|
|
251
322
|
* Implements policy dictating which kinds of operations should be attributed and how.
|
|
252
323
|
* @sealed
|
|
253
|
-
* @
|
|
254
|
-
* @alpha
|
|
255
|
-
* @deprecated This functionality was not meant to be exported and will be removed in a future release
|
|
324
|
+
* @internal
|
|
256
325
|
*/
|
|
257
326
|
export interface AttributionPolicy {
|
|
258
327
|
/**
|
|
@@ -262,7 +331,6 @@ export interface AttributionPolicy {
|
|
|
262
331
|
*
|
|
263
332
|
* This must be done in an eventually consistent fashion.
|
|
264
333
|
*/
|
|
265
|
-
// eslint-disable-next-line import/no-deprecated
|
|
266
334
|
attach: (client: Client) => void;
|
|
267
335
|
/**
|
|
268
336
|
* Disables tracking attribution information on segments.
|
|
@@ -477,7 +545,6 @@ class Obliterates {
|
|
|
477
545
|
const overlapping: ObliterateInfo[] = [];
|
|
478
546
|
for (const start of this.startOrdered.items) {
|
|
479
547
|
if (start.getSegment()!.ordinal <= seg.ordinal) {
|
|
480
|
-
// eslint-disable-next-line import/no-deprecated
|
|
481
548
|
const ob = start.properties?.obliterate as ObliterateInfo;
|
|
482
549
|
if (ob.end.getSegment()!.ordinal >= seg.ordinal) {
|
|
483
550
|
overlapping.push(ob);
|
|
@@ -527,7 +594,7 @@ export class MergeTree {
|
|
|
527
594
|
|
|
528
595
|
private readonly obliterates = new Obliterates(this);
|
|
529
596
|
|
|
530
|
-
public constructor(public options?:
|
|
597
|
+
public constructor(public options?: IMergeTreeOptionsInternal) {
|
|
531
598
|
this._root = this.makeBlock(0);
|
|
532
599
|
this._root.mergeTree = this;
|
|
533
600
|
this.attributionPolicy = options?.attribution?.policyFactory?.();
|
|
@@ -1234,7 +1301,7 @@ export class MergeTree {
|
|
|
1234
1301
|
const deltaSegments: IMergeTreeSegmentDelta[] = [];
|
|
1235
1302
|
const overlappingRemoves: boolean[] = [];
|
|
1236
1303
|
pendingSegmentGroup.segments.map((pendingSegment: ISegmentLeaf) => {
|
|
1237
|
-
const overlappingRemove = !pendingSegment
|
|
1304
|
+
const overlappingRemove = !ackSegment(pendingSegment, pendingSegmentGroup, opArgs);
|
|
1238
1305
|
|
|
1239
1306
|
overwrite = overlappingRemove || overwrite;
|
|
1240
1307
|
|
|
@@ -1538,10 +1605,8 @@ export class MergeTree {
|
|
|
1538
1605
|
continue;
|
|
1539
1606
|
}
|
|
1540
1607
|
|
|
1541
|
-
// eslint-disable-next-line import/no-deprecated
|
|
1542
1608
|
let oldest: ObliterateInfo | undefined;
|
|
1543
1609
|
let normalizedOldestSeq: number = 0;
|
|
1544
|
-
// eslint-disable-next-line import/no-deprecated
|
|
1545
1610
|
let newest: ObliterateInfo | undefined;
|
|
1546
1611
|
let normalizedNewestSeq: number = 0;
|
|
1547
1612
|
const movedClientIds: number[] = [];
|
|
@@ -1615,28 +1680,14 @@ export class MergeTree {
|
|
|
1615
1680
|
const next: ISegmentLeaf = segment.splitAt(pos)!;
|
|
1616
1681
|
|
|
1617
1682
|
if (segment?.segmentGroups) {
|
|
1618
|
-
// eslint-disable-next-line import/no-deprecated
|
|
1619
1683
|
next.segmentGroups ??= new SegmentGroupCollection(next);
|
|
1620
|
-
segment.segmentGroups.copyTo(next);
|
|
1684
|
+
segment.segmentGroups.copyTo(next.segmentGroups);
|
|
1621
1685
|
}
|
|
1622
1686
|
|
|
1623
1687
|
if (segment.prevObliterateByInserter) {
|
|
1624
1688
|
next.prevObliterateByInserter = segment.prevObliterateByInserter;
|
|
1625
1689
|
}
|
|
1626
|
-
|
|
1627
|
-
if (segment.properties) {
|
|
1628
|
-
if (segment.propertyManager === undefined) {
|
|
1629
|
-
next.properties = clone(segment.properties);
|
|
1630
|
-
} else {
|
|
1631
|
-
// eslint-disable-next-line import/no-deprecated
|
|
1632
|
-
next.propertyManager ??= new PropertiesManager();
|
|
1633
|
-
next.properties = segment.propertyManager.copyTo(
|
|
1634
|
-
segment.properties,
|
|
1635
|
-
next.properties,
|
|
1636
|
-
next.propertyManager,
|
|
1637
|
-
);
|
|
1638
|
-
}
|
|
1639
|
-
}
|
|
1690
|
+
copyPropertiesAndManager(segment, next);
|
|
1640
1691
|
if (segment.localRefs) {
|
|
1641
1692
|
segment.localRefs.split(pos, next);
|
|
1642
1693
|
}
|
|
@@ -1876,7 +1927,6 @@ export class MergeTree {
|
|
|
1876
1927
|
0x5ad /* Cannot change the markerId of an existing marker */,
|
|
1877
1928
|
);
|
|
1878
1929
|
|
|
1879
|
-
// eslint-disable-next-line import/no-deprecated
|
|
1880
1930
|
const propertyManager = (segment.propertyManager ??= new PropertiesManager());
|
|
1881
1931
|
const properties = (segment.properties ??= createMap());
|
|
1882
1932
|
const propertyDeltas = propertyManager.addProperties(
|
|
@@ -2363,7 +2413,6 @@ export class MergeTree {
|
|
|
2363
2413
|
UniversalSequenceNumber,
|
|
2364
2414
|
{ op: annotateOp },
|
|
2365
2415
|
|
|
2366
|
-
// eslint-disable-next-line import/no-deprecated
|
|
2367
2416
|
PropertiesRollback.Rollback,
|
|
2368
2417
|
);
|
|
2369
2418
|
i++;
|