@fluidframework/odsp-driver 2.0.0-dev-rc.1.0.0.232845 → 2.0.0-dev-rc.2.0.0.246488
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.eslintrc.cjs +18 -3
- package/{.mocharc.js → .mocharc.cjs} +1 -1
- package/CHANGELOG.md +44 -0
- package/{api-extractor-esm.json → api-extractor-cjs.json} +5 -1
- package/api-extractor-lint.json +1 -1
- package/api-extractor.json +1 -1
- package/api-report/odsp-driver.api.md +11 -12
- package/dist/ReadBufferUtils.d.ts.map +1 -1
- package/dist/ReadBufferUtils.js.map +1 -1
- package/dist/WriteBufferUtils.d.ts +1 -1
- package/dist/WriteBufferUtils.d.ts.map +1 -1
- package/dist/WriteBufferUtils.js +12 -12
- package/dist/WriteBufferUtils.js.map +1 -1
- package/dist/checkUrl.d.ts.map +1 -1
- package/dist/checkUrl.js +5 -3
- package/dist/checkUrl.js.map +1 -1
- package/dist/compactSnapshotParser.d.ts.map +1 -1
- package/dist/compactSnapshotParser.js +87 -69
- package/dist/compactSnapshotParser.js.map +1 -1
- package/dist/compactSnapshotWriter.d.ts.map +1 -1
- package/dist/compactSnapshotWriter.js +25 -19
- package/dist/compactSnapshotWriter.js.map +1 -1
- package/dist/contracts.d.ts +10 -4
- package/dist/contracts.d.ts.map +1 -1
- package/dist/contracts.js.map +1 -1
- package/dist/createFile.d.ts +3 -3
- package/dist/createFile.d.ts.map +1 -1
- package/dist/createFile.js +30 -27
- package/dist/createFile.js.map +1 -1
- package/dist/createNewContainerOnExistingFile.d.ts +2 -2
- package/dist/createNewContainerOnExistingFile.d.ts.map +1 -1
- package/dist/createNewContainerOnExistingFile.js +14 -14
- package/dist/createNewContainerOnExistingFile.js.map +1 -1
- package/dist/createNewModule.d.ts +2 -2
- package/dist/createNewModule.d.ts.map +1 -1
- package/dist/createNewModule.js +4 -4
- package/dist/createNewModule.js.map +1 -1
- package/dist/createNewUtils.d.ts +2 -2
- package/dist/createNewUtils.d.ts.map +1 -1
- package/dist/createNewUtils.js +12 -8
- package/dist/createNewUtils.js.map +1 -1
- package/dist/createOdspCreateContainerRequest.d.ts.map +1 -1
- package/dist/createOdspCreateContainerRequest.js +6 -2
- package/dist/createOdspCreateContainerRequest.js.map +1 -1
- package/dist/createOdspUrl.d.ts +1 -1
- package/dist/createOdspUrl.d.ts.map +1 -1
- package/dist/createOdspUrl.js.map +1 -1
- package/dist/epochTracker.d.ts +10 -9
- package/dist/epochTracker.d.ts.map +1 -1
- package/dist/epochTracker.js +66 -43
- package/dist/epochTracker.js.map +1 -1
- package/dist/fetchSnapshot.d.ts +11 -8
- package/dist/fetchSnapshot.d.ts.map +1 -1
- package/dist/fetchSnapshot.js +79 -58
- package/dist/fetchSnapshot.js.map +1 -1
- package/dist/getFileLink.d.ts.map +1 -1
- package/dist/getFileLink.js +24 -17
- package/dist/getFileLink.js.map +1 -1
- package/dist/getQueryString.d.ts.map +1 -1
- package/dist/getQueryString.js +6 -0
- package/dist/getQueryString.js.map +1 -1
- package/dist/index.d.ts +19 -19
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +44 -44
- package/dist/index.js.map +1 -1
- package/dist/localOdspDriver/localOdspDocumentService.d.ts +1 -1
- package/dist/localOdspDriver/localOdspDocumentService.d.ts.map +1 -1
- package/dist/localOdspDriver/localOdspDocumentService.js +5 -5
- package/dist/localOdspDriver/localOdspDocumentService.js.map +1 -1
- package/dist/localOdspDriver/localOdspDocumentServiceFactory.d.ts +8 -6
- package/dist/localOdspDriver/localOdspDocumentServiceFactory.d.ts.map +1 -1
- package/dist/localOdspDriver/localOdspDocumentServiceFactory.js +10 -9
- package/dist/localOdspDriver/localOdspDocumentServiceFactory.js.map +1 -1
- package/dist/localOdspDriver/localOdspDocumentStorageManager.d.ts +1 -1
- package/dist/localOdspDriver/localOdspDocumentStorageManager.d.ts.map +1 -1
- package/dist/localOdspDriver/localOdspDocumentStorageManager.js +6 -6
- package/dist/localOdspDriver/localOdspDocumentStorageManager.js.map +1 -1
- package/dist/odsp-driver-alpha.d.ts +27 -12
- package/dist/odsp-driver-beta.d.ts +1 -2
- package/dist/odsp-driver-public.d.ts +1 -2
- package/dist/odsp-driver-untrimmed.d.ts +29 -12
- package/dist/odspCache.d.ts +3 -3
- package/dist/odspCache.d.ts.map +1 -1
- package/dist/odspCache.js +3 -4
- package/dist/odspCache.js.map +1 -1
- package/dist/odspDelayLoadedDeltaStream.d.ts +7 -5
- package/dist/odspDelayLoadedDeltaStream.d.ts.map +1 -1
- package/dist/odspDelayLoadedDeltaStream.js +41 -28
- package/dist/odspDelayLoadedDeltaStream.js.map +1 -1
- package/dist/odspDeltaStorageService.d.ts +7 -7
- package/dist/odspDeltaStorageService.d.ts.map +1 -1
- package/dist/odspDeltaStorageService.js +5 -5
- package/dist/odspDeltaStorageService.js.map +1 -1
- package/dist/odspDocumentDeltaConnection.d.ts +1 -1
- package/dist/odspDocumentDeltaConnection.d.ts.map +1 -1
- package/dist/odspDocumentDeltaConnection.js +41 -23
- package/dist/odspDocumentDeltaConnection.js.map +1 -1
- package/dist/odspDocumentService.d.ts +6 -4
- package/dist/odspDocumentService.d.ts.map +1 -1
- package/dist/odspDocumentService.js +19 -16
- package/dist/odspDocumentService.js.map +1 -1
- package/dist/odspDocumentServiceFactory.d.ts +6 -1
- package/dist/odspDocumentServiceFactory.d.ts.map +1 -1
- package/dist/odspDocumentServiceFactory.js +9 -4
- package/dist/odspDocumentServiceFactory.js.map +1 -1
- package/dist/odspDocumentServiceFactoryCore.d.ts +4 -4
- package/dist/odspDocumentServiceFactoryCore.d.ts.map +1 -1
- package/dist/odspDocumentServiceFactoryCore.js +26 -22
- package/dist/odspDocumentServiceFactoryCore.js.map +1 -1
- package/dist/odspDocumentServiceFactoryWithCodeSplit.d.ts +1 -1
- package/dist/odspDocumentServiceFactoryWithCodeSplit.d.ts.map +1 -1
- package/dist/odspDocumentServiceFactoryWithCodeSplit.js +2 -2
- package/dist/odspDocumentServiceFactoryWithCodeSplit.js.map +1 -1
- package/dist/odspDocumentStorageManager.d.ts +15 -9
- package/dist/odspDocumentStorageManager.d.ts.map +1 -1
- package/dist/odspDocumentStorageManager.js +219 -181
- package/dist/odspDocumentStorageManager.js.map +1 -1
- package/dist/odspDocumentStorageServiceBase.d.ts +2 -4
- package/dist/odspDocumentStorageServiceBase.d.ts.map +1 -1
- package/dist/odspDocumentStorageServiceBase.js +32 -29
- package/dist/odspDocumentStorageServiceBase.js.map +1 -1
- package/dist/odspDriverUrlResolver.d.ts +5 -1
- package/dist/odspDriverUrlResolver.d.ts.map +1 -1
- package/dist/odspDriverUrlResolver.js +27 -24
- package/dist/odspDriverUrlResolver.js.map +1 -1
- package/dist/odspDriverUrlResolverForShareLink.d.ts +17 -6
- package/dist/odspDriverUrlResolverForShareLink.d.ts.map +1 -1
- package/dist/odspDriverUrlResolverForShareLink.js +49 -39
- package/dist/odspDriverUrlResolverForShareLink.js.map +1 -1
- package/dist/odspError.d.ts +1 -1
- package/dist/odspError.d.ts.map +1 -1
- package/dist/odspError.js +5 -5
- package/dist/odspError.js.map +1 -1
- package/dist/odspFluidFileLink.d.ts +1 -1
- package/dist/odspFluidFileLink.d.ts.map +1 -1
- package/dist/odspFluidFileLink.js +2 -2
- package/dist/odspFluidFileLink.js.map +1 -1
- package/dist/odspLocationRedirection.js +2 -2
- package/dist/odspLocationRedirection.js.map +1 -1
- package/dist/odspPublicUtils.d.ts +3 -0
- package/dist/odspPublicUtils.d.ts.map +1 -1
- package/dist/odspPublicUtils.js +3 -0
- package/dist/odspPublicUtils.js.map +1 -1
- package/dist/odspSnapshotParser.d.ts +1 -1
- package/dist/odspSnapshotParser.d.ts.map +1 -1
- package/dist/odspSnapshotParser.js +3 -2
- package/dist/odspSnapshotParser.js.map +1 -1
- package/dist/odspSummaryUploadManager.d.ts +1 -1
- package/dist/odspSummaryUploadManager.d.ts.map +1 -1
- package/dist/odspSummaryUploadManager.js +9 -6
- package/dist/odspSummaryUploadManager.js.map +1 -1
- package/dist/odspUrlHelper.d.ts.map +1 -1
- package/dist/odspUrlHelper.js +1 -2
- package/dist/odspUrlHelper.js.map +1 -1
- package/dist/odspUtils.d.ts +19 -7
- package/dist/odspUtils.d.ts.map +1 -1
- package/dist/odspUtils.js +61 -31
- package/dist/odspUtils.js.map +1 -1
- package/dist/opsCaching.d.ts +1 -1
- package/dist/opsCaching.d.ts.map +1 -1
- package/dist/opsCaching.js +2 -1
- package/dist/opsCaching.js.map +1 -1
- package/dist/package.json +3 -0
- package/dist/packageVersion.d.ts +1 -1
- package/dist/packageVersion.js +1 -1
- package/dist/packageVersion.js.map +1 -1
- package/dist/prefetchLatestSnapshot.d.ts +2 -2
- package/dist/prefetchLatestSnapshot.d.ts.map +1 -1
- package/dist/prefetchLatestSnapshot.js +17 -12
- package/dist/prefetchLatestSnapshot.js.map +1 -1
- package/dist/retryErrorsStorageAdapter.d.ts +0 -1
- package/dist/retryErrorsStorageAdapter.d.ts.map +1 -1
- package/dist/retryErrorsStorageAdapter.js +2 -5
- package/dist/retryErrorsStorageAdapter.js.map +1 -1
- package/dist/retryUtils.d.ts.map +1 -1
- package/dist/retryUtils.js +6 -2
- package/dist/retryUtils.js.map +1 -1
- package/dist/socketModule.d.ts.map +1 -1
- package/dist/socketModule.js +2 -0
- package/dist/socketModule.js.map +1 -1
- package/dist/tsdoc-metadata.json +1 -1
- package/dist/vroom.d.ts +2 -2
- package/dist/vroom.d.ts.map +1 -1
- package/dist/vroom.js +5 -5
- package/dist/vroom.js.map +1 -1
- package/dist/zipItDataRepresentationUtils.d.ts +1 -1
- package/dist/zipItDataRepresentationUtils.d.ts.map +1 -1
- package/dist/zipItDataRepresentationUtils.js +15 -11
- package/dist/zipItDataRepresentationUtils.js.map +1 -1
- package/lib/{ReadBufferUtils.d.mts → ReadBufferUtils.d.ts} +1 -1
- package/lib/ReadBufferUtils.d.ts.map +1 -0
- package/lib/{ReadBufferUtils.mjs → ReadBufferUtils.js} +1 -1
- package/lib/ReadBufferUtils.js.map +1 -0
- package/lib/{WriteBufferUtils.d.mts → WriteBufferUtils.d.ts} +2 -2
- package/lib/WriteBufferUtils.d.ts.map +1 -0
- package/lib/{WriteBufferUtils.mjs → WriteBufferUtils.js} +2 -2
- package/lib/WriteBufferUtils.js.map +1 -0
- package/lib/{checkUrl.d.mts → checkUrl.d.ts} +1 -1
- package/lib/checkUrl.d.ts.map +1 -0
- package/lib/{checkUrl.mjs → checkUrl.js} +5 -3
- package/lib/checkUrl.js.map +1 -0
- package/lib/{compactSnapshotParser.d.mts → compactSnapshotParser.d.ts} +1 -1
- package/lib/compactSnapshotParser.d.ts.map +1 -0
- package/lib/{compactSnapshotParser.mjs → compactSnapshotParser.js} +61 -43
- package/lib/compactSnapshotParser.js.map +1 -0
- package/lib/{compactSnapshotWriter.d.mts → compactSnapshotWriter.d.ts} +1 -1
- package/lib/compactSnapshotWriter.d.ts.map +1 -0
- package/lib/{compactSnapshotWriter.mjs → compactSnapshotWriter.js} +13 -7
- package/lib/compactSnapshotWriter.js.map +1 -0
- package/lib/{constants.d.mts → constants.d.ts} +1 -1
- package/lib/constants.d.ts.map +1 -0
- package/lib/{constants.mjs → constants.js} +1 -1
- package/lib/constants.js.map +1 -0
- package/lib/{contracts.d.mts → contracts.d.ts} +11 -5
- package/lib/contracts.d.ts.map +1 -0
- package/lib/{contracts.mjs → contracts.js} +1 -1
- package/lib/contracts.js.map +1 -0
- package/lib/{contractsPublic.d.mts → contractsPublic.d.ts} +1 -1
- package/lib/contractsPublic.d.ts.map +1 -0
- package/lib/{contractsPublic.mjs → contractsPublic.js} +1 -1
- package/lib/contractsPublic.js.map +1 -0
- package/lib/{createFile.d.mts → createFile.d.ts} +4 -4
- package/lib/createFile.d.ts.map +1 -0
- package/lib/{createFile.mjs → createFile.js} +15 -12
- package/lib/createFile.js.map +1 -0
- package/lib/{createNewContainerOnExistingFile.d.mts → createNewContainerOnExistingFile.d.ts} +3 -3
- package/lib/createNewContainerOnExistingFile.d.ts.map +1 -0
- package/lib/{createNewContainerOnExistingFile.mjs → createNewContainerOnExistingFile.js} +7 -7
- package/lib/createNewContainerOnExistingFile.js.map +1 -0
- package/lib/{createNewModule.mjs → createNewModule.d.ts} +3 -3
- package/lib/createNewModule.d.ts.map +1 -0
- package/lib/{createNewModule.d.mts → createNewModule.js} +3 -3
- package/lib/createNewModule.js.map +1 -0
- package/lib/{createNewUtils.d.mts → createNewUtils.d.ts} +3 -3
- package/lib/createNewUtils.d.ts.map +1 -0
- package/lib/{createNewUtils.mjs → createNewUtils.js} +9 -5
- package/lib/createNewUtils.js.map +1 -0
- package/lib/{createOdspCreateContainerRequest.d.mts → createOdspCreateContainerRequest.d.ts} +5 -1
- package/lib/createOdspCreateContainerRequest.d.ts.map +1 -0
- package/lib/{createOdspCreateContainerRequest.mjs → createOdspCreateContainerRequest.js} +6 -2
- package/lib/createOdspCreateContainerRequest.js.map +1 -0
- package/lib/{createOdspUrl.d.mts → createOdspUrl.d.ts} +2 -2
- package/lib/createOdspUrl.d.ts.map +1 -0
- package/lib/{createOdspUrl.mjs → createOdspUrl.js} +1 -1
- package/lib/createOdspUrl.js.map +1 -0
- package/lib/{epochTracker.d.mts → epochTracker.d.ts} +11 -10
- package/lib/epochTracker.d.ts.map +1 -0
- package/lib/{epochTracker.mjs → epochTracker.js} +56 -33
- package/lib/epochTracker.js.map +1 -0
- package/lib/{fetch.d.mts → fetch.d.ts} +1 -1
- package/lib/fetch.d.ts.map +1 -0
- package/lib/{fetch.mjs → fetch.js} +1 -1
- package/lib/fetch.js.map +1 -0
- package/lib/{fetchSnapshot.d.mts → fetchSnapshot.d.ts} +12 -9
- package/lib/fetchSnapshot.d.ts.map +1 -0
- package/lib/{fetchSnapshot.mjs → fetchSnapshot.js} +61 -40
- package/lib/fetchSnapshot.js.map +1 -0
- package/lib/{getFileLink.d.mts → getFileLink.d.ts} +1 -1
- package/lib/getFileLink.d.ts.map +1 -0
- package/lib/{getFileLink.mjs → getFileLink.js} +14 -7
- package/lib/getFileLink.js.map +1 -0
- package/lib/{getQueryString.d.mts → getQueryString.d.ts} +5 -1
- package/lib/getQueryString.d.ts.map +1 -0
- package/lib/{getQueryString.mjs → getQueryString.js} +7 -1
- package/lib/getQueryString.js.map +1 -0
- package/lib/{getUrlAndHeadersWithAuth.d.mts → getUrlAndHeadersWithAuth.d.ts} +1 -1
- package/lib/getUrlAndHeadersWithAuth.d.ts.map +1 -0
- package/lib/{getUrlAndHeadersWithAuth.mjs → getUrlAndHeadersWithAuth.js} +1 -1
- package/lib/getUrlAndHeadersWithAuth.js.map +1 -0
- package/lib/{index.d.mts → index.d.ts} +20 -20
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js +29 -0
- package/lib/index.js.map +1 -0
- package/lib/localOdspDriver/{localOdspDeltaStorageService.d.mts → localOdspDeltaStorageService.d.ts} +1 -1
- package/lib/localOdspDriver/localOdspDeltaStorageService.d.ts.map +1 -0
- package/lib/localOdspDriver/{localOdspDeltaStorageService.mjs → localOdspDeltaStorageService.js} +1 -1
- package/lib/localOdspDriver/localOdspDeltaStorageService.js.map +1 -0
- package/lib/localOdspDriver/{localOdspDocumentService.d.mts → localOdspDocumentService.d.ts} +2 -2
- package/lib/localOdspDriver/localOdspDocumentService.d.ts.map +1 -0
- package/lib/localOdspDriver/{localOdspDocumentService.mjs → localOdspDocumentService.js} +4 -4
- package/lib/localOdspDriver/localOdspDocumentService.js.map +1 -0
- package/lib/localOdspDriver/{localOdspDocumentServiceFactory.d.mts → localOdspDocumentServiceFactory.d.ts} +9 -7
- package/lib/localOdspDriver/localOdspDocumentServiceFactory.d.ts.map +1 -0
- package/lib/localOdspDriver/{localOdspDocumentServiceFactory.mjs → localOdspDocumentServiceFactory.js} +9 -8
- package/lib/localOdspDriver/localOdspDocumentServiceFactory.js.map +1 -0
- package/lib/localOdspDriver/{localOdspDocumentStorageManager.d.mts → localOdspDocumentStorageManager.d.ts} +2 -2
- package/lib/localOdspDriver/localOdspDocumentStorageManager.d.ts.map +1 -0
- package/lib/localOdspDriver/{localOdspDocumentStorageManager.mjs → localOdspDocumentStorageManager.js} +4 -4
- package/lib/localOdspDriver/localOdspDocumentStorageManager.js.map +1 -0
- package/lib/{odsp-driver-alpha.d.mts → odsp-driver-alpha.d.ts} +27 -12
- package/lib/{odsp-driver-public.d.mts → odsp-driver-beta.d.ts} +1 -2
- package/lib/{odsp-driver-beta.d.mts → odsp-driver-public.d.ts} +1 -2
- package/lib/{odsp-driver-untrimmed.d.mts → odsp-driver-untrimmed.d.ts} +29 -12
- package/lib/{odspCache.d.mts → odspCache.d.ts} +8 -4
- package/lib/odspCache.d.ts.map +1 -0
- package/lib/{odspCache.mjs → odspCache.js} +6 -3
- package/lib/odspCache.js.map +1 -0
- package/lib/{odspDelayLoadedDeltaStream.d.mts → odspDelayLoadedDeltaStream.d.ts} +8 -6
- package/lib/odspDelayLoadedDeltaStream.d.ts.map +1 -0
- package/lib/{odspDelayLoadedDeltaStream.mjs → odspDelayLoadedDeltaStream.js} +33 -20
- package/lib/odspDelayLoadedDeltaStream.js.map +1 -0
- package/lib/{odspDeltaStorageService.d.mts → odspDeltaStorageService.d.ts} +8 -8
- package/lib/odspDeltaStorageService.d.ts.map +1 -0
- package/lib/{odspDeltaStorageService.mjs → odspDeltaStorageService.js} +5 -5
- package/lib/odspDeltaStorageService.js.map +1 -0
- package/lib/{odspDocumentDeltaConnection.d.mts → odspDocumentDeltaConnection.d.ts} +2 -2
- package/lib/odspDocumentDeltaConnection.d.ts.map +1 -0
- package/lib/{odspDocumentDeltaConnection.mjs → odspDocumentDeltaConnection.js} +34 -16
- package/lib/odspDocumentDeltaConnection.js.map +1 -0
- package/lib/{odspDocumentService.d.mts → odspDocumentService.d.ts} +7 -5
- package/lib/odspDocumentService.d.ts.map +1 -0
- package/lib/{odspDocumentService.mjs → odspDocumentService.js} +16 -11
- package/lib/odspDocumentService.js.map +1 -0
- package/lib/{odspDocumentServiceFactory.d.mts → odspDocumentServiceFactory.d.ts} +7 -2
- package/lib/odspDocumentServiceFactory.d.ts.map +1 -0
- package/lib/{odspDocumentServiceFactory.mjs → odspDocumentServiceFactory.js} +9 -3
- package/lib/odspDocumentServiceFactory.js.map +1 -0
- package/lib/{odspDocumentServiceFactoryCore.d.mts → odspDocumentServiceFactoryCore.d.ts} +5 -5
- package/lib/odspDocumentServiceFactoryCore.d.ts.map +1 -0
- package/lib/{odspDocumentServiceFactoryCore.mjs → odspDocumentServiceFactoryCore.js} +23 -17
- package/lib/odspDocumentServiceFactoryCore.js.map +1 -0
- package/lib/{odspDocumentServiceFactoryWithCodeSplit.d.mts → odspDocumentServiceFactoryWithCodeSplit.d.ts} +2 -2
- package/lib/odspDocumentServiceFactoryWithCodeSplit.d.ts.map +1 -0
- package/lib/{odspDocumentServiceFactoryWithCodeSplit.mjs → odspDocumentServiceFactoryWithCodeSplit.js} +2 -2
- package/lib/odspDocumentServiceFactoryWithCodeSplit.js.map +1 -0
- package/lib/{odspDocumentStorageManager.d.mts → odspDocumentStorageManager.d.ts} +16 -10
- package/lib/odspDocumentStorageManager.d.ts.map +1 -0
- package/lib/{odspDocumentStorageManager.mjs → odspDocumentStorageManager.js} +207 -167
- package/lib/odspDocumentStorageManager.js.map +1 -0
- package/lib/{odspDocumentStorageServiceBase.d.mts → odspDocumentStorageServiceBase.d.ts} +3 -5
- package/lib/odspDocumentStorageServiceBase.d.ts.map +1 -0
- package/lib/{odspDocumentStorageServiceBase.mjs → odspDocumentStorageServiceBase.js} +32 -29
- package/lib/odspDocumentStorageServiceBase.js.map +1 -0
- package/lib/{odspDriverUrlResolver.d.mts → odspDriverUrlResolver.d.ts} +6 -2
- package/lib/odspDriverUrlResolver.d.ts.map +1 -0
- package/lib/{odspDriverUrlResolver.mjs → odspDriverUrlResolver.js} +24 -17
- package/lib/odspDriverUrlResolver.js.map +1 -0
- package/lib/{odspDriverUrlResolverForShareLink.d.mts → odspDriverUrlResolverForShareLink.d.ts} +18 -7
- package/lib/odspDriverUrlResolverForShareLink.d.ts.map +1 -0
- package/lib/{odspDriverUrlResolverForShareLink.mjs → odspDriverUrlResolverForShareLink.js} +41 -27
- package/lib/odspDriverUrlResolverForShareLink.js.map +1 -0
- package/lib/{odspError.d.mts → odspError.d.ts} +2 -2
- package/lib/odspError.d.ts.map +1 -0
- package/lib/{odspError.mjs → odspError.js} +4 -4
- package/lib/odspError.js.map +1 -0
- package/lib/{odspFluidFileLink.d.mts → odspFluidFileLink.d.ts} +2 -2
- package/lib/odspFluidFileLink.d.ts.map +1 -0
- package/lib/{odspFluidFileLink.mjs → odspFluidFileLink.js} +2 -2
- package/lib/odspFluidFileLink.js.map +1 -0
- package/lib/{odspLocationRedirection.d.mts → odspLocationRedirection.d.ts} +1 -1
- package/lib/odspLocationRedirection.d.ts.map +1 -0
- package/lib/{odspLocationRedirection.mjs → odspLocationRedirection.js} +2 -2
- package/lib/odspLocationRedirection.js.map +1 -0
- package/lib/{odspPublicUtils.d.mts → odspPublicUtils.d.ts} +4 -1
- package/lib/odspPublicUtils.d.ts.map +1 -0
- package/lib/{odspPublicUtils.mjs → odspPublicUtils.js} +4 -1
- package/lib/odspPublicUtils.js.map +1 -0
- package/lib/{odspSnapshotParser.d.mts → odspSnapshotParser.d.ts} +2 -2
- package/lib/odspSnapshotParser.d.ts.map +1 -0
- package/lib/{odspSnapshotParser.mjs → odspSnapshotParser.js} +4 -3
- package/lib/odspSnapshotParser.js.map +1 -0
- package/lib/{odspSummaryUploadManager.d.mts → odspSummaryUploadManager.d.ts} +2 -2
- package/lib/odspSummaryUploadManager.d.ts.map +1 -0
- package/lib/{odspSummaryUploadManager.mjs → odspSummaryUploadManager.js} +8 -5
- package/lib/odspSummaryUploadManager.js.map +1 -0
- package/lib/{odspUrlHelper.d.mts → odspUrlHelper.d.ts} +1 -1
- package/lib/odspUrlHelper.d.ts.map +1 -0
- package/lib/{odspUrlHelper.mjs → odspUrlHelper.js} +2 -3
- package/lib/odspUrlHelper.js.map +1 -0
- package/lib/{odspUtils.d.mts → odspUtils.d.ts} +20 -8
- package/lib/odspUtils.d.ts.map +1 -0
- package/lib/{odspUtils.mjs → odspUtils.js} +45 -17
- package/lib/odspUtils.js.map +1 -0
- package/lib/{opsCaching.d.mts → opsCaching.d.ts} +2 -2
- package/lib/opsCaching.d.ts.map +1 -0
- package/lib/{opsCaching.mjs → opsCaching.js} +3 -2
- package/lib/opsCaching.js.map +1 -0
- package/lib/{packageVersion.d.mts → packageVersion.d.ts} +2 -2
- package/lib/packageVersion.d.ts.map +1 -0
- package/lib/{packageVersion.mjs → packageVersion.js} +2 -2
- package/lib/packageVersion.js.map +1 -0
- package/lib/{prefetchLatestSnapshot.d.mts → prefetchLatestSnapshot.d.ts} +3 -3
- package/lib/prefetchLatestSnapshot.d.ts.map +1 -0
- package/lib/{prefetchLatestSnapshot.mjs → prefetchLatestSnapshot.js} +16 -11
- package/lib/prefetchLatestSnapshot.js.map +1 -0
- package/lib/{retryErrorsStorageAdapter.d.mts → retryErrorsStorageAdapter.d.ts} +1 -2
- package/lib/retryErrorsStorageAdapter.d.ts.map +1 -0
- package/lib/{retryErrorsStorageAdapter.mjs → retryErrorsStorageAdapter.js} +2 -5
- package/lib/retryErrorsStorageAdapter.js.map +1 -0
- package/lib/{retryUtils.d.mts → retryUtils.d.ts} +1 -1
- package/lib/retryUtils.d.ts.map +1 -0
- package/lib/{retryUtils.mjs → retryUtils.js} +6 -2
- package/lib/retryUtils.js.map +1 -0
- package/lib/{socketModule.d.mts → socketModule.d.ts} +1 -1
- package/lib/socketModule.d.ts.map +1 -0
- package/lib/{socketModule.mjs → socketModule.js} +3 -1
- package/lib/socketModule.js.map +1 -0
- package/lib/test/buildOdspShareLinkReqParams.spec.js +25 -0
- package/lib/test/buildOdspShareLinkReqParams.spec.js.map +1 -0
- package/lib/test/createNewUtilsTests.spec.js +221 -0
- package/lib/test/createNewUtilsTests.spec.js.map +1 -0
- package/lib/test/deltaStorageService.spec.js +176 -0
- package/lib/test/deltaStorageService.spec.js.map +1 -0
- package/lib/test/epochTests.spec.js +340 -0
- package/lib/test/epochTests.spec.js.map +1 -0
- package/lib/test/epochTestsWithRedemption.spec.js +119 -0
- package/lib/test/epochTestsWithRedemption.spec.js.map +1 -0
- package/lib/test/fetchSnapshot.spec.js +412 -0
- package/lib/test/fetchSnapshot.spec.js.map +1 -0
- package/lib/test/getFileLink.spec.js +62 -0
- package/lib/test/getFileLink.spec.js.map +1 -0
- package/lib/test/getUrlAndHeadersWithAuth.spec.js +66 -0
- package/lib/test/getUrlAndHeadersWithAuth.spec.js.map +1 -0
- package/lib/test/getVersions.spec.js +284 -0
- package/lib/test/getVersions.spec.js.map +1 -0
- package/lib/test/joinSessionCacheTests.spec.js +53 -0
- package/lib/test/joinSessionCacheTests.spec.js.map +1 -0
- package/lib/test/joinSessionPeriodicCall.spec.js +158 -0
- package/lib/test/joinSessionPeriodicCall.spec.js.map +1 -0
- package/lib/test/jsonSnapshotFormatTests.spec.js +107 -0
- package/lib/test/jsonSnapshotFormatTests.spec.js.map +1 -0
- package/lib/test/localOdspDriver.spec.js +177 -0
- package/lib/test/localOdspDriver.spec.js.map +1 -0
- package/lib/test/mockFetch.js +61 -0
- package/lib/test/mockFetch.js.map +1 -0
- package/lib/test/odspCreateContainer.spec.js +116 -0
- package/lib/test/odspCreateContainer.spec.js.map +1 -0
- package/lib/test/odspDriverResolverTest.spec.js +289 -0
- package/lib/test/odspDriverResolverTest.spec.js.map +1 -0
- package/lib/test/odspDriverUrlResolverForShareLink.spec.js +287 -0
- package/lib/test/odspDriverUrlResolverForShareLink.spec.js.map +1 -0
- package/lib/test/odspError.spec.js +299 -0
- package/lib/test/odspError.spec.js.map +1 -0
- package/lib/test/opsCaching.spec.js +357 -0
- package/lib/test/opsCaching.spec.js.map +1 -0
- package/lib/test/prefetchSnapshotTests.spec.js +420 -0
- package/lib/test/prefetchSnapshotTests.spec.js.map +1 -0
- package/lib/test/snapshotFormatTests.spec.js +218 -0
- package/lib/test/snapshotFormatTests.spec.js.map +1 -0
- package/lib/test/socketTests/deltaConnectionUpdateTests.spec.js +152 -0
- package/lib/test/socketTests/deltaConnectionUpdateTests.spec.js.map +1 -0
- package/lib/test/socketTests/socketMock.js +109 -0
- package/lib/test/socketTests/socketMock.js.map +1 -0
- package/lib/test/socketTests/socketTests.spec.js +256 -0
- package/lib/test/socketTests/socketTests.spec.js.map +1 -0
- package/lib/test/tokenFetch.spec.js +39 -0
- package/lib/test/tokenFetch.spec.js.map +1 -0
- package/lib/test/types/validateOdspDriverPrevious.generated.js +96 -0
- package/lib/test/types/validateOdspDriverPrevious.generated.js.map +1 -0
- package/lib/test/zipItDataRepresentationTests.spec.js +207 -0
- package/lib/test/zipItDataRepresentationTests.spec.js.map +1 -0
- package/lib/{vroom.d.mts → vroom.d.ts} +3 -3
- package/lib/vroom.d.ts.map +1 -0
- package/lib/{vroom.mjs → vroom.js} +4 -4
- package/lib/vroom.js.map +1 -0
- package/lib/{zipItDataRepresentationUtils.d.mts → zipItDataRepresentationUtils.d.ts} +2 -2
- package/lib/zipItDataRepresentationUtils.d.ts.map +1 -0
- package/lib/{zipItDataRepresentationUtils.mjs → zipItDataRepresentationUtils.js} +17 -9
- package/lib/zipItDataRepresentationUtils.js.map +1 -0
- package/package.json +90 -31
- package/src/ReadBufferUtils.ts +7 -7
- package/src/WriteBufferUtils.ts +13 -9
- package/src/checkUrl.ts +4 -2
- package/src/compactSnapshotParser.ts +87 -52
- package/src/compactSnapshotWriter.ts +19 -12
- package/src/contracts.ts +16 -4
- package/src/createFile.ts +16 -13
- package/src/createNewContainerOnExistingFile.ts +8 -8
- package/src/createNewModule.ts +2 -2
- package/src/createNewUtils.ts +19 -9
- package/src/createOdspCreateContainerRequest.ts +2 -1
- package/src/createOdspUrl.ts +1 -1
- package/src/epochTracker.ts +90 -55
- package/src/fetchSnapshot.ts +104 -47
- package/src/getFileLink.ts +21 -13
- package/src/getQueryString.ts +3 -0
- package/src/index.ts +27 -19
- package/src/localOdspDriver/localOdspDocumentService.ts +3 -3
- package/src/localOdspDriver/localOdspDocumentServiceFactory.ts +12 -11
- package/src/localOdspDriver/localOdspDocumentStorageManager.ts +5 -5
- package/src/odspCache.ts +13 -9
- package/src/odspDelayLoadedDeltaStream.ts +54 -33
- package/src/odspDeltaStorageService.ts +17 -16
- package/src/odspDocumentDeltaConnection.ts +52 -34
- package/src/odspDocumentService.ts +23 -20
- package/src/odspDocumentServiceFactory.ts +7 -2
- package/src/odspDocumentServiceFactoryCore.ts +25 -18
- package/src/odspDocumentServiceFactoryWithCodeSplit.ts +1 -1
- package/src/odspDocumentStorageManager.ts +276 -216
- package/src/odspDocumentStorageServiceBase.ts +45 -43
- package/src/odspDriverUrlResolver.ts +39 -24
- package/src/odspDriverUrlResolverForShareLink.ts +51 -31
- package/src/odspError.ts +4 -4
- package/src/odspFluidFileLink.ts +3 -3
- package/src/odspLocationRedirection.ts +1 -1
- package/src/odspPublicUtils.ts +3 -0
- package/src/odspSnapshotParser.ts +4 -3
- package/src/odspSummaryUploadManager.ts +21 -9
- package/src/odspUrlHelper.ts +2 -3
- package/src/odspUtils.ts +73 -30
- package/src/opsCaching.ts +13 -12
- package/src/packageVersion.ts +1 -1
- package/src/prefetchLatestSnapshot.ts +24 -15
- package/src/retryErrorsStorageAdapter.ts +4 -8
- package/src/retryUtils.ts +6 -2
- package/src/socketModule.ts +2 -0
- package/src/vroom.ts +6 -6
- package/src/zipItDataRepresentationUtils.ts +63 -35
- package/tsconfig.cjs.json +7 -0
- package/tsconfig.json +2 -5
- package/lib/ReadBufferUtils.d.mts.map +0 -1
- package/lib/ReadBufferUtils.mjs.map +0 -1
- package/lib/WriteBufferUtils.d.mts.map +0 -1
- package/lib/WriteBufferUtils.mjs.map +0 -1
- package/lib/checkUrl.d.mts.map +0 -1
- package/lib/checkUrl.mjs.map +0 -1
- package/lib/compactSnapshotParser.d.mts.map +0 -1
- package/lib/compactSnapshotParser.mjs.map +0 -1
- package/lib/compactSnapshotWriter.d.mts.map +0 -1
- package/lib/compactSnapshotWriter.mjs.map +0 -1
- package/lib/constants.d.mts.map +0 -1
- package/lib/constants.mjs.map +0 -1
- package/lib/contracts.d.mts.map +0 -1
- package/lib/contracts.mjs.map +0 -1
- package/lib/contractsPublic.d.mts.map +0 -1
- package/lib/contractsPublic.mjs.map +0 -1
- package/lib/createFile.d.mts.map +0 -1
- package/lib/createFile.mjs.map +0 -1
- package/lib/createNewContainerOnExistingFile.d.mts.map +0 -1
- package/lib/createNewContainerOnExistingFile.mjs.map +0 -1
- package/lib/createNewModule.d.mts.map +0 -1
- package/lib/createNewModule.mjs.map +0 -1
- package/lib/createNewUtils.d.mts.map +0 -1
- package/lib/createNewUtils.mjs.map +0 -1
- package/lib/createOdspCreateContainerRequest.d.mts.map +0 -1
- package/lib/createOdspCreateContainerRequest.mjs.map +0 -1
- package/lib/createOdspUrl.d.mts.map +0 -1
- package/lib/createOdspUrl.mjs.map +0 -1
- package/lib/epochTracker.d.mts.map +0 -1
- package/lib/epochTracker.mjs.map +0 -1
- package/lib/fetch.d.mts.map +0 -1
- package/lib/fetch.mjs.map +0 -1
- package/lib/fetchSnapshot.d.mts.map +0 -1
- package/lib/fetchSnapshot.mjs.map +0 -1
- package/lib/getFileLink.d.mts.map +0 -1
- package/lib/getFileLink.mjs.map +0 -1
- package/lib/getQueryString.d.mts.map +0 -1
- package/lib/getQueryString.mjs.map +0 -1
- package/lib/getUrlAndHeadersWithAuth.d.mts.map +0 -1
- package/lib/getUrlAndHeadersWithAuth.mjs.map +0 -1
- package/lib/index.d.mts.map +0 -1
- package/lib/index.mjs +0 -22
- package/lib/index.mjs.map +0 -1
- package/lib/localOdspDriver/localOdspDeltaStorageService.d.mts.map +0 -1
- package/lib/localOdspDriver/localOdspDeltaStorageService.mjs.map +0 -1
- package/lib/localOdspDriver/localOdspDocumentService.d.mts.map +0 -1
- package/lib/localOdspDriver/localOdspDocumentService.mjs.map +0 -1
- package/lib/localOdspDriver/localOdspDocumentServiceFactory.d.mts.map +0 -1
- package/lib/localOdspDriver/localOdspDocumentServiceFactory.mjs.map +0 -1
- package/lib/localOdspDriver/localOdspDocumentStorageManager.d.mts.map +0 -1
- package/lib/localOdspDriver/localOdspDocumentStorageManager.mjs.map +0 -1
- package/lib/odspCache.d.mts.map +0 -1
- package/lib/odspCache.mjs.map +0 -1
- package/lib/odspDelayLoadedDeltaStream.d.mts.map +0 -1
- package/lib/odspDelayLoadedDeltaStream.mjs.map +0 -1
- package/lib/odspDeltaStorageService.d.mts.map +0 -1
- package/lib/odspDeltaStorageService.mjs.map +0 -1
- package/lib/odspDocumentDeltaConnection.d.mts.map +0 -1
- package/lib/odspDocumentDeltaConnection.mjs.map +0 -1
- package/lib/odspDocumentService.d.mts.map +0 -1
- package/lib/odspDocumentService.mjs.map +0 -1
- package/lib/odspDocumentServiceFactory.d.mts.map +0 -1
- package/lib/odspDocumentServiceFactory.mjs.map +0 -1
- package/lib/odspDocumentServiceFactoryCore.d.mts.map +0 -1
- package/lib/odspDocumentServiceFactoryCore.mjs.map +0 -1
- package/lib/odspDocumentServiceFactoryWithCodeSplit.d.mts.map +0 -1
- package/lib/odspDocumentServiceFactoryWithCodeSplit.mjs.map +0 -1
- package/lib/odspDocumentStorageManager.d.mts.map +0 -1
- package/lib/odspDocumentStorageManager.mjs.map +0 -1
- package/lib/odspDocumentStorageServiceBase.d.mts.map +0 -1
- package/lib/odspDocumentStorageServiceBase.mjs.map +0 -1
- package/lib/odspDriverUrlResolver.d.mts.map +0 -1
- package/lib/odspDriverUrlResolver.mjs.map +0 -1
- package/lib/odspDriverUrlResolverForShareLink.d.mts.map +0 -1
- package/lib/odspDriverUrlResolverForShareLink.mjs.map +0 -1
- package/lib/odspError.d.mts.map +0 -1
- package/lib/odspError.mjs.map +0 -1
- package/lib/odspFluidFileLink.d.mts.map +0 -1
- package/lib/odspFluidFileLink.mjs.map +0 -1
- package/lib/odspLocationRedirection.d.mts.map +0 -1
- package/lib/odspLocationRedirection.mjs.map +0 -1
- package/lib/odspPublicUtils.d.mts.map +0 -1
- package/lib/odspPublicUtils.mjs.map +0 -1
- package/lib/odspSnapshotParser.d.mts.map +0 -1
- package/lib/odspSnapshotParser.mjs.map +0 -1
- package/lib/odspSummaryUploadManager.d.mts.map +0 -1
- package/lib/odspSummaryUploadManager.mjs.map +0 -1
- package/lib/odspUrlHelper.d.mts.map +0 -1
- package/lib/odspUrlHelper.mjs.map +0 -1
- package/lib/odspUtils.d.mts.map +0 -1
- package/lib/odspUtils.mjs.map +0 -1
- package/lib/opsCaching.d.mts.map +0 -1
- package/lib/opsCaching.mjs.map +0 -1
- package/lib/packageVersion.d.mts.map +0 -1
- package/lib/packageVersion.mjs.map +0 -1
- package/lib/prefetchLatestSnapshot.d.mts.map +0 -1
- package/lib/prefetchLatestSnapshot.mjs.map +0 -1
- package/lib/retryErrorsStorageAdapter.d.mts.map +0 -1
- package/lib/retryErrorsStorageAdapter.mjs.map +0 -1
- package/lib/retryUtils.d.mts.map +0 -1
- package/lib/retryUtils.mjs.map +0 -1
- package/lib/socketModule.d.mts.map +0 -1
- package/lib/socketModule.mjs.map +0 -1
- package/lib/vroom.d.mts.map +0 -1
- package/lib/vroom.mjs.map +0 -1
- package/lib/zipItDataRepresentationUtils.d.mts.map +0 -1
- package/lib/zipItDataRepresentationUtils.mjs.map +0 -1
|
@@ -0,0 +1,420 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* Copyright (c) Microsoft Corporation and contributors. All rights reserved.
|
|
3
|
+
* Licensed under the MIT License.
|
|
4
|
+
*/
|
|
5
|
+
/* eslint-disable @typescript-eslint/no-floating-promises */
|
|
6
|
+
import { strict as assert } from "node:assert";
|
|
7
|
+
import { getKeyForCacheEntry, } from "@fluidframework/odsp-driver-definitions";
|
|
8
|
+
import { MockLogger } from "@fluidframework/telemetry-utils";
|
|
9
|
+
import { FetchSource } from "@fluidframework/driver-definitions";
|
|
10
|
+
import { stringToBuffer } from "@fluid-internal/client-utils";
|
|
11
|
+
import { persistedCacheValueVersion, } from "../contracts.js";
|
|
12
|
+
import { LocalPersistentCache } from "../odspCache.js";
|
|
13
|
+
import { createCacheSnapshotKey } from "../odspUtils.js";
|
|
14
|
+
import { createOdspUrl } from "../createOdspUrl.js";
|
|
15
|
+
import { getHashedDocumentId } from "../odspPublicUtils.js";
|
|
16
|
+
import { OdspDriverUrlResolver } from "../odspDriverUrlResolver.js";
|
|
17
|
+
import { prefetchLatestSnapshot } from "../prefetchLatestSnapshot.js";
|
|
18
|
+
import { OdspDocumentServiceFactory } from "../odspDocumentServiceFactory.js";
|
|
19
|
+
import { convertToCompactSnapshot } from "../compactSnapshotWriter.js";
|
|
20
|
+
import { mockFetchSingle, notFound, createResponse } from "./mockFetch.js";
|
|
21
|
+
const createUtLocalCache = () => new LocalPersistentCache();
|
|
22
|
+
describe("Tests for prefetching snapshot", () => {
|
|
23
|
+
const siteUrl = "https://microsoft.sharepoint-df.com/siteUrl";
|
|
24
|
+
const driveId = "driveId";
|
|
25
|
+
const itemId = "itemId";
|
|
26
|
+
const filePath = "path";
|
|
27
|
+
let localCache;
|
|
28
|
+
let hashedDocumentId;
|
|
29
|
+
let service;
|
|
30
|
+
let resolved;
|
|
31
|
+
let mockLogger;
|
|
32
|
+
let snapshotPrefetchCacheKey;
|
|
33
|
+
const newFileParams = {
|
|
34
|
+
type: "New",
|
|
35
|
+
driveId,
|
|
36
|
+
siteUrl,
|
|
37
|
+
filePath,
|
|
38
|
+
filename: "filename",
|
|
39
|
+
};
|
|
40
|
+
function GetHostStoragePolicyInternal(isSummarizer = false) {
|
|
41
|
+
return {
|
|
42
|
+
snapshotOptions: { timeout: 2000 },
|
|
43
|
+
summarizerClient: isSummarizer,
|
|
44
|
+
fetchBinarySnapshotFormat: false,
|
|
45
|
+
// for testing both network and cache fetch
|
|
46
|
+
concurrentSnapshotFetch: true,
|
|
47
|
+
avoidPrefetchSnapshotCache: false,
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
const resolver = new OdspDriverUrlResolver();
|
|
51
|
+
let snapshotPrefetchResultCache;
|
|
52
|
+
const odspUrl = createOdspUrl({ ...newFileParams, itemId, dataStorePath: "/" });
|
|
53
|
+
const odspSnapshot = {
|
|
54
|
+
id: "id",
|
|
55
|
+
trees: [
|
|
56
|
+
{
|
|
57
|
+
entries: [{ path: "path", type: "tree" }],
|
|
58
|
+
id: "id",
|
|
59
|
+
sequenceNumber: 1,
|
|
60
|
+
},
|
|
61
|
+
],
|
|
62
|
+
blobs: [],
|
|
63
|
+
};
|
|
64
|
+
const content = {
|
|
65
|
+
snapshotTree: {
|
|
66
|
+
id: "id",
|
|
67
|
+
blobs: {},
|
|
68
|
+
trees: {},
|
|
69
|
+
},
|
|
70
|
+
blobContents: new Map(),
|
|
71
|
+
ops: [],
|
|
72
|
+
sequenceNumber: 0,
|
|
73
|
+
latestSequenceNumber: 0,
|
|
74
|
+
snapshotFormatV: 1,
|
|
75
|
+
};
|
|
76
|
+
const snapshotTreeWithGroupId = {
|
|
77
|
+
id: "SnapshotId",
|
|
78
|
+
blobs: {},
|
|
79
|
+
trees: {
|
|
80
|
+
".protocol": {
|
|
81
|
+
blobs: {},
|
|
82
|
+
trees: {},
|
|
83
|
+
},
|
|
84
|
+
".app": {
|
|
85
|
+
blobs: { ".metadata": "bARD4RKvW4LL1KmaUKp6hUMSp" },
|
|
86
|
+
trees: {
|
|
87
|
+
".channels": {
|
|
88
|
+
blobs: {},
|
|
89
|
+
trees: {
|
|
90
|
+
default: {
|
|
91
|
+
blobs: {},
|
|
92
|
+
trees: {
|
|
93
|
+
dds: {
|
|
94
|
+
blobs: {},
|
|
95
|
+
trees: {},
|
|
96
|
+
},
|
|
97
|
+
},
|
|
98
|
+
groupId: "G3",
|
|
99
|
+
},
|
|
100
|
+
},
|
|
101
|
+
unreferenced: true,
|
|
102
|
+
groupId: "G2",
|
|
103
|
+
},
|
|
104
|
+
".blobs": { blobs: {}, trees: {} },
|
|
105
|
+
},
|
|
106
|
+
},
|
|
107
|
+
},
|
|
108
|
+
};
|
|
109
|
+
const blobContents = new Map([
|
|
110
|
+
[
|
|
111
|
+
"bARD4RKvW4LL1KmaUKp6hUMSp",
|
|
112
|
+
stringToBuffer(JSON.stringify({ summaryFormatVersion: 1, gcFeature: 0 }), "utf8"),
|
|
113
|
+
],
|
|
114
|
+
]);
|
|
115
|
+
const value = {
|
|
116
|
+
value: { ...content, cacheEntryTime: Date.now() },
|
|
117
|
+
fluidEpoch: "epoch1",
|
|
118
|
+
version: persistedCacheValueVersion,
|
|
119
|
+
};
|
|
120
|
+
const expectedVersion = [{ id: "id", treeId: undefined }];
|
|
121
|
+
before(async () => {
|
|
122
|
+
hashedDocumentId = await getHashedDocumentId(driveId, itemId);
|
|
123
|
+
});
|
|
124
|
+
describe("Tests for prefetching snapshot: Concurrent snapshot fetch: Using GetVersions Api", () => {
|
|
125
|
+
let odspDocumentServiceFactory;
|
|
126
|
+
beforeEach(async () => {
|
|
127
|
+
mockLogger = new MockLogger();
|
|
128
|
+
localCache = createUtLocalCache();
|
|
129
|
+
resolved = await resolver.resolve({ url: odspUrl });
|
|
130
|
+
odspDocumentServiceFactory = new OdspDocumentServiceFactory(async (_options) => "token", async (_options) => "token", localCache, GetHostStoragePolicyInternal());
|
|
131
|
+
snapshotPrefetchCacheKey = getKeyForCacheEntry(createCacheSnapshotKey(resolved));
|
|
132
|
+
const documentservice = await odspDocumentServiceFactory.createDocumentService(resolved, mockLogger);
|
|
133
|
+
service = (await documentservice.connectToStorage());
|
|
134
|
+
snapshotPrefetchResultCache = odspDocumentServiceFactory.snapshotPrefetchResultCache;
|
|
135
|
+
});
|
|
136
|
+
afterEach(async () => {
|
|
137
|
+
localCache
|
|
138
|
+
.removeEntries({ docId: hashedDocumentId, resolvedUrl: resolved })
|
|
139
|
+
.catch(() => { });
|
|
140
|
+
snapshotPrefetchResultCache.remove(snapshotPrefetchCacheKey);
|
|
141
|
+
});
|
|
142
|
+
it("prefetching snapshot should result in snapshot source as cache as prefetch adds to cache", async () => {
|
|
143
|
+
await mockFetchSingle(async () => prefetchLatestSnapshot(resolved, async (_options) => "token", localCache, true, mockLogger, undefined, false, undefined, undefined, odspDocumentServiceFactory), async () => createResponse({ "x-fluid-epoch": "epoch1", "content-type": "application/json" }, odspSnapshot, 200));
|
|
144
|
+
const version = await service.getVersions(null, 1);
|
|
145
|
+
assert.deepStrictEqual(version, expectedVersion, "incorrect version");
|
|
146
|
+
assert(mockLogger.events.filter((event) => event.eventName.includes("ObtainSnapshot_end"))
|
|
147
|
+
.length === 1, "1 Obtain snapshot event should be there");
|
|
148
|
+
assert(mockLogger.matchEvents([
|
|
149
|
+
{ eventName: "OdspDriver:ObtainSnapshot_end", method: "cache" },
|
|
150
|
+
]), "Source should be cache");
|
|
151
|
+
});
|
|
152
|
+
it("prefetching snapshot should result in snapshot source as network if both cache and prefetch throws", async () => {
|
|
153
|
+
// overwriting get() to make cache fetch throw
|
|
154
|
+
localCache.get = async () => {
|
|
155
|
+
throw new Error("testing");
|
|
156
|
+
};
|
|
157
|
+
await mockFetchSingle(async () => prefetchLatestSnapshot(resolved, async (_options) => "token", localCache, true, mockLogger, undefined, false, undefined, undefined, odspDocumentServiceFactory), notFound);
|
|
158
|
+
const version = await mockFetchSingle(async () => service.getVersions(null, 1), async () => createResponse({ "x-fluid-epoch": "epoch1", "content-type": "application/json" }, odspSnapshot, 200));
|
|
159
|
+
assert.deepStrictEqual(version, expectedVersion, "incorrect version");
|
|
160
|
+
assert(mockLogger.events.filter((event) => event.eventName.includes("ObtainSnapshot_end"))
|
|
161
|
+
.length === 1, "1 Obtain snapshot event should be there");
|
|
162
|
+
assert(mockLogger.matchEvents([
|
|
163
|
+
{ eventName: "OdspDriver:ObtainSnapshot_end", method: "network" },
|
|
164
|
+
]), "Source should be network");
|
|
165
|
+
});
|
|
166
|
+
it("prefetching snapshot should result in snapshot source as cache or network if prefetch throws and cache contains the response", async () => {
|
|
167
|
+
const cacheEntry = {
|
|
168
|
+
key: "",
|
|
169
|
+
type: "snapshot",
|
|
170
|
+
file: { docId: resolved.hashedDocumentId, resolvedUrl: resolved },
|
|
171
|
+
};
|
|
172
|
+
await localCache.put(cacheEntry, value);
|
|
173
|
+
await mockFetchSingle(async () => prefetchLatestSnapshot(resolved, async (_options) => "token", localCache, true, mockLogger, undefined, false, undefined, undefined, odspDocumentServiceFactory), notFound);
|
|
174
|
+
const version = await mockFetchSingle(async () => service.getVersions(null, 1), async () => createResponse({ "x-fluid-epoch": "epoch1", "content-type": "application/json" }, odspSnapshot, 200));
|
|
175
|
+
assert.deepStrictEqual(version, expectedVersion, "incorrect version");
|
|
176
|
+
assert(mockLogger.events.filter((event) => event.eventName.includes("ObtainSnapshot_end"))
|
|
177
|
+
.length === 1, "1 Obtain snapshot event should be there");
|
|
178
|
+
const method = mockLogger.events.find((event) => event.eventName.includes("ObtainSnapshot_end"))?.method;
|
|
179
|
+
assert(method === "cache" || method === "network", "Source should be cache or network");
|
|
180
|
+
});
|
|
181
|
+
it("prefetching snapshot should result in snapshot source as either cache or prefetch if both pass", async () => {
|
|
182
|
+
const cacheEntry = {
|
|
183
|
+
key: "",
|
|
184
|
+
type: "snapshot",
|
|
185
|
+
file: { docId: hashedDocumentId, resolvedUrl: resolved },
|
|
186
|
+
};
|
|
187
|
+
await localCache.put(cacheEntry, value);
|
|
188
|
+
mockFetchSingle(async () => prefetchLatestSnapshot(resolved, async (_options) => "token", localCache, true, mockLogger, undefined, false, undefined, undefined, odspDocumentServiceFactory), async () => createResponse({ "x-fluid-epoch": "epoch1", "content-type": "application/json" }, odspSnapshot, 200));
|
|
189
|
+
const version = await service.getVersions(null, 1);
|
|
190
|
+
assert.deepStrictEqual(version, expectedVersion, "incorrect version");
|
|
191
|
+
assert(mockLogger.events.filter((event) => event.eventName.includes("ObtainSnapshot_end"))
|
|
192
|
+
.length === 1, "1 Obtain snapshot event should be there");
|
|
193
|
+
const method = mockLogger.events.find((event) => event.eventName.includes("ObtainSnapshot_end"))?.method;
|
|
194
|
+
assert(method === "cache" || method === "prefetched", "Source should be cache or prefetched");
|
|
195
|
+
});
|
|
196
|
+
it("prefetching snapshot should result in epoch error if different from what is already present", async () => {
|
|
197
|
+
// overwriting get() to make cache fetch throw
|
|
198
|
+
localCache.get = async () => {
|
|
199
|
+
throw new Error("testing");
|
|
200
|
+
};
|
|
201
|
+
// Set epoch first
|
|
202
|
+
await mockFetchSingle(async () => service.readBlob("id"), async () => createResponse({ "x-fluid-epoch": "epoch1", "content-type": "application/json" }, JSON.stringify("odspSnapshot"), 200));
|
|
203
|
+
// This will store the response with wrong epoch in the cache
|
|
204
|
+
await mockFetchSingle(async () => prefetchLatestSnapshot(resolved, async (_options) => "token", localCache, true, mockLogger, undefined, false, undefined, undefined, odspDocumentServiceFactory), async () => createResponse({ "x-fluid-epoch": "epoch2", "content-type": "application/json" }, odspSnapshot, 200));
|
|
205
|
+
await mockFetchSingle(async () => service.getVersions(null, 1), async () => createResponse({ "x-fluid-epoch": "epoch1", "content-type": "application/json" }, odspSnapshot, 200));
|
|
206
|
+
mockLogger.assertMatchAny([
|
|
207
|
+
{
|
|
208
|
+
error: "Epoch mismatch",
|
|
209
|
+
errorType: "fileOverwrittenInStorage",
|
|
210
|
+
serverEpoch: "epoch2",
|
|
211
|
+
clientEpoch: "epoch1",
|
|
212
|
+
fetchType: "treesLatest",
|
|
213
|
+
},
|
|
214
|
+
], "Snapshot prefetch has different epoch");
|
|
215
|
+
});
|
|
216
|
+
it("prefetching snapshot should result in epoch error if different from what is already present, fetch is not from cache", async () => {
|
|
217
|
+
// Set epoch first
|
|
218
|
+
await mockFetchSingle(async () => service.readBlob("id"), async () => createResponse({ "x-fluid-epoch": "epoch1", "content-type": "application/json" }, JSON.stringify("odspSnapshot"), 200));
|
|
219
|
+
// This will store the response with wrong epoch in the cache
|
|
220
|
+
await mockFetchSingle(async () => prefetchLatestSnapshot(resolved, async (_options) => "token", localCache, true, mockLogger, undefined, false, undefined, undefined, odspDocumentServiceFactory), async () => createResponse({ "x-fluid-epoch": "epoch2", "content-type": "application/json" }, odspSnapshot, 200));
|
|
221
|
+
await mockFetchSingle(async () => service.getVersions(null, 1, FetchSource.noCache), async () => createResponse({ "x-fluid-epoch": "epoch1", "content-type": "application/json" }, odspSnapshot, 200));
|
|
222
|
+
mockLogger.assertMatchAny([
|
|
223
|
+
{
|
|
224
|
+
error: "Epoch mismatch",
|
|
225
|
+
errorType: "fileOverwrittenInStorage",
|
|
226
|
+
serverEpoch: "epoch2",
|
|
227
|
+
clientEpoch: "epoch1",
|
|
228
|
+
fetchType: "treesLatest",
|
|
229
|
+
},
|
|
230
|
+
], "Snapshot prefetch has different epoch");
|
|
231
|
+
});
|
|
232
|
+
});
|
|
233
|
+
describe("Tests for prefetching snapshot: No Concurrent snapshot fetch: Using GetVersions Api", () => {
|
|
234
|
+
let odspDocumentServiceFactory;
|
|
235
|
+
beforeEach(async () => {
|
|
236
|
+
mockLogger = new MockLogger();
|
|
237
|
+
localCache = createUtLocalCache();
|
|
238
|
+
resolved = await resolver.resolve({ url: odspUrl });
|
|
239
|
+
const hostPolicy = GetHostStoragePolicyInternal();
|
|
240
|
+
hostPolicy.concurrentSnapshotFetch = false;
|
|
241
|
+
odspDocumentServiceFactory = new OdspDocumentServiceFactory(async (_options) => "token", async (_options) => "token", localCache, hostPolicy);
|
|
242
|
+
snapshotPrefetchCacheKey = getKeyForCacheEntry(createCacheSnapshotKey(resolved));
|
|
243
|
+
const documentservice = await odspDocumentServiceFactory.createDocumentService(resolved, mockLogger);
|
|
244
|
+
service = (await documentservice.connectToStorage());
|
|
245
|
+
snapshotPrefetchResultCache = odspDocumentServiceFactory.snapshotPrefetchResultCache;
|
|
246
|
+
});
|
|
247
|
+
afterEach(async () => {
|
|
248
|
+
localCache
|
|
249
|
+
.removeEntries({ docId: hashedDocumentId, resolvedUrl: resolved })
|
|
250
|
+
.catch(() => { });
|
|
251
|
+
snapshotPrefetchResultCache.remove(snapshotPrefetchCacheKey);
|
|
252
|
+
});
|
|
253
|
+
it("prefetching snapshot should result in epoch error if different from what is already present, no concurrent fetch", async () => {
|
|
254
|
+
// Set epoch first
|
|
255
|
+
await mockFetchSingle(async () => service.readBlob("id"), async () => createResponse({ "x-fluid-epoch": "epoch1", "content-type": "application/json" }, JSON.stringify("odspSnapshot"), 200));
|
|
256
|
+
// This will store the response with wrong epoch in the cache
|
|
257
|
+
await mockFetchSingle(async () => prefetchLatestSnapshot(resolved, async (_options) => "token", localCache, true, mockLogger, undefined, false, undefined, undefined, odspDocumentServiceFactory), async () => createResponse({ "x-fluid-epoch": "epoch2", "content-type": "application/json" }, odspSnapshot, 200));
|
|
258
|
+
await mockFetchSingle(async () => service.getVersions(null, 1, undefined), async () => createResponse({ "x-fluid-epoch": "epoch1", "content-type": "application/json" }, odspSnapshot, 200));
|
|
259
|
+
mockLogger.assertMatchAny([
|
|
260
|
+
{
|
|
261
|
+
error: "Epoch mismatch",
|
|
262
|
+
errorType: "fileOverwrittenInStorage",
|
|
263
|
+
serverEpoch: "epoch2",
|
|
264
|
+
clientEpoch: "epoch1",
|
|
265
|
+
fetchType: "treesLatest",
|
|
266
|
+
},
|
|
267
|
+
], "Snapshot prefetch has different epoch");
|
|
268
|
+
});
|
|
269
|
+
it("prefetching snapshot should be successful from prefetching, no concurrent fetch", async () => {
|
|
270
|
+
await mockFetchSingle(async () => prefetchLatestSnapshot(resolved, async (_options) => "token", localCache, true, mockLogger, undefined, false, undefined, undefined, odspDocumentServiceFactory), async () => createResponse({ "x-fluid-epoch": "epoch1", "content-type": "application/json" }, odspSnapshot, 200));
|
|
271
|
+
const version = await service.getVersions(null, 1);
|
|
272
|
+
assert.deepStrictEqual(version, expectedVersion, "incorrect version");
|
|
273
|
+
// Should be from cache as prefetch will store in cache
|
|
274
|
+
assert(mockLogger.matchEvents([
|
|
275
|
+
{ eventName: "OdspDriver:ObtainSnapshot_end", method: "cache" },
|
|
276
|
+
]), "unexpected events");
|
|
277
|
+
});
|
|
278
|
+
});
|
|
279
|
+
describe("Tests for prefetching snapshot: Concurrent snapshot fetch: Using GetSnapshot Api", () => {
|
|
280
|
+
let odspDocumentServiceFactory;
|
|
281
|
+
const snapshotWithGroupId = {
|
|
282
|
+
blobContents,
|
|
283
|
+
snapshotTree: snapshotTreeWithGroupId,
|
|
284
|
+
ops: [],
|
|
285
|
+
latestSequenceNumber: 0,
|
|
286
|
+
sequenceNumber: 0,
|
|
287
|
+
snapshotFormatV: 1,
|
|
288
|
+
};
|
|
289
|
+
const valueWithGroupId = {
|
|
290
|
+
value: { ...snapshotWithGroupId, cacheEntryTime: Date.now() },
|
|
291
|
+
fluidEpoch: "epoch1",
|
|
292
|
+
version: persistedCacheValueVersion,
|
|
293
|
+
};
|
|
294
|
+
const odspCompactSnapshotWithGroupId = convertToCompactSnapshot(snapshotWithGroupId);
|
|
295
|
+
const snapshotTreeWithGroupIdToCompare = {
|
|
296
|
+
blobs: { ...snapshotTreeWithGroupId.trees[".app"].blobs },
|
|
297
|
+
trees: {
|
|
298
|
+
...snapshotTreeWithGroupId.trees[".app"].trees,
|
|
299
|
+
".protocol": snapshotTreeWithGroupId.trees[".protocol"],
|
|
300
|
+
},
|
|
301
|
+
};
|
|
302
|
+
beforeEach(async () => {
|
|
303
|
+
mockLogger = new MockLogger();
|
|
304
|
+
localCache = createUtLocalCache();
|
|
305
|
+
resolved = await resolver.resolve({ url: odspUrl });
|
|
306
|
+
odspDocumentServiceFactory = new OdspDocumentServiceFactory(async (_options) => "token", async (_options) => "token", localCache, GetHostStoragePolicyInternal());
|
|
307
|
+
snapshotPrefetchCacheKey = getKeyForCacheEntry(createCacheSnapshotKey(resolved));
|
|
308
|
+
const documentservice = await odspDocumentServiceFactory.createDocumentService(resolved, mockLogger);
|
|
309
|
+
service = (await documentservice.connectToStorage());
|
|
310
|
+
snapshotPrefetchResultCache = odspDocumentServiceFactory.snapshotPrefetchResultCache;
|
|
311
|
+
});
|
|
312
|
+
afterEach(async () => {
|
|
313
|
+
localCache
|
|
314
|
+
.removeEntries({ docId: hashedDocumentId, resolvedUrl: resolved })
|
|
315
|
+
.catch(() => { });
|
|
316
|
+
snapshotPrefetchResultCache.remove(snapshotPrefetchCacheKey);
|
|
317
|
+
});
|
|
318
|
+
it("prefetching snapshot should result in snapshot source as cache as prefetch adds to cache", async () => {
|
|
319
|
+
await mockFetchSingle(async () => prefetchLatestSnapshot(resolved, async (_options) => "token", localCache, true, mockLogger, undefined, false, undefined, undefined, odspDocumentServiceFactory), async () => createResponse({ "x-fluid-epoch": "epoch1", "content-type": "application/ms-fluid" }, odspCompactSnapshotWithGroupId, 200));
|
|
320
|
+
const fetchedSnapshot = await service.getSnapshot();
|
|
321
|
+
assert.deepStrictEqual(fetchedSnapshot.snapshotTree, snapshotTreeWithGroupIdToCompare, "incorrect snapshot");
|
|
322
|
+
assert(mockLogger.events.filter((event) => event.eventName.includes("ObtainSnapshot_end"))
|
|
323
|
+
.length === 1, "1 Obtain snapshot event should be there");
|
|
324
|
+
assert(mockLogger.matchEvents([
|
|
325
|
+
{ eventName: "OdspDriver:ObtainSnapshot_end", method: "cache" },
|
|
326
|
+
]), "Source should be cache");
|
|
327
|
+
});
|
|
328
|
+
it("prefetching snapshot should result in snapshot source as network if both cache and prefetch throws", async () => {
|
|
329
|
+
// overwriting get() to make cache fetch throw
|
|
330
|
+
localCache.get = async () => {
|
|
331
|
+
throw new Error("testing");
|
|
332
|
+
};
|
|
333
|
+
await mockFetchSingle(async () => prefetchLatestSnapshot(resolved, async (_options) => "token", localCache, true, mockLogger, undefined, false, undefined, undefined, odspDocumentServiceFactory), notFound);
|
|
334
|
+
const fetchedSnapshot = await mockFetchSingle(async () => service.getSnapshot(), async () => createResponse({ "x-fluid-epoch": "epoch1", "content-type": "application/ms-fluid" }, odspCompactSnapshotWithGroupId, 200));
|
|
335
|
+
assert.deepStrictEqual(fetchedSnapshot.snapshotTree, snapshotTreeWithGroupIdToCompare, "incorrect snapshot");
|
|
336
|
+
assert(mockLogger.events.filter((event) => event.eventName.includes("ObtainSnapshot_end"))
|
|
337
|
+
.length === 1, "1 Obtain snapshot event should be there");
|
|
338
|
+
assert(mockLogger.matchEvents([
|
|
339
|
+
{ eventName: "OdspDriver:ObtainSnapshot_end", method: "network" },
|
|
340
|
+
]), "Source should be network");
|
|
341
|
+
});
|
|
342
|
+
it("prefetching snapshot should result in snapshot source as cache or network if prefetch throws and cache contains the response", async () => {
|
|
343
|
+
const cacheEntry = {
|
|
344
|
+
key: "",
|
|
345
|
+
type: "snapshot",
|
|
346
|
+
file: { docId: resolved.hashedDocumentId, resolvedUrl: resolved },
|
|
347
|
+
};
|
|
348
|
+
await localCache.put(cacheEntry, valueWithGroupId);
|
|
349
|
+
await mockFetchSingle(async () => prefetchLatestSnapshot(resolved, async (_options) => "token", localCache, true, mockLogger, undefined, false, undefined, undefined, odspDocumentServiceFactory), notFound);
|
|
350
|
+
const fetchedSnapshot = await mockFetchSingle(async () => service.getSnapshot(), async () => createResponse({ "x-fluid-epoch": "epoch1", "content-type": "application/ms-fluid" }, odspCompactSnapshotWithGroupId, 200));
|
|
351
|
+
assert.deepStrictEqual(fetchedSnapshot.snapshotTree, snapshotTreeWithGroupIdToCompare, "incorrect snapshot");
|
|
352
|
+
assert(mockLogger.events.filter((event) => event.eventName.includes("ObtainSnapshot_end"))
|
|
353
|
+
.length === 1, "1 Obtain snapshot event should be there");
|
|
354
|
+
const method = mockLogger.events.find((event) => event.eventName.includes("ObtainSnapshot_end"))?.method;
|
|
355
|
+
assert(method === "cache" || method === "network", "Source should be cache or network");
|
|
356
|
+
});
|
|
357
|
+
it("prefetching snapshot should result in snapshot source as either cache or prefetch if both pass", async () => {
|
|
358
|
+
const cacheEntry = {
|
|
359
|
+
key: "",
|
|
360
|
+
type: "snapshot",
|
|
361
|
+
file: { docId: hashedDocumentId, resolvedUrl: resolved },
|
|
362
|
+
};
|
|
363
|
+
await localCache.put(cacheEntry, valueWithGroupId);
|
|
364
|
+
mockFetchSingle(async () => prefetchLatestSnapshot(resolved, async (_options) => "token", localCache, true, mockLogger, undefined, false, undefined, undefined, odspDocumentServiceFactory), async () => createResponse({ "x-fluid-epoch": "epoch1", "content-type": "application/ms-fluid" }, odspCompactSnapshotWithGroupId, 200));
|
|
365
|
+
const fetchedSnapshot = await service.getSnapshot();
|
|
366
|
+
assert.deepStrictEqual(fetchedSnapshot.snapshotTree, snapshotTreeWithGroupIdToCompare, "incorrect snapshot");
|
|
367
|
+
assert(mockLogger.events.filter((event) => event.eventName.includes("ObtainSnapshot_end"))
|
|
368
|
+
.length === 1, "1 Obtain snapshot event should be there");
|
|
369
|
+
const method = mockLogger.events.find((event) => event.eventName.includes("ObtainSnapshot_end"))?.method;
|
|
370
|
+
assert(method === "cache" || method === "prefetched", "Source should be cache or prefetched");
|
|
371
|
+
});
|
|
372
|
+
});
|
|
373
|
+
describe("Tests for prefetching snapshot: No Concurrent snapshot fetch: Using GetSnapshot Api", () => {
|
|
374
|
+
let odspDocumentServiceFactory;
|
|
375
|
+
const snapshotWithGroupId = {
|
|
376
|
+
blobContents,
|
|
377
|
+
snapshotTree: snapshotTreeWithGroupId,
|
|
378
|
+
ops: [],
|
|
379
|
+
latestSequenceNumber: 0,
|
|
380
|
+
sequenceNumber: 0,
|
|
381
|
+
snapshotFormatV: 1,
|
|
382
|
+
};
|
|
383
|
+
const odspCompactSnapshotWithGroupId = convertToCompactSnapshot(snapshotWithGroupId);
|
|
384
|
+
const snapshotTreeWithGroupIdToCompare = {
|
|
385
|
+
blobs: { ...snapshotTreeWithGroupId.trees[".app"].blobs },
|
|
386
|
+
trees: {
|
|
387
|
+
...snapshotTreeWithGroupId.trees[".app"].trees,
|
|
388
|
+
".protocol": snapshotTreeWithGroupId.trees[".protocol"],
|
|
389
|
+
},
|
|
390
|
+
};
|
|
391
|
+
beforeEach(async () => {
|
|
392
|
+
mockLogger = new MockLogger();
|
|
393
|
+
localCache = createUtLocalCache();
|
|
394
|
+
resolved = await resolver.resolve({ url: odspUrl });
|
|
395
|
+
const hostPolicy = GetHostStoragePolicyInternal();
|
|
396
|
+
hostPolicy.concurrentSnapshotFetch = false;
|
|
397
|
+
odspDocumentServiceFactory = new OdspDocumentServiceFactory(async (_options) => "token", async (_options) => "token", localCache, hostPolicy);
|
|
398
|
+
snapshotPrefetchCacheKey = getKeyForCacheEntry(createCacheSnapshotKey(resolved));
|
|
399
|
+
const documentservice = await odspDocumentServiceFactory.createDocumentService(resolved, mockLogger);
|
|
400
|
+
service = (await documentservice.connectToStorage());
|
|
401
|
+
snapshotPrefetchResultCache = odspDocumentServiceFactory.snapshotPrefetchResultCache;
|
|
402
|
+
});
|
|
403
|
+
afterEach(async () => {
|
|
404
|
+
localCache
|
|
405
|
+
.removeEntries({ docId: hashedDocumentId, resolvedUrl: resolved })
|
|
406
|
+
.catch(() => { });
|
|
407
|
+
snapshotPrefetchResultCache.remove(snapshotPrefetchCacheKey);
|
|
408
|
+
});
|
|
409
|
+
it("prefetching snapshot should be successful from prefetching, no concurrent fetch", async () => {
|
|
410
|
+
await mockFetchSingle(async () => prefetchLatestSnapshot(resolved, async (_options) => "token", localCache, true, mockLogger, undefined, false, undefined, undefined, odspDocumentServiceFactory), async () => createResponse({ "x-fluid-epoch": "epoch1", "content-type": "application/ms-fluid" }, odspCompactSnapshotWithGroupId, 200));
|
|
411
|
+
const fetchedSnapshot = await service.getSnapshot();
|
|
412
|
+
assert.deepStrictEqual(fetchedSnapshot.snapshotTree, snapshotTreeWithGroupIdToCompare, "incorrect snapshot");
|
|
413
|
+
// Should be from cache as prefetch will store in cache
|
|
414
|
+
assert(mockLogger.matchEvents([
|
|
415
|
+
{ eventName: "OdspDriver:ObtainSnapshot_end", method: "cache" },
|
|
416
|
+
]), "unexpected events");
|
|
417
|
+
});
|
|
418
|
+
});
|
|
419
|
+
});
|
|
420
|
+
//# sourceMappingURL=prefetchSnapshotTests.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prefetchSnapshotTests.spec.js","sourceRoot":"","sources":["../../src/test/prefetchSnapshotTests.spec.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\n/* eslint-disable @typescript-eslint/no-floating-promises */\nimport { strict as assert } from \"node:assert\";\nimport { PromiseCache } from \"@fluidframework/core-utils\";\nimport {\n\tIOdspResolvedUrl,\n\tICacheEntry,\n\tgetKeyForCacheEntry,\n} from \"@fluidframework/odsp-driver-definitions\";\nimport { MockLogger } from \"@fluidframework/telemetry-utils\";\nimport { FetchSource, ISnapshot } from \"@fluidframework/driver-definitions\";\nimport { ISnapshotTree } from \"@fluidframework/protocol-definitions\";\nimport { stringToBuffer } from \"@fluid-internal/client-utils\";\nimport {\n\tIOdspSnapshot,\n\tHostStoragePolicyInternal,\n\tIVersionedValueWithEpoch,\n\tpersistedCacheValueVersion,\n} from \"../contracts.js\";\nimport { IPrefetchSnapshotContents, LocalPersistentCache } from \"../odspCache.js\";\nimport { createCacheSnapshotKey, INewFileInfo } from \"../odspUtils.js\";\nimport { createOdspUrl } from \"../createOdspUrl.js\";\nimport { getHashedDocumentId } from \"../odspPublicUtils.js\";\nimport { OdspDriverUrlResolver } from \"../odspDriverUrlResolver.js\";\nimport { OdspDocumentStorageService } from \"../odspDocumentStorageManager.js\";\nimport { prefetchLatestSnapshot } from \"../prefetchLatestSnapshot.js\";\nimport { OdspDocumentServiceFactory } from \"../odspDocumentServiceFactory.js\";\nimport { convertToCompactSnapshot } from \"../compactSnapshotWriter.js\";\nimport { mockFetchSingle, notFound, createResponse } from \"./mockFetch.js\";\n\nconst createUtLocalCache = (): LocalPersistentCache => new LocalPersistentCache();\n\ndescribe(\"Tests for prefetching snapshot\", () => {\n\tconst siteUrl = \"https://microsoft.sharepoint-df.com/siteUrl\";\n\tconst driveId = \"driveId\";\n\tconst itemId = \"itemId\";\n\tconst filePath = \"path\";\n\tlet localCache: LocalPersistentCache;\n\tlet hashedDocumentId: string;\n\tlet service: OdspDocumentStorageService;\n\tlet resolved: IOdspResolvedUrl;\n\tlet mockLogger: MockLogger;\n\tlet snapshotPrefetchCacheKey: string;\n\n\tconst newFileParams: INewFileInfo = {\n\t\ttype: \"New\",\n\t\tdriveId,\n\t\tsiteUrl,\n\t\tfilePath,\n\t\tfilename: \"filename\",\n\t};\n\n\tfunction GetHostStoragePolicyInternal(\n\t\tisSummarizer: boolean = false,\n\t): HostStoragePolicyInternal {\n\t\treturn {\n\t\t\tsnapshotOptions: { timeout: 2000 },\n\t\t\tsummarizerClient: isSummarizer,\n\t\t\tfetchBinarySnapshotFormat: false,\n\t\t\t// for testing both network and cache fetch\n\t\t\tconcurrentSnapshotFetch: true,\n\t\t\tavoidPrefetchSnapshotCache: false,\n\t\t};\n\t}\n\tconst resolver = new OdspDriverUrlResolver();\n\tlet snapshotPrefetchResultCache: PromiseCache<string, IPrefetchSnapshotContents>;\n\tconst odspUrl = createOdspUrl({ ...newFileParams, itemId, dataStorePath: \"/\" });\n\n\tconst odspSnapshot: IOdspSnapshot = {\n\t\tid: \"id\",\n\t\ttrees: [\n\t\t\t{\n\t\t\t\tentries: [{ path: \"path\", type: \"tree\" }],\n\t\t\t\tid: \"id\",\n\t\t\t\tsequenceNumber: 1,\n\t\t\t},\n\t\t],\n\t\tblobs: [],\n\t};\n\n\tconst content: ISnapshot = {\n\t\tsnapshotTree: {\n\t\t\tid: \"id\",\n\t\t\tblobs: {},\n\t\t\ttrees: {},\n\t\t},\n\t\tblobContents: new Map(),\n\t\tops: [],\n\t\tsequenceNumber: 0,\n\t\tlatestSequenceNumber: 0,\n\t\tsnapshotFormatV: 1,\n\t};\n\n\tconst snapshotTreeWithGroupId: ISnapshotTree = {\n\t\tid: \"SnapshotId\",\n\t\tblobs: {},\n\t\ttrees: {\n\t\t\t\".protocol\": {\n\t\t\t\tblobs: {},\n\t\t\t\ttrees: {},\n\t\t\t},\n\t\t\t\".app\": {\n\t\t\t\tblobs: { \".metadata\": \"bARD4RKvW4LL1KmaUKp6hUMSp\" },\n\t\t\t\ttrees: {\n\t\t\t\t\t\".channels\": {\n\t\t\t\t\t\tblobs: {},\n\t\t\t\t\t\ttrees: {\n\t\t\t\t\t\t\tdefault: {\n\t\t\t\t\t\t\t\tblobs: {},\n\t\t\t\t\t\t\t\ttrees: {\n\t\t\t\t\t\t\t\t\tdds: {\n\t\t\t\t\t\t\t\t\t\tblobs: {},\n\t\t\t\t\t\t\t\t\t\ttrees: {},\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\tgroupId: \"G3\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\tunreferenced: true,\n\t\t\t\t\t\tgroupId: \"G2\",\n\t\t\t\t\t},\n\t\t\t\t\t\".blobs\": { blobs: {}, trees: {} },\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t};\n\n\tconst blobContents = new Map<string, ArrayBuffer>([\n\t\t[\n\t\t\t\"bARD4RKvW4LL1KmaUKp6hUMSp\",\n\t\t\tstringToBuffer(JSON.stringify({ summaryFormatVersion: 1, gcFeature: 0 }), \"utf8\"),\n\t\t],\n\t]);\n\n\tconst value: IVersionedValueWithEpoch = {\n\t\tvalue: { ...content, cacheEntryTime: Date.now() },\n\t\tfluidEpoch: \"epoch1\",\n\t\tversion: persistedCacheValueVersion,\n\t};\n\n\tconst expectedVersion = [{ id: \"id\", treeId: undefined! }];\n\n\tbefore(async () => {\n\t\thashedDocumentId = await getHashedDocumentId(driveId, itemId);\n\t});\n\n\tdescribe(\"Tests for prefetching snapshot: Concurrent snapshot fetch: Using GetVersions Api\", () => {\n\t\tlet odspDocumentServiceFactory: OdspDocumentServiceFactory;\n\t\tbeforeEach(async () => {\n\t\t\tmockLogger = new MockLogger();\n\t\t\tlocalCache = createUtLocalCache();\n\t\t\tresolved = await resolver.resolve({ url: odspUrl });\n\t\t\todspDocumentServiceFactory = new OdspDocumentServiceFactory(\n\t\t\t\tasync (_options) => \"token\",\n\t\t\t\tasync (_options) => \"token\",\n\t\t\t\tlocalCache,\n\t\t\t\tGetHostStoragePolicyInternal(),\n\t\t\t);\n\t\t\tsnapshotPrefetchCacheKey = getKeyForCacheEntry(createCacheSnapshotKey(resolved));\n\t\t\tconst documentservice = await odspDocumentServiceFactory.createDocumentService(\n\t\t\t\tresolved,\n\t\t\t\tmockLogger,\n\t\t\t);\n\t\t\tservice = (await documentservice.connectToStorage()) as OdspDocumentStorageService;\n\t\t\tsnapshotPrefetchResultCache = odspDocumentServiceFactory.snapshotPrefetchResultCache;\n\t\t});\n\n\t\tafterEach(async () => {\n\t\t\tlocalCache\n\t\t\t\t.removeEntries({ docId: hashedDocumentId, resolvedUrl: resolved })\n\t\t\t\t.catch(() => {});\n\t\t\tsnapshotPrefetchResultCache.remove(snapshotPrefetchCacheKey);\n\t\t});\n\n\t\tit(\"prefetching snapshot should result in snapshot source as cache as prefetch adds to cache\", async () => {\n\t\t\tawait mockFetchSingle(\n\t\t\t\tasync () =>\n\t\t\t\t\tprefetchLatestSnapshot(\n\t\t\t\t\t\tresolved,\n\t\t\t\t\t\tasync (_options) => \"token\",\n\t\t\t\t\t\tlocalCache,\n\t\t\t\t\t\ttrue,\n\t\t\t\t\t\tmockLogger,\n\t\t\t\t\t\tundefined,\n\t\t\t\t\t\tfalse,\n\t\t\t\t\t\tundefined,\n\t\t\t\t\t\tundefined,\n\t\t\t\t\t\todspDocumentServiceFactory,\n\t\t\t\t\t),\n\t\t\t\tasync () =>\n\t\t\t\t\tcreateResponse(\n\t\t\t\t\t\t{ \"x-fluid-epoch\": \"epoch1\", \"content-type\": \"application/json\" },\n\t\t\t\t\t\todspSnapshot,\n\t\t\t\t\t\t200,\n\t\t\t\t\t),\n\t\t\t);\n\n\t\t\tconst version = await service.getVersions(null, 1);\n\n\t\t\tassert.deepStrictEqual(version, expectedVersion, \"incorrect version\");\n\t\t\tassert(\n\t\t\t\tmockLogger.events.filter((event) => event.eventName.includes(\"ObtainSnapshot_end\"))\n\t\t\t\t\t.length === 1,\n\t\t\t\t\"1 Obtain snapshot event should be there\",\n\t\t\t);\n\t\t\tassert(\n\t\t\t\tmockLogger.matchEvents([\n\t\t\t\t\t{ eventName: \"OdspDriver:ObtainSnapshot_end\", method: \"cache\" },\n\t\t\t\t]),\n\t\t\t\t\"Source should be cache\",\n\t\t\t);\n\t\t});\n\n\t\tit(\"prefetching snapshot should result in snapshot source as network if both cache and prefetch throws\", async () => {\n\t\t\t// overwriting get() to make cache fetch throw\n\t\t\tlocalCache.get = async (): Promise<void> => {\n\t\t\t\tthrow new Error(\"testing\");\n\t\t\t};\n\n\t\t\tawait mockFetchSingle(\n\t\t\t\tasync () =>\n\t\t\t\t\tprefetchLatestSnapshot(\n\t\t\t\t\t\tresolved,\n\t\t\t\t\t\tasync (_options) => \"token\",\n\t\t\t\t\t\tlocalCache,\n\t\t\t\t\t\ttrue,\n\t\t\t\t\t\tmockLogger,\n\t\t\t\t\t\tundefined,\n\t\t\t\t\t\tfalse,\n\t\t\t\t\t\tundefined,\n\t\t\t\t\t\tundefined,\n\t\t\t\t\t\todspDocumentServiceFactory,\n\t\t\t\t\t),\n\t\t\t\tnotFound,\n\t\t\t);\n\n\t\t\tconst version = await mockFetchSingle(\n\t\t\t\tasync () => service.getVersions(null, 1),\n\t\t\t\tasync () =>\n\t\t\t\t\tcreateResponse(\n\t\t\t\t\t\t{ \"x-fluid-epoch\": \"epoch1\", \"content-type\": \"application/json\" },\n\t\t\t\t\t\todspSnapshot,\n\t\t\t\t\t\t200,\n\t\t\t\t\t),\n\t\t\t);\n\t\t\tassert.deepStrictEqual(version, expectedVersion, \"incorrect version\");\n\t\t\tassert(\n\t\t\t\tmockLogger.events.filter((event) => event.eventName.includes(\"ObtainSnapshot_end\"))\n\t\t\t\t\t.length === 1,\n\t\t\t\t\"1 Obtain snapshot event should be there\",\n\t\t\t);\n\t\t\tassert(\n\t\t\t\tmockLogger.matchEvents([\n\t\t\t\t\t{ eventName: \"OdspDriver:ObtainSnapshot_end\", method: \"network\" },\n\t\t\t\t]),\n\t\t\t\t\"Source should be network\",\n\t\t\t);\n\t\t});\n\n\t\tit(\"prefetching snapshot should result in snapshot source as cache or network if prefetch throws and cache contains the response\", async () => {\n\t\t\tconst cacheEntry: ICacheEntry = {\n\t\t\t\tkey: \"\",\n\t\t\t\ttype: \"snapshot\",\n\t\t\t\tfile: { docId: resolved.hashedDocumentId, resolvedUrl: resolved },\n\t\t\t};\n\t\t\tawait localCache.put(cacheEntry, value);\n\n\t\t\tawait mockFetchSingle(\n\t\t\t\tasync () =>\n\t\t\t\t\tprefetchLatestSnapshot(\n\t\t\t\t\t\tresolved,\n\t\t\t\t\t\tasync (_options) => \"token\",\n\t\t\t\t\t\tlocalCache,\n\t\t\t\t\t\ttrue,\n\t\t\t\t\t\tmockLogger,\n\t\t\t\t\t\tundefined,\n\t\t\t\t\t\tfalse,\n\t\t\t\t\t\tundefined,\n\t\t\t\t\t\tundefined,\n\t\t\t\t\t\todspDocumentServiceFactory,\n\t\t\t\t\t),\n\t\t\t\tnotFound,\n\t\t\t);\n\n\t\t\tconst version = await mockFetchSingle(\n\t\t\t\tasync () => service.getVersions(null, 1),\n\t\t\t\tasync () =>\n\t\t\t\t\tcreateResponse(\n\t\t\t\t\t\t{ \"x-fluid-epoch\": \"epoch1\", \"content-type\": \"application/json\" },\n\t\t\t\t\t\todspSnapshot,\n\t\t\t\t\t\t200,\n\t\t\t\t\t),\n\t\t\t);\n\n\t\t\tassert.deepStrictEqual(version, expectedVersion, \"incorrect version\");\n\t\t\tassert(\n\t\t\t\tmockLogger.events.filter((event) => event.eventName.includes(\"ObtainSnapshot_end\"))\n\t\t\t\t\t.length === 1,\n\t\t\t\t\"1 Obtain snapshot event should be there\",\n\t\t\t);\n\t\t\tconst method = mockLogger.events.find((event) =>\n\t\t\t\tevent.eventName.includes(\"ObtainSnapshot_end\"),\n\t\t\t)?.method;\n\t\t\tassert(method === \"cache\" || method === \"network\", \"Source should be cache or network\");\n\t\t});\n\n\t\tit(\"prefetching snapshot should result in snapshot source as either cache or prefetch if both pass\", async () => {\n\t\t\tconst cacheEntry: ICacheEntry = {\n\t\t\t\tkey: \"\",\n\t\t\t\ttype: \"snapshot\",\n\t\t\t\tfile: { docId: hashedDocumentId, resolvedUrl: resolved },\n\t\t\t};\n\t\t\tawait localCache.put(cacheEntry, value);\n\n\t\t\tmockFetchSingle(\n\t\t\t\tasync () =>\n\t\t\t\t\tprefetchLatestSnapshot(\n\t\t\t\t\t\tresolved,\n\t\t\t\t\t\tasync (_options) => \"token\",\n\t\t\t\t\t\tlocalCache,\n\t\t\t\t\t\ttrue,\n\t\t\t\t\t\tmockLogger,\n\t\t\t\t\t\tundefined,\n\t\t\t\t\t\tfalse,\n\t\t\t\t\t\tundefined,\n\t\t\t\t\t\tundefined,\n\t\t\t\t\t\todspDocumentServiceFactory,\n\t\t\t\t\t),\n\t\t\t\tasync () =>\n\t\t\t\t\tcreateResponse(\n\t\t\t\t\t\t{ \"x-fluid-epoch\": \"epoch1\", \"content-type\": \"application/json\" },\n\t\t\t\t\t\todspSnapshot,\n\t\t\t\t\t\t200,\n\t\t\t\t\t),\n\t\t\t);\n\n\t\t\tconst version = await service.getVersions(null, 1);\n\t\t\tassert.deepStrictEqual(version, expectedVersion, \"incorrect version\");\n\t\t\tassert(\n\t\t\t\tmockLogger.events.filter((event) => event.eventName.includes(\"ObtainSnapshot_end\"))\n\t\t\t\t\t.length === 1,\n\t\t\t\t\"1 Obtain snapshot event should be there\",\n\t\t\t);\n\t\t\tconst method = mockLogger.events.find((event) =>\n\t\t\t\tevent.eventName.includes(\"ObtainSnapshot_end\"),\n\t\t\t)?.method;\n\t\t\tassert(\n\t\t\t\tmethod === \"cache\" || method === \"prefetched\",\n\t\t\t\t\"Source should be cache or prefetched\",\n\t\t\t);\n\t\t});\n\n\t\tit(\"prefetching snapshot should result in epoch error if different from what is already present\", async () => {\n\t\t\t// overwriting get() to make cache fetch throw\n\t\t\tlocalCache.get = async (): Promise<void> => {\n\t\t\t\tthrow new Error(\"testing\");\n\t\t\t};\n\t\t\t// Set epoch first\n\t\t\tawait mockFetchSingle(\n\t\t\t\tasync () => service.readBlob(\"id\"),\n\t\t\t\tasync () =>\n\t\t\t\t\tcreateResponse(\n\t\t\t\t\t\t{ \"x-fluid-epoch\": \"epoch1\", \"content-type\": \"application/json\" },\n\t\t\t\t\t\tJSON.stringify(\"odspSnapshot\"),\n\t\t\t\t\t\t200,\n\t\t\t\t\t),\n\t\t\t);\n\n\t\t\t// This will store the response with wrong epoch in the cache\n\t\t\tawait mockFetchSingle(\n\t\t\t\tasync () =>\n\t\t\t\t\tprefetchLatestSnapshot(\n\t\t\t\t\t\tresolved,\n\t\t\t\t\t\tasync (_options) => \"token\",\n\t\t\t\t\t\tlocalCache,\n\t\t\t\t\t\ttrue,\n\t\t\t\t\t\tmockLogger,\n\t\t\t\t\t\tundefined,\n\t\t\t\t\t\tfalse,\n\t\t\t\t\t\tundefined,\n\t\t\t\t\t\tundefined,\n\t\t\t\t\t\todspDocumentServiceFactory,\n\t\t\t\t\t),\n\t\t\t\tasync () =>\n\t\t\t\t\tcreateResponse(\n\t\t\t\t\t\t{ \"x-fluid-epoch\": \"epoch2\", \"content-type\": \"application/json\" },\n\t\t\t\t\t\todspSnapshot,\n\t\t\t\t\t\t200,\n\t\t\t\t\t),\n\t\t\t);\n\n\t\t\tawait mockFetchSingle(\n\t\t\t\tasync () => service.getVersions(null, 1),\n\t\t\t\tasync () =>\n\t\t\t\t\tcreateResponse(\n\t\t\t\t\t\t{ \"x-fluid-epoch\": \"epoch1\", \"content-type\": \"application/json\" },\n\t\t\t\t\t\todspSnapshot,\n\t\t\t\t\t\t200,\n\t\t\t\t\t),\n\t\t\t);\n\n\t\t\tmockLogger.assertMatchAny(\n\t\t\t\t[\n\t\t\t\t\t{\n\t\t\t\t\t\terror: \"Epoch mismatch\",\n\t\t\t\t\t\terrorType: \"fileOverwrittenInStorage\",\n\t\t\t\t\t\tserverEpoch: \"epoch2\",\n\t\t\t\t\t\tclientEpoch: \"epoch1\",\n\t\t\t\t\t\tfetchType: \"treesLatest\",\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\t\"Snapshot prefetch has different epoch\",\n\t\t\t);\n\t\t});\n\n\t\tit(\"prefetching snapshot should result in epoch error if different from what is already present, fetch is not from cache\", async () => {\n\t\t\t// Set epoch first\n\t\t\tawait mockFetchSingle(\n\t\t\t\tasync () => service.readBlob(\"id\"),\n\t\t\t\tasync () =>\n\t\t\t\t\tcreateResponse(\n\t\t\t\t\t\t{ \"x-fluid-epoch\": \"epoch1\", \"content-type\": \"application/json\" },\n\t\t\t\t\t\tJSON.stringify(\"odspSnapshot\"),\n\t\t\t\t\t\t200,\n\t\t\t\t\t),\n\t\t\t);\n\n\t\t\t// This will store the response with wrong epoch in the cache\n\t\t\tawait mockFetchSingle(\n\t\t\t\tasync () =>\n\t\t\t\t\tprefetchLatestSnapshot(\n\t\t\t\t\t\tresolved,\n\t\t\t\t\t\tasync (_options) => \"token\",\n\t\t\t\t\t\tlocalCache,\n\t\t\t\t\t\ttrue,\n\t\t\t\t\t\tmockLogger,\n\t\t\t\t\t\tundefined,\n\t\t\t\t\t\tfalse,\n\t\t\t\t\t\tundefined,\n\t\t\t\t\t\tundefined,\n\t\t\t\t\t\todspDocumentServiceFactory,\n\t\t\t\t\t),\n\t\t\t\tasync () =>\n\t\t\t\t\tcreateResponse(\n\t\t\t\t\t\t{ \"x-fluid-epoch\": \"epoch2\", \"content-type\": \"application/json\" },\n\t\t\t\t\t\todspSnapshot,\n\t\t\t\t\t\t200,\n\t\t\t\t\t),\n\t\t\t);\n\n\t\t\tawait mockFetchSingle(\n\t\t\t\tasync () => service.getVersions(null, 1, FetchSource.noCache),\n\t\t\t\tasync () =>\n\t\t\t\t\tcreateResponse(\n\t\t\t\t\t\t{ \"x-fluid-epoch\": \"epoch1\", \"content-type\": \"application/json\" },\n\t\t\t\t\t\todspSnapshot,\n\t\t\t\t\t\t200,\n\t\t\t\t\t),\n\t\t\t);\n\n\t\t\tmockLogger.assertMatchAny(\n\t\t\t\t[\n\t\t\t\t\t{\n\t\t\t\t\t\terror: \"Epoch mismatch\",\n\t\t\t\t\t\terrorType: \"fileOverwrittenInStorage\",\n\t\t\t\t\t\tserverEpoch: \"epoch2\",\n\t\t\t\t\t\tclientEpoch: \"epoch1\",\n\t\t\t\t\t\tfetchType: \"treesLatest\",\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\t\"Snapshot prefetch has different epoch\",\n\t\t\t);\n\t\t});\n\t});\n\n\tdescribe(\"Tests for prefetching snapshot: No Concurrent snapshot fetch: Using GetVersions Api\", () => {\n\t\tlet odspDocumentServiceFactory: OdspDocumentServiceFactory;\n\t\tbeforeEach(async () => {\n\t\t\tmockLogger = new MockLogger();\n\t\t\tlocalCache = createUtLocalCache();\n\t\t\tresolved = await resolver.resolve({ url: odspUrl });\n\t\t\tconst hostPolicy = GetHostStoragePolicyInternal();\n\t\t\thostPolicy.concurrentSnapshotFetch = false;\n\t\t\todspDocumentServiceFactory = new OdspDocumentServiceFactory(\n\t\t\t\tasync (_options) => \"token\",\n\t\t\t\tasync (_options) => \"token\",\n\t\t\t\tlocalCache,\n\t\t\t\thostPolicy,\n\t\t\t);\n\t\t\tsnapshotPrefetchCacheKey = getKeyForCacheEntry(createCacheSnapshotKey(resolved));\n\t\t\tconst documentservice = await odspDocumentServiceFactory.createDocumentService(\n\t\t\t\tresolved,\n\t\t\t\tmockLogger,\n\t\t\t);\n\t\t\tservice = (await documentservice.connectToStorage()) as OdspDocumentStorageService;\n\t\t\tsnapshotPrefetchResultCache = odspDocumentServiceFactory.snapshotPrefetchResultCache;\n\t\t});\n\n\t\tafterEach(async () => {\n\t\t\tlocalCache\n\t\t\t\t.removeEntries({ docId: hashedDocumentId, resolvedUrl: resolved })\n\t\t\t\t.catch(() => {});\n\t\t\tsnapshotPrefetchResultCache.remove(snapshotPrefetchCacheKey);\n\t\t});\n\n\t\tit(\"prefetching snapshot should result in epoch error if different from what is already present, no concurrent fetch\", async () => {\n\t\t\t// Set epoch first\n\t\t\tawait mockFetchSingle(\n\t\t\t\tasync () => service.readBlob(\"id\"),\n\t\t\t\tasync () =>\n\t\t\t\t\tcreateResponse(\n\t\t\t\t\t\t{ \"x-fluid-epoch\": \"epoch1\", \"content-type\": \"application/json\" },\n\t\t\t\t\t\tJSON.stringify(\"odspSnapshot\"),\n\t\t\t\t\t\t200,\n\t\t\t\t\t),\n\t\t\t);\n\n\t\t\t// This will store the response with wrong epoch in the cache\n\t\t\tawait mockFetchSingle(\n\t\t\t\tasync () =>\n\t\t\t\t\tprefetchLatestSnapshot(\n\t\t\t\t\t\tresolved,\n\t\t\t\t\t\tasync (_options) => \"token\",\n\t\t\t\t\t\tlocalCache,\n\t\t\t\t\t\ttrue,\n\t\t\t\t\t\tmockLogger,\n\t\t\t\t\t\tundefined,\n\t\t\t\t\t\tfalse,\n\t\t\t\t\t\tundefined,\n\t\t\t\t\t\tundefined,\n\t\t\t\t\t\todspDocumentServiceFactory,\n\t\t\t\t\t),\n\t\t\t\tasync () =>\n\t\t\t\t\tcreateResponse(\n\t\t\t\t\t\t{ \"x-fluid-epoch\": \"epoch2\", \"content-type\": \"application/json\" },\n\t\t\t\t\t\todspSnapshot,\n\t\t\t\t\t\t200,\n\t\t\t\t\t),\n\t\t\t);\n\n\t\t\tawait mockFetchSingle(\n\t\t\t\tasync () => service.getVersions(null, 1, undefined),\n\t\t\t\tasync () =>\n\t\t\t\t\tcreateResponse(\n\t\t\t\t\t\t{ \"x-fluid-epoch\": \"epoch1\", \"content-type\": \"application/json\" },\n\t\t\t\t\t\todspSnapshot,\n\t\t\t\t\t\t200,\n\t\t\t\t\t),\n\t\t\t);\n\n\t\t\tmockLogger.assertMatchAny(\n\t\t\t\t[\n\t\t\t\t\t{\n\t\t\t\t\t\terror: \"Epoch mismatch\",\n\t\t\t\t\t\terrorType: \"fileOverwrittenInStorage\",\n\t\t\t\t\t\tserverEpoch: \"epoch2\",\n\t\t\t\t\t\tclientEpoch: \"epoch1\",\n\t\t\t\t\t\tfetchType: \"treesLatest\",\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\t\"Snapshot prefetch has different epoch\",\n\t\t\t);\n\t\t});\n\n\t\tit(\"prefetching snapshot should be successful from prefetching, no concurrent fetch\", async () => {\n\t\t\tawait mockFetchSingle(\n\t\t\t\tasync () =>\n\t\t\t\t\tprefetchLatestSnapshot(\n\t\t\t\t\t\tresolved,\n\t\t\t\t\t\tasync (_options) => \"token\",\n\t\t\t\t\t\tlocalCache,\n\t\t\t\t\t\ttrue,\n\t\t\t\t\t\tmockLogger,\n\t\t\t\t\t\tundefined,\n\t\t\t\t\t\tfalse,\n\t\t\t\t\t\tundefined,\n\t\t\t\t\t\tundefined,\n\t\t\t\t\t\todspDocumentServiceFactory,\n\t\t\t\t\t),\n\t\t\t\tasync () =>\n\t\t\t\t\tcreateResponse(\n\t\t\t\t\t\t{ \"x-fluid-epoch\": \"epoch1\", \"content-type\": \"application/json\" },\n\t\t\t\t\t\todspSnapshot,\n\t\t\t\t\t\t200,\n\t\t\t\t\t),\n\t\t\t);\n\n\t\t\tconst version = await service.getVersions(null, 1);\n\n\t\t\tassert.deepStrictEqual(version, expectedVersion, \"incorrect version\");\n\t\t\t// Should be from cache as prefetch will store in cache\n\t\t\tassert(\n\t\t\t\tmockLogger.matchEvents([\n\t\t\t\t\t{ eventName: \"OdspDriver:ObtainSnapshot_end\", method: \"cache\" },\n\t\t\t\t]),\n\t\t\t\t\"unexpected events\",\n\t\t\t);\n\t\t});\n\t});\n\n\tdescribe(\"Tests for prefetching snapshot: Concurrent snapshot fetch: Using GetSnapshot Api\", () => {\n\t\tlet odspDocumentServiceFactory: OdspDocumentServiceFactory;\n\t\tconst snapshotWithGroupId: ISnapshot = {\n\t\t\tblobContents,\n\t\t\tsnapshotTree: snapshotTreeWithGroupId,\n\t\t\tops: [],\n\t\t\tlatestSequenceNumber: 0,\n\t\t\tsequenceNumber: 0,\n\t\t\tsnapshotFormatV: 1,\n\t\t};\n\t\tconst valueWithGroupId: IVersionedValueWithEpoch = {\n\t\t\tvalue: { ...snapshotWithGroupId, cacheEntryTime: Date.now() },\n\t\t\tfluidEpoch: \"epoch1\",\n\t\t\tversion: persistedCacheValueVersion,\n\t\t};\n\t\tconst odspCompactSnapshotWithGroupId = convertToCompactSnapshot(snapshotWithGroupId);\n\t\tconst snapshotTreeWithGroupIdToCompare: ISnapshotTree = {\n\t\t\tblobs: { ...snapshotTreeWithGroupId.trees[\".app\"].blobs },\n\t\t\ttrees: {\n\t\t\t\t...snapshotTreeWithGroupId.trees[\".app\"].trees,\n\t\t\t\t\".protocol\": snapshotTreeWithGroupId.trees[\".protocol\"],\n\t\t\t},\n\t\t};\n\t\tbeforeEach(async () => {\n\t\t\tmockLogger = new MockLogger();\n\t\t\tlocalCache = createUtLocalCache();\n\t\t\tresolved = await resolver.resolve({ url: odspUrl });\n\t\t\todspDocumentServiceFactory = new OdspDocumentServiceFactory(\n\t\t\t\tasync (_options) => \"token\",\n\t\t\t\tasync (_options) => \"token\",\n\t\t\t\tlocalCache,\n\t\t\t\tGetHostStoragePolicyInternal(),\n\t\t\t);\n\t\t\tsnapshotPrefetchCacheKey = getKeyForCacheEntry(createCacheSnapshotKey(resolved));\n\t\t\tconst documentservice = await odspDocumentServiceFactory.createDocumentService(\n\t\t\t\tresolved,\n\t\t\t\tmockLogger,\n\t\t\t);\n\t\t\tservice = (await documentservice.connectToStorage()) as OdspDocumentStorageService;\n\t\t\tsnapshotPrefetchResultCache = odspDocumentServiceFactory.snapshotPrefetchResultCache;\n\t\t});\n\n\t\tafterEach(async () => {\n\t\t\tlocalCache\n\t\t\t\t.removeEntries({ docId: hashedDocumentId, resolvedUrl: resolved })\n\t\t\t\t.catch(() => {});\n\t\t\tsnapshotPrefetchResultCache.remove(snapshotPrefetchCacheKey);\n\t\t});\n\n\t\tit(\"prefetching snapshot should result in snapshot source as cache as prefetch adds to cache\", async () => {\n\t\t\tawait mockFetchSingle(\n\t\t\t\tasync () =>\n\t\t\t\t\tprefetchLatestSnapshot(\n\t\t\t\t\t\tresolved,\n\t\t\t\t\t\tasync (_options) => \"token\",\n\t\t\t\t\t\tlocalCache,\n\t\t\t\t\t\ttrue,\n\t\t\t\t\t\tmockLogger,\n\t\t\t\t\t\tundefined,\n\t\t\t\t\t\tfalse,\n\t\t\t\t\t\tundefined,\n\t\t\t\t\t\tundefined,\n\t\t\t\t\t\todspDocumentServiceFactory,\n\t\t\t\t\t),\n\t\t\t\tasync () =>\n\t\t\t\t\tcreateResponse(\n\t\t\t\t\t\t{ \"x-fluid-epoch\": \"epoch1\", \"content-type\": \"application/ms-fluid\" },\n\t\t\t\t\t\todspCompactSnapshotWithGroupId,\n\t\t\t\t\t\t200,\n\t\t\t\t\t),\n\t\t\t);\n\n\t\t\tconst fetchedSnapshot = await service.getSnapshot();\n\t\t\tassert.deepStrictEqual(\n\t\t\t\tfetchedSnapshot.snapshotTree,\n\t\t\t\tsnapshotTreeWithGroupIdToCompare,\n\t\t\t\t\"incorrect snapshot\",\n\t\t\t);\n\t\t\tassert(\n\t\t\t\tmockLogger.events.filter((event) => event.eventName.includes(\"ObtainSnapshot_end\"))\n\t\t\t\t\t.length === 1,\n\t\t\t\t\"1 Obtain snapshot event should be there\",\n\t\t\t);\n\t\t\tassert(\n\t\t\t\tmockLogger.matchEvents([\n\t\t\t\t\t{ eventName: \"OdspDriver:ObtainSnapshot_end\", method: \"cache\" },\n\t\t\t\t]),\n\t\t\t\t\"Source should be cache\",\n\t\t\t);\n\t\t});\n\n\t\tit(\"prefetching snapshot should result in snapshot source as network if both cache and prefetch throws\", async () => {\n\t\t\t// overwriting get() to make cache fetch throw\n\t\t\tlocalCache.get = async (): Promise<void> => {\n\t\t\t\tthrow new Error(\"testing\");\n\t\t\t};\n\n\t\t\tawait mockFetchSingle(\n\t\t\t\tasync () =>\n\t\t\t\t\tprefetchLatestSnapshot(\n\t\t\t\t\t\tresolved,\n\t\t\t\t\t\tasync (_options) => \"token\",\n\t\t\t\t\t\tlocalCache,\n\t\t\t\t\t\ttrue,\n\t\t\t\t\t\tmockLogger,\n\t\t\t\t\t\tundefined,\n\t\t\t\t\t\tfalse,\n\t\t\t\t\t\tundefined,\n\t\t\t\t\t\tundefined,\n\t\t\t\t\t\todspDocumentServiceFactory,\n\t\t\t\t\t),\n\t\t\t\tnotFound,\n\t\t\t);\n\n\t\t\tconst fetchedSnapshot = await mockFetchSingle(\n\t\t\t\tasync () => service.getSnapshot(),\n\t\t\t\tasync () =>\n\t\t\t\t\tcreateResponse(\n\t\t\t\t\t\t{ \"x-fluid-epoch\": \"epoch1\", \"content-type\": \"application/ms-fluid\" },\n\t\t\t\t\t\todspCompactSnapshotWithGroupId,\n\t\t\t\t\t\t200,\n\t\t\t\t\t),\n\t\t\t);\n\t\t\tassert.deepStrictEqual(\n\t\t\t\tfetchedSnapshot.snapshotTree,\n\t\t\t\tsnapshotTreeWithGroupIdToCompare,\n\t\t\t\t\"incorrect snapshot\",\n\t\t\t);\n\t\t\tassert(\n\t\t\t\tmockLogger.events.filter((event) => event.eventName.includes(\"ObtainSnapshot_end\"))\n\t\t\t\t\t.length === 1,\n\t\t\t\t\"1 Obtain snapshot event should be there\",\n\t\t\t);\n\t\t\tassert(\n\t\t\t\tmockLogger.matchEvents([\n\t\t\t\t\t{ eventName: \"OdspDriver:ObtainSnapshot_end\", method: \"network\" },\n\t\t\t\t]),\n\t\t\t\t\"Source should be network\",\n\t\t\t);\n\t\t});\n\n\t\tit(\"prefetching snapshot should result in snapshot source as cache or network if prefetch throws and cache contains the response\", async () => {\n\t\t\tconst cacheEntry: ICacheEntry = {\n\t\t\t\tkey: \"\",\n\t\t\t\ttype: \"snapshot\",\n\t\t\t\tfile: { docId: resolved.hashedDocumentId, resolvedUrl: resolved },\n\t\t\t};\n\t\t\tawait localCache.put(cacheEntry, valueWithGroupId);\n\n\t\t\tawait mockFetchSingle(\n\t\t\t\tasync () =>\n\t\t\t\t\tprefetchLatestSnapshot(\n\t\t\t\t\t\tresolved,\n\t\t\t\t\t\tasync (_options) => \"token\",\n\t\t\t\t\t\tlocalCache,\n\t\t\t\t\t\ttrue,\n\t\t\t\t\t\tmockLogger,\n\t\t\t\t\t\tundefined,\n\t\t\t\t\t\tfalse,\n\t\t\t\t\t\tundefined,\n\t\t\t\t\t\tundefined,\n\t\t\t\t\t\todspDocumentServiceFactory,\n\t\t\t\t\t),\n\t\t\t\tnotFound,\n\t\t\t);\n\n\t\t\tconst fetchedSnapshot = await mockFetchSingle(\n\t\t\t\tasync () => service.getSnapshot(),\n\t\t\t\tasync () =>\n\t\t\t\t\tcreateResponse(\n\t\t\t\t\t\t{ \"x-fluid-epoch\": \"epoch1\", \"content-type\": \"application/ms-fluid\" },\n\t\t\t\t\t\todspCompactSnapshotWithGroupId,\n\t\t\t\t\t\t200,\n\t\t\t\t\t),\n\t\t\t);\n\n\t\t\tassert.deepStrictEqual(\n\t\t\t\tfetchedSnapshot.snapshotTree,\n\t\t\t\tsnapshotTreeWithGroupIdToCompare,\n\t\t\t\t\"incorrect snapshot\",\n\t\t\t);\n\t\t\tassert(\n\t\t\t\tmockLogger.events.filter((event) => event.eventName.includes(\"ObtainSnapshot_end\"))\n\t\t\t\t\t.length === 1,\n\t\t\t\t\"1 Obtain snapshot event should be there\",\n\t\t\t);\n\t\t\tconst method = mockLogger.events.find((event) =>\n\t\t\t\tevent.eventName.includes(\"ObtainSnapshot_end\"),\n\t\t\t)?.method;\n\t\t\tassert(method === \"cache\" || method === \"network\", \"Source should be cache or network\");\n\t\t});\n\n\t\tit(\"prefetching snapshot should result in snapshot source as either cache or prefetch if both pass\", async () => {\n\t\t\tconst cacheEntry: ICacheEntry = {\n\t\t\t\tkey: \"\",\n\t\t\t\ttype: \"snapshot\",\n\t\t\t\tfile: { docId: hashedDocumentId, resolvedUrl: resolved },\n\t\t\t};\n\t\t\tawait localCache.put(cacheEntry, valueWithGroupId);\n\n\t\t\tmockFetchSingle(\n\t\t\t\tasync () =>\n\t\t\t\t\tprefetchLatestSnapshot(\n\t\t\t\t\t\tresolved,\n\t\t\t\t\t\tasync (_options) => \"token\",\n\t\t\t\t\t\tlocalCache,\n\t\t\t\t\t\ttrue,\n\t\t\t\t\t\tmockLogger,\n\t\t\t\t\t\tundefined,\n\t\t\t\t\t\tfalse,\n\t\t\t\t\t\tundefined,\n\t\t\t\t\t\tundefined,\n\t\t\t\t\t\todspDocumentServiceFactory,\n\t\t\t\t\t),\n\t\t\t\tasync () =>\n\t\t\t\t\tcreateResponse(\n\t\t\t\t\t\t{ \"x-fluid-epoch\": \"epoch1\", \"content-type\": \"application/ms-fluid\" },\n\t\t\t\t\t\todspCompactSnapshotWithGroupId,\n\t\t\t\t\t\t200,\n\t\t\t\t\t),\n\t\t\t);\n\n\t\t\tconst fetchedSnapshot = await service.getSnapshot();\n\t\t\tassert.deepStrictEqual(\n\t\t\t\tfetchedSnapshot.snapshotTree,\n\t\t\t\tsnapshotTreeWithGroupIdToCompare,\n\t\t\t\t\"incorrect snapshot\",\n\t\t\t);\n\n\t\t\tassert(\n\t\t\t\tmockLogger.events.filter((event) => event.eventName.includes(\"ObtainSnapshot_end\"))\n\t\t\t\t\t.length === 1,\n\t\t\t\t\"1 Obtain snapshot event should be there\",\n\t\t\t);\n\t\t\tconst method = mockLogger.events.find((event) =>\n\t\t\t\tevent.eventName.includes(\"ObtainSnapshot_end\"),\n\t\t\t)?.method;\n\t\t\tassert(\n\t\t\t\tmethod === \"cache\" || method === \"prefetched\",\n\t\t\t\t\"Source should be cache or prefetched\",\n\t\t\t);\n\t\t});\n\t});\n\n\tdescribe(\"Tests for prefetching snapshot: No Concurrent snapshot fetch: Using GetSnapshot Api\", () => {\n\t\tlet odspDocumentServiceFactory: OdspDocumentServiceFactory;\n\t\tconst snapshotWithGroupId: ISnapshot = {\n\t\t\tblobContents,\n\t\t\tsnapshotTree: snapshotTreeWithGroupId,\n\t\t\tops: [],\n\t\t\tlatestSequenceNumber: 0,\n\t\t\tsequenceNumber: 0,\n\t\t\tsnapshotFormatV: 1,\n\t\t};\n\t\tconst odspCompactSnapshotWithGroupId = convertToCompactSnapshot(snapshotWithGroupId);\n\t\tconst snapshotTreeWithGroupIdToCompare: ISnapshotTree = {\n\t\t\tblobs: { ...snapshotTreeWithGroupId.trees[\".app\"].blobs },\n\t\t\ttrees: {\n\t\t\t\t...snapshotTreeWithGroupId.trees[\".app\"].trees,\n\t\t\t\t\".protocol\": snapshotTreeWithGroupId.trees[\".protocol\"],\n\t\t\t},\n\t\t};\n\t\tbeforeEach(async () => {\n\t\t\tmockLogger = new MockLogger();\n\t\t\tlocalCache = createUtLocalCache();\n\t\t\tresolved = await resolver.resolve({ url: odspUrl });\n\t\t\tconst hostPolicy = GetHostStoragePolicyInternal();\n\t\t\thostPolicy.concurrentSnapshotFetch = false;\n\t\t\todspDocumentServiceFactory = new OdspDocumentServiceFactory(\n\t\t\t\tasync (_options) => \"token\",\n\t\t\t\tasync (_options) => \"token\",\n\t\t\t\tlocalCache,\n\t\t\t\thostPolicy,\n\t\t\t);\n\t\t\tsnapshotPrefetchCacheKey = getKeyForCacheEntry(createCacheSnapshotKey(resolved));\n\t\t\tconst documentservice = await odspDocumentServiceFactory.createDocumentService(\n\t\t\t\tresolved,\n\t\t\t\tmockLogger,\n\t\t\t);\n\t\t\tservice = (await documentservice.connectToStorage()) as OdspDocumentStorageService;\n\t\t\tsnapshotPrefetchResultCache = odspDocumentServiceFactory.snapshotPrefetchResultCache;\n\t\t});\n\n\t\tafterEach(async () => {\n\t\t\tlocalCache\n\t\t\t\t.removeEntries({ docId: hashedDocumentId, resolvedUrl: resolved })\n\t\t\t\t.catch(() => {});\n\t\t\tsnapshotPrefetchResultCache.remove(snapshotPrefetchCacheKey);\n\t\t});\n\n\t\tit(\"prefetching snapshot should be successful from prefetching, no concurrent fetch\", async () => {\n\t\t\tawait mockFetchSingle(\n\t\t\t\tasync () =>\n\t\t\t\t\tprefetchLatestSnapshot(\n\t\t\t\t\t\tresolved,\n\t\t\t\t\t\tasync (_options) => \"token\",\n\t\t\t\t\t\tlocalCache,\n\t\t\t\t\t\ttrue,\n\t\t\t\t\t\tmockLogger,\n\t\t\t\t\t\tundefined,\n\t\t\t\t\t\tfalse,\n\t\t\t\t\t\tundefined,\n\t\t\t\t\t\tundefined,\n\t\t\t\t\t\todspDocumentServiceFactory,\n\t\t\t\t\t),\n\t\t\t\tasync () =>\n\t\t\t\t\tcreateResponse(\n\t\t\t\t\t\t{ \"x-fluid-epoch\": \"epoch1\", \"content-type\": \"application/ms-fluid\" },\n\t\t\t\t\t\todspCompactSnapshotWithGroupId,\n\t\t\t\t\t\t200,\n\t\t\t\t\t),\n\t\t\t);\n\n\t\t\tconst fetchedSnapshot = await service.getSnapshot();\n\n\t\t\tassert.deepStrictEqual(\n\t\t\t\tfetchedSnapshot.snapshotTree,\n\t\t\t\tsnapshotTreeWithGroupIdToCompare,\n\t\t\t\t\"incorrect snapshot\",\n\t\t\t);\n\t\t\t// Should be from cache as prefetch will store in cache\n\t\t\tassert(\n\t\t\t\tmockLogger.matchEvents([\n\t\t\t\t\t{ eventName: \"OdspDriver:ObtainSnapshot_end\", method: \"cache\" },\n\t\t\t\t]),\n\t\t\t\t\"unexpected events\",\n\t\t\t);\n\t\t});\n\t});\n});\n"]}
|