@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,289 @@
|
|
|
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 { DriverHeader } from "@fluidframework/driver-definitions";
|
|
7
|
+
import { OdspDriverUrlResolver } from "../odspDriverUrlResolver.js";
|
|
8
|
+
import { getHashedDocumentId } from "../odspPublicUtils.js";
|
|
9
|
+
import { createOdspCreateContainerRequest } from "../createOdspCreateContainerRequest.js";
|
|
10
|
+
import { createOdspUrl } from "../createOdspUrl.js";
|
|
11
|
+
describe("Odsp Driver Resolver", () => {
|
|
12
|
+
const siteUrl = "https://localhost";
|
|
13
|
+
const driveId = "driveId";
|
|
14
|
+
const filePath = "path";
|
|
15
|
+
const fileName = "fileName";
|
|
16
|
+
const packageName = "packageName";
|
|
17
|
+
let resolver;
|
|
18
|
+
let request;
|
|
19
|
+
beforeEach(() => {
|
|
20
|
+
resolver = new OdspDriverUrlResolver();
|
|
21
|
+
request = createOdspCreateContainerRequest(siteUrl, driveId, filePath, fileName);
|
|
22
|
+
});
|
|
23
|
+
it("Can create new request", async () => {
|
|
24
|
+
assert.strictEqual(
|
|
25
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
|
|
26
|
+
request.headers?.[DriverHeader.createNew].fileName, fileName, "Request should contain fileName");
|
|
27
|
+
const url = `${siteUrl}?driveId=${encodeURIComponent(driveId)}&path=${encodeURIComponent(filePath)}`;
|
|
28
|
+
assert.strictEqual(request.url, url, "Request url should match");
|
|
29
|
+
});
|
|
30
|
+
it("Should resolve createNew request", async () => {
|
|
31
|
+
const resolvedUrl = await resolver.resolve(request);
|
|
32
|
+
assert.strictEqual(resolvedUrl.fileName, fileName, "FileName should be equal");
|
|
33
|
+
assert.strictEqual(resolvedUrl.driveId, driveId, "Drive id should be equal");
|
|
34
|
+
assert.strictEqual(resolvedUrl.siteUrl, siteUrl, "SiteUrl should be equal");
|
|
35
|
+
assert.strictEqual(resolvedUrl.itemId, "", "Item id should be absent");
|
|
36
|
+
assert.strictEqual(resolvedUrl.hashedDocumentId, "", "No doc id should be present");
|
|
37
|
+
assert.strictEqual(resolvedUrl.endpoints.snapshotStorageUrl, "", "Snapshot url should be empty");
|
|
38
|
+
const [, queryString] = request.url.split("?");
|
|
39
|
+
const searchParams = new URLSearchParams(queryString);
|
|
40
|
+
assert.strictEqual(searchParams.get("path"), filePath, "filePath should match");
|
|
41
|
+
assert.strictEqual(searchParams.get("driveId"), driveId, "Drive id should match");
|
|
42
|
+
});
|
|
43
|
+
it("Should resolve url with a data store", async () => {
|
|
44
|
+
const resolvedUrl = await resolver.resolve(request);
|
|
45
|
+
const expected = {
|
|
46
|
+
endpoints: {
|
|
47
|
+
snapshotStorageUrl: "",
|
|
48
|
+
attachmentGETStorageUrl: "",
|
|
49
|
+
attachmentPOSTStorageUrl: "",
|
|
50
|
+
deltaStorageUrl: "",
|
|
51
|
+
},
|
|
52
|
+
tokens: {},
|
|
53
|
+
type: "fluid",
|
|
54
|
+
odspResolvedUrl: true,
|
|
55
|
+
id: "odspCreateNew",
|
|
56
|
+
url: "https://https://localhost?driveId=driveId&path=path&version=null",
|
|
57
|
+
siteUrl: "https://localhost",
|
|
58
|
+
hashedDocumentId: "",
|
|
59
|
+
driveId: "driveId",
|
|
60
|
+
itemId: "",
|
|
61
|
+
fileName: "fileName",
|
|
62
|
+
fileVersion: undefined,
|
|
63
|
+
summarizer: false,
|
|
64
|
+
codeHint: { containerPackageName: undefined },
|
|
65
|
+
shareLinkInfo: undefined,
|
|
66
|
+
isClpCompliantApp: undefined,
|
|
67
|
+
};
|
|
68
|
+
assert.deepStrictEqual(resolvedUrl, expected);
|
|
69
|
+
const response = await resolver.getAbsoluteUrl(resolvedUrl, "/datastore");
|
|
70
|
+
const [url, queryString] = response?.split("?") ?? [];
|
|
71
|
+
const searchParams = new URLSearchParams(queryString);
|
|
72
|
+
assert.strictEqual(searchParams.get("itemId"), resolvedUrl.itemId, "Item id should match");
|
|
73
|
+
assert.strictEqual(searchParams.get("driveId"), driveId, "Drive Id should match");
|
|
74
|
+
assert.strictEqual(searchParams.get("path"), "datastore", "Path should match");
|
|
75
|
+
assert.strictEqual(url, `${siteUrl}`, "Url should match");
|
|
76
|
+
});
|
|
77
|
+
it("Should add codeHint if request contains containerPackageName", async () => {
|
|
78
|
+
const newRequest = request;
|
|
79
|
+
newRequest.url += `&containerPackageName=${encodeURIComponent(packageName)}`;
|
|
80
|
+
const resolvedUrl = await resolver.resolve(request);
|
|
81
|
+
assert.strictEqual(resolvedUrl.codeHint?.containerPackageName, packageName, "containerPackageName should match");
|
|
82
|
+
});
|
|
83
|
+
it("Should resolve url with a string in the codeDetails package", async () => {
|
|
84
|
+
const resolvedUrl = await resolver.resolve(request);
|
|
85
|
+
const codeDetails = {
|
|
86
|
+
package: packageName,
|
|
87
|
+
};
|
|
88
|
+
// codeDetails is cast to any for testing the IFluidCodeDetails approach
|
|
89
|
+
const response = await resolver.getAbsoluteUrl(resolvedUrl, "/datastore",
|
|
90
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-argument, @typescript-eslint/no-explicit-any
|
|
91
|
+
codeDetails);
|
|
92
|
+
const [url, queryString] = response?.split("?") ?? [];
|
|
93
|
+
const searchParams = new URLSearchParams(queryString);
|
|
94
|
+
assert.strictEqual(searchParams.get("itemId"), resolvedUrl.itemId, "Item id should match");
|
|
95
|
+
assert.strictEqual(searchParams.get("driveId"), driveId, "Drive Id should match");
|
|
96
|
+
assert.strictEqual(searchParams.get("path"), "datastore", "Path should match");
|
|
97
|
+
assert.strictEqual(searchParams.get("containerPackageName"), packageName, "ContainerPackageName should match");
|
|
98
|
+
assert.strictEqual(url, `${siteUrl}`, "Url should match");
|
|
99
|
+
});
|
|
100
|
+
it("should resolve and then getAbsoluteUrl should pick dataStorePath from resolvedUrl", async () => {
|
|
101
|
+
const resolvedUrl1 = await resolver.resolve({
|
|
102
|
+
url: createOdspUrl({
|
|
103
|
+
driveId,
|
|
104
|
+
itemId: "itemId",
|
|
105
|
+
siteUrl,
|
|
106
|
+
dataStorePath: "datastore",
|
|
107
|
+
fileVersion: "0.1",
|
|
108
|
+
appName: "app",
|
|
109
|
+
containerPackageName: packageName,
|
|
110
|
+
}),
|
|
111
|
+
});
|
|
112
|
+
const response = await resolver.getAbsoluteUrl(resolvedUrl1, "");
|
|
113
|
+
const resolvedUrl2 = await resolver.resolve({ url: response });
|
|
114
|
+
assert.strictEqual(resolvedUrl2.driveId, driveId, "Drive id should be equal");
|
|
115
|
+
assert.strictEqual(resolvedUrl2.dataStorePath, "datastore", "DataStorePath should be equal");
|
|
116
|
+
assert.strictEqual(resolvedUrl2.codeHint?.containerPackageName, packageName, "DataStorePath should be equal");
|
|
117
|
+
assert.strictEqual(resolvedUrl2.siteUrl, siteUrl, "SiteUrl should be equal");
|
|
118
|
+
assert.strictEqual(resolvedUrl2.itemId, "itemId", "Item id should be absent");
|
|
119
|
+
});
|
|
120
|
+
it("Should resolve url given container package info", async () => {
|
|
121
|
+
const resolvedUrl = await resolver.resolve(request);
|
|
122
|
+
const response = await resolver.getAbsoluteUrl(resolvedUrl, "/datastore", {
|
|
123
|
+
name: packageName,
|
|
124
|
+
});
|
|
125
|
+
const [url, queryString] = response?.split("?") ?? [];
|
|
126
|
+
const searchParams = new URLSearchParams(queryString);
|
|
127
|
+
assert.strictEqual(searchParams.get("itemId"), resolvedUrl.itemId, "Item id should match");
|
|
128
|
+
assert.strictEqual(searchParams.get("driveId"), driveId, "Drive Id should match");
|
|
129
|
+
assert.strictEqual(searchParams.get("path"), "datastore", "Path should match");
|
|
130
|
+
assert.strictEqual(searchParams.get("containerPackageName"), packageName, "ContainerPackageName should match");
|
|
131
|
+
assert.strictEqual(url, `${siteUrl}`, "Url should match");
|
|
132
|
+
});
|
|
133
|
+
it("Should resolve url with a IFluidPackage in the codeDetails package", async () => {
|
|
134
|
+
const resolvedUrl = await resolver.resolve(request);
|
|
135
|
+
const fluidPackage = {
|
|
136
|
+
name: packageName,
|
|
137
|
+
fluid: {},
|
|
138
|
+
};
|
|
139
|
+
const codeDetails = { package: fluidPackage };
|
|
140
|
+
// codeDetails is cast to any for testing the IFluidCodeDetails approach
|
|
141
|
+
const response = await resolver.getAbsoluteUrl(resolvedUrl, "/datastore",
|
|
142
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-argument, @typescript-eslint/no-explicit-any
|
|
143
|
+
codeDetails);
|
|
144
|
+
const [url, queryString] = response?.split("?") ?? [];
|
|
145
|
+
const searchParams = new URLSearchParams(queryString);
|
|
146
|
+
assert.strictEqual(searchParams.get("itemId"), resolvedUrl.itemId, "Item id should match");
|
|
147
|
+
assert.strictEqual(searchParams.get("driveId"), driveId, "Drive Id should match");
|
|
148
|
+
assert.strictEqual(searchParams.get("path"), "datastore", "Path should match");
|
|
149
|
+
assert.strictEqual(searchParams.get("containerPackageName"), packageName, "ContainerPackageName should match");
|
|
150
|
+
assert.strictEqual(url, `${siteUrl}`, "Url should match");
|
|
151
|
+
});
|
|
152
|
+
it("Should resolve url with a codeHint in the resolved url", async () => {
|
|
153
|
+
const newRequest = request;
|
|
154
|
+
newRequest.url += `&containerPackageName=${encodeURIComponent(packageName)}`;
|
|
155
|
+
const resolvedUrl = await resolver.resolve(request);
|
|
156
|
+
const response = await resolver.getAbsoluteUrl(resolvedUrl, "/datastore");
|
|
157
|
+
const [url, queryString] = response?.split("?") ?? [];
|
|
158
|
+
const searchParams = new URLSearchParams(queryString);
|
|
159
|
+
assert.strictEqual(searchParams.get("itemId"), resolvedUrl.itemId, "Item id should match");
|
|
160
|
+
assert.strictEqual(searchParams.get("driveId"), driveId, "Drive Id should match");
|
|
161
|
+
assert.strictEqual(searchParams.get("path"), "datastore", "Path should match");
|
|
162
|
+
assert.strictEqual(searchParams.get("containerPackageName"), packageName, "ContainerPackageName should match");
|
|
163
|
+
assert.strictEqual(url, `${siteUrl}`, "Url should match");
|
|
164
|
+
});
|
|
165
|
+
it("Should resolve url with empty file path", async () => {
|
|
166
|
+
// Arrange
|
|
167
|
+
const testFilePath = "";
|
|
168
|
+
request = createOdspCreateContainerRequest(siteUrl, driveId, testFilePath, fileName);
|
|
169
|
+
// Act
|
|
170
|
+
const resolvedUrl = await resolver.resolve(request);
|
|
171
|
+
// Assert
|
|
172
|
+
assert.strictEqual(resolvedUrl.fileName, fileName, "FileName should be equal");
|
|
173
|
+
assert.strictEqual(resolvedUrl.driveId, driveId, "Drive id should be equal");
|
|
174
|
+
assert.strictEqual(resolvedUrl.siteUrl, siteUrl, "SiteUrl should be equal");
|
|
175
|
+
assert.strictEqual(resolvedUrl.itemId, "", "Item id should be absent");
|
|
176
|
+
assert.strictEqual(resolvedUrl.hashedDocumentId, "", "No doc id should be present");
|
|
177
|
+
assert.strictEqual(resolvedUrl.endpoints.snapshotStorageUrl, "", "Snapshot url should be empty");
|
|
178
|
+
assert.strictEqual(resolvedUrl.codeHint?.containerPackageName, undefined, "Container Package Name should be undefined");
|
|
179
|
+
const [, queryString] = request.url.split("?");
|
|
180
|
+
const searchParams = new URLSearchParams(queryString);
|
|
181
|
+
assert.strictEqual(searchParams.get("path"), testFilePath, "filePath should match");
|
|
182
|
+
assert.strictEqual(searchParams.get("driveId"), driveId, "Drive id should match");
|
|
183
|
+
});
|
|
184
|
+
it("Should resolve url with non-empty file path and item id", async () => {
|
|
185
|
+
// Arrange
|
|
186
|
+
const testFilePath = "data1";
|
|
187
|
+
const itemId = "item1";
|
|
188
|
+
const testRequest = {
|
|
189
|
+
url: `${siteUrl}?driveId=${driveId}&path=${testFilePath}&itemId=${itemId}`,
|
|
190
|
+
headers: { createNew: { fileName: `${fileName}` } },
|
|
191
|
+
};
|
|
192
|
+
// Act
|
|
193
|
+
const resolvedUrl = await resolver.resolve(testRequest);
|
|
194
|
+
// Assert
|
|
195
|
+
assert.strictEqual(resolvedUrl.fileName, fileName, "FileName should be equal");
|
|
196
|
+
assert.strictEqual(resolvedUrl.driveId, driveId, "Drive id should be equal");
|
|
197
|
+
assert.strictEqual(resolvedUrl.siteUrl, siteUrl, "SiteUrl should be equal");
|
|
198
|
+
assert.strictEqual(resolvedUrl.itemId, "", "Item id should be absent");
|
|
199
|
+
assert.strictEqual(resolvedUrl.hashedDocumentId, "", "No doc id should be present");
|
|
200
|
+
assert.strictEqual(resolvedUrl.endpoints.snapshotStorageUrl, "", "Snapshot url should be empty");
|
|
201
|
+
const expectedResolvedUrl = `https://${siteUrl}?driveId=${driveId}&path=${testFilePath}&itemId=${itemId}` +
|
|
202
|
+
`&version=null`;
|
|
203
|
+
assert.strictEqual(resolvedUrl.url, expectedResolvedUrl, "resolved url is wrong");
|
|
204
|
+
});
|
|
205
|
+
it("Should resolve url with file path containing 3 data object ids", async () => {
|
|
206
|
+
// Arrange
|
|
207
|
+
const testFilePath = "data1/data2/data3";
|
|
208
|
+
const itemId = "item1";
|
|
209
|
+
const testRequest = {
|
|
210
|
+
url: `${siteUrl}?driveId=${driveId}&path=${testFilePath}&itemId=${itemId}`,
|
|
211
|
+
};
|
|
212
|
+
// Act
|
|
213
|
+
const resolvedUrl = await resolver.resolve(testRequest);
|
|
214
|
+
// Assert
|
|
215
|
+
assert.strictEqual(resolvedUrl.fileName, "", "FileName should be absent");
|
|
216
|
+
assert.strictEqual(resolvedUrl.driveId, driveId, "Drive id should be equal");
|
|
217
|
+
assert.strictEqual(resolvedUrl.siteUrl, siteUrl, "SiteUrl should be equal");
|
|
218
|
+
assert.strictEqual(resolvedUrl.itemId, itemId, "Item id should be equal");
|
|
219
|
+
assert.strictEqual(resolvedUrl.hashedDocumentId, await getHashedDocumentId(driveId, itemId), "Doc id should be present");
|
|
220
|
+
assert.notStrictEqual(resolvedUrl.endpoints.snapshotStorageUrl, "", "Snapshot url should be present");
|
|
221
|
+
const expectedResolvedUrl = `https://placeholder/placeholder/${resolvedUrl.hashedDocumentId}/` + `${testFilePath}`;
|
|
222
|
+
assert.strictEqual(resolvedUrl.url, expectedResolvedUrl, "resolved url is wrong");
|
|
223
|
+
});
|
|
224
|
+
it("Should resolve url with file path containing ending slashes", async () => {
|
|
225
|
+
// Arrange
|
|
226
|
+
const testFilePath = "data1/data2//";
|
|
227
|
+
const itemId = "item1";
|
|
228
|
+
const testRequest = {
|
|
229
|
+
url: `${siteUrl}?driveId=${driveId}&path=${testFilePath}&itemId=${itemId}`,
|
|
230
|
+
};
|
|
231
|
+
// Act
|
|
232
|
+
const resolvedUrl = await resolver.resolve(testRequest);
|
|
233
|
+
// Assert
|
|
234
|
+
assert.strictEqual(resolvedUrl.fileName, "", "FileName should be absent");
|
|
235
|
+
assert.strictEqual(resolvedUrl.driveId, driveId, "Drive id should be equal");
|
|
236
|
+
assert.strictEqual(resolvedUrl.siteUrl, siteUrl, "SiteUrl should be equal");
|
|
237
|
+
assert.strictEqual(resolvedUrl.itemId, itemId, "Item id should be equal");
|
|
238
|
+
assert.strictEqual(resolvedUrl.hashedDocumentId, await getHashedDocumentId(driveId, itemId), "Doc id should be present");
|
|
239
|
+
assert.notStrictEqual(resolvedUrl.endpoints.snapshotStorageUrl, "", "Snapshot url should be present");
|
|
240
|
+
const expectedResolvedUrl = `https://placeholder/placeholder/${resolvedUrl.hashedDocumentId}/` + `${testFilePath}`;
|
|
241
|
+
assert.strictEqual(resolvedUrl.url, expectedResolvedUrl, "resolved url is wrong");
|
|
242
|
+
});
|
|
243
|
+
it("Should resolve url with special characters", async () => {
|
|
244
|
+
// Arrange
|
|
245
|
+
const testFilePath = "data1/data2/!@$";
|
|
246
|
+
const itemId = "item!@$";
|
|
247
|
+
const testRequest = {
|
|
248
|
+
url: `${siteUrl}?driveId=${driveId}&path=${testFilePath}&itemId=${itemId}`,
|
|
249
|
+
};
|
|
250
|
+
// Act
|
|
251
|
+
const resolvedUrl = await resolver.resolve(testRequest);
|
|
252
|
+
// Assert
|
|
253
|
+
assert.strictEqual(resolvedUrl.fileName, "", "FileName should be absent");
|
|
254
|
+
assert.strictEqual(resolvedUrl.driveId, driveId, "Drive id should be equal");
|
|
255
|
+
assert.strictEqual(resolvedUrl.siteUrl, siteUrl, "SiteUrl should be equal");
|
|
256
|
+
assert.strictEqual(resolvedUrl.itemId, itemId, "Item id should be equal");
|
|
257
|
+
assert.strictEqual(resolvedUrl.hashedDocumentId, await getHashedDocumentId(driveId, itemId), "Doc id should be present");
|
|
258
|
+
assert.notStrictEqual(resolvedUrl.endpoints.snapshotStorageUrl, "", "Snapshot url should be present");
|
|
259
|
+
const expectedResolvedUrl = `https://placeholder/placeholder/${resolvedUrl.hashedDocumentId}/` + `${testFilePath}`;
|
|
260
|
+
assert.strictEqual(resolvedUrl.url, expectedResolvedUrl, "resolved url is wrong");
|
|
261
|
+
});
|
|
262
|
+
it("resolves urls with datastore path in url path", async () => {
|
|
263
|
+
const absoluteUrl = "https://localhost/datastore?driveId=driveId&itemId=&path=/";
|
|
264
|
+
const resolvedUrl = await resolver.resolve({ url: absoluteUrl });
|
|
265
|
+
assert.strictEqual(resolvedUrl.url, "https://placeholder/placeholder/AV5r7rhbMqs3T5cL8TUpqk6FpWldev0qKsKlnjkC5mg%3D/");
|
|
266
|
+
});
|
|
267
|
+
it("Should resolve url with file version", async () => {
|
|
268
|
+
// Arrange
|
|
269
|
+
const testFilePath = "data1";
|
|
270
|
+
const itemId = "item";
|
|
271
|
+
const fileVersion = "285.0";
|
|
272
|
+
const testRequest = {
|
|
273
|
+
url: `${siteUrl}?driveId=${driveId}&path=${testFilePath}&itemId=${itemId}&fileVersion=${fileVersion}`,
|
|
274
|
+
};
|
|
275
|
+
// Act
|
|
276
|
+
const resolvedUrl = await resolver.resolve(testRequest);
|
|
277
|
+
// Assert
|
|
278
|
+
assert.strictEqual(resolvedUrl.fileName, "", "FileName should be absent");
|
|
279
|
+
assert.strictEqual(resolvedUrl.driveId, driveId, "Drive id should be equal");
|
|
280
|
+
assert.strictEqual(resolvedUrl.siteUrl, siteUrl, "SiteUrl should be equal");
|
|
281
|
+
assert.strictEqual(resolvedUrl.itemId, itemId, "Item id should be equal");
|
|
282
|
+
assert.strictEqual(resolvedUrl.hashedDocumentId, await getHashedDocumentId(driveId, itemId), "Doc id should be present");
|
|
283
|
+
assert.notStrictEqual(resolvedUrl.endpoints.snapshotStorageUrl, "", "Snapshot url should be present");
|
|
284
|
+
assert.strictEqual(resolvedUrl.fileVersion, fileVersion, "FileVersion should be equal");
|
|
285
|
+
const expectedResolvedUrl = `https://placeholder/placeholder/${resolvedUrl.hashedDocumentId}/` + `${testFilePath}`;
|
|
286
|
+
assert.strictEqual(resolvedUrl.url, expectedResolvedUrl, "resolved url is wrong");
|
|
287
|
+
});
|
|
288
|
+
});
|
|
289
|
+
//# sourceMappingURL=odspDriverResolverTest.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"odspDriverResolverTest.spec.js","sourceRoot":"","sources":["../../src/test/odspDriverResolverTest.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 { DriverHeader } from \"@fluidframework/driver-definitions\";\nimport { IRequest } from \"@fluidframework/core-interfaces\";\nimport { IOdspResolvedUrl } from \"@fluidframework/odsp-driver-definitions\";\nimport { OdspDriverUrlResolver } from \"../odspDriverUrlResolver.js\";\nimport { getHashedDocumentId } from \"../odspPublicUtils.js\";\nimport { createOdspCreateContainerRequest } from \"../createOdspCreateContainerRequest.js\";\nimport { createOdspUrl } from \"../createOdspUrl.js\";\n\ndescribe(\"Odsp Driver Resolver\", () => {\n\tconst siteUrl = \"https://localhost\";\n\tconst driveId = \"driveId\";\n\tconst filePath = \"path\";\n\tconst fileName = \"fileName\";\n\tconst packageName = \"packageName\";\n\tlet resolver: OdspDriverUrlResolver;\n\tlet request: IRequest;\n\n\tbeforeEach(() => {\n\t\tresolver = new OdspDriverUrlResolver();\n\t\trequest = createOdspCreateContainerRequest(siteUrl, driveId, filePath, fileName);\n\t});\n\n\tit(\"Can create new request\", async () => {\n\t\tassert.strictEqual(\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n\t\t\trequest.headers?.[DriverHeader.createNew].fileName,\n\t\t\tfileName,\n\t\t\t\"Request should contain fileName\",\n\t\t);\n\t\tconst url = `${siteUrl}?driveId=${encodeURIComponent(driveId)}&path=${encodeURIComponent(\n\t\t\tfilePath,\n\t\t)}`;\n\t\tassert.strictEqual(request.url, url, \"Request url should match\");\n\t});\n\n\tit(\"Should resolve createNew request\", async () => {\n\t\tconst resolvedUrl = await resolver.resolve(request);\n\t\tassert.strictEqual(resolvedUrl.fileName, fileName, \"FileName should be equal\");\n\t\tassert.strictEqual(resolvedUrl.driveId, driveId, \"Drive id should be equal\");\n\t\tassert.strictEqual(resolvedUrl.siteUrl, siteUrl, \"SiteUrl should be equal\");\n\t\tassert.strictEqual(resolvedUrl.itemId, \"\", \"Item id should be absent\");\n\t\tassert.strictEqual(resolvedUrl.hashedDocumentId, \"\", \"No doc id should be present\");\n\t\tassert.strictEqual(\n\t\t\tresolvedUrl.endpoints.snapshotStorageUrl,\n\t\t\t\"\",\n\t\t\t\"Snapshot url should be empty\",\n\t\t);\n\n\t\tconst [, queryString] = request.url.split(\"?\");\n\t\tconst searchParams = new URLSearchParams(queryString);\n\t\tassert.strictEqual(searchParams.get(\"path\"), filePath, \"filePath should match\");\n\t\tassert.strictEqual(searchParams.get(\"driveId\"), driveId, \"Drive id should match\");\n\t});\n\n\tit(\"Should resolve url with a data store\", async () => {\n\t\tconst resolvedUrl = await resolver.resolve(request);\n\t\tconst expected: IOdspResolvedUrl = {\n\t\t\tendpoints: {\n\t\t\t\tsnapshotStorageUrl: \"\",\n\t\t\t\tattachmentGETStorageUrl: \"\",\n\t\t\t\tattachmentPOSTStorageUrl: \"\",\n\t\t\t\tdeltaStorageUrl: \"\",\n\t\t\t},\n\t\t\ttokens: {},\n\t\t\ttype: \"fluid\",\n\t\t\todspResolvedUrl: true,\n\t\t\tid: \"odspCreateNew\",\n\t\t\turl: \"https://https://localhost?driveId=driveId&path=path&version=null\",\n\t\t\tsiteUrl: \"https://localhost\",\n\t\t\thashedDocumentId: \"\",\n\t\t\tdriveId: \"driveId\",\n\t\t\titemId: \"\",\n\t\t\tfileName: \"fileName\",\n\t\t\tfileVersion: undefined,\n\t\t\tsummarizer: false,\n\t\t\tcodeHint: { containerPackageName: undefined },\n\t\t\tshareLinkInfo: undefined,\n\t\t\tisClpCompliantApp: undefined,\n\t\t};\n\t\tassert.deepStrictEqual(resolvedUrl, expected);\n\t\tconst response = await resolver.getAbsoluteUrl(resolvedUrl, \"/datastore\");\n\n\t\tconst [url, queryString] = response?.split(\"?\") ?? [];\n\t\tconst searchParams = new URLSearchParams(queryString);\n\t\tassert.strictEqual(searchParams.get(\"itemId\"), resolvedUrl.itemId, \"Item id should match\");\n\t\tassert.strictEqual(searchParams.get(\"driveId\"), driveId, \"Drive Id should match\");\n\t\tassert.strictEqual(searchParams.get(\"path\"), \"datastore\", \"Path should match\");\n\t\tassert.strictEqual(url, `${siteUrl}`, \"Url should match\");\n\t});\n\n\tit(\"Should add codeHint if request contains containerPackageName\", async () => {\n\t\tconst newRequest = request;\n\t\tnewRequest.url += `&containerPackageName=${encodeURIComponent(packageName)}`;\n\t\tconst resolvedUrl = await resolver.resolve(request);\n\n\t\tassert.strictEqual(\n\t\t\tresolvedUrl.codeHint?.containerPackageName,\n\t\t\tpackageName,\n\t\t\t\"containerPackageName should match\",\n\t\t);\n\t});\n\n\tit(\"Should resolve url with a string in the codeDetails package\", async () => {\n\t\tconst resolvedUrl = await resolver.resolve(request);\n\t\tconst codeDetails = {\n\t\t\tpackage: packageName,\n\t\t};\n\t\t// codeDetails is cast to any for testing the IFluidCodeDetails approach\n\t\tconst response = await resolver.getAbsoluteUrl(\n\t\t\tresolvedUrl,\n\t\t\t\"/datastore\",\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-argument, @typescript-eslint/no-explicit-any\n\t\t\tcodeDetails as any,\n\t\t);\n\n\t\tconst [url, queryString] = response?.split(\"?\") ?? [];\n\t\tconst searchParams = new URLSearchParams(queryString);\n\t\tassert.strictEqual(searchParams.get(\"itemId\"), resolvedUrl.itemId, \"Item id should match\");\n\t\tassert.strictEqual(searchParams.get(\"driveId\"), driveId, \"Drive Id should match\");\n\t\tassert.strictEqual(searchParams.get(\"path\"), \"datastore\", \"Path should match\");\n\t\tassert.strictEqual(\n\t\t\tsearchParams.get(\"containerPackageName\"),\n\t\t\tpackageName,\n\t\t\t\"ContainerPackageName should match\",\n\t\t);\n\t\tassert.strictEqual(url, `${siteUrl}`, \"Url should match\");\n\t});\n\n\tit(\"should resolve and then getAbsoluteUrl should pick dataStorePath from resolvedUrl\", async () => {\n\t\tconst resolvedUrl1 = await resolver.resolve({\n\t\t\turl: createOdspUrl({\n\t\t\t\tdriveId,\n\t\t\t\titemId: \"itemId\",\n\t\t\t\tsiteUrl,\n\t\t\t\tdataStorePath: \"datastore\",\n\t\t\t\tfileVersion: \"0.1\",\n\t\t\t\tappName: \"app\",\n\t\t\t\tcontainerPackageName: packageName,\n\t\t\t}),\n\t\t});\n\t\tconst response = await resolver.getAbsoluteUrl(resolvedUrl1, \"\");\n\n\t\tconst resolvedUrl2 = await resolver.resolve({ url: response });\n\t\tassert.strictEqual(resolvedUrl2.driveId, driveId, \"Drive id should be equal\");\n\t\tassert.strictEqual(\n\t\t\tresolvedUrl2.dataStorePath,\n\t\t\t\"datastore\",\n\t\t\t\"DataStorePath should be equal\",\n\t\t);\n\t\tassert.strictEqual(\n\t\t\tresolvedUrl2.codeHint?.containerPackageName,\n\t\t\tpackageName,\n\t\t\t\"DataStorePath should be equal\",\n\t\t);\n\t\tassert.strictEqual(resolvedUrl2.siteUrl, siteUrl, \"SiteUrl should be equal\");\n\t\tassert.strictEqual(resolvedUrl2.itemId, \"itemId\", \"Item id should be absent\");\n\t});\n\n\tit(\"Should resolve url given container package info\", async () => {\n\t\tconst resolvedUrl = await resolver.resolve(request);\n\t\tconst response = await resolver.getAbsoluteUrl(resolvedUrl, \"/datastore\", {\n\t\t\tname: packageName,\n\t\t});\n\n\t\tconst [url, queryString] = response?.split(\"?\") ?? [];\n\t\tconst searchParams = new URLSearchParams(queryString);\n\t\tassert.strictEqual(searchParams.get(\"itemId\"), resolvedUrl.itemId, \"Item id should match\");\n\t\tassert.strictEqual(searchParams.get(\"driveId\"), driveId, \"Drive Id should match\");\n\t\tassert.strictEqual(searchParams.get(\"path\"), \"datastore\", \"Path should match\");\n\t\tassert.strictEqual(\n\t\t\tsearchParams.get(\"containerPackageName\"),\n\t\t\tpackageName,\n\t\t\t\"ContainerPackageName should match\",\n\t\t);\n\t\tassert.strictEqual(url, `${siteUrl}`, \"Url should match\");\n\t});\n\n\tit(\"Should resolve url with a IFluidPackage in the codeDetails package\", async () => {\n\t\tconst resolvedUrl = await resolver.resolve(request);\n\t\tconst fluidPackage = {\n\t\t\tname: packageName,\n\t\t\tfluid: {},\n\t\t};\n\t\tconst codeDetails = { package: fluidPackage };\n\t\t// codeDetails is cast to any for testing the IFluidCodeDetails approach\n\t\tconst response = await resolver.getAbsoluteUrl(\n\t\t\tresolvedUrl,\n\t\t\t\"/datastore\",\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-argument, @typescript-eslint/no-explicit-any\n\t\t\tcodeDetails as any,\n\t\t);\n\n\t\tconst [url, queryString] = response?.split(\"?\") ?? [];\n\t\tconst searchParams = new URLSearchParams(queryString);\n\t\tassert.strictEqual(searchParams.get(\"itemId\"), resolvedUrl.itemId, \"Item id should match\");\n\t\tassert.strictEqual(searchParams.get(\"driveId\"), driveId, \"Drive Id should match\");\n\t\tassert.strictEqual(searchParams.get(\"path\"), \"datastore\", \"Path should match\");\n\t\tassert.strictEqual(\n\t\t\tsearchParams.get(\"containerPackageName\"),\n\t\t\tpackageName,\n\t\t\t\"ContainerPackageName should match\",\n\t\t);\n\t\tassert.strictEqual(url, `${siteUrl}`, \"Url should match\");\n\t});\n\n\tit(\"Should resolve url with a codeHint in the resolved url\", async () => {\n\t\tconst newRequest = request;\n\t\tnewRequest.url += `&containerPackageName=${encodeURIComponent(packageName)}`;\n\t\tconst resolvedUrl = await resolver.resolve(request);\n\t\tconst response = await resolver.getAbsoluteUrl(resolvedUrl, \"/datastore\");\n\n\t\tconst [url, queryString] = response?.split(\"?\") ?? [];\n\t\tconst searchParams = new URLSearchParams(queryString);\n\t\tassert.strictEqual(searchParams.get(\"itemId\"), resolvedUrl.itemId, \"Item id should match\");\n\t\tassert.strictEqual(searchParams.get(\"driveId\"), driveId, \"Drive Id should match\");\n\t\tassert.strictEqual(searchParams.get(\"path\"), \"datastore\", \"Path should match\");\n\t\tassert.strictEqual(\n\t\t\tsearchParams.get(\"containerPackageName\"),\n\t\t\tpackageName,\n\t\t\t\"ContainerPackageName should match\",\n\t\t);\n\t\tassert.strictEqual(url, `${siteUrl}`, \"Url should match\");\n\t});\n\n\tit(\"Should resolve url with empty file path\", async () => {\n\t\t// Arrange\n\t\tconst testFilePath = \"\";\n\t\trequest = createOdspCreateContainerRequest(siteUrl, driveId, testFilePath, fileName);\n\n\t\t// Act\n\t\tconst resolvedUrl = await resolver.resolve(request);\n\n\t\t// Assert\n\t\tassert.strictEqual(resolvedUrl.fileName, fileName, \"FileName should be equal\");\n\t\tassert.strictEqual(resolvedUrl.driveId, driveId, \"Drive id should be equal\");\n\t\tassert.strictEqual(resolvedUrl.siteUrl, siteUrl, \"SiteUrl should be equal\");\n\t\tassert.strictEqual(resolvedUrl.itemId, \"\", \"Item id should be absent\");\n\t\tassert.strictEqual(resolvedUrl.hashedDocumentId, \"\", \"No doc id should be present\");\n\t\tassert.strictEqual(\n\t\t\tresolvedUrl.endpoints.snapshotStorageUrl,\n\t\t\t\"\",\n\t\t\t\"Snapshot url should be empty\",\n\t\t);\n\t\tassert.strictEqual(\n\t\t\tresolvedUrl.codeHint?.containerPackageName,\n\t\t\tundefined,\n\t\t\t\"Container Package Name should be undefined\",\n\t\t);\n\n\t\tconst [, queryString] = request.url.split(\"?\");\n\t\tconst searchParams = new URLSearchParams(queryString);\n\t\tassert.strictEqual(searchParams.get(\"path\"), testFilePath, \"filePath should match\");\n\t\tassert.strictEqual(searchParams.get(\"driveId\"), driveId, \"Drive id should match\");\n\t});\n\n\tit(\"Should resolve url with non-empty file path and item id\", async () => {\n\t\t// Arrange\n\t\tconst testFilePath = \"data1\";\n\t\tconst itemId = \"item1\";\n\t\tconst testRequest: IRequest = {\n\t\t\turl: `${siteUrl}?driveId=${driveId}&path=${testFilePath}&itemId=${itemId}`,\n\t\t\theaders: { createNew: { fileName: `${fileName}` } },\n\t\t};\n\n\t\t// Act\n\t\tconst resolvedUrl = await resolver.resolve(testRequest);\n\n\t\t// Assert\n\t\tassert.strictEqual(resolvedUrl.fileName, fileName, \"FileName should be equal\");\n\t\tassert.strictEqual(resolvedUrl.driveId, driveId, \"Drive id should be equal\");\n\t\tassert.strictEqual(resolvedUrl.siteUrl, siteUrl, \"SiteUrl should be equal\");\n\t\tassert.strictEqual(resolvedUrl.itemId, \"\", \"Item id should be absent\");\n\t\tassert.strictEqual(resolvedUrl.hashedDocumentId, \"\", \"No doc id should be present\");\n\t\tassert.strictEqual(\n\t\t\tresolvedUrl.endpoints.snapshotStorageUrl,\n\t\t\t\"\",\n\t\t\t\"Snapshot url should be empty\",\n\t\t);\n\n\t\tconst expectedResolvedUrl =\n\t\t\t`https://${siteUrl}?driveId=${driveId}&path=${testFilePath}&itemId=${itemId}` +\n\t\t\t`&version=null`;\n\t\tassert.strictEqual(resolvedUrl.url, expectedResolvedUrl, \"resolved url is wrong\");\n\t});\n\n\tit(\"Should resolve url with file path containing 3 data object ids\", async () => {\n\t\t// Arrange\n\t\tconst testFilePath = \"data1/data2/data3\";\n\t\tconst itemId = \"item1\";\n\t\tconst testRequest: IRequest = {\n\t\t\turl: `${siteUrl}?driveId=${driveId}&path=${testFilePath}&itemId=${itemId}`,\n\t\t};\n\n\t\t// Act\n\t\tconst resolvedUrl = await resolver.resolve(testRequest);\n\n\t\t// Assert\n\t\tassert.strictEqual(resolvedUrl.fileName, \"\", \"FileName should be absent\");\n\t\tassert.strictEqual(resolvedUrl.driveId, driveId, \"Drive id should be equal\");\n\t\tassert.strictEqual(resolvedUrl.siteUrl, siteUrl, \"SiteUrl should be equal\");\n\t\tassert.strictEqual(resolvedUrl.itemId, itemId, \"Item id should be equal\");\n\t\tassert.strictEqual(\n\t\t\tresolvedUrl.hashedDocumentId,\n\t\t\tawait getHashedDocumentId(driveId, itemId),\n\t\t\t\"Doc id should be present\",\n\t\t);\n\t\tassert.notStrictEqual(\n\t\t\tresolvedUrl.endpoints.snapshotStorageUrl,\n\t\t\t\"\",\n\t\t\t\"Snapshot url should be present\",\n\t\t);\n\n\t\tconst expectedResolvedUrl =\n\t\t\t`https://placeholder/placeholder/${resolvedUrl.hashedDocumentId}/` + `${testFilePath}`;\n\t\tassert.strictEqual(resolvedUrl.url, expectedResolvedUrl, \"resolved url is wrong\");\n\t});\n\n\tit(\"Should resolve url with file path containing ending slashes\", async () => {\n\t\t// Arrange\n\t\tconst testFilePath = \"data1/data2//\";\n\t\tconst itemId = \"item1\";\n\t\tconst testRequest: IRequest = {\n\t\t\turl: `${siteUrl}?driveId=${driveId}&path=${testFilePath}&itemId=${itemId}`,\n\t\t};\n\n\t\t// Act\n\t\tconst resolvedUrl = await resolver.resolve(testRequest);\n\n\t\t// Assert\n\t\tassert.strictEqual(resolvedUrl.fileName, \"\", \"FileName should be absent\");\n\t\tassert.strictEqual(resolvedUrl.driveId, driveId, \"Drive id should be equal\");\n\t\tassert.strictEqual(resolvedUrl.siteUrl, siteUrl, \"SiteUrl should be equal\");\n\t\tassert.strictEqual(resolvedUrl.itemId, itemId, \"Item id should be equal\");\n\t\tassert.strictEqual(\n\t\t\tresolvedUrl.hashedDocumentId,\n\t\t\tawait getHashedDocumentId(driveId, itemId),\n\t\t\t\"Doc id should be present\",\n\t\t);\n\t\tassert.notStrictEqual(\n\t\t\tresolvedUrl.endpoints.snapshotStorageUrl,\n\t\t\t\"\",\n\t\t\t\"Snapshot url should be present\",\n\t\t);\n\n\t\tconst expectedResolvedUrl =\n\t\t\t`https://placeholder/placeholder/${resolvedUrl.hashedDocumentId}/` + `${testFilePath}`;\n\t\tassert.strictEqual(resolvedUrl.url, expectedResolvedUrl, \"resolved url is wrong\");\n\t});\n\n\tit(\"Should resolve url with special characters\", async () => {\n\t\t// Arrange\n\t\tconst testFilePath = \"data1/data2/!@$\";\n\t\tconst itemId = \"item!@$\";\n\t\tconst testRequest: IRequest = {\n\t\t\turl: `${siteUrl}?driveId=${driveId}&path=${testFilePath}&itemId=${itemId}`,\n\t\t};\n\n\t\t// Act\n\t\tconst resolvedUrl = await resolver.resolve(testRequest);\n\n\t\t// Assert\n\t\tassert.strictEqual(resolvedUrl.fileName, \"\", \"FileName should be absent\");\n\t\tassert.strictEqual(resolvedUrl.driveId, driveId, \"Drive id should be equal\");\n\t\tassert.strictEqual(resolvedUrl.siteUrl, siteUrl, \"SiteUrl should be equal\");\n\t\tassert.strictEqual(resolvedUrl.itemId, itemId, \"Item id should be equal\");\n\t\tassert.strictEqual(\n\t\t\tresolvedUrl.hashedDocumentId,\n\t\t\tawait getHashedDocumentId(driveId, itemId),\n\t\t\t\"Doc id should be present\",\n\t\t);\n\t\tassert.notStrictEqual(\n\t\t\tresolvedUrl.endpoints.snapshotStorageUrl,\n\t\t\t\"\",\n\t\t\t\"Snapshot url should be present\",\n\t\t);\n\n\t\tconst expectedResolvedUrl =\n\t\t\t`https://placeholder/placeholder/${resolvedUrl.hashedDocumentId}/` + `${testFilePath}`;\n\t\tassert.strictEqual(resolvedUrl.url, expectedResolvedUrl, \"resolved url is wrong\");\n\t});\n\n\tit(\"resolves urls with datastore path in url path\", async () => {\n\t\tconst absoluteUrl = \"https://localhost/datastore?driveId=driveId&itemId=&path=/\";\n\t\tconst resolvedUrl = await resolver.resolve({ url: absoluteUrl });\n\n\t\tassert.strictEqual(\n\t\t\tresolvedUrl.url,\n\t\t\t\"https://placeholder/placeholder/AV5r7rhbMqs3T5cL8TUpqk6FpWldev0qKsKlnjkC5mg%3D/\",\n\t\t);\n\t});\n\n\tit(\"Should resolve url with file version\", async () => {\n\t\t// Arrange\n\t\tconst testFilePath = \"data1\";\n\t\tconst itemId = \"item\";\n\t\tconst fileVersion = \"285.0\";\n\t\tconst testRequest: IRequest = {\n\t\t\turl: `${siteUrl}?driveId=${driveId}&path=${testFilePath}&itemId=${itemId}&fileVersion=${fileVersion}`,\n\t\t};\n\n\t\t// Act\n\t\tconst resolvedUrl = await resolver.resolve(testRequest);\n\n\t\t// Assert\n\t\tassert.strictEqual(resolvedUrl.fileName, \"\", \"FileName should be absent\");\n\t\tassert.strictEqual(resolvedUrl.driveId, driveId, \"Drive id should be equal\");\n\t\tassert.strictEqual(resolvedUrl.siteUrl, siteUrl, \"SiteUrl should be equal\");\n\t\tassert.strictEqual(resolvedUrl.itemId, itemId, \"Item id should be equal\");\n\t\tassert.strictEqual(\n\t\t\tresolvedUrl.hashedDocumentId,\n\t\t\tawait getHashedDocumentId(driveId, itemId),\n\t\t\t\"Doc id should be present\",\n\t\t);\n\t\tassert.notStrictEqual(\n\t\t\tresolvedUrl.endpoints.snapshotStorageUrl,\n\t\t\t\"\",\n\t\t\t\"Snapshot url should be present\",\n\t\t);\n\t\tassert.strictEqual(resolvedUrl.fileVersion, fileVersion, \"FileVersion should be equal\");\n\n\t\tconst expectedResolvedUrl =\n\t\t\t`https://placeholder/placeholder/${resolvedUrl.hashedDocumentId}/` + `${testFilePath}`;\n\t\tassert.strictEqual(resolvedUrl.url, expectedResolvedUrl, \"resolved url is wrong\");\n\t});\n});\n"]}
|