@fluidframework/routerlicious-driver 2.0.0-dev.3.1.0.125672 → 2.0.0-dev.4.2.0.153917
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 +5 -0
- package/README.md +38 -0
- package/dist/cache.js +2 -2
- package/dist/cache.js.map +1 -1
- package/dist/deltaStorageService.d.ts +1 -1
- package/dist/deltaStorageService.d.ts.map +1 -1
- package/dist/deltaStorageService.js +7 -4
- package/dist/deltaStorageService.js.map +1 -1
- package/dist/documentService.d.ts +4 -2
- package/dist/documentService.d.ts.map +1 -1
- package/dist/documentService.js +20 -12
- package/dist/documentService.js.map +1 -1
- package/dist/documentServiceFactory.d.ts +2 -2
- package/dist/documentServiceFactory.d.ts.map +1 -1
- package/dist/documentServiceFactory.js +21 -12
- package/dist/documentServiceFactory.js.map +1 -1
- package/dist/documentStorageService.d.ts +3 -2
- package/dist/documentStorageService.d.ts.map +1 -1
- package/dist/documentStorageService.js +4 -4
- package/dist/documentStorageService.js.map +1 -1
- package/dist/errorUtils.d.ts +9 -2
- package/dist/errorUtils.d.ts.map +1 -1
- package/dist/errorUtils.js +15 -8
- package/dist/errorUtils.js.map +1 -1
- package/dist/gitManager.d.ts +30 -0
- package/dist/gitManager.d.ts.map +1 -0
- package/dist/gitManager.js +89 -0
- package/dist/gitManager.js.map +1 -0
- package/dist/historian.d.ts +33 -0
- package/dist/historian.d.ts.map +1 -0
- package/dist/historian.js +65 -0
- package/dist/historian.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -1
- package/dist/index.js.map +1 -1
- package/dist/mapWithExpiration.d.ts +34 -0
- package/dist/mapWithExpiration.d.ts.map +1 -0
- package/dist/mapWithExpiration.js +105 -0
- package/dist/mapWithExpiration.js.map +1 -0
- package/dist/packageVersion.d.ts +1 -1
- package/dist/packageVersion.js +1 -1
- package/dist/packageVersion.js.map +1 -1
- package/dist/restWrapper.d.ts +21 -8
- package/dist/restWrapper.d.ts.map +1 -1
- package/dist/restWrapper.js +93 -25
- package/dist/restWrapper.js.map +1 -1
- package/dist/restWrapperBase.d.ts +26 -0
- package/dist/restWrapperBase.d.ts.map +1 -0
- package/dist/restWrapperBase.js +55 -0
- package/dist/restWrapperBase.js.map +1 -0
- package/dist/retriableGitManager.d.ts +10 -21
- package/dist/retriableGitManager.d.ts.map +1 -1
- package/dist/retriableGitManager.js +0 -36
- package/dist/retriableGitManager.js.map +1 -1
- package/dist/shreddedSummaryDocumentStorageService.d.ts +1 -1
- package/dist/shreddedSummaryDocumentStorageService.d.ts.map +1 -1
- package/dist/shreddedSummaryDocumentStorageService.js +6 -6
- package/dist/shreddedSummaryDocumentStorageService.js.map +1 -1
- package/dist/storageContracts.d.ts +44 -0
- package/dist/storageContracts.d.ts.map +1 -0
- package/dist/storageContracts.js +7 -0
- package/dist/storageContracts.js.map +1 -0
- package/dist/summaryTreeUploadManager.d.ts +23 -0
- package/dist/summaryTreeUploadManager.d.ts.map +1 -0
- package/dist/summaryTreeUploadManager.js +110 -0
- package/dist/summaryTreeUploadManager.js.map +1 -0
- package/dist/tokens.d.ts +24 -7
- package/dist/tokens.d.ts.map +1 -1
- package/dist/tokens.js.map +1 -1
- package/dist/treeUtils.d.ts +58 -0
- package/dist/treeUtils.d.ts.map +1 -0
- package/dist/treeUtils.js +107 -0
- package/dist/treeUtils.js.map +1 -0
- package/dist/wholeSummaryDocumentStorageService.d.ts +5 -4
- package/dist/wholeSummaryDocumentStorageService.d.ts.map +1 -1
- package/dist/wholeSummaryDocumentStorageService.js +70 -38
- package/dist/wholeSummaryDocumentStorageService.js.map +1 -1
- package/dist/wholeSummaryUploadManager.d.ts +16 -0
- package/dist/wholeSummaryUploadManager.d.ts.map +1 -0
- package/dist/wholeSummaryUploadManager.js +38 -0
- package/dist/wholeSummaryUploadManager.js.map +1 -0
- package/lib/cache.js +1 -1
- package/lib/cache.js.map +1 -1
- package/lib/deltaStorageService.d.ts +1 -1
- package/lib/deltaStorageService.d.ts.map +1 -1
- package/lib/deltaStorageService.js +7 -4
- package/lib/deltaStorageService.js.map +1 -1
- package/lib/documentService.d.ts +4 -2
- package/lib/documentService.d.ts.map +1 -1
- package/lib/documentService.js +20 -12
- package/lib/documentService.js.map +1 -1
- package/lib/documentServiceFactory.d.ts +2 -2
- package/lib/documentServiceFactory.d.ts.map +1 -1
- package/lib/documentServiceFactory.js +22 -13
- package/lib/documentServiceFactory.js.map +1 -1
- package/lib/documentStorageService.d.ts +3 -2
- package/lib/documentStorageService.d.ts.map +1 -1
- package/lib/documentStorageService.js +4 -4
- package/lib/documentStorageService.js.map +1 -1
- package/lib/errorUtils.d.ts +9 -2
- package/lib/errorUtils.d.ts.map +1 -1
- package/lib/errorUtils.js +14 -7
- package/lib/errorUtils.js.map +1 -1
- package/lib/gitManager.d.ts +30 -0
- package/lib/gitManager.d.ts.map +1 -0
- package/lib/gitManager.js +85 -0
- package/lib/gitManager.js.map +1 -0
- package/lib/historian.d.ts +33 -0
- package/lib/historian.d.ts.map +1 -0
- package/lib/historian.js +60 -0
- package/lib/historian.js.map +1 -0
- package/lib/index.d.ts +1 -0
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +2 -0
- package/lib/index.js.map +1 -1
- package/lib/mapWithExpiration.d.ts +34 -0
- package/lib/mapWithExpiration.d.ts.map +1 -0
- package/lib/mapWithExpiration.js +101 -0
- package/lib/mapWithExpiration.js.map +1 -0
- package/lib/packageVersion.d.ts +1 -1
- package/lib/packageVersion.js +1 -1
- package/lib/packageVersion.js.map +1 -1
- package/lib/restWrapper.d.ts +21 -8
- package/lib/restWrapper.d.ts.map +1 -1
- package/lib/restWrapper.js +92 -26
- package/lib/restWrapper.js.map +1 -1
- package/lib/restWrapperBase.d.ts +26 -0
- package/lib/restWrapperBase.d.ts.map +1 -0
- package/lib/restWrapperBase.js +50 -0
- package/lib/restWrapperBase.js.map +1 -0
- package/lib/retriableGitManager.d.ts +10 -21
- package/lib/retriableGitManager.d.ts.map +1 -1
- package/lib/retriableGitManager.js +0 -36
- package/lib/retriableGitManager.js.map +1 -1
- package/lib/shreddedSummaryDocumentStorageService.d.ts +1 -1
- package/lib/shreddedSummaryDocumentStorageService.d.ts.map +1 -1
- package/lib/shreddedSummaryDocumentStorageService.js +5 -5
- package/lib/shreddedSummaryDocumentStorageService.js.map +1 -1
- package/lib/storageContracts.d.ts +44 -0
- package/lib/storageContracts.d.ts.map +1 -0
- package/lib/storageContracts.js +6 -0
- package/lib/storageContracts.js.map +1 -0
- package/lib/summaryTreeUploadManager.d.ts +23 -0
- package/lib/summaryTreeUploadManager.d.ts.map +1 -0
- package/lib/summaryTreeUploadManager.js +106 -0
- package/lib/summaryTreeUploadManager.js.map +1 -0
- package/lib/tokens.d.ts +24 -7
- package/lib/tokens.d.ts.map +1 -1
- package/lib/tokens.js.map +1 -1
- package/lib/treeUtils.d.ts +58 -0
- package/lib/treeUtils.d.ts.map +1 -0
- package/lib/treeUtils.js +100 -0
- package/lib/treeUtils.js.map +1 -0
- package/lib/wholeSummaryDocumentStorageService.d.ts +5 -4
- package/lib/wholeSummaryDocumentStorageService.d.ts.map +1 -1
- package/lib/wholeSummaryDocumentStorageService.js +70 -38
- package/lib/wholeSummaryDocumentStorageService.js.map +1 -1
- package/lib/wholeSummaryUploadManager.d.ts +16 -0
- package/lib/wholeSummaryUploadManager.d.ts.map +1 -0
- package/lib/wholeSummaryUploadManager.js +34 -0
- package/lib/wholeSummaryUploadManager.js.map +1 -0
- package/package.json +52 -54
- package/src/cache.ts +1 -1
- package/src/deltaStorageService.ts +11 -3
- package/src/documentService.ts +37 -22
- package/src/documentServiceFactory.ts +40 -21
- package/src/documentStorageService.ts +8 -4
- package/src/errorUtils.ts +16 -4
- package/src/gitManager.ts +116 -0
- package/src/historian.ts +121 -0
- package/src/index.ts +3 -0
- package/src/mapWithExpiration.ts +124 -0
- package/src/packageVersion.ts +1 -1
- package/src/restWrapper.ts +114 -38
- package/src/restWrapperBase.ts +146 -0
- package/src/retriableGitManager.ts +17 -95
- package/src/shreddedSummaryDocumentStorageService.ts +7 -9
- package/src/storageContracts.ts +63 -0
- package/src/summaryTreeUploadManager.ts +160 -0
- package/src/tokens.ts +24 -7
- package/src/treeUtils.ts +137 -0
- package/src/wholeSummaryDocumentStorageService.ts +118 -46
- package/src/wholeSummaryUploadManager.ts +64 -0
|
@@ -4,13 +4,18 @@
|
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
6
|
import type { ITelemetryLogger } from "@fluidframework/common-definitions";
|
|
7
|
-
import {
|
|
7
|
+
import {
|
|
8
|
+
assert,
|
|
9
|
+
performance,
|
|
10
|
+
stringToBuffer,
|
|
11
|
+
Uint8ArrayToString,
|
|
12
|
+
} from "@fluidframework/common-utils";
|
|
13
|
+
import { getW3CData, promiseRaceWithWinner } from "@fluidframework/driver-base";
|
|
8
14
|
import {
|
|
9
15
|
IDocumentStorageService,
|
|
10
16
|
ISummaryContext,
|
|
11
17
|
IDocumentStorageServicePolicies,
|
|
12
18
|
} from "@fluidframework/driver-definitions";
|
|
13
|
-
import { convertSnapshotAndBlobsToSummaryTree } from "@fluidframework/driver-utils";
|
|
14
19
|
import {
|
|
15
20
|
ICreateBlobResponse,
|
|
16
21
|
ISnapshotTree,
|
|
@@ -20,14 +25,21 @@ import {
|
|
|
20
25
|
} from "@fluidframework/protocol-definitions";
|
|
21
26
|
import {
|
|
22
27
|
convertWholeFlatSummaryToSnapshotTreeAndBlobs,
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
WholeSummaryUploadManager,
|
|
28
|
+
INormalizedWholeSummary,
|
|
29
|
+
IWholeFlatSummary,
|
|
26
30
|
} from "@fluidframework/server-services-client";
|
|
27
31
|
import { PerformanceEvent } from "@fluidframework/telemetry-utils";
|
|
28
32
|
import { ICache, InMemoryCache } from "./cache";
|
|
29
|
-
import { ISnapshotTreeVersion } from "./definitions";
|
|
30
33
|
import { IRouterliciousDriverPolicies } from "./policies";
|
|
34
|
+
import {
|
|
35
|
+
convertSnapshotAndBlobsToSummaryTree,
|
|
36
|
+
evalBlobsAndTrees,
|
|
37
|
+
validateBlobsAndTrees,
|
|
38
|
+
} from "./treeUtils";
|
|
39
|
+
import { GitManager } from "./gitManager";
|
|
40
|
+
import { WholeSummaryUploadManager } from "./wholeSummaryUploadManager";
|
|
41
|
+
import { ISummaryUploadManager } from "./storageContracts";
|
|
42
|
+
import { IR11sResponse } from "./restWrapper";
|
|
31
43
|
|
|
32
44
|
const latestSnapshotId: string = "latest";
|
|
33
45
|
|
|
@@ -50,7 +62,7 @@ export class WholeSummaryDocumentStorageService implements IDocumentStorageServi
|
|
|
50
62
|
public readonly policies: IDocumentStorageServicePolicies,
|
|
51
63
|
private readonly driverPolicies?: IRouterliciousDriverPolicies,
|
|
52
64
|
private readonly blobCache: ICache<ArrayBufferLike> = new InMemoryCache(),
|
|
53
|
-
private readonly snapshotTreeCache: ICache<
|
|
65
|
+
private readonly snapshotTreeCache: ICache<INormalizedWholeSummary> = new InMemoryCache(),
|
|
54
66
|
private readonly noCacheGitManager?: GitManager,
|
|
55
67
|
private readonly getStorageManager: (
|
|
56
68
|
disableCache?: boolean,
|
|
@@ -73,14 +85,60 @@ export class WholeSummaryDocumentStorageService implements IDocumentStorageServi
|
|
|
73
85
|
// If this is the first versions call for the document, we know we will want the latest summary.
|
|
74
86
|
// Fetch latest summary, cache it, and return its id.
|
|
75
87
|
if (this.firstVersionsCall && count === 1) {
|
|
88
|
+
const normalizedSnapshotContents = await PerformanceEvent.timedExecAsync(
|
|
89
|
+
this.logger,
|
|
90
|
+
{
|
|
91
|
+
eventName: "ObtainSnapshot",
|
|
92
|
+
versionId: versionId ?? undefined,
|
|
93
|
+
count,
|
|
94
|
+
enableDiscovery: this.driverPolicies?.enableDiscovery,
|
|
95
|
+
},
|
|
96
|
+
async (event) => {
|
|
97
|
+
let method: string;
|
|
98
|
+
const cachedSnapshotP = this.snapshotTreeCache.get(
|
|
99
|
+
this.getCacheKey(latestSnapshotId),
|
|
100
|
+
);
|
|
101
|
+
|
|
102
|
+
const networkSnapshotP = !this.driverPolicies?.enableDiscovery
|
|
103
|
+
? this.fetchSnapshotTree(latestSnapshotId, false)
|
|
104
|
+
: this.fetchSnapshotTree(latestSnapshotId, true);
|
|
105
|
+
|
|
106
|
+
const promiseRaceWinner = await promiseRaceWithWinner([
|
|
107
|
+
cachedSnapshotP.catch(() => undefined),
|
|
108
|
+
networkSnapshotP.catch(() => undefined),
|
|
109
|
+
]);
|
|
110
|
+
|
|
111
|
+
let retrievedSnapshot = promiseRaceWinner.value;
|
|
112
|
+
method = promiseRaceWinner.index === 0 ? "cache" : "network";
|
|
113
|
+
|
|
114
|
+
if (retrievedSnapshot === undefined) {
|
|
115
|
+
// if network failed -> wait for cache ( then return network failure)
|
|
116
|
+
// If cache returned empty or failed -> wait for network (success of failure)
|
|
117
|
+
if (promiseRaceWinner.index === 1) {
|
|
118
|
+
retrievedSnapshot = await cachedSnapshotP;
|
|
119
|
+
method = "cache";
|
|
120
|
+
}
|
|
121
|
+
if (retrievedSnapshot === undefined) {
|
|
122
|
+
retrievedSnapshot = await networkSnapshotP;
|
|
123
|
+
method = "network";
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
event.end({
|
|
127
|
+
method,
|
|
128
|
+
});
|
|
129
|
+
return retrievedSnapshot;
|
|
130
|
+
},
|
|
131
|
+
);
|
|
132
|
+
|
|
133
|
+
const _id = await this.initializeFromSnapshot(
|
|
134
|
+
normalizedSnapshotContents,
|
|
135
|
+
latestSnapshotId,
|
|
136
|
+
);
|
|
76
137
|
this.firstVersionsCall = false;
|
|
77
|
-
const { id: _id, snapshotTree } = !this.driverPolicies?.enableDiscovery
|
|
78
|
-
? await this.fetchAndCacheSnapshotTree(latestSnapshotId, false)
|
|
79
|
-
: await this.fetchAndCacheSnapshotTree(latestSnapshotId, true);
|
|
80
138
|
return [
|
|
81
139
|
{
|
|
82
140
|
id: _id,
|
|
83
|
-
treeId: snapshotTree.id!,
|
|
141
|
+
treeId: normalizedSnapshotContents.snapshotTree.id!,
|
|
84
142
|
},
|
|
85
143
|
];
|
|
86
144
|
}
|
|
@@ -96,7 +154,7 @@ export class WholeSummaryDocumentStorageService implements IDocumentStorageServi
|
|
|
96
154
|
},
|
|
97
155
|
async () => {
|
|
98
156
|
const manager = await this.getStorageManager();
|
|
99
|
-
return manager.getCommits(id, count);
|
|
157
|
+
return (await manager.getCommits(id, count)).content;
|
|
100
158
|
},
|
|
101
159
|
);
|
|
102
160
|
return commits.map((commit) => ({
|
|
@@ -117,7 +175,13 @@ export class WholeSummaryDocumentStorageService implements IDocumentStorageServi
|
|
|
117
175
|
requestVersion = versions[0];
|
|
118
176
|
}
|
|
119
177
|
|
|
120
|
-
|
|
178
|
+
const normalizedWholeSnapshot = await this.snapshotTreeCache.get(
|
|
179
|
+
this.getCacheKey(requestVersion.id),
|
|
180
|
+
);
|
|
181
|
+
if (normalizedWholeSnapshot !== undefined) {
|
|
182
|
+
return normalizedWholeSnapshot.snapshotTree;
|
|
183
|
+
}
|
|
184
|
+
return (await this.fetchSnapshotTree(requestVersion.id)).snapshotTree;
|
|
121
185
|
}
|
|
122
186
|
|
|
123
187
|
public async readBlob(blobId: string): Promise<ArrayBufferLike> {
|
|
@@ -134,7 +198,7 @@ export class WholeSummaryDocumentStorageService implements IDocumentStorageServi
|
|
|
134
198
|
},
|
|
135
199
|
async (event) => {
|
|
136
200
|
const manager = await this.getStorageManager();
|
|
137
|
-
const response = await manager.getBlob(blobId);
|
|
201
|
+
const response = (await manager.getBlob(blobId)).content;
|
|
138
202
|
event.end({
|
|
139
203
|
size: response.size,
|
|
140
204
|
});
|
|
@@ -183,9 +247,9 @@ export class WholeSummaryDocumentStorageService implements IDocumentStorageServi
|
|
|
183
247
|
const manager = await this.getStorageManager();
|
|
184
248
|
const response = await manager.getSummary(summaryHandle.handle);
|
|
185
249
|
event.end({
|
|
186
|
-
size: response.trees[0]?.entries.length,
|
|
250
|
+
size: response.content.trees[0]?.entries.length,
|
|
187
251
|
});
|
|
188
|
-
return response;
|
|
252
|
+
return response.content;
|
|
189
253
|
},
|
|
190
254
|
);
|
|
191
255
|
|
|
@@ -208,7 +272,7 @@ export class WholeSummaryDocumentStorageService implements IDocumentStorageServi
|
|
|
208
272
|
const manager = await this.getStorageManager();
|
|
209
273
|
const response = await manager
|
|
210
274
|
.createBlob(Uint8ArrayToString(uint8ArrayFile, "base64"), "base64")
|
|
211
|
-
.then((r) => ({ id: r.sha, url: r.url }));
|
|
275
|
+
.then((r) => ({ id: r.content.sha, url: r.content.url }));
|
|
212
276
|
event.end({
|
|
213
277
|
blobId: response.id,
|
|
214
278
|
});
|
|
@@ -217,21 +281,11 @@ export class WholeSummaryDocumentStorageService implements IDocumentStorageServi
|
|
|
217
281
|
);
|
|
218
282
|
}
|
|
219
283
|
|
|
220
|
-
private async
|
|
284
|
+
private async fetchSnapshotTree(
|
|
221
285
|
versionId: string,
|
|
222
286
|
disableCache?: boolean,
|
|
223
|
-
): Promise<
|
|
224
|
-
const
|
|
225
|
-
this.getCacheKey(versionId),
|
|
226
|
-
);
|
|
227
|
-
if (cachedSnapshotTreeVersion !== undefined) {
|
|
228
|
-
return {
|
|
229
|
-
id: cachedSnapshotTreeVersion.id,
|
|
230
|
-
snapshotTree: cachedSnapshotTreeVersion.snapshotTree,
|
|
231
|
-
};
|
|
232
|
-
}
|
|
233
|
-
|
|
234
|
-
const wholeFlatSummary = await PerformanceEvent.timedExecAsync(
|
|
287
|
+
): Promise<INormalizedWholeSummary> {
|
|
288
|
+
const normalizedWholeSummary = await PerformanceEvent.timedExecAsync(
|
|
235
289
|
this.logger,
|
|
236
290
|
{
|
|
237
291
|
eventName: "getWholeFlatSummary",
|
|
@@ -239,40 +293,58 @@ export class WholeSummaryDocumentStorageService implements IDocumentStorageServi
|
|
|
239
293
|
},
|
|
240
294
|
async (event) => {
|
|
241
295
|
const manager = await this.getStorageManager(disableCache);
|
|
242
|
-
const response = await manager.getSummary(
|
|
296
|
+
const response: IR11sResponse<IWholeFlatSummary> = await manager.getSummary(
|
|
297
|
+
versionId,
|
|
298
|
+
);
|
|
299
|
+
const start = performance.now();
|
|
300
|
+
const snapshot: INormalizedWholeSummary =
|
|
301
|
+
convertWholeFlatSummaryToSnapshotTreeAndBlobs(response.content);
|
|
302
|
+
const snapshotConversionTime = performance.now() - start;
|
|
303
|
+
validateBlobsAndTrees(snapshot.snapshotTree);
|
|
304
|
+
const { trees, numBlobs, encodedBlobsSize } = evalBlobsAndTrees(snapshot);
|
|
305
|
+
|
|
243
306
|
event.end({
|
|
244
|
-
size: response.trees[0]?.entries.length,
|
|
307
|
+
size: response.content.trees[0]?.entries.length,
|
|
308
|
+
trees,
|
|
309
|
+
blobs: numBlobs,
|
|
310
|
+
encodedBlobsSize,
|
|
311
|
+
...response.propsToLog,
|
|
312
|
+
snapshotConversionTime,
|
|
313
|
+
...getW3CData(response.requestUrl, "xmlhttprequest"),
|
|
245
314
|
});
|
|
246
|
-
return
|
|
315
|
+
return snapshot;
|
|
247
316
|
},
|
|
248
317
|
);
|
|
249
|
-
const normalizedWholeSummary =
|
|
250
|
-
convertWholeFlatSummaryToSnapshotTreeAndBlobs(wholeFlatSummary);
|
|
251
|
-
const wholeFlatSummaryId: string = wholeFlatSummary.id;
|
|
252
|
-
const snapshotTreeId = normalizedWholeSummary.snapshotTree.id;
|
|
253
|
-
assert(snapshotTreeId !== undefined, 0x275 /* "Root tree should contain the id" */);
|
|
254
|
-
const snapshotTreeVersion = {
|
|
255
|
-
id: wholeFlatSummaryId,
|
|
256
|
-
snapshotTree: normalizedWholeSummary.snapshotTree,
|
|
257
|
-
};
|
|
258
318
|
|
|
319
|
+
return normalizedWholeSummary;
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
private async initializeFromSnapshot(
|
|
323
|
+
normalizedWholeSummary: INormalizedWholeSummary,
|
|
324
|
+
versionId: string | null,
|
|
325
|
+
): Promise<string> {
|
|
326
|
+
const wholeFlatSummaryId = normalizedWholeSummary.snapshotTree.id;
|
|
327
|
+
assert(wholeFlatSummaryId !== undefined, 0x275 /* "Root tree should contain the id" */);
|
|
259
328
|
const cachePs: Promise<any>[] = [
|
|
260
|
-
this.snapshotTreeCache.put(
|
|
329
|
+
this.snapshotTreeCache.put(
|
|
330
|
+
this.getCacheKey(wholeFlatSummaryId),
|
|
331
|
+
normalizedWholeSummary,
|
|
332
|
+
),
|
|
261
333
|
this.initBlobCache(normalizedWholeSummary.blobs),
|
|
262
334
|
];
|
|
263
|
-
if (
|
|
335
|
+
if (wholeFlatSummaryId !== versionId && versionId !== null) {
|
|
264
336
|
// versionId could be "latest". When summarizer checks cache for "latest", we want it to be available.
|
|
265
337
|
// TODO: For in-memory cache, <latest,snapshotTree> will be a shared pointer with <snapshotId,snapshotTree>,
|
|
266
338
|
// However, for something like Redis, this will cache the same value twice. Alternatively, could we simply
|
|
267
339
|
// cache with versionId?
|
|
268
340
|
cachePs.push(
|
|
269
|
-
this.snapshotTreeCache.put(this.getCacheKey(versionId),
|
|
341
|
+
this.snapshotTreeCache.put(this.getCacheKey(versionId), normalizedWholeSummary),
|
|
270
342
|
);
|
|
271
343
|
}
|
|
272
344
|
|
|
273
345
|
await Promise.all(cachePs);
|
|
274
346
|
|
|
275
|
-
return
|
|
347
|
+
return wholeFlatSummaryId;
|
|
276
348
|
}
|
|
277
349
|
|
|
278
350
|
private async initBlobCache(blobs: Map<string, ArrayBuffer>): Promise<void> {
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* Copyright (c) Microsoft Corporation and contributors. All rights reserved.
|
|
3
|
+
* Licensed under the MIT License.
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import {
|
|
7
|
+
ISummaryTree,
|
|
8
|
+
IWholeSummaryPayload,
|
|
9
|
+
IWholeSummaryPayloadType,
|
|
10
|
+
convertSummaryTreeToWholeSummaryTree,
|
|
11
|
+
} from "@fluidframework/server-services-client";
|
|
12
|
+
import { IGitManager, ISummaryUploadManager } from "./storageContracts";
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Converts summary to snapshot tree and uploads with single snaphot tree payload.
|
|
16
|
+
*/
|
|
17
|
+
export class WholeSummaryUploadManager implements ISummaryUploadManager {
|
|
18
|
+
constructor(private readonly manager: IGitManager) {}
|
|
19
|
+
|
|
20
|
+
public async writeSummaryTree(
|
|
21
|
+
summaryTree: ISummaryTree,
|
|
22
|
+
parentHandle: string | undefined,
|
|
23
|
+
summaryType: IWholeSummaryPayloadType,
|
|
24
|
+
sequenceNumber: number = 0,
|
|
25
|
+
initial: boolean = false,
|
|
26
|
+
): Promise<string> {
|
|
27
|
+
const id = await this.writeSummaryTreeCore(
|
|
28
|
+
parentHandle,
|
|
29
|
+
summaryTree,
|
|
30
|
+
summaryType,
|
|
31
|
+
sequenceNumber,
|
|
32
|
+
initial,
|
|
33
|
+
);
|
|
34
|
+
if (!id) {
|
|
35
|
+
throw new Error(`Failed to write summary tree`);
|
|
36
|
+
}
|
|
37
|
+
return id;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
private async writeSummaryTreeCore(
|
|
41
|
+
parentHandle: string | undefined,
|
|
42
|
+
tree: ISummaryTree,
|
|
43
|
+
type: IWholeSummaryPayloadType,
|
|
44
|
+
sequenceNumber: number,
|
|
45
|
+
initial: boolean,
|
|
46
|
+
): Promise<string> {
|
|
47
|
+
const snapshotTree = convertSummaryTreeToWholeSummaryTree(
|
|
48
|
+
parentHandle,
|
|
49
|
+
tree,
|
|
50
|
+
"",
|
|
51
|
+
type === "channel" ? ".app" : "",
|
|
52
|
+
);
|
|
53
|
+
const snapshotPayload: IWholeSummaryPayload = {
|
|
54
|
+
entries: snapshotTree.entries ?? [],
|
|
55
|
+
message: "",
|
|
56
|
+
sequenceNumber,
|
|
57
|
+
type,
|
|
58
|
+
};
|
|
59
|
+
|
|
60
|
+
return this.manager
|
|
61
|
+
.createSummary(snapshotPayload, initial)
|
|
62
|
+
.then((response) => response.content.id);
|
|
63
|
+
}
|
|
64
|
+
}
|