@fluidframework/odsp-driver 2.0.0-dev-rc.1.0.0.232845 → 2.0.0-dev-rc.2.0.0.246488

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 (617) hide show
  1. package/.eslintrc.cjs +18 -3
  2. package/{.mocharc.js → .mocharc.cjs} +1 -1
  3. package/CHANGELOG.md +44 -0
  4. package/{api-extractor-esm.json → api-extractor-cjs.json} +5 -1
  5. package/api-extractor-lint.json +1 -1
  6. package/api-extractor.json +1 -1
  7. package/api-report/odsp-driver.api.md +11 -12
  8. package/dist/ReadBufferUtils.d.ts.map +1 -1
  9. package/dist/ReadBufferUtils.js.map +1 -1
  10. package/dist/WriteBufferUtils.d.ts +1 -1
  11. package/dist/WriteBufferUtils.d.ts.map +1 -1
  12. package/dist/WriteBufferUtils.js +12 -12
  13. package/dist/WriteBufferUtils.js.map +1 -1
  14. package/dist/checkUrl.d.ts.map +1 -1
  15. package/dist/checkUrl.js +5 -3
  16. package/dist/checkUrl.js.map +1 -1
  17. package/dist/compactSnapshotParser.d.ts.map +1 -1
  18. package/dist/compactSnapshotParser.js +87 -69
  19. package/dist/compactSnapshotParser.js.map +1 -1
  20. package/dist/compactSnapshotWriter.d.ts.map +1 -1
  21. package/dist/compactSnapshotWriter.js +25 -19
  22. package/dist/compactSnapshotWriter.js.map +1 -1
  23. package/dist/contracts.d.ts +10 -4
  24. package/dist/contracts.d.ts.map +1 -1
  25. package/dist/contracts.js.map +1 -1
  26. package/dist/createFile.d.ts +3 -3
  27. package/dist/createFile.d.ts.map +1 -1
  28. package/dist/createFile.js +30 -27
  29. package/dist/createFile.js.map +1 -1
  30. package/dist/createNewContainerOnExistingFile.d.ts +2 -2
  31. package/dist/createNewContainerOnExistingFile.d.ts.map +1 -1
  32. package/dist/createNewContainerOnExistingFile.js +14 -14
  33. package/dist/createNewContainerOnExistingFile.js.map +1 -1
  34. package/dist/createNewModule.d.ts +2 -2
  35. package/dist/createNewModule.d.ts.map +1 -1
  36. package/dist/createNewModule.js +4 -4
  37. package/dist/createNewModule.js.map +1 -1
  38. package/dist/createNewUtils.d.ts +2 -2
  39. package/dist/createNewUtils.d.ts.map +1 -1
  40. package/dist/createNewUtils.js +12 -8
  41. package/dist/createNewUtils.js.map +1 -1
  42. package/dist/createOdspCreateContainerRequest.d.ts.map +1 -1
  43. package/dist/createOdspCreateContainerRequest.js +6 -2
  44. package/dist/createOdspCreateContainerRequest.js.map +1 -1
  45. package/dist/createOdspUrl.d.ts +1 -1
  46. package/dist/createOdspUrl.d.ts.map +1 -1
  47. package/dist/createOdspUrl.js.map +1 -1
  48. package/dist/epochTracker.d.ts +10 -9
  49. package/dist/epochTracker.d.ts.map +1 -1
  50. package/dist/epochTracker.js +66 -43
  51. package/dist/epochTracker.js.map +1 -1
  52. package/dist/fetchSnapshot.d.ts +11 -8
  53. package/dist/fetchSnapshot.d.ts.map +1 -1
  54. package/dist/fetchSnapshot.js +79 -58
  55. package/dist/fetchSnapshot.js.map +1 -1
  56. package/dist/getFileLink.d.ts.map +1 -1
  57. package/dist/getFileLink.js +24 -17
  58. package/dist/getFileLink.js.map +1 -1
  59. package/dist/getQueryString.d.ts.map +1 -1
  60. package/dist/getQueryString.js +6 -0
  61. package/dist/getQueryString.js.map +1 -1
  62. package/dist/index.d.ts +19 -19
  63. package/dist/index.d.ts.map +1 -1
  64. package/dist/index.js +44 -44
  65. package/dist/index.js.map +1 -1
  66. package/dist/localOdspDriver/localOdspDocumentService.d.ts +1 -1
  67. package/dist/localOdspDriver/localOdspDocumentService.d.ts.map +1 -1
  68. package/dist/localOdspDriver/localOdspDocumentService.js +5 -5
  69. package/dist/localOdspDriver/localOdspDocumentService.js.map +1 -1
  70. package/dist/localOdspDriver/localOdspDocumentServiceFactory.d.ts +8 -6
  71. package/dist/localOdspDriver/localOdspDocumentServiceFactory.d.ts.map +1 -1
  72. package/dist/localOdspDriver/localOdspDocumentServiceFactory.js +10 -9
  73. package/dist/localOdspDriver/localOdspDocumentServiceFactory.js.map +1 -1
  74. package/dist/localOdspDriver/localOdspDocumentStorageManager.d.ts +1 -1
  75. package/dist/localOdspDriver/localOdspDocumentStorageManager.d.ts.map +1 -1
  76. package/dist/localOdspDriver/localOdspDocumentStorageManager.js +6 -6
  77. package/dist/localOdspDriver/localOdspDocumentStorageManager.js.map +1 -1
  78. package/dist/odsp-driver-alpha.d.ts +27 -12
  79. package/dist/odsp-driver-beta.d.ts +1 -2
  80. package/dist/odsp-driver-public.d.ts +1 -2
  81. package/dist/odsp-driver-untrimmed.d.ts +29 -12
  82. package/dist/odspCache.d.ts +3 -3
  83. package/dist/odspCache.d.ts.map +1 -1
  84. package/dist/odspCache.js +3 -4
  85. package/dist/odspCache.js.map +1 -1
  86. package/dist/odspDelayLoadedDeltaStream.d.ts +7 -5
  87. package/dist/odspDelayLoadedDeltaStream.d.ts.map +1 -1
  88. package/dist/odspDelayLoadedDeltaStream.js +41 -28
  89. package/dist/odspDelayLoadedDeltaStream.js.map +1 -1
  90. package/dist/odspDeltaStorageService.d.ts +7 -7
  91. package/dist/odspDeltaStorageService.d.ts.map +1 -1
  92. package/dist/odspDeltaStorageService.js +5 -5
  93. package/dist/odspDeltaStorageService.js.map +1 -1
  94. package/dist/odspDocumentDeltaConnection.d.ts +1 -1
  95. package/dist/odspDocumentDeltaConnection.d.ts.map +1 -1
  96. package/dist/odspDocumentDeltaConnection.js +41 -23
  97. package/dist/odspDocumentDeltaConnection.js.map +1 -1
  98. package/dist/odspDocumentService.d.ts +6 -4
  99. package/dist/odspDocumentService.d.ts.map +1 -1
  100. package/dist/odspDocumentService.js +19 -16
  101. package/dist/odspDocumentService.js.map +1 -1
  102. package/dist/odspDocumentServiceFactory.d.ts +6 -1
  103. package/dist/odspDocumentServiceFactory.d.ts.map +1 -1
  104. package/dist/odspDocumentServiceFactory.js +9 -4
  105. package/dist/odspDocumentServiceFactory.js.map +1 -1
  106. package/dist/odspDocumentServiceFactoryCore.d.ts +4 -4
  107. package/dist/odspDocumentServiceFactoryCore.d.ts.map +1 -1
  108. package/dist/odspDocumentServiceFactoryCore.js +26 -22
  109. package/dist/odspDocumentServiceFactoryCore.js.map +1 -1
  110. package/dist/odspDocumentServiceFactoryWithCodeSplit.d.ts +1 -1
  111. package/dist/odspDocumentServiceFactoryWithCodeSplit.d.ts.map +1 -1
  112. package/dist/odspDocumentServiceFactoryWithCodeSplit.js +2 -2
  113. package/dist/odspDocumentServiceFactoryWithCodeSplit.js.map +1 -1
  114. package/dist/odspDocumentStorageManager.d.ts +15 -9
  115. package/dist/odspDocumentStorageManager.d.ts.map +1 -1
  116. package/dist/odspDocumentStorageManager.js +219 -181
  117. package/dist/odspDocumentStorageManager.js.map +1 -1
  118. package/dist/odspDocumentStorageServiceBase.d.ts +2 -4
  119. package/dist/odspDocumentStorageServiceBase.d.ts.map +1 -1
  120. package/dist/odspDocumentStorageServiceBase.js +32 -29
  121. package/dist/odspDocumentStorageServiceBase.js.map +1 -1
  122. package/dist/odspDriverUrlResolver.d.ts +5 -1
  123. package/dist/odspDriverUrlResolver.d.ts.map +1 -1
  124. package/dist/odspDriverUrlResolver.js +27 -24
  125. package/dist/odspDriverUrlResolver.js.map +1 -1
  126. package/dist/odspDriverUrlResolverForShareLink.d.ts +17 -6
  127. package/dist/odspDriverUrlResolverForShareLink.d.ts.map +1 -1
  128. package/dist/odspDriverUrlResolverForShareLink.js +49 -39
  129. package/dist/odspDriverUrlResolverForShareLink.js.map +1 -1
  130. package/dist/odspError.d.ts +1 -1
  131. package/dist/odspError.d.ts.map +1 -1
  132. package/dist/odspError.js +5 -5
  133. package/dist/odspError.js.map +1 -1
  134. package/dist/odspFluidFileLink.d.ts +1 -1
  135. package/dist/odspFluidFileLink.d.ts.map +1 -1
  136. package/dist/odspFluidFileLink.js +2 -2
  137. package/dist/odspFluidFileLink.js.map +1 -1
  138. package/dist/odspLocationRedirection.js +2 -2
  139. package/dist/odspLocationRedirection.js.map +1 -1
  140. package/dist/odspPublicUtils.d.ts +3 -0
  141. package/dist/odspPublicUtils.d.ts.map +1 -1
  142. package/dist/odspPublicUtils.js +3 -0
  143. package/dist/odspPublicUtils.js.map +1 -1
  144. package/dist/odspSnapshotParser.d.ts +1 -1
  145. package/dist/odspSnapshotParser.d.ts.map +1 -1
  146. package/dist/odspSnapshotParser.js +3 -2
  147. package/dist/odspSnapshotParser.js.map +1 -1
  148. package/dist/odspSummaryUploadManager.d.ts +1 -1
  149. package/dist/odspSummaryUploadManager.d.ts.map +1 -1
  150. package/dist/odspSummaryUploadManager.js +9 -6
  151. package/dist/odspSummaryUploadManager.js.map +1 -1
  152. package/dist/odspUrlHelper.d.ts.map +1 -1
  153. package/dist/odspUrlHelper.js +1 -2
  154. package/dist/odspUrlHelper.js.map +1 -1
  155. package/dist/odspUtils.d.ts +19 -7
  156. package/dist/odspUtils.d.ts.map +1 -1
  157. package/dist/odspUtils.js +61 -31
  158. package/dist/odspUtils.js.map +1 -1
  159. package/dist/opsCaching.d.ts +1 -1
  160. package/dist/opsCaching.d.ts.map +1 -1
  161. package/dist/opsCaching.js +2 -1
  162. package/dist/opsCaching.js.map +1 -1
  163. package/dist/package.json +3 -0
  164. package/dist/packageVersion.d.ts +1 -1
  165. package/dist/packageVersion.js +1 -1
  166. package/dist/packageVersion.js.map +1 -1
  167. package/dist/prefetchLatestSnapshot.d.ts +2 -2
  168. package/dist/prefetchLatestSnapshot.d.ts.map +1 -1
  169. package/dist/prefetchLatestSnapshot.js +17 -12
  170. package/dist/prefetchLatestSnapshot.js.map +1 -1
  171. package/dist/retryErrorsStorageAdapter.d.ts +0 -1
  172. package/dist/retryErrorsStorageAdapter.d.ts.map +1 -1
  173. package/dist/retryErrorsStorageAdapter.js +2 -5
  174. package/dist/retryErrorsStorageAdapter.js.map +1 -1
  175. package/dist/retryUtils.d.ts.map +1 -1
  176. package/dist/retryUtils.js +6 -2
  177. package/dist/retryUtils.js.map +1 -1
  178. package/dist/socketModule.d.ts.map +1 -1
  179. package/dist/socketModule.js +2 -0
  180. package/dist/socketModule.js.map +1 -1
  181. package/dist/tsdoc-metadata.json +1 -1
  182. package/dist/vroom.d.ts +2 -2
  183. package/dist/vroom.d.ts.map +1 -1
  184. package/dist/vroom.js +5 -5
  185. package/dist/vroom.js.map +1 -1
  186. package/dist/zipItDataRepresentationUtils.d.ts +1 -1
  187. package/dist/zipItDataRepresentationUtils.d.ts.map +1 -1
  188. package/dist/zipItDataRepresentationUtils.js +15 -11
  189. package/dist/zipItDataRepresentationUtils.js.map +1 -1
  190. package/lib/{ReadBufferUtils.d.mts → ReadBufferUtils.d.ts} +1 -1
  191. package/lib/ReadBufferUtils.d.ts.map +1 -0
  192. package/lib/{ReadBufferUtils.mjs → ReadBufferUtils.js} +1 -1
  193. package/lib/ReadBufferUtils.js.map +1 -0
  194. package/lib/{WriteBufferUtils.d.mts → WriteBufferUtils.d.ts} +2 -2
  195. package/lib/WriteBufferUtils.d.ts.map +1 -0
  196. package/lib/{WriteBufferUtils.mjs → WriteBufferUtils.js} +2 -2
  197. package/lib/WriteBufferUtils.js.map +1 -0
  198. package/lib/{checkUrl.d.mts → checkUrl.d.ts} +1 -1
  199. package/lib/checkUrl.d.ts.map +1 -0
  200. package/lib/{checkUrl.mjs → checkUrl.js} +5 -3
  201. package/lib/checkUrl.js.map +1 -0
  202. package/lib/{compactSnapshotParser.d.mts → compactSnapshotParser.d.ts} +1 -1
  203. package/lib/compactSnapshotParser.d.ts.map +1 -0
  204. package/lib/{compactSnapshotParser.mjs → compactSnapshotParser.js} +61 -43
  205. package/lib/compactSnapshotParser.js.map +1 -0
  206. package/lib/{compactSnapshotWriter.d.mts → compactSnapshotWriter.d.ts} +1 -1
  207. package/lib/compactSnapshotWriter.d.ts.map +1 -0
  208. package/lib/{compactSnapshotWriter.mjs → compactSnapshotWriter.js} +13 -7
  209. package/lib/compactSnapshotWriter.js.map +1 -0
  210. package/lib/{constants.d.mts → constants.d.ts} +1 -1
  211. package/lib/constants.d.ts.map +1 -0
  212. package/lib/{constants.mjs → constants.js} +1 -1
  213. package/lib/constants.js.map +1 -0
  214. package/lib/{contracts.d.mts → contracts.d.ts} +11 -5
  215. package/lib/contracts.d.ts.map +1 -0
  216. package/lib/{contracts.mjs → contracts.js} +1 -1
  217. package/lib/contracts.js.map +1 -0
  218. package/lib/{contractsPublic.d.mts → contractsPublic.d.ts} +1 -1
  219. package/lib/contractsPublic.d.ts.map +1 -0
  220. package/lib/{contractsPublic.mjs → contractsPublic.js} +1 -1
  221. package/lib/contractsPublic.js.map +1 -0
  222. package/lib/{createFile.d.mts → createFile.d.ts} +4 -4
  223. package/lib/createFile.d.ts.map +1 -0
  224. package/lib/{createFile.mjs → createFile.js} +15 -12
  225. package/lib/createFile.js.map +1 -0
  226. package/lib/{createNewContainerOnExistingFile.d.mts → createNewContainerOnExistingFile.d.ts} +3 -3
  227. package/lib/createNewContainerOnExistingFile.d.ts.map +1 -0
  228. package/lib/{createNewContainerOnExistingFile.mjs → createNewContainerOnExistingFile.js} +7 -7
  229. package/lib/createNewContainerOnExistingFile.js.map +1 -0
  230. package/lib/{createNewModule.mjs → createNewModule.d.ts} +3 -3
  231. package/lib/createNewModule.d.ts.map +1 -0
  232. package/lib/{createNewModule.d.mts → createNewModule.js} +3 -3
  233. package/lib/createNewModule.js.map +1 -0
  234. package/lib/{createNewUtils.d.mts → createNewUtils.d.ts} +3 -3
  235. package/lib/createNewUtils.d.ts.map +1 -0
  236. package/lib/{createNewUtils.mjs → createNewUtils.js} +9 -5
  237. package/lib/createNewUtils.js.map +1 -0
  238. package/lib/{createOdspCreateContainerRequest.d.mts → createOdspCreateContainerRequest.d.ts} +5 -1
  239. package/lib/createOdspCreateContainerRequest.d.ts.map +1 -0
  240. package/lib/{createOdspCreateContainerRequest.mjs → createOdspCreateContainerRequest.js} +6 -2
  241. package/lib/createOdspCreateContainerRequest.js.map +1 -0
  242. package/lib/{createOdspUrl.d.mts → createOdspUrl.d.ts} +2 -2
  243. package/lib/createOdspUrl.d.ts.map +1 -0
  244. package/lib/{createOdspUrl.mjs → createOdspUrl.js} +1 -1
  245. package/lib/createOdspUrl.js.map +1 -0
  246. package/lib/{epochTracker.d.mts → epochTracker.d.ts} +11 -10
  247. package/lib/epochTracker.d.ts.map +1 -0
  248. package/lib/{epochTracker.mjs → epochTracker.js} +56 -33
  249. package/lib/epochTracker.js.map +1 -0
  250. package/lib/{fetch.d.mts → fetch.d.ts} +1 -1
  251. package/lib/fetch.d.ts.map +1 -0
  252. package/lib/{fetch.mjs → fetch.js} +1 -1
  253. package/lib/fetch.js.map +1 -0
  254. package/lib/{fetchSnapshot.d.mts → fetchSnapshot.d.ts} +12 -9
  255. package/lib/fetchSnapshot.d.ts.map +1 -0
  256. package/lib/{fetchSnapshot.mjs → fetchSnapshot.js} +61 -40
  257. package/lib/fetchSnapshot.js.map +1 -0
  258. package/lib/{getFileLink.d.mts → getFileLink.d.ts} +1 -1
  259. package/lib/getFileLink.d.ts.map +1 -0
  260. package/lib/{getFileLink.mjs → getFileLink.js} +14 -7
  261. package/lib/getFileLink.js.map +1 -0
  262. package/lib/{getQueryString.d.mts → getQueryString.d.ts} +5 -1
  263. package/lib/getQueryString.d.ts.map +1 -0
  264. package/lib/{getQueryString.mjs → getQueryString.js} +7 -1
  265. package/lib/getQueryString.js.map +1 -0
  266. package/lib/{getUrlAndHeadersWithAuth.d.mts → getUrlAndHeadersWithAuth.d.ts} +1 -1
  267. package/lib/getUrlAndHeadersWithAuth.d.ts.map +1 -0
  268. package/lib/{getUrlAndHeadersWithAuth.mjs → getUrlAndHeadersWithAuth.js} +1 -1
  269. package/lib/getUrlAndHeadersWithAuth.js.map +1 -0
  270. package/lib/{index.d.mts → index.d.ts} +20 -20
  271. package/lib/index.d.ts.map +1 -0
  272. package/lib/index.js +29 -0
  273. package/lib/index.js.map +1 -0
  274. package/lib/localOdspDriver/{localOdspDeltaStorageService.d.mts → localOdspDeltaStorageService.d.ts} +1 -1
  275. package/lib/localOdspDriver/localOdspDeltaStorageService.d.ts.map +1 -0
  276. package/lib/localOdspDriver/{localOdspDeltaStorageService.mjs → localOdspDeltaStorageService.js} +1 -1
  277. package/lib/localOdspDriver/localOdspDeltaStorageService.js.map +1 -0
  278. package/lib/localOdspDriver/{localOdspDocumentService.d.mts → localOdspDocumentService.d.ts} +2 -2
  279. package/lib/localOdspDriver/localOdspDocumentService.d.ts.map +1 -0
  280. package/lib/localOdspDriver/{localOdspDocumentService.mjs → localOdspDocumentService.js} +4 -4
  281. package/lib/localOdspDriver/localOdspDocumentService.js.map +1 -0
  282. package/lib/localOdspDriver/{localOdspDocumentServiceFactory.d.mts → localOdspDocumentServiceFactory.d.ts} +9 -7
  283. package/lib/localOdspDriver/localOdspDocumentServiceFactory.d.ts.map +1 -0
  284. package/lib/localOdspDriver/{localOdspDocumentServiceFactory.mjs → localOdspDocumentServiceFactory.js} +9 -8
  285. package/lib/localOdspDriver/localOdspDocumentServiceFactory.js.map +1 -0
  286. package/lib/localOdspDriver/{localOdspDocumentStorageManager.d.mts → localOdspDocumentStorageManager.d.ts} +2 -2
  287. package/lib/localOdspDriver/localOdspDocumentStorageManager.d.ts.map +1 -0
  288. package/lib/localOdspDriver/{localOdspDocumentStorageManager.mjs → localOdspDocumentStorageManager.js} +4 -4
  289. package/lib/localOdspDriver/localOdspDocumentStorageManager.js.map +1 -0
  290. package/lib/{odsp-driver-alpha.d.mts → odsp-driver-alpha.d.ts} +27 -12
  291. package/lib/{odsp-driver-public.d.mts → odsp-driver-beta.d.ts} +1 -2
  292. package/lib/{odsp-driver-beta.d.mts → odsp-driver-public.d.ts} +1 -2
  293. package/lib/{odsp-driver-untrimmed.d.mts → odsp-driver-untrimmed.d.ts} +29 -12
  294. package/lib/{odspCache.d.mts → odspCache.d.ts} +8 -4
  295. package/lib/odspCache.d.ts.map +1 -0
  296. package/lib/{odspCache.mjs → odspCache.js} +6 -3
  297. package/lib/odspCache.js.map +1 -0
  298. package/lib/{odspDelayLoadedDeltaStream.d.mts → odspDelayLoadedDeltaStream.d.ts} +8 -6
  299. package/lib/odspDelayLoadedDeltaStream.d.ts.map +1 -0
  300. package/lib/{odspDelayLoadedDeltaStream.mjs → odspDelayLoadedDeltaStream.js} +33 -20
  301. package/lib/odspDelayLoadedDeltaStream.js.map +1 -0
  302. package/lib/{odspDeltaStorageService.d.mts → odspDeltaStorageService.d.ts} +8 -8
  303. package/lib/odspDeltaStorageService.d.ts.map +1 -0
  304. package/lib/{odspDeltaStorageService.mjs → odspDeltaStorageService.js} +5 -5
  305. package/lib/odspDeltaStorageService.js.map +1 -0
  306. package/lib/{odspDocumentDeltaConnection.d.mts → odspDocumentDeltaConnection.d.ts} +2 -2
  307. package/lib/odspDocumentDeltaConnection.d.ts.map +1 -0
  308. package/lib/{odspDocumentDeltaConnection.mjs → odspDocumentDeltaConnection.js} +34 -16
  309. package/lib/odspDocumentDeltaConnection.js.map +1 -0
  310. package/lib/{odspDocumentService.d.mts → odspDocumentService.d.ts} +7 -5
  311. package/lib/odspDocumentService.d.ts.map +1 -0
  312. package/lib/{odspDocumentService.mjs → odspDocumentService.js} +16 -11
  313. package/lib/odspDocumentService.js.map +1 -0
  314. package/lib/{odspDocumentServiceFactory.d.mts → odspDocumentServiceFactory.d.ts} +7 -2
  315. package/lib/odspDocumentServiceFactory.d.ts.map +1 -0
  316. package/lib/{odspDocumentServiceFactory.mjs → odspDocumentServiceFactory.js} +9 -3
  317. package/lib/odspDocumentServiceFactory.js.map +1 -0
  318. package/lib/{odspDocumentServiceFactoryCore.d.mts → odspDocumentServiceFactoryCore.d.ts} +5 -5
  319. package/lib/odspDocumentServiceFactoryCore.d.ts.map +1 -0
  320. package/lib/{odspDocumentServiceFactoryCore.mjs → odspDocumentServiceFactoryCore.js} +23 -17
  321. package/lib/odspDocumentServiceFactoryCore.js.map +1 -0
  322. package/lib/{odspDocumentServiceFactoryWithCodeSplit.d.mts → odspDocumentServiceFactoryWithCodeSplit.d.ts} +2 -2
  323. package/lib/odspDocumentServiceFactoryWithCodeSplit.d.ts.map +1 -0
  324. package/lib/{odspDocumentServiceFactoryWithCodeSplit.mjs → odspDocumentServiceFactoryWithCodeSplit.js} +2 -2
  325. package/lib/odspDocumentServiceFactoryWithCodeSplit.js.map +1 -0
  326. package/lib/{odspDocumentStorageManager.d.mts → odspDocumentStorageManager.d.ts} +16 -10
  327. package/lib/odspDocumentStorageManager.d.ts.map +1 -0
  328. package/lib/{odspDocumentStorageManager.mjs → odspDocumentStorageManager.js} +207 -167
  329. package/lib/odspDocumentStorageManager.js.map +1 -0
  330. package/lib/{odspDocumentStorageServiceBase.d.mts → odspDocumentStorageServiceBase.d.ts} +3 -5
  331. package/lib/odspDocumentStorageServiceBase.d.ts.map +1 -0
  332. package/lib/{odspDocumentStorageServiceBase.mjs → odspDocumentStorageServiceBase.js} +32 -29
  333. package/lib/odspDocumentStorageServiceBase.js.map +1 -0
  334. package/lib/{odspDriverUrlResolver.d.mts → odspDriverUrlResolver.d.ts} +6 -2
  335. package/lib/odspDriverUrlResolver.d.ts.map +1 -0
  336. package/lib/{odspDriverUrlResolver.mjs → odspDriverUrlResolver.js} +24 -17
  337. package/lib/odspDriverUrlResolver.js.map +1 -0
  338. package/lib/{odspDriverUrlResolverForShareLink.d.mts → odspDriverUrlResolverForShareLink.d.ts} +18 -7
  339. package/lib/odspDriverUrlResolverForShareLink.d.ts.map +1 -0
  340. package/lib/{odspDriverUrlResolverForShareLink.mjs → odspDriverUrlResolverForShareLink.js} +41 -27
  341. package/lib/odspDriverUrlResolverForShareLink.js.map +1 -0
  342. package/lib/{odspError.d.mts → odspError.d.ts} +2 -2
  343. package/lib/odspError.d.ts.map +1 -0
  344. package/lib/{odspError.mjs → odspError.js} +4 -4
  345. package/lib/odspError.js.map +1 -0
  346. package/lib/{odspFluidFileLink.d.mts → odspFluidFileLink.d.ts} +2 -2
  347. package/lib/odspFluidFileLink.d.ts.map +1 -0
  348. package/lib/{odspFluidFileLink.mjs → odspFluidFileLink.js} +2 -2
  349. package/lib/odspFluidFileLink.js.map +1 -0
  350. package/lib/{odspLocationRedirection.d.mts → odspLocationRedirection.d.ts} +1 -1
  351. package/lib/odspLocationRedirection.d.ts.map +1 -0
  352. package/lib/{odspLocationRedirection.mjs → odspLocationRedirection.js} +2 -2
  353. package/lib/odspLocationRedirection.js.map +1 -0
  354. package/lib/{odspPublicUtils.d.mts → odspPublicUtils.d.ts} +4 -1
  355. package/lib/odspPublicUtils.d.ts.map +1 -0
  356. package/lib/{odspPublicUtils.mjs → odspPublicUtils.js} +4 -1
  357. package/lib/odspPublicUtils.js.map +1 -0
  358. package/lib/{odspSnapshotParser.d.mts → odspSnapshotParser.d.ts} +2 -2
  359. package/lib/odspSnapshotParser.d.ts.map +1 -0
  360. package/lib/{odspSnapshotParser.mjs → odspSnapshotParser.js} +4 -3
  361. package/lib/odspSnapshotParser.js.map +1 -0
  362. package/lib/{odspSummaryUploadManager.d.mts → odspSummaryUploadManager.d.ts} +2 -2
  363. package/lib/odspSummaryUploadManager.d.ts.map +1 -0
  364. package/lib/{odspSummaryUploadManager.mjs → odspSummaryUploadManager.js} +8 -5
  365. package/lib/odspSummaryUploadManager.js.map +1 -0
  366. package/lib/{odspUrlHelper.d.mts → odspUrlHelper.d.ts} +1 -1
  367. package/lib/odspUrlHelper.d.ts.map +1 -0
  368. package/lib/{odspUrlHelper.mjs → odspUrlHelper.js} +2 -3
  369. package/lib/odspUrlHelper.js.map +1 -0
  370. package/lib/{odspUtils.d.mts → odspUtils.d.ts} +20 -8
  371. package/lib/odspUtils.d.ts.map +1 -0
  372. package/lib/{odspUtils.mjs → odspUtils.js} +45 -17
  373. package/lib/odspUtils.js.map +1 -0
  374. package/lib/{opsCaching.d.mts → opsCaching.d.ts} +2 -2
  375. package/lib/opsCaching.d.ts.map +1 -0
  376. package/lib/{opsCaching.mjs → opsCaching.js} +3 -2
  377. package/lib/opsCaching.js.map +1 -0
  378. package/lib/{packageVersion.d.mts → packageVersion.d.ts} +2 -2
  379. package/lib/packageVersion.d.ts.map +1 -0
  380. package/lib/{packageVersion.mjs → packageVersion.js} +2 -2
  381. package/lib/packageVersion.js.map +1 -0
  382. package/lib/{prefetchLatestSnapshot.d.mts → prefetchLatestSnapshot.d.ts} +3 -3
  383. package/lib/prefetchLatestSnapshot.d.ts.map +1 -0
  384. package/lib/{prefetchLatestSnapshot.mjs → prefetchLatestSnapshot.js} +16 -11
  385. package/lib/prefetchLatestSnapshot.js.map +1 -0
  386. package/lib/{retryErrorsStorageAdapter.d.mts → retryErrorsStorageAdapter.d.ts} +1 -2
  387. package/lib/retryErrorsStorageAdapter.d.ts.map +1 -0
  388. package/lib/{retryErrorsStorageAdapter.mjs → retryErrorsStorageAdapter.js} +2 -5
  389. package/lib/retryErrorsStorageAdapter.js.map +1 -0
  390. package/lib/{retryUtils.d.mts → retryUtils.d.ts} +1 -1
  391. package/lib/retryUtils.d.ts.map +1 -0
  392. package/lib/{retryUtils.mjs → retryUtils.js} +6 -2
  393. package/lib/retryUtils.js.map +1 -0
  394. package/lib/{socketModule.d.mts → socketModule.d.ts} +1 -1
  395. package/lib/socketModule.d.ts.map +1 -0
  396. package/lib/{socketModule.mjs → socketModule.js} +3 -1
  397. package/lib/socketModule.js.map +1 -0
  398. package/lib/test/buildOdspShareLinkReqParams.spec.js +25 -0
  399. package/lib/test/buildOdspShareLinkReqParams.spec.js.map +1 -0
  400. package/lib/test/createNewUtilsTests.spec.js +221 -0
  401. package/lib/test/createNewUtilsTests.spec.js.map +1 -0
  402. package/lib/test/deltaStorageService.spec.js +176 -0
  403. package/lib/test/deltaStorageService.spec.js.map +1 -0
  404. package/lib/test/epochTests.spec.js +340 -0
  405. package/lib/test/epochTests.spec.js.map +1 -0
  406. package/lib/test/epochTestsWithRedemption.spec.js +119 -0
  407. package/lib/test/epochTestsWithRedemption.spec.js.map +1 -0
  408. package/lib/test/fetchSnapshot.spec.js +412 -0
  409. package/lib/test/fetchSnapshot.spec.js.map +1 -0
  410. package/lib/test/getFileLink.spec.js +62 -0
  411. package/lib/test/getFileLink.spec.js.map +1 -0
  412. package/lib/test/getUrlAndHeadersWithAuth.spec.js +66 -0
  413. package/lib/test/getUrlAndHeadersWithAuth.spec.js.map +1 -0
  414. package/lib/test/getVersions.spec.js +284 -0
  415. package/lib/test/getVersions.spec.js.map +1 -0
  416. package/lib/test/joinSessionCacheTests.spec.js +53 -0
  417. package/lib/test/joinSessionCacheTests.spec.js.map +1 -0
  418. package/lib/test/joinSessionPeriodicCall.spec.js +158 -0
  419. package/lib/test/joinSessionPeriodicCall.spec.js.map +1 -0
  420. package/lib/test/jsonSnapshotFormatTests.spec.js +107 -0
  421. package/lib/test/jsonSnapshotFormatTests.spec.js.map +1 -0
  422. package/lib/test/localOdspDriver.spec.js +177 -0
  423. package/lib/test/localOdspDriver.spec.js.map +1 -0
  424. package/lib/test/mockFetch.js +61 -0
  425. package/lib/test/mockFetch.js.map +1 -0
  426. package/lib/test/odspCreateContainer.spec.js +116 -0
  427. package/lib/test/odspCreateContainer.spec.js.map +1 -0
  428. package/lib/test/odspDriverResolverTest.spec.js +289 -0
  429. package/lib/test/odspDriverResolverTest.spec.js.map +1 -0
  430. package/lib/test/odspDriverUrlResolverForShareLink.spec.js +287 -0
  431. package/lib/test/odspDriverUrlResolverForShareLink.spec.js.map +1 -0
  432. package/lib/test/odspError.spec.js +299 -0
  433. package/lib/test/odspError.spec.js.map +1 -0
  434. package/lib/test/opsCaching.spec.js +357 -0
  435. package/lib/test/opsCaching.spec.js.map +1 -0
  436. package/lib/test/prefetchSnapshotTests.spec.js +420 -0
  437. package/lib/test/prefetchSnapshotTests.spec.js.map +1 -0
  438. package/lib/test/snapshotFormatTests.spec.js +218 -0
  439. package/lib/test/snapshotFormatTests.spec.js.map +1 -0
  440. package/lib/test/socketTests/deltaConnectionUpdateTests.spec.js +152 -0
  441. package/lib/test/socketTests/deltaConnectionUpdateTests.spec.js.map +1 -0
  442. package/lib/test/socketTests/socketMock.js +109 -0
  443. package/lib/test/socketTests/socketMock.js.map +1 -0
  444. package/lib/test/socketTests/socketTests.spec.js +256 -0
  445. package/lib/test/socketTests/socketTests.spec.js.map +1 -0
  446. package/lib/test/tokenFetch.spec.js +39 -0
  447. package/lib/test/tokenFetch.spec.js.map +1 -0
  448. package/lib/test/types/validateOdspDriverPrevious.generated.js +96 -0
  449. package/lib/test/types/validateOdspDriverPrevious.generated.js.map +1 -0
  450. package/lib/test/zipItDataRepresentationTests.spec.js +207 -0
  451. package/lib/test/zipItDataRepresentationTests.spec.js.map +1 -0
  452. package/lib/{vroom.d.mts → vroom.d.ts} +3 -3
  453. package/lib/vroom.d.ts.map +1 -0
  454. package/lib/{vroom.mjs → vroom.js} +4 -4
  455. package/lib/vroom.js.map +1 -0
  456. package/lib/{zipItDataRepresentationUtils.d.mts → zipItDataRepresentationUtils.d.ts} +2 -2
  457. package/lib/zipItDataRepresentationUtils.d.ts.map +1 -0
  458. package/lib/{zipItDataRepresentationUtils.mjs → zipItDataRepresentationUtils.js} +17 -9
  459. package/lib/zipItDataRepresentationUtils.js.map +1 -0
  460. package/package.json +90 -31
  461. package/src/ReadBufferUtils.ts +7 -7
  462. package/src/WriteBufferUtils.ts +13 -9
  463. package/src/checkUrl.ts +4 -2
  464. package/src/compactSnapshotParser.ts +87 -52
  465. package/src/compactSnapshotWriter.ts +19 -12
  466. package/src/contracts.ts +16 -4
  467. package/src/createFile.ts +16 -13
  468. package/src/createNewContainerOnExistingFile.ts +8 -8
  469. package/src/createNewModule.ts +2 -2
  470. package/src/createNewUtils.ts +19 -9
  471. package/src/createOdspCreateContainerRequest.ts +2 -1
  472. package/src/createOdspUrl.ts +1 -1
  473. package/src/epochTracker.ts +90 -55
  474. package/src/fetchSnapshot.ts +104 -47
  475. package/src/getFileLink.ts +21 -13
  476. package/src/getQueryString.ts +3 -0
  477. package/src/index.ts +27 -19
  478. package/src/localOdspDriver/localOdspDocumentService.ts +3 -3
  479. package/src/localOdspDriver/localOdspDocumentServiceFactory.ts +12 -11
  480. package/src/localOdspDriver/localOdspDocumentStorageManager.ts +5 -5
  481. package/src/odspCache.ts +13 -9
  482. package/src/odspDelayLoadedDeltaStream.ts +54 -33
  483. package/src/odspDeltaStorageService.ts +17 -16
  484. package/src/odspDocumentDeltaConnection.ts +52 -34
  485. package/src/odspDocumentService.ts +23 -20
  486. package/src/odspDocumentServiceFactory.ts +7 -2
  487. package/src/odspDocumentServiceFactoryCore.ts +25 -18
  488. package/src/odspDocumentServiceFactoryWithCodeSplit.ts +1 -1
  489. package/src/odspDocumentStorageManager.ts +276 -216
  490. package/src/odspDocumentStorageServiceBase.ts +45 -43
  491. package/src/odspDriverUrlResolver.ts +39 -24
  492. package/src/odspDriverUrlResolverForShareLink.ts +51 -31
  493. package/src/odspError.ts +4 -4
  494. package/src/odspFluidFileLink.ts +3 -3
  495. package/src/odspLocationRedirection.ts +1 -1
  496. package/src/odspPublicUtils.ts +3 -0
  497. package/src/odspSnapshotParser.ts +4 -3
  498. package/src/odspSummaryUploadManager.ts +21 -9
  499. package/src/odspUrlHelper.ts +2 -3
  500. package/src/odspUtils.ts +73 -30
  501. package/src/opsCaching.ts +13 -12
  502. package/src/packageVersion.ts +1 -1
  503. package/src/prefetchLatestSnapshot.ts +24 -15
  504. package/src/retryErrorsStorageAdapter.ts +4 -8
  505. package/src/retryUtils.ts +6 -2
  506. package/src/socketModule.ts +2 -0
  507. package/src/vroom.ts +6 -6
  508. package/src/zipItDataRepresentationUtils.ts +63 -35
  509. package/tsconfig.cjs.json +7 -0
  510. package/tsconfig.json +2 -5
  511. package/lib/ReadBufferUtils.d.mts.map +0 -1
  512. package/lib/ReadBufferUtils.mjs.map +0 -1
  513. package/lib/WriteBufferUtils.d.mts.map +0 -1
  514. package/lib/WriteBufferUtils.mjs.map +0 -1
  515. package/lib/checkUrl.d.mts.map +0 -1
  516. package/lib/checkUrl.mjs.map +0 -1
  517. package/lib/compactSnapshotParser.d.mts.map +0 -1
  518. package/lib/compactSnapshotParser.mjs.map +0 -1
  519. package/lib/compactSnapshotWriter.d.mts.map +0 -1
  520. package/lib/compactSnapshotWriter.mjs.map +0 -1
  521. package/lib/constants.d.mts.map +0 -1
  522. package/lib/constants.mjs.map +0 -1
  523. package/lib/contracts.d.mts.map +0 -1
  524. package/lib/contracts.mjs.map +0 -1
  525. package/lib/contractsPublic.d.mts.map +0 -1
  526. package/lib/contractsPublic.mjs.map +0 -1
  527. package/lib/createFile.d.mts.map +0 -1
  528. package/lib/createFile.mjs.map +0 -1
  529. package/lib/createNewContainerOnExistingFile.d.mts.map +0 -1
  530. package/lib/createNewContainerOnExistingFile.mjs.map +0 -1
  531. package/lib/createNewModule.d.mts.map +0 -1
  532. package/lib/createNewModule.mjs.map +0 -1
  533. package/lib/createNewUtils.d.mts.map +0 -1
  534. package/lib/createNewUtils.mjs.map +0 -1
  535. package/lib/createOdspCreateContainerRequest.d.mts.map +0 -1
  536. package/lib/createOdspCreateContainerRequest.mjs.map +0 -1
  537. package/lib/createOdspUrl.d.mts.map +0 -1
  538. package/lib/createOdspUrl.mjs.map +0 -1
  539. package/lib/epochTracker.d.mts.map +0 -1
  540. package/lib/epochTracker.mjs.map +0 -1
  541. package/lib/fetch.d.mts.map +0 -1
  542. package/lib/fetch.mjs.map +0 -1
  543. package/lib/fetchSnapshot.d.mts.map +0 -1
  544. package/lib/fetchSnapshot.mjs.map +0 -1
  545. package/lib/getFileLink.d.mts.map +0 -1
  546. package/lib/getFileLink.mjs.map +0 -1
  547. package/lib/getQueryString.d.mts.map +0 -1
  548. package/lib/getQueryString.mjs.map +0 -1
  549. package/lib/getUrlAndHeadersWithAuth.d.mts.map +0 -1
  550. package/lib/getUrlAndHeadersWithAuth.mjs.map +0 -1
  551. package/lib/index.d.mts.map +0 -1
  552. package/lib/index.mjs +0 -22
  553. package/lib/index.mjs.map +0 -1
  554. package/lib/localOdspDriver/localOdspDeltaStorageService.d.mts.map +0 -1
  555. package/lib/localOdspDriver/localOdspDeltaStorageService.mjs.map +0 -1
  556. package/lib/localOdspDriver/localOdspDocumentService.d.mts.map +0 -1
  557. package/lib/localOdspDriver/localOdspDocumentService.mjs.map +0 -1
  558. package/lib/localOdspDriver/localOdspDocumentServiceFactory.d.mts.map +0 -1
  559. package/lib/localOdspDriver/localOdspDocumentServiceFactory.mjs.map +0 -1
  560. package/lib/localOdspDriver/localOdspDocumentStorageManager.d.mts.map +0 -1
  561. package/lib/localOdspDriver/localOdspDocumentStorageManager.mjs.map +0 -1
  562. package/lib/odspCache.d.mts.map +0 -1
  563. package/lib/odspCache.mjs.map +0 -1
  564. package/lib/odspDelayLoadedDeltaStream.d.mts.map +0 -1
  565. package/lib/odspDelayLoadedDeltaStream.mjs.map +0 -1
  566. package/lib/odspDeltaStorageService.d.mts.map +0 -1
  567. package/lib/odspDeltaStorageService.mjs.map +0 -1
  568. package/lib/odspDocumentDeltaConnection.d.mts.map +0 -1
  569. package/lib/odspDocumentDeltaConnection.mjs.map +0 -1
  570. package/lib/odspDocumentService.d.mts.map +0 -1
  571. package/lib/odspDocumentService.mjs.map +0 -1
  572. package/lib/odspDocumentServiceFactory.d.mts.map +0 -1
  573. package/lib/odspDocumentServiceFactory.mjs.map +0 -1
  574. package/lib/odspDocumentServiceFactoryCore.d.mts.map +0 -1
  575. package/lib/odspDocumentServiceFactoryCore.mjs.map +0 -1
  576. package/lib/odspDocumentServiceFactoryWithCodeSplit.d.mts.map +0 -1
  577. package/lib/odspDocumentServiceFactoryWithCodeSplit.mjs.map +0 -1
  578. package/lib/odspDocumentStorageManager.d.mts.map +0 -1
  579. package/lib/odspDocumentStorageManager.mjs.map +0 -1
  580. package/lib/odspDocumentStorageServiceBase.d.mts.map +0 -1
  581. package/lib/odspDocumentStorageServiceBase.mjs.map +0 -1
  582. package/lib/odspDriverUrlResolver.d.mts.map +0 -1
  583. package/lib/odspDriverUrlResolver.mjs.map +0 -1
  584. package/lib/odspDriverUrlResolverForShareLink.d.mts.map +0 -1
  585. package/lib/odspDriverUrlResolverForShareLink.mjs.map +0 -1
  586. package/lib/odspError.d.mts.map +0 -1
  587. package/lib/odspError.mjs.map +0 -1
  588. package/lib/odspFluidFileLink.d.mts.map +0 -1
  589. package/lib/odspFluidFileLink.mjs.map +0 -1
  590. package/lib/odspLocationRedirection.d.mts.map +0 -1
  591. package/lib/odspLocationRedirection.mjs.map +0 -1
  592. package/lib/odspPublicUtils.d.mts.map +0 -1
  593. package/lib/odspPublicUtils.mjs.map +0 -1
  594. package/lib/odspSnapshotParser.d.mts.map +0 -1
  595. package/lib/odspSnapshotParser.mjs.map +0 -1
  596. package/lib/odspSummaryUploadManager.d.mts.map +0 -1
  597. package/lib/odspSummaryUploadManager.mjs.map +0 -1
  598. package/lib/odspUrlHelper.d.mts.map +0 -1
  599. package/lib/odspUrlHelper.mjs.map +0 -1
  600. package/lib/odspUtils.d.mts.map +0 -1
  601. package/lib/odspUtils.mjs.map +0 -1
  602. package/lib/opsCaching.d.mts.map +0 -1
  603. package/lib/opsCaching.mjs.map +0 -1
  604. package/lib/packageVersion.d.mts.map +0 -1
  605. package/lib/packageVersion.mjs.map +0 -1
  606. package/lib/prefetchLatestSnapshot.d.mts.map +0 -1
  607. package/lib/prefetchLatestSnapshot.mjs.map +0 -1
  608. package/lib/retryErrorsStorageAdapter.d.mts.map +0 -1
  609. package/lib/retryErrorsStorageAdapter.mjs.map +0 -1
  610. package/lib/retryUtils.d.mts.map +0 -1
  611. package/lib/retryUtils.mjs.map +0 -1
  612. package/lib/socketModule.d.mts.map +0 -1
  613. package/lib/socketModule.mjs.map +0 -1
  614. package/lib/vroom.d.mts.map +0 -1
  615. package/lib/vroom.mjs.map +0 -1
  616. package/lib/zipItDataRepresentationUtils.d.mts.map +0 -1
  617. package/lib/zipItDataRepresentationUtils.mjs.map +0 -1
@@ -0,0 +1,420 @@
1
+ /*!
2
+ * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
+ * Licensed under the MIT License.
4
+ */
5
+ /* eslint-disable @typescript-eslint/no-floating-promises */
6
+ import { strict as assert } from "node:assert";
7
+ import { getKeyForCacheEntry, } from "@fluidframework/odsp-driver-definitions";
8
+ import { MockLogger } from "@fluidframework/telemetry-utils";
9
+ import { FetchSource } from "@fluidframework/driver-definitions";
10
+ import { stringToBuffer } from "@fluid-internal/client-utils";
11
+ import { persistedCacheValueVersion, } from "../contracts.js";
12
+ import { LocalPersistentCache } from "../odspCache.js";
13
+ import { createCacheSnapshotKey } from "../odspUtils.js";
14
+ import { createOdspUrl } from "../createOdspUrl.js";
15
+ import { getHashedDocumentId } from "../odspPublicUtils.js";
16
+ import { OdspDriverUrlResolver } from "../odspDriverUrlResolver.js";
17
+ import { prefetchLatestSnapshot } from "../prefetchLatestSnapshot.js";
18
+ import { OdspDocumentServiceFactory } from "../odspDocumentServiceFactory.js";
19
+ import { convertToCompactSnapshot } from "../compactSnapshotWriter.js";
20
+ import { mockFetchSingle, notFound, createResponse } from "./mockFetch.js";
21
+ const createUtLocalCache = () => new LocalPersistentCache();
22
+ describe("Tests for prefetching snapshot", () => {
23
+ const siteUrl = "https://microsoft.sharepoint-df.com/siteUrl";
24
+ const driveId = "driveId";
25
+ const itemId = "itemId";
26
+ const filePath = "path";
27
+ let localCache;
28
+ let hashedDocumentId;
29
+ let service;
30
+ let resolved;
31
+ let mockLogger;
32
+ let snapshotPrefetchCacheKey;
33
+ const newFileParams = {
34
+ type: "New",
35
+ driveId,
36
+ siteUrl,
37
+ filePath,
38
+ filename: "filename",
39
+ };
40
+ function GetHostStoragePolicyInternal(isSummarizer = false) {
41
+ return {
42
+ snapshotOptions: { timeout: 2000 },
43
+ summarizerClient: isSummarizer,
44
+ fetchBinarySnapshotFormat: false,
45
+ // for testing both network and cache fetch
46
+ concurrentSnapshotFetch: true,
47
+ avoidPrefetchSnapshotCache: false,
48
+ };
49
+ }
50
+ const resolver = new OdspDriverUrlResolver();
51
+ let snapshotPrefetchResultCache;
52
+ const odspUrl = createOdspUrl({ ...newFileParams, itemId, dataStorePath: "/" });
53
+ const odspSnapshot = {
54
+ id: "id",
55
+ trees: [
56
+ {
57
+ entries: [{ path: "path", type: "tree" }],
58
+ id: "id",
59
+ sequenceNumber: 1,
60
+ },
61
+ ],
62
+ blobs: [],
63
+ };
64
+ const content = {
65
+ snapshotTree: {
66
+ id: "id",
67
+ blobs: {},
68
+ trees: {},
69
+ },
70
+ blobContents: new Map(),
71
+ ops: [],
72
+ sequenceNumber: 0,
73
+ latestSequenceNumber: 0,
74
+ snapshotFormatV: 1,
75
+ };
76
+ const snapshotTreeWithGroupId = {
77
+ id: "SnapshotId",
78
+ blobs: {},
79
+ trees: {
80
+ ".protocol": {
81
+ blobs: {},
82
+ trees: {},
83
+ },
84
+ ".app": {
85
+ blobs: { ".metadata": "bARD4RKvW4LL1KmaUKp6hUMSp" },
86
+ trees: {
87
+ ".channels": {
88
+ blobs: {},
89
+ trees: {
90
+ default: {
91
+ blobs: {},
92
+ trees: {
93
+ dds: {
94
+ blobs: {},
95
+ trees: {},
96
+ },
97
+ },
98
+ groupId: "G3",
99
+ },
100
+ },
101
+ unreferenced: true,
102
+ groupId: "G2",
103
+ },
104
+ ".blobs": { blobs: {}, trees: {} },
105
+ },
106
+ },
107
+ },
108
+ };
109
+ const blobContents = new Map([
110
+ [
111
+ "bARD4RKvW4LL1KmaUKp6hUMSp",
112
+ stringToBuffer(JSON.stringify({ summaryFormatVersion: 1, gcFeature: 0 }), "utf8"),
113
+ ],
114
+ ]);
115
+ const value = {
116
+ value: { ...content, cacheEntryTime: Date.now() },
117
+ fluidEpoch: "epoch1",
118
+ version: persistedCacheValueVersion,
119
+ };
120
+ const expectedVersion = [{ id: "id", treeId: undefined }];
121
+ before(async () => {
122
+ hashedDocumentId = await getHashedDocumentId(driveId, itemId);
123
+ });
124
+ describe("Tests for prefetching snapshot: Concurrent snapshot fetch: Using GetVersions Api", () => {
125
+ let odspDocumentServiceFactory;
126
+ beforeEach(async () => {
127
+ mockLogger = new MockLogger();
128
+ localCache = createUtLocalCache();
129
+ resolved = await resolver.resolve({ url: odspUrl });
130
+ odspDocumentServiceFactory = new OdspDocumentServiceFactory(async (_options) => "token", async (_options) => "token", localCache, GetHostStoragePolicyInternal());
131
+ snapshotPrefetchCacheKey = getKeyForCacheEntry(createCacheSnapshotKey(resolved));
132
+ const documentservice = await odspDocumentServiceFactory.createDocumentService(resolved, mockLogger);
133
+ service = (await documentservice.connectToStorage());
134
+ snapshotPrefetchResultCache = odspDocumentServiceFactory.snapshotPrefetchResultCache;
135
+ });
136
+ afterEach(async () => {
137
+ localCache
138
+ .removeEntries({ docId: hashedDocumentId, resolvedUrl: resolved })
139
+ .catch(() => { });
140
+ snapshotPrefetchResultCache.remove(snapshotPrefetchCacheKey);
141
+ });
142
+ it("prefetching snapshot should result in snapshot source as cache as prefetch adds to cache", async () => {
143
+ await mockFetchSingle(async () => prefetchLatestSnapshot(resolved, async (_options) => "token", localCache, true, mockLogger, undefined, false, undefined, undefined, odspDocumentServiceFactory), async () => createResponse({ "x-fluid-epoch": "epoch1", "content-type": "application/json" }, odspSnapshot, 200));
144
+ const version = await service.getVersions(null, 1);
145
+ assert.deepStrictEqual(version, expectedVersion, "incorrect version");
146
+ assert(mockLogger.events.filter((event) => event.eventName.includes("ObtainSnapshot_end"))
147
+ .length === 1, "1 Obtain snapshot event should be there");
148
+ assert(mockLogger.matchEvents([
149
+ { eventName: "OdspDriver:ObtainSnapshot_end", method: "cache" },
150
+ ]), "Source should be cache");
151
+ });
152
+ it("prefetching snapshot should result in snapshot source as network if both cache and prefetch throws", async () => {
153
+ // overwriting get() to make cache fetch throw
154
+ localCache.get = async () => {
155
+ throw new Error("testing");
156
+ };
157
+ await mockFetchSingle(async () => prefetchLatestSnapshot(resolved, async (_options) => "token", localCache, true, mockLogger, undefined, false, undefined, undefined, odspDocumentServiceFactory), notFound);
158
+ const version = await mockFetchSingle(async () => service.getVersions(null, 1), async () => createResponse({ "x-fluid-epoch": "epoch1", "content-type": "application/json" }, odspSnapshot, 200));
159
+ assert.deepStrictEqual(version, expectedVersion, "incorrect version");
160
+ assert(mockLogger.events.filter((event) => event.eventName.includes("ObtainSnapshot_end"))
161
+ .length === 1, "1 Obtain snapshot event should be there");
162
+ assert(mockLogger.matchEvents([
163
+ { eventName: "OdspDriver:ObtainSnapshot_end", method: "network" },
164
+ ]), "Source should be network");
165
+ });
166
+ it("prefetching snapshot should result in snapshot source as cache or network if prefetch throws and cache contains the response", async () => {
167
+ const cacheEntry = {
168
+ key: "",
169
+ type: "snapshot",
170
+ file: { docId: resolved.hashedDocumentId, resolvedUrl: resolved },
171
+ };
172
+ await localCache.put(cacheEntry, value);
173
+ await mockFetchSingle(async () => prefetchLatestSnapshot(resolved, async (_options) => "token", localCache, true, mockLogger, undefined, false, undefined, undefined, odspDocumentServiceFactory), notFound);
174
+ const version = await mockFetchSingle(async () => service.getVersions(null, 1), async () => createResponse({ "x-fluid-epoch": "epoch1", "content-type": "application/json" }, odspSnapshot, 200));
175
+ assert.deepStrictEqual(version, expectedVersion, "incorrect version");
176
+ assert(mockLogger.events.filter((event) => event.eventName.includes("ObtainSnapshot_end"))
177
+ .length === 1, "1 Obtain snapshot event should be there");
178
+ const method = mockLogger.events.find((event) => event.eventName.includes("ObtainSnapshot_end"))?.method;
179
+ assert(method === "cache" || method === "network", "Source should be cache or network");
180
+ });
181
+ it("prefetching snapshot should result in snapshot source as either cache or prefetch if both pass", async () => {
182
+ const cacheEntry = {
183
+ key: "",
184
+ type: "snapshot",
185
+ file: { docId: hashedDocumentId, resolvedUrl: resolved },
186
+ };
187
+ await localCache.put(cacheEntry, value);
188
+ mockFetchSingle(async () => prefetchLatestSnapshot(resolved, async (_options) => "token", localCache, true, mockLogger, undefined, false, undefined, undefined, odspDocumentServiceFactory), async () => createResponse({ "x-fluid-epoch": "epoch1", "content-type": "application/json" }, odspSnapshot, 200));
189
+ const version = await service.getVersions(null, 1);
190
+ assert.deepStrictEqual(version, expectedVersion, "incorrect version");
191
+ assert(mockLogger.events.filter((event) => event.eventName.includes("ObtainSnapshot_end"))
192
+ .length === 1, "1 Obtain snapshot event should be there");
193
+ const method = mockLogger.events.find((event) => event.eventName.includes("ObtainSnapshot_end"))?.method;
194
+ assert(method === "cache" || method === "prefetched", "Source should be cache or prefetched");
195
+ });
196
+ it("prefetching snapshot should result in epoch error if different from what is already present", async () => {
197
+ // overwriting get() to make cache fetch throw
198
+ localCache.get = async () => {
199
+ throw new Error("testing");
200
+ };
201
+ // Set epoch first
202
+ await mockFetchSingle(async () => service.readBlob("id"), async () => createResponse({ "x-fluid-epoch": "epoch1", "content-type": "application/json" }, JSON.stringify("odspSnapshot"), 200));
203
+ // This will store the response with wrong epoch in the cache
204
+ await mockFetchSingle(async () => prefetchLatestSnapshot(resolved, async (_options) => "token", localCache, true, mockLogger, undefined, false, undefined, undefined, odspDocumentServiceFactory), async () => createResponse({ "x-fluid-epoch": "epoch2", "content-type": "application/json" }, odspSnapshot, 200));
205
+ await mockFetchSingle(async () => service.getVersions(null, 1), async () => createResponse({ "x-fluid-epoch": "epoch1", "content-type": "application/json" }, odspSnapshot, 200));
206
+ mockLogger.assertMatchAny([
207
+ {
208
+ error: "Epoch mismatch",
209
+ errorType: "fileOverwrittenInStorage",
210
+ serverEpoch: "epoch2",
211
+ clientEpoch: "epoch1",
212
+ fetchType: "treesLatest",
213
+ },
214
+ ], "Snapshot prefetch has different epoch");
215
+ });
216
+ it("prefetching snapshot should result in epoch error if different from what is already present, fetch is not from cache", async () => {
217
+ // Set epoch first
218
+ await mockFetchSingle(async () => service.readBlob("id"), async () => createResponse({ "x-fluid-epoch": "epoch1", "content-type": "application/json" }, JSON.stringify("odspSnapshot"), 200));
219
+ // This will store the response with wrong epoch in the cache
220
+ await mockFetchSingle(async () => prefetchLatestSnapshot(resolved, async (_options) => "token", localCache, true, mockLogger, undefined, false, undefined, undefined, odspDocumentServiceFactory), async () => createResponse({ "x-fluid-epoch": "epoch2", "content-type": "application/json" }, odspSnapshot, 200));
221
+ await mockFetchSingle(async () => service.getVersions(null, 1, FetchSource.noCache), async () => createResponse({ "x-fluid-epoch": "epoch1", "content-type": "application/json" }, odspSnapshot, 200));
222
+ mockLogger.assertMatchAny([
223
+ {
224
+ error: "Epoch mismatch",
225
+ errorType: "fileOverwrittenInStorage",
226
+ serverEpoch: "epoch2",
227
+ clientEpoch: "epoch1",
228
+ fetchType: "treesLatest",
229
+ },
230
+ ], "Snapshot prefetch has different epoch");
231
+ });
232
+ });
233
+ describe("Tests for prefetching snapshot: No Concurrent snapshot fetch: Using GetVersions Api", () => {
234
+ let odspDocumentServiceFactory;
235
+ beforeEach(async () => {
236
+ mockLogger = new MockLogger();
237
+ localCache = createUtLocalCache();
238
+ resolved = await resolver.resolve({ url: odspUrl });
239
+ const hostPolicy = GetHostStoragePolicyInternal();
240
+ hostPolicy.concurrentSnapshotFetch = false;
241
+ odspDocumentServiceFactory = new OdspDocumentServiceFactory(async (_options) => "token", async (_options) => "token", localCache, hostPolicy);
242
+ snapshotPrefetchCacheKey = getKeyForCacheEntry(createCacheSnapshotKey(resolved));
243
+ const documentservice = await odspDocumentServiceFactory.createDocumentService(resolved, mockLogger);
244
+ service = (await documentservice.connectToStorage());
245
+ snapshotPrefetchResultCache = odspDocumentServiceFactory.snapshotPrefetchResultCache;
246
+ });
247
+ afterEach(async () => {
248
+ localCache
249
+ .removeEntries({ docId: hashedDocumentId, resolvedUrl: resolved })
250
+ .catch(() => { });
251
+ snapshotPrefetchResultCache.remove(snapshotPrefetchCacheKey);
252
+ });
253
+ it("prefetching snapshot should result in epoch error if different from what is already present, no concurrent fetch", async () => {
254
+ // Set epoch first
255
+ await mockFetchSingle(async () => service.readBlob("id"), async () => createResponse({ "x-fluid-epoch": "epoch1", "content-type": "application/json" }, JSON.stringify("odspSnapshot"), 200));
256
+ // This will store the response with wrong epoch in the cache
257
+ await mockFetchSingle(async () => prefetchLatestSnapshot(resolved, async (_options) => "token", localCache, true, mockLogger, undefined, false, undefined, undefined, odspDocumentServiceFactory), async () => createResponse({ "x-fluid-epoch": "epoch2", "content-type": "application/json" }, odspSnapshot, 200));
258
+ await mockFetchSingle(async () => service.getVersions(null, 1, undefined), async () => createResponse({ "x-fluid-epoch": "epoch1", "content-type": "application/json" }, odspSnapshot, 200));
259
+ mockLogger.assertMatchAny([
260
+ {
261
+ error: "Epoch mismatch",
262
+ errorType: "fileOverwrittenInStorage",
263
+ serverEpoch: "epoch2",
264
+ clientEpoch: "epoch1",
265
+ fetchType: "treesLatest",
266
+ },
267
+ ], "Snapshot prefetch has different epoch");
268
+ });
269
+ it("prefetching snapshot should be successful from prefetching, no concurrent fetch", async () => {
270
+ await mockFetchSingle(async () => prefetchLatestSnapshot(resolved, async (_options) => "token", localCache, true, mockLogger, undefined, false, undefined, undefined, odspDocumentServiceFactory), async () => createResponse({ "x-fluid-epoch": "epoch1", "content-type": "application/json" }, odspSnapshot, 200));
271
+ const version = await service.getVersions(null, 1);
272
+ assert.deepStrictEqual(version, expectedVersion, "incorrect version");
273
+ // Should be from cache as prefetch will store in cache
274
+ assert(mockLogger.matchEvents([
275
+ { eventName: "OdspDriver:ObtainSnapshot_end", method: "cache" },
276
+ ]), "unexpected events");
277
+ });
278
+ });
279
+ describe("Tests for prefetching snapshot: Concurrent snapshot fetch: Using GetSnapshot Api", () => {
280
+ let odspDocumentServiceFactory;
281
+ const snapshotWithGroupId = {
282
+ blobContents,
283
+ snapshotTree: snapshotTreeWithGroupId,
284
+ ops: [],
285
+ latestSequenceNumber: 0,
286
+ sequenceNumber: 0,
287
+ snapshotFormatV: 1,
288
+ };
289
+ const valueWithGroupId = {
290
+ value: { ...snapshotWithGroupId, cacheEntryTime: Date.now() },
291
+ fluidEpoch: "epoch1",
292
+ version: persistedCacheValueVersion,
293
+ };
294
+ const odspCompactSnapshotWithGroupId = convertToCompactSnapshot(snapshotWithGroupId);
295
+ const snapshotTreeWithGroupIdToCompare = {
296
+ blobs: { ...snapshotTreeWithGroupId.trees[".app"].blobs },
297
+ trees: {
298
+ ...snapshotTreeWithGroupId.trees[".app"].trees,
299
+ ".protocol": snapshotTreeWithGroupId.trees[".protocol"],
300
+ },
301
+ };
302
+ beforeEach(async () => {
303
+ mockLogger = new MockLogger();
304
+ localCache = createUtLocalCache();
305
+ resolved = await resolver.resolve({ url: odspUrl });
306
+ odspDocumentServiceFactory = new OdspDocumentServiceFactory(async (_options) => "token", async (_options) => "token", localCache, GetHostStoragePolicyInternal());
307
+ snapshotPrefetchCacheKey = getKeyForCacheEntry(createCacheSnapshotKey(resolved));
308
+ const documentservice = await odspDocumentServiceFactory.createDocumentService(resolved, mockLogger);
309
+ service = (await documentservice.connectToStorage());
310
+ snapshotPrefetchResultCache = odspDocumentServiceFactory.snapshotPrefetchResultCache;
311
+ });
312
+ afterEach(async () => {
313
+ localCache
314
+ .removeEntries({ docId: hashedDocumentId, resolvedUrl: resolved })
315
+ .catch(() => { });
316
+ snapshotPrefetchResultCache.remove(snapshotPrefetchCacheKey);
317
+ });
318
+ it("prefetching snapshot should result in snapshot source as cache as prefetch adds to cache", async () => {
319
+ await mockFetchSingle(async () => prefetchLatestSnapshot(resolved, async (_options) => "token", localCache, true, mockLogger, undefined, false, undefined, undefined, odspDocumentServiceFactory), async () => createResponse({ "x-fluid-epoch": "epoch1", "content-type": "application/ms-fluid" }, odspCompactSnapshotWithGroupId, 200));
320
+ const fetchedSnapshot = await service.getSnapshot();
321
+ assert.deepStrictEqual(fetchedSnapshot.snapshotTree, snapshotTreeWithGroupIdToCompare, "incorrect snapshot");
322
+ assert(mockLogger.events.filter((event) => event.eventName.includes("ObtainSnapshot_end"))
323
+ .length === 1, "1 Obtain snapshot event should be there");
324
+ assert(mockLogger.matchEvents([
325
+ { eventName: "OdspDriver:ObtainSnapshot_end", method: "cache" },
326
+ ]), "Source should be cache");
327
+ });
328
+ it("prefetching snapshot should result in snapshot source as network if both cache and prefetch throws", async () => {
329
+ // overwriting get() to make cache fetch throw
330
+ localCache.get = async () => {
331
+ throw new Error("testing");
332
+ };
333
+ await mockFetchSingle(async () => prefetchLatestSnapshot(resolved, async (_options) => "token", localCache, true, mockLogger, undefined, false, undefined, undefined, odspDocumentServiceFactory), notFound);
334
+ const fetchedSnapshot = await mockFetchSingle(async () => service.getSnapshot(), async () => createResponse({ "x-fluid-epoch": "epoch1", "content-type": "application/ms-fluid" }, odspCompactSnapshotWithGroupId, 200));
335
+ assert.deepStrictEqual(fetchedSnapshot.snapshotTree, snapshotTreeWithGroupIdToCompare, "incorrect snapshot");
336
+ assert(mockLogger.events.filter((event) => event.eventName.includes("ObtainSnapshot_end"))
337
+ .length === 1, "1 Obtain snapshot event should be there");
338
+ assert(mockLogger.matchEvents([
339
+ { eventName: "OdspDriver:ObtainSnapshot_end", method: "network" },
340
+ ]), "Source should be network");
341
+ });
342
+ it("prefetching snapshot should result in snapshot source as cache or network if prefetch throws and cache contains the response", async () => {
343
+ const cacheEntry = {
344
+ key: "",
345
+ type: "snapshot",
346
+ file: { docId: resolved.hashedDocumentId, resolvedUrl: resolved },
347
+ };
348
+ await localCache.put(cacheEntry, valueWithGroupId);
349
+ await mockFetchSingle(async () => prefetchLatestSnapshot(resolved, async (_options) => "token", localCache, true, mockLogger, undefined, false, undefined, undefined, odspDocumentServiceFactory), notFound);
350
+ const fetchedSnapshot = await mockFetchSingle(async () => service.getSnapshot(), async () => createResponse({ "x-fluid-epoch": "epoch1", "content-type": "application/ms-fluid" }, odspCompactSnapshotWithGroupId, 200));
351
+ assert.deepStrictEqual(fetchedSnapshot.snapshotTree, snapshotTreeWithGroupIdToCompare, "incorrect snapshot");
352
+ assert(mockLogger.events.filter((event) => event.eventName.includes("ObtainSnapshot_end"))
353
+ .length === 1, "1 Obtain snapshot event should be there");
354
+ const method = mockLogger.events.find((event) => event.eventName.includes("ObtainSnapshot_end"))?.method;
355
+ assert(method === "cache" || method === "network", "Source should be cache or network");
356
+ });
357
+ it("prefetching snapshot should result in snapshot source as either cache or prefetch if both pass", async () => {
358
+ const cacheEntry = {
359
+ key: "",
360
+ type: "snapshot",
361
+ file: { docId: hashedDocumentId, resolvedUrl: resolved },
362
+ };
363
+ await localCache.put(cacheEntry, valueWithGroupId);
364
+ mockFetchSingle(async () => prefetchLatestSnapshot(resolved, async (_options) => "token", localCache, true, mockLogger, undefined, false, undefined, undefined, odspDocumentServiceFactory), async () => createResponse({ "x-fluid-epoch": "epoch1", "content-type": "application/ms-fluid" }, odspCompactSnapshotWithGroupId, 200));
365
+ const fetchedSnapshot = await service.getSnapshot();
366
+ assert.deepStrictEqual(fetchedSnapshot.snapshotTree, snapshotTreeWithGroupIdToCompare, "incorrect snapshot");
367
+ assert(mockLogger.events.filter((event) => event.eventName.includes("ObtainSnapshot_end"))
368
+ .length === 1, "1 Obtain snapshot event should be there");
369
+ const method = mockLogger.events.find((event) => event.eventName.includes("ObtainSnapshot_end"))?.method;
370
+ assert(method === "cache" || method === "prefetched", "Source should be cache or prefetched");
371
+ });
372
+ });
373
+ describe("Tests for prefetching snapshot: No Concurrent snapshot fetch: Using GetSnapshot Api", () => {
374
+ let odspDocumentServiceFactory;
375
+ const snapshotWithGroupId = {
376
+ blobContents,
377
+ snapshotTree: snapshotTreeWithGroupId,
378
+ ops: [],
379
+ latestSequenceNumber: 0,
380
+ sequenceNumber: 0,
381
+ snapshotFormatV: 1,
382
+ };
383
+ const odspCompactSnapshotWithGroupId = convertToCompactSnapshot(snapshotWithGroupId);
384
+ const snapshotTreeWithGroupIdToCompare = {
385
+ blobs: { ...snapshotTreeWithGroupId.trees[".app"].blobs },
386
+ trees: {
387
+ ...snapshotTreeWithGroupId.trees[".app"].trees,
388
+ ".protocol": snapshotTreeWithGroupId.trees[".protocol"],
389
+ },
390
+ };
391
+ beforeEach(async () => {
392
+ mockLogger = new MockLogger();
393
+ localCache = createUtLocalCache();
394
+ resolved = await resolver.resolve({ url: odspUrl });
395
+ const hostPolicy = GetHostStoragePolicyInternal();
396
+ hostPolicy.concurrentSnapshotFetch = false;
397
+ odspDocumentServiceFactory = new OdspDocumentServiceFactory(async (_options) => "token", async (_options) => "token", localCache, hostPolicy);
398
+ snapshotPrefetchCacheKey = getKeyForCacheEntry(createCacheSnapshotKey(resolved));
399
+ const documentservice = await odspDocumentServiceFactory.createDocumentService(resolved, mockLogger);
400
+ service = (await documentservice.connectToStorage());
401
+ snapshotPrefetchResultCache = odspDocumentServiceFactory.snapshotPrefetchResultCache;
402
+ });
403
+ afterEach(async () => {
404
+ localCache
405
+ .removeEntries({ docId: hashedDocumentId, resolvedUrl: resolved })
406
+ .catch(() => { });
407
+ snapshotPrefetchResultCache.remove(snapshotPrefetchCacheKey);
408
+ });
409
+ it("prefetching snapshot should be successful from prefetching, no concurrent fetch", async () => {
410
+ await mockFetchSingle(async () => prefetchLatestSnapshot(resolved, async (_options) => "token", localCache, true, mockLogger, undefined, false, undefined, undefined, odspDocumentServiceFactory), async () => createResponse({ "x-fluid-epoch": "epoch1", "content-type": "application/ms-fluid" }, odspCompactSnapshotWithGroupId, 200));
411
+ const fetchedSnapshot = await service.getSnapshot();
412
+ assert.deepStrictEqual(fetchedSnapshot.snapshotTree, snapshotTreeWithGroupIdToCompare, "incorrect snapshot");
413
+ // Should be from cache as prefetch will store in cache
414
+ assert(mockLogger.matchEvents([
415
+ { eventName: "OdspDriver:ObtainSnapshot_end", method: "cache" },
416
+ ]), "unexpected events");
417
+ });
418
+ });
419
+ });
420
+ //# sourceMappingURL=prefetchSnapshotTests.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prefetchSnapshotTests.spec.js","sourceRoot":"","sources":["../../src/test/prefetchSnapshotTests.spec.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\n/* eslint-disable @typescript-eslint/no-floating-promises */\nimport { strict as assert } from \"node:assert\";\nimport { PromiseCache } from \"@fluidframework/core-utils\";\nimport {\n\tIOdspResolvedUrl,\n\tICacheEntry,\n\tgetKeyForCacheEntry,\n} from \"@fluidframework/odsp-driver-definitions\";\nimport { MockLogger } from \"@fluidframework/telemetry-utils\";\nimport { FetchSource, ISnapshot } from \"@fluidframework/driver-definitions\";\nimport { ISnapshotTree } from \"@fluidframework/protocol-definitions\";\nimport { stringToBuffer } from \"@fluid-internal/client-utils\";\nimport {\n\tIOdspSnapshot,\n\tHostStoragePolicyInternal,\n\tIVersionedValueWithEpoch,\n\tpersistedCacheValueVersion,\n} from \"../contracts.js\";\nimport { IPrefetchSnapshotContents, LocalPersistentCache } from \"../odspCache.js\";\nimport { createCacheSnapshotKey, INewFileInfo } from \"../odspUtils.js\";\nimport { createOdspUrl } from \"../createOdspUrl.js\";\nimport { getHashedDocumentId } from \"../odspPublicUtils.js\";\nimport { OdspDriverUrlResolver } from \"../odspDriverUrlResolver.js\";\nimport { OdspDocumentStorageService } from \"../odspDocumentStorageManager.js\";\nimport { prefetchLatestSnapshot } from \"../prefetchLatestSnapshot.js\";\nimport { OdspDocumentServiceFactory } from \"../odspDocumentServiceFactory.js\";\nimport { convertToCompactSnapshot } from \"../compactSnapshotWriter.js\";\nimport { mockFetchSingle, notFound, createResponse } from \"./mockFetch.js\";\n\nconst createUtLocalCache = (): LocalPersistentCache => new LocalPersistentCache();\n\ndescribe(\"Tests for prefetching snapshot\", () => {\n\tconst siteUrl = \"https://microsoft.sharepoint-df.com/siteUrl\";\n\tconst driveId = \"driveId\";\n\tconst itemId = \"itemId\";\n\tconst filePath = \"path\";\n\tlet localCache: LocalPersistentCache;\n\tlet hashedDocumentId: string;\n\tlet service: OdspDocumentStorageService;\n\tlet resolved: IOdspResolvedUrl;\n\tlet mockLogger: MockLogger;\n\tlet snapshotPrefetchCacheKey: string;\n\n\tconst newFileParams: INewFileInfo = {\n\t\ttype: \"New\",\n\t\tdriveId,\n\t\tsiteUrl,\n\t\tfilePath,\n\t\tfilename: \"filename\",\n\t};\n\n\tfunction GetHostStoragePolicyInternal(\n\t\tisSummarizer: boolean = false,\n\t): HostStoragePolicyInternal {\n\t\treturn {\n\t\t\tsnapshotOptions: { timeout: 2000 },\n\t\t\tsummarizerClient: isSummarizer,\n\t\t\tfetchBinarySnapshotFormat: false,\n\t\t\t// for testing both network and cache fetch\n\t\t\tconcurrentSnapshotFetch: true,\n\t\t\tavoidPrefetchSnapshotCache: false,\n\t\t};\n\t}\n\tconst resolver = new OdspDriverUrlResolver();\n\tlet snapshotPrefetchResultCache: PromiseCache<string, IPrefetchSnapshotContents>;\n\tconst odspUrl = createOdspUrl({ ...newFileParams, itemId, dataStorePath: \"/\" });\n\n\tconst odspSnapshot: IOdspSnapshot = {\n\t\tid: \"id\",\n\t\ttrees: [\n\t\t\t{\n\t\t\t\tentries: [{ path: \"path\", type: \"tree\" }],\n\t\t\t\tid: \"id\",\n\t\t\t\tsequenceNumber: 1,\n\t\t\t},\n\t\t],\n\t\tblobs: [],\n\t};\n\n\tconst content: ISnapshot = {\n\t\tsnapshotTree: {\n\t\t\tid: \"id\",\n\t\t\tblobs: {},\n\t\t\ttrees: {},\n\t\t},\n\t\tblobContents: new Map(),\n\t\tops: [],\n\t\tsequenceNumber: 0,\n\t\tlatestSequenceNumber: 0,\n\t\tsnapshotFormatV: 1,\n\t};\n\n\tconst snapshotTreeWithGroupId: ISnapshotTree = {\n\t\tid: \"SnapshotId\",\n\t\tblobs: {},\n\t\ttrees: {\n\t\t\t\".protocol\": {\n\t\t\t\tblobs: {},\n\t\t\t\ttrees: {},\n\t\t\t},\n\t\t\t\".app\": {\n\t\t\t\tblobs: { \".metadata\": \"bARD4RKvW4LL1KmaUKp6hUMSp\" },\n\t\t\t\ttrees: {\n\t\t\t\t\t\".channels\": {\n\t\t\t\t\t\tblobs: {},\n\t\t\t\t\t\ttrees: {\n\t\t\t\t\t\t\tdefault: {\n\t\t\t\t\t\t\t\tblobs: {},\n\t\t\t\t\t\t\t\ttrees: {\n\t\t\t\t\t\t\t\t\tdds: {\n\t\t\t\t\t\t\t\t\t\tblobs: {},\n\t\t\t\t\t\t\t\t\t\ttrees: {},\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\tgroupId: \"G3\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\tunreferenced: true,\n\t\t\t\t\t\tgroupId: \"G2\",\n\t\t\t\t\t},\n\t\t\t\t\t\".blobs\": { blobs: {}, trees: {} },\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t};\n\n\tconst blobContents = new Map<string, ArrayBuffer>([\n\t\t[\n\t\t\t\"bARD4RKvW4LL1KmaUKp6hUMSp\",\n\t\t\tstringToBuffer(JSON.stringify({ summaryFormatVersion: 1, gcFeature: 0 }), \"utf8\"),\n\t\t],\n\t]);\n\n\tconst value: IVersionedValueWithEpoch = {\n\t\tvalue: { ...content, cacheEntryTime: Date.now() },\n\t\tfluidEpoch: \"epoch1\",\n\t\tversion: persistedCacheValueVersion,\n\t};\n\n\tconst expectedVersion = [{ id: \"id\", treeId: undefined! }];\n\n\tbefore(async () => {\n\t\thashedDocumentId = await getHashedDocumentId(driveId, itemId);\n\t});\n\n\tdescribe(\"Tests for prefetching snapshot: Concurrent snapshot fetch: Using GetVersions Api\", () => {\n\t\tlet odspDocumentServiceFactory: OdspDocumentServiceFactory;\n\t\tbeforeEach(async () => {\n\t\t\tmockLogger = new MockLogger();\n\t\t\tlocalCache = createUtLocalCache();\n\t\t\tresolved = await resolver.resolve({ url: odspUrl });\n\t\t\todspDocumentServiceFactory = new OdspDocumentServiceFactory(\n\t\t\t\tasync (_options) => \"token\",\n\t\t\t\tasync (_options) => \"token\",\n\t\t\t\tlocalCache,\n\t\t\t\tGetHostStoragePolicyInternal(),\n\t\t\t);\n\t\t\tsnapshotPrefetchCacheKey = getKeyForCacheEntry(createCacheSnapshotKey(resolved));\n\t\t\tconst documentservice = await odspDocumentServiceFactory.createDocumentService(\n\t\t\t\tresolved,\n\t\t\t\tmockLogger,\n\t\t\t);\n\t\t\tservice = (await documentservice.connectToStorage()) as OdspDocumentStorageService;\n\t\t\tsnapshotPrefetchResultCache = odspDocumentServiceFactory.snapshotPrefetchResultCache;\n\t\t});\n\n\t\tafterEach(async () => {\n\t\t\tlocalCache\n\t\t\t\t.removeEntries({ docId: hashedDocumentId, resolvedUrl: resolved })\n\t\t\t\t.catch(() => {});\n\t\t\tsnapshotPrefetchResultCache.remove(snapshotPrefetchCacheKey);\n\t\t});\n\n\t\tit(\"prefetching snapshot should result in snapshot source as cache as prefetch adds to cache\", async () => {\n\t\t\tawait mockFetchSingle(\n\t\t\t\tasync () =>\n\t\t\t\t\tprefetchLatestSnapshot(\n\t\t\t\t\t\tresolved,\n\t\t\t\t\t\tasync (_options) => \"token\",\n\t\t\t\t\t\tlocalCache,\n\t\t\t\t\t\ttrue,\n\t\t\t\t\t\tmockLogger,\n\t\t\t\t\t\tundefined,\n\t\t\t\t\t\tfalse,\n\t\t\t\t\t\tundefined,\n\t\t\t\t\t\tundefined,\n\t\t\t\t\t\todspDocumentServiceFactory,\n\t\t\t\t\t),\n\t\t\t\tasync () =>\n\t\t\t\t\tcreateResponse(\n\t\t\t\t\t\t{ \"x-fluid-epoch\": \"epoch1\", \"content-type\": \"application/json\" },\n\t\t\t\t\t\todspSnapshot,\n\t\t\t\t\t\t200,\n\t\t\t\t\t),\n\t\t\t);\n\n\t\t\tconst version = await service.getVersions(null, 1);\n\n\t\t\tassert.deepStrictEqual(version, expectedVersion, \"incorrect version\");\n\t\t\tassert(\n\t\t\t\tmockLogger.events.filter((event) => event.eventName.includes(\"ObtainSnapshot_end\"))\n\t\t\t\t\t.length === 1,\n\t\t\t\t\"1 Obtain snapshot event should be there\",\n\t\t\t);\n\t\t\tassert(\n\t\t\t\tmockLogger.matchEvents([\n\t\t\t\t\t{ eventName: \"OdspDriver:ObtainSnapshot_end\", method: \"cache\" },\n\t\t\t\t]),\n\t\t\t\t\"Source should be cache\",\n\t\t\t);\n\t\t});\n\n\t\tit(\"prefetching snapshot should result in snapshot source as network if both cache and prefetch throws\", async () => {\n\t\t\t// overwriting get() to make cache fetch throw\n\t\t\tlocalCache.get = async (): Promise<void> => {\n\t\t\t\tthrow new Error(\"testing\");\n\t\t\t};\n\n\t\t\tawait mockFetchSingle(\n\t\t\t\tasync () =>\n\t\t\t\t\tprefetchLatestSnapshot(\n\t\t\t\t\t\tresolved,\n\t\t\t\t\t\tasync (_options) => \"token\",\n\t\t\t\t\t\tlocalCache,\n\t\t\t\t\t\ttrue,\n\t\t\t\t\t\tmockLogger,\n\t\t\t\t\t\tundefined,\n\t\t\t\t\t\tfalse,\n\t\t\t\t\t\tundefined,\n\t\t\t\t\t\tundefined,\n\t\t\t\t\t\todspDocumentServiceFactory,\n\t\t\t\t\t),\n\t\t\t\tnotFound,\n\t\t\t);\n\n\t\t\tconst version = await mockFetchSingle(\n\t\t\t\tasync () => service.getVersions(null, 1),\n\t\t\t\tasync () =>\n\t\t\t\t\tcreateResponse(\n\t\t\t\t\t\t{ \"x-fluid-epoch\": \"epoch1\", \"content-type\": \"application/json\" },\n\t\t\t\t\t\todspSnapshot,\n\t\t\t\t\t\t200,\n\t\t\t\t\t),\n\t\t\t);\n\t\t\tassert.deepStrictEqual(version, expectedVersion, \"incorrect version\");\n\t\t\tassert(\n\t\t\t\tmockLogger.events.filter((event) => event.eventName.includes(\"ObtainSnapshot_end\"))\n\t\t\t\t\t.length === 1,\n\t\t\t\t\"1 Obtain snapshot event should be there\",\n\t\t\t);\n\t\t\tassert(\n\t\t\t\tmockLogger.matchEvents([\n\t\t\t\t\t{ eventName: \"OdspDriver:ObtainSnapshot_end\", method: \"network\" },\n\t\t\t\t]),\n\t\t\t\t\"Source should be network\",\n\t\t\t);\n\t\t});\n\n\t\tit(\"prefetching snapshot should result in snapshot source as cache or network if prefetch throws and cache contains the response\", async () => {\n\t\t\tconst cacheEntry: ICacheEntry = {\n\t\t\t\tkey: \"\",\n\t\t\t\ttype: \"snapshot\",\n\t\t\t\tfile: { docId: resolved.hashedDocumentId, resolvedUrl: resolved },\n\t\t\t};\n\t\t\tawait localCache.put(cacheEntry, value);\n\n\t\t\tawait mockFetchSingle(\n\t\t\t\tasync () =>\n\t\t\t\t\tprefetchLatestSnapshot(\n\t\t\t\t\t\tresolved,\n\t\t\t\t\t\tasync (_options) => \"token\",\n\t\t\t\t\t\tlocalCache,\n\t\t\t\t\t\ttrue,\n\t\t\t\t\t\tmockLogger,\n\t\t\t\t\t\tundefined,\n\t\t\t\t\t\tfalse,\n\t\t\t\t\t\tundefined,\n\t\t\t\t\t\tundefined,\n\t\t\t\t\t\todspDocumentServiceFactory,\n\t\t\t\t\t),\n\t\t\t\tnotFound,\n\t\t\t);\n\n\t\t\tconst version = await mockFetchSingle(\n\t\t\t\tasync () => service.getVersions(null, 1),\n\t\t\t\tasync () =>\n\t\t\t\t\tcreateResponse(\n\t\t\t\t\t\t{ \"x-fluid-epoch\": \"epoch1\", \"content-type\": \"application/json\" },\n\t\t\t\t\t\todspSnapshot,\n\t\t\t\t\t\t200,\n\t\t\t\t\t),\n\t\t\t);\n\n\t\t\tassert.deepStrictEqual(version, expectedVersion, \"incorrect version\");\n\t\t\tassert(\n\t\t\t\tmockLogger.events.filter((event) => event.eventName.includes(\"ObtainSnapshot_end\"))\n\t\t\t\t\t.length === 1,\n\t\t\t\t\"1 Obtain snapshot event should be there\",\n\t\t\t);\n\t\t\tconst method = mockLogger.events.find((event) =>\n\t\t\t\tevent.eventName.includes(\"ObtainSnapshot_end\"),\n\t\t\t)?.method;\n\t\t\tassert(method === \"cache\" || method === \"network\", \"Source should be cache or network\");\n\t\t});\n\n\t\tit(\"prefetching snapshot should result in snapshot source as either cache or prefetch if both pass\", async () => {\n\t\t\tconst cacheEntry: ICacheEntry = {\n\t\t\t\tkey: \"\",\n\t\t\t\ttype: \"snapshot\",\n\t\t\t\tfile: { docId: hashedDocumentId, resolvedUrl: resolved },\n\t\t\t};\n\t\t\tawait localCache.put(cacheEntry, value);\n\n\t\t\tmockFetchSingle(\n\t\t\t\tasync () =>\n\t\t\t\t\tprefetchLatestSnapshot(\n\t\t\t\t\t\tresolved,\n\t\t\t\t\t\tasync (_options) => \"token\",\n\t\t\t\t\t\tlocalCache,\n\t\t\t\t\t\ttrue,\n\t\t\t\t\t\tmockLogger,\n\t\t\t\t\t\tundefined,\n\t\t\t\t\t\tfalse,\n\t\t\t\t\t\tundefined,\n\t\t\t\t\t\tundefined,\n\t\t\t\t\t\todspDocumentServiceFactory,\n\t\t\t\t\t),\n\t\t\t\tasync () =>\n\t\t\t\t\tcreateResponse(\n\t\t\t\t\t\t{ \"x-fluid-epoch\": \"epoch1\", \"content-type\": \"application/json\" },\n\t\t\t\t\t\todspSnapshot,\n\t\t\t\t\t\t200,\n\t\t\t\t\t),\n\t\t\t);\n\n\t\t\tconst version = await service.getVersions(null, 1);\n\t\t\tassert.deepStrictEqual(version, expectedVersion, \"incorrect version\");\n\t\t\tassert(\n\t\t\t\tmockLogger.events.filter((event) => event.eventName.includes(\"ObtainSnapshot_end\"))\n\t\t\t\t\t.length === 1,\n\t\t\t\t\"1 Obtain snapshot event should be there\",\n\t\t\t);\n\t\t\tconst method = mockLogger.events.find((event) =>\n\t\t\t\tevent.eventName.includes(\"ObtainSnapshot_end\"),\n\t\t\t)?.method;\n\t\t\tassert(\n\t\t\t\tmethod === \"cache\" || method === \"prefetched\",\n\t\t\t\t\"Source should be cache or prefetched\",\n\t\t\t);\n\t\t});\n\n\t\tit(\"prefetching snapshot should result in epoch error if different from what is already present\", async () => {\n\t\t\t// overwriting get() to make cache fetch throw\n\t\t\tlocalCache.get = async (): Promise<void> => {\n\t\t\t\tthrow new Error(\"testing\");\n\t\t\t};\n\t\t\t// Set epoch first\n\t\t\tawait mockFetchSingle(\n\t\t\t\tasync () => service.readBlob(\"id\"),\n\t\t\t\tasync () =>\n\t\t\t\t\tcreateResponse(\n\t\t\t\t\t\t{ \"x-fluid-epoch\": \"epoch1\", \"content-type\": \"application/json\" },\n\t\t\t\t\t\tJSON.stringify(\"odspSnapshot\"),\n\t\t\t\t\t\t200,\n\t\t\t\t\t),\n\t\t\t);\n\n\t\t\t// This will store the response with wrong epoch in the cache\n\t\t\tawait mockFetchSingle(\n\t\t\t\tasync () =>\n\t\t\t\t\tprefetchLatestSnapshot(\n\t\t\t\t\t\tresolved,\n\t\t\t\t\t\tasync (_options) => \"token\",\n\t\t\t\t\t\tlocalCache,\n\t\t\t\t\t\ttrue,\n\t\t\t\t\t\tmockLogger,\n\t\t\t\t\t\tundefined,\n\t\t\t\t\t\tfalse,\n\t\t\t\t\t\tundefined,\n\t\t\t\t\t\tundefined,\n\t\t\t\t\t\todspDocumentServiceFactory,\n\t\t\t\t\t),\n\t\t\t\tasync () =>\n\t\t\t\t\tcreateResponse(\n\t\t\t\t\t\t{ \"x-fluid-epoch\": \"epoch2\", \"content-type\": \"application/json\" },\n\t\t\t\t\t\todspSnapshot,\n\t\t\t\t\t\t200,\n\t\t\t\t\t),\n\t\t\t);\n\n\t\t\tawait mockFetchSingle(\n\t\t\t\tasync () => service.getVersions(null, 1),\n\t\t\t\tasync () =>\n\t\t\t\t\tcreateResponse(\n\t\t\t\t\t\t{ \"x-fluid-epoch\": \"epoch1\", \"content-type\": \"application/json\" },\n\t\t\t\t\t\todspSnapshot,\n\t\t\t\t\t\t200,\n\t\t\t\t\t),\n\t\t\t);\n\n\t\t\tmockLogger.assertMatchAny(\n\t\t\t\t[\n\t\t\t\t\t{\n\t\t\t\t\t\terror: \"Epoch mismatch\",\n\t\t\t\t\t\terrorType: \"fileOverwrittenInStorage\",\n\t\t\t\t\t\tserverEpoch: \"epoch2\",\n\t\t\t\t\t\tclientEpoch: \"epoch1\",\n\t\t\t\t\t\tfetchType: \"treesLatest\",\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\t\"Snapshot prefetch has different epoch\",\n\t\t\t);\n\t\t});\n\n\t\tit(\"prefetching snapshot should result in epoch error if different from what is already present, fetch is not from cache\", async () => {\n\t\t\t// Set epoch first\n\t\t\tawait mockFetchSingle(\n\t\t\t\tasync () => service.readBlob(\"id\"),\n\t\t\t\tasync () =>\n\t\t\t\t\tcreateResponse(\n\t\t\t\t\t\t{ \"x-fluid-epoch\": \"epoch1\", \"content-type\": \"application/json\" },\n\t\t\t\t\t\tJSON.stringify(\"odspSnapshot\"),\n\t\t\t\t\t\t200,\n\t\t\t\t\t),\n\t\t\t);\n\n\t\t\t// This will store the response with wrong epoch in the cache\n\t\t\tawait mockFetchSingle(\n\t\t\t\tasync () =>\n\t\t\t\t\tprefetchLatestSnapshot(\n\t\t\t\t\t\tresolved,\n\t\t\t\t\t\tasync (_options) => \"token\",\n\t\t\t\t\t\tlocalCache,\n\t\t\t\t\t\ttrue,\n\t\t\t\t\t\tmockLogger,\n\t\t\t\t\t\tundefined,\n\t\t\t\t\t\tfalse,\n\t\t\t\t\t\tundefined,\n\t\t\t\t\t\tundefined,\n\t\t\t\t\t\todspDocumentServiceFactory,\n\t\t\t\t\t),\n\t\t\t\tasync () =>\n\t\t\t\t\tcreateResponse(\n\t\t\t\t\t\t{ \"x-fluid-epoch\": \"epoch2\", \"content-type\": \"application/json\" },\n\t\t\t\t\t\todspSnapshot,\n\t\t\t\t\t\t200,\n\t\t\t\t\t),\n\t\t\t);\n\n\t\t\tawait mockFetchSingle(\n\t\t\t\tasync () => service.getVersions(null, 1, FetchSource.noCache),\n\t\t\t\tasync () =>\n\t\t\t\t\tcreateResponse(\n\t\t\t\t\t\t{ \"x-fluid-epoch\": \"epoch1\", \"content-type\": \"application/json\" },\n\t\t\t\t\t\todspSnapshot,\n\t\t\t\t\t\t200,\n\t\t\t\t\t),\n\t\t\t);\n\n\t\t\tmockLogger.assertMatchAny(\n\t\t\t\t[\n\t\t\t\t\t{\n\t\t\t\t\t\terror: \"Epoch mismatch\",\n\t\t\t\t\t\terrorType: \"fileOverwrittenInStorage\",\n\t\t\t\t\t\tserverEpoch: \"epoch2\",\n\t\t\t\t\t\tclientEpoch: \"epoch1\",\n\t\t\t\t\t\tfetchType: \"treesLatest\",\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\t\"Snapshot prefetch has different epoch\",\n\t\t\t);\n\t\t});\n\t});\n\n\tdescribe(\"Tests for prefetching snapshot: No Concurrent snapshot fetch: Using GetVersions Api\", () => {\n\t\tlet odspDocumentServiceFactory: OdspDocumentServiceFactory;\n\t\tbeforeEach(async () => {\n\t\t\tmockLogger = new MockLogger();\n\t\t\tlocalCache = createUtLocalCache();\n\t\t\tresolved = await resolver.resolve({ url: odspUrl });\n\t\t\tconst hostPolicy = GetHostStoragePolicyInternal();\n\t\t\thostPolicy.concurrentSnapshotFetch = false;\n\t\t\todspDocumentServiceFactory = new OdspDocumentServiceFactory(\n\t\t\t\tasync (_options) => \"token\",\n\t\t\t\tasync (_options) => \"token\",\n\t\t\t\tlocalCache,\n\t\t\t\thostPolicy,\n\t\t\t);\n\t\t\tsnapshotPrefetchCacheKey = getKeyForCacheEntry(createCacheSnapshotKey(resolved));\n\t\t\tconst documentservice = await odspDocumentServiceFactory.createDocumentService(\n\t\t\t\tresolved,\n\t\t\t\tmockLogger,\n\t\t\t);\n\t\t\tservice = (await documentservice.connectToStorage()) as OdspDocumentStorageService;\n\t\t\tsnapshotPrefetchResultCache = odspDocumentServiceFactory.snapshotPrefetchResultCache;\n\t\t});\n\n\t\tafterEach(async () => {\n\t\t\tlocalCache\n\t\t\t\t.removeEntries({ docId: hashedDocumentId, resolvedUrl: resolved })\n\t\t\t\t.catch(() => {});\n\t\t\tsnapshotPrefetchResultCache.remove(snapshotPrefetchCacheKey);\n\t\t});\n\n\t\tit(\"prefetching snapshot should result in epoch error if different from what is already present, no concurrent fetch\", async () => {\n\t\t\t// Set epoch first\n\t\t\tawait mockFetchSingle(\n\t\t\t\tasync () => service.readBlob(\"id\"),\n\t\t\t\tasync () =>\n\t\t\t\t\tcreateResponse(\n\t\t\t\t\t\t{ \"x-fluid-epoch\": \"epoch1\", \"content-type\": \"application/json\" },\n\t\t\t\t\t\tJSON.stringify(\"odspSnapshot\"),\n\t\t\t\t\t\t200,\n\t\t\t\t\t),\n\t\t\t);\n\n\t\t\t// This will store the response with wrong epoch in the cache\n\t\t\tawait mockFetchSingle(\n\t\t\t\tasync () =>\n\t\t\t\t\tprefetchLatestSnapshot(\n\t\t\t\t\t\tresolved,\n\t\t\t\t\t\tasync (_options) => \"token\",\n\t\t\t\t\t\tlocalCache,\n\t\t\t\t\t\ttrue,\n\t\t\t\t\t\tmockLogger,\n\t\t\t\t\t\tundefined,\n\t\t\t\t\t\tfalse,\n\t\t\t\t\t\tundefined,\n\t\t\t\t\t\tundefined,\n\t\t\t\t\t\todspDocumentServiceFactory,\n\t\t\t\t\t),\n\t\t\t\tasync () =>\n\t\t\t\t\tcreateResponse(\n\t\t\t\t\t\t{ \"x-fluid-epoch\": \"epoch2\", \"content-type\": \"application/json\" },\n\t\t\t\t\t\todspSnapshot,\n\t\t\t\t\t\t200,\n\t\t\t\t\t),\n\t\t\t);\n\n\t\t\tawait mockFetchSingle(\n\t\t\t\tasync () => service.getVersions(null, 1, undefined),\n\t\t\t\tasync () =>\n\t\t\t\t\tcreateResponse(\n\t\t\t\t\t\t{ \"x-fluid-epoch\": \"epoch1\", \"content-type\": \"application/json\" },\n\t\t\t\t\t\todspSnapshot,\n\t\t\t\t\t\t200,\n\t\t\t\t\t),\n\t\t\t);\n\n\t\t\tmockLogger.assertMatchAny(\n\t\t\t\t[\n\t\t\t\t\t{\n\t\t\t\t\t\terror: \"Epoch mismatch\",\n\t\t\t\t\t\terrorType: \"fileOverwrittenInStorage\",\n\t\t\t\t\t\tserverEpoch: \"epoch2\",\n\t\t\t\t\t\tclientEpoch: \"epoch1\",\n\t\t\t\t\t\tfetchType: \"treesLatest\",\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\t\"Snapshot prefetch has different epoch\",\n\t\t\t);\n\t\t});\n\n\t\tit(\"prefetching snapshot should be successful from prefetching, no concurrent fetch\", async () => {\n\t\t\tawait mockFetchSingle(\n\t\t\t\tasync () =>\n\t\t\t\t\tprefetchLatestSnapshot(\n\t\t\t\t\t\tresolved,\n\t\t\t\t\t\tasync (_options) => \"token\",\n\t\t\t\t\t\tlocalCache,\n\t\t\t\t\t\ttrue,\n\t\t\t\t\t\tmockLogger,\n\t\t\t\t\t\tundefined,\n\t\t\t\t\t\tfalse,\n\t\t\t\t\t\tundefined,\n\t\t\t\t\t\tundefined,\n\t\t\t\t\t\todspDocumentServiceFactory,\n\t\t\t\t\t),\n\t\t\t\tasync () =>\n\t\t\t\t\tcreateResponse(\n\t\t\t\t\t\t{ \"x-fluid-epoch\": \"epoch1\", \"content-type\": \"application/json\" },\n\t\t\t\t\t\todspSnapshot,\n\t\t\t\t\t\t200,\n\t\t\t\t\t),\n\t\t\t);\n\n\t\t\tconst version = await service.getVersions(null, 1);\n\n\t\t\tassert.deepStrictEqual(version, expectedVersion, \"incorrect version\");\n\t\t\t// Should be from cache as prefetch will store in cache\n\t\t\tassert(\n\t\t\t\tmockLogger.matchEvents([\n\t\t\t\t\t{ eventName: \"OdspDriver:ObtainSnapshot_end\", method: \"cache\" },\n\t\t\t\t]),\n\t\t\t\t\"unexpected events\",\n\t\t\t);\n\t\t});\n\t});\n\n\tdescribe(\"Tests for prefetching snapshot: Concurrent snapshot fetch: Using GetSnapshot Api\", () => {\n\t\tlet odspDocumentServiceFactory: OdspDocumentServiceFactory;\n\t\tconst snapshotWithGroupId: ISnapshot = {\n\t\t\tblobContents,\n\t\t\tsnapshotTree: snapshotTreeWithGroupId,\n\t\t\tops: [],\n\t\t\tlatestSequenceNumber: 0,\n\t\t\tsequenceNumber: 0,\n\t\t\tsnapshotFormatV: 1,\n\t\t};\n\t\tconst valueWithGroupId: IVersionedValueWithEpoch = {\n\t\t\tvalue: { ...snapshotWithGroupId, cacheEntryTime: Date.now() },\n\t\t\tfluidEpoch: \"epoch1\",\n\t\t\tversion: persistedCacheValueVersion,\n\t\t};\n\t\tconst odspCompactSnapshotWithGroupId = convertToCompactSnapshot(snapshotWithGroupId);\n\t\tconst snapshotTreeWithGroupIdToCompare: ISnapshotTree = {\n\t\t\tblobs: { ...snapshotTreeWithGroupId.trees[\".app\"].blobs },\n\t\t\ttrees: {\n\t\t\t\t...snapshotTreeWithGroupId.trees[\".app\"].trees,\n\t\t\t\t\".protocol\": snapshotTreeWithGroupId.trees[\".protocol\"],\n\t\t\t},\n\t\t};\n\t\tbeforeEach(async () => {\n\t\t\tmockLogger = new MockLogger();\n\t\t\tlocalCache = createUtLocalCache();\n\t\t\tresolved = await resolver.resolve({ url: odspUrl });\n\t\t\todspDocumentServiceFactory = new OdspDocumentServiceFactory(\n\t\t\t\tasync (_options) => \"token\",\n\t\t\t\tasync (_options) => \"token\",\n\t\t\t\tlocalCache,\n\t\t\t\tGetHostStoragePolicyInternal(),\n\t\t\t);\n\t\t\tsnapshotPrefetchCacheKey = getKeyForCacheEntry(createCacheSnapshotKey(resolved));\n\t\t\tconst documentservice = await odspDocumentServiceFactory.createDocumentService(\n\t\t\t\tresolved,\n\t\t\t\tmockLogger,\n\t\t\t);\n\t\t\tservice = (await documentservice.connectToStorage()) as OdspDocumentStorageService;\n\t\t\tsnapshotPrefetchResultCache = odspDocumentServiceFactory.snapshotPrefetchResultCache;\n\t\t});\n\n\t\tafterEach(async () => {\n\t\t\tlocalCache\n\t\t\t\t.removeEntries({ docId: hashedDocumentId, resolvedUrl: resolved })\n\t\t\t\t.catch(() => {});\n\t\t\tsnapshotPrefetchResultCache.remove(snapshotPrefetchCacheKey);\n\t\t});\n\n\t\tit(\"prefetching snapshot should result in snapshot source as cache as prefetch adds to cache\", async () => {\n\t\t\tawait mockFetchSingle(\n\t\t\t\tasync () =>\n\t\t\t\t\tprefetchLatestSnapshot(\n\t\t\t\t\t\tresolved,\n\t\t\t\t\t\tasync (_options) => \"token\",\n\t\t\t\t\t\tlocalCache,\n\t\t\t\t\t\ttrue,\n\t\t\t\t\t\tmockLogger,\n\t\t\t\t\t\tundefined,\n\t\t\t\t\t\tfalse,\n\t\t\t\t\t\tundefined,\n\t\t\t\t\t\tundefined,\n\t\t\t\t\t\todspDocumentServiceFactory,\n\t\t\t\t\t),\n\t\t\t\tasync () =>\n\t\t\t\t\tcreateResponse(\n\t\t\t\t\t\t{ \"x-fluid-epoch\": \"epoch1\", \"content-type\": \"application/ms-fluid\" },\n\t\t\t\t\t\todspCompactSnapshotWithGroupId,\n\t\t\t\t\t\t200,\n\t\t\t\t\t),\n\t\t\t);\n\n\t\t\tconst fetchedSnapshot = await service.getSnapshot();\n\t\t\tassert.deepStrictEqual(\n\t\t\t\tfetchedSnapshot.snapshotTree,\n\t\t\t\tsnapshotTreeWithGroupIdToCompare,\n\t\t\t\t\"incorrect snapshot\",\n\t\t\t);\n\t\t\tassert(\n\t\t\t\tmockLogger.events.filter((event) => event.eventName.includes(\"ObtainSnapshot_end\"))\n\t\t\t\t\t.length === 1,\n\t\t\t\t\"1 Obtain snapshot event should be there\",\n\t\t\t);\n\t\t\tassert(\n\t\t\t\tmockLogger.matchEvents([\n\t\t\t\t\t{ eventName: \"OdspDriver:ObtainSnapshot_end\", method: \"cache\" },\n\t\t\t\t]),\n\t\t\t\t\"Source should be cache\",\n\t\t\t);\n\t\t});\n\n\t\tit(\"prefetching snapshot should result in snapshot source as network if both cache and prefetch throws\", async () => {\n\t\t\t// overwriting get() to make cache fetch throw\n\t\t\tlocalCache.get = async (): Promise<void> => {\n\t\t\t\tthrow new Error(\"testing\");\n\t\t\t};\n\n\t\t\tawait mockFetchSingle(\n\t\t\t\tasync () =>\n\t\t\t\t\tprefetchLatestSnapshot(\n\t\t\t\t\t\tresolved,\n\t\t\t\t\t\tasync (_options) => \"token\",\n\t\t\t\t\t\tlocalCache,\n\t\t\t\t\t\ttrue,\n\t\t\t\t\t\tmockLogger,\n\t\t\t\t\t\tundefined,\n\t\t\t\t\t\tfalse,\n\t\t\t\t\t\tundefined,\n\t\t\t\t\t\tundefined,\n\t\t\t\t\t\todspDocumentServiceFactory,\n\t\t\t\t\t),\n\t\t\t\tnotFound,\n\t\t\t);\n\n\t\t\tconst fetchedSnapshot = await mockFetchSingle(\n\t\t\t\tasync () => service.getSnapshot(),\n\t\t\t\tasync () =>\n\t\t\t\t\tcreateResponse(\n\t\t\t\t\t\t{ \"x-fluid-epoch\": \"epoch1\", \"content-type\": \"application/ms-fluid\" },\n\t\t\t\t\t\todspCompactSnapshotWithGroupId,\n\t\t\t\t\t\t200,\n\t\t\t\t\t),\n\t\t\t);\n\t\t\tassert.deepStrictEqual(\n\t\t\t\tfetchedSnapshot.snapshotTree,\n\t\t\t\tsnapshotTreeWithGroupIdToCompare,\n\t\t\t\t\"incorrect snapshot\",\n\t\t\t);\n\t\t\tassert(\n\t\t\t\tmockLogger.events.filter((event) => event.eventName.includes(\"ObtainSnapshot_end\"))\n\t\t\t\t\t.length === 1,\n\t\t\t\t\"1 Obtain snapshot event should be there\",\n\t\t\t);\n\t\t\tassert(\n\t\t\t\tmockLogger.matchEvents([\n\t\t\t\t\t{ eventName: \"OdspDriver:ObtainSnapshot_end\", method: \"network\" },\n\t\t\t\t]),\n\t\t\t\t\"Source should be network\",\n\t\t\t);\n\t\t});\n\n\t\tit(\"prefetching snapshot should result in snapshot source as cache or network if prefetch throws and cache contains the response\", async () => {\n\t\t\tconst cacheEntry: ICacheEntry = {\n\t\t\t\tkey: \"\",\n\t\t\t\ttype: \"snapshot\",\n\t\t\t\tfile: { docId: resolved.hashedDocumentId, resolvedUrl: resolved },\n\t\t\t};\n\t\t\tawait localCache.put(cacheEntry, valueWithGroupId);\n\n\t\t\tawait mockFetchSingle(\n\t\t\t\tasync () =>\n\t\t\t\t\tprefetchLatestSnapshot(\n\t\t\t\t\t\tresolved,\n\t\t\t\t\t\tasync (_options) => \"token\",\n\t\t\t\t\t\tlocalCache,\n\t\t\t\t\t\ttrue,\n\t\t\t\t\t\tmockLogger,\n\t\t\t\t\t\tundefined,\n\t\t\t\t\t\tfalse,\n\t\t\t\t\t\tundefined,\n\t\t\t\t\t\tundefined,\n\t\t\t\t\t\todspDocumentServiceFactory,\n\t\t\t\t\t),\n\t\t\t\tnotFound,\n\t\t\t);\n\n\t\t\tconst fetchedSnapshot = await mockFetchSingle(\n\t\t\t\tasync () => service.getSnapshot(),\n\t\t\t\tasync () =>\n\t\t\t\t\tcreateResponse(\n\t\t\t\t\t\t{ \"x-fluid-epoch\": \"epoch1\", \"content-type\": \"application/ms-fluid\" },\n\t\t\t\t\t\todspCompactSnapshotWithGroupId,\n\t\t\t\t\t\t200,\n\t\t\t\t\t),\n\t\t\t);\n\n\t\t\tassert.deepStrictEqual(\n\t\t\t\tfetchedSnapshot.snapshotTree,\n\t\t\t\tsnapshotTreeWithGroupIdToCompare,\n\t\t\t\t\"incorrect snapshot\",\n\t\t\t);\n\t\t\tassert(\n\t\t\t\tmockLogger.events.filter((event) => event.eventName.includes(\"ObtainSnapshot_end\"))\n\t\t\t\t\t.length === 1,\n\t\t\t\t\"1 Obtain snapshot event should be there\",\n\t\t\t);\n\t\t\tconst method = mockLogger.events.find((event) =>\n\t\t\t\tevent.eventName.includes(\"ObtainSnapshot_end\"),\n\t\t\t)?.method;\n\t\t\tassert(method === \"cache\" || method === \"network\", \"Source should be cache or network\");\n\t\t});\n\n\t\tit(\"prefetching snapshot should result in snapshot source as either cache or prefetch if both pass\", async () => {\n\t\t\tconst cacheEntry: ICacheEntry = {\n\t\t\t\tkey: \"\",\n\t\t\t\ttype: \"snapshot\",\n\t\t\t\tfile: { docId: hashedDocumentId, resolvedUrl: resolved },\n\t\t\t};\n\t\t\tawait localCache.put(cacheEntry, valueWithGroupId);\n\n\t\t\tmockFetchSingle(\n\t\t\t\tasync () =>\n\t\t\t\t\tprefetchLatestSnapshot(\n\t\t\t\t\t\tresolved,\n\t\t\t\t\t\tasync (_options) => \"token\",\n\t\t\t\t\t\tlocalCache,\n\t\t\t\t\t\ttrue,\n\t\t\t\t\t\tmockLogger,\n\t\t\t\t\t\tundefined,\n\t\t\t\t\t\tfalse,\n\t\t\t\t\t\tundefined,\n\t\t\t\t\t\tundefined,\n\t\t\t\t\t\todspDocumentServiceFactory,\n\t\t\t\t\t),\n\t\t\t\tasync () =>\n\t\t\t\t\tcreateResponse(\n\t\t\t\t\t\t{ \"x-fluid-epoch\": \"epoch1\", \"content-type\": \"application/ms-fluid\" },\n\t\t\t\t\t\todspCompactSnapshotWithGroupId,\n\t\t\t\t\t\t200,\n\t\t\t\t\t),\n\t\t\t);\n\n\t\t\tconst fetchedSnapshot = await service.getSnapshot();\n\t\t\tassert.deepStrictEqual(\n\t\t\t\tfetchedSnapshot.snapshotTree,\n\t\t\t\tsnapshotTreeWithGroupIdToCompare,\n\t\t\t\t\"incorrect snapshot\",\n\t\t\t);\n\n\t\t\tassert(\n\t\t\t\tmockLogger.events.filter((event) => event.eventName.includes(\"ObtainSnapshot_end\"))\n\t\t\t\t\t.length === 1,\n\t\t\t\t\"1 Obtain snapshot event should be there\",\n\t\t\t);\n\t\t\tconst method = mockLogger.events.find((event) =>\n\t\t\t\tevent.eventName.includes(\"ObtainSnapshot_end\"),\n\t\t\t)?.method;\n\t\t\tassert(\n\t\t\t\tmethod === \"cache\" || method === \"prefetched\",\n\t\t\t\t\"Source should be cache or prefetched\",\n\t\t\t);\n\t\t});\n\t});\n\n\tdescribe(\"Tests for prefetching snapshot: No Concurrent snapshot fetch: Using GetSnapshot Api\", () => {\n\t\tlet odspDocumentServiceFactory: OdspDocumentServiceFactory;\n\t\tconst snapshotWithGroupId: ISnapshot = {\n\t\t\tblobContents,\n\t\t\tsnapshotTree: snapshotTreeWithGroupId,\n\t\t\tops: [],\n\t\t\tlatestSequenceNumber: 0,\n\t\t\tsequenceNumber: 0,\n\t\t\tsnapshotFormatV: 1,\n\t\t};\n\t\tconst odspCompactSnapshotWithGroupId = convertToCompactSnapshot(snapshotWithGroupId);\n\t\tconst snapshotTreeWithGroupIdToCompare: ISnapshotTree = {\n\t\t\tblobs: { ...snapshotTreeWithGroupId.trees[\".app\"].blobs },\n\t\t\ttrees: {\n\t\t\t\t...snapshotTreeWithGroupId.trees[\".app\"].trees,\n\t\t\t\t\".protocol\": snapshotTreeWithGroupId.trees[\".protocol\"],\n\t\t\t},\n\t\t};\n\t\tbeforeEach(async () => {\n\t\t\tmockLogger = new MockLogger();\n\t\t\tlocalCache = createUtLocalCache();\n\t\t\tresolved = await resolver.resolve({ url: odspUrl });\n\t\t\tconst hostPolicy = GetHostStoragePolicyInternal();\n\t\t\thostPolicy.concurrentSnapshotFetch = false;\n\t\t\todspDocumentServiceFactory = new OdspDocumentServiceFactory(\n\t\t\t\tasync (_options) => \"token\",\n\t\t\t\tasync (_options) => \"token\",\n\t\t\t\tlocalCache,\n\t\t\t\thostPolicy,\n\t\t\t);\n\t\t\tsnapshotPrefetchCacheKey = getKeyForCacheEntry(createCacheSnapshotKey(resolved));\n\t\t\tconst documentservice = await odspDocumentServiceFactory.createDocumentService(\n\t\t\t\tresolved,\n\t\t\t\tmockLogger,\n\t\t\t);\n\t\t\tservice = (await documentservice.connectToStorage()) as OdspDocumentStorageService;\n\t\t\tsnapshotPrefetchResultCache = odspDocumentServiceFactory.snapshotPrefetchResultCache;\n\t\t});\n\n\t\tafterEach(async () => {\n\t\t\tlocalCache\n\t\t\t\t.removeEntries({ docId: hashedDocumentId, resolvedUrl: resolved })\n\t\t\t\t.catch(() => {});\n\t\t\tsnapshotPrefetchResultCache.remove(snapshotPrefetchCacheKey);\n\t\t});\n\n\t\tit(\"prefetching snapshot should be successful from prefetching, no concurrent fetch\", async () => {\n\t\t\tawait mockFetchSingle(\n\t\t\t\tasync () =>\n\t\t\t\t\tprefetchLatestSnapshot(\n\t\t\t\t\t\tresolved,\n\t\t\t\t\t\tasync (_options) => \"token\",\n\t\t\t\t\t\tlocalCache,\n\t\t\t\t\t\ttrue,\n\t\t\t\t\t\tmockLogger,\n\t\t\t\t\t\tundefined,\n\t\t\t\t\t\tfalse,\n\t\t\t\t\t\tundefined,\n\t\t\t\t\t\tundefined,\n\t\t\t\t\t\todspDocumentServiceFactory,\n\t\t\t\t\t),\n\t\t\t\tasync () =>\n\t\t\t\t\tcreateResponse(\n\t\t\t\t\t\t{ \"x-fluid-epoch\": \"epoch1\", \"content-type\": \"application/ms-fluid\" },\n\t\t\t\t\t\todspCompactSnapshotWithGroupId,\n\t\t\t\t\t\t200,\n\t\t\t\t\t),\n\t\t\t);\n\n\t\t\tconst fetchedSnapshot = await service.getSnapshot();\n\n\t\t\tassert.deepStrictEqual(\n\t\t\t\tfetchedSnapshot.snapshotTree,\n\t\t\t\tsnapshotTreeWithGroupIdToCompare,\n\t\t\t\t\"incorrect snapshot\",\n\t\t\t);\n\t\t\t// Should be from cache as prefetch will store in cache\n\t\t\tassert(\n\t\t\t\tmockLogger.matchEvents([\n\t\t\t\t\t{ eventName: \"OdspDriver:ObtainSnapshot_end\", method: \"cache\" },\n\t\t\t\t]),\n\t\t\t\t\"unexpected events\",\n\t\t\t);\n\t\t});\n\t});\n});\n"]}