@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
@@ -2,35 +2,37 @@
2
2
  * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
3
  * Licensed under the MIT License.
4
4
  */
5
- import type { ITelemetryLogger } from "@fluidframework/common-definitions";
5
+ import { ITelemetryLoggerExt } from "@fluidframework/telemetry-utils";
6
6
  import { IDocumentStorageService, ISummaryContext, IDocumentStorageServicePolicies } from "@fluidframework/driver-definitions";
7
7
  import { ICreateBlobResponse, ISnapshotTree, ISummaryHandle, ISummaryTree, IVersion } from "@fluidframework/protocol-definitions";
8
- import { GitManager } from "@fluidframework/server-services-client";
9
- import { ICache } from "./cache";
10
- import { ISnapshotTreeVersion } from "./definitions";
11
- import { IRouterliciousDriverPolicies } from "./policies";
8
+ import { ICache } from "./cache.mjs";
9
+ import { IRouterliciousDriverPolicies } from "./policies.mjs";
10
+ import { GitManager } from "./gitManager.mjs";
11
+ import { INormalizedWholeSnapshot } from "./contracts.mjs";
12
12
  export declare class WholeSummaryDocumentStorageService implements IDocumentStorageService {
13
13
  protected readonly id: string;
14
14
  protected readonly manager: GitManager;
15
- protected readonly logger: ITelemetryLogger;
15
+ protected readonly logger: ITelemetryLoggerExt;
16
16
  readonly policies: IDocumentStorageServicePolicies;
17
17
  private readonly driverPolicies?;
18
18
  private readonly blobCache;
19
19
  private readonly snapshotTreeCache;
20
20
  private readonly noCacheGitManager?;
21
21
  private readonly getStorageManager;
22
+ private readonly mc;
22
23
  private firstVersionsCall;
23
- get repositoryUrl(): string;
24
+ readonly repositoryUrl = "";
24
25
  private getSummaryUploadManager;
25
- constructor(id: string, manager: GitManager, logger: ITelemetryLogger, policies?: IDocumentStorageServicePolicies, driverPolicies?: IRouterliciousDriverPolicies | undefined, blobCache?: ICache<ArrayBufferLike>, snapshotTreeCache?: ICache<ISnapshotTreeVersion>, noCacheGitManager?: GitManager | undefined, getStorageManager?: (disableCache?: boolean) => Promise<GitManager>);
26
+ constructor(id: string, manager: GitManager, logger: ITelemetryLoggerExt, policies: IDocumentStorageServicePolicies, driverPolicies?: IRouterliciousDriverPolicies | undefined, blobCache?: ICache<ArrayBufferLike>, snapshotTreeCache?: ICache<INormalizedWholeSnapshot>, noCacheGitManager?: GitManager | undefined, getStorageManager?: (disableCache?: boolean) => Promise<GitManager>);
26
27
  getVersions(versionId: string | null, count: number): Promise<IVersion[]>;
27
28
  getSnapshotTree(version?: IVersion): Promise<ISnapshotTree | null>;
28
29
  readBlob(blobId: string): Promise<ArrayBufferLike>;
29
30
  uploadSummaryWithContext(summary: ISummaryTree, context: ISummaryContext): Promise<string>;
30
31
  downloadSummary(summaryHandle: ISummaryHandle): Promise<ISummaryTree>;
31
32
  createBlob(file: ArrayBufferLike): Promise<ICreateBlobResponse>;
32
- private fetchAndCacheSnapshotTree;
33
- private initBlobCache;
33
+ private fetchSnapshotTree;
34
+ private initializeFromSnapshot;
35
+ private updateBlobsCache;
34
36
  private getCacheKey;
35
37
  }
36
- //# sourceMappingURL=wholeSummaryDocumentStorageService.d.ts.map
38
+ //# sourceMappingURL=wholeSummaryDocumentStorageService.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wholeSummaryDocumentStorageService.d.mts","sourceRoot":"","sources":["../src/wholeSummaryDocumentStorageService.ts"],"names":[],"mappings":"AAAA;;;GAGG;OAEI,EACN,mBAAmB,EAInB,MAAM,iCAAiC;OAIjC,EACN,uBAAuB,EACvB,eAAe,EACf,+BAA+B,EAC/B,MAAM,oCAAoC;OACpC,EACN,mBAAmB,EACnB,aAAa,EACb,cAAc,EACd,YAAY,EACZ,QAAQ,EACR,MAAM,sCAAsC;OACtC,EAAE,MAAM,EAAiB;OACzB,EAAE,4BAA4B,EAAE;OAMhC,EAAE,UAAU,EAAE;OAId,EAAE,wBAAwB,EAAsB;AAKvD,qBAAa,kCAAmC,YAAW,uBAAuB;IAYhF,SAAS,CAAC,QAAQ,CAAC,EAAE,EAAE,MAAM;IAC7B,SAAS,CAAC,QAAQ,CAAC,OAAO,EAAE,UAAU;IACtC,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,mBAAmB;aAC9B,QAAQ,EAAE,+BAA+B;IACzD,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC;IAChC,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IAClC,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAC;IACnC,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IAnBnC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAoB;IACvC,OAAO,CAAC,iBAAiB,CAAiB;IAE1C,SAAgB,aAAa,MAAM;YAErB,uBAAuB;gBAMjB,EAAE,EAAE,MAAM,EACV,OAAO,EAAE,UAAU,EACnB,MAAM,EAAE,mBAAmB,EAC9B,QAAQ,EAAE,+BAA+B,EACxC,cAAc,CAAC,0CAA8B,EAC7C,SAAS,GAAE,MAAM,CAAC,eAAe,CAAuB,EACxD,iBAAiB,GAAE,MAAM,CAAC,wBAAwB,CAAuB,EACzE,iBAAiB,CAAC,wBAAY,EAC9B,iBAAiB,GAAE,CACnC,YAAY,CAAC,EAAE,OAAO,KAClB,OAAO,CAAC,UAAU,CAGP;IAQJ,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;IA0FzE,eAAe,CAAC,OAAO,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;IA+BlE,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;IAgClD,wBAAwB,CACpC,OAAO,EAAE,YAAY,EACrB,OAAO,EAAE,eAAe,GACtB,OAAO,CAAC,MAAM,CAAC;IAqBL,eAAe,CAAC,aAAa,EAAE,cAAc,GAAG,OAAO,CAAC,YAAY,CAAC;IAwBrE,UAAU,CAAC,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,mBAAmB,CAAC;YAqB9D,iBAAiB;YA4CjB,sBAAsB;YAetB,gBAAgB;IAS9B,OAAO,CAAC,WAAW;CAGnB"}
@@ -0,0 +1,249 @@
1
+ /*!
2
+ * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
+ * Licensed under the MIT License.
4
+ */
5
+ import { PerformanceEvent, createChildMonitoringContext, } from "@fluidframework/telemetry-utils";
6
+ import { performance, stringToBuffer, Uint8ArrayToString } from "@fluid-internal/client-utils";
7
+ import { assert } from "@fluidframework/core-utils";
8
+ import { getW3CData, promiseRaceWithWinner } from "@fluidframework/driver-base";
9
+ import { InMemoryCache } from "./cache.mjs";
10
+ import { convertSnapshotAndBlobsToSummaryTree, evalBlobsAndTrees, validateBlobsAndTrees, } from "./treeUtils.mjs";
11
+ import { WholeSummaryUploadManager } from "./wholeSummaryUploadManager.mjs";
12
+ import { convertWholeFlatSnapshotToSnapshotTreeAndBlobs } from "./r11sSnapshotParser.mjs";
13
+ const latestSnapshotId = "latest";
14
+ export class WholeSummaryDocumentStorageService {
15
+ async getSummaryUploadManager() {
16
+ const manager = await this.getStorageManager();
17
+ return new WholeSummaryUploadManager(manager);
18
+ }
19
+ constructor(id, manager, logger, policies, driverPolicies, blobCache = new InMemoryCache(), snapshotTreeCache = new InMemoryCache(), noCacheGitManager, getStorageManager = async (disableCache) => disableCache && this.noCacheGitManager !== undefined
20
+ ? this.noCacheGitManager
21
+ : this.manager) {
22
+ this.id = id;
23
+ this.manager = manager;
24
+ this.logger = logger;
25
+ this.policies = policies;
26
+ this.driverPolicies = driverPolicies;
27
+ this.blobCache = blobCache;
28
+ this.snapshotTreeCache = snapshotTreeCache;
29
+ this.noCacheGitManager = noCacheGitManager;
30
+ this.getStorageManager = getStorageManager;
31
+ this.firstVersionsCall = true;
32
+ this.repositoryUrl = "";
33
+ this.mc = createChildMonitoringContext({
34
+ logger,
35
+ });
36
+ }
37
+ // eslint-disable-next-line @rushstack/no-new-null
38
+ async getVersions(versionId, count) {
39
+ if (versionId !== this.id && versionId !== null) {
40
+ // Blobs/Trees in this scenario will never have multiple versions, so return versionId as is
41
+ return [
42
+ {
43
+ id: versionId,
44
+ treeId: undefined,
45
+ },
46
+ ];
47
+ }
48
+ // If this is the first versions call for the document, we know we will want the latest summary.
49
+ // Fetch latest summary, cache it, and return its id.
50
+ if (this.firstVersionsCall && count === 1) {
51
+ const normalizedSnapshotContents = await PerformanceEvent.timedExecAsync(this.logger, {
52
+ eventName: "ObtainSnapshot",
53
+ versionId: versionId ?? undefined,
54
+ count,
55
+ enableDiscovery: this.driverPolicies?.enableDiscovery,
56
+ }, async (event) => {
57
+ let method;
58
+ const cachedSnapshotP = this.snapshotTreeCache.get(this.getCacheKey(latestSnapshotId));
59
+ const networkSnapshotP = !this.driverPolicies?.enableDiscovery
60
+ ? this.fetchSnapshotTree(latestSnapshotId, false, "getVersions")
61
+ : this.fetchSnapshotTree(latestSnapshotId, true, "getVersions");
62
+ const promiseRaceWinner = await promiseRaceWithWinner([
63
+ cachedSnapshotP.catch(() => undefined),
64
+ networkSnapshotP.catch(() => undefined),
65
+ ]);
66
+ let retrievedSnapshot = promiseRaceWinner.value;
67
+ method = promiseRaceWinner.index === 0 ? "cache" : "network";
68
+ if (retrievedSnapshot === undefined) {
69
+ // if network failed -> wait for cache ( then return network failure)
70
+ // If cache returned empty or failed -> wait for network (success of failure)
71
+ if (promiseRaceWinner.index === 1) {
72
+ retrievedSnapshot = await cachedSnapshotP;
73
+ method = "cache";
74
+ }
75
+ if (retrievedSnapshot === undefined) {
76
+ retrievedSnapshot = await networkSnapshotP;
77
+ method = "network";
78
+ }
79
+ }
80
+ event.end({
81
+ method,
82
+ });
83
+ return retrievedSnapshot;
84
+ });
85
+ const _id = await this.initializeFromSnapshot(normalizedSnapshotContents);
86
+ this.firstVersionsCall = false;
87
+ return [
88
+ {
89
+ id: _id,
90
+ treeId: normalizedSnapshotContents.snapshotTree.id,
91
+ },
92
+ ];
93
+ }
94
+ // Otherwise, get the latest version of the document as normal.
95
+ const id = versionId ? versionId : this.id;
96
+ const commits = await PerformanceEvent.timedExecAsync(this.logger, {
97
+ eventName: "getVersions",
98
+ versionId: id,
99
+ count,
100
+ }, async () => {
101
+ const manager = await this.getStorageManager();
102
+ return (await manager.getCommits(id, count)).content;
103
+ });
104
+ return commits.map((commit) => ({
105
+ date: commit.commit.author.date,
106
+ id: commit.sha,
107
+ treeId: commit.commit.tree.sha,
108
+ }));
109
+ }
110
+ // eslint-disable-next-line @rushstack/no-new-null
111
+ async getSnapshotTree(version) {
112
+ let requestVersion = version;
113
+ if (!requestVersion) {
114
+ const versions = await this.getVersions(this.id, 1);
115
+ if (versions.length === 0) {
116
+ return null;
117
+ }
118
+ requestVersion = versions[0];
119
+ }
120
+ let normalizedWholeSnapshot = await this.snapshotTreeCache.get(this.getCacheKey(requestVersion.id));
121
+ if (normalizedWholeSnapshot !== undefined) {
122
+ return normalizedWholeSnapshot.snapshotTree;
123
+ }
124
+ normalizedWholeSnapshot = await this.fetchSnapshotTree(requestVersion.id, undefined, "getSnapshotTree");
125
+ // Currently retrieving blobs from network is not supported by AFR for WholeSummaryDocumentStorageService
126
+ // Blobs are expected to be put in the cache
127
+ await this.updateBlobsCache(normalizedWholeSnapshot.blobs);
128
+ return normalizedWholeSnapshot.snapshotTree;
129
+ }
130
+ async readBlob(blobId) {
131
+ const cachedBlob = await this.blobCache.get(this.getCacheKey(blobId));
132
+ if (cachedBlob !== undefined) {
133
+ return cachedBlob;
134
+ }
135
+ // Note: AFR does not support readBlobs, but potentially other r11s like servers do
136
+ const blob = await PerformanceEvent.timedExecAsync(this.logger, {
137
+ eventName: "readBlob",
138
+ blobId,
139
+ }, async (event) => {
140
+ const manager = await this.getStorageManager();
141
+ const response = (await manager.getBlob(blobId)).content;
142
+ event.end({
143
+ size: response.size,
144
+ });
145
+ return response;
146
+ }, undefined, // workers
147
+ undefined, // recordHeapSize
148
+ this.mc.config.getNumber("Fluid.Driver.ReadBlobTelemetrySampling"));
149
+ const bufferValue = stringToBuffer(blob.content, blob.encoding);
150
+ await this.blobCache.put(this.getCacheKey(blob.sha), bufferValue);
151
+ return bufferValue;
152
+ }
153
+ async uploadSummaryWithContext(summary, context) {
154
+ const summaryHandle = await PerformanceEvent.timedExecAsync(this.logger, {
155
+ eventName: "uploadSummaryWithContext",
156
+ proposalHandle: context.proposalHandle,
157
+ ackHandle: context.ackHandle,
158
+ referenceSequenceNumber: context.referenceSequenceNumber,
159
+ }, async () => {
160
+ const summaryUploadManager = await this.getSummaryUploadManager();
161
+ return summaryUploadManager.writeSummaryTree(summary, context.ackHandle ?? "", "channel");
162
+ });
163
+ return summaryHandle;
164
+ }
165
+ async downloadSummary(summaryHandle) {
166
+ const wholeFlatSnapshot = await PerformanceEvent.timedExecAsync(this.logger, {
167
+ eventName: "getWholeFlatSummary",
168
+ treeId: summaryHandle.handle,
169
+ }, async (event) => {
170
+ const manager = await this.getStorageManager();
171
+ const response = await manager.getSnapshot(summaryHandle.handle);
172
+ event.end({
173
+ size: response.content.trees[0]?.entries.length,
174
+ });
175
+ return response.content;
176
+ });
177
+ const { blobs, snapshotTree } = convertWholeFlatSnapshotToSnapshotTreeAndBlobs(wholeFlatSnapshot, "");
178
+ return convertSnapshotAndBlobsToSummaryTree(snapshotTree, blobs);
179
+ }
180
+ async createBlob(file) {
181
+ const uint8ArrayFile = new Uint8Array(file);
182
+ return PerformanceEvent.timedExecAsync(this.logger, {
183
+ eventName: "createBlob",
184
+ size: uint8ArrayFile.length,
185
+ }, async (event) => {
186
+ const manager = await this.getStorageManager();
187
+ const response = await manager
188
+ .createBlob(Uint8ArrayToString(uint8ArrayFile, "base64"), "base64")
189
+ .then((r) => ({ id: r.content.sha, url: r.content.url }));
190
+ event.end({
191
+ blobId: response.id,
192
+ });
193
+ return response;
194
+ });
195
+ }
196
+ async fetchSnapshotTree(versionId, disableCache, scenarioName) {
197
+ const normalizedWholeSummary = await PerformanceEvent.timedExecAsync(this.logger, {
198
+ eventName: "getWholeFlatSummary",
199
+ treeId: versionId,
200
+ scenarioName,
201
+ }, async (event) => {
202
+ const manager = await this.getStorageManager(disableCache);
203
+ const response = await manager.getSnapshot(versionId);
204
+ const start = performance.now();
205
+ const snapshot = convertWholeFlatSnapshotToSnapshotTreeAndBlobs(response.content);
206
+ const snapshotConversionTime = performance.now() - start;
207
+ validateBlobsAndTrees(snapshot.snapshotTree);
208
+ const { trees, numBlobs, encodedBlobsSize } = evalBlobsAndTrees(snapshot);
209
+ event.end({
210
+ size: response.content.trees[0]?.entries.length,
211
+ trees,
212
+ blobs: numBlobs,
213
+ encodedBlobsSize,
214
+ sequenceNumber: snapshot.sequenceNumber,
215
+ ...response.propsToLog,
216
+ snapshotConversionTime,
217
+ ...getW3CData(response.requestUrl, "xmlhttprequest"),
218
+ });
219
+ return snapshot;
220
+ });
221
+ // Also add the result into the cache.
222
+ await this.snapshotTreeCache
223
+ .put(this.getCacheKey(versionId), normalizedWholeSummary)
224
+ .catch(() => undefined);
225
+ return normalizedWholeSummary;
226
+ }
227
+ async initializeFromSnapshot(normalizedWholeSummary) {
228
+ const snapshotId = normalizedWholeSummary.id;
229
+ assert(snapshotId !== undefined, 0x275 /* "Root tree should contain the id" */);
230
+ const cachePs = [
231
+ this.snapshotTreeCache.put(this.getCacheKey(snapshotId), normalizedWholeSummary),
232
+ this.updateBlobsCache(normalizedWholeSummary.blobs),
233
+ ];
234
+ await Promise.all(cachePs);
235
+ return snapshotId;
236
+ }
237
+ async updateBlobsCache(blobs) {
238
+ const blobCachePutPs = [];
239
+ blobs.forEach((value, id) => {
240
+ const cacheKey = this.getCacheKey(id);
241
+ blobCachePutPs.push(this.blobCache.put(cacheKey, value));
242
+ });
243
+ await Promise.all(blobCachePutPs);
244
+ }
245
+ getCacheKey(blobId) {
246
+ return `${this.id}:${blobId}`;
247
+ }
248
+ }
249
+ //# sourceMappingURL=wholeSummaryDocumentStorageService.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wholeSummaryDocumentStorageService.mjs","sourceRoot":"","sources":["../src/wholeSummaryDocumentStorageService.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport {\n\tITelemetryLoggerExt,\n\tMonitoringContext,\n\tPerformanceEvent,\n\tcreateChildMonitoringContext,\n} from \"@fluidframework/telemetry-utils\";\nimport { performance, stringToBuffer, Uint8ArrayToString } from \"@fluid-internal/client-utils\";\nimport { assert } from \"@fluidframework/core-utils\";\nimport { getW3CData, promiseRaceWithWinner } from \"@fluidframework/driver-base\";\nimport {\n\tIDocumentStorageService,\n\tISummaryContext,\n\tIDocumentStorageServicePolicies,\n} from \"@fluidframework/driver-definitions\";\nimport {\n\tICreateBlobResponse,\n\tISnapshotTree,\n\tISummaryHandle,\n\tISummaryTree,\n\tIVersion,\n} from \"@fluidframework/protocol-definitions\";\nimport { ICache, InMemoryCache } from \"./cache\";\nimport { IRouterliciousDriverPolicies } from \"./policies\";\nimport {\n\tconvertSnapshotAndBlobsToSummaryTree,\n\tevalBlobsAndTrees,\n\tvalidateBlobsAndTrees,\n} from \"./treeUtils\";\nimport { GitManager } from \"./gitManager\";\nimport { WholeSummaryUploadManager } from \"./wholeSummaryUploadManager\";\nimport { ISummaryUploadManager } from \"./storageContracts\";\nimport { IR11sResponse } from \"./restWrapper\";\nimport { INormalizedWholeSnapshot, IWholeFlatSnapshot } from \"./contracts\";\nimport { convertWholeFlatSnapshotToSnapshotTreeAndBlobs } from \"./r11sSnapshotParser\";\n\nconst latestSnapshotId: string = \"latest\";\n\nexport class WholeSummaryDocumentStorageService implements IDocumentStorageService {\n\tprivate readonly mc: MonitoringContext;\n\tprivate firstVersionsCall: boolean = true;\n\n\tpublic readonly repositoryUrl = \"\";\n\n\tprivate async getSummaryUploadManager(): Promise<ISummaryUploadManager> {\n\t\tconst manager = await this.getStorageManager();\n\t\treturn new WholeSummaryUploadManager(manager);\n\t}\n\n\tconstructor(\n\t\tprotected readonly id: string,\n\t\tprotected readonly manager: GitManager,\n\t\tprotected readonly logger: ITelemetryLoggerExt,\n\t\tpublic readonly policies: IDocumentStorageServicePolicies,\n\t\tprivate readonly driverPolicies?: IRouterliciousDriverPolicies,\n\t\tprivate readonly blobCache: ICache<ArrayBufferLike> = new InMemoryCache(),\n\t\tprivate readonly snapshotTreeCache: ICache<INormalizedWholeSnapshot> = new InMemoryCache(),\n\t\tprivate readonly noCacheGitManager?: GitManager,\n\t\tprivate readonly getStorageManager: (\n\t\t\tdisableCache?: boolean,\n\t\t) => Promise<GitManager> = async (disableCache) =>\n\t\t\tdisableCache && this.noCacheGitManager !== undefined\n\t\t\t\t? this.noCacheGitManager\n\t\t\t\t: this.manager,\n\t) {\n\t\tthis.mc = createChildMonitoringContext({\n\t\t\tlogger,\n\t\t});\n\t}\n\n\t// eslint-disable-next-line @rushstack/no-new-null\n\tpublic async getVersions(versionId: string | null, count: number): Promise<IVersion[]> {\n\t\tif (versionId !== this.id && versionId !== null) {\n\t\t\t// Blobs/Trees in this scenario will never have multiple versions, so return versionId as is\n\t\t\treturn [\n\t\t\t\t{\n\t\t\t\t\tid: versionId,\n\t\t\t\t\ttreeId: undefined!,\n\t\t\t\t},\n\t\t\t];\n\t\t}\n\t\t// If this is the first versions call for the document, we know we will want the latest summary.\n\t\t// Fetch latest summary, cache it, and return its id.\n\t\tif (this.firstVersionsCall && count === 1) {\n\t\t\tconst normalizedSnapshotContents = await PerformanceEvent.timedExecAsync(\n\t\t\t\tthis.logger,\n\t\t\t\t{\n\t\t\t\t\teventName: \"ObtainSnapshot\",\n\t\t\t\t\tversionId: versionId ?? undefined,\n\t\t\t\t\tcount,\n\t\t\t\t\tenableDiscovery: this.driverPolicies?.enableDiscovery,\n\t\t\t\t},\n\t\t\t\tasync (event) => {\n\t\t\t\t\tlet method: string;\n\t\t\t\t\tconst cachedSnapshotP = this.snapshotTreeCache.get(\n\t\t\t\t\t\tthis.getCacheKey(latestSnapshotId),\n\t\t\t\t\t);\n\n\t\t\t\t\tconst networkSnapshotP = !this.driverPolicies?.enableDiscovery\n\t\t\t\t\t\t? this.fetchSnapshotTree(latestSnapshotId, false, \"getVersions\")\n\t\t\t\t\t\t: this.fetchSnapshotTree(latestSnapshotId, true, \"getVersions\");\n\n\t\t\t\t\tconst promiseRaceWinner = await promiseRaceWithWinner([\n\t\t\t\t\t\tcachedSnapshotP.catch(() => undefined),\n\t\t\t\t\t\tnetworkSnapshotP.catch(() => undefined),\n\t\t\t\t\t]);\n\n\t\t\t\t\tlet retrievedSnapshot = promiseRaceWinner.value;\n\t\t\t\t\tmethod = promiseRaceWinner.index === 0 ? \"cache\" : \"network\";\n\n\t\t\t\t\tif (retrievedSnapshot === undefined) {\n\t\t\t\t\t\t// if network failed -> wait for cache ( then return network failure)\n\t\t\t\t\t\t// If cache returned empty or failed -> wait for network (success of failure)\n\t\t\t\t\t\tif (promiseRaceWinner.index === 1) {\n\t\t\t\t\t\t\tretrievedSnapshot = await cachedSnapshotP;\n\t\t\t\t\t\t\tmethod = \"cache\";\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (retrievedSnapshot === undefined) {\n\t\t\t\t\t\t\tretrievedSnapshot = await networkSnapshotP;\n\t\t\t\t\t\t\tmethod = \"network\";\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tevent.end({\n\t\t\t\t\t\tmethod,\n\t\t\t\t\t});\n\t\t\t\t\treturn retrievedSnapshot;\n\t\t\t\t},\n\t\t\t);\n\n\t\t\tconst _id = await this.initializeFromSnapshot(normalizedSnapshotContents);\n\t\t\tthis.firstVersionsCall = false;\n\t\t\treturn [\n\t\t\t\t{\n\t\t\t\t\tid: _id,\n\t\t\t\t\ttreeId: normalizedSnapshotContents.snapshotTree.id!,\n\t\t\t\t},\n\t\t\t];\n\t\t}\n\n\t\t// Otherwise, get the latest version of the document as normal.\n\t\tconst id = versionId ? versionId : this.id;\n\t\tconst commits = await PerformanceEvent.timedExecAsync(\n\t\t\tthis.logger,\n\t\t\t{\n\t\t\t\teventName: \"getVersions\",\n\t\t\t\tversionId: id,\n\t\t\t\tcount,\n\t\t\t},\n\t\t\tasync () => {\n\t\t\t\tconst manager = await this.getStorageManager();\n\t\t\t\treturn (await manager.getCommits(id, count)).content;\n\t\t\t},\n\t\t);\n\t\treturn commits.map((commit) => ({\n\t\t\tdate: commit.commit.author.date,\n\t\t\tid: commit.sha,\n\t\t\ttreeId: commit.commit.tree.sha,\n\t\t}));\n\t}\n\n\t// eslint-disable-next-line @rushstack/no-new-null\n\tpublic async getSnapshotTree(version?: IVersion): Promise<ISnapshotTree | null> {\n\t\tlet requestVersion = version;\n\t\tif (!requestVersion) {\n\t\t\tconst versions = await this.getVersions(this.id, 1);\n\t\t\tif (versions.length === 0) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\trequestVersion = versions[0];\n\t\t}\n\n\t\tlet normalizedWholeSnapshot = await this.snapshotTreeCache.get(\n\t\t\tthis.getCacheKey(requestVersion.id),\n\t\t);\n\t\tif (normalizedWholeSnapshot !== undefined) {\n\t\t\treturn normalizedWholeSnapshot.snapshotTree;\n\t\t}\n\n\t\tnormalizedWholeSnapshot = await this.fetchSnapshotTree(\n\t\t\trequestVersion.id,\n\t\t\tundefined,\n\t\t\t\"getSnapshotTree\",\n\t\t);\n\n\t\t// Currently retrieving blobs from network is not supported by AFR for WholeSummaryDocumentStorageService\n\t\t// Blobs are expected to be put in the cache\n\t\tawait this.updateBlobsCache(normalizedWholeSnapshot.blobs);\n\n\t\treturn normalizedWholeSnapshot.snapshotTree;\n\t}\n\n\tpublic async readBlob(blobId: string): Promise<ArrayBufferLike> {\n\t\tconst cachedBlob = await this.blobCache.get(this.getCacheKey(blobId));\n\t\tif (cachedBlob !== undefined) {\n\t\t\treturn cachedBlob;\n\t\t}\n\n\t\t// Note: AFR does not support readBlobs, but potentially other r11s like servers do\n\t\tconst blob = await PerformanceEvent.timedExecAsync(\n\t\t\tthis.logger,\n\t\t\t{\n\t\t\t\teventName: \"readBlob\",\n\t\t\t\tblobId,\n\t\t\t},\n\t\t\tasync (event) => {\n\t\t\t\tconst manager = await this.getStorageManager();\n\t\t\t\tconst response = (await manager.getBlob(blobId)).content;\n\t\t\t\tevent.end({\n\t\t\t\t\tsize: response.size,\n\t\t\t\t});\n\t\t\t\treturn response;\n\t\t\t},\n\t\t\tundefined, // workers\n\t\t\tundefined, // recordHeapSize\n\t\t\tthis.mc.config.getNumber(\"Fluid.Driver.ReadBlobTelemetrySampling\"),\n\t\t);\n\t\tconst bufferValue = stringToBuffer(blob.content, blob.encoding);\n\n\t\tawait this.blobCache.put(this.getCacheKey(blob.sha), bufferValue);\n\n\t\treturn bufferValue;\n\t}\n\n\tpublic async uploadSummaryWithContext(\n\t\tsummary: ISummaryTree,\n\t\tcontext: ISummaryContext,\n\t): Promise<string> {\n\t\tconst summaryHandle = await PerformanceEvent.timedExecAsync(\n\t\t\tthis.logger,\n\t\t\t{\n\t\t\t\teventName: \"uploadSummaryWithContext\",\n\t\t\t\tproposalHandle: context.proposalHandle,\n\t\t\t\tackHandle: context.ackHandle,\n\t\t\t\treferenceSequenceNumber: context.referenceSequenceNumber,\n\t\t\t},\n\t\t\tasync () => {\n\t\t\t\tconst summaryUploadManager = await this.getSummaryUploadManager();\n\t\t\t\treturn summaryUploadManager.writeSummaryTree(\n\t\t\t\t\tsummary,\n\t\t\t\t\tcontext.ackHandle ?? \"\",\n\t\t\t\t\t\"channel\",\n\t\t\t\t);\n\t\t\t},\n\t\t);\n\t\treturn summaryHandle;\n\t}\n\n\tpublic async downloadSummary(summaryHandle: ISummaryHandle): Promise<ISummaryTree> {\n\t\tconst wholeFlatSnapshot = await PerformanceEvent.timedExecAsync(\n\t\t\tthis.logger,\n\t\t\t{\n\t\t\t\teventName: \"getWholeFlatSummary\",\n\t\t\t\ttreeId: summaryHandle.handle,\n\t\t\t},\n\t\t\tasync (event) => {\n\t\t\t\tconst manager = await this.getStorageManager();\n\t\t\t\tconst response = await manager.getSnapshot(summaryHandle.handle);\n\t\t\t\tevent.end({\n\t\t\t\t\tsize: response.content.trees[0]?.entries.length,\n\t\t\t\t});\n\t\t\t\treturn response.content;\n\t\t\t},\n\t\t);\n\n\t\tconst { blobs, snapshotTree } = convertWholeFlatSnapshotToSnapshotTreeAndBlobs(\n\t\t\twholeFlatSnapshot,\n\t\t\t\"\",\n\t\t);\n\t\treturn convertSnapshotAndBlobsToSummaryTree(snapshotTree, blobs);\n\t}\n\n\tpublic async createBlob(file: ArrayBufferLike): Promise<ICreateBlobResponse> {\n\t\tconst uint8ArrayFile = new Uint8Array(file);\n\t\treturn PerformanceEvent.timedExecAsync(\n\t\t\tthis.logger,\n\t\t\t{\n\t\t\t\teventName: \"createBlob\",\n\t\t\t\tsize: uint8ArrayFile.length,\n\t\t\t},\n\t\t\tasync (event) => {\n\t\t\t\tconst manager = await this.getStorageManager();\n\t\t\t\tconst response = await manager\n\t\t\t\t\t.createBlob(Uint8ArrayToString(uint8ArrayFile, \"base64\"), \"base64\")\n\t\t\t\t\t.then((r) => ({ id: r.content.sha, url: r.content.url }));\n\t\t\t\tevent.end({\n\t\t\t\t\tblobId: response.id,\n\t\t\t\t});\n\t\t\t\treturn response;\n\t\t\t},\n\t\t);\n\t}\n\n\tprivate async fetchSnapshotTree(\n\t\tversionId: string,\n\t\tdisableCache?: boolean,\n\t\tscenarioName?: string,\n\t): Promise<INormalizedWholeSnapshot> {\n\t\tconst normalizedWholeSummary = await PerformanceEvent.timedExecAsync(\n\t\t\tthis.logger,\n\t\t\t{\n\t\t\t\teventName: \"getWholeFlatSummary\",\n\t\t\t\ttreeId: versionId,\n\t\t\t\tscenarioName,\n\t\t\t},\n\t\t\tasync (event) => {\n\t\t\t\tconst manager = await this.getStorageManager(disableCache);\n\t\t\t\tconst response: IR11sResponse<IWholeFlatSnapshot> =\n\t\t\t\t\tawait manager.getSnapshot(versionId);\n\t\t\t\tconst start = performance.now();\n\t\t\t\tconst snapshot: INormalizedWholeSnapshot =\n\t\t\t\t\tconvertWholeFlatSnapshotToSnapshotTreeAndBlobs(response.content);\n\t\t\t\tconst snapshotConversionTime = performance.now() - start;\n\t\t\t\tvalidateBlobsAndTrees(snapshot.snapshotTree);\n\t\t\t\tconst { trees, numBlobs, encodedBlobsSize } = evalBlobsAndTrees(snapshot);\n\n\t\t\t\tevent.end({\n\t\t\t\t\tsize: response.content.trees[0]?.entries.length,\n\t\t\t\t\ttrees,\n\t\t\t\t\tblobs: numBlobs,\n\t\t\t\t\tencodedBlobsSize,\n\t\t\t\t\tsequenceNumber: snapshot.sequenceNumber,\n\t\t\t\t\t...response.propsToLog,\n\t\t\t\t\tsnapshotConversionTime,\n\t\t\t\t\t...getW3CData(response.requestUrl, \"xmlhttprequest\"),\n\t\t\t\t});\n\t\t\t\treturn snapshot;\n\t\t\t},\n\t\t);\n\n\t\t// Also add the result into the cache.\n\t\tawait this.snapshotTreeCache\n\t\t\t.put(this.getCacheKey(versionId), normalizedWholeSummary)\n\t\t\t.catch(() => undefined);\n\t\treturn normalizedWholeSummary;\n\t}\n\n\tprivate async initializeFromSnapshot(\n\t\tnormalizedWholeSummary: INormalizedWholeSnapshot,\n\t): Promise<string> {\n\t\tconst snapshotId = normalizedWholeSummary.id;\n\t\tassert(snapshotId !== undefined, 0x275 /* \"Root tree should contain the id\" */);\n\t\tconst cachePs: Promise<any>[] = [\n\t\t\tthis.snapshotTreeCache.put(this.getCacheKey(snapshotId), normalizedWholeSummary),\n\t\t\tthis.updateBlobsCache(normalizedWholeSummary.blobs),\n\t\t];\n\n\t\tawait Promise.all(cachePs);\n\n\t\treturn snapshotId;\n\t}\n\n\tprivate async updateBlobsCache(blobs: Map<string, ArrayBuffer>): Promise<void> {\n\t\tconst blobCachePutPs: Promise<void>[] = [];\n\t\tblobs.forEach((value, id) => {\n\t\t\tconst cacheKey = this.getCacheKey(id);\n\t\t\tblobCachePutPs.push(this.blobCache.put(cacheKey, value));\n\t\t});\n\t\tawait Promise.all(blobCachePutPs);\n\t}\n\n\tprivate getCacheKey(blobId: string): string {\n\t\treturn `${this.id}:${blobId}`;\n\t}\n}\n"]}
@@ -0,0 +1,16 @@
1
+ /*!
2
+ * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
+ * Licensed under the MIT License.
4
+ */
5
+ import { ISummaryTree, IWholeSummaryPayloadType } from "@fluidframework/server-services-client";
6
+ import { IGitManager, ISummaryUploadManager } from "./storageContracts.mjs";
7
+ /**
8
+ * Converts summary to snapshot tree and uploads with single snaphot tree payload.
9
+ */
10
+ export declare class WholeSummaryUploadManager implements ISummaryUploadManager {
11
+ private readonly manager;
12
+ constructor(manager: IGitManager);
13
+ writeSummaryTree(summaryTree: ISummaryTree, parentHandle: string | undefined, summaryType: IWholeSummaryPayloadType, sequenceNumber?: number, initial?: boolean): Promise<string>;
14
+ private writeSummaryTreeCore;
15
+ }
16
+ //# sourceMappingURL=wholeSummaryUploadManager.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wholeSummaryUploadManager.d.mts","sourceRoot":"","sources":["../src/wholeSummaryUploadManager.ts"],"names":[],"mappings":"AAAA;;;GAGG;OAEI,EACN,YAAY,EAEZ,wBAAwB,EAExB,MAAM,wCAAwC;OACxC,EAAE,WAAW,EAAE,qBAAqB,EAAE;AAE7C;;GAEG;AACH,qBAAa,yBAA0B,YAAW,qBAAqB;IAC1D,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAAP,OAAO,EAAE,WAAW;IAEpC,gBAAgB,CAC5B,WAAW,EAAE,YAAY,EACzB,YAAY,EAAE,MAAM,GAAG,SAAS,EAChC,WAAW,EAAE,wBAAwB,EACrC,cAAc,GAAE,MAAU,EAC1B,OAAO,GAAE,OAAe,GACtB,OAAO,CAAC,MAAM,CAAC;YAcJ,oBAAoB;CAwBlC"}
@@ -0,0 +1,33 @@
1
+ /*!
2
+ * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
+ * Licensed under the MIT License.
4
+ */
5
+ import { convertSummaryTreeToWholeSummaryTree, } from "@fluidframework/server-services-client";
6
+ /**
7
+ * Converts summary to snapshot tree and uploads with single snaphot tree payload.
8
+ */
9
+ export class WholeSummaryUploadManager {
10
+ constructor(manager) {
11
+ this.manager = manager;
12
+ }
13
+ async writeSummaryTree(summaryTree, parentHandle, summaryType, sequenceNumber = 0, initial = false) {
14
+ const id = await this.writeSummaryTreeCore(parentHandle, summaryTree, summaryType, sequenceNumber, initial);
15
+ if (!id) {
16
+ throw new Error(`Failed to write summary tree`);
17
+ }
18
+ return id;
19
+ }
20
+ async writeSummaryTreeCore(parentHandle, tree, type, sequenceNumber, initial) {
21
+ const snapshotTree = convertSummaryTreeToWholeSummaryTree(parentHandle, tree, "", type === "channel" ? ".app" : "");
22
+ const snapshotPayload = {
23
+ entries: snapshotTree.entries ?? [],
24
+ message: "",
25
+ sequenceNumber,
26
+ type,
27
+ };
28
+ return this.manager
29
+ .createSummary(snapshotPayload, initial)
30
+ .then((response) => response.content.id);
31
+ }
32
+ }
33
+ //# sourceMappingURL=wholeSummaryUploadManager.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wholeSummaryUploadManager.mjs","sourceRoot":"","sources":["../src/wholeSummaryUploadManager.ts"],"names":[],"mappings":"AAAA;;;GAGG;OAEI,EAIN,oCAAoC,GACpC,MAAM,wCAAwC;AAG/C;;GAEG;AACH,MAAM,OAAO,yBAAyB;IACrC,YAA6B,OAAoB;QAApB,YAAO,GAAP,OAAO,CAAa;IAAG,CAAC;IAE9C,KAAK,CAAC,gBAAgB,CAC5B,WAAyB,EACzB,YAAgC,EAChC,WAAqC,EACrC,iBAAyB,CAAC,EAC1B,UAAmB,KAAK;QAExB,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,oBAAoB,CACzC,YAAY,EACZ,WAAW,EACX,WAAW,EACX,cAAc,EACd,OAAO,CACP,CAAC;QACF,IAAI,CAAC,EAAE,EAAE;YACR,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;SAChD;QACD,OAAO,EAAE,CAAC;IACX,CAAC;IAEO,KAAK,CAAC,oBAAoB,CACjC,YAAgC,EAChC,IAAkB,EAClB,IAA8B,EAC9B,cAAsB,EACtB,OAAgB;QAEhB,MAAM,YAAY,GAAG,oCAAoC,CACxD,YAAY,EACZ,IAAI,EACJ,EAAE,EACF,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAChC,CAAC;QACF,MAAM,eAAe,GAAyB;YAC7C,OAAO,EAAE,YAAY,CAAC,OAAO,IAAI,EAAE;YACnC,OAAO,EAAE,EAAE;YACX,cAAc;YACd,IAAI;SACJ,CAAC;QAEF,OAAO,IAAI,CAAC,OAAO;aACjB,aAAa,CAAC,eAAe,EAAE,OAAO,CAAC;aACvC,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAC3C,CAAC;CACD","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport {\n\tISummaryTree,\n\tIWholeSummaryPayload,\n\tIWholeSummaryPayloadType,\n\tconvertSummaryTreeToWholeSummaryTree,\n} from \"@fluidframework/server-services-client\";\nimport { IGitManager, ISummaryUploadManager } from \"./storageContracts\";\n\n/**\n * Converts summary to snapshot tree and uploads with single snaphot tree payload.\n */\nexport class WholeSummaryUploadManager implements ISummaryUploadManager {\n\tconstructor(private readonly manager: IGitManager) {}\n\n\tpublic async writeSummaryTree(\n\t\tsummaryTree: ISummaryTree,\n\t\tparentHandle: string | undefined,\n\t\tsummaryType: IWholeSummaryPayloadType,\n\t\tsequenceNumber: number = 0,\n\t\tinitial: boolean = false,\n\t): Promise<string> {\n\t\tconst id = await this.writeSummaryTreeCore(\n\t\t\tparentHandle,\n\t\t\tsummaryTree,\n\t\t\tsummaryType,\n\t\t\tsequenceNumber,\n\t\t\tinitial,\n\t\t);\n\t\tif (!id) {\n\t\t\tthrow new Error(`Failed to write summary tree`);\n\t\t}\n\t\treturn id;\n\t}\n\n\tprivate async writeSummaryTreeCore(\n\t\tparentHandle: string | undefined,\n\t\ttree: ISummaryTree,\n\t\ttype: IWholeSummaryPayloadType,\n\t\tsequenceNumber: number,\n\t\tinitial: boolean,\n\t): Promise<string> {\n\t\tconst snapshotTree = convertSummaryTreeToWholeSummaryTree(\n\t\t\tparentHandle,\n\t\t\ttree,\n\t\t\t\"\",\n\t\t\ttype === \"channel\" ? \".app\" : \"\",\n\t\t);\n\t\tconst snapshotPayload: IWholeSummaryPayload = {\n\t\t\tentries: snapshotTree.entries ?? [],\n\t\t\tmessage: \"\",\n\t\t\tsequenceNumber,\n\t\t\ttype,\n\t\t};\n\n\t\treturn this.manager\n\t\t\t.createSummary(snapshotPayload, initial)\n\t\t\t.then((response) => response.content.id);\n\t}\n}\n"]}