@fluidframework/merge-tree 2.93.0 → 2.101.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 +12 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -2
- package/dist/index.js.map +1 -1
- package/dist/sequencePlace.d.ts +13 -0
- package/dist/sequencePlace.d.ts.map +1 -1
- package/dist/sequencePlace.js +17 -4
- package/dist/sequencePlace.js.map +1 -1
- package/dist/test/Insertion.perf.spec.js +52 -39
- package/dist/test/Insertion.perf.spec.js.map +1 -1
- package/dist/test/PartialLengths.perf.spec.js +44 -41
- package/dist/test/PartialLengths.perf.spec.js.map +1 -1
- package/dist/test/Removal.perf.spec.js +105 -100
- package/dist/test/Removal.perf.spec.js.map +1 -1
- package/dist/test/Snapshot.perf.spec.js +14 -18
- package/dist/test/Snapshot.perf.spec.js.map +1 -1
- package/dist/test/attributionCollection.perf.spec.js +41 -31
- package/dist/test/attributionCollection.perf.spec.js.map +1 -1
- package/lib/index.d.ts +1 -1
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +1 -1
- package/lib/index.js.map +1 -1
- package/lib/sequencePlace.d.ts +13 -0
- package/lib/sequencePlace.d.ts.map +1 -1
- package/lib/sequencePlace.js +16 -3
- package/lib/sequencePlace.js.map +1 -1
- package/lib/test/Insertion.perf.spec.js +53 -40
- package/lib/test/Insertion.perf.spec.js.map +1 -1
- package/lib/test/PartialLengths.perf.spec.js +45 -42
- package/lib/test/PartialLengths.perf.spec.js.map +1 -1
- package/lib/test/Removal.perf.spec.js +106 -101
- package/lib/test/Removal.perf.spec.js.map +1 -1
- package/lib/test/Snapshot.perf.spec.js +15 -19
- package/lib/test/Snapshot.perf.spec.js.map +1 -1
- package/lib/test/attributionCollection.perf.spec.js +42 -32
- package/lib/test/attributionCollection.perf.spec.js.map +1 -1
- package/package.json +18 -18
- package/src/index.ts +1 -0
- package/src/sequencePlace.ts +17 -3
|
@@ -10,129 +10,134 @@ const perspective_js_1 = require("../perspective.js");
|
|
|
10
10
|
const revertibles_js_1 = require("../revertibles.js");
|
|
11
11
|
const snapshot_utils_js_1 = require("./snapshot.utils.js");
|
|
12
12
|
describe("MergeTree remove", () => {
|
|
13
|
-
|
|
14
|
-
(0, benchmark_1.benchmark)({
|
|
15
|
-
type: benchmark_1.BenchmarkType.Measurement,
|
|
13
|
+
(0, benchmark_1.benchmarkIt)({
|
|
16
14
|
// baseline summary benchmark to compare to other remove tests. such a
|
|
17
15
|
// comparison should give a (rough) sense of overhead caused by summary
|
|
18
16
|
// loading
|
|
19
17
|
title: "baseline summary load",
|
|
20
18
|
category: "remove",
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
19
|
+
...(0, benchmark_1.benchmarkDuration)({
|
|
20
|
+
benchmarkFnCustom: async (state) => {
|
|
21
|
+
const str = new snapshot_utils_js_1.TestString("id", {});
|
|
22
|
+
for (let i = 0; i < 1000; i++) {
|
|
23
|
+
str.append("a", false);
|
|
24
|
+
}
|
|
25
|
+
str.applyPendingOps();
|
|
26
|
+
const summary = str.getSummary();
|
|
27
|
+
await state.timeAllBatchesAsync(async () => {
|
|
28
|
+
await (0, snapshot_utils_js_1.loadSnapshot)(summary);
|
|
29
|
+
});
|
|
30
|
+
},
|
|
31
|
+
}),
|
|
32
32
|
});
|
|
33
|
-
(0, benchmark_1.
|
|
34
|
-
type: benchmark_1.BenchmarkType.Measurement,
|
|
33
|
+
(0, benchmark_1.benchmarkIt)({
|
|
35
34
|
title: "remove large range of large tree",
|
|
36
35
|
category: "remove",
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
for (let i = 0; i < 1000; i++) {
|
|
40
|
-
str.append("a", false);
|
|
41
|
-
}
|
|
42
|
-
str.applyPendingOps();
|
|
43
|
-
summary = str.getSummary();
|
|
44
|
-
},
|
|
45
|
-
benchmarkFnAsync: async () => {
|
|
46
|
-
const str = await (0, snapshot_utils_js_1.loadSnapshot)(summary);
|
|
47
|
-
const refSeq = 1000;
|
|
48
|
-
const clientId = 0;
|
|
49
|
-
str.mergeTree.markRangeRemoved(0, 1000, new perspective_js_1.PriorPerspective(refSeq, clientId), { seq: 1001, clientId }, { op: { type: ops_js_1.MergeTreeDeltaType.REMOVE } });
|
|
50
|
-
},
|
|
51
|
-
});
|
|
52
|
-
for (const length of [10, 100, 1000]) {
|
|
53
|
-
(0, benchmark_1.benchmark)({
|
|
54
|
-
type: benchmark_1.BenchmarkType.Measurement,
|
|
55
|
-
title: `remove range of length ${length} from large tree with undo-redo`,
|
|
56
|
-
category: "remove",
|
|
57
|
-
before: () => {
|
|
36
|
+
...(0, benchmark_1.benchmarkDuration)({
|
|
37
|
+
benchmarkFnCustom: async (state) => {
|
|
58
38
|
const str = new snapshot_utils_js_1.TestString("id", {});
|
|
59
|
-
for (let i = 0; i <
|
|
60
|
-
str.append("a",
|
|
61
|
-
str.appendMarker(true);
|
|
39
|
+
for (let i = 0; i < 1000; i++) {
|
|
40
|
+
str.append("a", false);
|
|
62
41
|
}
|
|
63
42
|
str.applyPendingOps();
|
|
64
|
-
summary = str.getSummary();
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
(0, revertibles_js_1.appendToMergeTreeDeltaRevertibles)(delta, revertibles);
|
|
43
|
+
const summary = str.getSummary();
|
|
44
|
+
await state.timeAllBatchesAsync(async () => {
|
|
45
|
+
const loadedStr = await (0, snapshot_utils_js_1.loadSnapshot)(summary);
|
|
46
|
+
const refSeq = 1000;
|
|
47
|
+
const clientId = 0;
|
|
48
|
+
loadedStr.mergeTree.markRangeRemoved(0, 1000, new perspective_js_1.PriorPerspective(refSeq, clientId), { seq: 1001, clientId }, { op: { type: ops_js_1.MergeTreeDeltaType.REMOVE } });
|
|
71
49
|
});
|
|
72
|
-
const op = str.removeRangeLocal(0, length - 1);
|
|
73
|
-
str.applyMsg(str.makeOpMessage(op,
|
|
74
|
-
/* seq */ length + 1,
|
|
75
|
-
/* refSeq */ length, str.longClientId,
|
|
76
|
-
/* minSeq */ length));
|
|
77
50
|
},
|
|
51
|
+
}),
|
|
52
|
+
});
|
|
53
|
+
for (const length of [10, 100, 1000]) {
|
|
54
|
+
(0, benchmark_1.benchmarkIt)({
|
|
55
|
+
title: `remove range of length ${length} from large tree with undo-redo`,
|
|
56
|
+
category: "remove",
|
|
57
|
+
...(0, benchmark_1.benchmarkDuration)({
|
|
58
|
+
benchmarkFnCustom: async (state) => {
|
|
59
|
+
const str = new snapshot_utils_js_1.TestString("id", {});
|
|
60
|
+
for (let i = 0; i < length / 2; i++) {
|
|
61
|
+
str.append("a", true);
|
|
62
|
+
str.appendMarker(true);
|
|
63
|
+
}
|
|
64
|
+
str.applyPendingOps();
|
|
65
|
+
const summary = str.getSummary();
|
|
66
|
+
await state.timeAllBatchesAsync(async () => {
|
|
67
|
+
const loadedStr = await (0, snapshot_utils_js_1.loadSnapshot)(summary);
|
|
68
|
+
const revertibles = [];
|
|
69
|
+
loadedStr.on("delta", (_op, delta) => {
|
|
70
|
+
(0, revertibles_js_1.appendToMergeTreeDeltaRevertibles)(delta, revertibles);
|
|
71
|
+
});
|
|
72
|
+
const op = loadedStr.removeRangeLocal(0, length - 1);
|
|
73
|
+
loadedStr.applyMsg(loadedStr.makeOpMessage(op,
|
|
74
|
+
/* seq */ length + 1,
|
|
75
|
+
/* refSeq */ length, loadedStr.longClientId,
|
|
76
|
+
/* minSeq */ length));
|
|
77
|
+
});
|
|
78
|
+
},
|
|
79
|
+
}),
|
|
78
80
|
});
|
|
79
81
|
}
|
|
80
|
-
(0, benchmark_1.
|
|
81
|
-
type: benchmark_1.BenchmarkType.Measurement,
|
|
82
|
+
(0, benchmark_1.benchmarkIt)({
|
|
82
83
|
title: "remove start of large tree",
|
|
83
84
|
category: "remove",
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
85
|
+
...(0, benchmark_1.benchmarkDuration)({
|
|
86
|
+
benchmarkFnCustom: async (state) => {
|
|
87
|
+
const str = new snapshot_utils_js_1.TestString("id", {});
|
|
88
|
+
for (let i = 0; i < 1000; i++) {
|
|
89
|
+
str.append("a", false);
|
|
90
|
+
}
|
|
91
|
+
str.applyPendingOps();
|
|
92
|
+
const summary = str.getSummary();
|
|
93
|
+
await state.timeAllBatchesAsync(async () => {
|
|
94
|
+
const loadedStr = await (0, snapshot_utils_js_1.loadSnapshot)(summary);
|
|
95
|
+
const refSeq = 1000;
|
|
96
|
+
const clientId = 0;
|
|
97
|
+
loadedStr.mergeTree.markRangeRemoved(0, 1, new perspective_js_1.PriorPerspective(refSeq, clientId), { seq: 1001, clientId }, { op: { type: ops_js_1.MergeTreeDeltaType.REMOVE } });
|
|
98
|
+
});
|
|
99
|
+
},
|
|
100
|
+
}),
|
|
98
101
|
});
|
|
99
|
-
(0, benchmark_1.
|
|
100
|
-
type: benchmark_1.BenchmarkType.Measurement,
|
|
102
|
+
(0, benchmark_1.benchmarkIt)({
|
|
101
103
|
title: "remove middle of large tree",
|
|
102
104
|
category: "remove",
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
105
|
+
...(0, benchmark_1.benchmarkDuration)({
|
|
106
|
+
benchmarkFnCustom: async (state) => {
|
|
107
|
+
const str = new snapshot_utils_js_1.TestString("id", {});
|
|
108
|
+
for (let i = 0; i < 1000; i++) {
|
|
109
|
+
str.append("a", false);
|
|
110
|
+
}
|
|
111
|
+
str.applyPendingOps();
|
|
112
|
+
const summary = str.getSummary();
|
|
113
|
+
await state.timeAllBatchesAsync(async () => {
|
|
114
|
+
const loadedStr = await (0, snapshot_utils_js_1.loadSnapshot)(summary);
|
|
115
|
+
const refSeq = 1000;
|
|
116
|
+
const clientId = 0;
|
|
117
|
+
loadedStr.mergeTree.markRangeRemoved(499, 501, new perspective_js_1.PriorPerspective(refSeq, clientId), { seq: 1001, clientId }, { op: { type: ops_js_1.MergeTreeDeltaType.REMOVE } });
|
|
118
|
+
});
|
|
119
|
+
},
|
|
120
|
+
}),
|
|
117
121
|
});
|
|
118
|
-
(0, benchmark_1.
|
|
119
|
-
type: benchmark_1.BenchmarkType.Measurement,
|
|
122
|
+
(0, benchmark_1.benchmarkIt)({
|
|
120
123
|
title: "remove end of large tree",
|
|
121
124
|
category: "remove",
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
125
|
+
...(0, benchmark_1.benchmarkDuration)({
|
|
126
|
+
benchmarkFnCustom: async (state) => {
|
|
127
|
+
const str = new snapshot_utils_js_1.TestString("id", {});
|
|
128
|
+
for (let i = 0; i < 1000; i++) {
|
|
129
|
+
str.append("a", false);
|
|
130
|
+
}
|
|
131
|
+
str.applyPendingOps();
|
|
132
|
+
const summary = str.getSummary();
|
|
133
|
+
await state.timeAllBatchesAsync(async () => {
|
|
134
|
+
const loadedStr = await (0, snapshot_utils_js_1.loadSnapshot)(summary);
|
|
135
|
+
const refSeq = 1000;
|
|
136
|
+
const clientId = 0;
|
|
137
|
+
loadedStr.mergeTree.markRangeRemoved(999, 1000, new perspective_js_1.PriorPerspective(refSeq, clientId), { seq: 1001, clientId }, { op: { type: ops_js_1.MergeTreeDeltaType.REMOVE } });
|
|
138
|
+
});
|
|
139
|
+
},
|
|
140
|
+
}),
|
|
136
141
|
});
|
|
137
142
|
});
|
|
138
143
|
//# sourceMappingURL=Removal.perf.spec.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Removal.perf.spec.js","sourceRoot":"","sources":["../../src/test/Removal.perf.spec.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { BenchmarkType, benchmark } from \"@fluid-tools/benchmark\";\nimport type { ISummaryTree } from \"@fluidframework/driver-definitions\";\n\nimport { MergeTreeDeltaType } from \"../ops.js\";\nimport { PriorPerspective } from \"../perspective.js\";\nimport {\n\ttype MergeTreeDeltaRevertible,\n\tappendToMergeTreeDeltaRevertibles,\n} from \"../revertibles.js\";\n\nimport { TestString, loadSnapshot } from \"./snapshot.utils.js\";\n\ndescribe(\"MergeTree remove\", () => {\n\tlet summary: ISummaryTree;\n\n\tbenchmark({\n\t\ttype: BenchmarkType.Measurement,\n\t\t// baseline summary benchmark to compare to other remove tests. such a\n\t\t// comparison should give a (rough) sense of overhead caused by summary\n\t\t// loading\n\t\ttitle: \"baseline summary load\",\n\t\tcategory: \"remove\",\n\t\tbefore: () => {\n\t\t\tconst str = new TestString(\"id\", {});\n\t\t\tfor (let i = 0; i < 1000; i++) {\n\t\t\t\tstr.append(\"a\", false);\n\t\t\t}\n\n\t\t\tstr.applyPendingOps();\n\t\t\tsummary = str.getSummary();\n\t\t},\n\t\tbenchmarkFnAsync: async () => {\n\t\t\tawait loadSnapshot(summary);\n\t\t},\n\t});\n\n\tbenchmark({\n\t\ttype: BenchmarkType.Measurement,\n\t\ttitle: \"remove large range of large tree\",\n\t\tcategory: \"remove\",\n\t\tbefore: () => {\n\t\t\tconst str = new TestString(\"id\", {});\n\t\t\tfor (let i = 0; i < 1000; i++) {\n\t\t\t\tstr.append(\"a\", false);\n\t\t\t}\n\n\t\t\tstr.applyPendingOps();\n\t\t\tsummary = str.getSummary();\n\t\t},\n\t\tbenchmarkFnAsync: async () => {\n\t\t\tconst str = await loadSnapshot(summary);\n\n\t\t\tconst refSeq = 1000;\n\t\t\tconst clientId = 0;\n\t\t\tstr.mergeTree.markRangeRemoved(\n\t\t\t\t0,\n\t\t\t\t1000,\n\t\t\t\tnew PriorPerspective(refSeq, clientId),\n\t\t\t\t{ seq: 1001, clientId },\n\t\t\t\t{ op: { type: MergeTreeDeltaType.REMOVE } },\n\t\t\t);\n\t\t},\n\t});\n\n\tfor (const length of [10, 100, 1000]) {\n\t\tbenchmark({\n\t\t\ttype: BenchmarkType.Measurement,\n\t\t\ttitle: `remove range of length ${length} from large tree with undo-redo`,\n\t\t\tcategory: \"remove\",\n\t\t\tbefore: () => {\n\t\t\t\tconst str = new TestString(\"id\", {});\n\t\t\t\tfor (let i = 0; i < length / 2; i++) {\n\t\t\t\t\tstr.append(\"a\", true);\n\t\t\t\t\tstr.appendMarker(true);\n\t\t\t\t}\n\n\t\t\t\tstr.applyPendingOps();\n\t\t\t\tsummary = str.getSummary();\n\t\t\t},\n\t\t\tbenchmarkFnAsync: async () => {\n\t\t\t\tconst str = await loadSnapshot(summary);\n\n\t\t\t\tconst revertibles: MergeTreeDeltaRevertible[] = [];\n\t\t\t\tstr.on(\"delta\", (_op, delta) => {\n\t\t\t\t\tappendToMergeTreeDeltaRevertibles(delta, revertibles);\n\t\t\t\t});\n\n\t\t\t\tconst op = str.removeRangeLocal(0, length - 1);\n\t\t\t\tstr.applyMsg(\n\t\t\t\t\tstr.makeOpMessage(\n\t\t\t\t\t\top,\n\t\t\t\t\t\t/* seq */ length + 1,\n\t\t\t\t\t\t/* refSeq */ length,\n\t\t\t\t\t\tstr.longClientId,\n\t\t\t\t\t\t/* minSeq */ length,\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t},\n\t\t});\n\t}\n\n\tbenchmark({\n\t\ttype: BenchmarkType.Measurement,\n\t\ttitle: \"remove start of large tree\",\n\t\tcategory: \"remove\",\n\t\tbefore: () => {\n\t\t\tconst str = new TestString(\"id\", {});\n\t\t\tfor (let i = 0; i < 1000; i++) {\n\t\t\t\tstr.append(\"a\", false);\n\t\t\t}\n\n\t\t\tstr.applyPendingOps();\n\t\t\tsummary = str.getSummary();\n\t\t},\n\t\tbenchmarkFnAsync: async () => {\n\t\t\tconst str = await loadSnapshot(summary);\n\n\t\t\tconst refSeq = 1000;\n\t\t\tconst clientId = 0;\n\t\t\tstr.mergeTree.markRangeRemoved(\n\t\t\t\t0,\n\t\t\t\t1,\n\t\t\t\tnew PriorPerspective(refSeq, clientId),\n\t\t\t\t{ seq: 1001, clientId },\n\t\t\t\t{ op: { type: MergeTreeDeltaType.REMOVE } },\n\t\t\t);\n\t\t},\n\t});\n\n\tbenchmark({\n\t\ttype: BenchmarkType.Measurement,\n\t\ttitle: \"remove middle of large tree\",\n\t\tcategory: \"remove\",\n\t\tbefore: () => {\n\t\t\tconst str = new TestString(\"id\", {});\n\t\t\tfor (let i = 0; i < 1000; i++) {\n\t\t\t\tstr.append(\"a\", false);\n\t\t\t}\n\n\t\t\tstr.applyPendingOps();\n\t\t\tsummary = str.getSummary();\n\t\t},\n\t\tbenchmarkFnAsync: async () => {\n\t\t\tconst str = await loadSnapshot(summary);\n\n\t\t\tconst refSeq = 1000;\n\t\t\tconst clientId = 0;\n\t\t\tstr.mergeTree.markRangeRemoved(\n\t\t\t\t499,\n\t\t\t\t501,\n\t\t\t\tnew PriorPerspective(refSeq, clientId),\n\t\t\t\t{ seq: 1001, clientId },\n\t\t\t\t{ op: { type: MergeTreeDeltaType.REMOVE } },\n\t\t\t);\n\t\t},\n\t});\n\n\tbenchmark({\n\t\ttype: BenchmarkType.Measurement,\n\t\ttitle: \"remove end of large tree\",\n\t\tcategory: \"remove\",\n\t\tbefore: () => {\n\t\t\tconst str = new TestString(\"id\", {});\n\t\t\tfor (let i = 0; i < 1000; i++) {\n\t\t\t\tstr.append(\"a\", false);\n\t\t\t}\n\n\t\t\tstr.applyPendingOps();\n\t\t\tsummary = str.getSummary();\n\t\t},\n\t\tbenchmarkFnAsync: async () => {\n\t\t\tconst str = await loadSnapshot(summary);\n\n\t\t\tconst refSeq = 1000;\n\t\t\tconst clientId = 0;\n\t\t\tstr.mergeTree.markRangeRemoved(\n\t\t\t\t999,\n\t\t\t\t1000,\n\t\t\t\tnew PriorPerspective(refSeq, clientId),\n\t\t\t\t{ seq: 1001, clientId },\n\t\t\t\t{ op: { type: MergeTreeDeltaType.REMOVE } },\n\t\t\t);\n\t\t},\n\t});\n});\n"]}
|
|
1
|
+
{"version":3,"file":"Removal.perf.spec.js","sourceRoot":"","sources":["../../src/test/Removal.perf.spec.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { benchmarkDuration, benchmarkIt } from \"@fluid-tools/benchmark\";\n\nimport { MergeTreeDeltaType } from \"../ops.js\";\nimport { PriorPerspective } from \"../perspective.js\";\nimport {\n\ttype MergeTreeDeltaRevertible,\n\tappendToMergeTreeDeltaRevertibles,\n} from \"../revertibles.js\";\n\nimport { TestString, loadSnapshot } from \"./snapshot.utils.js\";\n\ndescribe(\"MergeTree remove\", () => {\n\tbenchmarkIt({\n\t\t// baseline summary benchmark to compare to other remove tests. such a\n\t\t// comparison should give a (rough) sense of overhead caused by summary\n\t\t// loading\n\t\ttitle: \"baseline summary load\",\n\t\tcategory: \"remove\",\n\t\t...benchmarkDuration({\n\t\t\tbenchmarkFnCustom: async (state) => {\n\t\t\t\tconst str = new TestString(\"id\", {});\n\t\t\t\tfor (let i = 0; i < 1000; i++) {\n\t\t\t\t\tstr.append(\"a\", false);\n\t\t\t\t}\n\t\t\t\tstr.applyPendingOps();\n\t\t\t\tconst summary = str.getSummary();\n\t\t\t\tawait state.timeAllBatchesAsync(async () => {\n\t\t\t\t\tawait loadSnapshot(summary);\n\t\t\t\t});\n\t\t\t},\n\t\t}),\n\t});\n\n\tbenchmarkIt({\n\t\ttitle: \"remove large range of large tree\",\n\t\tcategory: \"remove\",\n\t\t...benchmarkDuration({\n\t\t\tbenchmarkFnCustom: async (state) => {\n\t\t\t\tconst str = new TestString(\"id\", {});\n\t\t\t\tfor (let i = 0; i < 1000; i++) {\n\t\t\t\t\tstr.append(\"a\", false);\n\t\t\t\t}\n\t\t\t\tstr.applyPendingOps();\n\t\t\t\tconst summary = str.getSummary();\n\t\t\t\tawait state.timeAllBatchesAsync(async () => {\n\t\t\t\t\tconst loadedStr = await loadSnapshot(summary);\n\n\t\t\t\t\tconst refSeq = 1000;\n\t\t\t\t\tconst clientId = 0;\n\t\t\t\t\tloadedStr.mergeTree.markRangeRemoved(\n\t\t\t\t\t\t0,\n\t\t\t\t\t\t1000,\n\t\t\t\t\t\tnew PriorPerspective(refSeq, clientId),\n\t\t\t\t\t\t{ seq: 1001, clientId },\n\t\t\t\t\t\t{ op: { type: MergeTreeDeltaType.REMOVE } },\n\t\t\t\t\t);\n\t\t\t\t});\n\t\t\t},\n\t\t}),\n\t});\n\n\tfor (const length of [10, 100, 1000]) {\n\t\tbenchmarkIt({\n\t\t\ttitle: `remove range of length ${length} from large tree with undo-redo`,\n\t\t\tcategory: \"remove\",\n\t\t\t...benchmarkDuration({\n\t\t\t\tbenchmarkFnCustom: async (state) => {\n\t\t\t\t\tconst str = new TestString(\"id\", {});\n\t\t\t\t\tfor (let i = 0; i < length / 2; i++) {\n\t\t\t\t\t\tstr.append(\"a\", true);\n\t\t\t\t\t\tstr.appendMarker(true);\n\t\t\t\t\t}\n\t\t\t\t\tstr.applyPendingOps();\n\t\t\t\t\tconst summary = str.getSummary();\n\t\t\t\t\tawait state.timeAllBatchesAsync(async () => {\n\t\t\t\t\t\tconst loadedStr = await loadSnapshot(summary);\n\n\t\t\t\t\t\tconst revertibles: MergeTreeDeltaRevertible[] = [];\n\t\t\t\t\t\tloadedStr.on(\"delta\", (_op, delta) => {\n\t\t\t\t\t\t\tappendToMergeTreeDeltaRevertibles(delta, revertibles);\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tconst op = loadedStr.removeRangeLocal(0, length - 1);\n\t\t\t\t\t\tloadedStr.applyMsg(\n\t\t\t\t\t\t\tloadedStr.makeOpMessage(\n\t\t\t\t\t\t\t\top,\n\t\t\t\t\t\t\t\t/* seq */ length + 1,\n\t\t\t\t\t\t\t\t/* refSeq */ length,\n\t\t\t\t\t\t\t\tloadedStr.longClientId,\n\t\t\t\t\t\t\t\t/* minSeq */ length,\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t);\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t}),\n\t\t});\n\t}\n\n\tbenchmarkIt({\n\t\ttitle: \"remove start of large tree\",\n\t\tcategory: \"remove\",\n\t\t...benchmarkDuration({\n\t\t\tbenchmarkFnCustom: async (state) => {\n\t\t\t\tconst str = new TestString(\"id\", {});\n\t\t\t\tfor (let i = 0; i < 1000; i++) {\n\t\t\t\t\tstr.append(\"a\", false);\n\t\t\t\t}\n\t\t\t\tstr.applyPendingOps();\n\t\t\t\tconst summary = str.getSummary();\n\t\t\t\tawait state.timeAllBatchesAsync(async () => {\n\t\t\t\t\tconst loadedStr = await loadSnapshot(summary);\n\n\t\t\t\t\tconst refSeq = 1000;\n\t\t\t\t\tconst clientId = 0;\n\t\t\t\t\tloadedStr.mergeTree.markRangeRemoved(\n\t\t\t\t\t\t0,\n\t\t\t\t\t\t1,\n\t\t\t\t\t\tnew PriorPerspective(refSeq, clientId),\n\t\t\t\t\t\t{ seq: 1001, clientId },\n\t\t\t\t\t\t{ op: { type: MergeTreeDeltaType.REMOVE } },\n\t\t\t\t\t);\n\t\t\t\t});\n\t\t\t},\n\t\t}),\n\t});\n\n\tbenchmarkIt({\n\t\ttitle: \"remove middle of large tree\",\n\t\tcategory: \"remove\",\n\t\t...benchmarkDuration({\n\t\t\tbenchmarkFnCustom: async (state) => {\n\t\t\t\tconst str = new TestString(\"id\", {});\n\t\t\t\tfor (let i = 0; i < 1000; i++) {\n\t\t\t\t\tstr.append(\"a\", false);\n\t\t\t\t}\n\t\t\t\tstr.applyPendingOps();\n\t\t\t\tconst summary = str.getSummary();\n\t\t\t\tawait state.timeAllBatchesAsync(async () => {\n\t\t\t\t\tconst loadedStr = await loadSnapshot(summary);\n\n\t\t\t\t\tconst refSeq = 1000;\n\t\t\t\t\tconst clientId = 0;\n\t\t\t\t\tloadedStr.mergeTree.markRangeRemoved(\n\t\t\t\t\t\t499,\n\t\t\t\t\t\t501,\n\t\t\t\t\t\tnew PriorPerspective(refSeq, clientId),\n\t\t\t\t\t\t{ seq: 1001, clientId },\n\t\t\t\t\t\t{ op: { type: MergeTreeDeltaType.REMOVE } },\n\t\t\t\t\t);\n\t\t\t\t});\n\t\t\t},\n\t\t}),\n\t});\n\n\tbenchmarkIt({\n\t\ttitle: \"remove end of large tree\",\n\t\tcategory: \"remove\",\n\t\t...benchmarkDuration({\n\t\t\tbenchmarkFnCustom: async (state) => {\n\t\t\t\tconst str = new TestString(\"id\", {});\n\t\t\t\tfor (let i = 0; i < 1000; i++) {\n\t\t\t\t\tstr.append(\"a\", false);\n\t\t\t\t}\n\t\t\t\tstr.applyPendingOps();\n\t\t\t\tconst summary = str.getSummary();\n\t\t\t\tawait state.timeAllBatchesAsync(async () => {\n\t\t\t\t\tconst loadedStr = await loadSnapshot(summary);\n\n\t\t\t\t\tconst refSeq = 1000;\n\t\t\t\t\tconst clientId = 0;\n\t\t\t\t\tloadedStr.mergeTree.markRangeRemoved(\n\t\t\t\t\t\t999,\n\t\t\t\t\t\t1000,\n\t\t\t\t\t\tnew PriorPerspective(refSeq, clientId),\n\t\t\t\t\t\t{ seq: 1001, clientId },\n\t\t\t\t\t\t{ op: { type: MergeTreeDeltaType.REMOVE } },\n\t\t\t\t\t);\n\t\t\t\t});\n\t\t\t},\n\t\t}),\n\t});\n});\n"]}
|
|
@@ -7,27 +7,23 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
7
7
|
const benchmark_1 = require("@fluid-tools/benchmark");
|
|
8
8
|
const snapshot_utils_js_1 = require("./snapshot.utils.js");
|
|
9
9
|
describe("MergeTree snapshots", () => {
|
|
10
|
-
let summary;
|
|
11
10
|
for (const summarySize of [10, 50, 100, 500, 1000, 5000, 10_000]) {
|
|
12
|
-
const test = (0, benchmark_1.
|
|
13
|
-
type: benchmark_1.BenchmarkType.Measurement,
|
|
11
|
+
const test = (0, benchmark_1.benchmarkIt)({
|
|
14
12
|
title: `load snapshot with ${summarySize} segments`,
|
|
15
13
|
category: "snapshot loading",
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
summary = undefined;
|
|
30
|
-
},
|
|
14
|
+
...(0, benchmark_1.benchmarkDuration)({
|
|
15
|
+
benchmarkFnCustom: async (state) => {
|
|
16
|
+
const str = new snapshot_utils_js_1.TestString("id", {});
|
|
17
|
+
for (let i = 0; i < summarySize; i++) {
|
|
18
|
+
str.append("a", false);
|
|
19
|
+
}
|
|
20
|
+
str.applyPendingOps();
|
|
21
|
+
const summary = str.getSummary();
|
|
22
|
+
await state.timeAllBatchesAsync(async () => {
|
|
23
|
+
await (0, snapshot_utils_js_1.loadSnapshot)(summary);
|
|
24
|
+
});
|
|
25
|
+
},
|
|
26
|
+
}),
|
|
31
27
|
});
|
|
32
28
|
if (summarySize > 5000) {
|
|
33
29
|
const currentTimeout = test.timeout();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Snapshot.perf.spec.js","sourceRoot":"","sources":["../../src/test/Snapshot.perf.spec.ts"],"names":[],"mappings":";AAAA;;;GAGG;;AAEH,
|
|
1
|
+
{"version":3,"file":"Snapshot.perf.spec.js","sourceRoot":"","sources":["../../src/test/Snapshot.perf.spec.ts"],"names":[],"mappings":";AAAA;;;GAGG;;AAEH,sDAAwE;AAGxE,2DAA+D;AAE/D,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;IACpC,KAAK,MAAM,WAAW,IAAI,CAAC,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,EAAE,CAAC;QAClE,MAAM,IAAI,GAAG,IAAA,uBAAW,EAAC;YACxB,KAAK,EAAE,sBAAsB,WAAW,WAAW;YACnD,QAAQ,EAAE,kBAAkB;YAC5B,GAAG,IAAA,6BAAiB,EAAC;gBACpB,iBAAiB,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;oBAClC,MAAM,GAAG,GAAG,IAAI,8BAAU,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;oBACrC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,EAAE,CAAC,EAAE,EAAE,CAAC;wBACtC,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;oBACxB,CAAC;oBACD,GAAG,CAAC,eAAe,EAAE,CAAC;oBACtB,MAAM,OAAO,GAAiB,GAAG,CAAC,UAAU,EAAE,CAAC;oBAC/C,MAAM,KAAK,CAAC,mBAAmB,CAAC,KAAK,IAAI,EAAE;wBAC1C,MAAM,IAAA,gCAAY,EAAC,OAAO,CAAC,CAAC;oBAC7B,CAAC,CAAC,CAAC;gBACJ,CAAC;aACD,CAAC;SACF,CAAC,CAAC;QAEH,IAAI,WAAW,GAAG,IAAI,EAAE,CAAC;YACxB,MAAM,cAAc,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;YACtC,iFAAiF;YACjF,IAAI,CAAC,OAAO,CAAC,cAAc,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC,CAAC;QACzE,CAAC;IACF,CAAC;AACF,CAAC,CAAC,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { benchmarkDuration, benchmarkIt } from \"@fluid-tools/benchmark\";\nimport type { ISummaryTree } from \"@fluidframework/driver-definitions\";\n\nimport { TestString, loadSnapshot } from \"./snapshot.utils.js\";\n\ndescribe(\"MergeTree snapshots\", () => {\n\tfor (const summarySize of [10, 50, 100, 500, 1000, 5000, 10_000]) {\n\t\tconst test = benchmarkIt({\n\t\t\ttitle: `load snapshot with ${summarySize} segments`,\n\t\t\tcategory: \"snapshot loading\",\n\t\t\t...benchmarkDuration({\n\t\t\t\tbenchmarkFnCustom: async (state) => {\n\t\t\t\t\tconst str = new TestString(\"id\", {});\n\t\t\t\t\tfor (let i = 0; i < summarySize; i++) {\n\t\t\t\t\t\tstr.append(\"a\", false);\n\t\t\t\t\t}\n\t\t\t\t\tstr.applyPendingOps();\n\t\t\t\t\tconst summary: ISummaryTree = str.getSummary();\n\t\t\t\t\tawait state.timeAllBatchesAsync(async () => {\n\t\t\t\t\t\tawait loadSnapshot(summary);\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t}),\n\t\t});\n\n\t\tif (summarySize > 5000) {\n\t\t\tconst currentTimeout = test.timeout();\n\t\t\t// Default value of 2 seconds causes failure around P95 for large snapshot sizes.\n\t\t\ttest.timeout(currentTimeout === 0 ? 0 : Math.max(5000, currentTimeout));\n\t\t}\n\t}\n});\n"]}
|
|
@@ -23,73 +23,81 @@ function getCollectionSizes(ctor, baseSuiteType) {
|
|
|
23
23
|
{ name: "maximum keys", collection: maxSizeCollection, type: benchmark_1.BenchmarkType.Diagnostic },
|
|
24
24
|
];
|
|
25
25
|
}
|
|
26
|
-
function runAttributionCollectionSuite(ctor, suiteBaseType) {
|
|
26
|
+
function runAttributionCollectionSuite(ctor, suiteBaseType = benchmark_1.BenchmarkType.Measurement) {
|
|
27
27
|
const collectionTestCases = getCollectionSizes(ctor, suiteBaseType);
|
|
28
28
|
for (const { name, collection, type } of collectionTestCases) {
|
|
29
29
|
describe(`using a collection with ${name}`, () => {
|
|
30
30
|
const { length } = collection;
|
|
31
|
-
(0, benchmark_1.
|
|
31
|
+
(0, benchmark_1.benchmarkIt)({
|
|
32
32
|
title: "getAtOffset at the start",
|
|
33
|
-
benchmarkFn: () => collection.getAtOffset(0),
|
|
33
|
+
...(0, benchmark_1.benchmarkDuration)({ benchmarkFn: () => collection.getAtOffset(0) }),
|
|
34
34
|
type,
|
|
35
35
|
});
|
|
36
|
-
(0, benchmark_1.
|
|
36
|
+
(0, benchmark_1.benchmarkIt)({
|
|
37
37
|
title: "getAtOffset at the end",
|
|
38
|
-
benchmarkFn: () => collection.getAtOffset(length - 1),
|
|
38
|
+
...(0, benchmark_1.benchmarkDuration)({ benchmarkFn: () => collection.getAtOffset(length - 1) }),
|
|
39
39
|
type,
|
|
40
40
|
});
|
|
41
|
-
(0, benchmark_1.
|
|
41
|
+
(0, benchmark_1.benchmarkIt)({
|
|
42
42
|
title: "getAtOffset in the middle",
|
|
43
|
-
benchmarkFn: () => collection.getAtOffset(length / 2),
|
|
43
|
+
...(0, benchmark_1.benchmarkDuration)({ benchmarkFn: () => collection.getAtOffset(length / 2) }),
|
|
44
44
|
type: benchmark_1.BenchmarkType.Diagnostic,
|
|
45
45
|
});
|
|
46
|
-
(0, benchmark_1.
|
|
46
|
+
(0, benchmark_1.benchmarkIt)({
|
|
47
47
|
title: "getKeysInOffsetRange from start to end",
|
|
48
|
-
benchmarkFn: () => collection.getKeysInOffsetRange(0),
|
|
48
|
+
...(0, benchmark_1.benchmarkDuration)({ benchmarkFn: () => collection.getKeysInOffsetRange(0) }),
|
|
49
49
|
type,
|
|
50
50
|
});
|
|
51
|
-
(0, benchmark_1.
|
|
51
|
+
(0, benchmark_1.benchmarkIt)({
|
|
52
52
|
title: "getKeysInOffsetRange from start to mid",
|
|
53
|
-
|
|
53
|
+
...(0, benchmark_1.benchmarkDuration)({
|
|
54
|
+
benchmarkFn: () => collection.getKeysInOffsetRange(0, length / 2),
|
|
55
|
+
}),
|
|
54
56
|
type,
|
|
55
57
|
});
|
|
56
|
-
(0, benchmark_1.
|
|
58
|
+
(0, benchmark_1.benchmarkIt)({
|
|
57
59
|
title: "getKeysInOffsetRange from mid to end",
|
|
58
|
-
|
|
60
|
+
...(0, benchmark_1.benchmarkDuration)({
|
|
61
|
+
benchmarkFn: () => collection.getKeysInOffsetRange(length / 2, length - 1),
|
|
62
|
+
}),
|
|
59
63
|
type,
|
|
60
64
|
});
|
|
61
|
-
(0, benchmark_1.
|
|
65
|
+
(0, benchmark_1.benchmarkIt)({
|
|
62
66
|
title: "getAll",
|
|
63
|
-
benchmarkFn: () => collection.getAll(),
|
|
67
|
+
...(0, benchmark_1.benchmarkDuration)({ benchmarkFn: () => collection.getAll() }),
|
|
64
68
|
type,
|
|
65
69
|
});
|
|
66
|
-
(0, benchmark_1.
|
|
70
|
+
(0, benchmark_1.benchmarkIt)({
|
|
67
71
|
title: "clone",
|
|
68
|
-
benchmarkFn: () => collection.clone(),
|
|
72
|
+
...(0, benchmark_1.benchmarkDuration)({ benchmarkFn: () => collection.clone() }),
|
|
69
73
|
type,
|
|
70
74
|
});
|
|
71
|
-
(0, benchmark_1.
|
|
75
|
+
(0, benchmark_1.benchmarkIt)({
|
|
72
76
|
title: "split + append in the middle",
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
+
...(0, benchmark_1.benchmarkDuration)({
|
|
78
|
+
benchmarkFn: () => {
|
|
79
|
+
const split = collection.splitAt(length / 2);
|
|
80
|
+
collection.append(split);
|
|
81
|
+
},
|
|
82
|
+
}),
|
|
77
83
|
type,
|
|
78
84
|
});
|
|
79
85
|
});
|
|
80
86
|
}
|
|
81
|
-
(0, benchmark_1.
|
|
87
|
+
(0, benchmark_1.benchmarkIt)({
|
|
82
88
|
title: "construction",
|
|
83
|
-
benchmarkFn: () => new ctor(42, { type: "op", seq: 5 }),
|
|
89
|
+
...(0, benchmark_1.benchmarkDuration)({ benchmarkFn: () => new ctor(42, { type: "op", seq: 5 }) }),
|
|
84
90
|
type: suiteBaseType,
|
|
85
91
|
});
|
|
86
92
|
const segmentsToSerialize = collectionTestCases.map(({ collection }) => ({
|
|
87
93
|
attribution: collection,
|
|
88
94
|
cachedLength: collection.length,
|
|
89
95
|
}));
|
|
90
|
-
(0, benchmark_1.
|
|
96
|
+
(0, benchmark_1.benchmarkIt)({
|
|
91
97
|
title: "serializing",
|
|
92
|
-
|
|
98
|
+
...(0, benchmark_1.benchmarkDuration)({
|
|
99
|
+
benchmarkFn: () => ctor.serializeAttributionCollections(segmentsToSerialize),
|
|
100
|
+
}),
|
|
93
101
|
type: suiteBaseType,
|
|
94
102
|
});
|
|
95
103
|
const summary = ctor.serializeAttributionCollections(segmentsToSerialize);
|
|
@@ -99,11 +107,13 @@ function runAttributionCollectionSuite(ctor, suiteBaseType) {
|
|
|
99
107
|
segments.push({
|
|
100
108
|
cachedLength: summary.length - 9 * Math.floor(summary.length / 10),
|
|
101
109
|
});
|
|
102
|
-
(0, benchmark_1.
|
|
110
|
+
(0, benchmark_1.benchmarkIt)({
|
|
103
111
|
title: "deserialize into 10 segments",
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
112
|
+
...(0, benchmark_1.benchmarkDuration)({
|
|
113
|
+
benchmarkFn: () => {
|
|
114
|
+
ctor.populateAttributionCollections(segments, summary);
|
|
115
|
+
},
|
|
116
|
+
}),
|
|
107
117
|
type: suiteBaseType,
|
|
108
118
|
});
|
|
109
119
|
}
|
|
@@ -111,7 +121,7 @@ describe("IAttributionCollection perf", () => {
|
|
|
111
121
|
// There was a RedBlack tree based implementation for the collection entries, but the linear array based one won due to constant
|
|
112
122
|
// factors/memory characteristics, so just kept the array based one.
|
|
113
123
|
describe("list-based implementation", () => {
|
|
114
|
-
runAttributionCollectionSuite(attributionCollection_js_1.AttributionCollection
|
|
124
|
+
runAttributionCollectionSuite(attributionCollection_js_1.AttributionCollection);
|
|
115
125
|
});
|
|
116
126
|
});
|
|
117
127
|
//# sourceMappingURL=attributionCollection.perf.spec.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"attributionCollection.perf.spec.js","sourceRoot":"","sources":["../../src/test/attributionCollection.perf.spec.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { BenchmarkType, benchmark } from \"@fluid-tools/benchmark\";\nimport type { AttributionKey } from \"@fluidframework/runtime-definitions/internal\";\n\nimport {\n\ttype IAttributionCollection,\n\tAttributionCollection as NewAttributionCollection,\n\ttype SerializedAttributionCollection,\n} from \"../attributionCollection.js\";\nimport type { ISegment } from \"../mergeTreeNodes.js\";\nimport { TextSegmentGranularity } from \"../textSegment.js\";\n\ninterface IAttributionCollectionCtor {\n\tnew (length: number, key?: AttributionKey): IAttributionCollection<AttributionKey>;\n\n\tserializeAttributionCollections(\n\t\tsegments: Iterable<{\n\t\t\tattribution?: IAttributionCollection<AttributionKey>;\n\t\t\tcachedLength: number;\n\t\t}>,\n\t): SerializedAttributionCollection;\n\n\tpopulateAttributionCollections(\n\t\tsegments: Iterable<Partial<ISegment>>,\n\t\tsummary: SerializedAttributionCollection,\n\t): void;\n}\n\nfunction getCollectionSizes(\n\tctor: IAttributionCollectionCtor,\n\tbaseSuiteType: BenchmarkType,\n): {\n\tname: string;\n\tcollection: IAttributionCollection<AttributionKey>;\n\ttype: BenchmarkType;\n}[] {\n\tconst singleKeyCollection = new ctor(5, { type: \"op\", seq: 42 });\n\tconst tenKeyCollection = new ctor(2, { type: \"op\", seq: 0 });\n\tfor (let i = 1; i < 10; i++) {\n\t\ttenKeyCollection.append(new ctor(3 * i, { type: \"op\", seq: i }));\n\t}\n\tconst maxSizeCollection = new ctor(1, { type: \"op\", seq: 0 });\n\tfor (let i = 1; i < TextSegmentGranularity; i++) {\n\t\tmaxSizeCollection.append(new ctor(1, { type: \"op\", seq: i }));\n\t}\n\treturn [\n\t\t{ name: \"one key\", collection: singleKeyCollection, type: BenchmarkType.Diagnostic },\n\t\t{ name: \"ten keys\", collection: tenKeyCollection, type: baseSuiteType },\n\t\t{ name: \"maximum keys\", collection: maxSizeCollection, type: BenchmarkType.Diagnostic },\n\t];\n}\n\nfunction runAttributionCollectionSuite(\n\tctor: IAttributionCollectionCtor,\n\tsuiteBaseType: BenchmarkType,\n): void {\n\tconst collectionTestCases = getCollectionSizes(ctor, suiteBaseType);\n\tfor (const { name, collection, type } of collectionTestCases) {\n\t\tdescribe(`using a collection with ${name}`, () => {\n\t\t\tconst { length } = collection;\n\t\t\tbenchmark({\n\t\t\t\ttitle: \"getAtOffset at the start\",\n\t\t\t\tbenchmarkFn: () => collection.getAtOffset(0),\n\t\t\t\ttype,\n\t\t\t});\n\n\t\t\tbenchmark({\n\t\t\t\ttitle: \"getAtOffset at the end\",\n\t\t\t\tbenchmarkFn: () => collection.getAtOffset(length - 1),\n\t\t\t\ttype,\n\t\t\t});\n\n\t\t\tbenchmark({\n\t\t\t\ttitle: \"getAtOffset in the middle\",\n\t\t\t\tbenchmarkFn: () => collection.getAtOffset(length / 2),\n\t\t\t\ttype: BenchmarkType.Diagnostic,\n\t\t\t});\n\n\t\t\tbenchmark({\n\t\t\t\ttitle: \"getKeysInOffsetRange from start to end\",\n\t\t\t\tbenchmarkFn: () => collection.getKeysInOffsetRange(0),\n\t\t\t\ttype,\n\t\t\t});\n\n\t\t\tbenchmark({\n\t\t\t\ttitle: \"getKeysInOffsetRange from start to mid\",\n\t\t\t\tbenchmarkFn: () => collection.getKeysInOffsetRange(0, length / 2),\n\t\t\t\ttype,\n\t\t\t});\n\n\t\t\tbenchmark({\n\t\t\t\ttitle: \"getKeysInOffsetRange from mid to end\",\n\t\t\t\tbenchmarkFn: () => collection.getKeysInOffsetRange(length / 2, length - 1),\n\t\t\t\ttype,\n\t\t\t});\n\n\t\t\tbenchmark({\n\t\t\t\ttitle: \"getAll\",\n\t\t\t\tbenchmarkFn: () => collection.getAll(),\n\t\t\t\ttype,\n\t\t\t});\n\n\t\t\tbenchmark({\n\t\t\t\ttitle: \"clone\",\n\t\t\t\tbenchmarkFn: () => collection.clone(),\n\t\t\t\ttype,\n\t\t\t});\n\n\t\t\tbenchmark({\n\t\t\t\ttitle: \"split + append in the middle\",\n\t\t\t\tbenchmarkFn: () => {\n\t\t\t\t\tconst split = collection.splitAt(length / 2);\n\t\t\t\t\tcollection.append(split);\n\t\t\t\t},\n\t\t\t\ttype,\n\t\t\t});\n\t\t});\n\t}\n\n\tbenchmark({\n\t\ttitle: \"construction\",\n\t\tbenchmarkFn: () => new ctor(42, { type: \"op\", seq: 5 }),\n\t\ttype: suiteBaseType,\n\t});\n\n\tconst segmentsToSerialize = collectionTestCases.map(({ collection }) => ({\n\t\tattribution: collection,\n\t\tcachedLength: collection.length,\n\t}));\n\n\tbenchmark({\n\t\ttitle: \"serializing\",\n\t\tbenchmarkFn: () => ctor.serializeAttributionCollections(segmentsToSerialize),\n\t\ttype: suiteBaseType,\n\t});\n\n\tconst summary = ctor.serializeAttributionCollections(segmentsToSerialize);\n\tconst segments: Partial<ISegment>[] = Array.from({ length: 9 }, () => ({\n\t\tcachedLength: Math.floor(summary.length / 10),\n\t})) as ISegment[];\n\tsegments.push({\n\t\tcachedLength: summary.length - 9 * Math.floor(summary.length / 10),\n\t} satisfies Partial<ISegment>);\n\tbenchmark({\n\t\ttitle: \"deserialize into 10 segments\",\n\t\tbenchmarkFn: () => {\n\t\t\tctor.populateAttributionCollections(segments, summary);\n\t\t},\n\t\ttype: suiteBaseType,\n\t});\n}\n\ndescribe(\"IAttributionCollection perf\", () => {\n\t// There was a RedBlack tree based implementation for the collection entries, but the linear array based one won due to constant\n\t// factors/memory characteristics, so just kept the array based one.\n\tdescribe(\"list-based implementation\", () => {\n\t\trunAttributionCollectionSuite(NewAttributionCollection, BenchmarkType.Measurement);\n\t});\n});\n"]}
|
|
1
|
+
{"version":3,"file":"attributionCollection.perf.spec.js","sourceRoot":"","sources":["../../src/test/attributionCollection.perf.spec.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { BenchmarkType, benchmarkDuration, benchmarkIt } from \"@fluid-tools/benchmark\";\nimport type { AttributionKey } from \"@fluidframework/runtime-definitions/internal\";\n\nimport {\n\ttype IAttributionCollection,\n\tAttributionCollection as NewAttributionCollection,\n\ttype SerializedAttributionCollection,\n} from \"../attributionCollection.js\";\nimport type { ISegment } from \"../mergeTreeNodes.js\";\nimport { TextSegmentGranularity } from \"../textSegment.js\";\n\ninterface IAttributionCollectionCtor {\n\tnew (length: number, key?: AttributionKey): IAttributionCollection<AttributionKey>;\n\n\tserializeAttributionCollections(\n\t\tsegments: Iterable<{\n\t\t\tattribution?: IAttributionCollection<AttributionKey>;\n\t\t\tcachedLength: number;\n\t\t}>,\n\t): SerializedAttributionCollection;\n\n\tpopulateAttributionCollections(\n\t\tsegments: Iterable<Partial<ISegment>>,\n\t\tsummary: SerializedAttributionCollection,\n\t): void;\n}\n\nfunction getCollectionSizes(\n\tctor: IAttributionCollectionCtor,\n\tbaseSuiteType: BenchmarkType,\n): {\n\tname: string;\n\tcollection: IAttributionCollection<AttributionKey>;\n\ttype: BenchmarkType;\n}[] {\n\tconst singleKeyCollection = new ctor(5, { type: \"op\", seq: 42 });\n\tconst tenKeyCollection = new ctor(2, { type: \"op\", seq: 0 });\n\tfor (let i = 1; i < 10; i++) {\n\t\ttenKeyCollection.append(new ctor(3 * i, { type: \"op\", seq: i }));\n\t}\n\tconst maxSizeCollection = new ctor(1, { type: \"op\", seq: 0 });\n\tfor (let i = 1; i < TextSegmentGranularity; i++) {\n\t\tmaxSizeCollection.append(new ctor(1, { type: \"op\", seq: i }));\n\t}\n\treturn [\n\t\t{ name: \"one key\", collection: singleKeyCollection, type: BenchmarkType.Diagnostic },\n\t\t{ name: \"ten keys\", collection: tenKeyCollection, type: baseSuiteType },\n\t\t{ name: \"maximum keys\", collection: maxSizeCollection, type: BenchmarkType.Diagnostic },\n\t];\n}\n\nfunction runAttributionCollectionSuite(\n\tctor: IAttributionCollectionCtor,\n\tsuiteBaseType: BenchmarkType = BenchmarkType.Measurement,\n): void {\n\tconst collectionTestCases = getCollectionSizes(ctor, suiteBaseType);\n\tfor (const { name, collection, type } of collectionTestCases) {\n\t\tdescribe(`using a collection with ${name}`, () => {\n\t\t\tconst { length } = collection;\n\t\t\tbenchmarkIt({\n\t\t\t\ttitle: \"getAtOffset at the start\",\n\t\t\t\t...benchmarkDuration({ benchmarkFn: () => collection.getAtOffset(0) }),\n\t\t\t\ttype,\n\t\t\t});\n\n\t\t\tbenchmarkIt({\n\t\t\t\ttitle: \"getAtOffset at the end\",\n\t\t\t\t...benchmarkDuration({ benchmarkFn: () => collection.getAtOffset(length - 1) }),\n\t\t\t\ttype,\n\t\t\t});\n\n\t\t\tbenchmarkIt({\n\t\t\t\ttitle: \"getAtOffset in the middle\",\n\t\t\t\t...benchmarkDuration({ benchmarkFn: () => collection.getAtOffset(length / 2) }),\n\t\t\t\ttype: BenchmarkType.Diagnostic,\n\t\t\t});\n\n\t\t\tbenchmarkIt({\n\t\t\t\ttitle: \"getKeysInOffsetRange from start to end\",\n\t\t\t\t...benchmarkDuration({ benchmarkFn: () => collection.getKeysInOffsetRange(0) }),\n\t\t\t\ttype,\n\t\t\t});\n\n\t\t\tbenchmarkIt({\n\t\t\t\ttitle: \"getKeysInOffsetRange from start to mid\",\n\t\t\t\t...benchmarkDuration({\n\t\t\t\t\tbenchmarkFn: () => collection.getKeysInOffsetRange(0, length / 2),\n\t\t\t\t}),\n\t\t\t\ttype,\n\t\t\t});\n\n\t\t\tbenchmarkIt({\n\t\t\t\ttitle: \"getKeysInOffsetRange from mid to end\",\n\t\t\t\t...benchmarkDuration({\n\t\t\t\t\tbenchmarkFn: () => collection.getKeysInOffsetRange(length / 2, length - 1),\n\t\t\t\t}),\n\t\t\t\ttype,\n\t\t\t});\n\n\t\t\tbenchmarkIt({\n\t\t\t\ttitle: \"getAll\",\n\t\t\t\t...benchmarkDuration({ benchmarkFn: () => collection.getAll() }),\n\t\t\t\ttype,\n\t\t\t});\n\n\t\t\tbenchmarkIt({\n\t\t\t\ttitle: \"clone\",\n\t\t\t\t...benchmarkDuration({ benchmarkFn: () => collection.clone() }),\n\t\t\t\ttype,\n\t\t\t});\n\n\t\t\tbenchmarkIt({\n\t\t\t\ttitle: \"split + append in the middle\",\n\t\t\t\t...benchmarkDuration({\n\t\t\t\t\tbenchmarkFn: () => {\n\t\t\t\t\t\tconst split = collection.splitAt(length / 2);\n\t\t\t\t\t\tcollection.append(split);\n\t\t\t\t\t},\n\t\t\t\t}),\n\t\t\t\ttype,\n\t\t\t});\n\t\t});\n\t}\n\n\tbenchmarkIt({\n\t\ttitle: \"construction\",\n\t\t...benchmarkDuration({ benchmarkFn: () => new ctor(42, { type: \"op\", seq: 5 }) }),\n\t\ttype: suiteBaseType,\n\t});\n\n\tconst segmentsToSerialize = collectionTestCases.map(({ collection }) => ({\n\t\tattribution: collection,\n\t\tcachedLength: collection.length,\n\t}));\n\n\tbenchmarkIt({\n\t\ttitle: \"serializing\",\n\t\t...benchmarkDuration({\n\t\t\tbenchmarkFn: () => ctor.serializeAttributionCollections(segmentsToSerialize),\n\t\t}),\n\t\ttype: suiteBaseType,\n\t});\n\n\tconst summary = ctor.serializeAttributionCollections(segmentsToSerialize);\n\tconst segments: Partial<ISegment>[] = Array.from({ length: 9 }, () => ({\n\t\tcachedLength: Math.floor(summary.length / 10),\n\t})) as ISegment[];\n\tsegments.push({\n\t\tcachedLength: summary.length - 9 * Math.floor(summary.length / 10),\n\t} satisfies Partial<ISegment>);\n\tbenchmarkIt({\n\t\ttitle: \"deserialize into 10 segments\",\n\t\t...benchmarkDuration({\n\t\t\tbenchmarkFn: () => {\n\t\t\t\tctor.populateAttributionCollections(segments, summary);\n\t\t\t},\n\t\t}),\n\t\ttype: suiteBaseType,\n\t});\n}\n\ndescribe(\"IAttributionCollection perf\", () => {\n\t// There was a RedBlack tree based implementation for the collection entries, but the linear array based one won due to constant\n\t// factors/memory characteristics, so just kept the array based one.\n\tdescribe(\"list-based implementation\", () => {\n\t\trunAttributionCollectionSuite(NewAttributionCollection);\n\t});\n});\n"]}
|
package/lib/index.d.ts
CHANGED
|
@@ -17,7 +17,7 @@ export { type AdjustParams, type IJSONSegment, type IMarkerDef, type IMergeTreeA
|
|
|
17
17
|
export { addProperties, createMap, type MapLike, matchProperties, type PropertySet, } from "./properties.js";
|
|
18
18
|
export { compareReferencePositions, DetachedReferencePosition, maxReferencePosition, minReferencePosition, type ReferencePosition, refGetTileLabels, refHasTileLabel, refHasTileLabels, refTypeIncludesFlag, reservedRangeLabelsKey, reservedTileLabelsKey, } from "./referencePositions.js";
|
|
19
19
|
export { type PropsOrAdjust, copyPropertiesAndManager, PropertiesManager, } from "./segmentPropertiesManager.js";
|
|
20
|
-
export { type InteriorSequencePlace, Side, type SequencePlace, endpointPosAndSide, } from "./sequencePlace.js";
|
|
20
|
+
export { type InteriorSequencePlace, Side, type SequencePlace, defaultSide, endpointPosAndSide, } from "./sequencePlace.js";
|
|
21
21
|
export { SortedSet } from "./sortedSet.js";
|
|
22
22
|
export { SortedSegmentSet, type SortedSegmentSetItem } from "./sortedSegmentSet.js";
|
|
23
23
|
export { type IJSONTextSegment, TextSegment } from "./textSegment.js";
|
package/lib/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/lib/index.js
CHANGED
|
@@ -16,7 +16,7 @@ export { MergeTreeDeltaType, ReferenceType, } from "./ops.js";
|
|
|
16
16
|
export { addProperties, createMap, matchProperties, } from "./properties.js";
|
|
17
17
|
export { compareReferencePositions, DetachedReferencePosition, maxReferencePosition, minReferencePosition, refGetTileLabels, refHasTileLabel, refHasTileLabels, refTypeIncludesFlag, reservedRangeLabelsKey, reservedTileLabelsKey, } from "./referencePositions.js";
|
|
18
18
|
export { copyPropertiesAndManager, PropertiesManager, } from "./segmentPropertiesManager.js";
|
|
19
|
-
export { Side, endpointPosAndSide, } from "./sequencePlace.js";
|
|
19
|
+
export { Side, defaultSide, endpointPosAndSide, } from "./sequencePlace.js";
|
|
20
20
|
export { SortedSet } from "./sortedSet.js";
|
|
21
21
|
export { SortedSegmentSet } from "./sortedSegmentSet.js";
|
|
22
22
|
export { TextSegment } from "./textSegment.js";
|
package/lib/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AASH,OAAO,EACN,iCAAiC,EACjC,8CAA8C,EAC9C,0DAA0D,GAC1D,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,MAAM,EAAsB,MAAM,aAAa,CAAC;AACzD,OAAO,EASN,OAAO,EAGP,YAAY,GAEZ,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,wBAAwB,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAC;AACnF,OAAO,EACN,oCAAoC,EACpC,wBAAwB,EAExB,iBAAiB,GACjB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAKN,gBAAgB,GAChB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAON,wBAAwB,GACxB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EACN,WAAW,EACX,mBAAmB,EAEnB,gBAAgB,EAGhB,MAAM,EACN,mBAAmB,EACnB,2BAA2B,GAE3B,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAEN,aAAa,EAEb,uBAAuB,GACvB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACN,qBAAqB,EACrB,aAAa,EACb,cAAc,EACd,qBAAqB,EACrB,mBAAmB,EACnB,uBAAuB,GACvB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAaN,kBAAkB,EAClB,aAAa,GAGb,MAAM,UAAU,CAAC;AAClB,OAAO,EACN,aAAa,EACb,SAAS,EAET,eAAe,GAEf,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACN,yBAAyB,EACzB,yBAAyB,EACzB,oBAAoB,EACpB,oBAAoB,EAEpB,gBAAgB,EAChB,eAAe,EACf,gBAAgB,EAChB,mBAAmB,EACnB,sBAAsB,EACtB,qBAAqB,GACrB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAEN,wBAAwB,EACxB,iBAAiB,GACjB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAEN,IAAI,EAEJ,kBAAkB,GAClB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,gBAAgB,EAA6B,MAAM,uBAAuB,CAAC;AACpF,OAAO,EAAyB,WAAW,EAAE,MAAM,kBAAkB,CAAC;AACtE,OAAO,EACN,iCAAiC,EACjC,+BAA+B,EAC/B,0BAA0B,EAG1B,+BAA+B,GAC/B,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EAAE,kCAAkC,EAAoB,MAAM,kBAAkB,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nexport type {\n\tIAttributionCollection,\n\tIAttributionCollectionSerializer,\n\tIAttributionCollectionSpec,\n\tSerializedAttributionCollection,\n\tSequenceOffsets,\n} from \"./attributionCollection.js\";\nexport {\n\tcreateInsertOnlyAttributionPolicy,\n\tcreatePropertyTrackingAttributionPolicyFactory,\n\tcreatePropertyTrackingAndInsertionAttributionPolicyFactory,\n} from \"./attributionPolicy.js\";\nexport { Client, type IClientEvents } from \"./client.js\";\nexport {\n\ttype ConflictAction,\n\ttype Dictionary,\n\ttype IRBAugmentation,\n\ttype IRBMatcher,\n\ttype KeyComparer,\n\ttype Property,\n\ttype PropertyAction,\n\ttype QProperty,\n\tRBColor,\n\ttype RBNode,\n\ttype RBNodeActions,\n\tRedBlackTree,\n\ttype SortedDictionary,\n} from \"./collections/index.js\";\nexport { UnassignedSequenceNumber, UniversalSequenceNumber } from \"./constants.js\";\nexport {\n\tcreateDetachedLocalReferencePosition,\n\tLocalReferenceCollection,\n\ttype LocalReferencePosition,\n\tSlidingPreference,\n} from \"./localReference.js\";\nexport {\n\ttype AttributionPolicy,\n\ttype IMergeTreeAttributionOptions,\n\ttype IMergeTreeOptions,\n\ttype IMergeTreeOptionsInternal,\n\tgetSlideToSegoff,\n} from \"./mergeTree.js\";\nexport {\n\ttype IMergeTreeDeltaCallbackArgs,\n\ttype IMergeTreeDeltaOpArgs,\n\ttype IMergeTreeMaintenanceCallbackArgs,\n\ttype IMergeTreeSegmentDelta,\n\ttype MergeTreeDeltaOperationType,\n\ttype MergeTreeDeltaOperationTypes,\n\tMergeTreeMaintenanceType,\n} from \"./mergeTreeDeltaCallback.js\";\nexport {\n\tBaseSegment,\n\tCollaborationWindow,\n\ttype IJSONMarkerSegment,\n\tsegmentIsRemoved,\n\ttype ISegment,\n\ttype ISegmentAction,\n\tMarker,\n\treservedMarkerIdKey,\n\treservedMarkerSimpleTypeKey,\n\ttype ISegmentInternal,\n} from \"./mergeTreeNodes.js\";\nexport {\n\ttype Trackable,\n\tTrackingGroup,\n\ttype ITrackingGroup,\n\tTrackingGroupCollection,\n} from \"./mergeTreeTracking.js\";\nexport {\n\tcreateAnnotateRangeOp,\n\tcreateGroupOp,\n\tcreateInsertOp,\n\tcreateInsertSegmentOp,\n\tcreateRemoveRangeOp,\n\tcreateObliterateRangeOp,\n} from \"./opBuilder.js\";\nexport {\n\ttype AdjustParams,\n\ttype IJSONSegment,\n\ttype IMarkerDef,\n\ttype IMergeTreeAnnotateMsg,\n\ttype IMergeTreeDelta,\n\ttype IMergeTreeDeltaOp,\n\ttype IMergeTreeGroupMsg,\n\ttype IMergeTreeInsertMsg,\n\ttype IMergeTreeOp,\n\ttype IMergeTreeRemoveMsg,\n\ttype IMergeTreeAnnotateAdjustMsg,\n\ttype IRelativePosition,\n\tMergeTreeDeltaType,\n\tReferenceType,\n\ttype IMergeTreeObliterateMsg,\n\ttype IMergeTreeObliterateSidedMsg,\n} from \"./ops.js\";\nexport {\n\taddProperties,\n\tcreateMap,\n\ttype MapLike,\n\tmatchProperties,\n\ttype PropertySet,\n} from \"./properties.js\";\nexport {\n\tcompareReferencePositions,\n\tDetachedReferencePosition,\n\tmaxReferencePosition,\n\tminReferencePosition,\n\ttype ReferencePosition,\n\trefGetTileLabels,\n\trefHasTileLabel,\n\trefHasTileLabels,\n\trefTypeIncludesFlag,\n\treservedRangeLabelsKey,\n\treservedTileLabelsKey,\n} from \"./referencePositions.js\";\nexport {\n\ttype PropsOrAdjust,\n\tcopyPropertiesAndManager,\n\tPropertiesManager,\n} from \"./segmentPropertiesManager.js\";\nexport {\n\ttype InteriorSequencePlace,\n\tSide,\n\ttype SequencePlace,\n\tendpointPosAndSide,\n} from \"./sequencePlace.js\";\nexport { SortedSet } from \"./sortedSet.js\";\nexport { SortedSegmentSet, type SortedSegmentSetItem } from \"./sortedSegmentSet.js\";\nexport { type IJSONTextSegment, TextSegment } from \"./textSegment.js\";\nexport {\n\tappendToMergeTreeDeltaRevertibles,\n\tdiscardMergeTreeDeltaRevertible,\n\tisMergeTreeDeltaRevertible,\n\ttype MergeTreeDeltaRevertible,\n\ttype MergeTreeRevertibleDriver,\n\trevertMergeTreeDeltaRevertibles,\n} from \"./revertibles.js\";\nexport type { OperationStamp } from \"./stamps.js\";\nexport { createLocalReconnectingPerspective, type Perspective } from \"./perspective.js\";\nexport type { IMergeTreeTextHelper } from \"./MergeTreeTextHelper.js\";\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AASH,OAAO,EACN,iCAAiC,EACjC,8CAA8C,EAC9C,0DAA0D,GAC1D,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,MAAM,EAAsB,MAAM,aAAa,CAAC;AACzD,OAAO,EASN,OAAO,EAGP,YAAY,GAEZ,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,wBAAwB,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAC;AACnF,OAAO,EACN,oCAAoC,EACpC,wBAAwB,EAExB,iBAAiB,GACjB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAKN,gBAAgB,GAChB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAON,wBAAwB,GACxB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EACN,WAAW,EACX,mBAAmB,EAEnB,gBAAgB,EAGhB,MAAM,EACN,mBAAmB,EACnB,2BAA2B,GAE3B,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAEN,aAAa,EAEb,uBAAuB,GACvB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACN,qBAAqB,EACrB,aAAa,EACb,cAAc,EACd,qBAAqB,EACrB,mBAAmB,EACnB,uBAAuB,GACvB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAaN,kBAAkB,EAClB,aAAa,GAGb,MAAM,UAAU,CAAC;AAClB,OAAO,EACN,aAAa,EACb,SAAS,EAET,eAAe,GAEf,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACN,yBAAyB,EACzB,yBAAyB,EACzB,oBAAoB,EACpB,oBAAoB,EAEpB,gBAAgB,EAChB,eAAe,EACf,gBAAgB,EAChB,mBAAmB,EACnB,sBAAsB,EACtB,qBAAqB,GACrB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAEN,wBAAwB,EACxB,iBAAiB,GACjB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAEN,IAAI,EAEJ,WAAW,EACX,kBAAkB,GAClB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,gBAAgB,EAA6B,MAAM,uBAAuB,CAAC;AACpF,OAAO,EAAyB,WAAW,EAAE,MAAM,kBAAkB,CAAC;AACtE,OAAO,EACN,iCAAiC,EACjC,+BAA+B,EAC/B,0BAA0B,EAG1B,+BAA+B,GAC/B,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EAAE,kCAAkC,EAAoB,MAAM,kBAAkB,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nexport type {\n\tIAttributionCollection,\n\tIAttributionCollectionSerializer,\n\tIAttributionCollectionSpec,\n\tSerializedAttributionCollection,\n\tSequenceOffsets,\n} from \"./attributionCollection.js\";\nexport {\n\tcreateInsertOnlyAttributionPolicy,\n\tcreatePropertyTrackingAttributionPolicyFactory,\n\tcreatePropertyTrackingAndInsertionAttributionPolicyFactory,\n} from \"./attributionPolicy.js\";\nexport { Client, type IClientEvents } from \"./client.js\";\nexport {\n\ttype ConflictAction,\n\ttype Dictionary,\n\ttype IRBAugmentation,\n\ttype IRBMatcher,\n\ttype KeyComparer,\n\ttype Property,\n\ttype PropertyAction,\n\ttype QProperty,\n\tRBColor,\n\ttype RBNode,\n\ttype RBNodeActions,\n\tRedBlackTree,\n\ttype SortedDictionary,\n} from \"./collections/index.js\";\nexport { UnassignedSequenceNumber, UniversalSequenceNumber } from \"./constants.js\";\nexport {\n\tcreateDetachedLocalReferencePosition,\n\tLocalReferenceCollection,\n\ttype LocalReferencePosition,\n\tSlidingPreference,\n} from \"./localReference.js\";\nexport {\n\ttype AttributionPolicy,\n\ttype IMergeTreeAttributionOptions,\n\ttype IMergeTreeOptions,\n\ttype IMergeTreeOptionsInternal,\n\tgetSlideToSegoff,\n} from \"./mergeTree.js\";\nexport {\n\ttype IMergeTreeDeltaCallbackArgs,\n\ttype IMergeTreeDeltaOpArgs,\n\ttype IMergeTreeMaintenanceCallbackArgs,\n\ttype IMergeTreeSegmentDelta,\n\ttype MergeTreeDeltaOperationType,\n\ttype MergeTreeDeltaOperationTypes,\n\tMergeTreeMaintenanceType,\n} from \"./mergeTreeDeltaCallback.js\";\nexport {\n\tBaseSegment,\n\tCollaborationWindow,\n\ttype IJSONMarkerSegment,\n\tsegmentIsRemoved,\n\ttype ISegment,\n\ttype ISegmentAction,\n\tMarker,\n\treservedMarkerIdKey,\n\treservedMarkerSimpleTypeKey,\n\ttype ISegmentInternal,\n} from \"./mergeTreeNodes.js\";\nexport {\n\ttype Trackable,\n\tTrackingGroup,\n\ttype ITrackingGroup,\n\tTrackingGroupCollection,\n} from \"./mergeTreeTracking.js\";\nexport {\n\tcreateAnnotateRangeOp,\n\tcreateGroupOp,\n\tcreateInsertOp,\n\tcreateInsertSegmentOp,\n\tcreateRemoveRangeOp,\n\tcreateObliterateRangeOp,\n} from \"./opBuilder.js\";\nexport {\n\ttype AdjustParams,\n\ttype IJSONSegment,\n\ttype IMarkerDef,\n\ttype IMergeTreeAnnotateMsg,\n\ttype IMergeTreeDelta,\n\ttype IMergeTreeDeltaOp,\n\ttype IMergeTreeGroupMsg,\n\ttype IMergeTreeInsertMsg,\n\ttype IMergeTreeOp,\n\ttype IMergeTreeRemoveMsg,\n\ttype IMergeTreeAnnotateAdjustMsg,\n\ttype IRelativePosition,\n\tMergeTreeDeltaType,\n\tReferenceType,\n\ttype IMergeTreeObliterateMsg,\n\ttype IMergeTreeObliterateSidedMsg,\n} from \"./ops.js\";\nexport {\n\taddProperties,\n\tcreateMap,\n\ttype MapLike,\n\tmatchProperties,\n\ttype PropertySet,\n} from \"./properties.js\";\nexport {\n\tcompareReferencePositions,\n\tDetachedReferencePosition,\n\tmaxReferencePosition,\n\tminReferencePosition,\n\ttype ReferencePosition,\n\trefGetTileLabels,\n\trefHasTileLabel,\n\trefHasTileLabels,\n\trefTypeIncludesFlag,\n\treservedRangeLabelsKey,\n\treservedTileLabelsKey,\n} from \"./referencePositions.js\";\nexport {\n\ttype PropsOrAdjust,\n\tcopyPropertiesAndManager,\n\tPropertiesManager,\n} from \"./segmentPropertiesManager.js\";\nexport {\n\ttype InteriorSequencePlace,\n\tSide,\n\ttype SequencePlace,\n\tdefaultSide,\n\tendpointPosAndSide,\n} from \"./sequencePlace.js\";\nexport { SortedSet } from \"./sortedSet.js\";\nexport { SortedSegmentSet, type SortedSegmentSetItem } from \"./sortedSegmentSet.js\";\nexport { type IJSONTextSegment, TextSegment } from \"./textSegment.js\";\nexport {\n\tappendToMergeTreeDeltaRevertibles,\n\tdiscardMergeTreeDeltaRevertible,\n\tisMergeTreeDeltaRevertible,\n\ttype MergeTreeDeltaRevertible,\n\ttype MergeTreeRevertibleDriver,\n\trevertMergeTreeDeltaRevertibles,\n} from \"./revertibles.js\";\nexport type { OperationStamp } from \"./stamps.js\";\nexport { createLocalReconnectingPerspective, type Perspective } from \"./perspective.js\";\nexport type { IMergeTreeTextHelper } from \"./MergeTreeTextHelper.js\";\n"]}
|