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