@protontech/drive-sdk 0.0.10
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/README.md +17 -0
- package/dist/cache/index.d.ts +2 -0
- package/dist/cache/index.js +6 -0
- package/dist/cache/index.js.map +1 -0
- package/dist/cache/interface.d.ts +105 -0
- package/dist/cache/interface.js +3 -0
- package/dist/cache/interface.js.map +1 -0
- package/dist/cache/memoryCache.d.ts +18 -0
- package/dist/cache/memoryCache.js +78 -0
- package/dist/cache/memoryCache.js.map +1 -0
- package/dist/cache/memoryCache.test.d.ts +1 -0
- package/dist/cache/memoryCache.test.js +121 -0
- package/dist/cache/memoryCache.test.js.map +1 -0
- package/dist/config.d.ts +2 -0
- package/dist/config.js +11 -0
- package/dist/config.js.map +1 -0
- package/dist/crypto/driveCrypto.d.ts +209 -0
- package/dist/crypto/driveCrypto.js +364 -0
- package/dist/crypto/driveCrypto.js.map +1 -0
- package/dist/crypto/driveCrypto.test.d.ts +1 -0
- package/dist/crypto/driveCrypto.test.js +42 -0
- package/dist/crypto/driveCrypto.test.js.map +1 -0
- package/dist/crypto/hmac.d.ts +22 -0
- package/dist/crypto/hmac.js +44 -0
- package/dist/crypto/hmac.js.map +1 -0
- package/dist/crypto/index.d.ts +6 -0
- package/dist/crypto/index.js +13 -0
- package/dist/crypto/index.js.map +1 -0
- package/dist/crypto/interface.d.ts +125 -0
- package/dist/crypto/interface.js +10 -0
- package/dist/crypto/interface.js.map +1 -0
- package/dist/crypto/openPGPCrypto.d.ts +145 -0
- package/dist/crypto/openPGPCrypto.js +250 -0
- package/dist/crypto/openPGPCrypto.js.map +1 -0
- package/dist/crypto/utils.d.ts +2 -0
- package/dist/crypto/utils.js +35 -0
- package/dist/crypto/utils.js.map +1 -0
- package/dist/errors.d.ts +138 -0
- package/dist/errors.js +163 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +24 -0
- package/dist/index.js +48 -0
- package/dist/index.js.map +1 -0
- package/dist/interface/account.d.ts +36 -0
- package/dist/interface/account.js +3 -0
- package/dist/interface/account.js.map +1 -0
- package/dist/interface/author.d.ts +26 -0
- package/dist/interface/author.js +3 -0
- package/dist/interface/author.js.map +1 -0
- package/dist/interface/devices.d.ts +18 -0
- package/dist/interface/devices.js +10 -0
- package/dist/interface/devices.js.map +1 -0
- package/dist/interface/download.d.ts +29 -0
- package/dist/interface/download.js +3 -0
- package/dist/interface/download.js.map +1 -0
- package/dist/interface/events.d.ts +26 -0
- package/dist/interface/events.js +11 -0
- package/dist/interface/events.js.map +1 -0
- package/dist/interface/httpClient.d.ts +38 -0
- package/dist/interface/httpClient.js +3 -0
- package/dist/interface/httpClient.js.map +1 -0
- package/dist/interface/index.d.ts +43 -0
- package/dist/interface/index.js +22 -0
- package/dist/interface/index.js.map +1 -0
- package/dist/interface/nodes.d.ts +161 -0
- package/dist/interface/nodes.js +21 -0
- package/dist/interface/nodes.js.map +1 -0
- package/dist/interface/result.d.ts +9 -0
- package/dist/interface/result.js +11 -0
- package/dist/interface/result.js.map +1 -0
- package/dist/interface/sharing.d.ts +73 -0
- package/dist/interface/sharing.js +9 -0
- package/dist/interface/sharing.js.map +1 -0
- package/dist/interface/telemetry.d.ts +61 -0
- package/dist/interface/telemetry.js +18 -0
- package/dist/interface/telemetry.js.map +1 -0
- package/dist/interface/thumbnail.d.ts +17 -0
- package/dist/interface/thumbnail.js +9 -0
- package/dist/interface/thumbnail.js.map +1 -0
- package/dist/interface/upload.d.ts +16 -0
- package/dist/interface/upload.js +3 -0
- package/dist/interface/upload.js.map +1 -0
- package/dist/internal/apiService/apiService.d.ts +51 -0
- package/dist/internal/apiService/apiService.js +305 -0
- package/dist/internal/apiService/apiService.js.map +1 -0
- package/dist/internal/apiService/apiService.test.d.ts +1 -0
- package/dist/internal/apiService/apiService.test.js +237 -0
- package/dist/internal/apiService/apiService.test.js.map +1 -0
- package/dist/internal/apiService/coreTypes.d.ts +24438 -0
- package/dist/internal/apiService/coreTypes.js +7 -0
- package/dist/internal/apiService/coreTypes.js.map +1 -0
- package/dist/internal/apiService/driveTypes.d.ts +11840 -0
- package/dist/internal/apiService/driveTypes.js +7 -0
- package/dist/internal/apiService/driveTypes.js.map +1 -0
- package/dist/internal/apiService/errorCodes.d.ts +30 -0
- package/dist/internal/apiService/errorCodes.js +11 -0
- package/dist/internal/apiService/errorCodes.js.map +1 -0
- package/dist/internal/apiService/errors.d.ts +19 -0
- package/dist/internal/apiService/errors.js +76 -0
- package/dist/internal/apiService/errors.js.map +1 -0
- package/dist/internal/apiService/errors.test.d.ts +1 -0
- package/dist/internal/apiService/errors.test.js +69 -0
- package/dist/internal/apiService/errors.test.js.map +1 -0
- package/dist/internal/apiService/index.d.ts +7 -0
- package/dist/internal/apiService/index.js +30 -0
- package/dist/internal/apiService/index.js.map +1 -0
- package/dist/internal/apiService/observerStream.d.ts +3 -0
- package/dist/internal/apiService/observerStream.js +15 -0
- package/dist/internal/apiService/observerStream.js.map +1 -0
- package/dist/internal/apiService/transformers.d.ts +4 -0
- package/dist/internal/apiService/transformers.js +48 -0
- package/dist/internal/apiService/transformers.js.map +1 -0
- package/dist/internal/batchLoading.d.ts +34 -0
- package/dist/internal/batchLoading.js +68 -0
- package/dist/internal/batchLoading.js.map +1 -0
- package/dist/internal/batchLoading.test.d.ts +1 -0
- package/dist/internal/batchLoading.test.js +50 -0
- package/dist/internal/batchLoading.test.js.map +1 -0
- package/dist/internal/devices/apiService.d.ts +38 -0
- package/dist/internal/devices/apiService.js +105 -0
- package/dist/internal/devices/apiService.js.map +1 -0
- package/dist/internal/devices/cryptoService.d.ts +30 -0
- package/dist/internal/devices/cryptoService.js +47 -0
- package/dist/internal/devices/cryptoService.js.map +1 -0
- package/dist/internal/devices/index.d.ts +15 -0
- package/dist/internal/devices/index.js +22 -0
- package/dist/internal/devices/index.js.map +1 -0
- package/dist/internal/devices/interface.d.ts +31 -0
- package/dist/internal/devices/interface.js +3 -0
- package/dist/internal/devices/interface.js.map +1 -0
- package/dist/internal/devices/manager.d.ts +18 -0
- package/dist/internal/devices/manager.js +103 -0
- package/dist/internal/devices/manager.js.map +1 -0
- package/dist/internal/devices/manager.test.d.ts +1 -0
- package/dist/internal/devices/manager.test.js +100 -0
- package/dist/internal/devices/manager.test.js.map +1 -0
- package/dist/internal/download/apiService.d.ts +27 -0
- package/dist/internal/download/apiService.js +110 -0
- package/dist/internal/download/apiService.js.map +1 -0
- package/dist/internal/download/controller.d.ts +8 -0
- package/dist/internal/download/controller.js +22 -0
- package/dist/internal/download/controller.js.map +1 -0
- package/dist/internal/download/cryptoService.d.ts +17 -0
- package/dist/internal/download/cryptoService.js +82 -0
- package/dist/internal/download/cryptoService.js.map +1 -0
- package/dist/internal/download/fileDownloader.d.ts +33 -0
- package/dist/internal/download/fileDownloader.js +226 -0
- package/dist/internal/download/fileDownloader.js.map +1 -0
- package/dist/internal/download/fileDownloader.test.d.ts +1 -0
- package/dist/internal/download/fileDownloader.test.js +324 -0
- package/dist/internal/download/fileDownloader.test.js.map +1 -0
- package/dist/internal/download/index.d.ts +10 -0
- package/dist/internal/download/index.js +82 -0
- package/dist/internal/download/index.js.map +1 -0
- package/dist/internal/download/interface.d.ts +35 -0
- package/dist/internal/download/interface.js +3 -0
- package/dist/internal/download/interface.js.map +1 -0
- package/dist/internal/download/queue.d.ts +5 -0
- package/dist/internal/download/queue.js +31 -0
- package/dist/internal/download/queue.js.map +1 -0
- package/dist/internal/download/telemetry.d.ts +14 -0
- package/dist/internal/download/telemetry.js +106 -0
- package/dist/internal/download/telemetry.js.map +1 -0
- package/dist/internal/download/telemetry.test.d.ts +1 -0
- package/dist/internal/download/telemetry.test.js +111 -0
- package/dist/internal/download/telemetry.test.js.map +1 -0
- package/dist/internal/download/thumbnailDownloader.d.ts +19 -0
- package/dist/internal/download/thumbnailDownloader.js +198 -0
- package/dist/internal/download/thumbnailDownloader.js.map +1 -0
- package/dist/internal/download/thumbnailDownloader.test.d.ts +1 -0
- package/dist/internal/download/thumbnailDownloader.test.js +179 -0
- package/dist/internal/download/thumbnailDownloader.test.js.map +1 -0
- package/dist/internal/errors.d.ts +6 -0
- package/dist/internal/errors.js +28 -0
- package/dist/internal/errors.js.map +1 -0
- package/dist/internal/errors.test.d.ts +1 -0
- package/dist/internal/errors.test.js +22 -0
- package/dist/internal/errors.test.js.map +1 -0
- package/dist/internal/events/apiService.d.ts +18 -0
- package/dist/internal/events/apiService.js +81 -0
- package/dist/internal/events/apiService.js.map +1 -0
- package/dist/internal/events/cache.d.ts +28 -0
- package/dist/internal/events/cache.js +67 -0
- package/dist/internal/events/cache.js.map +1 -0
- package/dist/internal/events/cache.test.d.ts +1 -0
- package/dist/internal/events/cache.test.js +43 -0
- package/dist/internal/events/cache.test.js.map +1 -0
- package/dist/internal/events/coreEventManager.d.ts +25 -0
- package/dist/internal/events/coreEventManager.js +63 -0
- package/dist/internal/events/coreEventManager.js.map +1 -0
- package/dist/internal/events/eventManager.d.ts +62 -0
- package/dist/internal/events/eventManager.js +159 -0
- package/dist/internal/events/eventManager.js.map +1 -0
- package/dist/internal/events/eventManager.test.d.ts +1 -0
- package/dist/internal/events/eventManager.test.js +120 -0
- package/dist/internal/events/eventManager.test.js.map +1 -0
- package/dist/internal/events/index.d.ts +50 -0
- package/dist/internal/events/index.js +117 -0
- package/dist/internal/events/index.js.map +1 -0
- package/dist/internal/events/interface.d.ts +47 -0
- package/dist/internal/events/interface.js +12 -0
- package/dist/internal/events/interface.js.map +1 -0
- package/dist/internal/events/volumeEventManager.d.ts +27 -0
- package/dist/internal/events/volumeEventManager.js +69 -0
- package/dist/internal/events/volumeEventManager.js.map +1 -0
- package/dist/internal/nodes/apiService.d.ts +54 -0
- package/dist/internal/nodes/apiService.js +308 -0
- package/dist/internal/nodes/apiService.js.map +1 -0
- package/dist/internal/nodes/apiService.test.d.ts +1 -0
- package/dist/internal/nodes/apiService.test.js +344 -0
- package/dist/internal/nodes/apiService.test.js.map +1 -0
- package/dist/internal/nodes/cache.d.ts +57 -0
- package/dist/internal/nodes/cache.js +226 -0
- package/dist/internal/nodes/cache.js.map +1 -0
- package/dist/internal/nodes/cache.test.d.ts +1 -0
- package/dist/internal/nodes/cache.test.js +160 -0
- package/dist/internal/nodes/cache.test.js.map +1 -0
- package/dist/internal/nodes/cryptoCache.d.ts +16 -0
- package/dist/internal/nodes/cryptoCache.js +50 -0
- package/dist/internal/nodes/cryptoCache.js.map +1 -0
- package/dist/internal/nodes/cryptoCache.test.d.ts +1 -0
- package/dist/internal/nodes/cryptoCache.test.js +79 -0
- package/dist/internal/nodes/cryptoCache.test.js.map +1 -0
- package/dist/internal/nodes/cryptoService.d.ts +75 -0
- package/dist/internal/nodes/cryptoService.js +409 -0
- package/dist/internal/nodes/cryptoService.js.map +1 -0
- package/dist/internal/nodes/cryptoService.test.d.ts +1 -0
- package/dist/internal/nodes/cryptoService.test.js +698 -0
- package/dist/internal/nodes/cryptoService.test.js.map +1 -0
- package/dist/internal/nodes/events.d.ts +91 -0
- package/dist/internal/nodes/events.js +243 -0
- package/dist/internal/nodes/events.js.map +1 -0
- package/dist/internal/nodes/events.test.d.ts +1 -0
- package/dist/internal/nodes/events.test.js +318 -0
- package/dist/internal/nodes/events.test.js.map +1 -0
- package/dist/internal/nodes/extendedAttributes.d.ts +23 -0
- package/dist/internal/nodes/extendedAttributes.js +117 -0
- package/dist/internal/nodes/extendedAttributes.js.map +1 -0
- package/dist/internal/nodes/extendedAttributes.test.d.ts +1 -0
- package/dist/internal/nodes/extendedAttributes.test.js +176 -0
- package/dist/internal/nodes/extendedAttributes.test.js.map +1 -0
- package/dist/internal/nodes/index.d.ts +26 -0
- package/dist/internal/nodes/index.js +40 -0
- package/dist/internal/nodes/index.js.map +1 -0
- package/dist/internal/nodes/index.test.d.ts +1 -0
- package/dist/internal/nodes/index.test.js +112 -0
- package/dist/internal/nodes/index.test.js.map +1 -0
- package/dist/internal/nodes/interface.d.ts +135 -0
- package/dist/internal/nodes/interface.js +3 -0
- package/dist/internal/nodes/interface.js.map +1 -0
- package/dist/internal/nodes/mediaTypes.d.ts +2 -0
- package/dist/internal/nodes/mediaTypes.js +13 -0
- package/dist/internal/nodes/mediaTypes.js.map +1 -0
- package/dist/internal/nodes/nodesAccess.d.ts +49 -0
- package/dist/internal/nodes/nodesAccess.js +332 -0
- package/dist/internal/nodes/nodesAccess.js.map +1 -0
- package/dist/internal/nodes/nodesAccess.test.d.ts +1 -0
- package/dist/internal/nodes/nodesAccess.test.js +487 -0
- package/dist/internal/nodes/nodesAccess.test.js.map +1 -0
- package/dist/internal/nodes/nodesManagement.d.ts +33 -0
- package/dist/internal/nodes/nodesManagement.js +222 -0
- package/dist/internal/nodes/nodesManagement.js.map +1 -0
- package/dist/internal/nodes/nodesManagement.test.d.ts +1 -0
- package/dist/internal/nodes/nodesManagement.test.js +178 -0
- package/dist/internal/nodes/nodesManagement.test.js.map +1 -0
- package/dist/internal/nodes/nodesRevisions.d.ts +18 -0
- package/dist/internal/nodes/nodesRevisions.js +55 -0
- package/dist/internal/nodes/nodesRevisions.js.map +1 -0
- package/dist/internal/nodes/validations.d.ts +4 -0
- package/dist/internal/nodes/validations.js +21 -0
- package/dist/internal/nodes/validations.js.map +1 -0
- package/dist/internal/photos/albums.d.ts +13 -0
- package/dist/internal/photos/albums.js +30 -0
- package/dist/internal/photos/albums.js.map +1 -0
- package/dist/internal/photos/apiService.d.ts +8 -0
- package/dist/internal/photos/apiService.js +18 -0
- package/dist/internal/photos/apiService.js.map +1 -0
- package/dist/internal/photos/cache.d.ts +6 -0
- package/dist/internal/photos/cache.js +15 -0
- package/dist/internal/photos/cache.js.map +1 -0
- package/dist/internal/photos/index.d.ts +9 -0
- package/dist/internal/photos/index.js +18 -0
- package/dist/internal/photos/index.js.map +1 -0
- package/dist/internal/photos/interface.d.ts +6 -0
- package/dist/internal/photos/interface.js +3 -0
- package/dist/internal/photos/interface.js.map +1 -0
- package/dist/internal/photos/photosTimeline.d.ts +10 -0
- package/dist/internal/photos/photosTimeline.js +20 -0
- package/dist/internal/photos/photosTimeline.js.map +1 -0
- package/dist/internal/sdkEvents.d.ts +12 -0
- package/dist/internal/sdkEvents.js +44 -0
- package/dist/internal/sdkEvents.js.map +1 -0
- package/dist/internal/sdkEvents.test.d.ts +1 -0
- package/dist/internal/sdkEvents.test.js +45 -0
- package/dist/internal/sdkEvents.test.js.map +1 -0
- package/dist/internal/shares/apiService.d.ts +51 -0
- package/dist/internal/shares/apiService.js +128 -0
- package/dist/internal/shares/apiService.js.map +1 -0
- package/dist/internal/shares/cache.d.ts +15 -0
- package/dist/internal/shares/cache.js +63 -0
- package/dist/internal/shares/cache.js.map +1 -0
- package/dist/internal/shares/cache.test.d.ts +1 -0
- package/dist/internal/shares/cache.test.js +54 -0
- package/dist/internal/shares/cache.test.js.map +1 -0
- package/dist/internal/shares/cryptoCache.d.ts +20 -0
- package/dist/internal/shares/cryptoCache.js +35 -0
- package/dist/internal/shares/cryptoCache.js.map +1 -0
- package/dist/internal/shares/cryptoCache.test.d.ts +1 -0
- package/dist/internal/shares/cryptoCache.test.js +58 -0
- package/dist/internal/shares/cryptoCache.test.js.map +1 -0
- package/dist/internal/shares/cryptoService.d.ts +42 -0
- package/dist/internal/shares/cryptoService.js +126 -0
- package/dist/internal/shares/cryptoService.js.map +1 -0
- package/dist/internal/shares/cryptoService.test.d.ts +1 -0
- package/dist/internal/shares/cryptoService.test.js +120 -0
- package/dist/internal/shares/cryptoService.test.js.map +1 -0
- package/dist/internal/shares/index.d.ts +15 -0
- package/dist/internal/shares/index.js +26 -0
- package/dist/internal/shares/index.js.map +1 -0
- package/dist/internal/shares/interface.d.ts +94 -0
- package/dist/internal/shares/interface.js +11 -0
- package/dist/internal/shares/interface.js.map +1 -0
- package/dist/internal/shares/manager.d.ts +68 -0
- package/dist/internal/shares/manager.js +186 -0
- package/dist/internal/shares/manager.js.map +1 -0
- package/dist/internal/shares/manager.test.d.ts +1 -0
- package/dist/internal/shares/manager.test.js +176 -0
- package/dist/internal/shares/manager.test.js.map +1 -0
- package/dist/internal/sharing/apiService.d.ts +80 -0
- package/dist/internal/sharing/apiService.js +325 -0
- package/dist/internal/sharing/apiService.js.map +1 -0
- package/dist/internal/sharing/cache.d.ts +37 -0
- package/dist/internal/sharing/cache.js +105 -0
- package/dist/internal/sharing/cache.js.map +1 -0
- package/dist/internal/sharing/cache.test.d.ts +1 -0
- package/dist/internal/sharing/cache.test.js +82 -0
- package/dist/internal/sharing/cache.test.js.map +1 -0
- package/dist/internal/sharing/cryptoService.d.ts +112 -0
- package/dist/internal/sharing/cryptoService.js +269 -0
- package/dist/internal/sharing/cryptoService.js.map +1 -0
- package/dist/internal/sharing/events.d.ts +57 -0
- package/dist/internal/sharing/events.js +153 -0
- package/dist/internal/sharing/events.js.map +1 -0
- package/dist/internal/sharing/events.test.d.ts +1 -0
- package/dist/internal/sharing/events.test.js +246 -0
- package/dist/internal/sharing/events.test.js.map +1 -0
- package/dist/internal/sharing/index.d.ts +20 -0
- package/dist/internal/sharing/index.js +30 -0
- package/dist/internal/sharing/index.js.map +1 -0
- package/dist/internal/sharing/interface.d.ts +169 -0
- package/dist/internal/sharing/interface.js +9 -0
- package/dist/internal/sharing/interface.js.map +1 -0
- package/dist/internal/sharing/sharingAccess.d.ts +32 -0
- package/dist/internal/sharing/sharingAccess.js +119 -0
- package/dist/internal/sharing/sharingAccess.js.map +1 -0
- package/dist/internal/sharing/sharingAccess.test.d.ts +1 -0
- package/dist/internal/sharing/sharingAccess.test.js +84 -0
- package/dist/internal/sharing/sharingAccess.test.js.map +1 -0
- package/dist/internal/sharing/sharingManagement.d.ts +43 -0
- package/dist/internal/sharing/sharingManagement.js +439 -0
- package/dist/internal/sharing/sharingManagement.js.map +1 -0
- package/dist/internal/sharing/sharingManagement.test.d.ts +1 -0
- package/dist/internal/sharing/sharingManagement.test.js +788 -0
- package/dist/internal/sharing/sharingManagement.test.js.map +1 -0
- package/dist/internal/uids.d.ts +38 -0
- package/dist/internal/uids.js +85 -0
- package/dist/internal/uids.js.map +1 -0
- package/dist/internal/upload/apiService.d.ts +65 -0
- package/dist/internal/upload/apiService.js +137 -0
- package/dist/internal/upload/apiService.js.map +1 -0
- package/dist/internal/upload/blockVerifier.d.ts +16 -0
- package/dist/internal/upload/blockVerifier.js +33 -0
- package/dist/internal/upload/blockVerifier.js.map +1 -0
- package/dist/internal/upload/chunkStreamReader.d.ts +13 -0
- package/dist/internal/upload/chunkStreamReader.js +46 -0
- package/dist/internal/upload/chunkStreamReader.js.map +1 -0
- package/dist/internal/upload/chunkStreamReader.test.d.ts +1 -0
- package/dist/internal/upload/chunkStreamReader.test.js +75 -0
- package/dist/internal/upload/chunkStreamReader.test.js.map +1 -0
- package/dist/internal/upload/controller.d.ts +8 -0
- package/dist/internal/upload/controller.js +25 -0
- package/dist/internal/upload/controller.js.map +1 -0
- package/dist/internal/upload/cryptoService.d.ts +29 -0
- package/dist/internal/upload/cryptoService.js +104 -0
- package/dist/internal/upload/cryptoService.js.map +1 -0
- package/dist/internal/upload/digests.d.ts +8 -0
- package/dist/internal/upload/digests.js +22 -0
- package/dist/internal/upload/digests.js.map +1 -0
- package/dist/internal/upload/fileUploader.d.ts +65 -0
- package/dist/internal/upload/fileUploader.js +463 -0
- package/dist/internal/upload/fileUploader.js.map +1 -0
- package/dist/internal/upload/fileUploader.test.d.ts +1 -0
- package/dist/internal/upload/fileUploader.test.js +393 -0
- package/dist/internal/upload/fileUploader.test.js.map +1 -0
- package/dist/internal/upload/index.d.ts +16 -0
- package/dist/internal/upload/index.js +77 -0
- package/dist/internal/upload/index.js.map +1 -0
- package/dist/internal/upload/interface.d.ts +117 -0
- package/dist/internal/upload/interface.js +3 -0
- package/dist/internal/upload/interface.js.map +1 -0
- package/dist/internal/upload/manager.d.ts +31 -0
- package/dist/internal/upload/manager.js +250 -0
- package/dist/internal/upload/manager.js.map +1 -0
- package/dist/internal/upload/manager.test.d.ts +1 -0
- package/dist/internal/upload/manager.test.js +349 -0
- package/dist/internal/upload/manager.test.js.map +1 -0
- package/dist/internal/upload/queue.d.ts +5 -0
- package/dist/internal/upload/queue.js +32 -0
- package/dist/internal/upload/queue.js.map +1 -0
- package/dist/internal/upload/telemetry.d.ts +15 -0
- package/dist/internal/upload/telemetry.js +111 -0
- package/dist/internal/upload/telemetry.js.map +1 -0
- package/dist/internal/upload/telemetry.test.d.ts +1 -0
- package/dist/internal/upload/telemetry.test.js +107 -0
- package/dist/internal/upload/telemetry.test.js.map +1 -0
- package/dist/internal/utils.d.ts +1 -0
- package/dist/internal/utils.js +13 -0
- package/dist/internal/utils.js.map +1 -0
- package/dist/internal/wait.d.ts +3 -0
- package/dist/internal/wait.js +28 -0
- package/dist/internal/wait.js.map +1 -0
- package/dist/internal/wait.test.d.ts +1 -0
- package/dist/internal/wait.test.js +21 -0
- package/dist/internal/wait.test.js.map +1 -0
- package/dist/protonDriveClient.d.ts +593 -0
- package/dist/protonDriveClient.js +768 -0
- package/dist/protonDriveClient.js.map +1 -0
- package/dist/protonDrivePhotosClient.d.ts +16 -0
- package/dist/protonDrivePhotosClient.js +46 -0
- package/dist/protonDrivePhotosClient.js.map +1 -0
- package/dist/telemetry.d.ts +187 -0
- package/dist/telemetry.js +297 -0
- package/dist/telemetry.js.map +1 -0
- package/dist/tests/logger.d.ts +2 -0
- package/dist/tests/logger.js +12 -0
- package/dist/tests/logger.js.map +1 -0
- package/dist/tests/telemetry.d.ts +2 -0
- package/dist/tests/telemetry.js +11 -0
- package/dist/tests/telemetry.js.map +1 -0
- package/dist/transformers.d.ts +17 -0
- package/dist/transformers.js +77 -0
- package/dist/transformers.js.map +1 -0
- package/dist/version.d.ts +1 -0
- package/dist/version.js +6 -0
- package/dist/version.js.map +1 -0
- package/package.json +49 -0
- package/src/cache/index.ts +2 -0
- package/src/cache/interface.ts +104 -0
- package/src/cache/memoryCache.test.ts +150 -0
- package/src/cache/memoryCache.ts +85 -0
- package/src/config.ts +9 -0
- package/src/crypto/driveCrypto.test.ts +45 -0
- package/src/crypto/driveCrypto.ts +696 -0
- package/src/crypto/hmac.ts +46 -0
- package/src/crypto/index.ts +6 -0
- package/src/crypto/interface.ts +230 -0
- package/src/crypto/openPGPCrypto.ts +398 -0
- package/src/crypto/utils.ts +40 -0
- package/src/errors.ts +168 -0
- package/src/index.ts +30 -0
- package/src/interface/account.ts +38 -0
- package/src/interface/author.ts +29 -0
- package/src/interface/devices.ts +21 -0
- package/src/interface/download.ts +32 -0
- package/src/interface/events.ts +30 -0
- package/src/interface/httpClient.ts +42 -0
- package/src/interface/index.ts +46 -0
- package/src/interface/nodes.ts +168 -0
- package/src/interface/result.ts +11 -0
- package/src/interface/sharing.ts +87 -0
- package/src/interface/telemetry.ts +107 -0
- package/src/interface/thumbnail.ts +14 -0
- package/src/interface/upload.ts +19 -0
- package/src/internal/apiService/apiService.test.ts +285 -0
- package/src/internal/apiService/apiService.ts +353 -0
- package/src/internal/apiService/coreTypes.ts +24439 -0
- package/src/internal/apiService/driveTypes.ts +11841 -0
- package/src/internal/apiService/errorCodes.ts +38 -0
- package/src/internal/apiService/errors.test.ts +63 -0
- package/src/internal/apiService/errors.ts +91 -0
- package/src/internal/apiService/index.ts +7 -0
- package/src/internal/apiService/observerStream.ts +10 -0
- package/src/internal/apiService/transformers.ts +45 -0
- package/src/internal/batchLoading.test.ts +58 -0
- package/src/internal/batchLoading.ts +74 -0
- package/src/internal/devices/apiService.ts +142 -0
- package/src/internal/devices/cryptoService.ts +65 -0
- package/src/internal/devices/index.ts +31 -0
- package/src/internal/devices/interface.ts +28 -0
- package/src/internal/devices/manager.test.ts +129 -0
- package/src/internal/devices/manager.ts +113 -0
- package/src/internal/download/apiService.ts +145 -0
- package/src/internal/download/controller.ts +22 -0
- package/src/internal/download/cryptoService.ts +96 -0
- package/src/internal/download/fileDownloader.test.ts +381 -0
- package/src/internal/download/fileDownloader.ts +266 -0
- package/src/internal/download/index.ts +122 -0
- package/src/internal/download/interface.ts +38 -0
- package/src/internal/download/queue.ts +30 -0
- package/src/internal/download/telemetry.test.ts +134 -0
- package/src/internal/download/telemetry.ts +115 -0
- package/src/internal/download/thumbnailDownloader.test.ts +226 -0
- package/src/internal/download/thumbnailDownloader.ts +250 -0
- package/src/internal/errors.test.ts +21 -0
- package/src/internal/errors.ts +28 -0
- package/src/internal/events/apiService.ts +87 -0
- package/src/internal/events/cache.test.ts +47 -0
- package/src/internal/events/cache.ts +80 -0
- package/src/internal/events/coreEventManager.ts +69 -0
- package/src/internal/events/eventManager.test.ts +139 -0
- package/src/internal/events/eventManager.ts +168 -0
- package/src/internal/events/index.ts +131 -0
- package/src/internal/events/interface.ts +51 -0
- package/src/internal/events/volumeEventManager.ts +74 -0
- package/src/internal/nodes/apiService.test.ts +394 -0
- package/src/internal/nodes/apiService.ts +455 -0
- package/src/internal/nodes/cache.test.ts +197 -0
- package/src/internal/nodes/cache.ts +240 -0
- package/src/internal/nodes/cryptoCache.test.ts +92 -0
- package/src/internal/nodes/cryptoCache.ts +47 -0
- package/src/internal/nodes/cryptoService.test.ts +814 -0
- package/src/internal/nodes/cryptoService.ts +550 -0
- package/src/internal/nodes/events.test.ts +383 -0
- package/src/internal/nodes/events.ts +271 -0
- package/src/internal/nodes/extendedAttributes.test.ts +177 -0
- package/src/internal/nodes/extendedAttributes.ts +180 -0
- package/src/internal/nodes/index.test.ts +135 -0
- package/src/internal/nodes/index.ts +52 -0
- package/src/internal/nodes/interface.ts +152 -0
- package/src/internal/nodes/mediaTypes.ts +10 -0
- package/src/internal/nodes/nodesAccess.test.ts +555 -0
- package/src/internal/nodes/nodesAccess.ts +360 -0
- package/src/internal/nodes/nodesManagement.test.ts +221 -0
- package/src/internal/nodes/nodesManagement.ts +272 -0
- package/src/internal/nodes/nodesRevisions.ts +58 -0
- package/src/internal/nodes/validations.ts +26 -0
- package/src/internal/photos/albums.ts +29 -0
- package/src/internal/photos/apiService.ts +16 -0
- package/src/internal/photos/cache.ts +11 -0
- package/src/internal/photos/index.ts +23 -0
- package/src/internal/photos/interface.ts +7 -0
- package/src/internal/photos/photosTimeline.ts +18 -0
- package/src/internal/sdkEvents.test.ts +55 -0
- package/src/internal/sdkEvents.ts +52 -0
- package/src/internal/shares/apiService.ts +176 -0
- package/src/internal/shares/cache.test.ts +58 -0
- package/src/internal/shares/cache.ts +64 -0
- package/src/internal/shares/cryptoCache.test.ts +70 -0
- package/src/internal/shares/cryptoCache.ts +35 -0
- package/src/internal/shares/cryptoService.test.ts +137 -0
- package/src/internal/shares/cryptoService.ts +143 -0
- package/src/internal/shares/index.ts +35 -0
- package/src/internal/shares/interface.ts +104 -0
- package/src/internal/shares/manager.test.ts +210 -0
- package/src/internal/shares/manager.ts +213 -0
- package/src/internal/sharing/apiService.ts +483 -0
- package/src/internal/sharing/cache.test.ts +99 -0
- package/src/internal/sharing/cache.ts +109 -0
- package/src/internal/sharing/cryptoService.ts +378 -0
- package/src/internal/sharing/events.test.ts +268 -0
- package/src/internal/sharing/events.ts +166 -0
- package/src/internal/sharing/index.ts +43 -0
- package/src/internal/sharing/interface.ts +177 -0
- package/src/internal/sharing/sharingAccess.test.ts +102 -0
- package/src/internal/sharing/sharingAccess.ts +133 -0
- package/src/internal/sharing/sharingManagement.test.ts +895 -0
- package/src/internal/sharing/sharingManagement.ts +521 -0
- package/src/internal/uids.ts +83 -0
- package/src/internal/upload/apiService.ts +243 -0
- package/src/internal/upload/blockVerifier.ts +40 -0
- package/src/internal/upload/chunkStreamReader.test.ts +89 -0
- package/src/internal/upload/chunkStreamReader.ts +49 -0
- package/src/internal/upload/controller.ts +25 -0
- package/src/internal/upload/cryptoService.ts +162 -0
- package/src/internal/upload/digests.ts +18 -0
- package/src/internal/upload/fileUploader.test.ts +513 -0
- package/src/internal/upload/fileUploader.ts +576 -0
- package/src/internal/upload/index.ts +126 -0
- package/src/internal/upload/interface.ts +128 -0
- package/src/internal/upload/manager.test.ts +390 -0
- package/src/internal/upload/manager.ts +320 -0
- package/src/internal/upload/queue.ts +31 -0
- package/src/internal/upload/telemetry.test.ts +129 -0
- package/src/internal/upload/telemetry.ts +121 -0
- package/src/internal/utils.ts +9 -0
- package/src/internal/wait.test.ts +21 -0
- package/src/internal/wait.ts +26 -0
- package/src/protonDriveClient.ts +861 -0
- package/src/protonDrivePhotosClient.ts +56 -0
- package/src/telemetry.ts +346 -0
- package/src/tests/logger.ts +10 -0
- package/src/tests/telemetry.ts +9 -0
- package/src/transformers.ts +98 -0
- package/src/version.ts +4 -0
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { ProtonDriveEntitiesCache, ProtonDriveCryptoCache, ProtonDriveAccount, ProtonDriveTelemetry } from "../../interface";
|
|
2
|
+
import { DriveCrypto } from '../../crypto';
|
|
3
|
+
import { DriveAPIService } from "../apiService";
|
|
4
|
+
import { SharesAPIService } from "./apiService";
|
|
5
|
+
import { SharesCryptoCache } from "./cryptoCache";
|
|
6
|
+
import { SharesCache } from "./cache";
|
|
7
|
+
import { SharesCryptoService } from "./cryptoService";
|
|
8
|
+
import { SharesManager } from "./manager";
|
|
9
|
+
|
|
10
|
+
export type { EncryptedShare } from "./interface";
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Provides facade for the whole shares module.
|
|
14
|
+
*
|
|
15
|
+
* The shares module is responsible for handling shares metadata, including
|
|
16
|
+
* API communication, encryption, decryption, caching, and event handling.
|
|
17
|
+
*
|
|
18
|
+
* This facade provides internal interface that other modules can use to
|
|
19
|
+
* interact with the shares.
|
|
20
|
+
*/
|
|
21
|
+
export function initSharesModule(
|
|
22
|
+
telemetry: ProtonDriveTelemetry,
|
|
23
|
+
apiService: DriveAPIService,
|
|
24
|
+
driveEntitiesCache: ProtonDriveEntitiesCache,
|
|
25
|
+
driveCryptoCache: ProtonDriveCryptoCache,
|
|
26
|
+
account: ProtonDriveAccount,
|
|
27
|
+
crypto: DriveCrypto,
|
|
28
|
+
) {
|
|
29
|
+
const api = new SharesAPIService(apiService);
|
|
30
|
+
const cache = new SharesCache(telemetry.getLogger('shares-cache'), driveEntitiesCache);
|
|
31
|
+
const cryptoCache = new SharesCryptoCache(driveCryptoCache);
|
|
32
|
+
const cryptoService = new SharesCryptoService(telemetry, crypto, account);
|
|
33
|
+
const sharesManager = new SharesManager(telemetry.getLogger('shares'), api, cache, cryptoCache, cryptoService, account);
|
|
34
|
+
return sharesManager;
|
|
35
|
+
}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import { PrivateKey, SessionKey } from "../../crypto";
|
|
2
|
+
import { Result, UnverifiedAuthorError } from "../../interface";
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Internal interface providing basic identification of volume and its root
|
|
6
|
+
* share and node.
|
|
7
|
+
*
|
|
8
|
+
* No interface should inherit from this, this is only for composition to
|
|
9
|
+
* create basic volume or share interfaces.
|
|
10
|
+
*
|
|
11
|
+
* Volumes do not have necessarily share or node, but we want to always
|
|
12
|
+
* know what is the root share or node, thus we want to keep this for both
|
|
13
|
+
* volumes or any type of share.
|
|
14
|
+
*/
|
|
15
|
+
export interface VolumeShareNodeIDs {
|
|
16
|
+
volumeId: string;
|
|
17
|
+
shareId: string;
|
|
18
|
+
rootNodeId: string;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export type Volume = {
|
|
22
|
+
/**
|
|
23
|
+
* Creator email and address ID come from the default share.
|
|
24
|
+
*
|
|
25
|
+
* The idea is to keep this information synced, so whenever we check
|
|
26
|
+
* cached volume information, we have creator details at hand for any
|
|
27
|
+
* verification checks or creation needs.
|
|
28
|
+
*/
|
|
29
|
+
creatorEmail: string;
|
|
30
|
+
addressId: string;
|
|
31
|
+
} & VolumeShareNodeIDs;
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Internal share interface.
|
|
35
|
+
*/
|
|
36
|
+
type BaseShare = {
|
|
37
|
+
/**
|
|
38
|
+
* Address ID is set only when user is member of the share.
|
|
39
|
+
* Owner or invitee of share with higher access in the tree
|
|
40
|
+
* might not have this field set.
|
|
41
|
+
*/
|
|
42
|
+
addressId?: string;
|
|
43
|
+
creationTime?: Date;
|
|
44
|
+
type: ShareType;
|
|
45
|
+
} & VolumeShareNodeIDs;
|
|
46
|
+
|
|
47
|
+
export enum ShareType {
|
|
48
|
+
Main = 'main',
|
|
49
|
+
Standard = 'standard',
|
|
50
|
+
Device = 'device',
|
|
51
|
+
Photo = 'photo',
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
interface BaseRootShare extends BaseShare {
|
|
55
|
+
/**
|
|
56
|
+
* Address ID is always available for root shares, in contrast
|
|
57
|
+
* to other standard shares that might not have it. See the comment
|
|
58
|
+
* for BaseShare.
|
|
59
|
+
*/
|
|
60
|
+
addressId: string;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Interface used only internaly in the shares module.
|
|
65
|
+
*
|
|
66
|
+
* Outside of the module, the decrypted share interface should be used.
|
|
67
|
+
*/
|
|
68
|
+
export interface EncryptedShare extends BaseShare {
|
|
69
|
+
creatorEmail: string;
|
|
70
|
+
encryptedCrypto: EncryptedShareCrypto;
|
|
71
|
+
membership?: ShareMembership;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
interface ShareMembership {
|
|
75
|
+
memberUid: string;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* Interface used only internaly in the shares module.
|
|
80
|
+
*
|
|
81
|
+
* Outside of the module, the decrypted share interface should be used.
|
|
82
|
+
*/
|
|
83
|
+
export interface EncryptedRootShare extends BaseRootShare {
|
|
84
|
+
creatorEmail: string;
|
|
85
|
+
encryptedCrypto: EncryptedShareCrypto;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* Interface holding decrypted share metadata.
|
|
90
|
+
*/
|
|
91
|
+
export interface DecryptedRootShare extends BaseRootShare {
|
|
92
|
+
author: Result<string, UnverifiedAuthorError>,
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
export interface EncryptedShareCrypto {
|
|
96
|
+
armoredKey: string;
|
|
97
|
+
armoredPassphrase: string;
|
|
98
|
+
armoredPassphraseSignature: string;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
export interface DecryptedShareKey {
|
|
102
|
+
key: PrivateKey;
|
|
103
|
+
passphraseSessionKey: SessionKey;
|
|
104
|
+
}
|
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
import { ProtonDriveAccount } from "../../interface";
|
|
2
|
+
import { getMockLogger } from "../../tests/logger";
|
|
3
|
+
import { NotFoundAPIError } from "../apiService";
|
|
4
|
+
import { SharesAPIService } from "./apiService";
|
|
5
|
+
import { SharesCache } from "./cache";
|
|
6
|
+
import { SharesCryptoCache } from "./cryptoCache";
|
|
7
|
+
import { SharesCryptoService } from "./cryptoService";
|
|
8
|
+
import { VolumeShareNodeIDs } from "./interface";
|
|
9
|
+
import { SharesManager } from "./manager";
|
|
10
|
+
|
|
11
|
+
describe("SharesManager", () => {
|
|
12
|
+
let apiService: SharesAPIService;
|
|
13
|
+
let cache: SharesCache;
|
|
14
|
+
let cryptoCache: SharesCryptoCache;
|
|
15
|
+
let cryptoService: SharesCryptoService;
|
|
16
|
+
let account: ProtonDriveAccount;
|
|
17
|
+
|
|
18
|
+
let manager: SharesManager;
|
|
19
|
+
|
|
20
|
+
beforeEach(() => {
|
|
21
|
+
// @ts-expect-error No need to implement all methods for mocking
|
|
22
|
+
apiService = {
|
|
23
|
+
getMyFiles: jest.fn(),
|
|
24
|
+
getRootShare: jest.fn(),
|
|
25
|
+
getShare: jest.fn(),
|
|
26
|
+
getVolume: jest.fn(),
|
|
27
|
+
createVolume: jest.fn(),
|
|
28
|
+
}
|
|
29
|
+
// @ts-expect-error No need to implement all methods for mocking
|
|
30
|
+
cache = {
|
|
31
|
+
setVolume: jest.fn(),
|
|
32
|
+
getVolume: jest.fn(),
|
|
33
|
+
}
|
|
34
|
+
// @ts-expect-error No need to implement all methods for mocking
|
|
35
|
+
cryptoCache = {
|
|
36
|
+
setShareKey: jest.fn(),
|
|
37
|
+
getShareKey: jest.fn(),
|
|
38
|
+
}
|
|
39
|
+
// @ts-expect-error No need to implement all methods for mocking
|
|
40
|
+
cryptoService = {
|
|
41
|
+
generateVolumeBootstrap: jest.fn(),
|
|
42
|
+
decryptRootShare: jest.fn(),
|
|
43
|
+
}
|
|
44
|
+
// @ts-expect-error No need to implement all methods for mocking
|
|
45
|
+
account = {
|
|
46
|
+
getOwnPrimaryAddress: jest.fn(),
|
|
47
|
+
getOwnAddress: jest.fn(),
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
manager = new SharesManager(getMockLogger(), apiService, cache, cryptoCache, cryptoService, account);
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
describe("getMyFilesIDs", () => {
|
|
54
|
+
const myFilesShare = {
|
|
55
|
+
shareId: "myFilesShareId",
|
|
56
|
+
volumeId: "myFilesVolumeId",
|
|
57
|
+
rootNodeId: "myFilesRootNodeId",
|
|
58
|
+
};
|
|
59
|
+
|
|
60
|
+
it("should load My files IDs once", async () => {
|
|
61
|
+
const encryptedShare = {
|
|
62
|
+
share: myFilesShare,
|
|
63
|
+
creatorEmail: "email",
|
|
64
|
+
};
|
|
65
|
+
const key = {
|
|
66
|
+
key: "privateKey",
|
|
67
|
+
sessionKey: "sessionKey",
|
|
68
|
+
};
|
|
69
|
+
|
|
70
|
+
apiService.getMyFiles = jest.fn().mockResolvedValue(encryptedShare);
|
|
71
|
+
cryptoService.decryptRootShare = jest.fn().mockResolvedValue({ share: myFilesShare, key });
|
|
72
|
+
|
|
73
|
+
// Calling twice to check if it loads only once.
|
|
74
|
+
await manager.getMyFilesIDs();
|
|
75
|
+
const result = await manager.getMyFilesIDs();
|
|
76
|
+
|
|
77
|
+
expect(result).toStrictEqual(myFilesShare);
|
|
78
|
+
expect(apiService.getMyFiles).toHaveBeenCalledTimes(1);
|
|
79
|
+
expect(cryptoService.decryptRootShare).toHaveBeenCalledTimes(1);
|
|
80
|
+
expect(cryptoCache.setShareKey).toHaveBeenCalledWith(myFilesShare.shareId, key);
|
|
81
|
+
expect(cache.setVolume).toHaveBeenCalledWith({
|
|
82
|
+
...myFilesShare,
|
|
83
|
+
creatorEmail: encryptedShare.creatorEmail,
|
|
84
|
+
});
|
|
85
|
+
expect(apiService.createVolume).not.toHaveBeenCalled();
|
|
86
|
+
});
|
|
87
|
+
|
|
88
|
+
it("should create volume when My files section doesn't exist", async () => {
|
|
89
|
+
apiService.getMyFiles = jest.fn().mockRejectedValue(new NotFoundAPIError("no active volume", 0));
|
|
90
|
+
account.getOwnPrimaryAddress = jest.fn().mockResolvedValue({ primaryKeyIndex: 0, keys: [{ key: "addressKey" }] });
|
|
91
|
+
cryptoService.generateVolumeBootstrap = jest.fn().mockResolvedValue({
|
|
92
|
+
shareKey: {
|
|
93
|
+
encrypted: "encrypted share key",
|
|
94
|
+
decrypted: "decrypted share key",
|
|
95
|
+
},
|
|
96
|
+
rootNode: {
|
|
97
|
+
key: {
|
|
98
|
+
encrypted: "encrypted root key",
|
|
99
|
+
},
|
|
100
|
+
}
|
|
101
|
+
});
|
|
102
|
+
apiService.createVolume = jest.fn().mockResolvedValue(myFilesShare);
|
|
103
|
+
|
|
104
|
+
const result = await manager.getMyFilesIDs();
|
|
105
|
+
|
|
106
|
+
expect(result).toStrictEqual(myFilesShare);
|
|
107
|
+
expect(cryptoService.decryptRootShare).not.toHaveBeenCalled();
|
|
108
|
+
expect(cryptoCache.setShareKey).toHaveBeenCalledWith("myFilesShareId", "decrypted share key");
|
|
109
|
+
});
|
|
110
|
+
|
|
111
|
+
it("should throw on unknown error", async () => {
|
|
112
|
+
apiService.getMyFiles = jest.fn().mockRejectedValue(new Error("Some error"));
|
|
113
|
+
|
|
114
|
+
await expect(manager.getMyFilesIDs()).rejects.toThrow("Some error");
|
|
115
|
+
expect(cryptoService.decryptRootShare).not.toHaveBeenCalled();
|
|
116
|
+
expect(apiService.createVolume).not.toHaveBeenCalled();
|
|
117
|
+
});
|
|
118
|
+
});
|
|
119
|
+
|
|
120
|
+
describe("getSharePrivateKey", () => {
|
|
121
|
+
it("should return cached private key", async () => {
|
|
122
|
+
cryptoCache.getShareKey = jest.fn().mockResolvedValue({ key: "cachedPrivateKey" });
|
|
123
|
+
|
|
124
|
+
const result = await manager.getSharePrivateKey("shareId");
|
|
125
|
+
|
|
126
|
+
expect(result).toBe("cachedPrivateKey");
|
|
127
|
+
});
|
|
128
|
+
|
|
129
|
+
it("should load private key if not in cache", async () => {
|
|
130
|
+
cryptoCache.getShareKey = jest.fn().mockRejectedValue(new Error('not found'));
|
|
131
|
+
apiService.getRootShare = jest.fn().mockResolvedValue({ shareId: "shareId" });
|
|
132
|
+
cryptoService.decryptRootShare = jest.fn().mockResolvedValue({ key: { key: "privateKey" } });
|
|
133
|
+
|
|
134
|
+
const result = await manager.getSharePrivateKey("shareId");
|
|
135
|
+
|
|
136
|
+
expect(result).toBe("privateKey");
|
|
137
|
+
expect(cryptoCache.setShareKey).toHaveBeenCalledWith("shareId", { key: "privateKey" });
|
|
138
|
+
});
|
|
139
|
+
});
|
|
140
|
+
|
|
141
|
+
describe("getMyFilesShareMemberEmailKey", () => {
|
|
142
|
+
it("should return cached volume email key", async () => {
|
|
143
|
+
jest.spyOn(manager, 'getMyFilesIDs').mockResolvedValue({ volumeId: "volumeId" } as VolumeShareNodeIDs);
|
|
144
|
+
cache.getVolume = jest.fn().mockResolvedValue({ addressId: "addressId" });
|
|
145
|
+
account.getOwnAddress = jest.fn().mockResolvedValue({ email: "email", primaryKeyIndex: 0, keys: [{ key: "addressKey" }] });
|
|
146
|
+
|
|
147
|
+
const result = await manager.getMyFilesShareMemberEmailKey();
|
|
148
|
+
|
|
149
|
+
expect(result).toEqual({
|
|
150
|
+
addressId: "addressId",
|
|
151
|
+
email: "email",
|
|
152
|
+
addressKey: "addressKey",
|
|
153
|
+
});
|
|
154
|
+
});
|
|
155
|
+
|
|
156
|
+
it("should load volume email key if not in cache", async () => {
|
|
157
|
+
jest.spyOn(manager, 'getMyFilesIDs').mockResolvedValue({ volumeId: "volumeId" } as VolumeShareNodeIDs);
|
|
158
|
+
const share = {
|
|
159
|
+
volumeId: "volumeId",
|
|
160
|
+
shareId: "shareId",
|
|
161
|
+
rootNodeId: "rootNodeId",
|
|
162
|
+
creatorEmail: "email",
|
|
163
|
+
addressId: "addressId",
|
|
164
|
+
}
|
|
165
|
+
cache.getVolume = jest.fn().mockRejectedValue(new Error('not found'));
|
|
166
|
+
apiService.getVolume = jest.fn().mockResolvedValue({ shareId: "shareId" });
|
|
167
|
+
apiService.getRootShare = jest.fn().mockResolvedValue(share);
|
|
168
|
+
account.getOwnAddress = jest.fn().mockResolvedValue({ email: "email", primaryKeyIndex: 0, keys: [{ key: "addressKey" }] });
|
|
169
|
+
|
|
170
|
+
const result = await manager.getMyFilesShareMemberEmailKey();
|
|
171
|
+
|
|
172
|
+
expect(result).toEqual({
|
|
173
|
+
addressId: "addressId",
|
|
174
|
+
email: "email",
|
|
175
|
+
addressKey: "addressKey",
|
|
176
|
+
});
|
|
177
|
+
expect(cache.setVolume).toHaveBeenCalledWith(share);
|
|
178
|
+
});
|
|
179
|
+
});
|
|
180
|
+
|
|
181
|
+
describe("getContextShareMemberEmailKey", () => {
|
|
182
|
+
it("should load share email key only once", async () => {
|
|
183
|
+
const share = {
|
|
184
|
+
volumeId: "volumeId",
|
|
185
|
+
shareId: "shareId",
|
|
186
|
+
rootNodeId: "rootNodeId",
|
|
187
|
+
creatorEmail: "creatorEmail",
|
|
188
|
+
addressId: "addressId",
|
|
189
|
+
}
|
|
190
|
+
apiService.getRootShare = jest.fn().mockResolvedValue(share);
|
|
191
|
+
account.getOwnAddress = jest.fn().mockResolvedValue({ email: "email", primaryKeyIndex: 0, keys: [{ key: "addressKey" }] });
|
|
192
|
+
|
|
193
|
+
const result = await manager.getContextShareMemberEmailKey("shareId");
|
|
194
|
+
|
|
195
|
+
expect(result).toEqual({
|
|
196
|
+
addressId: "addressId",
|
|
197
|
+
email: "email",
|
|
198
|
+
addressKey: "addressKey",
|
|
199
|
+
});
|
|
200
|
+
expect(apiService.getRootShare).toHaveBeenCalledTimes(1);
|
|
201
|
+
expect(account.getOwnAddress).toHaveBeenCalledTimes(1);
|
|
202
|
+
|
|
203
|
+
const result2 = await manager.getContextShareMemberEmailKey("shareId");
|
|
204
|
+
|
|
205
|
+
expect(result2).toEqual(result);
|
|
206
|
+
expect(apiService.getRootShare).toHaveBeenCalledTimes(1);
|
|
207
|
+
expect(account.getOwnAddress).toHaveBeenCalledTimes(2);
|
|
208
|
+
});
|
|
209
|
+
});
|
|
210
|
+
});
|
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
import { Logger, MetricContext, ProtonDriveAccount } from "../../interface";
|
|
2
|
+
import { PrivateKey } from "../../crypto";
|
|
3
|
+
import { NotFoundAPIError } from "../apiService";
|
|
4
|
+
import { SharesAPIService } from "./apiService";
|
|
5
|
+
import { SharesCache } from "./cache";
|
|
6
|
+
import { SharesCryptoCache } from "./cryptoCache";
|
|
7
|
+
import { SharesCryptoService } from "./cryptoService";
|
|
8
|
+
import { VolumeShareNodeIDs, EncryptedShare, EncryptedRootShare } from "./interface";
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Provides high-level actions for managing shares.
|
|
12
|
+
*
|
|
13
|
+
* The manager is responsible for handling shares metadata, including
|
|
14
|
+
* API communication, encryption, decryption, and caching.
|
|
15
|
+
*
|
|
16
|
+
* This module uses other modules providing low-level operations, such
|
|
17
|
+
* as API service, cache, crypto service, etc.
|
|
18
|
+
*/
|
|
19
|
+
export class SharesManager {
|
|
20
|
+
// Cache for My files IDs.
|
|
21
|
+
// Those IDs are required very often, so it is better to keep them in memory.
|
|
22
|
+
// The IDs are not cached in the cache module, as we want to always fetch
|
|
23
|
+
// them from the API, and not from the this.cache.
|
|
24
|
+
private myFilesIds?: VolumeShareNodeIDs;
|
|
25
|
+
|
|
26
|
+
private rootShares: Map<string, EncryptedRootShare> = new Map();
|
|
27
|
+
|
|
28
|
+
constructor(
|
|
29
|
+
private logger: Logger,
|
|
30
|
+
private apiService: SharesAPIService,
|
|
31
|
+
private cache: SharesCache,
|
|
32
|
+
private cryptoCache: SharesCryptoCache,
|
|
33
|
+
private cryptoService: SharesCryptoService,
|
|
34
|
+
private account: ProtonDriveAccount,
|
|
35
|
+
) {
|
|
36
|
+
this.logger = logger;
|
|
37
|
+
this.apiService = apiService;
|
|
38
|
+
this.cache = cache;
|
|
39
|
+
this.cryptoCache = cryptoCache;
|
|
40
|
+
this.cryptoService = cryptoService;
|
|
41
|
+
this.account = account;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* It returns the IDs of the My files section.
|
|
46
|
+
*
|
|
47
|
+
* If the default volume or My files section doesn't exist, it creates it.
|
|
48
|
+
*/
|
|
49
|
+
async getMyFilesIDs(): Promise<VolumeShareNodeIDs> {
|
|
50
|
+
if (this.myFilesIds) {
|
|
51
|
+
return this.myFilesIds;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
try {
|
|
55
|
+
const encryptedShare = await this.apiService.getMyFiles();
|
|
56
|
+
|
|
57
|
+
// Once any place needs IDs for My files, it will most likely
|
|
58
|
+
// need also the keys for decrypting the tree. It is better to
|
|
59
|
+
// decrypt the share here right away.
|
|
60
|
+
const { share: myFilesShare, key } = await this.cryptoService.decryptRootShare(encryptedShare);
|
|
61
|
+
await this.cryptoCache.setShareKey(myFilesShare.shareId, key);
|
|
62
|
+
await this.cache.setVolume({
|
|
63
|
+
volumeId: myFilesShare.volumeId,
|
|
64
|
+
shareId: myFilesShare.shareId,
|
|
65
|
+
rootNodeId: myFilesShare.rootNodeId,
|
|
66
|
+
creatorEmail: encryptedShare.creatorEmail,
|
|
67
|
+
addressId: encryptedShare.addressId,
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
this.myFilesIds = {
|
|
71
|
+
volumeId: myFilesShare.volumeId,
|
|
72
|
+
shareId: myFilesShare.shareId,
|
|
73
|
+
rootNodeId: myFilesShare.rootNodeId,
|
|
74
|
+
};
|
|
75
|
+
return this.myFilesIds;
|
|
76
|
+
} catch (error: unknown) {
|
|
77
|
+
if (error instanceof NotFoundAPIError) {
|
|
78
|
+
this.logger.warn('Active volume not found, creating a new one');
|
|
79
|
+
return this.createVolume();
|
|
80
|
+
}
|
|
81
|
+
this.logger.error('Failed to get active volume', error);
|
|
82
|
+
throw error;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* Creates new default volume for the user.
|
|
88
|
+
*
|
|
89
|
+
* It generates the volume bootstrap, creates the volume on the server,
|
|
90
|
+
* and caches the volume metadata.
|
|
91
|
+
*
|
|
92
|
+
* User can have only one default volume.
|
|
93
|
+
*
|
|
94
|
+
* @throws If the volume cannot be created (e.g., one already exists).
|
|
95
|
+
*/
|
|
96
|
+
private async createVolume(): Promise<VolumeShareNodeIDs> {
|
|
97
|
+
const address = await this.account.getOwnPrimaryAddress();
|
|
98
|
+
const primaryKey = address.keys[address.primaryKeyIndex];
|
|
99
|
+
const bootstrap = await this.cryptoService.generateVolumeBootstrap(primaryKey.key);
|
|
100
|
+
const myFilesIds = await this.apiService.createVolume(
|
|
101
|
+
{
|
|
102
|
+
addressId: address.addressId,
|
|
103
|
+
addressKeyId: primaryKey.id,
|
|
104
|
+
...bootstrap.shareKey.encrypted,
|
|
105
|
+
},
|
|
106
|
+
{
|
|
107
|
+
...bootstrap.rootNode.key.encrypted,
|
|
108
|
+
encryptedName: bootstrap.rootNode.encryptedName,
|
|
109
|
+
armoredHashKey: bootstrap.rootNode.armoredHashKey,
|
|
110
|
+
},
|
|
111
|
+
);
|
|
112
|
+
await this.cryptoCache.setShareKey(myFilesIds.shareId, bootstrap.shareKey.decrypted);
|
|
113
|
+
return myFilesIds;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
/**
|
|
117
|
+
* It is a high-level action that retrieves the private key for a share.
|
|
118
|
+
* If prefers to use the cache, but if the key is not there, it fetches
|
|
119
|
+
* the share from the API, decrypts it, and caches it.
|
|
120
|
+
*
|
|
121
|
+
* @param shareId - The ID of the share.
|
|
122
|
+
* @returns The private key for the share.
|
|
123
|
+
* @throws If the share is not found or cannot be decrypted, or cached.
|
|
124
|
+
*/
|
|
125
|
+
async getSharePrivateKey(shareId: string): Promise<PrivateKey> {
|
|
126
|
+
try {
|
|
127
|
+
const { key } = await this.cryptoCache.getShareKey(shareId);
|
|
128
|
+
return key;
|
|
129
|
+
} catch { }
|
|
130
|
+
|
|
131
|
+
const encryptedShare = await this.apiService.getRootShare(shareId);
|
|
132
|
+
const { key } = await this.cryptoService.decryptRootShare(encryptedShare);
|
|
133
|
+
await this.cryptoCache.setShareKey(shareId, key);
|
|
134
|
+
return key.key;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
async getMyFilesShareMemberEmailKey(): Promise<{
|
|
138
|
+
email: string,
|
|
139
|
+
addressId: string,
|
|
140
|
+
addressKey: PrivateKey,
|
|
141
|
+
addressKeyId: string,
|
|
142
|
+
}> {
|
|
143
|
+
const { volumeId } = await this.getMyFilesIDs();
|
|
144
|
+
|
|
145
|
+
try {
|
|
146
|
+
const { addressId } = await this.cache.getVolume(volumeId);
|
|
147
|
+
const address = await this.account.getOwnAddress(addressId);
|
|
148
|
+
return {
|
|
149
|
+
email: address.email,
|
|
150
|
+
addressId,
|
|
151
|
+
addressKey: address.keys[address.primaryKeyIndex].key,
|
|
152
|
+
addressKeyId: address.keys[address.primaryKeyIndex].id,
|
|
153
|
+
};
|
|
154
|
+
} catch { }
|
|
155
|
+
|
|
156
|
+
const { shareId } = await this.apiService.getVolume(volumeId);
|
|
157
|
+
const share = await this.apiService.getRootShare(shareId);
|
|
158
|
+
|
|
159
|
+
await this.cache.setVolume({
|
|
160
|
+
volumeId: share.volumeId,
|
|
161
|
+
shareId: share.shareId,
|
|
162
|
+
rootNodeId: share.rootNodeId,
|
|
163
|
+
creatorEmail: share.creatorEmail,
|
|
164
|
+
addressId: share.addressId,
|
|
165
|
+
});
|
|
166
|
+
|
|
167
|
+
const address = await this.account.getOwnAddress(share.addressId);
|
|
168
|
+
return {
|
|
169
|
+
email: address.email,
|
|
170
|
+
addressId: share.addressId,
|
|
171
|
+
addressKey: address.keys[address.primaryKeyIndex].key,
|
|
172
|
+
addressKeyId: address.keys[address.primaryKeyIndex].id,
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
async getContextShareMemberEmailKey(shareId: string): Promise<{
|
|
177
|
+
email: string,
|
|
178
|
+
addressId: string,
|
|
179
|
+
addressKey: PrivateKey,
|
|
180
|
+
addressKeyId: string,
|
|
181
|
+
}> {
|
|
182
|
+
let encryptedShare = this.rootShares.get(shareId);
|
|
183
|
+
if (!encryptedShare) {
|
|
184
|
+
encryptedShare = await this.apiService.getRootShare(shareId);
|
|
185
|
+
this.rootShares.set(shareId, encryptedShare);
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
const address = await this.account.getOwnAddress(encryptedShare.addressId);
|
|
189
|
+
|
|
190
|
+
return {
|
|
191
|
+
email: address.email,
|
|
192
|
+
addressId: encryptedShare.addressId,
|
|
193
|
+
addressKey: address.keys[address.primaryKeyIndex].key,
|
|
194
|
+
addressKeyId: address.keys[address.primaryKeyIndex].id,
|
|
195
|
+
};
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
async getVolumeMetricContext(volumeId: string): Promise<MetricContext> {
|
|
199
|
+
const { volumeId: myVolumeId } = await this.getMyFilesIDs();
|
|
200
|
+
|
|
201
|
+
// SDK doesn't support public sharing yet, also public sharing
|
|
202
|
+
// doesn't use a volume but shareURL, thus we can simplify and
|
|
203
|
+
// ignore this case for now.
|
|
204
|
+
if (volumeId === myVolumeId) {
|
|
205
|
+
return MetricContext.OwnVolume;
|
|
206
|
+
}
|
|
207
|
+
return MetricContext.Shared;
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
async loadEncryptedShare(shareId: string): Promise<EncryptedShare> {
|
|
211
|
+
return this.apiService.getShare(shareId);
|
|
212
|
+
}
|
|
213
|
+
}
|