@protontech/drive-sdk 0.0.13 → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cache/index.d.ts +1 -0
- package/dist/cache/index.js +3 -1
- package/dist/cache/index.js.map +1 -1
- package/dist/cache/memoryCache.d.ts +1 -1
- package/dist/cache/memoryCache.js +0 -1
- package/dist/cache/memoryCache.js.map +1 -1
- package/dist/cache/memoryCache.test.js +2 -4
- package/dist/cache/memoryCache.test.js.map +1 -1
- package/dist/cache/nullCache.d.ts +14 -0
- package/dist/cache/nullCache.js +36 -0
- package/dist/cache/nullCache.js.map +1 -0
- package/dist/config.d.ts +16 -1
- package/dist/config.js +1 -1
- package/dist/config.js.map +1 -1
- package/dist/crypto/driveCrypto.d.ts +2 -5
- package/dist/crypto/driveCrypto.js +7 -12
- package/dist/crypto/driveCrypto.js.map +1 -1
- package/dist/crypto/driveCrypto.test.js +14 -14
- package/dist/crypto/openPGPCrypto.js +5 -3
- package/dist/crypto/openPGPCrypto.js.map +1 -1
- package/dist/diagnostic/eventsGenerator.d.ts +14 -0
- package/dist/diagnostic/eventsGenerator.js +49 -0
- package/dist/diagnostic/eventsGenerator.js.map +1 -0
- package/dist/diagnostic/httpClient.d.ts +16 -0
- package/dist/diagnostic/httpClient.js +81 -0
- package/dist/diagnostic/httpClient.js.map +1 -0
- package/dist/diagnostic/index.d.ts +10 -0
- package/dist/diagnostic/index.js +35 -0
- package/dist/diagnostic/index.js.map +1 -0
- package/dist/diagnostic/integrityVerificationStream.d.ts +21 -0
- package/dist/diagnostic/integrityVerificationStream.js +56 -0
- package/dist/diagnostic/integrityVerificationStream.js.map +1 -0
- package/dist/diagnostic/interface.d.ts +102 -0
- package/dist/diagnostic/interface.js +3 -0
- package/dist/diagnostic/interface.js.map +1 -0
- package/dist/diagnostic/sdkDiagnostic.d.ts +22 -0
- package/dist/diagnostic/sdkDiagnostic.js +222 -0
- package/dist/diagnostic/sdkDiagnostic.js.map +1 -0
- package/dist/diagnostic/sdkDiagnosticFull.d.ts +18 -0
- package/dist/diagnostic/sdkDiagnosticFull.js +35 -0
- package/dist/diagnostic/sdkDiagnosticFull.js.map +1 -0
- package/dist/diagnostic/telemetry.d.ts +25 -0
- package/dist/diagnostic/telemetry.js +70 -0
- package/dist/diagnostic/telemetry.js.map +1 -0
- package/dist/diagnostic/zipGenerators.d.ts +9 -0
- package/dist/diagnostic/zipGenerators.js +64 -0
- package/dist/diagnostic/zipGenerators.js.map +1 -0
- package/dist/diagnostic/zipGenerators.test.js +144 -0
- package/dist/diagnostic/zipGenerators.test.js.map +1 -0
- package/dist/errors.d.ts +2 -1
- package/dist/errors.js +3 -1
- package/dist/errors.js.map +1 -1
- package/dist/interface/config.d.ts +26 -0
- package/dist/interface/config.js +3 -0
- package/dist/interface/config.js.map +1 -0
- package/dist/interface/download.d.ts +2 -2
- package/dist/interface/events.d.ts +58 -20
- package/dist/interface/events.js +11 -1
- package/dist/interface/events.js.map +1 -1
- package/dist/interface/httpClient.d.ts +0 -14
- package/dist/interface/index.d.ts +11 -7
- package/dist/interface/index.js +2 -2
- package/dist/interface/index.js.map +1 -1
- package/dist/interface/nodes.d.ts +9 -0
- package/dist/interface/nodes.js.map +1 -1
- package/dist/interface/result.js.map +1 -1
- package/dist/interface/sharing.d.ts +2 -0
- package/dist/interface/sharing.js.map +1 -1
- package/dist/interface/telemetry.js +0 -8
- package/dist/interface/telemetry.js.map +1 -1
- package/dist/interface/thumbnail.js.map +1 -1
- package/dist/interface/upload.d.ts +7 -1
- package/dist/internal/apiService/apiService.d.ts +1 -1
- package/dist/internal/apiService/apiService.js +7 -11
- package/dist/internal/apiService/apiService.js.map +1 -1
- package/dist/internal/apiService/apiService.test.js +55 -48
- package/dist/internal/apiService/apiService.test.js.map +1 -1
- package/dist/internal/apiService/coreTypes.d.ts +2356 -2356
- package/dist/internal/apiService/driveTypes.d.ts +1680 -1680
- package/dist/internal/apiService/errors.js +14 -8
- package/dist/internal/apiService/errors.js.map +1 -1
- package/dist/internal/apiService/errors.test.js +17 -12
- package/dist/internal/apiService/errors.test.js.map +1 -1
- package/dist/internal/apiService/transformers.d.ts +1 -1
- package/dist/internal/apiService/transformers.js +1 -1
- package/dist/internal/asyncIteratorMap.test.js +2 -2
- package/dist/internal/asyncIteratorMap.test.js.map +1 -1
- package/dist/internal/asyncIteratorRace.d.ts +13 -0
- package/dist/internal/asyncIteratorRace.js +59 -0
- package/dist/internal/asyncIteratorRace.js.map +1 -0
- package/dist/internal/asyncIteratorRace.test.d.ts +1 -0
- package/dist/internal/asyncIteratorRace.test.js +119 -0
- package/dist/internal/asyncIteratorRace.test.js.map +1 -0
- package/dist/internal/batch.d.ts +1 -0
- package/dist/internal/batch.js +12 -0
- package/dist/internal/batch.js.map +1 -0
- package/dist/internal/batch.test.d.ts +1 -0
- package/dist/internal/batch.test.js +41 -0
- package/dist/internal/batch.test.js.map +1 -0
- package/dist/internal/batchLoading.js.map +1 -1
- package/dist/internal/batchLoading.test.js +13 -13
- package/dist/internal/batchLoading.test.js.map +1 -1
- package/dist/internal/devices/apiService.d.ts +3 -3
- package/dist/internal/devices/apiService.js +2 -2
- package/dist/internal/devices/apiService.js.map +1 -1
- package/dist/internal/devices/cryptoService.js +1 -2
- package/dist/internal/devices/cryptoService.js.map +1 -1
- package/dist/internal/devices/index.d.ts +5 -5
- package/dist/internal/devices/index.js.map +1 -1
- package/dist/internal/devices/interface.d.ts +3 -3
- package/dist/internal/devices/manager.js +2 -2
- package/dist/internal/devices/manager.js.map +1 -1
- package/dist/internal/devices/manager.test.js +38 -7
- package/dist/internal/devices/manager.test.js.map +1 -1
- package/dist/internal/download/apiService.d.ts +4 -4
- package/dist/internal/download/apiService.js +32 -32
- package/dist/internal/download/apiService.js.map +1 -1
- package/dist/internal/download/cryptoService.d.ts +4 -4
- package/dist/internal/download/cryptoService.js +6 -5
- package/dist/internal/download/cryptoService.js.map +1 -1
- package/dist/internal/download/fileDownloader.d.ts +6 -6
- package/dist/internal/download/fileDownloader.js +3 -2
- package/dist/internal/download/fileDownloader.js.map +1 -1
- package/dist/internal/download/fileDownloader.test.js +1 -1
- package/dist/internal/download/fileDownloader.test.js.map +1 -1
- package/dist/internal/download/index.d.ts +5 -5
- package/dist/internal/download/index.js +5 -5
- package/dist/internal/download/index.js.map +1 -1
- package/dist/internal/download/interface.d.ts +3 -4
- package/dist/internal/download/telemetry.d.ts +3 -3
- package/dist/internal/download/telemetry.js +4 -2
- package/dist/internal/download/telemetry.js.map +1 -1
- package/dist/internal/download/telemetry.test.js +8 -8
- package/dist/internal/download/telemetry.test.js.map +1 -1
- package/dist/internal/download/thumbnailDownloader.d.ts +4 -4
- package/dist/internal/download/thumbnailDownloader.js +6 -6
- package/dist/internal/download/thumbnailDownloader.js.map +1 -1
- package/dist/internal/download/thumbnailDownloader.test.js.map +1 -1
- package/dist/internal/errors.d.ts +1 -1
- package/dist/internal/errors.js +1 -3
- package/dist/internal/errors.js.map +1 -1
- package/dist/internal/events/apiService.d.ts +5 -7
- package/dist/internal/events/apiService.js +19 -22
- package/dist/internal/events/apiService.js.map +1 -1
- package/dist/internal/events/coreEventManager.d.ts +9 -12
- package/dist/internal/events/coreEventManager.js +19 -36
- package/dist/internal/events/coreEventManager.js.map +1 -1
- package/dist/internal/events/coreEventManager.test.d.ts +1 -0
- package/dist/internal/events/coreEventManager.test.js +87 -0
- package/dist/internal/events/coreEventManager.test.js.map +1 -0
- package/dist/internal/events/eventManager.d.ts +11 -36
- package/dist/internal/events/eventManager.js +59 -106
- package/dist/internal/events/eventManager.js.map +1 -1
- package/dist/internal/events/eventManager.test.js +177 -83
- package/dist/internal/events/eventManager.test.js.map +1 -1
- package/dist/internal/events/index.d.ts +16 -36
- package/dist/internal/events/index.js +56 -72
- package/dist/internal/events/index.js.map +1 -1
- package/dist/internal/events/interface.d.ts +59 -14
- package/dist/internal/events/interface.js +12 -3
- package/dist/internal/events/interface.js.map +1 -1
- package/dist/internal/events/volumeEventManager.d.ts +9 -19
- package/dist/internal/events/volumeEventManager.js +58 -45
- package/dist/internal/events/volumeEventManager.js.map +1 -1
- package/dist/internal/events/volumeEventManager.test.d.ts +1 -0
- package/dist/internal/events/volumeEventManager.test.js +203 -0
- package/dist/internal/events/volumeEventManager.test.js.map +1 -0
- package/dist/internal/nodes/apiService.d.ts +4 -3
- package/dist/internal/nodes/apiService.js +36 -15
- package/dist/internal/nodes/apiService.js.map +1 -1
- package/dist/internal/nodes/apiService.test.js +60 -41
- package/dist/internal/nodes/apiService.test.js.map +1 -1
- package/dist/internal/nodes/cache.d.ts +14 -5
- package/dist/internal/nodes/cache.js +31 -7
- package/dist/internal/nodes/cache.js.map +1 -1
- package/dist/internal/nodes/cache.test.js +31 -9
- package/dist/internal/nodes/cache.test.js.map +1 -1
- package/dist/internal/nodes/cryptoCache.d.ts +2 -2
- package/dist/internal/nodes/cryptoCache.js.map +1 -1
- package/dist/internal/nodes/cryptoCache.test.js +24 -4
- package/dist/internal/nodes/cryptoCache.test.js.map +1 -1
- package/dist/internal/nodes/cryptoService.d.ts +4 -4
- package/dist/internal/nodes/cryptoService.js +11 -17
- package/dist/internal/nodes/cryptoService.js.map +1 -1
- package/dist/internal/nodes/cryptoService.test.js +320 -241
- package/dist/internal/nodes/cryptoService.test.js.map +1 -1
- package/dist/internal/nodes/events.d.ts +8 -84
- package/dist/internal/nodes/events.js +43 -217
- package/dist/internal/nodes/events.js.map +1 -1
- package/dist/internal/nodes/events.test.js +35 -279
- package/dist/internal/nodes/events.test.js.map +1 -1
- package/dist/internal/nodes/extendedAttributes.d.ts +1 -1
- package/dist/internal/nodes/extendedAttributes.js +3 -1
- package/dist/internal/nodes/extendedAttributes.js.map +1 -1
- package/dist/internal/nodes/extendedAttributes.test.js +7 -10
- package/dist/internal/nodes/extendedAttributes.test.js.map +1 -1
- package/dist/internal/nodes/index.d.ts +12 -13
- package/dist/internal/nodes/index.js +5 -5
- package/dist/internal/nodes/index.js.map +1 -1
- package/dist/internal/nodes/index.test.js +24 -32
- package/dist/internal/nodes/index.test.js.map +1 -1
- package/dist/internal/nodes/interface.d.ts +2 -2
- package/dist/internal/nodes/nodesAccess.d.ts +22 -7
- package/dist/internal/nodes/nodesAccess.js +65 -16
- package/dist/internal/nodes/nodesAccess.js.map +1 -1
- package/dist/internal/nodes/nodesAccess.test.js +165 -101
- package/dist/internal/nodes/nodesAccess.test.js.map +1 -1
- package/dist/internal/nodes/nodesManagement.d.ts +7 -9
- package/dist/internal/nodes/nodesManagement.js +21 -33
- package/dist/internal/nodes/nodesManagement.js.map +1 -1
- package/dist/internal/nodes/nodesManagement.test.js +42 -21
- package/dist/internal/nodes/nodesManagement.test.js.map +1 -1
- package/dist/internal/nodes/nodesRevisions.d.ts +4 -4
- package/dist/internal/nodes/nodesRevisions.js.map +1 -1
- package/dist/internal/photos/albums.d.ts +3 -3
- package/dist/internal/photos/albums.js.map +1 -1
- package/dist/internal/photos/apiService.d.ts +1 -1
- package/dist/internal/photos/apiService.js +3 -6
- package/dist/internal/photos/apiService.js.map +1 -1
- package/dist/internal/photos/cache.d.ts +1 -1
- package/dist/internal/photos/index.d.ts +5 -5
- package/dist/internal/photos/index.js.map +1 -1
- package/dist/internal/photos/interface.d.ts +2 -2
- package/dist/internal/photos/photosTimeline.d.ts +3 -3
- package/dist/internal/photos/photosTimeline.js +1 -2
- package/dist/internal/photos/photosTimeline.js.map +1 -1
- package/dist/internal/sdkEvents.d.ts +1 -1
- package/dist/internal/sdkEvents.js +2 -7
- package/dist/internal/sdkEvents.js.map +1 -1
- package/dist/internal/sdkEvents.test.js +8 -8
- package/dist/internal/shares/apiService.d.ts +2 -2
- package/dist/internal/shares/apiService.js +5 -3
- package/dist/internal/shares/apiService.js.map +1 -1
- package/dist/internal/shares/cache.d.ts +4 -2
- package/dist/internal/shares/cache.js +14 -6
- package/dist/internal/shares/cache.js.map +1 -1
- package/dist/internal/shares/cache.test.js.map +1 -1
- package/dist/internal/shares/cryptoCache.d.ts +2 -2
- package/dist/internal/shares/cryptoCache.test.js +8 -2
- package/dist/internal/shares/cryptoCache.test.js.map +1 -1
- package/dist/internal/shares/cryptoService.d.ts +3 -3
- package/dist/internal/shares/cryptoService.js.map +1 -1
- package/dist/internal/shares/cryptoService.test.js +42 -42
- package/dist/internal/shares/cryptoService.test.js.map +1 -1
- package/dist/internal/shares/index.d.ts +4 -4
- package/dist/internal/shares/index.js.map +1 -1
- package/dist/internal/shares/interface.d.ts +2 -2
- package/dist/internal/shares/manager.d.ts +8 -7
- package/dist/internal/shares/manager.js +3 -0
- package/dist/internal/shares/manager.js.map +1 -1
- package/dist/internal/shares/manager.test.js +71 -63
- package/dist/internal/shares/manager.test.js.map +1 -1
- package/dist/internal/sharing/apiService.d.ts +4 -4
- package/dist/internal/sharing/apiService.js +5 -3
- package/dist/internal/sharing/apiService.js.map +1 -1
- package/dist/internal/sharing/cache.d.ts +1 -1
- package/dist/internal/sharing/cache.test.js +33 -33
- package/dist/internal/sharing/cryptoService.d.ts +3 -3
- package/dist/internal/sharing/cryptoService.js +3 -4
- package/dist/internal/sharing/cryptoService.js.map +1 -1
- package/dist/internal/sharing/cryptoService.test.js +39 -39
- package/dist/internal/sharing/cryptoService.test.js.map +1 -1
- package/dist/internal/sharing/events.d.ts +24 -56
- package/dist/internal/sharing/events.js +45 -138
- package/dist/internal/sharing/events.js.map +1 -1
- package/dist/internal/sharing/events.test.js +85 -189
- package/dist/internal/sharing/events.test.js.map +1 -1
- package/dist/internal/sharing/index.d.ts +8 -9
- package/dist/internal/sharing/index.js +5 -5
- package/dist/internal/sharing/index.js.map +1 -1
- package/dist/internal/sharing/interface.d.ts +8 -4
- package/dist/internal/sharing/sharingAccess.d.ts +6 -6
- package/dist/internal/sharing/sharingAccess.js +8 -4
- package/dist/internal/sharing/sharingAccess.js.map +1 -1
- package/dist/internal/sharing/sharingAccess.test.js +45 -39
- package/dist/internal/sharing/sharingAccess.test.js.map +1 -1
- package/dist/internal/sharing/sharingManagement.d.ts +5 -6
- package/dist/internal/sharing/sharingManagement.js +12 -16
- package/dist/internal/sharing/sharingManagement.js.map +1 -1
- package/dist/internal/sharing/sharingManagement.test.js +305 -286
- package/dist/internal/sharing/sharingManagement.test.js.map +1 -1
- package/dist/internal/uids.js.map +1 -1
- package/dist/internal/upload/apiService.d.ts +5 -6
- package/dist/internal/upload/apiService.js +8 -5
- package/dist/internal/upload/apiService.js.map +1 -1
- package/dist/internal/upload/blockVerifier.d.ts +3 -3
- package/dist/internal/upload/blockVerifier.js +1 -1
- package/dist/internal/upload/blockVerifier.js.map +1 -1
- package/dist/internal/upload/chunkStreamReader.test.js +6 -6
- package/dist/internal/upload/cryptoService.d.ts +4 -4
- package/dist/internal/upload/cryptoService.js +4 -4
- package/dist/internal/upload/cryptoService.js.map +1 -1
- package/dist/internal/upload/digests.js.map +1 -1
- package/dist/internal/upload/fileUploader.d.ts +6 -6
- package/dist/internal/upload/fileUploader.js.map +1 -1
- package/dist/internal/upload/fileUploader.test.js.map +1 -1
- package/dist/internal/upload/index.d.ts +6 -6
- package/dist/internal/upload/index.js +3 -3
- package/dist/internal/upload/index.js.map +1 -1
- package/dist/internal/upload/interface.d.ts +5 -3
- package/dist/internal/upload/manager.d.ts +8 -8
- package/dist/internal/upload/manager.js +23 -52
- package/dist/internal/upload/manager.js.map +1 -1
- package/dist/internal/upload/manager.test.js +185 -147
- package/dist/internal/upload/manager.test.js.map +1 -1
- package/dist/internal/upload/streamUploader.d.ts +6 -6
- package/dist/internal/upload/streamUploader.js +9 -8
- package/dist/internal/upload/streamUploader.js.map +1 -1
- package/dist/internal/upload/streamUploader.test.js +17 -12
- package/dist/internal/upload/streamUploader.test.js.map +1 -1
- package/dist/internal/upload/telemetry.d.ts +3 -3
- package/dist/internal/upload/telemetry.js +5 -3
- package/dist/internal/upload/telemetry.js.map +1 -1
- package/dist/internal/upload/telemetry.test.js +8 -8
- package/dist/internal/upload/telemetry.test.js.map +1 -1
- package/dist/protonDriveClient.d.ts +27 -170
- package/dist/protonDriveClient.js +37 -198
- package/dist/protonDriveClient.js.map +1 -1
- package/dist/protonDrivePhotosClient.js +3 -2
- package/dist/protonDrivePhotosClient.js.map +1 -1
- package/dist/telemetry.js +18 -15
- package/dist/telemetry.js.map +1 -1
- package/dist/tests/logger.js.map +1 -1
- package/dist/tests/telemetry.d.ts +1 -1
- package/dist/transformers.js +4 -2
- package/dist/transformers.js.map +1 -1
- package/package.json +3 -3
- package/src/cache/index.ts +1 -0
- package/src/cache/interface.ts +22 -22
- package/src/cache/memoryCache.test.ts +7 -7
- package/src/cache/memoryCache.ts +5 -5
- package/src/cache/nullCache.ts +38 -0
- package/src/config.ts +17 -2
- package/src/crypto/driveCrypto.test.ts +15 -15
- package/src/crypto/driveCrypto.ts +120 -156
- package/src/crypto/hmac.ts +1 -1
- package/src/crypto/interface.ts +63 -72
- package/src/crypto/openPGPCrypto.ts +76 -94
- package/src/crypto/utils.ts +1 -1
- package/src/diagnostic/eventsGenerator.ts +48 -0
- package/src/diagnostic/httpClient.ts +84 -0
- package/src/diagnostic/index.ts +40 -0
- package/src/diagnostic/integrityVerificationStream.ts +55 -0
- package/src/diagnostic/interface.ts +158 -0
- package/src/diagnostic/sdkDiagnostic.ts +249 -0
- package/src/diagnostic/sdkDiagnosticFull.ts +37 -0
- package/src/diagnostic/telemetry.ts +74 -0
- package/src/diagnostic/zipGenerators.test.ts +177 -0
- package/src/diagnostic/zipGenerators.ts +70 -0
- package/src/errors.ts +25 -22
- package/src/index.ts +3 -3
- package/src/interface/account.ts +10 -10
- package/src/interface/author.ts +6 -6
- package/src/interface/config.ts +28 -0
- package/src/interface/devices.ts +6 -6
- package/src/interface/download.ts +12 -9
- package/src/interface/events.ts +76 -25
- package/src/interface/httpClient.ts +11 -27
- package/src/interface/index.ts +81 -20
- package/src/interface/nodes.ts +67 -60
- package/src/interface/result.ts +1 -3
- package/src/interface/sharing.ts +60 -56
- package/src/interface/telemetry.ts +74 -74
- package/src/interface/thumbnail.ts +5 -6
- package/src/interface/upload.ts +25 -11
- package/src/internal/apiService/apiService.test.ts +109 -76
- package/src/internal/apiService/apiService.ts +40 -26
- package/src/internal/apiService/coreTypes.ts +2474 -2463
- package/src/internal/apiService/driveTypes.ts +1868 -1822
- package/src/internal/apiService/errorCodes.ts +4 -4
- package/src/internal/apiService/errors.test.ts +25 -23
- package/src/internal/apiService/errors.ts +15 -9
- package/src/internal/apiService/index.ts +1 -1
- package/src/internal/apiService/transformers.ts +2 -2
- package/src/internal/asyncIteratorMap.test.ts +4 -4
- package/src/internal/asyncIteratorMap.ts +1 -1
- package/src/internal/asyncIteratorRace.test.ts +149 -0
- package/src/internal/asyncIteratorRace.ts +79 -0
- package/src/internal/batch.test.ts +50 -0
- package/src/internal/batch.ts +9 -0
- package/src/internal/batchLoading.test.ts +13 -14
- package/src/internal/batchLoading.ts +8 -8
- package/src/internal/devices/apiService.ts +58 -51
- package/src/internal/devices/cryptoService.ts +22 -17
- package/src/internal/devices/index.ts +17 -10
- package/src/internal/devices/interface.ts +21 -12
- package/src/internal/devices/manager.test.ts +40 -9
- package/src/internal/devices/manager.ts +3 -3
- package/src/internal/download/apiService.ts +72 -52
- package/src/internal/download/cryptoService.ts +34 -18
- package/src/internal/download/fileDownloader.test.ts +25 -9
- package/src/internal/download/fileDownloader.ts +38 -20
- package/src/internal/download/index.ts +19 -19
- package/src/internal/download/interface.ts +19 -20
- package/src/internal/download/queue.ts +3 -3
- package/src/internal/download/telemetry.test.ts +11 -11
- package/src/internal/download/telemetry.ts +24 -14
- package/src/internal/download/thumbnailDownloader.test.ts +11 -6
- package/src/internal/download/thumbnailDownloader.ts +43 -32
- package/src/internal/errors.ts +7 -5
- package/src/internal/events/apiService.ts +46 -36
- package/src/internal/events/coreEventManager.test.ts +101 -0
- package/src/internal/events/coreEventManager.ts +26 -48
- package/src/internal/events/eventManager.test.ts +211 -93
- package/src/internal/events/eventManager.ts +72 -117
- package/src/internal/events/index.ts +71 -91
- package/src/internal/events/interface.ts +92 -29
- package/src/internal/events/volumeEventManager.test.ts +239 -0
- package/src/internal/events/volumeEventManager.ts +68 -57
- package/src/internal/nodes/apiService.test.ts +197 -147
- package/src/internal/nodes/apiService.ts +288 -174
- package/src/internal/nodes/cache.test.ts +48 -20
- package/src/internal/nodes/cache.ts +79 -45
- package/src/internal/nodes/cryptoCache.test.ts +34 -14
- package/src/internal/nodes/cryptoCache.ts +10 -5
- package/src/internal/nodes/cryptoService.test.ts +492 -351
- package/src/internal/nodes/cryptoService.ts +171 -89
- package/src/internal/nodes/events.test.ts +48 -344
- package/src/internal/nodes/events.ts +48 -254
- package/src/internal/nodes/extendedAttributes.test.ts +28 -24
- package/src/internal/nodes/extendedAttributes.ts +20 -15
- package/src/internal/nodes/index.test.ts +51 -55
- package/src/internal/nodes/index.ts +32 -22
- package/src/internal/nodes/interface.ts +44 -31
- package/src/internal/nodes/nodesAccess.test.ts +237 -130
- package/src/internal/nodes/nodesAccess.ts +113 -50
- package/src/internal/nodes/nodesManagement.test.ts +64 -39
- package/src/internal/nodes/nodesManagement.ts +51 -62
- package/src/internal/nodes/nodesRevisions.ts +7 -7
- package/src/internal/nodes/validations.ts +2 -2
- package/src/internal/photos/albums.ts +5 -5
- package/src/internal/photos/apiService.ts +4 -7
- package/src/internal/photos/cache.ts +1 -1
- package/src/internal/photos/index.ts +8 -8
- package/src/internal/photos/interface.ts +2 -2
- package/src/internal/photos/photosTimeline.ts +4 -5
- package/src/internal/sdkEvents.test.ts +10 -10
- package/src/internal/sdkEvents.ts +5 -13
- package/src/internal/shares/apiService.ts +44 -33
- package/src/internal/shares/cache.test.ts +6 -4
- package/src/internal/shares/cache.ts +25 -14
- package/src/internal/shares/cryptoCache.test.ts +17 -11
- package/src/internal/shares/cryptoCache.ts +4 -4
- package/src/internal/shares/cryptoService.test.ts +72 -74
- package/src/internal/shares/cryptoService.ts +48 -23
- package/src/internal/shares/index.ts +23 -11
- package/src/internal/shares/interface.ts +8 -8
- package/src/internal/shares/manager.test.ts +88 -80
- package/src/internal/shares/manager.ts +27 -23
- package/src/internal/sharing/apiService.ts +283 -175
- package/src/internal/sharing/cache.test.ts +35 -35
- package/src/internal/sharing/cache.ts +3 -3
- package/src/internal/sharing/cryptoService.test.ts +58 -46
- package/src/internal/sharing/cryptoService.ts +121 -83
- package/src/internal/sharing/events.test.ts +97 -207
- package/src/internal/sharing/events.ts +46 -157
- package/src/internal/sharing/index.ts +24 -16
- package/src/internal/sharing/interface.ts +46 -42
- package/src/internal/sharing/sharingAccess.test.ts +71 -65
- package/src/internal/sharing/sharingAccess.ts +39 -21
- package/src/internal/sharing/sharingManagement.test.ts +405 -335
- package/src/internal/sharing/sharingManagement.ts +144 -75
- package/src/internal/uids.ts +1 -1
- package/src/internal/upload/apiService.ts +168 -119
- package/src/internal/upload/blockVerifier.ts +8 -6
- package/src/internal/upload/chunkStreamReader.test.ts +7 -7
- package/src/internal/upload/cryptoService.ts +42 -36
- package/src/internal/upload/digests.ts +2 -2
- package/src/internal/upload/fileUploader.test.ts +15 -3
- package/src/internal/upload/fileUploader.ts +39 -17
- package/src/internal/upload/index.ts +17 -18
- package/src/internal/upload/interface.ts +79 -77
- package/src/internal/upload/manager.test.ts +222 -175
- package/src/internal/upload/manager.ts +74 -80
- package/src/internal/upload/queue.ts +3 -3
- package/src/internal/upload/streamUploader.test.ts +40 -27
- package/src/internal/upload/streamUploader.ts +87 -71
- package/src/internal/upload/telemetry.test.ts +11 -11
- package/src/internal/upload/telemetry.ts +25 -15
- package/src/internal/wait.test.ts +1 -1
- package/src/internal/wait.ts +3 -3
- package/src/protonDriveClient.ts +189 -276
- package/src/protonDrivePhotosClient.ts +20 -13
- package/src/telemetry.ts +60 -52
- package/src/tests/logger.ts +1 -1
- package/src/tests/telemetry.ts +2 -2
- package/src/transformers.ts +27 -21
- package/src/version.ts +0 -1
- package/dist/internal/events/cache.d.ts +0 -28
- package/dist/internal/events/cache.js +0 -67
- package/dist/internal/events/cache.js.map +0 -1
- package/dist/internal/events/cache.test.js +0 -43
- package/dist/internal/events/cache.test.js.map +0 -1
- package/src/internal/events/cache.test.ts +0 -47
- package/src/internal/events/cache.ts +0 -80
- /package/dist/{internal/events/cache.test.d.ts → diagnostic/zipGenerators.test.d.ts} +0 -0
|
@@ -16,7 +16,7 @@ describe('nodesAccess', () => {
|
|
|
16
16
|
apiService = {
|
|
17
17
|
getNode: jest.fn(),
|
|
18
18
|
iterateNodes: jest.fn().mockImplementation(async function* (uids) {
|
|
19
|
-
yield* uids.map((uid => ({ uid, parentUid: '
|
|
19
|
+
yield* uids.map((uid) => ({ uid, parentUid: 'volumeId~parentNodeId' }));
|
|
20
20
|
}),
|
|
21
21
|
iterateChildrenNodeUids: jest.fn(),
|
|
22
22
|
};
|
|
@@ -47,88 +47,109 @@ describe('nodesAccess', () => {
|
|
|
47
47
|
});
|
|
48
48
|
describe('getNode', () => {
|
|
49
49
|
it('should get node from cache', async () => {
|
|
50
|
-
const node = { uid: 'nodeId', isStale: false };
|
|
50
|
+
const node = { uid: 'volumeId~nodeId', isStale: false };
|
|
51
51
|
cache.getNode = jest.fn(() => Promise.resolve(node));
|
|
52
|
-
const result = await access.getNode('nodeId');
|
|
52
|
+
const result = await access.getNode('volumeId~nodeId');
|
|
53
53
|
expect(result).toBe(node);
|
|
54
54
|
expect(apiService.getNode).not.toHaveBeenCalled();
|
|
55
55
|
});
|
|
56
|
-
it('should get node from API when
|
|
57
|
-
const encryptedNode = { uid: 'nodeId', parentUid: '
|
|
58
|
-
const decryptedUnparsedNode = {
|
|
56
|
+
it('should get node from API when cache is stale', async () => {
|
|
57
|
+
const encryptedNode = { uid: 'volumeId~nodeId', parentUid: 'volumeId~parentNodeid' };
|
|
58
|
+
const decryptedUnparsedNode = {
|
|
59
|
+
uid: 'volumeId~nodeId',
|
|
60
|
+
parentUid: 'volumeId~parentNodeid',
|
|
61
|
+
name: { ok: true, value: 'name' },
|
|
62
|
+
};
|
|
59
63
|
const decryptedNode = {
|
|
60
64
|
...decryptedUnparsedNode,
|
|
61
65
|
name: { ok: true, value: 'name' },
|
|
62
66
|
isStale: false,
|
|
63
67
|
activeRevision: undefined,
|
|
64
68
|
folder: undefined,
|
|
69
|
+
treeEventScopeId: 'volumeId',
|
|
65
70
|
};
|
|
66
71
|
const decryptedKeys = { key: 'key' };
|
|
67
|
-
cache.getNode = jest.fn(() => Promise.resolve({ uid: 'nodeId', isStale: true }));
|
|
72
|
+
cache.getNode = jest.fn(() => Promise.resolve({ uid: 'volumeId~nodeId', isStale: true }));
|
|
68
73
|
apiService.getNode = jest.fn(() => Promise.resolve(encryptedNode));
|
|
69
74
|
cryptoCache.getNodeKeys = jest.fn(() => Promise.resolve({ key: 'parentKey' }));
|
|
70
75
|
cryptoService.decryptNode = jest.fn(() => Promise.resolve({ node: decryptedUnparsedNode, keys: decryptedKeys }));
|
|
71
|
-
const result = await access.getNode('nodeId');
|
|
76
|
+
const result = await access.getNode('volumeId~nodeId');
|
|
72
77
|
expect(result).toEqual(decryptedNode);
|
|
73
|
-
expect(apiService.getNode).toHaveBeenCalledWith('nodeId', 'volumeId');
|
|
74
|
-
expect(cryptoCache.getNodeKeys).toHaveBeenCalledWith('
|
|
78
|
+
expect(apiService.getNode).toHaveBeenCalledWith('volumeId~nodeId', 'volumeId');
|
|
79
|
+
expect(cryptoCache.getNodeKeys).toHaveBeenCalledWith('volumeId~parentNodeid');
|
|
75
80
|
expect(cryptoService.decryptNode).toHaveBeenCalledWith(encryptedNode, 'parentKey');
|
|
76
81
|
expect(cache.setNode).toHaveBeenCalledWith(decryptedNode);
|
|
77
|
-
expect(cryptoCache.setNodeKeys).toHaveBeenCalledWith('nodeId', decryptedKeys);
|
|
82
|
+
expect(cryptoCache.setNodeKeys).toHaveBeenCalledWith('volumeId~nodeId', decryptedKeys);
|
|
78
83
|
});
|
|
79
84
|
it('should get node from API missing cache', async () => {
|
|
80
|
-
const encryptedNode = { uid: 'nodeId', parentUid: '
|
|
81
|
-
const decryptedUnparsedNode = {
|
|
85
|
+
const encryptedNode = { uid: 'volumeId~nodeId', parentUid: 'volumeId~parentNodeid' };
|
|
86
|
+
const decryptedUnparsedNode = {
|
|
87
|
+
uid: 'volumeId~nodeId',
|
|
88
|
+
parentUid: 'volumeId~parentNodeid',
|
|
89
|
+
name: { ok: true, value: 'name' },
|
|
90
|
+
};
|
|
82
91
|
const decryptedNode = {
|
|
83
92
|
...decryptedUnparsedNode,
|
|
84
93
|
name: { ok: true, value: 'name' },
|
|
85
94
|
isStale: false,
|
|
86
95
|
activeRevision: undefined,
|
|
87
96
|
folder: undefined,
|
|
97
|
+
treeEventScopeId: 'volumeId',
|
|
88
98
|
};
|
|
89
99
|
const decryptedKeys = { key: 'key' };
|
|
90
100
|
cache.getNode = jest.fn(() => Promise.reject(new Error('Entity not found')));
|
|
91
101
|
apiService.getNode = jest.fn(() => Promise.resolve(encryptedNode));
|
|
92
102
|
cryptoCache.getNodeKeys = jest.fn(() => Promise.resolve({ key: 'parentKey' }));
|
|
93
103
|
cryptoService.decryptNode = jest.fn(() => Promise.resolve({ node: decryptedUnparsedNode, keys: decryptedKeys }));
|
|
94
|
-
const result = await access.getNode('nodeId');
|
|
104
|
+
const result = await access.getNode('volumeId~nodeId');
|
|
95
105
|
expect(result).toEqual(decryptedNode);
|
|
96
|
-
expect(apiService.getNode).toHaveBeenCalledWith('nodeId', 'volumeId');
|
|
97
|
-
expect(cryptoCache.getNodeKeys).toHaveBeenCalledWith('
|
|
106
|
+
expect(apiService.getNode).toHaveBeenCalledWith('volumeId~nodeId', 'volumeId');
|
|
107
|
+
expect(cryptoCache.getNodeKeys).toHaveBeenCalledWith('volumeId~parentNodeid');
|
|
98
108
|
expect(cryptoService.decryptNode).toHaveBeenCalledWith(encryptedNode, 'parentKey');
|
|
99
109
|
expect(cache.setNode).toHaveBeenCalledWith(decryptedNode);
|
|
100
|
-
expect(cryptoCache.setNodeKeys).toHaveBeenCalledWith('nodeId', decryptedKeys);
|
|
110
|
+
expect(cryptoCache.setNodeKeys).toHaveBeenCalledWith('volumeId~nodeId', decryptedKeys);
|
|
101
111
|
});
|
|
102
112
|
it('should validate node name', async () => {
|
|
103
|
-
const encryptedNode = { uid: 'nodeId', parentUid: '
|
|
104
|
-
const decryptedUnparsedNode = {
|
|
113
|
+
const encryptedNode = { uid: 'volumeId~nodeId', parentUid: 'volumeId~parentNodeid' };
|
|
114
|
+
const decryptedUnparsedNode = {
|
|
115
|
+
uid: 'volumeId~nodeId',
|
|
116
|
+
parentUid: 'volumeId~parentNodeid',
|
|
117
|
+
name: { ok: true, value: 'foo/bar' },
|
|
118
|
+
};
|
|
105
119
|
const decryptedNode = {
|
|
106
120
|
...decryptedUnparsedNode,
|
|
107
121
|
name: { ok: false, error: { name: 'foo/bar', error: "Name must not contain the character '/'" } },
|
|
122
|
+
treeEventScopeId: 'volumeId',
|
|
108
123
|
};
|
|
109
124
|
const decryptedKeys = { key: 'key' };
|
|
110
125
|
cache.getNode = jest.fn(() => Promise.reject(new Error('Entity not found')));
|
|
111
126
|
apiService.getNode = jest.fn(() => Promise.resolve(encryptedNode));
|
|
112
127
|
cryptoCache.getNodeKeys = jest.fn(() => Promise.resolve({ key: 'parentKey' }));
|
|
113
128
|
cryptoService.decryptNode = jest.fn(() => Promise.resolve({ node: decryptedUnparsedNode, keys: decryptedKeys }));
|
|
114
|
-
const result = await access.getNode('nodeId');
|
|
129
|
+
const result = await access.getNode('volumeId~nodeId');
|
|
115
130
|
expect(result).toMatchObject(decryptedNode);
|
|
116
131
|
});
|
|
117
132
|
});
|
|
118
133
|
describe('iterate methods', () => {
|
|
119
134
|
beforeEach(() => {
|
|
120
|
-
cryptoCache.getNodeKeys = jest
|
|
135
|
+
cryptoCache.getNodeKeys = jest
|
|
136
|
+
.fn()
|
|
137
|
+
.mockImplementation((uid) => Promise.resolve({ key: 'key' }));
|
|
121
138
|
cryptoService.decryptNode = jest.fn().mockImplementation((encryptedNode) => Promise.resolve({
|
|
122
|
-
node: {
|
|
139
|
+
node: {
|
|
140
|
+
uid: encryptedNode.uid,
|
|
141
|
+
isStale: false,
|
|
142
|
+
name: { ok: true, value: 'name' },
|
|
143
|
+
},
|
|
123
144
|
keys: { key: 'key' },
|
|
124
145
|
}));
|
|
125
146
|
});
|
|
126
147
|
describe('iterateChildren', () => {
|
|
127
|
-
const parentNode = { uid: '
|
|
128
|
-
const node1 = { uid: 'node1', isStale: false };
|
|
129
|
-
const node2 = { uid: 'node2', isStale: false };
|
|
130
|
-
const node3 = { uid: 'node3', isStale: false };
|
|
131
|
-
const node4 = { uid: 'node4', isStale: false };
|
|
148
|
+
const parentNode = { uid: 'volumeId~parentNodeid', isStale: false };
|
|
149
|
+
const node1 = { uid: 'volumeId~node1', isStale: false };
|
|
150
|
+
const node2 = { uid: 'volumeId~node2', isStale: false };
|
|
151
|
+
const node3 = { uid: 'volumeId~node3', isStale: false };
|
|
152
|
+
const node4 = { uid: 'volumeId~node4', isStale: false };
|
|
132
153
|
beforeEach(() => {
|
|
133
154
|
cache.getNode = jest.fn().mockResolvedValue(parentNode);
|
|
134
155
|
});
|
|
@@ -140,7 +161,7 @@ describe('nodesAccess', () => {
|
|
|
140
161
|
yield { ok: true, node: node3 };
|
|
141
162
|
yield { ok: true, node: node4 };
|
|
142
163
|
});
|
|
143
|
-
const result = await Array.fromAsync(access.iterateFolderChildren('
|
|
164
|
+
const result = await Array.fromAsync(access.iterateFolderChildren('volumeId~parentNodeid'));
|
|
144
165
|
expect(result).toMatchObject([node1, node2, node3, node4]);
|
|
145
166
|
expect(apiService.iterateChildrenNodeUids).not.toHaveBeenCalled();
|
|
146
167
|
expect(apiService.iterateNodes).not.toHaveBeenCalled();
|
|
@@ -153,33 +174,33 @@ describe('nodesAccess', () => {
|
|
|
153
174
|
yield { ok: true, uid: node3.uid, node: { ...node3, isStale: true } };
|
|
154
175
|
yield { ok: true, uid: node4.uid, node: node4 };
|
|
155
176
|
});
|
|
156
|
-
const result = await Array.fromAsync(access.iterateFolderChildren('
|
|
177
|
+
const result = await Array.fromAsync(access.iterateFolderChildren('volumeId~parentNodeid'));
|
|
157
178
|
expect(result).toMatchObject([node1, node4, node2, node3]);
|
|
158
|
-
expect(apiService.iterateNodes).toHaveBeenCalledWith([
|
|
179
|
+
expect(apiService.iterateNodes).toHaveBeenCalledWith([node2.uid, node3.uid], 'volumeId', undefined);
|
|
159
180
|
expect(cryptoService.decryptNode).toHaveBeenCalledTimes(2);
|
|
160
181
|
expect(cache.setNode).toHaveBeenCalledTimes(2);
|
|
161
182
|
expect(cryptoCache.setNodeKeys).toHaveBeenCalledTimes(2);
|
|
162
183
|
});
|
|
163
184
|
it('should load children uids and serve nodes from cache', async () => {
|
|
164
185
|
apiService.iterateChildrenNodeUids = jest.fn().mockImplementation(async function* () {
|
|
165
|
-
yield
|
|
166
|
-
yield
|
|
167
|
-
yield
|
|
168
|
-
yield
|
|
186
|
+
yield node1.uid;
|
|
187
|
+
yield node2.uid;
|
|
188
|
+
yield node3.uid;
|
|
189
|
+
yield node4.uid;
|
|
169
190
|
});
|
|
170
191
|
cache.getNode = jest.fn().mockImplementation((uid) => ({ uid, isStale: false }));
|
|
171
|
-
const result = await Array.fromAsync(access.iterateFolderChildren('
|
|
192
|
+
const result = await Array.fromAsync(access.iterateFolderChildren('volumeId~parentNodeid'));
|
|
172
193
|
expect(result).toMatchObject([node1, node2, node3, node4]);
|
|
173
|
-
expect(apiService.iterateChildrenNodeUids).toHaveBeenCalledWith('
|
|
194
|
+
expect(apiService.iterateChildrenNodeUids).toHaveBeenCalledWith('volumeId~parentNodeid', undefined);
|
|
174
195
|
expect(apiService.iterateNodes).not.toHaveBeenCalled();
|
|
175
|
-
expect(cache.setFolderChildrenLoaded).toHaveBeenCalledWith('
|
|
196
|
+
expect(cache.setFolderChildrenLoaded).toHaveBeenCalledWith('volumeId~parentNodeid');
|
|
176
197
|
});
|
|
177
198
|
it('should load from API', async () => {
|
|
178
199
|
apiService.iterateChildrenNodeUids = jest.fn().mockImplementation(async function* () {
|
|
179
|
-
yield
|
|
180
|
-
yield
|
|
181
|
-
yield
|
|
182
|
-
yield
|
|
200
|
+
yield node1.uid;
|
|
201
|
+
yield node2.uid;
|
|
202
|
+
yield node3.uid;
|
|
203
|
+
yield node4.uid;
|
|
183
204
|
});
|
|
184
205
|
cache.getNode = jest.fn().mockImplementation((uid) => {
|
|
185
206
|
if (uid === parentNode.uid) {
|
|
@@ -187,20 +208,20 @@ describe('nodesAccess', () => {
|
|
|
187
208
|
}
|
|
188
209
|
throw new Error('Entity not found');
|
|
189
210
|
});
|
|
190
|
-
const result = await Array.fromAsync(access.iterateFolderChildren('
|
|
211
|
+
const result = await Array.fromAsync(access.iterateFolderChildren('volumeId~parentNodeid'));
|
|
191
212
|
expect(result).toMatchObject([node1, node2, node3, node4]);
|
|
192
|
-
expect(apiService.iterateChildrenNodeUids).toHaveBeenCalledWith('
|
|
193
|
-
expect(apiService.iterateNodes).toHaveBeenCalledWith(['node1', 'node2', 'node3', 'node4'], 'volumeId', undefined);
|
|
213
|
+
expect(apiService.iterateChildrenNodeUids).toHaveBeenCalledWith('volumeId~parentNodeid', undefined);
|
|
214
|
+
expect(apiService.iterateNodes).toHaveBeenCalledWith(['volumeId~node1', 'volumeId~node2', 'volumeId~node3', 'volumeId~node4'], 'volumeId', undefined);
|
|
194
215
|
expect(cryptoService.decryptNode).toHaveBeenCalledTimes(4);
|
|
195
216
|
expect(cache.setNode).toHaveBeenCalledTimes(4);
|
|
196
217
|
expect(cryptoCache.setNodeKeys).toHaveBeenCalledTimes(4);
|
|
197
|
-
expect(cache.setFolderChildrenLoaded).toHaveBeenCalledWith('
|
|
218
|
+
expect(cache.setFolderChildrenLoaded).toHaveBeenCalledWith('volumeId~parentNodeid');
|
|
198
219
|
});
|
|
199
220
|
it('should remove from cache if missing on API', async () => {
|
|
200
221
|
apiService.iterateChildrenNodeUids = jest.fn().mockImplementation(async function* () {
|
|
201
|
-
yield
|
|
202
|
-
yield
|
|
203
|
-
yield
|
|
222
|
+
yield node1.uid;
|
|
223
|
+
yield node2.uid;
|
|
224
|
+
yield node3.uid;
|
|
204
225
|
});
|
|
205
226
|
cache.getNode = jest.fn().mockImplementation((uid) => {
|
|
206
227
|
if (uid === parentNode.uid) {
|
|
@@ -212,15 +233,15 @@ describe('nodesAccess', () => {
|
|
|
212
233
|
// Skip first node - make it missing.
|
|
213
234
|
yield* uids.slice(1).map((uid) => ({ uid, parentUid: parentNode.uid }));
|
|
214
235
|
});
|
|
215
|
-
const result = await Array.fromAsync(access.iterateFolderChildren('
|
|
236
|
+
const result = await Array.fromAsync(access.iterateFolderChildren('volumeId~parentNodeid'));
|
|
216
237
|
expect(result).toMatchObject([node2, node3]);
|
|
217
|
-
expect(cache.removeNodes).toHaveBeenCalledWith([
|
|
238
|
+
expect(cache.removeNodes).toHaveBeenCalledWith([node1.uid]);
|
|
218
239
|
});
|
|
219
240
|
it('should yield all decryptable children before throwing error', async () => {
|
|
220
241
|
apiService.iterateChildrenNodeUids = jest.fn().mockImplementation(async function* () {
|
|
221
|
-
yield 'node1';
|
|
222
|
-
yield 'node2';
|
|
223
|
-
yield 'node3';
|
|
242
|
+
yield 'volumeId~node1';
|
|
243
|
+
yield 'volumeId~node2';
|
|
244
|
+
yield 'volumeId~node3';
|
|
224
245
|
});
|
|
225
246
|
cache.getNode = jest.fn().mockImplementation((uid) => {
|
|
226
247
|
if (uid === parentNode.uid) {
|
|
@@ -229,37 +250,39 @@ describe('nodesAccess', () => {
|
|
|
229
250
|
throw new Error('Entity not found');
|
|
230
251
|
});
|
|
231
252
|
cryptoService.decryptNode = jest.fn().mockImplementation((encryptedNode) => {
|
|
232
|
-
if (encryptedNode.uid === 'node2') {
|
|
253
|
+
if (encryptedNode.uid === 'volumeId~node2') {
|
|
233
254
|
throw new errors_1.DecryptionError('Decryption failed');
|
|
234
255
|
}
|
|
235
256
|
return Promise.resolve({
|
|
236
|
-
node: {
|
|
257
|
+
node: {
|
|
258
|
+
uid: encryptedNode.uid,
|
|
259
|
+
isStale: false,
|
|
260
|
+
name: { ok: true, value: 'name' },
|
|
261
|
+
},
|
|
237
262
|
keys: { key: 'key' },
|
|
238
263
|
});
|
|
239
264
|
});
|
|
240
|
-
const generator = access.iterateFolderChildren('
|
|
265
|
+
const generator = access.iterateFolderChildren('volumeId~parentNodeid');
|
|
241
266
|
const node1 = await generator.next();
|
|
242
|
-
expect(node1.value).toMatchObject({ uid: 'node1' });
|
|
267
|
+
expect(node1.value).toMatchObject({ uid: 'volumeId~node1' });
|
|
243
268
|
const node2 = await generator.next();
|
|
244
|
-
expect(node2.value).toMatchObject({ uid: 'node3' });
|
|
269
|
+
expect(node2.value).toMatchObject({ uid: 'volumeId~node3' });
|
|
245
270
|
const node3 = generator.next();
|
|
246
271
|
await expect(node3).rejects.toThrow('Failed to decrypt some nodes');
|
|
247
272
|
try {
|
|
248
273
|
await node3;
|
|
249
274
|
}
|
|
250
275
|
catch (error) {
|
|
251
|
-
expect(error.cause).toEqual([
|
|
252
|
-
new errors_1.DecryptionError('Decryption failed'),
|
|
253
|
-
]);
|
|
276
|
+
expect(error.cause).toEqual([new errors_1.DecryptionError('Decryption failed')]);
|
|
254
277
|
}
|
|
255
278
|
});
|
|
256
279
|
});
|
|
257
280
|
describe('iterateTrashedNodes', () => {
|
|
258
281
|
const volumeId = 'volumeId';
|
|
259
|
-
const node1 = { uid: 'node1', isStale: false };
|
|
260
|
-
const node2 = { uid: 'node2', isStale: false };
|
|
261
|
-
const node3 = { uid: 'node3', isStale: false };
|
|
262
|
-
const node4 = { uid: 'node4', isStale: false };
|
|
282
|
+
const node1 = { uid: 'volumeId~node1', isStale: false };
|
|
283
|
+
const node2 = { uid: 'volumeId~node2', isStale: false };
|
|
284
|
+
const node3 = { uid: 'volumeId~node3', isStale: false };
|
|
285
|
+
const node4 = { uid: 'volumeId~node4', isStale: false };
|
|
263
286
|
beforeEach(() => {
|
|
264
287
|
shareService.getMyFilesIDs = jest.fn().mockResolvedValue({ volumeId });
|
|
265
288
|
apiService.iterateTrashedNodeUids = jest.fn().mockImplementation(async function* () {
|
|
@@ -283,7 +306,7 @@ describe('nodesAccess', () => {
|
|
|
283
306
|
const result = await Array.fromAsync(access.iterateTrashedNodes());
|
|
284
307
|
expect(result).toMatchObject([node1, node2, node3, node4]);
|
|
285
308
|
expect(apiService.iterateTrashedNodeUids).toHaveBeenCalledWith(volumeId, undefined);
|
|
286
|
-
expect(apiService.iterateNodes).toHaveBeenCalledWith(['node1', 'node2', 'node3', 'node4'], volumeId, undefined);
|
|
309
|
+
expect(apiService.iterateNodes).toHaveBeenCalledWith(['volumeId~node1', 'volumeId~node2', 'volumeId~node3', 'volumeId~node4'], volumeId, undefined);
|
|
287
310
|
expect(cryptoService.decryptNode).toHaveBeenCalledTimes(4);
|
|
288
311
|
expect(cache.setNode).toHaveBeenCalledTimes(4);
|
|
289
312
|
expect(cryptoCache.setNodeKeys).toHaveBeenCalledTimes(4);
|
|
@@ -294,18 +317,18 @@ describe('nodesAccess', () => {
|
|
|
294
317
|
});
|
|
295
318
|
apiService.iterateNodes = jest.fn().mockImplementation(async function* (uids) {
|
|
296
319
|
// Skip first node - make it missing.
|
|
297
|
-
yield* uids.slice(1).map((uid) => ({ uid, parentUid: '
|
|
320
|
+
yield* uids.slice(1).map((uid) => ({ uid, parentUid: 'volumeId~parentNodeid' }));
|
|
298
321
|
});
|
|
299
322
|
const result = await Array.fromAsync(access.iterateTrashedNodes());
|
|
300
323
|
expect(result).toMatchObject([node2, node3, node4]);
|
|
301
|
-
expect(cache.removeNodes).toHaveBeenCalledWith(['node1']);
|
|
324
|
+
expect(cache.removeNodes).toHaveBeenCalledWith(['volumeId~node1']);
|
|
302
325
|
});
|
|
303
326
|
});
|
|
304
327
|
describe('iterateNodes', () => {
|
|
305
|
-
const node1 = { uid: 'node1', isStale: false };
|
|
306
|
-
const node2 = { uid: 'node2', isStale: false };
|
|
307
|
-
const node3 = { uid: 'node3', isStale: false };
|
|
308
|
-
const node4 = { uid: 'node4', isStale: false };
|
|
328
|
+
const node1 = { uid: 'volumeId~node1', isStale: false, treeEventScopeId: 'volumeId' };
|
|
329
|
+
const node2 = { uid: 'volumeId~node2', isStale: false, treeEventScopeId: 'volumeId' };
|
|
330
|
+
const node3 = { uid: 'volumeId~node3', isStale: false, treeEventScopeId: 'volumeId' };
|
|
331
|
+
const node4 = { uid: 'volume~node4', isStale: false, treeEventScopeId: 'volumeId' };
|
|
309
332
|
it('should serve fully from cache', async () => {
|
|
310
333
|
cache.iterateNodes = jest.fn().mockImplementation(async function* () {
|
|
311
334
|
yield { ok: true, node: node1 };
|
|
@@ -313,70 +336,79 @@ describe('nodesAccess', () => {
|
|
|
313
336
|
yield { ok: true, node: node3 };
|
|
314
337
|
yield { ok: true, node: node4 };
|
|
315
338
|
});
|
|
316
|
-
const result = await Array.fromAsync(access.iterateNodes(['node1', 'node2', 'node3', 'node4']));
|
|
339
|
+
const result = await Array.fromAsync(access.iterateNodes(['volumeId~node1', 'volumeId~node2', 'volumeId~node3', 'volumeId~node4']));
|
|
317
340
|
expect(result).toMatchObject([node1, node2, node3, node4]);
|
|
318
341
|
expect(apiService.iterateNodes).not.toHaveBeenCalled();
|
|
319
342
|
});
|
|
320
343
|
it('should load from API', async () => {
|
|
321
344
|
cache.iterateNodes = jest.fn().mockImplementation(async function* () {
|
|
322
345
|
yield { ok: true, node: node1 };
|
|
323
|
-
yield { ok: false, uid: 'node2' };
|
|
324
|
-
yield { ok: false, uid: 'node3' };
|
|
346
|
+
yield { ok: false, uid: 'volumeId~node2' };
|
|
347
|
+
yield { ok: false, uid: 'volumeId~node3' };
|
|
325
348
|
yield { ok: true, node: node4 };
|
|
326
349
|
});
|
|
327
|
-
const result = await Array.fromAsync(access.iterateNodes(['node1', 'node2', 'node3', 'node4']));
|
|
350
|
+
const result = await Array.fromAsync(access.iterateNodes(['volumeId~node1', 'volumeId~node2', 'volumeId~node3', 'volumeId~node4']));
|
|
328
351
|
expect(result).toMatchObject([node1, node4, node2, node3]);
|
|
329
|
-
expect(apiService.iterateNodes).toHaveBeenCalledWith(['node2', 'node3'], 'volumeId', undefined);
|
|
352
|
+
expect(apiService.iterateNodes).toHaveBeenCalledWith(['volumeId~node2', 'volumeId~node3'], 'volumeId', undefined);
|
|
330
353
|
});
|
|
331
354
|
it('should remove from cache if missing on API and return back to caller', async () => {
|
|
332
355
|
cache.iterateNodes = jest.fn().mockImplementation(async function* () {
|
|
333
|
-
yield { ok: false, uid: 'node1' };
|
|
334
|
-
yield { ok: false, uid: 'node2' };
|
|
335
|
-
yield { ok: false, uid: 'node3' };
|
|
356
|
+
yield { ok: false, uid: 'volumeId~node1' };
|
|
357
|
+
yield { ok: false, uid: 'volumeId~node2' };
|
|
358
|
+
yield { ok: false, uid: 'volumeId~node3' };
|
|
336
359
|
});
|
|
337
360
|
apiService.iterateNodes = jest.fn().mockImplementation(async function* (uids) {
|
|
338
361
|
// Skip first node - make it missing.
|
|
339
|
-
yield* uids.slice(1).map((uid) => ({ uid, parentUid: '
|
|
362
|
+
yield* uids.slice(1).map((uid) => ({ uid, parentUid: 'volumeId~parentNodeid' }));
|
|
340
363
|
});
|
|
341
|
-
const result = await Array.fromAsync(access.iterateNodes(['node1', 'node2', 'node3']));
|
|
342
|
-
expect(result).toMatchObject([node2, node3, { missingUid: 'node1' }]);
|
|
343
|
-
expect(cache.removeNodes).toHaveBeenCalledWith(['node1']);
|
|
364
|
+
const result = await Array.fromAsync(access.iterateNodes(['volumeId~node1', 'volumeId~node2', 'volumeId~node3']));
|
|
365
|
+
expect(result).toMatchObject([node2, node3, { missingUid: 'volumeId~node1' }]);
|
|
366
|
+
expect(cache.removeNodes).toHaveBeenCalledWith(['volumeId~node1']);
|
|
344
367
|
});
|
|
345
368
|
it('should return degraded node if parent cannot be decrypted', async () => {
|
|
346
369
|
cache.iterateNodes = jest.fn().mockImplementation(async function* () {
|
|
347
|
-
yield { ok: false, uid: 'node1' };
|
|
348
|
-
yield { ok: false, uid: 'node2' };
|
|
349
|
-
yield { ok: false, uid: 'node3' };
|
|
370
|
+
yield { ok: false, uid: 'volumeId~node1' };
|
|
371
|
+
yield { ok: false, uid: 'volumeId~node2' };
|
|
372
|
+
yield { ok: false, uid: 'volumeId~node3' };
|
|
350
373
|
});
|
|
351
374
|
const encryptedCrypto = {
|
|
352
375
|
signatureEmail: 'signatureEmail',
|
|
353
376
|
nameSignatureEmail: 'nameSignatureEmail',
|
|
354
377
|
};
|
|
355
378
|
apiService.iterateNodes = jest.fn().mockImplementation(async function* (uids) {
|
|
356
|
-
yield* uids.map((uid) =>
|
|
357
|
-
uid,
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
379
|
+
yield* uids.map((uid) => {
|
|
380
|
+
const parentUid = uid.replace('node', 'parentOfNode');
|
|
381
|
+
return {
|
|
382
|
+
uid,
|
|
383
|
+
parentUid,
|
|
384
|
+
encryptedCrypto,
|
|
385
|
+
};
|
|
386
|
+
});
|
|
361
387
|
});
|
|
362
388
|
const decryptionError = new errors_1.DecryptionError('Parent cannot be decrypted');
|
|
363
389
|
jest.spyOn(access, 'getParentKeys').mockImplementation(async ({ parentUid }) => {
|
|
364
|
-
if (parentUid === '
|
|
390
|
+
if (parentUid === 'volumeId~parentOfNode1') {
|
|
365
391
|
throw decryptionError;
|
|
366
392
|
}
|
|
367
393
|
return {
|
|
368
394
|
key: { _idx: 32132 },
|
|
369
395
|
};
|
|
370
396
|
});
|
|
371
|
-
const result = await Array.fromAsync(access.iterateNodes(['node1', 'node2', 'node3']));
|
|
397
|
+
const result = await Array.fromAsync(access.iterateNodes(['volumeId~node1', 'volumeId~node2', 'volumeId~node3']));
|
|
372
398
|
expect(result).toEqual([
|
|
373
399
|
{
|
|
374
400
|
...node1,
|
|
375
401
|
encryptedCrypto,
|
|
376
|
-
parentUid: '
|
|
402
|
+
parentUid: 'volumeId~parentOfNode1',
|
|
377
403
|
name: { ok: false, error: decryptionError },
|
|
378
|
-
keyAuthor: {
|
|
379
|
-
|
|
404
|
+
keyAuthor: {
|
|
405
|
+
ok: false,
|
|
406
|
+
error: { claimedAuthor: 'signatureEmail', error: decryptionError.message },
|
|
407
|
+
},
|
|
408
|
+
nameAuthor: {
|
|
409
|
+
ok: false,
|
|
410
|
+
error: { claimedAuthor: 'nameSignatureEmail', error: decryptionError.message },
|
|
411
|
+
},
|
|
380
412
|
errors: [decryptionError],
|
|
381
413
|
},
|
|
382
414
|
{
|
|
@@ -404,13 +436,13 @@ describe('nodesAccess', () => {
|
|
|
404
436
|
});
|
|
405
437
|
it('should get node parent keys', async () => {
|
|
406
438
|
cryptoCache.getNodeKeys = jest.fn(() => Promise.resolve({ key: 'parentKey' }));
|
|
407
|
-
const result = await access.getParentKeys({ shareId: undefined, parentUid: '
|
|
439
|
+
const result = await access.getParentKeys({ shareId: undefined, parentUid: 'volumeId~parentNodeid' });
|
|
408
440
|
expect(result).toEqual({ key: 'parentKey' });
|
|
409
441
|
expect(shareService.getSharePrivateKey).not.toHaveBeenCalled();
|
|
410
442
|
});
|
|
411
443
|
it('should get node parent keys even if share is set', async () => {
|
|
412
444
|
cryptoCache.getNodeKeys = jest.fn(() => Promise.resolve({ key: 'parentKey' }));
|
|
413
|
-
const result = await access.getParentKeys({ shareId: 'shareId', parentUid: '
|
|
445
|
+
const result = await access.getParentKeys({ shareId: 'shareId', parentUid: 'volume1~parentNodeid' });
|
|
414
446
|
expect(result).toEqual({ key: 'parentKey' });
|
|
415
447
|
expect(shareService.getSharePrivateKey).not.toHaveBeenCalled();
|
|
416
448
|
});
|
|
@@ -420,7 +452,7 @@ describe('nodesAccess', () => {
|
|
|
420
452
|
cryptoCache.getNodeKeys = jest.fn(() => Promise.reject(new Error('Entity not found')));
|
|
421
453
|
apiService.getNode = jest.fn(() => Promise.reject(new Error('API called')));
|
|
422
454
|
try {
|
|
423
|
-
await access.getNodeKeys('nodeId');
|
|
455
|
+
await access.getNodeKeys('volumeId~nodeId');
|
|
424
456
|
throw new Error('Expected error');
|
|
425
457
|
}
|
|
426
458
|
catch (error) {
|
|
@@ -433,7 +465,7 @@ describe('nodesAccess', () => {
|
|
|
433
465
|
const nodeUid = 'nodeUid';
|
|
434
466
|
const node = {
|
|
435
467
|
uid: nodeUid,
|
|
436
|
-
parentUid: '
|
|
468
|
+
parentUid: 'volume1~parentNodeid',
|
|
437
469
|
encryptedName: 'encryptedName',
|
|
438
470
|
};
|
|
439
471
|
jest.spyOn(access, 'getNode').mockResolvedValue(node);
|
|
@@ -484,5 +516,37 @@ describe('nodesAccess', () => {
|
|
|
484
516
|
expect(result).toBe('https://drive.proton.me/shareId/folder/nodeId');
|
|
485
517
|
});
|
|
486
518
|
});
|
|
519
|
+
describe('notifyNodeChanged', () => {
|
|
520
|
+
it('should mark node as stale', async () => {
|
|
521
|
+
const node = { uid: 'volumeId~nodeId', isStale: false };
|
|
522
|
+
cache.getNode = jest.fn(() => Promise.resolve(node));
|
|
523
|
+
cache.setNode = jest.fn();
|
|
524
|
+
await access.notifyNodeChanged(node.uid);
|
|
525
|
+
expect(cache.getNode).toHaveBeenCalledWith(node.uid);
|
|
526
|
+
expect(cache.setNode).toHaveBeenCalledWith({ ...node, isStale: true });
|
|
527
|
+
});
|
|
528
|
+
it('should update parent if needed', async () => {
|
|
529
|
+
const node = { uid: 'volumeId~nodeId', parentUid: 'v1~pn1', isStale: false };
|
|
530
|
+
cache.getNode = jest.fn(() => Promise.resolve(node));
|
|
531
|
+
cache.setNode = jest.fn();
|
|
532
|
+
await access.notifyNodeChanged(node.uid, 'v1~pn2');
|
|
533
|
+
expect(cache.getNode).toHaveBeenCalledWith(node.uid);
|
|
534
|
+
expect(cache.setNode).toHaveBeenCalledWith({ ...node, parentUid: 'v1~pn2', isStale: true });
|
|
535
|
+
});
|
|
536
|
+
});
|
|
537
|
+
describe('notifyChildCreated', () => {
|
|
538
|
+
it('should reset parent listing', async () => {
|
|
539
|
+
const nodeUid = 'VolumeId1~NodeId1';
|
|
540
|
+
cache.resetFolderChildrenLoaded = jest.fn();
|
|
541
|
+
await access.notifyChildCreated(nodeUid);
|
|
542
|
+
expect(cache.resetFolderChildrenLoaded).toHaveBeenCalledWith(nodeUid);
|
|
543
|
+
});
|
|
544
|
+
});
|
|
545
|
+
describe('notifyNodeDeleted', () => {
|
|
546
|
+
it('should reset parent listing', async () => {
|
|
547
|
+
await access.notifyNodeDeleted('v1~n1');
|
|
548
|
+
expect(cache.removeNodes).toHaveBeenCalledWith(['v1~n1']);
|
|
549
|
+
});
|
|
550
|
+
});
|
|
487
551
|
});
|
|
488
552
|
//# sourceMappingURL=nodesAccess.test.js.map
|