@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,412 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* Copyright (c) Microsoft Corporation and contributors. All rights reserved.
|
|
3
|
+
* Licensed under the MIT License.
|
|
4
|
+
*/
|
|
5
|
+
/* eslint-disable @typescript-eslint/dot-notation */
|
|
6
|
+
import { strict as assert } from "node:assert";
|
|
7
|
+
import { stub } from "sinon";
|
|
8
|
+
import { OdspErrorTypes } from "@fluidframework/odsp-driver-definitions";
|
|
9
|
+
import { createChildLogger, MockLogger, } from "@fluidframework/telemetry-utils";
|
|
10
|
+
import { stringToBuffer } from "@fluid-internal/client-utils";
|
|
11
|
+
import { EpochTracker } from "../epochTracker.js";
|
|
12
|
+
import * as fetchSnapshotImport from "../fetchSnapshot.js";
|
|
13
|
+
import { LocalPersistentCache, NonPersistentCache } from "../odspCache.js";
|
|
14
|
+
import { createCacheSnapshotKey } from "../odspUtils.js";
|
|
15
|
+
import { createOdspUrl } from "../createOdspUrl.js";
|
|
16
|
+
import { getHashedDocumentId } from "../odspPublicUtils.js";
|
|
17
|
+
import { OdspDriverUrlResolver } from "../odspDriverUrlResolver.js";
|
|
18
|
+
import { OdspDocumentStorageService } from "../odspDocumentStorageManager.js";
|
|
19
|
+
import { convertToCompactSnapshot } from "../compactSnapshotWriter.js";
|
|
20
|
+
import { createResponse } from "./mockFetch.js";
|
|
21
|
+
const createUtLocalCache = () => new LocalPersistentCache();
|
|
22
|
+
describe("Tests1 for snapshot fetch", () => {
|
|
23
|
+
const siteUrl = "https://microsoft.sharepoint-df.com/siteUrl";
|
|
24
|
+
const driveId = "driveId";
|
|
25
|
+
const itemId = "itemId";
|
|
26
|
+
const filePath = "path";
|
|
27
|
+
let epochTracker;
|
|
28
|
+
let localCache;
|
|
29
|
+
let hashedDocumentId;
|
|
30
|
+
let service;
|
|
31
|
+
const resolvedUrl = {
|
|
32
|
+
siteUrl,
|
|
33
|
+
driveId,
|
|
34
|
+
itemId,
|
|
35
|
+
odspResolvedUrl: true,
|
|
36
|
+
};
|
|
37
|
+
const newFileParams = {
|
|
38
|
+
type: "New",
|
|
39
|
+
driveId,
|
|
40
|
+
siteUrl: "https://www.localhost.xxx",
|
|
41
|
+
filePath,
|
|
42
|
+
filename: "filename",
|
|
43
|
+
};
|
|
44
|
+
const hostPolicy = {
|
|
45
|
+
snapshotOptions: { timeout: 2000, mds: 1000 },
|
|
46
|
+
summarizerClient: true,
|
|
47
|
+
fetchBinarySnapshotFormat: false,
|
|
48
|
+
concurrentSnapshotFetch: true,
|
|
49
|
+
};
|
|
50
|
+
const resolver = new OdspDriverUrlResolver();
|
|
51
|
+
const nonPersistentCache = new NonPersistentCache();
|
|
52
|
+
let logger;
|
|
53
|
+
let mockLogger;
|
|
54
|
+
const odspUrl = createOdspUrl({ ...newFileParams, itemId, dataStorePath: "/" });
|
|
55
|
+
const content = {
|
|
56
|
+
snapshotTree: {
|
|
57
|
+
id: "id",
|
|
58
|
+
blobs: {},
|
|
59
|
+
trees: {},
|
|
60
|
+
},
|
|
61
|
+
blobContents: new Map(),
|
|
62
|
+
ops: [],
|
|
63
|
+
sequenceNumber: 0,
|
|
64
|
+
latestSequenceNumber: 0,
|
|
65
|
+
snapshotFormatV: 1,
|
|
66
|
+
};
|
|
67
|
+
let resolved;
|
|
68
|
+
before(async () => {
|
|
69
|
+
hashedDocumentId = await getHashedDocumentId(driveId, itemId);
|
|
70
|
+
});
|
|
71
|
+
beforeEach(async () => {
|
|
72
|
+
localCache = createUtLocalCache();
|
|
73
|
+
mockLogger = new MockLogger();
|
|
74
|
+
logger = createChildLogger({ logger: mockLogger });
|
|
75
|
+
// use null logger here as we expect errors
|
|
76
|
+
epochTracker = new EpochTracker(localCache, {
|
|
77
|
+
docId: hashedDocumentId,
|
|
78
|
+
resolvedUrl,
|
|
79
|
+
}, logger);
|
|
80
|
+
epochTracker.setEpoch("epoch1", true, "test");
|
|
81
|
+
resolved = await resolver.resolve({ url: odspUrl });
|
|
82
|
+
service = new OdspDocumentStorageService(resolved, async (_options) => "token", logger, true, { ...nonPersistentCache, persistedCache: epochTracker }, hostPolicy, epochTracker, async () => {
|
|
83
|
+
return {};
|
|
84
|
+
}, () => "tenantid/id");
|
|
85
|
+
});
|
|
86
|
+
afterEach(async () => {
|
|
87
|
+
await epochTracker.removeEntries().catch(() => { });
|
|
88
|
+
});
|
|
89
|
+
it("Mds limit check in fetch snapshot", async () => {
|
|
90
|
+
let success = false;
|
|
91
|
+
async function mockDownloadSnapshot(_response, callback) {
|
|
92
|
+
const getDownloadSnapshotStub = stub(fetchSnapshotImport, "downloadSnapshot");
|
|
93
|
+
getDownloadSnapshotStub.returns(_response);
|
|
94
|
+
try {
|
|
95
|
+
return await callback();
|
|
96
|
+
}
|
|
97
|
+
finally {
|
|
98
|
+
assert(getDownloadSnapshotStub.args[0][3]?.mds === undefined, "mds should be undefined");
|
|
99
|
+
success = true;
|
|
100
|
+
getDownloadSnapshotStub.restore();
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
const odspResponse = {
|
|
104
|
+
content: (await createResponse({}, content, 200)),
|
|
105
|
+
duration: 10,
|
|
106
|
+
headers: new Map([
|
|
107
|
+
["x-fluid-epoch", "epoch1"],
|
|
108
|
+
["content-type", "application/json"],
|
|
109
|
+
]),
|
|
110
|
+
propsToLog: {},
|
|
111
|
+
};
|
|
112
|
+
const response = {
|
|
113
|
+
odspResponse,
|
|
114
|
+
requestHeaders: {},
|
|
115
|
+
requestUrl: siteUrl,
|
|
116
|
+
};
|
|
117
|
+
try {
|
|
118
|
+
await mockDownloadSnapshot(Promise.resolve(response), async () => service.getVersions(null, 1));
|
|
119
|
+
}
|
|
120
|
+
catch {
|
|
121
|
+
// Drop error
|
|
122
|
+
}
|
|
123
|
+
assert(success, "mds limit should not be set!!");
|
|
124
|
+
});
|
|
125
|
+
it("Check error in snapshot content type", async () => {
|
|
126
|
+
async function mockDownloadSnapshot(_response, callback) {
|
|
127
|
+
const getDownloadSnapshotStub = stub(fetchSnapshotImport, "downloadSnapshot");
|
|
128
|
+
getDownloadSnapshotStub.returns(_response);
|
|
129
|
+
try {
|
|
130
|
+
return await callback();
|
|
131
|
+
}
|
|
132
|
+
finally {
|
|
133
|
+
getDownloadSnapshotStub.restore();
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
const odspResponse = {
|
|
137
|
+
content: (await createResponse({}, content, 200)),
|
|
138
|
+
duration: 10,
|
|
139
|
+
headers: new Map([
|
|
140
|
+
["x-fluid-epoch", "epoch1"],
|
|
141
|
+
["content-type", "unknown"],
|
|
142
|
+
]),
|
|
143
|
+
propsToLog: {},
|
|
144
|
+
};
|
|
145
|
+
const response = {
|
|
146
|
+
odspResponse,
|
|
147
|
+
requestHeaders: {},
|
|
148
|
+
requestUrl: siteUrl,
|
|
149
|
+
};
|
|
150
|
+
try {
|
|
151
|
+
await mockDownloadSnapshot(Promise.resolve(response), async () => service.getVersions(null, 1));
|
|
152
|
+
assert.fail("should throw incorrectServerResponse error");
|
|
153
|
+
}
|
|
154
|
+
catch (error) {
|
|
155
|
+
assert.strictEqual(error.errorType, OdspErrorTypes.incorrectServerResponse, "incorrectServerResponse should be received");
|
|
156
|
+
assert.strictEqual(
|
|
157
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-explicit-any
|
|
158
|
+
error.contentType, "unknown", "content type should be unknown");
|
|
159
|
+
}
|
|
160
|
+
});
|
|
161
|
+
it("GetSnapshot() should work in normal flow", async () => {
|
|
162
|
+
let ungroupedData = false;
|
|
163
|
+
async function mockDownloadSnapshot(_response, callback) {
|
|
164
|
+
const getDownloadSnapshotStub = stub(fetchSnapshotImport, "downloadSnapshot");
|
|
165
|
+
getDownloadSnapshotStub.returns(_response);
|
|
166
|
+
try {
|
|
167
|
+
return await callback();
|
|
168
|
+
}
|
|
169
|
+
finally {
|
|
170
|
+
getDownloadSnapshotStub.restore();
|
|
171
|
+
assert(getDownloadSnapshotStub.args[0][2]?.length === 0, "should ask for ungroupedData");
|
|
172
|
+
ungroupedData = true;
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
const snapshot = {
|
|
176
|
+
blobContents,
|
|
177
|
+
snapshotTree: snapshotTreeWithGroupId,
|
|
178
|
+
ops: [],
|
|
179
|
+
latestSequenceNumber: 0,
|
|
180
|
+
sequenceNumber: 0,
|
|
181
|
+
snapshotFormatV: 1,
|
|
182
|
+
};
|
|
183
|
+
const odspResponse = {
|
|
184
|
+
content: (await createResponse({}, convertToCompactSnapshot(snapshot), 200)),
|
|
185
|
+
duration: 10,
|
|
186
|
+
headers: new Map([
|
|
187
|
+
["x-fluid-epoch", "epoch1"],
|
|
188
|
+
["content-type", "application/ms-fluid"],
|
|
189
|
+
]),
|
|
190
|
+
propsToLog: {},
|
|
191
|
+
};
|
|
192
|
+
const response = {
|
|
193
|
+
odspResponse,
|
|
194
|
+
requestHeaders: {},
|
|
195
|
+
requestUrl: siteUrl,
|
|
196
|
+
};
|
|
197
|
+
try {
|
|
198
|
+
await mockDownloadSnapshot(Promise.resolve(response), async () => service.getSnapshot({ loadingGroupIds: [] }));
|
|
199
|
+
}
|
|
200
|
+
catch {
|
|
201
|
+
assert.fail("the getSnapshot request should succeed");
|
|
202
|
+
}
|
|
203
|
+
assert(ungroupedData, "should have asked for ungroupedData");
|
|
204
|
+
const cachedValue = (await epochTracker.get(createCacheSnapshotKey(resolved)));
|
|
205
|
+
assert(cachedValue.snapshotTree.id === "SnapshotId", "snapshot should have been cached");
|
|
206
|
+
assert(service["blobCache"].value.size > 0, "blobs should be cached locally");
|
|
207
|
+
assert(service["commitCache"].size > 0, "no trees should be cached");
|
|
208
|
+
});
|
|
209
|
+
it("GetSnapshot() should work but snapshot should not be cached locally if asked for custom groupId", async () => {
|
|
210
|
+
let success = false;
|
|
211
|
+
service["firstSnapshotFetchCall"] = false;
|
|
212
|
+
async function mockDownloadSnapshot(_response, callback) {
|
|
213
|
+
const getDownloadSnapshotStub = stub(fetchSnapshotImport, "downloadSnapshot");
|
|
214
|
+
getDownloadSnapshotStub.returns(_response);
|
|
215
|
+
try {
|
|
216
|
+
return await callback();
|
|
217
|
+
}
|
|
218
|
+
finally {
|
|
219
|
+
getDownloadSnapshotStub.restore();
|
|
220
|
+
assert(getDownloadSnapshotStub.args[0][2]?.[0] === "g1", "should ask for g1 groupId");
|
|
221
|
+
success = true;
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
const snapshot = {
|
|
225
|
+
blobContents,
|
|
226
|
+
snapshotTree: snapshotTreeWithGroupId,
|
|
227
|
+
ops: [],
|
|
228
|
+
latestSequenceNumber: 0,
|
|
229
|
+
sequenceNumber: 0,
|
|
230
|
+
snapshotFormatV: 1,
|
|
231
|
+
};
|
|
232
|
+
const odspResponse = {
|
|
233
|
+
content: (await createResponse({}, convertToCompactSnapshot(snapshot), 200)),
|
|
234
|
+
duration: 10,
|
|
235
|
+
headers: new Map([
|
|
236
|
+
["x-fluid-epoch", "epoch1"],
|
|
237
|
+
["content-type", "application/ms-fluid"],
|
|
238
|
+
]),
|
|
239
|
+
propsToLog: {},
|
|
240
|
+
};
|
|
241
|
+
const response = {
|
|
242
|
+
odspResponse,
|
|
243
|
+
requestHeaders: {},
|
|
244
|
+
requestUrl: siteUrl,
|
|
245
|
+
};
|
|
246
|
+
try {
|
|
247
|
+
await mockDownloadSnapshot(Promise.resolve(response), async () => service.getSnapshot({ loadingGroupIds: ["g1"] }));
|
|
248
|
+
}
|
|
249
|
+
catch (error) {
|
|
250
|
+
console.log("error", error);
|
|
251
|
+
assert.fail("the getSnapshot request should succeed");
|
|
252
|
+
}
|
|
253
|
+
assert(success, "should have asked for g1 group id");
|
|
254
|
+
assert(service["blobCache"].value.size > 0, "blobs should still be cached locally");
|
|
255
|
+
assert(service["commitCache"].size === 0, "no trees should be cached");
|
|
256
|
+
assert(mockLogger.matchEvents([
|
|
257
|
+
{
|
|
258
|
+
eventName: "ObtainSnapshotForGroup_end",
|
|
259
|
+
method: "networkOnly",
|
|
260
|
+
fetchSource: "noCache",
|
|
261
|
+
useLegacyFlowWithoutGroups: false,
|
|
262
|
+
},
|
|
263
|
+
]), "unexpected events");
|
|
264
|
+
});
|
|
265
|
+
it("GetSnapshot() should not cache locally when specified in options", async () => {
|
|
266
|
+
async function mockDownloadSnapshot(_response, callback) {
|
|
267
|
+
const getDownloadSnapshotStub = stub(fetchSnapshotImport, "downloadSnapshot");
|
|
268
|
+
getDownloadSnapshotStub.returns(_response);
|
|
269
|
+
try {
|
|
270
|
+
return await callback();
|
|
271
|
+
}
|
|
272
|
+
finally {
|
|
273
|
+
getDownloadSnapshotStub.restore();
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
const snapshot = {
|
|
277
|
+
blobContents,
|
|
278
|
+
snapshotTree: snapshotTreeWithGroupId,
|
|
279
|
+
ops: [],
|
|
280
|
+
latestSequenceNumber: 0,
|
|
281
|
+
sequenceNumber: 0,
|
|
282
|
+
snapshotFormatV: 1,
|
|
283
|
+
};
|
|
284
|
+
const odspResponse = {
|
|
285
|
+
content: (await createResponse({}, convertToCompactSnapshot(snapshot), 200)),
|
|
286
|
+
duration: 10,
|
|
287
|
+
headers: new Map([
|
|
288
|
+
["x-fluid-epoch", "epoch1"],
|
|
289
|
+
["content-type", "application/ms-fluid"],
|
|
290
|
+
]),
|
|
291
|
+
propsToLog: {},
|
|
292
|
+
};
|
|
293
|
+
const response = {
|
|
294
|
+
odspResponse,
|
|
295
|
+
requestHeaders: {},
|
|
296
|
+
requestUrl: siteUrl,
|
|
297
|
+
};
|
|
298
|
+
try {
|
|
299
|
+
await mockDownloadSnapshot(Promise.resolve(response), async () => service.getSnapshot({ loadingGroupIds: [], cacheSnapshot: false }));
|
|
300
|
+
}
|
|
301
|
+
catch {
|
|
302
|
+
assert.fail("the getSnapshot request should succeed");
|
|
303
|
+
}
|
|
304
|
+
const cachedValue = (await epochTracker.get(createCacheSnapshotKey(resolved)));
|
|
305
|
+
assert(cachedValue.snapshotTree.id === "SnapshotId", "snapshot should have been cached");
|
|
306
|
+
assert(service["blobCache"].value.size > 0, "blobs should still be cached locally");
|
|
307
|
+
assert(service["commitCache"].size === 0, "no trees should be cached");
|
|
308
|
+
});
|
|
309
|
+
it("GetSnapshot() should not consult cache when request is for a loading group", async () => {
|
|
310
|
+
async function mockDownloadSnapshot(_response, callback) {
|
|
311
|
+
const getDownloadSnapshotStub = stub(fetchSnapshotImport, "downloadSnapshot");
|
|
312
|
+
getDownloadSnapshotStub.returns(_response);
|
|
313
|
+
try {
|
|
314
|
+
return await callback();
|
|
315
|
+
}
|
|
316
|
+
finally {
|
|
317
|
+
getDownloadSnapshotStub.restore();
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
const snapshot = {
|
|
321
|
+
blobContents,
|
|
322
|
+
snapshotTree: snapshotTreeWithGroupId,
|
|
323
|
+
ops: [],
|
|
324
|
+
latestSequenceNumber: 0,
|
|
325
|
+
sequenceNumber: 0,
|
|
326
|
+
snapshotFormatV: 1,
|
|
327
|
+
};
|
|
328
|
+
const odspResponse = {
|
|
329
|
+
content: (await createResponse({}, convertToCompactSnapshot(snapshot), 200)),
|
|
330
|
+
duration: 10,
|
|
331
|
+
headers: new Map([
|
|
332
|
+
["x-fluid-epoch", "epoch1"],
|
|
333
|
+
["content-type", "application/ms-fluid"],
|
|
334
|
+
]),
|
|
335
|
+
propsToLog: {},
|
|
336
|
+
};
|
|
337
|
+
const response = {
|
|
338
|
+
odspResponse,
|
|
339
|
+
requestHeaders: {},
|
|
340
|
+
requestUrl: siteUrl,
|
|
341
|
+
};
|
|
342
|
+
try {
|
|
343
|
+
await mockDownloadSnapshot(Promise.resolve(response), async () => service.getSnapshot({ loadingGroupIds: [], cacheSnapshot: false }));
|
|
344
|
+
}
|
|
345
|
+
catch {
|
|
346
|
+
assert.fail("the getSnapshot request should succeed");
|
|
347
|
+
}
|
|
348
|
+
// Fetch again for a groupId
|
|
349
|
+
try {
|
|
350
|
+
await mockDownloadSnapshot(Promise.resolve(response), async () => service.getSnapshot({ loadingGroupIds: ["g1"], cacheSnapshot: false }));
|
|
351
|
+
}
|
|
352
|
+
catch {
|
|
353
|
+
assert.fail("the getSnapshot request should succeed");
|
|
354
|
+
}
|
|
355
|
+
// Cache should not be consulted.
|
|
356
|
+
assert(mockLogger.matchEvents([
|
|
357
|
+
{
|
|
358
|
+
eventName: "ObtainSnapshot_end",
|
|
359
|
+
method: "network",
|
|
360
|
+
useLegacyFlowWithoutGroups: false,
|
|
361
|
+
},
|
|
362
|
+
{
|
|
363
|
+
eventName: "ObtainSnapshotForGroup_end",
|
|
364
|
+
method: "networkOnly",
|
|
365
|
+
fetchSource: "noCache",
|
|
366
|
+
useLegacyFlowWithoutGroups: false,
|
|
367
|
+
},
|
|
368
|
+
]), "unexpected events");
|
|
369
|
+
});
|
|
370
|
+
});
|
|
371
|
+
const snapshotTreeWithGroupId = {
|
|
372
|
+
id: "SnapshotId",
|
|
373
|
+
blobs: {},
|
|
374
|
+
trees: {
|
|
375
|
+
".protocol": {
|
|
376
|
+
blobs: {},
|
|
377
|
+
trees: {},
|
|
378
|
+
},
|
|
379
|
+
".app": {
|
|
380
|
+
blobs: { ".metadata": "bARD4RKvW4LL1KmaUKp6hUMSp" },
|
|
381
|
+
trees: {
|
|
382
|
+
".channels": {
|
|
383
|
+
blobs: {},
|
|
384
|
+
trees: {
|
|
385
|
+
default: {
|
|
386
|
+
blobs: {},
|
|
387
|
+
trees: {
|
|
388
|
+
dds: {
|
|
389
|
+
blobs: {},
|
|
390
|
+
trees: {},
|
|
391
|
+
},
|
|
392
|
+
},
|
|
393
|
+
groupId: "G3",
|
|
394
|
+
},
|
|
395
|
+
},
|
|
396
|
+
unreferenced: true,
|
|
397
|
+
groupId: "G2",
|
|
398
|
+
},
|
|
399
|
+
".blobs": { blobs: {}, trees: {} },
|
|
400
|
+
},
|
|
401
|
+
unreferenced: true,
|
|
402
|
+
groupId: "G4",
|
|
403
|
+
},
|
|
404
|
+
},
|
|
405
|
+
};
|
|
406
|
+
const blobContents = new Map([
|
|
407
|
+
[
|
|
408
|
+
"bARD4RKvW4LL1KmaUKp6hUMSp",
|
|
409
|
+
stringToBuffer(JSON.stringify({ summaryFormatVersion: 1, gcFeature: 0 }), "utf8"),
|
|
410
|
+
],
|
|
411
|
+
]);
|
|
412
|
+
//# sourceMappingURL=fetchSnapshot.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fetchSnapshot.spec.js","sourceRoot":"","sources":["../../src/test/fetchSnapshot.spec.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,oDAAoD;AAEpD,OAAO,EAAE,MAAM,IAAI,MAAM,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,IAAI,EAAE,MAAM,OAAO,CAAC;AAE7B,OAAO,EAAE,cAAc,EAAoB,MAAM,yCAAyC,CAAC;AAC3F,OAAO,EACN,iBAAiB,EACjB,UAAU,GAGV,MAAM,iCAAiC,CAAC;AAEzC,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAC9D,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,OAAO,KAAK,mBAAmB,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAC3E,OAAO,EAA+B,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AACtF,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AAEpE,OAAO,EAAE,0BAA0B,EAAE,MAAM,kCAAkC,CAAC;AAC9E,OAAO,EAAE,wBAAwB,EAAE,MAAM,6BAA6B,CAAC;AACvE,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAEhD,MAAM,kBAAkB,GAAG,GAAyB,EAAE,CAAC,IAAI,oBAAoB,EAAE,CAAC;AAElF,QAAQ,CAAC,2BAA2B,EAAE,GAAG,EAAE;IAC1C,MAAM,OAAO,GAAG,6CAA6C,CAAC;IAC9D,MAAM,OAAO,GAAG,SAAS,CAAC;IAC1B,MAAM,MAAM,GAAG,QAAQ,CAAC;IACxB,MAAM,QAAQ,GAAG,MAAM,CAAC;IACxB,IAAI,YAA0B,CAAC;IAC/B,IAAI,UAAgC,CAAC;IACrC,IAAI,gBAAwB,CAAC;IAC7B,IAAI,OAAmC,CAAC;IAExC,MAAM,WAAW,GAAG;QACnB,OAAO;QACP,OAAO;QACP,MAAM;QACN,eAAe,EAAE,IAAI;KACU,CAAC;IAEjC,MAAM,aAAa,GAAiB;QACnC,IAAI,EAAE,KAAK;QACX,OAAO;QACP,OAAO,EAAE,2BAA2B;QACpC,QAAQ;QACR,QAAQ,EAAE,UAAU;KACpB,CAAC;IAEF,MAAM,UAAU,GAA8B;QAC7C,eAAe,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE;QAC7C,gBAAgB,EAAE,IAAI;QACtB,yBAAyB,EAAE,KAAK;QAChC,uBAAuB,EAAE,IAAI;KAC7B,CAAC;IAEF,MAAM,QAAQ,GAAG,IAAI,qBAAqB,EAAE,CAAC;IAC7C,MAAM,kBAAkB,GAAG,IAAI,kBAAkB,EAAE,CAAC;IACpD,IAAI,MAA2B,CAAC;IAChC,IAAI,UAAsB,CAAC;IAC3B,MAAM,OAAO,GAAG,aAAa,CAAC,EAAE,GAAG,aAAa,EAAE,MAAM,EAAE,aAAa,EAAE,GAAG,EAAE,CAAC,CAAC;IAEhF,MAAM,OAAO,GAAc;QAC1B,YAAY,EAAE;YACb,EAAE,EAAE,IAAI;YACR,KAAK,EAAE,EAAE;YACT,KAAK,EAAE,EAAE;SACT;QACD,YAAY,EAAE,IAAI,GAAG,EAAE;QACvB,GAAG,EAAE,EAAE;QACP,cAAc,EAAE,CAAC;QACjB,oBAAoB,EAAE,CAAC;QACvB,eAAe,EAAE,CAAC;KAClB,CAAC;IAEF,IAAI,QAA0B,CAAC;IAC/B,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,gBAAgB,GAAG,MAAM,mBAAmB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAC/D,CAAC,CAAC,CAAC;IAEH,UAAU,CAAC,KAAK,IAAI,EAAE;QACrB,UAAU,GAAG,kBAAkB,EAAE,CAAC;QAClC,UAAU,GAAG,IAAI,UAAU,EAAE,CAAC;QAC9B,MAAM,GAAG,iBAAiB,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC;QACnD,2CAA2C;QAC3C,YAAY,GAAG,IAAI,YAAY,CAC9B,UAAU,EACV;YACC,KAAK,EAAE,gBAAgB;YACvB,WAAW;SACX,EACD,MAAM,CACN,CAAC;QACF,YAAY,CAAC,QAAQ,CAAC,QAAQ,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;QAC9C,QAAQ,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,CAAC;QACpD,OAAO,GAAG,IAAI,0BAA0B,CACvC,QAAQ,EACR,KAAK,EAAE,QAAQ,EAAE,EAAE,CAAC,OAAO,EAC3B,MAAM,EACN,IAAI,EACJ,EAAE,GAAG,kBAAkB,EAAE,cAAc,EAAE,YAAY,EAAE,EACvD,UAAU,EACV,YAAY,EACZ,KAAK,IAAI,EAAE;YACV,OAAO,EAAE,CAAC;QACX,CAAC,EACD,GAAG,EAAE,CAAC,aAAa,CACnB,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,KAAK,IAAI,EAAE;QACpB,MAAM,YAAY,CAAC,aAAa,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mCAAmC,EAAE,KAAK,IAAI,EAAE;QAClD,IAAI,OAAO,GAAG,KAAK,CAAC;QACpB,KAAK,UAAU,oBAAoB,CAClC,SAAsD,EACtD,QAA0B;YAE1B,MAAM,uBAAuB,GAAG,IAAI,CAAC,mBAAmB,EAAE,kBAAkB,CAAC,CAAC;YAC9E,uBAAuB,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;YAC3C,IAAI;gBACH,OAAO,MAAM,QAAQ,EAAE,CAAC;aACxB;oBAAS;gBACT,MAAM,CACL,uBAAuB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,KAAK,SAAS,EACrD,yBAAyB,CACzB,CAAC;gBACF,OAAO,GAAG,IAAI,CAAC;gBACf,uBAAuB,CAAC,OAAO,EAAE,CAAC;aAClC;QACF,CAAC;QACD,MAAM,YAAY,GAA4B;YAC7C,OAAO,EAAE,CAAC,MAAM,cAAc,CAAC,EAAE,EAAE,OAAO,EAAE,GAAG,CAAC,CAAwB;YACxE,QAAQ,EAAE,EAAE;YACZ,OAAO,EAAE,IAAI,GAAG,CAAC;gBAChB,CAAC,eAAe,EAAE,QAAQ,CAAC;gBAC3B,CAAC,cAAc,EAAE,kBAAkB,CAAC;aACpC,CAAC;YACF,UAAU,EAAE,EAAE;SACd,CAAC;QACF,MAAM,QAAQ,GAAuC;YACpD,YAAY;YACZ,cAAc,EAAE,EAAE;YAClB,UAAU,EAAE,OAAO;SACnB,CAAC;QACF,IAAI;YACH,MAAM,oBAAoB,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,KAAK,IAAI,EAAE,CAChE,OAAO,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,CAAC,CAC5B,CAAC;SACF;QAAC,MAAM;YACP,aAAa;SACb;QACD,MAAM,CAAC,OAAO,EAAE,+BAA+B,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sCAAsC,EAAE,KAAK,IAAI,EAAE;QACrD,KAAK,UAAU,oBAAoB,CAClC,SAAsD,EACtD,QAA0B;YAE1B,MAAM,uBAAuB,GAAG,IAAI,CAAC,mBAAmB,EAAE,kBAAkB,CAAC,CAAC;YAC9E,uBAAuB,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;YAC3C,IAAI;gBACH,OAAO,MAAM,QAAQ,EAAE,CAAC;aACxB;oBAAS;gBACT,uBAAuB,CAAC,OAAO,EAAE,CAAC;aAClC;QACF,CAAC;QACD,MAAM,YAAY,GAA4B;YAC7C,OAAO,EAAE,CAAC,MAAM,cAAc,CAAC,EAAE,EAAE,OAAO,EAAE,GAAG,CAAC,CAAwB;YACxE,QAAQ,EAAE,EAAE;YACZ,OAAO,EAAE,IAAI,GAAG,CAAC;gBAChB,CAAC,eAAe,EAAE,QAAQ,CAAC;gBAC3B,CAAC,cAAc,EAAE,SAAS,CAAC;aAC3B,CAAC;YACF,UAAU,EAAE,EAAE;SACd,CAAC;QACF,MAAM,QAAQ,GAAuC;YACpD,YAAY;YACZ,cAAc,EAAE,EAAE;YAClB,UAAU,EAAE,OAAO;SACnB,CAAC;QACF,IAAI;YACH,MAAM,oBAAoB,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,KAAK,IAAI,EAAE,CAChE,OAAO,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,CAAC,CAC5B,CAAC;YACF,MAAM,CAAC,IAAI,CAAC,4CAA4C,CAAC,CAAC;SAC1D;QAAC,OAAO,KAAc,EAAE;YACxB,MAAM,CAAC,WAAW,CAChB,KAAkC,CAAC,SAAS,EAC7C,cAAc,CAAC,uBAAuB,EACtC,4CAA4C,CAC5C,CAAC;YACF,MAAM,CAAC,WAAW;YACjB,0GAA0G;YACzG,KAAa,CAAC,WAAW,EAC1B,SAAS,EACT,gCAAgC,CAChC,CAAC;SACF;IACF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0CAA0C,EAAE,KAAK,IAAI,EAAE;QACzD,IAAI,aAAa,GAAG,KAAK,CAAC;QAC1B,KAAK,UAAU,oBAAoB,CAClC,SAAsD,EACtD,QAA0B;YAE1B,MAAM,uBAAuB,GAAG,IAAI,CAAC,mBAAmB,EAAE,kBAAkB,CAAC,CAAC;YAC9E,uBAAuB,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;YAC3C,IAAI;gBACH,OAAO,MAAM,QAAQ,EAAE,CAAC;aACxB;oBAAS;gBACT,uBAAuB,CAAC,OAAO,EAAE,CAAC;gBAClC,MAAM,CACL,uBAAuB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,KAAK,CAAC,EAChD,8BAA8B,CAC9B,CAAC;gBACF,aAAa,GAAG,IAAI,CAAC;aACrB;QACF,CAAC;QACD,MAAM,QAAQ,GAAc;YAC3B,YAAY;YACZ,YAAY,EAAE,uBAAuB;YACrC,GAAG,EAAE,EAAE;YACP,oBAAoB,EAAE,CAAC;YACvB,cAAc,EAAE,CAAC;YACjB,eAAe,EAAE,CAAC;SAClB,CAAC;QACF,MAAM,YAAY,GAA4B;YAC7C,OAAO,EAAE,CAAC,MAAM,cAAc,CAC7B,EAAE,EACF,wBAAwB,CAAC,QAAQ,CAAC,EAClC,GAAG,CACH,CAAwB;YACzB,QAAQ,EAAE,EAAE;YACZ,OAAO,EAAE,IAAI,GAAG,CAAC;gBAChB,CAAC,eAAe,EAAE,QAAQ,CAAC;gBAC3B,CAAC,cAAc,EAAE,sBAAsB,CAAC;aACxC,CAAC;YACF,UAAU,EAAE,EAAE;SACd,CAAC;QACF,MAAM,QAAQ,GAAuC;YACpD,YAAY;YACZ,cAAc,EAAE,EAAE;YAClB,UAAU,EAAE,OAAO;SACnB,CAAC;QACF,IAAI;YACH,MAAM,oBAAoB,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,KAAK,IAAI,EAAE,CAChE,OAAO,CAAC,WAAW,CAAC,EAAE,eAAe,EAAE,EAAE,EAAE,CAAC,CAC5C,CAAC;SACF;QAAC,MAAM;YACP,MAAM,CAAC,IAAI,CAAC,wCAAwC,CAAC,CAAC;SACtD;QACD,MAAM,CAAC,aAAa,EAAE,qCAAqC,CAAC,CAAC;QAC7D,MAAM,WAAW,GAAG,CAAC,MAAM,YAAY,CAAC,GAAG,CAAC,sBAAsB,CAAC,QAAQ,CAAC,CAAC,CAAc,CAAC;QAC5F,MAAM,CAAC,WAAW,CAAC,YAAY,CAAC,EAAE,KAAK,YAAY,EAAE,kCAAkC,CAAC,CAAC;QACzF,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,EAAE,gCAAgC,CAAC,CAAC;QAC9E,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,IAAI,GAAG,CAAC,EAAE,2BAA2B,CAAC,CAAC;IACtE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iGAAiG,EAAE,KAAK,IAAI,EAAE;QAChH,IAAI,OAAO,GAAG,KAAK,CAAC;QACpB,OAAO,CAAC,wBAAwB,CAAC,GAAG,KAAK,CAAC;QAC1C,KAAK,UAAU,oBAAoB,CAClC,SAAsD,EACtD,QAA0B;YAE1B,MAAM,uBAAuB,GAAG,IAAI,CAAC,mBAAmB,EAAE,kBAAkB,CAAC,CAAC;YAC9E,uBAAuB,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;YAC3C,IAAI;gBACH,OAAO,MAAM,QAAQ,EAAE,CAAC;aACxB;oBAAS;gBACT,uBAAuB,CAAC,OAAO,EAAE,CAAC;gBAClC,MAAM,CACL,uBAAuB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,IAAI,EAChD,2BAA2B,CAC3B,CAAC;gBACF,OAAO,GAAG,IAAI,CAAC;aACf;QACF,CAAC;QACD,MAAM,QAAQ,GAAc;YAC3B,YAAY;YACZ,YAAY,EAAE,uBAAuB;YACrC,GAAG,EAAE,EAAE;YACP,oBAAoB,EAAE,CAAC;YACvB,cAAc,EAAE,CAAC;YACjB,eAAe,EAAE,CAAC;SAClB,CAAC;QACF,MAAM,YAAY,GAA4B;YAC7C,OAAO,EAAE,CAAC,MAAM,cAAc,CAC7B,EAAE,EACF,wBAAwB,CAAC,QAAQ,CAAC,EAClC,GAAG,CACH,CAAwB;YACzB,QAAQ,EAAE,EAAE;YACZ,OAAO,EAAE,IAAI,GAAG,CAAC;gBAChB,CAAC,eAAe,EAAE,QAAQ,CAAC;gBAC3B,CAAC,cAAc,EAAE,sBAAsB,CAAC;aACxC,CAAC;YACF,UAAU,EAAE,EAAE;SACd,CAAC;QACF,MAAM,QAAQ,GAAuC;YACpD,YAAY;YACZ,cAAc,EAAE,EAAE;YAClB,UAAU,EAAE,OAAO;SACnB,CAAC;QACF,IAAI;YACH,MAAM,oBAAoB,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,KAAK,IAAI,EAAE,CAChE,OAAO,CAAC,WAAW,CAAC,EAAE,eAAe,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAChD,CAAC;SACF;QAAC,OAAO,KAAc,EAAE;YACxB,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;YAC5B,MAAM,CAAC,IAAI,CAAC,wCAAwC,CAAC,CAAC;SACtD;QACD,MAAM,CAAC,OAAO,EAAE,mCAAmC,CAAC,CAAC;QACrD,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,EAAE,sCAAsC,CAAC,CAAC;QACpF,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,IAAI,KAAK,CAAC,EAAE,2BAA2B,CAAC,CAAC;QACvE,MAAM,CACL,UAAU,CAAC,WAAW,CAAC;YACtB;gBACC,SAAS,EAAE,4BAA4B;gBACvC,MAAM,EAAE,aAAa;gBACrB,WAAW,EAAE,SAAS;gBACtB,0BAA0B,EAAE,KAAK;aACjC;SACD,CAAC,EACF,mBAAmB,CACnB,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kEAAkE,EAAE,KAAK,IAAI,EAAE;QACjF,KAAK,UAAU,oBAAoB,CAClC,SAAsD,EACtD,QAA0B;YAE1B,MAAM,uBAAuB,GAAG,IAAI,CAAC,mBAAmB,EAAE,kBAAkB,CAAC,CAAC;YAC9E,uBAAuB,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;YAC3C,IAAI;gBACH,OAAO,MAAM,QAAQ,EAAE,CAAC;aACxB;oBAAS;gBACT,uBAAuB,CAAC,OAAO,EAAE,CAAC;aAClC;QACF,CAAC;QACD,MAAM,QAAQ,GAAc;YAC3B,YAAY;YACZ,YAAY,EAAE,uBAAuB;YACrC,GAAG,EAAE,EAAE;YACP,oBAAoB,EAAE,CAAC;YACvB,cAAc,EAAE,CAAC;YACjB,eAAe,EAAE,CAAC;SAClB,CAAC;QACF,MAAM,YAAY,GAA4B;YAC7C,OAAO,EAAE,CAAC,MAAM,cAAc,CAC7B,EAAE,EACF,wBAAwB,CAAC,QAAQ,CAAC,EAClC,GAAG,CACH,CAAwB;YACzB,QAAQ,EAAE,EAAE;YACZ,OAAO,EAAE,IAAI,GAAG,CAAC;gBAChB,CAAC,eAAe,EAAE,QAAQ,CAAC;gBAC3B,CAAC,cAAc,EAAE,sBAAsB,CAAC;aACxC,CAAC;YACF,UAAU,EAAE,EAAE;SACd,CAAC;QACF,MAAM,QAAQ,GAAuC;YACpD,YAAY;YACZ,cAAc,EAAE,EAAE;YAClB,UAAU,EAAE,OAAO;SACnB,CAAC;QACF,IAAI;YACH,MAAM,oBAAoB,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,KAAK,IAAI,EAAE,CAChE,OAAO,CAAC,WAAW,CAAC,EAAE,eAAe,EAAE,EAAE,EAAE,aAAa,EAAE,KAAK,EAAE,CAAC,CAClE,CAAC;SACF;QAAC,MAAM;YACP,MAAM,CAAC,IAAI,CAAC,wCAAwC,CAAC,CAAC;SACtD;QACD,MAAM,WAAW,GAAG,CAAC,MAAM,YAAY,CAAC,GAAG,CAAC,sBAAsB,CAAC,QAAQ,CAAC,CAAC,CAAc,CAAC;QAC5F,MAAM,CAAC,WAAW,CAAC,YAAY,CAAC,EAAE,KAAK,YAAY,EAAE,kCAAkC,CAAC,CAAC;QACzF,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,EAAE,sCAAsC,CAAC,CAAC;QACpF,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,IAAI,KAAK,CAAC,EAAE,2BAA2B,CAAC,CAAC;IACxE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4EAA4E,EAAE,KAAK,IAAI,EAAE;QAC3F,KAAK,UAAU,oBAAoB,CAClC,SAAsD,EACtD,QAA0B;YAE1B,MAAM,uBAAuB,GAAG,IAAI,CAAC,mBAAmB,EAAE,kBAAkB,CAAC,CAAC;YAC9E,uBAAuB,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;YAC3C,IAAI;gBACH,OAAO,MAAM,QAAQ,EAAE,CAAC;aACxB;oBAAS;gBACT,uBAAuB,CAAC,OAAO,EAAE,CAAC;aAClC;QACF,CAAC;QACD,MAAM,QAAQ,GAAc;YAC3B,YAAY;YACZ,YAAY,EAAE,uBAAuB;YACrC,GAAG,EAAE,EAAE;YACP,oBAAoB,EAAE,CAAC;YACvB,cAAc,EAAE,CAAC;YACjB,eAAe,EAAE,CAAC;SAClB,CAAC;QACF,MAAM,YAAY,GAA4B;YAC7C,OAAO,EAAE,CAAC,MAAM,cAAc,CAC7B,EAAE,EACF,wBAAwB,CAAC,QAAQ,CAAC,EAClC,GAAG,CACH,CAAwB;YACzB,QAAQ,EAAE,EAAE;YACZ,OAAO,EAAE,IAAI,GAAG,CAAC;gBAChB,CAAC,eAAe,EAAE,QAAQ,CAAC;gBAC3B,CAAC,cAAc,EAAE,sBAAsB,CAAC;aACxC,CAAC;YACF,UAAU,EAAE,EAAE;SACd,CAAC;QACF,MAAM,QAAQ,GAAuC;YACpD,YAAY;YACZ,cAAc,EAAE,EAAE;YAClB,UAAU,EAAE,OAAO;SACnB,CAAC;QACF,IAAI;YACH,MAAM,oBAAoB,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,KAAK,IAAI,EAAE,CAChE,OAAO,CAAC,WAAW,CAAC,EAAE,eAAe,EAAE,EAAE,EAAE,aAAa,EAAE,KAAK,EAAE,CAAC,CAClE,CAAC;SACF;QAAC,MAAM;YACP,MAAM,CAAC,IAAI,CAAC,wCAAwC,CAAC,CAAC;SACtD;QAED,4BAA4B;QAC5B,IAAI;YACH,MAAM,oBAAoB,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,KAAK,IAAI,EAAE,CAChE,OAAO,CAAC,WAAW,CAAC,EAAE,eAAe,EAAE,CAAC,IAAI,CAAC,EAAE,aAAa,EAAE,KAAK,EAAE,CAAC,CACtE,CAAC;SACF;QAAC,MAAM;YACP,MAAM,CAAC,IAAI,CAAC,wCAAwC,CAAC,CAAC;SACtD;QACD,iCAAiC;QACjC,MAAM,CACL,UAAU,CAAC,WAAW,CAAC;YACtB;gBACC,SAAS,EAAE,oBAAoB;gBAC/B,MAAM,EAAE,SAAS;gBACjB,0BAA0B,EAAE,KAAK;aACjC;YACD;gBACC,SAAS,EAAE,4BAA4B;gBACvC,MAAM,EAAE,aAAa;gBACrB,WAAW,EAAE,SAAS;gBACtB,0BAA0B,EAAE,KAAK;aACjC;SACD,CAAC,EACF,mBAAmB,CACnB,CAAC;IACH,CAAC,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,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;iBACb;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,YAAY,GAAG,IAAI,GAAG,CAAsB;IACjD;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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\n/* eslint-disable @typescript-eslint/dot-notation */\n\nimport { strict as assert } from \"node:assert\";\nimport { stub } from \"sinon\";\nimport { ISnapshot } from \"@fluidframework/driver-definitions\";\nimport { OdspErrorTypes, IOdspResolvedUrl } from \"@fluidframework/odsp-driver-definitions\";\nimport {\n\tcreateChildLogger,\n\tMockLogger,\n\ttype ITelemetryLoggerExt,\n\ttype IFluidErrorBase,\n} from \"@fluidframework/telemetry-utils\";\nimport { ISnapshotTree } from \"@fluidframework/protocol-definitions\";\nimport { stringToBuffer } from \"@fluid-internal/client-utils\";\nimport { EpochTracker } from \"../epochTracker.js\";\nimport { HostStoragePolicyInternal } from \"../contracts.js\";\nimport * as fetchSnapshotImport from \"../fetchSnapshot.js\";\nimport { LocalPersistentCache, NonPersistentCache } from \"../odspCache.js\";\nimport { INewFileInfo, IOdspResponse, createCacheSnapshotKey } from \"../odspUtils.js\";\nimport { createOdspUrl } from \"../createOdspUrl.js\";\nimport { getHashedDocumentId } from \"../odspPublicUtils.js\";\nimport { OdspDriverUrlResolver } from \"../odspDriverUrlResolver.js\";\nimport { ISnapshotRequestAndResponseOptions } from \"../fetchSnapshot.js\";\nimport { OdspDocumentStorageService } from \"../odspDocumentStorageManager.js\";\nimport { convertToCompactSnapshot } from \"../compactSnapshotWriter.js\";\nimport { createResponse } from \"./mockFetch.js\";\n\nconst createUtLocalCache = (): LocalPersistentCache => new LocalPersistentCache();\n\ndescribe(\"Tests1 for snapshot fetch\", () => {\n\tconst siteUrl = \"https://microsoft.sharepoint-df.com/siteUrl\";\n\tconst driveId = \"driveId\";\n\tconst itemId = \"itemId\";\n\tconst filePath = \"path\";\n\tlet epochTracker: EpochTracker;\n\tlet localCache: LocalPersistentCache;\n\tlet hashedDocumentId: string;\n\tlet service: OdspDocumentStorageService;\n\n\tconst resolvedUrl = {\n\t\tsiteUrl,\n\t\tdriveId,\n\t\titemId,\n\t\todspResolvedUrl: true,\n\t} as unknown as IOdspResolvedUrl;\n\n\tconst newFileParams: INewFileInfo = {\n\t\ttype: \"New\",\n\t\tdriveId,\n\t\tsiteUrl: \"https://www.localhost.xxx\",\n\t\tfilePath,\n\t\tfilename: \"filename\",\n\t};\n\n\tconst hostPolicy: HostStoragePolicyInternal = {\n\t\tsnapshotOptions: { timeout: 2000, mds: 1000 },\n\t\tsummarizerClient: true,\n\t\tfetchBinarySnapshotFormat: false,\n\t\tconcurrentSnapshotFetch: true,\n\t};\n\n\tconst resolver = new OdspDriverUrlResolver();\n\tconst nonPersistentCache = new NonPersistentCache();\n\tlet logger: ITelemetryLoggerExt;\n\tlet mockLogger: MockLogger;\n\tconst odspUrl = createOdspUrl({ ...newFileParams, itemId, dataStorePath: \"/\" });\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\tlet resolved: IOdspResolvedUrl;\n\tbefore(async () => {\n\t\thashedDocumentId = await getHashedDocumentId(driveId, itemId);\n\t});\n\n\tbeforeEach(async () => {\n\t\tlocalCache = createUtLocalCache();\n\t\tmockLogger = new MockLogger();\n\t\tlogger = createChildLogger({ logger: mockLogger });\n\t\t// use null logger here as we expect errors\n\t\tepochTracker = new EpochTracker(\n\t\t\tlocalCache,\n\t\t\t{\n\t\t\t\tdocId: hashedDocumentId,\n\t\t\t\tresolvedUrl,\n\t\t\t},\n\t\t\tlogger,\n\t\t);\n\t\tepochTracker.setEpoch(\"epoch1\", true, \"test\");\n\t\tresolved = await resolver.resolve({ url: odspUrl });\n\t\tservice = new OdspDocumentStorageService(\n\t\t\tresolved,\n\t\t\tasync (_options) => \"token\",\n\t\t\tlogger,\n\t\t\ttrue,\n\t\t\t{ ...nonPersistentCache, persistedCache: epochTracker },\n\t\t\thostPolicy,\n\t\t\tepochTracker,\n\t\t\tasync () => {\n\t\t\t\treturn {};\n\t\t\t},\n\t\t\t() => \"tenantid/id\",\n\t\t);\n\t});\n\n\tafterEach(async () => {\n\t\tawait epochTracker.removeEntries().catch(() => {});\n\t});\n\n\tit(\"Mds limit check in fetch snapshot\", async () => {\n\t\tlet success = false;\n\t\tasync function mockDownloadSnapshot<T>(\n\t\t\t_response: Promise<ISnapshotRequestAndResponseOptions>,\n\t\t\tcallback: () => Promise<T>,\n\t\t): Promise<T> {\n\t\t\tconst getDownloadSnapshotStub = stub(fetchSnapshotImport, \"downloadSnapshot\");\n\t\t\tgetDownloadSnapshotStub.returns(_response);\n\t\t\ttry {\n\t\t\t\treturn await callback();\n\t\t\t} finally {\n\t\t\t\tassert(\n\t\t\t\t\tgetDownloadSnapshotStub.args[0][3]?.mds === undefined,\n\t\t\t\t\t\"mds should be undefined\",\n\t\t\t\t);\n\t\t\t\tsuccess = true;\n\t\t\t\tgetDownloadSnapshotStub.restore();\n\t\t\t}\n\t\t}\n\t\tconst odspResponse: IOdspResponse<Response> = {\n\t\t\tcontent: (await createResponse({}, content, 200)) as unknown as Response,\n\t\t\tduration: 10,\n\t\t\theaders: new Map([\n\t\t\t\t[\"x-fluid-epoch\", \"epoch1\"],\n\t\t\t\t[\"content-type\", \"application/json\"],\n\t\t\t]),\n\t\t\tpropsToLog: {},\n\t\t};\n\t\tconst response: ISnapshotRequestAndResponseOptions = {\n\t\t\todspResponse,\n\t\t\trequestHeaders: {},\n\t\t\trequestUrl: siteUrl,\n\t\t};\n\t\ttry {\n\t\t\tawait mockDownloadSnapshot(Promise.resolve(response), async () =>\n\t\t\t\tservice.getVersions(null, 1),\n\t\t\t);\n\t\t} catch {\n\t\t\t// Drop error\n\t\t}\n\t\tassert(success, \"mds limit should not be set!!\");\n\t});\n\n\tit(\"Check error in snapshot content type\", async () => {\n\t\tasync function mockDownloadSnapshot<T>(\n\t\t\t_response: Promise<ISnapshotRequestAndResponseOptions>,\n\t\t\tcallback: () => Promise<T>,\n\t\t): Promise<T> {\n\t\t\tconst getDownloadSnapshotStub = stub(fetchSnapshotImport, \"downloadSnapshot\");\n\t\t\tgetDownloadSnapshotStub.returns(_response);\n\t\t\ttry {\n\t\t\t\treturn await callback();\n\t\t\t} finally {\n\t\t\t\tgetDownloadSnapshotStub.restore();\n\t\t\t}\n\t\t}\n\t\tconst odspResponse: IOdspResponse<Response> = {\n\t\t\tcontent: (await createResponse({}, content, 200)) as unknown as Response,\n\t\t\tduration: 10,\n\t\t\theaders: new Map([\n\t\t\t\t[\"x-fluid-epoch\", \"epoch1\"],\n\t\t\t\t[\"content-type\", \"unknown\"],\n\t\t\t]),\n\t\t\tpropsToLog: {},\n\t\t};\n\t\tconst response: ISnapshotRequestAndResponseOptions = {\n\t\t\todspResponse,\n\t\t\trequestHeaders: {},\n\t\t\trequestUrl: siteUrl,\n\t\t};\n\t\ttry {\n\t\t\tawait mockDownloadSnapshot(Promise.resolve(response), async () =>\n\t\t\t\tservice.getVersions(null, 1),\n\t\t\t);\n\t\t\tassert.fail(\"should throw incorrectServerResponse error\");\n\t\t} catch (error: unknown) {\n\t\t\tassert.strictEqual(\n\t\t\t\t(error as Partial<IFluidErrorBase>).errorType,\n\t\t\t\tOdspErrorTypes.incorrectServerResponse,\n\t\t\t\t\"incorrectServerResponse should be received\",\n\t\t\t);\n\t\t\tassert.strictEqual(\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-explicit-any\n\t\t\t\t(error as any).contentType,\n\t\t\t\t\"unknown\",\n\t\t\t\t\"content type should be unknown\",\n\t\t\t);\n\t\t}\n\t});\n\n\tit(\"GetSnapshot() should work in normal flow\", async () => {\n\t\tlet ungroupedData = false;\n\t\tasync function mockDownloadSnapshot<T>(\n\t\t\t_response: Promise<ISnapshotRequestAndResponseOptions>,\n\t\t\tcallback: () => Promise<T>,\n\t\t): Promise<T> {\n\t\t\tconst getDownloadSnapshotStub = stub(fetchSnapshotImport, \"downloadSnapshot\");\n\t\t\tgetDownloadSnapshotStub.returns(_response);\n\t\t\ttry {\n\t\t\t\treturn await callback();\n\t\t\t} finally {\n\t\t\t\tgetDownloadSnapshotStub.restore();\n\t\t\t\tassert(\n\t\t\t\t\tgetDownloadSnapshotStub.args[0][2]?.length === 0,\n\t\t\t\t\t\"should ask for ungroupedData\",\n\t\t\t\t);\n\t\t\t\tungroupedData = true;\n\t\t\t}\n\t\t}\n\t\tconst snapshot: 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 odspResponse: IOdspResponse<Response> = {\n\t\t\tcontent: (await createResponse(\n\t\t\t\t{},\n\t\t\t\tconvertToCompactSnapshot(snapshot),\n\t\t\t\t200,\n\t\t\t)) as unknown as Response,\n\t\t\tduration: 10,\n\t\t\theaders: new Map([\n\t\t\t\t[\"x-fluid-epoch\", \"epoch1\"],\n\t\t\t\t[\"content-type\", \"application/ms-fluid\"],\n\t\t\t]),\n\t\t\tpropsToLog: {},\n\t\t};\n\t\tconst response: ISnapshotRequestAndResponseOptions = {\n\t\t\todspResponse,\n\t\t\trequestHeaders: {},\n\t\t\trequestUrl: siteUrl,\n\t\t};\n\t\ttry {\n\t\t\tawait mockDownloadSnapshot(Promise.resolve(response), async () =>\n\t\t\t\tservice.getSnapshot({ loadingGroupIds: [] }),\n\t\t\t);\n\t\t} catch {\n\t\t\tassert.fail(\"the getSnapshot request should succeed\");\n\t\t}\n\t\tassert(ungroupedData, \"should have asked for ungroupedData\");\n\t\tconst cachedValue = (await epochTracker.get(createCacheSnapshotKey(resolved))) as ISnapshot;\n\t\tassert(cachedValue.snapshotTree.id === \"SnapshotId\", \"snapshot should have been cached\");\n\t\tassert(service[\"blobCache\"].value.size > 0, \"blobs should be cached locally\");\n\t\tassert(service[\"commitCache\"].size > 0, \"no trees should be cached\");\n\t});\n\n\tit(\"GetSnapshot() should work but snapshot should not be cached locally if asked for custom groupId\", async () => {\n\t\tlet success = false;\n\t\tservice[\"firstSnapshotFetchCall\"] = false;\n\t\tasync function mockDownloadSnapshot<T>(\n\t\t\t_response: Promise<ISnapshotRequestAndResponseOptions>,\n\t\t\tcallback: () => Promise<T>,\n\t\t): Promise<T> {\n\t\t\tconst getDownloadSnapshotStub = stub(fetchSnapshotImport, \"downloadSnapshot\");\n\t\t\tgetDownloadSnapshotStub.returns(_response);\n\t\t\ttry {\n\t\t\t\treturn await callback();\n\t\t\t} finally {\n\t\t\t\tgetDownloadSnapshotStub.restore();\n\t\t\t\tassert(\n\t\t\t\t\tgetDownloadSnapshotStub.args[0][2]?.[0] === \"g1\",\n\t\t\t\t\t\"should ask for g1 groupId\",\n\t\t\t\t);\n\t\t\t\tsuccess = true;\n\t\t\t}\n\t\t}\n\t\tconst snapshot: 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 odspResponse: IOdspResponse<Response> = {\n\t\t\tcontent: (await createResponse(\n\t\t\t\t{},\n\t\t\t\tconvertToCompactSnapshot(snapshot),\n\t\t\t\t200,\n\t\t\t)) as unknown as Response,\n\t\t\tduration: 10,\n\t\t\theaders: new Map([\n\t\t\t\t[\"x-fluid-epoch\", \"epoch1\"],\n\t\t\t\t[\"content-type\", \"application/ms-fluid\"],\n\t\t\t]),\n\t\t\tpropsToLog: {},\n\t\t};\n\t\tconst response: ISnapshotRequestAndResponseOptions = {\n\t\t\todspResponse,\n\t\t\trequestHeaders: {},\n\t\t\trequestUrl: siteUrl,\n\t\t};\n\t\ttry {\n\t\t\tawait mockDownloadSnapshot(Promise.resolve(response), async () =>\n\t\t\t\tservice.getSnapshot({ loadingGroupIds: [\"g1\"] }),\n\t\t\t);\n\t\t} catch (error: unknown) {\n\t\t\tconsole.log(\"error\", error);\n\t\t\tassert.fail(\"the getSnapshot request should succeed\");\n\t\t}\n\t\tassert(success, \"should have asked for g1 group id\");\n\t\tassert(service[\"blobCache\"].value.size > 0, \"blobs should still be cached locally\");\n\t\tassert(service[\"commitCache\"].size === 0, \"no trees should be cached\");\n\t\tassert(\n\t\t\tmockLogger.matchEvents([\n\t\t\t\t{\n\t\t\t\t\teventName: \"ObtainSnapshotForGroup_end\",\n\t\t\t\t\tmethod: \"networkOnly\",\n\t\t\t\t\tfetchSource: \"noCache\",\n\t\t\t\t\tuseLegacyFlowWithoutGroups: false,\n\t\t\t\t},\n\t\t\t]),\n\t\t\t\"unexpected events\",\n\t\t);\n\t});\n\n\tit(\"GetSnapshot() should not cache locally when specified in options\", async () => {\n\t\tasync function mockDownloadSnapshot<T>(\n\t\t\t_response: Promise<ISnapshotRequestAndResponseOptions>,\n\t\t\tcallback: () => Promise<T>,\n\t\t): Promise<T> {\n\t\t\tconst getDownloadSnapshotStub = stub(fetchSnapshotImport, \"downloadSnapshot\");\n\t\t\tgetDownloadSnapshotStub.returns(_response);\n\t\t\ttry {\n\t\t\t\treturn await callback();\n\t\t\t} finally {\n\t\t\t\tgetDownloadSnapshotStub.restore();\n\t\t\t}\n\t\t}\n\t\tconst snapshot: 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 odspResponse: IOdspResponse<Response> = {\n\t\t\tcontent: (await createResponse(\n\t\t\t\t{},\n\t\t\t\tconvertToCompactSnapshot(snapshot),\n\t\t\t\t200,\n\t\t\t)) as unknown as Response,\n\t\t\tduration: 10,\n\t\t\theaders: new Map([\n\t\t\t\t[\"x-fluid-epoch\", \"epoch1\"],\n\t\t\t\t[\"content-type\", \"application/ms-fluid\"],\n\t\t\t]),\n\t\t\tpropsToLog: {},\n\t\t};\n\t\tconst response: ISnapshotRequestAndResponseOptions = {\n\t\t\todspResponse,\n\t\t\trequestHeaders: {},\n\t\t\trequestUrl: siteUrl,\n\t\t};\n\t\ttry {\n\t\t\tawait mockDownloadSnapshot(Promise.resolve(response), async () =>\n\t\t\t\tservice.getSnapshot({ loadingGroupIds: [], cacheSnapshot: false }),\n\t\t\t);\n\t\t} catch {\n\t\t\tassert.fail(\"the getSnapshot request should succeed\");\n\t\t}\n\t\tconst cachedValue = (await epochTracker.get(createCacheSnapshotKey(resolved))) as ISnapshot;\n\t\tassert(cachedValue.snapshotTree.id === \"SnapshotId\", \"snapshot should have been cached\");\n\t\tassert(service[\"blobCache\"].value.size > 0, \"blobs should still be cached locally\");\n\t\tassert(service[\"commitCache\"].size === 0, \"no trees should be cached\");\n\t});\n\n\tit(\"GetSnapshot() should not consult cache when request is for a loading group\", async () => {\n\t\tasync function mockDownloadSnapshot<T>(\n\t\t\t_response: Promise<ISnapshotRequestAndResponseOptions>,\n\t\t\tcallback: () => Promise<T>,\n\t\t): Promise<T> {\n\t\t\tconst getDownloadSnapshotStub = stub(fetchSnapshotImport, \"downloadSnapshot\");\n\t\t\tgetDownloadSnapshotStub.returns(_response);\n\t\t\ttry {\n\t\t\t\treturn await callback();\n\t\t\t} finally {\n\t\t\t\tgetDownloadSnapshotStub.restore();\n\t\t\t}\n\t\t}\n\t\tconst snapshot: 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 odspResponse: IOdspResponse<Response> = {\n\t\t\tcontent: (await createResponse(\n\t\t\t\t{},\n\t\t\t\tconvertToCompactSnapshot(snapshot),\n\t\t\t\t200,\n\t\t\t)) as unknown as Response,\n\t\t\tduration: 10,\n\t\t\theaders: new Map([\n\t\t\t\t[\"x-fluid-epoch\", \"epoch1\"],\n\t\t\t\t[\"content-type\", \"application/ms-fluid\"],\n\t\t\t]),\n\t\t\tpropsToLog: {},\n\t\t};\n\t\tconst response: ISnapshotRequestAndResponseOptions = {\n\t\t\todspResponse,\n\t\t\trequestHeaders: {},\n\t\t\trequestUrl: siteUrl,\n\t\t};\n\t\ttry {\n\t\t\tawait mockDownloadSnapshot(Promise.resolve(response), async () =>\n\t\t\t\tservice.getSnapshot({ loadingGroupIds: [], cacheSnapshot: false }),\n\t\t\t);\n\t\t} catch {\n\t\t\tassert.fail(\"the getSnapshot request should succeed\");\n\t\t}\n\n\t\t// Fetch again for a groupId\n\t\ttry {\n\t\t\tawait mockDownloadSnapshot(Promise.resolve(response), async () =>\n\t\t\t\tservice.getSnapshot({ loadingGroupIds: [\"g1\"], cacheSnapshot: false }),\n\t\t\t);\n\t\t} catch {\n\t\t\tassert.fail(\"the getSnapshot request should succeed\");\n\t\t}\n\t\t// Cache should not be consulted.\n\t\tassert(\n\t\t\tmockLogger.matchEvents([\n\t\t\t\t{\n\t\t\t\t\teventName: \"ObtainSnapshot_end\",\n\t\t\t\t\tmethod: \"network\",\n\t\t\t\t\tuseLegacyFlowWithoutGroups: false,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\teventName: \"ObtainSnapshotForGroup_end\",\n\t\t\t\t\tmethod: \"networkOnly\",\n\t\t\t\t\tfetchSource: \"noCache\",\n\t\t\t\t\tuseLegacyFlowWithoutGroups: false,\n\t\t\t\t},\n\t\t\t]),\n\t\t\t\"unexpected events\",\n\t\t);\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},\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 blobContents = new Map<string, ArrayBuffer>([\n\t[\n\t\t\"bARD4RKvW4LL1KmaUKp6hUMSp\",\n\t\tstringToBuffer(JSON.stringify({ summaryFormatVersion: 1, gcFeature: 0 }), \"utf8\"),\n\t],\n]);\n"]}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* Copyright (c) Microsoft Corporation and contributors. All rights reserved.
|
|
3
|
+
* Licensed under the MIT License.
|
|
4
|
+
*/
|
|
5
|
+
import { strict as assert } from "node:assert";
|
|
6
|
+
import { MockLogger } from "@fluidframework/telemetry-utils";
|
|
7
|
+
import { getFileLink } from "../getFileLink.js";
|
|
8
|
+
import { mockFetchSingle, mockFetchMultiple, okResponse, notFound, createResponse, } from "./mockFetch.js";
|
|
9
|
+
describe("getFileLink", () => {
|
|
10
|
+
const siteUrl = "https://microsoft.sharepoint-df.com/siteUrl";
|
|
11
|
+
const driveId = "driveId";
|
|
12
|
+
const logger = new MockLogger();
|
|
13
|
+
const storageTokenFetcher = async () => "StorageToken";
|
|
14
|
+
const fileItemResponse = {
|
|
15
|
+
webDavUrl: "fetchDavUrl",
|
|
16
|
+
webUrl: "fetchWebUrl",
|
|
17
|
+
sharepointIds: { listItemUniqueId: "fetchFileId" },
|
|
18
|
+
};
|
|
19
|
+
afterEach(() => {
|
|
20
|
+
logger.assertMatchNone([{ category: "error" }]);
|
|
21
|
+
});
|
|
22
|
+
it("should return share link with existing access", async () => {
|
|
23
|
+
const result = await mockFetchMultiple(async () => getFileLink(storageTokenFetcher, { siteUrl, driveId, itemId: "itemId4" }, logger.toTelemetryLogger()), [
|
|
24
|
+
async () => okResponse({}, fileItemResponse),
|
|
25
|
+
async () => okResponse({}, { d: { directUrl: "sharelink" } }),
|
|
26
|
+
]);
|
|
27
|
+
assert.strictEqual(result, "sharelink", "File link should match url returned from sharing information");
|
|
28
|
+
});
|
|
29
|
+
it("should reject if file web dav url is missing", async () => {
|
|
30
|
+
await assert.rejects(mockFetchMultiple(async () => getFileLink(storageTokenFetcher, { siteUrl, driveId, itemId: "itemId5" }, logger.toTelemetryLogger()), [
|
|
31
|
+
async () => okResponse({}, {}),
|
|
32
|
+
// We retry once on malformed response from server, so need a second response mocked.
|
|
33
|
+
async () => okResponse({}, {}),
|
|
34
|
+
]), "File link should reject for malformed url");
|
|
35
|
+
});
|
|
36
|
+
it("should reject if file item is not found", async () => {
|
|
37
|
+
await assert.rejects(mockFetchSingle(async () => {
|
|
38
|
+
return getFileLink(storageTokenFetcher, { siteUrl, driveId, itemId: "itemId6" }, logger.toTelemetryLogger());
|
|
39
|
+
}, notFound), "File link should reject when not found");
|
|
40
|
+
});
|
|
41
|
+
it("should successfully retry", async () => {
|
|
42
|
+
const result = await mockFetchMultiple(async () => getFileLink(storageTokenFetcher, { siteUrl, driveId, itemId: "itemId7" }, logger.toTelemetryLogger()), [
|
|
43
|
+
async () => createResponse({ "retry-after": "0.001" }, undefined, 900),
|
|
44
|
+
async () => okResponse({}, fileItemResponse),
|
|
45
|
+
async () => okResponse({}, { d: { directUrl: "sharelink" } }),
|
|
46
|
+
]);
|
|
47
|
+
assert.strictEqual(result, "sharelink", "File link should match url returned from sharing information");
|
|
48
|
+
// Should be present in cache now and subsequent calls should fetch from cache.
|
|
49
|
+
const sharelink2 = await getFileLink(storageTokenFetcher, { siteUrl, driveId, itemId: "itemId7" }, logger.toTelemetryLogger());
|
|
50
|
+
assert.strictEqual(sharelink2, "sharelink", "File link should match url returned from sharing information from cache");
|
|
51
|
+
});
|
|
52
|
+
it("should successfully give up after 5 tries", async () => {
|
|
53
|
+
await assert.rejects(mockFetchMultiple(async () => getFileLink(storageTokenFetcher, { siteUrl, driveId, itemId: "itemId7" }, logger.toTelemetryLogger()), [
|
|
54
|
+
async () => createResponse({ "retry-after": "0.001" }, undefined, 900),
|
|
55
|
+
async () => createResponse({ "retry-after": "0.001" }, undefined, 900),
|
|
56
|
+
async () => createResponse({ "retry-after": "0.001" }, undefined, 900),
|
|
57
|
+
async () => createResponse({ "retry-after": "0.001" }, undefined, 900),
|
|
58
|
+
async () => createResponse({ "retry-after": "0.001" }, undefined, 900),
|
|
59
|
+
]), "did not retries 5 times");
|
|
60
|
+
});
|
|
61
|
+
});
|
|
62
|
+
//# sourceMappingURL=getFileLink.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getFileLink.spec.js","sourceRoot":"","sources":["../../src/test/getFileLink.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 { getFileLink } from \"../getFileLink.js\";\nimport {\n\tmockFetchSingle,\n\tmockFetchMultiple,\n\tokResponse,\n\tnotFound,\n\tcreateResponse,\n\tMockResponse,\n} from \"./mockFetch.js\";\n\ndescribe(\"getFileLink\", () => {\n\tconst siteUrl = \"https://microsoft.sharepoint-df.com/siteUrl\";\n\tconst driveId = \"driveId\";\n\tconst logger = new MockLogger();\n\tconst storageTokenFetcher = async (): Promise<string> => \"StorageToken\";\n\tconst fileItemResponse = {\n\t\twebDavUrl: \"fetchDavUrl\",\n\t\twebUrl: \"fetchWebUrl\",\n\t\tsharepointIds: { listItemUniqueId: \"fetchFileId\" },\n\t};\n\n\tafterEach(() => {\n\t\tlogger.assertMatchNone([{ category: \"error\" }]);\n\t});\n\n\tit(\"should return share link with existing access\", async () => {\n\t\tconst result = await mockFetchMultiple(\n\t\t\tasync () =>\n\t\t\t\tgetFileLink(\n\t\t\t\t\tstorageTokenFetcher,\n\t\t\t\t\t{ siteUrl, driveId, itemId: \"itemId4\" },\n\t\t\t\t\tlogger.toTelemetryLogger(),\n\t\t\t\t),\n\t\t\t[\n\t\t\t\tasync (): Promise<MockResponse> => okResponse({}, fileItemResponse),\n\t\t\t\tasync (): Promise<MockResponse> =>\n\t\t\t\t\tokResponse({}, { d: { directUrl: \"sharelink\" } }),\n\t\t\t],\n\t\t);\n\t\tassert.strictEqual(\n\t\t\tresult,\n\t\t\t\"sharelink\",\n\t\t\t\"File link should match url returned from sharing information\",\n\t\t);\n\t});\n\n\tit(\"should reject if file web dav url is missing\", async () => {\n\t\tawait assert.rejects(\n\t\t\tmockFetchMultiple(\n\t\t\t\tasync () =>\n\t\t\t\t\tgetFileLink(\n\t\t\t\t\t\tstorageTokenFetcher,\n\t\t\t\t\t\t{ siteUrl, driveId, itemId: \"itemId5\" },\n\t\t\t\t\t\tlogger.toTelemetryLogger(),\n\t\t\t\t\t),\n\t\t\t\t[\n\t\t\t\t\tasync (): Promise<MockResponse> => okResponse({}, {}),\n\t\t\t\t\t// We retry once on malformed response from server, so need a second response mocked.\n\t\t\t\t\tasync (): Promise<MockResponse> => okResponse({}, {}),\n\t\t\t\t],\n\t\t\t),\n\t\t\t\"File link should reject for malformed url\",\n\t\t);\n\t});\n\n\tit(\"should reject if file item is not found\", async () => {\n\t\tawait assert.rejects(\n\t\t\tmockFetchSingle(async () => {\n\t\t\t\treturn getFileLink(\n\t\t\t\t\tstorageTokenFetcher,\n\t\t\t\t\t{ siteUrl, driveId, itemId: \"itemId6\" },\n\t\t\t\t\tlogger.toTelemetryLogger(),\n\t\t\t\t);\n\t\t\t}, notFound),\n\t\t\t\"File link should reject when not found\",\n\t\t);\n\t});\n\n\tit(\"should successfully retry\", async () => {\n\t\tconst result = await mockFetchMultiple(\n\t\t\tasync () =>\n\t\t\t\tgetFileLink(\n\t\t\t\t\tstorageTokenFetcher,\n\t\t\t\t\t{ siteUrl, driveId, itemId: \"itemId7\" },\n\t\t\t\t\tlogger.toTelemetryLogger(),\n\t\t\t\t),\n\t\t\t[\n\t\t\t\tasync (): Promise<MockResponse> =>\n\t\t\t\t\tcreateResponse({ \"retry-after\": \"0.001\" }, undefined, 900),\n\t\t\t\tasync (): Promise<MockResponse> => okResponse({}, fileItemResponse),\n\t\t\t\tasync (): Promise<MockResponse> =>\n\t\t\t\t\tokResponse({}, { d: { directUrl: \"sharelink\" } }),\n\t\t\t],\n\t\t);\n\t\tassert.strictEqual(\n\t\t\tresult,\n\t\t\t\"sharelink\",\n\t\t\t\"File link should match url returned from sharing information\",\n\t\t);\n\t\t// Should be present in cache now and subsequent calls should fetch from cache.\n\t\tconst sharelink2 = await getFileLink(\n\t\t\tstorageTokenFetcher,\n\t\t\t{ siteUrl, driveId, itemId: \"itemId7\" },\n\t\t\tlogger.toTelemetryLogger(),\n\t\t);\n\t\tassert.strictEqual(\n\t\t\tsharelink2,\n\t\t\t\"sharelink\",\n\t\t\t\"File link should match url returned from sharing information from cache\",\n\t\t);\n\t});\n\n\tit(\"should successfully give up after 5 tries\", async () => {\n\t\tawait assert.rejects(\n\t\t\tmockFetchMultiple(\n\t\t\t\tasync () =>\n\t\t\t\t\tgetFileLink(\n\t\t\t\t\t\tstorageTokenFetcher,\n\t\t\t\t\t\t{ siteUrl, driveId, itemId: \"itemId7\" },\n\t\t\t\t\t\tlogger.toTelemetryLogger(),\n\t\t\t\t\t),\n\t\t\t\t[\n\t\t\t\t\tasync (): Promise<MockResponse> =>\n\t\t\t\t\t\tcreateResponse({ \"retry-after\": \"0.001\" }, undefined, 900),\n\t\t\t\t\tasync (): Promise<MockResponse> =>\n\t\t\t\t\t\tcreateResponse({ \"retry-after\": \"0.001\" }, undefined, 900),\n\t\t\t\t\tasync (): Promise<MockResponse> =>\n\t\t\t\t\t\tcreateResponse({ \"retry-after\": \"0.001\" }, undefined, 900),\n\t\t\t\t\tasync (): Promise<MockResponse> =>\n\t\t\t\t\t\tcreateResponse({ \"retry-after\": \"0.001\" }, undefined, 900),\n\t\t\t\t\tasync (): Promise<MockResponse> =>\n\t\t\t\t\t\tcreateResponse({ \"retry-after\": \"0.001\" }, undefined, 900),\n\t\t\t\t],\n\t\t\t),\n\t\t\t\"did not retries 5 times\",\n\t\t);\n\t});\n});\n"]}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* Copyright (c) Microsoft Corporation and contributors. All rights reserved.
|
|
3
|
+
* Licensed under the MIT License.
|
|
4
|
+
*/
|
|
5
|
+
import { strict as assert } from "node:assert";
|
|
6
|
+
import { getUrlAndHeadersWithAuth } from "../getUrlAndHeadersWithAuth.js";
|
|
7
|
+
describe("getUrlAndHeadersWithAuth", () => {
|
|
8
|
+
const baseUrl = "https://contoso.sharepoint.com/_api/v2.1/drives/driveId/items/itemId/opstream";
|
|
9
|
+
const urlWithoutParams = new URL(baseUrl);
|
|
10
|
+
const urlWithSingleParam = new URL(`${baseUrl}?someParam=someValue`);
|
|
11
|
+
const urlWithMultipleParams = new URL(`${baseUrl}?param1=value1¶m2=value2`);
|
|
12
|
+
// decrement by 1 to account for '?' character included in query string
|
|
13
|
+
const maxTokenLength = 2048 - "access_token=".length - 1;
|
|
14
|
+
const shortToken = generateToken(10);
|
|
15
|
+
function generateToken(length) {
|
|
16
|
+
return "a".repeat(length);
|
|
17
|
+
}
|
|
18
|
+
it("returns original url if token is null", async () => {
|
|
19
|
+
const { url, headers } = getUrlAndHeadersWithAuth(baseUrl, null, false);
|
|
20
|
+
assert.strictEqual(url, baseUrl, "Original and returned urls must match");
|
|
21
|
+
assert.deepStrictEqual(headers, {}, "Returned header must be empty");
|
|
22
|
+
});
|
|
23
|
+
it("returns original url if token is empty", async () => {
|
|
24
|
+
const { url, headers } = getUrlAndHeadersWithAuth(baseUrl, "", false);
|
|
25
|
+
assert.strictEqual(url, baseUrl, "Original and returned urls must match");
|
|
26
|
+
assert.deepStrictEqual(headers, {}, "Returned header must be empty");
|
|
27
|
+
});
|
|
28
|
+
const validateTokenEmbeddedIntoQueryString = (originalUrl, token, result) => {
|
|
29
|
+
const returnedUrl = new URL(result.url);
|
|
30
|
+
assert.strictEqual(returnedUrl.searchParams.get("access_token"), token, "Url must contain token in query string");
|
|
31
|
+
assert.deepStrictEqual(result.headers, {}, "Returned header must be empty");
|
|
32
|
+
returnedUrl.searchParams.delete("access_token");
|
|
33
|
+
assert.strictEqual(returnedUrl.href, originalUrl.href, "Returned url must match original url");
|
|
34
|
+
};
|
|
35
|
+
const validateTokenEmbeddedIntoHeaders = (originalUrl, token, result) => {
|
|
36
|
+
const returnedUrl = new URL(result.url);
|
|
37
|
+
assert.strictEqual(returnedUrl.searchParams.get("access_token"), null, "Url must not contain token in query string");
|
|
38
|
+
assert.strictEqual(result.headers.Authorization.endsWith(token), true, "Returned header must contain token");
|
|
39
|
+
assert.strictEqual(returnedUrl.href, originalUrl.href, "Returned url must match original url");
|
|
40
|
+
};
|
|
41
|
+
it("returns url with token embedded as part of query string when overall query string does not exceed 2048 characters", async () => {
|
|
42
|
+
validateTokenEmbeddedIntoQueryString(urlWithoutParams, shortToken, getUrlAndHeadersWithAuth(urlWithoutParams.href, shortToken, false));
|
|
43
|
+
validateTokenEmbeddedIntoQueryString(urlWithSingleParam, shortToken, getUrlAndHeadersWithAuth(urlWithSingleParam.href, shortToken, false));
|
|
44
|
+
validateTokenEmbeddedIntoQueryString(urlWithMultipleParams, shortToken, getUrlAndHeadersWithAuth(urlWithMultipleParams.href, shortToken, false));
|
|
45
|
+
const longTokenForUrlWithoutParams = generateToken(maxTokenLength);
|
|
46
|
+
validateTokenEmbeddedIntoQueryString(urlWithoutParams, longTokenForUrlWithoutParams, getUrlAndHeadersWithAuth(urlWithoutParams.href, longTokenForUrlWithoutParams, false));
|
|
47
|
+
const longTokenForUrlWithSingleParam = generateToken(maxTokenLength - urlWithSingleParam.search.length);
|
|
48
|
+
validateTokenEmbeddedIntoQueryString(urlWithSingleParam, longTokenForUrlWithSingleParam, getUrlAndHeadersWithAuth(urlWithSingleParam.href, longTokenForUrlWithSingleParam, false));
|
|
49
|
+
const longTokenForUrlMultipleParams = generateToken(maxTokenLength - urlWithMultipleParams.search.length);
|
|
50
|
+
validateTokenEmbeddedIntoQueryString(urlWithMultipleParams, longTokenForUrlMultipleParams, getUrlAndHeadersWithAuth(urlWithMultipleParams.href, longTokenForUrlMultipleParams, false));
|
|
51
|
+
});
|
|
52
|
+
it("returns headers with token embedded in Authorization header when overall query string exceeds 2048 characters", async () => {
|
|
53
|
+
const longTokenForUrlWithoutParams = generateToken(maxTokenLength + 1);
|
|
54
|
+
validateTokenEmbeddedIntoHeaders(urlWithoutParams, longTokenForUrlWithoutParams, getUrlAndHeadersWithAuth(urlWithoutParams.href, longTokenForUrlWithoutParams, false));
|
|
55
|
+
const longTokenForUrlWithSingleParam = generateToken(maxTokenLength - urlWithSingleParam.search.length + 1);
|
|
56
|
+
validateTokenEmbeddedIntoHeaders(urlWithSingleParam, longTokenForUrlWithSingleParam, getUrlAndHeadersWithAuth(urlWithSingleParam.href, longTokenForUrlWithSingleParam, false));
|
|
57
|
+
const longTokenForUrlMultipleParams = generateToken(maxTokenLength - urlWithMultipleParams.search.length + 1);
|
|
58
|
+
validateTokenEmbeddedIntoHeaders(urlWithMultipleParams, longTokenForUrlMultipleParams, getUrlAndHeadersWithAuth(urlWithMultipleParams.href, longTokenForUrlMultipleParams, false));
|
|
59
|
+
});
|
|
60
|
+
it("returns headers with token embedded in Authorization header when forced", async () => {
|
|
61
|
+
validateTokenEmbeddedIntoHeaders(urlWithoutParams, shortToken, getUrlAndHeadersWithAuth(urlWithoutParams.href, shortToken, true));
|
|
62
|
+
validateTokenEmbeddedIntoHeaders(urlWithSingleParam, shortToken, getUrlAndHeadersWithAuth(urlWithSingleParam.href, shortToken, true));
|
|
63
|
+
validateTokenEmbeddedIntoHeaders(urlWithMultipleParams, shortToken, getUrlAndHeadersWithAuth(urlWithMultipleParams.href, shortToken, true));
|
|
64
|
+
});
|
|
65
|
+
});
|
|
66
|
+
//# sourceMappingURL=getUrlAndHeadersWithAuth.spec.js.map
|