@protontech/drive-sdk 0.0.13 → 0.1.1
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/dist/cache/index.d.ts +1 -0
- package/dist/cache/index.js +3 -1
- package/dist/cache/index.js.map +1 -1
- package/dist/cache/memoryCache.d.ts +1 -1
- package/dist/cache/memoryCache.js +0 -1
- package/dist/cache/memoryCache.js.map +1 -1
- package/dist/cache/memoryCache.test.js +2 -4
- package/dist/cache/memoryCache.test.js.map +1 -1
- package/dist/cache/nullCache.d.ts +14 -0
- package/dist/cache/nullCache.js +36 -0
- package/dist/cache/nullCache.js.map +1 -0
- package/dist/config.d.ts +16 -1
- package/dist/config.js +1 -1
- package/dist/config.js.map +1 -1
- package/dist/crypto/driveCrypto.d.ts +2 -5
- package/dist/crypto/driveCrypto.js +7 -12
- package/dist/crypto/driveCrypto.js.map +1 -1
- package/dist/crypto/driveCrypto.test.js +14 -14
- package/dist/crypto/openPGPCrypto.js +5 -3
- package/dist/crypto/openPGPCrypto.js.map +1 -1
- package/dist/diagnostic/eventsGenerator.d.ts +14 -0
- package/dist/diagnostic/eventsGenerator.js +49 -0
- package/dist/diagnostic/eventsGenerator.js.map +1 -0
- package/dist/diagnostic/httpClient.d.ts +16 -0
- package/dist/diagnostic/httpClient.js +81 -0
- package/dist/diagnostic/httpClient.js.map +1 -0
- package/dist/diagnostic/index.d.ts +10 -0
- package/dist/diagnostic/index.js +35 -0
- package/dist/diagnostic/index.js.map +1 -0
- package/dist/diagnostic/integrityVerificationStream.d.ts +21 -0
- package/dist/diagnostic/integrityVerificationStream.js +56 -0
- package/dist/diagnostic/integrityVerificationStream.js.map +1 -0
- package/dist/diagnostic/interface.d.ts +102 -0
- package/dist/diagnostic/interface.js +3 -0
- package/dist/diagnostic/interface.js.map +1 -0
- package/dist/diagnostic/sdkDiagnostic.d.ts +22 -0
- package/dist/diagnostic/sdkDiagnostic.js +222 -0
- package/dist/diagnostic/sdkDiagnostic.js.map +1 -0
- package/dist/diagnostic/sdkDiagnosticFull.d.ts +18 -0
- package/dist/diagnostic/sdkDiagnosticFull.js +35 -0
- package/dist/diagnostic/sdkDiagnosticFull.js.map +1 -0
- package/dist/diagnostic/telemetry.d.ts +25 -0
- package/dist/diagnostic/telemetry.js +70 -0
- package/dist/diagnostic/telemetry.js.map +1 -0
- package/dist/diagnostic/zipGenerators.d.ts +9 -0
- package/dist/diagnostic/zipGenerators.js +64 -0
- package/dist/diagnostic/zipGenerators.js.map +1 -0
- package/dist/diagnostic/zipGenerators.test.js +144 -0
- package/dist/diagnostic/zipGenerators.test.js.map +1 -0
- package/dist/errors.d.ts +2 -1
- package/dist/errors.js +3 -1
- package/dist/errors.js.map +1 -1
- package/dist/interface/config.d.ts +26 -0
- package/dist/interface/config.js +3 -0
- package/dist/interface/config.js.map +1 -0
- package/dist/interface/download.d.ts +2 -2
- package/dist/interface/events.d.ts +58 -20
- package/dist/interface/events.js +11 -1
- package/dist/interface/events.js.map +1 -1
- package/dist/interface/httpClient.d.ts +0 -14
- package/dist/interface/index.d.ts +11 -7
- package/dist/interface/index.js +2 -2
- package/dist/interface/index.js.map +1 -1
- package/dist/interface/nodes.d.ts +9 -0
- package/dist/interface/nodes.js.map +1 -1
- package/dist/interface/result.js.map +1 -1
- package/dist/interface/sharing.d.ts +2 -0
- package/dist/interface/sharing.js.map +1 -1
- package/dist/interface/telemetry.js +0 -8
- package/dist/interface/telemetry.js.map +1 -1
- package/dist/interface/thumbnail.js.map +1 -1
- package/dist/interface/upload.d.ts +7 -1
- package/dist/internal/apiService/apiService.d.ts +1 -1
- package/dist/internal/apiService/apiService.js +7 -11
- package/dist/internal/apiService/apiService.js.map +1 -1
- package/dist/internal/apiService/apiService.test.js +55 -48
- package/dist/internal/apiService/apiService.test.js.map +1 -1
- package/dist/internal/apiService/coreTypes.d.ts +2356 -2356
- package/dist/internal/apiService/driveTypes.d.ts +1680 -1680
- package/dist/internal/apiService/errors.js +14 -8
- package/dist/internal/apiService/errors.js.map +1 -1
- package/dist/internal/apiService/errors.test.js +17 -12
- package/dist/internal/apiService/errors.test.js.map +1 -1
- package/dist/internal/apiService/transformers.d.ts +1 -1
- package/dist/internal/apiService/transformers.js +1 -1
- package/dist/internal/asyncIteratorMap.test.js +2 -2
- package/dist/internal/asyncIteratorMap.test.js.map +1 -1
- package/dist/internal/asyncIteratorRace.d.ts +13 -0
- package/dist/internal/asyncIteratorRace.js +59 -0
- package/dist/internal/asyncIteratorRace.js.map +1 -0
- package/dist/internal/asyncIteratorRace.test.d.ts +1 -0
- package/dist/internal/asyncIteratorRace.test.js +119 -0
- package/dist/internal/asyncIteratorRace.test.js.map +1 -0
- package/dist/internal/batch.d.ts +1 -0
- package/dist/internal/batch.js +12 -0
- package/dist/internal/batch.js.map +1 -0
- package/dist/internal/batch.test.d.ts +1 -0
- package/dist/internal/batch.test.js +41 -0
- package/dist/internal/batch.test.js.map +1 -0
- package/dist/internal/batchLoading.js.map +1 -1
- package/dist/internal/batchLoading.test.js +13 -13
- package/dist/internal/batchLoading.test.js.map +1 -1
- package/dist/internal/devices/apiService.d.ts +3 -3
- package/dist/internal/devices/apiService.js +2 -2
- package/dist/internal/devices/apiService.js.map +1 -1
- package/dist/internal/devices/cryptoService.js +1 -2
- package/dist/internal/devices/cryptoService.js.map +1 -1
- package/dist/internal/devices/index.d.ts +5 -5
- package/dist/internal/devices/index.js.map +1 -1
- package/dist/internal/devices/interface.d.ts +3 -3
- package/dist/internal/devices/manager.js +2 -2
- package/dist/internal/devices/manager.js.map +1 -1
- package/dist/internal/devices/manager.test.js +38 -7
- package/dist/internal/devices/manager.test.js.map +1 -1
- package/dist/internal/download/apiService.d.ts +4 -4
- package/dist/internal/download/apiService.js +32 -32
- package/dist/internal/download/apiService.js.map +1 -1
- package/dist/internal/download/cryptoService.d.ts +4 -4
- package/dist/internal/download/cryptoService.js +6 -5
- package/dist/internal/download/cryptoService.js.map +1 -1
- package/dist/internal/download/fileDownloader.d.ts +6 -6
- package/dist/internal/download/fileDownloader.js +3 -2
- package/dist/internal/download/fileDownloader.js.map +1 -1
- package/dist/internal/download/fileDownloader.test.js +1 -1
- package/dist/internal/download/fileDownloader.test.js.map +1 -1
- package/dist/internal/download/index.d.ts +5 -5
- package/dist/internal/download/index.js +5 -5
- package/dist/internal/download/index.js.map +1 -1
- package/dist/internal/download/interface.d.ts +3 -4
- package/dist/internal/download/telemetry.d.ts +3 -3
- package/dist/internal/download/telemetry.js +4 -2
- package/dist/internal/download/telemetry.js.map +1 -1
- package/dist/internal/download/telemetry.test.js +8 -8
- package/dist/internal/download/telemetry.test.js.map +1 -1
- package/dist/internal/download/thumbnailDownloader.d.ts +4 -4
- package/dist/internal/download/thumbnailDownloader.js +6 -6
- package/dist/internal/download/thumbnailDownloader.js.map +1 -1
- package/dist/internal/download/thumbnailDownloader.test.js.map +1 -1
- package/dist/internal/errors.d.ts +1 -1
- package/dist/internal/errors.js +1 -3
- package/dist/internal/errors.js.map +1 -1
- package/dist/internal/events/apiService.d.ts +5 -7
- package/dist/internal/events/apiService.js +19 -22
- package/dist/internal/events/apiService.js.map +1 -1
- package/dist/internal/events/coreEventManager.d.ts +9 -12
- package/dist/internal/events/coreEventManager.js +19 -36
- package/dist/internal/events/coreEventManager.js.map +1 -1
- package/dist/internal/events/coreEventManager.test.d.ts +1 -0
- package/dist/internal/events/coreEventManager.test.js +87 -0
- package/dist/internal/events/coreEventManager.test.js.map +1 -0
- package/dist/internal/events/eventManager.d.ts +11 -36
- package/dist/internal/events/eventManager.js +59 -106
- package/dist/internal/events/eventManager.js.map +1 -1
- package/dist/internal/events/eventManager.test.js +177 -83
- package/dist/internal/events/eventManager.test.js.map +1 -1
- package/dist/internal/events/index.d.ts +16 -36
- package/dist/internal/events/index.js +56 -72
- package/dist/internal/events/index.js.map +1 -1
- package/dist/internal/events/interface.d.ts +59 -14
- package/dist/internal/events/interface.js +12 -3
- package/dist/internal/events/interface.js.map +1 -1
- package/dist/internal/events/volumeEventManager.d.ts +9 -19
- package/dist/internal/events/volumeEventManager.js +58 -45
- package/dist/internal/events/volumeEventManager.js.map +1 -1
- package/dist/internal/events/volumeEventManager.test.d.ts +1 -0
- package/dist/internal/events/volumeEventManager.test.js +203 -0
- package/dist/internal/events/volumeEventManager.test.js.map +1 -0
- package/dist/internal/nodes/apiService.d.ts +4 -3
- package/dist/internal/nodes/apiService.js +36 -15
- package/dist/internal/nodes/apiService.js.map +1 -1
- package/dist/internal/nodes/apiService.test.js +60 -41
- package/dist/internal/nodes/apiService.test.js.map +1 -1
- package/dist/internal/nodes/cache.d.ts +14 -5
- package/dist/internal/nodes/cache.js +31 -7
- package/dist/internal/nodes/cache.js.map +1 -1
- package/dist/internal/nodes/cache.test.js +31 -9
- package/dist/internal/nodes/cache.test.js.map +1 -1
- package/dist/internal/nodes/cryptoCache.d.ts +2 -2
- package/dist/internal/nodes/cryptoCache.js.map +1 -1
- package/dist/internal/nodes/cryptoCache.test.js +24 -4
- package/dist/internal/nodes/cryptoCache.test.js.map +1 -1
- package/dist/internal/nodes/cryptoService.d.ts +4 -4
- package/dist/internal/nodes/cryptoService.js +11 -17
- package/dist/internal/nodes/cryptoService.js.map +1 -1
- package/dist/internal/nodes/cryptoService.test.js +320 -241
- package/dist/internal/nodes/cryptoService.test.js.map +1 -1
- package/dist/internal/nodes/events.d.ts +8 -84
- package/dist/internal/nodes/events.js +43 -217
- package/dist/internal/nodes/events.js.map +1 -1
- package/dist/internal/nodes/events.test.js +35 -279
- package/dist/internal/nodes/events.test.js.map +1 -1
- package/dist/internal/nodes/extendedAttributes.d.ts +1 -1
- package/dist/internal/nodes/extendedAttributes.js +3 -1
- package/dist/internal/nodes/extendedAttributes.js.map +1 -1
- package/dist/internal/nodes/extendedAttributes.test.js +7 -10
- package/dist/internal/nodes/extendedAttributes.test.js.map +1 -1
- package/dist/internal/nodes/index.d.ts +12 -13
- package/dist/internal/nodes/index.js +5 -5
- package/dist/internal/nodes/index.js.map +1 -1
- package/dist/internal/nodes/index.test.js +24 -32
- package/dist/internal/nodes/index.test.js.map +1 -1
- package/dist/internal/nodes/interface.d.ts +2 -2
- package/dist/internal/nodes/nodesAccess.d.ts +22 -7
- package/dist/internal/nodes/nodesAccess.js +65 -16
- package/dist/internal/nodes/nodesAccess.js.map +1 -1
- package/dist/internal/nodes/nodesAccess.test.js +165 -101
- package/dist/internal/nodes/nodesAccess.test.js.map +1 -1
- package/dist/internal/nodes/nodesManagement.d.ts +7 -9
- package/dist/internal/nodes/nodesManagement.js +21 -33
- package/dist/internal/nodes/nodesManagement.js.map +1 -1
- package/dist/internal/nodes/nodesManagement.test.js +42 -21
- package/dist/internal/nodes/nodesManagement.test.js.map +1 -1
- package/dist/internal/nodes/nodesRevisions.d.ts +4 -4
- package/dist/internal/nodes/nodesRevisions.js.map +1 -1
- package/dist/internal/photos/albums.d.ts +3 -3
- package/dist/internal/photos/albums.js.map +1 -1
- package/dist/internal/photos/apiService.d.ts +1 -1
- package/dist/internal/photos/apiService.js +3 -6
- package/dist/internal/photos/apiService.js.map +1 -1
- package/dist/internal/photos/cache.d.ts +1 -1
- package/dist/internal/photos/index.d.ts +5 -5
- package/dist/internal/photos/index.js.map +1 -1
- package/dist/internal/photos/interface.d.ts +2 -2
- package/dist/internal/photos/photosTimeline.d.ts +3 -3
- package/dist/internal/photos/photosTimeline.js +1 -2
- package/dist/internal/photos/photosTimeline.js.map +1 -1
- package/dist/internal/sdkEvents.d.ts +1 -1
- package/dist/internal/sdkEvents.js +2 -7
- package/dist/internal/sdkEvents.js.map +1 -1
- package/dist/internal/sdkEvents.test.js +8 -8
- package/dist/internal/shares/apiService.d.ts +2 -2
- package/dist/internal/shares/apiService.js +5 -3
- package/dist/internal/shares/apiService.js.map +1 -1
- package/dist/internal/shares/cache.d.ts +4 -2
- package/dist/internal/shares/cache.js +14 -6
- package/dist/internal/shares/cache.js.map +1 -1
- package/dist/internal/shares/cache.test.js.map +1 -1
- package/dist/internal/shares/cryptoCache.d.ts +2 -2
- package/dist/internal/shares/cryptoCache.test.js +8 -2
- package/dist/internal/shares/cryptoCache.test.js.map +1 -1
- package/dist/internal/shares/cryptoService.d.ts +3 -3
- package/dist/internal/shares/cryptoService.js.map +1 -1
- package/dist/internal/shares/cryptoService.test.js +42 -42
- package/dist/internal/shares/cryptoService.test.js.map +1 -1
- package/dist/internal/shares/index.d.ts +4 -4
- package/dist/internal/shares/index.js.map +1 -1
- package/dist/internal/shares/interface.d.ts +2 -2
- package/dist/internal/shares/manager.d.ts +8 -7
- package/dist/internal/shares/manager.js +3 -0
- package/dist/internal/shares/manager.js.map +1 -1
- package/dist/internal/shares/manager.test.js +71 -63
- package/dist/internal/shares/manager.test.js.map +1 -1
- package/dist/internal/sharing/apiService.d.ts +4 -4
- package/dist/internal/sharing/apiService.js +5 -3
- package/dist/internal/sharing/apiService.js.map +1 -1
- package/dist/internal/sharing/cache.d.ts +1 -1
- package/dist/internal/sharing/cache.test.js +33 -33
- package/dist/internal/sharing/cryptoService.d.ts +3 -3
- package/dist/internal/sharing/cryptoService.js +3 -4
- package/dist/internal/sharing/cryptoService.js.map +1 -1
- package/dist/internal/sharing/cryptoService.test.js +39 -39
- package/dist/internal/sharing/cryptoService.test.js.map +1 -1
- package/dist/internal/sharing/events.d.ts +24 -56
- package/dist/internal/sharing/events.js +45 -138
- package/dist/internal/sharing/events.js.map +1 -1
- package/dist/internal/sharing/events.test.js +85 -189
- package/dist/internal/sharing/events.test.js.map +1 -1
- package/dist/internal/sharing/index.d.ts +8 -9
- package/dist/internal/sharing/index.js +5 -5
- package/dist/internal/sharing/index.js.map +1 -1
- package/dist/internal/sharing/interface.d.ts +8 -4
- package/dist/internal/sharing/sharingAccess.d.ts +6 -6
- package/dist/internal/sharing/sharingAccess.js +8 -4
- package/dist/internal/sharing/sharingAccess.js.map +1 -1
- package/dist/internal/sharing/sharingAccess.test.js +45 -39
- package/dist/internal/sharing/sharingAccess.test.js.map +1 -1
- package/dist/internal/sharing/sharingManagement.d.ts +5 -6
- package/dist/internal/sharing/sharingManagement.js +12 -16
- package/dist/internal/sharing/sharingManagement.js.map +1 -1
- package/dist/internal/sharing/sharingManagement.test.js +305 -286
- package/dist/internal/sharing/sharingManagement.test.js.map +1 -1
- package/dist/internal/uids.js.map +1 -1
- package/dist/internal/upload/apiService.d.ts +5 -6
- package/dist/internal/upload/apiService.js +8 -5
- package/dist/internal/upload/apiService.js.map +1 -1
- package/dist/internal/upload/blockVerifier.d.ts +3 -3
- package/dist/internal/upload/blockVerifier.js +1 -1
- package/dist/internal/upload/blockVerifier.js.map +1 -1
- package/dist/internal/upload/chunkStreamReader.test.js +6 -6
- package/dist/internal/upload/cryptoService.d.ts +4 -4
- package/dist/internal/upload/cryptoService.js +4 -4
- package/dist/internal/upload/cryptoService.js.map +1 -1
- package/dist/internal/upload/digests.js.map +1 -1
- package/dist/internal/upload/fileUploader.d.ts +6 -6
- package/dist/internal/upload/fileUploader.js.map +1 -1
- package/dist/internal/upload/fileUploader.test.js.map +1 -1
- package/dist/internal/upload/index.d.ts +6 -6
- package/dist/internal/upload/index.js +3 -3
- package/dist/internal/upload/index.js.map +1 -1
- package/dist/internal/upload/interface.d.ts +5 -3
- package/dist/internal/upload/manager.d.ts +8 -8
- package/dist/internal/upload/manager.js +23 -52
- package/dist/internal/upload/manager.js.map +1 -1
- package/dist/internal/upload/manager.test.js +185 -147
- package/dist/internal/upload/manager.test.js.map +1 -1
- package/dist/internal/upload/streamUploader.d.ts +6 -6
- package/dist/internal/upload/streamUploader.js +9 -8
- package/dist/internal/upload/streamUploader.js.map +1 -1
- package/dist/internal/upload/streamUploader.test.js +17 -12
- package/dist/internal/upload/streamUploader.test.js.map +1 -1
- package/dist/internal/upload/telemetry.d.ts +3 -3
- package/dist/internal/upload/telemetry.js +5 -3
- package/dist/internal/upload/telemetry.js.map +1 -1
- package/dist/internal/upload/telemetry.test.js +8 -8
- package/dist/internal/upload/telemetry.test.js.map +1 -1
- package/dist/protonDriveClient.d.ts +27 -170
- package/dist/protonDriveClient.js +37 -198
- package/dist/protonDriveClient.js.map +1 -1
- package/dist/protonDrivePhotosClient.js +3 -2
- package/dist/protonDrivePhotosClient.js.map +1 -1
- package/dist/telemetry.js +18 -15
- package/dist/telemetry.js.map +1 -1
- package/dist/tests/logger.js.map +1 -1
- package/dist/tests/telemetry.d.ts +1 -1
- package/dist/transformers.js +4 -2
- package/dist/transformers.js.map +1 -1
- package/package.json +3 -3
- package/src/cache/index.ts +1 -0
- package/src/cache/interface.ts +22 -22
- package/src/cache/memoryCache.test.ts +7 -7
- package/src/cache/memoryCache.ts +5 -5
- package/src/cache/nullCache.ts +38 -0
- package/src/config.ts +17 -2
- package/src/crypto/driveCrypto.test.ts +15 -15
- package/src/crypto/driveCrypto.ts +120 -156
- package/src/crypto/hmac.ts +1 -1
- package/src/crypto/interface.ts +63 -72
- package/src/crypto/openPGPCrypto.ts +76 -94
- package/src/crypto/utils.ts +1 -1
- package/src/diagnostic/eventsGenerator.ts +48 -0
- package/src/diagnostic/httpClient.ts +84 -0
- package/src/diagnostic/index.ts +40 -0
- package/src/diagnostic/integrityVerificationStream.ts +55 -0
- package/src/diagnostic/interface.ts +158 -0
- package/src/diagnostic/sdkDiagnostic.ts +249 -0
- package/src/diagnostic/sdkDiagnosticFull.ts +37 -0
- package/src/diagnostic/telemetry.ts +74 -0
- package/src/diagnostic/zipGenerators.test.ts +177 -0
- package/src/diagnostic/zipGenerators.ts +70 -0
- package/src/errors.ts +25 -22
- package/src/index.ts +3 -3
- package/src/interface/account.ts +10 -10
- package/src/interface/author.ts +6 -6
- package/src/interface/config.ts +28 -0
- package/src/interface/devices.ts +6 -6
- package/src/interface/download.ts +12 -9
- package/src/interface/events.ts +76 -25
- package/src/interface/httpClient.ts +11 -27
- package/src/interface/index.ts +81 -20
- package/src/interface/nodes.ts +67 -60
- package/src/interface/result.ts +1 -3
- package/src/interface/sharing.ts +60 -56
- package/src/interface/telemetry.ts +74 -74
- package/src/interface/thumbnail.ts +5 -6
- package/src/interface/upload.ts +25 -11
- package/src/internal/apiService/apiService.test.ts +109 -76
- package/src/internal/apiService/apiService.ts +40 -26
- package/src/internal/apiService/coreTypes.ts +2474 -2463
- package/src/internal/apiService/driveTypes.ts +1868 -1822
- package/src/internal/apiService/errorCodes.ts +4 -4
- package/src/internal/apiService/errors.test.ts +25 -23
- package/src/internal/apiService/errors.ts +15 -9
- package/src/internal/apiService/index.ts +1 -1
- package/src/internal/apiService/transformers.ts +2 -2
- package/src/internal/asyncIteratorMap.test.ts +4 -4
- package/src/internal/asyncIteratorMap.ts +1 -1
- package/src/internal/asyncIteratorRace.test.ts +149 -0
- package/src/internal/asyncIteratorRace.ts +79 -0
- package/src/internal/batch.test.ts +50 -0
- package/src/internal/batch.ts +9 -0
- package/src/internal/batchLoading.test.ts +13 -14
- package/src/internal/batchLoading.ts +8 -8
- package/src/internal/devices/apiService.ts +58 -51
- package/src/internal/devices/cryptoService.ts +22 -17
- package/src/internal/devices/index.ts +17 -10
- package/src/internal/devices/interface.ts +21 -12
- package/src/internal/devices/manager.test.ts +40 -9
- package/src/internal/devices/manager.ts +3 -3
- package/src/internal/download/apiService.ts +72 -52
- package/src/internal/download/cryptoService.ts +34 -18
- package/src/internal/download/fileDownloader.test.ts +25 -9
- package/src/internal/download/fileDownloader.ts +38 -20
- package/src/internal/download/index.ts +19 -19
- package/src/internal/download/interface.ts +19 -20
- package/src/internal/download/queue.ts +3 -3
- package/src/internal/download/telemetry.test.ts +11 -11
- package/src/internal/download/telemetry.ts +24 -14
- package/src/internal/download/thumbnailDownloader.test.ts +11 -6
- package/src/internal/download/thumbnailDownloader.ts +43 -32
- package/src/internal/errors.ts +7 -5
- package/src/internal/events/apiService.ts +46 -36
- package/src/internal/events/coreEventManager.test.ts +101 -0
- package/src/internal/events/coreEventManager.ts +26 -48
- package/src/internal/events/eventManager.test.ts +211 -93
- package/src/internal/events/eventManager.ts +72 -117
- package/src/internal/events/index.ts +71 -91
- package/src/internal/events/interface.ts +92 -29
- package/src/internal/events/volumeEventManager.test.ts +239 -0
- package/src/internal/events/volumeEventManager.ts +68 -57
- package/src/internal/nodes/apiService.test.ts +197 -147
- package/src/internal/nodes/apiService.ts +288 -174
- package/src/internal/nodes/cache.test.ts +48 -20
- package/src/internal/nodes/cache.ts +79 -45
- package/src/internal/nodes/cryptoCache.test.ts +34 -14
- package/src/internal/nodes/cryptoCache.ts +10 -5
- package/src/internal/nodes/cryptoService.test.ts +492 -351
- package/src/internal/nodes/cryptoService.ts +171 -89
- package/src/internal/nodes/events.test.ts +48 -344
- package/src/internal/nodes/events.ts +48 -254
- package/src/internal/nodes/extendedAttributes.test.ts +28 -24
- package/src/internal/nodes/extendedAttributes.ts +20 -15
- package/src/internal/nodes/index.test.ts +51 -55
- package/src/internal/nodes/index.ts +32 -22
- package/src/internal/nodes/interface.ts +44 -31
- package/src/internal/nodes/nodesAccess.test.ts +237 -130
- package/src/internal/nodes/nodesAccess.ts +113 -50
- package/src/internal/nodes/nodesManagement.test.ts +64 -39
- package/src/internal/nodes/nodesManagement.ts +51 -62
- package/src/internal/nodes/nodesRevisions.ts +7 -7
- package/src/internal/nodes/validations.ts +2 -2
- package/src/internal/photos/albums.ts +5 -5
- package/src/internal/photos/apiService.ts +4 -7
- package/src/internal/photos/cache.ts +1 -1
- package/src/internal/photos/index.ts +8 -8
- package/src/internal/photos/interface.ts +2 -2
- package/src/internal/photos/photosTimeline.ts +4 -5
- package/src/internal/sdkEvents.test.ts +10 -10
- package/src/internal/sdkEvents.ts +5 -13
- package/src/internal/shares/apiService.ts +44 -33
- package/src/internal/shares/cache.test.ts +6 -4
- package/src/internal/shares/cache.ts +25 -14
- package/src/internal/shares/cryptoCache.test.ts +17 -11
- package/src/internal/shares/cryptoCache.ts +4 -4
- package/src/internal/shares/cryptoService.test.ts +72 -74
- package/src/internal/shares/cryptoService.ts +48 -23
- package/src/internal/shares/index.ts +23 -11
- package/src/internal/shares/interface.ts +8 -8
- package/src/internal/shares/manager.test.ts +88 -80
- package/src/internal/shares/manager.ts +27 -23
- package/src/internal/sharing/apiService.ts +283 -175
- package/src/internal/sharing/cache.test.ts +35 -35
- package/src/internal/sharing/cache.ts +3 -3
- package/src/internal/sharing/cryptoService.test.ts +58 -46
- package/src/internal/sharing/cryptoService.ts +121 -83
- package/src/internal/sharing/events.test.ts +97 -207
- package/src/internal/sharing/events.ts +46 -157
- package/src/internal/sharing/index.ts +24 -16
- package/src/internal/sharing/interface.ts +46 -42
- package/src/internal/sharing/sharingAccess.test.ts +71 -65
- package/src/internal/sharing/sharingAccess.ts +39 -21
- package/src/internal/sharing/sharingManagement.test.ts +405 -335
- package/src/internal/sharing/sharingManagement.ts +144 -75
- package/src/internal/uids.ts +1 -1
- package/src/internal/upload/apiService.ts +168 -119
- package/src/internal/upload/blockVerifier.ts +8 -6
- package/src/internal/upload/chunkStreamReader.test.ts +7 -7
- package/src/internal/upload/cryptoService.ts +42 -36
- package/src/internal/upload/digests.ts +2 -2
- package/src/internal/upload/fileUploader.test.ts +15 -3
- package/src/internal/upload/fileUploader.ts +39 -17
- package/src/internal/upload/index.ts +17 -18
- package/src/internal/upload/interface.ts +79 -77
- package/src/internal/upload/manager.test.ts +222 -175
- package/src/internal/upload/manager.ts +74 -80
- package/src/internal/upload/queue.ts +3 -3
- package/src/internal/upload/streamUploader.test.ts +40 -27
- package/src/internal/upload/streamUploader.ts +87 -71
- package/src/internal/upload/telemetry.test.ts +11 -11
- package/src/internal/upload/telemetry.ts +25 -15
- package/src/internal/wait.test.ts +1 -1
- package/src/internal/wait.ts +3 -3
- package/src/protonDriveClient.ts +189 -276
- package/src/protonDrivePhotosClient.ts +20 -13
- package/src/telemetry.ts +60 -52
- package/src/tests/logger.ts +1 -1
- package/src/tests/telemetry.ts +2 -2
- package/src/transformers.ts +27 -21
- package/src/version.ts +0 -1
- package/dist/internal/events/cache.d.ts +0 -28
- package/dist/internal/events/cache.js +0 -67
- package/dist/internal/events/cache.js.map +0 -1
- package/dist/internal/events/cache.test.js +0 -43
- package/dist/internal/events/cache.test.js.map +0 -1
- package/src/internal/events/cache.test.ts +0 -47
- package/src/internal/events/cache.ts +0 -80
- /package/dist/{internal/events/cache.test.d.ts → diagnostic/zipGenerators.test.d.ts} +0 -0
|
@@ -1,16 +1,18 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { DriveAPIService } from
|
|
3
|
-
import { DriveListener } from
|
|
4
|
-
import { EventsAPIService } from
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
export {
|
|
1
|
+
import { Logger, ProtonDriveTelemetry } from '../../interface';
|
|
2
|
+
import { DriveAPIService } from '../apiService';
|
|
3
|
+
import { DriveEvent, DriveListener, EventSubscription, LatestEventIdProvider } from './interface';
|
|
4
|
+
import { EventsAPIService } from './apiService';
|
|
5
|
+
import { CoreEventManager } from './coreEventManager';
|
|
6
|
+
import { VolumeEventManager } from './volumeEventManager';
|
|
7
|
+
import { EventManager } from './eventManager';
|
|
8
|
+
import { SharesManager } from '../shares/manager';
|
|
9
|
+
|
|
10
|
+
export type { DriveEvent, DriveListener } from './interface';
|
|
11
|
+
export { DriveEventType } from './interface';
|
|
11
12
|
|
|
12
13
|
const OWN_VOLUME_POLLING_INTERVAL = 30;
|
|
13
14
|
const OTHER_VOLUME_POLLING_INTERVAL = 60;
|
|
15
|
+
const CORE_POLLING_INTERVAL = 30;
|
|
14
16
|
|
|
15
17
|
/**
|
|
16
18
|
* Service for listening to drive events. The service is responsible for
|
|
@@ -19,113 +21,91 @@ const OTHER_VOLUME_POLLING_INTERVAL = 60;
|
|
|
19
21
|
*/
|
|
20
22
|
export class DriveEventsService {
|
|
21
23
|
private apiService: EventsAPIService;
|
|
22
|
-
private
|
|
23
|
-
private
|
|
24
|
-
private listeners: DriveListener[] = [];
|
|
25
|
-
private coreEvents: CoreEventManager;
|
|
26
|
-
private volumesEvents: { [volumeId: string]: VolumeEventManager };
|
|
24
|
+
private coreEvents?: EventManager<DriveEvent>;
|
|
25
|
+
private volumeEventManagers: { [volumeId: string]: EventManager<DriveEvent> };
|
|
27
26
|
private logger: Logger;
|
|
28
27
|
|
|
29
|
-
constructor(
|
|
28
|
+
constructor(
|
|
29
|
+
private telemetry: ProtonDriveTelemetry,
|
|
30
|
+
apiService: DriveAPIService,
|
|
31
|
+
private shareManagement: SharesManager,
|
|
32
|
+
private cacheEventListeners: DriveListener[] = [],
|
|
33
|
+
private latestEventIdProvider?: LatestEventIdProvider,
|
|
34
|
+
) {
|
|
30
35
|
this.telemetry = telemetry;
|
|
31
36
|
this.logger = telemetry.getLogger('events');
|
|
32
37
|
this.apiService = new EventsAPIService(apiService);
|
|
33
|
-
this.
|
|
34
|
-
|
|
35
|
-
// FIXME: Allow to pass own core events manager from the public interface.
|
|
36
|
-
this.coreEvents = new CoreEventManager(this.logger, this.apiService, this.cache);
|
|
37
|
-
this.volumesEvents = {};
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
/**
|
|
41
|
-
* Loads all the subscribed volumes (including core events) from the
|
|
42
|
-
* cache and starts listening to their events. Any additional volume
|
|
43
|
-
* that is subscribed to later will be automatically started.
|
|
44
|
-
*/
|
|
45
|
-
async subscribeToRemoteDataUpdates(): Promise<void> {
|
|
46
|
-
if (this.subscribedToRemoteDataUpdates) {
|
|
47
|
-
return;
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
await this.loadSubscribedVolumeEventServices();
|
|
51
|
-
this.sendNumberOfVolumeSubscriptionsToTelemetry();
|
|
52
|
-
|
|
53
|
-
this.subscribedToRemoteDataUpdates = true;
|
|
54
|
-
await this.coreEvents.startSubscription();
|
|
55
|
-
await Promise.all(
|
|
56
|
-
Object.values(this.volumesEvents)
|
|
57
|
-
.map((volumeEvents) => volumeEvents.startSubscription())
|
|
58
|
-
);
|
|
38
|
+
this.volumeEventManagers = {};
|
|
59
39
|
}
|
|
60
40
|
|
|
61
41
|
/**
|
|
62
|
-
* Subscribe to
|
|
63
|
-
* with the polling interval depending on the type of the volume.
|
|
64
|
-
* Own volumes are polled with highest frequency, while others are
|
|
65
|
-
* polled with lower frequency depending on the total number of
|
|
66
|
-
* subscriptions.
|
|
67
|
-
*
|
|
68
|
-
* @param isOwnVolume - Owned volumes are polled with higher frequency.
|
|
42
|
+
* Subscribe to drive events. The treeEventScopeId can be obtained from a node.
|
|
69
43
|
*/
|
|
70
|
-
async
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
if (this.volumesEvents[volumeId]) {
|
|
74
|
-
return;
|
|
75
|
-
}
|
|
44
|
+
async subscribeToTreeEvents(treeEventScopeId: string, callback: DriveListener): Promise<EventSubscription> {
|
|
45
|
+
const volumeId = treeEventScopeId;
|
|
76
46
|
this.logger.debug(`Creating volume event manager for volume ${volumeId}`);
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
47
|
+
let manager = this.volumeEventManagers[volumeId];
|
|
48
|
+
let started = true;
|
|
49
|
+
if (manager === undefined) {
|
|
50
|
+
manager = await this.createVolumeEventManager(volumeId);
|
|
51
|
+
this.volumeEventManagers[volumeId] = manager;
|
|
52
|
+
started = false;
|
|
83
53
|
this.sendNumberOfVolumeSubscriptionsToTelemetry();
|
|
84
54
|
}
|
|
55
|
+
const eventSubscription = manager.addListener(callback);
|
|
56
|
+
if (!started) {
|
|
57
|
+
await manager.start();
|
|
58
|
+
}
|
|
59
|
+
return eventSubscription;
|
|
85
60
|
}
|
|
86
61
|
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
62
|
+
// FIXME: Allow to pass own core events manager from the public interface.
|
|
63
|
+
async subscribeToCoreEvents(callback: DriveListener): Promise<EventSubscription> {
|
|
64
|
+
if (this.latestEventIdProvider === null || this.latestEventIdProvider === undefined) {
|
|
65
|
+
throw new Error(
|
|
66
|
+
'Cannot subscribe to events without passing a latestEventIdProvider in ProtonDriveClient initialization',
|
|
67
|
+
);
|
|
68
|
+
}
|
|
69
|
+
if (this.coreEvents === undefined) {
|
|
70
|
+
const coreEventManager = new CoreEventManager(this.logger, this.apiService);
|
|
71
|
+
const latestEventId = this.latestEventIdProvider.getLatestEventId('core') ?? null;
|
|
72
|
+
this.coreEvents = new EventManager(coreEventManager, CORE_POLLING_INTERVAL, latestEventId);
|
|
73
|
+
for (const listener of this.cacheEventListeners) {
|
|
74
|
+
this.coreEvents.addListener(listener);
|
|
92
75
|
}
|
|
93
76
|
}
|
|
77
|
+
const eventSubscription = this.coreEvents.addListener(callback);
|
|
78
|
+
await this.coreEvents.start();
|
|
79
|
+
return eventSubscription;
|
|
94
80
|
}
|
|
95
81
|
|
|
96
82
|
private sendNumberOfVolumeSubscriptionsToTelemetry() {
|
|
97
83
|
this.telemetry.logEvent({
|
|
98
84
|
eventName: 'volumeEventsSubscriptionsChanged',
|
|
99
|
-
numberOfVolumeSubscriptions: Object.keys(this.
|
|
85
|
+
numberOfVolumeSubscriptions: Object.keys(this.volumeEventManagers).length,
|
|
100
86
|
});
|
|
101
87
|
}
|
|
102
88
|
|
|
103
|
-
private createVolumeEventManager(volumeId: string
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
89
|
+
private async createVolumeEventManager(volumeId: string): Promise<EventManager<DriveEvent>> {
|
|
90
|
+
if (this.latestEventIdProvider === null || this.latestEventIdProvider === undefined) {
|
|
91
|
+
throw new Error(
|
|
92
|
+
'Cannot subscribe to events without passing a latestEventIdProvider in ProtonDriveClient initialization',
|
|
93
|
+
);
|
|
94
|
+
}
|
|
95
|
+
const isOwnVolume = await this.shareManagement.isOwnVolume(volumeId);
|
|
96
|
+
const pollingInterval = this.getDefaultVolumePollingInterval(isOwnVolume);
|
|
97
|
+
const volumeEventManager = new VolumeEventManager(this.logger, this.apiService, volumeId);
|
|
98
|
+
const latestEventId = this.latestEventIdProvider.getLatestEventId(volumeId);
|
|
99
|
+
const eventManager = new EventManager<DriveEvent>(volumeEventManager, pollingInterval, latestEventId);
|
|
100
|
+
for (const listener of this.cacheEventListeners) {
|
|
101
|
+
eventManager.addListener(listener);
|
|
107
102
|
}
|
|
108
|
-
|
|
109
|
-
|
|
103
|
+
await eventManager.start();
|
|
104
|
+
this.volumeEventManagers[volumeId] = eventManager;
|
|
105
|
+
return eventManager;
|
|
110
106
|
}
|
|
111
107
|
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
* new events as they arrive.
|
|
115
|
-
*
|
|
116
|
-
* One call always provides events from withing the same volume. The
|
|
117
|
-
* second argument of the callback `fullRefreshVolumeId` is thus single
|
|
118
|
-
* ID and if multiple volumes must be fully refreshed, client will
|
|
119
|
-
* receive multiple calls.
|
|
120
|
-
*/
|
|
121
|
-
addListener(callback: DriveListener): void {
|
|
122
|
-
// Add new listener to the list for any new event manager.
|
|
123
|
-
this.listeners.push(callback);
|
|
124
|
-
|
|
125
|
-
// Add new listener to all existings managers.
|
|
126
|
-
this.coreEvents.addListener(callback);
|
|
127
|
-
for (const volumeEvents of Object.values(this.volumesEvents)) {
|
|
128
|
-
volumeEvents.addListener(callback);
|
|
129
|
-
}
|
|
108
|
+
private getDefaultVolumePollingInterval(isOwnVolume: boolean): number {
|
|
109
|
+
return isOwnVolume ? OWN_VOLUME_POLLING_INTERVAL : OTHER_VOLUME_POLLING_INTERVAL;
|
|
130
110
|
}
|
|
131
111
|
}
|
|
@@ -1,51 +1,114 @@
|
|
|
1
|
+
import { Logger } from '../../interface';
|
|
2
|
+
|
|
1
3
|
/**
|
|
2
4
|
* Callback that accepts list of Drive events and flag whether no
|
|
3
5
|
* event should be processed, but rather full cache refresh should be
|
|
4
6
|
* performed.
|
|
5
|
-
*
|
|
7
|
+
*
|
|
6
8
|
* @param fullRefreshVolumeId - ID of the volume that should be fully refreshed.
|
|
7
9
|
*/
|
|
8
|
-
export type DriveListener = (
|
|
10
|
+
export type DriveListener = (event: DriveEvent) => Promise<void>;
|
|
11
|
+
|
|
12
|
+
export interface Event {
|
|
13
|
+
eventId: string;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export interface EventSubscription {
|
|
17
|
+
dispose(): void;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export interface LatestEventIdProvider {
|
|
21
|
+
getLatestEventId(treeEventScopeId: string): string | null;
|
|
22
|
+
}
|
|
9
23
|
|
|
10
24
|
/**
|
|
11
25
|
* Generic internal event interface representing a list of events
|
|
12
26
|
* with metadata about the last event ID, whether there are more
|
|
13
27
|
* events to fetch, or whether the listener should refresh its state.
|
|
14
28
|
*/
|
|
15
|
-
export type
|
|
16
|
-
|
|
17
|
-
more: boolean
|
|
18
|
-
refresh: boolean
|
|
19
|
-
events: T[]
|
|
20
|
-
}
|
|
29
|
+
export type EventsListWithStatus<T> = {
|
|
30
|
+
latestEventId: string;
|
|
31
|
+
more: boolean;
|
|
32
|
+
refresh: boolean;
|
|
33
|
+
events: T[];
|
|
34
|
+
};
|
|
21
35
|
|
|
22
36
|
/**
|
|
23
37
|
* Internal event interface representing a list of specific Drive events.
|
|
24
38
|
*/
|
|
25
|
-
export type
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
39
|
+
export type DriveEventsListWithStatus = EventsListWithStatus<DriveEvent>;
|
|
40
|
+
|
|
41
|
+
type NodeCruEventType = DriveEventType.NodeCreated | DriveEventType.NodeUpdated;
|
|
42
|
+
export type NodeEventType = NodeCruEventType | DriveEventType.NodeDeleted;
|
|
43
|
+
|
|
44
|
+
export type NodeEvent =
|
|
45
|
+
| {
|
|
46
|
+
type: NodeCruEventType;
|
|
47
|
+
nodeUid: string;
|
|
48
|
+
parentNodeUid?: string;
|
|
49
|
+
isTrashed: boolean;
|
|
50
|
+
isShared: boolean;
|
|
51
|
+
treeEventScopeId: string;
|
|
52
|
+
eventId: string;
|
|
53
|
+
}
|
|
54
|
+
| {
|
|
55
|
+
type: DriveEventType.NodeDeleted;
|
|
56
|
+
nodeUid: string;
|
|
57
|
+
parentNodeUid?: string;
|
|
58
|
+
treeEventScopeId: string;
|
|
59
|
+
eventId: string;
|
|
60
|
+
};
|
|
61
|
+
|
|
62
|
+
export type FastForwardEvent = {
|
|
63
|
+
type: DriveEventType.FastForward;
|
|
64
|
+
treeEventScopeId: string;
|
|
65
|
+
eventId: string;
|
|
66
|
+
};
|
|
67
|
+
|
|
68
|
+
export type TreeRefreshEvent = {
|
|
69
|
+
type: DriveEventType.TreeRefresh;
|
|
70
|
+
treeEventScopeId: string;
|
|
71
|
+
eventId: string;
|
|
72
|
+
};
|
|
73
|
+
|
|
74
|
+
export type TreeRemovalEvent = {
|
|
75
|
+
type: DriveEventType.TreeRemove;
|
|
76
|
+
treeEventScopeId: string;
|
|
77
|
+
eventId: 'none';
|
|
78
|
+
};
|
|
79
|
+
|
|
80
|
+
export type SharedWithMeUpdated = {
|
|
81
|
+
type: DriveEventType.SharedWithMeUpdated;
|
|
82
|
+
eventId: string;
|
|
83
|
+
treeEventScopeId: 'core';
|
|
84
|
+
};
|
|
85
|
+
|
|
86
|
+
export type DriveEvent =
|
|
87
|
+
| NodeEvent
|
|
88
|
+
| FastForwardEvent
|
|
89
|
+
| TreeRefreshEvent
|
|
90
|
+
| TreeRemovalEvent
|
|
91
|
+
| FastForwardEvent
|
|
92
|
+
| SharedWithMeUpdated;
|
|
44
93
|
|
|
45
94
|
export enum DriveEventType {
|
|
46
95
|
NodeCreated = 'node_created',
|
|
47
96
|
NodeUpdated = 'node_updated',
|
|
48
|
-
NodeUpdatedMetadata = 'node_updated_metadata',
|
|
49
97
|
NodeDeleted = 'node_deleted',
|
|
50
|
-
|
|
98
|
+
SharedWithMeUpdated = 'shared_with_me_updated',
|
|
99
|
+
TreeRefresh = 'tree_refresh',
|
|
100
|
+
TreeRemove = 'tree_remove',
|
|
101
|
+
FastForward = 'fast_forward',
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
/**
|
|
105
|
+
* This can happen if all shared nodes in that volume where unshared or if the
|
|
106
|
+
* volume was deleted.
|
|
107
|
+
*/
|
|
108
|
+
export class UnsubscribeFromEventsSourceError extends Error {}
|
|
109
|
+
|
|
110
|
+
export interface EventManagerInterface<T> {
|
|
111
|
+
getLatestEventId(): Promise<string>;
|
|
112
|
+
getEvents(eventId: string): AsyncIterable<T>;
|
|
113
|
+
getLogger(): Logger;
|
|
51
114
|
}
|
|
@@ -0,0 +1,239 @@
|
|
|
1
|
+
import { getMockLogger } from '../../tests/logger';
|
|
2
|
+
import { NotFoundAPIError } from '../apiService';
|
|
3
|
+
import { EventsAPIService } from './apiService';
|
|
4
|
+
import { VolumeEventManager } from './volumeEventManager';
|
|
5
|
+
import { DriveEventsListWithStatus, DriveEventType } from './interface';
|
|
6
|
+
|
|
7
|
+
jest.mock('./apiService');
|
|
8
|
+
|
|
9
|
+
describe('VolumeEventManager', () => {
|
|
10
|
+
let manager: VolumeEventManager;
|
|
11
|
+
let mockEventsAPIService: jest.Mocked<EventsAPIService>;
|
|
12
|
+
const mockLogger = getMockLogger();
|
|
13
|
+
const volumeId = 'volumeId123';
|
|
14
|
+
|
|
15
|
+
beforeEach(() => {
|
|
16
|
+
jest.clearAllMocks();
|
|
17
|
+
|
|
18
|
+
mockEventsAPIService = {
|
|
19
|
+
getVolumeLatestEventId: jest.fn(),
|
|
20
|
+
getVolumeEvents: jest.fn(),
|
|
21
|
+
getCoreLatestEventId: jest.fn(),
|
|
22
|
+
getCoreEvents: jest.fn(),
|
|
23
|
+
} as any;
|
|
24
|
+
|
|
25
|
+
manager = new VolumeEventManager(mockLogger, mockEventsAPIService, volumeId);
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
describe('getLatestEventId', () => {
|
|
29
|
+
it('should return the latest event ID from API', async () => {
|
|
30
|
+
const expectedEventId = 'eventId123';
|
|
31
|
+
mockEventsAPIService.getVolumeLatestEventId.mockResolvedValue(expectedEventId);
|
|
32
|
+
|
|
33
|
+
const result = await manager.getLatestEventId();
|
|
34
|
+
|
|
35
|
+
expect(result).toBe(expectedEventId);
|
|
36
|
+
expect(mockEventsAPIService.getVolumeLatestEventId).toHaveBeenCalledWith(volumeId);
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
it('should throw UnsubscribeFromEventsSourceError when API returns NotFoundAPIError', async () => {
|
|
40
|
+
const notFoundError = new NotFoundAPIError('Event not found', 2501);
|
|
41
|
+
mockEventsAPIService.getVolumeLatestEventId.mockRejectedValue(notFoundError);
|
|
42
|
+
|
|
43
|
+
await expect(manager.getLatestEventId()).rejects.toThrow('Event not found');
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
it('should rethrow other errors', async () => {
|
|
47
|
+
const networkError = new Error('Network error');
|
|
48
|
+
mockEventsAPIService.getVolumeLatestEventId.mockRejectedValue(networkError);
|
|
49
|
+
|
|
50
|
+
await expect(manager.getLatestEventId()).rejects.toThrow('Network error');
|
|
51
|
+
});
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
describe('getEvents', () => {
|
|
55
|
+
it('should yield events from API response', async () => {
|
|
56
|
+
const mockEventsResponse: DriveEventsListWithStatus = {
|
|
57
|
+
latestEventId: 'eventId456',
|
|
58
|
+
more: false,
|
|
59
|
+
refresh: false,
|
|
60
|
+
events: [
|
|
61
|
+
{
|
|
62
|
+
type: DriveEventType.NodeCreated,
|
|
63
|
+
nodeUid: 'node1',
|
|
64
|
+
parentNodeUid: 'parent1',
|
|
65
|
+
isTrashed: false,
|
|
66
|
+
isShared: false,
|
|
67
|
+
treeEventScopeId: volumeId,
|
|
68
|
+
eventId: 'eventId456',
|
|
69
|
+
},
|
|
70
|
+
],
|
|
71
|
+
};
|
|
72
|
+
|
|
73
|
+
mockEventsAPIService.getVolumeEvents.mockResolvedValue(mockEventsResponse);
|
|
74
|
+
|
|
75
|
+
const events = [];
|
|
76
|
+
for await (const event of manager.getEvents('startEventId')) {
|
|
77
|
+
events.push(event);
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
expect(events).toEqual(mockEventsResponse.events);
|
|
81
|
+
expect(mockEventsAPIService.getVolumeEvents).toHaveBeenCalledWith(volumeId, 'startEventId');
|
|
82
|
+
});
|
|
83
|
+
|
|
84
|
+
it('should continue fetching when more events are available', async () => {
|
|
85
|
+
const firstResponse: DriveEventsListWithStatus = {
|
|
86
|
+
latestEventId: 'eventId2',
|
|
87
|
+
more: true,
|
|
88
|
+
refresh: false,
|
|
89
|
+
events: [
|
|
90
|
+
{
|
|
91
|
+
type: DriveEventType.NodeCreated,
|
|
92
|
+
nodeUid: 'node1',
|
|
93
|
+
parentNodeUid: 'parent1',
|
|
94
|
+
isTrashed: false,
|
|
95
|
+
isShared: false,
|
|
96
|
+
treeEventScopeId: volumeId,
|
|
97
|
+
eventId: 'eventId2',
|
|
98
|
+
},
|
|
99
|
+
],
|
|
100
|
+
};
|
|
101
|
+
|
|
102
|
+
const secondResponse: DriveEventsListWithStatus = {
|
|
103
|
+
latestEventId: 'eventId3',
|
|
104
|
+
more: false,
|
|
105
|
+
refresh: false,
|
|
106
|
+
events: [
|
|
107
|
+
{
|
|
108
|
+
type: DriveEventType.NodeUpdated,
|
|
109
|
+
nodeUid: 'node2',
|
|
110
|
+
parentNodeUid: 'parent1',
|
|
111
|
+
isTrashed: false,
|
|
112
|
+
isShared: false,
|
|
113
|
+
treeEventScopeId: volumeId,
|
|
114
|
+
eventId: 'eventId3',
|
|
115
|
+
},
|
|
116
|
+
],
|
|
117
|
+
};
|
|
118
|
+
|
|
119
|
+
mockEventsAPIService.getVolumeEvents
|
|
120
|
+
.mockResolvedValueOnce(firstResponse)
|
|
121
|
+
.mockResolvedValueOnce(secondResponse);
|
|
122
|
+
|
|
123
|
+
const events = [];
|
|
124
|
+
for await (const event of manager.getEvents('startEventId')) {
|
|
125
|
+
events.push(event);
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
expect(events).toHaveLength(2);
|
|
129
|
+
expect(events[0]).toEqual(firstResponse.events[0]);
|
|
130
|
+
expect(events[1]).toEqual(secondResponse.events[0]);
|
|
131
|
+
expect(mockEventsAPIService.getVolumeEvents).toHaveBeenCalledTimes(2);
|
|
132
|
+
expect(mockEventsAPIService.getVolumeEvents).toHaveBeenNthCalledWith(1, volumeId, 'startEventId');
|
|
133
|
+
expect(mockEventsAPIService.getVolumeEvents).toHaveBeenNthCalledWith(2, volumeId, 'eventId2');
|
|
134
|
+
});
|
|
135
|
+
|
|
136
|
+
it('should yield TreeRefresh event when refresh is true', async () => {
|
|
137
|
+
const mockEventsResponse: DriveEventsListWithStatus = {
|
|
138
|
+
latestEventId: 'eventId789',
|
|
139
|
+
more: false,
|
|
140
|
+
refresh: true,
|
|
141
|
+
events: [],
|
|
142
|
+
};
|
|
143
|
+
|
|
144
|
+
mockEventsAPIService.getVolumeEvents.mockResolvedValue(mockEventsResponse);
|
|
145
|
+
|
|
146
|
+
const events = [];
|
|
147
|
+
for await (const event of manager.getEvents('startEventId')) {
|
|
148
|
+
events.push(event);
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
expect(events).toHaveLength(1);
|
|
152
|
+
expect(events[0]).toEqual({
|
|
153
|
+
type: DriveEventType.TreeRefresh,
|
|
154
|
+
treeEventScopeId: volumeId,
|
|
155
|
+
eventId: 'eventId789',
|
|
156
|
+
});
|
|
157
|
+
});
|
|
158
|
+
|
|
159
|
+
it('should yield FastForward event when no events but eventId changed', async () => {
|
|
160
|
+
const mockEventsResponse: DriveEventsListWithStatus = {
|
|
161
|
+
latestEventId: 'newEventId',
|
|
162
|
+
more: false,
|
|
163
|
+
refresh: false,
|
|
164
|
+
events: [],
|
|
165
|
+
};
|
|
166
|
+
|
|
167
|
+
mockEventsAPIService.getVolumeEvents.mockResolvedValue(mockEventsResponse);
|
|
168
|
+
|
|
169
|
+
const events = [];
|
|
170
|
+
for await (const event of manager.getEvents('oldEventId')) {
|
|
171
|
+
events.push(event);
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
expect(events).toHaveLength(1);
|
|
175
|
+
expect(events[0]).toEqual({
|
|
176
|
+
type: DriveEventType.FastForward,
|
|
177
|
+
treeEventScopeId: volumeId,
|
|
178
|
+
eventId: 'newEventId',
|
|
179
|
+
});
|
|
180
|
+
});
|
|
181
|
+
|
|
182
|
+
it('should yield TreeRemove event when API returns NotFoundAPIError', async () => {
|
|
183
|
+
const notFoundError = new NotFoundAPIError('Volume not found', 2501);
|
|
184
|
+
mockEventsAPIService.getVolumeEvents.mockRejectedValue(notFoundError);
|
|
185
|
+
|
|
186
|
+
const events = [];
|
|
187
|
+
try {
|
|
188
|
+
for await (const event of manager.getEvents('startEventId')) {
|
|
189
|
+
events.push(event);
|
|
190
|
+
}
|
|
191
|
+
} catch (error) {
|
|
192
|
+
// The error should be re-thrown, but first it should yield a TreeRemove event
|
|
193
|
+
expect(error).toBe(notFoundError);
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
expect(events).toHaveLength(1);
|
|
197
|
+
expect(events[0]).toEqual({
|
|
198
|
+
type: DriveEventType.TreeRemove,
|
|
199
|
+
treeEventScopeId: volumeId,
|
|
200
|
+
eventId: 'none',
|
|
201
|
+
});
|
|
202
|
+
});
|
|
203
|
+
|
|
204
|
+
it('should rethrow non-NotFoundAPIError errors', async () => {
|
|
205
|
+
const networkError = new Error('Network error');
|
|
206
|
+
mockEventsAPIService.getVolumeEvents.mockRejectedValue(networkError);
|
|
207
|
+
|
|
208
|
+
const eventGenerator = manager.getEvents('startEventId');
|
|
209
|
+
const eventIterator = eventGenerator[Symbol.asyncIterator]();
|
|
210
|
+
await expect(eventIterator.next()).rejects.toThrow('Network error');
|
|
211
|
+
});
|
|
212
|
+
|
|
213
|
+
it('should not yield events when events array is empty and eventId unchanged', async () => {
|
|
214
|
+
const mockEventsResponse: DriveEventsListWithStatus = {
|
|
215
|
+
latestEventId: 'sameEventId',
|
|
216
|
+
more: false,
|
|
217
|
+
refresh: false,
|
|
218
|
+
events: [],
|
|
219
|
+
};
|
|
220
|
+
|
|
221
|
+
mockEventsAPIService.getVolumeEvents.mockResolvedValue(mockEventsResponse);
|
|
222
|
+
|
|
223
|
+
const events = [];
|
|
224
|
+
for await (const event of manager.getEvents('sameEventId')) {
|
|
225
|
+
events.push(event);
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
expect(events).toHaveLength(0);
|
|
229
|
+
});
|
|
230
|
+
});
|
|
231
|
+
|
|
232
|
+
describe('getLogger', () => {
|
|
233
|
+
it('should return logger with prefix', () => {
|
|
234
|
+
const logger = manager.getLogger();
|
|
235
|
+
expect(logger).toBeDefined();
|
|
236
|
+
// The logger should be wrapped with LoggerWithPrefix, but we can't easily test the prefix
|
|
237
|
+
});
|
|
238
|
+
});
|
|
239
|
+
});
|