@protontech/drive-sdk 0.1.0 → 0.1.2
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/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.js +0 -1
- package/dist/cache/nullCache.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 +3 -3
- package/dist/crypto/openPGPCrypto.js.map +1 -1
- package/dist/diagnostic/eventsGenerator.js +1 -1
- package/dist/diagnostic/eventsGenerator.js.map +1 -1
- package/dist/diagnostic/httpClient.d.ts +1 -1
- package/dist/diagnostic/httpClient.js.map +1 -1
- package/dist/diagnostic/index.d.ts +3 -3
- package/dist/diagnostic/index.js.map +1 -1
- package/dist/diagnostic/integrityVerificationStream.js +1 -1
- package/dist/diagnostic/integrityVerificationStream.js.map +1 -1
- package/dist/diagnostic/interface.d.ts +2 -2
- package/dist/diagnostic/sdkDiagnostic.d.ts +3 -3
- package/dist/diagnostic/sdkDiagnostic.js +8 -2
- package/dist/diagnostic/sdkDiagnostic.js.map +1 -1
- package/dist/diagnostic/sdkDiagnosticFull.d.ts +4 -4
- package/dist/diagnostic/sdkDiagnosticFull.js.map +1 -1
- package/dist/diagnostic/telemetry.js.map +1 -1
- package/dist/diagnostic/zipGenerators.js +2 -2
- package/dist/diagnostic/zipGenerators.js.map +1 -1
- package/dist/diagnostic/zipGenerators.test.js +1 -1
- package/dist/diagnostic/zipGenerators.test.js.map +1 -1
- package/dist/interface/events.d.ts +2 -4
- package/dist/interface/events.js.map +1 -1
- package/dist/interface/index.d.ts +5 -5
- package/dist/interface/index.js +0 -1
- package/dist/interface/index.js.map +1 -1
- package/dist/interface/result.js.map +1 -1
- package/dist/interface/sharing.d.ts +1 -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 +1 -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 +0 -1
- 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 +4 -4
- 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 +2 -2
- package/dist/internal/events/apiService.js +9 -5
- package/dist/internal/events/apiService.js.map +1 -1
- package/dist/internal/events/coreEventManager.d.ts +3 -3
- package/dist/internal/events/coreEventManager.js.map +1 -1
- package/dist/internal/events/coreEventManager.test.js +14 -14
- package/dist/internal/events/eventManager.d.ts +2 -1
- package/dist/internal/events/eventManager.js +9 -1
- package/dist/internal/events/eventManager.js.map +1 -1
- package/dist/internal/events/eventManager.test.js +84 -60
- package/dist/internal/events/eventManager.test.js.map +1 -1
- package/dist/internal/events/index.d.ts +10 -9
- package/dist/internal/events/index.js +38 -32
- package/dist/internal/events/index.js.map +1 -1
- package/dist/internal/events/interface.d.ts +1 -1
- package/dist/internal/events/interface.js +0 -1
- package/dist/internal/events/interface.js.map +1 -1
- package/dist/internal/events/volumeEventManager.d.ts +3 -3
- package/dist/internal/events/volumeEventManager.js.map +1 -1
- package/dist/internal/events/volumeEventManager.test.js +55 -55
- package/dist/internal/events/volumeEventManager.test.js.map +1 -1
- 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 +5 -5
- package/dist/internal/nodes/cache.js +14 -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 +3 -3
- 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 +3 -3
- package/dist/internal/nodes/events.js +7 -7
- package/dist/internal/nodes/events.js.map +1 -1
- package/dist/internal/nodes/events.test.js +27 -21
- 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 +10 -10
- package/dist/internal/nodes/index.js.map +1 -1
- package/dist/internal/nodes/index.test.d.ts +1 -0
- package/dist/internal/nodes/index.test.js +106 -0
- package/dist/internal/nodes/index.test.js.map +1 -0
- package/dist/internal/nodes/interface.d.ts +2 -2
- package/dist/internal/nodes/nodesAccess.d.ts +7 -7
- package/dist/internal/nodes/nodesAccess.js +28 -16
- package/dist/internal/nodes/nodesAccess.js.map +1 -1
- package/dist/internal/nodes/nodesAccess.test.js +39 -13
- package/dist/internal/nodes/nodesAccess.test.js.map +1 -1
- package/dist/internal/nodes/nodesManagement.d.ts +6 -6
- package/dist/internal/nodes/nodesManagement.js +9 -7
- package/dist/internal/nodes/nodesManagement.js.map +1 -1
- package/dist/internal/nodes/nodesManagement.test.js +9 -9
- 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 +2 -2
- package/dist/internal/shares/cache.js +12 -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 +7 -7
- 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 +4 -3
- package/dist/internal/sharing/apiService.js.map +1 -1
- package/dist/internal/sharing/cache.d.ts +2 -1
- package/dist/internal/sharing/cache.js +9 -0
- package/dist/internal/sharing/cache.js.map +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 -5
- 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 +5 -4
- package/dist/internal/sharing/events.js +28 -19
- package/dist/internal/sharing/events.js.map +1 -1
- package/dist/internal/sharing/events.test.js +101 -88
- package/dist/internal/sharing/events.test.js.map +1 -1
- package/dist/internal/sharing/index.d.ts +6 -6
- package/dist/internal/sharing/index.js.map +1 -1
- package/dist/internal/sharing/interface.d.ts +5 -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 +4 -4
- package/dist/internal/sharing/sharingManagement.js +5 -7
- package/dist/internal/sharing/sharingManagement.js.map +1 -1
- package/dist/internal/sharing/sharingManagement.test.js +297 -248
- 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 +3 -3
- package/dist/internal/upload/apiService.js +1 -1
- 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 +5 -5
- package/dist/internal/upload/index.js.map +1 -1
- package/dist/internal/upload/interface.d.ts +4 -3
- package/dist/internal/upload/manager.d.ts +5 -5
- package/dist/internal/upload/manager.js +15 -9
- package/dist/internal/upload/manager.js.map +1 -1
- package/dist/internal/upload/manager.test.js +139 -128
- 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 -7
- 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 +8 -8
- package/dist/protonDriveClient.js +12 -9
- package/dist/protonDriveClient.js.map +1 -1
- 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.d.ts +1 -1
- package/dist/transformers.js +5 -2
- package/dist/transformers.js.map +1 -1
- package/package.json +1 -1
- package/src/cache/interface.ts +22 -22
- package/src/cache/memoryCache.test.ts +7 -7
- package/src/cache/memoryCache.ts +4 -4
- package/src/cache/nullCache.ts +1 -1
- package/src/config.ts +5 -5
- 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 +74 -94
- package/src/crypto/utils.ts +1 -1
- package/src/diagnostic/eventsGenerator.ts +2 -2
- package/src/diagnostic/httpClient.ts +6 -2
- package/src/diagnostic/index.ts +12 -10
- package/src/diagnostic/integrityVerificationStream.ts +3 -4
- package/src/diagnostic/interface.ts +81 -81
- package/src/diagnostic/sdkDiagnostic.ts +35 -24
- package/src/diagnostic/sdkDiagnosticFull.ts +16 -19
- package/src/diagnostic/telemetry.ts +4 -1
- package/src/diagnostic/zipGenerators.test.ts +1 -1
- package/src/diagnostic/zipGenerators.ts +3 -3
- package/src/errors.ts +21 -21
- 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 +4 -4
- package/src/interface/devices.ts +6 -6
- package/src/interface/download.ts +12 -9
- package/src/interface/events.ts +45 -39
- package/src/interface/httpClient.ts +11 -11
- package/src/interface/index.ts +76 -19
- package/src/interface/nodes.ts +47 -49
- package/src/interface/result.ts +1 -3
- package/src/interface/sharing.ts +60 -57
- package/src/interface/telemetry.ts +74 -74
- package/src/interface/thumbnail.ts +5 -6
- package/src/interface/upload.ts +20 -12
- 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 +66 -49
- package/src/internal/download/cryptoService.ts +34 -18
- package/src/internal/download/fileDownloader.test.ts +25 -9
- package/src/internal/download/fileDownloader.ts +36 -18
- 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 +30 -17
- package/src/internal/events/coreEventManager.test.ts +18 -18
- package/src/internal/events/coreEventManager.ts +9 -6
- package/src/internal/events/eventManager.test.ts +108 -82
- package/src/internal/events/eventManager.ts +16 -5
- package/src/internal/events/index.ts +75 -47
- package/src/internal/events/interface.ts +47 -39
- package/src/internal/events/volumeEventManager.test.ts +61 -65
- package/src/internal/events/volumeEventManager.ts +18 -9
- 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 +60 -44
- 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 +170 -88
- package/src/internal/nodes/events.test.ts +38 -28
- package/src/internal/nodes/events.ts +13 -12
- package/src/internal/nodes/extendedAttributes.test.ts +28 -24
- package/src/internal/nodes/extendedAttributes.ts +20 -15
- package/src/internal/nodes/index.test.ts +133 -0
- package/src/internal/nodes/index.ts +27 -15
- package/src/internal/nodes/interface.ts +42 -29
- package/src/internal/nodes/nodesAccess.test.ts +124 -58
- package/src/internal/nodes/nodesAccess.ts +73 -49
- package/src/internal/nodes/nodesManagement.test.ts +32 -31
- package/src/internal/nodes/nodesManagement.ts +39 -32
- 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 +21 -12
- 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 +19 -19
- package/src/internal/sharing/apiService.ts +282 -175
- package/src/internal/sharing/cache.test.ts +35 -35
- package/src/internal/sharing/cache.ts +11 -2
- package/src/internal/sharing/cryptoService.test.ts +58 -46
- package/src/internal/sharing/cryptoService.ts +121 -84
- package/src/internal/sharing/events.test.ts +113 -102
- package/src/internal/sharing/events.ts +42 -24
- package/src/internal/sharing/index.ts +22 -11
- package/src/internal/sharing/interface.ts +40 -40
- package/src/internal/sharing/sharingAccess.test.ts +71 -65
- package/src/internal/sharing/sharingAccess.ts +39 -21
- package/src/internal/sharing/sharingManagement.test.ts +398 -298
- package/src/internal/sharing/sharingManagement.ts +138 -65
- package/src/internal/uids.ts +1 -1
- package/src/internal/upload/apiService.ts +167 -117
- 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 +13 -14
- package/src/internal/upload/interface.ts +79 -78
- package/src/internal/upload/manager.test.ts +170 -156
- package/src/internal/upload/manager.ts +66 -39
- package/src/internal/upload/queue.ts +3 -3
- package/src/internal/upload/streamUploader.test.ts +40 -26
- package/src/internal/upload/streamUploader.ts +87 -69
- 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 +121 -39
- package/src/protonDrivePhotosClient.ts +16 -10
- package/src/telemetry.ts +60 -52
- package/src/tests/logger.ts +1 -1
- package/src/tests/telemetry.ts +2 -2
- package/src/transformers.ts +29 -21
- package/src/version.ts +0 -1
|
@@ -1,32 +1,24 @@
|
|
|
1
|
-
import { getMockLogger } from
|
|
2
|
-
import { EventManager } from
|
|
3
|
-
import { DriveEvent, DriveEventType, EventSubscription, UnsubscribeFromEventsSourceError } from
|
|
1
|
+
import { getMockLogger } from '../../tests/logger';
|
|
2
|
+
import { EventManager } from './eventManager';
|
|
3
|
+
import { DriveEvent, DriveEventType, EventSubscription, UnsubscribeFromEventsSourceError } from './interface';
|
|
4
4
|
|
|
5
5
|
jest.useFakeTimers();
|
|
6
6
|
|
|
7
7
|
const POLLING_INTERVAL = 1;
|
|
8
8
|
|
|
9
|
-
describe(
|
|
9
|
+
describe('EventManager', () => {
|
|
10
10
|
let manager: EventManager<DriveEvent>;
|
|
11
11
|
|
|
12
|
-
const getLatestEventIdMock = jest.fn();
|
|
13
|
-
const getEventsMock = jest.fn();
|
|
14
12
|
const listenerMock = jest.fn();
|
|
15
|
-
const mockLogger = getMockLogger();
|
|
16
13
|
const subscriptions: EventSubscription[] = [];
|
|
14
|
+
const mockEventManager = {
|
|
15
|
+
getLogger: () => getMockLogger(),
|
|
16
|
+
getLatestEventId: jest.fn(),
|
|
17
|
+
getEvents: jest.fn(),
|
|
18
|
+
};
|
|
17
19
|
|
|
18
20
|
beforeEach(() => {
|
|
19
|
-
|
|
20
|
-
getLogger: () => mockLogger,
|
|
21
|
-
getLatestEventId: getLatestEventIdMock,
|
|
22
|
-
getEvents: getEventsMock,
|
|
23
|
-
};
|
|
24
|
-
|
|
25
|
-
manager = new EventManager(
|
|
26
|
-
mockEventManager as any,
|
|
27
|
-
POLLING_INTERVAL,
|
|
28
|
-
null,
|
|
29
|
-
);
|
|
21
|
+
manager = new EventManager(mockEventManager, POLLING_INTERVAL, null);
|
|
30
22
|
const subscription = manager.addListener(listenerMock);
|
|
31
23
|
subscriptions.push(subscription);
|
|
32
24
|
});
|
|
@@ -40,45 +32,52 @@ describe("EventManager", () => {
|
|
|
40
32
|
jest.clearAllMocks();
|
|
41
33
|
});
|
|
42
34
|
|
|
43
|
-
it(
|
|
44
|
-
|
|
35
|
+
it('should start polling when started', async () => {
|
|
36
|
+
mockEventManager.getLatestEventId.mockResolvedValue('EventId1');
|
|
45
37
|
|
|
46
38
|
const mockEvents: DriveEvent[][] = [
|
|
47
|
-
[
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
39
|
+
[
|
|
40
|
+
{
|
|
41
|
+
type: DriveEventType.FastForward,
|
|
42
|
+
treeEventScopeId: 'volume1',
|
|
43
|
+
eventId: 'EventId2',
|
|
44
|
+
},
|
|
45
|
+
],
|
|
46
|
+
[
|
|
47
|
+
{
|
|
48
|
+
type: DriveEventType.FastForward,
|
|
49
|
+
treeEventScopeId: 'volume1',
|
|
50
|
+
eventId: 'EventId3',
|
|
51
|
+
},
|
|
52
|
+
],
|
|
57
53
|
];
|
|
58
54
|
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
55
|
+
mockEventManager.getEvents
|
|
56
|
+
.mockImplementationOnce(async function* () {
|
|
57
|
+
yield* mockEvents[0];
|
|
58
|
+
})
|
|
59
|
+
.mockImplementationOnce(async function* () {
|
|
60
|
+
yield* mockEvents[1];
|
|
61
|
+
})
|
|
62
|
+
.mockImplementationOnce(async function* () {});
|
|
65
63
|
|
|
66
|
-
expect(
|
|
67
|
-
expect(
|
|
64
|
+
expect(mockEventManager.getLatestEventId).toHaveBeenCalledTimes(0);
|
|
65
|
+
expect(mockEventManager.getEvents).toHaveBeenCalledTimes(0);
|
|
68
66
|
|
|
69
67
|
expect(await manager.start()).toBeUndefined();
|
|
68
|
+
await jest.runOnlyPendingTimersAsync();
|
|
70
69
|
|
|
71
|
-
expect(
|
|
72
|
-
expect(
|
|
70
|
+
expect(mockEventManager.getLatestEventId).toHaveBeenCalledTimes(1);
|
|
71
|
+
expect(mockEventManager.getEvents).toHaveBeenCalledWith('EventId1');
|
|
73
72
|
|
|
74
73
|
await jest.runOnlyPendingTimersAsync();
|
|
75
|
-
expect(
|
|
76
|
-
expect(
|
|
74
|
+
expect(mockEventManager.getEvents).toHaveBeenCalledTimes(2);
|
|
75
|
+
expect(mockEventManager.getEvents).toHaveBeenCalledWith('EventId2');
|
|
77
76
|
});
|
|
78
77
|
|
|
79
|
-
it(
|
|
80
|
-
|
|
81
|
-
|
|
78
|
+
it('should stop polling when stopped', async () => {
|
|
79
|
+
mockEventManager.getLatestEventId.mockResolvedValue('eventId1');
|
|
80
|
+
mockEventManager.getEvents.mockImplementation(async function* () {
|
|
82
81
|
yield {
|
|
83
82
|
type: DriveEventType.FastForward,
|
|
84
83
|
treeEventScopeId: 'volume1',
|
|
@@ -89,16 +88,16 @@ describe("EventManager", () => {
|
|
|
89
88
|
await manager.start();
|
|
90
89
|
await jest.runOnlyPendingTimersAsync();
|
|
91
90
|
|
|
92
|
-
const callsBeforeStop =
|
|
91
|
+
const callsBeforeStop = mockEventManager.getEvents.mock.calls.length;
|
|
93
92
|
await manager.stop();
|
|
94
93
|
await jest.runOnlyPendingTimersAsync();
|
|
95
94
|
|
|
96
95
|
// Should not have made additional calls after stopping
|
|
97
|
-
expect(
|
|
96
|
+
expect(mockEventManager.getEvents).toHaveBeenCalledTimes(callsBeforeStop);
|
|
98
97
|
});
|
|
99
98
|
|
|
100
|
-
it(
|
|
101
|
-
|
|
99
|
+
it('should notify all listeners when getting events', async () => {
|
|
100
|
+
mockEventManager.getLatestEventId.mockResolvedValue('eventId1');
|
|
102
101
|
|
|
103
102
|
const mockEvents: DriveEvent[] = [
|
|
104
103
|
{
|
|
@@ -112,10 +111,11 @@ describe("EventManager", () => {
|
|
|
112
111
|
},
|
|
113
112
|
];
|
|
114
113
|
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
114
|
+
mockEventManager.getEvents
|
|
115
|
+
.mockImplementationOnce(async function* () {
|
|
116
|
+
yield* mockEvents;
|
|
117
|
+
})
|
|
118
|
+
.mockImplementation(async function* () {});
|
|
119
119
|
|
|
120
120
|
expect(await manager.start()).toBeUndefined();
|
|
121
121
|
await jest.runOnlyPendingTimersAsync();
|
|
@@ -123,20 +123,20 @@ describe("EventManager", () => {
|
|
|
123
123
|
expect(listenerMock).toHaveBeenNthCalledWith(1, mockEvents[0]);
|
|
124
124
|
});
|
|
125
125
|
|
|
126
|
-
it(
|
|
127
|
-
|
|
128
|
-
throw new UnsubscribeFromEventsSourceError(
|
|
126
|
+
it('should propagate unsubscription errors', async () => {
|
|
127
|
+
mockEventManager.getLatestEventId.mockImplementation(() => {
|
|
128
|
+
throw new UnsubscribeFromEventsSourceError('Not found');
|
|
129
129
|
});
|
|
130
130
|
|
|
131
131
|
await expect(manager.start()).rejects.toThrow(UnsubscribeFromEventsSourceError);
|
|
132
132
|
|
|
133
|
-
expect(
|
|
133
|
+
expect(mockEventManager.getLatestEventId).toHaveBeenCalledTimes(1);
|
|
134
134
|
expect(listenerMock).toHaveBeenCalledTimes(0);
|
|
135
|
-
expect(
|
|
135
|
+
expect(mockEventManager.getEvents).toHaveBeenCalledTimes(0);
|
|
136
136
|
});
|
|
137
137
|
|
|
138
|
-
it(
|
|
139
|
-
|
|
138
|
+
it('should continue processing multiple events', async () => {
|
|
139
|
+
mockEventManager.getLatestEventId.mockResolvedValue('eventId1');
|
|
140
140
|
|
|
141
141
|
const mockEvents: DriveEvent[] = [
|
|
142
142
|
{
|
|
@@ -156,14 +156,16 @@ describe("EventManager", () => {
|
|
|
156
156
|
isShared: false,
|
|
157
157
|
treeEventScopeId: 'volume1',
|
|
158
158
|
eventId: 'eventId3',
|
|
159
|
-
}
|
|
159
|
+
},
|
|
160
160
|
];
|
|
161
161
|
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
162
|
+
mockEventManager.getEvents
|
|
163
|
+
.mockImplementationOnce(async function* () {
|
|
164
|
+
yield* mockEvents;
|
|
165
|
+
})
|
|
166
|
+
.mockImplementation(async function* () {
|
|
167
|
+
// Empty generator for subsequent calls
|
|
168
|
+
});
|
|
167
169
|
|
|
168
170
|
await manager.start();
|
|
169
171
|
await jest.runOnlyPendingTimersAsync();
|
|
@@ -172,23 +174,23 @@ describe("EventManager", () => {
|
|
|
172
174
|
expect(listenerMock).toHaveBeenNthCalledWith(1, mockEvents[0]);
|
|
173
175
|
expect(listenerMock).toHaveBeenNthCalledWith(2, mockEvents[1]);
|
|
174
176
|
|
|
175
|
-
|
|
177
|
+
mockEventManager.getEvents.mockImplementationOnce(async function* () {
|
|
176
178
|
yield* mockEvents;
|
|
177
|
-
})
|
|
179
|
+
});
|
|
178
180
|
await jest.runOnlyPendingTimersAsync();
|
|
179
181
|
expect(listenerMock).toHaveBeenCalledTimes(4);
|
|
180
182
|
expect(listenerMock).toHaveBeenNthCalledWith(1, mockEvents[0]);
|
|
181
183
|
expect(listenerMock).toHaveBeenNthCalledWith(2, mockEvents[1]);
|
|
182
184
|
});
|
|
183
185
|
|
|
184
|
-
it(
|
|
185
|
-
|
|
186
|
+
it('should retry on error with exponential backoff', async () => {
|
|
187
|
+
mockEventManager.getLatestEventId.mockResolvedValue('eventId1');
|
|
186
188
|
|
|
187
189
|
let callCount = 0;
|
|
188
|
-
|
|
190
|
+
mockEventManager.getEvents.mockImplementation(async function* () {
|
|
189
191
|
callCount++;
|
|
190
192
|
if (callCount <= 3) {
|
|
191
|
-
throw new Error(
|
|
193
|
+
throw new Error('Network error');
|
|
192
194
|
}
|
|
193
195
|
yield {
|
|
194
196
|
type: DriveEventType.FastForward,
|
|
@@ -200,11 +202,12 @@ describe("EventManager", () => {
|
|
|
200
202
|
expect(manager['retryIndex']).toEqual(0);
|
|
201
203
|
|
|
202
204
|
expect(await manager.start()).toBeUndefined();
|
|
203
|
-
|
|
205
|
+
await jest.runOnlyPendingTimersAsync();
|
|
206
|
+
expect(mockEventManager.getEvents).toHaveBeenCalledTimes(1);
|
|
204
207
|
expect(manager['retryIndex']).toEqual(1);
|
|
205
208
|
|
|
206
209
|
await jest.runOnlyPendingTimersAsync();
|
|
207
|
-
expect(
|
|
210
|
+
expect(mockEventManager.getEvents).toHaveBeenCalledTimes(2);
|
|
208
211
|
expect(manager['retryIndex']).toEqual(2);
|
|
209
212
|
|
|
210
213
|
await jest.runOnlyPendingTimersAsync();
|
|
@@ -218,9 +221,9 @@ describe("EventManager", () => {
|
|
|
218
221
|
expect(manager['retryIndex']).toEqual(0);
|
|
219
222
|
});
|
|
220
223
|
|
|
221
|
-
it(
|
|
222
|
-
|
|
223
|
-
|
|
224
|
+
it('should stop polling when stopped immediately', async () => {
|
|
225
|
+
mockEventManager.getLatestEventId.mockResolvedValue('eventId1');
|
|
226
|
+
mockEventManager.getEvents.mockImplementation(async function* () {
|
|
224
227
|
yield {
|
|
225
228
|
type: DriveEventType.FastForward,
|
|
226
229
|
treeEventScopeId: 'volume1',
|
|
@@ -229,18 +232,19 @@ describe("EventManager", () => {
|
|
|
229
232
|
});
|
|
230
233
|
|
|
231
234
|
expect(await manager.start()).toBeUndefined();
|
|
232
|
-
|
|
235
|
+
await jest.runOnlyPendingTimersAsync();
|
|
236
|
+
expect(mockEventManager.getEvents).toHaveBeenCalledTimes(1);
|
|
233
237
|
await manager.stop();
|
|
234
238
|
await jest.runOnlyPendingTimersAsync();
|
|
235
239
|
|
|
236
240
|
// getEvents should have been called once during start, but not again after stop
|
|
237
|
-
expect(
|
|
241
|
+
expect(mockEventManager.getEvents).toHaveBeenCalledTimes(1);
|
|
238
242
|
});
|
|
239
243
|
|
|
240
|
-
it(
|
|
241
|
-
|
|
244
|
+
it('should handle empty event streams', async () => {
|
|
245
|
+
mockEventManager.getLatestEventId.mockResolvedValue('eventId1');
|
|
242
246
|
|
|
243
|
-
|
|
247
|
+
mockEventManager.getEvents.mockImplementation(async function* () {
|
|
244
248
|
// Empty generator - no events
|
|
245
249
|
});
|
|
246
250
|
|
|
@@ -249,4 +253,26 @@ describe("EventManager", () => {
|
|
|
249
253
|
|
|
250
254
|
expect(listenerMock).toHaveBeenCalledTimes(0);
|
|
251
255
|
});
|
|
256
|
+
|
|
257
|
+
it('should poll right away after start if latestEventId is passed', async () => {
|
|
258
|
+
manager = new EventManager(mockEventManager, POLLING_INTERVAL, 'eventId1');
|
|
259
|
+
|
|
260
|
+
await manager.start();
|
|
261
|
+
|
|
262
|
+
// Right after the start it is called.
|
|
263
|
+
expect(mockEventManager.getEvents).toHaveBeenCalledTimes(1);
|
|
264
|
+
});
|
|
265
|
+
|
|
266
|
+
it('should not poll right away after start if latestEventId is not passed', async () => {
|
|
267
|
+
manager = new EventManager(mockEventManager, POLLING_INTERVAL, null);
|
|
268
|
+
|
|
269
|
+
await manager.start();
|
|
270
|
+
|
|
271
|
+
// Right after the start it is not called.
|
|
272
|
+
expect(mockEventManager.getEvents).not.toHaveBeenCalled();
|
|
273
|
+
|
|
274
|
+
// But it is scheduled to be called after the polling interval.
|
|
275
|
+
await jest.runOnlyPendingTimersAsync();
|
|
276
|
+
expect(mockEventManager.getEvents).toHaveBeenCalledTimes(1);
|
|
277
|
+
});
|
|
252
278
|
});
|
|
@@ -1,11 +1,10 @@
|
|
|
1
|
-
import { Logger } from
|
|
2
|
-
import { EventManagerInterface, Event, EventSubscription } from
|
|
1
|
+
import { Logger } from '../../interface';
|
|
2
|
+
import { EventManagerInterface, Event, EventSubscription } from './interface';
|
|
3
3
|
|
|
4
4
|
const FIBONACCI_LIST = [1, 1, 2, 3, 5, 8, 13];
|
|
5
5
|
|
|
6
6
|
type Listener<T> = (event: T) => Promise<void>;
|
|
7
7
|
|
|
8
|
-
|
|
9
8
|
/**
|
|
10
9
|
* Event manager general helper that is responsible for fetching events
|
|
11
10
|
* from the server and notifying listeners about the events.
|
|
@@ -39,8 +38,11 @@ export class EventManager<T extends Event> {
|
|
|
39
38
|
}
|
|
40
39
|
|
|
41
40
|
async start(): Promise<void> {
|
|
41
|
+
this.logger.info(`Starting event manager with latestEventId: ${this.latestEventId}`);
|
|
42
42
|
if (this.latestEventId === undefined) {
|
|
43
43
|
this.latestEventId = await this.specializedEventManager.getLatestEventId();
|
|
44
|
+
this.scheduleNextPoll();
|
|
45
|
+
return;
|
|
44
46
|
}
|
|
45
47
|
this.processPromise = this.processEvents();
|
|
46
48
|
}
|
|
@@ -99,17 +101,26 @@ export class EventManager<T extends Event> {
|
|
|
99
101
|
this.retryIndex = 0;
|
|
100
102
|
} catch (error: unknown) {
|
|
101
103
|
// This could be improved to catch api specific errors and let the listener errors bubble up directly
|
|
102
|
-
this.logger.error(
|
|
104
|
+
this.logger.error(
|
|
105
|
+
`Failed to process events: ${error instanceof Error ? error.message : error} (retry ${this.retryIndex}, last event ID: ${this.latestEventId})`,
|
|
106
|
+
);
|
|
103
107
|
this.retryIndex++;
|
|
104
108
|
}
|
|
105
109
|
if (listenerError) {
|
|
106
110
|
throw listenerError;
|
|
107
111
|
}
|
|
108
112
|
|
|
113
|
+
this.scheduleNextPoll();
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
private scheduleNextPoll() {
|
|
117
|
+
if (this.timeoutHandle) {
|
|
118
|
+
clearTimeout(this.timeoutHandle);
|
|
119
|
+
}
|
|
109
120
|
this.timeoutHandle = setTimeout(() => {
|
|
110
121
|
this.processPromise = this.processEvents();
|
|
111
122
|
}, this.nextPollTimeout);
|
|
112
|
-
}
|
|
123
|
+
}
|
|
113
124
|
|
|
114
125
|
/**
|
|
115
126
|
* Polling timeout is using exponential backoff with Fibonacci sequence.
|
|
@@ -1,14 +1,14 @@
|
|
|
1
|
-
import { Logger, ProtonDriveTelemetry } from
|
|
2
|
-
import { DriveAPIService } from
|
|
3
|
-
import { DriveEvent, DriveListener, EventSubscription, LatestEventIdProvider } from
|
|
4
|
-
import { EventsAPIService } from
|
|
5
|
-
import { CoreEventManager } from
|
|
6
|
-
import { VolumeEventManager } from
|
|
7
|
-
import { EventManager } from
|
|
8
|
-
import { SharesManager } from
|
|
9
|
-
|
|
10
|
-
export type { DriveEvent, DriveListener } from
|
|
11
|
-
export { DriveEventType } from
|
|
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';
|
|
12
12
|
|
|
13
13
|
const OWN_VOLUME_POLLING_INTERVAL = 30;
|
|
14
14
|
const OTHER_VOLUME_POLLING_INTERVAL = 60;
|
|
@@ -21,81 +21,109 @@ const CORE_POLLING_INTERVAL = 30;
|
|
|
21
21
|
*/
|
|
22
22
|
export class DriveEventsService {
|
|
23
23
|
private apiService: EventsAPIService;
|
|
24
|
-
private
|
|
24
|
+
private coreEventManager?: EventManager<DriveEvent>;
|
|
25
25
|
private volumeEventManagers: { [volumeId: string]: EventManager<DriveEvent> };
|
|
26
26
|
private logger: Logger;
|
|
27
27
|
|
|
28
|
-
constructor(
|
|
28
|
+
constructor(
|
|
29
|
+
private telemetry: ProtonDriveTelemetry,
|
|
30
|
+
apiService: DriveAPIService,
|
|
31
|
+
private shareManagement: SharesManager,
|
|
32
|
+
private cacheEventListeners: DriveListener[] = [],
|
|
33
|
+
private latestEventIdProvider?: LatestEventIdProvider,
|
|
34
|
+
) {
|
|
29
35
|
this.telemetry = telemetry;
|
|
30
36
|
this.logger = telemetry.getLogger('events');
|
|
31
37
|
this.apiService = new EventsAPIService(apiService);
|
|
32
38
|
this.volumeEventManagers = {};
|
|
33
39
|
}
|
|
34
40
|
|
|
41
|
+
// FIXME: Allow to pass own core events manager from the public interface.
|
|
42
|
+
async subscribeToCoreEvents(callback: DriveListener): Promise<EventSubscription> {
|
|
43
|
+
let manager = this.coreEventManager;
|
|
44
|
+
const started = !!manager;
|
|
45
|
+
|
|
46
|
+
if (manager === undefined) {
|
|
47
|
+
manager = await this.createCoreEventManager();
|
|
48
|
+
this.coreEventManager = manager;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
const eventSubscription = manager.addListener(callback);
|
|
52
|
+
if (!started) {
|
|
53
|
+
await manager.start();
|
|
54
|
+
}
|
|
55
|
+
return eventSubscription;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
private async createCoreEventManager() {
|
|
59
|
+
if (!this.latestEventIdProvider) {
|
|
60
|
+
throw new Error(
|
|
61
|
+
'Cannot subscribe to events without passing a latestEventIdProvider in ProtonDriveClient initialization',
|
|
62
|
+
);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
const coreEventManager = new CoreEventManager(this.logger, this.apiService);
|
|
66
|
+
const latestEventId = this.latestEventIdProvider.getLatestEventId('core') ?? null;
|
|
67
|
+
const eventManager = new EventManager(coreEventManager, CORE_POLLING_INTERVAL, latestEventId);
|
|
68
|
+
|
|
69
|
+
for (const listener of this.cacheEventListeners) {
|
|
70
|
+
eventManager.addListener(listener);
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
return eventManager;
|
|
74
|
+
}
|
|
75
|
+
|
|
35
76
|
/**
|
|
36
77
|
* Subscribe to drive events. The treeEventScopeId can be obtained from a node.
|
|
37
78
|
*/
|
|
38
79
|
async subscribeToTreeEvents(treeEventScopeId: string, callback: DriveListener): Promise<EventSubscription> {
|
|
39
80
|
const volumeId = treeEventScopeId;
|
|
40
|
-
this.logger.debug(`Creating volume event manager for volume ${volumeId}`);
|
|
41
81
|
let manager = this.volumeEventManagers[volumeId];
|
|
42
|
-
|
|
82
|
+
const started = !!manager;
|
|
83
|
+
|
|
43
84
|
if (manager === undefined) {
|
|
44
85
|
manager = await this.createVolumeEventManager(volumeId);
|
|
45
86
|
this.volumeEventManagers[volumeId] = manager;
|
|
46
|
-
started = false;
|
|
47
|
-
this.sendNumberOfVolumeSubscriptionsToTelemetry();
|
|
48
87
|
}
|
|
88
|
+
|
|
49
89
|
const eventSubscription = manager.addListener(callback);
|
|
50
90
|
if (!started) {
|
|
51
91
|
await manager.start();
|
|
92
|
+
this.sendNumberOfVolumeSubscriptionsToTelemetry();
|
|
52
93
|
}
|
|
53
94
|
return eventSubscription;
|
|
54
95
|
}
|
|
55
96
|
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
if (this.coreEvents === undefined) {
|
|
62
|
-
const coreEventManager = new CoreEventManager(this.logger, this.apiService);
|
|
63
|
-
const latestEventId = this.latestEventIdProvider.getLatestEventId('core') ?? null;
|
|
64
|
-
this.coreEvents = new EventManager(coreEventManager, CORE_POLLING_INTERVAL, latestEventId);
|
|
65
|
-
for (const listener of this.cacheEventListeners) {
|
|
66
|
-
this.coreEvents.addListener(listener);
|
|
67
|
-
}
|
|
97
|
+
private async createVolumeEventManager(volumeId: string): Promise<EventManager<DriveEvent>> {
|
|
98
|
+
if (!this.latestEventIdProvider) {
|
|
99
|
+
throw new Error(
|
|
100
|
+
'Cannot subscribe to events without passing a latestEventIdProvider in ProtonDriveClient initialization',
|
|
101
|
+
);
|
|
68
102
|
}
|
|
69
|
-
const eventSubscription = this.coreEvents.addListener(callback);
|
|
70
|
-
await this.coreEvents.start();
|
|
71
|
-
return eventSubscription;
|
|
72
|
-
}
|
|
73
103
|
|
|
74
|
-
|
|
75
|
-
this.
|
|
76
|
-
eventName: 'volumeEventsSubscriptionsChanged',
|
|
77
|
-
numberOfVolumeSubscriptions: Object.keys(this.volumeEventManagers).length,
|
|
78
|
-
});
|
|
79
|
-
}
|
|
104
|
+
this.logger.debug(`Creating volume event manager for volume ${volumeId}`);
|
|
105
|
+
const volumeEventManager = new VolumeEventManager(this.logger, this.apiService, volumeId);
|
|
80
106
|
|
|
81
|
-
private async createVolumeEventManager(volumeId: string): Promise<EventManager<DriveEvent>> {
|
|
82
|
-
if (this.latestEventIdProvider === null || this.latestEventIdProvider === undefined) {
|
|
83
|
-
throw new Error('Cannot subscribe to events without passing a latestEventIdProvider in ProtonDriveClient initialization');
|
|
84
|
-
}
|
|
85
107
|
const isOwnVolume = await this.shareManagement.isOwnVolume(volumeId);
|
|
86
108
|
const pollingInterval = this.getDefaultVolumePollingInterval(isOwnVolume);
|
|
87
|
-
const volumeEventManager = new VolumeEventManager(this.logger, this.apiService, volumeId);
|
|
88
109
|
const latestEventId = this.latestEventIdProvider.getLatestEventId(volumeId);
|
|
89
110
|
const eventManager = new EventManager<DriveEvent>(volumeEventManager, pollingInterval, latestEventId);
|
|
111
|
+
|
|
90
112
|
for (const listener of this.cacheEventListeners) {
|
|
91
113
|
eventManager.addListener(listener);
|
|
92
114
|
}
|
|
93
|
-
|
|
94
|
-
this.volumeEventManagers[volumeId] = eventManager;
|
|
115
|
+
|
|
95
116
|
return eventManager;
|
|
96
117
|
}
|
|
97
118
|
|
|
98
119
|
private getDefaultVolumePollingInterval(isOwnVolume: boolean): number {
|
|
99
|
-
return isOwnVolume ? OWN_VOLUME_POLLING_INTERVAL : OTHER_VOLUME_POLLING_INTERVAL
|
|
120
|
+
return isOwnVolume ? OWN_VOLUME_POLLING_INTERVAL : OTHER_VOLUME_POLLING_INTERVAL;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
private sendNumberOfVolumeSubscriptionsToTelemetry() {
|
|
124
|
+
this.telemetry.logEvent({
|
|
125
|
+
eventName: 'volumeEventsSubscriptionsChanged',
|
|
126
|
+
numberOfVolumeSubscriptions: Object.keys(this.volumeEventManagers).length,
|
|
127
|
+
});
|
|
100
128
|
}
|
|
101
129
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Logger } from
|
|
1
|
+
import { Logger } from '../../interface';
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
4
|
* Callback that accepts list of Drive events and flag whether no
|
|
@@ -27,11 +27,11 @@ export interface LatestEventIdProvider {
|
|
|
27
27
|
* events to fetch, or whether the listener should refresh its state.
|
|
28
28
|
*/
|
|
29
29
|
export type EventsListWithStatus<T> = {
|
|
30
|
-
latestEventId: string
|
|
31
|
-
more: boolean
|
|
32
|
-
refresh: boolean
|
|
33
|
-
events: T[]
|
|
34
|
-
}
|
|
30
|
+
latestEventId: string;
|
|
31
|
+
more: boolean;
|
|
32
|
+
refresh: boolean;
|
|
33
|
+
events: T[];
|
|
34
|
+
};
|
|
35
35
|
|
|
36
36
|
/**
|
|
37
37
|
* Internal event interface representing a list of specific Drive events.
|
|
@@ -41,47 +41,55 @@ export type DriveEventsListWithStatus = EventsListWithStatus<DriveEvent>;
|
|
|
41
41
|
type NodeCruEventType = DriveEventType.NodeCreated | DriveEventType.NodeUpdated;
|
|
42
42
|
export type NodeEventType = NodeCruEventType | DriveEventType.NodeDeleted;
|
|
43
43
|
|
|
44
|
-
export type NodeEvent =
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
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
|
+
};
|
|
59
61
|
|
|
60
62
|
export type FastForwardEvent = {
|
|
61
|
-
type: DriveEventType.FastForward
|
|
62
|
-
treeEventScopeId: string
|
|
63
|
-
eventId: string
|
|
64
|
-
}
|
|
63
|
+
type: DriveEventType.FastForward;
|
|
64
|
+
treeEventScopeId: string;
|
|
65
|
+
eventId: string;
|
|
66
|
+
};
|
|
65
67
|
|
|
66
68
|
export type TreeRefreshEvent = {
|
|
67
|
-
type: DriveEventType.TreeRefresh
|
|
68
|
-
treeEventScopeId: string
|
|
69
|
-
eventId: string
|
|
70
|
-
}
|
|
69
|
+
type: DriveEventType.TreeRefresh;
|
|
70
|
+
treeEventScopeId: string;
|
|
71
|
+
eventId: string;
|
|
72
|
+
};
|
|
71
73
|
|
|
72
74
|
export type TreeRemovalEvent = {
|
|
73
|
-
type: DriveEventType.TreeRemove
|
|
74
|
-
treeEventScopeId: string
|
|
75
|
-
eventId: 'none'
|
|
76
|
-
}
|
|
75
|
+
type: DriveEventType.TreeRemove;
|
|
76
|
+
treeEventScopeId: string;
|
|
77
|
+
eventId: 'none';
|
|
78
|
+
};
|
|
77
79
|
|
|
78
80
|
export type SharedWithMeUpdated = {
|
|
79
|
-
type: DriveEventType.SharedWithMeUpdated
|
|
80
|
-
eventId: string
|
|
81
|
-
treeEventScopeId: 'core'
|
|
82
|
-
}
|
|
81
|
+
type: DriveEventType.SharedWithMeUpdated;
|
|
82
|
+
eventId: string;
|
|
83
|
+
treeEventScopeId: 'core';
|
|
84
|
+
};
|
|
83
85
|
|
|
84
|
-
export type DriveEvent =
|
|
86
|
+
export type DriveEvent =
|
|
87
|
+
| NodeEvent
|
|
88
|
+
| FastForwardEvent
|
|
89
|
+
| TreeRefreshEvent
|
|
90
|
+
| TreeRemovalEvent
|
|
91
|
+
| FastForwardEvent
|
|
92
|
+
| SharedWithMeUpdated;
|
|
85
93
|
|
|
86
94
|
export enum DriveEventType {
|
|
87
95
|
NodeCreated = 'node_created',
|
|
@@ -97,7 +105,7 @@ export enum DriveEventType {
|
|
|
97
105
|
* This can happen if all shared nodes in that volume where unshared or if the
|
|
98
106
|
* volume was deleted.
|
|
99
107
|
*/
|
|
100
|
-
export class UnsubscribeFromEventsSourceError extends Error {}
|
|
108
|
+
export class UnsubscribeFromEventsSourceError extends Error {}
|
|
101
109
|
|
|
102
110
|
export interface EventManagerInterface<T> {
|
|
103
111
|
getLatestEventId(): Promise<string>;
|