@fluidframework/routerlicious-driver 1.3.0 → 2.0.0-dev.1.4.5.105745
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/.mocharc.js +12 -0
- package/dist/cache.d.ts +4 -0
- package/dist/cache.d.ts.map +1 -1
- package/dist/cache.js +9 -1
- package/dist/cache.js.map +1 -1
- package/dist/documentDeltaConnection.d.ts.map +1 -1
- package/dist/documentDeltaConnection.js +3 -6
- package/dist/documentDeltaConnection.js.map +1 -1
- package/dist/documentService.d.ts +2 -1
- package/dist/documentService.d.ts.map +1 -1
- package/dist/documentService.js +4 -2
- package/dist/documentService.js.map +1 -1
- package/dist/documentServiceFactory.d.ts.map +1 -1
- package/dist/documentServiceFactory.js +7 -3
- package/dist/documentServiceFactory.js.map +1 -1
- package/dist/packageVersion.d.ts +1 -1
- package/dist/packageVersion.d.ts.map +1 -1
- package/dist/packageVersion.js +1 -1
- package/dist/packageVersion.js.map +1 -1
- package/dist/policies.d.ts +6 -0
- package/dist/policies.d.ts.map +1 -1
- package/dist/policies.js.map +1 -1
- package/dist/restWrapper.js +2 -1
- package/dist/restWrapper.js.map +1 -1
- package/dist/shreddedSummaryDocumentStorageService.d.ts.map +1 -1
- package/dist/shreddedSummaryDocumentStorageService.js +3 -0
- package/dist/shreddedSummaryDocumentStorageService.js.map +1 -1
- package/dist/tokens.d.ts +7 -0
- package/dist/tokens.d.ts.map +1 -1
- package/dist/tokens.js.map +1 -1
- package/dist/wholeSummaryDocumentStorageService.d.ts.map +1 -1
- package/dist/wholeSummaryDocumentStorageService.js +3 -0
- package/dist/wholeSummaryDocumentStorageService.js.map +1 -1
- package/lib/cache.d.ts +4 -0
- package/lib/cache.d.ts.map +1 -1
- package/lib/cache.js +7 -0
- package/lib/cache.js.map +1 -1
- package/lib/documentDeltaConnection.d.ts.map +1 -1
- package/lib/documentDeltaConnection.js +3 -6
- package/lib/documentDeltaConnection.js.map +1 -1
- package/lib/documentService.d.ts +2 -1
- package/lib/documentService.d.ts.map +1 -1
- package/lib/documentService.js +4 -2
- package/lib/documentService.js.map +1 -1
- package/lib/documentServiceFactory.d.ts.map +1 -1
- package/lib/documentServiceFactory.js +8 -4
- package/lib/documentServiceFactory.js.map +1 -1
- package/lib/packageVersion.d.ts +1 -1
- package/lib/packageVersion.d.ts.map +1 -1
- package/lib/packageVersion.js +1 -1
- package/lib/packageVersion.js.map +1 -1
- package/lib/policies.d.ts +6 -0
- package/lib/policies.d.ts.map +1 -1
- package/lib/policies.js.map +1 -1
- package/lib/restWrapper.js +2 -1
- package/lib/restWrapper.js.map +1 -1
- package/lib/shreddedSummaryDocumentStorageService.d.ts.map +1 -1
- package/lib/shreddedSummaryDocumentStorageService.js +3 -0
- package/lib/shreddedSummaryDocumentStorageService.js.map +1 -1
- package/lib/tokens.d.ts +7 -0
- package/lib/tokens.d.ts.map +1 -1
- package/lib/tokens.js.map +1 -1
- package/lib/wholeSummaryDocumentStorageService.d.ts.map +1 -1
- package/lib/wholeSummaryDocumentStorageService.js +3 -0
- package/lib/wholeSummaryDocumentStorageService.js.map +1 -1
- package/package.json +22 -18
- package/src/cache.ts +9 -0
- package/src/documentDeltaConnection.ts +3 -5
- package/src/documentService.ts +4 -1
- package/src/documentServiceFactory.ts +10 -3
- package/src/packageVersion.ts +1 -1
- package/src/policies.ts +6 -0
- package/src/restWrapper.ts +1 -1
- package/src/shreddedSummaryDocumentStorageService.ts +3 -0
- package/src/tokens.ts +7 -2
- package/src/wholeSummaryDocumentStorageService.ts +3 -0
package/lib/packageVersion.d.ts
CHANGED
|
@@ -5,5 +5,5 @@
|
|
|
5
5
|
* THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY
|
|
6
6
|
*/
|
|
7
7
|
export declare const pkgName = "@fluidframework/routerlicious-driver";
|
|
8
|
-
export declare const pkgVersion = "1.
|
|
8
|
+
export declare const pkgVersion = "2.0.0-dev.1.4.5.105745";
|
|
9
9
|
//# sourceMappingURL=packageVersion.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"packageVersion.d.ts","sourceRoot":"","sources":["../src/packageVersion.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,eAAO,MAAM,OAAO,yCAAyC,CAAC;AAC9D,eAAO,MAAM,UAAU,
|
|
1
|
+
{"version":3,"file":"packageVersion.d.ts","sourceRoot":"","sources":["../src/packageVersion.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,eAAO,MAAM,OAAO,yCAAyC,CAAC;AAC9D,eAAO,MAAM,UAAU,2BAA2B,CAAC"}
|
package/lib/packageVersion.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"packageVersion.js","sourceRoot":"","sources":["../src/packageVersion.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,CAAC,MAAM,OAAO,GAAG,sCAAsC,CAAC;AAC9D,MAAM,CAAC,MAAM,UAAU,GAAG,
|
|
1
|
+
{"version":3,"file":"packageVersion.js","sourceRoot":"","sources":["../src/packageVersion.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,CAAC,MAAM,OAAO,GAAG,sCAAsC,CAAC;AAC9D,MAAM,CAAC,MAAM,UAAU,GAAG,wBAAwB,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n *\n * THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY\n */\n\nexport const pkgName = \"@fluidframework/routerlicious-driver\";\nexport const pkgVersion = \"2.0.0-dev.1.4.5.105745\";\n"]}
|
package/lib/policies.d.ts
CHANGED
|
@@ -41,5 +41,11 @@ export interface IRouterliciousDriverPolicies {
|
|
|
41
41
|
* Default: true
|
|
42
42
|
*/
|
|
43
43
|
enableRestLess: boolean;
|
|
44
|
+
/**
|
|
45
|
+
* Enable internal cache of summaries/snapshots.
|
|
46
|
+
* Reduces Summarizer boot time and reduces server load in E2E tests.
|
|
47
|
+
* Default: true
|
|
48
|
+
*/
|
|
49
|
+
enableInternalSummaryCaching: boolean;
|
|
44
50
|
}
|
|
45
51
|
//# sourceMappingURL=policies.d.ts.map
|
package/lib/policies.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"policies.d.ts","sourceRoot":"","sources":["../src/policies.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,4BAA4B;IACzC;;;OAGG;IACH,cAAc,EAAE,OAAO,CAAC;IACxB;;;OAGG;IACH,4BAA4B,EAAE,MAAM,CAAC;IACrC;;;OAGG;IACH,4BAA4B,EAAE,MAAM,CAAC;IACrC;;;;;;OAMG;IACH,8BAA8B,EAAE,MAAM,GAAG,SAAS,CAAC;IACnD;;;OAGG;IACH,wBAAwB,EAAE,OAAO,CAAC;IAClC;;;OAGG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B;;;OAGG;IACH,cAAc,EAAE,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"policies.d.ts","sourceRoot":"","sources":["../src/policies.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,4BAA4B;IACzC;;;OAGG;IACH,cAAc,EAAE,OAAO,CAAC;IACxB;;;OAGG;IACH,4BAA4B,EAAE,MAAM,CAAC;IACrC;;;OAGG;IACH,4BAA4B,EAAE,MAAM,CAAC;IACrC;;;;;;OAMG;IACH,8BAA8B,EAAE,MAAM,GAAG,SAAS,CAAC;IACnD;;;OAGG;IACH,wBAAwB,EAAE,OAAO,CAAC;IAClC;;;OAGG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B;;;OAGG;IACH,cAAc,EAAE,OAAO,CAAC;IACxB;;;;OAIG;IACH,4BAA4B,EAAE,OAAO,CAAC;CACzC"}
|
package/lib/policies.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"policies.js","sourceRoot":"","sources":["../src/policies.ts"],"names":[],"mappings":"AAAA;;;GAGG","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nexport interface IRouterliciousDriverPolicies {\n /**\n * Enable prefetching entire snapshot tree into memory before it is loaded by the runtime.\n * Default: true\n */\n enablePrefetch: boolean;\n /**\n * Rate limit concurrent storage requests.\n * Default: 100\n */\n maxConcurrentStorageRequests: number;\n /**\n * Rate limit concurrent orderer requests.\n * Default: 100\n */\n maxConcurrentOrdererRequests: number;\n /**\n * Give hosts the option to change blob aggregation behavior to suit their needs.\n * Larger number means fewer blob individual requests, but less blob-deduping.\n * Smaller number means more blob individual requests, but more blob-deduping.\n * Setting to `undefined` disables blob aggregration.\n * Default: undefined\n */\n aggregateBlobsSmallerThanBytes: number | undefined;\n /**\n * Enable uploading entire summary tree as a IWholeSummaryPayload to storage.\n * Default: false\n */\n enableWholeSummaryUpload: boolean;\n /**\n * Enable service endpoint discovery when creating or joining a session.\n * Default: false\n */\n enableDiscovery?: boolean;\n /**\n * Enable using RestLess which avoids CORS preflight requests.\n * Default: true\n */\n enableRestLess: boolean;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"policies.js","sourceRoot":"","sources":["../src/policies.ts"],"names":[],"mappings":"AAAA;;;GAGG","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nexport interface IRouterliciousDriverPolicies {\n /**\n * Enable prefetching entire snapshot tree into memory before it is loaded by the runtime.\n * Default: true\n */\n enablePrefetch: boolean;\n /**\n * Rate limit concurrent storage requests.\n * Default: 100\n */\n maxConcurrentStorageRequests: number;\n /**\n * Rate limit concurrent orderer requests.\n * Default: 100\n */\n maxConcurrentOrdererRequests: number;\n /**\n * Give hosts the option to change blob aggregation behavior to suit their needs.\n * Larger number means fewer blob individual requests, but less blob-deduping.\n * Smaller number means more blob individual requests, but more blob-deduping.\n * Setting to `undefined` disables blob aggregration.\n * Default: undefined\n */\n aggregateBlobsSmallerThanBytes: number | undefined;\n /**\n * Enable uploading entire summary tree as a IWholeSummaryPayload to storage.\n * Default: false\n */\n enableWholeSummaryUpload: boolean;\n /**\n * Enable service endpoint discovery when creating or joining a session.\n * Default: false\n */\n enableDiscovery?: boolean;\n /**\n * Enable using RestLess which avoids CORS preflight requests.\n * Default: true\n */\n enableRestLess: boolean;\n /**\n * Enable internal cache of summaries/snapshots.\n * Reduces Summarizer boot time and reduces server load in E2E tests.\n * Default: true\n */\n enableInternalSummaryCaching: boolean;\n}\n"]}
|
package/lib/restWrapper.js
CHANGED
|
@@ -69,7 +69,8 @@ export class RouterliciousRestWrapper extends RestWrapper {
|
|
|
69
69
|
throwR11sNetworkError(`R11s fetch error: ${responseSummary}`, response.status, responseBody === null || responseBody === void 0 ? void 0 : responseBody.retryAfter);
|
|
70
70
|
}
|
|
71
71
|
generateHeaders(requestHeaders) {
|
|
72
|
-
|
|
72
|
+
var _a;
|
|
73
|
+
const correlationId = (_a = requestHeaders === null || requestHeaders === void 0 ? void 0 : requestHeaders["x-correlation-id"]) !== null && _a !== void 0 ? _a : uuid();
|
|
73
74
|
return Object.assign(Object.assign({}, requestHeaders), {
|
|
74
75
|
// TODO: replace header names with CorrelationIdHeaderName and DriverVersionHeaderName from services-client
|
|
75
76
|
// NOTE: Can correlationId actually be number | true?
|
package/lib/restWrapper.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"restWrapper.js","sourceRoot":"","sources":["../src/restWrapper.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAEhE,OAAO,EACH,oCAAoC,EACpC,cAAc,EACd,WAAW,GACd,MAAM,wCAAwC,CAAC;AAChD,OAAO,KAAK,MAAM,aAAa,CAAC;AAEhC,OAAO,aAAa,MAAM,qBAAqB,CAAC;AAChD,OAAO,EAAE,EAAE,IAAI,IAAI,EAAE,MAAM,MAAM,CAAC;AAClC,OAAO,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AAErD,OAAO,EAAE,UAAU,IAAI,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAI/D,MAAM,sCAAsC,GAAG,CAAC,aAAiC,EAA8B,EAAE;;IAC7G,MAAM,WAAW,GAAW,aAAa,CAAC,OAAO,KAAK,SAAS;QAC3D,CAAC,CAAC,GAAG,aAAa,CAAC,OAAO,GAAG,MAAA,aAAa,CAAC,GAAG,mCAAI,EAAE,EAAE;QACtD,CAAC,CAAC,MAAA,aAAa,CAAC,GAAG,mCAAI,EAAE,CAAC;IAC9B,MAAM,WAAW,GAAgB;QAC7B,MAAM,EAAE,aAAa,CAAC,MAAM;QAC5B,oGAAoG;QACpG,qEAAqE;QACrE,OAAO,EAAE,aAAa,CAAC,OAAiC;QACxD,IAAI,EAAE,aAAa,CAAC,IAAI;KAC3B,CAAC;IACF,OAAO,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;AACtC,CAAC,CAAC;AAEF,MAAM,OAAO,wBAAyB,SAAQ,WAAW;IAIrD,YACI,MAAwB,EACP,WAAwB,EACxB,sBAAiD,EACjD,WAAoB,EACrC,OAAgB,EAChB,qBAAsD,EAAE;QAExD,KAAK,CAAC,OAAO,EAAE,kBAAkB,CAAC,CAAC;QANlB,gBAAW,GAAX,WAAW,CAAa;QACxB,2BAAsB,GAAtB,sBAAsB,CAA2B;QACjD,gBAAW,GAAX,WAAW,CAAS;QANxB,aAAQ,GAAG,IAAI,cAAc,EAAE,CAAC;IAWjD,CAAC;IAEM,KAAK,CAAC,IAAI;QACb,IAAI,CAAC,mBAAmB,GAAG,MAAM,IAAI,CAAC,sBAAsB,EAAE,CAAC;IACnE,CAAC;IAES,KAAK,CAAC,OAAO,CAAI,aAAiC,EAAE,UAAkB,EAAE,QAAQ,GAAG,IAAI;;QAC7F,MAAM,MAAM,mCACL,aAAa,KAChB,OAAO,EAAE,IAAI,CAAC,eAAe,CAAC,aAAa,CAAC,OAAO,CAAC,GACvD,CAAC;QAEF,MAAM,gBAAgB,GAAG,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;QACrF,MAAM,kBAAkB,GAAG,sCAAsC,CAAC,gBAAgB,CAAC,CAAC;QAEpF,MAAM,QAAQ,GAAa,MAAM,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,KAAK,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,kBAAkB,CAAC;aAC9F,KAAK,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;YACnB,sFAAsF;YACtF,MAAM,cAAc,GAAG,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC,QAAQ,CAAC,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,IAAI,CAAC,CAAC;YACzE,qBAAqB,CACjB,cAAc,CAAC,CAAC,CAAC,iBAAiB,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC;QAClF,CAAC,CAAC,CAAC,CAAC;QAER,MAAM,YAAY,GAAQ,CAAA,MAAA,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,0CAAE,QAAQ,CAAC,kBAAkB,CAAC;YACxF,CAAC,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE;YACvB,CAAC,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QAE5B,UAAU;QACV,IAAI,QAAQ,CAAC,EAAE,IAAI,QAAQ,CAAC,MAAM,KAAK,UAAU,EAAE;YAC/C,MAAM,MAAM,GAAM,YAAY,CAAC;YAC/B,OAAO,MAAM,CAAC;SACjB;QACD,UAAU;QACV,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,IAAI,QAAQ,EAAE;YACrC,8CAA8C;YAC9C,IAAI,CAAC,mBAAmB,GAAG,MAAM,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;YACtF,OAAO,IAAI,CAAC,OAAO,CAAI,MAAM,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC;SACrD;QACD,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,IAAI,CAAA,YAAY,aAAZ,YAAY,uBAAZ,YAAY,CAAE,UAAU,IAAG,CAAC,EAAE;YACzD,qCAAqC;YACrC,OAAO,IAAI,OAAO,CAAI,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,CAAC,UAAU,CAAC,GAAG,EAAE;gBACvD,IAAI,CAAC,OAAO,CAAI,MAAM,EAAE,UAAU,CAAC;qBAC9B,IAAI,CAAC,OAAO,CAAC;qBACb,KAAK,CAAC,MAAM,CAAC,CAAC;YACvB,CAAC,EAAE,YAAY,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC,CAAC;SACvC;QAED,MAAM,eAAe,GAAG,YAAY,KAAK,SAAS;YAC9C,CAAC,CAAC,OAAO,YAAY,KAAK,QAAQ,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,aAAa,CAAC,YAAY,CAAC;YAC/E,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC;QAC1B,qBAAqB,CACjB,qBAAqB,eAAe,EAAE,EACtC,QAAQ,CAAC,MAAM,EACf,YAAY,aAAZ,YAAY,uBAAZ,YAAY,CAAE,UAAU,CAC3B,CAAC;IACN,CAAC;IAEO,eAAe,CAAC,cAAgD;QACpE,MAAM,aAAa,GAAG,CAAA,cAAc,aAAd,cAAc,uBAAd,cAAc,CAAG,kBAAkB,CAAC,KAAI,IAAI,EAAE,CAAC;QAErE,uCACO,cAAc;YACjB,2GAA2G;YAC3G,qDAAqD;YACrD,kBAAkB,EAAE,aAAuB,EAC3C,kBAAkB,EAAE,aAAa;YACjC,8FAA8F;YAC9F,eAAe,EAAE,IAAI,CAAC,mBAAoB,IAC5C;IACN,CAAC;CACJ;AAED,MAAM,OAAO,+BAAgC,SAAQ,wBAAwB;IACzE,YACI,MAAwB,EACxB,WAAwB,EACxB,sBAAiD,EACjD,WAAoB,EACpB,OAAgB,EAChB,qBAAsD,EAAE;QAExD,KAAK,CAAC,MAAM,EAAE,WAAW,EAAE,sBAAsB,EAAE,WAAW,EAAE,OAAO,EAAE,kBAAkB,CAAC,CAAC;IACjG,CAAC;IAEM,MAAM,CAAC,KAAK,CAAC,IAAI,CACpB,QAAgB,EAChB,UAAkB,EAClB,aAA6B,EAC7B,MAAwB,EACxB,WAAwB,EACxB,WAAoB,EACpB,OAAgB;QAEhB,MAAM,kBAAkB,GAAG;YACvB,KAAK,EAAE,GAAG,gBAAgB,CAAC,QAAQ,CAAC,EAAE;SACzC,CAAC;QACF,MAAM,sBAAsB,GAA8B,KAAK,EAAE,YAAsB,EAAmB,EAAE;YACxG,8CAA8C;YAC9C,MAAM,YAAY,GAAG,MAAM,aAAa,CAAC,iBAAiB,CACtD,QAAQ,EACR,UAAU,EACV,YAAY,CACf,CAAC;YACF,MAAM,WAAW,GAAG;gBAChB,QAAQ,EAAE,YAAY,CAAC,GAAG;gBAC1B,IAAI,EAAE,QAAQ;aACjB,CAAC;YACF,OAAO,oCAAoC,CAAC,WAAW,CAAC,CAAC;QAC7D,CAAC,CAAC;QAEF,MAAM,WAAW,GAAG,IAAI,+BAA+B,CACnD,MAAM,EAAE,WAAW,EAAE,sBAAsB,EAAE,WAAW,EAAE,OAAO,EAAE,kBAAkB,CAAC,CAAC;QAC3F,IAAI;YACA,MAAM,WAAW,CAAC,IAAI,EAAE,CAAC;SAC5B;QAAC,OAAO,CAAC,EAAE;YACR,MAAM,CAAC,cAAc,CAAC;gBAClB,SAAS,EAAE,4BAA4B;aAC1C,EAAE,CAAC,CAAC,CAAC;YACN,MAAM,WAAW,CAAC,IAAI,EAAE,CAAC;SAC5B;QACD,OAAO,WAAW,CAAC;IACvB,CAAC;CACJ;AAED,MAAM,OAAO,+BAAgC,SAAQ,wBAAwB;IACzE,YACI,MAAwB,EACxB,WAAwB,EACxB,sBAAiD,EACjD,WAAoB,EACpB,OAAgB,EAChB,qBAAsD,EAAE;QAExD,KAAK,CAAC,MAAM,EAAE,WAAW,EAAE,sBAAsB,EAAE,WAAW,EAAE,OAAO,EAAE,kBAAkB,CAAC,CAAC;IACjG,CAAC;IAEM,MAAM,CAAC,KAAK,CAAC,IAAI,CACpB,QAAgB,EAChB,UAA8B,EAC9B,aAA6B,EAC7B,MAAwB,EACxB,WAAwB,EACxB,WAAoB,EACpB,OAAgB;QAEhB,MAAM,sBAAsB,GAA8B,KAAK,EAAE,YAAsB,EAAmB,EAAE;YACxG,MAAM,YAAY,GAAG,MAAM,aAAa,CAAC,iBAAiB,CACtD,QAAQ,EACR,UAAU,EACV,YAAY,CACf,CAAC;YACF,OAAO,SAAS,YAAY,CAAC,GAAG,EAAE,CAAC;QACvC,CAAC,CAAC;QAEF,MAAM,WAAW,GAAG,IAAI,+BAA+B,CACnD,MAAM,EAAE,WAAW,EAAE,sBAAsB,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC;QACvE,IAAI;YACA,MAAM,WAAW,CAAC,IAAI,EAAE,CAAC;SAC5B;QAAC,OAAO,CAAC,EAAE;YACR,MAAM,CAAC,cAAc,CAAC;gBAClB,SAAS,EAAE,4BAA4B;aAC1C,EAAE,CAAC,CAAC,CAAC;YACN,MAAM,WAAW,CAAC,IAAI,EAAE,CAAC;SAC5B;QACD,OAAO,WAAW,CAAC;IACvB,CAAC;CACJ","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\nimport * as querystring from \"querystring\";\nimport { ITelemetryLogger } from \"@fluidframework/common-definitions\";\nimport { fromUtf8ToBase64 } from \"@fluidframework/common-utils\";\nimport { RateLimiter } from \"@fluidframework/driver-utils\";\nimport {\n getAuthorizationTokenFromCredentials,\n RestLessClient,\n RestWrapper,\n} from \"@fluidframework/server-services-client\";\nimport fetch from \"cross-fetch\";\nimport type { AxiosRequestConfig, AxiosRequestHeaders } from \"axios\";\nimport safeStringify from \"json-stringify-safe\";\nimport { v4 as uuid } from \"uuid\";\nimport { throwR11sNetworkError } from \"./errorUtils\";\nimport { ITokenProvider } from \"./tokens\";\nimport { pkgVersion as driverVersion } from \"./packageVersion\";\n\ntype AuthorizationHeaderGetter = (refresh?: boolean) => Promise<string | undefined>;\n\nconst axiosRequestConfigToFetchRequestConfig = (requestConfig: AxiosRequestConfig): [RequestInfo, RequestInit] => {\n const requestInfo: string = requestConfig.baseURL !== undefined\n ? `${requestConfig.baseURL}${requestConfig.url ?? \"\"}`\n : requestConfig.url ?? \"\";\n const requestInit: RequestInit = {\n method: requestConfig.method,\n // NOTE: I believe that although the Axios type permits non-string values in the header, here we are\n // guaranteed the requestConfig only has string values in its header.\n headers: requestConfig.headers as Record<string, string>,\n body: requestConfig.data,\n };\n return [requestInfo, requestInit];\n};\n\nexport class RouterliciousRestWrapper extends RestWrapper {\n private authorizationHeader: string | undefined;\n private readonly restLess = new RestLessClient();\n\n constructor(\n logger: ITelemetryLogger,\n private readonly rateLimiter: RateLimiter,\n private readonly getAuthorizationHeader: AuthorizationHeaderGetter,\n private readonly useRestLess: boolean,\n baseurl?: string,\n defaultQueryString: querystring.ParsedUrlQueryInput = {},\n ) {\n super(baseurl, defaultQueryString);\n }\n\n public async load() {\n this.authorizationHeader = await this.getAuthorizationHeader();\n }\n\n protected async request<T>(requestConfig: AxiosRequestConfig, statusCode: number, canRetry = true): Promise<T> {\n const config = {\n ...requestConfig,\n headers: this.generateHeaders(requestConfig.headers),\n };\n\n const translatedConfig = this.useRestLess ? this.restLess.translate(config) : config;\n const fetchRequestConfig = axiosRequestConfigToFetchRequestConfig(translatedConfig);\n\n const response: Response = await this.rateLimiter.schedule(async () => fetch(...fetchRequestConfig)\n .catch(async (error) => {\n // Browser Fetch throws a TypeError on network error, `node-fetch` throws a FetchError\n const isNetworkError = [\"TypeError\", \"FetchError\"].includes(error?.name);\n throwR11sNetworkError(\n isNetworkError ? `NetworkError: ${error.message}` : safeStringify(error));\n }));\n\n const responseBody: any = response.headers.get(\"content-type\")?.includes(\"application/json\")\n ? await response.json()\n : await response.text();\n\n // Success\n if (response.ok || response.status === statusCode) {\n const result: T = responseBody;\n return result;\n }\n // Failure\n if (response.status === 401 && canRetry) {\n // Refresh Authorization header and retry once\n this.authorizationHeader = await this.getAuthorizationHeader(true /* refreshToken */);\n return this.request<T>(config, statusCode, false);\n }\n if (response.status === 429 && responseBody?.retryAfter > 0) {\n // Retry based on retryAfter[Seconds]\n return new Promise<T>((resolve, reject) => setTimeout(() => {\n this.request<T>(config, statusCode)\n .then(resolve)\n .catch(reject);\n }, responseBody.retryAfter * 1000));\n }\n\n const responseSummary = responseBody !== undefined\n ? typeof responseBody === \"string\" ? responseBody : safeStringify(responseBody)\n : response.statusText;\n throwR11sNetworkError(\n `R11s fetch error: ${responseSummary}`,\n response.status,\n responseBody?.retryAfter,\n );\n }\n\n private generateHeaders(requestHeaders?: AxiosRequestHeaders | undefined): Record<string, string> {\n const correlationId = requestHeaders?.[\"x-correlation-id\"] || uuid();\n\n return {\n ...requestHeaders,\n // TODO: replace header names with CorrelationIdHeaderName and DriverVersionHeaderName from services-client\n // NOTE: Can correlationId actually be number | true?\n \"x-correlation-id\": correlationId as string,\n \"x-driver-version\": driverVersion,\n // NOTE: If this.authorizationHeader is undefined, should \"Authorization\" be removed entirely?\n \"Authorization\": this.authorizationHeader!,\n };\n }\n}\n\nexport class RouterliciousStorageRestWrapper extends RouterliciousRestWrapper {\n private constructor(\n logger: ITelemetryLogger,\n rateLimiter: RateLimiter,\n getAuthorizationHeader: AuthorizationHeaderGetter,\n useRestLess: boolean,\n baseurl?: string,\n defaultQueryString: querystring.ParsedUrlQueryInput = {},\n ) {\n super(logger, rateLimiter, getAuthorizationHeader, useRestLess, baseurl, defaultQueryString);\n }\n\n public static async load(\n tenantId: string,\n documentId: string,\n tokenProvider: ITokenProvider,\n logger: ITelemetryLogger,\n rateLimiter: RateLimiter,\n useRestLess: boolean,\n baseurl?: string,\n ): Promise<RouterliciousStorageRestWrapper> {\n const defaultQueryString = {\n token: `${fromUtf8ToBase64(tenantId)}`,\n };\n const getAuthorizationHeader: AuthorizationHeaderGetter = async (refreshToken?: boolean): Promise<string> => {\n // Craft credentials using tenant id and token\n const storageToken = await tokenProvider.fetchStorageToken(\n tenantId,\n documentId,\n refreshToken,\n );\n const credentials = {\n password: storageToken.jwt,\n user: tenantId,\n };\n return getAuthorizationTokenFromCredentials(credentials);\n };\n\n const restWrapper = new RouterliciousStorageRestWrapper(\n logger, rateLimiter, getAuthorizationHeader, useRestLess, baseurl, defaultQueryString);\n try {\n await restWrapper.load();\n } catch (e) {\n logger.sendErrorEvent({\n eventName: \"R11sRestWrapperLoadFailure\",\n }, e);\n await restWrapper.load();\n }\n return restWrapper;\n }\n}\n\nexport class RouterliciousOrdererRestWrapper extends RouterliciousRestWrapper {\n private constructor(\n logger: ITelemetryLogger,\n rateLimiter: RateLimiter,\n getAuthorizationHeader: AuthorizationHeaderGetter,\n useRestLess: boolean,\n baseurl?: string,\n defaultQueryString: querystring.ParsedUrlQueryInput = {},\n ) {\n super(logger, rateLimiter, getAuthorizationHeader, useRestLess, baseurl, defaultQueryString);\n }\n\n public static async load(\n tenantId: string,\n documentId: string | undefined,\n tokenProvider: ITokenProvider,\n logger: ITelemetryLogger,\n rateLimiter: RateLimiter,\n useRestLess: boolean,\n baseurl?: string,\n ): Promise<RouterliciousOrdererRestWrapper> {\n const getAuthorizationHeader: AuthorizationHeaderGetter = async (refreshToken?: boolean): Promise<string> => {\n const ordererToken = await tokenProvider.fetchOrdererToken(\n tenantId,\n documentId,\n refreshToken,\n );\n return `Basic ${ordererToken.jwt}`;\n };\n\n const restWrapper = new RouterliciousOrdererRestWrapper(\n logger, rateLimiter, getAuthorizationHeader, useRestLess, baseurl);\n try {\n await restWrapper.load();\n } catch (e) {\n logger.sendErrorEvent({\n eventName: \"R11sRestWrapperLoadFailure\",\n }, e);\n await restWrapper.load();\n }\n return restWrapper;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"restWrapper.js","sourceRoot":"","sources":["../src/restWrapper.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 */\nimport * as querystring from \"querystring\";\nimport { ITelemetryLogger } from \"@fluidframework/common-definitions\";\nimport { fromUtf8ToBase64 } from \"@fluidframework/common-utils\";\nimport { RateLimiter } from \"@fluidframework/driver-utils\";\nimport {\n getAuthorizationTokenFromCredentials,\n RestLessClient,\n RestWrapper,\n} from \"@fluidframework/server-services-client\";\nimport fetch from \"cross-fetch\";\nimport type { AxiosRequestConfig, AxiosRequestHeaders } from \"axios\";\nimport safeStringify from \"json-stringify-safe\";\nimport { v4 as uuid } from \"uuid\";\nimport { throwR11sNetworkError } from \"./errorUtils\";\nimport { ITokenProvider } from \"./tokens\";\nimport { pkgVersion as driverVersion } from \"./packageVersion\";\n\ntype AuthorizationHeaderGetter = (refresh?: boolean) => Promise<string | undefined>;\n\nconst axiosRequestConfigToFetchRequestConfig = (requestConfig: AxiosRequestConfig): [RequestInfo, RequestInit] => {\n const requestInfo: string = requestConfig.baseURL !== undefined\n ? `${requestConfig.baseURL}${requestConfig.url ?? \"\"}`\n : requestConfig.url ?? \"\";\n const requestInit: RequestInit = {\n method: requestConfig.method,\n // NOTE: I believe that although the Axios type permits non-string values in the header, here we are\n // guaranteed the requestConfig only has string values in its header.\n headers: requestConfig.headers as Record<string, string>,\n body: requestConfig.data,\n };\n return [requestInfo, requestInit];\n};\n\nexport class RouterliciousRestWrapper extends RestWrapper {\n private authorizationHeader: string | undefined;\n private readonly restLess = new RestLessClient();\n\n constructor(\n logger: ITelemetryLogger,\n private readonly rateLimiter: RateLimiter,\n private readonly getAuthorizationHeader: AuthorizationHeaderGetter,\n private readonly useRestLess: boolean,\n baseurl?: string,\n defaultQueryString: querystring.ParsedUrlQueryInput = {},\n ) {\n super(baseurl, defaultQueryString);\n }\n\n public async load() {\n this.authorizationHeader = await this.getAuthorizationHeader();\n }\n\n protected async request<T>(requestConfig: AxiosRequestConfig, statusCode: number, canRetry = true): Promise<T> {\n const config = {\n ...requestConfig,\n headers: this.generateHeaders(requestConfig.headers),\n };\n\n const translatedConfig = this.useRestLess ? this.restLess.translate(config) : config;\n const fetchRequestConfig = axiosRequestConfigToFetchRequestConfig(translatedConfig);\n\n const response: Response = await this.rateLimiter.schedule(async () => fetch(...fetchRequestConfig)\n .catch(async (error) => {\n // Browser Fetch throws a TypeError on network error, `node-fetch` throws a FetchError\n const isNetworkError = [\"TypeError\", \"FetchError\"].includes(error?.name);\n throwR11sNetworkError(\n isNetworkError ? `NetworkError: ${error.message}` : safeStringify(error));\n }));\n\n const responseBody: any = response.headers.get(\"content-type\")?.includes(\"application/json\")\n ? await response.json()\n : await response.text();\n\n // Success\n if (response.ok || response.status === statusCode) {\n const result: T = responseBody;\n return result;\n }\n // Failure\n if (response.status === 401 && canRetry) {\n // Refresh Authorization header and retry once\n this.authorizationHeader = await this.getAuthorizationHeader(true /* refreshToken */);\n return this.request<T>(config, statusCode, false);\n }\n if (response.status === 429 && responseBody?.retryAfter > 0) {\n // Retry based on retryAfter[Seconds]\n return new Promise<T>((resolve, reject) => setTimeout(() => {\n this.request<T>(config, statusCode)\n .then(resolve)\n .catch(reject);\n }, responseBody.retryAfter * 1000));\n }\n\n const responseSummary = responseBody !== undefined\n ? typeof responseBody === \"string\" ? responseBody : safeStringify(responseBody)\n : response.statusText;\n throwR11sNetworkError(\n `R11s fetch error: ${responseSummary}`,\n response.status,\n responseBody?.retryAfter,\n );\n }\n\n private generateHeaders(requestHeaders?: AxiosRequestHeaders | undefined): Record<string, string> {\n const correlationId = requestHeaders?.[\"x-correlation-id\"] ?? uuid();\n\n return {\n ...requestHeaders,\n // TODO: replace header names with CorrelationIdHeaderName and DriverVersionHeaderName from services-client\n // NOTE: Can correlationId actually be number | true?\n \"x-correlation-id\": correlationId as string,\n \"x-driver-version\": driverVersion,\n // NOTE: If this.authorizationHeader is undefined, should \"Authorization\" be removed entirely?\n \"Authorization\": this.authorizationHeader!,\n };\n }\n}\n\nexport class RouterliciousStorageRestWrapper extends RouterliciousRestWrapper {\n private constructor(\n logger: ITelemetryLogger,\n rateLimiter: RateLimiter,\n getAuthorizationHeader: AuthorizationHeaderGetter,\n useRestLess: boolean,\n baseurl?: string,\n defaultQueryString: querystring.ParsedUrlQueryInput = {},\n ) {\n super(logger, rateLimiter, getAuthorizationHeader, useRestLess, baseurl, defaultQueryString);\n }\n\n public static async load(\n tenantId: string,\n documentId: string,\n tokenProvider: ITokenProvider,\n logger: ITelemetryLogger,\n rateLimiter: RateLimiter,\n useRestLess: boolean,\n baseurl?: string,\n ): Promise<RouterliciousStorageRestWrapper> {\n const defaultQueryString = {\n token: `${fromUtf8ToBase64(tenantId)}`,\n };\n const getAuthorizationHeader: AuthorizationHeaderGetter = async (refreshToken?: boolean): Promise<string> => {\n // Craft credentials using tenant id and token\n const storageToken = await tokenProvider.fetchStorageToken(\n tenantId,\n documentId,\n refreshToken,\n );\n const credentials = {\n password: storageToken.jwt,\n user: tenantId,\n };\n return getAuthorizationTokenFromCredentials(credentials);\n };\n\n const restWrapper = new RouterliciousStorageRestWrapper(\n logger, rateLimiter, getAuthorizationHeader, useRestLess, baseurl, defaultQueryString);\n try {\n await restWrapper.load();\n } catch (e) {\n logger.sendErrorEvent({\n eventName: \"R11sRestWrapperLoadFailure\",\n }, e);\n await restWrapper.load();\n }\n return restWrapper;\n }\n}\n\nexport class RouterliciousOrdererRestWrapper extends RouterliciousRestWrapper {\n private constructor(\n logger: ITelemetryLogger,\n rateLimiter: RateLimiter,\n getAuthorizationHeader: AuthorizationHeaderGetter,\n useRestLess: boolean,\n baseurl?: string,\n defaultQueryString: querystring.ParsedUrlQueryInput = {},\n ) {\n super(logger, rateLimiter, getAuthorizationHeader, useRestLess, baseurl, defaultQueryString);\n }\n\n public static async load(\n tenantId: string,\n documentId: string | undefined,\n tokenProvider: ITokenProvider,\n logger: ITelemetryLogger,\n rateLimiter: RateLimiter,\n useRestLess: boolean,\n baseurl?: string,\n ): Promise<RouterliciousOrdererRestWrapper> {\n const getAuthorizationHeader: AuthorizationHeaderGetter = async (refreshToken?: boolean): Promise<string> => {\n const ordererToken = await tokenProvider.fetchOrdererToken(\n tenantId,\n documentId,\n refreshToken,\n );\n return `Basic ${ordererToken.jwt}`;\n };\n\n const restWrapper = new RouterliciousOrdererRestWrapper(\n logger, rateLimiter, getAuthorizationHeader, useRestLess, baseurl);\n try {\n await restWrapper.load();\n } catch (e) {\n logger.sendErrorEvent({\n eventName: \"R11sRestWrapperLoadFailure\",\n }, e);\n await restWrapper.load();\n }\n return restWrapper;\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shreddedSummaryDocumentStorageService.d.ts","sourceRoot":"","sources":["../src/shreddedSummaryDocumentStorageService.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oCAAoC,CAAC;AAK3E,OAAO,EACH,uBAAuB,EACvB,eAAe,EACf,+BAA+B,EAClC,MAAM,oCAAoC,CAAC;AAE5C,OAAO,EACH,mBAAmB,EACnB,eAAe,EACf,cAAc,EACd,YAAY,EACZ,QAAQ,EACX,MAAM,sCAAsC,CAAC;AAC9C,OAAO,EACH,UAAU,EAGb,MAAM,wCAAwC,CAAC;AAEhD,OAAO,EAAE,4BAA4B,EAAE,MAAM,YAAY,CAAC;AAC1D,OAAO,EAAE,MAAM,EAAiB,MAAM,SAAS,CAAC;AAEhD,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAIrD;;;;GAIG;AACH,qBAAa,qCAAsC,YAAW,uBAAuB;IAqB7E,SAAS,CAAC,QAAQ,CAAC,EAAE,EAAE,MAAM;IAC7B,SAAS,CAAC,QAAQ,CAAC,OAAO,EAAE,UAAU;IACtC,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,gBAAgB;aAC3B,QAAQ,EAAE,+BAA+B;IAIzD,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IAzBtC,SAAS,CAAC,QAAQ,CAAC,aAAa,sBAA6B;IAC7D,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAsC;IAChE,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAA2C;IAE7E,IAAW,aAAa,IAAI,MAAM,CAEjC;YAEa,uBAAuB;gBAUd,EAAE,EAAE,MAAM,EACV,OAAO,EAAE,UAAU,EACnB,MAAM,EAAE,gBAAgB,EAC3B,QAAQ,GAAE,+BAAoC,EAC9D,cAAc,CAAC,EAAE,4BAA4B,EAC7C,SAAS,CAAC,EAAE,MAAM,CAAC,eAAe,CAAC,EACnC,iBAAiB,CAAC,EAAE,MAAM,CAAC,oBAAoB,CAAC,EAC/B,iBAAiB,GAAE,CAAC,YAAY,CAAC,EAAE,OAAO,KAAK,OAAO,CAAC,UAAU,CAA4B;IAQrG,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;IAqBzE,eAAe,CAAC,OAAO,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC;IAuCpE,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;IA2BlD,wBAAwB,CAAC,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"shreddedSummaryDocumentStorageService.d.ts","sourceRoot":"","sources":["../src/shreddedSummaryDocumentStorageService.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oCAAoC,CAAC;AAK3E,OAAO,EACH,uBAAuB,EACvB,eAAe,EACf,+BAA+B,EAClC,MAAM,oCAAoC,CAAC;AAE5C,OAAO,EACH,mBAAmB,EACnB,eAAe,EACf,cAAc,EACd,YAAY,EACZ,QAAQ,EACX,MAAM,sCAAsC,CAAC;AAC9C,OAAO,EACH,UAAU,EAGb,MAAM,wCAAwC,CAAC;AAEhD,OAAO,EAAE,4BAA4B,EAAE,MAAM,YAAY,CAAC;AAC1D,OAAO,EAAE,MAAM,EAAiB,MAAM,SAAS,CAAC;AAEhD,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAIrD;;;;GAIG;AACH,qBAAa,qCAAsC,YAAW,uBAAuB;IAqB7E,SAAS,CAAC,QAAQ,CAAC,EAAE,EAAE,MAAM;IAC7B,SAAS,CAAC,QAAQ,CAAC,OAAO,EAAE,UAAU;IACtC,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,gBAAgB;aAC3B,QAAQ,EAAE,+BAA+B;IAIzD,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IAzBtC,SAAS,CAAC,QAAQ,CAAC,aAAa,sBAA6B;IAC7D,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAsC;IAChE,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAA2C;IAE7E,IAAW,aAAa,IAAI,MAAM,CAEjC;YAEa,uBAAuB;gBAUd,EAAE,EAAE,MAAM,EACV,OAAO,EAAE,UAAU,EACnB,MAAM,EAAE,gBAAgB,EAC3B,QAAQ,GAAE,+BAAoC,EAC9D,cAAc,CAAC,EAAE,4BAA4B,EAC7C,SAAS,CAAC,EAAE,MAAM,CAAC,eAAe,CAAC,EACnC,iBAAiB,CAAC,EAAE,MAAM,CAAC,oBAAoB,CAAC,EAC/B,iBAAiB,GAAE,CAAC,YAAY,CAAC,EAAE,OAAO,KAAK,OAAO,CAAC,UAAU,CAA4B;IAQrG,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;IAqBzE,eAAe,CAAC,OAAO,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC;IAuCpE,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;IA2BlD,wBAAwB,CAAC,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC;IAiB1F,eAAe,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,YAAY,CAAC;IAI9D,UAAU,CAAC,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,mBAAmB,CAAC;YAsB9D,uBAAuB;IAWrC,OAAO,CAAC,WAAW;CAGtB"}
|
|
@@ -106,6 +106,9 @@ export class ShreddedSummaryDocumentStorageService {
|
|
|
106
106
|
async uploadSummaryWithContext(summary, context) {
|
|
107
107
|
const summaryHandle = await PerformanceEvent.timedExecAsync(this.logger, {
|
|
108
108
|
eventName: "uploadSummaryWithContext",
|
|
109
|
+
proposalHandle: context.proposalHandle,
|
|
110
|
+
ackHandle: context.ackHandle,
|
|
111
|
+
referenceSequenceNumber: context.referenceSequenceNumber,
|
|
109
112
|
}, async () => {
|
|
110
113
|
var _a;
|
|
111
114
|
const summaryUploadManager = await this.getSummaryUploadManager();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shreddedSummaryDocumentStorageService.js","sourceRoot":"","sources":["../src/shreddedSummaryDocumentStorageService.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 type { ITelemetryLogger } from \"@fluidframework/common-definitions\";\nimport {\n stringToBuffer,\n Uint8ArrayToString,\n} from \"@fluidframework/common-utils\";\nimport {\n IDocumentStorageService,\n ISummaryContext,\n IDocumentStorageServicePolicies,\n} from \"@fluidframework/driver-definitions\";\nimport { buildHierarchy } from \"@fluidframework/protocol-base\";\nimport {\n ICreateBlobResponse,\n ISnapshotTreeEx,\n ISummaryHandle,\n ISummaryTree,\n IVersion,\n} from \"@fluidframework/protocol-definitions\";\nimport {\n GitManager,\n ISummaryUploadManager,\n SummaryTreeUploadManager,\n} from \"@fluidframework/server-services-client\";\nimport { PerformanceEvent } from \"@fluidframework/telemetry-utils\";\nimport { IRouterliciousDriverPolicies } from \"./policies\";\nimport { ICache, InMemoryCache } from \"./cache\";\nimport { RetriableGitManager } from \"./retriableGitManager\";\nimport { ISnapshotTreeVersion } from \"./definitions\";\n\nconst isNode = typeof window === \"undefined\";\n\n/**\n * Document access to underlying storage for routerlicious driver.\n * Uploads summaries piece-by-piece traversing the tree recursively.\n * Downloads summaries piece-by-piece on-demand, or up-front when prefetch is enabled.\n */\nexport class ShreddedSummaryDocumentStorageService implements IDocumentStorageService {\n // The values of this cache is useless. We only need the keys. So we are always putting\n // empty strings as values.\n protected readonly blobsShaCache = new Map<string, string>();\n private readonly blobCache: ICache<ArrayBufferLike> | undefined;\n private readonly snapshotTreeCache: ICache<ISnapshotTreeVersion> | undefined;\n\n public get repositoryUrl(): string {\n return \"\";\n }\n\n private async getSummaryUploadManager(): Promise<ISummaryUploadManager> {\n const manager = await this.getStorageManager();\n return new SummaryTreeUploadManager(\n new RetriableGitManager(manager, this.logger),\n this.blobsShaCache,\n this.getPreviousFullSnapshot.bind(this),\n );\n }\n\n constructor(\n protected readonly id: string,\n protected readonly manager: GitManager,\n protected readonly logger: ITelemetryLogger,\n public readonly policies: IDocumentStorageServicePolicies = {},\n driverPolicies?: IRouterliciousDriverPolicies,\n blobCache?: ICache<ArrayBufferLike>,\n snapshotTreeCache?: ICache<ISnapshotTreeVersion>,\n private readonly getStorageManager: (disableCache?: boolean) => Promise<GitManager> = async () => this.manager,\n ) {\n if (driverPolicies?.enableRestLess === true || isNode) {\n this.blobCache = blobCache ?? new InMemoryCache();\n this.snapshotTreeCache = snapshotTreeCache ?? new InMemoryCache();\n }\n }\n\n public async getVersions(versionId: string | null, count: number): Promise<IVersion[]> {\n const id = versionId ? versionId : this.id;\n const commits = await PerformanceEvent.timedExecAsync(\n this.logger,\n {\n eventName: \"getVersions\",\n versionId: id,\n count,\n },\n async () => {\n const manager = await this.getStorageManager();\n return manager.getCommits(id, count);\n },\n );\n return commits.map((commit) => ({\n date: commit.commit.author.date,\n id: commit.sha,\n treeId: commit.commit.tree.sha,\n }));\n }\n\n public async getSnapshotTree(version?: IVersion): Promise<ISnapshotTreeEx | null> {\n let requestVersion = version;\n if (!requestVersion) {\n const versions = await this.getVersions(this.id, 1);\n if (versions.length === 0) {\n return null;\n }\n\n requestVersion = versions[0];\n }\n\n const cachedSnapshotTree = await this.snapshotTreeCache?.get(this.getCacheKey(requestVersion.treeId));\n if (cachedSnapshotTree) {\n return cachedSnapshotTree.snapshotTree as ISnapshotTreeEx;\n }\n\n const rawTree = await PerformanceEvent.timedExecAsync(\n this.logger,\n {\n eventName: \"getSnapshotTree\",\n treeId: requestVersion.treeId,\n },\n async (event) => {\n const manager = await this.getStorageManager();\n const response = await manager.getTree(requestVersion!.treeId);\n event.end({\n size: response.tree.length,\n });\n return response;\n },\n );\n const tree = buildHierarchy(rawTree, this.blobsShaCache, true);\n await this.snapshotTreeCache?.put(\n this.getCacheKey(tree.id),\n { id: requestVersion.id, snapshotTree: tree },\n );\n return tree;\n }\n\n public async readBlob(blobId: string): Promise<ArrayBufferLike> {\n const cachedBlob = await this.blobCache?.get(this.getCacheKey(blobId));\n if (cachedBlob) {\n return cachedBlob;\n }\n\n const value = await PerformanceEvent.timedExecAsync(\n this.logger,\n {\n eventName: \"readBlob\",\n blobId,\n },\n async (event) => {\n const manager = await this.getStorageManager();\n const response = await manager.getBlob(blobId);\n event.end({\n size: response.size,\n });\n return response;\n },\n );\n this.blobsShaCache.set(value.sha, \"\");\n const bufferContent = stringToBuffer(value.content, value.encoding);\n await this.blobCache?.put(this.getCacheKey(value.sha), bufferContent);\n return bufferContent;\n }\n\n public async uploadSummaryWithContext(summary: ISummaryTree, context: ISummaryContext): Promise<string> {\n const summaryHandle = await PerformanceEvent.timedExecAsync(\n this.logger,\n {\n eventName: \"uploadSummaryWithContext\",\n },\n async () => {\n const summaryUploadManager = await this.getSummaryUploadManager();\n return summaryUploadManager.writeSummaryTree(summary, context.ackHandle ?? \"\", \"channel\");\n },\n );\n return summaryHandle;\n }\n\n public async downloadSummary(handle: ISummaryHandle): Promise<ISummaryTree> {\n throw new Error(\"NOT IMPLEMENTED!\");\n }\n\n public async createBlob(file: ArrayBufferLike): Promise<ICreateBlobResponse> {\n const uint8ArrayFile = new Uint8Array(file);\n return PerformanceEvent.timedExecAsync(\n this.logger,\n {\n eventName: \"createBlob\",\n size: uint8ArrayFile.length,\n },\n async (event) => {\n const manager = await this.getStorageManager();\n const response = await manager.createBlob(\n Uint8ArrayToString(\n uint8ArrayFile, \"base64\"),\n \"base64\").then((r) => ({ id: r.sha, url: r.url }));\n event.end({\n blobId: response.id,\n });\n return response;\n },\n );\n }\n\n private async getPreviousFullSnapshot(parentHandle: string): Promise<ISnapshotTreeEx | null | undefined> {\n return parentHandle\n ? this.getVersions(parentHandle, 1)\n .then(async (versions) => {\n // Clear the cache as the getSnapshotTree call will fill the cache.\n this.blobsShaCache.clear();\n return this.getSnapshotTree(versions[0]);\n })\n : undefined;\n }\n\n private getCacheKey(blobId: string): string {\n return `${this.id}:${blobId}`;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"shreddedSummaryDocumentStorageService.js","sourceRoot":"","sources":["../src/shreddedSummaryDocumentStorageService.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 type { ITelemetryLogger } from \"@fluidframework/common-definitions\";\nimport {\n stringToBuffer,\n Uint8ArrayToString,\n} from \"@fluidframework/common-utils\";\nimport {\n IDocumentStorageService,\n ISummaryContext,\n IDocumentStorageServicePolicies,\n} from \"@fluidframework/driver-definitions\";\nimport { buildHierarchy } from \"@fluidframework/protocol-base\";\nimport {\n ICreateBlobResponse,\n ISnapshotTreeEx,\n ISummaryHandle,\n ISummaryTree,\n IVersion,\n} from \"@fluidframework/protocol-definitions\";\nimport {\n GitManager,\n ISummaryUploadManager,\n SummaryTreeUploadManager,\n} from \"@fluidframework/server-services-client\";\nimport { PerformanceEvent } from \"@fluidframework/telemetry-utils\";\nimport { IRouterliciousDriverPolicies } from \"./policies\";\nimport { ICache, InMemoryCache } from \"./cache\";\nimport { RetriableGitManager } from \"./retriableGitManager\";\nimport { ISnapshotTreeVersion } from \"./definitions\";\n\nconst isNode = typeof window === \"undefined\";\n\n/**\n * Document access to underlying storage for routerlicious driver.\n * Uploads summaries piece-by-piece traversing the tree recursively.\n * Downloads summaries piece-by-piece on-demand, or up-front when prefetch is enabled.\n */\nexport class ShreddedSummaryDocumentStorageService implements IDocumentStorageService {\n // The values of this cache is useless. We only need the keys. So we are always putting\n // empty strings as values.\n protected readonly blobsShaCache = new Map<string, string>();\n private readonly blobCache: ICache<ArrayBufferLike> | undefined;\n private readonly snapshotTreeCache: ICache<ISnapshotTreeVersion> | undefined;\n\n public get repositoryUrl(): string {\n return \"\";\n }\n\n private async getSummaryUploadManager(): Promise<ISummaryUploadManager> {\n const manager = await this.getStorageManager();\n return new SummaryTreeUploadManager(\n new RetriableGitManager(manager, this.logger),\n this.blobsShaCache,\n this.getPreviousFullSnapshot.bind(this),\n );\n }\n\n constructor(\n protected readonly id: string,\n protected readonly manager: GitManager,\n protected readonly logger: ITelemetryLogger,\n public readonly policies: IDocumentStorageServicePolicies = {},\n driverPolicies?: IRouterliciousDriverPolicies,\n blobCache?: ICache<ArrayBufferLike>,\n snapshotTreeCache?: ICache<ISnapshotTreeVersion>,\n private readonly getStorageManager: (disableCache?: boolean) => Promise<GitManager> = async () => this.manager,\n ) {\n if (driverPolicies?.enableRestLess === true || isNode) {\n this.blobCache = blobCache ?? new InMemoryCache();\n this.snapshotTreeCache = snapshotTreeCache ?? new InMemoryCache();\n }\n }\n\n public async getVersions(versionId: string | null, count: number): Promise<IVersion[]> {\n const id = versionId ? versionId : this.id;\n const commits = await PerformanceEvent.timedExecAsync(\n this.logger,\n {\n eventName: \"getVersions\",\n versionId: id,\n count,\n },\n async () => {\n const manager = await this.getStorageManager();\n return manager.getCommits(id, count);\n },\n );\n return commits.map((commit) => ({\n date: commit.commit.author.date,\n id: commit.sha,\n treeId: commit.commit.tree.sha,\n }));\n }\n\n public async getSnapshotTree(version?: IVersion): Promise<ISnapshotTreeEx | null> {\n let requestVersion = version;\n if (!requestVersion) {\n const versions = await this.getVersions(this.id, 1);\n if (versions.length === 0) {\n return null;\n }\n\n requestVersion = versions[0];\n }\n\n const cachedSnapshotTree = await this.snapshotTreeCache?.get(this.getCacheKey(requestVersion.treeId));\n if (cachedSnapshotTree) {\n return cachedSnapshotTree.snapshotTree as ISnapshotTreeEx;\n }\n\n const rawTree = await PerformanceEvent.timedExecAsync(\n this.logger,\n {\n eventName: \"getSnapshotTree\",\n treeId: requestVersion.treeId,\n },\n async (event) => {\n const manager = await this.getStorageManager();\n const response = await manager.getTree(requestVersion!.treeId);\n event.end({\n size: response.tree.length,\n });\n return response;\n },\n );\n const tree = buildHierarchy(rawTree, this.blobsShaCache, true);\n await this.snapshotTreeCache?.put(\n this.getCacheKey(tree.id),\n { id: requestVersion.id, snapshotTree: tree },\n );\n return tree;\n }\n\n public async readBlob(blobId: string): Promise<ArrayBufferLike> {\n const cachedBlob = await this.blobCache?.get(this.getCacheKey(blobId));\n if (cachedBlob) {\n return cachedBlob;\n }\n\n const value = await PerformanceEvent.timedExecAsync(\n this.logger,\n {\n eventName: \"readBlob\",\n blobId,\n },\n async (event) => {\n const manager = await this.getStorageManager();\n const response = await manager.getBlob(blobId);\n event.end({\n size: response.size,\n });\n return response;\n },\n );\n this.blobsShaCache.set(value.sha, \"\");\n const bufferContent = stringToBuffer(value.content, value.encoding);\n await this.blobCache?.put(this.getCacheKey(value.sha), bufferContent);\n return bufferContent;\n }\n\n public async uploadSummaryWithContext(summary: ISummaryTree, context: ISummaryContext): Promise<string> {\n const summaryHandle = await PerformanceEvent.timedExecAsync(\n this.logger,\n {\n eventName: \"uploadSummaryWithContext\",\n proposalHandle: context.proposalHandle,\n ackHandle: context.ackHandle,\n referenceSequenceNumber: context.referenceSequenceNumber,\n },\n async () => {\n const summaryUploadManager = await this.getSummaryUploadManager();\n return summaryUploadManager.writeSummaryTree(summary, context.ackHandle ?? \"\", \"channel\");\n },\n );\n return summaryHandle;\n }\n\n public async downloadSummary(handle: ISummaryHandle): Promise<ISummaryTree> {\n throw new Error(\"NOT IMPLEMENTED!\");\n }\n\n public async createBlob(file: ArrayBufferLike): Promise<ICreateBlobResponse> {\n const uint8ArrayFile = new Uint8Array(file);\n return PerformanceEvent.timedExecAsync(\n this.logger,\n {\n eventName: \"createBlob\",\n size: uint8ArrayFile.length,\n },\n async (event) => {\n const manager = await this.getStorageManager();\n const response = await manager.createBlob(\n Uint8ArrayToString(\n uint8ArrayFile, \"base64\"),\n \"base64\").then((r) => ({ id: r.sha, url: r.url }));\n event.end({\n blobId: response.id,\n });\n return response;\n },\n );\n }\n\n private async getPreviousFullSnapshot(parentHandle: string): Promise<ISnapshotTreeEx | null | undefined> {\n return parentHandle\n ? this.getVersions(parentHandle, 1)\n .then(async (versions) => {\n // Clear the cache as the getSnapshotTree call will fill the cache.\n this.blobsShaCache.clear();\n return this.getSnapshotTree(versions[0]);\n })\n : undefined;\n }\n\n private getCacheKey(blobId: string): string {\n return `${this.id}:${blobId}`;\n }\n}\n"]}
|
package/lib/tokens.d.ts
CHANGED
|
@@ -10,7 +10,14 @@ export interface ITokenService {
|
|
|
10
10
|
extractClaims(token: string): ITokenClaims;
|
|
11
11
|
}
|
|
12
12
|
export interface ITokenResponse {
|
|
13
|
+
/**
|
|
14
|
+
* {@link https://jwt.io/introduction/ | JSON Web Token (JWT)} value.
|
|
15
|
+
*/
|
|
13
16
|
jwt: string;
|
|
17
|
+
/**
|
|
18
|
+
* Flag indicating whether token was obtained from local cache.
|
|
19
|
+
* Undefined indicates that the source of the token could not be determined.
|
|
20
|
+
*/
|
|
14
21
|
fromCache?: boolean;
|
|
15
22
|
}
|
|
16
23
|
/**
|
package/lib/tokens.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tokens.d.ts","sourceRoot":"","sources":["../src/tokens.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,sCAAsC,CAAC;AAEpE;;GAEG;AACH,MAAM,WAAW,aAAa;IAC1B,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,YAAY,CAAC;CAC9C;AAED,MAAM,WAAW,cAAc;
|
|
1
|
+
{"version":3,"file":"tokens.d.ts","sourceRoot":"","sources":["../src/tokens.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,sCAAsC,CAAC;AAEpE;;GAEG;AACH,MAAM,WAAW,aAAa;IAC1B,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,YAAY,CAAC;CAC9C;AAED,MAAM,WAAW,cAAc;IAC3B;;OAEG;IACH,GAAG,EAAE,MAAM,CAAC;IAEZ;;;OAGG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;CACvB;AAED;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC3B;;;;;;;OAOG;IACH,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;IAErG;;;;;;;OAOG;IACH,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;IAEpG;;;;;;;;;;;;;OAaG;IACH,0BAA0B,CAAC,CAAC,UAAU,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACzF"}
|
package/lib/tokens.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tokens.js","sourceRoot":"","sources":["../src/tokens.ts"],"names":[],"mappings":"AAAA;;;GAGG","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { ITokenClaims } from \"@fluidframework/protocol-definitions\";\n\n/**\n * The ITokenService abstracts the discovery of claims contained within a token\n */\nexport interface ITokenService {\n extractClaims(token: string): ITokenClaims;\n}\n\nexport interface ITokenResponse {\n
|
|
1
|
+
{"version":3,"file":"tokens.js","sourceRoot":"","sources":["../src/tokens.ts"],"names":[],"mappings":"AAAA;;;GAGG","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { ITokenClaims } from \"@fluidframework/protocol-definitions\";\n\n/**\n * The ITokenService abstracts the discovery of claims contained within a token\n */\nexport interface ITokenService {\n extractClaims(token: string): ITokenClaims;\n}\n\nexport interface ITokenResponse {\n /**\n * {@link https://jwt.io/introduction/ | JSON Web Token (JWT)} value.\n */\n jwt: string;\n\n /**\n * Flag indicating whether token was obtained from local cache.\n * Undefined indicates that the source of the token could not be determined.\n */\n fromCache?: boolean;\n}\n\n/**\n * Abstracts the token fetching mechanism for a hosting application.\n * The hosting application is responsible for providing an implementation.\n */\nexport interface ITokenProvider {\n /**\n * Fetches the orderer token from host.\n * @param tenantId - Tenant ID.\n * @param documentId - Optional. Document ID is only required for document-scoped requests.\n * @param refresh - Optional flag indicating whether token fetch must bypass local cache.\n * @returns TokenResponse object representing token value along with flag indicating\n * whether token came from cache.\n */\n fetchOrdererToken(tenantId: string, documentId?: string, refresh?: boolean): Promise<ITokenResponse>;\n\n /**\n * Fetches the storage token from host.\n * @param tenantId - Tenant ID.\n * @param documentId - Document ID.\n * @param refresh - Optional flag indicating whether token fetch must bypass local cache.\n * @returns TokenResponse object representing token value along with flag indicating\n * whether token came from cache.\n */\n fetchStorageToken(tenantId: string, documentId: string, refresh?: boolean): Promise<ITokenResponse>;\n\n /**\n * A callback triggered directly after creating the document. In this callback the client has the opportunity, to\n * verify against an authorization service, if the user who claims to create the document is the same user who\n * created it.\n *\n * @remarks Notes:\n * * Using the callback may have performance impact on the document creation process.\n * * Any exceptions thrown in the callback would fail the creation workflow\n * (see {@link RouterliciousDocumentServiceFactory.createContainer} for more details).\n *\n * @param documentId - Document ID.\n * @param creationToken - A special token that doesn't provide any kind of access, but it has the user's payload\n * and document id. It can be used to validate the identity of the document creator.\n */\n documentPostCreateCallback?(documentId: string, creationToken: string): Promise<void>;\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wholeSummaryDocumentStorageService.d.ts","sourceRoot":"","sources":["../src/wholeSummaryDocumentStorageService.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oCAAoC,CAAC;AAM3E,OAAO,EACH,uBAAuB,EACvB,eAAe,EACf,+BAA+B,EAClC,MAAM,oCAAoC,CAAC;AAI5C,OAAO,EACH,mBAAmB,EACnB,aAAa,EACb,cAAc,EACd,YAAY,EACZ,QAAQ,EACX,MAAM,sCAAsC,CAAC;AAC9C,OAAO,EAEH,UAAU,EAGb,MAAM,wCAAwC,CAAC;AAEhD,OAAO,EAAE,MAAM,EAAiB,MAAM,SAAS,CAAC;AAChD,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,4BAA4B,EAAE,MAAM,YAAY,CAAC;AAI1D,qBAAa,kCAAmC,YAAW,uBAAuB;IAa1E,SAAS,CAAC,QAAQ,CAAC,EAAE,EAAE,MAAM;IAC7B,SAAS,CAAC,QAAQ,CAAC,OAAO,EAAE,UAAU;IACtC,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,gBAAgB;aAC3B,QAAQ,EAAE,+BAA+B;IACzD,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC;IAChC,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IAClC,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAC;IACnC,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IApBtC,OAAO,CAAC,iBAAiB,CAAiB;IAE1C,IAAW,aAAa,IAAI,MAAM,CAEjC;YAEa,uBAAuB;gBAMd,EAAE,EAAE,MAAM,EACV,OAAO,EAAE,UAAU,EACnB,MAAM,EAAE,gBAAgB,EAC3B,QAAQ,GAAE,+BAAoC,EAC7C,cAAc,CAAC,0CAA8B,EAC7C,SAAS,GAAE,MAAM,CAAC,eAAe,CAAuB,EACxD,iBAAiB,GAAE,MAAM,CAAC,oBAAoB,CAAuB,EACrE,iBAAiB,CAAC,wBAAY,EAC9B,iBAAiB,GAAE,CAAC,YAAY,CAAC,EAAE,OAAO,KAAK,OAAO,CAAC,UAAU,CACc;IAIvF,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;IA0CzE,eAAe,CAAC,OAAO,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;IAclE,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;IA4BlD,wBAAwB,CAAC,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"wholeSummaryDocumentStorageService.d.ts","sourceRoot":"","sources":["../src/wholeSummaryDocumentStorageService.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oCAAoC,CAAC;AAM3E,OAAO,EACH,uBAAuB,EACvB,eAAe,EACf,+BAA+B,EAClC,MAAM,oCAAoC,CAAC;AAI5C,OAAO,EACH,mBAAmB,EACnB,aAAa,EACb,cAAc,EACd,YAAY,EACZ,QAAQ,EACX,MAAM,sCAAsC,CAAC;AAC9C,OAAO,EAEH,UAAU,EAGb,MAAM,wCAAwC,CAAC;AAEhD,OAAO,EAAE,MAAM,EAAiB,MAAM,SAAS,CAAC;AAChD,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,4BAA4B,EAAE,MAAM,YAAY,CAAC;AAI1D,qBAAa,kCAAmC,YAAW,uBAAuB;IAa1E,SAAS,CAAC,QAAQ,CAAC,EAAE,EAAE,MAAM;IAC7B,SAAS,CAAC,QAAQ,CAAC,OAAO,EAAE,UAAU;IACtC,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,gBAAgB;aAC3B,QAAQ,EAAE,+BAA+B;IACzD,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC;IAChC,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IAClC,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAC;IACnC,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IApBtC,OAAO,CAAC,iBAAiB,CAAiB;IAE1C,IAAW,aAAa,IAAI,MAAM,CAEjC;YAEa,uBAAuB;gBAMd,EAAE,EAAE,MAAM,EACV,OAAO,EAAE,UAAU,EACnB,MAAM,EAAE,gBAAgB,EAC3B,QAAQ,GAAE,+BAAoC,EAC7C,cAAc,CAAC,0CAA8B,EAC7C,SAAS,GAAE,MAAM,CAAC,eAAe,CAAuB,EACxD,iBAAiB,GAAE,MAAM,CAAC,oBAAoB,CAAuB,EACrE,iBAAiB,CAAC,wBAAY,EAC9B,iBAAiB,GAAE,CAAC,YAAY,CAAC,EAAE,OAAO,KAAK,OAAO,CAAC,UAAU,CACc;IAIvF,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;IA0CzE,eAAe,CAAC,OAAO,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;IAclE,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;IA4BlD,wBAAwB,CAAC,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC;IAiB1F,eAAe,CAAC,aAAa,EAAE,cAAc,GAAG,OAAO,CAAC,YAAY,CAAC;IAqBrE,UAAU,CAAC,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,mBAAmB,CAAC;YAsB9D,yBAAyB;YAkDzB,aAAa;IAS3B,OAAO,CAAC,WAAW;CAGtB"}
|
|
@@ -99,6 +99,9 @@ export class WholeSummaryDocumentStorageService {
|
|
|
99
99
|
async uploadSummaryWithContext(summary, context) {
|
|
100
100
|
const summaryHandle = await PerformanceEvent.timedExecAsync(this.logger, {
|
|
101
101
|
eventName: "uploadSummaryWithContext",
|
|
102
|
+
proposalHandle: context.proposalHandle,
|
|
103
|
+
ackHandle: context.ackHandle,
|
|
104
|
+
referenceSequenceNumber: context.referenceSequenceNumber,
|
|
102
105
|
}, async () => {
|
|
103
106
|
var _a;
|
|
104
107
|
const summaryUploadManager = await this.getSummaryUploadManager();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wholeSummaryDocumentStorageService.js","sourceRoot":"","sources":["../src/wholeSummaryDocumentStorageService.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 type { ITelemetryLogger } from \"@fluidframework/common-definitions\";\nimport {\n assert,\n stringToBuffer,\n Uint8ArrayToString,\n} from \"@fluidframework/common-utils\";\nimport {\n IDocumentStorageService,\n ISummaryContext,\n IDocumentStorageServicePolicies,\n} from \"@fluidframework/driver-definitions\";\nimport {\n convertSnapshotAndBlobsToSummaryTree,\n} from \"@fluidframework/driver-utils\";\nimport {\n ICreateBlobResponse,\n ISnapshotTree,\n ISummaryHandle,\n ISummaryTree,\n IVersion,\n} from \"@fluidframework/protocol-definitions\";\nimport {\n convertWholeFlatSummaryToSnapshotTreeAndBlobs,\n GitManager,\n ISummaryUploadManager,\n WholeSummaryUploadManager,\n} from \"@fluidframework/server-services-client\";\nimport { PerformanceEvent } from \"@fluidframework/telemetry-utils\";\nimport { ICache, InMemoryCache } from \"./cache\";\nimport { ISnapshotTreeVersion } from \"./definitions\";\nimport { IRouterliciousDriverPolicies } from \"./policies\";\n\nconst latestSnapshotId: string = \"latest\";\n\nexport class WholeSummaryDocumentStorageService implements IDocumentStorageService {\n private firstVersionsCall: boolean = true;\n\n public get repositoryUrl(): string {\n return \"\";\n }\n\n private async getSummaryUploadManager(): Promise<ISummaryUploadManager> {\n const manager = await this.getStorageManager();\n return new WholeSummaryUploadManager(manager);\n }\n\n constructor(\n protected readonly id: string,\n protected readonly manager: GitManager,\n protected readonly logger: ITelemetryLogger,\n public readonly policies: IDocumentStorageServicePolicies = {},\n private readonly driverPolicies?: IRouterliciousDriverPolicies,\n private readonly blobCache: ICache<ArrayBufferLike> = new InMemoryCache(),\n private readonly snapshotTreeCache: ICache<ISnapshotTreeVersion> = new InMemoryCache(),\n private readonly noCacheGitManager?: GitManager,\n private readonly getStorageManager: (disableCache?: boolean) => Promise<GitManager> = async (disableCache) =>\n disableCache && this.noCacheGitManager !== undefined ? this.noCacheGitManager : this.manager,\n ) {\n }\n\n public async getVersions(versionId: string | null, count: number): Promise<IVersion[]> {\n if (versionId !== this.id && versionId !== null) {\n // Blobs/Trees in this scenario will never have multiple versions, so return versionId as is\n return [{\n id: versionId,\n treeId: undefined!,\n }];\n }\n // If this is the first versions call for the document, we know we will want the latest summary.\n // Fetch latest summary, cache it, and return its id.\n if (this.firstVersionsCall && count === 1) {\n this.firstVersionsCall = false;\n const { id: _id, snapshotTree } = !this.driverPolicies?.enableDiscovery ?\n await this.fetchAndCacheSnapshotTree(latestSnapshotId, false) :\n await this.fetchAndCacheSnapshotTree(latestSnapshotId, true);\n return [{\n id: _id,\n treeId: snapshotTree.id!,\n }];\n }\n\n // Otherwise, get the latest version of the document as normal.\n const id = versionId ? versionId : this.id;\n const commits = await PerformanceEvent.timedExecAsync(\n this.logger,\n {\n eventName: \"getVersions\",\n versionId: id,\n count,\n },\n async () => {\n const manager = await this.getStorageManager();\n return manager.getCommits(id, count);\n },\n );\n return commits.map((commit) => ({\n date: commit.commit.author.date,\n id: commit.sha,\n treeId: commit.commit.tree.sha,\n }));\n }\n\n public async getSnapshotTree(version?: IVersion): Promise<ISnapshotTree | null> {\n let requestVersion = version;\n if (!requestVersion) {\n const versions = await this.getVersions(this.id, 1);\n if (versions.length === 0) {\n return null;\n }\n\n requestVersion = versions[0];\n }\n\n return (await this.fetchAndCacheSnapshotTree(requestVersion.id)).snapshotTree;\n }\n\n public async readBlob(blobId: string): Promise<ArrayBufferLike> {\n const cachedBlob = await this.blobCache.get(this.getCacheKey(blobId));\n if (cachedBlob !== undefined) {\n return cachedBlob;\n }\n\n const blob = await PerformanceEvent.timedExecAsync(\n this.logger,\n {\n eventName: \"readBlob\",\n blobId,\n },\n async (event) => {\n const manager = await this.getStorageManager();\n const response = await manager.getBlob(blobId);\n event.end({\n size: response.size,\n });\n return response;\n },\n );\n const bufferValue = stringToBuffer(blob.content, blob.encoding);\n\n await this.blobCache.put(this.getCacheKey(blob.sha), bufferValue);\n\n return bufferValue;\n }\n\n public async uploadSummaryWithContext(summary: ISummaryTree, context: ISummaryContext): Promise<string> {\n const summaryHandle = await PerformanceEvent.timedExecAsync(\n this.logger,\n {\n eventName: \"uploadSummaryWithContext\",\n },\n async () => {\n const summaryUploadManager = await this.getSummaryUploadManager();\n return summaryUploadManager.writeSummaryTree(summary, context.ackHandle ?? \"\", \"channel\");\n },\n );\n return summaryHandle;\n }\n\n public async downloadSummary(summaryHandle: ISummaryHandle): Promise<ISummaryTree> {\n const wholeFlatSummary = await PerformanceEvent.timedExecAsync(\n this.logger,\n {\n eventName: \"getWholeFlatSummary\",\n treeId: summaryHandle.handle,\n },\n async (event) => {\n const manager = await this.getStorageManager();\n const response = await manager.getSummary(summaryHandle.handle);\n event.end({\n size: response.trees[0]?.entries.length,\n });\n return response;\n },\n );\n\n const { blobs, snapshotTree } = convertWholeFlatSummaryToSnapshotTreeAndBlobs(wholeFlatSummary, \"\");\n return convertSnapshotAndBlobsToSummaryTree(snapshotTree, blobs);\n }\n\n public async createBlob(file: ArrayBufferLike): Promise<ICreateBlobResponse> {\n const uint8ArrayFile = new Uint8Array(file);\n return PerformanceEvent.timedExecAsync(\n this.logger,\n {\n eventName: \"createBlob\",\n size: uint8ArrayFile.length,\n },\n async (event) => {\n const manager = await this.getStorageManager();\n const response = await manager.createBlob(\n Uint8ArrayToString(\n uint8ArrayFile, \"base64\"),\n \"base64\").then((r) => ({ id: r.sha, url: r.url }));\n event.end({\n blobId: response.id,\n });\n return response;\n },\n );\n }\n\n private async fetchAndCacheSnapshotTree(versionId: string, disableCache?: boolean): Promise<ISnapshotTreeVersion> {\n const cachedSnapshotTreeVersion = await this.snapshotTreeCache.get(this.getCacheKey(versionId));\n if (cachedSnapshotTreeVersion !== undefined) {\n return { id: cachedSnapshotTreeVersion.id, snapshotTree: cachedSnapshotTreeVersion.snapshotTree };\n }\n\n const wholeFlatSummary = await PerformanceEvent.timedExecAsync(\n this.logger,\n {\n eventName: \"getWholeFlatSummary\",\n treeId: versionId,\n },\n async (event) => {\n const manager = await this.getStorageManager(disableCache);\n const response = await manager.getSummary(versionId);\n event.end({\n size: response.trees[0]?.entries.length,\n });\n return response;\n },\n );\n const normalizedWholeSummary = convertWholeFlatSummaryToSnapshotTreeAndBlobs(wholeFlatSummary);\n const wholeFlatSummaryId: string = wholeFlatSummary.id;\n const snapshotTreeId = normalizedWholeSummary.snapshotTree.id;\n assert(snapshotTreeId !== undefined, 0x275 /* \"Root tree should contain the id\" */);\n const snapshotTreeVersion = { id: wholeFlatSummaryId, snapshotTree: normalizedWholeSummary.snapshotTree };\n\n const cachePs: Promise<any>[] = [\n this.snapshotTreeCache.put(\n this.getCacheKey(snapshotTreeId),\n snapshotTreeVersion,\n ),\n this.initBlobCache(normalizedWholeSummary.blobs),\n ];\n if (snapshotTreeId !== versionId) {\n // versionId could be \"latest\". When summarizer checks cache for \"latest\", we want it to be available.\n // TODO: For in-memory cache, <latest,snapshotTree> will be a shared pointer with <snapshotId,snapshotTree>,\n // However, for something like Redis, this will cache the same value twice. Alternatively, could we simply\n // cache with versionId?\n cachePs.push(this.snapshotTreeCache.put(\n this.getCacheKey(versionId),\n snapshotTreeVersion,\n ));\n }\n\n await Promise.all(cachePs);\n\n return snapshotTreeVersion;\n }\n\n private async initBlobCache(blobs: Map<string, ArrayBuffer>): Promise<void> {\n const blobCachePutPs: Promise<void>[] = [];\n blobs.forEach((value, id) => {\n const cacheKey = this.getCacheKey(id);\n blobCachePutPs.push(this.blobCache.put(cacheKey, value));\n });\n await Promise.all(blobCachePutPs);\n }\n\n private getCacheKey(blobId: string): string {\n return `${this.id}:${blobId}`;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"wholeSummaryDocumentStorageService.js","sourceRoot":"","sources":["../src/wholeSummaryDocumentStorageService.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 type { ITelemetryLogger } from \"@fluidframework/common-definitions\";\nimport {\n assert,\n stringToBuffer,\n Uint8ArrayToString,\n} from \"@fluidframework/common-utils\";\nimport {\n IDocumentStorageService,\n ISummaryContext,\n IDocumentStorageServicePolicies,\n} from \"@fluidframework/driver-definitions\";\nimport {\n convertSnapshotAndBlobsToSummaryTree,\n} from \"@fluidframework/driver-utils\";\nimport {\n ICreateBlobResponse,\n ISnapshotTree,\n ISummaryHandle,\n ISummaryTree,\n IVersion,\n} from \"@fluidframework/protocol-definitions\";\nimport {\n convertWholeFlatSummaryToSnapshotTreeAndBlobs,\n GitManager,\n ISummaryUploadManager,\n WholeSummaryUploadManager,\n} from \"@fluidframework/server-services-client\";\nimport { PerformanceEvent } from \"@fluidframework/telemetry-utils\";\nimport { ICache, InMemoryCache } from \"./cache\";\nimport { ISnapshotTreeVersion } from \"./definitions\";\nimport { IRouterliciousDriverPolicies } from \"./policies\";\n\nconst latestSnapshotId: string = \"latest\";\n\nexport class WholeSummaryDocumentStorageService implements IDocumentStorageService {\n private firstVersionsCall: boolean = true;\n\n public get repositoryUrl(): string {\n return \"\";\n }\n\n private async getSummaryUploadManager(): Promise<ISummaryUploadManager> {\n const manager = await this.getStorageManager();\n return new WholeSummaryUploadManager(manager);\n }\n\n constructor(\n protected readonly id: string,\n protected readonly manager: GitManager,\n protected readonly logger: ITelemetryLogger,\n public readonly policies: IDocumentStorageServicePolicies = {},\n private readonly driverPolicies?: IRouterliciousDriverPolicies,\n private readonly blobCache: ICache<ArrayBufferLike> = new InMemoryCache(),\n private readonly snapshotTreeCache: ICache<ISnapshotTreeVersion> = new InMemoryCache(),\n private readonly noCacheGitManager?: GitManager,\n private readonly getStorageManager: (disableCache?: boolean) => Promise<GitManager> = async (disableCache) =>\n disableCache && this.noCacheGitManager !== undefined ? this.noCacheGitManager : this.manager,\n ) {\n }\n\n public async getVersions(versionId: string | null, count: number): Promise<IVersion[]> {\n if (versionId !== this.id && versionId !== null) {\n // Blobs/Trees in this scenario will never have multiple versions, so return versionId as is\n return [{\n id: versionId,\n treeId: undefined!,\n }];\n }\n // If this is the first versions call for the document, we know we will want the latest summary.\n // Fetch latest summary, cache it, and return its id.\n if (this.firstVersionsCall && count === 1) {\n this.firstVersionsCall = false;\n const { id: _id, snapshotTree } = !this.driverPolicies?.enableDiscovery ?\n await this.fetchAndCacheSnapshotTree(latestSnapshotId, false) :\n await this.fetchAndCacheSnapshotTree(latestSnapshotId, true);\n return [{\n id: _id,\n treeId: snapshotTree.id!,\n }];\n }\n\n // Otherwise, get the latest version of the document as normal.\n const id = versionId ? versionId : this.id;\n const commits = await PerformanceEvent.timedExecAsync(\n this.logger,\n {\n eventName: \"getVersions\",\n versionId: id,\n count,\n },\n async () => {\n const manager = await this.getStorageManager();\n return manager.getCommits(id, count);\n },\n );\n return commits.map((commit) => ({\n date: commit.commit.author.date,\n id: commit.sha,\n treeId: commit.commit.tree.sha,\n }));\n }\n\n public async getSnapshotTree(version?: IVersion): Promise<ISnapshotTree | null> {\n let requestVersion = version;\n if (!requestVersion) {\n const versions = await this.getVersions(this.id, 1);\n if (versions.length === 0) {\n return null;\n }\n\n requestVersion = versions[0];\n }\n\n return (await this.fetchAndCacheSnapshotTree(requestVersion.id)).snapshotTree;\n }\n\n public async readBlob(blobId: string): Promise<ArrayBufferLike> {\n const cachedBlob = await this.blobCache.get(this.getCacheKey(blobId));\n if (cachedBlob !== undefined) {\n return cachedBlob;\n }\n\n const blob = await PerformanceEvent.timedExecAsync(\n this.logger,\n {\n eventName: \"readBlob\",\n blobId,\n },\n async (event) => {\n const manager = await this.getStorageManager();\n const response = await manager.getBlob(blobId);\n event.end({\n size: response.size,\n });\n return response;\n },\n );\n const bufferValue = stringToBuffer(blob.content, blob.encoding);\n\n await this.blobCache.put(this.getCacheKey(blob.sha), bufferValue);\n\n return bufferValue;\n }\n\n public async uploadSummaryWithContext(summary: ISummaryTree, context: ISummaryContext): Promise<string> {\n const summaryHandle = await PerformanceEvent.timedExecAsync(\n this.logger,\n {\n eventName: \"uploadSummaryWithContext\",\n proposalHandle: context.proposalHandle,\n ackHandle: context.ackHandle,\n referenceSequenceNumber: context.referenceSequenceNumber,\n },\n async () => {\n const summaryUploadManager = await this.getSummaryUploadManager();\n return summaryUploadManager.writeSummaryTree(summary, context.ackHandle ?? \"\", \"channel\");\n },\n );\n return summaryHandle;\n }\n\n public async downloadSummary(summaryHandle: ISummaryHandle): Promise<ISummaryTree> {\n const wholeFlatSummary = await PerformanceEvent.timedExecAsync(\n this.logger,\n {\n eventName: \"getWholeFlatSummary\",\n treeId: summaryHandle.handle,\n },\n async (event) => {\n const manager = await this.getStorageManager();\n const response = await manager.getSummary(summaryHandle.handle);\n event.end({\n size: response.trees[0]?.entries.length,\n });\n return response;\n },\n );\n\n const { blobs, snapshotTree } = convertWholeFlatSummaryToSnapshotTreeAndBlobs(wholeFlatSummary, \"\");\n return convertSnapshotAndBlobsToSummaryTree(snapshotTree, blobs);\n }\n\n public async createBlob(file: ArrayBufferLike): Promise<ICreateBlobResponse> {\n const uint8ArrayFile = new Uint8Array(file);\n return PerformanceEvent.timedExecAsync(\n this.logger,\n {\n eventName: \"createBlob\",\n size: uint8ArrayFile.length,\n },\n async (event) => {\n const manager = await this.getStorageManager();\n const response = await manager.createBlob(\n Uint8ArrayToString(\n uint8ArrayFile, \"base64\"),\n \"base64\").then((r) => ({ id: r.sha, url: r.url }));\n event.end({\n blobId: response.id,\n });\n return response;\n },\n );\n }\n\n private async fetchAndCacheSnapshotTree(versionId: string, disableCache?: boolean): Promise<ISnapshotTreeVersion> {\n const cachedSnapshotTreeVersion = await this.snapshotTreeCache.get(this.getCacheKey(versionId));\n if (cachedSnapshotTreeVersion !== undefined) {\n return { id: cachedSnapshotTreeVersion.id, snapshotTree: cachedSnapshotTreeVersion.snapshotTree };\n }\n\n const wholeFlatSummary = await PerformanceEvent.timedExecAsync(\n this.logger,\n {\n eventName: \"getWholeFlatSummary\",\n treeId: versionId,\n },\n async (event) => {\n const manager = await this.getStorageManager(disableCache);\n const response = await manager.getSummary(versionId);\n event.end({\n size: response.trees[0]?.entries.length,\n });\n return response;\n },\n );\n const normalizedWholeSummary = convertWholeFlatSummaryToSnapshotTreeAndBlobs(wholeFlatSummary);\n const wholeFlatSummaryId: string = wholeFlatSummary.id;\n const snapshotTreeId = normalizedWholeSummary.snapshotTree.id;\n assert(snapshotTreeId !== undefined, 0x275 /* \"Root tree should contain the id\" */);\n const snapshotTreeVersion = { id: wholeFlatSummaryId, snapshotTree: normalizedWholeSummary.snapshotTree };\n\n const cachePs: Promise<any>[] = [\n this.snapshotTreeCache.put(\n this.getCacheKey(snapshotTreeId),\n snapshotTreeVersion,\n ),\n this.initBlobCache(normalizedWholeSummary.blobs),\n ];\n if (snapshotTreeId !== versionId) {\n // versionId could be \"latest\". When summarizer checks cache for \"latest\", we want it to be available.\n // TODO: For in-memory cache, <latest,snapshotTree> will be a shared pointer with <snapshotId,snapshotTree>,\n // However, for something like Redis, this will cache the same value twice. Alternatively, could we simply\n // cache with versionId?\n cachePs.push(this.snapshotTreeCache.put(\n this.getCacheKey(versionId),\n snapshotTreeVersion,\n ));\n }\n\n await Promise.all(cachePs);\n\n return snapshotTreeVersion;\n }\n\n private async initBlobCache(blobs: Map<string, ArrayBuffer>): Promise<void> {\n const blobCachePutPs: Promise<void>[] = [];\n blobs.forEach((value, id) => {\n const cacheKey = this.getCacheKey(id);\n blobCachePutPs.push(this.blobCache.put(cacheKey, value));\n });\n await Promise.all(blobCachePutPs);\n }\n\n private getCacheKey(blobId: string): string {\n return `${this.id}:${blobId}`;\n }\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@fluidframework/routerlicious-driver",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "2.0.0-dev.1.4.5.105745",
|
|
4
4
|
"description": "Socket.IO + Git implementation of Fluid service API",
|
|
5
5
|
"homepage": "https://fluidframework.com",
|
|
6
6
|
"repository": {
|
|
@@ -61,15 +61,15 @@
|
|
|
61
61
|
},
|
|
62
62
|
"dependencies": {
|
|
63
63
|
"@fluidframework/common-definitions": "^0.20.1",
|
|
64
|
-
"@fluidframework/common-utils": "^0.
|
|
65
|
-
"@fluidframework/driver-base": "
|
|
66
|
-
"@fluidframework/driver-definitions": "
|
|
67
|
-
"@fluidframework/driver-utils": "
|
|
68
|
-
"@fluidframework/gitresources": "^0.
|
|
69
|
-
"@fluidframework/protocol-base": "^0.
|
|
70
|
-
"@fluidframework/protocol-definitions": "^0.
|
|
71
|
-
"@fluidframework/server-services-client": "^0.
|
|
72
|
-
"@fluidframework/telemetry-utils": "
|
|
64
|
+
"@fluidframework/common-utils": "^1.0.0",
|
|
65
|
+
"@fluidframework/driver-base": "2.0.0-dev.1.4.5.105745",
|
|
66
|
+
"@fluidframework/driver-definitions": "2.0.0-dev.1.4.5.105745",
|
|
67
|
+
"@fluidframework/driver-utils": "2.0.0-dev.1.4.5.105745",
|
|
68
|
+
"@fluidframework/gitresources": "^0.1037.2001",
|
|
69
|
+
"@fluidframework/protocol-base": "^0.1037.2001",
|
|
70
|
+
"@fluidframework/protocol-definitions": "^1.0.0",
|
|
71
|
+
"@fluidframework/server-services-client": "^0.1037.2001",
|
|
72
|
+
"@fluidframework/telemetry-utils": "2.0.0-dev.1.4.5.105745",
|
|
73
73
|
"cross-fetch": "^3.1.5",
|
|
74
74
|
"json-stringify-safe": "5.0.1",
|
|
75
75
|
"querystring": "^0.2.0",
|
|
@@ -78,11 +78,11 @@
|
|
|
78
78
|
"uuid": "^8.3.1"
|
|
79
79
|
},
|
|
80
80
|
"devDependencies": {
|
|
81
|
-
"@fluidframework/build-common": "^0.
|
|
82
|
-
"@fluidframework/build-tools": "^0.
|
|
83
|
-
"@fluidframework/eslint-config-fluid": "^0.
|
|
84
|
-
"@fluidframework/mocha-test-setup": "
|
|
85
|
-
"@fluidframework/routerlicious-driver-previous": "npm:@fluidframework/routerlicious-driver@^1.
|
|
81
|
+
"@fluidframework/build-common": "^1.0.0",
|
|
82
|
+
"@fluidframework/build-tools": "^0.4.4000",
|
|
83
|
+
"@fluidframework/eslint-config-fluid": "^1.0.0",
|
|
84
|
+
"@fluidframework/mocha-test-setup": "2.0.0-dev.1.4.5.105745",
|
|
85
|
+
"@fluidframework/routerlicious-driver-previous": "npm:@fluidframework/routerlicious-driver@^1.0.0",
|
|
86
86
|
"@microsoft/api-extractor": "^7.22.2",
|
|
87
87
|
"@rushstack/eslint-config": "^2.5.1",
|
|
88
88
|
"@types/mocha": "^9.1.1",
|
|
@@ -91,7 +91,7 @@
|
|
|
91
91
|
"@types/uuid": "^8.3.0",
|
|
92
92
|
"axios": "^0.26.0",
|
|
93
93
|
"concurrently": "^6.2.0",
|
|
94
|
-
"copyfiles": "^2.1
|
|
94
|
+
"copyfiles": "^2.4.1",
|
|
95
95
|
"cross-env": "^7.0.2",
|
|
96
96
|
"eslint": "~8.6.0",
|
|
97
97
|
"mocha": "^10.0.0",
|
|
@@ -102,7 +102,11 @@
|
|
|
102
102
|
"typescript-formatter": "7.1.0"
|
|
103
103
|
},
|
|
104
104
|
"typeValidation": {
|
|
105
|
-
"version": "
|
|
106
|
-
"broken": {
|
|
105
|
+
"version": "2.0.0",
|
|
106
|
+
"broken": {
|
|
107
|
+
"InterfaceDeclaration_IRouterliciousDriverPolicies": {
|
|
108
|
+
"forwardCompat": false
|
|
109
|
+
}
|
|
110
|
+
}
|
|
107
111
|
}
|
|
108
112
|
}
|
package/src/cache.ts
CHANGED
|
@@ -19,3 +19,12 @@ export class InMemoryCache<T> implements ICache<T> {
|
|
|
19
19
|
this.cache.set(key, value);
|
|
20
20
|
}
|
|
21
21
|
}
|
|
22
|
+
|
|
23
|
+
export class NullCache<T> implements ICache<T> {
|
|
24
|
+
public async get(key: string): Promise<T | undefined> {
|
|
25
|
+
return undefined;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
public async put(key: string, value: T): Promise<void> {
|
|
29
|
+
}
|
|
30
|
+
}
|
|
@@ -65,10 +65,8 @@ export class R11sDocumentDeltaConnection extends DocumentDeltaConnection {
|
|
|
65
65
|
// Note: we suspect the incoming error object is either:
|
|
66
66
|
// - a socketError: add it to the R11sError object for driver to be able to parse it and reason over it.
|
|
67
67
|
// - anything else: let base class handle it
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
return super.createErrorObject(handler, error, canRetry);
|
|
72
|
-
}
|
|
68
|
+
return canRetry && Number.isInteger(error?.code) && typeof error?.message === "string"
|
|
69
|
+
? errorObjectFromSocketError(error as IR11sSocketError, handler)
|
|
70
|
+
: super.createErrorObject(handler, error, canRetry);
|
|
73
71
|
}
|
|
74
72
|
}
|
package/src/documentService.ts
CHANGED
|
@@ -49,6 +49,7 @@ export class DocumentService implements api.IDocumentService {
|
|
|
49
49
|
private _resolvedUrl: api.IResolvedUrl,
|
|
50
50
|
protected ordererUrl: string,
|
|
51
51
|
private deltaStorageUrl: string,
|
|
52
|
+
private deltaStreamUrl: string,
|
|
52
53
|
private storageUrl: string,
|
|
53
54
|
private readonly logger: ITelemetryLogger,
|
|
54
55
|
protected tokenProvider: ITokenProvider,
|
|
@@ -192,13 +193,14 @@ export class DocumentService implements api.IDocumentService {
|
|
|
192
193
|
this.documentId,
|
|
193
194
|
refreshToken,
|
|
194
195
|
);
|
|
196
|
+
|
|
195
197
|
return R11sDocumentDeltaConnection.create(
|
|
196
198
|
this.tenantId,
|
|
197
199
|
this.documentId,
|
|
198
200
|
ordererToken.jwt,
|
|
199
201
|
io,
|
|
200
202
|
client,
|
|
201
|
-
this.
|
|
203
|
+
this.deltaStreamUrl,
|
|
202
204
|
this.logger,
|
|
203
205
|
);
|
|
204
206
|
};
|
|
@@ -240,6 +242,7 @@ export class DocumentService implements api.IDocumentService {
|
|
|
240
242
|
this.storageUrl = fluidResolvedUrl.endpoints.storageUrl;
|
|
241
243
|
this.ordererUrl = fluidResolvedUrl.endpoints.ordererUrl;
|
|
242
244
|
this.deltaStorageUrl = fluidResolvedUrl.endpoints.deltaStorageUrl;
|
|
245
|
+
this.deltaStreamUrl = fluidResolvedUrl.endpoints.deltaStreamUrl || this.ordererUrl;
|
|
243
246
|
this.lastDiscoveredAt = Date.now();
|
|
244
247
|
}
|
|
245
248
|
|
|
@@ -26,7 +26,7 @@ import { ITokenProvider } from "./tokens";
|
|
|
26
26
|
import { RouterliciousOrdererRestWrapper } from "./restWrapper";
|
|
27
27
|
import { convertSummaryToCreateNewSummary } from "./createNewUtils";
|
|
28
28
|
import { parseFluidUrl, replaceDocumentIdInPath, getDiscoveredFluidResolvedUrl } from "./urlUtils";
|
|
29
|
-
import { InMemoryCache } from "./cache";
|
|
29
|
+
import { ICache, InMemoryCache, NullCache } from "./cache";
|
|
30
30
|
import { pkgVersion as driverVersion } from "./packageVersion";
|
|
31
31
|
import { ISnapshotTreeVersion } from "./definitions";
|
|
32
32
|
|
|
@@ -38,6 +38,7 @@ const defaultRouterliciousDriverPolicies: IRouterliciousDriverPolicies = {
|
|
|
38
38
|
enableDiscovery: false,
|
|
39
39
|
enableWholeSummaryUpload: false,
|
|
40
40
|
enableRestLess: true,
|
|
41
|
+
enableInternalSummaryCaching: true,
|
|
41
42
|
};
|
|
42
43
|
|
|
43
44
|
/**
|
|
@@ -47,8 +48,8 @@ const defaultRouterliciousDriverPolicies: IRouterliciousDriverPolicies = {
|
|
|
47
48
|
export class RouterliciousDocumentServiceFactory implements IDocumentServiceFactory {
|
|
48
49
|
public readonly protocolName = "fluid:";
|
|
49
50
|
private readonly driverPolicies: IRouterliciousDriverPolicies;
|
|
50
|
-
private readonly blobCache
|
|
51
|
-
private readonly snapshotTreeCache
|
|
51
|
+
private readonly blobCache: ICache<ArrayBufferLike>;
|
|
52
|
+
private readonly snapshotTreeCache: ICache<ISnapshotTreeVersion>;
|
|
52
53
|
|
|
53
54
|
constructor(
|
|
54
55
|
private readonly tokenProvider: ITokenProvider,
|
|
@@ -58,6 +59,10 @@ export class RouterliciousDocumentServiceFactory implements IDocumentServiceFact
|
|
|
58
59
|
...defaultRouterliciousDriverPolicies,
|
|
59
60
|
...driverPolicies,
|
|
60
61
|
};
|
|
62
|
+
this.blobCache = new InMemoryCache<ArrayBufferLike>();
|
|
63
|
+
this.snapshotTreeCache = this.driverPolicies.enableInternalSummaryCaching
|
|
64
|
+
? new InMemoryCache<ISnapshotTreeVersion>()
|
|
65
|
+
: new NullCache<ISnapshotTreeVersion>();
|
|
61
66
|
}
|
|
62
67
|
|
|
63
68
|
/**
|
|
@@ -214,6 +219,7 @@ export class RouterliciousDocumentServiceFactory implements IDocumentServiceFact
|
|
|
214
219
|
const storageUrl = fluidResolvedUrl.endpoints.storageUrl;
|
|
215
220
|
const ordererUrl = fluidResolvedUrl.endpoints.ordererUrl;
|
|
216
221
|
const deltaStorageUrl = fluidResolvedUrl.endpoints.deltaStorageUrl;
|
|
222
|
+
const deltaStreamUrl = fluidResolvedUrl.endpoints.deltaStreamUrl || ordererUrl; // backward compatibility
|
|
217
223
|
if (!ordererUrl || !deltaStorageUrl) {
|
|
218
224
|
throw new Error(
|
|
219
225
|
`All endpoints urls must be provided. [ordererUrl:${ordererUrl}][deltaStorageUrl:${deltaStorageUrl}]`);
|
|
@@ -223,6 +229,7 @@ export class RouterliciousDocumentServiceFactory implements IDocumentServiceFact
|
|
|
223
229
|
fluidResolvedUrl,
|
|
224
230
|
ordererUrl,
|
|
225
231
|
deltaStorageUrl,
|
|
232
|
+
deltaStreamUrl,
|
|
226
233
|
storageUrl,
|
|
227
234
|
logger2,
|
|
228
235
|
this.tokenProvider,
|
package/src/packageVersion.ts
CHANGED
package/src/policies.ts
CHANGED
|
@@ -42,4 +42,10 @@ export interface IRouterliciousDriverPolicies {
|
|
|
42
42
|
* Default: true
|
|
43
43
|
*/
|
|
44
44
|
enableRestLess: boolean;
|
|
45
|
+
/**
|
|
46
|
+
* Enable internal cache of summaries/snapshots.
|
|
47
|
+
* Reduces Summarizer boot time and reduces server load in E2E tests.
|
|
48
|
+
* Default: true
|
|
49
|
+
*/
|
|
50
|
+
enableInternalSummaryCaching: boolean;
|
|
45
51
|
}
|
package/src/restWrapper.ts
CHANGED
|
@@ -106,7 +106,7 @@ export class RouterliciousRestWrapper extends RestWrapper {
|
|
|
106
106
|
}
|
|
107
107
|
|
|
108
108
|
private generateHeaders(requestHeaders?: AxiosRequestHeaders | undefined): Record<string, string> {
|
|
109
|
-
const correlationId = requestHeaders?.["x-correlation-id"]
|
|
109
|
+
const correlationId = requestHeaders?.["x-correlation-id"] ?? uuid();
|
|
110
110
|
|
|
111
111
|
return {
|
|
112
112
|
...requestHeaders,
|