@fluidframework/odsp-driver 1.4.0-121020 → 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 (661) hide show
  1. package/.eslintrc.js +12 -12
  2. package/.mocharc.js +12 -0
  3. package/CHANGELOG.md +162 -0
  4. package/README.md +56 -0
  5. package/api-extractor-lint.json +4 -0
  6. package/api-extractor.json +2 -2
  7. package/api-report/odsp-driver.api.md +310 -0
  8. package/dist/{ReadBufferUtils.js → ReadBufferUtils.cjs} +16 -9
  9. package/dist/ReadBufferUtils.cjs.map +1 -0
  10. package/dist/ReadBufferUtils.d.ts.map +1 -1
  11. package/dist/{WriteBufferUtils.js → WriteBufferUtils.cjs} +73 -69
  12. package/dist/WriteBufferUtils.cjs.map +1 -0
  13. package/dist/WriteBufferUtils.d.ts +3 -5
  14. package/dist/WriteBufferUtils.d.ts.map +1 -1
  15. package/dist/{checkUrl.js → checkUrl.cjs} +7 -6
  16. package/dist/checkUrl.cjs.map +1 -0
  17. package/dist/checkUrl.d.ts +1 -0
  18. package/dist/checkUrl.d.ts.map +1 -1
  19. package/dist/compactSnapshotParser.cjs +207 -0
  20. package/dist/compactSnapshotParser.cjs.map +1 -0
  21. package/dist/compactSnapshotParser.d.ts +12 -3
  22. package/dist/compactSnapshotParser.d.ts.map +1 -1
  23. package/dist/{compactSnapshotWriter.js → compactSnapshotWriter.cjs} +43 -33
  24. package/dist/compactSnapshotWriter.cjs.map +1 -0
  25. package/dist/compactSnapshotWriter.d.ts +2 -3
  26. package/dist/compactSnapshotWriter.d.ts.map +1 -1
  27. package/dist/{constants.js → constants.cjs} +7 -1
  28. package/dist/constants.cjs.map +1 -0
  29. package/dist/constants.d.ts +6 -0
  30. package/dist/constants.d.ts.map +1 -1
  31. package/dist/{contracts.js → contracts.cjs} +1 -1
  32. package/dist/contracts.cjs.map +1 -0
  33. package/dist/contracts.d.ts +16 -53
  34. package/dist/contracts.d.ts.map +1 -1
  35. package/dist/{contractsPublic.js → contractsPublic.cjs} +9 -3
  36. package/dist/contractsPublic.cjs.map +1 -0
  37. package/dist/contractsPublic.d.ts +15 -0
  38. package/dist/contractsPublic.d.ts.map +1 -1
  39. package/dist/createFile.cjs +177 -0
  40. package/dist/createFile.cjs.map +1 -0
  41. package/dist/createFile.d.ts +6 -10
  42. package/dist/createFile.d.ts.map +1 -1
  43. package/dist/createNewContainerOnExistingFile.cjs +60 -0
  44. package/dist/createNewContainerOnExistingFile.cjs.map +1 -0
  45. package/dist/createNewContainerOnExistingFile.d.ts +22 -0
  46. package/dist/createNewContainerOnExistingFile.d.ts.map +1 -0
  47. package/dist/createNewModule.cjs +12 -0
  48. package/dist/createNewModule.cjs.map +1 -0
  49. package/dist/createNewModule.d.ts +7 -0
  50. package/dist/createNewModule.d.ts.map +1 -0
  51. package/dist/createNewUtils.cjs +203 -0
  52. package/dist/createNewUtils.cjs.map +1 -0
  53. package/dist/createNewUtils.d.ts +16 -0
  54. package/dist/createNewUtils.d.ts.map +1 -1
  55. package/dist/{createOdspCreateContainerRequest.js → createOdspCreateContainerRequest.cjs} +8 -4
  56. package/dist/createOdspCreateContainerRequest.cjs.map +1 -0
  57. package/dist/createOdspCreateContainerRequest.d.ts +5 -3
  58. package/dist/createOdspCreateContainerRequest.d.ts.map +1 -1
  59. package/dist/{createOdspUrl.js → createOdspUrl.cjs} +2 -1
  60. package/dist/createOdspUrl.cjs.map +1 -0
  61. package/dist/createOdspUrl.d.ts +1 -0
  62. package/dist/createOdspUrl.d.ts.map +1 -1
  63. package/dist/{epochTracker.js → epochTracker.cjs} +102 -48
  64. package/dist/epochTracker.cjs.map +1 -0
  65. package/dist/epochTracker.d.ts +32 -8
  66. package/dist/epochTracker.d.ts.map +1 -1
  67. package/dist/{fetch.js → fetch.cjs} +1 -1
  68. package/dist/fetch.cjs.map +1 -0
  69. package/dist/fetch.d.ts +1 -1
  70. package/dist/fetch.d.ts.map +1 -1
  71. package/dist/{fetchSnapshot.js → fetchSnapshot.cjs} +192 -176
  72. package/dist/fetchSnapshot.cjs.map +1 -0
  73. package/dist/fetchSnapshot.d.ts +10 -5
  74. package/dist/fetchSnapshot.d.ts.map +1 -1
  75. package/dist/{getFileLink.js → getFileLink.cjs} +52 -41
  76. package/dist/getFileLink.cjs.map +1 -0
  77. package/dist/getFileLink.d.ts +4 -7
  78. package/dist/getFileLink.d.ts.map +1 -1
  79. package/dist/{getQueryString.js → getQueryString.cjs} +1 -1
  80. package/dist/getQueryString.cjs.map +1 -0
  81. package/dist/getQueryString.d.ts.map +1 -1
  82. package/dist/{getUrlAndHeadersWithAuth.js → getUrlAndHeadersWithAuth.cjs} +4 -2
  83. package/dist/getUrlAndHeadersWithAuth.cjs.map +1 -0
  84. package/dist/getUrlAndHeadersWithAuth.d.ts.map +1 -1
  85. package/dist/index.cjs +59 -0
  86. package/dist/index.cjs.map +1 -0
  87. package/dist/index.d.ts +19 -16
  88. package/dist/index.d.ts.map +1 -1
  89. package/dist/localOdspDriver/localOdspDeltaStorageService.cjs +35 -0
  90. package/dist/localOdspDriver/localOdspDeltaStorageService.cjs.map +1 -0
  91. package/dist/localOdspDriver/localOdspDeltaStorageService.d.ts +17 -0
  92. package/dist/localOdspDriver/localOdspDeltaStorageService.d.ts.map +1 -0
  93. package/dist/localOdspDriver/{localOdspDocumentService.js → localOdspDocumentService.cjs} +7 -5
  94. package/dist/localOdspDriver/localOdspDocumentService.cjs.map +1 -0
  95. package/dist/localOdspDriver/localOdspDocumentService.d.ts +3 -2
  96. package/dist/localOdspDriver/localOdspDocumentService.d.ts.map +1 -1
  97. package/dist/localOdspDriver/{localOdspDocumentServiceFactory.js → localOdspDocumentServiceFactory.cjs} +9 -10
  98. package/dist/localOdspDriver/localOdspDocumentServiceFactory.cjs.map +1 -0
  99. package/dist/localOdspDriver/localOdspDocumentServiceFactory.d.ts +2 -3
  100. package/dist/localOdspDriver/localOdspDocumentServiceFactory.d.ts.map +1 -1
  101. package/dist/localOdspDriver/{localOdspDocumentStorageManager.js → localOdspDocumentStorageManager.cjs} +13 -11
  102. package/dist/localOdspDriver/localOdspDocumentStorageManager.cjs.map +1 -0
  103. package/dist/localOdspDriver/localOdspDocumentStorageManager.d.ts +2 -2
  104. package/dist/localOdspDriver/localOdspDocumentStorageManager.d.ts.map +1 -1
  105. package/dist/odsp-driver-alpha.d.ts +497 -0
  106. package/dist/odsp-driver-beta.d.ts +159 -0
  107. package/dist/odsp-driver-public.d.ts +159 -0
  108. package/dist/odsp-driver-untrimmed.d.ts +566 -0
  109. package/dist/{odspCache.js → odspCache.cjs} +9 -10
  110. package/dist/odspCache.cjs.map +1 -0
  111. package/dist/odspCache.d.ts +19 -4
  112. package/dist/odspCache.d.ts.map +1 -1
  113. package/dist/odspDelayLoadedDeltaStream.cjs +291 -0
  114. package/dist/odspDelayLoadedDeltaStream.cjs.map +1 -0
  115. package/dist/odspDelayLoadedDeltaStream.d.ts +75 -0
  116. package/dist/odspDelayLoadedDeltaStream.d.ts.map +1 -0
  117. package/dist/{odspDeltaStorageService.js → odspDeltaStorageService.cjs} +70 -71
  118. package/dist/odspDeltaStorageService.cjs.map +1 -0
  119. package/dist/odspDeltaStorageService.d.ts +8 -6
  120. package/dist/odspDeltaStorageService.d.ts.map +1 -1
  121. package/dist/{odspDocumentDeltaConnection.js → odspDocumentDeltaConnection.cjs} +224 -113
  122. package/dist/odspDocumentDeltaConnection.cjs.map +1 -0
  123. package/dist/odspDocumentDeltaConnection.d.ts +32 -12
  124. package/dist/odspDocumentDeltaConnection.d.ts.map +1 -1
  125. package/dist/odspDocumentService.cjs +225 -0
  126. package/dist/odspDocumentService.cjs.map +1 -0
  127. package/dist/odspDocumentService.d.ts +11 -25
  128. package/dist/odspDocumentService.d.ts.map +1 -1
  129. package/dist/{odspDocumentServiceFactory.js → odspDocumentServiceFactory.cjs} +8 -5
  130. package/dist/odspDocumentServiceFactory.cjs.map +1 -0
  131. package/dist/odspDocumentServiceFactory.d.ts +4 -0
  132. package/dist/odspDocumentServiceFactory.d.ts.map +1 -1
  133. package/dist/odspDocumentServiceFactoryCore.cjs +196 -0
  134. package/dist/odspDocumentServiceFactoryCore.cjs.map +1 -0
  135. package/dist/odspDocumentServiceFactoryCore.d.ts +16 -11
  136. package/dist/odspDocumentServiceFactoryCore.d.ts.map +1 -1
  137. package/dist/odspDocumentServiceFactoryWithCodeSplit.cjs +20 -0
  138. package/dist/odspDocumentServiceFactoryWithCodeSplit.cjs.map +1 -0
  139. package/dist/odspDocumentServiceFactoryWithCodeSplit.d.ts +5 -0
  140. package/dist/odspDocumentServiceFactoryWithCodeSplit.d.ts.map +1 -1
  141. package/dist/odspDocumentStorageManager.cjs +490 -0
  142. package/dist/odspDocumentStorageManager.cjs.map +1 -0
  143. package/dist/odspDocumentStorageManager.d.ts +11 -5
  144. package/dist/odspDocumentStorageManager.d.ts.map +1 -1
  145. package/dist/{odspDocumentStorageServiceBase.js → odspDocumentStorageServiceBase.cjs} +32 -34
  146. package/dist/odspDocumentStorageServiceBase.cjs.map +1 -0
  147. package/dist/odspDocumentStorageServiceBase.d.ts +7 -9
  148. package/dist/odspDocumentStorageServiceBase.d.ts.map +1 -1
  149. package/dist/{odspDriverUrlResolver.js → odspDriverUrlResolver.cjs} +50 -36
  150. package/dist/odspDriverUrlResolver.cjs.map +1 -0
  151. package/dist/odspDriverUrlResolver.d.ts +12 -0
  152. package/dist/odspDriverUrlResolver.d.ts.map +1 -1
  153. package/dist/{odspDriverUrlResolverForShareLink.js → odspDriverUrlResolverForShareLink.cjs} +37 -26
  154. package/dist/odspDriverUrlResolverForShareLink.cjs.map +1 -0
  155. package/dist/odspDriverUrlResolverForShareLink.d.ts +5 -3
  156. package/dist/odspDriverUrlResolverForShareLink.d.ts.map +1 -1
  157. package/dist/{odspError.js → odspError.cjs} +7 -3
  158. package/dist/odspError.cjs.map +1 -0
  159. package/dist/odspError.d.ts.map +1 -1
  160. package/dist/{odspFluidFileLink.js → odspFluidFileLink.cjs} +25 -18
  161. package/dist/odspFluidFileLink.cjs.map +1 -0
  162. package/dist/odspFluidFileLink.d.ts +10 -1
  163. package/dist/odspFluidFileLink.d.ts.map +1 -1
  164. package/dist/odspLocationRedirection.cjs +24 -0
  165. package/dist/odspLocationRedirection.cjs.map +1 -0
  166. package/dist/odspLocationRedirection.d.ts +14 -0
  167. package/dist/odspLocationRedirection.d.ts.map +1 -0
  168. package/dist/{odspPublicUtils.js → odspPublicUtils.cjs} +7 -4
  169. package/dist/odspPublicUtils.cjs.map +1 -0
  170. package/dist/odspPublicUtils.d.ts +6 -0
  171. package/dist/odspPublicUtils.d.ts.map +1 -1
  172. package/dist/{odspSnapshotParser.js → odspSnapshotParser.cjs} +11 -12
  173. package/dist/odspSnapshotParser.cjs.map +1 -0
  174. package/dist/odspSnapshotParser.d.ts.map +1 -1
  175. package/dist/{odspSummaryUploadManager.js → odspSummaryUploadManager.cjs} +47 -34
  176. package/dist/odspSummaryUploadManager.cjs.map +1 -0
  177. package/dist/odspSummaryUploadManager.d.ts +7 -4
  178. package/dist/odspSummaryUploadManager.d.ts.map +1 -1
  179. package/dist/{odspUrlHelper.js → odspUrlHelper.cjs} +9 -3
  180. package/dist/odspUrlHelper.cjs.map +1 -0
  181. package/dist/odspUrlHelper.d.ts +5 -0
  182. package/dist/odspUrlHelper.d.ts.map +1 -1
  183. package/dist/{odspUtils.js → odspUtils.cjs} +118 -30
  184. package/dist/odspUtils.cjs.map +1 -0
  185. package/dist/odspUtils.d.ts +35 -6
  186. package/dist/odspUtils.d.ts.map +1 -1
  187. package/dist/{opsCaching.js → opsCaching.cjs} +25 -9
  188. package/dist/opsCaching.cjs.map +1 -0
  189. package/dist/opsCaching.d.ts +3 -3
  190. package/dist/opsCaching.d.ts.map +1 -1
  191. package/dist/{packageVersion.js → packageVersion.cjs} +2 -2
  192. package/dist/packageVersion.cjs.map +1 -0
  193. package/dist/packageVersion.d.ts +1 -1
  194. package/dist/packageVersion.d.ts.map +1 -1
  195. package/dist/prefetchLatestSnapshot.cjs +100 -0
  196. package/dist/prefetchLatestSnapshot.cjs.map +1 -0
  197. package/dist/prefetchLatestSnapshot.d.ts +12 -7
  198. package/dist/prefetchLatestSnapshot.d.ts.map +1 -1
  199. package/dist/{retryErrorsStorageAdapter.js → retryErrorsStorageAdapter.cjs} +13 -6
  200. package/dist/retryErrorsStorageAdapter.cjs.map +1 -0
  201. package/dist/retryErrorsStorageAdapter.d.ts +5 -4
  202. package/dist/retryErrorsStorageAdapter.d.ts.map +1 -1
  203. package/dist/{retryUtils.js → retryUtils.cjs} +30 -14
  204. package/dist/retryUtils.cjs.map +1 -0
  205. package/dist/retryUtils.d.ts +2 -2
  206. package/dist/retryUtils.d.ts.map +1 -1
  207. package/dist/socketModule.cjs +10 -0
  208. package/dist/socketModule.cjs.map +1 -0
  209. package/dist/socketModule.d.ts +7 -0
  210. package/dist/socketModule.d.ts.map +1 -0
  211. package/dist/tsdoc-metadata.json +11 -0
  212. package/dist/{vroom.js → vroom.cjs} +24 -9
  213. package/dist/vroom.cjs.map +1 -0
  214. package/dist/vroom.d.ts +4 -4
  215. package/dist/vroom.d.ts.map +1 -1
  216. package/dist/{zipItDataRepresentationUtils.js → zipItDataRepresentationUtils.cjs} +227 -118
  217. package/dist/zipItDataRepresentationUtils.cjs.map +1 -0
  218. package/dist/zipItDataRepresentationUtils.d.ts +47 -20
  219. package/dist/zipItDataRepresentationUtils.d.ts.map +1 -1
  220. package/lib/ReadBufferUtils.d.mts.map +1 -0
  221. package/lib/{ReadBufferUtils.js → ReadBufferUtils.mjs} +14 -7
  222. package/lib/ReadBufferUtils.mjs.map +1 -0
  223. package/lib/{WriteBufferUtils.d.ts → WriteBufferUtils.d.mts} +3 -5
  224. package/lib/WriteBufferUtils.d.mts.map +1 -0
  225. package/lib/{WriteBufferUtils.js → WriteBufferUtils.mjs} +68 -64
  226. package/lib/WriteBufferUtils.mjs.map +1 -0
  227. package/lib/{checkUrl.d.ts → checkUrl.d.mts} +1 -0
  228. package/lib/checkUrl.d.mts.map +1 -0
  229. package/lib/{checkUrl.js → checkUrl.mjs} +7 -6
  230. package/lib/checkUrl.mjs.map +1 -0
  231. package/lib/compactSnapshotParser.d.mts +24 -0
  232. package/lib/compactSnapshotParser.d.mts.map +1 -0
  233. package/lib/compactSnapshotParser.mjs +203 -0
  234. package/lib/compactSnapshotParser.mjs.map +1 -0
  235. package/lib/{compactSnapshotWriter.d.ts → compactSnapshotWriter.d.mts} +3 -4
  236. package/lib/compactSnapshotWriter.d.mts.map +1 -0
  237. package/lib/{compactSnapshotWriter.js → compactSnapshotWriter.mjs} +41 -31
  238. package/lib/compactSnapshotWriter.mjs.map +1 -0
  239. package/lib/{constants.d.ts → constants.d.mts} +6 -0
  240. package/lib/constants.d.mts.map +1 -0
  241. package/lib/{constants.js → constants.mjs} +7 -1
  242. package/lib/constants.mjs.map +1 -0
  243. package/lib/{contracts.d.ts → contracts.d.mts} +17 -54
  244. package/lib/contracts.d.mts.map +1 -0
  245. package/lib/{contracts.js → contracts.mjs} +1 -1
  246. package/lib/contracts.mjs.map +1 -0
  247. package/lib/{contractsPublic.d.ts → contractsPublic.d.mts} +15 -0
  248. package/lib/contractsPublic.d.mts.map +1 -0
  249. package/lib/{contractsPublic.js → contractsPublic.mjs} +7 -1
  250. package/lib/contractsPublic.mjs.map +1 -0
  251. package/lib/createFile.d.mts +18 -0
  252. package/lib/createFile.d.mts.map +1 -0
  253. package/lib/createFile.mjs +171 -0
  254. package/lib/createFile.mjs.map +1 -0
  255. package/lib/createNewContainerOnExistingFile.d.mts +22 -0
  256. package/lib/createNewContainerOnExistingFile.d.mts.map +1 -0
  257. package/lib/createNewContainerOnExistingFile.mjs +56 -0
  258. package/lib/createNewContainerOnExistingFile.mjs.map +1 -0
  259. package/lib/createNewModule.d.mts +7 -0
  260. package/lib/createNewModule.d.mts.map +1 -0
  261. package/lib/createNewModule.mjs +7 -0
  262. package/lib/createNewModule.mjs.map +1 -0
  263. package/lib/createNewUtils.d.mts +27 -0
  264. package/lib/createNewUtils.d.mts.map +1 -0
  265. package/lib/createNewUtils.mjs +197 -0
  266. package/lib/createNewUtils.mjs.map +1 -0
  267. package/lib/{createOdspCreateContainerRequest.d.ts → createOdspCreateContainerRequest.d.mts} +5 -7
  268. package/lib/createOdspCreateContainerRequest.d.mts.map +1 -0
  269. package/lib/{createOdspCreateContainerRequest.js → createOdspCreateContainerRequest.mjs} +8 -4
  270. package/lib/createOdspCreateContainerRequest.mjs.map +1 -0
  271. package/lib/{createOdspUrl.d.ts → createOdspUrl.d.mts} +2 -1
  272. package/lib/{createOdspUrl.d.ts.map → createOdspUrl.d.mts.map} +1 -1
  273. package/lib/{createOdspUrl.js → createOdspUrl.mjs} +2 -1
  274. package/lib/createOdspUrl.mjs.map +1 -0
  275. package/lib/{epochTracker.d.ts → epochTracker.d.mts} +34 -10
  276. package/lib/epochTracker.d.mts.map +1 -0
  277. package/lib/{epochTracker.js → epochTracker.mjs} +97 -43
  278. package/lib/epochTracker.mjs.map +1 -0
  279. package/lib/{fetch.d.ts → fetch.d.mts} +1 -1
  280. package/lib/{fetch.d.ts.map → fetch.d.mts.map} +1 -1
  281. package/lib/{fetch.js → fetch.mjs} +1 -1
  282. package/lib/fetch.mjs.map +1 -0
  283. package/lib/{fetchSnapshot.d.ts → fetchSnapshot.d.mts} +14 -9
  284. package/lib/fetchSnapshot.d.mts.map +1 -0
  285. package/lib/{fetchSnapshot.js → fetchSnapshot.mjs} +185 -167
  286. package/lib/fetchSnapshot.mjs.map +1 -0
  287. package/lib/{getFileLink.d.ts → getFileLink.d.mts} +4 -7
  288. package/lib/getFileLink.d.mts.map +1 -0
  289. package/lib/{getFileLink.js → getFileLink.mjs} +49 -38
  290. package/lib/getFileLink.mjs.map +1 -0
  291. package/lib/{getQueryString.d.ts → getQueryString.d.mts} +0 -4
  292. package/lib/getQueryString.d.mts.map +1 -0
  293. package/lib/{getQueryString.js → getQueryString.mjs} +1 -1
  294. package/lib/getQueryString.mjs.map +1 -0
  295. package/lib/{getUrlAndHeadersWithAuth.d.ts.map → getUrlAndHeadersWithAuth.d.mts.map} +1 -1
  296. package/lib/{getUrlAndHeadersWithAuth.js → getUrlAndHeadersWithAuth.mjs} +4 -2
  297. package/lib/getUrlAndHeadersWithAuth.mjs.map +1 -0
  298. package/lib/index.d.mts +24 -0
  299. package/lib/index.d.mts.map +1 -0
  300. package/lib/index.mjs +22 -0
  301. package/lib/index.mjs.map +1 -0
  302. package/lib/localOdspDriver/localOdspDeltaStorageService.d.mts +17 -0
  303. package/lib/localOdspDriver/localOdspDeltaStorageService.d.mts.map +1 -0
  304. package/lib/localOdspDriver/localOdspDeltaStorageService.mjs +31 -0
  305. package/lib/localOdspDriver/localOdspDeltaStorageService.mjs.map +1 -0
  306. package/lib/localOdspDriver/{localOdspDocumentService.d.ts → localOdspDocumentService.d.mts} +3 -2
  307. package/lib/localOdspDriver/localOdspDocumentService.d.mts.map +1 -0
  308. package/lib/localOdspDriver/{localOdspDocumentService.js → localOdspDocumentService.mjs} +8 -6
  309. package/lib/localOdspDriver/localOdspDocumentService.mjs.map +1 -0
  310. package/lib/localOdspDriver/{localOdspDocumentServiceFactory.d.ts → localOdspDocumentServiceFactory.d.mts} +4 -5
  311. package/lib/localOdspDriver/localOdspDocumentServiceFactory.d.mts.map +1 -0
  312. package/lib/localOdspDriver/{localOdspDocumentServiceFactory.js → localOdspDocumentServiceFactory.mjs} +9 -10
  313. package/lib/localOdspDriver/localOdspDocumentServiceFactory.mjs.map +1 -0
  314. package/lib/localOdspDriver/{localOdspDocumentStorageManager.d.ts → localOdspDocumentStorageManager.d.mts} +3 -3
  315. package/lib/localOdspDriver/localOdspDocumentStorageManager.d.mts.map +1 -0
  316. package/lib/localOdspDriver/{localOdspDocumentStorageManager.js → localOdspDocumentStorageManager.mjs} +11 -9
  317. package/lib/localOdspDriver/localOdspDocumentStorageManager.mjs.map +1 -0
  318. package/lib/odsp-driver-alpha.d.mts +497 -0
  319. package/lib/odsp-driver-beta.d.mts +159 -0
  320. package/lib/odsp-driver-public.d.mts +159 -0
  321. package/lib/odsp-driver-untrimmed.d.mts +566 -0
  322. package/lib/{odspCache.d.ts → odspCache.d.mts} +19 -8
  323. package/lib/odspCache.d.mts.map +1 -0
  324. package/lib/{odspCache.js → odspCache.mjs} +6 -11
  325. package/lib/odspCache.mjs.map +1 -0
  326. package/lib/odspDelayLoadedDeltaStream.d.mts +75 -0
  327. package/lib/odspDelayLoadedDeltaStream.d.mts.map +1 -0
  328. package/lib/odspDelayLoadedDeltaStream.mjs +287 -0
  329. package/lib/odspDelayLoadedDeltaStream.mjs.map +1 -0
  330. package/lib/{odspDeltaStorageService.d.ts → odspDeltaStorageService.d.mts} +9 -7
  331. package/lib/odspDeltaStorageService.d.mts.map +1 -0
  332. package/lib/{odspDeltaStorageService.js → odspDeltaStorageService.mjs} +70 -68
  333. package/lib/odspDeltaStorageService.mjs.map +1 -0
  334. package/lib/{odspDocumentDeltaConnection.d.ts → odspDocumentDeltaConnection.d.mts} +33 -13
  335. package/lib/odspDocumentDeltaConnection.d.mts.map +1 -0
  336. package/lib/{odspDocumentDeltaConnection.js → odspDocumentDeltaConnection.mjs} +214 -103
  337. package/lib/odspDocumentDeltaConnection.mjs.map +1 -0
  338. package/lib/{odspDocumentService.d.ts → odspDocumentService.d.mts} +14 -28
  339. package/lib/odspDocumentService.d.mts.map +1 -0
  340. package/lib/odspDocumentService.mjs +221 -0
  341. package/lib/odspDocumentService.mjs.map +1 -0
  342. package/lib/{odspDocumentServiceFactory.d.ts → odspDocumentServiceFactory.d.mts} +5 -1
  343. package/lib/odspDocumentServiceFactory.d.mts.map +1 -0
  344. package/lib/{odspDocumentServiceFactory.js → odspDocumentServiceFactory.mjs} +8 -6
  345. package/lib/odspDocumentServiceFactory.mjs.map +1 -0
  346. package/lib/{odspDocumentServiceFactoryCore.d.ts → odspDocumentServiceFactoryCore.d.mts} +17 -12
  347. package/lib/odspDocumentServiceFactoryCore.d.mts.map +1 -0
  348. package/lib/odspDocumentServiceFactoryCore.mjs +192 -0
  349. package/lib/odspDocumentServiceFactoryCore.mjs.map +1 -0
  350. package/lib/{odspDocumentServiceFactoryWithCodeSplit.d.ts → odspDocumentServiceFactoryWithCodeSplit.d.mts} +6 -1
  351. package/lib/odspDocumentServiceFactoryWithCodeSplit.d.mts.map +1 -0
  352. package/lib/{odspDocumentServiceFactoryWithCodeSplit.js → odspDocumentServiceFactoryWithCodeSplit.mjs} +8 -3
  353. package/lib/odspDocumentServiceFactoryWithCodeSplit.mjs.map +1 -0
  354. package/lib/{odspDocumentStorageManager.d.ts → odspDocumentStorageManager.d.mts} +17 -11
  355. package/lib/odspDocumentStorageManager.d.mts.map +1 -0
  356. package/lib/odspDocumentStorageManager.mjs +486 -0
  357. package/lib/odspDocumentStorageManager.mjs.map +1 -0
  358. package/lib/{odspDocumentStorageServiceBase.d.ts → odspDocumentStorageServiceBase.d.mts} +8 -10
  359. package/lib/odspDocumentStorageServiceBase.d.mts.map +1 -0
  360. package/lib/{odspDocumentStorageServiceBase.js → odspDocumentStorageServiceBase.mjs} +31 -33
  361. package/lib/odspDocumentStorageServiceBase.mjs.map +1 -0
  362. package/lib/{odspDriverUrlResolver.d.ts → odspDriverUrlResolver.d.mts} +12 -0
  363. package/lib/odspDriverUrlResolver.d.mts.map +1 -0
  364. package/lib/{odspDriverUrlResolver.js → odspDriverUrlResolver.mjs} +50 -40
  365. package/lib/odspDriverUrlResolver.mjs.map +1 -0
  366. package/lib/{odspDriverUrlResolverForShareLink.d.ts → odspDriverUrlResolverForShareLink.d.mts} +6 -4
  367. package/lib/odspDriverUrlResolverForShareLink.d.mts.map +1 -0
  368. package/lib/{odspDriverUrlResolverForShareLink.js → odspDriverUrlResolverForShareLink.mjs} +36 -29
  369. package/lib/odspDriverUrlResolverForShareLink.mjs.map +1 -0
  370. package/lib/{odspError.d.ts → odspError.d.mts} +1 -1
  371. package/lib/odspError.d.mts.map +1 -0
  372. package/lib/{odspError.js → odspError.mjs} +7 -3
  373. package/lib/odspError.mjs.map +1 -0
  374. package/lib/{odspFluidFileLink.d.ts → odspFluidFileLink.d.mts} +11 -2
  375. package/lib/odspFluidFileLink.d.mts.map +1 -0
  376. package/lib/{odspFluidFileLink.js → odspFluidFileLink.mjs} +23 -16
  377. package/lib/odspFluidFileLink.mjs.map +1 -0
  378. package/lib/odspLocationRedirection.d.mts +14 -0
  379. package/lib/odspLocationRedirection.d.mts.map +1 -0
  380. package/lib/odspLocationRedirection.mjs +20 -0
  381. package/lib/odspLocationRedirection.mjs.map +1 -0
  382. package/lib/{odspPublicUtils.d.ts → odspPublicUtils.d.mts} +6 -0
  383. package/lib/odspPublicUtils.d.mts.map +1 -0
  384. package/lib/{odspPublicUtils.js → odspPublicUtils.mjs} +5 -2
  385. package/lib/odspPublicUtils.mjs.map +1 -0
  386. package/lib/{odspSnapshotParser.d.ts → odspSnapshotParser.d.mts} +2 -2
  387. package/lib/odspSnapshotParser.d.mts.map +1 -0
  388. package/lib/{odspSnapshotParser.js → odspSnapshotParser.mjs} +10 -11
  389. package/lib/odspSnapshotParser.mjs.map +1 -0
  390. package/lib/{odspSummaryUploadManager.d.ts → odspSummaryUploadManager.d.mts} +8 -5
  391. package/lib/odspSummaryUploadManager.d.mts.map +1 -0
  392. package/lib/{odspSummaryUploadManager.js → odspSummaryUploadManager.mjs} +41 -32
  393. package/lib/odspSummaryUploadManager.mjs.map +1 -0
  394. package/lib/{odspUrlHelper.d.ts → odspUrlHelper.d.mts} +5 -0
  395. package/lib/odspUrlHelper.d.mts.map +1 -0
  396. package/lib/{odspUrlHelper.js → odspUrlHelper.mjs} +9 -3
  397. package/lib/odspUrlHelper.mjs.map +1 -0
  398. package/lib/{odspUtils.d.ts → odspUtils.d.mts} +36 -7
  399. package/lib/odspUtils.d.mts.map +1 -0
  400. package/lib/{odspUtils.js → odspUtils.mjs} +109 -27
  401. package/lib/odspUtils.mjs.map +1 -0
  402. package/lib/{opsCaching.d.ts → opsCaching.d.mts} +3 -3
  403. package/lib/opsCaching.d.mts.map +1 -0
  404. package/lib/{opsCaching.js → opsCaching.mjs} +23 -7
  405. package/lib/opsCaching.mjs.map +1 -0
  406. package/lib/{packageVersion.d.ts → packageVersion.d.mts} +1 -1
  407. package/lib/{packageVersion.d.ts.map → packageVersion.d.mts.map} +1 -1
  408. package/lib/{packageVersion.js → packageVersion.mjs} +2 -2
  409. package/lib/packageVersion.mjs.map +1 -0
  410. package/lib/{prefetchLatestSnapshot.d.ts → prefetchLatestSnapshot.d.mts} +13 -8
  411. package/lib/prefetchLatestSnapshot.d.mts.map +1 -0
  412. package/lib/prefetchLatestSnapshot.mjs +96 -0
  413. package/lib/prefetchLatestSnapshot.mjs.map +1 -0
  414. package/lib/{retryErrorsStorageAdapter.d.ts → retryErrorsStorageAdapter.d.mts} +5 -4
  415. package/lib/retryErrorsStorageAdapter.d.mts.map +1 -0
  416. package/lib/{retryErrorsStorageAdapter.js → retryErrorsStorageAdapter.mjs} +13 -6
  417. package/lib/retryErrorsStorageAdapter.mjs.map +1 -0
  418. package/lib/{retryUtils.d.ts → retryUtils.d.mts} +2 -2
  419. package/lib/retryUtils.d.mts.map +1 -0
  420. package/lib/{retryUtils.js → retryUtils.mjs} +27 -11
  421. package/lib/retryUtils.mjs.map +1 -0
  422. package/lib/socketModule.d.mts +7 -0
  423. package/lib/socketModule.d.mts.map +1 -0
  424. package/lib/socketModule.mjs +7 -0
  425. package/lib/socketModule.mjs.map +1 -0
  426. package/lib/{vroom.d.ts → vroom.d.mts} +6 -6
  427. package/lib/vroom.d.mts.map +1 -0
  428. package/lib/{vroom.js → vroom.mjs} +24 -9
  429. package/lib/vroom.mjs.map +1 -0
  430. package/lib/{zipItDataRepresentationUtils.d.ts → zipItDataRepresentationUtils.d.mts} +48 -21
  431. package/lib/zipItDataRepresentationUtils.d.mts.map +1 -0
  432. package/lib/{zipItDataRepresentationUtils.js → zipItDataRepresentationUtils.mjs} +213 -111
  433. package/lib/zipItDataRepresentationUtils.mjs.map +1 -0
  434. package/package.json +89 -69
  435. package/prettier.config.cjs +8 -0
  436. package/src/ReadBufferUtils.ts +51 -44
  437. package/src/WriteBufferUtils.ts +203 -181
  438. package/src/checkUrl.ts +16 -15
  439. package/src/compactSnapshotParser.ts +219 -103
  440. package/src/compactSnapshotWriter.ts +118 -97
  441. package/src/constants.ts +7 -0
  442. package/src/contracts.ts +96 -136
  443. package/src/contractsPublic.ts +31 -16
  444. package/src/createFile.ts +243 -305
  445. package/src/createNewContainerOnExistingFile.ts +93 -0
  446. package/src/createNewModule.ts +7 -0
  447. package/src/createNewUtils.ts +266 -56
  448. package/src/createOdspCreateContainerRequest.ts +22 -18
  449. package/src/createOdspUrl.ts +12 -13
  450. package/src/epochTracker.ts +596 -457
  451. package/src/fetch.ts +4 -4
  452. package/src/fetchSnapshot.ts +583 -508
  453. package/src/getFileLink.ts +194 -155
  454. package/src/getQueryString.ts +11 -9
  455. package/src/getUrlAndHeadersWithAuth.ts +34 -33
  456. package/src/index.ts +42 -18
  457. package/src/localOdspDriver/localOdspDeltaStorageService.ts +49 -0
  458. package/src/localOdspDriver/localOdspDocumentService.ts +40 -38
  459. package/src/localOdspDriver/localOdspDocumentServiceFactory.ts +46 -43
  460. package/src/localOdspDriver/localOdspDocumentStorageManager.ts +55 -50
  461. package/src/odspCache.ts +112 -90
  462. package/src/odspDelayLoadedDeltaStream.ts +459 -0
  463. package/src/odspDeltaStorageService.ts +232 -221
  464. package/src/odspDocumentDeltaConnection.ts +751 -563
  465. package/src/odspDocumentService.ts +324 -523
  466. package/src/odspDocumentServiceFactory.ts +20 -21
  467. package/src/odspDocumentServiceFactoryCore.ts +325 -202
  468. package/src/odspDocumentServiceFactoryWithCodeSplit.ts +20 -20
  469. package/src/odspDocumentStorageManager.ts +730 -534
  470. package/src/odspDocumentStorageServiceBase.ts +279 -254
  471. package/src/odspDriverUrlResolver.ts +230 -188
  472. package/src/odspDriverUrlResolverForShareLink.ts +223 -203
  473. package/src/odspError.ts +27 -19
  474. package/src/odspFluidFileLink.ts +106 -87
  475. package/src/odspLocationRedirection.ts +26 -0
  476. package/src/odspPublicUtils.ts +20 -14
  477. package/src/odspSnapshotParser.ts +53 -46
  478. package/src/odspSummaryUploadManager.ts +243 -218
  479. package/src/odspUrlHelper.ts +81 -71
  480. package/src/odspUtils.ts +401 -259
  481. package/src/opsCaching.ts +214 -193
  482. package/src/packageVersion.ts +1 -1
  483. package/src/prefetchLatestSnapshot.ts +142 -80
  484. package/src/retryErrorsStorageAdapter.ts +92 -77
  485. package/src/retryUtils.ts +80 -57
  486. package/src/socketModule.ts +8 -0
  487. package/src/vroom.ts +92 -83
  488. package/src/zipItDataRepresentationUtils.ts +534 -394
  489. package/tsc-multi.test.json +4 -0
  490. package/tsconfig.json +11 -13
  491. package/.editorconfig +0 -7
  492. package/dist/ReadBufferUtils.js.map +0 -1
  493. package/dist/WriteBufferUtils.js.map +0 -1
  494. package/dist/checkUrl.js.map +0 -1
  495. package/dist/compactSnapshotParser.js +0 -115
  496. package/dist/compactSnapshotParser.js.map +0 -1
  497. package/dist/compactSnapshotWriter.js.map +0 -1
  498. package/dist/constants.js.map +0 -1
  499. package/dist/contracts.js.map +0 -1
  500. package/dist/contractsPublic.js.map +0 -1
  501. package/dist/createFile.js +0 -242
  502. package/dist/createFile.js.map +0 -1
  503. package/dist/createNewUtils.js +0 -67
  504. package/dist/createNewUtils.js.map +0 -1
  505. package/dist/createOdspCreateContainerRequest.js.map +0 -1
  506. package/dist/createOdspUrl.js.map +0 -1
  507. package/dist/epochTracker.js.map +0 -1
  508. package/dist/fetch.js.map +0 -1
  509. package/dist/fetchSnapshot.js.map +0 -1
  510. package/dist/getFileLink.js.map +0 -1
  511. package/dist/getQueryString.js.map +0 -1
  512. package/dist/getSocketIo.d.ts +0 -11
  513. package/dist/getSocketIo.d.ts.map +0 -1
  514. package/dist/getSocketIo.js +0 -20
  515. package/dist/getSocketIo.js.map +0 -1
  516. package/dist/getUrlAndHeadersWithAuth.js.map +0 -1
  517. package/dist/index.js +0 -41
  518. package/dist/index.js.map +0 -1
  519. package/dist/localOdspDriver/localOdspDocumentService.js.map +0 -1
  520. package/dist/localOdspDriver/localOdspDocumentServiceFactory.js.map +0 -1
  521. package/dist/localOdspDriver/localOdspDocumentStorageManager.js.map +0 -1
  522. package/dist/odspCache.js.map +0 -1
  523. package/dist/odspDeltaStorageService.js.map +0 -1
  524. package/dist/odspDocumentDeltaConnection.js.map +0 -1
  525. package/dist/odspDocumentService.js +0 -364
  526. package/dist/odspDocumentService.js.map +0 -1
  527. package/dist/odspDocumentServiceFactory.js.map +0 -1
  528. package/dist/odspDocumentServiceFactoryCore.js +0 -118
  529. package/dist/odspDocumentServiceFactoryCore.js.map +0 -1
  530. package/dist/odspDocumentServiceFactoryWithCodeSplit.js +0 -34
  531. package/dist/odspDocumentServiceFactoryWithCodeSplit.js.map +0 -1
  532. package/dist/odspDocumentStorageManager.js +0 -356
  533. package/dist/odspDocumentStorageManager.js.map +0 -1
  534. package/dist/odspDocumentStorageServiceBase.js.map +0 -1
  535. package/dist/odspDriverUrlResolver.js.map +0 -1
  536. package/dist/odspDriverUrlResolverForShareLink.js.map +0 -1
  537. package/dist/odspError.js.map +0 -1
  538. package/dist/odspFluidFileLink.js.map +0 -1
  539. package/dist/odspPublicUtils.js.map +0 -1
  540. package/dist/odspSnapshotParser.js.map +0 -1
  541. package/dist/odspSummaryUploadManager.js.map +0 -1
  542. package/dist/odspUrlHelper.js.map +0 -1
  543. package/dist/odspUtils.js.map +0 -1
  544. package/dist/opsCaching.js.map +0 -1
  545. package/dist/packageVersion.js.map +0 -1
  546. package/dist/prefetchLatestSnapshot.js +0 -57
  547. package/dist/prefetchLatestSnapshot.js.map +0 -1
  548. package/dist/retryErrorsStorageAdapter.js.map +0 -1
  549. package/dist/retryUtils.js.map +0 -1
  550. package/dist/vroom.js.map +0 -1
  551. package/dist/zipItDataRepresentationUtils.js.map +0 -1
  552. package/lib/ReadBufferUtils.d.ts.map +0 -1
  553. package/lib/ReadBufferUtils.js.map +0 -1
  554. package/lib/WriteBufferUtils.d.ts.map +0 -1
  555. package/lib/WriteBufferUtils.js.map +0 -1
  556. package/lib/checkUrl.d.ts.map +0 -1
  557. package/lib/checkUrl.js.map +0 -1
  558. package/lib/compactSnapshotParser.d.ts +0 -15
  559. package/lib/compactSnapshotParser.d.ts.map +0 -1
  560. package/lib/compactSnapshotParser.js +0 -111
  561. package/lib/compactSnapshotParser.js.map +0 -1
  562. package/lib/compactSnapshotWriter.d.ts.map +0 -1
  563. package/lib/compactSnapshotWriter.js.map +0 -1
  564. package/lib/constants.d.ts.map +0 -1
  565. package/lib/constants.js.map +0 -1
  566. package/lib/contracts.d.ts.map +0 -1
  567. package/lib/contracts.js.map +0 -1
  568. package/lib/contractsPublic.d.ts.map +0 -1
  569. package/lib/contractsPublic.js.map +0 -1
  570. package/lib/createFile.d.ts +0 -22
  571. package/lib/createFile.d.ts.map +0 -1
  572. package/lib/createFile.js +0 -235
  573. package/lib/createFile.js.map +0 -1
  574. package/lib/createNewUtils.d.ts +0 -11
  575. package/lib/createNewUtils.d.ts.map +0 -1
  576. package/lib/createNewUtils.js +0 -63
  577. package/lib/createNewUtils.js.map +0 -1
  578. package/lib/createOdspCreateContainerRequest.d.ts.map +0 -1
  579. package/lib/createOdspCreateContainerRequest.js.map +0 -1
  580. package/lib/createOdspUrl.js.map +0 -1
  581. package/lib/epochTracker.d.ts.map +0 -1
  582. package/lib/epochTracker.js.map +0 -1
  583. package/lib/fetch.js.map +0 -1
  584. package/lib/fetchSnapshot.d.ts.map +0 -1
  585. package/lib/fetchSnapshot.js.map +0 -1
  586. package/lib/getFileLink.d.ts.map +0 -1
  587. package/lib/getFileLink.js.map +0 -1
  588. package/lib/getQueryString.d.ts.map +0 -1
  589. package/lib/getQueryString.js.map +0 -1
  590. package/lib/getSocketIo.d.ts +0 -11
  591. package/lib/getSocketIo.d.ts.map +0 -1
  592. package/lib/getSocketIo.js +0 -13
  593. package/lib/getSocketIo.js.map +0 -1
  594. package/lib/getUrlAndHeadersWithAuth.js.map +0 -1
  595. package/lib/index.d.ts +0 -21
  596. package/lib/index.d.ts.map +0 -1
  597. package/lib/index.js +0 -29
  598. package/lib/index.js.map +0 -1
  599. package/lib/localOdspDriver/localOdspDocumentService.d.ts.map +0 -1
  600. package/lib/localOdspDriver/localOdspDocumentService.js.map +0 -1
  601. package/lib/localOdspDriver/localOdspDocumentServiceFactory.d.ts.map +0 -1
  602. package/lib/localOdspDriver/localOdspDocumentServiceFactory.js.map +0 -1
  603. package/lib/localOdspDriver/localOdspDocumentStorageManager.d.ts.map +0 -1
  604. package/lib/localOdspDriver/localOdspDocumentStorageManager.js.map +0 -1
  605. package/lib/odspCache.d.ts.map +0 -1
  606. package/lib/odspCache.js.map +0 -1
  607. package/lib/odspDeltaStorageService.d.ts.map +0 -1
  608. package/lib/odspDeltaStorageService.js.map +0 -1
  609. package/lib/odspDocumentDeltaConnection.d.ts.map +0 -1
  610. package/lib/odspDocumentDeltaConnection.js.map +0 -1
  611. package/lib/odspDocumentService.d.ts.map +0 -1
  612. package/lib/odspDocumentService.js +0 -360
  613. package/lib/odspDocumentService.js.map +0 -1
  614. package/lib/odspDocumentServiceFactory.d.ts.map +0 -1
  615. package/lib/odspDocumentServiceFactory.js.map +0 -1
  616. package/lib/odspDocumentServiceFactoryCore.d.ts.map +0 -1
  617. package/lib/odspDocumentServiceFactoryCore.js +0 -114
  618. package/lib/odspDocumentServiceFactoryCore.js.map +0 -1
  619. package/lib/odspDocumentServiceFactoryWithCodeSplit.d.ts.map +0 -1
  620. package/lib/odspDocumentServiceFactoryWithCodeSplit.js.map +0 -1
  621. package/lib/odspDocumentStorageManager.d.ts.map +0 -1
  622. package/lib/odspDocumentStorageManager.js +0 -352
  623. package/lib/odspDocumentStorageManager.js.map +0 -1
  624. package/lib/odspDocumentStorageServiceBase.d.ts.map +0 -1
  625. package/lib/odspDocumentStorageServiceBase.js.map +0 -1
  626. package/lib/odspDriverUrlResolver.d.ts.map +0 -1
  627. package/lib/odspDriverUrlResolver.js.map +0 -1
  628. package/lib/odspDriverUrlResolverForShareLink.d.ts.map +0 -1
  629. package/lib/odspDriverUrlResolverForShareLink.js.map +0 -1
  630. package/lib/odspError.d.ts.map +0 -1
  631. package/lib/odspError.js.map +0 -1
  632. package/lib/odspFluidFileLink.d.ts.map +0 -1
  633. package/lib/odspFluidFileLink.js.map +0 -1
  634. package/lib/odspPublicUtils.d.ts.map +0 -1
  635. package/lib/odspPublicUtils.js.map +0 -1
  636. package/lib/odspSnapshotParser.d.ts.map +0 -1
  637. package/lib/odspSnapshotParser.js.map +0 -1
  638. package/lib/odspSummaryUploadManager.d.ts.map +0 -1
  639. package/lib/odspSummaryUploadManager.js.map +0 -1
  640. package/lib/odspUrlHelper.d.ts.map +0 -1
  641. package/lib/odspUrlHelper.js.map +0 -1
  642. package/lib/odspUtils.d.ts.map +0 -1
  643. package/lib/odspUtils.js.map +0 -1
  644. package/lib/opsCaching.d.ts.map +0 -1
  645. package/lib/opsCaching.js.map +0 -1
  646. package/lib/packageVersion.js.map +0 -1
  647. package/lib/prefetchLatestSnapshot.d.ts.map +0 -1
  648. package/lib/prefetchLatestSnapshot.js +0 -53
  649. package/lib/prefetchLatestSnapshot.js.map +0 -1
  650. package/lib/retryErrorsStorageAdapter.d.ts.map +0 -1
  651. package/lib/retryErrorsStorageAdapter.js.map +0 -1
  652. package/lib/retryUtils.d.ts.map +0 -1
  653. package/lib/retryUtils.js.map +0 -1
  654. package/lib/vroom.d.ts.map +0 -1
  655. package/lib/vroom.js.map +0 -1
  656. package/lib/zipItDataRepresentationUtils.d.ts.map +0 -1
  657. package/lib/zipItDataRepresentationUtils.js.map +0 -1
  658. package/src/getSocketIo.ts +0 -14
  659. package/tsconfig.esnext.json +0 -7
  660. /package/lib/{ReadBufferUtils.d.ts → ReadBufferUtils.d.mts} +0 -0
  661. /package/lib/{getUrlAndHeadersWithAuth.d.ts → getUrlAndHeadersWithAuth.d.mts} +0 -0
@@ -3,44 +3,65 @@
3
3
  * Licensed under the MIT License.
4
4
  */
5
5
 
6
- import { default as AbortController } from "abort-controller";
7
6
  import { v4 as uuid } from "uuid";
8
- import { ITelemetryLogger } from "@fluidframework/common-definitions";
9
- import { assert, fromUtf8ToBase64, performance } from "@fluidframework/common-utils";
7
+ import {
8
+ ITelemetryLoggerExt,
9
+ isFluidError,
10
+ PerformanceEvent,
11
+ wrapError,
12
+ } from "@fluidframework/telemetry-utils";
13
+ import { fromUtf8ToBase64 } from "@fluid-internal/client-utils";
14
+ import { assert } from "@fluidframework/core-utils";
15
+ import { getW3CData } from "@fluidframework/driver-base";
10
16
  import { DriverErrorType } from "@fluidframework/driver-definitions";
11
- import { isFluidError, PerformanceEvent, wrapError } from "@fluidframework/telemetry-utils";
12
17
  import {
13
- IOdspResolvedUrl,
14
- ISnapshotOptions,
15
- OdspErrorType,
16
- InstrumentedStorageTokenFetcher,
18
+ IOdspResolvedUrl,
19
+ ISnapshotOptions,
20
+ OdspErrorType,
21
+ InstrumentedStorageTokenFetcher,
17
22
  } from "@fluidframework/odsp-driver-definitions";
18
23
  import { ISnapshotTree } from "@fluidframework/protocol-definitions";
19
- import { DriverErrorTelemetryProps, isRuntimeMessage, NonRetryableError } from "@fluidframework/driver-utils";
20
- import { IOdspSnapshot, ISnapshotCachedEntry, IVersionedValueWithEpoch, persistedCacheValueVersion } from "./contracts";
24
+ import {
25
+ DriverErrorTelemetryProps,
26
+ isRuntimeMessage,
27
+ NonRetryableError,
28
+ } from "@fluidframework/driver-utils";
29
+ import { fetchIncorrectResponse, throwOdspNetworkError } from "@fluidframework/odsp-doclib-utils";
30
+ import {
31
+ IOdspSnapshot,
32
+ ISnapshotCachedEntry,
33
+ IVersionedValueWithEpoch,
34
+ persistedCacheValueVersion,
35
+ } from "./contracts";
21
36
  import { getQueryString } from "./getQueryString";
22
37
  import { getUrlAndHeadersWithAuth } from "./getUrlAndHeadersWithAuth";
23
38
  import {
24
- fetchAndParseAsJSONHelper,
25
- fetchHelper,
26
- getWithRetryForTokenRefresh,
27
- getWithRetryForTokenRefreshRepeat,
28
- IOdspResponse,
39
+ fetchAndParseAsJSONHelper,
40
+ fetchHelper,
41
+ getWithRetryForTokenRefresh,
42
+ getWithRetryForTokenRefreshRepeat,
43
+ IOdspResponse,
44
+ measure,
45
+ measureP,
29
46
  } from "./odspUtils";
30
47
  import { ISnapshotContents } from "./odspPublicUtils";
31
48
  import { convertOdspSnapshotToSnapshotTreeAndBlobs } from "./odspSnapshotParser";
32
- import { currentReadVersion, parseCompactSnapshotResponse } from "./compactSnapshotParser";
33
- import { ReadBuffer } from "./ReadBufferUtils";
49
+ import {
50
+ currentReadVersion,
51
+ ISnapshotContentsWithProps,
52
+ parseCompactSnapshotResponse,
53
+ } from "./compactSnapshotParser";
34
54
  import { EpochTracker } from "./epochTracker";
35
55
  import { pkgVersion } from "./packageVersion";
36
56
 
37
57
  /**
38
58
  * Enum to support different types of snapshot formats.
59
+ * @alpha
39
60
  */
40
61
  export enum SnapshotFormatSupportType {
41
- Json = 0,
42
- Binary = 1,
43
- JsonAndBinary = 2,
62
+ Json = 0,
63
+ Binary = 1,
64
+ JsonAndBinary = 2,
44
65
  }
45
66
 
46
67
  /**
@@ -54,455 +75,495 @@ export enum SnapshotFormatSupportType {
54
75
  * @returns A promise of the snapshot and the status code of the response
55
76
  */
56
77
  export async function fetchSnapshot(
57
- snapshotUrl: string,
58
- token: string | null,
59
- versionId: string,
60
- fetchFullSnapshot: boolean,
61
- forceAccessTokenViaAuthorizationHeader: boolean,
62
- logger: ITelemetryLogger,
63
- snapshotDownloader: (url: string, fetchOptions: { [index: string]: any; }) => Promise<IOdspResponse<unknown>>,
78
+ snapshotUrl: string,
79
+ // eslint-disable-next-line @rushstack/no-new-null
80
+ token: string | null,
81
+ versionId: string,
82
+ fetchFullSnapshot: boolean,
83
+ forceAccessTokenViaAuthorizationHeader: boolean,
84
+ logger: ITelemetryLoggerExt,
85
+ snapshotDownloader: (
86
+ url: string,
87
+ fetchOptions: { [index: string]: any },
88
+ ) => Promise<IOdspResponse<unknown>>,
64
89
  ): Promise<ISnapshotContents> {
65
- const path = `/trees/${versionId}`;
66
- let queryParams: ISnapshotOptions = {};
67
-
68
- if (fetchFullSnapshot) {
69
- if (versionId !== "latest") {
70
- queryParams = { channels: 1, blobs: 2 };
71
- } else {
72
- queryParams = { deltas: 1, channels: 1, blobs: 2 };
73
- }
74
- }
75
-
76
- const queryString = getQueryString(queryParams);
77
- const { url, headers } = getUrlAndHeadersWithAuth(
78
- `${snapshotUrl}${path}${queryString}`, token, forceAccessTokenViaAuthorizationHeader);
79
- const response = await PerformanceEvent.timedExecAsync(
80
- logger,
81
- {
82
- eventName: "fetchSnapshot",
83
- headers: Object.keys(headers).length !== 0 ? true : undefined,
84
- },
85
- async () => snapshotDownloader(url, { headers }),
86
- ) as IOdspResponse<IOdspSnapshot>;
87
- return convertOdspSnapshotToSnapshotTreeAndBlobs(response.content);
90
+ const path = `/trees/${versionId}`;
91
+ let queryParams: ISnapshotOptions = {};
92
+
93
+ if (fetchFullSnapshot) {
94
+ queryParams = versionId !== "latest" ? { blobs: 2 } : { deltas: 1, blobs: 2 };
95
+ }
96
+
97
+ const queryString = getQueryString(queryParams);
98
+ const { url, headers } = getUrlAndHeadersWithAuth(
99
+ `${snapshotUrl}${path}${queryString}`,
100
+ token,
101
+ forceAccessTokenViaAuthorizationHeader,
102
+ );
103
+ const response = (await PerformanceEvent.timedExecAsync(
104
+ logger,
105
+ {
106
+ eventName: "fetchSnapshot",
107
+ headers: Object.keys(headers).length !== 0 ? true : undefined,
108
+ },
109
+ async () => snapshotDownloader(url, { headers }),
110
+ )) as IOdspResponse<IOdspSnapshot>;
111
+ return convertOdspSnapshotToSnapshotTreeAndBlobs(response.content);
88
112
  }
89
113
 
90
114
  export async function fetchSnapshotWithRedeem(
91
- odspResolvedUrl: IOdspResolvedUrl,
92
- storageTokenFetcher: InstrumentedStorageTokenFetcher,
93
- snapshotOptions: ISnapshotOptions | undefined,
94
- forceAccessTokenViaAuthorizationHeader: boolean,
95
- logger: ITelemetryLogger,
96
- snapshotDownloader: (
97
- finalOdspResolvedUrl: IOdspResolvedUrl,
98
- storageToken: string,
99
- snapshotOptions: ISnapshotOptions | undefined,
100
- controller?: AbortController,
101
- ) => Promise<ISnapshotRequestAndResponseOptions>,
102
- putInCache: (valueWithEpoch: IVersionedValueWithEpoch) => Promise<void>,
103
- removeEntries: () => Promise<void>,
104
- enableRedeemFallback?: boolean,
115
+ odspResolvedUrl: IOdspResolvedUrl,
116
+ storageTokenFetcher: InstrumentedStorageTokenFetcher,
117
+ snapshotOptions: ISnapshotOptions | undefined,
118
+ forceAccessTokenViaAuthorizationHeader: boolean,
119
+ logger: ITelemetryLoggerExt,
120
+ snapshotDownloader: (
121
+ finalOdspResolvedUrl: IOdspResolvedUrl,
122
+ storageToken: string,
123
+ snapshotOptions: ISnapshotOptions | undefined,
124
+ controller?: AbortController,
125
+ ) => Promise<ISnapshotRequestAndResponseOptions>,
126
+ putInCache: (valueWithEpoch: IVersionedValueWithEpoch) => Promise<void>,
127
+ removeEntries: () => Promise<void>,
128
+ enableRedeemFallback?: boolean,
105
129
  ): Promise<ISnapshotContents> {
106
- // back-compat: This block to be removed with #8784 when we only consume/consider odsp resolvers that are >= 0.51
107
- const sharingLinkToRedeem = (odspResolvedUrl as any).sharingLinkToRedeem;
108
- if (sharingLinkToRedeem) {
109
- odspResolvedUrl.shareLinkInfo = { ...odspResolvedUrl.shareLinkInfo, sharingLinkToRedeem };
110
- }
111
-
112
- return fetchLatestSnapshotCore(
113
- odspResolvedUrl,
114
- storageTokenFetcher,
115
- snapshotOptions,
116
- logger,
117
- snapshotDownloader,
118
- putInCache,
119
- enableRedeemFallback,
120
- ).catch(async (error) => {
121
- if (enableRedeemFallback && isRedeemSharingLinkError(odspResolvedUrl, error)) {
122
- // Execute the redeem fallback
123
- logger.sendErrorEvent({
124
- eventName: "RedeemFallback",
125
- errorType: error.errorType,
126
- }, error);
127
- await redeemSharingLink(
128
- odspResolvedUrl, storageTokenFetcher, logger, forceAccessTokenViaAuthorizationHeader);
129
- const odspResolvedUrlWithoutShareLink: IOdspResolvedUrl =
130
- {
131
- ...odspResolvedUrl,
132
- shareLinkInfo: {
133
- ...odspResolvedUrl.shareLinkInfo,
134
- sharingLinkToRedeem: undefined,
135
- },
136
- };
137
-
138
- return fetchLatestSnapshotCore(
139
- odspResolvedUrlWithoutShareLink,
140
- storageTokenFetcher,
141
- snapshotOptions,
142
- logger,
143
- snapshotDownloader,
144
- putInCache,
145
- );
146
- } else {
147
- throw error;
148
- }
149
- }).catch(async (error) => {
150
- // Clear the cache on 401/403/404 on snapshot fetch from network because this means either the user doesn't
151
- // have permissions for the file or it was deleted. So, if we do not clear cache, we will continue fetching
152
- // snapshot from cache in the future.
153
- if (typeof error === "object" && error !== null && error.errorType === DriverErrorType.authorizationError
154
- || error.errorType === DriverErrorType.fileNotFoundOrAccessDeniedError) {
155
- await removeEntries();
156
- }
157
- throw error;
158
- });
130
+ // back-compat: This block to be removed with #8784 when we only consume/consider odsp resolvers that are >= 0.51
131
+ const sharingLinkToRedeem = (odspResolvedUrl as any).sharingLinkToRedeem;
132
+ if (sharingLinkToRedeem) {
133
+ odspResolvedUrl.shareLinkInfo = { ...odspResolvedUrl.shareLinkInfo, sharingLinkToRedeem };
134
+ }
135
+
136
+ return fetchLatestSnapshotCore(
137
+ odspResolvedUrl,
138
+ storageTokenFetcher,
139
+ snapshotOptions,
140
+ logger,
141
+ snapshotDownloader,
142
+ putInCache,
143
+ enableRedeemFallback,
144
+ )
145
+ .catch(async (error) => {
146
+ if (enableRedeemFallback && isRedeemSharingLinkError(odspResolvedUrl, error)) {
147
+ // Execute the redeem fallback
148
+
149
+ await redeemSharingLink(
150
+ odspResolvedUrl,
151
+ storageTokenFetcher,
152
+ logger,
153
+ forceAccessTokenViaAuthorizationHeader,
154
+ );
155
+ const odspResolvedUrlWithoutShareLink: IOdspResolvedUrl = {
156
+ ...odspResolvedUrl,
157
+ shareLinkInfo: {
158
+ ...odspResolvedUrl.shareLinkInfo,
159
+ sharingLinkToRedeem: undefined,
160
+ },
161
+ };
162
+
163
+ // Log initial failure only if redeem succeeded - it points out to some bug somewhere
164
+ // If redeem failed, that most likely means user has no permissions to access a file,
165
+ // and thus it's not worth it logging extra errors - same error will be logged by end-to-end
166
+ // flow (container open) based on a failure above.
167
+ logger.sendTelemetryEvent(
168
+ {
169
+ eventName: "RedeemFallback",
170
+ errorType: error.errorType,
171
+ },
172
+ error,
173
+ );
174
+
175
+ return fetchLatestSnapshotCore(
176
+ odspResolvedUrlWithoutShareLink,
177
+ storageTokenFetcher,
178
+ snapshotOptions,
179
+ logger,
180
+ snapshotDownloader,
181
+ putInCache,
182
+ );
183
+ } else {
184
+ throw error;
185
+ }
186
+ })
187
+ .catch(async (error) => {
188
+ // Clear the cache on 401/403/404 on snapshot fetch from network because this means either the user doesn't
189
+ // have permissions for the file or it was deleted. So, if we do not clear cache, we will continue fetching
190
+ // snapshot from cache in the future.
191
+ if (
192
+ (typeof error === "object" &&
193
+ error !== null &&
194
+ error.errorType === DriverErrorType.authorizationError) ||
195
+ error.errorType === DriverErrorType.fileNotFoundOrAccessDeniedError
196
+ ) {
197
+ await removeEntries();
198
+ }
199
+ throw error;
200
+ });
159
201
  }
160
202
 
161
203
  async function redeemSharingLink(
162
- odspResolvedUrl: IOdspResolvedUrl,
163
- storageTokenFetcher: InstrumentedStorageTokenFetcher,
164
- logger: ITelemetryLogger,
165
- forceAccessTokenViaAuthorizationHeader: boolean,
204
+ odspResolvedUrl: IOdspResolvedUrl,
205
+ storageTokenFetcher: InstrumentedStorageTokenFetcher,
206
+ logger: ITelemetryLoggerExt,
207
+ forceAccessTokenViaAuthorizationHeader: boolean,
166
208
  ) {
167
- return PerformanceEvent.timedExecAsync(
168
- logger,
169
- {
170
- eventName: "RedeemShareLink",
171
- },
172
- async () => getWithRetryForTokenRefresh(async (tokenFetchOptions) => {
173
- assert(!!odspResolvedUrl.shareLinkInfo?.sharingLinkToRedeem,
174
- 0x1ed /* "Share link should be present" */);
175
- const storageToken = await storageTokenFetcher(tokenFetchOptions, "RedeemShareLink");
176
- const encodedShareUrl = getEncodedShareUrl(odspResolvedUrl.shareLinkInfo?.sharingLinkToRedeem);
177
- const redeemUrl = `${odspResolvedUrl.siteUrl}/_api/v2.0/shares/${encodedShareUrl}`;
178
- const { url, headers } = getUrlAndHeadersWithAuth(
179
- redeemUrl, storageToken, forceAccessTokenViaAuthorizationHeader);
180
- headers.prefer = "redeemSharingLink";
181
- return fetchAndParseAsJSONHelper(url, { headers });
182
- }),
183
- );
209
+ return PerformanceEvent.timedExecAsync(
210
+ logger,
211
+ {
212
+ eventName: "RedeemShareLink",
213
+ },
214
+ async () =>
215
+ getWithRetryForTokenRefresh(async (tokenFetchOptions) => {
216
+ assert(
217
+ !!odspResolvedUrl.shareLinkInfo?.sharingLinkToRedeem,
218
+ 0x1ed /* "Share link should be present" */,
219
+ );
220
+ const storageToken = await storageTokenFetcher(
221
+ tokenFetchOptions,
222
+ "RedeemShareLink",
223
+ );
224
+ const encodedShareUrl = getEncodedShareUrl(
225
+ odspResolvedUrl.shareLinkInfo?.sharingLinkToRedeem,
226
+ );
227
+ const redeemUrl = `${odspResolvedUrl.siteUrl}/_api/v2.0/shares/${encodedShareUrl}`;
228
+ const { url, headers } = getUrlAndHeadersWithAuth(
229
+ redeemUrl,
230
+ storageToken,
231
+ forceAccessTokenViaAuthorizationHeader,
232
+ );
233
+ headers.prefer = "redeemSharingLink";
234
+ return fetchAndParseAsJSONHelper(url, { headers });
235
+ }),
236
+ );
184
237
  }
185
238
 
186
239
  async function fetchLatestSnapshotCore(
187
- odspResolvedUrl: IOdspResolvedUrl,
188
- storageTokenFetcher: InstrumentedStorageTokenFetcher,
189
- snapshotOptions: ISnapshotOptions | undefined,
190
- logger: ITelemetryLogger,
191
- snapshotDownloader: (
192
- finalOdspResolvedUrl: IOdspResolvedUrl,
193
- storageToken: string,
194
- snapshotOptions: ISnapshotOptions | undefined,
195
- controller?: AbortController,
196
- ) => Promise<ISnapshotRequestAndResponseOptions>,
197
- putInCache: (valueWithEpoch: IVersionedValueWithEpoch) => Promise<void>,
198
- enableRedeemFallback?: boolean,
240
+ odspResolvedUrl: IOdspResolvedUrl,
241
+ storageTokenFetcher: InstrumentedStorageTokenFetcher,
242
+ snapshotOptions: ISnapshotOptions | undefined,
243
+ logger: ITelemetryLoggerExt,
244
+ snapshotDownloader: (
245
+ finalOdspResolvedUrl: IOdspResolvedUrl,
246
+ storageToken: string,
247
+ snapshotOptions: ISnapshotOptions | undefined,
248
+ controller?: AbortController,
249
+ ) => Promise<ISnapshotRequestAndResponseOptions>,
250
+ putInCache: (valueWithEpoch: IVersionedValueWithEpoch) => Promise<void>,
251
+ enableRedeemFallback?: boolean,
199
252
  ): Promise<ISnapshotContents> {
200
- return getWithRetryForTokenRefresh(async (tokenFetchOptions) => {
201
- const storageToken = await storageTokenFetcher(tokenFetchOptions, "TreesLatest", true);
202
- assert(storageToken !== null, 0x1e5 /* "Storage token should not be null" */);
203
-
204
- let controller: AbortController | undefined;
205
- if (snapshotOptions?.timeout !== undefined) {
206
- controller = new AbortController();
207
- setTimeout(
208
- () => controller!.abort(),
209
- snapshotOptions.timeout,
210
- );
211
- }
212
- const perfEvent = {
213
- eventName: "TreesLatest",
214
- attempts: tokenFetchOptions.refresh ? 2 : 1,
215
- shareLinkPresent: odspResolvedUrl.shareLinkInfo?.sharingLinkToRedeem !== undefined,
216
- isSummarizer: odspResolvedUrl.summarizer,
217
- redeemFallbackEnabled: enableRedeemFallback,
218
- };
219
- if (snapshotOptions !== undefined) {
220
- Object.entries(snapshotOptions).forEach(([key, value]) => {
221
- if (value !== undefined) {
222
- perfEvent[`snapshotOption_${key}`] = value;
223
- }
224
- });
225
- }
226
- // This event measures only successful cases of getLatest call (no tokens, no retries).
227
- return PerformanceEvent.timedExecAsync(
228
- logger,
229
- perfEvent,
230
- async (event) => {
231
- const response = await snapshotDownloader(
232
- odspResolvedUrl,
233
- storageToken,
234
- snapshotOptions,
235
- controller,
236
- );
237
-
238
- const odspResponse = response.odspResponse;
239
- const contentType = odspResponse.headers.get("content-type");
240
-
241
- // Measure how much time we spend processing payload
242
- const snapshotParseEvent = PerformanceEvent.start(logger, {
243
- eventName: "SnapshotParse",
244
- driverVersion: pkgVersion,
245
- contentType,
246
- });
247
-
248
- const propsToLog: DriverErrorTelemetryProps = {
249
- ...odspResponse.propsToLog,
250
- contentType,
251
- accept: response.requestHeaders.accept,
252
- driverVersion: pkgVersion,
253
- };
254
- let parsedSnapshotContents: IOdspResponse<ISnapshotContents> | undefined;
255
-
256
- try {
257
- switch (contentType) {
258
- case "application/json": {
259
- const text = await odspResponse.content.text();
260
- propsToLog.bodySize = text.length;
261
- const content: IOdspSnapshot = JSON.parse(text);
262
- validateBlobsAndTrees(content);
263
- const snapshotContents: ISnapshotContents =
264
- convertOdspSnapshotToSnapshotTreeAndBlobs(content);
265
- parsedSnapshotContents = { ...odspResponse, content: snapshotContents };
266
- break;
267
- }
268
- case "application/ms-fluid": {
269
- const content = await odspResponse.content.arrayBuffer();
270
- propsToLog.bodySize = content.byteLength;
271
- const snapshotContents: ISnapshotContents = parseCompactSnapshotResponse(
272
- new ReadBuffer(new Uint8Array(content)));
273
- if (snapshotContents.snapshotTree.trees === undefined ||
274
- snapshotContents.snapshotTree.blobs === undefined) {
275
- throw new NonRetryableError(
276
- "Returned odsp snapshot is malformed. No trees or blobs!",
277
- DriverErrorType.incorrectServerResponse,
278
- propsToLog,
279
- );
280
- }
281
- parsedSnapshotContents = { ...odspResponse, content: snapshotContents };
282
- break;
283
- }
284
- default:
285
- throw new NonRetryableError(
286
- "Unknown snapshot content type",
287
- DriverErrorType.incorrectServerResponse,
288
- propsToLog,
289
- );
290
- }
291
- } catch (error) {
292
- if (isFluidError(error)) {
293
- error.addTelemetryProperties(propsToLog);
294
- throw error;
295
- }
296
- const enhancedError = wrapError(
297
- error,
298
- (errorMessage) => new NonRetryableError(
299
- `Error parsing snapshot response: ${errorMessage}`,
300
- DriverErrorType.genericError,
301
- propsToLog));
302
- throw enhancedError;
303
- }
304
-
305
- assert(parsedSnapshotContents !== undefined, 0x312 /* snapshot should be parsed */);
306
- const snapshot = parsedSnapshotContents.content;
307
- const { trees, numBlobs, encodedBlobsSize } = evalBlobsAndTrees(snapshot);
308
-
309
- // From: https://developer.mozilla.org/en-US/docs/Web/API/PerformanceResourceTiming
310
- // fetchStart: immediately before the browser starts to fetch the resource.
311
- // requestStart: immediately before the browser starts requesting the resource from the server
312
- // responseStart: immediately after the browser receives the first byte of the response from the server.
313
- // responseEnd: immediately after the browser receives the last byte of the resource
314
- // or immediately before the transport connection is closed, whichever comes first.
315
- // secureConnectionStart: immediately before the browser starts the handshake process to secure the
316
- // current connection. If a secure connection is not used, this property returns zero.
317
- // startTime: Time when the resource fetch started. This value is equivalent to fetchStart.
318
- // domainLookupStart: immediately before the browser starts the domain name lookup for the resource.
319
- // domainLookupEnd: immediately after the browser finishes the domain name lookup for the resource.
320
- // redirectStart: start time of the fetch which that initiates the redirect.
321
- // redirectEnd: immediately after receiving the last byte of the response of the last redirect.
322
- let dnsLookupTime: number | undefined; // domainLookupEnd - domainLookupStart
323
- let redirectTime: number | undefined; // redirectEnd - redirectStart
324
- let tcpHandshakeTime: number | undefined; // connectEnd - connectStart
325
- let secureConnectionTime: number | undefined; // connectEnd - secureConnectionStart
326
- let responseNetworkTime: number | undefined; // responsEnd - responseStart
327
- let fetchStartToResponseEndTime: number | undefined; // responseEnd - fetchStart
328
- let reqStartToResponseEndTime: number | undefined; // responseEnd - requestStart
329
- let networkTime: number | undefined; // responseEnd - startTime
330
- const spReqDuration = odspResponse.headers.get("sprequestduration");
331
-
332
- // getEntriesByType is only available in browser performance object
333
- const resources1 = performance.getEntriesByType?.("resource") ?? [];
334
- // Usually the latest fetch call is to the end of resources, so we start from the end.
335
- for (let i = resources1.length - 1; i > 0; i--) {
336
- const indResTime = resources1[i] as PerformanceResourceTiming;
337
- const resource_name = indResTime.name;
338
- const resource_initiatortype = indResTime.initiatorType;
339
- if ((resource_initiatortype.localeCompare("fetch") === 0)
340
- && (resource_name.localeCompare(response.requestUrl) === 0)) {
341
- redirectTime = indResTime.redirectEnd - indResTime.redirectStart;
342
- dnsLookupTime = indResTime.domainLookupEnd - indResTime.domainLookupStart;
343
- tcpHandshakeTime = indResTime.connectEnd - indResTime.connectStart;
344
- secureConnectionTime = (indResTime.secureConnectionStart > 0) ?
345
- (indResTime.connectEnd - indResTime.secureConnectionStart) : undefined;
346
- responseNetworkTime = (indResTime.responseStart > 0) ?
347
- (indResTime.responseEnd - indResTime.responseStart) : undefined;
348
- fetchStartToResponseEndTime = (indResTime.fetchStart > 0) ?
349
- (indResTime.responseEnd - indResTime.fetchStart) : undefined;
350
- reqStartToResponseEndTime = (indResTime.requestStart > 0) ?
351
- (indResTime.responseEnd - indResTime.requestStart) : undefined;
352
- networkTime = (indResTime.startTime > 0) ?
353
- (indResTime.responseEnd - indResTime.fetchStart) : undefined;
354
- if (spReqDuration !== undefined && networkTime !== undefined) {
355
- networkTime = networkTime - parseInt(spReqDuration, 10);
356
- }
357
- break;
358
- }
359
- }
360
-
361
- // There are some scenarios in ODSP where we cannot cache, trees/latest will explicitly tell us when we
362
- // cannot cache using an HTTP response header.
363
- const canCache =
364
- odspResponse.headers.get("disablebrowsercachingofusercontent") !== "true";
365
- const sequenceNumber: number = snapshot.sequenceNumber ?? 0;
366
- const seqNumberFromOps = snapshot.ops && snapshot.ops.length > 0 ?
367
- snapshot.ops[0].sequenceNumber - 1 :
368
- undefined;
369
-
370
- if (!Number.isInteger(sequenceNumber)
371
- || seqNumberFromOps !== undefined && seqNumberFromOps !== sequenceNumber) {
372
- logger.sendErrorEvent({ eventName: "fetchSnapshotError", sequenceNumber, seqNumberFromOps });
373
- snapshot.sequenceNumber = undefined;
374
- } else if (canCache) {
375
- const fluidEpoch = odspResponse.headers.get("x-fluid-epoch");
376
- assert(fluidEpoch !== undefined, 0x1e6 /* "Epoch should be present in response" */);
377
- const value: ISnapshotCachedEntry = {
378
- ...snapshot,
379
- cacheEntryTime: Date.now(),
380
- };
381
- const valueWithEpoch: IVersionedValueWithEpoch = {
382
- value,
383
- fluidEpoch,
384
- version: persistedCacheValueVersion,
385
- };
386
- // eslint-disable-next-line @typescript-eslint/no-floating-promises
387
- putInCache(valueWithEpoch);
388
- }
389
-
390
- snapshotParseEvent.end();
391
-
392
- event.end({
393
- trees,
394
- blobs: snapshot.blobs?.size ?? 0,
395
- leafNodes: numBlobs,
396
- encodedBlobsSize,
397
- sequenceNumber,
398
- ops: snapshot.ops?.length ?? 0,
399
- userOps: snapshot.ops?.filter((op) => isRuntimeMessage(op)).length ?? 0,
400
- headers: Object.keys(response.requestHeaders).length !== 0 ? true : undefined,
401
- // Interval between the first fetch until the last byte of the last redirect.
402
- redirectTime,
403
- // Interval between start and finish of the domain name lookup for the resource.
404
- dnsLookupTime,
405
- // Interval to receive all (first to last) bytes form the server.
406
- responseNetworkTime,
407
- // Time to establish the connection to the server to retrieve the resource.
408
- tcpHandshakeTime,
409
- // Time from the end of the connection until the inital handshake process to secure the connection.
410
- secureConnectionTime,
411
- // Interval between the initial fetch until the last byte is received.
412
- fetchStartToResponseEndTime,
413
- // Interval between starting the request for the resource until receiving the last byte.
414
- reqStartToResponseEndTime,
415
- // Interval between starting the request for the resource until receiving the last byte but
416
- // excluding the Snaphot request duration indicated on the snapshot response header.
417
- networkTime,
418
- // Sharing link telemetry regarding sharing link redeem status and performance. Ex: FRL; dur=100,
419
- // Azure Fluid Relay service; desc=S, FRP; desc=False. Here, FRL is the duration taken for redeem,
420
- // Azure Fluid Relay service is the redeem status (S means success), and FRP is a flag to indicate
421
- // if the permission has changed.
422
- sltelemetry: odspResponse.headers.get("x-fluid-sltelemetry"),
423
- ...propsToLog,
424
- });
425
- return snapshot;
426
- },
427
- ).catch((error) => {
428
- // We hit these errors in stress tests, under load
429
- // It's useful to try one more time in such case.
430
- if (typeof error === "object" && error !== null && (error.errorType === DriverErrorType.fetchFailure ||
431
- error.errorType === OdspErrorType.fetchTimeout)) {
432
- error[getWithRetryForTokenRefreshRepeat] = true;
433
- }
434
- throw error;
435
- });
436
- });
253
+ return getWithRetryForTokenRefresh(async (tokenFetchOptions) => {
254
+ const storageToken = await storageTokenFetcher(tokenFetchOptions, "TreesLatest", true);
255
+ assert(storageToken !== null, 0x1e5 /* "Storage token should not be null" */);
256
+
257
+ const perfEvent = {
258
+ eventName: "TreesLatest",
259
+ attempts: tokenFetchOptions.refresh ? 2 : 1,
260
+ shareLinkPresent: odspResolvedUrl.shareLinkInfo?.sharingLinkToRedeem !== undefined,
261
+ isSummarizer: odspResolvedUrl.summarizer,
262
+ redeemFallbackEnabled: enableRedeemFallback,
263
+ };
264
+ if (snapshotOptions !== undefined) {
265
+ Object.entries(snapshotOptions).forEach(([key, value]) => {
266
+ if (value !== undefined) {
267
+ perfEvent[`snapshotOption_${key}`] = value;
268
+ }
269
+ });
270
+ }
271
+ // This event measures only successful cases of getLatest call (no tokens, no retries).
272
+ return PerformanceEvent.timedExecAsync(logger, perfEvent, async (event) => {
273
+ let controller: AbortController | undefined;
274
+ let fetchTimeout: ReturnType<typeof setTimeout> | undefined;
275
+ if (snapshotOptions?.timeout !== undefined) {
276
+ controller = new AbortController();
277
+ fetchTimeout = setTimeout(() => controller!.abort(), snapshotOptions.timeout);
278
+ }
279
+
280
+ const [response, fetchTime] = await measureP(async () =>
281
+ snapshotDownloader(odspResolvedUrl, storageToken, snapshotOptions, controller),
282
+ ).finally(() => {
283
+ // Clear the fetchTimeout once the response is fetched.
284
+ if (fetchTimeout !== undefined) {
285
+ clearTimeout(fetchTimeout);
286
+ fetchTimeout = undefined;
287
+ }
288
+ });
289
+
290
+ const odspResponse = response.odspResponse;
291
+ const contentType = odspResponse.headers.get("content-type");
292
+
293
+ const propsToLog: DriverErrorTelemetryProps = {
294
+ ...odspResponse.propsToLog,
295
+ contentType,
296
+ accept: response.requestHeaders.accept,
297
+ driverVersion: pkgVersion,
298
+ };
299
+
300
+ let parsedSnapshotContents: IOdspResponse<ISnapshotContentsWithProps> | undefined;
301
+ let contentTypeToRead: string | undefined;
302
+ if (contentType?.includes("application/ms-fluid")) {
303
+ contentTypeToRead = "application/ms-fluid";
304
+ } else if (contentType?.includes("application/json")) {
305
+ contentTypeToRead = "application/json";
306
+ }
307
+
308
+ let parseTime: number;
309
+ let receiveContentTime: number;
310
+ try {
311
+ switch (contentTypeToRead) {
312
+ case "application/json": {
313
+ let text: string;
314
+ [text, receiveContentTime] = await measureP(async () =>
315
+ odspResponse.content.text().catch((err) =>
316
+ // Parsing can fail and message could contain full request URI, including
317
+ // tokens, etc. So do not log error object itself.
318
+ throwOdspNetworkError(
319
+ "Error while parsing fetch response",
320
+ fetchIncorrectResponse,
321
+ odspResponse.content, // response
322
+ undefined, // response text
323
+ propsToLog,
324
+ ),
325
+ ),
326
+ );
327
+ propsToLog.bodySize = text.length;
328
+ let content: IOdspSnapshot;
329
+ [content, parseTime] = measure(() => JSON.parse(text) as IOdspSnapshot);
330
+ validateBlobsAndTrees(content);
331
+ const snapshotContents: ISnapshotContents =
332
+ convertOdspSnapshotToSnapshotTreeAndBlobs(content);
333
+ parsedSnapshotContents = {
334
+ ...odspResponse,
335
+ content: {
336
+ ...snapshotContents,
337
+ telemetryProps: {},
338
+ },
339
+ };
340
+ break;
341
+ }
342
+ case "application/ms-fluid": {
343
+ let content: ArrayBuffer;
344
+ [content, receiveContentTime] = await measureP(async () =>
345
+ odspResponse.content.arrayBuffer().catch((err) =>
346
+ // Parsing can fail and message could contain full request URI, including
347
+ // tokens, etc. So do not log error object itself.
348
+ throwOdspNetworkError(
349
+ "Error while parsing fetch response",
350
+ fetchIncorrectResponse,
351
+ odspResponse.content, // response
352
+ undefined, // response text
353
+ propsToLog,
354
+ ),
355
+ ),
356
+ );
357
+ propsToLog.bodySize = content.byteLength;
358
+ let snapshotContents: ISnapshotContentsWithProps;
359
+ [snapshotContents, parseTime] = measure(() =>
360
+ parseCompactSnapshotResponse(new Uint8Array(content), logger),
361
+ );
362
+ if (
363
+ snapshotContents.snapshotTree.trees === undefined ||
364
+ snapshotContents.snapshotTree.blobs === undefined
365
+ ) {
366
+ throw new NonRetryableError(
367
+ "Returned odsp snapshot is malformed. No trees or blobs!",
368
+ DriverErrorType.incorrectServerResponse,
369
+ propsToLog,
370
+ );
371
+ }
372
+
373
+ const props = snapshotContents.telemetryProps;
374
+ const slowTreeParseCodePaths = props.slowTreeStructureCount ?? 0;
375
+ const slowBlobParseCodePaths = props.slowBlobStructureCount ?? 0;
376
+ if (slowTreeParseCodePaths > 10 || slowBlobParseCodePaths > 10) {
377
+ logger.sendErrorEvent({
378
+ eventName: "SlowSnapshotParseCodePaths",
379
+ slowTreeStructureCount: slowTreeParseCodePaths,
380
+ slowBlobStructureCount: slowBlobParseCodePaths,
381
+ });
382
+ }
383
+ parsedSnapshotContents = { ...odspResponse, content: snapshotContents };
384
+ break;
385
+ }
386
+ default:
387
+ throw new NonRetryableError(
388
+ "Unknown snapshot content type",
389
+ DriverErrorType.incorrectServerResponse,
390
+ propsToLog,
391
+ );
392
+ }
393
+ } catch (error) {
394
+ if (isFluidError(error)) {
395
+ error.addTelemetryProperties(propsToLog);
396
+ throw error;
397
+ }
398
+ const enhancedError = wrapError(
399
+ error,
400
+ (errorMessage) =>
401
+ new NonRetryableError(
402
+ `Error parsing snapshot response: ${errorMessage}`,
403
+ DriverErrorType.genericError,
404
+ propsToLog,
405
+ ),
406
+ );
407
+ throw enhancedError;
408
+ }
409
+
410
+ assert(parsedSnapshotContents !== undefined, 0x312 /* snapshot should be parsed */);
411
+ const snapshot = parsedSnapshotContents.content;
412
+ const { trees, numBlobs, encodedBlobsSize } = evalBlobsAndTrees(snapshot);
413
+
414
+ // There are some scenarios in ODSP where we cannot cache, trees/latest will explicitly tell us when we
415
+ // cannot cache using an HTTP response header.
416
+ const canCache =
417
+ odspResponse.headers.get("disablebrowsercachingofusercontent") !== "true";
418
+ const sequenceNumber: number = snapshot.sequenceNumber ?? 0;
419
+ const seqNumberFromOps =
420
+ snapshot.ops && snapshot.ops.length > 0
421
+ ? snapshot.ops[0].sequenceNumber - 1
422
+ : undefined;
423
+
424
+ if (
425
+ !Number.isInteger(sequenceNumber) ||
426
+ (seqNumberFromOps !== undefined && seqNumberFromOps !== sequenceNumber)
427
+ ) {
428
+ logger.sendErrorEvent({
429
+ eventName: "fetchSnapshotError",
430
+ sequenceNumber,
431
+ seqNumberFromOps,
432
+ });
433
+ snapshot.sequenceNumber = undefined;
434
+ } else if (canCache) {
435
+ const fluidEpoch = odspResponse.headers.get("x-fluid-epoch");
436
+ assert(
437
+ fluidEpoch !== undefined,
438
+ 0x1e6 /* "Epoch should be present in response" */,
439
+ );
440
+ const value: ISnapshotCachedEntry = {
441
+ ...snapshot,
442
+ cacheEntryTime: Date.now(),
443
+ };
444
+ const valueWithEpoch: IVersionedValueWithEpoch = {
445
+ value,
446
+ fluidEpoch,
447
+ version: persistedCacheValueVersion,
448
+ };
449
+ // eslint-disable-next-line @typescript-eslint/no-floating-promises
450
+ putInCache(valueWithEpoch);
451
+ }
452
+
453
+ event.end({
454
+ trees,
455
+ blobs: snapshot.blobs?.size ?? 0,
456
+ leafNodes: numBlobs,
457
+ encodedBlobsSize,
458
+ sequenceNumber,
459
+ ops: snapshot.ops?.length ?? 0,
460
+ userOps: snapshot.ops?.filter((op) => isRuntimeMessage(op)).length ?? 0,
461
+ headers: Object.keys(response.requestHeaders).length !== 0 ? true : undefined,
462
+ // Measures time to make fetch call. Should be similar to
463
+ // fetchStartToResponseEndTime - receiveContentTime, i.e. it looks like it's time till first byte /
464
+ // end of response headers
465
+ fetchTime,
466
+ // time it takes client to parse payload. Same payload as in "SnapshotParse" event, here for
467
+ // easier analyzes.
468
+ parseTime,
469
+ // Time it takes to receive content (text of buffer) from Response object.
470
+ // This time likely is very closely correlated with networkTime, i.e. time it takes to receive
471
+ // actual content (starting measuring from first bite / end of response header)
472
+ receiveContentTime,
473
+ ...getW3CData(response.requestUrl, "fetch"),
474
+ // Sharing link telemetry regarding sharing link redeem status and performance. Ex: FRL; dur=100,
475
+ // Azure Fluid Relay service; desc=S, FRP; desc=False. Here, FRL is the duration taken for redeem,
476
+ // Azure Fluid Relay service is the redeem status (S means success), and FRP is a flag to indicate
477
+ // if the permission has changed.
478
+ sltelemetry: odspResponse.headers.get("x-fluid-sltelemetry"),
479
+ // All other props
480
+ ...propsToLog,
481
+ // Various perf counters and measures collected by binary parsing code:
482
+ // slowTreeStructureCount, slowBlobStructureCount, durationStructure, durationStrings,
483
+ // durationSnapshotTree, durationBlobs, etc.
484
+ ...parsedSnapshotContents.content.telemetryProps,
485
+ });
486
+ return snapshot;
487
+ }).catch((error) => {
488
+ // We hit these errors in stress tests, under load
489
+ // It's useful to try one more time in such case.
490
+ if (
491
+ typeof error === "object" &&
492
+ error !== null &&
493
+ (error.errorType === DriverErrorType.fetchFailure ||
494
+ error.errorType === OdspErrorType.fetchTimeout)
495
+ ) {
496
+ error[getWithRetryForTokenRefreshRepeat] = true;
497
+ }
498
+ throw error;
499
+ });
500
+ });
437
501
  }
438
502
 
439
503
  export interface ISnapshotRequestAndResponseOptions {
440
- odspResponse: IOdspResponse<Response>;
441
- requestUrl: string;
442
- requestHeaders: { [index: string]: any; };
504
+ odspResponse: IOdspResponse<Response>;
505
+ requestUrl: string;
506
+ requestHeaders: { [index: string]: any };
443
507
  }
444
508
 
445
509
  function getFormBodyAndHeaders(
446
- odspResolvedUrl: IOdspResolvedUrl,
447
- storageToken: string,
448
- snapshotOptions: ISnapshotOptions | undefined,
449
- headers?: { [index: string]: string; },
510
+ odspResolvedUrl: IOdspResolvedUrl,
511
+ storageToken: string,
512
+ headers?: { [index: string]: string },
450
513
  ) {
451
- const formBoundary = uuid();
452
- const formParams: string[] = [];
453
- formParams.push(`--${formBoundary}`);
454
- formParams.push(`Authorization: Bearer ${storageToken}`);
455
- formParams.push(`X-HTTP-Method-Override: GET`);
456
- if (snapshotOptions !== undefined) {
457
- Object.entries(snapshotOptions).forEach(([key, value]) => {
458
- if (value !== undefined) {
459
- formParams.push(`${key}: ${value}`);
460
- }
461
- });
462
- }
463
- if (headers !== undefined) {
464
- Object.entries(headers).forEach(([key, value]) => {
465
- if (value !== undefined) {
466
- formParams.push(`${key}: ${value}`);
467
- }
468
- });
469
- }
470
- if (odspResolvedUrl.shareLinkInfo?.sharingLinkToRedeem) {
471
- formParams.push(`sl: ${odspResolvedUrl.shareLinkInfo?.sharingLinkToRedeem}`);
472
- }
473
- formParams.push(`_post: 1`);
474
- formParams.push(`\r\n--${formBoundary}--`);
475
- const postBody = formParams.join("\r\n");
476
- const header: { [index: string]: any; } = {
477
- "Content-Type": `multipart/form-data;boundary=${formBoundary}`,
478
- };
479
- return { body: postBody, headers: header };
514
+ const formBoundary = uuid();
515
+ const formParams: string[] = [];
516
+ formParams.push(`--${formBoundary}`);
517
+ formParams.push(`Authorization: Bearer ${storageToken}`);
518
+ formParams.push(`X-HTTP-Method-Override: GET`);
519
+
520
+ if (headers !== undefined) {
521
+ Object.entries(headers).forEach(([key, value]) => {
522
+ if (value !== undefined) {
523
+ formParams.push(`${key}: ${value}`);
524
+ }
525
+ });
526
+ }
527
+ if (odspResolvedUrl.shareLinkInfo?.sharingLinkToRedeem) {
528
+ formParams.push(`sl: ${odspResolvedUrl.shareLinkInfo?.sharingLinkToRedeem}`);
529
+ }
530
+ formParams.push(`_post: 1`);
531
+ formParams.push(`\r\n--${formBoundary}--`);
532
+ const postBody = formParams.join("\r\n");
533
+ const header: { [index: string]: any } = {
534
+ "Content-Type": `multipart/form-data;boundary=${formBoundary}`,
535
+ };
536
+ return { body: postBody, headers: header };
480
537
  }
481
538
 
482
- function evalBlobsAndTrees(snapshot: ISnapshotContents) {
483
- const trees = countTreesInSnapshotTree(snapshot.snapshotTree);
484
- const numBlobs = snapshot.blobs.size;
485
- let encodedBlobsSize = 0;
486
- for (const [_, blobContent] of snapshot.blobs) {
487
- encodedBlobsSize += blobContent.byteLength;
488
- }
489
- return { trees, numBlobs, encodedBlobsSize };
539
+ export function evalBlobsAndTrees(snapshot: ISnapshotContents) {
540
+ const trees = countTreesInSnapshotTree(snapshot.snapshotTree);
541
+ const numBlobs = snapshot.blobs.size;
542
+ let encodedBlobsSize = 0;
543
+ for (const [_, blobContent] of snapshot.blobs) {
544
+ encodedBlobsSize += blobContent.byteLength;
545
+ }
546
+ return { trees, numBlobs, encodedBlobsSize };
490
547
  }
491
548
 
492
549
  export function validateBlobsAndTrees(snapshot: IOdspSnapshot) {
493
- assert(snapshot.trees !== undefined,
494
- 0x200 /* "Returned odsp snapshot is malformed. No trees!" */);
495
- assert(snapshot.blobs !== undefined,
496
- 0x201 /* "Returned odsp snapshot is malformed. No blobs!" */);
550
+ assert(
551
+ snapshot.trees !== undefined,
552
+ 0x200 /* "Returned odsp snapshot is malformed. No trees!" */,
553
+ );
554
+ assert(
555
+ snapshot.blobs !== undefined,
556
+ 0x201 /* "Returned odsp snapshot is malformed. No blobs!" */,
557
+ );
497
558
  }
498
559
 
499
560
  function countTreesInSnapshotTree(snapshotTree: ISnapshotTree): number {
500
- let numTrees = 0;
501
- for (const [_, tree] of Object.entries(snapshotTree.trees)) {
502
- numTrees += 1;
503
- numTrees += countTreesInSnapshotTree(tree);
504
- }
505
- return numTrees;
561
+ let numTrees = 0;
562
+ for (const [_, tree] of Object.entries(snapshotTree.trees)) {
563
+ numTrees += 1;
564
+ numTrees += countTreesInSnapshotTree(tree);
565
+ }
566
+ return numTrees;
506
567
  }
507
568
 
508
569
  /**
@@ -517,78 +578,92 @@ function countTreesInSnapshotTree(snapshotTree: ISnapshotTree): number {
517
578
  * @returns fetched snapshot.
518
579
  */
519
580
  export async function downloadSnapshot(
520
- odspResolvedUrl: IOdspResolvedUrl,
521
- storageToken: string,
522
- logger: ITelemetryLogger,
523
- snapshotOptions: ISnapshotOptions | undefined,
524
- snapshotFormatFetchType?: SnapshotFormatSupportType,
525
- controller?: AbortController,
526
- epochTracker?: EpochTracker,
527
- scenarioName?: string,
581
+ odspResolvedUrl: IOdspResolvedUrl,
582
+ storageToken: string,
583
+ logger: ITelemetryLoggerExt,
584
+ snapshotOptions: ISnapshotOptions | undefined,
585
+ snapshotFormatFetchType?: SnapshotFormatSupportType,
586
+ controller?: AbortController,
587
+ epochTracker?: EpochTracker,
588
+ scenarioName?: string,
528
589
  ): Promise<ISnapshotRequestAndResponseOptions> {
529
- // back-compat: This block to be removed with #8784 when we only consume/consider odsp resolvers that are >= 0.51
530
- const sharingLinkToRedeem = (odspResolvedUrl as any).sharingLinkToRedeem;
531
- if (sharingLinkToRedeem) {
532
- odspResolvedUrl.shareLinkInfo = { ...odspResolvedUrl.shareLinkInfo, sharingLinkToRedeem };
533
- }
534
-
535
- const snapshotUrl = odspResolvedUrl.endpoints.snapshotStorageUrl;
536
- const url = `${snapshotUrl}/trees/latest?ump=1`;
537
- // The location of file can move on Spo in which case server returns 308(Permanent Redirect) error.
538
- // Adding below header will make VROOM API return 404 instead of 308 and browser can intercept it.
539
- // This error thrown by server will contain the new redirect location. Look at the 404 error parsing
540
- // for futher reference here: \packages\utils\odsp-doclib-utils\src\odspErrorUtils.ts
541
- const header = { prefer: "manualredirect" };
542
- const { body, headers } = getFormBodyAndHeaders(
543
- odspResolvedUrl, storageToken, snapshotOptions, header);
544
- const fetchOptions = {
545
- body,
546
- headers,
547
- signal: controller?.signal,
548
- method: "POST",
549
- };
550
- // Decide what snapshot format to fetch as per the feature gate.
551
- switch (snapshotFormatFetchType) {
552
- case SnapshotFormatSupportType.JsonAndBinary:
553
- headers.accept = `application/json, application/ms-fluid; v=${currentReadVersion}`;
554
- break;
555
- case SnapshotFormatSupportType.Binary:
556
- headers.accept = `application/ms-fluid; v=${currentReadVersion}`;
557
- break;
558
- default:
559
- headers.accept = "application/json";
560
- }
561
-
562
- const odspResponse = await (epochTracker?.fetch(url, fetchOptions, "treesLatest", true, scenarioName) ??
563
- fetchHelper(url, fetchOptions));
564
-
565
- return {
566
- odspResponse,
567
- requestHeaders: headers,
568
- requestUrl: url,
569
- };
590
+ // back-compat: This block to be removed with #8784 when we only consume/consider odsp resolvers that are >= 0.51
591
+ const sharingLinkToRedeem = (odspResolvedUrl as any).sharingLinkToRedeem;
592
+ if (sharingLinkToRedeem) {
593
+ odspResolvedUrl.shareLinkInfo = { ...odspResolvedUrl.shareLinkInfo, sharingLinkToRedeem };
594
+ }
595
+
596
+ const snapshotUrl = odspResolvedUrl.endpoints.snapshotStorageUrl;
597
+
598
+ const queryParams = { ump: 1 };
599
+ if (snapshotOptions !== undefined) {
600
+ Object.entries(snapshotOptions).forEach(([key, value]) => {
601
+ // Exclude "timeout" from query string
602
+ if (value !== undefined && key !== "timeout") {
603
+ queryParams[key] = value;
604
+ }
605
+ });
606
+ }
607
+
608
+ const queryString = getQueryString(queryParams);
609
+ const url = `${snapshotUrl}/trees/latest${queryString}`;
610
+ // The location of file can move on Spo in which case server returns 308(Permanent Redirect) error.
611
+ // Adding below header will make VROOM API return 404 instead of 308 and browser can intercept it.
612
+ // This error thrown by server will contain the new redirect location. Look at the 404 error parsing
613
+ // for futher reference here: \packages\utils\odsp-doclib-utils\src\odspErrorUtils.ts
614
+ const header = { prefer: "manualredirect" };
615
+ const { body, headers } = getFormBodyAndHeaders(odspResolvedUrl, storageToken, header);
616
+ const fetchOptions = {
617
+ body,
618
+ headers,
619
+ signal: controller?.signal,
620
+ method: "POST",
621
+ };
622
+ // Decide what snapshot format to fetch as per the feature gate.
623
+ switch (snapshotFormatFetchType) {
624
+ case SnapshotFormatSupportType.Binary:
625
+ headers.accept = `application/ms-fluid; v=${currentReadVersion}`;
626
+ break;
627
+ default:
628
+ // By default ask both versions and let the server decide the format.
629
+ headers.accept = `application/json, application/ms-fluid; v=${currentReadVersion}`;
630
+ }
631
+
632
+ const odspResponse = await (epochTracker?.fetch(
633
+ url,
634
+ fetchOptions,
635
+ "treesLatest",
636
+ true,
637
+ scenarioName,
638
+ ) ?? fetchHelper(url, fetchOptions));
639
+
640
+ return {
641
+ odspResponse,
642
+ requestHeaders: headers,
643
+ requestUrl: url,
644
+ };
570
645
  }
571
646
 
572
647
  function isRedeemSharingLinkError(odspResolvedUrl: IOdspResolvedUrl, error: any) {
573
- if (odspResolvedUrl.shareLinkInfo?.sharingLinkToRedeem !== undefined
574
- && (typeof error === "object" && error !== null)
575
- && (error.errorType === DriverErrorType.authorizationError
576
- || error.errorType === DriverErrorType.fileNotFoundOrAccessDeniedError)) {
577
- return true;
578
- }
579
- return false;
648
+ if (
649
+ odspResolvedUrl.shareLinkInfo?.sharingLinkToRedeem !== undefined &&
650
+ typeof error === "object" &&
651
+ error !== null &&
652
+ (error.errorType === DriverErrorType.authorizationError ||
653
+ error.errorType === DriverErrorType.fileNotFoundOrAccessDeniedError)
654
+ ) {
655
+ return true;
656
+ }
657
+ return false;
580
658
  }
581
659
 
582
660
  function getEncodedShareUrl(url: string): string {
583
- /**
584
- * Encode the url to accepted format by Sharepoint
585
- * https://docs.microsoft.com/en-us/onedrive/developer/rest-api/api/shares_get
586
- */
587
- let encodedUrl = fromUtf8ToBase64(encodeURI(url));
588
- encodedUrl = encodedUrl
589
- .replace(/=+$/g, "")
590
- .replace(/\//g, "_")
591
- .replace(/\+/g, "-");
592
- encodedUrl = "u!".concat(encodedUrl);
593
- return encodedUrl;
661
+ /**
662
+ * Encode the url to accepted format by Sharepoint
663
+ * https://docs.microsoft.com/en-us/onedrive/developer/rest-api/api/shares_get
664
+ */
665
+ let encodedUrl = fromUtf8ToBase64(encodeURI(url));
666
+ encodedUrl = encodedUrl.replace(/=+$/g, "").replace(/\//g, "_").replace(/\+/g, "-");
667
+ encodedUrl = "u!".concat(encodedUrl);
668
+ return encodedUrl;
594
669
  }