@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,218 @@
|
|
|
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 { stringToBuffer } from "@fluid-internal/client-utils";
|
|
7
|
+
import { MockLogger } from "@fluidframework/telemetry-utils";
|
|
8
|
+
import { parseCompactSnapshotResponse } from "../compactSnapshotParser.js";
|
|
9
|
+
import { convertToCompactSnapshot } from "../compactSnapshotWriter.js";
|
|
10
|
+
const snapshotTree = {
|
|
11
|
+
id: "SnapshotId",
|
|
12
|
+
blobs: {},
|
|
13
|
+
trees: {
|
|
14
|
+
".protocol": {
|
|
15
|
+
blobs: {
|
|
16
|
+
attributes: "bARADgIe4qmDjJl2l2zz12IM3",
|
|
17
|
+
quorumMembers: "bARBkx1nses1pHL1vKnmFUfIC",
|
|
18
|
+
quorumProposals: "bARBkx1nses1pHL1vKnmFUfIC",
|
|
19
|
+
},
|
|
20
|
+
trees: {},
|
|
21
|
+
},
|
|
22
|
+
".app": {
|
|
23
|
+
blobs: { ".metadata": "bARD4RKvW4LL1KmaUKp6hUMSp" },
|
|
24
|
+
trees: {
|
|
25
|
+
".channels": {
|
|
26
|
+
blobs: {},
|
|
27
|
+
trees: {
|
|
28
|
+
default: {
|
|
29
|
+
blobs: {
|
|
30
|
+
".component": "bARC6dCXlcrPxQHw3PeROtmKc",
|
|
31
|
+
"gc": "bARDNMoBed+nKrsf04id52iUA",
|
|
32
|
+
},
|
|
33
|
+
trees: {
|
|
34
|
+
".channels": {
|
|
35
|
+
blobs: {},
|
|
36
|
+
trees: {
|
|
37
|
+
root: { blobs: {}, trees: {} },
|
|
38
|
+
},
|
|
39
|
+
},
|
|
40
|
+
},
|
|
41
|
+
},
|
|
42
|
+
},
|
|
43
|
+
unreferenced: true,
|
|
44
|
+
},
|
|
45
|
+
".blobs": { blobs: {}, trees: {} },
|
|
46
|
+
},
|
|
47
|
+
unreferenced: true,
|
|
48
|
+
},
|
|
49
|
+
},
|
|
50
|
+
};
|
|
51
|
+
const blobContents = new Map([
|
|
52
|
+
[
|
|
53
|
+
"bARADgIe4qmDjJl2l2zz12IM3",
|
|
54
|
+
stringToBuffer(JSON.stringify({ branch: "", minimumSequenceNumber: 0, sequenceNumber: 0, term: 1 }), "utf8"),
|
|
55
|
+
],
|
|
56
|
+
["bARBkx1nses1pHL1vKnmFUfIC", stringToBuffer(JSON.stringify([]), "utf8")],
|
|
57
|
+
[
|
|
58
|
+
"bARD4RKvW4LL1KmaUKp6hUMSp",
|
|
59
|
+
stringToBuffer(JSON.stringify({ summaryFormatVersion: 1, gcFeature: 0 }), "utf8"),
|
|
60
|
+
],
|
|
61
|
+
[
|
|
62
|
+
"bARC6dCXlcrPxQHw3PeROtmKc",
|
|
63
|
+
stringToBuffer(JSON.stringify({
|
|
64
|
+
pkg: '["@fluid-example/smde"]',
|
|
65
|
+
summaryFormatVersion: 2,
|
|
66
|
+
isRootDataStore: true,
|
|
67
|
+
}), "utf8"),
|
|
68
|
+
],
|
|
69
|
+
[
|
|
70
|
+
"bARDNMoBed+nKrsf04id52iUA",
|
|
71
|
+
stringToBuffer(JSON.stringify({
|
|
72
|
+
usedRoutes: [""],
|
|
73
|
+
gcData: {
|
|
74
|
+
gcNodes: {
|
|
75
|
+
"/root": ["/default/01b197a2-0432-413b-b2c9-83a992b804c4", "/default"],
|
|
76
|
+
"/01b197a2-0432-413b-b2c9-83a992b804c4": ["/default"],
|
|
77
|
+
"/": ["/default/root", "/default/01b197a2-0432-413b-b2c9-83a992b804c4"],
|
|
78
|
+
},
|
|
79
|
+
},
|
|
80
|
+
}), "utf8"),
|
|
81
|
+
],
|
|
82
|
+
]);
|
|
83
|
+
const ops = [
|
|
84
|
+
{
|
|
85
|
+
clientId: "X",
|
|
86
|
+
clientSequenceNumber: -1,
|
|
87
|
+
contents: null,
|
|
88
|
+
minimumSequenceNumber: 0,
|
|
89
|
+
referenceSequenceNumber: -1,
|
|
90
|
+
sequenceNumber: 1,
|
|
91
|
+
timestamp: 1623883807452,
|
|
92
|
+
type: "join",
|
|
93
|
+
},
|
|
94
|
+
{
|
|
95
|
+
clientId: "Y",
|
|
96
|
+
clientSequenceNumber: -1,
|
|
97
|
+
contents: null,
|
|
98
|
+
minimumSequenceNumber: 0,
|
|
99
|
+
referenceSequenceNumber: -1,
|
|
100
|
+
sequenceNumber: 2,
|
|
101
|
+
timestamp: 1623883811928,
|
|
102
|
+
type: "join",
|
|
103
|
+
},
|
|
104
|
+
];
|
|
105
|
+
const snapshotTreeWithGroupId = {
|
|
106
|
+
id: "SnapshotId",
|
|
107
|
+
blobs: {},
|
|
108
|
+
trees: {
|
|
109
|
+
".protocol": {
|
|
110
|
+
blobs: {},
|
|
111
|
+
trees: {},
|
|
112
|
+
},
|
|
113
|
+
".app": {
|
|
114
|
+
blobs: { ".metadata": "bARD4RKvW4LL1KmaUKp6hUMSp" },
|
|
115
|
+
trees: {
|
|
116
|
+
".channels": {
|
|
117
|
+
blobs: {},
|
|
118
|
+
trees: {
|
|
119
|
+
default: {
|
|
120
|
+
blobs: {},
|
|
121
|
+
trees: {
|
|
122
|
+
dds: {
|
|
123
|
+
blobs: {},
|
|
124
|
+
trees: {},
|
|
125
|
+
},
|
|
126
|
+
},
|
|
127
|
+
groupId: "G3",
|
|
128
|
+
},
|
|
129
|
+
},
|
|
130
|
+
unreferenced: true,
|
|
131
|
+
groupId: "G2",
|
|
132
|
+
omitted: false,
|
|
133
|
+
},
|
|
134
|
+
".blobs": { blobs: {}, trees: {} },
|
|
135
|
+
},
|
|
136
|
+
unreferenced: true,
|
|
137
|
+
groupId: "G4",
|
|
138
|
+
},
|
|
139
|
+
},
|
|
140
|
+
};
|
|
141
|
+
const blobContents2 = new Map([
|
|
142
|
+
[
|
|
143
|
+
"bARD4RKvW4LL1KmaUKp6hUMSp",
|
|
144
|
+
stringToBuffer(JSON.stringify({ summaryFormatVersion: 1, gcFeature: 0 }), "utf8"),
|
|
145
|
+
],
|
|
146
|
+
]);
|
|
147
|
+
describe("Snapshot Format Conversion Tests", () => {
|
|
148
|
+
it("Conversion test", async () => {
|
|
149
|
+
const snapshotContents = {
|
|
150
|
+
snapshotTree,
|
|
151
|
+
blobContents,
|
|
152
|
+
ops,
|
|
153
|
+
sequenceNumber: 0,
|
|
154
|
+
latestSequenceNumber: 2,
|
|
155
|
+
snapshotFormatV: 1,
|
|
156
|
+
};
|
|
157
|
+
const logger = new MockLogger();
|
|
158
|
+
const compactSnapshot = convertToCompactSnapshot(snapshotContents);
|
|
159
|
+
const result = parseCompactSnapshotResponse(compactSnapshot, logger.toTelemetryLogger());
|
|
160
|
+
assert.deepStrictEqual(result.snapshotTree, snapshotTree, "Tree structure should match");
|
|
161
|
+
assert.deepStrictEqual(result.blobContents, blobContents, "Blobs content should match");
|
|
162
|
+
assert.deepStrictEqual(result.ops, ops, "Ops should match");
|
|
163
|
+
assert(result.sequenceNumber === 0, "Seq number should match");
|
|
164
|
+
assert(result.latestSequenceNumber === 2, "Latest sequence number should match");
|
|
165
|
+
assert((result.snapshotTree.id = snapshotContents.snapshotTree.id), "Snapshot id should match");
|
|
166
|
+
// Convert to compact snapshot again and then match to previous one.
|
|
167
|
+
const compactSnapshot2 = convertToCompactSnapshot(result);
|
|
168
|
+
assert.deepStrictEqual(compactSnapshot2.buffer, compactSnapshot.buffer, "Compact representation should remain same");
|
|
169
|
+
logger.assertMatchNone([{ category: "error" }]);
|
|
170
|
+
});
|
|
171
|
+
it("Conversion test with empty ops", async () => {
|
|
172
|
+
const snapshotContents = {
|
|
173
|
+
snapshotTree,
|
|
174
|
+
blobContents,
|
|
175
|
+
ops: [],
|
|
176
|
+
sequenceNumber: 0,
|
|
177
|
+
latestSequenceNumber: 2,
|
|
178
|
+
snapshotFormatV: 1,
|
|
179
|
+
};
|
|
180
|
+
const logger = new MockLogger();
|
|
181
|
+
const compactSnapshot = convertToCompactSnapshot(snapshotContents);
|
|
182
|
+
const result = parseCompactSnapshotResponse(compactSnapshot, logger.toTelemetryLogger());
|
|
183
|
+
assert.deepStrictEqual(result.snapshotTree, snapshotTree, "Tree structure should match");
|
|
184
|
+
assert.deepStrictEqual(result.blobContents, blobContents, "Blobs content should match");
|
|
185
|
+
assert.deepStrictEqual(result.ops, [], "Ops should match");
|
|
186
|
+
assert(result.sequenceNumber === 0, "Seq number should match");
|
|
187
|
+
assert(result.latestSequenceNumber === 2, "Latest sequence number should match");
|
|
188
|
+
assert((result.snapshotTree.id = snapshotContents.snapshotTree.id), "Snapshot id should match");
|
|
189
|
+
// Convert to compact snapshot again and then match to previous one.
|
|
190
|
+
const compactSnapshot2 = convertToCompactSnapshot(result);
|
|
191
|
+
assert.deepStrictEqual(compactSnapshot2.buffer, compactSnapshot.buffer, "Compact representation should remain same");
|
|
192
|
+
logger.assertMatchNone([{ category: "error" }]);
|
|
193
|
+
});
|
|
194
|
+
it("Conversion test for snapshot with GroupId", async () => {
|
|
195
|
+
const snapshotContents = {
|
|
196
|
+
snapshotTree: snapshotTreeWithGroupId,
|
|
197
|
+
blobContents: blobContents2,
|
|
198
|
+
ops,
|
|
199
|
+
sequenceNumber: 0,
|
|
200
|
+
latestSequenceNumber: 2,
|
|
201
|
+
snapshotFormatV: 1,
|
|
202
|
+
};
|
|
203
|
+
const logger = new MockLogger();
|
|
204
|
+
const compactSnapshot = convertToCompactSnapshot(snapshotContents);
|
|
205
|
+
const result = parseCompactSnapshotResponse(compactSnapshot, logger.toTelemetryLogger());
|
|
206
|
+
assert.deepStrictEqual(result.snapshotTree, snapshotTreeWithGroupId, "Tree structure should match");
|
|
207
|
+
assert.deepStrictEqual(result.blobContents, blobContents2, "Blobs content should match");
|
|
208
|
+
assert.deepStrictEqual(result.ops, ops, "Ops should match");
|
|
209
|
+
assert(result.sequenceNumber === 0, "Seq number should match");
|
|
210
|
+
assert(result.latestSequenceNumber === 2, "Latest sequence number should match");
|
|
211
|
+
assert((result.snapshotTree.id = snapshotContents.snapshotTree.id), "Snapshot id should match");
|
|
212
|
+
// Convert to compact snapshot again and then match to previous one.
|
|
213
|
+
const compactSnapshot2 = convertToCompactSnapshot(result);
|
|
214
|
+
assert.deepStrictEqual(compactSnapshot2.buffer, compactSnapshot.buffer, "Compact representation should remain same");
|
|
215
|
+
logger.assertMatchNone([{ category: "error" }]);
|
|
216
|
+
});
|
|
217
|
+
});
|
|
218
|
+
//# sourceMappingURL=snapshotFormatTests.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"snapshotFormatTests.spec.js","sourceRoot":"","sources":["../../src/test/snapshotFormatTests.spec.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { strict as assert } from \"node:assert\";\nimport { ISequencedDocumentMessage, ISnapshotTree } from \"@fluidframework/protocol-definitions\";\nimport { stringToBuffer } from \"@fluid-internal/client-utils\";\nimport { ISnapshot } from \"@fluidframework/driver-definitions\";\nimport { MockLogger } from \"@fluidframework/telemetry-utils\";\nimport { parseCompactSnapshotResponse } from \"../compactSnapshotParser.js\";\nimport { convertToCompactSnapshot } from \"../compactSnapshotWriter.js\";\n\nconst snapshotTree: ISnapshotTree = {\n\tid: \"SnapshotId\",\n\tblobs: {},\n\ttrees: {\n\t\t\".protocol\": {\n\t\t\tblobs: {\n\t\t\t\tattributes: \"bARADgIe4qmDjJl2l2zz12IM3\",\n\t\t\t\tquorumMembers: \"bARBkx1nses1pHL1vKnmFUfIC\",\n\t\t\t\tquorumProposals: \"bARBkx1nses1pHL1vKnmFUfIC\",\n\t\t\t},\n\t\t\ttrees: {},\n\t\t},\n\t\t\".app\": {\n\t\t\tblobs: { \".metadata\": \"bARD4RKvW4LL1KmaUKp6hUMSp\" },\n\t\t\ttrees: {\n\t\t\t\t\".channels\": {\n\t\t\t\t\tblobs: {},\n\t\t\t\t\ttrees: {\n\t\t\t\t\t\tdefault: {\n\t\t\t\t\t\t\tblobs: {\n\t\t\t\t\t\t\t\t\".component\": \"bARC6dCXlcrPxQHw3PeROtmKc\",\n\t\t\t\t\t\t\t\t\"gc\": \"bARDNMoBed+nKrsf04id52iUA\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\ttrees: {\n\t\t\t\t\t\t\t\t\".channels\": {\n\t\t\t\t\t\t\t\t\tblobs: {},\n\t\t\t\t\t\t\t\t\ttrees: {\n\t\t\t\t\t\t\t\t\t\troot: { blobs: {}, trees: {} },\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tunreferenced: true,\n\t\t\t\t},\n\t\t\t\t\".blobs\": { blobs: {}, trees: {} },\n\t\t\t},\n\t\t\tunreferenced: true,\n\t\t},\n\t},\n};\n\nconst blobContents = new Map<string, ArrayBuffer>([\n\t[\n\t\t\"bARADgIe4qmDjJl2l2zz12IM3\",\n\t\tstringToBuffer(\n\t\t\tJSON.stringify({ branch: \"\", minimumSequenceNumber: 0, sequenceNumber: 0, term: 1 }),\n\t\t\t\"utf8\",\n\t\t),\n\t],\n\t[\"bARBkx1nses1pHL1vKnmFUfIC\", stringToBuffer(JSON.stringify([]), \"utf8\")],\n\t[\n\t\t\"bARD4RKvW4LL1KmaUKp6hUMSp\",\n\t\tstringToBuffer(JSON.stringify({ summaryFormatVersion: 1, gcFeature: 0 }), \"utf8\"),\n\t],\n\t[\n\t\t\"bARC6dCXlcrPxQHw3PeROtmKc\",\n\t\tstringToBuffer(\n\t\t\tJSON.stringify({\n\t\t\t\tpkg: '[\"@fluid-example/smde\"]',\n\t\t\t\tsummaryFormatVersion: 2,\n\t\t\t\tisRootDataStore: true,\n\t\t\t}),\n\t\t\t\"utf8\",\n\t\t),\n\t],\n\t[\n\t\t\"bARDNMoBed+nKrsf04id52iUA\",\n\t\tstringToBuffer(\n\t\t\tJSON.stringify({\n\t\t\t\tusedRoutes: [\"\"],\n\t\t\t\tgcData: {\n\t\t\t\t\tgcNodes: {\n\t\t\t\t\t\t\"/root\": [\"/default/01b197a2-0432-413b-b2c9-83a992b804c4\", \"/default\"],\n\t\t\t\t\t\t\"/01b197a2-0432-413b-b2c9-83a992b804c4\": [\"/default\"],\n\t\t\t\t\t\t\"/\": [\"/default/root\", \"/default/01b197a2-0432-413b-b2c9-83a992b804c4\"],\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t}),\n\t\t\t\"utf8\",\n\t\t),\n\t],\n]);\n\nconst ops: ISequencedDocumentMessage[] = [\n\t{\n\t\tclientId: \"X\",\n\t\tclientSequenceNumber: -1,\n\t\tcontents: null,\n\t\tminimumSequenceNumber: 0,\n\t\treferenceSequenceNumber: -1,\n\t\tsequenceNumber: 1,\n\t\ttimestamp: 1623883807452,\n\t\ttype: \"join\",\n\t},\n\t{\n\t\tclientId: \"Y\",\n\t\tclientSequenceNumber: -1,\n\t\tcontents: null,\n\t\tminimumSequenceNumber: 0,\n\t\treferenceSequenceNumber: -1,\n\t\tsequenceNumber: 2,\n\t\ttimestamp: 1623883811928,\n\t\ttype: \"join\",\n\t},\n];\n\nconst snapshotTreeWithGroupId: ISnapshotTree = {\n\tid: \"SnapshotId\",\n\tblobs: {},\n\ttrees: {\n\t\t\".protocol\": {\n\t\t\tblobs: {},\n\t\t\ttrees: {},\n\t\t},\n\t\t\".app\": {\n\t\t\tblobs: { \".metadata\": \"bARD4RKvW4LL1KmaUKp6hUMSp\" },\n\t\t\ttrees: {\n\t\t\t\t\".channels\": {\n\t\t\t\t\tblobs: {},\n\t\t\t\t\ttrees: {\n\t\t\t\t\t\tdefault: {\n\t\t\t\t\t\t\tblobs: {},\n\t\t\t\t\t\t\ttrees: {\n\t\t\t\t\t\t\t\tdds: {\n\t\t\t\t\t\t\t\t\tblobs: {},\n\t\t\t\t\t\t\t\t\ttrees: {},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tgroupId: \"G3\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tunreferenced: true,\n\t\t\t\t\tgroupId: \"G2\",\n\t\t\t\t\tomitted: false,\n\t\t\t\t},\n\t\t\t\t\".blobs\": { blobs: {}, trees: {} },\n\t\t\t},\n\t\t\tunreferenced: true,\n\t\t\tgroupId: \"G4\",\n\t\t},\n\t},\n};\n\nconst blobContents2 = new Map<string, ArrayBuffer>([\n\t[\n\t\t\"bARD4RKvW4LL1KmaUKp6hUMSp\",\n\t\tstringToBuffer(JSON.stringify({ summaryFormatVersion: 1, gcFeature: 0 }), \"utf8\"),\n\t],\n]);\n\ndescribe(\"Snapshot Format Conversion Tests\", () => {\n\tit(\"Conversion test\", async () => {\n\t\tconst snapshotContents: ISnapshot = {\n\t\t\tsnapshotTree,\n\t\t\tblobContents,\n\t\t\tops,\n\t\t\tsequenceNumber: 0,\n\t\t\tlatestSequenceNumber: 2,\n\t\t\tsnapshotFormatV: 1,\n\t\t};\n\t\tconst logger = new MockLogger();\n\t\tconst compactSnapshot = convertToCompactSnapshot(snapshotContents);\n\t\tconst result = parseCompactSnapshotResponse(compactSnapshot, logger.toTelemetryLogger());\n\t\tassert.deepStrictEqual(result.snapshotTree, snapshotTree, \"Tree structure should match\");\n\t\tassert.deepStrictEqual(result.blobContents, blobContents, \"Blobs content should match\");\n\t\tassert.deepStrictEqual(result.ops, ops, \"Ops should match\");\n\t\tassert(result.sequenceNumber === 0, \"Seq number should match\");\n\t\tassert(result.latestSequenceNumber === 2, \"Latest sequence number should match\");\n\t\tassert(\n\t\t\t(result.snapshotTree.id = snapshotContents.snapshotTree.id),\n\t\t\t\"Snapshot id should match\",\n\t\t);\n\t\t// Convert to compact snapshot again and then match to previous one.\n\t\tconst compactSnapshot2 = convertToCompactSnapshot(result);\n\t\tassert.deepStrictEqual(\n\t\t\tcompactSnapshot2.buffer,\n\t\t\tcompactSnapshot.buffer,\n\t\t\t\"Compact representation should remain same\",\n\t\t);\n\t\tlogger.assertMatchNone([{ category: \"error\" }]);\n\t});\n\n\tit(\"Conversion test with empty ops\", async () => {\n\t\tconst snapshotContents: ISnapshot = {\n\t\t\tsnapshotTree,\n\t\t\tblobContents,\n\t\t\tops: [],\n\t\t\tsequenceNumber: 0,\n\t\t\tlatestSequenceNumber: 2,\n\t\t\tsnapshotFormatV: 1,\n\t\t};\n\t\tconst logger = new MockLogger();\n\t\tconst compactSnapshot = convertToCompactSnapshot(snapshotContents);\n\t\tconst result = parseCompactSnapshotResponse(compactSnapshot, logger.toTelemetryLogger());\n\t\tassert.deepStrictEqual(result.snapshotTree, snapshotTree, \"Tree structure should match\");\n\t\tassert.deepStrictEqual(result.blobContents, blobContents, \"Blobs content should match\");\n\t\tassert.deepStrictEqual(result.ops, [], \"Ops should match\");\n\t\tassert(result.sequenceNumber === 0, \"Seq number should match\");\n\t\tassert(result.latestSequenceNumber === 2, \"Latest sequence number should match\");\n\t\tassert(\n\t\t\t(result.snapshotTree.id = snapshotContents.snapshotTree.id),\n\t\t\t\"Snapshot id should match\",\n\t\t);\n\t\t// Convert to compact snapshot again and then match to previous one.\n\t\tconst compactSnapshot2 = convertToCompactSnapshot(result);\n\t\tassert.deepStrictEqual(\n\t\t\tcompactSnapshot2.buffer,\n\t\t\tcompactSnapshot.buffer,\n\t\t\t\"Compact representation should remain same\",\n\t\t);\n\t\tlogger.assertMatchNone([{ category: \"error\" }]);\n\t});\n\n\tit(\"Conversion test for snapshot with GroupId\", async () => {\n\t\tconst snapshotContents: ISnapshot = {\n\t\t\tsnapshotTree: snapshotTreeWithGroupId,\n\t\t\tblobContents: blobContents2,\n\t\t\tops,\n\t\t\tsequenceNumber: 0,\n\t\t\tlatestSequenceNumber: 2,\n\t\t\tsnapshotFormatV: 1,\n\t\t};\n\t\tconst logger = new MockLogger();\n\t\tconst compactSnapshot = convertToCompactSnapshot(snapshotContents);\n\t\tconst result = parseCompactSnapshotResponse(compactSnapshot, logger.toTelemetryLogger());\n\t\tassert.deepStrictEqual(\n\t\t\tresult.snapshotTree,\n\t\t\tsnapshotTreeWithGroupId,\n\t\t\t\"Tree structure should match\",\n\t\t);\n\t\tassert.deepStrictEqual(result.blobContents, blobContents2, \"Blobs content should match\");\n\t\tassert.deepStrictEqual(result.ops, ops, \"Ops should match\");\n\t\tassert(result.sequenceNumber === 0, \"Seq number should match\");\n\t\tassert(result.latestSequenceNumber === 2, \"Latest sequence number should match\");\n\t\tassert(\n\t\t\t(result.snapshotTree.id = snapshotContents.snapshotTree.id),\n\t\t\t\"Snapshot id should match\",\n\t\t);\n\t\t// Convert to compact snapshot again and then match to previous one.\n\t\tconst compactSnapshot2 = convertToCompactSnapshot(result);\n\t\tassert.deepStrictEqual(\n\t\t\tcompactSnapshot2.buffer,\n\t\t\tcompactSnapshot.buffer,\n\t\t\t\"Compact representation should remain same\",\n\t\t);\n\t\tlogger.assertMatchNone([{ category: \"error\" }]);\n\t});\n});\n"]}
|
|
@@ -0,0 +1,152 @@
|
|
|
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 { stub, useFakeTimers } from "sinon";
|
|
7
|
+
import { MockLogger } from "@fluidframework/telemetry-utils";
|
|
8
|
+
import { EpochTracker } from "../../epochTracker.js";
|
|
9
|
+
import { LocalPersistentCache } from "../../odspCache.js";
|
|
10
|
+
import { getHashedDocumentId } from "../../odspPublicUtils.js";
|
|
11
|
+
import * as socketModule from "../../socketModule.js";
|
|
12
|
+
import * as joinSession from "../../vroom.js";
|
|
13
|
+
import { OdspDocumentServiceFactory } from "../../odspDocumentServiceFactory.js";
|
|
14
|
+
import { createOdspUrl } from "../../createOdspUrl.js";
|
|
15
|
+
import { OdspDriverUrlResolver } from "../../odspDriverUrlResolver.js";
|
|
16
|
+
import { ClientSocketMock } from "./socketMock.js";
|
|
17
|
+
describe("DeltaConnectionMetadata update tests", () => {
|
|
18
|
+
let clock;
|
|
19
|
+
const client = {
|
|
20
|
+
mode: "write",
|
|
21
|
+
scopes: ["doc:read", "doc:write"],
|
|
22
|
+
details: { capabilities: { interactive: true } },
|
|
23
|
+
permission: [],
|
|
24
|
+
user: { id: "userId" },
|
|
25
|
+
};
|
|
26
|
+
let logger;
|
|
27
|
+
const siteUrl = "https://microsoft.sharepoint-df.com/siteUrl";
|
|
28
|
+
const driveId = "driveId";
|
|
29
|
+
const itemId = "itemId";
|
|
30
|
+
let epochTracker;
|
|
31
|
+
let localCache;
|
|
32
|
+
let hashedDocumentId;
|
|
33
|
+
let service;
|
|
34
|
+
let socket;
|
|
35
|
+
const resolver = new OdspDriverUrlResolver();
|
|
36
|
+
const joinSessionResponse = {
|
|
37
|
+
deltaStorageUrl: "https://fake/deltaStorageUrl",
|
|
38
|
+
deltaStreamSocketUrl: "https://localhost:3001",
|
|
39
|
+
id: "id",
|
|
40
|
+
tenantId: "tenantId",
|
|
41
|
+
snapshotStorageUrl: "https://fake/snapshotStorageUrl",
|
|
42
|
+
refreshSessionDurationSeconds: 100,
|
|
43
|
+
};
|
|
44
|
+
let odspDocumentServiceFactory;
|
|
45
|
+
// Stash the real setTimeout because sinon fake timers will hijack it.
|
|
46
|
+
const realSetTimeout = setTimeout;
|
|
47
|
+
// function to yield control in the Javascript event loop.
|
|
48
|
+
async function yieldEventLoop() {
|
|
49
|
+
await new Promise((resolve) => {
|
|
50
|
+
realSetTimeout(resolve, 0);
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
async function tickClock(tickValue) {
|
|
54
|
+
clock.tick(tickValue);
|
|
55
|
+
// Yield the event loop because the outbound op will be processed asynchronously.
|
|
56
|
+
await yieldEventLoop();
|
|
57
|
+
}
|
|
58
|
+
function addJoinSessionStub(label) {
|
|
59
|
+
joinSessionResponse.sensitivityLabelsInfo = JSON.stringify({
|
|
60
|
+
labels: label,
|
|
61
|
+
timestamp: Date.now(),
|
|
62
|
+
});
|
|
63
|
+
const joinSessionStub = stub(joinSession, "fetchJoinSession").callsFake(async () => joinSessionResponse);
|
|
64
|
+
return joinSessionStub;
|
|
65
|
+
}
|
|
66
|
+
before(async () => {
|
|
67
|
+
hashedDocumentId = await getHashedDocumentId(driveId, itemId);
|
|
68
|
+
});
|
|
69
|
+
beforeEach(async () => {
|
|
70
|
+
clock = useFakeTimers();
|
|
71
|
+
odspDocumentServiceFactory = new OdspDocumentServiceFactory(async (_options) => "token", async (_options) => "token", new LocalPersistentCache(2000), { snapshotOptions: { timeout: 2000 } });
|
|
72
|
+
const locator = { driveId, itemId, siteUrl, dataStorePath: "/" };
|
|
73
|
+
const request = createOdspUrl(locator);
|
|
74
|
+
const resolvedUrl = await resolver.resolve({ url: request });
|
|
75
|
+
logger = new MockLogger().toTelemetryLogger();
|
|
76
|
+
epochTracker = new EpochTracker(localCache, {
|
|
77
|
+
docId: hashedDocumentId,
|
|
78
|
+
resolvedUrl,
|
|
79
|
+
}, logger);
|
|
80
|
+
service = (await odspDocumentServiceFactory.createDocumentService(resolvedUrl, logger));
|
|
81
|
+
});
|
|
82
|
+
async function mockSocket(_response, callback) {
|
|
83
|
+
const getSocketCreationStub = stub(socketModule, "SocketIOClientStatic");
|
|
84
|
+
getSocketCreationStub.returns(_response);
|
|
85
|
+
try {
|
|
86
|
+
return await callback();
|
|
87
|
+
}
|
|
88
|
+
finally {
|
|
89
|
+
getSocketCreationStub.restore();
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
it("Delta connection metadata should be updated via Fluid signals and join session response", async () => {
|
|
93
|
+
await tickClock(1);
|
|
94
|
+
socket = new ClientSocketMock();
|
|
95
|
+
let eventRaised = false;
|
|
96
|
+
let content;
|
|
97
|
+
const handler = (metadata) => {
|
|
98
|
+
eventRaised = true;
|
|
99
|
+
assert.strictEqual(
|
|
100
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
|
|
101
|
+
JSON.parse(metadata.sensitivityLabelsInfo).labels, content.labels, "label via event should match");
|
|
102
|
+
};
|
|
103
|
+
let joinSessionStub = addJoinSessionStub("label1");
|
|
104
|
+
content = { labels: "label1" };
|
|
105
|
+
service.on("metadataUpdate", handler);
|
|
106
|
+
const connection = (await mockSocket(socket, async () => service.connectToDeltaStream(client)));
|
|
107
|
+
assert(eventRaised, "event1 should have been raised");
|
|
108
|
+
service.off("metadataUpdate", handler);
|
|
109
|
+
joinSessionStub.restore();
|
|
110
|
+
assert(!connection.disposed, "connection should not be disposed");
|
|
111
|
+
assert(joinSessionStub.calledOnce, "Should called once on first try");
|
|
112
|
+
await tickClock(1);
|
|
113
|
+
// Now change label through signal and listen as event on service.
|
|
114
|
+
// eslint-disable-next-line require-atomic-updates
|
|
115
|
+
eventRaised = false;
|
|
116
|
+
content = { labels: "label2" };
|
|
117
|
+
const signalContent1 = { labels: "label2", timestamp: Date.now() };
|
|
118
|
+
const signalMessage1 = {
|
|
119
|
+
clientId: null,
|
|
120
|
+
content: JSON.stringify({
|
|
121
|
+
contents: {
|
|
122
|
+
type: "PolicyLabelsUpdate",
|
|
123
|
+
content: signalContent1,
|
|
124
|
+
},
|
|
125
|
+
}),
|
|
126
|
+
};
|
|
127
|
+
service.on("metadataUpdate", handler);
|
|
128
|
+
socket.emit("signal", signalMessage1);
|
|
129
|
+
assert(eventRaised, "event2 should have been raised");
|
|
130
|
+
service.off("metadataUpdate", handler);
|
|
131
|
+
await tickClock(1);
|
|
132
|
+
// Now update through join session response
|
|
133
|
+
// eslint-disable-next-line require-atomic-updates
|
|
134
|
+
eventRaised = false;
|
|
135
|
+
content = { labels: "label3" };
|
|
136
|
+
service.on("metadataUpdate", handler);
|
|
137
|
+
joinSessionStub = addJoinSessionStub("label3");
|
|
138
|
+
await tickClock(70000);
|
|
139
|
+
joinSessionStub.restore();
|
|
140
|
+
assert(eventRaised, "event3 should have been raised");
|
|
141
|
+
service.off("metadataUpdate", handler);
|
|
142
|
+
});
|
|
143
|
+
afterEach(async () => {
|
|
144
|
+
clock.reset();
|
|
145
|
+
socket?.close();
|
|
146
|
+
await epochTracker.removeEntries().catch(() => { });
|
|
147
|
+
});
|
|
148
|
+
afterEach(async () => {
|
|
149
|
+
clock.restore();
|
|
150
|
+
});
|
|
151
|
+
});
|
|
152
|
+
//# sourceMappingURL=deltaConnectionUpdateTests.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deltaConnectionUpdateTests.spec.js","sourceRoot":"","sources":["../../../src/test/socketTests/deltaConnectionUpdateTests.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 { stub, useFakeTimers, SinonFakeTimers, type SinonStub } from \"sinon\";\nimport { ISocketStorageDiscovery } from \"@fluidframework/odsp-driver-definitions\";\nimport { IClient, ISignalMessage } from \"@fluidframework/protocol-definitions\";\nimport { ITelemetryLoggerExt, MockLogger } from \"@fluidframework/telemetry-utils\";\nimport { Socket } from \"socket.io-client\";\nimport { EpochTracker } from \"../../epochTracker.js\";\nimport { LocalPersistentCache } from \"../../odspCache.js\";\nimport { getHashedDocumentId } from \"../../odspPublicUtils.js\";\nimport { OdspDocumentDeltaConnection } from \"../../odspDocumentDeltaConnection.js\";\nimport * as socketModule from \"../../socketModule.js\";\nimport * as joinSession from \"../../vroom.js\";\nimport { OdspDocumentService } from \"../../odspDocumentService.js\";\nimport { OdspDocumentServiceFactory } from \"../../odspDocumentServiceFactory.js\";\nimport { OdspFluidDataStoreLocator } from \"../../contractsPublic.js\";\nimport { createOdspUrl } from \"../../createOdspUrl.js\";\nimport { OdspDriverUrlResolver } from \"../../odspDriverUrlResolver.js\";\nimport { ClientSocketMock } from \"./socketMock.js\";\n\ndescribe(\"DeltaConnectionMetadata update tests\", () => {\n\tlet clock: SinonFakeTimers;\n\tconst client: IClient = {\n\t\tmode: \"write\",\n\t\tscopes: [\"doc:read\", \"doc:write\"],\n\t\tdetails: { capabilities: { interactive: true } },\n\t\tpermission: [],\n\t\tuser: { id: \"userId\" },\n\t};\n\n\tlet logger: ITelemetryLoggerExt;\n\tconst siteUrl = \"https://microsoft.sharepoint-df.com/siteUrl\";\n\tconst driveId = \"driveId\";\n\tconst itemId = \"itemId\";\n\tlet epochTracker: EpochTracker;\n\tlet localCache: LocalPersistentCache;\n\tlet hashedDocumentId: string;\n\tlet service: OdspDocumentService;\n\tlet socket: ClientSocketMock | undefined;\n\tconst resolver = new OdspDriverUrlResolver();\n\tconst joinSessionResponse: ISocketStorageDiscovery = {\n\t\tdeltaStorageUrl: \"https://fake/deltaStorageUrl\",\n\t\tdeltaStreamSocketUrl: \"https://localhost:3001\",\n\t\tid: \"id\",\n\t\ttenantId: \"tenantId\",\n\t\tsnapshotStorageUrl: \"https://fake/snapshotStorageUrl\",\n\t\trefreshSessionDurationSeconds: 100,\n\t};\n\tlet odspDocumentServiceFactory: OdspDocumentServiceFactory;\n\n\t// Stash the real setTimeout because sinon fake timers will hijack it.\n\tconst realSetTimeout = setTimeout;\n\n\t// function to yield control in the Javascript event loop.\n\tasync function yieldEventLoop(): Promise<void> {\n\t\tawait new Promise<void>((resolve) => {\n\t\t\trealSetTimeout(resolve, 0);\n\t\t});\n\t}\n\n\tasync function tickClock(tickValue: number): Promise<void> {\n\t\tclock.tick(tickValue);\n\n\t\t// Yield the event loop because the outbound op will be processed asynchronously.\n\t\tawait yieldEventLoop();\n\t}\n\n\tfunction addJoinSessionStub(label: string): SinonStub {\n\t\tjoinSessionResponse.sensitivityLabelsInfo = JSON.stringify({\n\t\t\tlabels: label,\n\t\t\ttimestamp: Date.now(),\n\t\t});\n\t\tconst joinSessionStub = stub(joinSession, \"fetchJoinSession\").callsFake(\n\t\t\tasync () => joinSessionResponse,\n\t\t);\n\t\treturn joinSessionStub;\n\t}\n\n\tbefore(async () => {\n\t\thashedDocumentId = await getHashedDocumentId(driveId, itemId);\n\t});\n\n\tbeforeEach(async () => {\n\t\tclock = useFakeTimers();\n\t\todspDocumentServiceFactory = new OdspDocumentServiceFactory(\n\t\t\tasync (_options) => \"token\",\n\t\t\tasync (_options) => \"token\",\n\t\t\tnew LocalPersistentCache(2000),\n\t\t\t{ snapshotOptions: { timeout: 2000 } },\n\t\t);\n\t\tconst locator: OdspFluidDataStoreLocator = { driveId, itemId, siteUrl, dataStorePath: \"/\" };\n\t\tconst request = createOdspUrl(locator);\n\t\tconst resolvedUrl = await resolver.resolve({ url: request });\n\t\tlogger = new MockLogger().toTelemetryLogger();\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\n\t\tservice = (await odspDocumentServiceFactory.createDocumentService(\n\t\t\tresolvedUrl,\n\t\t\tlogger,\n\t\t)) as OdspDocumentService;\n\t});\n\n\tasync function mockSocket<T>(_response: Socket, callback: () => Promise<T>): Promise<T> {\n\t\tconst getSocketCreationStub = stub(socketModule, \"SocketIOClientStatic\");\n\t\tgetSocketCreationStub.returns(_response);\n\t\ttry {\n\t\t\treturn await callback();\n\t\t} finally {\n\t\t\tgetSocketCreationStub.restore();\n\t\t}\n\t}\n\n\tit(\"Delta connection metadata should be updated via Fluid signals and join session response\", async () => {\n\t\tawait tickClock(1);\n\t\tsocket = new ClientSocketMock();\n\t\tlet eventRaised = false;\n\t\tlet content: Record<string, string>;\n\n\t\tconst handler = (metadata: Record<string, string>): void => {\n\t\t\teventRaised = true;\n\t\t\tassert.strictEqual(\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n\t\t\t\tJSON.parse(metadata.sensitivityLabelsInfo).labels,\n\t\t\t\tcontent.labels,\n\t\t\t\t\"label via event should match\",\n\t\t\t);\n\t\t};\n\n\t\tlet joinSessionStub = addJoinSessionStub(\"label1\");\n\n\t\tcontent = { labels: \"label1\" };\n\t\tservice.on(\"metadataUpdate\", handler);\n\t\tconst connection = (await mockSocket(socket as unknown as Socket, async () =>\n\t\t\tservice.connectToDeltaStream(client),\n\t\t)) as OdspDocumentDeltaConnection;\n\t\tassert(eventRaised, \"event1 should have been raised\");\n\t\tservice.off(\"metadataUpdate\", handler);\n\t\tjoinSessionStub.restore();\n\n\t\tassert(!connection.disposed, \"connection should not be disposed\");\n\n\t\tassert(joinSessionStub.calledOnce, \"Should called once on first try\");\n\n\t\tawait tickClock(1);\n\n\t\t// Now change label through signal and listen as event on service.\n\t\t// eslint-disable-next-line require-atomic-updates\n\t\teventRaised = false;\n\t\tcontent = { labels: \"label2\" };\n\t\tconst signalContent1 = { labels: \"label2\", timestamp: Date.now() };\n\t\tconst signalMessage1: ISignalMessage = {\n\t\t\tclientId: null,\n\t\t\tcontent: JSON.stringify({\n\t\t\t\tcontents: {\n\t\t\t\t\ttype: \"PolicyLabelsUpdate\",\n\t\t\t\t\tcontent: signalContent1,\n\t\t\t\t},\n\t\t\t}),\n\t\t};\n\n\t\tservice.on(\"metadataUpdate\", handler);\n\n\t\tsocket.emit(\"signal\", signalMessage1);\n\t\tassert(eventRaised, \"event2 should have been raised\");\n\t\tservice.off(\"metadataUpdate\", handler);\n\n\t\tawait tickClock(1);\n\n\t\t// Now update through join session response\n\t\t// eslint-disable-next-line require-atomic-updates\n\t\teventRaised = false;\n\t\tcontent = { labels: \"label3\" };\n\t\tservice.on(\"metadataUpdate\", handler);\n\t\tjoinSessionStub = addJoinSessionStub(\"label3\");\n\t\tawait tickClock(70000);\n\t\tjoinSessionStub.restore();\n\t\tassert(eventRaised, \"event3 should have been raised\");\n\t\tservice.off(\"metadataUpdate\", handler);\n\t});\n\n\tafterEach(async () => {\n\t\tclock.reset();\n\t\tsocket?.close();\n\t\tawait epochTracker.removeEntries().catch(() => {});\n\t});\n\n\tafterEach(async () => {\n\t\tclock.restore();\n\t});\n});\n"]}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* Copyright (c) Microsoft Corporation and contributors. All rights reserved.
|
|
3
|
+
* Licensed under the MIT License.
|
|
4
|
+
*/
|
|
5
|
+
import { v4 as uuid } from "uuid";
|
|
6
|
+
import { TypedEventEmitter } from "@fluid-internal/client-utils";
|
|
7
|
+
import { createGenericNetworkError } from "@fluidframework/driver-utils";
|
|
8
|
+
import { ScopeType } from "@fluidframework/protocol-definitions";
|
|
9
|
+
import { pkgVersion as driverVersion } from "../../packageVersion.js";
|
|
10
|
+
/**
|
|
11
|
+
* Class to mock the client socket connection. It can intercepts the events made on the socket
|
|
12
|
+
* and then do its custom logic and can also send events to the client back.
|
|
13
|
+
*/
|
|
14
|
+
export class ClientSocketMock extends TypedEventEmitter {
|
|
15
|
+
constructor(mockSocketConnectResponse = {
|
|
16
|
+
connect_document: { eventToEmit: "connect_document_success" },
|
|
17
|
+
}) {
|
|
18
|
+
super();
|
|
19
|
+
this.mockSocketConnectResponse = mockSocketConnectResponse;
|
|
20
|
+
this.disconnected = false;
|
|
21
|
+
}
|
|
22
|
+
get connected() {
|
|
23
|
+
return !this.disconnected;
|
|
24
|
+
}
|
|
25
|
+
close() {
|
|
26
|
+
this.disconnect();
|
|
27
|
+
}
|
|
28
|
+
disconnect() {
|
|
29
|
+
this.disconnected = true;
|
|
30
|
+
}
|
|
31
|
+
get io() {
|
|
32
|
+
return {
|
|
33
|
+
reconnection: () => false,
|
|
34
|
+
reconnectionAttempts: () => 0,
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
sendDisconnectEvent(reason, details) {
|
|
38
|
+
const error = reason ??
|
|
39
|
+
createGenericNetworkError("TestError", { canRetry: false }, { driverVersion });
|
|
40
|
+
this.emit("disconnect", error, details);
|
|
41
|
+
}
|
|
42
|
+
sendErrorEvent(error) {
|
|
43
|
+
this.emit("error", error ?? createGenericNetworkError("TestError", { canRetry: false }, { driverVersion }));
|
|
44
|
+
}
|
|
45
|
+
sendServerDisconnectEvent(socketError, clientId) {
|
|
46
|
+
if (clientId === undefined) {
|
|
47
|
+
this.disconnect();
|
|
48
|
+
}
|
|
49
|
+
this.emit("server_disconnect", socketError, clientId);
|
|
50
|
+
}
|
|
51
|
+
emit(eventName, ...args) {
|
|
52
|
+
switch (eventName) {
|
|
53
|
+
case "connect_document": {
|
|
54
|
+
const connectMessage = args[0];
|
|
55
|
+
switch (this.mockSocketConnectResponse.connect_document.eventToEmit) {
|
|
56
|
+
case "connect_document_error":
|
|
57
|
+
case "connect_error": {
|
|
58
|
+
const errorToThrow = this.mockSocketConnectResponse.connect_document.errorToThrow ??
|
|
59
|
+
createGenericNetworkError("TestError", { canRetry: false }, { driverVersion });
|
|
60
|
+
this.emit(this.mockSocketConnectResponse.connect_document.eventToEmit, errorToThrow);
|
|
61
|
+
break;
|
|
62
|
+
}
|
|
63
|
+
case "connect_document_success": {
|
|
64
|
+
const iConnected = this.mockSocketConnectResponse
|
|
65
|
+
.connect_document.connectMessage ?? {
|
|
66
|
+
clientId: uuid(),
|
|
67
|
+
existing: true,
|
|
68
|
+
initialClients: [],
|
|
69
|
+
initialMessages: [],
|
|
70
|
+
initialSignals: [],
|
|
71
|
+
maxMessageSize: 1000,
|
|
72
|
+
mode: connectMessage.mode,
|
|
73
|
+
version: connectMessage.versions[0],
|
|
74
|
+
serviceConfiguration: { maxMessageSize: 1000, blockSize: 1000 },
|
|
75
|
+
claims: {
|
|
76
|
+
documentId: connectMessage.id,
|
|
77
|
+
scopes: [
|
|
78
|
+
ScopeType.DocWrite,
|
|
79
|
+
ScopeType.DocRead,
|
|
80
|
+
ScopeType.SummaryWrite,
|
|
81
|
+
],
|
|
82
|
+
tenantId: connectMessage.tenantId,
|
|
83
|
+
ver: "1.0.0",
|
|
84
|
+
iat: 10,
|
|
85
|
+
exp: 10,
|
|
86
|
+
user: connectMessage.client.user,
|
|
87
|
+
},
|
|
88
|
+
supportedVersions: connectMessage.versions,
|
|
89
|
+
epoch: "testEpoch",
|
|
90
|
+
};
|
|
91
|
+
this.emit("connect_document_success", iConnected);
|
|
92
|
+
break;
|
|
93
|
+
}
|
|
94
|
+
case "connect_timeout": {
|
|
95
|
+
this.emit("connect_timeout");
|
|
96
|
+
break;
|
|
97
|
+
}
|
|
98
|
+
default: // No-op
|
|
99
|
+
}
|
|
100
|
+
return true;
|
|
101
|
+
}
|
|
102
|
+
default: {
|
|
103
|
+
super.emit(eventName, ...args);
|
|
104
|
+
return true;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
//# sourceMappingURL=socketMock.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"socketMock.js","sourceRoot":"","sources":["../../../src/test/socketTests/socketMock.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,EAAE,IAAI,IAAI,EAAE,MAAM,MAAM,CAAC;AAClC,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AAGjE,OAAO,EAAE,yBAAyB,EAAE,MAAM,8BAA8B,CAAC;AACzE,OAAO,EAAwB,SAAS,EAAE,MAAM,sCAAsC,CAAC;AACvF,OAAO,EAAE,UAAU,IAAI,aAAa,EAAE,MAAM,yBAAyB,CAAC;AA+BtE;;;GAGG;AACH,MAAM,OAAO,gBAAiB,SAAQ,iBAAmC;IAExE,YACkB,4BAAwD;QACxE,gBAAgB,EAAE,EAAE,WAAW,EAAE,0BAA0B,EAAE;KAC7D;QAED,KAAK,EAAE,CAAC;QAJS,8BAAyB,GAAzB,yBAAyB,CAEzC;QAJK,iBAAY,GAAG,KAAK,CAAC;IAO5B,CAAC;IAED,IAAW,SAAS;QACnB,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC;IAC3B,CAAC;IAEM,KAAK;QACX,IAAI,CAAC,UAAU,EAAE,CAAC;IACnB,CAAC;IAEM,UAAU;QAChB,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;IAC1B,CAAC;IAED,IAAW,EAAE;QAIZ,OAAO;YACN,YAAY,EAAE,GAAG,EAAE,CAAC,KAAK;YACzB,oBAAoB,EAAE,GAAG,EAAE,CAAC,CAAC;SAC7B,CAAC;IACH,CAAC;IAEM,mBAAmB,CACzB,MAAwB,EACxB,OAAuD;QAEvD,MAAM,KAAK,GACV,MAAM;YACN,yBAAyB,CAAC,WAAW,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,EAAE,aAAa,EAAE,CAAC,CAAC;QAChF,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;IACzC,CAAC;IAEM,cAAc,CAAC,KAAuB;QAC5C,IAAI,CAAC,IAAI,CACR,OAAO,EACP,KAAK,IAAI,yBAAyB,CAAC,WAAW,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,EAAE,aAAa,EAAE,CAAC,CACvF,CAAC;IACH,CAAC;IAEM,yBAAyB,CAAC,WAA6B,EAAE,QAAiB;QAChF,IAAI,QAAQ,KAAK,SAAS,EAAE;YAC3B,IAAI,CAAC,UAAU,EAAE,CAAC;SAClB;QACD,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAC;IACvD,CAAC;IAEM,IAAI,CAAC,SAAiB,EAAE,GAAG,IAAe;QAChD,QAAQ,SAAS,EAAE;YAClB,KAAK,kBAAkB,CAAC,CAAC;gBACxB,MAAM,cAAc,GAAG,IAAI,CAAC,CAAC,CAAa,CAAC;gBAC3C,QAAQ,IAAI,CAAC,yBAAyB,CAAC,gBAAgB,CAAC,WAAW,EAAE;oBACpE,KAAK,wBAAwB,CAAC;oBAC9B,KAAK,eAAe,CAAC,CAAC;wBACrB,MAAM,YAAY,GACjB,IAAI,CAAC,yBAAyB,CAAC,gBAAgB,CAAC,YAAY;4BAC5D,yBAAyB,CACxB,WAAW,EACX,EAAE,QAAQ,EAAE,KAAK,EAAE,EACnB,EAAE,aAAa,EAAE,CACjB,CAAC;wBACH,IAAI,CAAC,IAAI,CACR,IAAI,CAAC,yBAAyB,CAAC,gBAAgB,CAAC,WAAW,EAC3D,YAAY,CACZ,CAAC;wBACF,MAAM;qBACN;oBACD,KAAK,0BAA0B,CAAC,CAAC;wBAChC,MAAM,UAAU,GAAe,IAAI,CAAC,yBAAyB;6BAC3D,gBAAgB,CAAC,cAAc,IAAI;4BACpC,QAAQ,EAAE,IAAI,EAAE;4BAChB,QAAQ,EAAE,IAAI;4BACd,cAAc,EAAE,EAAE;4BAClB,eAAe,EAAE,EAAE;4BACnB,cAAc,EAAE,EAAE;4BAClB,cAAc,EAAE,IAAI;4BACpB,IAAI,EAAE,cAAc,CAAC,IAAI;4BACzB,OAAO,EAAE,cAAc,CAAC,QAAQ,CAAC,CAAC,CAAC;4BACnC,oBAAoB,EAAE,EAAE,cAAc,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE;4BAC/D,MAAM,EAAE;gCACP,UAAU,EAAE,cAAc,CAAC,EAAE;gCAC7B,MAAM,EAAE;oCACP,SAAS,CAAC,QAAQ;oCAClB,SAAS,CAAC,OAAO;oCACjB,SAAS,CAAC,YAAY;iCACtB;gCACD,QAAQ,EAAE,cAAc,CAAC,QAAQ;gCACjC,GAAG,EAAE,OAAO;gCACZ,GAAG,EAAE,EAAE;gCACP,GAAG,EAAE,EAAE;gCACP,IAAI,EAAE,cAAc,CAAC,MAAM,CAAC,IAAI;6BAChC;4BACD,iBAAiB,EAAE,cAAc,CAAC,QAAQ;4BAC1C,KAAK,EAAE,WAAW;yBAClB,CAAC;wBACF,IAAI,CAAC,IAAI,CAAC,0BAA0B,EAAE,UAAU,CAAC,CAAC;wBAClD,MAAM;qBACN;oBACD,KAAK,iBAAiB,CAAC,CAAC;wBACvB,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;wBAC7B,MAAM;qBACN;oBACD,QAAQ,CAAC,QAAQ;iBACjB;gBACD,OAAO,IAAI,CAAC;aACZ;YACD,OAAO,CAAC,CAAC;gBACR,KAAK,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,IAAI,CAAC,CAAC;gBAC/B,OAAO,IAAI,CAAC;aACZ;SACD;IACF,CAAC;CACD","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { v4 as uuid } from \"uuid\";\nimport { TypedEventEmitter } from \"@fluid-internal/client-utils\";\nimport { IEvent } from \"@fluidframework/core-interfaces\";\nimport { IAnyDriverError } from \"@fluidframework/driver-definitions\";\nimport { createGenericNetworkError } from \"@fluidframework/driver-utils\";\nimport { IConnect, IConnected, ScopeType } from \"@fluidframework/protocol-definitions\";\nimport { pkgVersion as driverVersion } from \"../../packageVersion.js\";\nimport { IOdspSocketError } from \"../../contracts.js\";\n\nexport interface SocketMockEvents extends IEvent {\n\t(event: \"disconnect\", listener: (reason?: IAnyDriverError, details?: unknown) => void): void;\n\t(event: \"error\", listener: (error?: IAnyDriverError) => void): void;\n\t(\n\t\tevent: \"server_disconnect\",\n\t\tlistener: (socketError: IOdspSocketError, clientId?: string) => void,\n\t): void;\n}\n\nexport interface IMockSocketConnectResponse {\n\tconnect_document:\n\t\t| {\n\t\t\t\teventToEmit: \"connect_document_success\";\n\t\t\t\tconnectMessage?: IConnected;\n\t\t }\n\t\t| {\n\t\t\t\teventToEmit: \"connect_document_error\";\n\t\t\t\terrorToThrow?: IAnyDriverError;\n\t\t }\n\t\t| {\n\t\t\t\teventToEmit: \"connect_error\";\n\t\t\t\terrorToThrow?: IAnyDriverError;\n\t\t }\n\t\t| {\n\t\t\t\teventToEmit: \"connect_timeout\";\n\t\t };\n}\n\n/**\n * Class to mock the client socket connection. It can intercepts the events made on the socket\n * and then do its custom logic and can also send events to the client back.\n */\nexport class ClientSocketMock extends TypedEventEmitter<SocketMockEvents> {\n\tpublic disconnected = false;\n\tconstructor(\n\t\tprivate readonly mockSocketConnectResponse: IMockSocketConnectResponse = {\n\t\t\tconnect_document: { eventToEmit: \"connect_document_success\" },\n\t\t},\n\t) {\n\t\tsuper();\n\t}\n\n\tpublic get connected(): boolean {\n\t\treturn !this.disconnected;\n\t}\n\n\tpublic close(): void {\n\t\tthis.disconnect();\n\t}\n\n\tpublic disconnect(): void {\n\t\tthis.disconnected = true;\n\t}\n\n\tpublic get io(): {\n\t\treconnection: () => boolean;\n\t\treconnectionAttempts: () => number;\n\t} {\n\t\treturn {\n\t\t\treconnection: () => false,\n\t\t\treconnectionAttempts: () => 0,\n\t\t};\n\t}\n\n\tpublic sendDisconnectEvent(\n\t\treason?: IAnyDriverError,\n\t\tdetails?: { context: { type?: string; code?: number } },\n\t): void {\n\t\tconst error =\n\t\t\treason ??\n\t\t\tcreateGenericNetworkError(\"TestError\", { canRetry: false }, { driverVersion });\n\t\tthis.emit(\"disconnect\", error, details);\n\t}\n\n\tpublic sendErrorEvent(error?: IAnyDriverError): void {\n\t\tthis.emit(\n\t\t\t\"error\",\n\t\t\terror ?? createGenericNetworkError(\"TestError\", { canRetry: false }, { driverVersion }),\n\t\t);\n\t}\n\n\tpublic sendServerDisconnectEvent(socketError: IOdspSocketError, clientId?: string): void {\n\t\tif (clientId === undefined) {\n\t\t\tthis.disconnect();\n\t\t}\n\t\tthis.emit(\"server_disconnect\", socketError, clientId);\n\t}\n\n\tpublic emit(eventName: string, ...args: unknown[]): boolean {\n\t\tswitch (eventName) {\n\t\t\tcase \"connect_document\": {\n\t\t\t\tconst connectMessage = args[0] as IConnect;\n\t\t\t\tswitch (this.mockSocketConnectResponse.connect_document.eventToEmit) {\n\t\t\t\t\tcase \"connect_document_error\":\n\t\t\t\t\tcase \"connect_error\": {\n\t\t\t\t\t\tconst errorToThrow =\n\t\t\t\t\t\t\tthis.mockSocketConnectResponse.connect_document.errorToThrow ??\n\t\t\t\t\t\t\tcreateGenericNetworkError(\n\t\t\t\t\t\t\t\t\"TestError\",\n\t\t\t\t\t\t\t\t{ canRetry: false },\n\t\t\t\t\t\t\t\t{ driverVersion },\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\tthis.emit(\n\t\t\t\t\t\t\tthis.mockSocketConnectResponse.connect_document.eventToEmit,\n\t\t\t\t\t\t\terrorToThrow,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcase \"connect_document_success\": {\n\t\t\t\t\t\tconst iConnected: IConnected = this.mockSocketConnectResponse\n\t\t\t\t\t\t\t.connect_document.connectMessage ?? {\n\t\t\t\t\t\t\tclientId: uuid(),\n\t\t\t\t\t\t\texisting: true,\n\t\t\t\t\t\t\tinitialClients: [],\n\t\t\t\t\t\t\tinitialMessages: [],\n\t\t\t\t\t\t\tinitialSignals: [],\n\t\t\t\t\t\t\tmaxMessageSize: 1000,\n\t\t\t\t\t\t\tmode: connectMessage.mode,\n\t\t\t\t\t\t\tversion: connectMessage.versions[0],\n\t\t\t\t\t\t\tserviceConfiguration: { maxMessageSize: 1000, blockSize: 1000 },\n\t\t\t\t\t\t\tclaims: {\n\t\t\t\t\t\t\t\tdocumentId: connectMessage.id,\n\t\t\t\t\t\t\t\tscopes: [\n\t\t\t\t\t\t\t\t\tScopeType.DocWrite,\n\t\t\t\t\t\t\t\t\tScopeType.DocRead,\n\t\t\t\t\t\t\t\t\tScopeType.SummaryWrite,\n\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\ttenantId: connectMessage.tenantId,\n\t\t\t\t\t\t\t\tver: \"1.0.0\",\n\t\t\t\t\t\t\t\tiat: 10,\n\t\t\t\t\t\t\t\texp: 10,\n\t\t\t\t\t\t\t\tuser: connectMessage.client.user,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tsupportedVersions: connectMessage.versions,\n\t\t\t\t\t\t\tepoch: \"testEpoch\",\n\t\t\t\t\t\t};\n\t\t\t\t\t\tthis.emit(\"connect_document_success\", iConnected);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcase \"connect_timeout\": {\n\t\t\t\t\t\tthis.emit(\"connect_timeout\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tdefault: // No-op\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tdefault: {\n\t\t\t\tsuper.emit(eventName, ...args);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t}\n}\n"]}
|