@protontech/drive-sdk 0.14.9 → 0.15.0
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 +5 -0
- package/dist/cache/index.d.ts +1 -1
- package/dist/cache/memoryCache.d.ts +1 -1
- package/dist/cache/nullCache.d.ts +1 -1
- package/dist/crypto/driveCrypto.d.ts +7 -11
- package/dist/crypto/driveCrypto.js +35 -38
- package/dist/crypto/driveCrypto.js.map +1 -1
- package/dist/crypto/driveCrypto.test.js +1 -21
- package/dist/crypto/driveCrypto.test.js.map +1 -1
- package/dist/crypto/index.d.ts +2 -4
- package/dist/crypto/index.js +3 -6
- package/dist/crypto/index.js.map +1 -1
- package/dist/crypto/interface.d.ts +3 -35
- package/dist/crypto/interface.js +0 -7
- package/dist/crypto/interface.js.map +1 -1
- package/dist/crypto/openPGPCrypto.d.ts +10 -106
- package/dist/crypto/openPGPCrypto.js +2 -4
- package/dist/crypto/openPGPCrypto.js.map +1 -1
- package/dist/diagnostic/index.d.ts +1 -1
- package/dist/diagnostic/index.js +1 -1
- package/dist/diagnostic/index.js.map +1 -1
- package/dist/diagnostic/integrityVerificationStream.js +1 -2
- package/dist/diagnostic/integrityVerificationStream.js.map +1 -1
- package/dist/diagnostic/interface.d.ts +1 -1
- package/dist/diagnostic/nodeUtils.d.ts +1 -1
- package/dist/diagnostic/sdkDiagnosticBase.d.ts +2 -2
- package/dist/diagnostic/sdkDiagnosticBase.js.map +1 -1
- package/dist/diagnostic/sdkDiagnosticMain.js +1 -1
- package/dist/diagnostic/sdkDiagnosticMain.js.map +1 -1
- package/dist/diagnostic/sdkDiagnosticPhotos.js +1 -1
- package/dist/diagnostic/sdkDiagnosticPhotos.js.map +1 -1
- package/dist/index.d.ts +4 -3
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/interface/account.d.ts +1 -1
- package/dist/interface/devices.d.ts +1 -1
- package/dist/interface/index.d.ts +15 -15
- package/dist/interface/index.js +7 -7
- package/dist/interface/index.js.map +1 -1
- package/dist/interface/nodes.d.ts +1 -1
- package/dist/interface/photos.d.ts +1 -1
- package/dist/interface/sharing.d.ts +2 -2
- package/dist/internal/apiService/apiService.js +1 -1
- package/dist/internal/apiService/apiService.js.map +1 -1
- package/dist/internal/apiService/coreTypes.d.ts +8552 -7249
- package/dist/internal/apiService/driveTypes.d.ts +47 -92
- package/dist/internal/apiService/errors.test.js +1 -1
- package/dist/internal/apiService/errors.test.js.map +1 -1
- package/dist/internal/apiService/index.d.ts +4 -4
- package/dist/internal/apiService/index.js +5 -5
- package/dist/internal/apiService/index.js.map +1 -1
- package/dist/internal/apiService/transformers.d.ts +1 -1
- package/dist/internal/devices/index.d.ts +1 -1
- package/dist/internal/devices/manager.test.js +1 -1
- package/dist/internal/devices/manager.test.js.map +1 -1
- package/dist/internal/download/cryptoService.js +3 -2
- package/dist/internal/download/cryptoService.js.map +1 -1
- package/dist/internal/download/fileDownloader.js +8 -7
- package/dist/internal/download/fileDownloader.js.map +1 -1
- package/dist/internal/download/fileDownloader.test.js +1 -1
- package/dist/internal/download/fileDownloader.test.js.map +1 -1
- package/dist/internal/download/index.d.ts +2 -2
- package/dist/internal/download/index.js +1 -1
- package/dist/internal/download/index.js.map +1 -1
- package/dist/internal/download/interface.d.ts +1 -1
- package/dist/internal/download/telemetry.js +2 -3
- package/dist/internal/download/telemetry.js.map +1 -1
- package/dist/internal/download/telemetry.test.js +5 -0
- package/dist/internal/download/telemetry.test.js.map +1 -1
- package/dist/internal/download/thumbnailDownloader.d.ts +1 -1
- package/dist/internal/download/thumbnailDownloader.js +1 -1
- package/dist/internal/download/thumbnailDownloader.js.map +1 -1
- package/dist/internal/download/thumbnailDownloader.test.js.map +1 -1
- package/dist/internal/errors.d.ts +1 -0
- package/dist/internal/errors.js +11 -0
- package/dist/internal/errors.js.map +1 -1
- package/dist/internal/events/coreEventManager.test.js +1 -1
- package/dist/internal/events/coreEventManager.test.js.map +1 -1
- package/dist/internal/events/eventManager.d.ts +1 -1
- package/dist/internal/events/eventManager.js +1 -0
- package/dist/internal/events/eventManager.js.map +1 -1
- package/dist/internal/events/index.js +1 -1
- package/dist/internal/events/index.js.map +1 -1
- package/dist/internal/events/interface.d.ts +8 -0
- package/dist/internal/events/interface.js.map +1 -1
- package/dist/internal/events/volumeEventManager.js +1 -1
- package/dist/internal/events/volumeEventManager.js.map +1 -1
- package/dist/internal/events/volumeEventManager.test.js +1 -1
- package/dist/internal/events/volumeEventManager.test.js.map +1 -1
- package/dist/internal/nodes/apiService.d.ts +10 -4
- package/dist/internal/nodes/apiService.js +6 -2
- package/dist/internal/nodes/apiService.js.map +1 -1
- package/dist/internal/nodes/apiService.test.js +6 -2
- package/dist/internal/nodes/apiService.test.js.map +1 -1
- package/dist/internal/nodes/cache.d.ts +1 -1
- package/dist/internal/nodes/cryptoCache.d.ts +1 -1
- package/dist/internal/nodes/cryptoCache.test.js.map +1 -1
- package/dist/internal/nodes/cryptoReporter.d.ts +1 -1
- package/dist/internal/nodes/cryptoService.d.ts +2 -2
- package/dist/internal/nodes/cryptoService.js +2 -2
- package/dist/internal/nodes/cryptoService.js.map +1 -1
- package/dist/internal/nodes/cryptoService.test.js +1 -1
- package/dist/internal/nodes/cryptoService.test.js.map +1 -1
- package/dist/internal/nodes/events.test.js.map +1 -1
- package/dist/internal/nodes/index.d.ts +4 -4
- package/dist/internal/nodes/index.js +2 -2
- package/dist/internal/nodes/index.js.map +1 -1
- package/dist/internal/nodes/index.test.js +3 -3
- package/dist/internal/nodes/index.test.js.map +1 -1
- package/dist/internal/nodes/interface.d.ts +1 -1
- package/dist/internal/nodes/nodesAccess.d.ts +2 -2
- package/dist/internal/nodes/nodesAccess.js +3 -3
- package/dist/internal/nodes/nodesAccess.js.map +1 -1
- package/dist/internal/nodes/nodesAccess.test.js +2 -2
- package/dist/internal/nodes/nodesAccess.test.js.map +1 -1
- package/dist/internal/nodes/nodesManagement.d.ts +1 -1
- package/dist/internal/nodes/nodesManagement.js +2 -2
- package/dist/internal/nodes/nodesManagement.js.map +1 -1
- package/dist/internal/nodes/nodesManagement.test.js +6 -6
- package/dist/internal/nodes/nodesManagement.test.js.map +1 -1
- package/dist/internal/nodes/nodesRevisions.d.ts +1 -1
- package/dist/internal/nodes/nodesRevisions.js.map +1 -1
- package/dist/internal/photos/addToAlbum.d.ts +1 -1
- package/dist/internal/photos/addToAlbum.js.map +1 -1
- package/dist/internal/photos/albumsCrypto.js.map +1 -1
- package/dist/internal/photos/albumsManager.js +15 -5
- package/dist/internal/photos/albumsManager.js.map +1 -1
- package/dist/internal/photos/albumsManager.test.js +3 -2
- package/dist/internal/photos/albumsManager.test.js.map +1 -1
- package/dist/internal/photos/apiService.js +1 -1
- package/dist/internal/photos/index.d.ts +2 -2
- package/dist/internal/photos/index.js +5 -5
- package/dist/internal/photos/index.js.map +1 -1
- package/dist/internal/photos/interface.d.ts +2 -2
- package/dist/internal/photos/nodes.d.ts +2 -2
- package/dist/internal/photos/nodes.js +11 -1
- package/dist/internal/photos/nodes.js.map +1 -1
- package/dist/internal/photos/nodes.test.js +17 -3
- package/dist/internal/photos/nodes.test.js.map +1 -1
- package/dist/internal/photos/photosManager.d.ts +1 -1
- package/dist/internal/photos/photosManager.js +1 -1
- package/dist/internal/photos/photosManager.js.map +1 -1
- package/dist/internal/photos/photosManager.test.js +1 -1
- package/dist/internal/photos/photosManager.test.js.map +1 -1
- package/dist/internal/photos/photosTransferPayloadBuilder.test.js.map +1 -1
- package/dist/internal/photos/timeline.test.js.map +1 -1
- package/dist/internal/photos/upload.d.ts +1 -1
- package/dist/internal/shares/apiService.d.ts +1 -1
- package/dist/internal/shares/cache.d.ts +1 -1
- package/dist/internal/shares/cryptoCache.test.js.map +1 -1
- package/dist/internal/shares/cryptoService.d.ts +2 -2
- package/dist/internal/shares/cryptoService.js +1 -1
- package/dist/internal/shares/cryptoService.js.map +1 -1
- package/dist/internal/shares/cryptoService.test.js +1 -1
- package/dist/internal/shares/cryptoService.test.js.map +1 -1
- package/dist/internal/shares/index.d.ts +2 -2
- package/dist/internal/shares/index.js +1 -1
- package/dist/internal/shares/index.js.map +1 -1
- package/dist/internal/shares/manager.d.ts +2 -2
- package/dist/internal/shares/manager.js.map +1 -1
- package/dist/internal/sharing/apiService.d.ts +2 -2
- package/dist/internal/sharing/cryptoService.d.ts +2 -3
- package/dist/internal/sharing/cryptoService.js +10 -31
- package/dist/internal/sharing/cryptoService.js.map +1 -1
- package/dist/internal/sharing/cryptoService.test.js.map +1 -1
- package/dist/internal/sharing/index.d.ts +3 -3
- package/dist/internal/sharing/index.js +1 -1
- package/dist/internal/sharing/index.js.map +1 -1
- package/dist/internal/sharing/interface.d.ts +2 -2
- package/dist/internal/sharing/sharingAccess.d.ts +1 -1
- package/dist/internal/sharing/sharingAccess.js +1 -1
- package/dist/internal/sharing/sharingAccess.js.map +1 -1
- package/dist/internal/sharing/sharingAccess.test.js +1 -1
- package/dist/internal/sharing/sharingAccess.test.js.map +1 -1
- package/dist/internal/sharing/sharingManagement.d.ts +3 -3
- package/dist/internal/sharing/sharingManagement.js +1 -1
- package/dist/internal/sharing/sharingManagement.js.map +1 -1
- package/dist/internal/sharing/sharingManagement.test.js +2 -2
- package/dist/internal/sharing/sharingManagement.test.js.map +1 -1
- package/dist/internal/sharingPublic/cryptoReporter.d.ts +1 -1
- package/dist/internal/sharingPublic/cryptoReporter.js +1 -1
- package/dist/internal/sharingPublic/cryptoReporter.js.map +1 -1
- package/dist/internal/sharingPublic/index.d.ts +2 -2
- package/dist/internal/sharingPublic/index.js +3 -3
- package/dist/internal/sharingPublic/index.js.map +1 -1
- package/dist/internal/sharingPublic/nodes.d.ts +4 -4
- package/dist/internal/sharingPublic/nodes.js +4 -1
- package/dist/internal/sharingPublic/nodes.js.map +1 -1
- package/dist/internal/sharingPublic/session/apiService.d.ts +1 -1
- package/dist/internal/sharingPublic/session/manager.d.ts +1 -1
- package/dist/internal/upload/apiService.d.ts +1 -1
- package/dist/internal/upload/apiService.js +13 -6
- package/dist/internal/upload/apiService.js.map +1 -1
- package/dist/internal/upload/cryptoService.d.ts +1 -1
- package/dist/internal/upload/cryptoService.js +5 -4
- package/dist/internal/upload/cryptoService.js.map +1 -1
- package/dist/internal/upload/fileUploader.test.js +1 -1
- package/dist/internal/upload/fileUploader.test.js.map +1 -1
- package/dist/internal/upload/index.d.ts +2 -2
- package/dist/internal/upload/index.js.map +1 -1
- package/dist/internal/upload/interface.d.ts +1 -1
- package/dist/internal/upload/manager.d.ts +1 -1
- package/dist/internal/upload/manager.js +1 -1
- package/dist/internal/upload/manager.js.map +1 -1
- package/dist/internal/upload/smallFileUploader.test.js +1 -1
- package/dist/internal/upload/smallFileUploader.test.js.map +1 -1
- package/dist/internal/upload/streamUploader.d.ts +3 -3
- package/dist/internal/upload/streamUploader.js +1 -1
- package/dist/internal/upload/streamUploader.js.map +1 -1
- package/dist/internal/upload/streamUploader.test.js +2 -2
- package/dist/internal/upload/streamUploader.test.js.map +1 -1
- package/dist/internal/upload/telemetry.d.ts +1 -1
- package/dist/internal/upload/telemetry.js +2 -3
- package/dist/internal/upload/telemetry.js.map +1 -1
- package/dist/internal/upload/telemetry.test.js +5 -0
- package/dist/internal/upload/telemetry.test.js.map +1 -1
- package/dist/polyfill.d.ts +1 -0
- package/dist/polyfill.js +4 -0
- package/dist/polyfill.js.map +1 -0
- package/dist/protonDriveClient.d.ts +1 -1
- package/dist/protonDriveClient.js +3 -3
- package/dist/protonDriveClient.js.map +1 -1
- package/dist/protonDrivePhotosClient.d.ts +7 -1
- package/dist/protonDrivePhotosClient.js +13 -4
- package/dist/protonDrivePhotosClient.js.map +1 -1
- package/dist/protonDrivePublicLinkClient.d.ts +3 -3
- package/dist/protonDrivePublicLinkClient.js +3 -3
- package/dist/protonDrivePublicLinkClient.js.map +1 -1
- package/dist/transformers.d.ts +1 -1
- package/package.json +8 -4
- package/src/cache/index.ts +1 -1
- package/src/cache/memoryCache.ts +1 -1
- package/src/cache/nullCache.ts +1 -1
- package/src/crypto/driveCrypto.test.ts +1 -24
- package/src/crypto/driveCrypto.ts +37 -35
- package/src/crypto/index.ts +2 -4
- package/src/crypto/interface.ts +3 -49
- package/src/crypto/openPGPCrypto.ts +4 -88
- package/src/diagnostic/index.ts +3 -3
- package/src/diagnostic/integrityVerificationStream.ts +1 -2
- package/src/diagnostic/interface.ts +1 -1
- package/src/diagnostic/nodeUtils.ts +1 -1
- package/src/diagnostic/sdkDiagnosticBase.ts +6 -6
- package/src/diagnostic/sdkDiagnosticMain.ts +2 -2
- package/src/diagnostic/sdkDiagnosticPhotos.ts +2 -2
- package/src/diagnostic/telemetry.ts +1 -1
- package/src/index.ts +4 -3
- package/src/interface/account.ts +1 -1
- package/src/interface/devices.ts +1 -1
- package/src/interface/index.ts +40 -40
- package/src/interface/nodes.ts +1 -1
- package/src/interface/photos.ts +1 -1
- package/src/interface/sharing.ts +2 -2
- package/src/internal/apiService/apiService.test.ts +2 -2
- package/src/internal/apiService/apiService.ts +3 -3
- package/src/internal/apiService/coreTypes.ts +8641 -7349
- package/src/internal/apiService/driveTypes.ts +47 -92
- package/src/internal/apiService/errors.test.ts +2 -2
- package/src/internal/apiService/index.ts +4 -4
- package/src/internal/apiService/transformers.ts +1 -1
- package/src/internal/devices/index.ts +1 -1
- package/src/internal/devices/manager.test.ts +2 -2
- package/src/internal/download/cryptoService.ts +6 -11
- package/src/internal/download/fileDownloader.test.ts +3 -3
- package/src/internal/download/fileDownloader.ts +8 -6
- package/src/internal/download/index.ts +3 -3
- package/src/internal/download/interface.ts +1 -1
- package/src/internal/download/seekableStream.test.ts +1 -1
- package/src/internal/download/telemetry.test.ts +7 -1
- package/src/internal/download/telemetry.ts +4 -7
- package/src/internal/download/thumbnailDownloader.test.ts +1 -1
- package/src/internal/download/thumbnailDownloader.ts +2 -2
- package/src/internal/errors.ts +15 -0
- package/src/internal/events/apiService.ts +2 -2
- package/src/internal/events/coreEventManager.test.ts +1 -1
- package/src/internal/events/eventManager.ts +2 -1
- package/src/internal/events/index.ts +2 -2
- package/src/internal/events/interface.ts +8 -0
- package/src/internal/events/volumeEventManager.test.ts +1 -1
- package/src/internal/events/volumeEventManager.ts +1 -1
- package/src/internal/nodes/apiService.test.ts +8 -3
- package/src/internal/nodes/apiService.ts +22 -7
- package/src/internal/nodes/cache.test.ts +1 -1
- package/src/internal/nodes/cache.ts +1 -1
- package/src/internal/nodes/cryptoCache.test.ts +1 -1
- package/src/internal/nodes/cryptoCache.ts +1 -1
- package/src/internal/nodes/cryptoReporter.ts +4 -4
- package/src/internal/nodes/cryptoService.test.ts +2 -2
- package/src/internal/nodes/cryptoService.ts +14 -15
- package/src/internal/nodes/events.test.ts +1 -1
- package/src/internal/nodes/extendedAttributes.test.ts +3 -3
- package/src/internal/nodes/index.test.ts +8 -8
- package/src/internal/nodes/index.ts +6 -6
- package/src/internal/nodes/interface.ts +6 -6
- package/src/internal/nodes/nodeName.test.ts +1 -1
- package/src/internal/nodes/nodesAccess.test.ts +3 -3
- package/src/internal/nodes/nodesAccess.ts +6 -6
- package/src/internal/nodes/nodesManagement.test.ts +4 -4
- package/src/internal/nodes/nodesManagement.ts +6 -6
- package/src/internal/nodes/nodesRevisions.ts +1 -1
- package/src/internal/photos/addToAlbum.ts +1 -1
- package/src/internal/photos/albumsCrypto.ts +1 -0
- package/src/internal/photos/albumsManager.test.ts +4 -3
- package/src/internal/photos/albumsManager.ts +13 -5
- package/src/internal/photos/apiService.ts +1 -1
- package/src/internal/photos/index.ts +7 -7
- package/src/internal/photos/interface.ts +2 -2
- package/src/internal/photos/nodes.test.ts +22 -6
- package/src/internal/photos/nodes.ts +16 -9
- package/src/internal/photos/photosManager.test.ts +5 -5
- package/src/internal/photos/photosManager.ts +4 -4
- package/src/internal/photos/photosTransferPayloadBuilder.test.ts +1 -1
- package/src/internal/photos/timeline.test.ts +1 -1
- package/src/internal/photos/upload.ts +3 -3
- package/src/internal/sdkEvents.ts +1 -1
- package/src/internal/shares/apiService.ts +1 -1
- package/src/internal/shares/cache.ts +1 -1
- package/src/internal/shares/cryptoCache.test.ts +1 -1
- package/src/internal/shares/cryptoService.test.ts +1 -1
- package/src/internal/shares/cryptoService.ts +8 -8
- package/src/internal/shares/index.ts +5 -5
- package/src/internal/shares/manager.ts +2 -2
- package/src/internal/sharing/apiService.ts +10 -10
- package/src/internal/sharing/cryptoService.test.ts +1 -1
- package/src/internal/sharing/cryptoService.ts +12 -37
- package/src/internal/sharing/events.test.ts +2 -2
- package/src/internal/sharing/index.ts +3 -3
- package/src/internal/sharing/interface.ts +2 -2
- package/src/internal/sharing/sharingAccess.test.ts +4 -4
- package/src/internal/sharing/sharingAccess.ts +3 -3
- package/src/internal/sharing/sharingManagement.test.ts +4 -4
- package/src/internal/sharing/sharingManagement.ts +9 -9
- package/src/internal/sharingPublic/cryptoReporter.ts +7 -7
- package/src/internal/sharingPublic/index.ts +6 -6
- package/src/internal/sharingPublic/nodes.ts +7 -4
- package/src/internal/sharingPublic/session/apiService.ts +1 -1
- package/src/internal/sharingPublic/session/manager.ts +1 -1
- package/src/internal/upload/apiService.ts +17 -8
- package/src/internal/upload/cryptoService.ts +8 -6
- package/src/internal/upload/fileUploader.test.ts +4 -4
- package/src/internal/upload/index.ts +3 -3
- package/src/internal/upload/interface.ts +1 -2
- package/src/internal/upload/manager.ts +4 -4
- package/src/internal/upload/smallFileUploader.test.ts +4 -4
- package/src/internal/upload/streamUploader.test.ts +5 -5
- package/src/internal/upload/streamUploader.ts +4 -4
- package/src/internal/upload/telemetry.test.ts +7 -1
- package/src/internal/upload/telemetry.ts +5 -8
- package/src/polyfill.ts +1 -0
- package/src/protonDriveClient.ts +32 -32
- package/src/protonDrivePhotosClient.ts +42 -32
- package/src/protonDrivePublicLinkClient.ts +25 -25
- package/src/transformers.ts +9 -9
- package/dist/crypto/hmac.d.ts +0 -22
- package/dist/crypto/hmac.js +0 -44
- package/dist/crypto/hmac.js.map +0 -1
- package/dist/crypto/utils.d.ts +0 -2
- package/dist/crypto/utils.js +0 -35
- package/dist/crypto/utils.js.map +0 -1
- package/src/crypto/hmac.ts +0 -46
- package/src/crypto/utils.ts +0 -40
package/src/internal/errors.ts
CHANGED
|
@@ -67,3 +67,18 @@ export function isNotApplicationError(error?: unknown): boolean {
|
|
|
67
67
|
|
|
68
68
|
return false;
|
|
69
69
|
}
|
|
70
|
+
|
|
71
|
+
export function isNetworkError(error: unknown): boolean {
|
|
72
|
+
if (!(error instanceof Error)) {
|
|
73
|
+
return false;
|
|
74
|
+
}
|
|
75
|
+
return (
|
|
76
|
+
error.name === 'OfflineError' ||
|
|
77
|
+
error.name === 'NetworkError' ||
|
|
78
|
+
error.message?.toLowerCase() === 'network error' ||
|
|
79
|
+
(error.name === 'TypeError' &&
|
|
80
|
+
['Failed to fetch', 'NetworkError when attempting to fetch resource', 'Load failed'].includes(
|
|
81
|
+
error.message,
|
|
82
|
+
))
|
|
83
|
+
);
|
|
84
|
+
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { DriveAPIService, drivePaths
|
|
1
|
+
import { corePaths, DriveAPIService, drivePaths } from '../apiService';
|
|
2
2
|
import { makeNodeUid } from '../uids';
|
|
3
|
-
import {
|
|
3
|
+
import { DriveEvent, DriveEventsListWithStatus, DriveEventType, NodeEvent, NodeEventType } from './interface';
|
|
4
4
|
|
|
5
5
|
type GetCoreLatestEventResponse =
|
|
6
6
|
corePaths['/core/{_version}/events/latest']['get']['responses']['200']['content']['application/json'];
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { getMockLogger } from '../../tests/logger';
|
|
2
2
|
import { EventsAPIService } from './apiService';
|
|
3
|
-
import { DriveEvent, DriveEventsListWithStatus, DriveEventType } from './interface';
|
|
4
3
|
import { CoreEventManager } from './coreEventManager';
|
|
4
|
+
import { DriveEvent, DriveEventsListWithStatus, DriveEventType } from './interface';
|
|
5
5
|
|
|
6
6
|
describe('CoreEventManager', () => {
|
|
7
7
|
let mockApiService: jest.Mocked<EventsAPIService>;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Logger } from '../../interface';
|
|
2
|
-
import {
|
|
2
|
+
import { Event, EventManagerInterface, EventSubscription } from './interface';
|
|
3
3
|
|
|
4
4
|
const FIBONACCI_LIST = [1, 1, 2, 3, 5, 8, 13];
|
|
5
5
|
|
|
@@ -54,6 +54,7 @@ export class EventManager<T extends Event> {
|
|
|
54
54
|
const index = this.listeners.indexOf(callback);
|
|
55
55
|
this.listeners.splice(index, 1);
|
|
56
56
|
},
|
|
57
|
+
getLatestEventId: () => this.latestEventId ?? null,
|
|
57
58
|
};
|
|
58
59
|
}
|
|
59
60
|
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { Logger, ProtonDriveTelemetry } from '../../interface';
|
|
2
2
|
import { DriveAPIService } from '../apiService';
|
|
3
|
-
import { DriveEvent, DriveListener, EventSubscription, LatestEventIdProvider, SharesService } from './interface';
|
|
4
3
|
import { EventsAPIService } from './apiService';
|
|
5
4
|
import { CoreEventManager } from './coreEventManager';
|
|
6
|
-
import { VolumeEventManager } from './volumeEventManager';
|
|
7
5
|
import { EventManager } from './eventManager';
|
|
6
|
+
import { DriveEvent, DriveListener, EventSubscription, LatestEventIdProvider, SharesService } from './interface';
|
|
7
|
+
import { VolumeEventManager } from './volumeEventManager';
|
|
8
8
|
|
|
9
9
|
export type { DriveEvent, DriveListener, EventSubscription } from './interface';
|
|
10
10
|
export { DriveEventType } from './interface';
|
|
@@ -15,6 +15,14 @@ export interface Event {
|
|
|
15
15
|
|
|
16
16
|
export interface EventSubscription {
|
|
17
17
|
dispose(): void;
|
|
18
|
+
/**
|
|
19
|
+
* Returns the latest event ID for the subscription.
|
|
20
|
+
*
|
|
21
|
+
* @deprecated This is experimental to provide a way to the client to know
|
|
22
|
+
* the latest event ID before getting any events. It will be removed and
|
|
23
|
+
* replaced with a more robust solution.
|
|
24
|
+
*/
|
|
25
|
+
getLatestEventId(): string | null;
|
|
18
26
|
}
|
|
19
27
|
|
|
20
28
|
export interface LatestEventIdProvider {
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { getMockLogger } from '../../tests/logger';
|
|
2
2
|
import { NotFoundAPIError } from '../apiService';
|
|
3
3
|
import { EventsAPIService } from './apiService';
|
|
4
|
-
import { VolumeEventManager } from './volumeEventManager';
|
|
5
4
|
import { DriveEventsListWithStatus, DriveEventType } from './interface';
|
|
5
|
+
import { VolumeEventManager } from './volumeEventManager';
|
|
6
6
|
|
|
7
7
|
jest.mock('./apiService');
|
|
8
8
|
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { Logger } from '../../interface';
|
|
2
2
|
import { LoggerWithPrefix } from '../../telemetry';
|
|
3
|
+
import { NotFoundAPIError } from '../apiService';
|
|
3
4
|
import { EventsAPIService } from './apiService';
|
|
4
5
|
import {
|
|
5
6
|
DriveEvent,
|
|
@@ -8,7 +9,6 @@ import {
|
|
|
8
9
|
EventManagerInterface,
|
|
9
10
|
UnsubscribeFromEventsSourceError,
|
|
10
11
|
} from './interface';
|
|
11
|
-
import { NotFoundAPIError } from '../apiService';
|
|
12
12
|
|
|
13
13
|
/**
|
|
14
14
|
* Combines API and event manager to provide a service for listening to
|
|
@@ -2,10 +2,10 @@ import { NodeWithSameNameExistsValidationError, ValidationError } from '../../er
|
|
|
2
2
|
import { MemberRole, NodeType } from '../../interface';
|
|
3
3
|
import { getMockLogger } from '../../tests/logger';
|
|
4
4
|
import { DriveAPIService, ErrorCode, InvalidRequirementsAPIError } from '../apiService';
|
|
5
|
-
import {
|
|
5
|
+
import { groupNodeUidsByVolumeAndIteratePerBatch, NodeAPIService } from './apiService';
|
|
6
6
|
import { NodeOutOfSyncError } from './errors';
|
|
7
7
|
|
|
8
|
-
function generateAPIFileNode(linkOverrides = {}, overrides = {}) {
|
|
8
|
+
function generateAPIFileNode(linkOverrides = {}, overrides = {}, fileOverrides = {}) {
|
|
9
9
|
const node = generateAPINode();
|
|
10
10
|
return {
|
|
11
11
|
Link: {
|
|
@@ -25,6 +25,7 @@ function generateAPIFileNode(linkOverrides = {}, overrides = {}) {
|
|
|
25
25
|
XAttr: '{file}',
|
|
26
26
|
EncryptedSize: 12,
|
|
27
27
|
},
|
|
28
|
+
...fileOverrides,
|
|
28
29
|
},
|
|
29
30
|
...overrides,
|
|
30
31
|
};
|
|
@@ -225,7 +226,7 @@ describe('nodeAPIService', () => {
|
|
|
225
226
|
);
|
|
226
227
|
|
|
227
228
|
const nodes = await Array.fromAsync(api.iterateNodes(['volumeId~nodeId'], ownVolumeId));
|
|
228
|
-
expect(nodes).toStrictEqual([expectedNode]);
|
|
229
|
+
expect(nodes).toStrictEqual(expectedNode ? [expectedNode] : []);
|
|
229
230
|
}
|
|
230
231
|
|
|
231
232
|
it('should get folder node', async () => {
|
|
@@ -243,6 +244,10 @@ describe('nodeAPIService', () => {
|
|
|
243
244
|
await testIterateNodes(generateAPIFileNode(), generateFileNode());
|
|
244
245
|
});
|
|
245
246
|
|
|
247
|
+
fit('should skip file draft node without an error', async () => {
|
|
248
|
+
await testIterateNodes(generateAPIFileNode({}, {}, { ActiveRevision: null }), undefined);
|
|
249
|
+
});
|
|
250
|
+
|
|
246
251
|
it('should get album node', async () => {
|
|
247
252
|
await testIterateNodes(generateAPIAlbumNode(), generateAlbumNode());
|
|
248
253
|
});
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { c } from 'ttag';
|
|
2
2
|
|
|
3
3
|
import { NodeWithSameNameExistsValidationError, ProtonDriveError, ValidationError } from '../../errors';
|
|
4
|
-
import {
|
|
4
|
+
import { AnonymousUser, Logger, MemberRole, NodeResult, RevisionState } from '../../interface';
|
|
5
5
|
import {
|
|
6
6
|
DriveAPIService,
|
|
7
7
|
drivePaths,
|
|
@@ -13,7 +13,7 @@ import {
|
|
|
13
13
|
} from '../apiService';
|
|
14
14
|
import { asyncIteratorRace } from '../asyncIteratorRace';
|
|
15
15
|
import { batch } from '../batch';
|
|
16
|
-
import {
|
|
16
|
+
import { makeNodeRevisionUid, makeNodeThumbnailUid, makeNodeUid, splitNodeRevisionUid, splitNodeUid } from '../uids';
|
|
17
17
|
import { NodeOutOfSyncError } from './errors';
|
|
18
18
|
import { EncryptedNode, EncryptedRevision, FilterOptions, Thumbnail } from './interface';
|
|
19
19
|
|
|
@@ -212,7 +212,7 @@ export abstract class NodeAPIServiceBase<
|
|
|
212
212
|
for (const link of responseLinks) {
|
|
213
213
|
try {
|
|
214
214
|
const encryptedNode = this.linkToEncryptedNode(volumeId, link, isOwnVolumeId);
|
|
215
|
-
if (filterOptions?.type && encryptedNode.type !== filterOptions.type) {
|
|
215
|
+
if (!encryptedNode || (filterOptions?.type && encryptedNode.type !== filterOptions.type)) {
|
|
216
216
|
continue;
|
|
217
217
|
}
|
|
218
218
|
yield encryptedNode;
|
|
@@ -232,7 +232,17 @@ export abstract class NodeAPIServiceBase<
|
|
|
232
232
|
signal?: AbortSignal,
|
|
233
233
|
): Promise<TMetadataResponseLink[]>;
|
|
234
234
|
|
|
235
|
-
|
|
235
|
+
/**
|
|
236
|
+
* Converts a link from the API payload to an encrypted node entity.
|
|
237
|
+
*
|
|
238
|
+
* Returns undefined if the link is a draft as drafts are not exposed
|
|
239
|
+
* to the client and are internal to upload module only.
|
|
240
|
+
*/
|
|
241
|
+
protected abstract linkToEncryptedNode(
|
|
242
|
+
volumeId: string,
|
|
243
|
+
link: TMetadataResponseLink,
|
|
244
|
+
isOwnVolumeId: boolean,
|
|
245
|
+
): T | undefined;
|
|
236
246
|
|
|
237
247
|
// Improvement requested: load next page sooner before all IDs are yielded.
|
|
238
248
|
async *iterateChildrenNodeUids(
|
|
@@ -623,7 +633,7 @@ export class NodeAPIService extends NodeAPIServiceBase {
|
|
|
623
633
|
volumeId: string,
|
|
624
634
|
link: PostLoadLinksMetadataResponse['Links'][0],
|
|
625
635
|
isOwnVolumeId: boolean,
|
|
626
|
-
): EncryptedNode {
|
|
636
|
+
): EncryptedNode | undefined {
|
|
627
637
|
return linkToEncryptedNode(this.logger, volumeId, link, isOwnVolumeId);
|
|
628
638
|
}
|
|
629
639
|
}
|
|
@@ -683,7 +693,7 @@ export function linkToEncryptedNode(
|
|
|
683
693
|
volumeId: string,
|
|
684
694
|
link: Pick<PostLoadLinksMetadataResponse['Links'][0], 'Link' | 'Membership' | 'Sharing' | 'Folder' | 'File'>,
|
|
685
695
|
isAdmin: boolean,
|
|
686
|
-
): EncryptedNode {
|
|
696
|
+
): EncryptedNode | undefined {
|
|
687
697
|
const { baseNodeMetadata, baseCryptoNodeMetadata } = linkToEncryptedNodeBaseMetadata(
|
|
688
698
|
logger,
|
|
689
699
|
volumeId,
|
|
@@ -704,7 +714,12 @@ export function linkToEncryptedNode(
|
|
|
704
714
|
};
|
|
705
715
|
}
|
|
706
716
|
|
|
707
|
-
if (link.Link.Type === 2 && link.File
|
|
717
|
+
if (link.Link.Type === 2 && link.File) {
|
|
718
|
+
if (!link.File.ActiveRevision) {
|
|
719
|
+
logger.warn(`Requested draft file node, skipping from the result`);
|
|
720
|
+
return undefined;
|
|
721
|
+
}
|
|
722
|
+
|
|
708
723
|
return {
|
|
709
724
|
...baseNodeMetadata,
|
|
710
725
|
totalStorageSize: link.File.TotalEncryptedSize,
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { MemoryCache } from '../../cache';
|
|
2
|
-
import {
|
|
2
|
+
import { MemberRole, NodeType, Result, resultOk, RevisionState } from '../../interface';
|
|
3
3
|
import { getMockLogger } from '../../tests/logger';
|
|
4
4
|
import { CACHE_TAG_KEYS, NodesCache } from './cache';
|
|
5
5
|
import { DecryptedNode, DecryptedRevision } from './interface';
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { EntityResult } from '../../cache';
|
|
2
|
-
import { ProtonDriveEntitiesCache,
|
|
2
|
+
import { Logger, ProtonDriveEntitiesCache, Result, resultOk } from '../../interface';
|
|
3
3
|
import { splitNodeUid } from '../uids';
|
|
4
4
|
import { DecryptedNode, DecryptedRevision } from './interface';
|
|
5
5
|
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { PrivateKey, SessionKey } from '../../crypto';
|
|
2
1
|
import { MemoryCache } from '../../cache';
|
|
2
|
+
import { PrivateKey, SessionKey } from '../../crypto';
|
|
3
3
|
import { CachedCryptoMaterial } from '../../interface';
|
|
4
4
|
import { getMockLogger } from '../../tests/logger';
|
|
5
5
|
import { NodesCryptoCache } from './cryptoCache';
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
import { VERIFICATION_STATUS } from '../../crypto';
|
|
2
2
|
import {
|
|
3
|
-
resultOk,
|
|
4
|
-
resultError,
|
|
5
|
-
Author,
|
|
6
3
|
AnonymousUser,
|
|
7
|
-
|
|
4
|
+
Author,
|
|
8
5
|
Logger,
|
|
9
6
|
MetricsDecryptionErrorField,
|
|
10
7
|
MetricVerificationErrorField,
|
|
11
8
|
MetricVolumeType,
|
|
9
|
+
ProtonDriveTelemetry,
|
|
10
|
+
resultError,
|
|
11
|
+
resultOk,
|
|
12
12
|
} from '../../interface';
|
|
13
13
|
import { getVerificationMessage, isNotApplicationError } from '../errors';
|
|
14
14
|
import { splitNodeUid } from '../uids';
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import { DriveCrypto, PrivateKey, PublicKey, SessionKey, VERIFICATION_STATUS } from '../../crypto';
|
|
2
2
|
import { MemberRole, ProtonDriveAccount, ProtonDriveTelemetry, RevisionState } from '../../interface';
|
|
3
3
|
import { getMockTelemetry } from '../../tests/telemetry';
|
|
4
|
+
import { NodesCryptoReporter } from './cryptoReporter';
|
|
5
|
+
import { NodesCryptoService } from './cryptoService';
|
|
4
6
|
import {
|
|
5
7
|
DecryptedNode,
|
|
6
8
|
DecryptedNodeKeys,
|
|
@@ -9,8 +11,6 @@ import {
|
|
|
9
11
|
NodeSigningKeys,
|
|
10
12
|
SharesService,
|
|
11
13
|
} from './interface';
|
|
12
|
-
import { NodesCryptoService } from './cryptoService';
|
|
13
|
-
import { NodesCryptoReporter } from './cryptoReporter';
|
|
14
14
|
|
|
15
15
|
describe('nodesCryptoService', () => {
|
|
16
16
|
let telemetry: ProtonDriveTelemetry;
|
|
@@ -1,41 +1,40 @@
|
|
|
1
1
|
import { c } from 'ttag';
|
|
2
2
|
|
|
3
3
|
import {
|
|
4
|
-
base64StringToUint8Array,
|
|
5
4
|
DriveCrypto,
|
|
6
5
|
PrivateKey,
|
|
7
6
|
PublicKey,
|
|
8
7
|
SessionKey,
|
|
9
8
|
VERIFICATION_STATUS,
|
|
10
9
|
} from '../../crypto';
|
|
10
|
+
import { ValidationError } from '../../errors';
|
|
11
11
|
import {
|
|
12
|
-
resultOk,
|
|
13
|
-
resultError,
|
|
14
|
-
Result,
|
|
15
|
-
Author,
|
|
16
12
|
AnonymousUser,
|
|
17
|
-
|
|
13
|
+
Author,
|
|
18
14
|
Logger,
|
|
15
|
+
Membership,
|
|
19
16
|
MetricsDecryptionErrorField,
|
|
20
17
|
MetricVerificationErrorField,
|
|
21
|
-
Membership,
|
|
22
18
|
ProtonDriveAccount,
|
|
19
|
+
ProtonDriveTelemetry,
|
|
20
|
+
Result,
|
|
21
|
+
resultError,
|
|
22
|
+
resultOk,
|
|
23
23
|
} from '../../interface';
|
|
24
|
-
import { ValidationError } from '../../errors';
|
|
25
24
|
import { getErrorMessage } from '../errors';
|
|
25
|
+
import { splitNodeUid } from '../uids';
|
|
26
26
|
import {
|
|
27
|
-
EncryptedNode,
|
|
28
|
-
EncryptedNodeFolderCrypto,
|
|
29
|
-
DecryptedUnparsedNode,
|
|
30
27
|
DecryptedNode,
|
|
31
28
|
DecryptedNodeKeys,
|
|
32
|
-
|
|
29
|
+
DecryptedUnparsedNode,
|
|
33
30
|
DecryptedUnparsedRevision,
|
|
34
|
-
|
|
31
|
+
EncryptedNode,
|
|
35
32
|
EncryptedNodeFileCrypto,
|
|
33
|
+
EncryptedNodeFolderCrypto,
|
|
34
|
+
EncryptedRevision,
|
|
35
|
+
NodeSigningKeys,
|
|
36
36
|
SharesService,
|
|
37
37
|
} from './interface';
|
|
38
|
-
import { splitNodeUid } from '../uids';
|
|
39
38
|
|
|
40
39
|
export interface NodesCryptoReporter {
|
|
41
40
|
handleClaimedAuthor(
|
|
@@ -213,7 +212,7 @@ export class NodesCryptoService {
|
|
|
213
212
|
let contentKeyPacketAuthor;
|
|
214
213
|
let contentKeyPacket: Uint8Array<ArrayBuffer> | undefined;
|
|
215
214
|
if ('file' in node.encryptedCrypto) {
|
|
216
|
-
contentKeyPacket =
|
|
215
|
+
contentKeyPacket = Uint8Array.fromBase64(node.encryptedCrypto.file.base64ContentKeyPacket);
|
|
217
216
|
const [activeRevisionPromise, contentKeyPacketSessionKeyPromise] = [
|
|
218
217
|
this.decryptRevision(node.uid, node.encryptedCrypto.activeRevision, key),
|
|
219
218
|
this.decryptContentKeyPacket(node, node.encryptedCrypto, key, keyVerificationKeys),
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { getMockLogger } from '../../tests/logger';
|
|
2
2
|
import { DriveEvent, DriveEventType } from '../events';
|
|
3
|
+
import { NodesCache } from './cache';
|
|
3
4
|
import { NodesEventsHandler } from './events';
|
|
4
5
|
import { DecryptedNode } from './interface';
|
|
5
|
-
import { NodesCache } from './cache';
|
|
6
6
|
|
|
7
7
|
describe('NodesEventsHandler', () => {
|
|
8
8
|
const logger = getMockLogger();
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { getMockLogger } from '../../tests/logger';
|
|
2
2
|
import {
|
|
3
|
-
FolderExtendedAttributes,
|
|
4
3
|
FileExtendedAttributesParsed,
|
|
5
|
-
|
|
4
|
+
FolderExtendedAttributes,
|
|
6
5
|
generateFileExtendedAttributes,
|
|
7
|
-
|
|
6
|
+
generateFolderExtendedAttributes,
|
|
8
7
|
parseFileExtendedAttributes,
|
|
8
|
+
parseFolderExtendedAttributes,
|
|
9
9
|
} from './extendedAttributes';
|
|
10
10
|
|
|
11
11
|
describe('extended attrbiutes', () => {
|
|
@@ -1,20 +1,20 @@
|
|
|
1
|
+
import { MemoryCache } from '../../cache';
|
|
2
|
+
import { DriveCrypto } from '../../crypto';
|
|
1
3
|
import {
|
|
2
|
-
ProtonDriveEntitiesCache,
|
|
3
|
-
ProtonDriveCryptoCache,
|
|
4
|
-
ProtonDriveAccount,
|
|
5
4
|
MemberRole,
|
|
6
5
|
NodeType,
|
|
6
|
+
ProtonDriveAccount,
|
|
7
|
+
ProtonDriveCryptoCache,
|
|
8
|
+
ProtonDriveEntitiesCache,
|
|
7
9
|
} from '../../interface';
|
|
8
|
-
import {
|
|
9
|
-
import { MemoryCache } from '../../cache';
|
|
10
|
+
import { getMockLogger } from '../../tests/logger';
|
|
10
11
|
import { getMockTelemetry } from '../../tests/telemetry';
|
|
11
12
|
import { DriveAPIService } from '../apiService';
|
|
12
13
|
import { DriveEventType } from '../events';
|
|
13
14
|
import { makeNodeUid } from '../uids';
|
|
14
|
-
import { SharesService, DecryptedNode } from './interface';
|
|
15
|
-
import { initNodesModule } from './index';
|
|
16
15
|
import { NodesCache } from './cache';
|
|
17
|
-
import {
|
|
16
|
+
import { initNodesModule } from './index';
|
|
17
|
+
import { DecryptedNode, SharesService } from './interface';
|
|
18
18
|
|
|
19
19
|
function generateNode(uid: string, parentUid = 'volumeId~root', params: Partial<DecryptedNode> = {}): DecryptedNode {
|
|
20
20
|
return {
|
|
@@ -1,24 +1,24 @@
|
|
|
1
|
-
import { DriveAPIService } from '../apiService';
|
|
2
1
|
import { DriveCrypto } from '../../crypto';
|
|
3
2
|
import {
|
|
4
|
-
ProtonDriveEntitiesCache,
|
|
5
|
-
ProtonDriveCryptoCache,
|
|
6
3
|
ProtonDriveAccount,
|
|
4
|
+
ProtonDriveCryptoCache,
|
|
5
|
+
ProtonDriveEntitiesCache,
|
|
7
6
|
ProtonDriveTelemetry,
|
|
8
7
|
} from '../../interface';
|
|
8
|
+
import { DriveAPIService } from '../apiService';
|
|
9
9
|
import { NodeAPIService } from './apiService';
|
|
10
10
|
import { NodesCache } from './cache';
|
|
11
11
|
import { NodesCryptoCache } from './cryptoCache';
|
|
12
|
-
import { NodesCryptoService } from './cryptoService';
|
|
13
12
|
import { NodesCryptoReporter } from './cryptoReporter';
|
|
13
|
+
import { NodesCryptoService } from './cryptoService';
|
|
14
|
+
import { NodesEventsHandler } from './events';
|
|
14
15
|
import { SharesService } from './interface';
|
|
15
16
|
import { NodesAccess } from './nodesAccess';
|
|
16
17
|
import { NodesManagement } from './nodesManagement';
|
|
17
18
|
import { NodesRevisons } from './nodesRevisions';
|
|
18
|
-
import { NodesEventsHandler } from './events';
|
|
19
19
|
|
|
20
|
-
export type { DecryptedNode, DecryptedRevision } from './interface';
|
|
21
20
|
export { generateFileExtendedAttributes } from './extendedAttributes';
|
|
21
|
+
export type { DecryptedNode, DecryptedRevision } from './interface';
|
|
22
22
|
|
|
23
23
|
/**
|
|
24
24
|
* Provides facade for the whole nodes module.
|
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
import { PrivateKey, SessionKey } from '../../crypto';
|
|
2
2
|
import {
|
|
3
|
-
|
|
4
|
-
Result,
|
|
5
|
-
InvalidNameError,
|
|
3
|
+
AnonymousUser,
|
|
6
4
|
Author,
|
|
5
|
+
InvalidNameError,
|
|
7
6
|
MemberRole,
|
|
8
|
-
NodeType,
|
|
9
|
-
ThumbnailType,
|
|
10
7
|
MetricVolumeType,
|
|
8
|
+
NodeEntity,
|
|
9
|
+
NodeType,
|
|
10
|
+
Result,
|
|
11
11
|
Revision,
|
|
12
12
|
RevisionState,
|
|
13
|
-
|
|
13
|
+
ThumbnailType,
|
|
14
14
|
} from '../../interface';
|
|
15
15
|
|
|
16
16
|
export type FilterOptions = {
|
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
import { getMockTelemetry } from '../../tests/telemetry';
|
|
2
1
|
import { PrivateKey } from '../../crypto';
|
|
3
2
|
import { DecryptionError, ProtonDriveError } from '../../errors';
|
|
3
|
+
import { NodeType } from '../../interface';
|
|
4
|
+
import { getMockTelemetry } from '../../tests/telemetry';
|
|
4
5
|
import { NodeAPIService } from './apiService';
|
|
5
6
|
import { NodesCache } from './cache';
|
|
6
7
|
import { NodesCryptoCache } from './cryptoCache';
|
|
7
8
|
import { NodesCryptoService } from './cryptoService';
|
|
9
|
+
import { DecryptedNode, DecryptedNodeKeys, DecryptedUnparsedNode, EncryptedNode, SharesService } from './interface';
|
|
8
10
|
import { NodesAccess } from './nodesAccess';
|
|
9
|
-
import { SharesService, DecryptedNode, DecryptedUnparsedNode, EncryptedNode, DecryptedNodeKeys } from './interface';
|
|
10
|
-
import { NodeType } from '../../interface';
|
|
11
11
|
|
|
12
12
|
describe('nodesAccess', () => {
|
|
13
13
|
let apiService: NodeAPIService;
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { c } from 'ttag';
|
|
2
2
|
|
|
3
3
|
import { PrivateKey, SessionKey } from '../../crypto';
|
|
4
|
+
import { DecryptionError, ProtonDriveError } from '../../errors';
|
|
4
5
|
import {
|
|
5
6
|
InvalidNameError,
|
|
6
7
|
Logger,
|
|
@@ -11,10 +12,9 @@ import {
|
|
|
11
12
|
resultError,
|
|
12
13
|
resultOk,
|
|
13
14
|
} from '../../interface';
|
|
14
|
-
import { DecryptionError, ProtonDriveError } from '../../errors';
|
|
15
15
|
import { asyncIteratorMap } from '../asyncIteratorMap';
|
|
16
|
-
import { getErrorMessage } from '../errors';
|
|
17
16
|
import { BatchLoading } from '../batchLoading';
|
|
17
|
+
import { getErrorMessage } from '../errors';
|
|
18
18
|
import { makeNodeUid, splitNodeUid } from '../uids';
|
|
19
19
|
import { NodeAPIServiceBase } from './apiService';
|
|
20
20
|
import { NodesCacheBase } from './cache';
|
|
@@ -23,16 +23,16 @@ import { NodesCryptoService } from './cryptoService';
|
|
|
23
23
|
import { NodesDebouncer } from './debouncer';
|
|
24
24
|
import { parseFileExtendedAttributes, parseFolderExtendedAttributes } from './extendedAttributes';
|
|
25
25
|
import {
|
|
26
|
-
SharesService,
|
|
27
|
-
EncryptedNode,
|
|
28
|
-
DecryptedUnparsedNode,
|
|
29
26
|
DecryptedNode,
|
|
30
27
|
DecryptedNodeKeys,
|
|
28
|
+
DecryptedUnparsedNode,
|
|
29
|
+
EncryptedNode,
|
|
31
30
|
FilterOptions,
|
|
32
31
|
NodeSigningKeys,
|
|
32
|
+
SharesService,
|
|
33
33
|
} from './interface';
|
|
34
|
-
import { validateNodeName } from './validations';
|
|
35
34
|
import { isProtonDocument, isProtonSheet } from './mediaTypes';
|
|
35
|
+
import { validateNodeName } from './validations';
|
|
36
36
|
|
|
37
37
|
// This is the number of nodes that are loaded in parallel.
|
|
38
38
|
// It is a trade-off between initial wait time and overhead of API calls.
|
|
@@ -1,12 +1,12 @@
|
|
|
1
|
+
import { NodeWithSameNameExistsValidationError, ValidationError } from '../../errors';
|
|
2
|
+
import { NodeResult, NodeResultWithError } from '../../interface';
|
|
1
3
|
import { NodeAPIService } from './apiService';
|
|
2
4
|
import { NodesCryptoCache } from './cryptoCache';
|
|
3
5
|
import { NodesCryptoService } from './cryptoService';
|
|
4
|
-
import {
|
|
6
|
+
import { NodeOutOfSyncError } from './errors';
|
|
5
7
|
import { DecryptedNode } from './interface';
|
|
8
|
+
import { NodesAccess } from './nodesAccess';
|
|
6
9
|
import { NodesManagement } from './nodesManagement';
|
|
7
|
-
import { NodeResult, NodeResultWithError } from '../../interface';
|
|
8
|
-
import { NodeOutOfSyncError } from './errors';
|
|
9
|
-
import { NodeWithSameNameExistsValidationError, ValidationError } from '../../errors';
|
|
10
10
|
|
|
11
11
|
describe('NodesManagement', () => {
|
|
12
12
|
let apiService: NodeAPIService;
|
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
import { c } from 'ttag';
|
|
2
2
|
|
|
3
|
+
import { AbortError, ValidationError } from '../../errors';
|
|
3
4
|
import {
|
|
5
|
+
InvalidNameError,
|
|
4
6
|
MemberRole,
|
|
5
|
-
NodeType,
|
|
6
7
|
NodeResult,
|
|
8
|
+
NodeResultWithError,
|
|
7
9
|
NodeResultWithNewUid,
|
|
10
|
+
NodeType,
|
|
8
11
|
resultOk,
|
|
9
|
-
InvalidNameError,
|
|
10
|
-
NodeResultWithError,
|
|
11
12
|
} from '../../interface';
|
|
12
|
-
import { AbortError, ValidationError } from '../../errors';
|
|
13
13
|
import { createErrorFromUnknown, getErrorMessage } from '../errors';
|
|
14
14
|
import { splitNodeUid } from '../uids';
|
|
15
15
|
import { NodeAPIServiceBase } from './apiService';
|
|
@@ -18,9 +18,9 @@ import { NodesCryptoService } from './cryptoService';
|
|
|
18
18
|
import { NodeOutOfSyncError } from './errors';
|
|
19
19
|
import { generateFolderExtendedAttributes } from './extendedAttributes';
|
|
20
20
|
import { DecryptedNode, EncryptedNode } from './interface';
|
|
21
|
-
import { splitExtension, joinNameAndExtension } from './nodeName';
|
|
22
|
-
import { NodesAccessBase } from './nodesAccess';
|
|
23
21
|
import { FOLDER_MEDIA_TYPE } from './mediaTypes';
|
|
22
|
+
import { joinNameAndExtension, splitExtension } from './nodeName';
|
|
23
|
+
import { NodesAccessBase } from './nodesAccess';
|
|
24
24
|
import { validateNodeName } from './validations';
|
|
25
25
|
|
|
26
26
|
const AVAILABLE_NAME_BATCH_SIZE = 10;
|
|
@@ -2,9 +2,9 @@ import { Logger } from '../../interface';
|
|
|
2
2
|
import { makeNodeUidFromRevisionUid } from '../uids';
|
|
3
3
|
import { NodeAPIServiceBase } from './apiService';
|
|
4
4
|
import { NodesCryptoService } from './cryptoService';
|
|
5
|
-
import { NodesAccess } from './nodesAccess';
|
|
6
5
|
import { parseFileExtendedAttributes } from './extendedAttributes';
|
|
7
6
|
import { DecryptedRevision } from './interface';
|
|
7
|
+
import { NodesAccess } from './nodesAccess';
|
|
8
8
|
|
|
9
9
|
/**
|
|
10
10
|
* Provides access to revisions metadata.
|
|
@@ -6,8 +6,8 @@ import { splitNodeUid } from '../uids';
|
|
|
6
6
|
import { AlbumsCryptoService } from './albumsCrypto';
|
|
7
7
|
import { PhotosAPIService } from './apiService';
|
|
8
8
|
import { MissingRelatedPhotosError } from './errors';
|
|
9
|
-
import { PhotoTransferPayloadBuilder, TransferEncryptedPhotoPayload } from './photosTransferPayloadBuilder';
|
|
10
9
|
import { PhotosNodesAccess } from './nodes';
|
|
10
|
+
import { PhotoTransferPayloadBuilder, TransferEncryptedPhotoPayload } from './photosTransferPayloadBuilder';
|
|
11
11
|
|
|
12
12
|
/**
|
|
13
13
|
* The number of photos that are loaded in parallel to prepare the payloads.
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { NodeType } from '../../interface';
|
|
2
1
|
import { ValidationError } from '../../errors';
|
|
2
|
+
import { NodeType } from '../../interface';
|
|
3
3
|
import { getMockTelemetry } from '../../tests/telemetry';
|
|
4
|
-
import { AlbumsManager } from './albumsManager';
|
|
5
4
|
import { AlbumsCryptoService } from './albumsCrypto';
|
|
5
|
+
import { AlbumsManager } from './albumsManager';
|
|
6
6
|
import { PhotosAPIService } from './apiService';
|
|
7
7
|
import { AlbumContainsPhotosNotInTimelineError } from './errors';
|
|
8
8
|
import { DecryptedPhotoNode } from './interface';
|
|
@@ -357,9 +357,10 @@ describe('Albums', () => {
|
|
|
357
357
|
['photo1', 'photo2', 'photo3'],
|
|
358
358
|
undefined,
|
|
359
359
|
);
|
|
360
|
-
expect(nodesService.notifyNodeChanged).toHaveBeenCalledTimes(
|
|
360
|
+
expect(nodesService.notifyNodeChanged).toHaveBeenCalledTimes(3);
|
|
361
361
|
expect(nodesService.notifyNodeChanged).toHaveBeenCalledWith('photo1');
|
|
362
362
|
expect(nodesService.notifyNodeChanged).toHaveBeenCalledWith('photo3');
|
|
363
|
+
expect(nodesService.notifyNodeChanged).toHaveBeenCalledWith('albumNodeUid');
|
|
363
364
|
expect(nodesService.notifyNodeChanged).not.toHaveBeenCalledWith('photo2');
|
|
364
365
|
});
|
|
365
366
|
});
|