@fluidframework/routerlicious-driver 1.4.0-115997 → 2.0.0-dev-rc.1.0.0.224419

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 (365) 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-lint.json +4 -0
  6. package/api-extractor.json +2 -2
  7. package/api-report/routerlicious-driver.api.md +108 -0
  8. package/dist/cache.cjs +30 -0
  9. package/dist/cache.cjs.map +1 -0
  10. package/dist/cache.d.ts +7 -0
  11. package/dist/cache.d.ts.map +1 -1
  12. package/dist/{definitions.js → contracts.cjs} +1 -1
  13. package/dist/contracts.cjs.map +1 -0
  14. package/dist/contracts.d.ts +42 -0
  15. package/dist/contracts.d.ts.map +1 -0
  16. package/dist/{createNewUtils.js → createNewUtils.cjs} +7 -5
  17. package/dist/createNewUtils.cjs.map +1 -0
  18. package/dist/createNewUtils.d.ts +1 -1
  19. package/dist/createNewUtils.d.ts.map +1 -1
  20. package/dist/{defaultTokenProvider.js → defaultTokenProvider.cjs} +2 -1
  21. package/dist/defaultTokenProvider.cjs.map +1 -0
  22. package/dist/defaultTokenProvider.d.ts +1 -0
  23. package/dist/defaultTokenProvider.d.ts.map +1 -1
  24. package/dist/definitions.cjs +7 -0
  25. package/dist/definitions.cjs.map +1 -0
  26. package/dist/definitions.d.ts.map +1 -1
  27. package/dist/deltaStorageService.cjs +122 -0
  28. package/dist/deltaStorageService.cjs.map +1 -0
  29. package/dist/deltaStorageService.d.ts +7 -6
  30. package/dist/deltaStorageService.d.ts.map +1 -1
  31. package/dist/{documentDeltaConnection.js → documentDeltaConnection.cjs} +8 -13
  32. package/dist/documentDeltaConnection.cjs.map +1 -0
  33. package/dist/documentDeltaConnection.d.ts +3 -4
  34. package/dist/documentDeltaConnection.d.ts.map +1 -1
  35. package/dist/{documentService.js → documentService.cjs} +61 -64
  36. package/dist/documentService.cjs.map +1 -0
  37. package/dist/documentService.d.ts +12 -4
  38. package/dist/documentService.d.ts.map +1 -1
  39. package/dist/{documentServiceFactory.js → documentServiceFactory.cjs} +87 -33
  40. package/dist/documentServiceFactory.cjs.map +1 -0
  41. package/dist/documentServiceFactory.d.ts +5 -3
  42. package/dist/documentServiceFactory.d.ts.map +1 -1
  43. package/dist/{documentStorageService.js → documentStorageService.cjs} +18 -16
  44. package/dist/documentStorageService.cjs.map +1 -0
  45. package/dist/documentStorageService.d.ts +4 -3
  46. package/dist/documentStorageService.d.ts.map +1 -1
  47. package/dist/errorUtils.cjs +87 -0
  48. package/dist/errorUtils.cjs.map +1 -0
  49. package/dist/errorUtils.d.ts +56 -10
  50. package/dist/errorUtils.d.ts.map +1 -1
  51. package/dist/gitManager.cjs +46 -0
  52. package/dist/gitManager.cjs.map +1 -0
  53. package/dist/gitManager.d.ts +27 -0
  54. package/dist/gitManager.d.ts.map +1 -0
  55. package/dist/historian.cjs +72 -0
  56. package/dist/historian.cjs.map +1 -0
  57. package/dist/historian.d.ts +34 -0
  58. package/dist/historian.d.ts.map +1 -0
  59. package/dist/index.cjs +19 -0
  60. package/dist/index.cjs.map +1 -0
  61. package/dist/index.d.ts +5 -8
  62. package/dist/index.d.ts.map +1 -1
  63. package/dist/mapWithExpiration.cjs +105 -0
  64. package/dist/mapWithExpiration.cjs.map +1 -0
  65. package/dist/mapWithExpiration.d.ts +34 -0
  66. package/dist/mapWithExpiration.d.ts.map +1 -0
  67. package/dist/{nullBlobStorageService.js → nullBlobStorageService.cjs} +5 -5
  68. package/dist/nullBlobStorageService.cjs.map +1 -0
  69. package/dist/nullBlobStorageService.d.ts.map +1 -1
  70. package/dist/{packageVersion.js → packageVersion.cjs} +2 -2
  71. package/dist/packageVersion.cjs.map +1 -0
  72. package/dist/packageVersion.d.ts +1 -1
  73. package/dist/packageVersion.d.ts.map +1 -1
  74. package/dist/{policies.js → policies.cjs} +1 -1
  75. package/dist/policies.cjs.map +1 -0
  76. package/dist/policies.d.ts +22 -9
  77. package/dist/policies.d.ts.map +1 -1
  78. package/dist/r11sSnapshotParser.cjs +73 -0
  79. package/dist/r11sSnapshotParser.cjs.map +1 -0
  80. package/dist/r11sSnapshotParser.d.ts +14 -0
  81. package/dist/r11sSnapshotParser.d.ts.map +1 -0
  82. package/dist/restWrapper.cjs +249 -0
  83. package/dist/restWrapper.cjs.map +1 -0
  84. package/dist/restWrapper.d.ts +32 -12
  85. package/dist/restWrapper.d.ts.map +1 -1
  86. package/dist/restWrapperBase.cjs +89 -0
  87. package/dist/restWrapperBase.cjs.map +1 -0
  88. package/dist/restWrapperBase.d.ts +26 -0
  89. package/dist/restWrapperBase.d.ts.map +1 -0
  90. package/dist/retriableGitManager.cjs +40 -0
  91. package/dist/retriableGitManager.cjs.map +1 -0
  92. package/dist/retriableGitManager.d.ts +13 -23
  93. package/dist/retriableGitManager.d.ts.map +1 -1
  94. package/dist/routerlicious-driver-alpha.d.ts +92 -0
  95. package/dist/routerlicious-driver-beta.d.ts +98 -0
  96. package/dist/routerlicious-driver-public.d.ts +98 -0
  97. package/dist/routerlicious-driver-untrimmed.d.ts +261 -0
  98. package/dist/{shreddedSummaryDocumentStorageService.js → shreddedSummaryDocumentStorageService.cjs} +41 -34
  99. package/dist/shreddedSummaryDocumentStorageService.cjs.map +1 -0
  100. package/dist/shreddedSummaryDocumentStorageService.d.ts +6 -5
  101. package/dist/shreddedSummaryDocumentStorageService.d.ts.map +1 -1
  102. package/dist/storageContracts.cjs +7 -0
  103. package/dist/storageContracts.cjs.map +1 -0
  104. package/dist/storageContracts.d.ts +45 -0
  105. package/dist/storageContracts.d.ts.map +1 -0
  106. package/dist/summaryTreeUploadManager.cjs +110 -0
  107. package/dist/summaryTreeUploadManager.cjs.map +1 -0
  108. package/dist/summaryTreeUploadManager.d.ts +23 -0
  109. package/dist/summaryTreeUploadManager.d.ts.map +1 -0
  110. package/dist/{tokens.js → tokens.cjs} +1 -1
  111. package/dist/tokens.cjs.map +1 -0
  112. package/dist/tokens.d.ts +34 -5
  113. package/dist/tokens.d.ts.map +1 -1
  114. package/dist/treeUtils.cjs +107 -0
  115. package/dist/treeUtils.cjs.map +1 -0
  116. package/dist/treeUtils.d.ts +58 -0
  117. package/dist/treeUtils.d.ts.map +1 -0
  118. package/dist/tsdoc-metadata.json +11 -0
  119. package/dist/{urlUtils.js → urlUtils.cjs} +21 -25
  120. package/dist/urlUtils.cjs.map +1 -0
  121. package/dist/urlUtils.d.ts +2 -2
  122. package/dist/urlUtils.d.ts.map +1 -1
  123. package/dist/wholeSummaryDocumentStorageService.cjs +253 -0
  124. package/dist/wholeSummaryDocumentStorageService.cjs.map +1 -0
  125. package/dist/wholeSummaryDocumentStorageService.d.ts +10 -8
  126. package/dist/wholeSummaryDocumentStorageService.d.ts.map +1 -1
  127. package/dist/wholeSummaryUploadManager.cjs +37 -0
  128. package/dist/wholeSummaryUploadManager.cjs.map +1 -0
  129. package/dist/wholeSummaryUploadManager.d.ts +16 -0
  130. package/dist/wholeSummaryUploadManager.d.ts.map +1 -0
  131. package/lib/{cache.d.ts → cache.d.mts} +7 -0
  132. package/lib/cache.d.mts.map +1 -0
  133. package/lib/cache.mjs +25 -0
  134. package/lib/cache.mjs.map +1 -0
  135. package/lib/contracts.d.mts +42 -0
  136. package/lib/contracts.d.mts.map +1 -0
  137. package/lib/{definitions.js → contracts.mjs} +1 -1
  138. package/lib/contracts.mjs.map +1 -0
  139. package/lib/{createNewUtils.d.ts → createNewUtils.d.mts} +1 -1
  140. package/lib/{createNewUtils.d.ts.map → createNewUtils.d.mts.map} +1 -1
  141. package/lib/{createNewUtils.js → createNewUtils.mjs} +7 -5
  142. package/lib/createNewUtils.mjs.map +1 -0
  143. package/lib/{defaultTokenProvider.d.ts → defaultTokenProvider.d.mts} +2 -1
  144. package/lib/defaultTokenProvider.d.mts.map +1 -0
  145. package/lib/{defaultTokenProvider.js → defaultTokenProvider.mjs} +2 -1
  146. package/lib/defaultTokenProvider.mjs.map +1 -0
  147. package/lib/definitions.d.mts.map +1 -0
  148. package/lib/definitions.mjs +6 -0
  149. package/{dist/definitions.js.map → lib/definitions.mjs.map} +1 -1
  150. package/lib/{deltaStorageService.d.ts → deltaStorageService.d.mts} +8 -7
  151. package/lib/deltaStorageService.d.mts.map +1 -0
  152. package/lib/deltaStorageService.mjs +117 -0
  153. package/lib/deltaStorageService.mjs.map +1 -0
  154. package/lib/{documentDeltaConnection.d.ts → documentDeltaConnection.d.mts} +3 -4
  155. package/lib/documentDeltaConnection.d.mts.map +1 -0
  156. package/lib/{documentDeltaConnection.js → documentDeltaConnection.mjs} +8 -13
  157. package/lib/documentDeltaConnection.mjs.map +1 -0
  158. package/lib/{documentService.d.ts → documentService.d.mts} +16 -8
  159. package/lib/documentService.d.mts.map +1 -0
  160. package/lib/{documentService.js → documentService.mjs} +60 -44
  161. package/lib/documentService.mjs.map +1 -0
  162. package/lib/{documentServiceFactory.d.ts → documentServiceFactory.d.mts} +7 -5
  163. package/lib/documentServiceFactory.d.mts.map +1 -0
  164. package/lib/{documentServiceFactory.js → documentServiceFactory.mjs} +88 -34
  165. package/lib/documentServiceFactory.mjs.map +1 -0
  166. package/lib/{documentStorageService.d.ts → documentStorageService.d.mts} +7 -6
  167. package/lib/documentStorageService.d.mts.map +1 -0
  168. package/lib/{documentStorageService.js → documentStorageService.mjs} +19 -17
  169. package/lib/documentStorageService.mjs.map +1 -0
  170. package/lib/errorUtils.d.mts +93 -0
  171. package/lib/errorUtils.d.mts.map +1 -0
  172. package/lib/errorUtils.mjs +81 -0
  173. package/lib/errorUtils.mjs.map +1 -0
  174. package/lib/gitManager.d.mts +27 -0
  175. package/lib/gitManager.d.mts.map +1 -0
  176. package/lib/gitManager.mjs +42 -0
  177. package/lib/gitManager.mjs.map +1 -0
  178. package/lib/historian.d.mts +34 -0
  179. package/lib/historian.d.mts.map +1 -0
  180. package/lib/historian.mjs +67 -0
  181. package/lib/historian.mjs.map +1 -0
  182. package/lib/index.d.mts +10 -0
  183. package/lib/index.d.mts.map +1 -0
  184. package/lib/index.mjs +8 -0
  185. package/lib/index.mjs.map +1 -0
  186. package/lib/mapWithExpiration.d.mts +34 -0
  187. package/lib/mapWithExpiration.d.mts.map +1 -0
  188. package/lib/mapWithExpiration.mjs +101 -0
  189. package/lib/mapWithExpiration.mjs.map +1 -0
  190. package/lib/nullBlobStorageService.d.mts.map +1 -0
  191. package/lib/{nullBlobStorageService.js → nullBlobStorageService.mjs} +5 -5
  192. package/lib/nullBlobStorageService.mjs.map +1 -0
  193. package/lib/{packageVersion.d.ts → packageVersion.d.mts} +1 -1
  194. package/lib/{packageVersion.d.ts.map → packageVersion.d.mts.map} +1 -1
  195. package/lib/{packageVersion.js → packageVersion.mjs} +2 -2
  196. package/lib/packageVersion.mjs.map +1 -0
  197. package/lib/{policies.d.ts → policies.d.mts} +22 -9
  198. package/lib/policies.d.mts.map +1 -0
  199. package/lib/{policies.js → policies.mjs} +1 -1
  200. package/lib/policies.mjs.map +1 -0
  201. package/lib/r11sSnapshotParser.d.mts +14 -0
  202. package/lib/r11sSnapshotParser.d.mts.map +1 -0
  203. package/lib/r11sSnapshotParser.mjs +69 -0
  204. package/lib/r11sSnapshotParser.mjs.map +1 -0
  205. package/lib/restWrapper.d.mts +53 -0
  206. package/lib/restWrapper.d.mts.map +1 -0
  207. package/lib/restWrapper.mjs +236 -0
  208. package/lib/restWrapper.mjs.map +1 -0
  209. package/lib/restWrapperBase.d.mts +26 -0
  210. package/lib/restWrapperBase.d.mts.map +1 -0
  211. package/lib/restWrapperBase.mjs +84 -0
  212. package/lib/restWrapperBase.mjs.map +1 -0
  213. package/lib/retriableGitManager.d.mts +24 -0
  214. package/lib/retriableGitManager.d.mts.map +1 -0
  215. package/lib/retriableGitManager.mjs +36 -0
  216. package/lib/retriableGitManager.mjs.map +1 -0
  217. package/lib/routerlicious-driver-alpha.d.mts +92 -0
  218. package/lib/routerlicious-driver-beta.d.mts +98 -0
  219. package/lib/routerlicious-driver-public.d.mts +98 -0
  220. package/lib/routerlicious-driver-untrimmed.d.mts +261 -0
  221. package/lib/{shreddedSummaryDocumentStorageService.d.ts → shreddedSummaryDocumentStorageService.d.mts} +9 -8
  222. package/lib/shreddedSummaryDocumentStorageService.d.mts.map +1 -0
  223. package/lib/{shreddedSummaryDocumentStorageService.js → shreddedSummaryDocumentStorageService.mjs} +41 -34
  224. package/lib/shreddedSummaryDocumentStorageService.mjs.map +1 -0
  225. package/lib/storageContracts.d.mts +45 -0
  226. package/lib/storageContracts.d.mts.map +1 -0
  227. package/lib/storageContracts.mjs +6 -0
  228. package/lib/storageContracts.mjs.map +1 -0
  229. package/lib/summaryTreeUploadManager.d.mts +23 -0
  230. package/lib/summaryTreeUploadManager.d.mts.map +1 -0
  231. package/lib/summaryTreeUploadManager.mjs +106 -0
  232. package/lib/summaryTreeUploadManager.mjs.map +1 -0
  233. package/lib/{tokens.d.ts → tokens.d.mts} +34 -5
  234. package/lib/tokens.d.mts.map +1 -0
  235. package/lib/{tokens.js → tokens.mjs} +1 -1
  236. package/lib/tokens.mjs.map +1 -0
  237. package/lib/treeUtils.d.mts +58 -0
  238. package/lib/treeUtils.d.mts.map +1 -0
  239. package/lib/treeUtils.mjs +100 -0
  240. package/lib/treeUtils.mjs.map +1 -0
  241. package/lib/{urlUtils.d.ts → urlUtils.d.mts} +2 -2
  242. package/lib/urlUtils.d.mts.map +1 -0
  243. package/lib/urlUtils.mjs +38 -0
  244. package/lib/urlUtils.mjs.map +1 -0
  245. package/lib/{wholeSummaryDocumentStorageService.d.ts → wholeSummaryDocumentStorageService.d.mts} +12 -10
  246. package/lib/wholeSummaryDocumentStorageService.d.mts.map +1 -0
  247. package/lib/wholeSummaryDocumentStorageService.mjs +249 -0
  248. package/lib/wholeSummaryDocumentStorageService.mjs.map +1 -0
  249. package/lib/wholeSummaryUploadManager.d.mts +16 -0
  250. package/lib/wholeSummaryUploadManager.d.mts.map +1 -0
  251. package/lib/wholeSummaryUploadManager.mjs +33 -0
  252. package/lib/wholeSummaryUploadManager.mjs.map +1 -0
  253. package/package.json +104 -68
  254. package/prettier.config.cjs +8 -0
  255. package/src/cache.ts +25 -9
  256. package/src/contracts.ts +60 -0
  257. package/src/createNewUtils.ts +26 -24
  258. package/src/defaultTokenProvider.ts +14 -15
  259. package/src/definitions.ts +2 -2
  260. package/src/deltaStorageService.ts +145 -91
  261. package/src/documentDeltaConnection.ts +54 -52
  262. package/src/documentService.ts +272 -242
  263. package/src/documentServiceFactory.ts +338 -237
  264. package/src/documentStorageService.ts +92 -84
  265. package/src/errorUtils.ts +117 -79
  266. package/src/gitManager.ts +67 -0
  267. package/src/historian.ts +121 -0
  268. package/src/index.ts +15 -8
  269. package/src/mapWithExpiration.ts +124 -0
  270. package/src/nullBlobStorageService.ts +24 -21
  271. package/src/packageVersion.ts +1 -1
  272. package/src/policies.ts +51 -38
  273. package/src/r11sSnapshotParser.ts +82 -0
  274. package/src/restWrapper.ts +400 -216
  275. package/src/restWrapperBase.ts +146 -0
  276. package/src/retriableGitManager.ts +76 -153
  277. package/src/shreddedSummaryDocumentStorageService.ts +214 -195
  278. package/src/storageContracts.ts +63 -0
  279. package/src/summaryTreeUploadManager.ts +155 -0
  280. package/src/tokens.ts +74 -39
  281. package/src/treeUtils.ts +138 -0
  282. package/src/urlUtils.ts +27 -28
  283. package/src/wholeSummaryDocumentStorageService.ts +352 -252
  284. package/src/wholeSummaryUploadManager.ts +64 -0
  285. package/tsc-multi.test.json +4 -0
  286. package/tsconfig.json +10 -13
  287. package/dist/cache.js +0 -20
  288. package/dist/cache.js.map +0 -1
  289. package/dist/createNewUtils.js.map +0 -1
  290. package/dist/defaultTokenProvider.js.map +0 -1
  291. package/dist/deltaStorageService.js +0 -82
  292. package/dist/deltaStorageService.js.map +0 -1
  293. package/dist/documentDeltaConnection.js.map +0 -1
  294. package/dist/documentService.js.map +0 -1
  295. package/dist/documentServiceFactory.js.map +0 -1
  296. package/dist/documentStorageService.js.map +0 -1
  297. package/dist/errorUtils.js +0 -56
  298. package/dist/errorUtils.js.map +0 -1
  299. package/dist/index.js +0 -25
  300. package/dist/index.js.map +0 -1
  301. package/dist/nullBlobStorageService.js.map +0 -1
  302. package/dist/packageVersion.js.map +0 -1
  303. package/dist/policies.js.map +0 -1
  304. package/dist/restWrapper.js +0 -153
  305. package/dist/restWrapper.js.map +0 -1
  306. package/dist/retriableGitManager.js +0 -76
  307. package/dist/retriableGitManager.js.map +0 -1
  308. package/dist/shreddedSummaryDocumentStorageService.js.map +0 -1
  309. package/dist/tokens.js.map +0 -1
  310. package/dist/urlUtils.js.map +0 -1
  311. package/dist/wholeSummaryDocumentStorageService.js +0 -191
  312. package/dist/wholeSummaryDocumentStorageService.js.map +0 -1
  313. package/lib/cache.d.ts.map +0 -1
  314. package/lib/cache.js +0 -16
  315. package/lib/cache.js.map +0 -1
  316. package/lib/createNewUtils.js.map +0 -1
  317. package/lib/defaultTokenProvider.d.ts.map +0 -1
  318. package/lib/defaultTokenProvider.js.map +0 -1
  319. package/lib/definitions.d.ts.map +0 -1
  320. package/lib/definitions.js.map +0 -1
  321. package/lib/deltaStorageService.d.ts.map +0 -1
  322. package/lib/deltaStorageService.js +0 -77
  323. package/lib/deltaStorageService.js.map +0 -1
  324. package/lib/documentDeltaConnection.d.ts.map +0 -1
  325. package/lib/documentDeltaConnection.js.map +0 -1
  326. package/lib/documentService.d.ts.map +0 -1
  327. package/lib/documentService.js.map +0 -1
  328. package/lib/documentServiceFactory.d.ts.map +0 -1
  329. package/lib/documentServiceFactory.js.map +0 -1
  330. package/lib/documentStorageService.d.ts.map +0 -1
  331. package/lib/documentStorageService.js.map +0 -1
  332. package/lib/errorUtils.d.ts +0 -47
  333. package/lib/errorUtils.d.ts.map +0 -1
  334. package/lib/errorUtils.js +0 -50
  335. package/lib/errorUtils.js.map +0 -1
  336. package/lib/index.d.ts +0 -13
  337. package/lib/index.d.ts.map +0 -1
  338. package/lib/index.js +0 -13
  339. package/lib/index.js.map +0 -1
  340. package/lib/nullBlobStorageService.d.ts.map +0 -1
  341. package/lib/nullBlobStorageService.js.map +0 -1
  342. package/lib/packageVersion.js.map +0 -1
  343. package/lib/policies.d.ts.map +0 -1
  344. package/lib/policies.js.map +0 -1
  345. package/lib/restWrapper.d.ts +0 -33
  346. package/lib/restWrapper.d.ts.map +0 -1
  347. package/lib/restWrapper.js +0 -144
  348. package/lib/restWrapper.js.map +0 -1
  349. package/lib/retriableGitManager.d.ts +0 -34
  350. package/lib/retriableGitManager.d.ts.map +0 -1
  351. package/lib/retriableGitManager.js +0 -72
  352. package/lib/retriableGitManager.js.map +0 -1
  353. package/lib/shreddedSummaryDocumentStorageService.d.ts.map +0 -1
  354. package/lib/shreddedSummaryDocumentStorageService.js.map +0 -1
  355. package/lib/tokens.d.ts.map +0 -1
  356. package/lib/tokens.js.map +0 -1
  357. package/lib/urlUtils.d.ts.map +0 -1
  358. package/lib/urlUtils.js +0 -42
  359. package/lib/urlUtils.js.map +0 -1
  360. package/lib/wholeSummaryDocumentStorageService.d.ts.map +0 -1
  361. package/lib/wholeSummaryDocumentStorageService.js +0 -187
  362. package/lib/wholeSummaryDocumentStorageService.js.map +0 -1
  363. package/tsconfig.esnext.json +0 -7
  364. /package/lib/{definitions.d.ts → definitions.d.mts} +0 -0
  365. /package/lib/{nullBlobStorageService.d.ts → nullBlobStorageService.d.mts} +0 -0
@@ -3,267 +3,367 @@
3
3
  * Licensed under the MIT License.
4
4
  */
5
5
 
6
- import type { ITelemetryLogger } from "@fluidframework/common-definitions";
7
6
  import {
8
- assert,
9
- stringToBuffer,
10
- Uint8ArrayToString,
11
- } from "@fluidframework/common-utils";
7
+ ITelemetryLoggerExt,
8
+ MonitoringContext,
9
+ PerformanceEvent,
10
+ createChildMonitoringContext,
11
+ } from "@fluidframework/telemetry-utils";
12
+ import { performance, stringToBuffer, Uint8ArrayToString } from "@fluid-internal/client-utils";
13
+ import { assert } from "@fluidframework/core-utils";
14
+ import { getW3CData, promiseRaceWithWinner } from "@fluidframework/driver-base";
12
15
  import {
13
- IDocumentStorageService,
14
- ISummaryContext,
15
- IDocumentStorageServicePolicies,
16
+ IDocumentStorageService,
17
+ ISummaryContext,
18
+ IDocumentStorageServicePolicies,
16
19
  } from "@fluidframework/driver-definitions";
17
20
  import {
18
- convertSnapshotAndBlobsToSummaryTree,
19
- } from "@fluidframework/driver-utils";
20
- import {
21
- ICreateBlobResponse,
22
- ISnapshotTree,
23
- ISummaryHandle,
24
- ISummaryTree,
25
- IVersion,
21
+ ICreateBlobResponse,
22
+ ISnapshotTree,
23
+ ISummaryHandle,
24
+ ISummaryTree,
25
+ IVersion,
26
26
  } from "@fluidframework/protocol-definitions";
27
- import {
28
- convertWholeFlatSummaryToSnapshotTreeAndBlobs,
29
- GitManager,
30
- ISummaryUploadManager,
31
- WholeSummaryUploadManager,
32
- } from "@fluidframework/server-services-client";
33
- import { PerformanceEvent } from "@fluidframework/telemetry-utils";
34
27
  import { ICache, InMemoryCache } from "./cache";
35
- import { ISnapshotTreeVersion } from "./definitions";
36
28
  import { IRouterliciousDriverPolicies } from "./policies";
29
+ import {
30
+ convertSnapshotAndBlobsToSummaryTree,
31
+ evalBlobsAndTrees,
32
+ validateBlobsAndTrees,
33
+ } from "./treeUtils";
34
+ import { GitManager } from "./gitManager";
35
+ import { WholeSummaryUploadManager } from "./wholeSummaryUploadManager";
36
+ import { ISummaryUploadManager } from "./storageContracts";
37
+ import { IR11sResponse } from "./restWrapper";
38
+ import { INormalizedWholeSnapshot, IWholeFlatSnapshot } from "./contracts";
39
+ import { convertWholeFlatSnapshotToSnapshotTreeAndBlobs } from "./r11sSnapshotParser";
37
40
 
38
41
  const latestSnapshotId: string = "latest";
39
42
 
40
43
  export class WholeSummaryDocumentStorageService implements IDocumentStorageService {
41
- private firstVersionsCall: boolean = true;
42
-
43
- public get repositoryUrl(): string {
44
- return "";
45
- }
46
-
47
- private async getSummaryUploadManager(): Promise<ISummaryUploadManager> {
48
- const manager = await this.getStorageManager();
49
- return new WholeSummaryUploadManager(manager);
50
- }
51
-
52
- constructor(
53
- protected readonly id: string,
54
- protected readonly manager: GitManager,
55
- protected readonly logger: ITelemetryLogger,
56
- public readonly policies: IDocumentStorageServicePolicies = {},
57
- private readonly driverPolicies?: IRouterliciousDriverPolicies,
58
- private readonly blobCache: ICache<ArrayBufferLike> = new InMemoryCache(),
59
- private readonly snapshotTreeCache: ICache<ISnapshotTreeVersion> = new InMemoryCache(),
60
- private readonly noCacheGitManager?: GitManager,
61
- private readonly getStorageManager: (disableCache?: boolean) => Promise<GitManager> = async (disableCache) =>
62
- disableCache && this.noCacheGitManager !== undefined ? this.noCacheGitManager : this.manager,
63
- ) {
64
- }
65
-
66
- public async getVersions(versionId: string | null, count: number): Promise<IVersion[]> {
67
- if (versionId !== this.id && versionId !== null) {
68
- // Blobs/Trees in this scenario will never have multiple versions, so return versionId as is
69
- return [{
70
- id: versionId,
71
- treeId: undefined!,
72
- }];
73
- }
74
- // If this is the first versions call for the document, we know we will want the latest summary.
75
- // Fetch latest summary, cache it, and return its id.
76
- if (this.firstVersionsCall && count === 1) {
77
- this.firstVersionsCall = false;
78
- const { id: _id, snapshotTree } = !this.driverPolicies?.enableDiscovery ?
79
- await this.fetchAndCacheSnapshotTree(latestSnapshotId, false) :
80
- await this.fetchAndCacheSnapshotTree(latestSnapshotId, true);
81
- return [{
82
- id: _id,
83
- treeId: snapshotTree.id!,
84
- }];
85
- }
86
-
87
- // Otherwise, get the latest version of the document as normal.
88
- const id = versionId ? versionId : this.id;
89
- const commits = await PerformanceEvent.timedExecAsync(
90
- this.logger,
91
- {
92
- eventName: "getVersions",
93
- versionId: id,
94
- count,
95
- },
96
- async () => {
97
- const manager = await this.getStorageManager();
98
- return manager.getCommits(id, count);
99
- },
100
- );
101
- return commits.map((commit) => ({
102
- date: commit.commit.author.date,
103
- id: commit.sha,
104
- treeId: commit.commit.tree.sha,
105
- }));
106
- }
107
-
108
- public async getSnapshotTree(version?: IVersion): Promise<ISnapshotTree | null> {
109
- let requestVersion = version;
110
- if (!requestVersion) {
111
- const versions = await this.getVersions(this.id, 1);
112
- if (versions.length === 0) {
113
- return null;
114
- }
115
-
116
- requestVersion = versions[0];
117
- }
118
-
119
- return (await this.fetchAndCacheSnapshotTree(requestVersion.id)).snapshotTree;
120
- }
121
-
122
- public async readBlob(blobId: string): Promise<ArrayBufferLike> {
123
- const cachedBlob = await this.blobCache.get(this.getCacheKey(blobId));
124
- if (cachedBlob !== undefined) {
125
- return cachedBlob;
126
- }
127
-
128
- const blob = await PerformanceEvent.timedExecAsync(
129
- this.logger,
130
- {
131
- eventName: "readBlob",
132
- blobId,
133
- },
134
- async (event) => {
135
- const manager = await this.getStorageManager();
136
- const response = await manager.getBlob(blobId);
137
- event.end({
138
- size: response.size,
139
- });
140
- return response;
141
- },
142
- );
143
- const bufferValue = stringToBuffer(blob.content, blob.encoding);
144
-
145
- await this.blobCache.put(this.getCacheKey(blob.sha), bufferValue);
146
-
147
- return bufferValue;
148
- }
149
-
150
- public async uploadSummaryWithContext(summary: ISummaryTree, context: ISummaryContext): Promise<string> {
151
- const summaryHandle = await PerformanceEvent.timedExecAsync(
152
- this.logger,
153
- {
154
- eventName: "uploadSummaryWithContext",
155
- },
156
- async () => {
157
- const summaryUploadManager = await this.getSummaryUploadManager();
158
- return summaryUploadManager.writeSummaryTree(summary, context.ackHandle ?? "", "channel");
159
- },
160
- );
161
- return summaryHandle;
162
- }
163
-
164
- public async downloadSummary(summaryHandle: ISummaryHandle): Promise<ISummaryTree> {
165
- const wholeFlatSummary = await PerformanceEvent.timedExecAsync(
166
- this.logger,
167
- {
168
- eventName: "getWholeFlatSummary",
169
- treeId: summaryHandle.handle,
170
- },
171
- async (event) => {
172
- const manager = await this.getStorageManager();
173
- const response = await manager.getSummary(summaryHandle.handle);
174
- event.end({
175
- size: response.trees[0]?.entries.length,
176
- });
177
- return response;
178
- },
179
- );
180
-
181
- const { blobs, snapshotTree } = convertWholeFlatSummaryToSnapshotTreeAndBlobs(wholeFlatSummary, "");
182
- return convertSnapshotAndBlobsToSummaryTree(snapshotTree, blobs);
183
- }
184
-
185
- public async createBlob(file: ArrayBufferLike): Promise<ICreateBlobResponse> {
186
- const uint8ArrayFile = new Uint8Array(file);
187
- return PerformanceEvent.timedExecAsync(
188
- this.logger,
189
- {
190
- eventName: "createBlob",
191
- size: uint8ArrayFile.length,
192
- },
193
- async (event) => {
194
- const manager = await this.getStorageManager();
195
- const response = await manager.createBlob(
196
- Uint8ArrayToString(
197
- uint8ArrayFile, "base64"),
198
- "base64").then((r) => ({ id: r.sha, url: r.url }));
199
- event.end({
200
- blobId: response.id,
201
- });
202
- return response;
203
- },
204
- );
205
- }
206
-
207
- private async fetchAndCacheSnapshotTree(versionId: string, disableCache?: boolean): Promise<ISnapshotTreeVersion> {
208
- const cachedSnapshotTreeVersion = await this.snapshotTreeCache.get(this.getCacheKey(versionId));
209
- if (cachedSnapshotTreeVersion !== undefined) {
210
- return { id: cachedSnapshotTreeVersion.id, snapshotTree: cachedSnapshotTreeVersion.snapshotTree };
211
- }
212
-
213
- const wholeFlatSummary = await PerformanceEvent.timedExecAsync(
214
- this.logger,
215
- {
216
- eventName: "getWholeFlatSummary",
217
- treeId: versionId,
218
- },
219
- async (event) => {
220
- const manager = await this.getStorageManager(disableCache);
221
- const response = await manager.getSummary(versionId);
222
- event.end({
223
- size: response.trees[0]?.entries.length,
224
- });
225
- return response;
226
- },
227
- );
228
- const normalizedWholeSummary = convertWholeFlatSummaryToSnapshotTreeAndBlobs(wholeFlatSummary);
229
- const wholeFlatSummaryId: string = wholeFlatSummary.id;
230
- const snapshotTreeId = normalizedWholeSummary.snapshotTree.id;
231
- assert(snapshotTreeId !== undefined, 0x275 /* "Root tree should contain the id" */);
232
- const snapshotTreeVersion = { id: wholeFlatSummaryId, snapshotTree: normalizedWholeSummary.snapshotTree };
233
-
234
- const cachePs: Promise<any>[] = [
235
- this.snapshotTreeCache.put(
236
- this.getCacheKey(snapshotTreeId),
237
- snapshotTreeVersion,
238
- ),
239
- this.initBlobCache(normalizedWholeSummary.blobs),
240
- ];
241
- if (snapshotTreeId !== versionId) {
242
- // versionId could be "latest". When summarizer checks cache for "latest", we want it to be available.
243
- // TODO: For in-memory cache, <latest,snapshotTree> will be a shared pointer with <snapshotId,snapshotTree>,
244
- // However, for something like Redis, this will cache the same value twice. Alternatively, could we simply
245
- // cache with versionId?
246
- cachePs.push(this.snapshotTreeCache.put(
247
- this.getCacheKey(versionId),
248
- snapshotTreeVersion,
249
- ));
250
- }
251
-
252
- await Promise.all(cachePs);
253
-
254
- return snapshotTreeVersion;
255
- }
256
-
257
- private async initBlobCache(blobs: Map<string, ArrayBuffer>): Promise<void> {
258
- const blobCachePutPs: Promise<void>[] = [];
259
- blobs.forEach((value, id) => {
260
- const cacheKey = this.getCacheKey(id);
261
- blobCachePutPs.push(this.blobCache.put(cacheKey, value));
262
- });
263
- await Promise.all(blobCachePutPs);
264
- }
265
-
266
- private getCacheKey(blobId: string): string {
267
- return `${this.id}:${blobId}`;
268
- }
44
+ private readonly mc: MonitoringContext;
45
+ private firstVersionsCall: boolean = true;
46
+
47
+ public readonly repositoryUrl = "";
48
+
49
+ private async getSummaryUploadManager(): Promise<ISummaryUploadManager> {
50
+ const manager = await this.getStorageManager();
51
+ return new WholeSummaryUploadManager(manager);
52
+ }
53
+
54
+ constructor(
55
+ protected readonly id: string,
56
+ protected readonly manager: GitManager,
57
+ protected readonly logger: ITelemetryLoggerExt,
58
+ public readonly policies: IDocumentStorageServicePolicies,
59
+ private readonly driverPolicies?: IRouterliciousDriverPolicies,
60
+ private readonly blobCache: ICache<ArrayBufferLike> = new InMemoryCache(),
61
+ private readonly snapshotTreeCache: ICache<INormalizedWholeSnapshot> = new InMemoryCache(),
62
+ private readonly noCacheGitManager?: GitManager,
63
+ private readonly getStorageManager: (
64
+ disableCache?: boolean,
65
+ ) => Promise<GitManager> = async (disableCache) =>
66
+ disableCache && this.noCacheGitManager !== undefined
67
+ ? this.noCacheGitManager
68
+ : this.manager,
69
+ ) {
70
+ this.mc = createChildMonitoringContext({
71
+ logger,
72
+ });
73
+ }
74
+
75
+ // eslint-disable-next-line @rushstack/no-new-null
76
+ public async getVersions(versionId: string | null, count: number): Promise<IVersion[]> {
77
+ if (versionId !== this.id && versionId !== null) {
78
+ // Blobs/Trees in this scenario will never have multiple versions, so return versionId as is
79
+ return [
80
+ {
81
+ id: versionId,
82
+ treeId: undefined!,
83
+ },
84
+ ];
85
+ }
86
+ // If this is the first versions call for the document, we know we will want the latest summary.
87
+ // Fetch latest summary, cache it, and return its id.
88
+ if (this.firstVersionsCall && count === 1) {
89
+ const normalizedSnapshotContents = await PerformanceEvent.timedExecAsync(
90
+ this.logger,
91
+ {
92
+ eventName: "ObtainSnapshot",
93
+ versionId: versionId ?? undefined,
94
+ count,
95
+ enableDiscovery: this.driverPolicies?.enableDiscovery,
96
+ },
97
+ async (event) => {
98
+ let method: string;
99
+ const cachedSnapshotP = this.snapshotTreeCache.get(
100
+ this.getCacheKey(latestSnapshotId),
101
+ );
102
+
103
+ const networkSnapshotP = !this.driverPolicies?.enableDiscovery
104
+ ? this.fetchSnapshotTree(latestSnapshotId, false, "getVersions")
105
+ : this.fetchSnapshotTree(latestSnapshotId, true, "getVersions");
106
+
107
+ const promiseRaceWinner = await promiseRaceWithWinner([
108
+ cachedSnapshotP.catch(() => undefined),
109
+ networkSnapshotP.catch(() => undefined),
110
+ ]);
111
+
112
+ let retrievedSnapshot = promiseRaceWinner.value;
113
+ method = promiseRaceWinner.index === 0 ? "cache" : "network";
114
+
115
+ if (retrievedSnapshot === undefined) {
116
+ // if network failed -> wait for cache ( then return network failure)
117
+ // If cache returned empty or failed -> wait for network (success of failure)
118
+ if (promiseRaceWinner.index === 1) {
119
+ retrievedSnapshot = await cachedSnapshotP;
120
+ method = "cache";
121
+ }
122
+ if (retrievedSnapshot === undefined) {
123
+ retrievedSnapshot = await networkSnapshotP;
124
+ method = "network";
125
+ }
126
+ }
127
+ event.end({
128
+ method,
129
+ });
130
+ return retrievedSnapshot;
131
+ },
132
+ );
133
+
134
+ const _id = await this.initializeFromSnapshot(normalizedSnapshotContents);
135
+ this.firstVersionsCall = false;
136
+ return [
137
+ {
138
+ id: _id,
139
+ treeId: normalizedSnapshotContents.snapshotTree.id!,
140
+ },
141
+ ];
142
+ }
143
+
144
+ // Otherwise, get the latest version of the document as normal.
145
+ const id = versionId ? versionId : this.id;
146
+ const commits = await PerformanceEvent.timedExecAsync(
147
+ this.logger,
148
+ {
149
+ eventName: "getVersions",
150
+ versionId: id,
151
+ count,
152
+ },
153
+ async () => {
154
+ const manager = await this.getStorageManager();
155
+ return (await manager.getCommits(id, count)).content;
156
+ },
157
+ );
158
+ return commits.map((commit) => ({
159
+ date: commit.commit.author.date,
160
+ id: commit.sha,
161
+ treeId: commit.commit.tree.sha,
162
+ }));
163
+ }
164
+
165
+ // eslint-disable-next-line @rushstack/no-new-null
166
+ public async getSnapshotTree(version?: IVersion): Promise<ISnapshotTree | null> {
167
+ let requestVersion = version;
168
+ if (!requestVersion) {
169
+ const versions = await this.getVersions(this.id, 1);
170
+ if (versions.length === 0) {
171
+ return null;
172
+ }
173
+
174
+ requestVersion = versions[0];
175
+ }
176
+
177
+ let normalizedWholeSnapshot = await this.snapshotTreeCache.get(
178
+ this.getCacheKey(requestVersion.id),
179
+ );
180
+ if (normalizedWholeSnapshot !== undefined) {
181
+ return normalizedWholeSnapshot.snapshotTree;
182
+ }
183
+
184
+ normalizedWholeSnapshot = await this.fetchSnapshotTree(
185
+ requestVersion.id,
186
+ undefined,
187
+ "getSnapshotTree",
188
+ );
189
+
190
+ // Currently retrieving blobs from network is not supported by AFR for WholeSummaryDocumentStorageService
191
+ // Blobs are expected to be put in the cache
192
+ await this.updateBlobsCache(normalizedWholeSnapshot.blobs);
193
+
194
+ return normalizedWholeSnapshot.snapshotTree;
195
+ }
196
+
197
+ public async readBlob(blobId: string): Promise<ArrayBufferLike> {
198
+ const cachedBlob = await this.blobCache.get(this.getCacheKey(blobId));
199
+ if (cachedBlob !== undefined) {
200
+ return cachedBlob;
201
+ }
202
+
203
+ // Note: AFR does not support readBlobs, but potentially other r11s like servers do
204
+ const blob = await PerformanceEvent.timedExecAsync(
205
+ this.logger,
206
+ {
207
+ eventName: "readBlob",
208
+ blobId,
209
+ },
210
+ async (event) => {
211
+ const manager = await this.getStorageManager();
212
+ const response = (await manager.getBlob(blobId)).content;
213
+ event.end({
214
+ size: response.size,
215
+ });
216
+ return response;
217
+ },
218
+ undefined, // workers
219
+ undefined, // recordHeapSize
220
+ this.mc.config.getNumber("Fluid.Driver.ReadBlobTelemetrySampling"),
221
+ );
222
+ const bufferValue = stringToBuffer(blob.content, blob.encoding);
223
+
224
+ await this.blobCache.put(this.getCacheKey(blob.sha), bufferValue);
225
+
226
+ return bufferValue;
227
+ }
228
+
229
+ public async uploadSummaryWithContext(
230
+ summary: ISummaryTree,
231
+ context: ISummaryContext,
232
+ ): Promise<string> {
233
+ const summaryHandle = await PerformanceEvent.timedExecAsync(
234
+ this.logger,
235
+ {
236
+ eventName: "uploadSummaryWithContext",
237
+ proposalHandle: context.proposalHandle,
238
+ ackHandle: context.ackHandle,
239
+ referenceSequenceNumber: context.referenceSequenceNumber,
240
+ },
241
+ async () => {
242
+ const summaryUploadManager = await this.getSummaryUploadManager();
243
+ return summaryUploadManager.writeSummaryTree(
244
+ summary,
245
+ context.ackHandle ?? "",
246
+ "channel",
247
+ );
248
+ },
249
+ );
250
+ return summaryHandle;
251
+ }
252
+
253
+ public async downloadSummary(summaryHandle: ISummaryHandle): Promise<ISummaryTree> {
254
+ const wholeFlatSnapshot = await PerformanceEvent.timedExecAsync(
255
+ this.logger,
256
+ {
257
+ eventName: "getWholeFlatSummary",
258
+ treeId: summaryHandle.handle,
259
+ },
260
+ async (event) => {
261
+ const manager = await this.getStorageManager();
262
+ const response = await manager.getSnapshot(summaryHandle.handle);
263
+ event.end({
264
+ size: response.content.trees[0]?.entries.length,
265
+ });
266
+ return response.content;
267
+ },
268
+ );
269
+
270
+ const { blobs, snapshotTree } = convertWholeFlatSnapshotToSnapshotTreeAndBlobs(
271
+ wholeFlatSnapshot,
272
+ "",
273
+ );
274
+ return convertSnapshotAndBlobsToSummaryTree(snapshotTree, blobs);
275
+ }
276
+
277
+ public async createBlob(file: ArrayBufferLike): Promise<ICreateBlobResponse> {
278
+ const uint8ArrayFile = new Uint8Array(file);
279
+ return PerformanceEvent.timedExecAsync(
280
+ this.logger,
281
+ {
282
+ eventName: "createBlob",
283
+ size: uint8ArrayFile.length,
284
+ },
285
+ async (event) => {
286
+ const manager = await this.getStorageManager();
287
+ const response = await manager
288
+ .createBlob(Uint8ArrayToString(uint8ArrayFile, "base64"), "base64")
289
+ .then((r) => ({ id: r.content.sha, url: r.content.url }));
290
+ event.end({
291
+ blobId: response.id,
292
+ });
293
+ return response;
294
+ },
295
+ );
296
+ }
297
+
298
+ private async fetchSnapshotTree(
299
+ versionId: string,
300
+ disableCache?: boolean,
301
+ scenarioName?: string,
302
+ ): Promise<INormalizedWholeSnapshot> {
303
+ const normalizedWholeSummary = await PerformanceEvent.timedExecAsync(
304
+ this.logger,
305
+ {
306
+ eventName: "getWholeFlatSummary",
307
+ treeId: versionId,
308
+ scenarioName,
309
+ },
310
+ async (event) => {
311
+ const manager = await this.getStorageManager(disableCache);
312
+ const response: IR11sResponse<IWholeFlatSnapshot> =
313
+ await manager.getSnapshot(versionId);
314
+ const start = performance.now();
315
+ const snapshot: INormalizedWholeSnapshot =
316
+ convertWholeFlatSnapshotToSnapshotTreeAndBlobs(response.content);
317
+ const snapshotConversionTime = performance.now() - start;
318
+ validateBlobsAndTrees(snapshot.snapshotTree);
319
+ const { trees, numBlobs, encodedBlobsSize } = evalBlobsAndTrees(snapshot);
320
+
321
+ event.end({
322
+ size: response.content.trees[0]?.entries.length,
323
+ trees,
324
+ blobs: numBlobs,
325
+ encodedBlobsSize,
326
+ sequenceNumber: snapshot.sequenceNumber,
327
+ ...response.propsToLog,
328
+ snapshotConversionTime,
329
+ ...getW3CData(response.requestUrl, "xmlhttprequest"),
330
+ });
331
+ return snapshot;
332
+ },
333
+ );
334
+
335
+ // Also add the result into the cache.
336
+ await this.snapshotTreeCache
337
+ .put(this.getCacheKey(versionId), normalizedWholeSummary)
338
+ .catch(() => undefined);
339
+ return normalizedWholeSummary;
340
+ }
341
+
342
+ private async initializeFromSnapshot(
343
+ normalizedWholeSummary: INormalizedWholeSnapshot,
344
+ ): Promise<string> {
345
+ const snapshotId = normalizedWholeSummary.id;
346
+ assert(snapshotId !== undefined, 0x275 /* "Root tree should contain the id" */);
347
+ const cachePs: Promise<any>[] = [
348
+ this.snapshotTreeCache.put(this.getCacheKey(snapshotId), normalizedWholeSummary),
349
+ this.updateBlobsCache(normalizedWholeSummary.blobs),
350
+ ];
351
+
352
+ await Promise.all(cachePs);
353
+
354
+ return snapshotId;
355
+ }
356
+
357
+ private async updateBlobsCache(blobs: Map<string, ArrayBuffer>): Promise<void> {
358
+ const blobCachePutPs: Promise<void>[] = [];
359
+ blobs.forEach((value, id) => {
360
+ const cacheKey = this.getCacheKey(id);
361
+ blobCachePutPs.push(this.blobCache.put(cacheKey, value));
362
+ });
363
+ await Promise.all(blobCachePutPs);
364
+ }
365
+
366
+ private getCacheKey(blobId: string): string {
367
+ return `${this.id}:${blobId}`;
368
+ }
269
369
  }