@fluidframework/routerlicious-driver 1.4.0-121020 → 2.0.0-dev-rc.1.0.0.225277

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 (368) hide show
  1. package/.eslintrc.js +10 -12
  2. package/.mocharc.js +12 -0
  3. package/CHANGELOG.md +156 -0
  4. package/README.md +39 -1
  5. package/api-extractor-esm.json +4 -0
  6. package/api-extractor-lint.json +4 -0
  7. package/api-extractor.json +2 -2
  8. package/api-report/routerlicious-driver.api.md +108 -0
  9. package/dist/cache.cjs +30 -0
  10. package/dist/cache.cjs.map +1 -0
  11. package/dist/cache.d.ts +7 -0
  12. package/dist/cache.d.ts.map +1 -1
  13. package/dist/{definitions.js → contracts.cjs} +1 -1
  14. package/dist/contracts.cjs.map +1 -0
  15. package/dist/contracts.d.ts +42 -0
  16. package/dist/contracts.d.ts.map +1 -0
  17. package/dist/{createNewUtils.js → createNewUtils.cjs} +7 -5
  18. package/dist/createNewUtils.cjs.map +1 -0
  19. package/dist/createNewUtils.d.ts +1 -1
  20. package/dist/createNewUtils.d.ts.map +1 -1
  21. package/dist/{defaultTokenProvider.js → defaultTokenProvider.cjs} +2 -1
  22. package/dist/defaultTokenProvider.cjs.map +1 -0
  23. package/dist/defaultTokenProvider.d.ts +1 -0
  24. package/dist/defaultTokenProvider.d.ts.map +1 -1
  25. package/dist/definitions.cjs +7 -0
  26. package/dist/definitions.cjs.map +1 -0
  27. package/dist/definitions.d.ts.map +1 -1
  28. package/dist/deltaStorageService.cjs +122 -0
  29. package/dist/deltaStorageService.cjs.map +1 -0
  30. package/dist/deltaStorageService.d.ts +7 -6
  31. package/dist/deltaStorageService.d.ts.map +1 -1
  32. package/dist/{documentDeltaConnection.js → documentDeltaConnection.cjs} +8 -13
  33. package/dist/documentDeltaConnection.cjs.map +1 -0
  34. package/dist/documentDeltaConnection.d.ts +3 -4
  35. package/dist/documentDeltaConnection.d.ts.map +1 -1
  36. package/dist/{documentService.js → documentService.cjs} +61 -64
  37. package/dist/documentService.cjs.map +1 -0
  38. package/dist/documentService.d.ts +12 -4
  39. package/dist/documentService.d.ts.map +1 -1
  40. package/dist/{documentServiceFactory.js → documentServiceFactory.cjs} +87 -33
  41. package/dist/documentServiceFactory.cjs.map +1 -0
  42. package/dist/documentServiceFactory.d.ts +5 -3
  43. package/dist/documentServiceFactory.d.ts.map +1 -1
  44. package/dist/{documentStorageService.js → documentStorageService.cjs} +18 -16
  45. package/dist/documentStorageService.cjs.map +1 -0
  46. package/dist/documentStorageService.d.ts +4 -3
  47. package/dist/documentStorageService.d.ts.map +1 -1
  48. package/dist/errorUtils.cjs +87 -0
  49. package/dist/errorUtils.cjs.map +1 -0
  50. package/dist/errorUtils.d.ts +56 -10
  51. package/dist/errorUtils.d.ts.map +1 -1
  52. package/dist/gitManager.cjs +46 -0
  53. package/dist/gitManager.cjs.map +1 -0
  54. package/dist/gitManager.d.ts +27 -0
  55. package/dist/gitManager.d.ts.map +1 -0
  56. package/dist/historian.cjs +72 -0
  57. package/dist/historian.cjs.map +1 -0
  58. package/dist/historian.d.ts +34 -0
  59. package/dist/historian.d.ts.map +1 -0
  60. package/dist/index.cjs +19 -0
  61. package/dist/index.cjs.map +1 -0
  62. package/dist/index.d.ts +5 -8
  63. package/dist/index.d.ts.map +1 -1
  64. package/dist/mapWithExpiration.cjs +105 -0
  65. package/dist/mapWithExpiration.cjs.map +1 -0
  66. package/dist/mapWithExpiration.d.ts +34 -0
  67. package/dist/mapWithExpiration.d.ts.map +1 -0
  68. package/dist/{nullBlobStorageService.js → nullBlobStorageService.cjs} +5 -5
  69. package/dist/nullBlobStorageService.cjs.map +1 -0
  70. package/dist/nullBlobStorageService.d.ts.map +1 -1
  71. package/dist/{packageVersion.js → packageVersion.cjs} +2 -2
  72. package/dist/packageVersion.cjs.map +1 -0
  73. package/dist/packageVersion.d.ts +1 -1
  74. package/dist/packageVersion.d.ts.map +1 -1
  75. package/dist/{policies.js → policies.cjs} +1 -1
  76. package/dist/policies.cjs.map +1 -0
  77. package/dist/policies.d.ts +22 -9
  78. package/dist/policies.d.ts.map +1 -1
  79. package/dist/r11sSnapshotParser.cjs +73 -0
  80. package/dist/r11sSnapshotParser.cjs.map +1 -0
  81. package/dist/r11sSnapshotParser.d.ts +14 -0
  82. package/dist/r11sSnapshotParser.d.ts.map +1 -0
  83. package/dist/restWrapper.cjs +249 -0
  84. package/dist/restWrapper.cjs.map +1 -0
  85. package/dist/restWrapper.d.ts +32 -12
  86. package/dist/restWrapper.d.ts.map +1 -1
  87. package/dist/restWrapperBase.cjs +89 -0
  88. package/dist/restWrapperBase.cjs.map +1 -0
  89. package/dist/restWrapperBase.d.ts +26 -0
  90. package/dist/restWrapperBase.d.ts.map +1 -0
  91. package/dist/retriableGitManager.cjs +40 -0
  92. package/dist/retriableGitManager.cjs.map +1 -0
  93. package/dist/retriableGitManager.d.ts +13 -23
  94. package/dist/retriableGitManager.d.ts.map +1 -1
  95. package/dist/routerlicious-driver-alpha.d.ts +92 -0
  96. package/dist/routerlicious-driver-beta.d.ts +98 -0
  97. package/dist/routerlicious-driver-public.d.ts +98 -0
  98. package/dist/routerlicious-driver-untrimmed.d.ts +261 -0
  99. package/dist/{shreddedSummaryDocumentStorageService.js → shreddedSummaryDocumentStorageService.cjs} +41 -34
  100. package/dist/shreddedSummaryDocumentStorageService.cjs.map +1 -0
  101. package/dist/shreddedSummaryDocumentStorageService.d.ts +6 -5
  102. package/dist/shreddedSummaryDocumentStorageService.d.ts.map +1 -1
  103. package/dist/storageContracts.cjs +7 -0
  104. package/dist/storageContracts.cjs.map +1 -0
  105. package/dist/storageContracts.d.ts +45 -0
  106. package/dist/storageContracts.d.ts.map +1 -0
  107. package/dist/summaryTreeUploadManager.cjs +110 -0
  108. package/dist/summaryTreeUploadManager.cjs.map +1 -0
  109. package/dist/summaryTreeUploadManager.d.ts +23 -0
  110. package/dist/summaryTreeUploadManager.d.ts.map +1 -0
  111. package/dist/{tokens.js → tokens.cjs} +1 -1
  112. package/dist/tokens.cjs.map +1 -0
  113. package/dist/tokens.d.ts +34 -5
  114. package/dist/tokens.d.ts.map +1 -1
  115. package/dist/treeUtils.cjs +107 -0
  116. package/dist/treeUtils.cjs.map +1 -0
  117. package/dist/treeUtils.d.ts +58 -0
  118. package/dist/treeUtils.d.ts.map +1 -0
  119. package/dist/tsdoc-metadata.json +11 -0
  120. package/dist/{urlUtils.js → urlUtils.cjs} +21 -25
  121. package/dist/urlUtils.cjs.map +1 -0
  122. package/dist/urlUtils.d.ts +2 -2
  123. package/dist/urlUtils.d.ts.map +1 -1
  124. package/dist/wholeSummaryDocumentStorageService.cjs +253 -0
  125. package/dist/wholeSummaryDocumentStorageService.cjs.map +1 -0
  126. package/dist/wholeSummaryDocumentStorageService.d.ts +10 -8
  127. package/dist/wholeSummaryDocumentStorageService.d.ts.map +1 -1
  128. package/dist/wholeSummaryUploadManager.cjs +37 -0
  129. package/dist/wholeSummaryUploadManager.cjs.map +1 -0
  130. package/dist/wholeSummaryUploadManager.d.ts +16 -0
  131. package/dist/wholeSummaryUploadManager.d.ts.map +1 -0
  132. package/lib/{cache.d.ts → cache.d.mts} +8 -1
  133. package/lib/cache.d.mts.map +1 -0
  134. package/lib/cache.mjs +25 -0
  135. package/lib/cache.mjs.map +1 -0
  136. package/lib/contracts.d.mts +42 -0
  137. package/lib/contracts.d.mts.map +1 -0
  138. package/lib/{definitions.js → contracts.mjs} +1 -1
  139. package/lib/contracts.mjs.map +1 -0
  140. package/lib/{createNewUtils.d.ts → createNewUtils.d.mts} +2 -2
  141. package/lib/createNewUtils.d.mts.map +1 -0
  142. package/lib/{createNewUtils.js → createNewUtils.mjs} +7 -5
  143. package/lib/createNewUtils.mjs.map +1 -0
  144. package/lib/{defaultTokenProvider.d.ts → defaultTokenProvider.d.mts} +3 -2
  145. package/lib/defaultTokenProvider.d.mts.map +1 -0
  146. package/lib/{defaultTokenProvider.js → defaultTokenProvider.mjs} +2 -1
  147. package/lib/defaultTokenProvider.mjs.map +1 -0
  148. package/lib/{definitions.d.ts → definitions.d.mts} +1 -1
  149. package/lib/definitions.d.mts.map +1 -0
  150. package/lib/definitions.mjs +6 -0
  151. package/{dist/definitions.js.map → lib/definitions.mjs.map} +1 -1
  152. package/lib/{deltaStorageService.d.ts → deltaStorageService.d.mts} +9 -8
  153. package/lib/deltaStorageService.d.mts.map +1 -0
  154. package/lib/deltaStorageService.mjs +117 -0
  155. package/lib/deltaStorageService.mjs.map +1 -0
  156. package/lib/{documentDeltaConnection.d.ts → documentDeltaConnection.d.mts} +4 -5
  157. package/lib/documentDeltaConnection.d.mts.map +1 -0
  158. package/lib/{documentDeltaConnection.js → documentDeltaConnection.mjs} +8 -13
  159. package/lib/documentDeltaConnection.mjs.map +1 -0
  160. package/lib/{documentService.d.ts → documentService.d.mts} +17 -9
  161. package/lib/documentService.d.mts.map +1 -0
  162. package/lib/{documentService.js → documentService.mjs} +60 -44
  163. package/lib/documentService.mjs.map +1 -0
  164. package/lib/{documentServiceFactory.d.ts → documentServiceFactory.d.mts} +8 -6
  165. package/lib/documentServiceFactory.d.mts.map +1 -0
  166. package/lib/{documentServiceFactory.js → documentServiceFactory.mjs} +88 -34
  167. package/lib/documentServiceFactory.mjs.map +1 -0
  168. package/lib/{documentStorageService.d.ts → documentStorageService.d.mts} +8 -7
  169. package/lib/documentStorageService.d.mts.map +1 -0
  170. package/lib/{documentStorageService.js → documentStorageService.mjs} +19 -17
  171. package/lib/documentStorageService.mjs.map +1 -0
  172. package/lib/errorUtils.d.mts +93 -0
  173. package/lib/errorUtils.d.mts.map +1 -0
  174. package/lib/errorUtils.mjs +81 -0
  175. package/lib/errorUtils.mjs.map +1 -0
  176. package/lib/gitManager.d.mts +27 -0
  177. package/lib/gitManager.d.mts.map +1 -0
  178. package/lib/gitManager.mjs +42 -0
  179. package/lib/gitManager.mjs.map +1 -0
  180. package/lib/historian.d.mts +34 -0
  181. package/lib/historian.d.mts.map +1 -0
  182. package/lib/historian.mjs +67 -0
  183. package/lib/historian.mjs.map +1 -0
  184. package/lib/index.d.mts +10 -0
  185. package/lib/index.d.mts.map +1 -0
  186. package/lib/index.mjs +8 -0
  187. package/lib/index.mjs.map +1 -0
  188. package/lib/mapWithExpiration.d.mts +34 -0
  189. package/lib/mapWithExpiration.d.mts.map +1 -0
  190. package/lib/mapWithExpiration.mjs +101 -0
  191. package/lib/mapWithExpiration.mjs.map +1 -0
  192. package/lib/{nullBlobStorageService.d.ts → nullBlobStorageService.d.mts} +1 -1
  193. package/lib/nullBlobStorageService.d.mts.map +1 -0
  194. package/lib/{nullBlobStorageService.js → nullBlobStorageService.mjs} +5 -5
  195. package/lib/nullBlobStorageService.mjs.map +1 -0
  196. package/lib/{packageVersion.d.ts → packageVersion.d.mts} +2 -2
  197. package/lib/packageVersion.d.mts.map +1 -0
  198. package/lib/{packageVersion.js → packageVersion.mjs} +2 -2
  199. package/lib/packageVersion.mjs.map +1 -0
  200. package/lib/{policies.d.ts → policies.d.mts} +23 -10
  201. package/lib/policies.d.mts.map +1 -0
  202. package/lib/{policies.js → policies.mjs} +1 -1
  203. package/lib/policies.mjs.map +1 -0
  204. package/lib/r11sSnapshotParser.d.mts +14 -0
  205. package/lib/r11sSnapshotParser.d.mts.map +1 -0
  206. package/lib/r11sSnapshotParser.mjs +69 -0
  207. package/lib/r11sSnapshotParser.mjs.map +1 -0
  208. package/lib/restWrapper.d.mts +53 -0
  209. package/lib/restWrapper.d.mts.map +1 -0
  210. package/lib/restWrapper.mjs +236 -0
  211. package/lib/restWrapper.mjs.map +1 -0
  212. package/lib/restWrapperBase.d.mts +26 -0
  213. package/lib/restWrapperBase.d.mts.map +1 -0
  214. package/lib/restWrapperBase.mjs +84 -0
  215. package/lib/restWrapperBase.mjs.map +1 -0
  216. package/lib/retriableGitManager.d.mts +24 -0
  217. package/lib/retriableGitManager.d.mts.map +1 -0
  218. package/lib/retriableGitManager.mjs +36 -0
  219. package/lib/retriableGitManager.mjs.map +1 -0
  220. package/lib/routerlicious-driver-alpha.d.mts +92 -0
  221. package/lib/routerlicious-driver-beta.d.mts +98 -0
  222. package/lib/routerlicious-driver-public.d.mts +98 -0
  223. package/lib/routerlicious-driver-untrimmed.d.mts +261 -0
  224. package/lib/{shreddedSummaryDocumentStorageService.d.ts → shreddedSummaryDocumentStorageService.d.mts} +10 -9
  225. package/lib/shreddedSummaryDocumentStorageService.d.mts.map +1 -0
  226. package/lib/{shreddedSummaryDocumentStorageService.js → shreddedSummaryDocumentStorageService.mjs} +41 -34
  227. package/lib/shreddedSummaryDocumentStorageService.mjs.map +1 -0
  228. package/lib/storageContracts.d.mts +45 -0
  229. package/lib/storageContracts.d.mts.map +1 -0
  230. package/lib/storageContracts.mjs +6 -0
  231. package/lib/storageContracts.mjs.map +1 -0
  232. package/lib/summaryTreeUploadManager.d.mts +23 -0
  233. package/lib/summaryTreeUploadManager.d.mts.map +1 -0
  234. package/lib/summaryTreeUploadManager.mjs +106 -0
  235. package/lib/summaryTreeUploadManager.mjs.map +1 -0
  236. package/lib/{tokens.d.ts → tokens.d.mts} +35 -6
  237. package/lib/tokens.d.mts.map +1 -0
  238. package/lib/{tokens.js → tokens.mjs} +1 -1
  239. package/lib/tokens.mjs.map +1 -0
  240. package/lib/treeUtils.d.mts +58 -0
  241. package/lib/treeUtils.d.mts.map +1 -0
  242. package/lib/treeUtils.mjs +100 -0
  243. package/lib/treeUtils.mjs.map +1 -0
  244. package/lib/{urlUtils.d.ts → urlUtils.d.mts} +3 -3
  245. package/lib/urlUtils.d.mts.map +1 -0
  246. package/lib/urlUtils.mjs +38 -0
  247. package/lib/urlUtils.mjs.map +1 -0
  248. package/lib/{wholeSummaryDocumentStorageService.d.ts → wholeSummaryDocumentStorageService.d.mts} +13 -11
  249. package/lib/wholeSummaryDocumentStorageService.d.mts.map +1 -0
  250. package/lib/wholeSummaryDocumentStorageService.mjs +249 -0
  251. package/lib/wholeSummaryDocumentStorageService.mjs.map +1 -0
  252. package/lib/wholeSummaryUploadManager.d.mts +16 -0
  253. package/lib/wholeSummaryUploadManager.d.mts.map +1 -0
  254. package/lib/wholeSummaryUploadManager.mjs +33 -0
  255. package/lib/wholeSummaryUploadManager.mjs.map +1 -0
  256. package/package.json +142 -68
  257. package/prettier.config.cjs +8 -0
  258. package/src/cache.ts +25 -9
  259. package/src/contracts.ts +60 -0
  260. package/src/createNewUtils.ts +26 -24
  261. package/src/defaultTokenProvider.ts +14 -15
  262. package/src/definitions.ts +2 -2
  263. package/src/deltaStorageService.ts +145 -91
  264. package/src/documentDeltaConnection.ts +54 -52
  265. package/src/documentService.ts +272 -242
  266. package/src/documentServiceFactory.ts +338 -237
  267. package/src/documentStorageService.ts +92 -84
  268. package/src/errorUtils.ts +117 -79
  269. package/src/gitManager.ts +67 -0
  270. package/src/historian.ts +121 -0
  271. package/src/index.ts +15 -8
  272. package/src/mapWithExpiration.ts +124 -0
  273. package/src/nullBlobStorageService.ts +24 -21
  274. package/src/packageVersion.ts +1 -1
  275. package/src/policies.ts +51 -38
  276. package/src/r11sSnapshotParser.ts +82 -0
  277. package/src/restWrapper.ts +400 -216
  278. package/src/restWrapperBase.ts +146 -0
  279. package/src/retriableGitManager.ts +76 -153
  280. package/src/shreddedSummaryDocumentStorageService.ts +214 -195
  281. package/src/storageContracts.ts +63 -0
  282. package/src/summaryTreeUploadManager.ts +155 -0
  283. package/src/tokens.ts +74 -39
  284. package/src/treeUtils.ts +138 -0
  285. package/src/urlUtils.ts +27 -28
  286. package/src/wholeSummaryDocumentStorageService.ts +352 -252
  287. package/src/wholeSummaryUploadManager.ts +64 -0
  288. package/tsc-multi.test.json +4 -0
  289. package/tsconfig.json +10 -13
  290. package/dist/cache.js +0 -20
  291. package/dist/cache.js.map +0 -1
  292. package/dist/createNewUtils.js.map +0 -1
  293. package/dist/defaultTokenProvider.js.map +0 -1
  294. package/dist/deltaStorageService.js +0 -82
  295. package/dist/deltaStorageService.js.map +0 -1
  296. package/dist/documentDeltaConnection.js.map +0 -1
  297. package/dist/documentService.js.map +0 -1
  298. package/dist/documentServiceFactory.js.map +0 -1
  299. package/dist/documentStorageService.js.map +0 -1
  300. package/dist/errorUtils.js +0 -56
  301. package/dist/errorUtils.js.map +0 -1
  302. package/dist/index.js +0 -25
  303. package/dist/index.js.map +0 -1
  304. package/dist/nullBlobStorageService.js.map +0 -1
  305. package/dist/packageVersion.js.map +0 -1
  306. package/dist/policies.js.map +0 -1
  307. package/dist/restWrapper.js +0 -153
  308. package/dist/restWrapper.js.map +0 -1
  309. package/dist/retriableGitManager.js +0 -76
  310. package/dist/retriableGitManager.js.map +0 -1
  311. package/dist/shreddedSummaryDocumentStorageService.js.map +0 -1
  312. package/dist/tokens.js.map +0 -1
  313. package/dist/urlUtils.js.map +0 -1
  314. package/dist/wholeSummaryDocumentStorageService.js +0 -191
  315. package/dist/wholeSummaryDocumentStorageService.js.map +0 -1
  316. package/lib/cache.d.ts.map +0 -1
  317. package/lib/cache.js +0 -16
  318. package/lib/cache.js.map +0 -1
  319. package/lib/createNewUtils.d.ts.map +0 -1
  320. package/lib/createNewUtils.js.map +0 -1
  321. package/lib/defaultTokenProvider.d.ts.map +0 -1
  322. package/lib/defaultTokenProvider.js.map +0 -1
  323. package/lib/definitions.d.ts.map +0 -1
  324. package/lib/definitions.js.map +0 -1
  325. package/lib/deltaStorageService.d.ts.map +0 -1
  326. package/lib/deltaStorageService.js +0 -77
  327. package/lib/deltaStorageService.js.map +0 -1
  328. package/lib/documentDeltaConnection.d.ts.map +0 -1
  329. package/lib/documentDeltaConnection.js.map +0 -1
  330. package/lib/documentService.d.ts.map +0 -1
  331. package/lib/documentService.js.map +0 -1
  332. package/lib/documentServiceFactory.d.ts.map +0 -1
  333. package/lib/documentServiceFactory.js.map +0 -1
  334. package/lib/documentStorageService.d.ts.map +0 -1
  335. package/lib/documentStorageService.js.map +0 -1
  336. package/lib/errorUtils.d.ts +0 -47
  337. package/lib/errorUtils.d.ts.map +0 -1
  338. package/lib/errorUtils.js +0 -50
  339. package/lib/errorUtils.js.map +0 -1
  340. package/lib/index.d.ts +0 -13
  341. package/lib/index.d.ts.map +0 -1
  342. package/lib/index.js +0 -13
  343. package/lib/index.js.map +0 -1
  344. package/lib/nullBlobStorageService.d.ts.map +0 -1
  345. package/lib/nullBlobStorageService.js.map +0 -1
  346. package/lib/packageVersion.d.ts.map +0 -1
  347. package/lib/packageVersion.js.map +0 -1
  348. package/lib/policies.d.ts.map +0 -1
  349. package/lib/policies.js.map +0 -1
  350. package/lib/restWrapper.d.ts +0 -33
  351. package/lib/restWrapper.d.ts.map +0 -1
  352. package/lib/restWrapper.js +0 -144
  353. package/lib/restWrapper.js.map +0 -1
  354. package/lib/retriableGitManager.d.ts +0 -34
  355. package/lib/retriableGitManager.d.ts.map +0 -1
  356. package/lib/retriableGitManager.js +0 -72
  357. package/lib/retriableGitManager.js.map +0 -1
  358. package/lib/shreddedSummaryDocumentStorageService.d.ts.map +0 -1
  359. package/lib/shreddedSummaryDocumentStorageService.js.map +0 -1
  360. package/lib/tokens.d.ts.map +0 -1
  361. package/lib/tokens.js.map +0 -1
  362. package/lib/urlUtils.d.ts.map +0 -1
  363. package/lib/urlUtils.js +0 -42
  364. package/lib/urlUtils.js.map +0 -1
  365. package/lib/wholeSummaryDocumentStorageService.d.ts.map +0 -1
  366. package/lib/wholeSummaryDocumentStorageService.js +0 -187
  367. package/lib/wholeSummaryDocumentStorageService.js.map +0 -1
  368. package/tsconfig.esnext.json +0 -7
@@ -0,0 +1,236 @@
1
+ /*!
2
+ * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
+ * Licensed under the MIT License.
4
+ */
5
+ import { PerformanceEvent, numberFromString, } from "@fluidframework/telemetry-utils";
6
+ import { assert } from "@fluidframework/core-utils";
7
+ import { fromUtf8ToBase64, performance } from "@fluid-internal/client-utils";
8
+ import { GenericNetworkError, NonRetryableError } from "@fluidframework/driver-utils";
9
+ import { CorrelationIdHeaderName, DriverVersionHeaderName, getAuthorizationTokenFromCredentials, RestLessClient, } from "@fluidframework/server-services-client";
10
+ import fetch from "cross-fetch";
11
+ import safeStringify from "json-stringify-safe";
12
+ import { RouterliciousErrorTypes, throwR11sNetworkError } from "./errorUtils.mjs";
13
+ import { pkgVersion as driverVersion } from "./packageVersion.mjs";
14
+ import { RestWrapper } from "./restWrapperBase.mjs";
15
+ const axiosRequestConfigToFetchRequestConfig = (requestConfig) => {
16
+ const requestInfo = requestConfig.baseURL !== undefined
17
+ ? `${requestConfig.baseURL}${requestConfig.url ?? ""}`
18
+ : requestConfig.url ?? "";
19
+ const requestInit = {
20
+ method: requestConfig.method,
21
+ // NOTE: I believe that although the Axios type permits non-string values in the header, here we are
22
+ // guaranteed the requestConfig only has string values in its header.
23
+ headers: requestConfig.headers,
24
+ body: requestConfig.data,
25
+ };
26
+ return [requestInfo, requestInit];
27
+ };
28
+ /**
29
+ * A utility function to create a Routerlicious response without any additional props as we might not have them always.
30
+ * @param content - Response which is equivalent to content.
31
+ * @returns A Routerlicious 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: CorrelationIdHeaderName, logName: "requestCorrelationId" },
53
+ { headerName: "content-encoding", logName: "contentEncoding" },
54
+ { headerName: "content-type", logName: "contentType" },
55
+ ];
56
+ const additionalProps = {
57
+ contentsize: 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
+ }
67
+ export class RouterliciousRestWrapper extends RestWrapper {
68
+ constructor(logger, rateLimiter, fetchRefreshedToken, getAuthorizationHeader, useRestLess, baseurl, tokenP, defaultQueryString = {}) {
69
+ super(baseurl, defaultQueryString);
70
+ this.rateLimiter = rateLimiter;
71
+ this.fetchRefreshedToken = fetchRefreshedToken;
72
+ this.getAuthorizationHeader = getAuthorizationHeader;
73
+ this.useRestLess = useRestLess;
74
+ this.tokenP = tokenP;
75
+ this.restLess = new RestLessClient();
76
+ }
77
+ async request(requestConfig, statusCode, canRetry = true) {
78
+ const config = {
79
+ ...requestConfig,
80
+ headers: await this.generateHeaders(requestConfig.headers),
81
+ };
82
+ const translatedConfig = this.useRestLess ? this.restLess.translate(config) : config;
83
+ const fetchRequestConfig = axiosRequestConfigToFetchRequestConfig(translatedConfig);
84
+ const res = await this.rateLimiter.schedule(async () => {
85
+ const perfStart = performance.now();
86
+ const result = await fetch(...fetchRequestConfig).catch(async (error) => {
87
+ // Browser Fetch throws a TypeError on network error, `node-fetch` throws a FetchError
88
+ const isNetworkError = ["TypeError", "FetchError"].includes(error?.name);
89
+ const errorMessage = isNetworkError
90
+ ? `NetworkError: ${error.message}`
91
+ : safeStringify(error);
92
+ // If a service is temporarily down or a browser resource limit is reached, RestWrapper will throw
93
+ // a network error with no status code (e.g. err:ERR_CONN_REFUSED or err:ERR_FAILED) and
94
+ // the error message will start with NetworkError as defined in restWrapper.ts
95
+ // If there exists a self-signed SSL certificates error, throw a NonRetryableError
96
+ // TODO: instead of relying on string matching, filter error based on the error code like we do for websocket connections
97
+ const err = errorMessage.includes("failed, reason: self signed certificate")
98
+ ? new NonRetryableError(errorMessage, RouterliciousErrorTypes.sslCertError, {
99
+ driverVersion,
100
+ })
101
+ : new GenericNetworkError(errorMessage, errorMessage.startsWith("NetworkError"), { driverVersion });
102
+ throw err;
103
+ });
104
+ return {
105
+ response: result,
106
+ duration: performance.now() - perfStart,
107
+ };
108
+ });
109
+ const response = res.response;
110
+ let start = performance.now();
111
+ const text = await response.text();
112
+ const receiveContentTime = performance.now() - start;
113
+ const bodySize = text.length;
114
+ start = performance.now();
115
+ const responseBody = response.headers.get("content-type")?.includes("application/json")
116
+ ? JSON.parse(text)
117
+ : text;
118
+ const parseTime = performance.now() - start;
119
+ // Success
120
+ if (response.ok || response.status === statusCode) {
121
+ const result = responseBody;
122
+ const headers = headersToMap(response.headers);
123
+ return {
124
+ content: result,
125
+ headers,
126
+ // eslint-disable-next-line @typescript-eslint/no-base-to-string
127
+ requestUrl: fetchRequestConfig[0].toString(),
128
+ propsToLog: {
129
+ ...getPropsToLogFromResponse(headers),
130
+ bodySize,
131
+ receiveContentTime,
132
+ parseTime,
133
+ fetchTime: res.duration,
134
+ },
135
+ };
136
+ }
137
+ // Failure
138
+ if (response.status === 401 && canRetry) {
139
+ // Refresh Authorization header and retry once
140
+ this.token = await this.fetchRefreshedToken(true /* refreshToken */);
141
+ return this.request(config, statusCode, false);
142
+ }
143
+ if (response.status === 429 && responseBody?.retryAfter > 0) {
144
+ // Retry based on retryAfter[Seconds]
145
+ return new Promise((resolve, reject) => setTimeout(() => {
146
+ this.request(config, statusCode).then(resolve).catch(reject);
147
+ }, responseBody.retryAfter * 1000));
148
+ }
149
+ const responseSummary = responseBody !== undefined
150
+ ? typeof responseBody === "string"
151
+ ? responseBody
152
+ : safeStringify(responseBody)
153
+ : response.statusText;
154
+ throwR11sNetworkError(`R11s fetch error: ${responseSummary}`, response.status, responseBody?.retryAfter);
155
+ }
156
+ async generateHeaders(requestHeaders) {
157
+ const token = await this.getToken();
158
+ assert(token !== undefined, 0x679 /* token should be present */);
159
+ const headers = {
160
+ ...requestHeaders,
161
+ [DriverVersionHeaderName]: driverVersion,
162
+ // NOTE: If this.authorizationHeader is undefined, should "Authorization" be removed entirely?
163
+ Authorization: this.getAuthorizationHeader(token),
164
+ };
165
+ return headers;
166
+ }
167
+ async getToken() {
168
+ if (this.token !== undefined) {
169
+ return this.token;
170
+ }
171
+ const token = await (this.tokenP ?? this.fetchRefreshedToken());
172
+ this.setToken(token);
173
+ this.tokenP = undefined;
174
+ return token;
175
+ }
176
+ setToken(token) {
177
+ this.token = token;
178
+ }
179
+ }
180
+ export class RouterliciousStorageRestWrapper extends RouterliciousRestWrapper {
181
+ constructor(logger, rateLimiter, fetchToken, getAuthorizationHeader, useRestLess, baseurl, initialTokenP, defaultQueryString = {}) {
182
+ super(logger, rateLimiter, fetchToken, getAuthorizationHeader, useRestLess, baseurl, initialTokenP, defaultQueryString);
183
+ }
184
+ static async load(tenantId, tokenFetcher, logger, rateLimiter, useRestLess, baseurl, initialTokenP) {
185
+ const defaultQueryString = {
186
+ token: `${fromUtf8ToBase64(tenantId)}`,
187
+ };
188
+ const getAuthorizationHeader = (token) => {
189
+ const credentials = {
190
+ password: token.jwt,
191
+ user: tenantId,
192
+ };
193
+ return getAuthorizationTokenFromCredentials(credentials);
194
+ };
195
+ const restWrapper = new RouterliciousStorageRestWrapper(logger, rateLimiter, tokenFetcher, getAuthorizationHeader, useRestLess, baseurl, initialTokenP, defaultQueryString);
196
+ return restWrapper;
197
+ }
198
+ }
199
+ export class RouterliciousOrdererRestWrapper extends RouterliciousRestWrapper {
200
+ constructor(logger, rateLimiter, fetchToken, getAuthorizationHeader, useRestLess, baseurl, initialTokenP, defaultQueryString = {}) {
201
+ super(logger, rateLimiter, fetchToken, getAuthorizationHeader, useRestLess, baseurl, initialTokenP, defaultQueryString);
202
+ }
203
+ static async load(tokenFetcher, logger, rateLimiter, useRestLess, baseurl, initialTokenP) {
204
+ const getAuthorizationHeader = (token) => {
205
+ return `Basic ${token.jwt}`;
206
+ };
207
+ const restWrapper = new RouterliciousOrdererRestWrapper(logger, rateLimiter, tokenFetcher, getAuthorizationHeader, useRestLess, baseurl, initialTokenP);
208
+ return restWrapper;
209
+ }
210
+ }
211
+ export function toInstrumentedR11sOrdererTokenFetcher(tenantId, documentId, tokenProvider, logger) {
212
+ const fetchOrdererToken = async (refreshToken) => {
213
+ return PerformanceEvent.timedExecAsync(logger, {
214
+ eventName: "FetchOrdererToken",
215
+ docId: documentId,
216
+ }, async () => {
217
+ const ordererToken = await tokenProvider.fetchOrdererToken(tenantId, documentId, refreshToken);
218
+ return ordererToken;
219
+ });
220
+ };
221
+ return fetchOrdererToken;
222
+ }
223
+ export function toInstrumentedR11sStorageTokenFetcher(tenantId, documentId, tokenProvider, logger) {
224
+ const fetchStorageToken = async (refreshToken) => {
225
+ return PerformanceEvent.timedExecAsync(logger, {
226
+ eventName: "FetchStorageToken",
227
+ docId: documentId,
228
+ }, async () => {
229
+ // Craft credentials using tenant id and token
230
+ const storageToken = await tokenProvider.fetchStorageToken(tenantId, documentId, refreshToken);
231
+ return storageToken;
232
+ });
233
+ };
234
+ return fetchStorageToken;
235
+ }
236
+ //# sourceMappingURL=restWrapper.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"restWrapper.mjs","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 { ITelemetryProperties } from \"@fluidframework/core-interfaces\";\nimport {\n\tITelemetryLoggerExt,\n\tPerformanceEvent,\n\tnumberFromString,\n} from \"@fluidframework/telemetry-utils\";\nimport { assert } from \"@fluidframework/core-utils\";\nimport { fromUtf8ToBase64, performance } from \"@fluid-internal/client-utils\";\nimport { GenericNetworkError, NonRetryableError, RateLimiter } from \"@fluidframework/driver-utils\";\nimport {\n\tCorrelationIdHeaderName,\n\tDriverVersionHeaderName,\n\tgetAuthorizationTokenFromCredentials,\n\tRestLessClient,\n} from \"@fluidframework/server-services-client\";\nimport fetch from \"cross-fetch\";\nimport type { AxiosRequestConfig, RawAxiosRequestHeaders } from \"axios\";\nimport safeStringify from \"json-stringify-safe\";\nimport { RouterliciousErrorTypes, 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;\nexport type 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 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) {\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}) {\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: ITelemetryProperties = {\n\t\tcontentsize: 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: ITelemetryLoggerExt,\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: 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\tconst errorMessage = isNetworkError\n\t\t\t\t\t? `NetworkError: ${error.message}`\n\t\t\t\t\t: safeStringify(error);\n\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// a network error with no status code (e.g. err:ERR_CONN_REFUSED or err:ERR_FAILED) and\n\t\t\t\t// the error message will start with NetworkError as defined in restWrapper.ts\n\t\t\t\t// If there exists a self-signed SSL certificates error, throw a NonRetryableError\n\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\tconst err = errorMessage.includes(\"failed, reason: self signed certificate\")\n\t\t\t\t\t? new NonRetryableError(errorMessage, RouterliciousErrorTypes.sslCertError, {\n\t\t\t\t\t\t\tdriverVersion,\n\t\t\t\t\t })\n\t\t\t\t\t: new GenericNetworkError(\n\t\t\t\t\t\t\terrorMessage,\n\t\t\t\t\t\t\terrorMessage.startsWith(\"NetworkError\"),\n\t\t\t\t\t\t\t{ driverVersion },\n\t\t\t\t\t );\n\t\t\t\tthrow err;\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\t// eslint-disable-next-line @typescript-eslint/no-base-to-string\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?: RawAxiosRequestHeaders | undefined,\n\t): Promise<RawAxiosRequestHeaders> {\n\t\tconst token = await this.getToken();\n\t\tassert(token !== undefined, 0x679 /* token should be present */);\n\t\tconst headers: RawAxiosRequestHeaders = {\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) {\n\t\tthis.token = token;\n\t}\n}\n\nexport class RouterliciousStorageRestWrapper extends RouterliciousRestWrapper {\n\tprivate constructor(\n\t\tlogger: ITelemetryLoggerExt,\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 async load(\n\t\ttenantId: string,\n\t\ttokenFetcher: TokenFetcher,\n\t\tlogger: ITelemetryLoggerExt,\n\t\trateLimiter: RateLimiter,\n\t\tuseRestLess: boolean,\n\t\tbaseurl?: string,\n\t\tinitialTokenP?: Promise<ITokenResponse>,\n\t): Promise<RouterliciousStorageRestWrapper> {\n\t\tconst defaultQueryString = {\n\t\t\ttoken: `${fromUtf8ToBase64(tenantId)}`,\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\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: ITelemetryLoggerExt,\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 async load(\n\t\ttokenFetcher: TokenFetcher,\n\t\tlogger: ITelemetryLoggerExt,\n\t\trateLimiter: RateLimiter,\n\t\tuseRestLess: boolean,\n\t\tbaseurl?: string,\n\t\tinitialTokenP?: Promise<ITokenResponse>,\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 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: ITelemetryLoggerExt,\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: ITelemetryLoggerExt,\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"]}
@@ -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.mjs";
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 type QueryStringType = Record<string, string | number | boolean>;
26
+ //# sourceMappingURL=restWrapperBase.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"restWrapperBase.d.mts","sourceRoot":"","sources":["../src/restWrapperBase.ts"],"names":[],"mappings":"AAAA;;;GAGG;OAEI,KAAK,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,OAAO;OAC7D,EAAE,aAAa,EAAE;AAExB,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,MAAM,MAAM,eAAe,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,CAAC"}
@@ -0,0 +1,84 @@
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 = {
14
+ ...additionalOptions,
15
+ baseURL: this.baseurl,
16
+ headers,
17
+ maxBodyLength: this.maxBodyLength,
18
+ maxContentLength: this.maxContentLength,
19
+ method: "GET",
20
+ url: `${url}${this.generateQueryString(queryString)}`,
21
+ };
22
+ return this.request(options, 200);
23
+ }
24
+ async post(url, requestBody, queryString, headers, additionalOptions) {
25
+ const options = {
26
+ ...additionalOptions,
27
+ baseURL: this.baseurl,
28
+ data: requestBody,
29
+ headers,
30
+ maxBodyLength: this.maxBodyLength,
31
+ maxContentLength: this.maxContentLength,
32
+ method: "POST",
33
+ url: `${url}${this.generateQueryString(queryString)}`,
34
+ };
35
+ return this.request(options, 201);
36
+ }
37
+ async delete(url, queryString, headers, additionalOptions) {
38
+ const options = {
39
+ ...additionalOptions,
40
+ baseURL: this.baseurl,
41
+ headers,
42
+ maxBodyLength: this.maxBodyLength,
43
+ maxContentLength: this.maxContentLength,
44
+ method: "DELETE",
45
+ url: `${url}${this.generateQueryString(queryString)}`,
46
+ };
47
+ return this.request(options, 204);
48
+ }
49
+ async patch(url, requestBody, queryString, headers, additionalOptions) {
50
+ const options = {
51
+ ...additionalOptions,
52
+ baseURL: this.baseurl,
53
+ data: requestBody,
54
+ headers,
55
+ maxBodyLength: this.maxBodyLength,
56
+ maxContentLength: this.maxContentLength,
57
+ method: "PATCH",
58
+ url: `${url}${this.generateQueryString(queryString)}`,
59
+ };
60
+ return this.request(options, 200);
61
+ }
62
+ generateQueryString(queryStringValues) {
63
+ if (this.defaultQueryString || queryStringValues) {
64
+ const queryStringMap = { ...this.defaultQueryString, ...queryStringValues };
65
+ return getQueryString(queryStringMap);
66
+ }
67
+ return "";
68
+ }
69
+ }
70
+ /**
71
+ * Generates query string from the given query parameters.
72
+ * @param queryParams - Query parameters from which to create a query.
73
+ */
74
+ export function getQueryString(queryParams) {
75
+ let queryString = "";
76
+ for (const key of Object.keys(queryParams)) {
77
+ if (queryParams[key] !== undefined) {
78
+ const startChar = queryString === "" ? "?" : "&";
79
+ queryString += `${startChar}${key}=${encodeURIComponent(queryParams[key])}`;
80
+ }
81
+ }
82
+ return queryString;
83
+ }
84
+ //# sourceMappingURL=restWrapperBase.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"restWrapperBase.mjs","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"]}
@@ -0,0 +1,24 @@
1
+ /*!
2
+ * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
+ * Licensed under the MIT License.
4
+ */
5
+ import type * as git from "@fluidframework/gitresources";
6
+ import { IWholeSummaryPayload, IWriteSummaryResponse } from "@fluidframework/server-services-client";
7
+ import { ITelemetryLoggerExt } from "@fluidframework/telemetry-utils";
8
+ import { IGitManager } from "./storageContracts.mjs";
9
+ import { IR11sResponse } from "./restWrapper.mjs";
10
+ import { IWholeFlatSnapshot } from "./contracts.mjs";
11
+ export declare class RetriableGitManager implements IGitManager {
12
+ private readonly internalGitManager;
13
+ private readonly logger;
14
+ constructor(internalGitManager: IGitManager, logger: ITelemetryLoggerExt);
15
+ getCommits(sha: string, count: number): Promise<IR11sResponse<git.ICommitDetails[]>>;
16
+ getTree(root: string, recursive: boolean): Promise<IR11sResponse<git.ITree>>;
17
+ getBlob(sha: string): Promise<IR11sResponse<git.IBlob>>;
18
+ createBlob(content: string, encoding: string): Promise<IR11sResponse<git.ICreateBlobResponse>>;
19
+ createGitTree(params: git.ICreateTreeParams): Promise<IR11sResponse<git.ITree>>;
20
+ createSummary(summary: IWholeSummaryPayload): Promise<IR11sResponse<IWriteSummaryResponse>>;
21
+ getSnapshot(sha: string): Promise<IR11sResponse<IWholeFlatSnapshot>>;
22
+ private runWithRetry;
23
+ }
24
+ //# sourceMappingURL=retriableGitManager.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"retriableGitManager.d.mts","sourceRoot":"","sources":["../src/retriableGitManager.ts"],"names":[],"mappings":"AAAA;;;GAGG;OAEI,KAAK,KAAK,GAAG,MAAM,8BAA8B;OACjD,EACN,oBAAoB,EACpB,qBAAqB,EACrB,MAAM,wCAAwC;OAExC,EAAE,mBAAmB,EAAE,MAAM,iCAAiC;OAC9D,EAAE,WAAW,EAAE;OACf,EAAE,aAAa,EAAE;OACjB,EAAE,kBAAkB,EAAE;AAE7B,qBAAa,mBAAoB,YAAW,WAAW;IAErD,OAAO,CAAC,QAAQ,CAAC,kBAAkB;IACnC,OAAO,CAAC,QAAQ,CAAC,MAAM;gBADN,kBAAkB,EAAE,WAAW,EAC/B,MAAM,EAAE,mBAAmB;IAGhC,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,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,kBAAkB,CAAC,CAAC;YAOnE,YAAY;CAQ1B"}
@@ -0,0 +1,36 @@
1
+ /*!
2
+ * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
+ * Licensed under the MIT License.
4
+ */
5
+ import { runWithRetry } from "@fluidframework/driver-utils";
6
+ export class RetriableGitManager {
7
+ constructor(internalGitManager, logger) {
8
+ this.internalGitManager = internalGitManager;
9
+ this.logger = logger;
10
+ }
11
+ async getCommits(sha, count) {
12
+ return this.runWithRetry(async () => this.internalGitManager.getCommits(sha, count), "gitManager_getCommits");
13
+ }
14
+ async getTree(root, recursive) {
15
+ return this.runWithRetry(async () => this.internalGitManager.getTree(root, recursive), "gitManager_getTree");
16
+ }
17
+ async getBlob(sha) {
18
+ return this.runWithRetry(async () => this.internalGitManager.getBlob(sha), "gitManager_getBlob");
19
+ }
20
+ async createBlob(content, encoding) {
21
+ return this.runWithRetry(async () => this.internalGitManager.createBlob(content, encoding), "gitManager_createBlob");
22
+ }
23
+ async createGitTree(params) {
24
+ return this.runWithRetry(async () => this.internalGitManager.createGitTree(params), "gitManager_createGitTree");
25
+ }
26
+ async createSummary(summary) {
27
+ return this.runWithRetry(async () => this.internalGitManager.createSummary(summary), "gitManager_createSummary");
28
+ }
29
+ async getSnapshot(sha) {
30
+ return this.runWithRetry(async () => this.internalGitManager.getSnapshot(sha), "gitManager_getSummary");
31
+ }
32
+ async runWithRetry(api, callName) {
33
+ return runWithRetry(api, callName, this.logger, {});
34
+ }
35
+ }
36
+ //# sourceMappingURL=retriableGitManager.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"retriableGitManager.mjs","sourceRoot":"","sources":["../src/retriableGitManager.ts"],"names":[],"mappings":"AAAA;;;GAGG;OAOI,EAAE,YAAY,EAAE,MAAM,8BAA8B;AAM3D,MAAM,OAAO,mBAAmB;IAC/B,YACkB,kBAA+B,EAC/B,MAA2B;QAD3B,uBAAkB,GAAlB,kBAAkB,CAAa;QAC/B,WAAM,GAAN,MAAM,CAAqB;IAC1C,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,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,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\tIWholeSummaryPayload,\n\tIWriteSummaryResponse,\n} from \"@fluidframework/server-services-client\";\nimport { runWithRetry } from \"@fluidframework/driver-utils\";\nimport { ITelemetryLoggerExt } from \"@fluidframework/telemetry-utils\";\nimport { IGitManager } from \"./storageContracts\";\nimport { IR11sResponse } from \"./restWrapper\";\nimport { IWholeFlatSnapshot } from \"./contracts\";\n\nexport class RetriableGitManager implements IGitManager {\n\tconstructor(\n\t\tprivate readonly internalGitManager: IGitManager,\n\t\tprivate readonly logger: ITelemetryLoggerExt,\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 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"]}
@@ -0,0 +1,92 @@
1
+ import { IDocumentService } from '@fluidframework/driver-definitions';
2
+ import { IDocumentServiceFactory } from '@fluidframework/driver-definitions';
3
+ import { IResolvedUrl } from '@fluidframework/driver-definitions';
4
+ import { ISession } from '@fluidframework/server-services-client';
5
+ import { ISummaryTree } from '@fluidframework/protocol-definitions';
6
+ import { ITelemetryBaseLogger } from '@fluidframework/core-interfaces';
7
+ import { ITokenClaims } from '@fluidframework/protocol-definitions';
8
+
9
+ /* Excluded from this release type: DefaultTokenProvider */
10
+
11
+ /* Excluded from this release type: DocumentPostCreateError */
12
+
13
+ /* Excluded from this release type: IRouterliciousDriverPolicies */
14
+
15
+ /**
16
+ * Abstracts the token fetching mechanism for a hosting application.
17
+ * The hosting application is responsible for providing an implementation.
18
+ * @public
19
+ */
20
+ export declare interface ITokenProvider {
21
+ /**
22
+ * Fetches the orderer token from host.
23
+ *
24
+ * @param tenantId - Tenant ID.
25
+ * @param documentId - Optional. Document ID is only required for document-scoped requests.
26
+ * @param refresh - Optional flag indicating whether token fetch must bypass local cache.
27
+ * This likely indicates that some previous request failed authorization due to an expired token,
28
+ * and so a fresh token is required.
29
+ *
30
+ * Default: `false`.
31
+ *
32
+ * NOTE: This parameter will be made required in the future.
33
+ */
34
+ fetchOrdererToken(tenantId: string, documentId?: string, refresh?: boolean): Promise<ITokenResponse>;
35
+ /**
36
+ * Fetches the storage token from host.
37
+ *
38
+ * @param tenantId - Tenant ID.
39
+ * @param documentId - Document ID.
40
+ * @param refresh - Optional flag indicating whether token fetch must bypass local cache.
41
+ * This likely indicates that some previous request failed authorization due to an expired token,
42
+ * and so a fresh token is required.
43
+ *
44
+ * Default: `false`.
45
+ *
46
+ * NOTE: This parameter will be made required in the future.
47
+ */
48
+ fetchStorageToken(tenantId: string, documentId: string, refresh?: boolean): Promise<ITokenResponse>;
49
+ /**
50
+ * A callback triggered directly after creating the document. In this callback the client has the opportunity, to
51
+ * verify against an authorization service, if the user who claims to create the document is the same user who
52
+ * created it.
53
+ *
54
+ * @remarks Notes:
55
+ *
56
+ * * Using the callback may have performance impact on the document creation process.
57
+ *
58
+ * * Any exceptions thrown in the callback would fail the creation workflow
59
+ * (see {@link RouterliciousDocumentServiceFactory.createContainer} for more details).
60
+ *
61
+ * @param documentId - Document ID.
62
+ * @param creationToken - A special token that doesn't provide any kind of access, but it has the user's payload
63
+ * and document id. It can be used to validate the identity of the document creator.
64
+ */
65
+ documentPostCreateCallback?(documentId: string, creationToken: string): Promise<void>;
66
+ }
67
+
68
+ /**
69
+ * @public
70
+ */
71
+ export declare interface ITokenResponse {
72
+ /**
73
+ * {@link https://jwt.io/introduction/ | JSON Web Token (JWT)} value.
74
+ */
75
+ jwt: string;
76
+ /**
77
+ * A flag indicating whether token was obtained from local cache.
78
+ *
79
+ * @remarks `undefined` indicates that the source of the token could not be determined.
80
+ */
81
+ fromCache?: boolean;
82
+ }
83
+
84
+ /* Excluded from this release type: ITokenService */
85
+
86
+ /* Excluded from this release type: RouterliciousDocumentServiceFactory */
87
+
88
+ /* Excluded from this release type: RouterliciousErrorType */
89
+
90
+ /* Excluded from this release type: RouterliciousErrorTypes */
91
+
92
+ export { }