@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,383 @@
|
|
|
1
|
+
import { getMockLogger } from "../../tests/logger";
|
|
2
|
+
import { DriveEventsService, DriveEvent, DriveEventType } from "../events";
|
|
3
|
+
import { NodesEvents, updateCacheByEvent, deleteFromCacheByEvent, notifyListenersByEvent } from "./events";
|
|
4
|
+
import { DecryptedNode } from "./interface";
|
|
5
|
+
import { NodesCache } from "./cache";
|
|
6
|
+
import { NodesAccess } from "./nodesAccess";
|
|
7
|
+
|
|
8
|
+
describe("updateCacheByEvent", () => {
|
|
9
|
+
const logger = getMockLogger();
|
|
10
|
+
|
|
11
|
+
let cache: NodesCache;
|
|
12
|
+
|
|
13
|
+
beforeEach(() => {
|
|
14
|
+
jest.clearAllMocks();
|
|
15
|
+
|
|
16
|
+
// @ts-expect-error No need to implement all methods for mocking
|
|
17
|
+
cache = {
|
|
18
|
+
getNode: jest.fn(() => Promise.resolve({
|
|
19
|
+
uid: '123',
|
|
20
|
+
parentUid: 'parentUid',
|
|
21
|
+
name: { ok: true, value: 'name' },
|
|
22
|
+
} as DecryptedNode)),
|
|
23
|
+
setNode: jest.fn(),
|
|
24
|
+
removeNodes: jest.fn(),
|
|
25
|
+
resetFolderChildrenLoaded: jest.fn(),
|
|
26
|
+
};
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
describe('NodeCreated event', () => {
|
|
30
|
+
const event: DriveEvent = {
|
|
31
|
+
type: DriveEventType.NodeCreated,
|
|
32
|
+
nodeUid: "nodeUid",
|
|
33
|
+
parentNodeUid: "parentUid",
|
|
34
|
+
isTrashed: false,
|
|
35
|
+
isShared: false,
|
|
36
|
+
isOwnVolume: true,
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
it("should not update cache by node create event", async () => {
|
|
40
|
+
await updateCacheByEvent(logger, event, cache);
|
|
41
|
+
|
|
42
|
+
expect(cache.getNode).toHaveBeenCalledTimes(0);
|
|
43
|
+
expect(cache.setNode).toHaveBeenCalledTimes(0);
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
it("should reset parent loaded state", async () => {
|
|
47
|
+
await updateCacheByEvent(logger, event, cache);
|
|
48
|
+
|
|
49
|
+
expect(cache.resetFolderChildrenLoaded).toHaveBeenCalledWith('parentUid');
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
it("should skip reset parent loaded state if parent missing", async () => {
|
|
53
|
+
await updateCacheByEvent(logger, { ...event, parentNodeUid: undefined }, cache);
|
|
54
|
+
|
|
55
|
+
expect(cache.resetFolderChildrenLoaded).not.toHaveBeenCalled();
|
|
56
|
+
});
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
describe('NodeUpdated event', () => {
|
|
60
|
+
const event: DriveEvent = {
|
|
61
|
+
type: DriveEventType.NodeUpdated,
|
|
62
|
+
nodeUid: "nodeUid",
|
|
63
|
+
parentNodeUid: "parentUid",
|
|
64
|
+
isTrashed: false,
|
|
65
|
+
isShared: false,
|
|
66
|
+
isOwnVolume: true,
|
|
67
|
+
};
|
|
68
|
+
|
|
69
|
+
it("should update cache if present in cache", async () => {
|
|
70
|
+
await updateCacheByEvent(logger, event, cache);
|
|
71
|
+
|
|
72
|
+
expect(cache.getNode).toHaveBeenCalledTimes(1);
|
|
73
|
+
expect(cache.setNode).toHaveBeenCalledTimes(1);
|
|
74
|
+
expect(cache.setNode).toHaveBeenCalledWith(expect.objectContaining({ uid: '123', isStale: true, parentUid: "parentUid" }));
|
|
75
|
+
});
|
|
76
|
+
|
|
77
|
+
it("should skip if missing in cache", async () => {
|
|
78
|
+
cache.getNode = jest.fn(() => Promise.reject(new Error('Missing in the cache')));
|
|
79
|
+
|
|
80
|
+
await updateCacheByEvent(logger, event, cache);
|
|
81
|
+
|
|
82
|
+
expect(cache.getNode).toHaveBeenCalledTimes(1);
|
|
83
|
+
expect(cache.setNode).toHaveBeenCalledTimes(0);
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
it("should remove from cache if not possible to set", async () => {
|
|
87
|
+
cache.setNode = jest.fn(() => Promise.reject(new Error('Cannot set node')));
|
|
88
|
+
|
|
89
|
+
await updateCacheByEvent(logger, event, cache);
|
|
90
|
+
|
|
91
|
+
expect(cache.getNode).toHaveBeenCalledTimes(1);
|
|
92
|
+
expect(cache.removeNodes).toHaveBeenCalledTimes(1);
|
|
93
|
+
});
|
|
94
|
+
|
|
95
|
+
it("should throw if remove fails", async () => {
|
|
96
|
+
cache.setNode = jest.fn(() => Promise.reject(new Error('Cannot set node')));
|
|
97
|
+
cache.removeNodes = jest.fn(() => Promise.reject(new Error('Cannot remove node')));
|
|
98
|
+
|
|
99
|
+
await expect(updateCacheByEvent(logger, event, cache)).rejects.toThrow('Cannot set node');
|
|
100
|
+
});
|
|
101
|
+
});
|
|
102
|
+
|
|
103
|
+
describe('NodeDeleted event', () => {
|
|
104
|
+
const event: DriveEvent = {
|
|
105
|
+
type: DriveEventType.NodeDeleted,
|
|
106
|
+
nodeUid: "nodeUid",
|
|
107
|
+
parentNodeUid: "parentUid",
|
|
108
|
+
isOwnVolume: true,
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
it("should remove node from cache", async () => {
|
|
112
|
+
await deleteFromCacheByEvent(logger, event, cache);
|
|
113
|
+
|
|
114
|
+
expect(cache.removeNodes).toHaveBeenCalledTimes(1);
|
|
115
|
+
expect(cache.removeNodes).toHaveBeenCalledWith([event.nodeUid]);
|
|
116
|
+
});
|
|
117
|
+
});
|
|
118
|
+
});
|
|
119
|
+
|
|
120
|
+
describe("notifyListenersByEvent", () => {
|
|
121
|
+
const logger = getMockLogger();
|
|
122
|
+
|
|
123
|
+
let cache: NodesCache;
|
|
124
|
+
let nodesAccess: NodesAccess;
|
|
125
|
+
|
|
126
|
+
beforeEach(() => {
|
|
127
|
+
jest.clearAllMocks();
|
|
128
|
+
|
|
129
|
+
// @ts-expect-error No need to implement all methods for mocking
|
|
130
|
+
cache = {
|
|
131
|
+
getNode: jest.fn(() => Promise.resolve({
|
|
132
|
+
uid: '123',
|
|
133
|
+
parentUid: 'parentUid',
|
|
134
|
+
name: { ok: true, value: 'name' },
|
|
135
|
+
} as DecryptedNode)),
|
|
136
|
+
};
|
|
137
|
+
// @ts-expect-error No need to implement all methods for mocking
|
|
138
|
+
nodesAccess = {
|
|
139
|
+
getNode: jest.fn(() => Promise.resolve({ uid: 'nodeUid', name: { ok: true, value: 'name' } } as DecryptedNode)),
|
|
140
|
+
};
|
|
141
|
+
});
|
|
142
|
+
|
|
143
|
+
describe('update event', () => {
|
|
144
|
+
it("should notify listeners by parentNodeUid when there is update", async () => {
|
|
145
|
+
const event: DriveEvent = {
|
|
146
|
+
type: DriveEventType.NodeUpdated,
|
|
147
|
+
nodeUid: "nodeUid",
|
|
148
|
+
parentNodeUid: "parentUid",
|
|
149
|
+
isTrashed: false,
|
|
150
|
+
isShared: false,
|
|
151
|
+
isOwnVolume: true,
|
|
152
|
+
};
|
|
153
|
+
const listener = jest.fn();
|
|
154
|
+
|
|
155
|
+
await notifyListenersByEvent(logger, event, [{ condition: ({ parentNodeUid }) => parentNodeUid === 'parentUid', callback: listener }], cache, nodesAccess);
|
|
156
|
+
|
|
157
|
+
expect(listener).toHaveBeenCalledTimes(1);
|
|
158
|
+
expect(listener).toHaveBeenCalledWith(expect.objectContaining({ type: 'update', uid: 'nodeUid' }));
|
|
159
|
+
expect(nodesAccess.getNode).toHaveBeenCalledTimes(1);
|
|
160
|
+
expect(cache.getNode).toHaveBeenCalledTimes(0);
|
|
161
|
+
});
|
|
162
|
+
|
|
163
|
+
it("should notify listeners by parentNodeUid when it is moved to another parent", async () => {
|
|
164
|
+
const event: DriveEvent = {
|
|
165
|
+
type: DriveEventType.NodeUpdated,
|
|
166
|
+
nodeUid: "nodeUid",
|
|
167
|
+
parentNodeUid: "newParentUid",
|
|
168
|
+
isTrashed: false,
|
|
169
|
+
isShared: false,
|
|
170
|
+
isOwnVolume: true,
|
|
171
|
+
};
|
|
172
|
+
const listener = jest.fn();
|
|
173
|
+
|
|
174
|
+
await notifyListenersByEvent(logger, event, [{ condition: ({ parentNodeUid }) => parentNodeUid === 'parentUid', callback: listener }], cache, nodesAccess);
|
|
175
|
+
|
|
176
|
+
expect(listener).toHaveBeenCalledTimes(1);
|
|
177
|
+
expect(listener).toHaveBeenCalledWith(expect.objectContaining({ type: 'remove', uid: 'nodeUid' }));
|
|
178
|
+
expect(nodesAccess.getNode).toHaveBeenCalledTimes(0);
|
|
179
|
+
expect(cache.getNode).toHaveBeenCalledTimes(1);
|
|
180
|
+
});
|
|
181
|
+
|
|
182
|
+
it("should notify listeners by isTrashed when there is update", async () => {
|
|
183
|
+
const event: DriveEvent = {
|
|
184
|
+
type: DriveEventType.NodeUpdated,
|
|
185
|
+
nodeUid: "nodeUid",
|
|
186
|
+
parentNodeUid: "parentUid",
|
|
187
|
+
isTrashed: true,
|
|
188
|
+
isShared: false,
|
|
189
|
+
isOwnVolume: true,
|
|
190
|
+
};
|
|
191
|
+
const listener = jest.fn();
|
|
192
|
+
|
|
193
|
+
await notifyListenersByEvent(logger, event, [{ condition: ({ isTrashed }) => !!isTrashed, callback: listener }], cache, nodesAccess);
|
|
194
|
+
|
|
195
|
+
expect(listener).toHaveBeenCalledTimes(1);
|
|
196
|
+
expect(listener).toHaveBeenCalledWith(expect.objectContaining({ type: 'update', uid: 'nodeUid' }));
|
|
197
|
+
expect(nodesAccess.getNode).toHaveBeenCalledTimes(1);
|
|
198
|
+
expect(cache.getNode).toHaveBeenCalledTimes(0);
|
|
199
|
+
});
|
|
200
|
+
|
|
201
|
+
it("should notify listeners by isTrashed when it is moved out of trash", async () => {
|
|
202
|
+
cache.getNode = jest.fn(() => Promise.resolve({
|
|
203
|
+
uid: '123',
|
|
204
|
+
parentUid: 'parentUid',
|
|
205
|
+
name: { ok: true, value: 'name' },
|
|
206
|
+
trashTime: new Date(),
|
|
207
|
+
} as DecryptedNode));
|
|
208
|
+
const event: DriveEvent = {
|
|
209
|
+
type: DriveEventType.NodeUpdated,
|
|
210
|
+
nodeUid: "nodeUid",
|
|
211
|
+
parentNodeUid: "parentUid",
|
|
212
|
+
isTrashed: false,
|
|
213
|
+
isShared: false,
|
|
214
|
+
isOwnVolume: true,
|
|
215
|
+
};
|
|
216
|
+
const listener = jest.fn();
|
|
217
|
+
|
|
218
|
+
await notifyListenersByEvent(logger, event, [{ condition: ({ isTrashed }) => !!isTrashed, callback: listener }], cache, nodesAccess);
|
|
219
|
+
|
|
220
|
+
expect(listener).toHaveBeenCalledTimes(1);
|
|
221
|
+
expect(listener).toHaveBeenCalledWith(expect.objectContaining({ type: 'remove', uid: 'nodeUid' }));
|
|
222
|
+
expect(nodesAccess.getNode).toHaveBeenCalledTimes(0);
|
|
223
|
+
expect(cache.getNode).toHaveBeenCalledTimes(1);
|
|
224
|
+
});
|
|
225
|
+
|
|
226
|
+
it("should not notify listeners if neither condition match", async () => {
|
|
227
|
+
const event: DriveEvent = {
|
|
228
|
+
type: DriveEventType.NodeUpdated,
|
|
229
|
+
nodeUid: "nodeUid",
|
|
230
|
+
parentNodeUid: "parentUid",
|
|
231
|
+
isTrashed: false,
|
|
232
|
+
isShared: false,
|
|
233
|
+
isOwnVolume: true,
|
|
234
|
+
};
|
|
235
|
+
const listener = jest.fn();
|
|
236
|
+
|
|
237
|
+
await notifyListenersByEvent(logger, event, [{ condition: ({ parentNodeUid }) => parentNodeUid === 'lalalala', callback: listener }], cache, nodesAccess);
|
|
238
|
+
|
|
239
|
+
expect(listener).toHaveBeenCalledTimes(0);
|
|
240
|
+
expect(nodesAccess.getNode).toHaveBeenCalledTimes(0);
|
|
241
|
+
});
|
|
242
|
+
});
|
|
243
|
+
|
|
244
|
+
describe('delete event', () => {
|
|
245
|
+
it("should notify listeners by parentNodeUid", async () => {
|
|
246
|
+
const event: DriveEvent = {
|
|
247
|
+
type: DriveEventType.NodeDeleted,
|
|
248
|
+
nodeUid: "nodeUid",
|
|
249
|
+
parentNodeUid: "parentUid",
|
|
250
|
+
isOwnVolume: true,
|
|
251
|
+
};
|
|
252
|
+
const listener = jest.fn();
|
|
253
|
+
|
|
254
|
+
await notifyListenersByEvent(logger, event, [{ condition: ({ parentNodeUid }) => parentNodeUid === 'parentUid', callback: listener }], cache, nodesAccess);
|
|
255
|
+
|
|
256
|
+
expect(listener).toHaveBeenCalledTimes(1);
|
|
257
|
+
expect(listener).toHaveBeenCalledWith({ type: 'remove', uid: 'nodeUid' });
|
|
258
|
+
});
|
|
259
|
+
|
|
260
|
+
it("should notify listeners by isTrashed from cache", async () => {
|
|
261
|
+
cache.getNode = jest.fn(() => Promise.resolve({ uid: 'nodeUid', trashTime: new Date() } as DecryptedNode));
|
|
262
|
+
const event: DriveEvent = {
|
|
263
|
+
type: DriveEventType.NodeDeleted,
|
|
264
|
+
nodeUid: "nodeUid",
|
|
265
|
+
parentNodeUid: "parentUid",
|
|
266
|
+
isOwnVolume: true,
|
|
267
|
+
};
|
|
268
|
+
|
|
269
|
+
const listener = jest.fn();
|
|
270
|
+
|
|
271
|
+
await notifyListenersByEvent(logger, event, [{ condition: ({ isTrashed }) => !!isTrashed, callback: listener }], cache, nodesAccess);
|
|
272
|
+
|
|
273
|
+
expect(listener).toHaveBeenCalledTimes(1);
|
|
274
|
+
expect(listener).toHaveBeenCalledWith({ type: 'remove', uid: 'nodeUid' });
|
|
275
|
+
});
|
|
276
|
+
|
|
277
|
+
it("should not notify listeners if cache is missing node", async () => {
|
|
278
|
+
cache.getNode = jest.fn(() => Promise.reject(new Error('Missing in the cache')));
|
|
279
|
+
const event: DriveEvent = {
|
|
280
|
+
type: DriveEventType.NodeDeleted,
|
|
281
|
+
nodeUid: "nodeUid",
|
|
282
|
+
parentNodeUid: "parentUid",
|
|
283
|
+
isOwnVolume: true,
|
|
284
|
+
};
|
|
285
|
+
const listener = jest.fn();
|
|
286
|
+
|
|
287
|
+
await notifyListenersByEvent(logger, event, [{ condition: ({ isTrashed }) => !!isTrashed, callback: listener }], cache, nodesAccess);
|
|
288
|
+
|
|
289
|
+
expect(listener).toHaveBeenCalledTimes(0);
|
|
290
|
+
});
|
|
291
|
+
|
|
292
|
+
it("should not notify listeners if neither condition match", async () => {
|
|
293
|
+
const event: DriveEvent = {
|
|
294
|
+
type: DriveEventType.NodeDeleted,
|
|
295
|
+
nodeUid: "nodeUid",
|
|
296
|
+
parentNodeUid: "parentUid",
|
|
297
|
+
isOwnVolume: true,
|
|
298
|
+
};
|
|
299
|
+
const listener = jest.fn();
|
|
300
|
+
|
|
301
|
+
await notifyListenersByEvent(logger, event, [{ condition: ({ parentNodeUid }) => parentNodeUid === 'lalalala', callback: listener }], cache, nodesAccess);
|
|
302
|
+
|
|
303
|
+
expect(listener).toHaveBeenCalledTimes(0);
|
|
304
|
+
});
|
|
305
|
+
});
|
|
306
|
+
});
|
|
307
|
+
|
|
308
|
+
describe("NodesEvents integration", () => {
|
|
309
|
+
const logger = getMockLogger();
|
|
310
|
+
|
|
311
|
+
let eventsService: DriveEventsService;
|
|
312
|
+
let eventsServiceCallback;
|
|
313
|
+
let cache: NodesCache;
|
|
314
|
+
let nodesAccess: NodesAccess;
|
|
315
|
+
let listener: jest.Mock;
|
|
316
|
+
let events: NodesEvents;
|
|
317
|
+
|
|
318
|
+
beforeEach(() => {
|
|
319
|
+
jest.clearAllMocks();
|
|
320
|
+
|
|
321
|
+
// @ts-expect-error No need to implement all methods for mocking
|
|
322
|
+
eventsService = {
|
|
323
|
+
addListener: jest.fn((callback) => {
|
|
324
|
+
eventsServiceCallback = callback;
|
|
325
|
+
}),
|
|
326
|
+
}
|
|
327
|
+
// @ts-expect-error No need to implement all methods for mocking
|
|
328
|
+
cache = {
|
|
329
|
+
getNode: jest.fn(() => Promise.resolve({
|
|
330
|
+
uid: 'nodeUid',
|
|
331
|
+
parentUid: 'parentUid',
|
|
332
|
+
name: { ok: true, value: 'name' },
|
|
333
|
+
trashTime: new Date(),
|
|
334
|
+
} as DecryptedNode)),
|
|
335
|
+
setNode: jest.fn(),
|
|
336
|
+
removeNodes: jest.fn(),
|
|
337
|
+
};
|
|
338
|
+
// @ts-expect-error No need to implement all methods for mocking
|
|
339
|
+
nodesAccess = {
|
|
340
|
+
getNode: jest.fn(() => Promise.resolve({
|
|
341
|
+
uid: 'nodeUid',
|
|
342
|
+
parentUid: 'parentUid',
|
|
343
|
+
name: { ok: true, value: 'name' },
|
|
344
|
+
} as DecryptedNode)),
|
|
345
|
+
};
|
|
346
|
+
listener = jest.fn();
|
|
347
|
+
events = new NodesEvents(logger, eventsService, cache, nodesAccess);
|
|
348
|
+
events.subscribeToTrashedNodes(listener);
|
|
349
|
+
});
|
|
350
|
+
|
|
351
|
+
it("should send remove to trash listener when node is restored from trash", async () => {
|
|
352
|
+
await eventsServiceCallback!([{
|
|
353
|
+
type: DriveEventType.NodeUpdated,
|
|
354
|
+
nodeUid: "nodeUid",
|
|
355
|
+
parentNodeUid: "parentUid",
|
|
356
|
+
isTrashed: false,
|
|
357
|
+
isShared: false,
|
|
358
|
+
isOwnVolume: true,
|
|
359
|
+
} as DriveEvent]);
|
|
360
|
+
|
|
361
|
+
expect(listener).toHaveBeenCalledTimes(1);
|
|
362
|
+
expect(listener).toHaveBeenCalledWith({ type: 'remove', uid: 'nodeUid' });
|
|
363
|
+
expect(cache.setNode).toHaveBeenCalledTimes(1);
|
|
364
|
+
expect(cache.setNode).toHaveBeenCalledWith(expect.objectContaining({ uid: 'nodeUid', isStale: true }));
|
|
365
|
+
});
|
|
366
|
+
|
|
367
|
+
it("should send remove to trash listener when node is deleted", async () => {
|
|
368
|
+
await eventsServiceCallback!([{
|
|
369
|
+
type: DriveEventType.NodeDeleted,
|
|
370
|
+
nodeUid: "nodeUid",
|
|
371
|
+
parentNodeUid: "parentUid",
|
|
372
|
+
isTrashed: false,
|
|
373
|
+
isShared: false,
|
|
374
|
+
isOwnVolume: true,
|
|
375
|
+
} as DriveEvent]);
|
|
376
|
+
|
|
377
|
+
expect(listener).toHaveBeenCalledTimes(1);
|
|
378
|
+
expect(listener).toHaveBeenCalledWith({ type: 'remove', uid: 'nodeUid' });
|
|
379
|
+
expect(cache.setNode).toHaveBeenCalledTimes(0);
|
|
380
|
+
expect(cache.removeNodes).toHaveBeenCalledTimes(1);
|
|
381
|
+
expect(cache.removeNodes).toHaveBeenCalledWith(['nodeUid']);
|
|
382
|
+
});
|
|
383
|
+
});
|
|
@@ -0,0 +1,271 @@
|
|
|
1
|
+
import { Logger, NodeEventCallback } from "../../interface";
|
|
2
|
+
import { convertInternalNode } from "../../transformers";
|
|
3
|
+
import { DriveEventsService, DriveEvent, DriveEventType } from "../events";
|
|
4
|
+
import { DecryptedNode } from "./interface";
|
|
5
|
+
import { NodesCache } from "./cache";
|
|
6
|
+
import { NodesAccess } from "./nodesAccess";
|
|
7
|
+
|
|
8
|
+
type Listeners = {
|
|
9
|
+
/**
|
|
10
|
+
* Condition for the listener to be notified about the event.
|
|
11
|
+
*
|
|
12
|
+
* The condition is a function that receives the event information
|
|
13
|
+
* and returns true if the listener should be notified about the
|
|
14
|
+
* event.
|
|
15
|
+
*/
|
|
16
|
+
condition: (nodeEventInfo: NodeEventInfo) => boolean,
|
|
17
|
+
callback: NodeEventCallback,
|
|
18
|
+
}[];
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Minimal information about the event that is used for listener
|
|
22
|
+
* condition. The information is used to determine if the listener
|
|
23
|
+
* should be notified about the event.
|
|
24
|
+
*
|
|
25
|
+
* This must come from the API response to volume events.
|
|
26
|
+
*/
|
|
27
|
+
type NodeEventInfo = {
|
|
28
|
+
parentNodeUid?: string,
|
|
29
|
+
isTrashed?: boolean,
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Provides both event handling and subscription mechanism for user.
|
|
34
|
+
*
|
|
35
|
+
* The service is responsible for handling events regarding node metadata
|
|
36
|
+
* from the DriveEventsService, and for providing a subscription mechanism
|
|
37
|
+
* for the user to listen to updates of specific group of nodes, such as
|
|
38
|
+
* any update for trashed nodes.
|
|
39
|
+
*/
|
|
40
|
+
export class NodesEvents {
|
|
41
|
+
private listeners: Listeners = [];
|
|
42
|
+
|
|
43
|
+
constructor(private logger: Logger, events: DriveEventsService, private cache: NodesCache, private nodesAccess: NodesAccess) {
|
|
44
|
+
this.logger = logger;
|
|
45
|
+
this.cache = cache;
|
|
46
|
+
this.nodesAccess = nodesAccess;
|
|
47
|
+
|
|
48
|
+
events.addListener(async (events, fullRefreshVolumeId) => {
|
|
49
|
+
if (fullRefreshVolumeId) {
|
|
50
|
+
await cache.setNodesStaleFromVolume(fullRefreshVolumeId);
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
for (const event of events) {
|
|
55
|
+
try {
|
|
56
|
+
await updateCacheByEvent(logger, event, cache);
|
|
57
|
+
} catch (error: unknown) {
|
|
58
|
+
logger.error(`Failed to update cache`, error);
|
|
59
|
+
}
|
|
60
|
+
try {
|
|
61
|
+
await notifyListenersByEvent(logger, event, this.listeners, cache, nodesAccess);
|
|
62
|
+
} catch (error: unknown) {
|
|
63
|
+
logger.error(`Failed to notifiy listeners`, error);
|
|
64
|
+
}
|
|
65
|
+
// Delete must come last as it will remove the node from the cache
|
|
66
|
+
// and we need to first know local status of the node to properly
|
|
67
|
+
// notify the listeners.
|
|
68
|
+
await deleteFromCacheByEvent(logger, event, cache);
|
|
69
|
+
}
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
subscribeToTrashedNodes(callback: NodeEventCallback) {
|
|
74
|
+
this.listeners.push({ condition: ({ isTrashed }) => isTrashed || false, callback });
|
|
75
|
+
return () => {
|
|
76
|
+
this.listeners = this.listeners.filter(listener => listener.callback !== callback);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
subscribeToChildren(parentNodeUid: string, callback: NodeEventCallback) {
|
|
81
|
+
this.listeners.push({ condition: ({ parentNodeUid: parent }) => parent === parentNodeUid, callback });
|
|
82
|
+
return () => {
|
|
83
|
+
this.listeners = this.listeners.filter(listener => listener.callback !== callback);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
async nodeCreated(node: DecryptedNode): Promise<void> {
|
|
88
|
+
await this.cache.setNode(node);
|
|
89
|
+
void this.notifyListenersByNode(node, DriveEventType.NodeCreated);
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
async nodeUpdated(partialNode: { uid: string } & Partial<DecryptedNode>): Promise<void> {
|
|
93
|
+
const originalNode = await this.cache.getNode(partialNode.uid);
|
|
94
|
+
const updatedNode = {
|
|
95
|
+
...originalNode,
|
|
96
|
+
...partialNode,
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
await this.cache.setNode(updatedNode);
|
|
100
|
+
void this.notifyListenersByNode(updatedNode, DriveEventType.NodeUpdated);
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
async nodesDeleted(nodeUids: string[]): Promise<void> {
|
|
104
|
+
try {
|
|
105
|
+
for await (const originalNode of this.cache.iterateNodes(nodeUids)) {
|
|
106
|
+
if (originalNode.ok) {
|
|
107
|
+
void this.notifyListenersByNode(originalNode.node, DriveEventType.NodeDeleted);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
} catch {}
|
|
111
|
+
|
|
112
|
+
await this.cache.removeNodes(nodeUids);
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
private async notifyListenersByNode(node: DecryptedNode, eventType: DriveEventType.NodeCreated | DriveEventType.NodeUpdated | DriveEventType.NodeDeleted) {
|
|
116
|
+
const event: DriveEvent = {
|
|
117
|
+
type: eventType,
|
|
118
|
+
nodeUid: node.uid,
|
|
119
|
+
parentNodeUid: node.parentUid,
|
|
120
|
+
isOwnVolume: true,
|
|
121
|
+
isTrashed: !!node.trashTime,
|
|
122
|
+
isShared: node.isShared,
|
|
123
|
+
};
|
|
124
|
+
await notifyListenersByEvent(this.logger, event, this.listeners, this.cache, this.nodesAccess);
|
|
125
|
+
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
/**
|
|
130
|
+
* For given event, update the cache accordingly.
|
|
131
|
+
*
|
|
132
|
+
* The function is responsible for updating the cache based on the
|
|
133
|
+
* event received from the DriveEventsService. The cache metadata
|
|
134
|
+
* are not updated, only the nodes are marked as stale to be
|
|
135
|
+
* fetched and decrypted again when requested by the client.
|
|
136
|
+
*
|
|
137
|
+
* If the node is not found in the cache, the event is silently
|
|
138
|
+
* skipped as the node will be fetched and decrypted when requested
|
|
139
|
+
* by the client.
|
|
140
|
+
*
|
|
141
|
+
* If the node cannot be updated in the cache, the node is removed
|
|
142
|
+
* from the cache to not block the client. If the node is not possible
|
|
143
|
+
* to remove, the function throws an error.
|
|
144
|
+
*
|
|
145
|
+
* @throws Only if the node is not possible to remove from the cache.
|
|
146
|
+
*/
|
|
147
|
+
export async function updateCacheByEvent(logger: Logger, event: DriveEvent, cache: NodesCache) {
|
|
148
|
+
// NodeCreated event is ignored as we do not want to fetch and
|
|
149
|
+
// decrypt the node immediately. The node will be fetched and
|
|
150
|
+
// decrypted when requested by the client.
|
|
151
|
+
if (event.type === DriveEventType.NodeCreated) {
|
|
152
|
+
// We do not have partial nodes in the cache, so we don't
|
|
153
|
+
// add it. If new node is not added, we need to reset the
|
|
154
|
+
// children loaded flag to force refetch when requested.
|
|
155
|
+
if (event.parentNodeUid) {
|
|
156
|
+
await cache.resetFolderChildrenLoaded(event.parentNodeUid);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
if (event.type === DriveEventType.NodeUpdated || event.type === DriveEventType.NodeUpdatedMetadata) {
|
|
160
|
+
let node;
|
|
161
|
+
// getNode can fail if the node is not found or if it is
|
|
162
|
+
// corrupted. In later case, it will be automatically
|
|
163
|
+
// removed from cache. In both cases, lets skip the event
|
|
164
|
+
// silently as once requested by client, the node will
|
|
165
|
+
// be cached again.
|
|
166
|
+
try {
|
|
167
|
+
node = await cache.getNode(event.nodeUid);
|
|
168
|
+
} catch (error: unknown) {
|
|
169
|
+
logger.debug(`Skipping node update event (node not in the cache): ${error}`);
|
|
170
|
+
}
|
|
171
|
+
if (node) {
|
|
172
|
+
node.isStale = true;
|
|
173
|
+
// We need to update the parentUid as the node might have
|
|
174
|
+
// been moved to another parent. This is important for
|
|
175
|
+
// children iteration.
|
|
176
|
+
node.parentUid = event.parentNodeUid;
|
|
177
|
+
try {
|
|
178
|
+
await cache.setNode(node);
|
|
179
|
+
} catch (setNodeError: unknown) {
|
|
180
|
+
logger.error(`Skipping node update event (failed to update)`, setNodeError);
|
|
181
|
+
// If updating node in the cache is failing, lets remove it
|
|
182
|
+
// to not block the whole client. If the node is not possible
|
|
183
|
+
// to remove, lets throw at this point as cache is in very
|
|
184
|
+
// bad state by this point and the rest of the code would start
|
|
185
|
+
// to break randomly.
|
|
186
|
+
try {
|
|
187
|
+
await cache.removeNodes([event.nodeUid]);
|
|
188
|
+
} catch (removeNodeError: unknown) {
|
|
189
|
+
logger.error(`Skipping node update event (failed to remove after failed update)`, removeNodeError);
|
|
190
|
+
// removeNodeError is automatic correction algorithm.
|
|
191
|
+
// If that fails, lets throw the original error as that
|
|
192
|
+
// is the real problem.
|
|
193
|
+
throw setNodeError;
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
/**
|
|
201
|
+
* For given event, delete the node from the cache if it is
|
|
202
|
+
* deleted.
|
|
203
|
+
*/
|
|
204
|
+
export async function deleteFromCacheByEvent(logger: Logger, event: DriveEvent, cache: NodesCache) {
|
|
205
|
+
if (event.type === DriveEventType.NodeDeleted) {
|
|
206
|
+
// removeNodes can fail removing children.
|
|
207
|
+
// We do not want to stop processing other events in such
|
|
208
|
+
// a case. Lets log the error and continue.
|
|
209
|
+
try {
|
|
210
|
+
await cache.removeNodes([event.nodeUid]);
|
|
211
|
+
} catch (error: unknown) {
|
|
212
|
+
logger.error(`Skipping node delete event:`, error);
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
/**
|
|
218
|
+
* For given event, notify the listeners accordingly.
|
|
219
|
+
*
|
|
220
|
+
* The function is responsible for notifying the listeners about the
|
|
221
|
+
* event received from the DriveEventsService. The listeners are
|
|
222
|
+
* connected with events based on the condition, such as parent node
|
|
223
|
+
* uid for listening to children updates.
|
|
224
|
+
*
|
|
225
|
+
* The function is responsible for fetching and decrypting the latest
|
|
226
|
+
* version of the node metadata. If the node is not found, the event
|
|
227
|
+
* is silently skipped as the node will be fetched and decrypted when
|
|
228
|
+
* requested by the client.
|
|
229
|
+
*
|
|
230
|
+
* @throws Only if the client's callback throws.
|
|
231
|
+
*/
|
|
232
|
+
export async function notifyListenersByEvent(logger: Logger, event: DriveEvent, listeners: Listeners, cache: NodesCache, nodesAccess: NodesAccess) {
|
|
233
|
+
if (event.type === DriveEventType.ShareWithMeUpdated) {
|
|
234
|
+
return;
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
const subscribedListeners = listeners.filter(({ condition }) => condition(event));
|
|
238
|
+
const eventMatchingCondition = subscribedListeners.length > 0;
|
|
239
|
+
|
|
240
|
+
if ([DriveEventType.NodeCreated, DriveEventType.NodeUpdated, DriveEventType.NodeUpdatedMetadata].includes(event.type) && eventMatchingCondition) {
|
|
241
|
+
if (subscribedListeners.length) {
|
|
242
|
+
let node;
|
|
243
|
+
try {
|
|
244
|
+
node = await nodesAccess.getNode(event.nodeUid);
|
|
245
|
+
} catch (error: unknown) {
|
|
246
|
+
logger.error(`Skipping node update event to listener`, error);
|
|
247
|
+
return;
|
|
248
|
+
}
|
|
249
|
+
subscribedListeners.forEach(({ callback }) => callback({ type: 'update', uid: node.uid, node: convertInternalNode(node) }));
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
if (
|
|
254
|
+
((event.type === DriveEventType.NodeUpdated || event.type === DriveEventType.NodeUpdatedMetadata) && !eventMatchingCondition)
|
|
255
|
+
|| event.type === DriveEventType.NodeDeleted
|
|
256
|
+
) {
|
|
257
|
+
let node: DecryptedNode;
|
|
258
|
+
try {
|
|
259
|
+
node = await cache.getNode(event.nodeUid);
|
|
260
|
+
} catch {}
|
|
261
|
+
|
|
262
|
+
const subscribedListeners = listeners.filter(({ condition }) => condition({
|
|
263
|
+
parentNodeUid: node?.parentUid,
|
|
264
|
+
isTrashed: !!node?.trashTime || false,
|
|
265
|
+
}));
|
|
266
|
+
|
|
267
|
+
if (subscribedListeners.length) {
|
|
268
|
+
subscribedListeners.forEach(({ callback }) => callback({ type: 'remove', uid: event.nodeUid }));
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
}
|