@protontech/drive-sdk 0.1.0 → 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/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 +1 -1
- package/dist/internal/events/eventManager.js +0 -1
- package/dist/internal/events/eventManager.js.map +1 -1
- package/dist/internal/events/eventManager.test.js +34 -25
- package/dist/internal/events/eventManager.test.js.map +1 -1
- package/dist/internal/events/index.d.ts +6 -6
- 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.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 +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 +4 -4
- package/dist/internal/sharing/events.js +0 -1
- package/dist/internal/sharing/events.js.map +1 -1
- package/dist/internal/sharing/events.test.js +39 -40
- 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 +3 -3
- package/dist/internal/upload/manager.d.ts +4 -4
- package/dist/internal/upload/manager.js +7 -5
- package/dist/internal/upload/manager.js.map +1 -1
- package/dist/internal/upload/manager.test.js +137 -123
- 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 +8 -6
- package/dist/internal/upload/streamUploader.js.map +1 -1
- package/dist/internal/upload/streamUploader.test.js +16 -11
- 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.js +4 -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 +51 -46
- package/src/internal/events/eventManager.ts +6 -5
- package/src/internal/events/index.ts +24 -14
- 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 +7 -5
- 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 +2 -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 +45 -49
- package/src/internal/sharing/events.ts +9 -6
- 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 +78 -78
- package/src/internal/upload/manager.test.ts +170 -153
- package/src/internal/upload/manager.ts +59 -35
- 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 +27 -21
- package/src/version.ts +0 -1
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { ProtonDriveHTTPClient, SDKEvent } from
|
|
2
|
-
import { getMockTelemetry } from
|
|
3
|
-
import { SDKEvents } from
|
|
1
|
+
import { ProtonDriveHTTPClient, SDKEvent } from '../../interface';
|
|
2
|
+
import { getMockTelemetry } from '../../tests/telemetry';
|
|
3
|
+
import { SDKEvents } from '../sdkEvents';
|
|
4
4
|
import { DriveAPIService } from './apiService';
|
|
5
5
|
import { HTTPErrorCode, ErrorCode } from './errorCodes';
|
|
6
6
|
|
|
@@ -10,7 +10,7 @@ function generateOkResponse() {
|
|
|
10
10
|
return new Response(JSON.stringify({ Code: ErrorCode.OK }), { status: HTTPErrorCode.OK });
|
|
11
11
|
}
|
|
12
12
|
|
|
13
|
-
describe(
|
|
13
|
+
describe('DriveAPIService', () => {
|
|
14
14
|
let sdkEvents: SDKEvents;
|
|
15
15
|
let httpClient: ProtonDriveHTTPClient;
|
|
16
16
|
let api: DriveAPIService;
|
|
@@ -24,7 +24,7 @@ describe("DriveAPIService", () => {
|
|
|
24
24
|
transfersResumed: jest.fn(),
|
|
25
25
|
requestsThrottled: jest.fn(),
|
|
26
26
|
requestsUnthrottled: jest.fn(),
|
|
27
|
-
}
|
|
27
|
+
};
|
|
28
28
|
httpClient = {
|
|
29
29
|
fetchJson: jest.fn(() => Promise.resolve(generateOkResponse())),
|
|
30
30
|
fetchBlob: jest.fn(() => Promise.resolve(new Response(new Uint8Array([1, 2, 3])))),
|
|
@@ -36,23 +36,25 @@ describe("DriveAPIService", () => {
|
|
|
36
36
|
expect(sdkEvents.transfersPaused).toHaveBeenCalledTimes(events.includes(SDKEvent.TransfersPaused) ? 1 : 0);
|
|
37
37
|
expect(sdkEvents.transfersResumed).toHaveBeenCalledTimes(events.includes(SDKEvent.TransfersResumed) ? 1 : 0);
|
|
38
38
|
expect(sdkEvents.requestsThrottled).toHaveBeenCalledTimes(events.includes(SDKEvent.RequestsThrottled) ? 1 : 0);
|
|
39
|
-
expect(sdkEvents.requestsUnthrottled).toHaveBeenCalledTimes(
|
|
39
|
+
expect(sdkEvents.requestsUnthrottled).toHaveBeenCalledTimes(
|
|
40
|
+
events.includes(SDKEvent.RequestsUnthrottled) ? 1 : 0,
|
|
41
|
+
);
|
|
40
42
|
}
|
|
41
43
|
|
|
42
|
-
describe(
|
|
43
|
-
it(
|
|
44
|
+
describe('should make', () => {
|
|
45
|
+
it('GET request', async () => {
|
|
44
46
|
const result = await api.get('test');
|
|
45
47
|
expect(result).toEqual({ Code: ErrorCode.OK });
|
|
46
48
|
await expectFetchJsonToBeCalledWith('GET');
|
|
47
49
|
});
|
|
48
50
|
|
|
49
|
-
it(
|
|
51
|
+
it('POST request', async () => {
|
|
50
52
|
const result = await api.post('test', { data: 'test' });
|
|
51
53
|
expect(result).toEqual({ Code: ErrorCode.OK });
|
|
52
54
|
await expectFetchJsonToBeCalledWith('POST', { data: 'test' });
|
|
53
55
|
});
|
|
54
56
|
|
|
55
|
-
it(
|
|
57
|
+
it('PUT request', async () => {
|
|
56
58
|
const result = await api.put('test', { data: 'test' });
|
|
57
59
|
expect(result).toEqual({ Code: ErrorCode.OK });
|
|
58
60
|
await expectFetchJsonToBeCalledWith('PUT', { data: 'test' });
|
|
@@ -63,24 +65,28 @@ describe("DriveAPIService", () => {
|
|
|
63
65
|
const request = httpClient.fetchJson.mock.calls[0][0];
|
|
64
66
|
expect(request.method).toEqual(method);
|
|
65
67
|
expect(request.timeoutMs).toEqual(30000);
|
|
66
|
-
expect(Array.from(request.headers.entries())).toEqual(
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
68
|
+
expect(Array.from(request.headers.entries())).toEqual(
|
|
69
|
+
Array.from(
|
|
70
|
+
new Headers({
|
|
71
|
+
Accept: 'application/vnd.protonmail.v1+json',
|
|
72
|
+
'Content-Type': 'application/json',
|
|
73
|
+
Language: 'en',
|
|
74
|
+
'x-pm-drive-sdk-version': `js@${process.env.npm_package_version}`,
|
|
75
|
+
}).entries(),
|
|
76
|
+
),
|
|
77
|
+
);
|
|
72
78
|
expect(await request.json).toEqual(data);
|
|
73
79
|
expectSDKEvents();
|
|
74
80
|
}
|
|
75
81
|
|
|
76
|
-
it(
|
|
82
|
+
it('storage GET request', async () => {
|
|
77
83
|
const stream = await api.getBlockStream('test', 'token');
|
|
78
84
|
const result = await Array.fromAsync(stream);
|
|
79
85
|
expect(result).toEqual([new Uint8Array([1, 2, 3])]);
|
|
80
86
|
await expectFetchBlobToBeCalledWith('GET');
|
|
81
87
|
});
|
|
82
88
|
|
|
83
|
-
it(
|
|
89
|
+
it('storage POST request', async () => {
|
|
84
90
|
const data = new Blob();
|
|
85
91
|
await api.postBlockStream('test', 'token', data);
|
|
86
92
|
await expectFetchBlobToBeCalledWith('POST', data);
|
|
@@ -91,35 +97,44 @@ describe("DriveAPIService", () => {
|
|
|
91
97
|
const request = httpClient.fetchBlob.mock.calls[0][0];
|
|
92
98
|
expect(request.method).toEqual(method);
|
|
93
99
|
expect(request.timeoutMs).toEqual(90000);
|
|
94
|
-
expect(Array.from(request.headers.entries())).toEqual(
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
100
|
+
expect(Array.from(request.headers.entries())).toEqual(
|
|
101
|
+
Array.from(
|
|
102
|
+
new Headers({
|
|
103
|
+
'pm-storage-token': 'token',
|
|
104
|
+
Language: 'en',
|
|
105
|
+
'x-pm-drive-sdk-version': `js@${process.env.npm_package_version}`,
|
|
106
|
+
}).entries(),
|
|
107
|
+
),
|
|
108
|
+
);
|
|
99
109
|
expect(request.body).toEqual(data);
|
|
100
110
|
expectSDKEvents();
|
|
101
111
|
}
|
|
102
112
|
});
|
|
103
113
|
|
|
104
|
-
describe(
|
|
105
|
-
it(
|
|
106
|
-
httpClient.fetchJson = jest.fn(() =>
|
|
114
|
+
describe('should throw', () => {
|
|
115
|
+
it('APIHTTPError on 4xx response without JSON body', async () => {
|
|
116
|
+
httpClient.fetchJson = jest.fn(() =>
|
|
117
|
+
Promise.resolve(new Response('Not found', { status: 404, statusText: 'Not found' })),
|
|
118
|
+
);
|
|
107
119
|
await expect(api.get('test')).rejects.toThrow(new Error('Not found'));
|
|
108
120
|
expectSDKEvents();
|
|
109
121
|
});
|
|
110
122
|
|
|
111
|
-
it(
|
|
112
|
-
httpClient.fetchJson = jest.fn(() =>
|
|
123
|
+
it('APIError on 4xx response with JSON body', async () => {
|
|
124
|
+
httpClient.fetchJson = jest.fn(() =>
|
|
125
|
+
Promise.resolve(new Response(JSON.stringify({ Code: 42, Error: 'General error' }), { status: 422 })),
|
|
126
|
+
);
|
|
113
127
|
await expect(api.get('test')).rejects.toThrow('General error');
|
|
114
128
|
expectSDKEvents();
|
|
115
129
|
});
|
|
116
130
|
});
|
|
117
131
|
|
|
118
|
-
describe(
|
|
119
|
-
it(
|
|
132
|
+
describe('should retry', () => {
|
|
133
|
+
it('on offline error', async () => {
|
|
120
134
|
const error = new Error('Network offline');
|
|
121
135
|
error.name = 'OfflineError';
|
|
122
|
-
httpClient.fetchJson = jest
|
|
136
|
+
httpClient.fetchJson = jest
|
|
137
|
+
.fn()
|
|
123
138
|
.mockRejectedValueOnce(error)
|
|
124
139
|
.mockRejectedValueOnce(error)
|
|
125
140
|
.mockResolvedValueOnce(generateOkResponse());
|
|
@@ -131,10 +146,11 @@ describe("DriveAPIService", () => {
|
|
|
131
146
|
expectSDKEvents();
|
|
132
147
|
});
|
|
133
148
|
|
|
134
|
-
it(
|
|
149
|
+
it('on timeout error', async () => {
|
|
135
150
|
const error = new Error('Timeouted');
|
|
136
151
|
error.name = 'TimeoutError';
|
|
137
|
-
httpClient.fetchJson = jest
|
|
152
|
+
httpClient.fetchJson = jest
|
|
153
|
+
.fn()
|
|
138
154
|
.mockRejectedValueOnce(error)
|
|
139
155
|
.mockRejectedValueOnce(error)
|
|
140
156
|
.mockResolvedValueOnce(generateOkResponse());
|
|
@@ -146,8 +162,9 @@ describe("DriveAPIService", () => {
|
|
|
146
162
|
expectSDKEvents();
|
|
147
163
|
});
|
|
148
164
|
|
|
149
|
-
it(
|
|
150
|
-
httpClient.fetchJson = jest
|
|
165
|
+
it('on general error', async () => {
|
|
166
|
+
httpClient.fetchJson = jest
|
|
167
|
+
.fn()
|
|
151
168
|
.mockRejectedValueOnce(new Error('Error'))
|
|
152
169
|
.mockResolvedValueOnce(generateOkResponse());
|
|
153
170
|
|
|
@@ -158,23 +175,29 @@ describe("DriveAPIService", () => {
|
|
|
158
175
|
expectSDKEvents();
|
|
159
176
|
});
|
|
160
177
|
|
|
161
|
-
it(
|
|
162
|
-
httpClient.fetchJson = jest
|
|
178
|
+
it('only once on general error', async () => {
|
|
179
|
+
httpClient.fetchJson = jest
|
|
180
|
+
.fn()
|
|
163
181
|
.mockRejectedValueOnce(new Error('First error'))
|
|
164
182
|
.mockRejectedValueOnce(new Error('Second error'))
|
|
165
183
|
.mockResolvedValueOnce(generateOkResponse());
|
|
166
184
|
|
|
167
185
|
const result = api.get('test');
|
|
168
186
|
|
|
169
|
-
await expect(result).rejects.toThrow(
|
|
187
|
+
await expect(result).rejects.toThrow('Second error');
|
|
170
188
|
expect(httpClient.fetchJson).toHaveBeenCalledTimes(2);
|
|
171
189
|
expectSDKEvents();
|
|
172
190
|
});
|
|
173
191
|
|
|
174
|
-
it(
|
|
175
|
-
httpClient.fetchJson = jest
|
|
176
|
-
.
|
|
177
|
-
.mockResolvedValueOnce(
|
|
192
|
+
it('on 429 response', async () => {
|
|
193
|
+
httpClient.fetchJson = jest
|
|
194
|
+
.fn()
|
|
195
|
+
.mockResolvedValueOnce(
|
|
196
|
+
new Response('', { status: HTTPErrorCode.TOO_MANY_REQUESTS, statusText: 'Some error' }),
|
|
197
|
+
)
|
|
198
|
+
.mockResolvedValueOnce(
|
|
199
|
+
new Response('', { status: HTTPErrorCode.TOO_MANY_REQUESTS, statusText: 'Some error' }),
|
|
200
|
+
)
|
|
178
201
|
.mockResolvedValueOnce(generateOkResponse());
|
|
179
202
|
|
|
180
203
|
const result = api.get('test');
|
|
@@ -185,9 +208,12 @@ describe("DriveAPIService", () => {
|
|
|
185
208
|
expectSDKEvents();
|
|
186
209
|
});
|
|
187
210
|
|
|
188
|
-
it(
|
|
189
|
-
httpClient.fetchJson = jest
|
|
190
|
-
.
|
|
211
|
+
it('on 5xx response', async () => {
|
|
212
|
+
httpClient.fetchJson = jest
|
|
213
|
+
.fn()
|
|
214
|
+
.mockResolvedValueOnce(
|
|
215
|
+
new Response('', { status: HTTPErrorCode.INTERNAL_SERVER_ERROR, statusText: 'Some error' }),
|
|
216
|
+
)
|
|
191
217
|
.mockResolvedValueOnce(generateOkResponse());
|
|
192
218
|
|
|
193
219
|
const result = api.get('test');
|
|
@@ -197,28 +223,34 @@ describe("DriveAPIService", () => {
|
|
|
197
223
|
expectSDKEvents();
|
|
198
224
|
});
|
|
199
225
|
|
|
200
|
-
it(
|
|
201
|
-
httpClient.fetchJson = jest
|
|
202
|
-
.
|
|
226
|
+
it('only once on 5xx response', async () => {
|
|
227
|
+
httpClient.fetchJson = jest
|
|
228
|
+
.fn()
|
|
229
|
+
.mockResolvedValue(
|
|
230
|
+
new Response('', { status: HTTPErrorCode.INTERNAL_SERVER_ERROR, statusText: 'Some error' }),
|
|
231
|
+
);
|
|
203
232
|
|
|
204
233
|
const result = api.get('test');
|
|
205
234
|
|
|
206
|
-
await expect(result).rejects.toThrow(
|
|
235
|
+
await expect(result).rejects.toThrow('Some error');
|
|
207
236
|
expect(httpClient.fetchJson).toHaveBeenCalledTimes(2);
|
|
208
237
|
expectSDKEvents();
|
|
209
238
|
});
|
|
210
239
|
});
|
|
211
240
|
|
|
212
|
-
describe(
|
|
213
|
-
it(
|
|
214
|
-
httpClient.fetchJson = jest
|
|
215
|
-
.
|
|
241
|
+
describe('should handle subsequent errors', () => {
|
|
242
|
+
it('limit 429 errors', async () => {
|
|
243
|
+
httpClient.fetchJson = jest
|
|
244
|
+
.fn()
|
|
245
|
+
.mockResolvedValue(
|
|
246
|
+
new Response('', { status: HTTPErrorCode.TOO_MANY_REQUESTS, statusText: 'Some error' }),
|
|
247
|
+
);
|
|
216
248
|
|
|
217
249
|
for (let i = 0; i < 20; i++) {
|
|
218
250
|
await api.get('test').catch(() => {});
|
|
219
251
|
}
|
|
220
252
|
|
|
221
|
-
await expect(api.get('test')).rejects.toThrow(
|
|
253
|
+
await expect(api.get('test')).rejects.toThrow('Too many server requests, please try again later');
|
|
222
254
|
expect(httpClient.fetchJson).toHaveBeenCalledTimes(50);
|
|
223
255
|
expectSDKEvents(SDKEvent.RequestsThrottled);
|
|
224
256
|
|
|
@@ -229,15 +261,14 @@ describe("DriveAPIService", () => {
|
|
|
229
261
|
expect(sdkEvents.requestsThrottled).toHaveBeenCalledTimes(1);
|
|
230
262
|
});
|
|
231
263
|
|
|
232
|
-
it(
|
|
264
|
+
it('do not limit 429s when some pass', async () => {
|
|
233
265
|
let attempt = 0;
|
|
234
|
-
httpClient.fetchJson = jest.fn()
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
});
|
|
266
|
+
httpClient.fetchJson = jest.fn().mockImplementation(() => {
|
|
267
|
+
if (attempt++ % 5 === 0) {
|
|
268
|
+
return generateOkResponse();
|
|
269
|
+
}
|
|
270
|
+
return new Response('', { status: HTTPErrorCode.TOO_MANY_REQUESTS, statusText: 'Some error' });
|
|
271
|
+
});
|
|
241
272
|
|
|
242
273
|
for (let i = 0; i < 20; i++) {
|
|
243
274
|
await api.get('test').catch(() => {});
|
|
@@ -249,34 +280,36 @@ describe("DriveAPIService", () => {
|
|
|
249
280
|
expectSDKEvents();
|
|
250
281
|
});
|
|
251
282
|
|
|
252
|
-
it(
|
|
253
|
-
httpClient.fetchJson = jest
|
|
254
|
-
.
|
|
283
|
+
it('limit server errors', async () => {
|
|
284
|
+
httpClient.fetchJson = jest
|
|
285
|
+
.fn()
|
|
286
|
+
.mockResolvedValue(
|
|
287
|
+
new Response('', { status: HTTPErrorCode.INTERNAL_SERVER_ERROR, statusText: 'Some error' }),
|
|
288
|
+
);
|
|
255
289
|
|
|
256
290
|
for (let i = 0; i < 20; i++) {
|
|
257
291
|
await api.get('test').catch(() => {});
|
|
258
292
|
}
|
|
259
293
|
|
|
260
|
-
await expect(api.get('test')).rejects.toThrow(
|
|
294
|
+
await expect(api.get('test')).rejects.toThrow('Too many server errors, please try again later');
|
|
261
295
|
expect(httpClient.fetchJson).toHaveBeenCalledTimes(10);
|
|
262
296
|
expectSDKEvents();
|
|
263
297
|
});
|
|
264
298
|
|
|
265
|
-
it(
|
|
299
|
+
it('do not limit server errors when some pass', async () => {
|
|
266
300
|
let attempt = 0;
|
|
267
|
-
httpClient.fetchJson = jest.fn()
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
301
|
+
httpClient.fetchJson = jest.fn().mockImplementation(() => {
|
|
302
|
+
if (attempt++ % 5 === 0) {
|
|
303
|
+
return generateOkResponse();
|
|
304
|
+
}
|
|
305
|
+
return new Response('', { status: HTTPErrorCode.INTERNAL_SERVER_ERROR, statusText: 'Some error' });
|
|
306
|
+
});
|
|
307
|
+
|
|
275
308
|
for (let i = 0; i < 20; i++) {
|
|
276
309
|
await api.get('test').catch(() => {});
|
|
277
310
|
}
|
|
278
311
|
|
|
279
|
-
await expect(api.get('test')).rejects.toThrow(
|
|
312
|
+
await expect(api.get('test')).rejects.toThrow('Some error');
|
|
280
313
|
// 15 erroring calls * 2 attempts + 5 successful calls
|
|
281
314
|
expect(httpClient.fetchJson).toHaveBeenCalledTimes(35);
|
|
282
315
|
expectSDKEvents();
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { c } from 'ttag';
|
|
2
2
|
|
|
3
|
-
import { VERSION } from
|
|
4
|
-
import { ProtonDriveHTTPClient, ProtonDriveTelemetry, Logger } from
|
|
3
|
+
import { VERSION } from '../../version';
|
|
4
|
+
import { ProtonDriveHTTPClient, ProtonDriveTelemetry, Logger } from '../../interface';
|
|
5
5
|
import { AbortError, ServerError, RateLimitedError, ProtonDriveError } from '../../errors';
|
|
6
6
|
import { waitSeconds } from '../wait';
|
|
7
7
|
import { SDKEvents } from '../sdkEvents';
|
|
@@ -107,19 +107,27 @@ export class DriveAPIService {
|
|
|
107
107
|
|
|
108
108
|
async get<ResponsePayload>(url: string, signal?: AbortSignal): Promise<ResponsePayload> {
|
|
109
109
|
return this.makeRequest(url, 'GET', undefined, signal);
|
|
110
|
-
}
|
|
110
|
+
}
|
|
111
111
|
|
|
112
|
-
async post<RequestPayload, ResponsePayload>(
|
|
112
|
+
async post<RequestPayload, ResponsePayload>(
|
|
113
|
+
url: string,
|
|
114
|
+
data?: RequestPayload,
|
|
115
|
+
signal?: AbortSignal,
|
|
116
|
+
): Promise<ResponsePayload> {
|
|
113
117
|
return this.makeRequest(url, 'POST', data, signal);
|
|
114
|
-
}
|
|
118
|
+
}
|
|
115
119
|
|
|
116
|
-
async put<RequestPayload, ResponsePayload>(
|
|
120
|
+
async put<RequestPayload, ResponsePayload>(
|
|
121
|
+
url: string,
|
|
122
|
+
data: RequestPayload,
|
|
123
|
+
signal?: AbortSignal,
|
|
124
|
+
): Promise<ResponsePayload> {
|
|
117
125
|
return this.makeRequest(url, 'PUT', data, signal);
|
|
118
|
-
}
|
|
126
|
+
}
|
|
119
127
|
|
|
120
128
|
async delete<Response>(url: string, signal?: AbortSignal): Promise<Response> {
|
|
121
129
|
return this.makeRequest(url, 'DELETE', undefined, signal);
|
|
122
|
-
}
|
|
130
|
+
}
|
|
123
131
|
|
|
124
132
|
private async makeRequest<RequestPayload, ResponsePayload>(
|
|
125
133
|
url: string,
|
|
@@ -131,15 +139,15 @@ export class DriveAPIService {
|
|
|
131
139
|
url: `${this.baseUrl}/${url}`,
|
|
132
140
|
method,
|
|
133
141
|
headers: new Headers({
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
142
|
+
Accept: 'application/vnd.protonmail.v1+json',
|
|
143
|
+
'Content-Type': 'application/json',
|
|
144
|
+
Language: this.language,
|
|
145
|
+
'x-pm-drive-sdk-version': `js@${VERSION}`,
|
|
138
146
|
}),
|
|
139
147
|
json: data || undefined,
|
|
140
148
|
timeoutMs: DEFAULT_TIMEOUT_MS,
|
|
141
149
|
signal,
|
|
142
|
-
}
|
|
150
|
+
};
|
|
143
151
|
|
|
144
152
|
const response = await this.fetch(request, () => this.httpClient.fetchJson(request));
|
|
145
153
|
|
|
@@ -169,7 +177,13 @@ export class DriveAPIService {
|
|
|
169
177
|
return response.body;
|
|
170
178
|
}
|
|
171
179
|
|
|
172
|
-
async postBlockStream(
|
|
180
|
+
async postBlockStream(
|
|
181
|
+
baseUrl: string,
|
|
182
|
+
token: string,
|
|
183
|
+
data: XMLHttpRequestBodyInit,
|
|
184
|
+
onProgress?: (uploadedBytes: number) => void,
|
|
185
|
+
signal?: AbortSignal,
|
|
186
|
+
): Promise<void> {
|
|
173
187
|
await this.makeStorageRequest('POST', baseUrl, token, data, onProgress, signal);
|
|
174
188
|
}
|
|
175
189
|
|
|
@@ -185,9 +199,9 @@ export class DriveAPIService {
|
|
|
185
199
|
url,
|
|
186
200
|
method,
|
|
187
201
|
headers: new Headers({
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
202
|
+
'pm-storage-token': token,
|
|
203
|
+
Language: this.language,
|
|
204
|
+
'x-pm-drive-sdk-version': `js@${VERSION}`,
|
|
191
205
|
}),
|
|
192
206
|
body,
|
|
193
207
|
onProgress,
|
|
@@ -217,9 +231,9 @@ export class DriveAPIService {
|
|
|
217
231
|
// u=5 for background (e.g., upload, download)
|
|
218
232
|
// u=7 for optional (e.g., metrics, telemetry)
|
|
219
233
|
private async fetch(
|
|
220
|
-
request: { method: string
|
|
234
|
+
request: { method: string; url: string; signal?: AbortSignal },
|
|
221
235
|
callback: () => Promise<Response>,
|
|
222
|
-
attempt = 0
|
|
236
|
+
attempt = 0,
|
|
223
237
|
): Promise<Response> {
|
|
224
238
|
if (request.signal?.aborted) {
|
|
225
239
|
throw new AbortError(c('Error').t`Request aborted`);
|
|
@@ -244,19 +258,19 @@ export class DriveAPIService {
|
|
|
244
258
|
if (error.name === 'OfflineError') {
|
|
245
259
|
this.logger.info(`${request.method} ${request.url}: Offline error, retrying`);
|
|
246
260
|
await waitSeconds(OFFLINE_RETRY_DELAY_SECONDS);
|
|
247
|
-
return this.fetch(request, callback, attempt+1);
|
|
261
|
+
return this.fetch(request, callback, attempt + 1);
|
|
248
262
|
}
|
|
249
263
|
|
|
250
264
|
if (error.name === 'TimeoutError') {
|
|
251
265
|
this.logger.warn(`${request.method} ${request.url}: Timeout error, retrying`);
|
|
252
266
|
await waitSeconds(SERVER_ERROR_RETRY_DELAY_SECONDS);
|
|
253
|
-
return this.fetch(request, callback, attempt+1);
|
|
267
|
+
return this.fetch(request, callback, attempt + 1);
|
|
254
268
|
}
|
|
255
269
|
}
|
|
256
270
|
if (attempt === 0) {
|
|
257
271
|
this.logger.error(`${request.method} ${request.url}: failed, retrying once`, error);
|
|
258
272
|
await waitSeconds(GENERAL_RETRY_DELAY_SECONDS);
|
|
259
|
-
return this.fetch(request, callback, attempt+1);
|
|
273
|
+
return this.fetch(request, callback, attempt + 1);
|
|
260
274
|
}
|
|
261
275
|
this.logger.error(`${request.method} ${request.url}: failed`, error);
|
|
262
276
|
throw error;
|
|
@@ -272,7 +286,7 @@ export class DriveAPIService {
|
|
|
272
286
|
this.tooManyRequestsErrorHappened();
|
|
273
287
|
const timeout = parseInt(response.headers.get('retry-after') || '0', DEFAULT_429_RETRY_DELAY_SECONDS);
|
|
274
288
|
await waitSeconds(timeout);
|
|
275
|
-
return this.fetch(request, callback, attempt+1);
|
|
289
|
+
return this.fetch(request, callback, attempt + 1);
|
|
276
290
|
} else {
|
|
277
291
|
this.clearSubsequentTooManyRequestsError();
|
|
278
292
|
}
|
|
@@ -286,7 +300,7 @@ export class DriveAPIService {
|
|
|
286
300
|
this.logger.warn(`${request.method} ${request.url}: ${response.status} - retry failed`);
|
|
287
301
|
} else {
|
|
288
302
|
await waitSeconds(SERVER_ERROR_RETRY_DELAY_SECONDS);
|
|
289
|
-
return this.fetch(request, callback, attempt+1);
|
|
303
|
+
return this.fetch(request, callback, attempt + 1);
|
|
290
304
|
}
|
|
291
305
|
} else {
|
|
292
306
|
if (attempt > 0) {
|
|
@@ -308,7 +322,7 @@ export class DriveAPIService {
|
|
|
308
322
|
return (
|
|
309
323
|
this.subsequentTooManyRequestsCounter >= TOO_MANY_SUBSEQUENT_429_ERRORS &&
|
|
310
324
|
secondsSinceLast429Error < TOO_MANY_SUBSEQUENT_429_ERRORS_TIMEOUT_IN_SECONDS
|
|
311
|
-
)
|
|
325
|
+
);
|
|
312
326
|
}
|
|
313
327
|
|
|
314
328
|
private tooManyRequestsErrorHappened() {
|
|
@@ -338,7 +352,7 @@ export class DriveAPIService {
|
|
|
338
352
|
return (
|
|
339
353
|
this.subsequentServerErrorsCounter >= TOO_MANY_SUBSEQUENT_SERVER_ERRORS &&
|
|
340
354
|
secondsSinceLastServerError < TOO_MANY_SUBSEQUENT_SERVER_ERRORS_TIMEOUT_IN_SECONDS
|
|
341
|
-
)
|
|
355
|
+
);
|
|
342
356
|
}
|
|
343
357
|
|
|
344
358
|
private serverErrorHappened() {
|