@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,13 +1,25 @@
|
|
|
1
1
|
import { c } from 'ttag';
|
|
2
2
|
|
|
3
|
-
import { SessionKey } from
|
|
4
|
-
import { ValidationError } from
|
|
5
|
-
import {
|
|
6
|
-
|
|
3
|
+
import { SessionKey } from '../../crypto';
|
|
4
|
+
import { ValidationError } from '../../errors';
|
|
5
|
+
import {
|
|
6
|
+
Logger,
|
|
7
|
+
MemberRole,
|
|
8
|
+
ShareNodeSettings,
|
|
9
|
+
UnshareNodeSettings,
|
|
10
|
+
ShareResult,
|
|
11
|
+
ProtonInvitation,
|
|
12
|
+
NonProtonInvitation,
|
|
13
|
+
Member,
|
|
14
|
+
resultOk,
|
|
15
|
+
ProtonDriveAccount,
|
|
16
|
+
SharePublicLinkSettingsObject,
|
|
17
|
+
} from '../../interface';
|
|
18
|
+
import { splitNodeUid } from '../uids';
|
|
7
19
|
import { getErrorMessage } from '../errors';
|
|
8
|
-
import { SharingAPIService } from
|
|
9
|
-
import { PUBLIC_LINK_GENERATED_PASSWORD_LENGTH, SharingCryptoService } from
|
|
10
|
-
import { SharesService, NodesService, ShareResultWithCreatorEmail, PublicLinkWithCreatorEmail } from
|
|
20
|
+
import { SharingAPIService } from './apiService';
|
|
21
|
+
import { PUBLIC_LINK_GENERATED_PASSWORD_LENGTH, SharingCryptoService } from './cryptoService';
|
|
22
|
+
import { SharesService, NodesService, ShareResultWithCreatorEmail, PublicLinkWithCreatorEmail } from './interface';
|
|
11
23
|
|
|
12
24
|
interface InternalShareResult extends ShareResultWithCreatorEmail {
|
|
13
25
|
share: Share;
|
|
@@ -67,24 +79,24 @@ export class SharingManagement {
|
|
|
67
79
|
nonProtonInvitations,
|
|
68
80
|
members,
|
|
69
81
|
publicLink,
|
|
70
|
-
}
|
|
82
|
+
};
|
|
71
83
|
}
|
|
72
84
|
|
|
73
|
-
private async*
|
|
85
|
+
private async *iterateShareInvitations(shareId: string): AsyncGenerator<ProtonInvitation> {
|
|
74
86
|
const invitations = await this.apiService.getShareInvitations(shareId);
|
|
75
87
|
for (const invitation of invitations) {
|
|
76
88
|
yield this.cryptoService.decryptInvitation(invitation);
|
|
77
89
|
}
|
|
78
90
|
}
|
|
79
91
|
|
|
80
|
-
private async*
|
|
92
|
+
private async *iterateShareExternalInvitations(shareId: string): AsyncGenerator<NonProtonInvitation> {
|
|
81
93
|
const invitations = await this.apiService.getShareExternalInvitations(shareId);
|
|
82
94
|
for (const invitation of invitations) {
|
|
83
95
|
yield this.cryptoService.decryptExternalInvitation(invitation);
|
|
84
96
|
}
|
|
85
97
|
}
|
|
86
98
|
|
|
87
|
-
private async*
|
|
99
|
+
private async *iterateShareMembers(shareId: string): AsyncGenerator<Member> {
|
|
88
100
|
const members = await this.apiService.getShareMembers(shareId);
|
|
89
101
|
for (const member of members) {
|
|
90
102
|
yield this.cryptoService.decryptMember(member);
|
|
@@ -106,9 +118,7 @@ export class SharingManagement {
|
|
|
106
118
|
const nonProtonUsers = [];
|
|
107
119
|
if (settings.users) {
|
|
108
120
|
for (const user of settings.users) {
|
|
109
|
-
const { email, role } = typeof user ===
|
|
110
|
-
? { email: user, role: MemberRole.Viewer }
|
|
111
|
-
: user;
|
|
121
|
+
const { email, role } = typeof user === 'string' ? { email: user, role: MemberRole.Viewer } : user;
|
|
112
122
|
const isProtonUser = await this.account.hasProtonAccount(email);
|
|
113
123
|
if (isProtonUser) {
|
|
114
124
|
protonUsers.push({ email, role });
|
|
@@ -120,7 +130,11 @@ export class SharingManagement {
|
|
|
120
130
|
|
|
121
131
|
// Check if expiration date is in the past before creating share
|
|
122
132
|
// so if this fails, we don't create empty share.
|
|
123
|
-
if (
|
|
133
|
+
if (
|
|
134
|
+
typeof settings.publicLink === 'object' &&
|
|
135
|
+
settings.publicLink.expiration &&
|
|
136
|
+
settings.publicLink.expiration < new Date()
|
|
137
|
+
) {
|
|
124
138
|
throw new ValidationError(c('Error').t`Expiration date cannot be in the past`);
|
|
125
139
|
}
|
|
126
140
|
|
|
@@ -141,12 +155,14 @@ export class SharingManagement {
|
|
|
141
155
|
const emailOptions: EmailOptions = {
|
|
142
156
|
message: settings.emailOptions?.message,
|
|
143
157
|
nodeName: settings.emailOptions?.includeNodeName ? currentSharing.nodeName : undefined,
|
|
144
|
-
}
|
|
158
|
+
};
|
|
145
159
|
|
|
146
160
|
for (const user of protonUsers) {
|
|
147
161
|
const { email, role } = user;
|
|
148
162
|
|
|
149
|
-
const existingInvitation = currentSharing.protonInvitations.find(
|
|
163
|
+
const existingInvitation = currentSharing.protonInvitations.find(
|
|
164
|
+
(invitation) => invitation.inviteeEmail === email,
|
|
165
|
+
);
|
|
150
166
|
if (existingInvitation) {
|
|
151
167
|
if (existingInvitation.role === role) {
|
|
152
168
|
this.logger.info(`Invitation for ${email} already exists with role ${role} to node ${nodeUid}`);
|
|
@@ -178,13 +194,19 @@ export class SharingManagement {
|
|
|
178
194
|
for (const user of nonProtonUsers) {
|
|
179
195
|
const { email, role } = user;
|
|
180
196
|
|
|
181
|
-
const existingExternalInvitation = currentSharing.nonProtonInvitations.find(
|
|
197
|
+
const existingExternalInvitation = currentSharing.nonProtonInvitations.find(
|
|
198
|
+
(invitation) => invitation.inviteeEmail === email,
|
|
199
|
+
);
|
|
182
200
|
if (existingExternalInvitation) {
|
|
183
201
|
if (existingExternalInvitation.role === role) {
|
|
184
|
-
this.logger.info(
|
|
202
|
+
this.logger.info(
|
|
203
|
+
`External invitation for ${email} already exists with role ${role} to node ${nodeUid}`,
|
|
204
|
+
);
|
|
185
205
|
continue;
|
|
186
206
|
}
|
|
187
|
-
this.logger.info(
|
|
207
|
+
this.logger.info(
|
|
208
|
+
`External invitation for ${email} already exists, updating role to ${role} to node ${nodeUid}`,
|
|
209
|
+
);
|
|
188
210
|
await this.updateExternalInvitation(existingExternalInvitation.uid, role);
|
|
189
211
|
existingExternalInvitation.role = role;
|
|
190
212
|
continue;
|
|
@@ -208,13 +230,15 @@ export class SharingManagement {
|
|
|
208
230
|
}
|
|
209
231
|
|
|
210
232
|
if (settings.publicLink) {
|
|
211
|
-
const options = settings.publicLink === true
|
|
212
|
-
? { role: MemberRole.Viewer }
|
|
213
|
-
: settings.publicLink;
|
|
233
|
+
const options = settings.publicLink === true ? { role: MemberRole.Viewer } : settings.publicLink;
|
|
214
234
|
|
|
215
235
|
if (currentSharing.publicLink) {
|
|
216
236
|
this.logger.info(`Updating public link with role ${options.role} to node ${nodeUid}`);
|
|
217
|
-
currentSharing.publicLink = await this.updateSharedLink(
|
|
237
|
+
currentSharing.publicLink = await this.updateSharedLink(
|
|
238
|
+
currentSharing.share,
|
|
239
|
+
currentSharing.publicLink,
|
|
240
|
+
options,
|
|
241
|
+
);
|
|
218
242
|
} else {
|
|
219
243
|
this.logger.info(`Sharing via public link with role ${options.role} to node ${nodeUid}`);
|
|
220
244
|
currentSharing.publicLink = await this.shareViaLink(currentSharing.share, options);
|
|
@@ -242,19 +266,27 @@ export class SharingManagement {
|
|
|
242
266
|
}
|
|
243
267
|
|
|
244
268
|
for (const userEmail of settings.users || []) {
|
|
245
|
-
const existingInvitation = currentSharing.protonInvitations.find(
|
|
269
|
+
const existingInvitation = currentSharing.protonInvitations.find(
|
|
270
|
+
(invitation) => invitation.inviteeEmail === userEmail,
|
|
271
|
+
);
|
|
246
272
|
if (existingInvitation) {
|
|
247
273
|
this.logger.info(`Deleting invitation for ${userEmail} to node ${nodeUid}`);
|
|
248
274
|
await this.deleteInvitation(existingInvitation.uid);
|
|
249
|
-
currentSharing.protonInvitations = currentSharing.protonInvitations.filter(
|
|
275
|
+
currentSharing.protonInvitations = currentSharing.protonInvitations.filter(
|
|
276
|
+
(invitation) => invitation.uid !== existingInvitation.uid,
|
|
277
|
+
);
|
|
250
278
|
continue;
|
|
251
279
|
}
|
|
252
280
|
|
|
253
|
-
const existingExternalInvitation = currentSharing.nonProtonInvitations.find(
|
|
281
|
+
const existingExternalInvitation = currentSharing.nonProtonInvitations.find(
|
|
282
|
+
(invitation) => invitation.inviteeEmail === userEmail,
|
|
283
|
+
);
|
|
254
284
|
if (existingExternalInvitation) {
|
|
255
285
|
this.logger.info(`Deleting external invitation for ${userEmail} to node ${nodeUid}`);
|
|
256
286
|
await this.deleteExternalInvitation(existingExternalInvitation.uid);
|
|
257
|
-
currentSharing.nonProtonInvitations = currentSharing.nonProtonInvitations.filter(
|
|
287
|
+
currentSharing.nonProtonInvitations = currentSharing.nonProtonInvitations.filter(
|
|
288
|
+
(invitation) => invitation.uid !== existingExternalInvitation.uid,
|
|
289
|
+
);
|
|
258
290
|
continue;
|
|
259
291
|
}
|
|
260
292
|
|
|
@@ -297,7 +329,9 @@ export class SharingManagement {
|
|
|
297
329
|
// as it might be a race condition that other client updated
|
|
298
330
|
// the share and it is not empty.
|
|
299
331
|
// If share is truly empty, backend will delete it eventually.
|
|
300
|
-
this.logger.warn(
|
|
332
|
+
this.logger.warn(
|
|
333
|
+
`Failed to delete share ${currentSharing.share.shareId} for node ${nodeUid}: ${getErrorMessage(error)}`,
|
|
334
|
+
);
|
|
301
335
|
}
|
|
302
336
|
return;
|
|
303
337
|
}
|
|
@@ -334,7 +368,7 @@ export class SharingManagement {
|
|
|
334
368
|
passphraseSessionKey: passphraseSessionKey,
|
|
335
369
|
},
|
|
336
370
|
nodeName: node.name.ok ? node.name.value : node.name.error.name,
|
|
337
|
-
}
|
|
371
|
+
};
|
|
338
372
|
}
|
|
339
373
|
|
|
340
374
|
private async createShare(nodeUid: string): Promise<Share> {
|
|
@@ -348,22 +382,17 @@ export class SharingManagement {
|
|
|
348
382
|
|
|
349
383
|
const nodeKeys = await this.nodesService.getNodePrivateAndSessionKeys(nodeUid);
|
|
350
384
|
const keys = await this.cryptoService.generateShareKeys(nodeKeys, addressKey);
|
|
351
|
-
const shareId = await this.apiService.createStandardShare(
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
{
|
|
356
|
-
base64PassphraseKeyPacket: keys.base64PpassphraseKeyPacket,
|
|
357
|
-
base64NameKeyPacket: keys.base64NameKeyPacket,
|
|
358
|
-
},
|
|
359
|
-
);
|
|
385
|
+
const shareId = await this.apiService.createStandardShare(nodeUid, addressId, keys.shareKey.encrypted, {
|
|
386
|
+
base64PassphraseKeyPacket: keys.base64PpassphraseKeyPacket,
|
|
387
|
+
base64NameKeyPacket: keys.base64NameKeyPacket,
|
|
388
|
+
});
|
|
360
389
|
await this.nodesService.notifyNodeChanged(nodeUid);
|
|
361
390
|
return {
|
|
362
391
|
volumeId,
|
|
363
392
|
shareId,
|
|
364
393
|
creatorEmail: email,
|
|
365
394
|
passphraseSessionKey: keys.shareKey.decrypted.passphraseSessionKey,
|
|
366
|
-
}
|
|
395
|
+
};
|
|
367
396
|
}
|
|
368
397
|
|
|
369
398
|
private async deleteShare(shareId: string, nodeUid: string): Promise<void> {
|
|
@@ -371,16 +400,29 @@ export class SharingManagement {
|
|
|
371
400
|
await this.nodesService.notifyNodeChanged(nodeUid);
|
|
372
401
|
}
|
|
373
402
|
|
|
374
|
-
private async inviteProtonUser(
|
|
403
|
+
private async inviteProtonUser(
|
|
404
|
+
share: Share,
|
|
405
|
+
inviteeEmail: string,
|
|
406
|
+
role: MemberRole,
|
|
407
|
+
emailOptions: EmailOptions,
|
|
408
|
+
): Promise<ProtonInvitation> {
|
|
375
409
|
const inviter = await this.sharesService.getContextShareMemberEmailKey(share.shareId);
|
|
376
|
-
const invitationCrypto = await this.cryptoService.encryptInvitation(
|
|
410
|
+
const invitationCrypto = await this.cryptoService.encryptInvitation(
|
|
411
|
+
share.passphraseSessionKey,
|
|
412
|
+
inviter.addressKey,
|
|
413
|
+
inviteeEmail,
|
|
414
|
+
);
|
|
377
415
|
|
|
378
|
-
const encryptedInvitation = await this.apiService.inviteProtonUser(
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
416
|
+
const encryptedInvitation = await this.apiService.inviteProtonUser(
|
|
417
|
+
share.shareId,
|
|
418
|
+
{
|
|
419
|
+
addedByEmail: inviter.email,
|
|
420
|
+
inviteeEmail: inviteeEmail,
|
|
421
|
+
role,
|
|
422
|
+
...invitationCrypto,
|
|
423
|
+
},
|
|
424
|
+
emailOptions,
|
|
425
|
+
);
|
|
384
426
|
|
|
385
427
|
return {
|
|
386
428
|
...encryptedInvitation,
|
|
@@ -404,7 +446,9 @@ export class SharingManagement {
|
|
|
404
446
|
return await this.apiService.resendInvitationEmail(protonInvite.uid);
|
|
405
447
|
}
|
|
406
448
|
|
|
407
|
-
const nonProtonInvite = currentSharing.nonProtonInvitations.find(
|
|
449
|
+
const nonProtonInvite = currentSharing.nonProtonInvitations.find(
|
|
450
|
+
(invitation) => invitation.uid === invitationUid,
|
|
451
|
+
);
|
|
408
452
|
if (nonProtonInvite) {
|
|
409
453
|
return await this.apiService.resendExternalInvitationEmail(nonProtonInvite.uid);
|
|
410
454
|
}
|
|
@@ -416,16 +460,29 @@ export class SharingManagement {
|
|
|
416
460
|
await this.apiService.deleteInvitation(invitationUid);
|
|
417
461
|
}
|
|
418
462
|
|
|
419
|
-
private async inviteExternalUser(
|
|
463
|
+
private async inviteExternalUser(
|
|
464
|
+
share: Share,
|
|
465
|
+
inviteeEmail: string,
|
|
466
|
+
role: MemberRole,
|
|
467
|
+
emailOptions: EmailOptions,
|
|
468
|
+
): Promise<NonProtonInvitation> {
|
|
420
469
|
const inviter = await this.sharesService.getContextShareMemberEmailKey(share.shareId);
|
|
421
|
-
const invitationCrypto = await this.cryptoService.encryptExternalInvitation(
|
|
470
|
+
const invitationCrypto = await this.cryptoService.encryptExternalInvitation(
|
|
471
|
+
share.passphraseSessionKey,
|
|
472
|
+
inviter.addressKey,
|
|
473
|
+
inviteeEmail,
|
|
474
|
+
);
|
|
422
475
|
|
|
423
|
-
const encryptedInvitation = await this.apiService.inviteExternalUser(
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
476
|
+
const encryptedInvitation = await this.apiService.inviteExternalUser(
|
|
477
|
+
share.shareId,
|
|
478
|
+
{
|
|
479
|
+
inviterAddressId: inviter.addressId,
|
|
480
|
+
inviteeEmail: inviteeEmail,
|
|
481
|
+
role,
|
|
482
|
+
base64Signature: invitationCrypto.base64ExternalInvitationSignature,
|
|
483
|
+
},
|
|
484
|
+
emailOptions,
|
|
485
|
+
);
|
|
429
486
|
|
|
430
487
|
return {
|
|
431
488
|
uid: encryptedInvitation.uid,
|
|
@@ -441,7 +498,6 @@ export class SharingManagement {
|
|
|
441
498
|
await this.apiService.updateExternalInvitation(invitationUid, { role });
|
|
442
499
|
}
|
|
443
500
|
|
|
444
|
-
|
|
445
501
|
private async deleteExternalInvitation(invitationUid: string): Promise<void> {
|
|
446
502
|
await this.apiService.deleteExternalInvitation(invitationUid);
|
|
447
503
|
}
|
|
@@ -458,13 +514,20 @@ export class SharingManagement {
|
|
|
458
514
|
await this.apiService.updateMember(memberUid, { role });
|
|
459
515
|
}
|
|
460
516
|
|
|
461
|
-
private async shareViaLink(
|
|
517
|
+
private async shareViaLink(
|
|
518
|
+
share: Share,
|
|
519
|
+
options: SharePublicLinkSettingsObject,
|
|
520
|
+
): Promise<PublicLinkWithCreatorEmail> {
|
|
462
521
|
const { email: creatorEmail } = await this.sharesService.getContextShareMemberEmailKey(share.shareId);
|
|
463
522
|
|
|
464
523
|
const generatedPassword = await this.cryptoService.generatePublicLinkPassword();
|
|
465
524
|
const password = options.customPassword ? `${generatedPassword}${options.customPassword}` : generatedPassword;
|
|
466
525
|
|
|
467
|
-
const { crypto, srp } = await this.cryptoService.encryptPublicLink(
|
|
526
|
+
const { crypto, srp } = await this.cryptoService.encryptPublicLink(
|
|
527
|
+
creatorEmail,
|
|
528
|
+
share.passphraseSessionKey,
|
|
529
|
+
password,
|
|
530
|
+
);
|
|
468
531
|
const publicLink = await this.apiService.createPublicLink(share.shareId, {
|
|
469
532
|
creatorEmail,
|
|
470
533
|
role: options.role,
|
|
@@ -483,18 +546,28 @@ export class SharingManagement {
|
|
|
483
546
|
expirationTime: options.expiration,
|
|
484
547
|
numberOfInitializedDownloads: 0,
|
|
485
548
|
creatorEmail,
|
|
486
|
-
}
|
|
549
|
+
};
|
|
487
550
|
}
|
|
488
551
|
|
|
489
|
-
private async updateSharedLink(
|
|
552
|
+
private async updateSharedLink(
|
|
553
|
+
share: Share,
|
|
554
|
+
publicLink: PublicLinkWithCreatorEmail,
|
|
555
|
+
options: SharePublicLinkSettingsObject,
|
|
556
|
+
): Promise<PublicLinkWithCreatorEmail> {
|
|
490
557
|
const generatedPassword = publicLink.url.split('#')[1];
|
|
491
558
|
// Legacy public links didn't have generated password or had various lengths.
|
|
492
559
|
if (!generatedPassword || generatedPassword.length !== PUBLIC_LINK_GENERATED_PASSWORD_LENGTH) {
|
|
493
|
-
throw new ValidationError(
|
|
560
|
+
throw new ValidationError(
|
|
561
|
+
c('Error').t`Legacy public link cannot be updated. Please re-create a new public link.`,
|
|
562
|
+
);
|
|
494
563
|
}
|
|
495
564
|
const password = options.customPassword ? `${generatedPassword}${options.customPassword}` : generatedPassword;
|
|
496
565
|
|
|
497
|
-
const { crypto, srp } = await this.cryptoService.encryptPublicLink(
|
|
566
|
+
const { crypto, srp } = await this.cryptoService.encryptPublicLink(
|
|
567
|
+
publicLink.creatorEmail,
|
|
568
|
+
share.passphraseSessionKey,
|
|
569
|
+
password,
|
|
570
|
+
);
|
|
498
571
|
await this.apiService.updatePublicLink(publicLink.uid, {
|
|
499
572
|
role: options.role,
|
|
500
573
|
includesCustomPassword: !!options.customPassword,
|
|
@@ -508,7 +581,7 @@ export class SharingManagement {
|
|
|
508
581
|
role: options.role,
|
|
509
582
|
customPassword: options.customPassword,
|
|
510
583
|
expirationTime: options.expiration,
|
|
511
|
-
}
|
|
584
|
+
};
|
|
512
585
|
}
|
|
513
586
|
|
|
514
587
|
private async removeSharedLink(publicLinkUid: string): Promise<void> {
|
package/src/internal/uids.ts
CHANGED
|
@@ -7,7 +7,7 @@ export function splitDeviceUid(deviceUid: string) {
|
|
|
7
7
|
if (parts.length !== 2) {
|
|
8
8
|
throw new Error(`"${deviceUid}" is not valid device UID`);
|
|
9
9
|
}
|
|
10
|
-
const [
|
|
10
|
+
const [volumeId, deviceId] = parts;
|
|
11
11
|
return { volumeId, deviceId };
|
|
12
12
|
}
|
|
13
13
|
|