@fluidframework/merge-tree 2.30.0 → 2.31.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/CHANGELOG.md +403 -399
- package/api-report/merge-tree.legacy.alpha.api.md +1 -0
- package/dist/MergeTreeTextHelper.d.ts +9 -3
- package/dist/MergeTreeTextHelper.d.ts.map +1 -1
- package/dist/MergeTreeTextHelper.js +5 -5
- package/dist/MergeTreeTextHelper.js.map +1 -1
- package/dist/client.d.ts +7 -13
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +136 -110
- package/dist/client.js.map +1 -1
- package/dist/endOfTreeSegment.d.ts +12 -8
- package/dist/endOfTreeSegment.d.ts.map +1 -1
- package/dist/endOfTreeSegment.js +2 -4
- package/dist/endOfTreeSegment.js.map +1 -1
- package/dist/index.d.ts +6 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -3
- package/dist/index.js.map +1 -1
- package/dist/mergeTree.d.ts +37 -23
- package/dist/mergeTree.d.ts.map +1 -1
- package/dist/mergeTree.js +400 -483
- package/dist/mergeTree.js.map +1 -1
- package/dist/mergeTreeDeltaCallback.d.ts +4 -8
- package/dist/mergeTreeDeltaCallback.d.ts.map +1 -1
- package/dist/mergeTreeDeltaCallback.js.map +1 -1
- package/dist/mergeTreeNodes.d.ts +32 -10
- package/dist/mergeTreeNodes.d.ts.map +1 -1
- package/dist/mergeTreeNodes.js +43 -28
- package/dist/mergeTreeNodes.js.map +1 -1
- package/dist/partialLengths.d.ts +2 -2
- package/dist/partialLengths.d.ts.map +1 -1
- package/dist/partialLengths.js +181 -109
- package/dist/partialLengths.js.map +1 -1
- package/dist/perspective.d.ts +8 -27
- package/dist/perspective.d.ts.map +1 -1
- package/dist/perspective.js +7 -67
- package/dist/perspective.js.map +1 -1
- package/dist/revertibles.d.ts.map +1 -1
- package/dist/revertibles.js +2 -2
- package/dist/revertibles.js.map +1 -1
- package/dist/segmentInfos.d.ts +20 -106
- package/dist/segmentInfos.d.ts.map +1 -1
- package/dist/segmentInfos.js +28 -42
- package/dist/segmentInfos.js.map +1 -1
- package/dist/segmentPropertiesManager.d.ts +1 -14
- package/dist/segmentPropertiesManager.d.ts.map +1 -1
- package/dist/segmentPropertiesManager.js +3 -17
- package/dist/segmentPropertiesManager.js.map +1 -1
- package/dist/snapshotLoader.d.ts.map +1 -1
- package/dist/snapshotLoader.js +62 -19
- package/dist/snapshotLoader.js.map +1 -1
- package/dist/snapshotV1.d.ts.map +1 -1
- package/dist/snapshotV1.js +55 -24
- package/dist/snapshotV1.js.map +1 -1
- package/dist/snapshotlegacy.d.ts.map +1 -1
- package/dist/snapshotlegacy.js +6 -9
- package/dist/snapshotlegacy.js.map +1 -1
- package/dist/stamps.d.ts +1 -1
- package/dist/stamps.js +1 -1
- package/dist/stamps.js.map +1 -1
- package/dist/test/Insertion.perf.spec.js +6 -51
- package/dist/test/Insertion.perf.spec.js.map +1 -1
- package/dist/test/PartialLengths.perf.spec.js +18 -25
- package/dist/test/PartialLengths.perf.spec.js.map +1 -1
- package/dist/test/Removal.perf.spec.js +13 -41
- package/dist/test/Removal.perf.spec.js.map +1 -1
- package/dist/test/beastTest.spec.d.ts.map +1 -1
- package/dist/test/beastTest.spec.js +41 -66
- package/dist/test/beastTest.spec.js.map +1 -1
- package/dist/test/client.annotateMarker.spec.js +1 -11
- package/dist/test/client.annotateMarker.spec.js.map +1 -1
- package/dist/test/client.applyMsg.spec.js +14 -14
- package/dist/test/client.applyMsg.spec.js.map +1 -1
- package/dist/test/client.getPosition.spec.js +1 -1
- package/dist/test/client.getPosition.spec.js.map +1 -1
- package/dist/test/client.localReference.spec.js +1 -1
- package/dist/test/client.localReference.spec.js.map +1 -1
- package/dist/test/client.rollback.spec.js +49 -58
- package/dist/test/client.rollback.spec.js.map +1 -1
- package/dist/test/client.rollbackFarm.spec.js +1 -1
- package/dist/test/client.rollbackFarm.spec.js.map +1 -1
- package/dist/test/client.searchForMarker.spec.js +4 -21
- package/dist/test/client.searchForMarker.spec.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 -6
- package/dist/test/index.js.map +1 -1
- package/dist/test/mergeTree.annotate.deltaCallback.spec.js +14 -59
- package/dist/test/mergeTree.annotate.deltaCallback.spec.js.map +1 -1
- package/dist/test/mergeTree.annotate.spec.js +47 -63
- package/dist/test/mergeTree.annotate.spec.js.map +1 -1
- package/dist/test/mergeTree.insert.deltaCallback.spec.js +9 -62
- package/dist/test/mergeTree.insert.deltaCallback.spec.js.map +1 -1
- package/dist/test/mergeTree.insertingWalk.spec.js +59 -125
- package/dist/test/mergeTree.insertingWalk.spec.js.map +1 -1
- package/dist/test/mergeTree.markRangeRemoved.deltaCallback.spec.js +12 -93
- package/dist/test/mergeTree.markRangeRemoved.deltaCallback.spec.js.map +1 -1
- package/dist/test/mergeTree.markRangeRemoved.spec.js +10 -7
- package/dist/test/mergeTree.markRangeRemoved.spec.js.map +1 -1
- package/dist/test/mergeTree.walk.spec.js +2 -14
- package/dist/test/mergeTree.walk.spec.js.map +1 -1
- package/dist/test/mergeTreeOperationRunner.js +2 -2
- package/dist/test/mergeTreeOperationRunner.js.map +1 -1
- package/dist/test/obliterate.concurrent.spec.js +18 -23
- package/dist/test/obliterate.concurrent.spec.js.map +1 -1
- package/dist/test/obliterate.partialLength.spec.js +166 -136
- package/dist/test/obliterate.partialLength.spec.js.map +1 -1
- package/dist/test/obliterate.spec.js +16 -126
- package/dist/test/obliterate.spec.js.map +1 -1
- package/dist/test/partialLength.spec.js +28 -196
- package/dist/test/partialLength.spec.js.map +1 -1
- package/dist/test/perspective.spec.js +34 -0
- package/dist/test/perspective.spec.js.map +1 -1
- package/dist/test/propertyManager.spec.js +1 -1
- package/dist/test/propertyManager.spec.js.map +1 -1
- package/dist/test/resetPendingSegmentsToOp.spec.js +0 -2
- package/dist/test/resetPendingSegmentsToOp.spec.js.map +1 -1
- package/dist/test/segmentGroupCollection.spec.js +10 -4
- package/dist/test/segmentGroupCollection.spec.js.map +1 -1
- package/dist/test/testClient.d.ts +1 -0
- package/dist/test/testClient.d.ts.map +1 -1
- package/dist/test/testClient.js +16 -26
- package/dist/test/testClient.js.map +1 -1
- package/dist/test/testClientLogger.d.ts.map +1 -1
- package/dist/test/testClientLogger.js +3 -10
- package/dist/test/testClientLogger.js.map +1 -1
- package/dist/test/testServer.d.ts +2 -1
- package/dist/test/testServer.d.ts.map +1 -1
- package/dist/test/testServer.js +7 -5
- package/dist/test/testServer.js.map +1 -1
- package/dist/test/testUtils.d.ts +36 -56
- package/dist/test/testUtils.d.ts.map +1 -1
- package/dist/test/testUtils.js +68 -77
- package/dist/test/testUtils.js.map +1 -1
- package/dist/test/text.d.ts +2 -2
- package/dist/test/text.d.ts.map +1 -1
- package/dist/test/text.js +5 -2
- package/dist/test/text.js.map +1 -1
- package/dist/textSegment.d.ts +0 -6
- package/dist/textSegment.d.ts.map +1 -1
- package/dist/textSegment.js.map +1 -1
- package/dist/zamboni.d.ts.map +1 -1
- package/dist/zamboni.js +53 -26
- package/dist/zamboni.js.map +1 -1
- package/lib/MergeTreeTextHelper.d.ts +9 -3
- package/lib/MergeTreeTextHelper.d.ts.map +1 -1
- package/lib/MergeTreeTextHelper.js +5 -5
- package/lib/MergeTreeTextHelper.js.map +1 -1
- package/lib/client.d.ts +7 -13
- package/lib/client.d.ts.map +1 -1
- package/lib/client.js +117 -116
- package/lib/client.js.map +1 -1
- package/lib/endOfTreeSegment.d.ts +12 -8
- package/lib/endOfTreeSegment.d.ts.map +1 -1
- package/lib/endOfTreeSegment.js +2 -4
- package/lib/endOfTreeSegment.js.map +1 -1
- package/lib/index.d.ts +6 -3
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +1 -1
- package/lib/index.js.map +1 -1
- package/lib/mergeTree.d.ts +37 -23
- package/lib/mergeTree.d.ts.map +1 -1
- package/lib/mergeTree.js +381 -488
- package/lib/mergeTree.js.map +1 -1
- package/lib/mergeTreeDeltaCallback.d.ts +4 -8
- package/lib/mergeTreeDeltaCallback.d.ts.map +1 -1
- package/lib/mergeTreeDeltaCallback.js.map +1 -1
- package/lib/mergeTreeNodes.d.ts +32 -10
- package/lib/mergeTreeNodes.d.ts.map +1 -1
- package/lib/mergeTreeNodes.js +42 -29
- package/lib/mergeTreeNodes.js.map +1 -1
- package/lib/partialLengths.d.ts +2 -2
- package/lib/partialLengths.d.ts.map +1 -1
- package/lib/partialLengths.js +160 -111
- package/lib/partialLengths.js.map +1 -1
- package/lib/perspective.d.ts +8 -27
- package/lib/perspective.d.ts.map +1 -1
- package/lib/perspective.js +8 -68
- package/lib/perspective.js.map +1 -1
- package/lib/revertibles.d.ts.map +1 -1
- package/lib/revertibles.js +2 -2
- package/lib/revertibles.js.map +1 -1
- package/lib/segmentInfos.d.ts +20 -106
- package/lib/segmentInfos.d.ts.map +1 -1
- package/lib/segmentInfos.js +26 -37
- package/lib/segmentInfos.js.map +1 -1
- package/lib/segmentPropertiesManager.d.ts +1 -14
- package/lib/segmentPropertiesManager.d.ts.map +1 -1
- package/lib/segmentPropertiesManager.js +2 -16
- package/lib/segmentPropertiesManager.js.map +1 -1
- package/lib/snapshotLoader.d.ts.map +1 -1
- package/lib/snapshotLoader.js +39 -19
- package/lib/snapshotLoader.js.map +1 -1
- package/lib/snapshotV1.d.ts.map +1 -1
- package/lib/snapshotV1.js +34 -26
- package/lib/snapshotV1.js.map +1 -1
- package/lib/snapshotlegacy.d.ts.map +1 -1
- package/lib/snapshotlegacy.js +7 -10
- package/lib/snapshotlegacy.js.map +1 -1
- package/lib/stamps.d.ts +1 -1
- package/lib/stamps.js +1 -1
- package/lib/stamps.js.map +1 -1
- package/lib/test/Insertion.perf.spec.js +6 -51
- package/lib/test/Insertion.perf.spec.js.map +1 -1
- package/lib/test/PartialLengths.perf.spec.js +18 -25
- package/lib/test/PartialLengths.perf.spec.js.map +1 -1
- package/lib/test/Removal.perf.spec.js +13 -41
- package/lib/test/Removal.perf.spec.js.map +1 -1
- package/lib/test/beastTest.spec.d.ts.map +1 -1
- package/lib/test/beastTest.spec.js +42 -67
- package/lib/test/beastTest.spec.js.map +1 -1
- package/lib/test/client.annotateMarker.spec.js +1 -11
- package/lib/test/client.annotateMarker.spec.js.map +1 -1
- package/lib/test/client.applyMsg.spec.js +14 -14
- package/lib/test/client.applyMsg.spec.js.map +1 -1
- package/lib/test/client.getPosition.spec.js +1 -1
- package/lib/test/client.getPosition.spec.js.map +1 -1
- package/lib/test/client.localReference.spec.js +1 -1
- package/lib/test/client.localReference.spec.js.map +1 -1
- package/lib/test/client.rollback.spec.js +50 -59
- package/lib/test/client.rollback.spec.js.map +1 -1
- package/lib/test/client.rollbackFarm.spec.js +1 -1
- package/lib/test/client.rollbackFarm.spec.js.map +1 -1
- package/lib/test/client.searchForMarker.spec.js +4 -21
- package/lib/test/client.searchForMarker.spec.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 +1 -1
- package/lib/test/index.js.map +1 -1
- package/lib/test/mergeTree.annotate.deltaCallback.spec.js +15 -60
- package/lib/test/mergeTree.annotate.deltaCallback.spec.js.map +1 -1
- package/lib/test/mergeTree.annotate.spec.js +48 -64
- package/lib/test/mergeTree.annotate.spec.js.map +1 -1
- package/lib/test/mergeTree.insert.deltaCallback.spec.js +10 -63
- package/lib/test/mergeTree.insert.deltaCallback.spec.js.map +1 -1
- package/lib/test/mergeTree.insertingWalk.spec.js +61 -127
- package/lib/test/mergeTree.insertingWalk.spec.js.map +1 -1
- package/lib/test/mergeTree.markRangeRemoved.deltaCallback.spec.js +13 -94
- package/lib/test/mergeTree.markRangeRemoved.deltaCallback.spec.js.map +1 -1
- package/lib/test/mergeTree.markRangeRemoved.spec.js +10 -7
- package/lib/test/mergeTree.markRangeRemoved.spec.js.map +1 -1
- package/lib/test/mergeTree.walk.spec.js +2 -14
- package/lib/test/mergeTree.walk.spec.js.map +1 -1
- package/lib/test/mergeTreeOperationRunner.js +3 -3
- package/lib/test/mergeTreeOperationRunner.js.map +1 -1
- package/lib/test/obliterate.concurrent.spec.js +18 -23
- package/lib/test/obliterate.concurrent.spec.js.map +1 -1
- package/lib/test/obliterate.partialLength.spec.js +167 -137
- package/lib/test/obliterate.partialLength.spec.js.map +1 -1
- package/lib/test/obliterate.spec.js +17 -127
- package/lib/test/obliterate.spec.js.map +1 -1
- package/lib/test/partialLength.spec.js +29 -197
- package/lib/test/partialLength.spec.js.map +1 -1
- package/lib/test/perspective.spec.js +34 -0
- package/lib/test/perspective.spec.js.map +1 -1
- package/lib/test/propertyManager.spec.js +2 -2
- package/lib/test/propertyManager.spec.js.map +1 -1
- package/lib/test/resetPendingSegmentsToOp.spec.js +0 -2
- package/lib/test/resetPendingSegmentsToOp.spec.js.map +1 -1
- package/lib/test/segmentGroupCollection.spec.js +10 -4
- package/lib/test/segmentGroupCollection.spec.js.map +1 -1
- package/lib/test/testClient.d.ts +1 -0
- package/lib/test/testClient.d.ts.map +1 -1
- package/lib/test/testClient.js +18 -28
- package/lib/test/testClient.js.map +1 -1
- package/lib/test/testClientLogger.d.ts.map +1 -1
- package/lib/test/testClientLogger.js +3 -10
- package/lib/test/testClientLogger.js.map +1 -1
- package/lib/test/testServer.d.ts +2 -1
- package/lib/test/testServer.d.ts.map +1 -1
- package/lib/test/testServer.js +7 -5
- package/lib/test/testServer.js.map +1 -1
- package/lib/test/testUtils.d.ts +36 -56
- package/lib/test/testUtils.d.ts.map +1 -1
- package/lib/test/testUtils.js +66 -48
- package/lib/test/testUtils.js.map +1 -1
- package/lib/test/text.d.ts +2 -2
- package/lib/test/text.d.ts.map +1 -1
- package/lib/test/text.js +6 -3
- package/lib/test/text.js.map +1 -1
- package/lib/textSegment.d.ts +0 -6
- package/lib/textSegment.d.ts.map +1 -1
- package/lib/textSegment.js.map +1 -1
- package/lib/tsdoc-metadata.json +1 -1
- package/lib/zamboni.d.ts.map +1 -1
- package/lib/zamboni.js +32 -28
- package/lib/zamboni.js.map +1 -1
- package/package.json +17 -20
- package/src/MergeTreeTextHelper.ts +17 -12
- package/src/client.ts +141 -197
- package/src/endOfTreeSegment.ts +11 -8
- package/src/index.ts +4 -3
- package/src/mergeTree.ts +482 -633
- package/src/mergeTreeDeltaCallback.ts +4 -8
- package/src/mergeTreeNodes.ts +66 -45
- package/src/partialLengths.ts +181 -137
- package/src/perspective.ts +17 -95
- package/src/revertibles.ts +2 -7
- package/src/segmentInfos.ts +48 -141
- package/src/segmentPropertiesManager.ts +2 -16
- package/src/snapshotLoader.ts +62 -30
- package/src/snapshotV1.ts +36 -28
- package/src/snapshotlegacy.ts +7 -16
- package/src/stamps.ts +1 -1
- package/src/textSegment.ts +0 -13
- package/src/zamboni.ts +38 -32
- package/tsconfig.json +1 -0
- package/prettier.config.cjs +0 -8
|
@@ -186,6 +186,7 @@ export type IMergeTreeDeltaOp = IMergeTreeInsertMsg | IMergeTreeRemoveMsg | IMer
|
|
|
186
186
|
export interface IMergeTreeDeltaOpArgs {
|
|
187
187
|
readonly groupOp?: IMergeTreeGroupMsg;
|
|
188
188
|
readonly op: IMergeTreeOp;
|
|
189
|
+
readonly rollback?: true;
|
|
189
190
|
readonly sequencedMessage?: ISequencedDocumentMessage;
|
|
190
191
|
}
|
|
191
192
|
|
|
@@ -2,12 +2,18 @@
|
|
|
2
2
|
* Copyright (c) Microsoft Corporation and contributors. All rights reserved.
|
|
3
3
|
* Licensed under the MIT License.
|
|
4
4
|
*/
|
|
5
|
-
import { MergeTree } from "./mergeTree.js";
|
|
6
|
-
import {
|
|
5
|
+
import type { MergeTree } from "./mergeTree.js";
|
|
6
|
+
import type { Perspective } from "./perspective.js";
|
|
7
|
+
/**
|
|
8
|
+
* @internal
|
|
9
|
+
*/
|
|
10
|
+
export interface IMergeTreeTextHelper {
|
|
11
|
+
getText(perspective: Perspective, placeholder: string, start?: number, end?: number): string;
|
|
12
|
+
}
|
|
7
13
|
export declare class MergeTreeTextHelper implements IMergeTreeTextHelper {
|
|
8
14
|
private readonly mergeTree;
|
|
9
15
|
constructor(mergeTree: MergeTree);
|
|
10
|
-
getText(
|
|
16
|
+
getText(perspective: Perspective, placeholder?: string, start?: number, end?: number): string;
|
|
11
17
|
private getValidRange;
|
|
12
18
|
}
|
|
13
19
|
//# sourceMappingURL=MergeTreeTextHelper.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MergeTreeTextHelper.d.ts","sourceRoot":"","sources":["../src/MergeTreeTextHelper.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"MergeTreeTextHelper.d.ts","sourceRoot":"","sources":["../src/MergeTreeTextHelper.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAEhD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AASpD;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACpC,OAAO,CAAC,WAAW,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;CAC7F;AAED,qBAAa,mBAAoB,YAAW,oBAAoB;IACnD,OAAO,CAAC,QAAQ,CAAC,SAAS;gBAAT,SAAS,EAAE,SAAS;IAE1C,OAAO,CACb,WAAW,EAAE,WAAW,EACxB,WAAW,SAAK,EAChB,KAAK,CAAC,EAAE,MAAM,EACd,GAAG,CAAC,EAAE,MAAM,GACV,MAAM;IAeT,OAAO,CAAC,aAAa;CAWrB"}
|
|
@@ -10,15 +10,15 @@ class MergeTreeTextHelper {
|
|
|
10
10
|
constructor(mergeTree) {
|
|
11
11
|
this.mergeTree = mergeTree;
|
|
12
12
|
}
|
|
13
|
-
getText(
|
|
14
|
-
const range = this.getValidRange(start, end,
|
|
13
|
+
getText(perspective, placeholder = "", start, end) {
|
|
14
|
+
const range = this.getValidRange(start, end, perspective);
|
|
15
15
|
const accum = { textSegment: new textSegment_js_1.TextSegment(""), placeholder };
|
|
16
|
-
this.mergeTree.mapRange(gatherText,
|
|
16
|
+
this.mergeTree.mapRange(gatherText, perspective, accum, range.start, range.end);
|
|
17
17
|
return accum.textSegment.text;
|
|
18
18
|
}
|
|
19
|
-
getValidRange(start, end,
|
|
19
|
+
getValidRange(start, end, perspective) {
|
|
20
20
|
const range = {
|
|
21
|
-
end: end ?? this.mergeTree.getLength(
|
|
21
|
+
end: end ?? this.mergeTree.getLength(perspective),
|
|
22
22
|
start: start ?? 0,
|
|
23
23
|
};
|
|
24
24
|
return range;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MergeTreeTextHelper.js","sourceRoot":"","sources":["../src/MergeTreeTextHelper.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;
|
|
1
|
+
{"version":3,"file":"MergeTreeTextHelper.js","sourceRoot":"","sources":["../src/MergeTreeTextHelper.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAMH,qDAA+C;AAe/C,MAAa,mBAAmB;IAC/B,YAA6B,SAAoB;QAApB,cAAS,GAAT,SAAS,CAAW;IAAG,CAAC;IAE9C,OAAO,CACb,WAAwB,EACxB,WAAW,GAAG,EAAE,EAChB,KAAc,EACd,GAAY;QAEZ,MAAM,KAAK,GAAG,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,GAAG,EAAE,WAAW,CAAC,CAAC;QAE1D,MAAM,KAAK,GAAqB,EAAE,WAAW,EAAE,IAAI,4BAAW,CAAC,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC;QAElF,IAAI,CAAC,SAAS,CAAC,QAAQ,CACtB,UAAU,EACV,WAAW,EACX,KAAK,EACL,KAAK,CAAC,KAAK,EACX,KAAK,CAAC,GAAG,CACT,CAAC;QACF,OAAO,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC;IAC/B,CAAC;IAEO,aAAa,CACpB,KAAyB,EACzB,GAAuB,EACvB,WAAwB;QAExB,MAAM,KAAK,GAAkB;YAC5B,GAAG,EAAE,GAAG,IAAI,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,WAAW,CAAC;YACjD,KAAK,EAAE,KAAK,IAAI,CAAC;SACjB,CAAC;QACF,OAAO,KAAK,CAAC;IACd,CAAC;CACD;AAlCD,kDAkCC;AAED,SAAS,UAAU,CAClB,OAAwB,EACxB,GAAW,EACX,MAAc,EACd,QAAgB,EAChB,KAAa,EACb,GAAW,EACX,EAAE,WAAW,EAAE,WAAW,EAAoB;IAE9C,IAAI,4BAAW,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC;QAC7B,IAAI,KAAK,IAAI,CAAC,IAAI,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YAC9C,WAAW,CAAC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;QAClC,CAAC;aAAM,CAAC;YACP,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC;YACnC,MAAM,MAAM,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;YACrC,MAAM,IAAI,GAAG,GAAG,IAAI,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC;YAC7C,WAAW,CAAC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QACtD,CAAC;IACF,CAAC;SAAM,IAAI,WAAW,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAClD,MAAM,eAAe;QACpB,gEAAgE;QAChE,WAAW,KAAK,GAAG,CAAC,CAAC,CAAC,KAAK,OAAO,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;QACjF,WAAW,CAAC,IAAI,IAAI,eAAe,CAAC;IACrC,CAAC;IAED,OAAO,IAAI,CAAC;AACb,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport type { IIntegerRange } from \"./client.js\";\nimport type { MergeTree } from \"./mergeTree.js\";\nimport type { ISegmentPrivate } from \"./mergeTreeNodes.js\";\nimport type { Perspective } from \"./perspective.js\";\nimport { TextSegment } from \"./textSegment.js\";\n\ninterface ITextAccumulator {\n\ttextSegment: TextSegment;\n\tplaceholder?: string;\n\tparallelArrays?: boolean;\n}\n\n/**\n * @internal\n */\nexport interface IMergeTreeTextHelper {\n\tgetText(perspective: Perspective, placeholder: string, start?: number, end?: number): string;\n}\n\nexport class MergeTreeTextHelper implements IMergeTreeTextHelper {\n\tconstructor(private readonly mergeTree: MergeTree) {}\n\n\tpublic getText(\n\t\tperspective: Perspective,\n\t\tplaceholder = \"\",\n\t\tstart?: number,\n\t\tend?: number,\n\t): string {\n\t\tconst range = this.getValidRange(start, end, perspective);\n\n\t\tconst accum: ITextAccumulator = { textSegment: new TextSegment(\"\"), placeholder };\n\n\t\tthis.mergeTree.mapRange<ITextAccumulator>(\n\t\t\tgatherText,\n\t\t\tperspective,\n\t\t\taccum,\n\t\t\trange.start,\n\t\t\trange.end,\n\t\t);\n\t\treturn accum.textSegment.text;\n\t}\n\n\tprivate getValidRange(\n\t\tstart: number | undefined,\n\t\tend: number | undefined,\n\t\tperspective: Perspective,\n\t): IIntegerRange {\n\t\tconst range: IIntegerRange = {\n\t\t\tend: end ?? this.mergeTree.getLength(perspective),\n\t\t\tstart: start ?? 0,\n\t\t};\n\t\treturn range;\n\t}\n}\n\nfunction gatherText(\n\tsegment: ISegmentPrivate,\n\tpos: number,\n\trefSeq: number,\n\tclientId: number,\n\tstart: number,\n\tend: number,\n\t{ textSegment, placeholder }: ITextAccumulator,\n): boolean {\n\tif (TextSegment.is(segment)) {\n\t\tif (start <= 0 && end >= segment.text.length) {\n\t\t\ttextSegment.text += segment.text;\n\t\t} else {\n\t\t\tconst seglen = segment.text.length;\n\t\t\tconst _start = start < 0 ? 0 : start;\n\t\t\tconst _end = end >= seglen ? undefined : end;\n\t\t\ttextSegment.text += segment.text.slice(_start, _end);\n\t\t}\n\t} else if (placeholder && placeholder.length > 0) {\n\t\tconst placeholderText =\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-base-to-string\n\t\t\tplaceholder === \"*\" ? `\\n${segment}` : placeholder.repeat(segment.cachedLength);\n\t\ttextSegment.text += placeholderText;\n\t}\n\n\treturn true;\n}\n"]}
|
package/dist/client.d.ts
CHANGED
|
@@ -9,6 +9,7 @@ import { ISequencedDocumentMessage } from "@fluidframework/driver-definitions/in
|
|
|
9
9
|
import { ISummaryTreeWithStats } from "@fluidframework/runtime-definitions/internal";
|
|
10
10
|
import { IFluidSerializer } from "@fluidframework/shared-object-base/internal";
|
|
11
11
|
import { ITelemetryLoggerExt } from "@fluidframework/telemetry-utils/internal";
|
|
12
|
+
import { type IMergeTreeTextHelper } from "./MergeTreeTextHelper.js";
|
|
12
13
|
import { LocalReferencePosition, SlidingPreference } from "./localReference.js";
|
|
13
14
|
import { type IMergeTreeOptionsInternal } from "./mergeTree.js";
|
|
14
15
|
import type { IMergeTreeDeltaCallbackArgs, IMergeTreeDeltaOpArgs, IMergeTreeMaintenanceCallbackArgs } from "./mergeTreeDeltaCallback.js";
|
|
@@ -17,7 +18,6 @@ import { IJSONSegment, IMergeTreeAnnotateMsg, IMergeTreeGroupMsg, IMergeTreeInse
|
|
|
17
18
|
import { PropertySet, type MapLike } from "./properties.js";
|
|
18
19
|
import { ReferencePosition } from "./referencePositions.js";
|
|
19
20
|
import { type InteriorSequencePlace } from "./sequencePlace.js";
|
|
20
|
-
import { IMergeTreeTextHelper } from "./textSegment.js";
|
|
21
21
|
/**
|
|
22
22
|
* A range [start, end)
|
|
23
23
|
* @internal
|
|
@@ -175,8 +175,13 @@ export declare class Client extends TypedEventEmitter<IClientEvents> {
|
|
|
175
175
|
/**
|
|
176
176
|
* Revert an op
|
|
177
177
|
*/
|
|
178
|
-
rollback
|
|
178
|
+
rollback(op: unknown, localOpMetadata: unknown): void;
|
|
179
179
|
private applyObliterateRangeOp;
|
|
180
|
+
private getOperationPerspective;
|
|
181
|
+
/**
|
|
182
|
+
* Returns the operation stamp to apply for a change, minting a new one local one if necessary.
|
|
183
|
+
*/
|
|
184
|
+
private getOperationStamp;
|
|
180
185
|
/**
|
|
181
186
|
* Performs the remove based on the provided op
|
|
182
187
|
* @param opArgs - The ops args for the op
|
|
@@ -206,16 +211,6 @@ export declare class Client extends TypedEventEmitter<IClientEvents> {
|
|
|
206
211
|
* @param clientArgs - The client args for the op
|
|
207
212
|
*/
|
|
208
213
|
private getValidOpRange;
|
|
209
|
-
/**
|
|
210
|
-
* Gets the client args from the op if remote, otherwise uses the local clients info
|
|
211
|
-
* @param sequencedMessage - The sequencedMessage to get the client sequence args for
|
|
212
|
-
*/
|
|
213
|
-
private getClientSequenceArgsForMessage;
|
|
214
|
-
/**
|
|
215
|
-
* Gets the client args from the op if remote, otherwise uses the local clients info
|
|
216
|
-
* @param opArgs - The op arg to get the client sequence args for
|
|
217
|
-
*/
|
|
218
|
-
private getClientSequenceArgs;
|
|
219
214
|
private ackPendingSegment;
|
|
220
215
|
getOrAddShortClientId(longClientId: string): number;
|
|
221
216
|
protected getShortClientId(longClientId: string): number;
|
|
@@ -260,7 +255,6 @@ export declare class Client extends TypedEventEmitter<IClientEvents> {
|
|
|
260
255
|
load(runtime: IFluidDataStoreRuntime, storage: IChannelStorageService, serializer: IFluidSerializer): Promise<{
|
|
261
256
|
catchupOpsP: Promise<ISequencedDocumentMessage[]>;
|
|
262
257
|
}>;
|
|
263
|
-
private getLocalSequenceNumber;
|
|
264
258
|
localTransaction(groupOp: IMergeTreeGroupMsg): void;
|
|
265
259
|
updateMinSeq(minSeq: number): void;
|
|
266
260
|
getContainingSegment<T extends ISegment>(pos: number, sequenceArgs?: Pick<ISequencedDocumentMessage, "referenceSequenceNumber" | "clientId">, localSeq?: number): {
|
package/dist/client.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AACjE,OAAO,EAAE,KAAK,qBAAqB,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAE3F,OAAO,EACN,sBAAsB,EACtB,sBAAsB,EACtB,MAAM,gDAAgD,CAAC;AACxD,OAAO,EAEN,yBAAyB,EACzB,MAAM,6CAA6C,CAAC;AACrD,OAAO,EAAE,qBAAqB,EAAE,MAAM,8CAA8C,CAAC;AAErF,OAAO,EAAE,gBAAgB,EAAE,MAAM,6CAA6C,CAAC;AAC/E,OAAO,EACN,mBAAmB,EAGnB,MAAM,0CAA0C,CAAC;
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|
package/dist/client.js
CHANGED
|
@@ -3,6 +3,29 @@
|
|
|
3
3
|
* Copyright (c) Microsoft Corporation and contributors. All rights reserved.
|
|
4
4
|
* Licensed under the MIT License.
|
|
5
5
|
*/
|
|
6
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
7
|
+
if (k2 === undefined) k2 = k;
|
|
8
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
9
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
10
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
11
|
+
}
|
|
12
|
+
Object.defineProperty(o, k2, desc);
|
|
13
|
+
}) : (function(o, m, k, k2) {
|
|
14
|
+
if (k2 === undefined) k2 = k;
|
|
15
|
+
o[k2] = m[k];
|
|
16
|
+
}));
|
|
17
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
18
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
19
|
+
}) : function(o, v) {
|
|
20
|
+
o["default"] = v;
|
|
21
|
+
});
|
|
22
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
23
|
+
if (mod && mod.__esModule) return mod;
|
|
24
|
+
var result = {};
|
|
25
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
26
|
+
__setModuleDefault(result, mod);
|
|
27
|
+
return result;
|
|
28
|
+
};
|
|
6
29
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
30
|
exports.Client = void 0;
|
|
8
31
|
/* eslint-disable @typescript-eslint/no-non-null-assertion */
|
|
@@ -19,12 +42,14 @@ const mergeTreeNodeWalk_js_1 = require("./mergeTreeNodeWalk.js");
|
|
|
19
42
|
const mergeTreeNodes_js_1 = require("./mergeTreeNodes.js");
|
|
20
43
|
const opBuilder_js_1 = require("./opBuilder.js");
|
|
21
44
|
const ops_js_1 = require("./ops.js");
|
|
45
|
+
const perspective_js_1 = require("./perspective.js");
|
|
22
46
|
const referencePositions_js_1 = require("./referencePositions.js");
|
|
23
47
|
const segmentInfos_js_1 = require("./segmentInfos.js");
|
|
24
48
|
const sequencePlace_js_1 = require("./sequencePlace.js");
|
|
25
49
|
const snapshotLoader_js_1 = require("./snapshotLoader.js");
|
|
26
50
|
const snapshotV1_js_1 = require("./snapshotV1.js");
|
|
27
51
|
const snapshotlegacy_js_1 = require("./snapshotlegacy.js");
|
|
52
|
+
const opstampUtils = __importStar(require("./stamps.js"));
|
|
28
53
|
const UNBOUND_SEGMENT_ERROR = "The provided segment is not bound to this DDS.";
|
|
29
54
|
/**
|
|
30
55
|
* This class encapsulates a merge-tree, and provides a local client specific view over it and
|
|
@@ -187,7 +212,7 @@ class Client extends client_utils_1.TypedEventEmitter {
|
|
|
187
212
|
return this.insertSegmentLocal(pos, segment);
|
|
188
213
|
}
|
|
189
214
|
walkSegments(handler, start, end, accum, splitRange = false) {
|
|
190
|
-
this._mergeTree.mapRange(handler, this.
|
|
215
|
+
this._mergeTree.mapRange(handler, this._mergeTree.localPerspective, accum, start, end, splitRange);
|
|
191
216
|
}
|
|
192
217
|
walkAllSegments(action, accum) {
|
|
193
218
|
return (0, mergeTreeNodeWalk_js_1.walkAllChildSegments)(this._mergeTree.root, accum === undefined ? action : (seg) => action(seg, accum));
|
|
@@ -200,12 +225,18 @@ class Client extends client_utils_1.TypedEventEmitter {
|
|
|
200
225
|
serializeGCData(handle, handleCollectingSerializer) {
|
|
201
226
|
let localInserts = 0;
|
|
202
227
|
let localRemoves = 0;
|
|
228
|
+
let localObliterates = 0;
|
|
203
229
|
(0, mergeTreeNodeWalk_js_1.walkAllChildSegments)(this._mergeTree.root, (seg) => {
|
|
204
|
-
if ((0, segmentInfos_js_1.isInserted)(seg) && seg.
|
|
230
|
+
if ((0, segmentInfos_js_1.isInserted)(seg) && opstampUtils.isLocal(seg.insert)) {
|
|
205
231
|
localInserts++;
|
|
206
232
|
}
|
|
207
|
-
if ((0, segmentInfos_js_1.isRemoved)(seg) && seg.
|
|
208
|
-
|
|
233
|
+
if ((0, segmentInfos_js_1.isRemoved)(seg) && opstampUtils.isLocal(seg.removes[seg.removes.length - 1])) {
|
|
234
|
+
if (seg.removes[seg.removes.length - 1].type === "setRemove") {
|
|
235
|
+
localRemoves++;
|
|
236
|
+
}
|
|
237
|
+
else {
|
|
238
|
+
localObliterates++;
|
|
239
|
+
}
|
|
209
240
|
}
|
|
210
241
|
// Only serialize segments that have not been removed.
|
|
211
242
|
if (!(0, segmentInfos_js_1.isRemoved)(seg)) {
|
|
@@ -218,6 +249,7 @@ class Client extends client_utils_1.TypedEventEmitter {
|
|
|
218
249
|
eventName: "LocalEditsInProcessGCData",
|
|
219
250
|
localInserts,
|
|
220
251
|
localRemoves,
|
|
252
|
+
localObliterates,
|
|
221
253
|
});
|
|
222
254
|
}
|
|
223
255
|
}
|
|
@@ -233,7 +265,10 @@ class Client extends client_utils_1.TypedEventEmitter {
|
|
|
233
265
|
if (!(0, mergeTreeNodes_js_1.isSegmentLeaf)(segment)) {
|
|
234
266
|
return -1;
|
|
235
267
|
}
|
|
236
|
-
|
|
268
|
+
const perspective = localSeq === undefined
|
|
269
|
+
? this._mergeTree.localPerspective
|
|
270
|
+
: new perspective_js_1.LocalReconnectingPerspective(this.getCurrentSeq(), this.getClientId(), localSeq);
|
|
271
|
+
return this._mergeTree.getPosition(segment, perspective);
|
|
237
272
|
}
|
|
238
273
|
/**
|
|
239
274
|
* Creates a `LocalReferencePosition` on this client. If the refType does not include ReferenceType.Transient,
|
|
@@ -275,7 +310,7 @@ class Client extends client_utils_1.TypedEventEmitter {
|
|
|
275
310
|
* @param relativePos - Id of marker (may be indirect) and whether position is before or after marker.
|
|
276
311
|
*/
|
|
277
312
|
posFromRelativePos(relativePos) {
|
|
278
|
-
return this._mergeTree.posFromRelativePos(relativePos);
|
|
313
|
+
return this._mergeTree.posFromRelativePos(relativePos, this._mergeTree.localPerspective);
|
|
279
314
|
}
|
|
280
315
|
getMarkerFromId(id) {
|
|
281
316
|
return this._mergeTree.getMarkerFromId(id);
|
|
@@ -287,41 +322,66 @@ class Client extends client_utils_1.TypedEventEmitter {
|
|
|
287
322
|
this._mergeTree.rollback(op, localOpMetadata);
|
|
288
323
|
}
|
|
289
324
|
applyObliterateRangeOp(opArgs) {
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
const
|
|
325
|
+
const { op, sequencedMessage } = opArgs;
|
|
326
|
+
(0, internal_1.assert)(op.type === ops_js_1.MergeTreeDeltaType.OBLITERATE ||
|
|
327
|
+
op.type === ops_js_1.MergeTreeDeltaType.OBLITERATE_SIDED, 0x866 /* Unexpected op type on range obliterate! */);
|
|
328
|
+
const perspective = this.getOperationPerspective(sequencedMessage);
|
|
329
|
+
const stamp = this.getOperationStamp(sequencedMessage);
|
|
294
330
|
if (this._mergeTree.options?.mergeTreeEnableSidedObliterate) {
|
|
295
|
-
const { start, end } = this.getValidSidedRange(op,
|
|
296
|
-
this._mergeTree.obliterateRange(start, end,
|
|
331
|
+
const { start, end } = this.getValidSidedRange(op, perspective);
|
|
332
|
+
this._mergeTree.obliterateRange(start, end, perspective, stamp, opArgs);
|
|
297
333
|
}
|
|
298
334
|
else {
|
|
299
335
|
(0, internal_1.assert)(op.type === ops_js_1.MergeTreeDeltaType.OBLITERATE, 0xa43 /* Unexpected sided obliterate while mergeTreeEnableSidedObliterate is disabled */);
|
|
300
|
-
const
|
|
301
|
-
this._mergeTree.obliterateRange(
|
|
336
|
+
const { start, end } = this.getValidOpRange(op, perspective);
|
|
337
|
+
this._mergeTree.obliterateRange(start, end, perspective, stamp, opArgs);
|
|
302
338
|
}
|
|
303
339
|
}
|
|
340
|
+
getOperationPerspective(sequencedMessage) {
|
|
341
|
+
if (!sequencedMessage) {
|
|
342
|
+
return this._mergeTree.localPerspective;
|
|
343
|
+
}
|
|
344
|
+
const clientId = this.getOrAddShortClientIdFromMessage(sequencedMessage);
|
|
345
|
+
const { referenceSequenceNumber: refSeq } = sequencedMessage;
|
|
346
|
+
return new perspective_js_1.PriorPerspective(refSeq, clientId);
|
|
347
|
+
}
|
|
348
|
+
/**
|
|
349
|
+
* Returns the operation stamp to apply for a change, minting a new one local one if necessary.
|
|
350
|
+
*/
|
|
351
|
+
getOperationStamp(sequencedMessage) {
|
|
352
|
+
if (!sequencedMessage) {
|
|
353
|
+
return this.getCollabWindow().mintNextLocalOperationStamp();
|
|
354
|
+
}
|
|
355
|
+
const { sequenceNumber: seq } = sequencedMessage;
|
|
356
|
+
const clientId = this.getOrAddShortClientIdFromMessage(sequencedMessage);
|
|
357
|
+
return {
|
|
358
|
+
seq,
|
|
359
|
+
clientId,
|
|
360
|
+
};
|
|
361
|
+
}
|
|
304
362
|
/**
|
|
305
363
|
* Performs the remove based on the provided op
|
|
306
364
|
* @param opArgs - The ops args for the op
|
|
307
365
|
*/
|
|
308
366
|
applyRemoveRangeOp(opArgs) {
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
const
|
|
312
|
-
const
|
|
313
|
-
|
|
367
|
+
const { op, sequencedMessage } = opArgs;
|
|
368
|
+
(0, internal_1.assert)(op.type === ops_js_1.MergeTreeDeltaType.REMOVE, 0x02d /* "Unexpected op type on range remove!" */);
|
|
369
|
+
const perspective = this.getOperationPerspective(sequencedMessage);
|
|
370
|
+
const stamp = this.getOperationStamp(sequencedMessage);
|
|
371
|
+
const range = this.getValidOpRange(op, perspective);
|
|
372
|
+
this._mergeTree.markRangeRemoved(range.start, range.end, perspective, stamp, opArgs);
|
|
314
373
|
}
|
|
315
374
|
/**
|
|
316
375
|
* Performs the annotate based on the provided op
|
|
317
376
|
* @param opArgs - The ops args for the op
|
|
318
377
|
*/
|
|
319
378
|
applyAnnotateRangeOp(opArgs) {
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
const
|
|
323
|
-
const
|
|
324
|
-
|
|
379
|
+
const { op, sequencedMessage } = opArgs;
|
|
380
|
+
(0, internal_1.assert)(op.type === ops_js_1.MergeTreeDeltaType.ANNOTATE, 0x02e /* "Unexpected op type on range annotate!" */);
|
|
381
|
+
const perspective = this.getOperationPerspective(sequencedMessage);
|
|
382
|
+
const stamp = this.getOperationStamp(sequencedMessage);
|
|
383
|
+
const range = this.getValidOpRange(op, perspective);
|
|
384
|
+
this._mergeTree.annotateRange(range.start, range.end, op, perspective, stamp, opArgs);
|
|
325
385
|
}
|
|
326
386
|
/**
|
|
327
387
|
* Performs the insert based on the provided op
|
|
@@ -329,13 +389,14 @@ class Client extends client_utils_1.TypedEventEmitter {
|
|
|
329
389
|
* @returns True if the insert was applied. False if it could not be.
|
|
330
390
|
*/
|
|
331
391
|
applyInsertOp(opArgs) {
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
const
|
|
335
|
-
const
|
|
392
|
+
const { op, sequencedMessage } = opArgs;
|
|
393
|
+
(0, internal_1.assert)(op.type === ops_js_1.MergeTreeDeltaType.INSERT, 0x02f /* "Unexpected op type on range insert!" */);
|
|
394
|
+
const perspective = this.getOperationPerspective(sequencedMessage);
|
|
395
|
+
const stamp = this.getOperationStamp(sequencedMessage);
|
|
396
|
+
const range = this.getValidOpRange(op, perspective);
|
|
336
397
|
// eslint-disable-next-line @typescript-eslint/no-unsafe-argument
|
|
337
398
|
const segments = [this.specToSegment(op.seg)];
|
|
338
|
-
this._mergeTree.insertSegments(range.start, segments,
|
|
399
|
+
this._mergeTree.insertSegments(range.start, segments, perspective, stamp, opArgs);
|
|
339
400
|
}
|
|
340
401
|
/**
|
|
341
402
|
* Returns a valid range for the op, or throws if the range is invalid
|
|
@@ -345,7 +406,7 @@ class Client extends client_utils_1.TypedEventEmitter {
|
|
|
345
406
|
*/
|
|
346
407
|
getValidSidedRange(
|
|
347
408
|
// eslint-disable-next-line import/no-deprecated
|
|
348
|
-
op,
|
|
409
|
+
op, perspective) {
|
|
349
410
|
const invalidPositions = [];
|
|
350
411
|
let start;
|
|
351
412
|
let end;
|
|
@@ -368,8 +429,8 @@ class Client extends client_utils_1.TypedEventEmitter {
|
|
|
368
429
|
: { pos: op.pos2 - 1, side: sequencePlace_js_1.Side.After };
|
|
369
430
|
}
|
|
370
431
|
// Validate if local op
|
|
371
|
-
if (
|
|
372
|
-
const length = this._mergeTree.getLength(this.
|
|
432
|
+
if (perspective.clientId === this.getClientId()) {
|
|
433
|
+
const length = this._mergeTree.getLength(this._mergeTree.localPerspective);
|
|
373
434
|
if (start !== undefined && (start.pos >= length || start.pos < 0)) {
|
|
374
435
|
// start out of bounds
|
|
375
436
|
invalidPositions.push("start");
|
|
@@ -407,17 +468,17 @@ class Client extends client_utils_1.TypedEventEmitter {
|
|
|
407
468
|
* @param op - The op to generate the range for
|
|
408
469
|
* @param clientArgs - The client args for the op
|
|
409
470
|
*/
|
|
410
|
-
getValidOpRange(op,
|
|
471
|
+
getValidOpRange(op, perspective) {
|
|
411
472
|
let start = op.pos1;
|
|
412
473
|
if (start === undefined && op.relativePos1) {
|
|
413
|
-
start = this._mergeTree.posFromRelativePos(op.relativePos1,
|
|
474
|
+
start = this._mergeTree.posFromRelativePos(op.relativePos1, perspective);
|
|
414
475
|
}
|
|
415
476
|
let end = op.pos2;
|
|
416
477
|
if (end === undefined && op.relativePos2) {
|
|
417
|
-
end = this._mergeTree.posFromRelativePos(op.relativePos2,
|
|
478
|
+
end = this._mergeTree.posFromRelativePos(op.relativePos2, perspective);
|
|
418
479
|
}
|
|
419
480
|
// Validate if local op
|
|
420
|
-
if (
|
|
481
|
+
if (perspective.clientId === this.getClientId()) {
|
|
421
482
|
const length = this.getLength();
|
|
422
483
|
const invalidPositions = [];
|
|
423
484
|
// Validate start position
|
|
@@ -454,39 +515,6 @@ class Client extends client_utils_1.TypedEventEmitter {
|
|
|
454
515
|
// start and end are guaranteed to be non-null here, otherwise we throw above.
|
|
455
516
|
return { start: start, end: end };
|
|
456
517
|
}
|
|
457
|
-
/**
|
|
458
|
-
* Gets the client args from the op if remote, otherwise uses the local clients info
|
|
459
|
-
* @param sequencedMessage - The sequencedMessage to get the client sequence args for
|
|
460
|
-
*/
|
|
461
|
-
getClientSequenceArgsForMessage(sequencedMessage) {
|
|
462
|
-
// If there this no sequenced message, then the op is local
|
|
463
|
-
// and unacked, so use this clients sequenced args
|
|
464
|
-
//
|
|
465
|
-
if (sequencedMessage) {
|
|
466
|
-
return {
|
|
467
|
-
clientId: this.getOrAddShortClientIdFromMessage(sequencedMessage),
|
|
468
|
-
referenceSequenceNumber: sequencedMessage.referenceSequenceNumber,
|
|
469
|
-
// Note: return value satisfies overload signatures despite the cast, as if input argument doesn't contain sequenceNumber,
|
|
470
|
-
// return value isn't expected to have it either.
|
|
471
|
-
sequenceNumber: sequencedMessage.sequenceNumber,
|
|
472
|
-
};
|
|
473
|
-
}
|
|
474
|
-
else {
|
|
475
|
-
const segWindow = this.getCollabWindow();
|
|
476
|
-
return {
|
|
477
|
-
clientId: segWindow.clientId,
|
|
478
|
-
referenceSequenceNumber: segWindow.currentSeq,
|
|
479
|
-
sequenceNumber: this.getLocalSequenceNumber(),
|
|
480
|
-
};
|
|
481
|
-
}
|
|
482
|
-
}
|
|
483
|
-
/**
|
|
484
|
-
* Gets the client args from the op if remote, otherwise uses the local clients info
|
|
485
|
-
* @param opArgs - The op arg to get the client sequence args for
|
|
486
|
-
*/
|
|
487
|
-
getClientSequenceArgs(opArgs) {
|
|
488
|
-
return this.getClientSequenceArgsForMessage(opArgs.sequencedMessage);
|
|
489
|
-
}
|
|
490
518
|
ackPendingSegment(opArgs) {
|
|
491
519
|
if (opArgs.op.type === ops_js_1.MergeTreeDeltaType.GROUP) {
|
|
492
520
|
for (const memberOp of opArgs.op.ops) {
|
|
@@ -535,7 +563,8 @@ class Client extends client_utils_1.TypedEventEmitter {
|
|
|
535
563
|
if (!(0, mergeTreeNodes_js_1.isSegmentLeaf)(segment)) {
|
|
536
564
|
throw new internal_4.UsageError(UNBOUND_SEGMENT_ERROR);
|
|
537
565
|
}
|
|
538
|
-
|
|
566
|
+
const perspective = new perspective_js_1.LocalReconnectingPerspective(currentSeq, clientId, localSeq);
|
|
567
|
+
return this._mergeTree.getPosition(segment, perspective);
|
|
539
568
|
}
|
|
540
569
|
resetPendingDeltaToOps(resetOp, segmentGroup) {
|
|
541
570
|
(0, internal_1.assert)(!!segmentGroup, 0x033 /* "Segment group undefined" */);
|
|
@@ -571,12 +600,7 @@ class Client extends client_utils_1.TypedEventEmitter {
|
|
|
571
600
|
// if the segment has been removed or obliterated, there's no need to send the annotate op
|
|
572
601
|
// unless the remove was local, in which case the annotate must have come
|
|
573
602
|
// before the remove
|
|
574
|
-
if (
|
|
575
|
-
(segment.localRemovedSeq !== undefined &&
|
|
576
|
-
segment.removedSeq === constants_js_1.UnassignedSequenceNumber)) &&
|
|
577
|
-
(!(0, segmentInfos_js_1.isMoved)(segment) ||
|
|
578
|
-
(segment.localMovedSeq !== undefined &&
|
|
579
|
-
segment.movedSeq === constants_js_1.UnassignedSequenceNumber))) {
|
|
603
|
+
if (!(0, mergeTree_js_1.isRemovedAndAcked)(segment)) {
|
|
580
604
|
newOp =
|
|
581
605
|
resetOp.props === undefined
|
|
582
606
|
? (0, opBuilder_js_1.createAdjustRangeOp)(segmentPosition, segmentPosition + segment.cachedLength, resetOp.adjust)
|
|
@@ -585,22 +609,24 @@ class Client extends client_utils_1.TypedEventEmitter {
|
|
|
585
609
|
break;
|
|
586
610
|
}
|
|
587
611
|
case ops_js_1.MergeTreeDeltaType.INSERT: {
|
|
588
|
-
(0, internal_1.assert)((0, segmentInfos_js_1.isInserted)(segment) && segment.
|
|
589
|
-
const
|
|
590
|
-
if (
|
|
612
|
+
(0, internal_1.assert)((0, segmentInfos_js_1.isInserted)(segment) && opstampUtils.isLocal(segment.insert), 0x037 /* "Segment already has assigned sequence number" */);
|
|
613
|
+
const removeInfo = (0, segmentInfos_js_1.toRemovalInfo)(segment);
|
|
614
|
+
if (removeInfo !== undefined && opstampUtils.isAcked(removeInfo.removes[0])) {
|
|
615
|
+
(0, internal_1.assert)(removeInfo.removes[0].type === "sliceRemove", 0xb5c /* Remove on insertion must be caused by obliterate. */);
|
|
591
616
|
(0, mergeTree_js_1.errorIfOptionNotTrue)(this._mergeTree.options, "mergeTreeEnableObliterateReconnect");
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
617
|
+
// the segment was remotely obliterated, so is considered removed
|
|
618
|
+
// we set the seq to the universal seq and remove the local seq,
|
|
619
|
+
// so its length is not considered for subsequent local changes
|
|
620
|
+
// this allows us to not send the op as even the local client will ignore the segment
|
|
621
|
+
(0, segmentInfos_js_1.overwriteInfo)(segment, {
|
|
622
|
+
insert: {
|
|
623
|
+
type: "insert",
|
|
598
624
|
seq: constants_js_1.UniversalSequenceNumber,
|
|
599
625
|
localSeq: undefined,
|
|
600
626
|
clientId: constants_js_1.NonCollabClient,
|
|
601
|
-
}
|
|
602
|
-
|
|
603
|
-
|
|
627
|
+
},
|
|
628
|
+
});
|
|
629
|
+
break;
|
|
604
630
|
}
|
|
605
631
|
const segInsertOp = segment.clone();
|
|
606
632
|
const opProps = (0, internal_1.isObject)(resetOp.seg) && "props" in resetOp.seg && (0, internal_1.isObject)(resetOp.seg.props)
|
|
@@ -611,24 +637,18 @@ class Client extends client_utils_1.TypedEventEmitter {
|
|
|
611
637
|
break;
|
|
612
638
|
}
|
|
613
639
|
case ops_js_1.MergeTreeDeltaType.REMOVE: {
|
|
614
|
-
if
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
(!(0, segmentInfos_js_1.isMoved)(segment) ||
|
|
618
|
-
(segment.localMovedSeq !== undefined &&
|
|
619
|
-
segment.movedSeq === constants_js_1.UnassignedSequenceNumber))) {
|
|
640
|
+
// Only bother resubmitting if nobody else has removed it in the meantime.
|
|
641
|
+
// When that happens, the first removal will have been acked.
|
|
642
|
+
if ((0, segmentInfos_js_1.isRemoved)(segment) && opstampUtils.isLocal(segment.removes[0])) {
|
|
620
643
|
newOp = (0, opBuilder_js_1.createRemoveRangeOp)(segmentPosition, segmentPosition + segment.cachedLength);
|
|
621
644
|
}
|
|
622
645
|
break;
|
|
623
646
|
}
|
|
624
647
|
case ops_js_1.MergeTreeDeltaType.OBLITERATE: {
|
|
625
648
|
(0, mergeTree_js_1.errorIfOptionNotTrue)(this._mergeTree.options, "mergeTreeEnableObliterateReconnect");
|
|
626
|
-
if
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
(!(0, segmentInfos_js_1.isRemoved)(segment) ||
|
|
630
|
-
(segment.localRemovedSeq !== undefined &&
|
|
631
|
-
segment.removedSeq === constants_js_1.UnassignedSequenceNumber))) {
|
|
649
|
+
// Only bother resubmitting if nobody else has removed it in the meantime.
|
|
650
|
+
// When that happens, the first removal will have been acked.
|
|
651
|
+
if ((0, segmentInfos_js_1.isRemoved)(segment) && opstampUtils.isLocal(segment.removes[0])) {
|
|
632
652
|
newOp = (0, opBuilder_js_1.createObliterateRangeOp)(segmentPosition, segmentPosition + segment.cachedLength);
|
|
633
653
|
}
|
|
634
654
|
break;
|
|
@@ -784,7 +804,6 @@ class Client extends client_utils_1.TypedEventEmitter {
|
|
|
784
804
|
if (Array.isArray(segmentGroup)) {
|
|
785
805
|
if (segmentGroup.length === 0) {
|
|
786
806
|
// sometimes we rebase to an empty op
|
|
787
|
-
// eslint-disable-next-line import/no-deprecated
|
|
788
807
|
return (0, opBuilder_js_1.createGroupOp)();
|
|
789
808
|
}
|
|
790
809
|
firstGroup = segmentGroup[0];
|
|
@@ -822,7 +841,6 @@ class Client extends client_utils_1.TypedEventEmitter {
|
|
|
822
841
|
(0, internal_1.assert)(!Array.isArray(segmentGroup), 0x03d /* "segmentGroup is array rather than singleton!" */);
|
|
823
842
|
opList.push(...this.resetPendingDeltaToOps(resetOp, segmentGroup));
|
|
824
843
|
}
|
|
825
|
-
// eslint-disable-next-line import/no-deprecated
|
|
826
844
|
return opList.length === 1 ? opList[0] : (0, opBuilder_js_1.createGroupOp)(...opList);
|
|
827
845
|
}
|
|
828
846
|
createTextHelper() {
|
|
@@ -856,10 +874,6 @@ class Client extends client_utils_1.TypedEventEmitter {
|
|
|
856
874
|
const loader = new snapshotLoader_js_1.SnapshotLoader(runtime, this, this._mergeTree, this.logger, serializer);
|
|
857
875
|
return loader.initialize(storage);
|
|
858
876
|
}
|
|
859
|
-
getLocalSequenceNumber() {
|
|
860
|
-
const segWindow = this.getCollabWindow();
|
|
861
|
-
return segWindow.collaborating ? constants_js_1.UnassignedSequenceNumber : constants_js_1.UniversalSequenceNumber;
|
|
862
|
-
}
|
|
863
877
|
// eslint-disable-next-line import/no-deprecated
|
|
864
878
|
localTransaction(groupOp) {
|
|
865
879
|
for (const op of groupOp.ops) {
|
|
@@ -895,8 +909,21 @@ class Client extends client_utils_1.TypedEventEmitter {
|
|
|
895
909
|
this._mergeTree.setMinSeq(minSeq);
|
|
896
910
|
}
|
|
897
911
|
getContainingSegment(pos, sequenceArgs, localSeq) {
|
|
898
|
-
|
|
899
|
-
|
|
912
|
+
let perspective;
|
|
913
|
+
const clientId = sequenceArgs === undefined
|
|
914
|
+
? this.getClientId()
|
|
915
|
+
: this.getOrAddShortClientIdFromMessage(sequenceArgs);
|
|
916
|
+
const refSeq = sequenceArgs?.referenceSequenceNumber ?? this.getCollabWindow().currentSeq;
|
|
917
|
+
if (localSeq !== undefined) {
|
|
918
|
+
perspective = new perspective_js_1.LocalReconnectingPerspective(refSeq, clientId, localSeq);
|
|
919
|
+
}
|
|
920
|
+
else if (sequenceArgs === undefined) {
|
|
921
|
+
perspective = this._mergeTree.localPerspective;
|
|
922
|
+
}
|
|
923
|
+
else {
|
|
924
|
+
perspective = new perspective_js_1.PriorPerspective(refSeq, clientId);
|
|
925
|
+
}
|
|
926
|
+
return this._mergeTree.getContainingSegment(pos, perspective);
|
|
900
927
|
}
|
|
901
928
|
getPropertiesAtPosition(pos) {
|
|
902
929
|
let propertiesAtPosition;
|
|
@@ -958,8 +985,7 @@ class Client extends client_utils_1.TypedEventEmitter {
|
|
|
958
985
|
* @param forwards - Whether the desired marker comes before (false) or after (true) `startPos`
|
|
959
986
|
*/
|
|
960
987
|
searchForMarker(startPos, markerLabel, forwards = true) {
|
|
961
|
-
|
|
962
|
-
return this._mergeTree.searchForMarker(startPos, clientId, markerLabel, forwards);
|
|
988
|
+
return this._mergeTree.searchForMarker(startPos, markerLabel, forwards);
|
|
963
989
|
}
|
|
964
990
|
}
|
|
965
991
|
exports.Client = Client;
|