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

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 (353) hide show
  1. package/dist/WriteBufferUtils.d.ts.map +1 -1
  2. package/dist/WriteBufferUtils.js.map +1 -1
  3. package/dist/compactSnapshotParser.d.ts +1 -1
  4. package/dist/compactSnapshotParser.d.ts.map +1 -1
  5. package/dist/compactSnapshotParser.js +1 -1
  6. package/dist/compactSnapshotParser.js.map +1 -1
  7. package/dist/compactSnapshotWriter.d.ts.map +1 -1
  8. package/dist/compactSnapshotWriter.js +1 -1
  9. package/dist/compactSnapshotWriter.js.map +1 -1
  10. package/dist/contracts.d.ts +2 -2
  11. package/dist/contracts.d.ts.map +1 -1
  12. package/dist/contracts.js.map +1 -1
  13. package/dist/createFile.d.ts +2 -2
  14. package/dist/createFile.d.ts.map +1 -1
  15. package/dist/createFile.js +7 -7
  16. package/dist/createFile.js.map +1 -1
  17. package/dist/createNewContainerOnExistingFile.d.ts +2 -2
  18. package/dist/createNewContainerOnExistingFile.d.ts.map +1 -1
  19. package/dist/createNewContainerOnExistingFile.js +4 -4
  20. package/dist/createNewContainerOnExistingFile.js.map +1 -1
  21. package/dist/createNewUtils.d.ts +2 -2
  22. package/dist/createNewUtils.d.ts.map +1 -1
  23. package/dist/createNewUtils.js +4 -4
  24. package/dist/createNewUtils.js.map +1 -1
  25. package/dist/epochTracker.d.ts +3 -3
  26. package/dist/epochTracker.d.ts.map +1 -1
  27. package/dist/epochTracker.js +4 -4
  28. package/dist/epochTracker.js.map +1 -1
  29. package/dist/fetch.js.map +1 -1
  30. package/dist/fetchSnapshot.d.ts +2 -2
  31. package/dist/fetchSnapshot.d.ts.map +1 -1
  32. package/dist/fetchSnapshot.js +5 -5
  33. package/dist/fetchSnapshot.js.map +1 -1
  34. package/dist/getFileLink.d.ts +1 -1
  35. package/dist/getFileLink.d.ts.map +1 -1
  36. package/dist/getFileLink.js +1 -1
  37. package/dist/getFileLink.js.map +1 -1
  38. package/dist/localOdspDriver/localOdspDeltaStorageService.d.ts +1 -1
  39. package/dist/localOdspDriver/localOdspDeltaStorageService.d.ts.map +1 -1
  40. package/dist/localOdspDriver/localOdspDeltaStorageService.js +1 -1
  41. package/dist/localOdspDriver/localOdspDeltaStorageService.js.map +1 -1
  42. package/dist/localOdspDriver/localOdspDocumentService.d.ts +1 -1
  43. package/dist/localOdspDriver/localOdspDocumentService.d.ts.map +1 -1
  44. package/dist/localOdspDriver/localOdspDocumentService.js.map +1 -1
  45. package/dist/localOdspDriver/localOdspDocumentServiceFactory.d.ts +1 -1
  46. package/dist/localOdspDriver/localOdspDocumentServiceFactory.d.ts.map +1 -1
  47. package/dist/localOdspDriver/localOdspDocumentServiceFactory.js +1 -1
  48. package/dist/localOdspDriver/localOdspDocumentServiceFactory.js.map +1 -1
  49. package/dist/localOdspDriver/localOdspDocumentStorageManager.d.ts +1 -1
  50. package/dist/localOdspDriver/localOdspDocumentStorageManager.d.ts.map +1 -1
  51. package/dist/localOdspDriver/localOdspDocumentStorageManager.js +2 -2
  52. package/dist/localOdspDriver/localOdspDocumentStorageManager.js.map +1 -1
  53. package/dist/odspCache.d.ts +1 -1
  54. package/dist/odspCache.d.ts.map +1 -1
  55. package/dist/odspCache.js.map +1 -1
  56. package/dist/odspDelayLoadedDeltaStream.d.ts +4 -4
  57. package/dist/odspDelayLoadedDeltaStream.d.ts.map +1 -1
  58. package/dist/odspDelayLoadedDeltaStream.js +11 -6
  59. package/dist/odspDelayLoadedDeltaStream.js.map +1 -1
  60. package/dist/odspDeltaStorageService.d.ts +3 -3
  61. package/dist/odspDeltaStorageService.d.ts.map +1 -1
  62. package/dist/odspDeltaStorageService.js +3 -3
  63. package/dist/odspDeltaStorageService.js.map +1 -1
  64. package/dist/odspDocumentDeltaConnection.d.ts +5 -4
  65. package/dist/odspDocumentDeltaConnection.d.ts.map +1 -1
  66. package/dist/odspDocumentDeltaConnection.js +3 -5
  67. package/dist/odspDocumentDeltaConnection.js.map +1 -1
  68. package/dist/odspDocumentService.d.ts +4 -4
  69. package/dist/odspDocumentService.d.ts.map +1 -1
  70. package/dist/odspDocumentService.js +2 -2
  71. package/dist/odspDocumentService.js.map +1 -1
  72. package/dist/odspDocumentServiceFactory.d.ts +1 -1
  73. package/dist/odspDocumentServiceFactory.d.ts.map +1 -1
  74. package/dist/odspDocumentServiceFactory.js +1 -1
  75. package/dist/odspDocumentServiceFactory.js.map +1 -1
  76. package/dist/odspDocumentServiceFactoryCore.d.ts +2 -2
  77. package/dist/odspDocumentServiceFactoryCore.d.ts.map +1 -1
  78. package/dist/odspDocumentServiceFactoryCore.js +2 -2
  79. package/dist/odspDocumentServiceFactoryCore.js.map +1 -1
  80. package/dist/odspDocumentServiceFactoryWithCodeSplit.d.ts +1 -1
  81. package/dist/odspDocumentServiceFactoryWithCodeSplit.d.ts.map +1 -1
  82. package/dist/odspDocumentServiceFactoryWithCodeSplit.js.map +1 -1
  83. package/dist/odspDocumentStorageManager.d.ts +4 -4
  84. package/dist/odspDocumentStorageManager.d.ts.map +1 -1
  85. package/dist/odspDocumentStorageManager.js +3 -3
  86. package/dist/odspDocumentStorageManager.js.map +1 -1
  87. package/dist/odspDocumentStorageServiceBase.d.ts +1 -1
  88. package/dist/odspDocumentStorageServiceBase.d.ts.map +1 -1
  89. package/dist/odspDocumentStorageServiceBase.js.map +1 -1
  90. package/dist/odspDriverUrlResolver.d.ts.map +1 -1
  91. package/dist/odspDriverUrlResolver.js +3 -3
  92. package/dist/odspDriverUrlResolver.js.map +1 -1
  93. package/dist/odspDriverUrlResolverForShareLink.d.ts +1 -1
  94. package/dist/odspDriverUrlResolverForShareLink.d.ts.map +1 -1
  95. package/dist/odspDriverUrlResolverForShareLink.js +2 -2
  96. package/dist/odspDriverUrlResolverForShareLink.js.map +1 -1
  97. package/dist/odspError.d.ts.map +1 -1
  98. package/dist/odspError.js +1 -1
  99. package/dist/odspError.js.map +1 -1
  100. package/dist/odspFluidFileLink.d.ts.map +1 -1
  101. package/dist/odspFluidFileLink.js.map +1 -1
  102. package/dist/odspPublicUtils.js.map +1 -1
  103. package/dist/odspSnapshotParser.d.ts.map +1 -1
  104. package/dist/odspSnapshotParser.js.map +1 -1
  105. package/dist/odspSummaryUploadManager.d.ts +1 -1
  106. package/dist/odspSummaryUploadManager.d.ts.map +1 -1
  107. package/dist/odspSummaryUploadManager.js +1 -1
  108. package/dist/odspSummaryUploadManager.js.map +1 -1
  109. package/dist/odspUtils.d.ts +2 -2
  110. package/dist/odspUtils.d.ts.map +1 -1
  111. package/dist/odspUtils.js +2 -2
  112. package/dist/odspUtils.js.map +1 -1
  113. package/dist/opsCaching.d.ts.map +1 -1
  114. package/dist/opsCaching.js.map +1 -1
  115. package/dist/packageVersion.d.ts +1 -1
  116. package/dist/packageVersion.js +1 -1
  117. package/dist/packageVersion.js.map +1 -1
  118. package/dist/prefetchLatestSnapshot.d.ts.map +1 -1
  119. package/dist/prefetchLatestSnapshot.js +1 -1
  120. package/dist/prefetchLatestSnapshot.js.map +1 -1
  121. package/dist/retryErrorsStorageAdapter.d.ts +2 -2
  122. package/dist/retryErrorsStorageAdapter.d.ts.map +1 -1
  123. package/dist/retryErrorsStorageAdapter.js.map +1 -1
  124. package/dist/retryUtils.d.ts.map +1 -1
  125. package/dist/retryUtils.js.map +1 -1
  126. package/dist/vroom.d.ts +2 -2
  127. package/dist/vroom.d.ts.map +1 -1
  128. package/dist/vroom.js +2 -2
  129. package/dist/vroom.js.map +1 -1
  130. package/dist/zipItDataRepresentationUtils.d.ts.map +1 -1
  131. package/dist/zipItDataRepresentationUtils.js +1 -1
  132. package/dist/zipItDataRepresentationUtils.js.map +1 -1
  133. package/lib/WriteBufferUtils.d.ts.map +1 -1
  134. package/lib/WriteBufferUtils.js +1 -1
  135. package/lib/WriteBufferUtils.js.map +1 -1
  136. package/lib/compactSnapshotParser.d.ts +1 -1
  137. package/lib/compactSnapshotParser.d.ts.map +1 -1
  138. package/lib/compactSnapshotParser.js +1 -1
  139. package/lib/compactSnapshotParser.js.map +1 -1
  140. package/lib/compactSnapshotWriter.d.ts.map +1 -1
  141. package/lib/compactSnapshotWriter.js +2 -2
  142. package/lib/compactSnapshotWriter.js.map +1 -1
  143. package/lib/contracts.d.ts +2 -2
  144. package/lib/contracts.d.ts.map +1 -1
  145. package/lib/contracts.js.map +1 -1
  146. package/lib/createFile.d.ts +2 -2
  147. package/lib/createFile.d.ts.map +1 -1
  148. package/lib/createFile.js +7 -7
  149. package/lib/createFile.js.map +1 -1
  150. package/lib/createNewContainerOnExistingFile.d.ts +2 -2
  151. package/lib/createNewContainerOnExistingFile.d.ts.map +1 -1
  152. package/lib/createNewContainerOnExistingFile.js +4 -4
  153. package/lib/createNewContainerOnExistingFile.js.map +1 -1
  154. package/lib/createNewUtils.d.ts +2 -2
  155. package/lib/createNewUtils.d.ts.map +1 -1
  156. package/lib/createNewUtils.js +5 -5
  157. package/lib/createNewUtils.js.map +1 -1
  158. package/lib/epochTracker.d.ts +3 -3
  159. package/lib/epochTracker.d.ts.map +1 -1
  160. package/lib/epochTracker.js +6 -6
  161. package/lib/epochTracker.js.map +1 -1
  162. package/lib/fetch.js.map +1 -1
  163. package/lib/fetchSnapshot.d.ts +2 -2
  164. package/lib/fetchSnapshot.d.ts.map +1 -1
  165. package/lib/fetchSnapshot.js +6 -6
  166. package/lib/fetchSnapshot.js.map +1 -1
  167. package/lib/getFileLink.d.ts +1 -1
  168. package/lib/getFileLink.d.ts.map +1 -1
  169. package/lib/getFileLink.js +1 -1
  170. package/lib/getFileLink.js.map +1 -1
  171. package/lib/localOdspDriver/localOdspDeltaStorageService.d.ts +1 -1
  172. package/lib/localOdspDriver/localOdspDeltaStorageService.d.ts.map +1 -1
  173. package/lib/localOdspDriver/localOdspDeltaStorageService.js +1 -1
  174. package/lib/localOdspDriver/localOdspDeltaStorageService.js.map +1 -1
  175. package/lib/localOdspDriver/localOdspDocumentService.d.ts +1 -1
  176. package/lib/localOdspDriver/localOdspDocumentService.d.ts.map +1 -1
  177. package/lib/localOdspDriver/localOdspDocumentService.js.map +1 -1
  178. package/lib/localOdspDriver/localOdspDocumentServiceFactory.d.ts +1 -1
  179. package/lib/localOdspDriver/localOdspDocumentServiceFactory.d.ts.map +1 -1
  180. package/lib/localOdspDriver/localOdspDocumentServiceFactory.js +1 -1
  181. package/lib/localOdspDriver/localOdspDocumentServiceFactory.js.map +1 -1
  182. package/lib/localOdspDriver/localOdspDocumentStorageManager.d.ts +1 -1
  183. package/lib/localOdspDriver/localOdspDocumentStorageManager.d.ts.map +1 -1
  184. package/lib/localOdspDriver/localOdspDocumentStorageManager.js +2 -2
  185. package/lib/localOdspDriver/localOdspDocumentStorageManager.js.map +1 -1
  186. package/lib/odspCache.d.ts +1 -1
  187. package/lib/odspCache.d.ts.map +1 -1
  188. package/lib/odspCache.js.map +1 -1
  189. package/lib/odspDelayLoadedDeltaStream.d.ts +4 -4
  190. package/lib/odspDelayLoadedDeltaStream.d.ts.map +1 -1
  191. package/lib/odspDelayLoadedDeltaStream.js +11 -6
  192. package/lib/odspDelayLoadedDeltaStream.js.map +1 -1
  193. package/lib/odspDeltaStorageService.d.ts +3 -3
  194. package/lib/odspDeltaStorageService.d.ts.map +1 -1
  195. package/lib/odspDeltaStorageService.js +3 -3
  196. package/lib/odspDeltaStorageService.js.map +1 -1
  197. package/lib/odspDocumentDeltaConnection.d.ts +5 -4
  198. package/lib/odspDocumentDeltaConnection.d.ts.map +1 -1
  199. package/lib/odspDocumentDeltaConnection.js +4 -6
  200. package/lib/odspDocumentDeltaConnection.js.map +1 -1
  201. package/lib/odspDocumentService.d.ts +4 -4
  202. package/lib/odspDocumentService.d.ts.map +1 -1
  203. package/lib/odspDocumentService.js +2 -2
  204. package/lib/odspDocumentService.js.map +1 -1
  205. package/lib/odspDocumentServiceFactory.d.ts +1 -1
  206. package/lib/odspDocumentServiceFactory.d.ts.map +1 -1
  207. package/lib/odspDocumentServiceFactory.js +1 -1
  208. package/lib/odspDocumentServiceFactory.js.map +1 -1
  209. package/lib/odspDocumentServiceFactoryCore.d.ts +2 -2
  210. package/lib/odspDocumentServiceFactoryCore.d.ts.map +1 -1
  211. package/lib/odspDocumentServiceFactoryCore.js +4 -4
  212. package/lib/odspDocumentServiceFactoryCore.js.map +1 -1
  213. package/lib/odspDocumentServiceFactoryWithCodeSplit.d.ts +1 -1
  214. package/lib/odspDocumentServiceFactoryWithCodeSplit.d.ts.map +1 -1
  215. package/lib/odspDocumentServiceFactoryWithCodeSplit.js.map +1 -1
  216. package/lib/odspDocumentStorageManager.d.ts +4 -4
  217. package/lib/odspDocumentStorageManager.d.ts.map +1 -1
  218. package/lib/odspDocumentStorageManager.js +4 -4
  219. package/lib/odspDocumentStorageManager.js.map +1 -1
  220. package/lib/odspDocumentStorageServiceBase.d.ts +1 -1
  221. package/lib/odspDocumentStorageServiceBase.d.ts.map +1 -1
  222. package/lib/odspDocumentStorageServiceBase.js.map +1 -1
  223. package/lib/odspDriverUrlResolver.d.ts.map +1 -1
  224. package/lib/odspDriverUrlResolver.js +3 -3
  225. package/lib/odspDriverUrlResolver.js.map +1 -1
  226. package/lib/odspDriverUrlResolverForShareLink.d.ts +1 -1
  227. package/lib/odspDriverUrlResolverForShareLink.d.ts.map +1 -1
  228. package/lib/odspDriverUrlResolverForShareLink.js +3 -3
  229. package/lib/odspDriverUrlResolverForShareLink.js.map +1 -1
  230. package/lib/odspError.d.ts.map +1 -1
  231. package/lib/odspError.js +1 -1
  232. package/lib/odspError.js.map +1 -1
  233. package/lib/odspFluidFileLink.d.ts.map +1 -1
  234. package/lib/odspFluidFileLink.js +1 -1
  235. package/lib/odspFluidFileLink.js.map +1 -1
  236. package/lib/odspPublicUtils.js +1 -1
  237. package/lib/odspPublicUtils.js.map +1 -1
  238. package/lib/odspSnapshotParser.d.ts.map +1 -1
  239. package/lib/odspSnapshotParser.js.map +1 -1
  240. package/lib/odspSummaryUploadManager.d.ts +1 -1
  241. package/lib/odspSummaryUploadManager.d.ts.map +1 -1
  242. package/lib/odspSummaryUploadManager.js +2 -2
  243. package/lib/odspSummaryUploadManager.js.map +1 -1
  244. package/lib/odspUtils.d.ts +2 -2
  245. package/lib/odspUtils.d.ts.map +1 -1
  246. package/lib/odspUtils.js +3 -3
  247. package/lib/odspUtils.js.map +1 -1
  248. package/lib/opsCaching.d.ts.map +1 -1
  249. package/lib/opsCaching.js.map +1 -1
  250. package/lib/packageVersion.d.ts +1 -1
  251. package/lib/packageVersion.js +1 -1
  252. package/lib/packageVersion.js.map +1 -1
  253. package/lib/prefetchLatestSnapshot.d.ts.map +1 -1
  254. package/lib/prefetchLatestSnapshot.js +2 -2
  255. package/lib/prefetchLatestSnapshot.js.map +1 -1
  256. package/lib/retryErrorsStorageAdapter.d.ts +2 -2
  257. package/lib/retryErrorsStorageAdapter.d.ts.map +1 -1
  258. package/lib/retryErrorsStorageAdapter.js.map +1 -1
  259. package/lib/retryUtils.d.ts.map +1 -1
  260. package/lib/retryUtils.js.map +1 -1
  261. package/lib/test/createNewUtilsTests.spec.js +3 -3
  262. package/lib/test/createNewUtilsTests.spec.js.map +1 -1
  263. package/lib/test/deltaStorageService.spec.js +2 -2
  264. package/lib/test/deltaStorageService.spec.js.map +1 -1
  265. package/lib/test/epochTests.spec.js +2 -2
  266. package/lib/test/epochTests.spec.js.map +1 -1
  267. package/lib/test/epochTestsWithRedemption.spec.js +2 -2
  268. package/lib/test/epochTestsWithRedemption.spec.js.map +1 -1
  269. package/lib/test/fetchSnapshot.spec.js +8 -8
  270. package/lib/test/fetchSnapshot.spec.js.map +1 -1
  271. package/lib/test/getFileLink.spec.js +1 -1
  272. package/lib/test/getFileLink.spec.js.map +1 -1
  273. package/lib/test/getVersions.spec.js +6 -6
  274. package/lib/test/getVersions.spec.js.map +1 -1
  275. package/lib/test/joinSessionCacheTests.spec.js +117 -1
  276. package/lib/test/joinSessionCacheTests.spec.js.map +1 -1
  277. package/lib/test/joinSessionPeriodicCall.spec.js +3 -3
  278. package/lib/test/joinSessionPeriodicCall.spec.js.map +1 -1
  279. package/lib/test/localOdspDriver.spec.js +2 -2
  280. package/lib/test/localOdspDriver.spec.js.map +1 -1
  281. package/lib/test/mockFetch.js +1 -1
  282. package/lib/test/mockFetch.js.map +1 -1
  283. package/lib/test/odspCreateContainer.spec.js +7 -7
  284. package/lib/test/odspCreateContainer.spec.js.map +1 -1
  285. package/lib/test/odspDriverResolverTest.spec.js +2 -2
  286. package/lib/test/odspDriverResolverTest.spec.js.map +1 -1
  287. package/lib/test/odspDriverUrlResolverForShareLink.spec.js +4 -4
  288. package/lib/test/odspDriverUrlResolverForShareLink.spec.js.map +1 -1
  289. package/lib/test/odspError.spec.js +2 -2
  290. package/lib/test/odspError.spec.js.map +1 -1
  291. package/lib/test/opsCaching.spec.js +1 -1
  292. package/lib/test/opsCaching.spec.js.map +1 -1
  293. package/lib/test/prefetchSnapshotTests.spec.js +8 -8
  294. package/lib/test/prefetchSnapshotTests.spec.js.map +1 -1
  295. package/lib/test/snapshotFormatTests.spec.js.map +1 -1
  296. package/lib/test/socketTests/deltaConnectionUpdateTests.spec.js +4 -4
  297. package/lib/test/socketTests/deltaConnectionUpdateTests.spec.js.map +1 -1
  298. package/lib/test/socketTests/socketMock.js +6 -2
  299. package/lib/test/socketTests/socketMock.js.map +1 -1
  300. package/lib/test/socketTests/socketTests.spec.js +4 -4
  301. package/lib/test/socketTests/socketTests.spec.js.map +1 -1
  302. package/lib/test/tokenFetch.spec.js +1 -1
  303. package/lib/test/tokenFetch.spec.js.map +1 -1
  304. package/lib/test/zipItDataRepresentationTests.spec.js +1 -1
  305. package/lib/test/zipItDataRepresentationTests.spec.js.map +1 -1
  306. package/lib/vroom.d.ts +2 -2
  307. package/lib/vroom.d.ts.map +1 -1
  308. package/lib/vroom.js +2 -2
  309. package/lib/vroom.js.map +1 -1
  310. package/lib/zipItDataRepresentationUtils.d.ts.map +1 -1
  311. package/lib/zipItDataRepresentationUtils.js +1 -1
  312. package/lib/zipItDataRepresentationUtils.js.map +1 -1
  313. package/package.json +19 -16
  314. package/src/WriteBufferUtils.ts +2 -2
  315. package/src/compactSnapshotParser.ts +6 -6
  316. package/src/compactSnapshotWriter.ts +4 -4
  317. package/src/contracts.ts +2 -2
  318. package/src/createFile.ts +18 -18
  319. package/src/createNewContainerOnExistingFile.ts +10 -10
  320. package/src/createNewUtils.ts +13 -13
  321. package/src/epochTracker.ts +21 -21
  322. package/src/fetch.ts +1 -1
  323. package/src/fetchSnapshot.ts +24 -24
  324. package/src/getFileLink.ts +1 -1
  325. package/src/localOdspDriver/localOdspDeltaStorageService.ts +2 -2
  326. package/src/localOdspDriver/localOdspDocumentService.ts +1 -1
  327. package/src/localOdspDriver/localOdspDocumentServiceFactory.ts +2 -2
  328. package/src/localOdspDriver/localOdspDocumentStorageManager.ts +3 -3
  329. package/src/odspCache.ts +4 -4
  330. package/src/odspDelayLoadedDeltaStream.ts +26 -22
  331. package/src/odspDeltaStorageService.ts +6 -6
  332. package/src/odspDocumentDeltaConnection.ts +17 -14
  333. package/src/odspDocumentService.ts +15 -15
  334. package/src/odspDocumentServiceFactory.ts +3 -3
  335. package/src/odspDocumentServiceFactoryCore.ts +14 -14
  336. package/src/odspDocumentServiceFactoryWithCodeSplit.ts +2 -2
  337. package/src/odspDocumentStorageManager.ts +22 -22
  338. package/src/odspDocumentStorageServiceBase.ts +4 -4
  339. package/src/odspDriverUrlResolver.ts +4 -4
  340. package/src/odspDriverUrlResolverForShareLink.ts +8 -8
  341. package/src/odspError.ts +2 -2
  342. package/src/odspFluidFileLink.ts +1 -1
  343. package/src/odspPublicUtils.ts +1 -1
  344. package/src/odspSnapshotParser.ts +1 -1
  345. package/src/odspSummaryUploadManager.ts +4 -4
  346. package/src/odspUtils.ts +25 -25
  347. package/src/opsCaching.ts +1 -1
  348. package/src/packageVersion.ts +1 -1
  349. package/src/prefetchLatestSnapshot.ts +12 -12
  350. package/src/retryErrorsStorageAdapter.ts +2 -2
  351. package/src/retryUtils.ts +1 -1
  352. package/src/vroom.ts +6 -6
  353. package/src/zipItDataRepresentationUtils.ts +2 -2
@@ -1 +1 @@
1
- {"version":3,"file":"opsCaching.spec.js","sourceRoot":"","sources":["../../src/test/opsCaching.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\nimport { strict as assert } from \"node:assert\";\nimport { MockLogger } from \"@fluidframework/telemetry-utils\";\nimport { ISequencedDocumentMessage } from \"@fluidframework/protocol-definitions\";\nimport { IStream } from \"@fluidframework/driver-definitions\";\nimport { delay } from \"@fluidframework/core-utils\";\nimport { OdspDeltaStorageWithCache } from \"../odspDeltaStorageService.js\";\nimport { OpsCache, ICache, IMessage, CacheEntry } from \"../opsCaching.js\";\nimport { OdspDocumentStorageService } from \"../odspDocumentStorageManager.js\";\n\nexport type MyDataInput = IMessage & { data: string };\n\nclass MockCache implements ICache {\n\tpublic writeCount = 0;\n\tpublic opsWritten = 0;\n\n\tpublic async write(batchNumber: string, data: string): Promise<void> {\n\t\tthis.writeCount++;\n\t\tthis.data[batchNumber] = JSON.parse(data);\n\t\tfor (const op of this.data[batchNumber] as CacheEntry) {\n\t\t\t// JSON.serialize converts undefined to null\n\t\t\tif (op !== null) {\n\t\t\t\tthis.opsWritten++;\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic async read(batchNumber: string): Promise<string | undefined> {\n\t\tconst content = this.data[batchNumber];\n\t\tif (content === undefined) {\n\t\t\treturn undefined;\n\t\t}\n\t\treturn JSON.stringify(content);\n\t}\n\n\tpublic remove(): void {\n\t\t// Do not reset this.writeCount such that we can test that writes happened, but later on data was cleared\n\t\tthis.writeCount++;\n\t\tthis.opsWritten++;\n\t\tthis.data = {};\n\t}\n\n\tpublic data: { [key: string]: unknown } = {};\n}\n\nasync function validate(\n\tmockCache: MockCache,\n\texpected: { [key: number]: (MyDataInput | undefined)[] },\n\tcache: OpsCache,\n\tinitialSeq: number,\n): Promise<void> {\n\tassert.deepEqual(mockCache.data, JSON.parse(JSON.stringify(expected)));\n\n\tconst expectedArr: MyDataInput[] = [];\n\tfor (const values of Object.values(expected)) {\n\t\tfor (const op of values) {\n\t\t\tif (op !== undefined) {\n\t\t\t\texpectedArr.push(op);\n\t\t\t}\n\t\t}\n\t}\n\n\tlet result = await cache.get(initialSeq + 1, undefined);\n\tassert.deepEqual(result, expectedArr);\n\n\tif (initialSeq >= 10) {\n\t\tresult = await cache.get(1, 10);\n\t\tassert(result.length === 0);\n\t}\n\n\t// Asking for one too early should result in empty result, as hit miss should result in no ops.\n\tif (initialSeq > 0) {\n\t\tresult = await cache.get(initialSeq, undefined);\n\t\tassert(result.length === 0);\n\t}\n\n\tif (expectedArr.length > 0) {\n\t\tconst last = expectedArr[expectedArr.length - 1].sequenceNumber + 1;\n\n\t\tresult = await cache.get(last, undefined);\n\t\tassert(result.length === 0);\n\n\t\tresult = await cache.get(last + 10, undefined);\n\t\tassert(result.length === 0);\n\n\t\tresult = await cache.get(initialSeq + 2, last);\n\t\tassert.deepEqual(result, expectedArr.slice(1));\n\n\t\tresult = await cache.get(initialSeq + 2, last + 100000);\n\t\tassert.deepEqual(result, expectedArr.slice(1));\n\n\t\tresult = await cache.get(initialSeq + 2, last - 1);\n\t\tassert.deepEqual(result, expectedArr.slice(1, -1));\n\t}\n}\n\nasync function runTestNoTimer(\n\tbatchSize: number,\n\tinitialSeq: number,\n\tmockData: MyDataInput[],\n\texpected: { [key: number]: (MyDataInput | undefined)[] },\n\tinitialWritesExpected: number,\n\ttotalOpsWritten?: number,\n): Promise<void> {\n\tconst mockCache = new MockCache();\n\tconst logger = new MockLogger();\n\tconst cache = new OpsCache(\n\t\tinitialSeq,\n\t\tlogger.toTelemetryLogger(),\n\t\tmockCache,\n\t\tbatchSize,\n\t\t-1, // timerGranularity\n\t\t10, // totalOpsToCache\n\t);\n\n\tcache.addOps(mockData);\n\n\tconst writes = mockCache.writeCount;\n\tassert.equal(writes, initialWritesExpected, \"initialWrites should match\");\n\n\t// Validate that writing same ops is not going to change anything\n\tcache.addOps(mockData);\n\tassert.equal(writes, mockCache.writeCount);\n\n\tawait validate(mockCache, expected, cache, initialSeq);\n\n\t// ensure all ops are flushed properly\n\tcache.flushOps();\n\tassert.equal(mockCache.opsWritten, totalOpsWritten ?? mockData.length);\n\n\t// ensure adding same ops and flushing again is doing nothing\n\tcache.addOps(mockData);\n\tcache.flushOps();\n\tassert.equal(\n\t\tmockCache.opsWritten,\n\t\ttotalOpsWritten ?? mockData.length,\n\t\t\"ops written does not match\",\n\t);\n\tlogger.assertMatchNone([{ category: \"error\" }]);\n}\n\nexport async function runTestWithTimer(\n\tbatchSize: number,\n\tinitialSeq: number,\n\tmockData: MyDataInput[],\n\texpected: { [key: number]: (MyDataInput | undefined)[] },\n\tinitialWritesExpected: number,\n\ttotalWritesExpected: number,\n\ttotalOpsWritten?: number,\n): Promise<void> {\n\tconst mockCache = new MockCache();\n\tconst logger = new MockLogger();\n\tconst cache = new OpsCache(\n\t\tinitialSeq,\n\t\tlogger.toTelemetryLogger(),\n\t\tmockCache,\n\t\tbatchSize,\n\t\t1, // timerGranularity\n\t\t10, // totalOpsToCache\n\t);\n\n\tcache.addOps(mockData);\n\tassert.equal(mockCache.writeCount, initialWritesExpected);\n\tawait validate(mockCache, expected, cache, initialSeq);\n\n\twhile (mockCache.writeCount < totalWritesExpected) {\n\t\tawait delay(1);\n\t}\n\tassert.equal(mockCache.writeCount, totalWritesExpected);\n\tassert.equal(mockCache.opsWritten, totalOpsWritten ?? mockData.length);\n\tlogger.assertMatchNone([{ category: \"error\" }]);\n}\n\nexport async function runTest(\n\tbatchSize: number,\n\tinitialSeq: number,\n\tmockData: MyDataInput[],\n\texpected: { [key: string]: (MyDataInput | undefined)[] },\n\tinitialWritesExpected: number,\n\ttotalWritesExpected: number,\n\ttotalOpsWritten?: number,\n): Promise<void> {\n\tawait runTestNoTimer(\n\t\tbatchSize,\n\t\tinitialSeq,\n\t\tmockData,\n\t\texpected,\n\t\tinitialWritesExpected,\n\t\ttotalOpsWritten,\n\t);\n\tawait runTestWithTimer(\n\t\tbatchSize,\n\t\tinitialSeq,\n\t\tmockData,\n\t\texpected,\n\t\tinitialWritesExpected,\n\t\ttotalWritesExpected,\n\t\ttotalOpsWritten,\n\t);\n}\n\ndescribe(\"OpsCache\", () => {\n\tconst mockData1: MyDataInput[] = [\n\t\t{ sequenceNumber: 105, data: \"105\" },\n\t\t{ sequenceNumber: 110, data: \"110\" },\n\t\t{ sequenceNumber: 115, data: \"115\" },\n\t\t{ sequenceNumber: 120, data: \"120\" },\n\t\t{ sequenceNumber: 125, data: \"125\" },\n\t\t{ sequenceNumber: 130, data: \"130\" },\n\t\t{ sequenceNumber: 135, data: \"135\" },\n\t\t{ sequenceNumber: 140, data: \"140\" },\n\t\t{ sequenceNumber: 145, data: \"140\" },\n\t];\n\n\tit(\"1 element in each batch of 5 should not commit\", async () => {\n\t\tawait runTest(5, 100, mockData1, {}, 0, 9);\n\t});\n\n\tit(\"2 element in each batch of 10 should not commit\", async () => {\n\t\tawait runTest(10, 100, mockData1, {}, 0, 4, 8);\n\t});\n\n\tit(\"6 sequential elements with batch of 5 should commit 1 batch\", async () => {\n\t\tawait runTest(\n\t\t\t5,\n\t\t\t100,\n\t\t\t[\n\t\t\t\t{ sequenceNumber: 101, data: \"101\" },\n\t\t\t\t{ sequenceNumber: 102, data: \"102\" },\n\t\t\t\t{ sequenceNumber: 103, data: \"103\" },\n\t\t\t\t{ sequenceNumber: 104, data: \"104\" },\n\t\t\t\t{ sequenceNumber: 105, data: \"105\" },\n\t\t\t],\n\t\t\t{\n\t\t\t\t\"5_20\": [\n\t\t\t\t\tundefined,\n\t\t\t\t\t{ sequenceNumber: 101, data: \"101\" },\n\t\t\t\t\t{ sequenceNumber: 102, data: \"102\" },\n\t\t\t\t\t{ sequenceNumber: 103, data: \"103\" },\n\t\t\t\t\t{ sequenceNumber: 104, data: \"104\" },\n\t\t\t\t],\n\t\t\t},\n\t\t\t1,\n\t\t\t2,\n\t\t);\n\t});\n\n\tit(\"Epmty ops at beginning and end of batch should cause the batch to not be cached\", async () => {\n\t\tawait runTest(\n\t\t\t5,\n\t\t\t100,\n\t\t\t[\n\t\t\t\t{ sequenceNumber: 101, data: \"101\" },\n\t\t\t\t{ sequenceNumber: 102, data: \"102\" },\n\t\t\t\t{ sequenceNumber: 103, data: \"103\" },\n\t\t\t],\n\t\t\t{},\n\t\t\t0,\n\t\t\t0,\n\t\t\t0,\n\t\t);\n\t});\n\n\tit(\"Epmty ops at just the beginning should still cause the batch to be cached\", async () => {\n\t\tawait runTest(\n\t\t\t5,\n\t\t\t100,\n\t\t\t[\n\t\t\t\t{ sequenceNumber: 101, data: \"101\" },\n\t\t\t\t{ sequenceNumber: 102, data: \"102\" },\n\t\t\t\t{ sequenceNumber: 103, data: \"103\" },\n\t\t\t\t{ sequenceNumber: 104, data: \"104\" },\n\t\t\t],\n\t\t\t{\n\t\t\t\t\"5_20\": [\n\t\t\t\t\tundefined,\n\t\t\t\t\t{ sequenceNumber: 101, data: \"101\" },\n\t\t\t\t\t{ sequenceNumber: 102, data: \"102\" },\n\t\t\t\t\t{ sequenceNumber: 103, data: \"103\" },\n\t\t\t\t\t{ sequenceNumber: 104, data: \"104\" },\n\t\t\t\t],\n\t\t\t},\n\t\t\t1,\n\t\t\t1,\n\t\t\t4,\n\t\t);\n\t});\n\n\tconst mockData3: MyDataInput[] = [\n\t\t{ sequenceNumber: 102, data: \"102\" },\n\t\t{ sequenceNumber: 103, data: \"103\" },\n\t];\n\n\tit(\"3 sequential elements with batch of 2 and offset of 1 should commit 2 batches\", async () => {\n\t\tawait runTest(\n\t\t\t2,\n\t\t\t101,\n\t\t\tmockData3,\n\t\t\t{\n\t\t\t\t\"2_51\": [\n\t\t\t\t\t{ sequenceNumber: 102, data: \"102\" },\n\t\t\t\t\t{ sequenceNumber: 103, data: \"103\" },\n\t\t\t\t],\n\t\t\t},\n\t\t\t1,\n\t\t\t1,\n\t\t);\n\t});\n\n\tit(\"with batch size of 1 all ops should commit in own batch\", async () => {\n\t\tawait runTest(\n\t\t\t1,\n\t\t\t101,\n\t\t\tmockData3,\n\t\t\t{\n\t\t\t\t\"1_102\": [{ sequenceNumber: 102, data: \"102\" }],\n\t\t\t\t\"1_103\": [{ sequenceNumber: 103, data: \"103\" }],\n\t\t\t},\n\t\t\t2,\n\t\t\t2,\n\t\t);\n\t});\n\n\tit(\"Too many ops\", async () => {\n\t\tawait runTest(\n\t\t\t5,\n\t\t\t100,\n\t\t\t[\n\t\t\t\t{ sequenceNumber: 105, data: \"105\" },\n\t\t\t\t{ sequenceNumber: 106, data: \"106\" },\n\t\t\t\t{ sequenceNumber: 107, data: \"107\" },\n\t\t\t\t{ sequenceNumber: 108, data: \"108\" },\n\t\t\t\t{ sequenceNumber: 109, data: \"109\" },\n\t\t\t\t{ sequenceNumber: 110, data: \"110\" },\n\t\t\t\t{ sequenceNumber: 111, data: \"111\" },\n\t\t\t\t{ sequenceNumber: 112, data: \"112\" },\n\t\t\t\t{ sequenceNumber: 113, data: \"113\" },\n\t\t\t\t{ sequenceNumber: 114, data: \"114\" },\n\t\t\t\t{ sequenceNumber: 115, data: \"115\" },\n\t\t\t],\n\t\t\t{},\n\t\t\t3,\n\t\t\t3,\n\t\t);\n\t});\n\n\tit(\"Gap in ops\", async () => {\n\t\tconst mockCache = new MockCache();\n\t\tconst initialSeq = 100;\n\n\t\tconst mockData: MyDataInput[] = [\n\t\t\t{ sequenceNumber: 101, data: \"101\" },\n\t\t\t{ sequenceNumber: 102, data: \"102\" },\n\t\t\t{ sequenceNumber: 103, data: \"103\" },\n\t\t\t{ sequenceNumber: 104, data: \"104\" },\n\t\t\t{ sequenceNumber: 105, data: \"105\" },\n\t\t\t{ sequenceNumber: 106, data: \"106\" },\n\t\t\t// Gap:\n\t\t\t// { sequenceNumber: 107, data: \"107\" },\n\t\t\t{ sequenceNumber: 108, data: \"108\" },\n\t\t\t{ sequenceNumber: 109, data: \"109\" },\n\t\t\t// Start a new butch - that's where we had bug!\n\t\t\t{ sequenceNumber: 110, data: \"110\" },\n\t\t\t{ sequenceNumber: 111, data: \"111\" },\n\t\t];\n\t\tconst logger = new MockLogger();\n\t\tconst cache = new OpsCache(\n\t\t\tinitialSeq,\n\t\t\tlogger.toTelemetryLogger(),\n\t\t\tmockCache,\n\t\t\t5 /* batchSize */,\n\t\t\t-1, // timerGranularity\n\t\t\t100, // totalOpsToCache\n\t\t);\n\n\t\tcache.addOps(mockData);\n\t\tcache.flushOps();\n\n\t\tconst result = await cache.get(initialSeq + 1, undefined);\n\t\tassert.deepEqual(result, [\n\t\t\t{ sequenceNumber: 101, data: \"101\" },\n\t\t\t{ sequenceNumber: 102, data: \"102\" },\n\t\t\t{ sequenceNumber: 103, data: \"103\" },\n\t\t\t{ sequenceNumber: 104, data: \"104\" },\n\t\t\t{ sequenceNumber: 105, data: \"105\" },\n\t\t\t{ sequenceNumber: 106, data: \"106\" },\n\t\t]);\n\t\tlogger.assertMatchNone([{ category: \"error\" }]);\n\t});\n});\n\ndescribe(\"OdspDeltaStorageWithCache\", () => {\n\tasync function readAll(\n\t\tstream: IStream<ISequencedDocumentMessage[]>,\n\t): Promise<ISequencedDocumentMessage[]> {\n\t\tconst ops: ISequencedDocumentMessage[] = [];\n\t\t// eslint-disable-next-line no-constant-condition\n\t\twhile (true) {\n\t\t\tconst result = await stream.read();\n\t\t\tif (result.done) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tops.push(...result.value);\n\t\t}\n\t\treturn ops;\n\t}\n\n\tfunction createOps(fromArg: number, length: number): ISequencedDocumentMessage[] {\n\t\tconst ops: ISequencedDocumentMessage[] = [];\n\t\tlet from = fromArg;\n\t\tconst to = from + length;\n\t\twhile (from < to) {\n\t\t\t// eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n\t\t\tops.push({ sequenceNumber: from } as ISequencedDocumentMessage);\n\t\t\tfrom++;\n\t\t}\n\t\treturn ops;\n\t}\n\n\tfunction filterOps(\n\t\tops: ISequencedDocumentMessage[],\n\t\tfrom: number,\n\t\tto: number,\n\t): ISequencedDocumentMessage[] {\n\t\treturn ops.filter((op) => op.sequenceNumber >= from && op.sequenceNumber < to);\n\t}\n\n\tfunction validateOps(ops: ISequencedDocumentMessage[], from: number, to: number): void {\n\t\tif (to < from) {\n\t\t\tassert(ops.length === 0);\n\t\t} else {\n\t\t\tassert(ops.length === to - from);\n\t\t\tassert(ops.length === 0 || ops[0].sequenceNumber === from);\n\t\t\tassert(ops.length === 0 || ops[ops.length - 1].sequenceNumber === to - 1);\n\t\t}\n\t}\n\n\tasync function testStorage(\n\t\tfromTotal: number,\n\t\ttoTotal: number | undefined,\n\t\tcacheOnly: boolean,\n\t\topsFromSnapshot: number,\n\t\topsFromCache: number,\n\t\topsFromStorage: number,\n\t\tconcurrency = 1,\n\t\tbatchSize = 100,\n\t): Promise<void> {\n\t\tconst snapshotOps = createOps(fromTotal, opsFromSnapshot);\n\t\tconst cachedOps = createOps(fromTotal + opsFromSnapshot, opsFromCache);\n\t\tconst storageOps = createOps(fromTotal + opsFromSnapshot + opsFromCache, opsFromStorage);\n\n\t\tlet totalOps = opsFromSnapshot + opsFromCache + (cacheOnly ? 0 : opsFromStorage);\n\t\tconst actualTo = toTotal ?? fromTotal + totalOps;\n\t\tassert(actualTo <= fromTotal + totalOps); // code will deadlock if that's not the case\n\t\tconst askingOps = actualTo - fromTotal;\n\t\ttotalOps = Math.min(totalOps, askingOps);\n\n\t\tlet opsToCache: ISequencedDocumentMessage[] = [];\n\t\tconst logger = new MockLogger();\n\t\tconst storage = new OdspDeltaStorageWithCache(\n\t\t\tsnapshotOps,\n\t\t\tlogger.toTelemetryLogger(),\n\t\t\tbatchSize,\n\t\t\tconcurrency,\n\t\t\t// getFromStorage\n\t\t\tasync (from: number, to: number) => {\n\t\t\t\treturn { messages: filterOps(storageOps, from, to), partialResult: false };\n\t\t\t},\n\t\t\t// getCached\n\t\t\tasync (from: number, to: number) => filterOps(cachedOps, from, to),\n\t\t\t// requestFromSocket\n\t\t\t(from: number, to: number) => {},\n\t\t\t// opsReceived\n\t\t\t(ops: ISequencedDocumentMessage[]) => opsToCache.push(...ops),\n\t\t\t() => ({ isFirstSnapshotFromNetwork: false }) as unknown as OdspDocumentStorageService,\n\t\t);\n\n\t\tconst stream = storage.fetchMessages(\n\t\t\tfromTotal,\n\t\t\ttoTotal,\n\t\t\tundefined, // abortSignal\n\t\t\tcacheOnly,\n\t\t);\n\n\t\tconst opsAll = await readAll(stream);\n\n\t\tvalidateOps(opsAll, fromTotal, fromTotal + totalOps);\n\t\tif (cacheOnly) {\n\t\t\tassert(opsToCache.length === 0);\n\t\t} else {\n\t\t\topsToCache = opsToCache.sort((a, b) => a.sequenceNumber - b.sequenceNumber);\n\t\t\tvalidateOps(\n\t\t\t\topsToCache,\n\t\t\t\tfromTotal + opsFromSnapshot + opsFromCache,\n\t\t\t\tfromTotal + totalOps,\n\t\t\t);\n\t\t}\n\t\tlogger.assertMatchNone([{ category: \"error\" }]);\n\t}\n\n\tit(\"basic permutations\", async () => {\n\t\tawait testStorage(105, undefined, false, 0, 0, 0);\n\t\tawait testStorage(105, undefined, false, 110, 0, 0);\n\t\tawait testStorage(105, undefined, false, 110, 245, 0);\n\t\tawait testStorage(105, undefined, false, 110, 245, 1000);\n\t\tawait testStorage(105, undefined, false, 110, 9001, 8002);\n\n\t\tawait testStorage(105, undefined, false, 0, 245, 0);\n\t\tawait testStorage(105, undefined, false, 0, 9000, 0);\n\t\tawait testStorage(105, undefined, false, 0, 245, 150);\n\n\t\tawait testStorage(105, undefined, false, 110, 0, 150);\n\t\tawait testStorage(105, undefined, false, 0, 0, 150);\n\t});\n\n\tit(\"cached\", async () => {\n\t\tawait testStorage(105, undefined, true, 0, 0, 0);\n\t\tawait testStorage(105, undefined, true, 110, 0, 0);\n\t\tawait testStorage(105, undefined, true, 110, 245, 0);\n\t\tawait testStorage(105, undefined, true, 1001, 8001, 0);\n\t\tawait testStorage(105, undefined, true, 110, 245, 1000);\n\n\t\tawait testStorage(105, undefined, true, 0, 245, 0);\n\t\tawait testStorage(105, undefined, true, 0, 245, 150);\n\n\t\tawait testStorage(105, undefined, true, 110, 0, 150);\n\t\tawait testStorage(105, undefined, true, 0, 0, 150);\n\t});\n\n\tit(\"fixed to\", async () => {\n\t\tawait testStorage(105, 105 + 110, false, 110, 0, 0);\n\t\tawait testStorage(105, 105 + 110 + 245, false, 110, 245, 0);\n\t\tawait testStorage(105, 105 + 110 + 245 + 500, false, 110, 245, 1000);\n\n\t\tawait testStorage(105, 105 + 245 + 150, false, 0, 245, 150);\n\n\t\tawait testStorage(105, 105 + 110 + 150, false, 110, 0, 150);\n\t\tawait testStorage(105, 105 + 140, false, 0, 0, 150);\n\t});\n\n\tit(\"concurency\", async () => {\n\t\tawait testStorage(105, undefined, false, 0, 0, 0, 2);\n\t\tawait testStorage(105, undefined, false, 110, 0, 0, 2);\n\t\tawait testStorage(105, undefined, false, 110, 245, 0, 2);\n\t\tawait testStorage(105, undefined, false, 110, 245, 1000, 2);\n\t\tawait testStorage(105, undefined, false, 110, 9001, 8002, 2);\n\n\t\tawait testStorage(105, undefined, false, 0, 245, 0, 2);\n\t\tawait testStorage(105, undefined, false, 0, 9000, 0, 2);\n\t\tawait testStorage(105, undefined, false, 0, 245, 150, 2);\n\n\t\tawait testStorage(105, undefined, false, 110, 0, 150, 2);\n\t\tawait testStorage(105, undefined, false, 0, 0, 150, 2);\n\t});\n});\n"]}
1
+ {"version":3,"file":"opsCaching.spec.js","sourceRoot":"","sources":["../../src/test/opsCaching.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\nimport { strict as assert } from \"node:assert\";\nimport { delay } from \"@fluidframework/core-utils\";\nimport { IStream } from \"@fluidframework/driver-definitions\";\nimport { ISequencedDocumentMessage } from \"@fluidframework/protocol-definitions\";\nimport { MockLogger } from \"@fluidframework/telemetry-utils\";\nimport { OdspDeltaStorageWithCache } from \"../odspDeltaStorageService.js\";\nimport { OdspDocumentStorageService } from \"../odspDocumentStorageManager.js\";\nimport { CacheEntry, ICache, IMessage, OpsCache } from \"../opsCaching.js\";\n\nexport type MyDataInput = IMessage & { data: string };\n\nclass MockCache implements ICache {\n\tpublic writeCount = 0;\n\tpublic opsWritten = 0;\n\n\tpublic async write(batchNumber: string, data: string): Promise<void> {\n\t\tthis.writeCount++;\n\t\tthis.data[batchNumber] = JSON.parse(data);\n\t\tfor (const op of this.data[batchNumber] as CacheEntry) {\n\t\t\t// JSON.serialize converts undefined to null\n\t\t\tif (op !== null) {\n\t\t\t\tthis.opsWritten++;\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic async read(batchNumber: string): Promise<string | undefined> {\n\t\tconst content = this.data[batchNumber];\n\t\tif (content === undefined) {\n\t\t\treturn undefined;\n\t\t}\n\t\treturn JSON.stringify(content);\n\t}\n\n\tpublic remove(): void {\n\t\t// Do not reset this.writeCount such that we can test that writes happened, but later on data was cleared\n\t\tthis.writeCount++;\n\t\tthis.opsWritten++;\n\t\tthis.data = {};\n\t}\n\n\tpublic data: { [key: string]: unknown } = {};\n}\n\nasync function validate(\n\tmockCache: MockCache,\n\texpected: { [key: number]: (MyDataInput | undefined)[] },\n\tcache: OpsCache,\n\tinitialSeq: number,\n): Promise<void> {\n\tassert.deepEqual(mockCache.data, JSON.parse(JSON.stringify(expected)));\n\n\tconst expectedArr: MyDataInput[] = [];\n\tfor (const values of Object.values(expected)) {\n\t\tfor (const op of values) {\n\t\t\tif (op !== undefined) {\n\t\t\t\texpectedArr.push(op);\n\t\t\t}\n\t\t}\n\t}\n\n\tlet result = await cache.get(initialSeq + 1, undefined);\n\tassert.deepEqual(result, expectedArr);\n\n\tif (initialSeq >= 10) {\n\t\tresult = await cache.get(1, 10);\n\t\tassert(result.length === 0);\n\t}\n\n\t// Asking for one too early should result in empty result, as hit miss should result in no ops.\n\tif (initialSeq > 0) {\n\t\tresult = await cache.get(initialSeq, undefined);\n\t\tassert(result.length === 0);\n\t}\n\n\tif (expectedArr.length > 0) {\n\t\tconst last = expectedArr[expectedArr.length - 1].sequenceNumber + 1;\n\n\t\tresult = await cache.get(last, undefined);\n\t\tassert(result.length === 0);\n\n\t\tresult = await cache.get(last + 10, undefined);\n\t\tassert(result.length === 0);\n\n\t\tresult = await cache.get(initialSeq + 2, last);\n\t\tassert.deepEqual(result, expectedArr.slice(1));\n\n\t\tresult = await cache.get(initialSeq + 2, last + 100000);\n\t\tassert.deepEqual(result, expectedArr.slice(1));\n\n\t\tresult = await cache.get(initialSeq + 2, last - 1);\n\t\tassert.deepEqual(result, expectedArr.slice(1, -1));\n\t}\n}\n\nasync function runTestNoTimer(\n\tbatchSize: number,\n\tinitialSeq: number,\n\tmockData: MyDataInput[],\n\texpected: { [key: number]: (MyDataInput | undefined)[] },\n\tinitialWritesExpected: number,\n\ttotalOpsWritten?: number,\n): Promise<void> {\n\tconst mockCache = new MockCache();\n\tconst logger = new MockLogger();\n\tconst cache = new OpsCache(\n\t\tinitialSeq,\n\t\tlogger.toTelemetryLogger(),\n\t\tmockCache,\n\t\tbatchSize,\n\t\t-1, // timerGranularity\n\t\t10, // totalOpsToCache\n\t);\n\n\tcache.addOps(mockData);\n\n\tconst writes = mockCache.writeCount;\n\tassert.equal(writes, initialWritesExpected, \"initialWrites should match\");\n\n\t// Validate that writing same ops is not going to change anything\n\tcache.addOps(mockData);\n\tassert.equal(writes, mockCache.writeCount);\n\n\tawait validate(mockCache, expected, cache, initialSeq);\n\n\t// ensure all ops are flushed properly\n\tcache.flushOps();\n\tassert.equal(mockCache.opsWritten, totalOpsWritten ?? mockData.length);\n\n\t// ensure adding same ops and flushing again is doing nothing\n\tcache.addOps(mockData);\n\tcache.flushOps();\n\tassert.equal(\n\t\tmockCache.opsWritten,\n\t\ttotalOpsWritten ?? mockData.length,\n\t\t\"ops written does not match\",\n\t);\n\tlogger.assertMatchNone([{ category: \"error\" }]);\n}\n\nexport async function runTestWithTimer(\n\tbatchSize: number,\n\tinitialSeq: number,\n\tmockData: MyDataInput[],\n\texpected: { [key: number]: (MyDataInput | undefined)[] },\n\tinitialWritesExpected: number,\n\ttotalWritesExpected: number,\n\ttotalOpsWritten?: number,\n): Promise<void> {\n\tconst mockCache = new MockCache();\n\tconst logger = new MockLogger();\n\tconst cache = new OpsCache(\n\t\tinitialSeq,\n\t\tlogger.toTelemetryLogger(),\n\t\tmockCache,\n\t\tbatchSize,\n\t\t1, // timerGranularity\n\t\t10, // totalOpsToCache\n\t);\n\n\tcache.addOps(mockData);\n\tassert.equal(mockCache.writeCount, initialWritesExpected);\n\tawait validate(mockCache, expected, cache, initialSeq);\n\n\twhile (mockCache.writeCount < totalWritesExpected) {\n\t\tawait delay(1);\n\t}\n\tassert.equal(mockCache.writeCount, totalWritesExpected);\n\tassert.equal(mockCache.opsWritten, totalOpsWritten ?? mockData.length);\n\tlogger.assertMatchNone([{ category: \"error\" }]);\n}\n\nexport async function runTest(\n\tbatchSize: number,\n\tinitialSeq: number,\n\tmockData: MyDataInput[],\n\texpected: { [key: string]: (MyDataInput | undefined)[] },\n\tinitialWritesExpected: number,\n\ttotalWritesExpected: number,\n\ttotalOpsWritten?: number,\n): Promise<void> {\n\tawait runTestNoTimer(\n\t\tbatchSize,\n\t\tinitialSeq,\n\t\tmockData,\n\t\texpected,\n\t\tinitialWritesExpected,\n\t\ttotalOpsWritten,\n\t);\n\tawait runTestWithTimer(\n\t\tbatchSize,\n\t\tinitialSeq,\n\t\tmockData,\n\t\texpected,\n\t\tinitialWritesExpected,\n\t\ttotalWritesExpected,\n\t\ttotalOpsWritten,\n\t);\n}\n\ndescribe(\"OpsCache\", () => {\n\tconst mockData1: MyDataInput[] = [\n\t\t{ sequenceNumber: 105, data: \"105\" },\n\t\t{ sequenceNumber: 110, data: \"110\" },\n\t\t{ sequenceNumber: 115, data: \"115\" },\n\t\t{ sequenceNumber: 120, data: \"120\" },\n\t\t{ sequenceNumber: 125, data: \"125\" },\n\t\t{ sequenceNumber: 130, data: \"130\" },\n\t\t{ sequenceNumber: 135, data: \"135\" },\n\t\t{ sequenceNumber: 140, data: \"140\" },\n\t\t{ sequenceNumber: 145, data: \"140\" },\n\t];\n\n\tit(\"1 element in each batch of 5 should not commit\", async () => {\n\t\tawait runTest(5, 100, mockData1, {}, 0, 9);\n\t});\n\n\tit(\"2 element in each batch of 10 should not commit\", async () => {\n\t\tawait runTest(10, 100, mockData1, {}, 0, 4, 8);\n\t});\n\n\tit(\"6 sequential elements with batch of 5 should commit 1 batch\", async () => {\n\t\tawait runTest(\n\t\t\t5,\n\t\t\t100,\n\t\t\t[\n\t\t\t\t{ sequenceNumber: 101, data: \"101\" },\n\t\t\t\t{ sequenceNumber: 102, data: \"102\" },\n\t\t\t\t{ sequenceNumber: 103, data: \"103\" },\n\t\t\t\t{ sequenceNumber: 104, data: \"104\" },\n\t\t\t\t{ sequenceNumber: 105, data: \"105\" },\n\t\t\t],\n\t\t\t{\n\t\t\t\t\"5_20\": [\n\t\t\t\t\tundefined,\n\t\t\t\t\t{ sequenceNumber: 101, data: \"101\" },\n\t\t\t\t\t{ sequenceNumber: 102, data: \"102\" },\n\t\t\t\t\t{ sequenceNumber: 103, data: \"103\" },\n\t\t\t\t\t{ sequenceNumber: 104, data: \"104\" },\n\t\t\t\t],\n\t\t\t},\n\t\t\t1,\n\t\t\t2,\n\t\t);\n\t});\n\n\tit(\"Epmty ops at beginning and end of batch should cause the batch to not be cached\", async () => {\n\t\tawait runTest(\n\t\t\t5,\n\t\t\t100,\n\t\t\t[\n\t\t\t\t{ sequenceNumber: 101, data: \"101\" },\n\t\t\t\t{ sequenceNumber: 102, data: \"102\" },\n\t\t\t\t{ sequenceNumber: 103, data: \"103\" },\n\t\t\t],\n\t\t\t{},\n\t\t\t0,\n\t\t\t0,\n\t\t\t0,\n\t\t);\n\t});\n\n\tit(\"Epmty ops at just the beginning should still cause the batch to be cached\", async () => {\n\t\tawait runTest(\n\t\t\t5,\n\t\t\t100,\n\t\t\t[\n\t\t\t\t{ sequenceNumber: 101, data: \"101\" },\n\t\t\t\t{ sequenceNumber: 102, data: \"102\" },\n\t\t\t\t{ sequenceNumber: 103, data: \"103\" },\n\t\t\t\t{ sequenceNumber: 104, data: \"104\" },\n\t\t\t],\n\t\t\t{\n\t\t\t\t\"5_20\": [\n\t\t\t\t\tundefined,\n\t\t\t\t\t{ sequenceNumber: 101, data: \"101\" },\n\t\t\t\t\t{ sequenceNumber: 102, data: \"102\" },\n\t\t\t\t\t{ sequenceNumber: 103, data: \"103\" },\n\t\t\t\t\t{ sequenceNumber: 104, data: \"104\" },\n\t\t\t\t],\n\t\t\t},\n\t\t\t1,\n\t\t\t1,\n\t\t\t4,\n\t\t);\n\t});\n\n\tconst mockData3: MyDataInput[] = [\n\t\t{ sequenceNumber: 102, data: \"102\" },\n\t\t{ sequenceNumber: 103, data: \"103\" },\n\t];\n\n\tit(\"3 sequential elements with batch of 2 and offset of 1 should commit 2 batches\", async () => {\n\t\tawait runTest(\n\t\t\t2,\n\t\t\t101,\n\t\t\tmockData3,\n\t\t\t{\n\t\t\t\t\"2_51\": [\n\t\t\t\t\t{ sequenceNumber: 102, data: \"102\" },\n\t\t\t\t\t{ sequenceNumber: 103, data: \"103\" },\n\t\t\t\t],\n\t\t\t},\n\t\t\t1,\n\t\t\t1,\n\t\t);\n\t});\n\n\tit(\"with batch size of 1 all ops should commit in own batch\", async () => {\n\t\tawait runTest(\n\t\t\t1,\n\t\t\t101,\n\t\t\tmockData3,\n\t\t\t{\n\t\t\t\t\"1_102\": [{ sequenceNumber: 102, data: \"102\" }],\n\t\t\t\t\"1_103\": [{ sequenceNumber: 103, data: \"103\" }],\n\t\t\t},\n\t\t\t2,\n\t\t\t2,\n\t\t);\n\t});\n\n\tit(\"Too many ops\", async () => {\n\t\tawait runTest(\n\t\t\t5,\n\t\t\t100,\n\t\t\t[\n\t\t\t\t{ sequenceNumber: 105, data: \"105\" },\n\t\t\t\t{ sequenceNumber: 106, data: \"106\" },\n\t\t\t\t{ sequenceNumber: 107, data: \"107\" },\n\t\t\t\t{ sequenceNumber: 108, data: \"108\" },\n\t\t\t\t{ sequenceNumber: 109, data: \"109\" },\n\t\t\t\t{ sequenceNumber: 110, data: \"110\" },\n\t\t\t\t{ sequenceNumber: 111, data: \"111\" },\n\t\t\t\t{ sequenceNumber: 112, data: \"112\" },\n\t\t\t\t{ sequenceNumber: 113, data: \"113\" },\n\t\t\t\t{ sequenceNumber: 114, data: \"114\" },\n\t\t\t\t{ sequenceNumber: 115, data: \"115\" },\n\t\t\t],\n\t\t\t{},\n\t\t\t3,\n\t\t\t3,\n\t\t);\n\t});\n\n\tit(\"Gap in ops\", async () => {\n\t\tconst mockCache = new MockCache();\n\t\tconst initialSeq = 100;\n\n\t\tconst mockData: MyDataInput[] = [\n\t\t\t{ sequenceNumber: 101, data: \"101\" },\n\t\t\t{ sequenceNumber: 102, data: \"102\" },\n\t\t\t{ sequenceNumber: 103, data: \"103\" },\n\t\t\t{ sequenceNumber: 104, data: \"104\" },\n\t\t\t{ sequenceNumber: 105, data: \"105\" },\n\t\t\t{ sequenceNumber: 106, data: \"106\" },\n\t\t\t// Gap:\n\t\t\t// { sequenceNumber: 107, data: \"107\" },\n\t\t\t{ sequenceNumber: 108, data: \"108\" },\n\t\t\t{ sequenceNumber: 109, data: \"109\" },\n\t\t\t// Start a new butch - that's where we had bug!\n\t\t\t{ sequenceNumber: 110, data: \"110\" },\n\t\t\t{ sequenceNumber: 111, data: \"111\" },\n\t\t];\n\t\tconst logger = new MockLogger();\n\t\tconst cache = new OpsCache(\n\t\t\tinitialSeq,\n\t\t\tlogger.toTelemetryLogger(),\n\t\t\tmockCache,\n\t\t\t5 /* batchSize */,\n\t\t\t-1, // timerGranularity\n\t\t\t100, // totalOpsToCache\n\t\t);\n\n\t\tcache.addOps(mockData);\n\t\tcache.flushOps();\n\n\t\tconst result = await cache.get(initialSeq + 1, undefined);\n\t\tassert.deepEqual(result, [\n\t\t\t{ sequenceNumber: 101, data: \"101\" },\n\t\t\t{ sequenceNumber: 102, data: \"102\" },\n\t\t\t{ sequenceNumber: 103, data: \"103\" },\n\t\t\t{ sequenceNumber: 104, data: \"104\" },\n\t\t\t{ sequenceNumber: 105, data: \"105\" },\n\t\t\t{ sequenceNumber: 106, data: \"106\" },\n\t\t]);\n\t\tlogger.assertMatchNone([{ category: \"error\" }]);\n\t});\n});\n\ndescribe(\"OdspDeltaStorageWithCache\", () => {\n\tasync function readAll(\n\t\tstream: IStream<ISequencedDocumentMessage[]>,\n\t): Promise<ISequencedDocumentMessage[]> {\n\t\tconst ops: ISequencedDocumentMessage[] = [];\n\t\t// eslint-disable-next-line no-constant-condition\n\t\twhile (true) {\n\t\t\tconst result = await stream.read();\n\t\t\tif (result.done) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tops.push(...result.value);\n\t\t}\n\t\treturn ops;\n\t}\n\n\tfunction createOps(fromArg: number, length: number): ISequencedDocumentMessage[] {\n\t\tconst ops: ISequencedDocumentMessage[] = [];\n\t\tlet from = fromArg;\n\t\tconst to = from + length;\n\t\twhile (from < to) {\n\t\t\t// eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n\t\t\tops.push({ sequenceNumber: from } as ISequencedDocumentMessage);\n\t\t\tfrom++;\n\t\t}\n\t\treturn ops;\n\t}\n\n\tfunction filterOps(\n\t\tops: ISequencedDocumentMessage[],\n\t\tfrom: number,\n\t\tto: number,\n\t): ISequencedDocumentMessage[] {\n\t\treturn ops.filter((op) => op.sequenceNumber >= from && op.sequenceNumber < to);\n\t}\n\n\tfunction validateOps(ops: ISequencedDocumentMessage[], from: number, to: number): void {\n\t\tif (to < from) {\n\t\t\tassert(ops.length === 0);\n\t\t} else {\n\t\t\tassert(ops.length === to - from);\n\t\t\tassert(ops.length === 0 || ops[0].sequenceNumber === from);\n\t\t\tassert(ops.length === 0 || ops[ops.length - 1].sequenceNumber === to - 1);\n\t\t}\n\t}\n\n\tasync function testStorage(\n\t\tfromTotal: number,\n\t\ttoTotal: number | undefined,\n\t\tcacheOnly: boolean,\n\t\topsFromSnapshot: number,\n\t\topsFromCache: number,\n\t\topsFromStorage: number,\n\t\tconcurrency = 1,\n\t\tbatchSize = 100,\n\t): Promise<void> {\n\t\tconst snapshotOps = createOps(fromTotal, opsFromSnapshot);\n\t\tconst cachedOps = createOps(fromTotal + opsFromSnapshot, opsFromCache);\n\t\tconst storageOps = createOps(fromTotal + opsFromSnapshot + opsFromCache, opsFromStorage);\n\n\t\tlet totalOps = opsFromSnapshot + opsFromCache + (cacheOnly ? 0 : opsFromStorage);\n\t\tconst actualTo = toTotal ?? fromTotal + totalOps;\n\t\tassert(actualTo <= fromTotal + totalOps); // code will deadlock if that's not the case\n\t\tconst askingOps = actualTo - fromTotal;\n\t\ttotalOps = Math.min(totalOps, askingOps);\n\n\t\tlet opsToCache: ISequencedDocumentMessage[] = [];\n\t\tconst logger = new MockLogger();\n\t\tconst storage = new OdspDeltaStorageWithCache(\n\t\t\tsnapshotOps,\n\t\t\tlogger.toTelemetryLogger(),\n\t\t\tbatchSize,\n\t\t\tconcurrency,\n\t\t\t// getFromStorage\n\t\t\tasync (from: number, to: number) => {\n\t\t\t\treturn { messages: filterOps(storageOps, from, to), partialResult: false };\n\t\t\t},\n\t\t\t// getCached\n\t\t\tasync (from: number, to: number) => filterOps(cachedOps, from, to),\n\t\t\t// requestFromSocket\n\t\t\t(from: number, to: number) => {},\n\t\t\t// opsReceived\n\t\t\t(ops: ISequencedDocumentMessage[]) => opsToCache.push(...ops),\n\t\t\t() => ({ isFirstSnapshotFromNetwork: false }) as unknown as OdspDocumentStorageService,\n\t\t);\n\n\t\tconst stream = storage.fetchMessages(\n\t\t\tfromTotal,\n\t\t\ttoTotal,\n\t\t\tundefined, // abortSignal\n\t\t\tcacheOnly,\n\t\t);\n\n\t\tconst opsAll = await readAll(stream);\n\n\t\tvalidateOps(opsAll, fromTotal, fromTotal + totalOps);\n\t\tif (cacheOnly) {\n\t\t\tassert(opsToCache.length === 0);\n\t\t} else {\n\t\t\topsToCache = opsToCache.sort((a, b) => a.sequenceNumber - b.sequenceNumber);\n\t\t\tvalidateOps(\n\t\t\t\topsToCache,\n\t\t\t\tfromTotal + opsFromSnapshot + opsFromCache,\n\t\t\t\tfromTotal + totalOps,\n\t\t\t);\n\t\t}\n\t\tlogger.assertMatchNone([{ category: \"error\" }]);\n\t}\n\n\tit(\"basic permutations\", async () => {\n\t\tawait testStorage(105, undefined, false, 0, 0, 0);\n\t\tawait testStorage(105, undefined, false, 110, 0, 0);\n\t\tawait testStorage(105, undefined, false, 110, 245, 0);\n\t\tawait testStorage(105, undefined, false, 110, 245, 1000);\n\t\tawait testStorage(105, undefined, false, 110, 9001, 8002);\n\n\t\tawait testStorage(105, undefined, false, 0, 245, 0);\n\t\tawait testStorage(105, undefined, false, 0, 9000, 0);\n\t\tawait testStorage(105, undefined, false, 0, 245, 150);\n\n\t\tawait testStorage(105, undefined, false, 110, 0, 150);\n\t\tawait testStorage(105, undefined, false, 0, 0, 150);\n\t});\n\n\tit(\"cached\", async () => {\n\t\tawait testStorage(105, undefined, true, 0, 0, 0);\n\t\tawait testStorage(105, undefined, true, 110, 0, 0);\n\t\tawait testStorage(105, undefined, true, 110, 245, 0);\n\t\tawait testStorage(105, undefined, true, 1001, 8001, 0);\n\t\tawait testStorage(105, undefined, true, 110, 245, 1000);\n\n\t\tawait testStorage(105, undefined, true, 0, 245, 0);\n\t\tawait testStorage(105, undefined, true, 0, 245, 150);\n\n\t\tawait testStorage(105, undefined, true, 110, 0, 150);\n\t\tawait testStorage(105, undefined, true, 0, 0, 150);\n\t});\n\n\tit(\"fixed to\", async () => {\n\t\tawait testStorage(105, 105 + 110, false, 110, 0, 0);\n\t\tawait testStorage(105, 105 + 110 + 245, false, 110, 245, 0);\n\t\tawait testStorage(105, 105 + 110 + 245 + 500, false, 110, 245, 1000);\n\n\t\tawait testStorage(105, 105 + 245 + 150, false, 0, 245, 150);\n\n\t\tawait testStorage(105, 105 + 110 + 150, false, 110, 0, 150);\n\t\tawait testStorage(105, 105 + 140, false, 0, 0, 150);\n\t});\n\n\tit(\"concurency\", async () => {\n\t\tawait testStorage(105, undefined, false, 0, 0, 0, 2);\n\t\tawait testStorage(105, undefined, false, 110, 0, 0, 2);\n\t\tawait testStorage(105, undefined, false, 110, 245, 0, 2);\n\t\tawait testStorage(105, undefined, false, 110, 245, 1000, 2);\n\t\tawait testStorage(105, undefined, false, 110, 9001, 8002, 2);\n\n\t\tawait testStorage(105, undefined, false, 0, 245, 0, 2);\n\t\tawait testStorage(105, undefined, false, 0, 9000, 0, 2);\n\t\tawait testStorage(105, undefined, false, 0, 245, 150, 2);\n\n\t\tawait testStorage(105, undefined, false, 110, 0, 150, 2);\n\t\tawait testStorage(105, undefined, false, 0, 0, 150, 2);\n\t});\n});\n"]}
@@ -4,20 +4,20 @@
4
4
  */
5
5
  /* eslint-disable @typescript-eslint/no-floating-promises */
6
6
  import { strict as assert } from "node:assert";
7
+ import { stringToBuffer } from "@fluid-internal/client-utils";
8
+ import { FetchSource } from "@fluidframework/driver-definitions";
7
9
  import { getKeyForCacheEntry, } from "@fluidframework/odsp-driver-definitions";
8
10
  import { MockLogger } from "@fluidframework/telemetry-utils";
9
- import { FetchSource } from "@fluidframework/driver-definitions";
10
- import { stringToBuffer } from "@fluid-internal/client-utils";
11
+ import { convertToCompactSnapshot } from "../compactSnapshotWriter.js";
11
12
  import { persistedCacheValueVersion, } from "../contracts.js";
12
- import { LocalPersistentCache } from "../odspCache.js";
13
- import { createCacheSnapshotKey } from "../odspUtils.js";
14
13
  import { createOdspUrl } from "../createOdspUrl.js";
15
- import { getHashedDocumentId } from "../odspPublicUtils.js";
14
+ import { LocalPersistentCache } from "../odspCache.js";
15
+ import { OdspDocumentServiceFactory } from "../odspDocumentServiceFactory.js";
16
16
  import { OdspDriverUrlResolver } from "../odspDriverUrlResolver.js";
17
+ import { getHashedDocumentId } from "../odspPublicUtils.js";
18
+ import { createCacheSnapshotKey } from "../odspUtils.js";
17
19
  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";
20
+ import { createResponse, mockFetchSingle, notFound } from "./mockFetch.js";
21
21
  const createUtLocalCache = () => new LocalPersistentCache();
22
22
  describe("Tests for prefetching snapshot", () => {
23
23
  const siteUrl = "https://microsoft.sharepoint-df.com/siteUrl";
@@ -1 +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"]}
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 { stringToBuffer } from \"@fluid-internal/client-utils\";\nimport { PromiseCache } from \"@fluidframework/core-utils\";\nimport { FetchSource, ISnapshot } from \"@fluidframework/driver-definitions\";\nimport {\n\tICacheEntry,\n\tIOdspResolvedUrl,\n\tgetKeyForCacheEntry,\n} from \"@fluidframework/odsp-driver-definitions\";\nimport { ISnapshotTree } from \"@fluidframework/protocol-definitions\";\nimport { MockLogger } from \"@fluidframework/telemetry-utils\";\nimport { convertToCompactSnapshot } from \"../compactSnapshotWriter.js\";\nimport {\n\tHostStoragePolicyInternal,\n\tIOdspSnapshot,\n\tIVersionedValueWithEpoch,\n\tpersistedCacheValueVersion,\n} from \"../contracts.js\";\nimport { createOdspUrl } from \"../createOdspUrl.js\";\nimport { IPrefetchSnapshotContents, LocalPersistentCache } from \"../odspCache.js\";\nimport { OdspDocumentServiceFactory } from \"../odspDocumentServiceFactory.js\";\nimport { OdspDocumentStorageService } from \"../odspDocumentStorageManager.js\";\nimport { OdspDriverUrlResolver } from \"../odspDriverUrlResolver.js\";\nimport { getHashedDocumentId } from \"../odspPublicUtils.js\";\nimport { INewFileInfo, createCacheSnapshotKey } from \"../odspUtils.js\";\nimport { prefetchLatestSnapshot } from \"../prefetchLatestSnapshot.js\";\nimport { createResponse, mockFetchSingle, notFound } 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"]}
@@ -1 +1 @@
1
- {"version":3,"file":"snapshotFormatTests.spec.js","sourceRoot":"","sources":["../../src/test/snapshotFormatTests.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\nimport { strict as assert } from \"node:assert\";\nimport { ISequencedDocumentMessage, ISnapshotTree } from \"@fluidframework/protocol-definitions\";\nimport { stringToBuffer } from \"@fluid-internal/client-utils\";\nimport { ISnapshot } from \"@fluidframework/driver-definitions\";\nimport { MockLogger } from \"@fluidframework/telemetry-utils\";\nimport { parseCompactSnapshotResponse } from \"../compactSnapshotParser.js\";\nimport { convertToCompactSnapshot } from \"../compactSnapshotWriter.js\";\n\nconst snapshotTree: ISnapshotTree = {\n\tid: \"SnapshotId\",\n\tblobs: {},\n\ttrees: {\n\t\t\".protocol\": {\n\t\t\tblobs: {\n\t\t\t\tattributes: \"bARADgIe4qmDjJl2l2zz12IM3\",\n\t\t\t\tquorumMembers: \"bARBkx1nses1pHL1vKnmFUfIC\",\n\t\t\t\tquorumProposals: \"bARBkx1nses1pHL1vKnmFUfIC\",\n\t\t\t},\n\t\t\ttrees: {},\n\t\t},\n\t\t\".app\": {\n\t\t\tblobs: { \".metadata\": \"bARD4RKvW4LL1KmaUKp6hUMSp\" },\n\t\t\ttrees: {\n\t\t\t\t\".channels\": {\n\t\t\t\t\tblobs: {},\n\t\t\t\t\ttrees: {\n\t\t\t\t\t\tdefault: {\n\t\t\t\t\t\t\tblobs: {\n\t\t\t\t\t\t\t\t\".component\": \"bARC6dCXlcrPxQHw3PeROtmKc\",\n\t\t\t\t\t\t\t\t\"gc\": \"bARDNMoBed+nKrsf04id52iUA\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\ttrees: {\n\t\t\t\t\t\t\t\t\".channels\": {\n\t\t\t\t\t\t\t\t\tblobs: {},\n\t\t\t\t\t\t\t\t\ttrees: {\n\t\t\t\t\t\t\t\t\t\troot: { blobs: {}, trees: {} },\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},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tunreferenced: true,\n\t\t\t\t},\n\t\t\t\t\".blobs\": { blobs: {}, trees: {} },\n\t\t\t},\n\t\t\tunreferenced: true,\n\t\t},\n\t},\n};\n\nconst blobContents = new Map<string, ArrayBuffer>([\n\t[\n\t\t\"bARADgIe4qmDjJl2l2zz12IM3\",\n\t\tstringToBuffer(\n\t\t\tJSON.stringify({ branch: \"\", minimumSequenceNumber: 0, sequenceNumber: 0, term: 1 }),\n\t\t\t\"utf8\",\n\t\t),\n\t],\n\t[\"bARBkx1nses1pHL1vKnmFUfIC\", stringToBuffer(JSON.stringify([]), \"utf8\")],\n\t[\n\t\t\"bARD4RKvW4LL1KmaUKp6hUMSp\",\n\t\tstringToBuffer(JSON.stringify({ summaryFormatVersion: 1, gcFeature: 0 }), \"utf8\"),\n\t],\n\t[\n\t\t\"bARC6dCXlcrPxQHw3PeROtmKc\",\n\t\tstringToBuffer(\n\t\t\tJSON.stringify({\n\t\t\t\tpkg: '[\"@fluid-example/smde\"]',\n\t\t\t\tsummaryFormatVersion: 2,\n\t\t\t\tisRootDataStore: true,\n\t\t\t}),\n\t\t\t\"utf8\",\n\t\t),\n\t],\n\t[\n\t\t\"bARDNMoBed+nKrsf04id52iUA\",\n\t\tstringToBuffer(\n\t\t\tJSON.stringify({\n\t\t\t\tusedRoutes: [\"\"],\n\t\t\t\tgcData: {\n\t\t\t\t\tgcNodes: {\n\t\t\t\t\t\t\"/root\": [\"/default/01b197a2-0432-413b-b2c9-83a992b804c4\", \"/default\"],\n\t\t\t\t\t\t\"/01b197a2-0432-413b-b2c9-83a992b804c4\": [\"/default\"],\n\t\t\t\t\t\t\"/\": [\"/default/root\", \"/default/01b197a2-0432-413b-b2c9-83a992b804c4\"],\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t}),\n\t\t\t\"utf8\",\n\t\t),\n\t],\n]);\n\nconst ops: ISequencedDocumentMessage[] = [\n\t{\n\t\tclientId: \"X\",\n\t\tclientSequenceNumber: -1,\n\t\tcontents: null,\n\t\tminimumSequenceNumber: 0,\n\t\treferenceSequenceNumber: -1,\n\t\tsequenceNumber: 1,\n\t\ttimestamp: 1623883807452,\n\t\ttype: \"join\",\n\t},\n\t{\n\t\tclientId: \"Y\",\n\t\tclientSequenceNumber: -1,\n\t\tcontents: null,\n\t\tminimumSequenceNumber: 0,\n\t\treferenceSequenceNumber: -1,\n\t\tsequenceNumber: 2,\n\t\ttimestamp: 1623883811928,\n\t\ttype: \"join\",\n\t},\n];\n\nconst snapshotTreeWithGroupId: ISnapshotTree = {\n\tid: \"SnapshotId\",\n\tblobs: {},\n\ttrees: {\n\t\t\".protocol\": {\n\t\t\tblobs: {},\n\t\t\ttrees: {},\n\t\t},\n\t\t\".app\": {\n\t\t\tblobs: { \".metadata\": \"bARD4RKvW4LL1KmaUKp6hUMSp\" },\n\t\t\ttrees: {\n\t\t\t\t\".channels\": {\n\t\t\t\t\tblobs: {},\n\t\t\t\t\ttrees: {\n\t\t\t\t\t\tdefault: {\n\t\t\t\t\t\t\tblobs: {},\n\t\t\t\t\t\t\ttrees: {\n\t\t\t\t\t\t\t\tdds: {\n\t\t\t\t\t\t\t\t\tblobs: {},\n\t\t\t\t\t\t\t\t\ttrees: {},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tgroupId: \"G3\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tunreferenced: true,\n\t\t\t\t\tgroupId: \"G2\",\n\t\t\t\t\tomitted: false,\n\t\t\t\t},\n\t\t\t\t\".blobs\": { blobs: {}, trees: {} },\n\t\t\t},\n\t\t\tunreferenced: true,\n\t\t\tgroupId: \"G4\",\n\t\t},\n\t},\n};\n\nconst blobContents2 = new Map<string, ArrayBuffer>([\n\t[\n\t\t\"bARD4RKvW4LL1KmaUKp6hUMSp\",\n\t\tstringToBuffer(JSON.stringify({ summaryFormatVersion: 1, gcFeature: 0 }), \"utf8\"),\n\t],\n]);\n\ndescribe(\"Snapshot Format Conversion Tests\", () => {\n\tit(\"Conversion test\", async () => {\n\t\tconst snapshotContents: ISnapshot = {\n\t\t\tsnapshotTree,\n\t\t\tblobContents,\n\t\t\tops,\n\t\t\tsequenceNumber: 0,\n\t\t\tlatestSequenceNumber: 2,\n\t\t\tsnapshotFormatV: 1,\n\t\t};\n\t\tconst logger = new MockLogger();\n\t\tconst compactSnapshot = convertToCompactSnapshot(snapshotContents);\n\t\tconst result = parseCompactSnapshotResponse(compactSnapshot, logger.toTelemetryLogger());\n\t\tassert.deepStrictEqual(result.snapshotTree, snapshotTree, \"Tree structure should match\");\n\t\tassert.deepStrictEqual(result.blobContents, blobContents, \"Blobs content should match\");\n\t\tassert.deepStrictEqual(result.ops, ops, \"Ops should match\");\n\t\tassert(result.sequenceNumber === 0, \"Seq number should match\");\n\t\tassert(result.latestSequenceNumber === 2, \"Latest sequence number should match\");\n\t\tassert(\n\t\t\t(result.snapshotTree.id = snapshotContents.snapshotTree.id),\n\t\t\t\"Snapshot id should match\",\n\t\t);\n\t\t// Convert to compact snapshot again and then match to previous one.\n\t\tconst compactSnapshot2 = convertToCompactSnapshot(result);\n\t\tassert.deepStrictEqual(\n\t\t\tcompactSnapshot2.buffer,\n\t\t\tcompactSnapshot.buffer,\n\t\t\t\"Compact representation should remain same\",\n\t\t);\n\t\tlogger.assertMatchNone([{ category: \"error\" }]);\n\t});\n\n\tit(\"Conversion test with empty ops\", async () => {\n\t\tconst snapshotContents: ISnapshot = {\n\t\t\tsnapshotTree,\n\t\t\tblobContents,\n\t\t\tops: [],\n\t\t\tsequenceNumber: 0,\n\t\t\tlatestSequenceNumber: 2,\n\t\t\tsnapshotFormatV: 1,\n\t\t};\n\t\tconst logger = new MockLogger();\n\t\tconst compactSnapshot = convertToCompactSnapshot(snapshotContents);\n\t\tconst result = parseCompactSnapshotResponse(compactSnapshot, logger.toTelemetryLogger());\n\t\tassert.deepStrictEqual(result.snapshotTree, snapshotTree, \"Tree structure should match\");\n\t\tassert.deepStrictEqual(result.blobContents, blobContents, \"Blobs content should match\");\n\t\tassert.deepStrictEqual(result.ops, [], \"Ops should match\");\n\t\tassert(result.sequenceNumber === 0, \"Seq number should match\");\n\t\tassert(result.latestSequenceNumber === 2, \"Latest sequence number should match\");\n\t\tassert(\n\t\t\t(result.snapshotTree.id = snapshotContents.snapshotTree.id),\n\t\t\t\"Snapshot id should match\",\n\t\t);\n\t\t// Convert to compact snapshot again and then match to previous one.\n\t\tconst compactSnapshot2 = convertToCompactSnapshot(result);\n\t\tassert.deepStrictEqual(\n\t\t\tcompactSnapshot2.buffer,\n\t\t\tcompactSnapshot.buffer,\n\t\t\t\"Compact representation should remain same\",\n\t\t);\n\t\tlogger.assertMatchNone([{ category: \"error\" }]);\n\t});\n\n\tit(\"Conversion test for snapshot with GroupId\", async () => {\n\t\tconst snapshotContents: ISnapshot = {\n\t\t\tsnapshotTree: snapshotTreeWithGroupId,\n\t\t\tblobContents: blobContents2,\n\t\t\tops,\n\t\t\tsequenceNumber: 0,\n\t\t\tlatestSequenceNumber: 2,\n\t\t\tsnapshotFormatV: 1,\n\t\t};\n\t\tconst logger = new MockLogger();\n\t\tconst compactSnapshot = convertToCompactSnapshot(snapshotContents);\n\t\tconst result = parseCompactSnapshotResponse(compactSnapshot, logger.toTelemetryLogger());\n\t\tassert.deepStrictEqual(\n\t\t\tresult.snapshotTree,\n\t\t\tsnapshotTreeWithGroupId,\n\t\t\t\"Tree structure should match\",\n\t\t);\n\t\tassert.deepStrictEqual(result.blobContents, blobContents2, \"Blobs content should match\");\n\t\tassert.deepStrictEqual(result.ops, ops, \"Ops should match\");\n\t\tassert(result.sequenceNumber === 0, \"Seq number should match\");\n\t\tassert(result.latestSequenceNumber === 2, \"Latest sequence number should match\");\n\t\tassert(\n\t\t\t(result.snapshotTree.id = snapshotContents.snapshotTree.id),\n\t\t\t\"Snapshot id should match\",\n\t\t);\n\t\t// Convert to compact snapshot again and then match to previous one.\n\t\tconst compactSnapshot2 = convertToCompactSnapshot(result);\n\t\tassert.deepStrictEqual(\n\t\t\tcompactSnapshot2.buffer,\n\t\t\tcompactSnapshot.buffer,\n\t\t\t\"Compact representation should remain same\",\n\t\t);\n\t\tlogger.assertMatchNone([{ category: \"error\" }]);\n\t});\n});\n"]}
1
+ {"version":3,"file":"snapshotFormatTests.spec.js","sourceRoot":"","sources":["../../src/test/snapshotFormatTests.spec.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,IAAI,MAAM,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAG9D,OAAO,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAC7D,OAAO,EAAE,4BAA4B,EAAE,MAAM,6BAA6B,CAAC;AAC3E,OAAO,EAAE,wBAAwB,EAAE,MAAM,6BAA6B,CAAC;AAEvE,MAAM,YAAY,GAAkB;IACnC,EAAE,EAAE,YAAY;IAChB,KAAK,EAAE,EAAE;IACT,KAAK,EAAE;QACN,WAAW,EAAE;YACZ,KAAK,EAAE;gBACN,UAAU,EAAE,2BAA2B;gBACvC,aAAa,EAAE,2BAA2B;gBAC1C,eAAe,EAAE,2BAA2B;aAC5C;YACD,KAAK,EAAE,EAAE;SACT;QACD,MAAM,EAAE;YACP,KAAK,EAAE,EAAE,WAAW,EAAE,2BAA2B,EAAE;YACnD,KAAK,EAAE;gBACN,WAAW,EAAE;oBACZ,KAAK,EAAE,EAAE;oBACT,KAAK,EAAE;wBACN,OAAO,EAAE;4BACR,KAAK,EAAE;gCACN,YAAY,EAAE,2BAA2B;gCACzC,IAAI,EAAE,2BAA2B;6BACjC;4BACD,KAAK,EAAE;gCACN,WAAW,EAAE;oCACZ,KAAK,EAAE,EAAE;oCACT,KAAK,EAAE;wCACN,IAAI,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE;qCAC9B;iCACD;6BACD;yBACD;qBACD;oBACD,YAAY,EAAE,IAAI;iBAClB;gBACD,QAAQ,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE;aAClC;YACD,YAAY,EAAE,IAAI;SAClB;KACD;CACD,CAAC;AAEF,MAAM,YAAY,GAAG,IAAI,GAAG,CAAsB;IACjD;QACC,2BAA2B;QAC3B,cAAc,CACb,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,qBAAqB,EAAE,CAAC,EAAE,cAAc,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,EACpF,MAAM,CACN;KACD;IACD,CAAC,2BAA2B,EAAE,cAAc,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;IACzE;QACC,2BAA2B;QAC3B,cAAc,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,oBAAoB,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC;KACjF;IACD;QACC,2BAA2B;QAC3B,cAAc,CACb,IAAI,CAAC,SAAS,CAAC;YACd,GAAG,EAAE,yBAAyB;YAC9B,oBAAoB,EAAE,CAAC;YACvB,eAAe,EAAE,IAAI;SACrB,CAAC,EACF,MAAM,CACN;KACD;IACD;QACC,2BAA2B;QAC3B,cAAc,CACb,IAAI,CAAC,SAAS,CAAC;YACd,UAAU,EAAE,CAAC,EAAE,CAAC;YAChB,MAAM,EAAE;gBACP,OAAO,EAAE;oBACR,OAAO,EAAE,CAAC,+CAA+C,EAAE,UAAU,CAAC;oBACtE,uCAAuC,EAAE,CAAC,UAAU,CAAC;oBACrD,GAAG,EAAE,CAAC,eAAe,EAAE,+CAA+C,CAAC;iBACvE;aACD;SACD,CAAC,EACF,MAAM,CACN;KACD;CACD,CAAC,CAAC;AAEH,MAAM,GAAG,GAAgC;IACxC;QACC,QAAQ,EAAE,GAAG;QACb,oBAAoB,EAAE,CAAC,CAAC;QACxB,QAAQ,EAAE,IAAI;QACd,qBAAqB,EAAE,CAAC;QACxB,uBAAuB,EAAE,CAAC,CAAC;QAC3B,cAAc,EAAE,CAAC;QACjB,SAAS,EAAE,aAAa;QACxB,IAAI,EAAE,MAAM;KACZ;IACD;QACC,QAAQ,EAAE,GAAG;QACb,oBAAoB,EAAE,CAAC,CAAC;QACxB,QAAQ,EAAE,IAAI;QACd,qBAAqB,EAAE,CAAC;QACxB,uBAAuB,EAAE,CAAC,CAAC;QAC3B,cAAc,EAAE,CAAC;QACjB,SAAS,EAAE,aAAa;QACxB,IAAI,EAAE,MAAM;KACZ;CACD,CAAC;AAEF,MAAM,uBAAuB,GAAkB;IAC9C,EAAE,EAAE,YAAY;IAChB,KAAK,EAAE,EAAE;IACT,KAAK,EAAE;QACN,WAAW,EAAE;YACZ,KAAK,EAAE,EAAE;YACT,KAAK,EAAE,EAAE;SACT;QACD,MAAM,EAAE;YACP,KAAK,EAAE,EAAE,WAAW,EAAE,2BAA2B,EAAE;YACnD,KAAK,EAAE;gBACN,WAAW,EAAE;oBACZ,KAAK,EAAE,EAAE;oBACT,KAAK,EAAE;wBACN,OAAO,EAAE;4BACR,KAAK,EAAE,EAAE;4BACT,KAAK,EAAE;gCACN,GAAG,EAAE;oCACJ,KAAK,EAAE,EAAE;oCACT,KAAK,EAAE,EAAE;iCACT;6BACD;4BACD,OAAO,EAAE,IAAI;yBACb;qBACD;oBACD,YAAY,EAAE,IAAI;oBAClB,OAAO,EAAE,IAAI;oBACb,OAAO,EAAE,KAAK;iBACd;gBACD,QAAQ,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE;aAClC;YACD,YAAY,EAAE,IAAI;YAClB,OAAO,EAAE,IAAI;SACb;KACD;CACD,CAAC;AAEF,MAAM,aAAa,GAAG,IAAI,GAAG,CAAsB;IAClD;QACC,2BAA2B;QAC3B,cAAc,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,oBAAoB,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC;KACjF;CACD,CAAC,CAAC;AAEH,QAAQ,CAAC,kCAAkC,EAAE,GAAG,EAAE;IACjD,EAAE,CAAC,iBAAiB,EAAE,KAAK,IAAI,EAAE;QAChC,MAAM,gBAAgB,GAAc;YACnC,YAAY;YACZ,YAAY;YACZ,GAAG;YACH,cAAc,EAAE,CAAC;YACjB,oBAAoB,EAAE,CAAC;YACvB,eAAe,EAAE,CAAC;SAClB,CAAC;QACF,MAAM,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;QAChC,MAAM,eAAe,GAAG,wBAAwB,CAAC,gBAAgB,CAAC,CAAC;QACnE,MAAM,MAAM,GAAG,4BAA4B,CAAC,eAAe,EAAE,MAAM,CAAC,iBAAiB,EAAE,CAAC,CAAC;QACzF,MAAM,CAAC,eAAe,CAAC,MAAM,CAAC,YAAY,EAAE,YAAY,EAAE,6BAA6B,CAAC,CAAC;QACzF,MAAM,CAAC,eAAe,CAAC,MAAM,CAAC,YAAY,EAAE,YAAY,EAAE,4BAA4B,CAAC,CAAC;QACxF,MAAM,CAAC,eAAe,CAAC,MAAM,CAAC,GAAG,EAAE,GAAG,EAAE,kBAAkB,CAAC,CAAC;QAC5D,MAAM,CAAC,MAAM,CAAC,cAAc,KAAK,CAAC,EAAE,yBAAyB,CAAC,CAAC;QAC/D,MAAM,CAAC,MAAM,CAAC,oBAAoB,KAAK,CAAC,EAAE,qCAAqC,CAAC,CAAC;QACjF,MAAM,CACL,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,GAAG,gBAAgB,CAAC,YAAY,CAAC,EAAE,CAAC,EAC3D,0BAA0B,CAC1B,CAAC;QACF,oEAAoE;QACpE,MAAM,gBAAgB,GAAG,wBAAwB,CAAC,MAAM,CAAC,CAAC;QAC1D,MAAM,CAAC,eAAe,CACrB,gBAAgB,CAAC,MAAM,EACvB,eAAe,CAAC,MAAM,EACtB,2CAA2C,CAC3C,CAAC;QACF,MAAM,CAAC,eAAe,CAAC,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gCAAgC,EAAE,KAAK,IAAI,EAAE;QAC/C,MAAM,gBAAgB,GAAc;YACnC,YAAY;YACZ,YAAY;YACZ,GAAG,EAAE,EAAE;YACP,cAAc,EAAE,CAAC;YACjB,oBAAoB,EAAE,CAAC;YACvB,eAAe,EAAE,CAAC;SAClB,CAAC;QACF,MAAM,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;QAChC,MAAM,eAAe,GAAG,wBAAwB,CAAC,gBAAgB,CAAC,CAAC;QACnE,MAAM,MAAM,GAAG,4BAA4B,CAAC,eAAe,EAAE,MAAM,CAAC,iBAAiB,EAAE,CAAC,CAAC;QACzF,MAAM,CAAC,eAAe,CAAC,MAAM,CAAC,YAAY,EAAE,YAAY,EAAE,6BAA6B,CAAC,CAAC;QACzF,MAAM,CAAC,eAAe,CAAC,MAAM,CAAC,YAAY,EAAE,YAAY,EAAE,4BAA4B,CAAC,CAAC;QACxF,MAAM,CAAC,eAAe,CAAC,MAAM,CAAC,GAAG,EAAE,EAAE,EAAE,kBAAkB,CAAC,CAAC;QAC3D,MAAM,CAAC,MAAM,CAAC,cAAc,KAAK,CAAC,EAAE,yBAAyB,CAAC,CAAC;QAC/D,MAAM,CAAC,MAAM,CAAC,oBAAoB,KAAK,CAAC,EAAE,qCAAqC,CAAC,CAAC;QACjF,MAAM,CACL,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,GAAG,gBAAgB,CAAC,YAAY,CAAC,EAAE,CAAC,EAC3D,0BAA0B,CAC1B,CAAC;QACF,oEAAoE;QACpE,MAAM,gBAAgB,GAAG,wBAAwB,CAAC,MAAM,CAAC,CAAC;QAC1D,MAAM,CAAC,eAAe,CACrB,gBAAgB,CAAC,MAAM,EACvB,eAAe,CAAC,MAAM,EACtB,2CAA2C,CAC3C,CAAC;QACF,MAAM,CAAC,eAAe,CAAC,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2CAA2C,EAAE,KAAK,IAAI,EAAE;QAC1D,MAAM,gBAAgB,GAAc;YACnC,YAAY,EAAE,uBAAuB;YACrC,YAAY,EAAE,aAAa;YAC3B,GAAG;YACH,cAAc,EAAE,CAAC;YACjB,oBAAoB,EAAE,CAAC;YACvB,eAAe,EAAE,CAAC;SAClB,CAAC;QACF,MAAM,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;QAChC,MAAM,eAAe,GAAG,wBAAwB,CAAC,gBAAgB,CAAC,CAAC;QACnE,MAAM,MAAM,GAAG,4BAA4B,CAAC,eAAe,EAAE,MAAM,CAAC,iBAAiB,EAAE,CAAC,CAAC;QACzF,MAAM,CAAC,eAAe,CACrB,MAAM,CAAC,YAAY,EACnB,uBAAuB,EACvB,6BAA6B,CAC7B,CAAC;QACF,MAAM,CAAC,eAAe,CAAC,MAAM,CAAC,YAAY,EAAE,aAAa,EAAE,4BAA4B,CAAC,CAAC;QACzF,MAAM,CAAC,eAAe,CAAC,MAAM,CAAC,GAAG,EAAE,GAAG,EAAE,kBAAkB,CAAC,CAAC;QAC5D,MAAM,CAAC,MAAM,CAAC,cAAc,KAAK,CAAC,EAAE,yBAAyB,CAAC,CAAC;QAC/D,MAAM,CAAC,MAAM,CAAC,oBAAoB,KAAK,CAAC,EAAE,qCAAqC,CAAC,CAAC;QACjF,MAAM,CACL,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,GAAG,gBAAgB,CAAC,YAAY,CAAC,EAAE,CAAC,EAC3D,0BAA0B,CAC1B,CAAC;QACF,oEAAoE;QACpE,MAAM,gBAAgB,GAAG,wBAAwB,CAAC,MAAM,CAAC,CAAC;QAC1D,MAAM,CAAC,eAAe,CACrB,gBAAgB,CAAC,MAAM,EACvB,eAAe,CAAC,MAAM,EACtB,2CAA2C,CAC3C,CAAC;QACF,MAAM,CAAC,eAAe,CAAC,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { strict as assert } from \"node:assert\";\nimport { stringToBuffer } from \"@fluid-internal/client-utils\";\nimport { ISnapshot } from \"@fluidframework/driver-definitions\";\nimport { ISequencedDocumentMessage, ISnapshotTree } from \"@fluidframework/protocol-definitions\";\nimport { MockLogger } from \"@fluidframework/telemetry-utils\";\nimport { parseCompactSnapshotResponse } from \"../compactSnapshotParser.js\";\nimport { convertToCompactSnapshot } from \"../compactSnapshotWriter.js\";\n\nconst snapshotTree: ISnapshotTree = {\n\tid: \"SnapshotId\",\n\tblobs: {},\n\ttrees: {\n\t\t\".protocol\": {\n\t\t\tblobs: {\n\t\t\t\tattributes: \"bARADgIe4qmDjJl2l2zz12IM3\",\n\t\t\t\tquorumMembers: \"bARBkx1nses1pHL1vKnmFUfIC\",\n\t\t\t\tquorumProposals: \"bARBkx1nses1pHL1vKnmFUfIC\",\n\t\t\t},\n\t\t\ttrees: {},\n\t\t},\n\t\t\".app\": {\n\t\t\tblobs: { \".metadata\": \"bARD4RKvW4LL1KmaUKp6hUMSp\" },\n\t\t\ttrees: {\n\t\t\t\t\".channels\": {\n\t\t\t\t\tblobs: {},\n\t\t\t\t\ttrees: {\n\t\t\t\t\t\tdefault: {\n\t\t\t\t\t\t\tblobs: {\n\t\t\t\t\t\t\t\t\".component\": \"bARC6dCXlcrPxQHw3PeROtmKc\",\n\t\t\t\t\t\t\t\t\"gc\": \"bARDNMoBed+nKrsf04id52iUA\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\ttrees: {\n\t\t\t\t\t\t\t\t\".channels\": {\n\t\t\t\t\t\t\t\t\tblobs: {},\n\t\t\t\t\t\t\t\t\ttrees: {\n\t\t\t\t\t\t\t\t\t\troot: { blobs: {}, trees: {} },\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},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tunreferenced: true,\n\t\t\t\t},\n\t\t\t\t\".blobs\": { blobs: {}, trees: {} },\n\t\t\t},\n\t\t\tunreferenced: true,\n\t\t},\n\t},\n};\n\nconst blobContents = new Map<string, ArrayBuffer>([\n\t[\n\t\t\"bARADgIe4qmDjJl2l2zz12IM3\",\n\t\tstringToBuffer(\n\t\t\tJSON.stringify({ branch: \"\", minimumSequenceNumber: 0, sequenceNumber: 0, term: 1 }),\n\t\t\t\"utf8\",\n\t\t),\n\t],\n\t[\"bARBkx1nses1pHL1vKnmFUfIC\", stringToBuffer(JSON.stringify([]), \"utf8\")],\n\t[\n\t\t\"bARD4RKvW4LL1KmaUKp6hUMSp\",\n\t\tstringToBuffer(JSON.stringify({ summaryFormatVersion: 1, gcFeature: 0 }), \"utf8\"),\n\t],\n\t[\n\t\t\"bARC6dCXlcrPxQHw3PeROtmKc\",\n\t\tstringToBuffer(\n\t\t\tJSON.stringify({\n\t\t\t\tpkg: '[\"@fluid-example/smde\"]',\n\t\t\t\tsummaryFormatVersion: 2,\n\t\t\t\tisRootDataStore: true,\n\t\t\t}),\n\t\t\t\"utf8\",\n\t\t),\n\t],\n\t[\n\t\t\"bARDNMoBed+nKrsf04id52iUA\",\n\t\tstringToBuffer(\n\t\t\tJSON.stringify({\n\t\t\t\tusedRoutes: [\"\"],\n\t\t\t\tgcData: {\n\t\t\t\t\tgcNodes: {\n\t\t\t\t\t\t\"/root\": [\"/default/01b197a2-0432-413b-b2c9-83a992b804c4\", \"/default\"],\n\t\t\t\t\t\t\"/01b197a2-0432-413b-b2c9-83a992b804c4\": [\"/default\"],\n\t\t\t\t\t\t\"/\": [\"/default/root\", \"/default/01b197a2-0432-413b-b2c9-83a992b804c4\"],\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t}),\n\t\t\t\"utf8\",\n\t\t),\n\t],\n]);\n\nconst ops: ISequencedDocumentMessage[] = [\n\t{\n\t\tclientId: \"X\",\n\t\tclientSequenceNumber: -1,\n\t\tcontents: null,\n\t\tminimumSequenceNumber: 0,\n\t\treferenceSequenceNumber: -1,\n\t\tsequenceNumber: 1,\n\t\ttimestamp: 1623883807452,\n\t\ttype: \"join\",\n\t},\n\t{\n\t\tclientId: \"Y\",\n\t\tclientSequenceNumber: -1,\n\t\tcontents: null,\n\t\tminimumSequenceNumber: 0,\n\t\treferenceSequenceNumber: -1,\n\t\tsequenceNumber: 2,\n\t\ttimestamp: 1623883811928,\n\t\ttype: \"join\",\n\t},\n];\n\nconst snapshotTreeWithGroupId: ISnapshotTree = {\n\tid: \"SnapshotId\",\n\tblobs: {},\n\ttrees: {\n\t\t\".protocol\": {\n\t\t\tblobs: {},\n\t\t\ttrees: {},\n\t\t},\n\t\t\".app\": {\n\t\t\tblobs: { \".metadata\": \"bARD4RKvW4LL1KmaUKp6hUMSp\" },\n\t\t\ttrees: {\n\t\t\t\t\".channels\": {\n\t\t\t\t\tblobs: {},\n\t\t\t\t\ttrees: {\n\t\t\t\t\t\tdefault: {\n\t\t\t\t\t\t\tblobs: {},\n\t\t\t\t\t\t\ttrees: {\n\t\t\t\t\t\t\t\tdds: {\n\t\t\t\t\t\t\t\t\tblobs: {},\n\t\t\t\t\t\t\t\t\ttrees: {},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tgroupId: \"G3\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tunreferenced: true,\n\t\t\t\t\tgroupId: \"G2\",\n\t\t\t\t\tomitted: false,\n\t\t\t\t},\n\t\t\t\t\".blobs\": { blobs: {}, trees: {} },\n\t\t\t},\n\t\t\tunreferenced: true,\n\t\t\tgroupId: \"G4\",\n\t\t},\n\t},\n};\n\nconst blobContents2 = new Map<string, ArrayBuffer>([\n\t[\n\t\t\"bARD4RKvW4LL1KmaUKp6hUMSp\",\n\t\tstringToBuffer(JSON.stringify({ summaryFormatVersion: 1, gcFeature: 0 }), \"utf8\"),\n\t],\n]);\n\ndescribe(\"Snapshot Format Conversion Tests\", () => {\n\tit(\"Conversion test\", async () => {\n\t\tconst snapshotContents: ISnapshot = {\n\t\t\tsnapshotTree,\n\t\t\tblobContents,\n\t\t\tops,\n\t\t\tsequenceNumber: 0,\n\t\t\tlatestSequenceNumber: 2,\n\t\t\tsnapshotFormatV: 1,\n\t\t};\n\t\tconst logger = new MockLogger();\n\t\tconst compactSnapshot = convertToCompactSnapshot(snapshotContents);\n\t\tconst result = parseCompactSnapshotResponse(compactSnapshot, logger.toTelemetryLogger());\n\t\tassert.deepStrictEqual(result.snapshotTree, snapshotTree, \"Tree structure should match\");\n\t\tassert.deepStrictEqual(result.blobContents, blobContents, \"Blobs content should match\");\n\t\tassert.deepStrictEqual(result.ops, ops, \"Ops should match\");\n\t\tassert(result.sequenceNumber === 0, \"Seq number should match\");\n\t\tassert(result.latestSequenceNumber === 2, \"Latest sequence number should match\");\n\t\tassert(\n\t\t\t(result.snapshotTree.id = snapshotContents.snapshotTree.id),\n\t\t\t\"Snapshot id should match\",\n\t\t);\n\t\t// Convert to compact snapshot again and then match to previous one.\n\t\tconst compactSnapshot2 = convertToCompactSnapshot(result);\n\t\tassert.deepStrictEqual(\n\t\t\tcompactSnapshot2.buffer,\n\t\t\tcompactSnapshot.buffer,\n\t\t\t\"Compact representation should remain same\",\n\t\t);\n\t\tlogger.assertMatchNone([{ category: \"error\" }]);\n\t});\n\n\tit(\"Conversion test with empty ops\", async () => {\n\t\tconst snapshotContents: ISnapshot = {\n\t\t\tsnapshotTree,\n\t\t\tblobContents,\n\t\t\tops: [],\n\t\t\tsequenceNumber: 0,\n\t\t\tlatestSequenceNumber: 2,\n\t\t\tsnapshotFormatV: 1,\n\t\t};\n\t\tconst logger = new MockLogger();\n\t\tconst compactSnapshot = convertToCompactSnapshot(snapshotContents);\n\t\tconst result = parseCompactSnapshotResponse(compactSnapshot, logger.toTelemetryLogger());\n\t\tassert.deepStrictEqual(result.snapshotTree, snapshotTree, \"Tree structure should match\");\n\t\tassert.deepStrictEqual(result.blobContents, blobContents, \"Blobs content should match\");\n\t\tassert.deepStrictEqual(result.ops, [], \"Ops should match\");\n\t\tassert(result.sequenceNumber === 0, \"Seq number should match\");\n\t\tassert(result.latestSequenceNumber === 2, \"Latest sequence number should match\");\n\t\tassert(\n\t\t\t(result.snapshotTree.id = snapshotContents.snapshotTree.id),\n\t\t\t\"Snapshot id should match\",\n\t\t);\n\t\t// Convert to compact snapshot again and then match to previous one.\n\t\tconst compactSnapshot2 = convertToCompactSnapshot(result);\n\t\tassert.deepStrictEqual(\n\t\t\tcompactSnapshot2.buffer,\n\t\t\tcompactSnapshot.buffer,\n\t\t\t\"Compact representation should remain same\",\n\t\t);\n\t\tlogger.assertMatchNone([{ category: \"error\" }]);\n\t});\n\n\tit(\"Conversion test for snapshot with GroupId\", async () => {\n\t\tconst snapshotContents: ISnapshot = {\n\t\t\tsnapshotTree: snapshotTreeWithGroupId,\n\t\t\tblobContents: blobContents2,\n\t\t\tops,\n\t\t\tsequenceNumber: 0,\n\t\t\tlatestSequenceNumber: 2,\n\t\t\tsnapshotFormatV: 1,\n\t\t};\n\t\tconst logger = new MockLogger();\n\t\tconst compactSnapshot = convertToCompactSnapshot(snapshotContents);\n\t\tconst result = parseCompactSnapshotResponse(compactSnapshot, logger.toTelemetryLogger());\n\t\tassert.deepStrictEqual(\n\t\t\tresult.snapshotTree,\n\t\t\tsnapshotTreeWithGroupId,\n\t\t\t\"Tree structure should match\",\n\t\t);\n\t\tassert.deepStrictEqual(result.blobContents, blobContents2, \"Blobs content should match\");\n\t\tassert.deepStrictEqual(result.ops, ops, \"Ops should match\");\n\t\tassert(result.sequenceNumber === 0, \"Seq number should match\");\n\t\tassert(result.latestSequenceNumber === 2, \"Latest sequence number should match\");\n\t\tassert(\n\t\t\t(result.snapshotTree.id = snapshotContents.snapshotTree.id),\n\t\t\t\"Snapshot id should match\",\n\t\t);\n\t\t// Convert to compact snapshot again and then match to previous one.\n\t\tconst compactSnapshot2 = convertToCompactSnapshot(result);\n\t\tassert.deepStrictEqual(\n\t\t\tcompactSnapshot2.buffer,\n\t\t\tcompactSnapshot.buffer,\n\t\t\t\"Compact representation should remain same\",\n\t\t);\n\t\tlogger.assertMatchNone([{ category: \"error\" }]);\n\t});\n});\n"]}
@@ -3,16 +3,16 @@
3
3
  * Licensed under the MIT License.
4
4
  */
5
5
  import { strict as assert } from "node:assert";
6
- import { stub, useFakeTimers } from "sinon";
7
6
  import { MockLogger } from "@fluidframework/telemetry-utils";
7
+ import { stub, useFakeTimers } from "sinon";
8
+ import { createOdspUrl } from "../../createOdspUrl.js";
8
9
  import { EpochTracker } from "../../epochTracker.js";
9
10
  import { LocalPersistentCache } from "../../odspCache.js";
11
+ import { OdspDocumentServiceFactory } from "../../odspDocumentServiceFactory.js";
12
+ import { OdspDriverUrlResolver } from "../../odspDriverUrlResolver.js";
10
13
  import { getHashedDocumentId } from "../../odspPublicUtils.js";
11
14
  import * as socketModule from "../../socketModule.js";
12
15
  import * as joinSession from "../../vroom.js";
13
- import { OdspDocumentServiceFactory } from "../../odspDocumentServiceFactory.js";
14
- import { createOdspUrl } from "../../createOdspUrl.js";
15
- import { OdspDriverUrlResolver } from "../../odspDriverUrlResolver.js";
16
16
  import { ClientSocketMock } from "./socketMock.js";
17
17
  describe("DeltaConnectionMetadata update tests", () => {
18
18
  let clock;