@fluidframework/routerlicious-driver 2.0.0-dev.3.1.0.125672 → 2.0.0-dev.4.2.0.153917

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (184) hide show
  1. package/CHANGELOG.md +5 -0
  2. package/README.md +38 -0
  3. package/dist/cache.js +2 -2
  4. package/dist/cache.js.map +1 -1
  5. package/dist/deltaStorageService.d.ts +1 -1
  6. package/dist/deltaStorageService.d.ts.map +1 -1
  7. package/dist/deltaStorageService.js +7 -4
  8. package/dist/deltaStorageService.js.map +1 -1
  9. package/dist/documentService.d.ts +4 -2
  10. package/dist/documentService.d.ts.map +1 -1
  11. package/dist/documentService.js +20 -12
  12. package/dist/documentService.js.map +1 -1
  13. package/dist/documentServiceFactory.d.ts +2 -2
  14. package/dist/documentServiceFactory.d.ts.map +1 -1
  15. package/dist/documentServiceFactory.js +21 -12
  16. package/dist/documentServiceFactory.js.map +1 -1
  17. package/dist/documentStorageService.d.ts +3 -2
  18. package/dist/documentStorageService.d.ts.map +1 -1
  19. package/dist/documentStorageService.js +4 -4
  20. package/dist/documentStorageService.js.map +1 -1
  21. package/dist/errorUtils.d.ts +9 -2
  22. package/dist/errorUtils.d.ts.map +1 -1
  23. package/dist/errorUtils.js +15 -8
  24. package/dist/errorUtils.js.map +1 -1
  25. package/dist/gitManager.d.ts +30 -0
  26. package/dist/gitManager.d.ts.map +1 -0
  27. package/dist/gitManager.js +89 -0
  28. package/dist/gitManager.js.map +1 -0
  29. package/dist/historian.d.ts +33 -0
  30. package/dist/historian.d.ts.map +1 -0
  31. package/dist/historian.js +65 -0
  32. package/dist/historian.js.map +1 -0
  33. package/dist/index.d.ts +1 -0
  34. package/dist/index.d.ts.map +1 -1
  35. package/dist/index.js +4 -1
  36. package/dist/index.js.map +1 -1
  37. package/dist/mapWithExpiration.d.ts +34 -0
  38. package/dist/mapWithExpiration.d.ts.map +1 -0
  39. package/dist/mapWithExpiration.js +105 -0
  40. package/dist/mapWithExpiration.js.map +1 -0
  41. package/dist/packageVersion.d.ts +1 -1
  42. package/dist/packageVersion.js +1 -1
  43. package/dist/packageVersion.js.map +1 -1
  44. package/dist/restWrapper.d.ts +21 -8
  45. package/dist/restWrapper.d.ts.map +1 -1
  46. package/dist/restWrapper.js +93 -25
  47. package/dist/restWrapper.js.map +1 -1
  48. package/dist/restWrapperBase.d.ts +26 -0
  49. package/dist/restWrapperBase.d.ts.map +1 -0
  50. package/dist/restWrapperBase.js +55 -0
  51. package/dist/restWrapperBase.js.map +1 -0
  52. package/dist/retriableGitManager.d.ts +10 -21
  53. package/dist/retriableGitManager.d.ts.map +1 -1
  54. package/dist/retriableGitManager.js +0 -36
  55. package/dist/retriableGitManager.js.map +1 -1
  56. package/dist/shreddedSummaryDocumentStorageService.d.ts +1 -1
  57. package/dist/shreddedSummaryDocumentStorageService.d.ts.map +1 -1
  58. package/dist/shreddedSummaryDocumentStorageService.js +6 -6
  59. package/dist/shreddedSummaryDocumentStorageService.js.map +1 -1
  60. package/dist/storageContracts.d.ts +44 -0
  61. package/dist/storageContracts.d.ts.map +1 -0
  62. package/dist/storageContracts.js +7 -0
  63. package/dist/storageContracts.js.map +1 -0
  64. package/dist/summaryTreeUploadManager.d.ts +23 -0
  65. package/dist/summaryTreeUploadManager.d.ts.map +1 -0
  66. package/dist/summaryTreeUploadManager.js +110 -0
  67. package/dist/summaryTreeUploadManager.js.map +1 -0
  68. package/dist/tokens.d.ts +24 -7
  69. package/dist/tokens.d.ts.map +1 -1
  70. package/dist/tokens.js.map +1 -1
  71. package/dist/treeUtils.d.ts +58 -0
  72. package/dist/treeUtils.d.ts.map +1 -0
  73. package/dist/treeUtils.js +107 -0
  74. package/dist/treeUtils.js.map +1 -0
  75. package/dist/wholeSummaryDocumentStorageService.d.ts +5 -4
  76. package/dist/wholeSummaryDocumentStorageService.d.ts.map +1 -1
  77. package/dist/wholeSummaryDocumentStorageService.js +70 -38
  78. package/dist/wholeSummaryDocumentStorageService.js.map +1 -1
  79. package/dist/wholeSummaryUploadManager.d.ts +16 -0
  80. package/dist/wholeSummaryUploadManager.d.ts.map +1 -0
  81. package/dist/wholeSummaryUploadManager.js +38 -0
  82. package/dist/wholeSummaryUploadManager.js.map +1 -0
  83. package/lib/cache.js +1 -1
  84. package/lib/cache.js.map +1 -1
  85. package/lib/deltaStorageService.d.ts +1 -1
  86. package/lib/deltaStorageService.d.ts.map +1 -1
  87. package/lib/deltaStorageService.js +7 -4
  88. package/lib/deltaStorageService.js.map +1 -1
  89. package/lib/documentService.d.ts +4 -2
  90. package/lib/documentService.d.ts.map +1 -1
  91. package/lib/documentService.js +20 -12
  92. package/lib/documentService.js.map +1 -1
  93. package/lib/documentServiceFactory.d.ts +2 -2
  94. package/lib/documentServiceFactory.d.ts.map +1 -1
  95. package/lib/documentServiceFactory.js +22 -13
  96. package/lib/documentServiceFactory.js.map +1 -1
  97. package/lib/documentStorageService.d.ts +3 -2
  98. package/lib/documentStorageService.d.ts.map +1 -1
  99. package/lib/documentStorageService.js +4 -4
  100. package/lib/documentStorageService.js.map +1 -1
  101. package/lib/errorUtils.d.ts +9 -2
  102. package/lib/errorUtils.d.ts.map +1 -1
  103. package/lib/errorUtils.js +14 -7
  104. package/lib/errorUtils.js.map +1 -1
  105. package/lib/gitManager.d.ts +30 -0
  106. package/lib/gitManager.d.ts.map +1 -0
  107. package/lib/gitManager.js +85 -0
  108. package/lib/gitManager.js.map +1 -0
  109. package/lib/historian.d.ts +33 -0
  110. package/lib/historian.d.ts.map +1 -0
  111. package/lib/historian.js +60 -0
  112. package/lib/historian.js.map +1 -0
  113. package/lib/index.d.ts +1 -0
  114. package/lib/index.d.ts.map +1 -1
  115. package/lib/index.js +2 -0
  116. package/lib/index.js.map +1 -1
  117. package/lib/mapWithExpiration.d.ts +34 -0
  118. package/lib/mapWithExpiration.d.ts.map +1 -0
  119. package/lib/mapWithExpiration.js +101 -0
  120. package/lib/mapWithExpiration.js.map +1 -0
  121. package/lib/packageVersion.d.ts +1 -1
  122. package/lib/packageVersion.js +1 -1
  123. package/lib/packageVersion.js.map +1 -1
  124. package/lib/restWrapper.d.ts +21 -8
  125. package/lib/restWrapper.d.ts.map +1 -1
  126. package/lib/restWrapper.js +92 -26
  127. package/lib/restWrapper.js.map +1 -1
  128. package/lib/restWrapperBase.d.ts +26 -0
  129. package/lib/restWrapperBase.d.ts.map +1 -0
  130. package/lib/restWrapperBase.js +50 -0
  131. package/lib/restWrapperBase.js.map +1 -0
  132. package/lib/retriableGitManager.d.ts +10 -21
  133. package/lib/retriableGitManager.d.ts.map +1 -1
  134. package/lib/retriableGitManager.js +0 -36
  135. package/lib/retriableGitManager.js.map +1 -1
  136. package/lib/shreddedSummaryDocumentStorageService.d.ts +1 -1
  137. package/lib/shreddedSummaryDocumentStorageService.d.ts.map +1 -1
  138. package/lib/shreddedSummaryDocumentStorageService.js +5 -5
  139. package/lib/shreddedSummaryDocumentStorageService.js.map +1 -1
  140. package/lib/storageContracts.d.ts +44 -0
  141. package/lib/storageContracts.d.ts.map +1 -0
  142. package/lib/storageContracts.js +6 -0
  143. package/lib/storageContracts.js.map +1 -0
  144. package/lib/summaryTreeUploadManager.d.ts +23 -0
  145. package/lib/summaryTreeUploadManager.d.ts.map +1 -0
  146. package/lib/summaryTreeUploadManager.js +106 -0
  147. package/lib/summaryTreeUploadManager.js.map +1 -0
  148. package/lib/tokens.d.ts +24 -7
  149. package/lib/tokens.d.ts.map +1 -1
  150. package/lib/tokens.js.map +1 -1
  151. package/lib/treeUtils.d.ts +58 -0
  152. package/lib/treeUtils.d.ts.map +1 -0
  153. package/lib/treeUtils.js +100 -0
  154. package/lib/treeUtils.js.map +1 -0
  155. package/lib/wholeSummaryDocumentStorageService.d.ts +5 -4
  156. package/lib/wholeSummaryDocumentStorageService.d.ts.map +1 -1
  157. package/lib/wholeSummaryDocumentStorageService.js +70 -38
  158. package/lib/wholeSummaryDocumentStorageService.js.map +1 -1
  159. package/lib/wholeSummaryUploadManager.d.ts +16 -0
  160. package/lib/wholeSummaryUploadManager.d.ts.map +1 -0
  161. package/lib/wholeSummaryUploadManager.js +34 -0
  162. package/lib/wholeSummaryUploadManager.js.map +1 -0
  163. package/package.json +52 -54
  164. package/src/cache.ts +1 -1
  165. package/src/deltaStorageService.ts +11 -3
  166. package/src/documentService.ts +37 -22
  167. package/src/documentServiceFactory.ts +40 -21
  168. package/src/documentStorageService.ts +8 -4
  169. package/src/errorUtils.ts +16 -4
  170. package/src/gitManager.ts +116 -0
  171. package/src/historian.ts +121 -0
  172. package/src/index.ts +3 -0
  173. package/src/mapWithExpiration.ts +124 -0
  174. package/src/packageVersion.ts +1 -1
  175. package/src/restWrapper.ts +114 -38
  176. package/src/restWrapperBase.ts +146 -0
  177. package/src/retriableGitManager.ts +17 -95
  178. package/src/shreddedSummaryDocumentStorageService.ts +7 -9
  179. package/src/storageContracts.ts +63 -0
  180. package/src/summaryTreeUploadManager.ts +160 -0
  181. package/src/tokens.ts +24 -7
  182. package/src/treeUtils.ts +137 -0
  183. package/src/wholeSummaryDocumentStorageService.ts +118 -46
  184. package/src/wholeSummaryUploadManager.ts +64 -0
@@ -2,26 +2,39 @@
2
2
  * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
3
  * Licensed under the MIT License.
4
4
  */
5
- /// <reference types="node" />
6
- import type { ParsedUrlQueryInput } from "querystring";
7
- import { ITelemetryLogger } from "@fluidframework/common-definitions";
5
+ import { ITelemetryLogger, ITelemetryProperties } from "@fluidframework/common-definitions";
8
6
  import { RateLimiter } from "@fluidframework/driver-utils";
9
- import { RestWrapper } from "@fluidframework/server-services-client";
10
7
  import type { AxiosRequestConfig } from "axios";
11
8
  import { ITokenProvider, ITokenResponse } from "./tokens";
9
+ import { QueryStringType, RestWrapper } from "./restWrapperBase";
12
10
  declare type AuthorizationHeaderGetter = (token: ITokenResponse) => string;
13
11
  declare type TokenFetcher = (refresh?: boolean) => Promise<ITokenResponse>;
12
+ export interface IR11sResponse<T> {
13
+ content: T;
14
+ headers: Map<string, string>;
15
+ propsToLog: ITelemetryProperties;
16
+ requestUrl: string;
17
+ }
18
+ /**
19
+ * A utility function to create a r11s response without any additional props as we might not have them always.
20
+ * @param content - response which is equivalent to content.
21
+ * @returns - a r11s response without any extra props.
22
+ */
23
+ export declare function createR11sResponseFromContent<T>(content: T): IR11sResponse<T>;
24
+ export declare function getPropsToLogFromResponse(headers: {
25
+ get: (id: string) => string | undefined | null;
26
+ }): ITelemetryProperties;
14
27
  export declare class RouterliciousRestWrapper extends RestWrapper {
15
28
  private readonly rateLimiter;
16
- private token;
17
29
  private readonly fetchRefreshedToken;
18
30
  private readonly getAuthorizationHeader;
19
31
  private readonly useRestLess;
20
32
  private readonly restLess;
21
- constructor(logger: ITelemetryLogger, rateLimiter: RateLimiter, token: ITokenResponse, fetchRefreshedToken: TokenFetcher, getAuthorizationHeader: AuthorizationHeaderGetter, useRestLess: boolean, baseurl?: string, defaultQueryString?: ParsedUrlQueryInput);
22
- protected request<T>(requestConfig: AxiosRequestConfig, statusCode: number, canRetry?: boolean): Promise<T>;
33
+ private token;
34
+ constructor(logger: ITelemetryLogger, rateLimiter: RateLimiter, fetchRefreshedToken: TokenFetcher, getAuthorizationHeader: AuthorizationHeaderGetter, useRestLess: boolean, baseurl?: string, defaultQueryString?: QueryStringType);
35
+ protected request<T>(requestConfig: AxiosRequestConfig, statusCode: number, canRetry?: boolean): Promise<IR11sResponse<T>>;
23
36
  private generateHeaders;
24
- getToken(): ITokenResponse;
37
+ getToken(): Promise<ITokenResponse>;
25
38
  setToken(token: ITokenResponse): void;
26
39
  }
27
40
  export declare class RouterliciousStorageRestWrapper extends RouterliciousRestWrapper {
@@ -1 +1 @@
1
- {"version":3,"file":"restWrapper.d.ts","sourceRoot":"","sources":["../src/restWrapper.ts"],"names":[],"mappings":"AAAA;;;GAGG;;AAIH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAEvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,oCAAoC,CAAC;AAEtE,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAC3D,OAAO,EAGN,WAAW,EACX,MAAM,wCAAwC,CAAC;AAGhD,OAAO,KAAK,EAAE,kBAAkB,EAAuB,MAAM,OAAO,CAAC;AAIrE,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAG1D,aAAK,yBAAyB,GAAG,CAAC,KAAK,EAAE,cAAc,KAAK,MAAM,CAAC;AACnE,aAAK,YAAY,GAAG,CAAC,OAAO,CAAC,EAAE,OAAO,KAAK,OAAO,CAAC,cAAc,CAAC,CAAC;AAmBnE,qBAAa,wBAAyB,SAAQ,WAAW;IAKvD,OAAO,CAAC,QAAQ,CAAC,WAAW;IAC5B,OAAO,CAAC,KAAK;IACb,OAAO,CAAC,QAAQ,CAAC,mBAAmB;IACpC,OAAO,CAAC,QAAQ,CAAC,sBAAsB;IACvC,OAAO,CAAC,QAAQ,CAAC,WAAW;IAR7B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAwB;gBAGhD,MAAM,EAAE,gBAAgB,EACP,WAAW,EAAE,WAAW,EACjC,KAAK,EAAE,cAAc,EACZ,mBAAmB,EAAE,YAAY,EACjC,sBAAsB,EAAE,yBAAyB,EACjD,WAAW,EAAE,OAAO,EACrC,OAAO,CAAC,EAAE,MAAM,EAChB,kBAAkB,GAAE,mBAAwB;cAK7B,OAAO,CAAC,CAAC,EACxB,aAAa,EAAE,kBAAkB,EACjC,UAAU,EAAE,MAAM,EAClB,QAAQ,UAAO,GACb,OAAO,CAAC,CAAC,CAAC;IAwDb,OAAO,CAAC,eAAe;IAgBhB,QAAQ,IAAI,cAAc;IAI1B,QAAQ,CAAC,KAAK,EAAE,cAAc;CAGrC;AAED,qBAAa,+BAAgC,SAAQ,wBAAwB;IAC5E,OAAO;WAsBa,IAAI,CACvB,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,EAClB,aAAa,EAAE,cAAc,EAC7B,MAAM,EAAE,gBAAgB,EACxB,WAAW,EAAE,WAAW,EACxB,WAAW,EAAE,OAAO,EACpB,OAAO,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,+BAA+B,CAAC;CAkD3C;AAED,qBAAa,+BAAgC,SAAQ,wBAAwB;IAC5E,OAAO;WAsBa,IAAI,CACvB,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,GAAG,SAAS,EAC9B,aAAa,EAAE,cAAc,EAC7B,MAAM,EAAE,gBAAgB,EACxB,WAAW,EAAE,WAAW,EACxB,WAAW,EAAE,OAAO,EACpB,OAAO,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,+BAA+B,CAAC;CAwC3C"}
1
+ {"version":3,"file":"restWrapper.d.ts","sourceRoot":"","sources":["../src/restWrapper.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,oCAAoC,CAAC;AAE5F,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAO3D,OAAO,KAAK,EAAE,kBAAkB,EAAuB,MAAM,OAAO,CAAC;AAIrE,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAE1D,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEjE,aAAK,yBAAyB,GAAG,CAAC,KAAK,EAAE,cAAc,KAAK,MAAM,CAAC;AACnE,aAAK,YAAY,GAAG,CAAC,OAAO,CAAC,EAAE,OAAO,KAAK,OAAO,CAAC,cAAc,CAAC,CAAC;AAmBnE,MAAM,WAAW,aAAa,CAAC,CAAC;IAC/B,OAAO,EAAE,CAAC,CAAC;IACX,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,UAAU,EAAE,oBAAoB,CAAC;IACjC,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;IAClD,GAAG,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,GAAG,IAAI,CAAC;CAC/C,wBAwBA;AAED,qBAAa,wBAAyB,SAAQ,WAAW;IAMvD,OAAO,CAAC,QAAQ,CAAC,WAAW;IAC5B,OAAO,CAAC,QAAQ,CAAC,mBAAmB;IACpC,OAAO,CAAC,QAAQ,CAAC,sBAAsB;IACvC,OAAO,CAAC,QAAQ,CAAC,WAAW;IAR7B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAwB;IACjD,OAAO,CAAC,KAAK,CAA6B;gBAGzC,MAAM,EAAE,gBAAgB,EACP,WAAW,EAAE,WAAW,EACxB,mBAAmB,EAAE,YAAY,EACjC,sBAAsB,EAAE,yBAAyB,EACjD,WAAW,EAAE,OAAO,EACrC,OAAO,CAAC,EAAE,MAAM,EAChB,kBAAkB,GAAE,eAAoB;cAKzB,OAAO,CAAC,CAAC,EACxB,aAAa,EAAE,kBAAkB,EACjC,UAAU,EAAE,MAAM,EAClB,QAAQ,UAAO,GACb,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;YAkFd,eAAe;IAkBhB,QAAQ,IAAI,OAAO,CAAC,cAAc,CAAC;IASzC,QAAQ,CAAC,KAAK,EAAE,cAAc;CAGrC;AAED,qBAAa,+BAAgC,SAAQ,wBAAwB;IAC5E,OAAO;WAoBa,IAAI,CACvB,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,EAClB,aAAa,EAAE,cAAc,EAC7B,MAAM,EAAE,gBAAgB,EACxB,WAAW,EAAE,WAAW,EACxB,WAAW,EAAE,OAAO,EACpB,OAAO,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,+BAA+B,CAAC;CA+C3C;AAED,qBAAa,+BAAgC,SAAQ,wBAAwB;IAC5E,OAAO;WAoBa,IAAI,CACvB,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,GAAG,SAAS,EAC9B,aAAa,EAAE,cAAc,EAC7B,MAAM,EAAE,gBAAgB,EACxB,WAAW,EAAE,WAAW,EACxB,WAAW,EAAE,OAAO,EACpB,OAAO,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,+BAA+B,CAAC;CAqC3C"}
@@ -2,14 +2,15 @@
2
2
  * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
3
  * Licensed under the MIT License.
4
4
  */
5
- import { fromUtf8ToBase64 } from "@fluidframework/common-utils";
6
- import { getAuthorizationTokenFromCredentials, RestLessClient, RestWrapper, } from "@fluidframework/server-services-client";
7
- import { PerformanceEvent } from "@fluidframework/telemetry-utils";
5
+ import { assert, fromUtf8ToBase64, performance } from "@fluidframework/common-utils";
6
+ import { getAuthorizationTokenFromCredentials, RestLessClient, } from "@fluidframework/server-services-client";
7
+ import { PerformanceEvent, TelemetryLogger } from "@fluidframework/telemetry-utils";
8
8
  import fetch from "cross-fetch";
9
9
  import safeStringify from "json-stringify-safe";
10
10
  import { v4 as uuid } from "uuid";
11
11
  import { throwR11sNetworkError } from "./errorUtils";
12
12
  import { pkgVersion as driverVersion } from "./packageVersion";
13
+ import { RestWrapper } from "./restWrapperBase";
13
14
  const axiosRequestConfigToFetchRequestConfig = (requestConfig) => {
14
15
  var _a, _b;
15
16
  const requestInfo = requestConfig.baseURL !== undefined
@@ -24,11 +25,49 @@ const axiosRequestConfigToFetchRequestConfig = (requestConfig) => {
24
25
  };
25
26
  return [requestInfo, requestInit];
26
27
  };
28
+ /**
29
+ * A utility function to create a r11s response without any additional props as we might not have them always.
30
+ * @param content - response which is equivalent to content.
31
+ * @returns - a r11s response without any extra props.
32
+ */
33
+ export function createR11sResponseFromContent(content) {
34
+ return {
35
+ content,
36
+ headers: new Map(),
37
+ propsToLog: {},
38
+ requestUrl: "",
39
+ };
40
+ }
41
+ function headersToMap(headers) {
42
+ const newHeaders = new Map();
43
+ for (const [key, value] of headers.entries()) {
44
+ newHeaders.set(key, value);
45
+ }
46
+ return newHeaders;
47
+ }
48
+ export function getPropsToLogFromResponse(headers) {
49
+ // We rename headers so that otel doesn't scrub them away. Otel doesn't allow
50
+ // certain characters in headers including '-'
51
+ const headersToLog = [
52
+ { headerName: "x-correlation-id", logName: "requestCorrelationId" },
53
+ { headerName: "content-encoding", logName: "contentEncoding" },
54
+ { headerName: "content-type", logName: "contentType" },
55
+ ];
56
+ const additionalProps = {
57
+ contentsize: TelemetryLogger.numberFromString(headers.get("content-length")),
58
+ };
59
+ headersToLog.forEach((header) => {
60
+ const headerValue = headers.get(header.headerName);
61
+ if (headerValue !== undefined && headerValue !== null) {
62
+ additionalProps[header.logName] = headerValue;
63
+ }
64
+ });
65
+ return additionalProps;
66
+ }
27
67
  export class RouterliciousRestWrapper extends RestWrapper {
28
- constructor(logger, rateLimiter, token, fetchRefreshedToken, getAuthorizationHeader, useRestLess, baseurl, defaultQueryString = {}) {
68
+ constructor(logger, rateLimiter, fetchRefreshedToken, getAuthorizationHeader, useRestLess, baseurl, defaultQueryString = {}) {
29
69
  super(baseurl, defaultQueryString);
30
70
  this.rateLimiter = rateLimiter;
31
- this.token = token;
32
71
  this.fetchRefreshedToken = fetchRefreshedToken;
33
72
  this.getAuthorizationHeader = getAuthorizationHeader;
34
73
  this.useRestLess = useRestLess;
@@ -36,21 +75,43 @@ export class RouterliciousRestWrapper extends RestWrapper {
36
75
  }
37
76
  async request(requestConfig, statusCode, canRetry = true) {
38
77
  var _a;
39
- const config = Object.assign(Object.assign({}, requestConfig), { headers: this.generateHeaders(requestConfig.headers) });
78
+ const config = Object.assign(Object.assign({}, requestConfig), { headers: await this.generateHeaders(requestConfig.headers) });
40
79
  const translatedConfig = this.useRestLess ? this.restLess.translate(config) : config;
41
80
  const fetchRequestConfig = axiosRequestConfigToFetchRequestConfig(translatedConfig);
42
- const response = await this.rateLimiter.schedule(async () => fetch(...fetchRequestConfig).catch(async (error) => {
43
- // Browser Fetch throws a TypeError on network error, `node-fetch` throws a FetchError
44
- const isNetworkError = ["TypeError", "FetchError"].includes(error === null || error === void 0 ? void 0 : error.name);
45
- throwR11sNetworkError(isNetworkError ? `NetworkError: ${error.message}` : safeStringify(error));
46
- }));
81
+ const res = await this.rateLimiter.schedule(async () => {
82
+ const perfStart = performance.now();
83
+ const result = await fetch(...fetchRequestConfig).catch(async (error) => {
84
+ // Browser Fetch throws a TypeError on network error, `node-fetch` throws a FetchError
85
+ const isNetworkError = ["TypeError", "FetchError"].includes(error === null || error === void 0 ? void 0 : error.name);
86
+ throwR11sNetworkError(isNetworkError ? `NetworkError: ${error.message}` : safeStringify(error));
87
+ });
88
+ return {
89
+ response: result,
90
+ duration: performance.now() - perfStart,
91
+ };
92
+ });
93
+ const response = res.response;
94
+ let start = performance.now();
95
+ const text = await response.text();
96
+ const receiveContentTime = performance.now() - start;
97
+ const bodySize = text.length;
98
+ start = performance.now();
47
99
  const responseBody = ((_a = response.headers.get("content-type")) === null || _a === void 0 ? void 0 : _a.includes("application/json"))
48
- ? await response.json()
49
- : await response.text();
100
+ ? JSON.parse(text)
101
+ : text;
102
+ const parseTime = performance.now() - start;
50
103
  // Success
51
104
  if (response.ok || response.status === statusCode) {
52
105
  const result = responseBody;
53
- return result;
106
+ const headers = headersToMap(response.headers);
107
+ return {
108
+ content: result,
109
+ headers,
110
+ requestUrl: fetchRequestConfig[0].toString(),
111
+ propsToLog: Object.assign(Object.assign({}, getPropsToLogFromResponse(headers)), { bodySize,
112
+ receiveContentTime,
113
+ parseTime, fetchTime: res.duration }),
114
+ };
54
115
  }
55
116
  // Failure
56
117
  if (response.status === 401 && canRetry) {
@@ -71,26 +132,33 @@ export class RouterliciousRestWrapper extends RestWrapper {
71
132
  : response.statusText;
72
133
  throwR11sNetworkError(`R11s fetch error: ${responseSummary}`, response.status, responseBody === null || responseBody === void 0 ? void 0 : responseBody.retryAfter);
73
134
  }
74
- generateHeaders(requestHeaders) {
135
+ async generateHeaders(requestHeaders) {
75
136
  var _a;
137
+ const token = await this.getToken();
138
+ assert(token !== undefined, "token should be present");
76
139
  const correlationId = (_a = requestHeaders === null || requestHeaders === void 0 ? void 0 : requestHeaders["x-correlation-id"]) !== null && _a !== void 0 ? _a : uuid();
77
140
  return Object.assign(Object.assign({}, requestHeaders), {
78
141
  // TODO: replace header names with CorrelationIdHeaderName and DriverVersionHeaderName from services-client
79
142
  // NOTE: Can correlationId actually be number | true?
80
143
  "x-correlation-id": correlationId, "x-driver-version": driverVersion,
81
144
  // NOTE: If this.authorizationHeader is undefined, should "Authorization" be removed entirely?
82
- "Authorization": this.getAuthorizationHeader(this.token) });
145
+ "Authorization": this.getAuthorizationHeader(token) });
83
146
  }
84
- getToken() {
85
- return this.token;
147
+ async getToken() {
148
+ if (this.token !== undefined) {
149
+ return this.token;
150
+ }
151
+ const token = await this.fetchRefreshedToken();
152
+ this.setToken(token);
153
+ return token;
86
154
  }
87
155
  setToken(token) {
88
156
  this.token = token;
89
157
  }
90
158
  }
91
159
  export class RouterliciousStorageRestWrapper extends RouterliciousRestWrapper {
92
- constructor(logger, rateLimiter, token, fetchToken, getAuthorizationHeader, useRestLess, baseurl, defaultQueryString = {}) {
93
- super(logger, rateLimiter, token, fetchToken, getAuthorizationHeader, useRestLess, baseurl, defaultQueryString);
160
+ constructor(logger, rateLimiter, fetchToken, getAuthorizationHeader, useRestLess, baseurl, defaultQueryString = {}) {
161
+ super(logger, rateLimiter, fetchToken, getAuthorizationHeader, useRestLess, baseurl, defaultQueryString);
94
162
  }
95
163
  static async load(tenantId, documentId, tokenProvider, logger, rateLimiter, useRestLess, baseurl) {
96
164
  const defaultQueryString = {
@@ -113,14 +181,13 @@ export class RouterliciousStorageRestWrapper extends RouterliciousRestWrapper {
113
181
  };
114
182
  return getAuthorizationTokenFromCredentials(credentials);
115
183
  };
116
- const storagetoken = await fetchStorageToken();
117
- const restWrapper = new RouterliciousStorageRestWrapper(logger, rateLimiter, storagetoken, fetchStorageToken, getAuthorizationHeader, useRestLess, baseurl, defaultQueryString);
184
+ const restWrapper = new RouterliciousStorageRestWrapper(logger, rateLimiter, fetchStorageToken, getAuthorizationHeader, useRestLess, baseurl, defaultQueryString);
118
185
  return restWrapper;
119
186
  }
120
187
  }
121
188
  export class RouterliciousOrdererRestWrapper extends RouterliciousRestWrapper {
122
- constructor(logger, rateLimiter, token, fetchToken, getAuthorizationHeader, useRestLess, baseurl, defaultQueryString = {}) {
123
- super(logger, rateLimiter, token, fetchToken, getAuthorizationHeader, useRestLess, baseurl, defaultQueryString);
189
+ constructor(logger, rateLimiter, fetchToken, getAuthorizationHeader, useRestLess, baseurl, defaultQueryString = {}) {
190
+ super(logger, rateLimiter, fetchToken, getAuthorizationHeader, useRestLess, baseurl, defaultQueryString);
124
191
  }
125
192
  static async load(tenantId, documentId, tokenProvider, logger, rateLimiter, useRestLess, baseurl) {
126
193
  const getAuthorizationHeader = (token) => {
@@ -135,8 +202,7 @@ export class RouterliciousOrdererRestWrapper extends RouterliciousRestWrapper {
135
202
  return ordererToken;
136
203
  });
137
204
  };
138
- const newtoken = await fetchOrdererToken();
139
- const restWrapper = new RouterliciousOrdererRestWrapper(logger, rateLimiter, newtoken, fetchOrdererToken, getAuthorizationHeader, useRestLess, baseurl);
205
+ const restWrapper = new RouterliciousOrdererRestWrapper(logger, rateLimiter, fetchOrdererToken, getAuthorizationHeader, useRestLess, baseurl);
140
206
  return restWrapper;
141
207
  }
142
208
  }
@@ -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\n// Just using the type from a node.js module does not introduce a runtime dependency.\n// eslint-disable-next-line import/no-nodejs-modules\nimport type { ParsedUrlQueryInput } from \"querystring\";\n\nimport { ITelemetryLogger } from \"@fluidframework/common-definitions\";\nimport { fromUtf8ToBase64 } from \"@fluidframework/common-utils\";\nimport { RateLimiter } from \"@fluidframework/driver-utils\";\nimport {\n\tgetAuthorizationTokenFromCredentials,\n\tRestLessClient,\n\tRestWrapper,\n} from \"@fluidframework/server-services-client\";\nimport { PerformanceEvent } from \"@fluidframework/telemetry-utils\";\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, ITokenResponse } from \"./tokens\";\nimport { pkgVersion as driverVersion } from \"./packageVersion\";\n\ntype AuthorizationHeaderGetter = (token: ITokenResponse) => string;\ntype TokenFetcher = (refresh?: boolean) => Promise<ITokenResponse>;\n\nconst axiosRequestConfigToFetchRequestConfig = (\n\trequestConfig: AxiosRequestConfig,\n): [RequestInfo, RequestInit] => {\n\tconst requestInfo: string =\n\t\trequestConfig.baseURL !== undefined\n\t\t\t? `${requestConfig.baseURL}${requestConfig.url ?? \"\"}`\n\t\t\t: requestConfig.url ?? \"\";\n\tconst requestInit: RequestInit = {\n\t\tmethod: requestConfig.method,\n\t\t// NOTE: I believe that although the Axios 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 [requestInfo, requestInit];\n};\n\nexport class RouterliciousRestWrapper extends RestWrapper {\n\tprivate readonly restLess = new RestLessClient();\n\n\tconstructor(\n\t\tlogger: ITelemetryLogger,\n\t\tprivate readonly rateLimiter: RateLimiter,\n\t\tprivate token: ITokenResponse,\n\t\tprivate readonly fetchRefreshedToken: TokenFetcher,\n\t\tprivate readonly getAuthorizationHeader: AuthorizationHeaderGetter,\n\t\tprivate readonly useRestLess: boolean,\n\t\tbaseurl?: string,\n\t\tdefaultQueryString: ParsedUrlQueryInput = {},\n\t) {\n\t\tsuper(baseurl, defaultQueryString);\n\t}\n\n\tprotected async request<T>(\n\t\trequestConfig: AxiosRequestConfig,\n\t\tstatusCode: number,\n\t\tcanRetry = true,\n\t): Promise<T> {\n\t\tconst config = {\n\t\t\t...requestConfig,\n\t\t\theaders: this.generateHeaders(requestConfig.headers),\n\t\t};\n\n\t\tconst translatedConfig = this.useRestLess ? this.restLess.translate(config) : config;\n\t\tconst fetchRequestConfig = axiosRequestConfigToFetchRequestConfig(translatedConfig);\n\n\t\tconst response: Response = await this.rateLimiter.schedule(async () =>\n\t\t\tfetch(...fetchRequestConfig).catch(async (error) => {\n\t\t\t\t// Browser Fetch throws a TypeError on network error, `node-fetch` throws a FetchError\n\t\t\t\tconst isNetworkError = [\"TypeError\", \"FetchError\"].includes(error?.name);\n\t\t\t\tthrowR11sNetworkError(\n\t\t\t\t\tisNetworkError ? `NetworkError: ${error.message}` : safeStringify(error),\n\t\t\t\t);\n\t\t\t}),\n\t\t);\n\n\t\tconst responseBody: any = response.headers.get(\"content-type\")?.includes(\"application/json\")\n\t\t\t? await response.json()\n\t\t\t: await response.text();\n\n\t\t// Success\n\t\tif (response.ok || response.status === statusCode) {\n\t\t\tconst result: T = responseBody;\n\t\t\treturn result;\n\t\t}\n\t\t// Failure\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<T>((resolve, reject) =>\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tthis.request<T>(config, statusCode).then(resolve).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? typeof responseBody === \"string\"\n\t\t\t\t\t? responseBody\n\t\t\t\t\t: safeStringify(responseBody)\n\t\t\t\t: response.statusText;\n\t\tthrowR11sNetworkError(\n\t\t\t`R11s fetch error: ${responseSummary}`,\n\t\t\tresponse.status,\n\t\t\tresponseBody?.retryAfter,\n\t\t);\n\t}\n\n\tprivate generateHeaders(\n\t\trequestHeaders?: AxiosRequestHeaders | undefined,\n\t): Record<string, string> {\n\t\tconst correlationId = requestHeaders?.[\"x-correlation-id\"] ?? uuid();\n\n\t\treturn {\n\t\t\t...requestHeaders,\n\t\t\t// TODO: replace header names with CorrelationIdHeaderName and DriverVersionHeaderName from services-client\n\t\t\t// NOTE: Can correlationId actually be number | true?\n\t\t\t\"x-correlation-id\": correlationId as string,\n\t\t\t\"x-driver-version\": driverVersion,\n\t\t\t// NOTE: If this.authorizationHeader is undefined, should \"Authorization\" be removed entirely?\n\t\t\t\"Authorization\": this.getAuthorizationHeader(this.token),\n\t\t};\n\t}\n\n\tpublic getToken(): ITokenResponse {\n\t\treturn this.token;\n\t}\n\n\tpublic setToken(token: ITokenResponse) {\n\t\tthis.token = token;\n\t}\n}\n\nexport class RouterliciousStorageRestWrapper extends RouterliciousRestWrapper {\n\tprivate constructor(\n\t\tlogger: ITelemetryLogger,\n\t\trateLimiter: RateLimiter,\n\t\ttoken: ITokenResponse,\n\t\tfetchToken: TokenFetcher,\n\t\tgetAuthorizationHeader: AuthorizationHeaderGetter,\n\t\tuseRestLess: boolean,\n\t\tbaseurl?: string,\n\t\tdefaultQueryString: ParsedUrlQueryInput = {},\n\t) {\n\t\tsuper(\n\t\t\tlogger,\n\t\t\trateLimiter,\n\t\t\ttoken,\n\t\t\tfetchToken,\n\t\t\tgetAuthorizationHeader,\n\t\t\tuseRestLess,\n\t\t\tbaseurl,\n\t\t\tdefaultQueryString,\n\t\t);\n\t}\n\n\tpublic static async load(\n\t\ttenantId: string,\n\t\tdocumentId: string,\n\t\ttokenProvider: ITokenProvider,\n\t\tlogger: ITelemetryLogger,\n\t\trateLimiter: RateLimiter,\n\t\tuseRestLess: boolean,\n\t\tbaseurl?: string,\n\t): Promise<RouterliciousStorageRestWrapper> {\n\t\tconst defaultQueryString = {\n\t\t\ttoken: `${fromUtf8ToBase64(tenantId)}`,\n\t\t};\n\n\t\tconst fetchStorageToken = async (refreshToken?: boolean): Promise<ITokenResponse> => {\n\t\t\treturn PerformanceEvent.timedExecAsync(\n\t\t\t\tlogger,\n\t\t\t\t{\n\t\t\t\t\teventName: \"FetchStorageToken\",\n\t\t\t\t\tdocId: documentId,\n\t\t\t\t},\n\t\t\t\tasync () => {\n\t\t\t\t\t// Craft credentials using tenant id and token\n\t\t\t\t\tconst storageToken = await tokenProvider.fetchStorageToken(\n\t\t\t\t\t\ttenantId,\n\t\t\t\t\t\tdocumentId,\n\t\t\t\t\t\trefreshToken,\n\t\t\t\t\t);\n\n\t\t\t\t\treturn storageToken;\n\t\t\t\t},\n\t\t\t);\n\t\t};\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 storagetoken = await fetchStorageToken();\n\n\t\tconst restWrapper = new RouterliciousStorageRestWrapper(\n\t\t\tlogger,\n\t\t\trateLimiter,\n\t\t\tstoragetoken,\n\t\t\tfetchStorageToken,\n\t\t\tgetAuthorizationHeader,\n\t\t\tuseRestLess,\n\t\t\tbaseurl,\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: ITelemetryLogger,\n\t\trateLimiter: RateLimiter,\n\t\ttoken: ITokenResponse,\n\t\tfetchToken: TokenFetcher,\n\t\tgetAuthorizationHeader: AuthorizationHeaderGetter,\n\t\tuseRestLess: boolean,\n\t\tbaseurl?: string,\n\t\tdefaultQueryString: ParsedUrlQueryInput = {},\n\t) {\n\t\tsuper(\n\t\t\tlogger,\n\t\t\trateLimiter,\n\t\t\ttoken,\n\t\t\tfetchToken,\n\t\t\tgetAuthorizationHeader,\n\t\t\tuseRestLess,\n\t\t\tbaseurl,\n\t\t\tdefaultQueryString,\n\t\t);\n\t}\n\n\tpublic static async load(\n\t\ttenantId: string,\n\t\tdocumentId: string | undefined,\n\t\ttokenProvider: ITokenProvider,\n\t\tlogger: ITelemetryLogger,\n\t\trateLimiter: RateLimiter,\n\t\tuseRestLess: boolean,\n\t\tbaseurl?: string,\n\t): Promise<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 fetchOrdererToken = async (refreshToken?: boolean): Promise<ITokenResponse> => {\n\t\t\treturn PerformanceEvent.timedExecAsync(\n\t\t\t\tlogger,\n\t\t\t\t{\n\t\t\t\t\teventName: \"FetchOrdererToken\",\n\t\t\t\t\tdocId: documentId,\n\t\t\t\t},\n\t\t\t\tasync () => {\n\t\t\t\t\tconst ordererToken = await tokenProvider.fetchOrdererToken(\n\t\t\t\t\t\ttenantId,\n\t\t\t\t\t\tdocumentId,\n\t\t\t\t\t\trefreshToken,\n\t\t\t\t\t);\n\n\t\t\t\t\treturn ordererToken;\n\t\t\t\t},\n\t\t\t);\n\t\t};\n\n\t\tconst newtoken = await fetchOrdererToken();\n\n\t\tconst restWrapper = new RouterliciousOrdererRestWrapper(\n\t\t\tlogger,\n\t\t\trateLimiter,\n\t\t\tnewtoken,\n\t\t\tfetchOrdererToken,\n\t\t\tgetAuthorizationHeader,\n\t\t\tuseRestLess,\n\t\t\tbaseurl,\n\t\t);\n\n\t\treturn restWrapper;\n\t}\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 { ITelemetryLogger, ITelemetryProperties } from \"@fluidframework/common-definitions\";\nimport { assert, fromUtf8ToBase64, performance } from \"@fluidframework/common-utils\";\nimport { RateLimiter } from \"@fluidframework/driver-utils\";\nimport {\n\tgetAuthorizationTokenFromCredentials,\n\tRestLessClient,\n} from \"@fluidframework/server-services-client\";\nimport { PerformanceEvent, TelemetryLogger } from \"@fluidframework/telemetry-utils\";\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, ITokenResponse } from \"./tokens\";\nimport { pkgVersion as driverVersion } from \"./packageVersion\";\nimport { QueryStringType, RestWrapper } from \"./restWrapperBase\";\n\ntype AuthorizationHeaderGetter = (token: ITokenResponse) => string;\ntype TokenFetcher = (refresh?: boolean) => Promise<ITokenResponse>;\n\nconst axiosRequestConfigToFetchRequestConfig = (\n\trequestConfig: AxiosRequestConfig,\n): [RequestInfo, RequestInit] => {\n\tconst requestInfo: string =\n\t\trequestConfig.baseURL !== undefined\n\t\t\t? `${requestConfig.baseURL}${requestConfig.url ?? \"\"}`\n\t\t\t: requestConfig.url ?? \"\";\n\tconst requestInit: RequestInit = {\n\t\tmethod: requestConfig.method,\n\t\t// NOTE: I believe that although the Axios 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 [requestInfo, requestInit];\n};\n\nexport interface IR11sResponse<T> {\n\tcontent: T;\n\theaders: Map<string, string>;\n\tpropsToLog: ITelemetryProperties;\n\trequestUrl: string;\n}\n\n/**\n * A utility function to create a r11s response without any additional props as we might not have them always.\n * @param content - response which is equivalent to content.\n * @returns - a r11s 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) {\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\tget: (id: string) => string | undefined | null;\n}) {\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: \"x-correlation-id\", logName: \"requestCorrelationId\" },\n\t\t{ headerName: \"content-encoding\", logName: \"contentEncoding\" },\n\t\t{ headerName: \"content-type\", logName: \"contentType\" },\n\t];\n\tconst additionalProps: ITelemetryProperties = {\n\t\tcontentsize: TelemetryLogger.numberFromString(headers.get(\"content-length\")),\n\t};\n\theadersToLog.forEach((header) => {\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\nexport class RouterliciousRestWrapper extends RestWrapper {\n\tprivate readonly restLess = new RestLessClient();\n\tprivate token: ITokenResponse | undefined;\n\n\tconstructor(\n\t\tlogger: ITelemetryLogger,\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\tdefaultQueryString: QueryStringType = {},\n\t) {\n\t\tsuper(baseurl, defaultQueryString);\n\t}\n\n\tprotected async request<T>(\n\t\trequestConfig: AxiosRequestConfig,\n\t\tstatusCode: number,\n\t\tcanRetry = true,\n\t): Promise<IR11sResponse<T>> {\n\t\tconst config = {\n\t\t\t...requestConfig,\n\t\t\theaders: await this.generateHeaders(requestConfig.headers),\n\t\t};\n\n\t\tconst translatedConfig = this.useRestLess ? this.restLess.translate(config) : config;\n\t\tconst fetchRequestConfig = axiosRequestConfigToFetchRequestConfig(translatedConfig);\n\n\t\tconst res = await this.rateLimiter.schedule(async () => {\n\t\t\tconst perfStart = performance.now();\n\t\t\tconst result = await fetch(...fetchRequestConfig).catch(async (error) => {\n\t\t\t\t// Browser Fetch throws a TypeError on network error, `node-fetch` throws a FetchError\n\t\t\t\tconst isNetworkError = [\"TypeError\", \"FetchError\"].includes(error?.name);\n\t\t\t\tthrowR11sNetworkError(\n\t\t\t\t\tisNetworkError ? `NetworkError: ${error.message}` : safeStringify(error),\n\t\t\t\t);\n\t\t\t});\n\t\t\treturn {\n\t\t\t\tresponse: result,\n\t\t\t\tduration: performance.now() - perfStart,\n\t\t\t};\n\t\t});\n\n\t\tconst response = res.response;\n\n\t\tlet start = performance.now();\n\t\tconst text = await response.text();\n\t\tconst receiveContentTime = performance.now() - start;\n\n\t\tconst bodySize = text.length;\n\t\tstart = performance.now();\n\t\tconst responseBody: any = response.headers.get(\"content-type\")?.includes(\"application/json\")\n\t\t\t? JSON.parse(text)\n\t\t\t: text;\n\t\tconst parseTime = performance.now() - start;\n\n\t\t// Success\n\t\tif (response.ok || response.status === statusCode) {\n\t\t\tconst result = responseBody as T;\n\t\t\tconst headers = headersToMap(response.headers);\n\t\t\treturn {\n\t\t\t\tcontent: result,\n\t\t\t\theaders,\n\t\t\t\trequestUrl: fetchRequestConfig[0].toString(),\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\t\t// Failure\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\tthis.request<T>(config, statusCode).then(resolve).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? typeof responseBody === \"string\"\n\t\t\t\t\t? responseBody\n\t\t\t\t\t: safeStringify(responseBody)\n\t\t\t\t: response.statusText;\n\t\tthrowR11sNetworkError(\n\t\t\t`R11s fetch error: ${responseSummary}`,\n\t\t\tresponse.status,\n\t\t\tresponseBody?.retryAfter,\n\t\t);\n\t}\n\n\tprivate async generateHeaders(\n\t\trequestHeaders?: AxiosRequestHeaders | undefined,\n\t): Promise<Record<string, string>> {\n\t\tconst token = await this.getToken();\n\t\tassert(token !== undefined, \"token should be present\");\n\t\tconst correlationId = requestHeaders?.[\"x-correlation-id\"] ?? uuid();\n\n\t\treturn {\n\t\t\t...requestHeaders,\n\t\t\t// TODO: replace header names with CorrelationIdHeaderName and DriverVersionHeaderName from services-client\n\t\t\t// NOTE: Can correlationId actually be number | true?\n\t\t\t\"x-correlation-id\": correlationId as string,\n\t\t\t\"x-driver-version\": driverVersion,\n\t\t\t// NOTE: If this.authorizationHeader is undefined, should \"Authorization\" be removed entirely?\n\t\t\t\"Authorization\": this.getAuthorizationHeader(token),\n\t\t};\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.fetchRefreshedToken();\n\t\tthis.setToken(token);\n\t\treturn token;\n\t}\n\n\tpublic setToken(token: ITokenResponse) {\n\t\tthis.token = token;\n\t}\n}\n\nexport class RouterliciousStorageRestWrapper extends RouterliciousRestWrapper {\n\tprivate constructor(\n\t\tlogger: ITelemetryLogger,\n\t\trateLimiter: RateLimiter,\n\t\tfetchToken: TokenFetcher,\n\t\tgetAuthorizationHeader: AuthorizationHeaderGetter,\n\t\tuseRestLess: boolean,\n\t\tbaseurl?: string,\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\tdefaultQueryString,\n\t\t);\n\t}\n\n\tpublic static async load(\n\t\ttenantId: string,\n\t\tdocumentId: string,\n\t\ttokenProvider: ITokenProvider,\n\t\tlogger: ITelemetryLogger,\n\t\trateLimiter: RateLimiter,\n\t\tuseRestLess: boolean,\n\t\tbaseurl?: string,\n\t): Promise<RouterliciousStorageRestWrapper> {\n\t\tconst defaultQueryString = {\n\t\t\ttoken: `${fromUtf8ToBase64(tenantId)}`,\n\t\t};\n\n\t\tconst fetchStorageToken = async (refreshToken?: boolean): Promise<ITokenResponse> => {\n\t\t\treturn PerformanceEvent.timedExecAsync(\n\t\t\t\tlogger,\n\t\t\t\t{\n\t\t\t\t\teventName: \"FetchStorageToken\",\n\t\t\t\t\tdocId: documentId,\n\t\t\t\t},\n\t\t\t\tasync () => {\n\t\t\t\t\t// Craft credentials using tenant id and token\n\t\t\t\t\tconst storageToken = await tokenProvider.fetchStorageToken(\n\t\t\t\t\t\ttenantId,\n\t\t\t\t\t\tdocumentId,\n\t\t\t\t\t\trefreshToken,\n\t\t\t\t\t);\n\n\t\t\t\t\treturn storageToken;\n\t\t\t\t},\n\t\t\t);\n\t\t};\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\tfetchStorageToken,\n\t\t\tgetAuthorizationHeader,\n\t\t\tuseRestLess,\n\t\t\tbaseurl,\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: ITelemetryLogger,\n\t\trateLimiter: RateLimiter,\n\t\tfetchToken: TokenFetcher,\n\t\tgetAuthorizationHeader: AuthorizationHeaderGetter,\n\t\tuseRestLess: boolean,\n\t\tbaseurl?: string,\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\tdefaultQueryString,\n\t\t);\n\t}\n\n\tpublic static async load(\n\t\ttenantId: string,\n\t\tdocumentId: string | undefined,\n\t\ttokenProvider: ITokenProvider,\n\t\tlogger: ITelemetryLogger,\n\t\trateLimiter: RateLimiter,\n\t\tuseRestLess: boolean,\n\t\tbaseurl?: string,\n\t): Promise<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 fetchOrdererToken = async (refreshToken?: boolean): Promise<ITokenResponse> => {\n\t\t\treturn PerformanceEvent.timedExecAsync(\n\t\t\t\tlogger,\n\t\t\t\t{\n\t\t\t\t\teventName: \"FetchOrdererToken\",\n\t\t\t\t\tdocId: documentId,\n\t\t\t\t},\n\t\t\t\tasync () => {\n\t\t\t\t\tconst ordererToken = await tokenProvider.fetchOrdererToken(\n\t\t\t\t\t\ttenantId,\n\t\t\t\t\t\tdocumentId,\n\t\t\t\t\t\trefreshToken,\n\t\t\t\t\t);\n\n\t\t\t\t\treturn ordererToken;\n\t\t\t\t},\n\t\t\t);\n\t\t};\n\n\t\tconst restWrapper = new RouterliciousOrdererRestWrapper(\n\t\t\tlogger,\n\t\t\trateLimiter,\n\t\t\tfetchOrdererToken,\n\t\t\tgetAuthorizationHeader,\n\t\t\tuseRestLess,\n\t\t\tbaseurl,\n\t\t);\n\n\t\treturn restWrapper;\n\t}\n}\n"]}
@@ -0,0 +1,26 @@
1
+ /*!
2
+ * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
+ * Licensed under the MIT License.
4
+ */
5
+ import type { AxiosRequestConfig, AxiosRequestHeaders } from "axios";
6
+ import { IR11sResponse } from "./restWrapper";
7
+ export declare abstract class RestWrapper {
8
+ protected readonly baseurl?: string | undefined;
9
+ protected defaultQueryString: QueryStringType;
10
+ protected readonly maxBodyLength: number;
11
+ protected readonly maxContentLength: number;
12
+ constructor(baseurl?: string | undefined, defaultQueryString?: QueryStringType, maxBodyLength?: number, maxContentLength?: number);
13
+ get<T>(url: string, queryString?: QueryStringType, headers?: AxiosRequestHeaders, additionalOptions?: Partial<Omit<AxiosRequestConfig, "baseURL" | "headers" | "maxBodyLength" | "maxContentLength" | "method" | "url">>): Promise<IR11sResponse<T>>;
14
+ post<T>(url: string, requestBody: any, queryString?: QueryStringType, headers?: AxiosRequestHeaders, additionalOptions?: Partial<Omit<AxiosRequestConfig, "baseURL" | "headers" | "maxBodyLength" | "maxContentLength" | "method" | "url">>): Promise<IR11sResponse<T>>;
15
+ delete<T>(url: string, queryString?: QueryStringType, headers?: AxiosRequestHeaders, additionalOptions?: Partial<Omit<AxiosRequestConfig, "baseURL" | "headers" | "maxBodyLength" | "maxContentLength" | "method" | "url">>): Promise<IR11sResponse<T>>;
16
+ patch<T>(url: string, requestBody: any, queryString?: QueryStringType, headers?: AxiosRequestHeaders, additionalOptions?: Partial<Omit<AxiosRequestConfig, "baseURL" | "headers" | "maxBodyLength" | "maxContentLength" | "method" | "url">>): Promise<IR11sResponse<T>>;
17
+ protected abstract request<T>(options: AxiosRequestConfig, statusCode: number, addNetworkCallProps?: boolean): Promise<IR11sResponse<T>>;
18
+ protected generateQueryString(queryStringValues?: QueryStringType): string;
19
+ }
20
+ /**
21
+ * Generates query string from the given query parameters.
22
+ * @param queryParams - Query parameters from which to create a query.
23
+ */
24
+ export declare function getQueryString(queryParams: QueryStringType): string;
25
+ export declare type QueryStringType = Record<string, string | number | boolean>;
26
+ //# sourceMappingURL=restWrapperBase.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"restWrapperBase.d.ts","sourceRoot":"","sources":["../src/restWrapperBase.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,OAAO,CAAC;AACrE,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAE9C,8BAAsB,WAAW;IAE/B,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC;IAC3B,SAAS,CAAC,kBAAkB,EAAE,eAAe;IAC7C,SAAS,CAAC,QAAQ,CAAC,aAAa;IAChC,SAAS,CAAC,QAAQ,CAAC,gBAAgB;gBAHhB,OAAO,CAAC,oBAAQ,EACzB,kBAAkB,GAAE,eAAoB,EAC/B,aAAa,SAAqB,EAClC,gBAAgB,SAAqB;IAG5C,GAAG,CAAC,CAAC,EACjB,GAAG,EAAE,MAAM,EACX,WAAW,CAAC,EAAE,eAAe,EAC7B,OAAO,CAAC,EAAE,mBAAmB,EAC7B,iBAAiB,CAAC,EAAE,OAAO,CAC1B,IAAI,CACH,kBAAkB,EAClB,SAAS,GAAG,SAAS,GAAG,eAAe,GAAG,kBAAkB,GAAG,QAAQ,GAAG,KAAK,CAC/E,CACD,GACC,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;IAaf,IAAI,CAAC,CAAC,EAClB,GAAG,EAAE,MAAM,EACX,WAAW,EAAE,GAAG,EAChB,WAAW,CAAC,EAAE,eAAe,EAC7B,OAAO,CAAC,EAAE,mBAAmB,EAC7B,iBAAiB,CAAC,EAAE,OAAO,CAC1B,IAAI,CACH,kBAAkB,EAClB,SAAS,GAAG,SAAS,GAAG,eAAe,GAAG,kBAAkB,GAAG,QAAQ,GAAG,KAAK,CAC/E,CACD,GACC,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;IAcf,MAAM,CAAC,CAAC,EACpB,GAAG,EAAE,MAAM,EACX,WAAW,CAAC,EAAE,eAAe,EAC7B,OAAO,CAAC,EAAE,mBAAmB,EAC7B,iBAAiB,CAAC,EAAE,OAAO,CAC1B,IAAI,CACH,kBAAkB,EAClB,SAAS,GAAG,SAAS,GAAG,eAAe,GAAG,kBAAkB,GAAG,QAAQ,GAAG,KAAK,CAC/E,CACD,GACC,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;IAaf,KAAK,CAAC,CAAC,EACnB,GAAG,EAAE,MAAM,EACX,WAAW,EAAE,GAAG,EAChB,WAAW,CAAC,EAAE,eAAe,EAC7B,OAAO,CAAC,EAAE,mBAAmB,EAC7B,iBAAiB,CAAC,EAAE,OAAO,CAC1B,IAAI,CACH,kBAAkB,EAClB,SAAS,GAAG,SAAS,GAAG,eAAe,GAAG,kBAAkB,GAAG,QAAQ,GAAG,KAAK,CAC/E,CACD,GACC,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;IAc5B,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,EAC3B,OAAO,EAAE,kBAAkB,EAC3B,UAAU,EAAE,MAAM,EAClB,mBAAmB,CAAC,EAAE,OAAO,GAC3B,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;IAE5B,SAAS,CAAC,mBAAmB,CAAC,iBAAiB,CAAC,EAAE,eAAe;CASjE;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,WAAW,EAAE,eAAe,GAAG,MAAM,CAUnE;AAED,oBAAY,eAAe,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,CAAC"}
@@ -0,0 +1,50 @@
1
+ /*!
2
+ * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
+ * Licensed under the MIT License.
4
+ */
5
+ export class RestWrapper {
6
+ constructor(baseurl, defaultQueryString = {}, maxBodyLength = 1000 * 1024 * 1024, maxContentLength = 1000 * 1024 * 1024) {
7
+ this.baseurl = baseurl;
8
+ this.defaultQueryString = defaultQueryString;
9
+ this.maxBodyLength = maxBodyLength;
10
+ this.maxContentLength = maxContentLength;
11
+ }
12
+ async get(url, queryString, headers, additionalOptions) {
13
+ const options = Object.assign(Object.assign({}, additionalOptions), { baseURL: this.baseurl, headers, maxBodyLength: this.maxBodyLength, maxContentLength: this.maxContentLength, method: "GET", url: `${url}${this.generateQueryString(queryString)}` });
14
+ return this.request(options, 200);
15
+ }
16
+ async post(url, requestBody, queryString, headers, additionalOptions) {
17
+ const options = Object.assign(Object.assign({}, additionalOptions), { baseURL: this.baseurl, data: requestBody, headers, maxBodyLength: this.maxBodyLength, maxContentLength: this.maxContentLength, method: "POST", url: `${url}${this.generateQueryString(queryString)}` });
18
+ return this.request(options, 201);
19
+ }
20
+ async delete(url, queryString, headers, additionalOptions) {
21
+ const options = Object.assign(Object.assign({}, additionalOptions), { baseURL: this.baseurl, headers, maxBodyLength: this.maxBodyLength, maxContentLength: this.maxContentLength, method: "DELETE", url: `${url}${this.generateQueryString(queryString)}` });
22
+ return this.request(options, 204);
23
+ }
24
+ async patch(url, requestBody, queryString, headers, additionalOptions) {
25
+ const options = Object.assign(Object.assign({}, additionalOptions), { baseURL: this.baseurl, data: requestBody, headers, maxBodyLength: this.maxBodyLength, maxContentLength: this.maxContentLength, method: "PATCH", url: `${url}${this.generateQueryString(queryString)}` });
26
+ return this.request(options, 200);
27
+ }
28
+ generateQueryString(queryStringValues) {
29
+ if (this.defaultQueryString || queryStringValues) {
30
+ const queryStringMap = Object.assign(Object.assign({}, this.defaultQueryString), queryStringValues);
31
+ return getQueryString(queryStringMap);
32
+ }
33
+ return "";
34
+ }
35
+ }
36
+ /**
37
+ * Generates query string from the given query parameters.
38
+ * @param queryParams - Query parameters from which to create a query.
39
+ */
40
+ export function getQueryString(queryParams) {
41
+ let queryString = "";
42
+ for (const key of Object.keys(queryParams)) {
43
+ if (queryParams[key] !== undefined) {
44
+ const startChar = queryString === "" ? "?" : "&";
45
+ queryString += `${startChar}${key}=${encodeURIComponent(queryParams[key])}`;
46
+ }
47
+ }
48
+ return queryString;
49
+ }
50
+ //# sourceMappingURL=restWrapperBase.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"restWrapperBase.js","sourceRoot":"","sources":["../src/restWrapperBase.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 { AxiosRequestConfig, AxiosRequestHeaders } from \"axios\";\nimport { IR11sResponse } from \"./restWrapper\";\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\tpublic async get<T>(\n\t\turl: string,\n\t\tqueryString?: QueryStringType,\n\t\theaders?: AxiosRequestHeaders,\n\t\tadditionalOptions?: Partial<\n\t\t\tOmit<\n\t\t\t\tAxiosRequestConfig,\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: AxiosRequestConfig = {\n\t\t\t...additionalOptions,\n\t\t\tbaseURL: this.baseurl,\n\t\t\theaders,\n\t\t\tmaxBodyLength: this.maxBodyLength,\n\t\t\tmaxContentLength: this.maxContentLength,\n\t\t\tmethod: \"GET\",\n\t\t\turl: `${url}${this.generateQueryString(queryString)}`,\n\t\t};\n\t\treturn this.request<T>(options, 200);\n\t}\n\n\tpublic async post<T>(\n\t\turl: string,\n\t\trequestBody: any,\n\t\tqueryString?: QueryStringType,\n\t\theaders?: AxiosRequestHeaders,\n\t\tadditionalOptions?: Partial<\n\t\t\tOmit<\n\t\t\t\tAxiosRequestConfig,\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: AxiosRequestConfig = {\n\t\t\t...additionalOptions,\n\t\t\tbaseURL: this.baseurl,\n\t\t\tdata: requestBody,\n\t\t\theaders,\n\t\t\tmaxBodyLength: this.maxBodyLength,\n\t\t\tmaxContentLength: this.maxContentLength,\n\t\t\tmethod: \"POST\",\n\t\t\turl: `${url}${this.generateQueryString(queryString)}`,\n\t\t};\n\t\treturn this.request<T>(options, 201);\n\t}\n\n\tpublic async delete<T>(\n\t\turl: string,\n\t\tqueryString?: QueryStringType,\n\t\theaders?: AxiosRequestHeaders,\n\t\tadditionalOptions?: Partial<\n\t\t\tOmit<\n\t\t\t\tAxiosRequestConfig,\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: AxiosRequestConfig = {\n\t\t\t...additionalOptions,\n\t\t\tbaseURL: this.baseurl,\n\t\t\theaders,\n\t\t\tmaxBodyLength: this.maxBodyLength,\n\t\t\tmaxContentLength: this.maxContentLength,\n\t\t\tmethod: \"DELETE\",\n\t\t\turl: `${url}${this.generateQueryString(queryString)}`,\n\t\t};\n\t\treturn this.request<T>(options, 204);\n\t}\n\n\tpublic async patch<T>(\n\t\turl: string,\n\t\trequestBody: any,\n\t\tqueryString?: QueryStringType,\n\t\theaders?: AxiosRequestHeaders,\n\t\tadditionalOptions?: Partial<\n\t\t\tOmit<\n\t\t\t\tAxiosRequestConfig,\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: AxiosRequestConfig = {\n\t\t\t...additionalOptions,\n\t\t\tbaseURL: this.baseurl,\n\t\t\tdata: requestBody,\n\t\t\theaders,\n\t\t\tmaxBodyLength: this.maxBodyLength,\n\t\t\tmaxContentLength: this.maxContentLength,\n\t\t\tmethod: \"PATCH\",\n\t\t\turl: `${url}${this.generateQueryString(queryString)}`,\n\t\t};\n\t\treturn this.request<T>(options, 200);\n\t}\n\n\tprotected abstract request<T>(\n\t\toptions: AxiosRequestConfig,\n\t\tstatusCode: number,\n\t\taddNetworkCallProps?: boolean,\n\t): Promise<IR11sResponse<T>>;\n\n\tprotected generateQueryString(queryStringValues?: QueryStringType) {\n\t\tif (this.defaultQueryString || queryStringValues) {\n\t\t\tconst queryStringMap = { ...this.defaultQueryString, ...queryStringValues };\n\n\t\t\treturn getQueryString(queryStringMap);\n\t\t}\n\n\t\treturn \"\";\n\t}\n}\n\n/**\n * Generates query string from the given query parameters.\n * @param queryParams - Query parameters from which to create a query.\n */\nexport function getQueryString(queryParams: QueryStringType): string {\n\tlet queryString = \"\";\n\tfor (const key of Object.keys(queryParams)) {\n\t\tif (queryParams[key] !== undefined) {\n\t\t\tconst startChar = queryString === \"\" ? \"?\" : \"&\";\n\t\t\tqueryString += `${startChar}${key}=${encodeURIComponent(queryParams[key])}`;\n\t\t}\n\t}\n\n\treturn queryString;\n}\n\nexport type QueryStringType = Record<string, string | number | boolean>;\n"]}
@@ -3,32 +3,21 @@
3
3
  * Licensed under the MIT License.
4
4
  */
5
5
  import type * as git from "@fluidframework/gitresources";
6
- import type * as protocol from "@fluidframework/protocol-definitions";
7
- import { IGitManager, IWholeFlatSummary, IWholeSummaryPayload, IWriteSummaryResponse } from "@fluidframework/server-services-client";
6
+ import { IWholeFlatSummary, IWholeSummaryPayload, IWriteSummaryResponse } from "@fluidframework/server-services-client";
8
7
  import { ITelemetryLogger } from "@fluidframework/common-definitions";
8
+ import { IGitManager } from "./storageContracts";
9
+ import { IR11sResponse } from "./restWrapper";
9
10
  export declare class RetriableGitManager implements IGitManager {
10
11
  private readonly internalGitManager;
11
12
  private readonly logger;
12
13
  constructor(internalGitManager: IGitManager, logger: ITelemetryLogger);
13
- getHeader(id: string, sha: string): Promise<protocol.ISnapshotTree>;
14
- getFullTree(sha: string): Promise<any>;
15
- getCommit(sha: string): Promise<git.ICommit>;
16
- getCommits(sha: string, count: number): Promise<git.ICommitDetails[]>;
17
- getTree(root: string, recursive: boolean): Promise<git.ITree>;
18
- getBlob(sha: string): Promise<git.IBlob>;
19
- getRawUrl(sha: string): string;
20
- getContent(commit: string, path: string): Promise<git.IBlob>;
21
- createBlob(content: string, encoding: string): Promise<git.ICreateBlobResponse>;
22
- createGitTree(params: git.ICreateTreeParams): Promise<git.ITree>;
23
- createTree(files: protocol.ITree): Promise<git.ITree>;
24
- createCommit(commit: git.ICreateCommitParams): Promise<git.ICommit>;
25
- getRef(ref: string): Promise<git.IRef>;
26
- createRef(branch: string, sha: string): Promise<git.IRef>;
27
- upsertRef(branch: string, commitSha: string): Promise<git.IRef>;
28
- write(branch: string, inputTree: protocol.ITree, parents: string[], message: string): Promise<git.ICommit>;
29
- createSummary(summary: IWholeSummaryPayload): Promise<IWriteSummaryResponse>;
30
- deleteSummary(softDelete: boolean): Promise<void>;
31
- getSummary(sha: string): Promise<IWholeFlatSummary>;
14
+ getCommits(sha: string, count: number): Promise<IR11sResponse<git.ICommitDetails[]>>;
15
+ getTree(root: string, recursive: boolean): Promise<IR11sResponse<git.ITree>>;
16
+ getBlob(sha: string): Promise<IR11sResponse<git.IBlob>>;
17
+ createBlob(content: string, encoding: string): Promise<IR11sResponse<git.ICreateBlobResponse>>;
18
+ createGitTree(params: git.ICreateTreeParams): Promise<IR11sResponse<git.ITree>>;
19
+ createSummary(summary: IWholeSummaryPayload): Promise<IR11sResponse<IWriteSummaryResponse>>;
20
+ getSummary(sha: string): Promise<IR11sResponse<IWholeFlatSummary>>;
32
21
  private runWithRetry;
33
22
  }
34
23
  //# sourceMappingURL=retriableGitManager.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"retriableGitManager.d.ts","sourceRoot":"","sources":["../src/retriableGitManager.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,KAAK,GAAG,MAAM,8BAA8B,CAAC;AACzD,OAAO,KAAK,KAAK,QAAQ,MAAM,sCAAsC,CAAC;AACtE,OAAO,EACN,WAAW,EACX,iBAAiB,EACjB,oBAAoB,EACpB,qBAAqB,EACrB,MAAM,wCAAwC,CAAC;AAEhD,OAAO,EAAE,gBAAgB,EAAE,MAAM,oCAAoC,CAAC;AAEtE,qBAAa,mBAAoB,YAAW,WAAW;IAErD,OAAO,CAAC,QAAQ,CAAC,kBAAkB;IACnC,OAAO,CAAC,QAAQ,CAAC,MAAM;gBADN,kBAAkB,EAAE,WAAW,EAC/B,MAAM,EAAE,gBAAgB;IAG7B,SAAS,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC;IAOnE,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;IAOtC,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC;IAO5C,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,CAAC;IAOrE,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;IAO7D,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;IAO9C,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;IAIxB,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;IAO5D,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC;IAO/E,aAAa,CAAC,MAAM,EAAE,GAAG,CAAC,iBAAiB,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;IAOhE,UAAU,CAAC,KAAK,EAAE,QAAQ,CAAC,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;IAOrD,YAAY,CAAC,MAAM,EAAE,GAAG,CAAC,mBAAmB,GAAG,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC;IAOnE,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;IAOtC,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;IAOzD,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;IAO/D,KAAK,CACjB,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,QAAQ,CAAC,KAAK,EACzB,OAAO,EAAE,MAAM,EAAE,EACjB,OAAO,EAAE,MAAM,GACb,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC;IAOV,aAAa,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,qBAAqB,CAAC;IAO5E,aAAa,CAAC,UAAU,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAOjD,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC;YAOlD,YAAY;CAQ1B"}
1
+ {"version":3,"file":"retriableGitManager.d.ts","sourceRoot":"","sources":["../src/retriableGitManager.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,KAAK,GAAG,MAAM,8BAA8B,CAAC;AACzD,OAAO,EACN,iBAAiB,EACjB,oBAAoB,EACpB,qBAAqB,EACrB,MAAM,wCAAwC,CAAC;AAEhD,OAAO,EAAE,gBAAgB,EAAE,MAAM,oCAAoC,CAAC;AACtE,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAE9C,qBAAa,mBAAoB,YAAW,WAAW;IAErD,OAAO,CAAC,QAAQ,CAAC,kBAAkB;IACnC,OAAO,CAAC,QAAQ,CAAC,MAAM;gBADN,kBAAkB,EAAE,WAAW,EAC/B,MAAM,EAAE,gBAAgB;IAG7B,UAAU,CACtB,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,MAAM,GACX,OAAO,CAAC,aAAa,CAAC,GAAG,CAAC,cAAc,EAAE,CAAC,CAAC;IAOlC,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,GAAG,OAAO,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAO5E,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAOvD,UAAU,CACtB,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,GACd,OAAO,CAAC,aAAa,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;IAOrC,aAAa,CAAC,MAAM,EAAE,GAAG,CAAC,iBAAiB,GAAG,OAAO,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAO/E,aAAa,CACzB,OAAO,EAAE,oBAAoB,GAC3B,OAAO,CAAC,aAAa,CAAC,qBAAqB,CAAC,CAAC;IAOnC,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,iBAAiB,CAAC,CAAC;YAOjE,YAAY;CAQ1B"}
@@ -8,15 +8,6 @@ export class RetriableGitManager {
8
8
  this.internalGitManager = internalGitManager;
9
9
  this.logger = logger;
10
10
  }
11
- async getHeader(id, sha) {
12
- return this.runWithRetry(async () => this.internalGitManager.getHeader(id, sha), "gitManager_getHeader");
13
- }
14
- async getFullTree(sha) {
15
- return this.runWithRetry(async () => this.internalGitManager.getFullTree(sha), "gitManager_getFullTree");
16
- }
17
- async getCommit(sha) {
18
- return this.runWithRetry(async () => this.internalGitManager.getCommit(sha), "gitManager_getCommit");
19
- }
20
11
  async getCommits(sha, count) {
21
12
  return this.runWithRetry(async () => this.internalGitManager.getCommits(sha, count), "gitManager_getCommits");
22
13
  }
@@ -26,42 +17,15 @@ export class RetriableGitManager {
26
17
  async getBlob(sha) {
27
18
  return this.runWithRetry(async () => this.internalGitManager.getBlob(sha), "gitManager_getBlob");
28
19
  }
29
- getRawUrl(sha) {
30
- return this.internalGitManager.getRawUrl(sha);
31
- }
32
- async getContent(commit, path) {
33
- return this.runWithRetry(async () => this.internalGitManager.getContent(commit, path), "gitManager_getContent");
34
- }
35
20
  async createBlob(content, encoding) {
36
21
  return this.runWithRetry(async () => this.internalGitManager.createBlob(content, encoding), "gitManager_createBlob");
37
22
  }
38
23
  async createGitTree(params) {
39
24
  return this.runWithRetry(async () => this.internalGitManager.createGitTree(params), "gitManager_createGitTree");
40
25
  }
41
- async createTree(files) {
42
- return this.runWithRetry(async () => this.internalGitManager.createTree(files), "gitManager_createTree");
43
- }
44
- async createCommit(commit) {
45
- return this.runWithRetry(async () => this.internalGitManager.createCommit(commit), "gitManager_createCommit");
46
- }
47
- async getRef(ref) {
48
- return this.runWithRetry(async () => this.internalGitManager.getRef(ref), "gitManager_getRef");
49
- }
50
- async createRef(branch, sha) {
51
- return this.runWithRetry(async () => this.internalGitManager.createRef(branch, sha), "gitManager_createRef");
52
- }
53
- async upsertRef(branch, commitSha) {
54
- return this.runWithRetry(async () => this.internalGitManager.upsertRef(branch, commitSha), "gitManager_upsertRef");
55
- }
56
- async write(branch, inputTree, parents, message) {
57
- return this.runWithRetry(async () => this.internalGitManager.write(branch, inputTree, parents, message), "gitManager_write");
58
- }
59
26
  async createSummary(summary) {
60
27
  return this.runWithRetry(async () => this.internalGitManager.createSummary(summary), "gitManager_createSummary");
61
28
  }
62
- async deleteSummary(softDelete) {
63
- return this.runWithRetry(async () => this.internalGitManager.deleteSummary(softDelete), "gitManager_deleteSummary");
64
- }
65
29
  async getSummary(sha) {
66
30
  return this.runWithRetry(async () => this.internalGitManager.getSummary(sha), "gitManager_getSummary");
67
31
  }
@@ -1 +1 @@
1
- {"version":3,"file":"retriableGitManager.js","sourceRoot":"","sources":["../src/retriableGitManager.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 * as git from \"@fluidframework/gitresources\";\nimport type * as protocol from \"@fluidframework/protocol-definitions\";\nimport {\n\tIGitManager,\n\tIWholeFlatSummary,\n\tIWholeSummaryPayload,\n\tIWriteSummaryResponse,\n} from \"@fluidframework/server-services-client\";\nimport { runWithRetry } from \"@fluidframework/driver-utils\";\nimport { ITelemetryLogger } from \"@fluidframework/common-definitions\";\n\nexport class RetriableGitManager implements IGitManager {\n\tconstructor(\n\t\tprivate readonly internalGitManager: IGitManager,\n\t\tprivate readonly logger: ITelemetryLogger,\n\t) {}\n\n\tpublic async getHeader(id: string, sha: string): Promise<protocol.ISnapshotTree> {\n\t\treturn this.runWithRetry(\n\t\t\tasync () => this.internalGitManager.getHeader(id, sha),\n\t\t\t\"gitManager_getHeader\",\n\t\t);\n\t}\n\n\tpublic async getFullTree(sha: string): Promise<any> {\n\t\treturn this.runWithRetry(\n\t\t\tasync () => this.internalGitManager.getFullTree(sha),\n\t\t\t\"gitManager_getFullTree\",\n\t\t);\n\t}\n\n\tpublic async getCommit(sha: string): Promise<git.ICommit> {\n\t\treturn this.runWithRetry(\n\t\t\tasync () => this.internalGitManager.getCommit(sha),\n\t\t\t\"gitManager_getCommit\",\n\t\t);\n\t}\n\n\tpublic async getCommits(sha: string, count: number): Promise<git.ICommitDetails[]> {\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<git.ITree> {\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<git.IBlob> {\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 getRawUrl(sha: string): string {\n\t\treturn this.internalGitManager.getRawUrl(sha);\n\t}\n\n\tpublic async getContent(commit: string, path: string): Promise<git.IBlob> {\n\t\treturn this.runWithRetry(\n\t\t\tasync () => this.internalGitManager.getContent(commit, path),\n\t\t\t\"gitManager_getContent\",\n\t\t);\n\t}\n\n\tpublic async createBlob(content: string, encoding: string): Promise<git.ICreateBlobResponse> {\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: git.ICreateTreeParams): Promise<git.ITree> {\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 createTree(files: protocol.ITree): Promise<git.ITree> {\n\t\treturn this.runWithRetry(\n\t\t\tasync () => this.internalGitManager.createTree(files),\n\t\t\t\"gitManager_createTree\",\n\t\t);\n\t}\n\n\tpublic async createCommit(commit: git.ICreateCommitParams): Promise<git.ICommit> {\n\t\treturn this.runWithRetry(\n\t\t\tasync () => this.internalGitManager.createCommit(commit),\n\t\t\t\"gitManager_createCommit\",\n\t\t);\n\t}\n\n\tpublic async getRef(ref: string): Promise<git.IRef> {\n\t\treturn this.runWithRetry(\n\t\t\tasync () => this.internalGitManager.getRef(ref),\n\t\t\t\"gitManager_getRef\",\n\t\t);\n\t}\n\n\tpublic async createRef(branch: string, sha: string): Promise<git.IRef> {\n\t\treturn this.runWithRetry(\n\t\t\tasync () => this.internalGitManager.createRef(branch, sha),\n\t\t\t\"gitManager_createRef\",\n\t\t);\n\t}\n\n\tpublic async upsertRef(branch: string, commitSha: string): Promise<git.IRef> {\n\t\treturn this.runWithRetry(\n\t\t\tasync () => this.internalGitManager.upsertRef(branch, commitSha),\n\t\t\t\"gitManager_upsertRef\",\n\t\t);\n\t}\n\n\tpublic async write(\n\t\tbranch: string,\n\t\tinputTree: protocol.ITree,\n\t\tparents: string[],\n\t\tmessage: string,\n\t): Promise<git.ICommit> {\n\t\treturn this.runWithRetry(\n\t\t\tasync () => this.internalGitManager.write(branch, inputTree, parents, message),\n\t\t\t\"gitManager_write\",\n\t\t);\n\t}\n\n\tpublic async createSummary(summary: IWholeSummaryPayload): Promise<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 deleteSummary(softDelete: boolean): Promise<void> {\n\t\treturn this.runWithRetry(\n\t\t\tasync () => this.internalGitManager.deleteSummary(softDelete),\n\t\t\t\"gitManager_deleteSummary\",\n\t\t);\n\t}\n\n\tpublic async getSummary(sha: string): Promise<IWholeFlatSummary> {\n\t\treturn this.runWithRetry(\n\t\t\tasync () => this.internalGitManager.getSummary(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
+ {"version":3,"file":"retriableGitManager.js","sourceRoot":"","sources":["../src/retriableGitManager.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAQH,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAK5D,MAAM,OAAO,mBAAmB;IAC/B,YACkB,kBAA+B,EAC/B,MAAwB;QADxB,uBAAkB,GAAlB,kBAAkB,CAAa;QAC/B,WAAM,GAAN,MAAM,CAAkB;IACvC,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,MAA6B;QACvD,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,UAAU,CAAC,GAAW;QAClC,OAAO,IAAI,CAAC,YAAY,CACvB,KAAK,IAAI,EAAE,CAAC,IAAI,CAAC,kBAAkB,CAAC,UAAU,CAAC,GAAG,CAAC,EACnD,uBAAuB,CACvB,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,YAAY,CAAI,GAAqB,EAAE,QAAgB;QACpE,OAAO,YAAY,CAClB,GAAG,EACH,QAAQ,EACR,IAAI,CAAC,MAAM,EACX,EAAE,CACF,CAAC;IACH,CAAC;CACD","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport type * as git from \"@fluidframework/gitresources\";\nimport {\n\tIWholeFlatSummary,\n\tIWholeSummaryPayload,\n\tIWriteSummaryResponse,\n} from \"@fluidframework/server-services-client\";\nimport { runWithRetry } from \"@fluidframework/driver-utils\";\nimport { ITelemetryLogger } from \"@fluidframework/common-definitions\";\nimport { IGitManager } from \"./storageContracts\";\nimport { IR11sResponse } from \"./restWrapper\";\n\nexport class RetriableGitManager implements IGitManager {\n\tconstructor(\n\t\tprivate readonly internalGitManager: IGitManager,\n\t\tprivate readonly logger: ITelemetryLogger,\n\t) {}\n\n\tpublic async getCommits(\n\t\tsha: string,\n\t\tcount: number,\n\t): Promise<IR11sResponse<git.ICommitDetails[]>> {\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<git.ITree>> {\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<git.IBlob>> {\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<git.ICreateBlobResponse>> {\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: git.ICreateTreeParams): Promise<IR11sResponse<git.ITree>> {\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 getSummary(sha: string): Promise<IR11sResponse<IWholeFlatSummary>> {\n\t\treturn this.runWithRetry(\n\t\t\tasync () => this.internalGitManager.getSummary(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"]}
@@ -5,10 +5,10 @@
5
5
  import type { ITelemetryLogger } from "@fluidframework/common-definitions";
6
6
  import { IDocumentStorageService, ISummaryContext, IDocumentStorageServicePolicies } from "@fluidframework/driver-definitions";
7
7
  import { ICreateBlobResponse, ISnapshotTreeEx, ISummaryHandle, ISummaryTree, IVersion } from "@fluidframework/protocol-definitions";
8
- import { GitManager } from "@fluidframework/server-services-client";
9
8
  import { IRouterliciousDriverPolicies } from "./policies";
10
9
  import { ICache } from "./cache";
11
10
  import { ISnapshotTreeVersion } from "./definitions";
11
+ import { GitManager } from "./gitManager";
12
12
  /**
13
13
  * Document access to underlying storage for routerlicious driver.
14
14
  * Uploads summaries piece-by-piece traversing the tree recursively.