@fluidframework/routerlicious-driver 2.117.0 → 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.mocharc.cjs +3 -0
- package/CHANGELOG.md +36 -2
- package/README.md +53 -50
- package/{api-extractor.json → api-extractor/api-extractor-model.json} +1 -1
- package/dist/cache.js +1 -0
- package/dist/cache.js.map +1 -1
- package/dist/defaultTokenProvider.js +1 -0
- package/dist/defaultTokenProvider.js.map +1 -1
- package/dist/deltaStorageService.js +12 -0
- package/dist/deltaStorageService.js.map +1 -1
- package/dist/documentDeltaConnection.js +1 -0
- package/dist/documentDeltaConnection.js.map +1 -1
- package/dist/documentService.js +23 -0
- package/dist/documentService.js.map +1 -1
- package/dist/documentServiceFactory.d.ts +8 -2
- package/dist/documentServiceFactory.d.ts.map +1 -1
- package/dist/documentServiceFactory.js +19 -5
- package/dist/documentServiceFactory.js.map +1 -1
- package/dist/documentStorageService.d.ts.map +1 -1
- package/dist/documentStorageService.js +4 -1
- package/dist/documentStorageService.js.map +1 -1
- package/dist/errorUtils.js +8 -7
- package/dist/errorUtils.js.map +1 -1
- package/dist/gitManager.js +1 -0
- package/dist/gitManager.js.map +1 -1
- package/dist/historian.d.ts.map +1 -1
- package/dist/historian.js +4 -1
- package/dist/historian.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/mapWithExpiration.js +3 -2
- package/dist/mapWithExpiration.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/queryStringUtils.js +1 -2
- package/dist/queryStringUtils.js.map +1 -1
- package/dist/r11sLayerCompatState.d.ts +8 -1
- package/dist/r11sLayerCompatState.d.ts.map +1 -1
- package/dist/r11sLayerCompatState.js +20 -1
- package/dist/r11sLayerCompatState.js.map +1 -1
- package/dist/r11sSnapshotParser.js +1 -2
- package/dist/r11sSnapshotParser.js.map +1 -1
- package/dist/restWrapper.d.ts.map +1 -1
- package/dist/restWrapper.js +18 -12
- package/dist/restWrapper.js.map +1 -1
- package/dist/restWrapperBase.d.ts.map +1 -1
- package/dist/restWrapperBase.js +4 -0
- package/dist/restWrapperBase.js.map +1 -1
- package/dist/retriableGitManager.js +2 -0
- package/dist/retriableGitManager.js.map +1 -1
- package/dist/routerliciousResolvedUrl.d.ts.map +1 -1
- package/dist/sessionInfoManager.js +13 -12
- package/dist/sessionInfoManager.js.map +1 -1
- package/dist/shreddedSummaryDocumentStorageService.d.ts.map +1 -1
- package/dist/shreddedSummaryDocumentStorageService.js +17 -3
- package/dist/shreddedSummaryDocumentStorageService.js.map +1 -1
- package/dist/summaryTreeUploadManager.d.ts.map +1 -1
- package/dist/summaryTreeUploadManager.js +7 -1
- package/dist/summaryTreeUploadManager.js.map +1 -1
- package/dist/treeUtils.d.ts.map +1 -1
- package/dist/treeUtils.js +7 -6
- package/dist/treeUtils.js.map +1 -1
- package/dist/urlUtils.d.ts.map +1 -1
- package/dist/wholeSummaryDocumentStorageService.d.ts.map +1 -1
- package/dist/wholeSummaryDocumentStorageService.js +17 -1
- package/dist/wholeSummaryDocumentStorageService.js.map +1 -1
- package/dist/wholeSummaryUploadManager.js +1 -0
- package/dist/wholeSummaryUploadManager.js.map +1 -1
- package/lib/cache.js +1 -0
- package/lib/cache.js.map +1 -1
- package/lib/defaultTokenProvider.js +1 -0
- package/lib/defaultTokenProvider.js.map +1 -1
- package/lib/deltaStorageService.js +12 -0
- package/lib/deltaStorageService.js.map +1 -1
- package/lib/documentDeltaConnection.js +1 -0
- package/lib/documentDeltaConnection.js.map +1 -1
- package/lib/documentService.js +23 -0
- package/lib/documentService.js.map +1 -1
- package/lib/documentServiceFactory.d.ts +8 -2
- package/lib/documentServiceFactory.d.ts.map +1 -1
- package/lib/documentServiceFactory.js +18 -4
- package/lib/documentServiceFactory.js.map +1 -1
- package/lib/documentStorageService.d.ts.map +1 -1
- package/lib/documentStorageService.js +4 -1
- package/lib/documentStorageService.js.map +1 -1
- package/lib/errorUtils.js +3 -2
- package/lib/errorUtils.js.map +1 -1
- package/lib/gitManager.js +1 -0
- package/lib/gitManager.js.map +1 -1
- package/lib/historian.d.ts.map +1 -1
- package/lib/historian.js +4 -1
- package/lib/historian.js.map +1 -1
- package/lib/index.d.ts +1 -1
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +1 -1
- package/lib/index.js.map +1 -1
- package/lib/legacy.d.ts +1 -1
- package/lib/mapWithExpiration.js +3 -2
- package/lib/mapWithExpiration.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/public.d.ts +1 -1
- package/lib/r11sLayerCompatState.d.ts +8 -1
- package/lib/r11sLayerCompatState.d.ts.map +1 -1
- package/lib/r11sLayerCompatState.js +20 -1
- package/lib/r11sLayerCompatState.js.map +1 -1
- package/lib/restWrapper.d.ts.map +1 -1
- package/lib/restWrapper.js +13 -7
- package/lib/restWrapper.js.map +1 -1
- package/lib/restWrapperBase.d.ts.map +1 -1
- package/lib/restWrapperBase.js +4 -0
- package/lib/restWrapperBase.js.map +1 -1
- package/lib/retriableGitManager.js +2 -0
- package/lib/retriableGitManager.js.map +1 -1
- package/lib/routerliciousResolvedUrl.d.ts.map +1 -1
- package/lib/sessionInfoManager.js +13 -12
- package/lib/sessionInfoManager.js.map +1 -1
- package/lib/shreddedSummaryDocumentStorageService.d.ts.map +1 -1
- package/lib/shreddedSummaryDocumentStorageService.js +17 -3
- package/lib/shreddedSummaryDocumentStorageService.js.map +1 -1
- package/lib/summaryTreeUploadManager.d.ts.map +1 -1
- package/lib/summaryTreeUploadManager.js +7 -1
- package/lib/summaryTreeUploadManager.js.map +1 -1
- package/lib/treeUtils.d.ts.map +1 -1
- package/lib/treeUtils.js +3 -2
- package/lib/treeUtils.js.map +1 -1
- package/lib/urlUtils.d.ts.map +1 -1
- package/lib/wholeSummaryDocumentStorageService.d.ts.map +1 -1
- package/lib/wholeSummaryDocumentStorageService.js +17 -1
- package/lib/wholeSummaryDocumentStorageService.js.map +1 -1
- package/lib/wholeSummaryUploadManager.js +1 -0
- package/lib/wholeSummaryUploadManager.js.map +1 -1
- package/package.json +32 -45
- package/src/documentServiceFactory.ts +19 -2
- package/src/index.ts +4 -1
- package/src/packageVersion.ts +1 -1
- package/src/r11sLayerCompatState.ts +29 -1
- package/src/shreddedSummaryDocumentStorageService.ts +8 -1
- package/src/summaryTreeUploadManager.ts +5 -2
- package/src/wholeSummaryDocumentStorageService.ts +8 -1
- package/tsconfig.json +1 -1
- package/internal.d.ts +0 -11
- package/legacy.d.ts +0 -11
- /package/api-extractor/{api-extractor.current.json → api-extractor-report.current.json} +0 -0
- /package/api-extractor/{api-extractor.legacy.json → api-extractor-report.legacy.json} +0 -0
|
@@ -2,10 +2,17 @@
|
|
|
2
2
|
* Copyright (c) Microsoft Corporation and contributors. All rights reserved.
|
|
3
3
|
* Licensed under the MIT License.
|
|
4
4
|
*/
|
|
5
|
-
import { type ILayerCompatDetails } from "@fluid-internal/client-utils";
|
|
5
|
+
import { type ILayerCompatDetails, type ILayerCompatSupportRequirements } from "@fluid-internal/client-utils";
|
|
6
6
|
/**
|
|
7
7
|
* Routerlicious Driver's compatibility details that is exposed to the Loader layer.
|
|
8
8
|
* @internal
|
|
9
9
|
*/
|
|
10
10
|
export declare const r11sDriverCompatDetailsForLoader: ILayerCompatDetails;
|
|
11
|
+
/**
|
|
12
|
+
* The requirements that the Loader layer must meet to be compatible with this Routerlicious Driver. This is published
|
|
13
|
+
* to the Loader layer (which holds the reference to this Driver) so that it can validate Loader / Driver compatibility
|
|
14
|
+
* on this Driver's behalf.
|
|
15
|
+
* @internal
|
|
16
|
+
*/
|
|
17
|
+
export declare const r11sDriverCompatRequirementsForLoader: ILayerCompatSupportRequirements;
|
|
11
18
|
//# sourceMappingURL=r11sLayerCompatState.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"r11sLayerCompatState.d.ts","sourceRoot":"","sources":["../src/r11sLayerCompatState.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,
|
|
1
|
+
{"version":3,"file":"r11sLayerCompatState.d.ts","sourceRoot":"","sources":["../src/r11sLayerCompatState.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAGN,KAAK,mBAAmB,EACxB,KAAK,+BAA+B,EACpC,MAAM,8BAA8B,CAAC;AAItC;;;GAGG;AACH,eAAO,MAAM,gCAAgC,EAAE,mBAa9C,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,qCAAqC,EAAE,+BAenD,CAAC"}
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* Licensed under the MIT License.
|
|
5
5
|
*/
|
|
6
6
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
-
exports.r11sDriverCompatDetailsForLoader = void 0;
|
|
7
|
+
exports.r11sDriverCompatRequirementsForLoader = exports.r11sDriverCompatDetailsForLoader = void 0;
|
|
8
8
|
const client_utils_1 = require("@fluid-internal/client-utils");
|
|
9
9
|
const packageVersion_js_1 = require("./packageVersion.js");
|
|
10
10
|
/**
|
|
@@ -25,4 +25,23 @@ exports.r11sDriverCompatDetailsForLoader = {
|
|
|
25
25
|
*/
|
|
26
26
|
supportedFeatures: new Set(),
|
|
27
27
|
};
|
|
28
|
+
/**
|
|
29
|
+
* The requirements that the Loader layer must meet to be compatible with this Routerlicious Driver. This is published
|
|
30
|
+
* to the Loader layer (which holds the reference to this Driver) so that it can validate Loader / Driver compatibility
|
|
31
|
+
* on this Driver's behalf.
|
|
32
|
+
* @internal
|
|
33
|
+
*/
|
|
34
|
+
exports.r11sDriverCompatRequirementsForLoader = {
|
|
35
|
+
/**
|
|
36
|
+
* Minimum generation that Loader must be at to be compatible with this Driver. This is calculated based on the
|
|
37
|
+
* LayerCompatibilityPolicyWindowMonths.NewDriverOldLoader value which defines how many months old can the Loader
|
|
38
|
+
* layer be compared to the Driver layer for them to still be considered compatible.
|
|
39
|
+
* The minimum valid generation value is 0.
|
|
40
|
+
*/
|
|
41
|
+
minSupportedGeneration: Math.max(0, client_utils_1.generation - client_utils_1.LayerCompatibilityPolicyWindowMonths.NewDriverOldLoader),
|
|
42
|
+
/**
|
|
43
|
+
* The features that the Loader must support to be compatible with this Driver.
|
|
44
|
+
*/
|
|
45
|
+
requiredFeatures: [],
|
|
46
|
+
};
|
|
28
47
|
//# sourceMappingURL=r11sLayerCompatState.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"r11sLayerCompatState.js","sourceRoot":"","sources":["../src/r11sLayerCompatState.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAEH,+
|
|
1
|
+
{"version":3,"file":"r11sLayerCompatState.js","sourceRoot":"","sources":["../src/r11sLayerCompatState.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAEH,+DAKsC;AAEtC,2DAAiD;AAEjD;;;GAGG;AACU,QAAA,gCAAgC,GAAwB;IACpE;;OAEG;IACH,UAAU,EAAV,8BAAU;IACV;;OAEG;IACH,UAAU,EAAV,yBAAU;IACV;;OAEG;IACH,iBAAiB,EAAE,IAAI,GAAG,EAAU;CACpC,CAAC;AAEF;;;;;GAKG;AACU,QAAA,qCAAqC,GAAoC;IACrF;;;;;OAKG;IACH,sBAAsB,EAAE,IAAI,CAAC,GAAG,CAC/B,CAAC,EACD,yBAAU,GAAG,mDAAoC,CAAC,kBAAkB,CACpE;IACD;;OAEG;IACH,gBAAgB,EAAE,EAAE;CACpB,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport {\n\tgeneration,\n\tLayerCompatibilityPolicyWindowMonths,\n\ttype ILayerCompatDetails,\n\ttype ILayerCompatSupportRequirements,\n} from \"@fluid-internal/client-utils\";\n\nimport { pkgVersion } from \"./packageVersion.js\";\n\n/**\n * Routerlicious Driver's compatibility details that is exposed to the Loader layer.\n * @internal\n */\nexport const r11sDriverCompatDetailsForLoader: ILayerCompatDetails = {\n\t/**\n\t * The package version of the Routerlicious Driver layer.\n\t */\n\tpkgVersion,\n\t/**\n\t * The current generation of the Routerlicious Driver layer.\n\t */\n\tgeneration,\n\t/**\n\t * The features supported by the Routerlicious Driver layer across the Driver / Loader boundary.\n\t */\n\tsupportedFeatures: new Set<string>(),\n};\n\n/**\n * The requirements that the Loader layer must meet to be compatible with this Routerlicious Driver. This is published\n * to the Loader layer (which holds the reference to this Driver) so that it can validate Loader / Driver compatibility\n * on this Driver's behalf.\n * @internal\n */\nexport const r11sDriverCompatRequirementsForLoader: ILayerCompatSupportRequirements = {\n\t/**\n\t * Minimum generation that Loader must be at to be compatible with this Driver. This is calculated based on the\n\t * LayerCompatibilityPolicyWindowMonths.NewDriverOldLoader value which defines how many months old can the Loader\n\t * layer be compared to the Driver layer for them to still be considered compatible.\n\t * The minimum valid generation value is 0.\n\t */\n\tminSupportedGeneration: Math.max(\n\t\t0,\n\t\tgeneration - LayerCompatibilityPolicyWindowMonths.NewDriverOldLoader,\n\t),\n\t/**\n\t * The features that the Loader must support to be compatible with this Driver.\n\t */\n\trequiredFeatures: [],\n};\n"]}
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* Licensed under the MIT License.
|
|
5
5
|
*/
|
|
6
6
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
-
exports.convertWholeFlatSnapshotToSnapshotTreeAndBlobs =
|
|
7
|
+
exports.convertWholeFlatSnapshotToSnapshotTreeAndBlobs = convertWholeFlatSnapshotToSnapshotTreeAndBlobs;
|
|
8
8
|
const client_utils_1 = require("@fluid-internal/client-utils");
|
|
9
9
|
/**
|
|
10
10
|
* Build a tree hierarchy from a flat tree.
|
|
@@ -70,5 +70,4 @@ function convertWholeFlatSnapshotToSnapshotTreeAndBlobs(flatSnapshot, treePrefix
|
|
|
70
70
|
id: flatSnapshot.id,
|
|
71
71
|
};
|
|
72
72
|
}
|
|
73
|
-
exports.convertWholeFlatSnapshotToSnapshotTreeAndBlobs = convertWholeFlatSnapshotToSnapshotTreeAndBlobs;
|
|
74
73
|
//# sourceMappingURL=r11sSnapshotParser.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"r11sSnapshotParser.js","sourceRoot":"","sources":["../src/r11sSnapshotParser.ts"],"names":[],"mappings":";AAAA;;;GAGG
|
|
1
|
+
{"version":3,"file":"r11sSnapshotParser.js","sourceRoot":"","sources":["../src/r11sSnapshotParser.ts"],"names":[],"mappings":";AAAA;;;GAGG;;AAgEH,wGAoBC;AAlFD,+DAA8D;AAS9D;;;;;;GAMG;AACH,SAAS,cAAc,CACtB,QAAgC,EAChC,kBAA0B;IAE1B,MAAM,MAAM,GAAsC,EAAE,CAAC;IACrD,uEAAuE;IACvE,MAAM,IAAI,GAAkB,EAAE,EAAE,EAAE,QAAQ,CAAC,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;IACtE,MAAM,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC;IAElB,KAAK,MAAM,KAAK,IAAI,QAAQ,CAAC,OAAO,EAAE,CAAC;QACtC,8FAA8F;QAC9F,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,MAAM,CAAC,IAAI,kBAAkB,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC;QAChF,MAAM,SAAS,GAAG,SAAS,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;QAC7C,MAAM,YAAY,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC;QAChE,MAAM,aAAa,GAAG,SAAS,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC;QAErD,8FAA8F;QAC9F,MAAM,IAAI,GAAG,MAAM,CAAC,YAAY,CAAC,CAAC;QAElC,iCAAiC;QACjC,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YAC3B,MAAM,OAAO,GAAkB;gBAC9B,KAAK,EAAE,EAAE;gBACT,KAAK,EAAE,EAAE;gBACT,GAAG,CAAC,KAAK,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,KAAK,CAAC,YAAY,EAAE,CAAC;gBACjF,GAAG,CAAC,KAAK,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC;aAClE,CAAC;YACF,IAAI,CAAC,KAAK,CAAC,kBAAkB,CAAC,aAAa,CAAC,CAAC,GAAG,OAAO,CAAC;YACxD,MAAM,CAAC,SAAS,CAAC,GAAG,OAAO,CAAC;QAC7B,CAAC;aAAM,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YAClC,IAAI,CAAC,KAAK,CAAC,kBAAkB,CAAC,aAAa,CAAC,CAAC,GAAG,KAAK,CAAC,EAAE,CAAC;QAC1D,CAAC;aAAM,CAAC;YACP,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC;QACzC,CAAC;IACF,CAAC;IAED,OAAO,IAAI,CAAC;AACb,CAAC;AAED;;;;;;GAMG;AACH,SAAgB,8CAA8C,CAC7D,YAAgC,EAChC,qBAA6B,MAAM;IAEnC,MAAM,KAAK,GAAG,IAAI,GAAG,EAAuB,CAAC;IAC7C,IAAI,YAAY,CAAC,KAAK,EAAE,CAAC;QACxB,KAAK,MAAM,IAAI,IAAI,YAAY,CAAC,KAAK,EAAE,CAAC;YACvC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,IAAA,6BAAc,EAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,QAAQ,IAAI,OAAO,CAAC,CAAC,CAAC;QAC5E,CAAC;IACF,CAAC;IACD,MAAM,gBAAgB,GAAG,YAAY,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;IACjD,MAAM,cAAc,GAAG,gBAAgB,EAAE,cAAc,CAAC;IACxD,MAAM,YAAY,GAAG,cAAc,CAAC,gBAAgB,EAAE,kBAAkB,CAAC,CAAC;IAE1E,OAAO;QACN,KAAK;QACL,YAAY;QACZ,cAAc;QACd,EAAE,EAAE,YAAY,CAAC,EAAE;KACnB,CAAC;AACH,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { stringToBuffer } from \"@fluid-internal/client-utils\";\nimport type { ISnapshotTree } from \"@fluidframework/driver-definitions/internal\";\n\nimport type {\n\tINormalizedWholeSnapshot,\n\tIWholeFlatSnapshot,\n\tIWholeFlatSnapshotTree,\n} from \"./contracts.js\";\n\n/**\n * Build a tree hierarchy from a flat tree.\n *\n * @param flatTree - a flat tree\n * @param treePrefixToRemove - tree prefix to strip\n * @returns the heirarchical tree\n */\nfunction buildHierarchy(\n\tflatTree: IWholeFlatSnapshotTree,\n\ttreePrefixToRemove: string,\n): ISnapshotTree {\n\tconst lookup: { [path: string]: ISnapshotTree } = {};\n\t// Root tree id will be used to determine which version was downloaded.\n\tconst root: ISnapshotTree = { id: flatTree.id, blobs: {}, trees: {} };\n\tlookup[\"\"] = root;\n\n\tfor (const entry of flatTree.entries) {\n\t\t// Strip the `treePrefixToRemove` path from tree entries such that they are stored under root.\n\t\tconst entryPath = entry.path.replace(new RegExp(`^${treePrefixToRemove}/`), \"\");\n\t\tconst lastIndex = entryPath.lastIndexOf(\"/\");\n\t\tconst entryPathDir = entryPath.slice(0, Math.max(0, lastIndex));\n\t\tconst entryPathBase = entryPath.slice(lastIndex + 1);\n\n\t\t// The flat output is breadth-first so we can assume we see tree nodes prior to their contents\n\t\tconst node = lookup[entryPathDir];\n\n\t\t// Add in either the blob or tree\n\t\tif (entry.type === \"tree\") {\n\t\t\tconst newTree: ISnapshotTree = {\n\t\t\t\tblobs: {},\n\t\t\t\ttrees: {},\n\t\t\t\t...(entry.unreferenced === undefined ? {} : { unreferenced: entry.unreferenced }),\n\t\t\t\t...(entry.groupId === undefined ? {} : { groupId: entry.groupId }),\n\t\t\t};\n\t\t\tnode.trees[decodeURIComponent(entryPathBase)] = newTree;\n\t\t\tlookup[entryPath] = newTree;\n\t\t} else if (entry.type === \"blob\") {\n\t\t\tnode.blobs[decodeURIComponent(entryPathBase)] = entry.id;\n\t\t} else {\n\t\t\tthrow new Error(`Unknown entry type!!`);\n\t\t}\n\t}\n\n\treturn root;\n}\n\n/**\n * Converts existing IWholeFlatSnapshot to snapshot tree, blob array, and sequence number.\n *\n * @param flatSnapshot - flat snapshot\n * @param treePrefixToRemove - tree prefix to strip. By default we are stripping \".app\" prefix\n * @returns snapshot tree, blob array, and sequence number\n */\nexport function convertWholeFlatSnapshotToSnapshotTreeAndBlobs(\n\tflatSnapshot: IWholeFlatSnapshot,\n\ttreePrefixToRemove: string = \".app\",\n): INormalizedWholeSnapshot {\n\tconst blobs = new Map<string, ArrayBuffer>();\n\tif (flatSnapshot.blobs) {\n\t\tfor (const blob of flatSnapshot.blobs) {\n\t\t\tblobs.set(blob.id, stringToBuffer(blob.content, blob.encoding ?? \"utf-8\"));\n\t\t}\n\t}\n\tconst flatSnapshotTree = flatSnapshot.trees?.[0];\n\tconst sequenceNumber = flatSnapshotTree?.sequenceNumber;\n\tconst snapshotTree = buildHierarchy(flatSnapshotTree, treePrefixToRemove);\n\n\treturn {\n\t\tblobs,\n\t\tsnapshotTree,\n\t\tsequenceNumber,\n\t\tid: flatSnapshot.id,\n\t};\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"restWrapper.d.ts","sourceRoot":"","sources":["../src/restWrapper.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,iCAAiC,CAAC;AAEhF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uCAAuC,CAAC;AAQzE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,0CAA0C,CAAC;AAUnF,OAAO,EAA0B,KAAK,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACrF,OAAO,KAAK,EAAE,aAAa,EAAqB,MAAM,eAAe,CAAC;AACtE,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAElE,KAAK,yBAAyB,GAAG,CAAC,KAAK,EAAE,cAAc,KAAK,MAAM,CAAC;AACnE,MAAM,MAAM,YAAY,GAAG,CAAC,OAAO,CAAC,EAAE,OAAO,KAAK,OAAO,CAAC,cAAc,CAAC,CAAC;AAkB1E,MAAM,WAAW,aAAa,CAAC,CAAC;IAC/B,OAAO,EAAE,CAAC,CAAC;IACX,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,UAAU,EAAE,wBAAwB,CAAC;IACrC,UAAU,EAAE,MAAM,CAAC;CACnB;AAED;;;;GAIG;AACH,wBAAgB,6BAA6B,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,GAAG,aAAa,CAAC,CAAC,CAAC,CAO7E;AAUD,wBAAgB,yBAAyB,CAAC,OAAO,EAAE;IAElD,GAAG,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,GAAG,IAAI,CAAC;CAC/C,GAAG,wBAAwB,CAwB3B;AAED,cAAM,wBAAyB,SAAQ,WAAW;IAahD,OAAO,CAAC,QAAQ,CAAC,WAAW;IAC5B,OAAO,CAAC,QAAQ,CAAC,mBAAmB;IACpC,OAAO,CAAC,QAAQ,CAAC,sBAAsB;IACvC,OAAO,CAAC,QAAQ,CAAC,WAAW;IAE5B,OAAO,CAAC,MAAM,CAAC;IAjBhB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAwB;IACjD,OAAO,CAAC,KAAK,CAA6B;IAE1C;;;;OAIG;IACH,OAAO,CAAC,QAAQ,CAAC,YAAY,CAA6B;gBAGzD,MAAM,EAAE,kBAAkB,EACT,WAAW,EAAE,WAAW,EACxB,mBAAmB,EAAE,YAAY,EACjC,sBAAsB,EAAE,yBAAyB,EACjD,WAAW,EAAE,OAAO,EACrC,OAAO,CAAC,EAAE,MAAM,EACR,MAAM,CAAC,
|
|
1
|
+
{"version":3,"file":"restWrapper.d.ts","sourceRoot":"","sources":["../src/restWrapper.ts"],"names":[],"mappings":"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"}
|
package/dist/restWrapper.js
CHANGED
|
@@ -7,7 +7,11 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
7
7
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
8
8
|
};
|
|
9
9
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
-
exports.
|
|
10
|
+
exports.RouterliciousOrdererRestWrapper = exports.RouterliciousStorageRestWrapper = void 0;
|
|
11
|
+
exports.createR11sResponseFromContent = createR11sResponseFromContent;
|
|
12
|
+
exports.getPropsToLogFromResponse = getPropsToLogFromResponse;
|
|
13
|
+
exports.toInstrumentedR11sOrdererTokenFetcher = toInstrumentedR11sOrdererTokenFetcher;
|
|
14
|
+
exports.toInstrumentedR11sStorageTokenFetcher = toInstrumentedR11sStorageTokenFetcher;
|
|
11
15
|
const client_utils_1 = require("@fluid-internal/client-utils");
|
|
12
16
|
const internal_1 = require("@fluidframework/core-utils/internal");
|
|
13
17
|
const internal_2 = require("@fluidframework/driver-utils/internal");
|
|
@@ -44,7 +48,6 @@ function createR11sResponseFromContent(content) {
|
|
|
44
48
|
requestUrl: "",
|
|
45
49
|
};
|
|
46
50
|
}
|
|
47
|
-
exports.createR11sResponseFromContent = createR11sResponseFromContent;
|
|
48
51
|
function headersToMap(headers) {
|
|
49
52
|
const newHeaders = new Map();
|
|
50
53
|
for (const [key, value] of headers.entries()) {
|
|
@@ -71,8 +74,20 @@ function getPropsToLogFromResponse(headers) {
|
|
|
71
74
|
}
|
|
72
75
|
return additionalProps;
|
|
73
76
|
}
|
|
74
|
-
exports.getPropsToLogFromResponse = getPropsToLogFromResponse;
|
|
75
77
|
class RouterliciousRestWrapper extends restWrapperBase_js_1.RestWrapper {
|
|
78
|
+
rateLimiter;
|
|
79
|
+
fetchRefreshedToken;
|
|
80
|
+
getAuthorizationHeader;
|
|
81
|
+
useRestLess;
|
|
82
|
+
tokenP;
|
|
83
|
+
restLess = new server_services_client_1.RestLessClient();
|
|
84
|
+
token;
|
|
85
|
+
/**
|
|
86
|
+
* A locally maintained map which saves the number of retries for any REST api call made through restWrapper.
|
|
87
|
+
* It uses the href of the request url as a key against which it saves the retry counts. Retries are only counted in case of failures.
|
|
88
|
+
* This feature is added to enable FRS to have more telemetry insights into whether the requests are being retried from same client or multiple.
|
|
89
|
+
*/
|
|
90
|
+
retryCounter = new Map();
|
|
76
91
|
constructor(logger, rateLimiter, fetchRefreshedToken, getAuthorizationHeader, useRestLess, baseurl, tokenP, defaultQueryString = {}) {
|
|
77
92
|
super(baseurl, defaultQueryString);
|
|
78
93
|
this.rateLimiter = rateLimiter;
|
|
@@ -80,13 +95,6 @@ class RouterliciousRestWrapper extends restWrapperBase_js_1.RestWrapper {
|
|
|
80
95
|
this.getAuthorizationHeader = getAuthorizationHeader;
|
|
81
96
|
this.useRestLess = useRestLess;
|
|
82
97
|
this.tokenP = tokenP;
|
|
83
|
-
this.restLess = new server_services_client_1.RestLessClient();
|
|
84
|
-
/**
|
|
85
|
-
* A locally maintained map which saves the number of retries for any REST api call made through restWrapper.
|
|
86
|
-
* It uses the href of the request url as a key against which it saves the retry counts. Retries are only counted in case of failures.
|
|
87
|
-
* This feature is added to enable FRS to have more telemetry insights into whether the requests are being retried from same client or multiple.
|
|
88
|
-
*/
|
|
89
|
-
this.retryCounter = new Map();
|
|
90
98
|
}
|
|
91
99
|
async request(requestConfig, statusCode, canRetry = true) {
|
|
92
100
|
if (requestConfig.params) {
|
|
@@ -272,7 +280,6 @@ function toInstrumentedR11sOrdererTokenFetcher(tenantId, documentId, tokenProvid
|
|
|
272
280
|
};
|
|
273
281
|
return fetchOrdererToken;
|
|
274
282
|
}
|
|
275
|
-
exports.toInstrumentedR11sOrdererTokenFetcher = toInstrumentedR11sOrdererTokenFetcher;
|
|
276
283
|
function toInstrumentedR11sStorageTokenFetcher(tenantId, documentId, tokenProvider, logger) {
|
|
277
284
|
const fetchStorageToken = async (refreshToken) => {
|
|
278
285
|
return internal_3.PerformanceEvent.timedExecAsync(logger, {
|
|
@@ -286,5 +293,4 @@ function toInstrumentedR11sStorageTokenFetcher(tenantId, documentId, tokenProvid
|
|
|
286
293
|
};
|
|
287
294
|
return fetchStorageToken;
|
|
288
295
|
}
|
|
289
|
-
exports.toInstrumentedR11sStorageTokenFetcher = toInstrumentedR11sStorageTokenFetcher;
|
|
290
296
|
//# sourceMappingURL=restWrapper.js.map
|
package/dist/restWrapper.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
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 */\n\nimport { performanceNow } from \"@fluid-internal/client-utils\";\nimport type { ITelemetryBaseProperties } from \"@fluidframework/core-interfaces\";\nimport { assert } from \"@fluidframework/core-utils/internal\";\nimport type { RateLimiter } from \"@fluidframework/driver-utils/internal\";\nimport { GenericNetworkError, NonRetryableError } from \"@fluidframework/driver-utils/internal\";\nimport {\n\tCorrelationIdHeaderName,\n\tDriverVersionHeaderName,\n\tRestLessClient,\n\tgetAuthorizationTokenFromCredentials,\n} from \"@fluidframework/server-services-client\";\nimport type { TelemetryLoggerExt } from \"@fluidframework/telemetry-utils/internal\";\nimport { PerformanceEvent, numberFromString } from \"@fluidframework/telemetry-utils/internal\";\nimport safeStringify from \"json-stringify-safe\";\n\nimport {\n\tgetUrlForTelemetry,\n\tRouterliciousErrorTypes,\n\tthrowR11sNetworkError,\n} from \"./errorUtils.js\";\nimport { pkgVersion as driverVersion } from \"./packageVersion.js\";\nimport { addOrUpdateQueryParams, type QueryStringType } from \"./queryStringUtils.js\";\nimport type { RequestConfig, RawRequestHeaders } from \"./request.cjs\";\nimport { RestWrapper } from \"./restWrapperBase.js\";\nimport type { ITokenProvider, ITokenResponse } from \"./tokens.js\";\n\ntype AuthorizationHeaderGetter = (token: ITokenResponse) => string;\nexport type TokenFetcher = (refresh?: boolean) => Promise<ITokenResponse>;\n\nconst buildRequestUrl = (requestConfig: RequestConfig): string =>\n\trequestConfig.baseURL === undefined\n\t\t? (requestConfig.url ?? \"\")\n\t\t: `${requestConfig.baseURL ?? \"\"}${requestConfig.url ?? \"\"}`;\n\nconst buildRequestInitConfig = (requestConfig: RequestConfig): RequestInit => {\n\tconst requestInit: RequestInit = {\n\t\t...(requestConfig.method === undefined ? {} : { method: requestConfig.method }),\n\t\t// NOTE: Although the RequestHeaders type permits non-string values in the header, here we are\n\t\t// guaranteed the requestConfig only has string values in its header.\n\t\theaders: requestConfig.headers as Record<string, string>,\n\t\tbody: requestConfig.data,\n\t};\n\treturn requestInit;\n};\n\nexport interface IR11sResponse<T> {\n\tcontent: T;\n\theaders: Map<string, string>;\n\tpropsToLog: ITelemetryBaseProperties;\n\trequestUrl: string;\n}\n\n/**\n * A utility function to create a Routerlicious response without any additional props as we might not have them always.\n * @param content - Response which is equivalent to content.\n * @returns A Routerlicious response without any extra props.\n */\nexport function createR11sResponseFromContent<T>(content: T): IR11sResponse<T> {\n\treturn {\n\t\tcontent,\n\t\theaders: new Map(),\n\t\tpropsToLog: {},\n\t\trequestUrl: \"\",\n\t};\n}\n\nfunction headersToMap(headers: Headers): Map<string, string> {\n\tconst newHeaders = new Map<string, string>();\n\tfor (const [key, value] of headers.entries()) {\n\t\tnewHeaders.set(key, value);\n\t}\n\treturn newHeaders;\n}\n\nexport function getPropsToLogFromResponse(headers: {\n\t// eslint-disable-next-line @rushstack/no-new-null\n\tget: (id: string) => string | undefined | null;\n}): ITelemetryBaseProperties {\n\tinterface LoggingHeader {\n\t\theaderName: string;\n\t\tlogName: string;\n\t}\n\n\t// We rename headers so that otel doesn't scrub them away. Otel doesn't allow\n\t// certain characters in headers including '-'\n\tconst headersToLog: LoggingHeader[] = [\n\t\t{ headerName: CorrelationIdHeaderName, logName: \"requestCorrelationId\" },\n\t\t{ headerName: \"content-encoding\", logName: \"contentEncoding\" },\n\t\t{ headerName: \"content-type\", logName: \"contentType\" },\n\t];\n\tconst additionalProps: ITelemetryBaseProperties = {\n\t\tcontentsize: numberFromString(headers.get(\"content-length\")),\n\t};\n\tfor (const header of headersToLog) {\n\t\tconst headerValue = headers.get(header.headerName);\n\t\tif (headerValue !== undefined && headerValue !== null) {\n\t\t\tadditionalProps[header.logName] = headerValue;\n\t\t}\n\t}\n\n\treturn additionalProps;\n}\n\nclass RouterliciousRestWrapper extends RestWrapper {\n\tprivate readonly restLess = new RestLessClient();\n\tprivate token: ITokenResponse | undefined;\n\n\t/**\n\t * A locally maintained map which saves the number of retries for any REST api call made through restWrapper.\n\t * It uses the href of the request url as a key against which it saves the retry counts. Retries are only counted in case of failures.\n\t * This feature is added to enable FRS to have more telemetry insights into whether the requests are being retried from same client or multiple.\n\t */\n\tprivate readonly retryCounter = new Map<string, number>();\n\n\tconstructor(\n\t\tlogger: TelemetryLoggerExt,\n\t\tprivate readonly rateLimiter: RateLimiter,\n\t\tprivate readonly fetchRefreshedToken: TokenFetcher,\n\t\tprivate readonly getAuthorizationHeader: AuthorizationHeaderGetter,\n\t\tprivate readonly useRestLess: boolean,\n\t\tbaseurl?: string,\n\t\tprivate tokenP?: Promise<ITokenResponse>,\n\t\tdefaultQueryString: QueryStringType = {},\n\t) {\n\t\tsuper(baseurl, defaultQueryString);\n\t}\n\n\tprotected async request<T>(\n\t\trequestConfig: RequestConfig,\n\t\tstatusCode: number,\n\t\tcanRetry = true,\n\t): Promise<IR11sResponse<T>> {\n\t\tif (requestConfig.params) {\n\t\t\t// delete the retry param, if any. We do this to ensure there is no retry added by any of callers, which would conflict with the one we maintain here in the retryCounter map.\n\t\t\tdelete requestConfig.params.retry;\n\t\t}\n\n\t\t// Build the complete request url including baseUrl, url and query params. (all except 'retry' query param)\n\t\tlet completeRequestUrl = addOrUpdateQueryParams(\n\t\t\tbuildRequestUrl(requestConfig),\n\t\t\trequestConfig.params ?? {},\n\t\t);\n\n\t\t// Check whether this request has been made before or if it is a retry.\n\t\t// requestKey is built using the HTTP method appended with the complete URL ommitting the 'retry' param\n\t\tconst requestKey = `${requestConfig.method ?? \"\"}|${completeRequestUrl.href}`;\n\t\tconst requestRetryCount = this.retryCounter.get(requestKey);\n\t\tif (requestRetryCount) {\n\t\t\tcompleteRequestUrl = addOrUpdateQueryParams(completeRequestUrl, {\n\t\t\t\tretry: requestRetryCount,\n\t\t\t});\n\t\t}\n\n\t\tconst config: RequestConfig = {\n\t\t\t...requestConfig,\n\t\t\theaders: await this.generateHeaders(requestConfig.headers),\n\t\t};\n\n\t\t// RestLessClient.translate() returns AxiosRequestConfig (from server-services-client),\n\t\t// which is structurally compatible with our RequestConfig type.\n\t\tconst translatedConfig: RequestConfig = this.useRestLess\n\t\t\t? (this.restLess.translate(config) as RequestConfig)\n\t\t\t: config;\n\t\tconst fetchRequestConfig = buildRequestInitConfig(translatedConfig);\n\n\t\tconst res = await this.rateLimiter.schedule(async () => {\n\t\t\tconst perfStart = performanceNow();\n\t\t\tconst result = await fetch(completeRequestUrl, fetchRequestConfig).catch(\n\t\t\t\tasync (error) => {\n\t\t\t\t\t// on failure, add the request entry into the retryCounter map to count the subsequent retries, if any\n\t\t\t\t\tthis.retryCounter.set(requestKey, requestRetryCount ? requestRetryCount + 1 : 1);\n\n\t\t\t\t\tconst telemetryProps = {\n\t\t\t\t\t\tdriverVersion,\n\t\t\t\t\t\tretryCount: requestRetryCount,\n\t\t\t\t\t\turl: getUrlForTelemetry(completeRequestUrl.hostname, completeRequestUrl.pathname),\n\t\t\t\t\t\trequestMethod: fetchRequestConfig.method,\n\t\t\t\t\t};\n\n\t\t\t\t\t// Browser Fetch throws a TypeError on network error, `node-fetch` throws a FetchError\n\t\t\t\t\tconst isNetworkError = [\"TypeError\", \"FetchError\"].includes(error?.name);\n\t\t\t\t\tconst errorMessage = isNetworkError\n\t\t\t\t\t\t? `NetworkError: ${error.message}`\n\t\t\t\t\t\t: safeStringify(error);\n\t\t\t\t\t// If a service is temporarily down or a browser resource limit is reached, RestWrapper will throw\n\t\t\t\t\t// a network error with no status code (e.g. err:ERR_CONN_REFUSED or err:ERR_FAILED) and\n\t\t\t\t\t// the error message will start with NetworkError as defined in restWrapper.ts\n\t\t\t\t\t// If there exists a self-signed SSL certificates error, throw a NonRetryableError\n\t\t\t\t\t// TODO: instead of relying on string matching, filter error based on the error code like we do for websocket connections\n\t\t\t\t\tconst err = errorMessage.includes(\"failed, reason: self signed certificate\")\n\t\t\t\t\t\t? new NonRetryableError(\n\t\t\t\t\t\t\t\terrorMessage,\n\t\t\t\t\t\t\t\tRouterliciousErrorTypes.sslCertError,\n\t\t\t\t\t\t\t\ttelemetryProps,\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t: new GenericNetworkError(\n\t\t\t\t\t\t\t\terrorMessage,\n\t\t\t\t\t\t\t\terrorMessage.startsWith(\"NetworkError\"),\n\t\t\t\t\t\t\t\ttelemetryProps,\n\t\t\t\t\t\t\t);\n\t\t\t\t\tthrow err;\n\t\t\t\t},\n\t\t\t);\n\t\t\treturn {\n\t\t\t\tresponse: result,\n\t\t\t\tduration: performanceNow() - perfStart,\n\t\t\t};\n\t\t});\n\n\t\tconst response = res.response;\n\t\tconst headers = headersToMap(response.headers);\n\n\t\tlet start = performanceNow();\n\t\tconst text = await response.text();\n\t\tconst receiveContentTime = performanceNow() - start;\n\n\t\tconst bodySize = text.length;\n\t\tstart = performanceNow();\n\t\tconst responseBody: any = response.headers\n\t\t\t.get(\"content-type\")\n\t\t\t?.includes(\"application/json\")\n\t\t\t? JSON.parse(text)\n\t\t\t: text;\n\t\tconst parseTime = performanceNow() - start;\n\n\t\t// Success\n\t\tif (response.ok || response.status === statusCode) {\n\t\t\t// on successful response, remove the entry from the retryCounter map\n\t\t\tthis.retryCounter.delete(requestKey);\n\t\t\tconst result = responseBody as T;\n\t\t\treturn {\n\t\t\t\tcontent: result,\n\t\t\t\theaders,\n\t\t\t\trequestUrl: completeRequestUrl.href,\n\t\t\t\tpropsToLog: {\n\t\t\t\t\t...getPropsToLogFromResponse(headers),\n\t\t\t\t\tbodySize,\n\t\t\t\t\treceiveContentTime,\n\t\t\t\t\tparseTime,\n\t\t\t\t\tfetchTime: res.duration,\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\n\t\t// Failure\n\t\t// on failure, add the request entry into the retryCounter map to count the subsequent retries\n\t\tthis.retryCounter.set(requestKey, requestRetryCount ? requestRetryCount + 1 : 1);\n\n\t\tif (response.status === 401 && canRetry) {\n\t\t\t// Refresh Authorization header and retry once\n\t\t\tthis.token = await this.fetchRefreshedToken(true /* refreshToken */);\n\t\t\treturn this.request<T>({ ...config }, statusCode, false);\n\t\t}\n\t\tif (response.status === 429 && responseBody?.retryAfter > 0) {\n\t\t\t// Retry based on retryAfter[Seconds]\n\t\t\treturn new Promise<IR11sResponse<T>>((resolve, reject) =>\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t// use the original request URL without the retryCount appended\n\t\t\t\t\tthis.request<T>({ ...config }, statusCode)\n\t\t\t\t\t\t.then(resolve)\n\t\t\t\t\t\t.catch(reject);\n\t\t\t\t}, responseBody.retryAfter * 1000),\n\t\t\t);\n\t\t}\n\n\t\tconst responseSummary =\n\t\t\tresponseBody === undefined\n\t\t\t\t? response.statusText\n\t\t\t\t: typeof responseBody === \"string\"\n\t\t\t\t\t? responseBody\n\t\t\t\t\t: safeStringify(responseBody);\n\t\tthrowR11sNetworkError(\n\t\t\t`R11s fetch error: ${responseSummary}`,\n\t\t\tresponse.status,\n\t\t\tresponseBody?.retryAfter,\n\t\t\t{\n\t\t\t\t...getPropsToLogFromResponse(headers),\n\t\t\t\tdriverVersion,\n\t\t\t\turl: getUrlForTelemetry(completeRequestUrl.hostname, completeRequestUrl.pathname),\n\t\t\t\trequestMethod: fetchRequestConfig.method,\n\t\t\t},\n\t\t);\n\t}\n\n\tprivate async generateHeaders(\n\t\trequestHeaders?: RawRequestHeaders | undefined,\n\t): Promise<RawRequestHeaders> {\n\t\tconst token = await this.getToken();\n\t\tassert(token !== undefined, 0x679 /* token should be present */);\n\t\tconst headers: RawRequestHeaders = {\n\t\t\t...requestHeaders,\n\t\t\t[DriverVersionHeaderName]: driverVersion,\n\t\t\t// NOTE: If this.authorizationHeader is undefined, should \"Authorization\" be removed entirely?\n\t\t\tAuthorization: this.getAuthorizationHeader(token),\n\t\t};\n\t\treturn headers;\n\t}\n\n\tpublic async getToken(): Promise<ITokenResponse> {\n\t\tif (this.token !== undefined) {\n\t\t\treturn this.token;\n\t\t}\n\t\tconst token = await (this.tokenP ?? this.fetchRefreshedToken());\n\t\tthis.setToken(token);\n\t\tthis.tokenP = undefined;\n\t\treturn token;\n\t}\n\n\tpublic setToken(token: ITokenResponse): void {\n\t\tthis.token = token;\n\t}\n}\n\nexport class RouterliciousStorageRestWrapper extends RouterliciousRestWrapper {\n\tprivate constructor(\n\t\tlogger: TelemetryLoggerExt,\n\t\trateLimiter: RateLimiter,\n\t\tfetchToken: TokenFetcher,\n\t\tgetAuthorizationHeader: AuthorizationHeaderGetter,\n\t\tuseRestLess: boolean,\n\t\tbaseurl?: string,\n\t\tinitialTokenP?: Promise<ITokenResponse>,\n\t\tdefaultQueryString: QueryStringType = {},\n\t) {\n\t\tsuper(\n\t\t\tlogger,\n\t\t\trateLimiter,\n\t\t\tfetchToken,\n\t\t\tgetAuthorizationHeader,\n\t\t\tuseRestLess,\n\t\t\tbaseurl,\n\t\t\tinitialTokenP,\n\t\t\tdefaultQueryString,\n\t\t);\n\t}\n\n\tpublic static load(\n\t\ttenantId: string,\n\t\ttokenFetcher: TokenFetcher,\n\t\tlogger: TelemetryLoggerExt,\n\t\trateLimiter: RateLimiter,\n\t\tuseRestLess: boolean,\n\t\tbaseurl?: string,\n\t\tinitialTokenP?: Promise<ITokenResponse>,\n\t): RouterliciousStorageRestWrapper {\n\t\tconst defaultQueryString = {};\n\n\t\tconst getAuthorizationHeader: AuthorizationHeaderGetter = (\n\t\t\ttoken: ITokenResponse,\n\t\t): string => {\n\t\t\tconst credentials = {\n\t\t\t\tpassword: token.jwt,\n\t\t\t\tuser: tenantId,\n\t\t\t};\n\t\t\treturn getAuthorizationTokenFromCredentials(credentials);\n\t\t};\n\n\t\tconst restWrapper = new RouterliciousStorageRestWrapper(\n\t\t\tlogger,\n\t\t\trateLimiter,\n\t\t\ttokenFetcher,\n\t\t\tgetAuthorizationHeader,\n\t\t\tuseRestLess,\n\t\t\tbaseurl,\n\t\t\tinitialTokenP,\n\t\t\tdefaultQueryString,\n\t\t);\n\n\t\treturn restWrapper;\n\t}\n}\n\nexport class RouterliciousOrdererRestWrapper extends RouterliciousRestWrapper {\n\tprivate constructor(\n\t\tlogger: TelemetryLoggerExt,\n\t\trateLimiter: RateLimiter,\n\t\tfetchToken: TokenFetcher,\n\t\tgetAuthorizationHeader: AuthorizationHeaderGetter,\n\t\tuseRestLess: boolean,\n\t\tbaseurl?: string,\n\t\tinitialTokenP?: Promise<ITokenResponse>,\n\t\tdefaultQueryString: QueryStringType = {},\n\t) {\n\t\tsuper(\n\t\t\tlogger,\n\t\t\trateLimiter,\n\t\t\tfetchToken,\n\t\t\tgetAuthorizationHeader,\n\t\t\tuseRestLess,\n\t\t\tbaseurl,\n\t\t\tinitialTokenP,\n\t\t\tdefaultQueryString,\n\t\t);\n\t}\n\n\tpublic static load(\n\t\ttokenFetcher: TokenFetcher,\n\t\tlogger: TelemetryLoggerExt,\n\t\trateLimiter: RateLimiter,\n\t\tuseRestLess: boolean,\n\t\tbaseurl?: string,\n\t\tinitialTokenP?: Promise<ITokenResponse>,\n\t): RouterliciousOrdererRestWrapper {\n\t\tconst getAuthorizationHeader: AuthorizationHeaderGetter = (\n\t\t\ttoken: ITokenResponse,\n\t\t): string => {\n\t\t\treturn `Basic ${token.jwt}`;\n\t\t};\n\n\t\tconst restWrapper = new RouterliciousOrdererRestWrapper(\n\t\t\tlogger,\n\t\t\trateLimiter,\n\t\t\ttokenFetcher,\n\t\t\tgetAuthorizationHeader,\n\t\t\tuseRestLess,\n\t\t\tbaseurl,\n\t\t\tinitialTokenP,\n\t\t);\n\n\t\treturn restWrapper;\n\t}\n}\n\nexport function toInstrumentedR11sOrdererTokenFetcher(\n\ttenantId: string,\n\tdocumentId: string | undefined,\n\ttokenProvider: ITokenProvider,\n\tlogger: TelemetryLoggerExt,\n): TokenFetcher {\n\tconst fetchOrdererToken = async (refreshToken?: boolean): Promise<ITokenResponse> => {\n\t\treturn PerformanceEvent.timedExecAsync(\n\t\t\tlogger,\n\t\t\t{\n\t\t\t\teventName: \"FetchOrdererToken\",\n\t\t\t\tdocId: documentId,\n\t\t\t},\n\t\t\tasync () => {\n\t\t\t\tconst ordererToken = await tokenProvider.fetchOrdererToken(\n\t\t\t\t\ttenantId,\n\t\t\t\t\tdocumentId,\n\t\t\t\t\trefreshToken,\n\t\t\t\t);\n\n\t\t\t\treturn ordererToken;\n\t\t\t},\n\t\t);\n\t};\n\treturn fetchOrdererToken;\n}\n\nexport function toInstrumentedR11sStorageTokenFetcher(\n\ttenantId: string,\n\tdocumentId: string,\n\ttokenProvider: ITokenProvider,\n\tlogger: TelemetryLoggerExt,\n): TokenFetcher {\n\tconst fetchStorageToken = async (refreshToken?: boolean): Promise<ITokenResponse> => {\n\t\treturn PerformanceEvent.timedExecAsync(\n\t\t\tlogger,\n\t\t\t{\n\t\t\t\teventName: \"FetchStorageToken\",\n\t\t\t\tdocId: documentId,\n\t\t\t},\n\t\t\tasync () => {\n\t\t\t\t// Craft credentials using tenant id and token\n\t\t\t\tconst storageToken = await tokenProvider.fetchStorageToken(\n\t\t\t\t\ttenantId,\n\t\t\t\t\tdocumentId,\n\t\t\t\t\trefreshToken,\n\t\t\t\t);\n\n\t\t\t\treturn storageToken;\n\t\t\t},\n\t\t);\n\t};\n\treturn fetchStorageToken;\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 */\n\nimport { performanceNow } from \"@fluid-internal/client-utils\";\nimport type { ITelemetryBaseProperties } from \"@fluidframework/core-interfaces\";\nimport { assert } from \"@fluidframework/core-utils/internal\";\nimport type { RateLimiter } from \"@fluidframework/driver-utils/internal\";\nimport { GenericNetworkError, NonRetryableError } from \"@fluidframework/driver-utils/internal\";\nimport {\n\tCorrelationIdHeaderName,\n\tDriverVersionHeaderName,\n\tRestLessClient,\n\tgetAuthorizationTokenFromCredentials,\n} from \"@fluidframework/server-services-client\";\nimport type { TelemetryLoggerExt } from \"@fluidframework/telemetry-utils/internal\";\nimport { PerformanceEvent, numberFromString } from \"@fluidframework/telemetry-utils/internal\";\nimport safeStringify from \"json-stringify-safe\";\n\nimport {\n\tgetUrlForTelemetry,\n\tRouterliciousErrorTypes,\n\tthrowR11sNetworkError,\n} from \"./errorUtils.js\";\nimport { pkgVersion as driverVersion } from \"./packageVersion.js\";\nimport { addOrUpdateQueryParams, type QueryStringType } from \"./queryStringUtils.js\";\nimport type { RequestConfig, RawRequestHeaders } from \"./request.cjs\";\nimport { RestWrapper } from \"./restWrapperBase.js\";\nimport type { ITokenProvider, ITokenResponse } from \"./tokens.js\";\n\ntype AuthorizationHeaderGetter = (token: ITokenResponse) => string;\nexport type TokenFetcher = (refresh?: boolean) => Promise<ITokenResponse>;\n\nconst buildRequestUrl = (requestConfig: RequestConfig): string =>\n\trequestConfig.baseURL === undefined\n\t\t? (requestConfig.url ?? \"\")\n\t\t: `${requestConfig.baseURL ?? \"\"}${requestConfig.url ?? \"\"}`;\n\nconst buildRequestInitConfig = (requestConfig: RequestConfig): RequestInit => {\n\tconst requestInit: RequestInit = {\n\t\t...(requestConfig.method === undefined ? {} : { method: requestConfig.method }),\n\t\t// NOTE: Although the RequestHeaders type permits non-string values in the header, here we are\n\t\t// guaranteed the requestConfig only has string values in its header.\n\t\theaders: requestConfig.headers as Record<string, string>,\n\t\tbody: requestConfig.data,\n\t};\n\treturn requestInit;\n};\n\nexport interface IR11sResponse<T> {\n\tcontent: T;\n\theaders: Map<string, string>;\n\tpropsToLog: ITelemetryBaseProperties;\n\trequestUrl: string;\n}\n\n/**\n * A utility function to create a Routerlicious response without any additional props as we might not have them always.\n * @param content - Response which is equivalent to content.\n * @returns A Routerlicious response without any extra props.\n */\nexport function createR11sResponseFromContent<T>(content: T): IR11sResponse<T> {\n\treturn {\n\t\tcontent,\n\t\theaders: new Map(),\n\t\tpropsToLog: {},\n\t\trequestUrl: \"\",\n\t};\n}\n\nfunction headersToMap(headers: Headers): Map<string, string> {\n\tconst newHeaders = new Map<string, string>();\n\tfor (const [key, value] of headers.entries()) {\n\t\tnewHeaders.set(key, value);\n\t}\n\treturn newHeaders;\n}\n\nexport function getPropsToLogFromResponse(headers: {\n\t// eslint-disable-next-line @rushstack/no-new-null\n\tget: (id: string) => string | undefined | null;\n}): ITelemetryBaseProperties {\n\tinterface LoggingHeader {\n\t\theaderName: string;\n\t\tlogName: string;\n\t}\n\n\t// We rename headers so that otel doesn't scrub them away. Otel doesn't allow\n\t// certain characters in headers including '-'\n\tconst headersToLog: LoggingHeader[] = [\n\t\t{ headerName: CorrelationIdHeaderName, logName: \"requestCorrelationId\" },\n\t\t{ headerName: \"content-encoding\", logName: \"contentEncoding\" },\n\t\t{ headerName: \"content-type\", logName: \"contentType\" },\n\t];\n\tconst additionalProps: ITelemetryBaseProperties = {\n\t\tcontentsize: numberFromString(headers.get(\"content-length\")),\n\t};\n\tfor (const header of headersToLog) {\n\t\tconst headerValue = headers.get(header.headerName);\n\t\tif (headerValue !== undefined && headerValue !== null) {\n\t\t\tadditionalProps[header.logName] = headerValue;\n\t\t}\n\t}\n\n\treturn additionalProps;\n}\n\nclass RouterliciousRestWrapper extends RestWrapper {\n\tprivate readonly restLess = new RestLessClient();\n\tprivate token: ITokenResponse | undefined;\n\n\t/**\n\t * A locally maintained map which saves the number of retries for any REST api call made through restWrapper.\n\t * It uses the href of the request url as a key against which it saves the retry counts. Retries are only counted in case of failures.\n\t * This feature is added to enable FRS to have more telemetry insights into whether the requests are being retried from same client or multiple.\n\t */\n\tprivate readonly retryCounter = new Map<string, number>();\n\n\tconstructor(\n\t\tlogger: TelemetryLoggerExt,\n\t\tprivate readonly rateLimiter: RateLimiter,\n\t\tprivate readonly fetchRefreshedToken: TokenFetcher,\n\t\tprivate readonly getAuthorizationHeader: AuthorizationHeaderGetter,\n\t\tprivate readonly useRestLess: boolean,\n\t\tbaseurl?: string,\n\t\tprivate tokenP?: Promise<ITokenResponse>,\n\t\tdefaultQueryString: QueryStringType = {},\n\t) {\n\t\tsuper(baseurl, defaultQueryString);\n\t}\n\n\tprotected async request<T>(\n\t\trequestConfig: RequestConfig,\n\t\tstatusCode: number,\n\t\tcanRetry = true,\n\t): Promise<IR11sResponse<T>> {\n\t\tif (requestConfig.params) {\n\t\t\t// delete the retry param, if any. We do this to ensure there is no retry added by any of callers, which would conflict with the one we maintain here in the retryCounter map.\n\t\t\tdelete requestConfig.params.retry;\n\t\t}\n\n\t\t// Build the complete request url including baseUrl, url and query params. (all except 'retry' query param)\n\t\tlet completeRequestUrl = addOrUpdateQueryParams(\n\t\t\tbuildRequestUrl(requestConfig),\n\t\t\trequestConfig.params ?? {},\n\t\t);\n\n\t\t// Check whether this request has been made before or if it is a retry.\n\t\t// requestKey is built using the HTTP method appended with the complete URL ommitting the 'retry' param\n\t\tconst requestKey = `${requestConfig.method ?? \"\"}|${completeRequestUrl.href}`;\n\t\tconst requestRetryCount = this.retryCounter.get(requestKey);\n\t\tif (requestRetryCount) {\n\t\t\tcompleteRequestUrl = addOrUpdateQueryParams(completeRequestUrl, {\n\t\t\t\tretry: requestRetryCount,\n\t\t\t});\n\t\t}\n\n\t\tconst config: RequestConfig = {\n\t\t\t...requestConfig,\n\t\t\theaders: await this.generateHeaders(requestConfig.headers),\n\t\t};\n\n\t\t// RestLessClient.translate() returns AxiosRequestConfig (from server-services-client),\n\t\t// which is structurally compatible with our RequestConfig type.\n\t\tconst translatedConfig: RequestConfig = this.useRestLess\n\t\t\t? (this.restLess.translate(config) as RequestConfig)\n\t\t\t: config;\n\t\tconst fetchRequestConfig = buildRequestInitConfig(translatedConfig);\n\n\t\tconst res = await this.rateLimiter.schedule(async () => {\n\t\t\tconst perfStart = performanceNow();\n\t\t\tconst result = await fetch(completeRequestUrl, fetchRequestConfig).catch(\n\t\t\t\tasync (error) => {\n\t\t\t\t\t// on failure, add the request entry into the retryCounter map to count the subsequent retries, if any\n\t\t\t\t\tthis.retryCounter.set(requestKey, requestRetryCount ? requestRetryCount + 1 : 1);\n\n\t\t\t\t\tconst telemetryProps = {\n\t\t\t\t\t\tdriverVersion,\n\t\t\t\t\t\tretryCount: requestRetryCount,\n\t\t\t\t\t\turl: getUrlForTelemetry(completeRequestUrl.hostname, completeRequestUrl.pathname),\n\t\t\t\t\t\trequestMethod: fetchRequestConfig.method,\n\t\t\t\t\t};\n\n\t\t\t\t\t// Browser Fetch throws a TypeError on network error, `node-fetch` throws a FetchError\n\t\t\t\t\tconst isNetworkError = [\"TypeError\", \"FetchError\"].includes(error?.name);\n\t\t\t\t\tconst errorMessage = isNetworkError\n\t\t\t\t\t\t? `NetworkError: ${error.message}`\n\t\t\t\t\t\t: safeStringify(error);\n\t\t\t\t\t// If a service is temporarily down or a browser resource limit is reached, RestWrapper will throw\n\t\t\t\t\t// a network error with no status code (e.g. err:ERR_CONN_REFUSED or err:ERR_FAILED) and\n\t\t\t\t\t// the error message will start with NetworkError as defined in restWrapper.ts\n\t\t\t\t\t// If there exists a self-signed SSL certificates error, throw a NonRetryableError\n\t\t\t\t\t// TODO: instead of relying on string matching, filter error based on the error code like we do for websocket connections\n\t\t\t\t\tconst err = errorMessage.includes(\"failed, reason: self signed certificate\")\n\t\t\t\t\t\t? new NonRetryableError(\n\t\t\t\t\t\t\t\terrorMessage,\n\t\t\t\t\t\t\t\tRouterliciousErrorTypes.sslCertError,\n\t\t\t\t\t\t\t\ttelemetryProps,\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t: new GenericNetworkError(\n\t\t\t\t\t\t\t\terrorMessage,\n\t\t\t\t\t\t\t\terrorMessage.startsWith(\"NetworkError\"),\n\t\t\t\t\t\t\t\ttelemetryProps,\n\t\t\t\t\t\t\t);\n\t\t\t\t\tthrow err;\n\t\t\t\t},\n\t\t\t);\n\t\t\treturn {\n\t\t\t\tresponse: result,\n\t\t\t\tduration: performanceNow() - perfStart,\n\t\t\t};\n\t\t});\n\n\t\tconst response = res.response;\n\t\tconst headers = headersToMap(response.headers);\n\n\t\tlet start = performanceNow();\n\t\tconst text = await response.text();\n\t\tconst receiveContentTime = performanceNow() - start;\n\n\t\tconst bodySize = text.length;\n\t\tstart = performanceNow();\n\t\tconst responseBody: any = response.headers\n\t\t\t.get(\"content-type\")\n\t\t\t?.includes(\"application/json\")\n\t\t\t? JSON.parse(text)\n\t\t\t: text;\n\t\tconst parseTime = performanceNow() - start;\n\n\t\t// Success\n\t\tif (response.ok || response.status === statusCode) {\n\t\t\t// on successful response, remove the entry from the retryCounter map\n\t\t\tthis.retryCounter.delete(requestKey);\n\t\t\tconst result = responseBody as T;\n\t\t\treturn {\n\t\t\t\tcontent: result,\n\t\t\t\theaders,\n\t\t\t\trequestUrl: completeRequestUrl.href,\n\t\t\t\tpropsToLog: {\n\t\t\t\t\t...getPropsToLogFromResponse(headers),\n\t\t\t\t\tbodySize,\n\t\t\t\t\treceiveContentTime,\n\t\t\t\t\tparseTime,\n\t\t\t\t\tfetchTime: res.duration,\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\n\t\t// Failure\n\t\t// on failure, add the request entry into the retryCounter map to count the subsequent retries\n\t\tthis.retryCounter.set(requestKey, requestRetryCount ? requestRetryCount + 1 : 1);\n\n\t\tif (response.status === 401 && canRetry) {\n\t\t\t// Refresh Authorization header and retry once\n\t\t\tthis.token = await this.fetchRefreshedToken(true /* refreshToken */);\n\t\t\treturn this.request<T>({ ...config }, statusCode, false);\n\t\t}\n\t\tif (response.status === 429 && responseBody?.retryAfter > 0) {\n\t\t\t// Retry based on retryAfter[Seconds]\n\t\t\treturn new Promise<IR11sResponse<T>>((resolve, reject) =>\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t// use the original request URL without the retryCount appended\n\t\t\t\t\tthis.request<T>({ ...config }, statusCode)\n\t\t\t\t\t\t.then(resolve)\n\t\t\t\t\t\t.catch(reject);\n\t\t\t\t}, responseBody.retryAfter * 1000),\n\t\t\t);\n\t\t}\n\n\t\tconst responseSummary =\n\t\t\tresponseBody === undefined\n\t\t\t\t? response.statusText\n\t\t\t\t: typeof responseBody === \"string\"\n\t\t\t\t\t? responseBody\n\t\t\t\t\t: safeStringify(responseBody);\n\t\tthrowR11sNetworkError(\n\t\t\t`R11s fetch error: ${responseSummary}`,\n\t\t\tresponse.status,\n\t\t\tresponseBody?.retryAfter,\n\t\t\t{\n\t\t\t\t...getPropsToLogFromResponse(headers),\n\t\t\t\tdriverVersion,\n\t\t\t\turl: getUrlForTelemetry(completeRequestUrl.hostname, completeRequestUrl.pathname),\n\t\t\t\trequestMethod: fetchRequestConfig.method,\n\t\t\t},\n\t\t);\n\t}\n\n\tprivate async generateHeaders(\n\t\trequestHeaders?: RawRequestHeaders | undefined,\n\t): Promise<RawRequestHeaders> {\n\t\tconst token = await this.getToken();\n\t\tassert(token !== undefined, 0x679 /* token should be present */);\n\t\tconst headers: RawRequestHeaders = {\n\t\t\t...requestHeaders,\n\t\t\t[DriverVersionHeaderName]: driverVersion,\n\t\t\t// NOTE: If this.authorizationHeader is undefined, should \"Authorization\" be removed entirely?\n\t\t\tAuthorization: this.getAuthorizationHeader(token),\n\t\t};\n\t\treturn headers;\n\t}\n\n\tpublic async getToken(): Promise<ITokenResponse> {\n\t\tif (this.token !== undefined) {\n\t\t\treturn this.token;\n\t\t}\n\t\tconst token = await (this.tokenP ?? this.fetchRefreshedToken());\n\t\tthis.setToken(token);\n\t\tthis.tokenP = undefined;\n\t\treturn token;\n\t}\n\n\tpublic setToken(token: ITokenResponse): void {\n\t\tthis.token = token;\n\t}\n}\n\nexport class RouterliciousStorageRestWrapper extends RouterliciousRestWrapper {\n\tprivate constructor(\n\t\tlogger: TelemetryLoggerExt,\n\t\trateLimiter: RateLimiter,\n\t\tfetchToken: TokenFetcher,\n\t\tgetAuthorizationHeader: AuthorizationHeaderGetter,\n\t\tuseRestLess: boolean,\n\t\tbaseurl?: string,\n\t\tinitialTokenP?: Promise<ITokenResponse>,\n\t\tdefaultQueryString: QueryStringType = {},\n\t) {\n\t\tsuper(\n\t\t\tlogger,\n\t\t\trateLimiter,\n\t\t\tfetchToken,\n\t\t\tgetAuthorizationHeader,\n\t\t\tuseRestLess,\n\t\t\tbaseurl,\n\t\t\tinitialTokenP,\n\t\t\tdefaultQueryString,\n\t\t);\n\t}\n\n\tpublic static load(\n\t\ttenantId: string,\n\t\ttokenFetcher: TokenFetcher,\n\t\tlogger: TelemetryLoggerExt,\n\t\trateLimiter: RateLimiter,\n\t\tuseRestLess: boolean,\n\t\tbaseurl?: string,\n\t\tinitialTokenP?: Promise<ITokenResponse>,\n\t): RouterliciousStorageRestWrapper {\n\t\tconst defaultQueryString = {};\n\n\t\tconst getAuthorizationHeader: AuthorizationHeaderGetter = (\n\t\t\ttoken: ITokenResponse,\n\t\t): string => {\n\t\t\tconst credentials = {\n\t\t\t\tpassword: token.jwt,\n\t\t\t\tuser: tenantId,\n\t\t\t};\n\t\t\treturn getAuthorizationTokenFromCredentials(credentials);\n\t\t};\n\n\t\tconst restWrapper = new RouterliciousStorageRestWrapper(\n\t\t\tlogger,\n\t\t\trateLimiter,\n\t\t\ttokenFetcher,\n\t\t\tgetAuthorizationHeader,\n\t\t\tuseRestLess,\n\t\t\tbaseurl,\n\t\t\tinitialTokenP,\n\t\t\tdefaultQueryString,\n\t\t);\n\n\t\treturn restWrapper;\n\t}\n}\n\nexport class RouterliciousOrdererRestWrapper extends RouterliciousRestWrapper {\n\tprivate constructor(\n\t\tlogger: TelemetryLoggerExt,\n\t\trateLimiter: RateLimiter,\n\t\tfetchToken: TokenFetcher,\n\t\tgetAuthorizationHeader: AuthorizationHeaderGetter,\n\t\tuseRestLess: boolean,\n\t\tbaseurl?: string,\n\t\tinitialTokenP?: Promise<ITokenResponse>,\n\t\tdefaultQueryString: QueryStringType = {},\n\t) {\n\t\tsuper(\n\t\t\tlogger,\n\t\t\trateLimiter,\n\t\t\tfetchToken,\n\t\t\tgetAuthorizationHeader,\n\t\t\tuseRestLess,\n\t\t\tbaseurl,\n\t\t\tinitialTokenP,\n\t\t\tdefaultQueryString,\n\t\t);\n\t}\n\n\tpublic static load(\n\t\ttokenFetcher: TokenFetcher,\n\t\tlogger: TelemetryLoggerExt,\n\t\trateLimiter: RateLimiter,\n\t\tuseRestLess: boolean,\n\t\tbaseurl?: string,\n\t\tinitialTokenP?: Promise<ITokenResponse>,\n\t): RouterliciousOrdererRestWrapper {\n\t\tconst getAuthorizationHeader: AuthorizationHeaderGetter = (\n\t\t\ttoken: ITokenResponse,\n\t\t): string => {\n\t\t\treturn `Basic ${token.jwt}`;\n\t\t};\n\n\t\tconst restWrapper = new RouterliciousOrdererRestWrapper(\n\t\t\tlogger,\n\t\t\trateLimiter,\n\t\t\ttokenFetcher,\n\t\t\tgetAuthorizationHeader,\n\t\t\tuseRestLess,\n\t\t\tbaseurl,\n\t\t\tinitialTokenP,\n\t\t);\n\n\t\treturn restWrapper;\n\t}\n}\n\nexport function toInstrumentedR11sOrdererTokenFetcher(\n\ttenantId: string,\n\tdocumentId: string | undefined,\n\ttokenProvider: ITokenProvider,\n\tlogger: TelemetryLoggerExt,\n): TokenFetcher {\n\tconst fetchOrdererToken = async (refreshToken?: boolean): Promise<ITokenResponse> => {\n\t\treturn PerformanceEvent.timedExecAsync(\n\t\t\tlogger,\n\t\t\t{\n\t\t\t\teventName: \"FetchOrdererToken\",\n\t\t\t\tdocId: documentId,\n\t\t\t},\n\t\t\tasync () => {\n\t\t\t\tconst ordererToken = await tokenProvider.fetchOrdererToken(\n\t\t\t\t\ttenantId,\n\t\t\t\t\tdocumentId,\n\t\t\t\t\trefreshToken,\n\t\t\t\t);\n\n\t\t\t\treturn ordererToken;\n\t\t\t},\n\t\t);\n\t};\n\treturn fetchOrdererToken;\n}\n\nexport function toInstrumentedR11sStorageTokenFetcher(\n\ttenantId: string,\n\tdocumentId: string,\n\ttokenProvider: ITokenProvider,\n\tlogger: TelemetryLoggerExt,\n): TokenFetcher {\n\tconst fetchStorageToken = async (refreshToken?: boolean): Promise<ITokenResponse> => {\n\t\treturn PerformanceEvent.timedExecAsync(\n\t\t\tlogger,\n\t\t\t{\n\t\t\t\teventName: \"FetchStorageToken\",\n\t\t\t\tdocId: documentId,\n\t\t\t},\n\t\t\tasync () => {\n\t\t\t\t// Craft credentials using tenant id and token\n\t\t\t\tconst storageToken = await tokenProvider.fetchStorageToken(\n\t\t\t\t\ttenantId,\n\t\t\t\t\tdocumentId,\n\t\t\t\t\trefreshToken,\n\t\t\t\t);\n\n\t\t\t\treturn storageToken;\n\t\t\t},\n\t\t);\n\t};\n\treturn fetchStorageToken;\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"restWrapperBase.d.ts","sourceRoot":"","sources":["../src/restWrapperBase.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AACnE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEtD,8BAAsB,WAAW;IAE/B,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"restWrapperBase.d.ts","sourceRoot":"","sources":["../src/restWrapperBase.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AACnE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEtD,8BAAsB,WAAW;IAE/B,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM;IACnC,SAAS,CAAC,kBAAkB,EAAE,eAAe;IAC7C,SAAS,CAAC,QAAQ,CAAC,aAAa;IAChC,SAAS,CAAC,QAAQ,CAAC,gBAAgB;gBAHhB,OAAO,CAAC,EAAE,MAAM,YAAA,EACzB,kBAAkB,GAAE,eAAoB,EAC/B,aAAa,SAAqB,EAClC,gBAAgB,SAAqB;IAGzD;;;;;;;OAOG;IACU,GAAG,CAAC,CAAC,EACjB,GAAG,EAAE,MAAM,EACX,WAAW,CAAC,EAAE,eAAe,EAC7B,OAAO,CAAC,EAAE,cAAc,EACxB,iBAAiB,CAAC,EAAE,OAAO,CAC1B,IAAI,CACH,aAAa,EACb,SAAS,GAAG,SAAS,GAAG,eAAe,GAAG,kBAAkB,GAAG,QAAQ,GAAG,KAAK,CAC/E,CACD,GACC,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;IAc5B;;;;;;;;OAQG;IACU,IAAI,CAAC,CAAC,EAClB,GAAG,EAAE,MAAM,EACX,WAAW,EAAE,GAAG,EAChB,WAAW,CAAC,EAAE,eAAe,EAC7B,OAAO,CAAC,EAAE,cAAc,EACxB,iBAAiB,CAAC,EAAE,OAAO,CAC1B,IAAI,CACH,aAAa,EACb,SAAS,GAAG,SAAS,GAAG,eAAe,GAAG,kBAAkB,GAAG,QAAQ,GAAG,KAAK,CAC/E,CACD,GACC,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;IAe5B;;;;;;;OAOG;IACU,MAAM,CAAC,CAAC,EACpB,GAAG,EAAE,MAAM,EACX,WAAW,CAAC,EAAE,eAAe,EAC7B,OAAO,CAAC,EAAE,cAAc,EACxB,iBAAiB,CAAC,EAAE,OAAO,CAC1B,IAAI,CACH,aAAa,EACb,SAAS,GAAG,SAAS,GAAG,eAAe,GAAG,kBAAkB,GAAG,QAAQ,GAAG,KAAK,CAC/E,CACD,GACC,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;IAc5B;;;;;;;;OAQG;IACU,KAAK,CAAC,CAAC,EACnB,GAAG,EAAE,MAAM,EACX,WAAW,EAAE,GAAG,EAChB,WAAW,CAAC,EAAE,eAAe,EAC7B,OAAO,CAAC,EAAE,cAAc,EACxB,iBAAiB,CAAC,EAAE,OAAO,CAC1B,IAAI,CACH,aAAa,EACb,SAAS,GAAG,SAAS,GAAG,eAAe,GAAG,kBAAkB,GAAG,QAAQ,GAAG,KAAK,CAC/E,CACD,GACC,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;IAe5B,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,EAC3B,OAAO,EAAE,aAAa,EACtB,UAAU,EAAE,MAAM,EAClB,mBAAmB,CAAC,EAAE,OAAO,GAC3B,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;CAC5B"}
|
package/dist/restWrapperBase.js
CHANGED
|
@@ -6,6 +6,10 @@
|
|
|
6
6
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
7
|
exports.RestWrapper = void 0;
|
|
8
8
|
class RestWrapper {
|
|
9
|
+
baseurl;
|
|
10
|
+
defaultQueryString;
|
|
11
|
+
maxBodyLength;
|
|
12
|
+
maxContentLength;
|
|
9
13
|
constructor(baseurl, defaultQueryString = {}, maxBodyLength = 1000 * 1024 * 1024, maxContentLength = 1000 * 1024 * 1024) {
|
|
10
14
|
this.baseurl = baseurl;
|
|
11
15
|
this.defaultQueryString = defaultQueryString;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"restWrapperBase.js","sourceRoot":"","sources":["../src/restWrapperBase.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAMH,MAAsB,WAAW;
|
|
1
|
+
{"version":3,"file":"restWrapperBase.js","sourceRoot":"","sources":["../src/restWrapperBase.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAMH,MAAsB,WAAW;IAEZ;IACT;IACS;IACA;IAJpB,YACoB,OAAgB,EACzB,qBAAsC,EAAE,EAC/B,gBAAgB,IAAI,GAAG,IAAI,GAAG,IAAI,EAClC,mBAAmB,IAAI,GAAG,IAAI,GAAG,IAAI;QAHrC,YAAO,GAAP,OAAO,CAAS;QACzB,uBAAkB,GAAlB,kBAAkB,CAAsB;QAC/B,kBAAa,GAAb,aAAa,CAAqB;QAClC,qBAAgB,GAAhB,gBAAgB,CAAqB;IACtD,CAAC;IAEJ;;;;;;;OAOG;IACI,KAAK,CAAC,GAAG,CACf,GAAW,EACX,WAA6B,EAC7B,OAAwB,EACxB,iBAKC;QAED,MAAM,OAAO,GAAkB;YAC9B,GAAG,iBAAiB;YACpB,GAAG,CAAC,IAAI,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC;YAChE,GAAG,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC;YAC7C,aAAa,EAAE,IAAI,CAAC,aAAa;YACjC,gBAAgB,EAAE,IAAI,CAAC,gBAAgB;YACvC,MAAM,EAAE,KAAK;YACb,GAAG;YACH,MAAM,EAAE,EAAE,GAAG,IAAI,CAAC,kBAAkB,EAAE,GAAG,WAAW,EAAE;SACtD,CAAC;QACF,OAAO,IAAI,CAAC,OAAO,CAAI,OAAO,EAAE,GAAG,CAAC,CAAC;IACtC,CAAC;IAED;;;;;;;;OAQG;IACI,KAAK,CAAC,IAAI,CAChB,GAAW,EACX,WAAgB,EAChB,WAA6B,EAC7B,OAAwB,EACxB,iBAKC;QAED,MAAM,OAAO,GAAkB;YAC9B,GAAG,iBAAiB;YACpB,GAAG,CAAC,IAAI,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC;YAChE,IAAI,EAAE,WAAW;YACjB,GAAG,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC;YAC7C,aAAa,EAAE,IAAI,CAAC,aAAa;YACjC,gBAAgB,EAAE,IAAI,CAAC,gBAAgB;YACvC,MAAM,EAAE,MAAM;YACd,GAAG;YACH,MAAM,EAAE,EAAE,GAAG,IAAI,CAAC,kBAAkB,EAAE,GAAG,WAAW,EAAE;SACtD,CAAC;QACF,OAAO,IAAI,CAAC,OAAO,CAAI,OAAO,EAAE,GAAG,CAAC,CAAC;IACtC,CAAC;IAED;;;;;;;OAOG;IACI,KAAK,CAAC,MAAM,CAClB,GAAW,EACX,WAA6B,EAC7B,OAAwB,EACxB,iBAKC;QAED,MAAM,OAAO,GAAkB;YAC9B,GAAG,iBAAiB;YACpB,GAAG,CAAC,IAAI,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC;YAChE,GAAG,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC;YAC7C,aAAa,EAAE,IAAI,CAAC,aAAa;YACjC,gBAAgB,EAAE,IAAI,CAAC,gBAAgB;YACvC,MAAM,EAAE,QAAQ;YAChB,GAAG;YACH,MAAM,EAAE,EAAE,GAAG,IAAI,CAAC,kBAAkB,EAAE,GAAG,WAAW,EAAE;SACtD,CAAC;QACF,OAAO,IAAI,CAAC,OAAO,CAAI,OAAO,EAAE,GAAG,CAAC,CAAC;IACtC,CAAC;IAED;;;;;;;;OAQG;IACI,KAAK,CAAC,KAAK,CACjB,GAAW,EACX,WAAgB,EAChB,WAA6B,EAC7B,OAAwB,EACxB,iBAKC;QAED,MAAM,OAAO,GAAkB;YAC9B,GAAG,iBAAiB;YACpB,GAAG,CAAC,IAAI,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC;YAChE,IAAI,EAAE,WAAW;YACjB,GAAG,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC;YAC7C,aAAa,EAAE,IAAI,CAAC,aAAa;YACjC,gBAAgB,EAAE,IAAI,CAAC,gBAAgB;YACvC,MAAM,EAAE,OAAO;YACf,GAAG;YACH,MAAM,EAAE,EAAE,GAAG,IAAI,CAAC,kBAAkB,EAAE,GAAG,WAAW,EAAE;SACtD,CAAC;QACF,OAAO,IAAI,CAAC,OAAO,CAAI,OAAO,EAAE,GAAG,CAAC,CAAC;IACtC,CAAC;CAOD;AAnJD,kCAmJC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport type { QueryStringType } from \"./queryStringUtils.js\";\nimport type { RequestConfig, RequestHeaders } from \"./request.cjs\";\nimport type { IR11sResponse } from \"./restWrapper.js\";\n\nexport abstract class RestWrapper {\n\tconstructor(\n\t\tprotected readonly baseurl?: string,\n\t\tprotected defaultQueryString: QueryStringType = {},\n\t\tprotected readonly maxBodyLength = 1000 * 1024 * 1024,\n\t\tprotected readonly maxContentLength = 1000 * 1024 * 1024,\n\t) {}\n\n\t/**\n\t * Performs an HTTP GET request to the specified URL.\n\t *\n\t * @param url - Relative or absolute request url.(should not contain any query params)\n\t * @param queryString - query params to be appended to the request url\n\t * @param headers - headers\n\t * @param additionalOptions - additionalOptions\n\t */\n\tpublic async get<T>(\n\t\turl: string,\n\t\tqueryString?: QueryStringType,\n\t\theaders?: RequestHeaders,\n\t\tadditionalOptions?: Partial<\n\t\t\tOmit<\n\t\t\t\tRequestConfig,\n\t\t\t\t\"baseURL\" | \"headers\" | \"maxBodyLength\" | \"maxContentLength\" | \"method\" | \"url\"\n\t\t\t>\n\t\t>,\n\t): Promise<IR11sResponse<T>> {\n\t\tconst options: RequestConfig = {\n\t\t\t...additionalOptions,\n\t\t\t...(this.baseurl === undefined ? {} : { baseURL: this.baseurl }),\n\t\t\t...(headers === undefined ? {} : { headers }),\n\t\t\tmaxBodyLength: this.maxBodyLength,\n\t\t\tmaxContentLength: this.maxContentLength,\n\t\t\tmethod: \"GET\",\n\t\t\turl,\n\t\t\tparams: { ...this.defaultQueryString, ...queryString },\n\t\t};\n\t\treturn this.request<T>(options, 200);\n\t}\n\n\t/**\n\t * Performs an HTTP POST request to the specified URL.\n\t *\n\t * @param url - Relative or absolute request url.(should not contain any query params)\n\t * @param requestBody - requestBody\n\t * @param queryString - query params to be appended to the request url\n\t * @param headers - headers\n\t * @param additionalOptions - additionalOptions\n\t */\n\tpublic async post<T>(\n\t\turl: string,\n\t\trequestBody: any,\n\t\tqueryString?: QueryStringType,\n\t\theaders?: RequestHeaders,\n\t\tadditionalOptions?: Partial<\n\t\t\tOmit<\n\t\t\t\tRequestConfig,\n\t\t\t\t\"baseURL\" | \"headers\" | \"maxBodyLength\" | \"maxContentLength\" | \"method\" | \"url\"\n\t\t\t>\n\t\t>,\n\t): Promise<IR11sResponse<T>> {\n\t\tconst options: RequestConfig = {\n\t\t\t...additionalOptions,\n\t\t\t...(this.baseurl === undefined ? {} : { baseURL: this.baseurl }),\n\t\t\tdata: requestBody,\n\t\t\t...(headers === undefined ? {} : { headers }),\n\t\t\tmaxBodyLength: this.maxBodyLength,\n\t\t\tmaxContentLength: this.maxContentLength,\n\t\t\tmethod: \"POST\",\n\t\t\turl,\n\t\t\tparams: { ...this.defaultQueryString, ...queryString },\n\t\t};\n\t\treturn this.request<T>(options, 201);\n\t}\n\n\t/**\n\t * Performs an HTTP DELETE request to the specified URL.\n\t *\n\t * @param url - Relative or absolute request url.(should not contain any query params)\n\t * @param queryString - query params to be appended to the request url\n\t * @param headers - headers\n\t * @param additionalOptions - additionalOptions\n\t */\n\tpublic async delete<T>(\n\t\turl: string,\n\t\tqueryString?: QueryStringType,\n\t\theaders?: RequestHeaders,\n\t\tadditionalOptions?: Partial<\n\t\t\tOmit<\n\t\t\t\tRequestConfig,\n\t\t\t\t\"baseURL\" | \"headers\" | \"maxBodyLength\" | \"maxContentLength\" | \"method\" | \"url\"\n\t\t\t>\n\t\t>,\n\t): Promise<IR11sResponse<T>> {\n\t\tconst options: RequestConfig = {\n\t\t\t...additionalOptions,\n\t\t\t...(this.baseurl === undefined ? {} : { baseURL: this.baseurl }),\n\t\t\t...(headers === undefined ? {} : { headers }),\n\t\t\tmaxBodyLength: this.maxBodyLength,\n\t\t\tmaxContentLength: this.maxContentLength,\n\t\t\tmethod: \"DELETE\",\n\t\t\turl,\n\t\t\tparams: { ...this.defaultQueryString, ...queryString },\n\t\t};\n\t\treturn this.request<T>(options, 204);\n\t}\n\n\t/**\n\t * Performs an HTTP PATCH request to the specified URL.\n\t *\n\t * @param url - Relative or absolute request url.(should not contain any query params)\n\t * @param requestBody - requestBody\n\t * @param queryString - query params to be appended to the request url\n\t * @param headers - headers\n\t * @param additionalOptions - additionalOptions\n\t */\n\tpublic async patch<T>(\n\t\turl: string,\n\t\trequestBody: any,\n\t\tqueryString?: QueryStringType,\n\t\theaders?: RequestHeaders,\n\t\tadditionalOptions?: Partial<\n\t\t\tOmit<\n\t\t\t\tRequestConfig,\n\t\t\t\t\"baseURL\" | \"headers\" | \"maxBodyLength\" | \"maxContentLength\" | \"method\" | \"url\"\n\t\t\t>\n\t\t>,\n\t): Promise<IR11sResponse<T>> {\n\t\tconst options: RequestConfig = {\n\t\t\t...additionalOptions,\n\t\t\t...(this.baseurl === undefined ? {} : { baseURL: this.baseurl }),\n\t\t\tdata: requestBody,\n\t\t\t...(headers === undefined ? {} : { headers }),\n\t\t\tmaxBodyLength: this.maxBodyLength,\n\t\t\tmaxContentLength: this.maxContentLength,\n\t\t\tmethod: \"PATCH\",\n\t\t\turl,\n\t\t\tparams: { ...this.defaultQueryString, ...queryString },\n\t\t};\n\t\treturn this.request<T>(options, 200);\n\t}\n\n\tprotected abstract request<T>(\n\t\toptions: RequestConfig,\n\t\tstatusCode: number,\n\t\taddNetworkCallProps?: boolean,\n\t): Promise<IR11sResponse<T>>;\n}\n"]}
|
|
@@ -7,6 +7,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
7
7
|
exports.RetriableGitManager = void 0;
|
|
8
8
|
const internal_1 = require("@fluidframework/driver-utils/internal");
|
|
9
9
|
class RetriableGitManager {
|
|
10
|
+
internalGitManager;
|
|
11
|
+
logger;
|
|
10
12
|
constructor(internalGitManager, logger) {
|
|
11
13
|
this.internalGitManager = internalGitManager;
|
|
12
14
|
this.logger = logger;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"retriableGitManager.js","sourceRoot":"","sources":["../src/retriableGitManager.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AASH,oEAAqE;AAWrE,MAAa,mBAAmB;
|
|
1
|
+
{"version":3,"file":"retriableGitManager.js","sourceRoot":"","sources":["../src/retriableGitManager.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AASH,oEAAqE;AAWrE,MAAa,mBAAmB;IAEb;IACA;IAFlB,YACkB,kBAA+B,EAC/B,MAA0B;QAD1B,uBAAkB,GAAlB,kBAAkB,CAAa;QAC/B,WAAM,GAAN,MAAM,CAAoB;IACzC,CAAC;IAEG,KAAK,CAAC,UAAU,CACtB,GAAW,EACX,KAAa;QAEb,OAAO,IAAI,CAAC,YAAY,CACvB,KAAK,IAAI,EAAE,CAAC,IAAI,CAAC,kBAAkB,CAAC,UAAU,CAAC,GAAG,EAAE,KAAK,CAAC,EAC1D,uBAAuB,CACvB,CAAC;IACH,CAAC;IAEM,KAAK,CAAC,OAAO,CAAC,IAAY,EAAE,SAAkB;QACpD,OAAO,IAAI,CAAC,YAAY,CACvB,KAAK,IAAI,EAAE,CAAC,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,IAAI,EAAE,SAAS,CAAC,EAC5D,oBAAoB,CACpB,CAAC;IACH,CAAC;IAEM,KAAK,CAAC,OAAO,CAAC,GAAW;QAC/B,OAAO,IAAI,CAAC,YAAY,CACvB,KAAK,IAAI,EAAE,CAAC,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,GAAG,CAAC,EAChD,oBAAoB,CACpB,CAAC;IACH,CAAC;IAEM,KAAK,CAAC,UAAU,CACtB,OAAe,EACf,QAAgB;QAEhB,OAAO,IAAI,CAAC,YAAY,CACvB,KAAK,IAAI,EAAE,CAAC,IAAI,CAAC,kBAAkB,CAAC,UAAU,CAAC,OAAO,EAAE,QAAQ,CAAC,EACjE,uBAAuB,CACvB,CAAC;IACH,CAAC;IAEM,KAAK,CAAC,aAAa,CAAC,MAA4B;QACtD,OAAO,IAAI,CAAC,YAAY,CACvB,KAAK,IAAI,EAAE,CAAC,IAAI,CAAC,kBAAkB,CAAC,aAAa,CAAC,MAAM,CAAC,EACzD,0BAA0B,CAC1B,CAAC;IACH,CAAC;IAEM,KAAK,CAAC,aAAa,CACzB,OAA6B;QAE7B,OAAO,IAAI,CAAC,YAAY,CACvB,KAAK,IAAI,EAAE,CAAC,IAAI,CAAC,kBAAkB,CAAC,aAAa,CAAC,OAAO,CAAC,EAC1D,0BAA0B,CAC1B,CAAC;IACH,CAAC;IAEM,KAAK,CAAC,WAAW,CAAC,GAAW;QACnC,OAAO,IAAI,CAAC,YAAY,CACvB,KAAK,IAAI,EAAE,CAAC,IAAI,CAAC,kBAAkB,CAAC,WAAW,CAAC,GAAG,CAAC,EACpD,uBAAuB,CACvB,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,YAAY,CAAI,GAAqB,EAAE,QAAgB;QACpE,OAAO,IAAA,uBAAY,EAClB,GAAG,EACH,QAAQ,EACR,IAAI,CAAC,MAAM,EACX,EAAE,CACF,CAAC;IACH,CAAC;CACD;AAvED,kDAuEC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport type {\n\tIGitCommitDetails,\n\tIGitBlob,\n\tIGitCreateBlobResponse,\n\tIGitCreateTreeParams,\n\tIGitTree,\n} from \"@fluidframework/driver-definitions/internal\";\nimport { runWithRetry } from \"@fluidframework/driver-utils/internal\";\nimport type {\n\tIWholeSummaryPayload,\n\tIWriteSummaryResponse,\n} from \"@fluidframework/server-services-client\";\nimport type { TelemetryLoggerExt } from \"@fluidframework/telemetry-utils/internal\";\n\nimport type { IWholeFlatSnapshot } from \"./contracts.js\";\nimport type { IR11sResponse } from \"./restWrapper.js\";\nimport type { IGitManager } from \"./storageContracts.js\";\n\nexport class RetriableGitManager implements IGitManager {\n\tconstructor(\n\t\tprivate readonly internalGitManager: IGitManager,\n\t\tprivate readonly logger: TelemetryLoggerExt,\n\t) {}\n\n\tpublic async getCommits(\n\t\tsha: string,\n\t\tcount: number,\n\t): Promise<IR11sResponse<IGitCommitDetails[]>> {\n\t\treturn this.runWithRetry(\n\t\t\tasync () => this.internalGitManager.getCommits(sha, count),\n\t\t\t\"gitManager_getCommits\",\n\t\t);\n\t}\n\n\tpublic async getTree(root: string, recursive: boolean): Promise<IR11sResponse<IGitTree>> {\n\t\treturn this.runWithRetry(\n\t\t\tasync () => this.internalGitManager.getTree(root, recursive),\n\t\t\t\"gitManager_getTree\",\n\t\t);\n\t}\n\n\tpublic async getBlob(sha: string): Promise<IR11sResponse<IGitBlob>> {\n\t\treturn this.runWithRetry(\n\t\t\tasync () => this.internalGitManager.getBlob(sha),\n\t\t\t\"gitManager_getBlob\",\n\t\t);\n\t}\n\n\tpublic async createBlob(\n\t\tcontent: string,\n\t\tencoding: string,\n\t): Promise<IR11sResponse<IGitCreateBlobResponse>> {\n\t\treturn this.runWithRetry(\n\t\t\tasync () => this.internalGitManager.createBlob(content, encoding),\n\t\t\t\"gitManager_createBlob\",\n\t\t);\n\t}\n\n\tpublic async createGitTree(params: IGitCreateTreeParams): Promise<IR11sResponse<IGitTree>> {\n\t\treturn this.runWithRetry(\n\t\t\tasync () => this.internalGitManager.createGitTree(params),\n\t\t\t\"gitManager_createGitTree\",\n\t\t);\n\t}\n\n\tpublic async createSummary(\n\t\tsummary: IWholeSummaryPayload,\n\t): Promise<IR11sResponse<IWriteSummaryResponse>> {\n\t\treturn this.runWithRetry(\n\t\t\tasync () => this.internalGitManager.createSummary(summary),\n\t\t\t\"gitManager_createSummary\",\n\t\t);\n\t}\n\n\tpublic async getSnapshot(sha: string): Promise<IR11sResponse<IWholeFlatSnapshot>> {\n\t\treturn this.runWithRetry(\n\t\t\tasync () => this.internalGitManager.getSnapshot(sha),\n\t\t\t\"gitManager_getSummary\",\n\t\t);\n\t}\n\n\tprivate async runWithRetry<T>(api: () => Promise<T>, callName: string): Promise<T> {\n\t\treturn runWithRetry(\n\t\t\tapi,\n\t\t\tcallName,\n\t\t\tthis.logger,\n\t\t\t{}, // progress\n\t\t);\n\t}\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"routerliciousResolvedUrl.d.ts","sourceRoot":"","sources":["../src/routerliciousResolvedUrl.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6CAA6C,CAAC;AAEhF;;;;;;;;GAQG;AACH,MAAM,WAAW,yBAA0B,SAAQ,YAAY;IAC9D;;OAEG;IACH,wBAAwB,EAAE,IAAI,CAAC;IAC/B;;;;;;OAMG;IACH,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED;;;GAGG;AACH,eAAO,MAAM,0BAA0B,
|
|
1
|
+
{"version":3,"file":"routerliciousResolvedUrl.d.ts","sourceRoot":"","sources":["../src/routerliciousResolvedUrl.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6CAA6C,CAAC;AAEhF;;;;;;;;GAQG;AACH,MAAM,WAAW,yBAA0B,SAAQ,YAAY;IAC9D;;OAEG;IACH,wBAAwB,EAAE,IAAI,CAAC;IAC/B;;;;;;OAMG;IACH,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED;;;GAGG;AACH,eAAO,MAAM,0BAA0B,GACtC,aAAa,YAAY,KACvB,WAAW,IAAI,yBAC2D,CAAC"}
|
|
@@ -17,20 +17,21 @@ const urlUtils_js_1 = require("./urlUtils.js");
|
|
|
17
17
|
*/
|
|
18
18
|
exports.RediscoverAfterTimeSinceDiscoveryMs = 5 * 60000; // 5 minutes
|
|
19
19
|
class SessionInfoManager {
|
|
20
|
+
enableDiscovery;
|
|
21
|
+
/**
|
|
22
|
+
* Stored session info
|
|
23
|
+
* Key: URL for given session (see "getDiscoverSessionUrl")
|
|
24
|
+
* Value: session info stored as an IResolvedUrl
|
|
25
|
+
*/
|
|
26
|
+
sessionInfoMap = new Map();
|
|
27
|
+
/**
|
|
28
|
+
* Stored dates of when a session was last discovered/refreshed
|
|
29
|
+
* Key: URL for given session (see "getDiscoverSessionUrl")
|
|
30
|
+
* Value: date last discovered
|
|
31
|
+
*/
|
|
32
|
+
sessionLastDiscoveredMap = new Map();
|
|
20
33
|
constructor(enableDiscovery) {
|
|
21
34
|
this.enableDiscovery = enableDiscovery;
|
|
22
|
-
/**
|
|
23
|
-
* Stored session info
|
|
24
|
-
* Key: URL for given session (see "getDiscoverSessionUrl")
|
|
25
|
-
* Value: session info stored as an IResolvedUrl
|
|
26
|
-
*/
|
|
27
|
-
this.sessionInfoMap = new Map();
|
|
28
|
-
/**
|
|
29
|
-
* Stored dates of when a session was last discovered/refreshed
|
|
30
|
-
* Key: URL for given session (see "getDiscoverSessionUrl")
|
|
31
|
-
* Value: date last discovered
|
|
32
|
-
*/
|
|
33
|
-
this.sessionLastDiscoveredMap = new Map();
|
|
34
35
|
}
|
|
35
36
|
/**
|
|
36
37
|
* Start tracking info for a given session
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sessionInfoManager.js","sourceRoot":"","sources":["../src/sessionInfoManager.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAEH,kEAA6D;AAC7D,mEAAkE;AAIlE,uEAA4E;AAG5E,+CAA8D;AAE9D;;;;;GAKG;AACU,QAAA,mCAAmC,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC,YAAY;AAe1E,MAAa,kBAAkB;
|
|
1
|
+
{"version":3,"file":"sessionInfoManager.js","sourceRoot":"","sources":["../src/sessionInfoManager.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 { assert } from \"@fluidframework/core-utils/internal\";\nimport { getW3CData } from \"@fluidframework/driver-base/internal\";\nimport type { IResolvedUrl } from \"@fluidframework/driver-definitions/internal\";\nimport type { ISession } from \"@fluidframework/server-services-client\";\nimport type { TelemetryLoggerExt } from \"@fluidframework/telemetry-utils/internal\";\nimport { PerformanceEvent } from \"@fluidframework/telemetry-utils/internal\";\n\nimport type { RouterliciousOrdererRestWrapper } from \"./restWrapper.js\";\nimport { getDiscoveredFluidResolvedUrl } from \"./urlUtils.js\";\n\n/**\n * Amount of time between discoveries within which we don't need to rediscover on re-connect.\n * Currently, R11s defines session length at 10 minutes. To avoid any weird unknown edge-cases though,\n * we set the limit to 5 minutes here.\n * In the future, we likely want to retrieve this information from service's \"inactive session\" definition.\n */\nexport const RediscoverAfterTimeSinceDiscoveryMs = 5 * 60000; // 5 minutes\n\ninterface IGetSessionInfoParams {\n\tresolvedUrl: IResolvedUrl;\n\tdocumentId: string;\n\ttenantId: string;\n\tordererRestWrapper: RouterliciousOrdererRestWrapper;\n\tlogger: TelemetryLoggerExt;\n}\n\nexport interface IGetSessionInfoResponse {\n\trefreshed: boolean;\n\tresolvedUrl: IResolvedUrl;\n}\n\nexport class SessionInfoManager {\n\t/**\n\t * Stored session info\n\t * Key: URL for given session (see \"getDiscoverSessionUrl\")\n\t * Value: session info stored as an IResolvedUrl\n\t */\n\tprivate readonly sessionInfoMap: Map<string, IResolvedUrl> = new Map();\n\n\t/**\n\t * Stored dates of when a session was last discovered/refreshed\n\t * Key: URL for given session (see \"getDiscoverSessionUrl\")\n\t * Value: date last discovered\n\t */\n\tprivate readonly sessionLastDiscoveredMap: Map<string, number> = new Map();\n\n\tconstructor(private readonly enableDiscovery: boolean) {}\n\n\t/**\n\t * Start tracking info for a given session\n\t */\n\tpublic async initializeSessionInfo(\n\t\tparams: IGetSessionInfoParams & { session: ISession | undefined },\n\t): Promise<IResolvedUrl> {\n\t\tconst { resolvedUrl, session } = params;\n\n\t\tconst url = getDiscoverSessionUrl(params);\n\t\tassert(\n\t\t\tthis.sessionInfoMap.has(url) === this.sessionLastDiscoveredMap.has(url),\n\t\t\t0xa2d /* Session map state mismatch */,\n\t\t);\n\n\t\tif (session !== undefined) {\n\t\t\tthis.sessionInfoMap.set(url, getDiscoveredFluidResolvedUrl(resolvedUrl, session));\n\t\t\tthis.sessionLastDiscoveredMap.set(url, Date.now());\n\t\t} else if (!this.sessionInfoMap.has(url)) {\n\t\t\tthis.sessionInfoMap.set(url, resolvedUrl);\n\t\t\t// Force a refresh\n\t\t\tthis.sessionLastDiscoveredMap.set(url, 0);\n\t\t}\n\n\t\treturn (await this.getSessionInfo(params)).resolvedUrl;\n\t}\n\n\t/**\n\t * Retrieve, and potentially refresh, info of a given session\n\t */\n\tpublic async getSessionInfo(\n\t\tparams: IGetSessionInfoParams,\n\t): Promise<IGetSessionInfoResponse> {\n\t\tconst url = getDiscoverSessionUrl(params);\n\t\tassert(\n\t\t\tthis.sessionInfoMap.has(url) && this.sessionLastDiscoveredMap.has(url),\n\t\t\t0xa2e /* Unexpected discover session URL */,\n\t\t);\n\n\t\tlet refreshed = false;\n\t\tconst shouldRediscover =\n\t\t\tDate.now() - this.sessionLastDiscoveredMap.get(url)! >\n\t\t\tRediscoverAfterTimeSinceDiscoveryMs;\n\t\tif (this.enableDiscovery && shouldRediscover) {\n\t\t\tawait this.fetchAndUpdateSessionInfo(params).catch((error) => {\n\t\t\t\t// Undo discovery time set on failure, so that next check refreshes.\n\t\t\t\tthis.sessionLastDiscoveredMap.set(url, 0);\n\t\t\t\tthrow error;\n\t\t\t});\n\t\t\trefreshed = true;\n\t\t}\n\t\treturn {\n\t\t\trefreshed,\n\t\t\t// ! Shallow copy is important as some mechanisms may rely on object comparison\n\t\t\tresolvedUrl: { ...this.sessionInfoMap.get(url)! },\n\t\t};\n\t}\n\n\tprivate async fetchAndUpdateSessionInfo(params: IGetSessionInfoParams): Promise<void> {\n\t\tconst { documentId, ordererRestWrapper, logger, resolvedUrl } = params;\n\n\t\tconst url = getDiscoverSessionUrl(params);\n\t\tconst discoveredSession = await PerformanceEvent.timedExecAsync(\n\t\t\tlogger,\n\t\t\t{\n\t\t\t\teventName: \"DiscoverSession\",\n\t\t\t\tdocId: documentId,\n\t\t\t},\n\t\t\tasync (event) => {\n\t\t\t\t// The service responds with the current document session associated with the container.\n\t\t\t\tconst response = await ordererRestWrapper.get<ISession>(url);\n\t\t\t\tevent.end({\n\t\t\t\t\t...response.propsToLog,\n\t\t\t\t\t...getW3CData(response.requestUrl, \"xmlhttprequest\"),\n\t\t\t\t});\n\t\t\t\treturn response.content;\n\t\t\t},\n\t\t);\n\t\tthis.sessionInfoMap.set(\n\t\t\turl,\n\t\t\tgetDiscoveredFluidResolvedUrl(resolvedUrl, discoveredSession),\n\t\t);\n\t\tthis.sessionLastDiscoveredMap.set(url, Date.now());\n\t}\n}\n\nfunction getDiscoverSessionUrl(params: {\n\tresolvedUrl: IResolvedUrl;\n\ttenantId: string;\n\tdocumentId: string;\n}): string {\n\tconst { resolvedUrl, tenantId, documentId } = params;\n\treturn `${resolvedUrl.endpoints.ordererUrl}/documents/${tenantId}/session/${documentId}`;\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shreddedSummaryDocumentStorageService.d.ts","sourceRoot":"","sources":["../src/shreddedSummaryDocumentStorageService.ts"],"names":[],"mappings":"AAAA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"shreddedSummaryDocumentStorageService.d.ts","sourceRoot":"","sources":["../src/shreddedSummaryDocumentStorageService.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,oCAAoC,CAAC;AACvF,OAAO,KAAK,EACX,uBAAuB,EACvB,+BAA+B,EAC/B,eAAe,EACf,mBAAmB,EACnB,eAAe,EACf,QAAQ,EACR,MAAM,6CAA6C,CAAC;AAErD,OAAO,KAAK,EAEX,kBAAkB,EAClB,MAAM,0CAA0C,CAAC;AAMlD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAEzC,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAC7D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,eAAe,CAAC;AAOlE;;;;GAIG;AACH,qBAAa,qCAAsC,YAAW,uBAAuB;IAkBnF,SAAS,CAAC,QAAQ,CAAC,EAAE,EAAE,MAAM;IAC7B,SAAS,CAAC,QAAQ,CAAC,OAAO,EAAE,UAAU;IACtC,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,kBAAkB;aAC7B,QAAQ,EAAE,+BAA+B;IAIzD,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IAxBnC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAoB;IAGvC,SAAS,CAAC,QAAQ,CAAC,aAAa,sBAA6B;IAC7D,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAsC;IAChE,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAA2C;YAE/D,uBAAuB;gBAUjB,EAAE,EAAE,MAAM,EACV,OAAO,EAAE,UAAU,EACnB,MAAM,EAAE,kBAAkB,EAC7B,QAAQ,EAAE,+BAA+B,EACzD,cAAc,CAAC,EAAE,4BAA4B,EAC7C,SAAS,CAAC,EAAE,MAAM,CAAC,eAAe,CAAC,EACnC,iBAAiB,CAAC,EAAE,MAAM,CAAC,oBAAoB,CAAC,EAC/B,iBAAiB,GAAE,CACnC,YAAY,CAAC,EAAE,OAAO,KAClB,OAAO,CAAC,UAAU,CAA4B;IAYvC,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;IAsBzE,eAAe,CAAC,OAAO,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC;IAyCpE,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;IAmClD,wBAAwB,CACpC,OAAO,EAAE,YAAY,EACrB,OAAO,EAAE,eAAe,GACtB,OAAO,CAAC,MAAM,CAAC;IAqBL,eAAe,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,YAAY,CAAC;IAI9D,UAAU,CAAC,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,mBAAmB,CAAC;YAqB9D,uBAAuB;IAYrC,OAAO,CAAC,WAAW;CAGnB"}
|
|
@@ -18,6 +18,17 @@ const isNode = typeof window === "undefined";
|
|
|
18
18
|
* Downloads summaries piece-by-piece on-demand, or up-front when prefetch is enabled.
|
|
19
19
|
*/
|
|
20
20
|
class ShreddedSummaryDocumentStorageService {
|
|
21
|
+
id;
|
|
22
|
+
manager;
|
|
23
|
+
logger;
|
|
24
|
+
policies;
|
|
25
|
+
getStorageManager;
|
|
26
|
+
mc;
|
|
27
|
+
// The values of this cache is useless. We only need the keys. So we are always putting
|
|
28
|
+
// empty strings as values.
|
|
29
|
+
blobsShaCache = new Map();
|
|
30
|
+
blobCache;
|
|
31
|
+
snapshotTreeCache;
|
|
21
32
|
async getSummaryUploadManager() {
|
|
22
33
|
const manager = await this.getStorageManager();
|
|
23
34
|
return new summaryTreeUploadManager_js_1.SummaryTreeUploadManager(new retriableGitManager_js_1.RetriableGitManager(manager, this.logger), this.blobsShaCache, this.getPreviousFullSnapshot.bind(this));
|
|
@@ -28,9 +39,6 @@ class ShreddedSummaryDocumentStorageService {
|
|
|
28
39
|
this.logger = logger;
|
|
29
40
|
this.policies = policies;
|
|
30
41
|
this.getStorageManager = getStorageManager;
|
|
31
|
-
// The values of this cache is useless. We only need the keys. So we are always putting
|
|
32
|
-
// empty strings as values.
|
|
33
|
-
this.blobsShaCache = new Map();
|
|
34
42
|
if (driverPolicies?.enableRestLess === true || isNode) {
|
|
35
43
|
this.blobCache = blobCache ?? new cache_js_1.InMemoryCache();
|
|
36
44
|
this.snapshotTreeCache = snapshotTreeCache ?? new cache_js_1.InMemoryCache();
|
|
@@ -105,6 +113,12 @@ class ShreddedSummaryDocumentStorageService {
|
|
|
105
113
|
}, undefined, // workers
|
|
106
114
|
this.mc.config.getNumber("Fluid.Driver.ReadBlobTelemetrySampling"));
|
|
107
115
|
this.blobsShaCache.set(value.sha, "");
|
|
116
|
+
// stringToBuffer has only ever reliably supported limited encodings.
|
|
117
|
+
// Despite server `IBlob.encoding` type being string, cast as one of
|
|
118
|
+
// the supported types and expect throw under browser if not.
|
|
119
|
+
// TODO: AB:#81373: Consider formalizing `IBlob.encoding` literals allowed.
|
|
120
|
+
// Note: the origin of this type is repo local but a synchronized
|
|
121
|
+
// clone of the @fluidframework/gitresources interface.
|
|
108
122
|
const bufferContent = (0, client_utils_1.stringToBuffer)(value.content, value.encoding);
|
|
109
123
|
await this.blobCache?.put(this.getCacheKey(value.sha), bufferContent);
|
|
110
124
|
return bufferContent;
|