@protontech/drive-sdk 0.3.2 → 0.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/interface/nodes.d.ts +4 -0
- package/dist/interface/nodes.js.map +1 -1
- package/dist/internal/apiService/errorCodes.d.ts +1 -0
- package/dist/internal/apiService/errors.d.ts +3 -0
- package/dist/internal/apiService/errors.js +7 -1
- package/dist/internal/apiService/errors.js.map +1 -1
- package/dist/internal/devices/interface.d.ts +1 -1
- package/dist/internal/devices/manager.js +1 -1
- package/dist/internal/devices/manager.js.map +1 -1
- package/dist/internal/devices/manager.test.js +3 -3
- package/dist/internal/devices/manager.test.js.map +1 -1
- package/dist/internal/events/apiService.js +1 -1
- package/dist/internal/events/apiService.js.map +1 -1
- package/dist/internal/events/coreEventManager.js +1 -1
- package/dist/internal/events/coreEventManager.js.map +1 -1
- package/dist/internal/events/coreEventManager.test.js +18 -24
- package/dist/internal/events/coreEventManager.test.js.map +1 -1
- package/dist/internal/events/index.d.ts +3 -4
- package/dist/internal/events/index.js +4 -4
- package/dist/internal/events/index.js.map +1 -1
- package/dist/internal/events/interface.d.ts +3 -0
- package/dist/internal/nodes/apiService.d.ts +12 -3
- package/dist/internal/nodes/apiService.js +54 -13
- package/dist/internal/nodes/apiService.js.map +1 -1
- package/dist/internal/nodes/apiService.test.js +35 -2
- package/dist/internal/nodes/apiService.test.js.map +1 -1
- package/dist/internal/nodes/cache.test.js +1 -0
- package/dist/internal/nodes/cache.test.js.map +1 -1
- package/dist/internal/nodes/cryptoService.d.ts +1 -1
- package/dist/internal/nodes/cryptoService.js +1 -1
- package/dist/internal/nodes/cryptoService.js.map +1 -1
- package/dist/internal/nodes/cryptoService.test.js +4 -4
- package/dist/internal/nodes/cryptoService.test.js.map +1 -1
- package/dist/internal/nodes/errors.d.ts +4 -0
- package/dist/internal/nodes/errors.js +9 -0
- package/dist/internal/nodes/errors.js.map +1 -0
- package/dist/internal/nodes/extendedAttributes.d.ts +2 -2
- package/dist/internal/nodes/extendedAttributes.js +15 -11
- package/dist/internal/nodes/extendedAttributes.js.map +1 -1
- package/dist/internal/nodes/extendedAttributes.test.js +19 -1
- package/dist/internal/nodes/extendedAttributes.test.js.map +1 -1
- package/dist/internal/nodes/index.test.js +2 -1
- package/dist/internal/nodes/index.test.js.map +1 -1
- package/dist/internal/nodes/interface.d.ts +5 -1
- package/dist/internal/nodes/nodesAccess.d.ts +3 -3
- package/dist/internal/nodes/nodesAccess.js +25 -15
- package/dist/internal/nodes/nodesAccess.js.map +1 -1
- package/dist/internal/nodes/nodesAccess.test.js +48 -8
- package/dist/internal/nodes/nodesAccess.test.js.map +1 -1
- package/dist/internal/nodes/nodesManagement.d.ts +2 -0
- package/dist/internal/nodes/nodesManagement.js +87 -9
- package/dist/internal/nodes/nodesManagement.js.map +1 -1
- package/dist/internal/nodes/nodesManagement.test.js +81 -5
- package/dist/internal/nodes/nodesManagement.test.js.map +1 -1
- package/dist/internal/photos/albums.d.ts +9 -7
- package/dist/internal/photos/albums.js +26 -13
- package/dist/internal/photos/albums.js.map +1 -1
- package/dist/internal/photos/apiService.d.ts +34 -3
- package/dist/internal/photos/apiService.js +96 -3
- package/dist/internal/photos/apiService.js.map +1 -1
- package/dist/internal/photos/index.d.ts +31 -4
- package/dist/internal/photos/index.js +57 -7
- package/dist/internal/photos/index.js.map +1 -1
- package/dist/internal/photos/interface.d.ts +25 -1
- package/dist/internal/photos/shares.d.ts +43 -0
- package/dist/internal/photos/shares.js +112 -0
- package/dist/internal/photos/shares.js.map +1 -0
- package/dist/internal/photos/timeline.d.ts +15 -0
- package/dist/internal/photos/timeline.js +22 -0
- package/dist/internal/photos/timeline.js.map +1 -0
- package/dist/internal/photos/upload.d.ts +59 -0
- package/dist/internal/photos/upload.js +104 -0
- package/dist/internal/photos/upload.js.map +1 -0
- package/dist/internal/shares/manager.d.ts +1 -1
- package/dist/internal/shares/manager.js +4 -4
- package/dist/internal/shares/manager.js.map +1 -1
- package/dist/internal/shares/manager.test.js +7 -7
- package/dist/internal/shares/manager.test.js.map +1 -1
- package/dist/internal/sharing/interface.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/sharingPublic/apiService.js +2 -0
- package/dist/internal/sharingPublic/apiService.js.map +1 -1
- package/dist/internal/upload/apiService.d.ts +2 -2
- package/dist/internal/upload/apiService.js +1 -1
- package/dist/internal/upload/apiService.js.map +1 -1
- package/dist/internal/upload/cryptoService.d.ts +2 -2
- package/dist/internal/upload/cryptoService.js.map +1 -1
- package/dist/internal/upload/fileUploader.d.ts +1 -0
- package/dist/internal/upload/fileUploader.js +3 -0
- package/dist/internal/upload/fileUploader.js.map +1 -1
- package/dist/internal/upload/interface.d.ts +3 -0
- package/dist/internal/upload/manager.d.ts +12 -11
- package/dist/internal/upload/manager.js +8 -2
- package/dist/internal/upload/manager.js.map +1 -1
- package/dist/internal/upload/manager.test.js +8 -0
- package/dist/internal/upload/manager.test.js.map +1 -1
- package/dist/internal/upload/streamUploader.d.ts +34 -24
- package/dist/internal/upload/streamUploader.js +7 -4
- package/dist/internal/upload/streamUploader.js.map +1 -1
- package/dist/internal/upload/streamUploader.test.js +1 -1
- package/dist/internal/upload/streamUploader.test.js.map +1 -1
- package/dist/protonDriveClient.d.ts +20 -3
- package/dist/protonDriveClient.js +23 -4
- package/dist/protonDriveClient.js.map +1 -1
- package/dist/protonDrivePhotosClient.d.ts +102 -12
- package/dist/protonDrivePhotosClient.js +149 -29
- package/dist/protonDrivePhotosClient.js.map +1 -1
- package/dist/transformers.d.ts +1 -1
- package/dist/transformers.js +1 -0
- package/dist/transformers.js.map +1 -1
- package/package.json +1 -1
- package/src/interface/nodes.ts +4 -0
- package/src/internal/apiService/errorCodes.ts +1 -0
- package/src/internal/apiService/errors.ts +6 -0
- package/src/internal/devices/interface.ts +1 -1
- package/src/internal/devices/manager.test.ts +3 -3
- package/src/internal/devices/manager.ts +1 -1
- package/src/internal/events/apiService.ts +1 -1
- package/src/internal/events/coreEventManager.test.ts +21 -27
- package/src/internal/events/coreEventManager.ts +1 -1
- package/src/internal/events/index.ts +3 -4
- package/src/internal/events/interface.ts +4 -0
- package/src/internal/nodes/apiService.test.ts +58 -1
- package/src/internal/nodes/apiService.ts +104 -17
- package/src/internal/nodes/cache.test.ts +1 -0
- package/src/internal/nodes/cryptoService.test.ts +8 -8
- package/src/internal/nodes/cryptoService.ts +1 -1
- package/src/internal/nodes/errors.ts +5 -0
- package/src/internal/nodes/extendedAttributes.test.ts +23 -1
- package/src/internal/nodes/extendedAttributes.ts +26 -18
- package/src/internal/nodes/index.test.ts +2 -1
- package/src/internal/nodes/interface.ts +6 -1
- package/src/internal/nodes/nodesAccess.test.ts +68 -8
- package/src/internal/nodes/nodesAccess.ts +42 -15
- package/src/internal/nodes/nodesManagement.test.ts +100 -5
- package/src/internal/nodes/nodesManagement.ts +101 -13
- package/src/internal/photos/albums.ts +31 -12
- package/src/internal/photos/apiService.ts +159 -4
- package/src/internal/photos/index.ts +116 -9
- package/src/internal/photos/interface.ts +23 -1
- package/src/internal/photos/shares.ts +134 -0
- package/src/internal/photos/timeline.ts +24 -0
- package/src/internal/photos/upload.ts +209 -0
- package/src/internal/shares/manager.test.ts +7 -7
- package/src/internal/shares/manager.ts +4 -4
- package/src/internal/sharing/interface.ts +1 -1
- package/src/internal/sharing/sharingAccess.test.ts +1 -1
- package/src/internal/sharing/sharingAccess.ts +1 -1
- package/src/internal/sharingPublic/apiService.ts +2 -0
- package/src/internal/upload/apiService.ts +3 -3
- package/src/internal/upload/cryptoService.ts +2 -2
- package/src/internal/upload/fileUploader.ts +12 -0
- package/src/internal/upload/interface.ts +3 -0
- package/src/internal/upload/manager.test.ts +8 -0
- package/src/internal/upload/manager.ts +20 -10
- package/src/internal/upload/streamUploader.test.ts +17 -12
- package/src/internal/upload/streamUploader.ts +35 -27
- package/src/protonDriveClient.ts +33 -4
- package/src/protonDrivePhotosClient.ts +251 -32
- package/src/transformers.ts +2 -0
- package/dist/internal/photos/cache.d.ts +0 -6
- package/dist/internal/photos/cache.js +0 -15
- package/dist/internal/photos/cache.js.map +0 -1
- package/dist/internal/photos/photosTimeline.d.ts +0 -10
- package/dist/internal/photos/photosTimeline.js +0 -19
- package/dist/internal/photos/photosTimeline.js.map +0 -1
- package/src/internal/photos/cache.ts +0 -11
- package/src/internal/photos/photosTimeline.ts +0 -17
|
@@ -1,47 +1,167 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.ProtonDrivePhotosClient = void 0;
|
|
4
|
-
const
|
|
4
|
+
const config_1 = require("./config");
|
|
5
5
|
const crypto_1 = require("./crypto");
|
|
6
|
-
const
|
|
6
|
+
const telemetry_1 = require("./telemetry");
|
|
7
|
+
const transformers_1 = require("./transformers");
|
|
8
|
+
const apiService_1 = require("./internal/apiService");
|
|
9
|
+
const download_1 = require("./internal/download");
|
|
10
|
+
const events_1 = require("./internal/events");
|
|
7
11
|
const nodes_1 = require("./internal/nodes");
|
|
8
12
|
const photos_1 = require("./internal/photos");
|
|
9
|
-
const events_1 = require("./internal/events");
|
|
10
13
|
const sdkEvents_1 = require("./internal/sdkEvents");
|
|
11
|
-
const
|
|
12
|
-
const
|
|
13
|
-
|
|
14
|
+
const shares_1 = require("./internal/shares");
|
|
15
|
+
const sharing_1 = require("./internal/sharing");
|
|
16
|
+
/**
|
|
17
|
+
* ProtonDrivePhotosClient is the interface to access Photos functionality.
|
|
18
|
+
*
|
|
19
|
+
* The client provides high-level operations for managing photos, albums, sharing,
|
|
20
|
+
* and downloading/uploading photos.
|
|
21
|
+
*
|
|
22
|
+
* @deprecated This is an experimental feature that might change without a warning.
|
|
23
|
+
*/
|
|
14
24
|
class ProtonDrivePhotosClient {
|
|
25
|
+
logger;
|
|
26
|
+
sdkEvents;
|
|
27
|
+
events;
|
|
28
|
+
photoShares;
|
|
15
29
|
nodes;
|
|
30
|
+
sharing;
|
|
31
|
+
download;
|
|
32
|
+
upload;
|
|
16
33
|
photos;
|
|
17
|
-
|
|
34
|
+
experimental;
|
|
35
|
+
constructor({ httpClient, entitiesCache, cryptoCache, account, openPGPCryptoModule, srpModule, config, telemetry, latestEventIdProvider, }) {
|
|
18
36
|
if (!telemetry) {
|
|
19
37
|
telemetry = new telemetry_1.Telemetry();
|
|
20
38
|
}
|
|
39
|
+
this.logger = telemetry.getLogger('interface');
|
|
21
40
|
const fullConfig = (0, config_1.getConfig)(config);
|
|
22
|
-
|
|
41
|
+
this.sdkEvents = new sdkEvents_1.SDKEvents(telemetry);
|
|
23
42
|
const cryptoModule = new crypto_1.DriveCrypto(openPGPCryptoModule, srpModule);
|
|
24
|
-
const apiService = new apiService_1.DriveAPIService(telemetry, sdkEvents, httpClient, fullConfig.baseUrl, fullConfig.language);
|
|
25
|
-
const
|
|
26
|
-
this.
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
this.
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
43
|
+
const apiService = new apiService_1.DriveAPIService(telemetry, this.sdkEvents, httpClient, fullConfig.baseUrl, fullConfig.language);
|
|
44
|
+
const coreShares = (0, shares_1.initSharesModule)(telemetry, apiService, entitiesCache, cryptoCache, account, cryptoModule);
|
|
45
|
+
this.photoShares = (0, photos_1.initPhotoSharesModule)(telemetry, apiService, entitiesCache, cryptoCache, account, cryptoModule, coreShares);
|
|
46
|
+
this.nodes = (0, nodes_1.initNodesModule)(telemetry, apiService, entitiesCache, cryptoCache, account, cryptoModule, this.photoShares);
|
|
47
|
+
this.photos = (0, photos_1.initPhotosModule)(apiService, this.photoShares, this.nodes.access);
|
|
48
|
+
this.sharing = (0, sharing_1.initSharingModule)(telemetry, apiService, entitiesCache, account, cryptoModule, this.photoShares, this.nodes.access);
|
|
49
|
+
this.download = (0, download_1.initDownloadModule)(telemetry, apiService, cryptoModule, account, this.photoShares, this.nodes.access, this.nodes.revisions);
|
|
50
|
+
this.upload = (0, photos_1.initPhotoUploadModule)(telemetry, apiService, cryptoModule, this.photoShares, this.nodes.access, fullConfig.clientUid);
|
|
51
|
+
// These are used to keep the internal cache up to date
|
|
52
|
+
const cacheEventListeners = [
|
|
53
|
+
this.nodes.eventHandler.updateNodesCacheOnEvent.bind(this.nodes.eventHandler),
|
|
54
|
+
this.sharing.eventHandler.handleDriveEvent.bind(this.sharing.eventHandler),
|
|
55
|
+
];
|
|
56
|
+
this.events = new events_1.DriveEventsService(telemetry, apiService, this.photoShares, cacheEventListeners, latestEventIdProvider);
|
|
57
|
+
this.experimental = {
|
|
58
|
+
getNodeUrl: async (nodeUid) => {
|
|
59
|
+
this.logger.debug(`Getting node URL for ${(0, transformers_1.getUid)(nodeUid)}`);
|
|
60
|
+
return this.nodes.access.getNodeUrl((0, transformers_1.getUid)(nodeUid));
|
|
61
|
+
},
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Subscribes to the general SDK events.
|
|
66
|
+
*
|
|
67
|
+
* See `ProtonDriveClient.onMessage` for more information.
|
|
68
|
+
*/
|
|
69
|
+
onMessage(eventName, callback) {
|
|
70
|
+
this.logger.debug(`Subscribing to event ${eventName}`);
|
|
71
|
+
return this.sdkEvents.addListener(eventName, callback);
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Subscribes to the remote data updates for all files in a tree.
|
|
75
|
+
*
|
|
76
|
+
* See `ProtonDriveClient.subscribeToTreeEvents` for more information.
|
|
77
|
+
*/
|
|
78
|
+
async subscribeToTreeEvents(treeEventScopeId, callback) {
|
|
79
|
+
this.logger.debug('Subscribing to node updates');
|
|
80
|
+
return this.events.subscribeToTreeEvents(treeEventScopeId, callback);
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Subscribes to the remote general data updates.
|
|
84
|
+
*
|
|
85
|
+
* See `ProtonDriveClient.subscribeToDriveEvents` for more information.
|
|
86
|
+
*/
|
|
87
|
+
async subscribeToDriveEvents(callback) {
|
|
88
|
+
this.logger.debug('Subscribing to core updates');
|
|
89
|
+
return this.events.subscribeToCoreEvents(callback);
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Iterates all the photos for the timeline view.
|
|
93
|
+
*
|
|
94
|
+
* The output includes only necessary information to quickly prepare
|
|
95
|
+
* the whole timeline view with the break-down per month/year and fast
|
|
96
|
+
* scrollbar.
|
|
97
|
+
*
|
|
98
|
+
* Individual photos details must be loaded separately based on what
|
|
99
|
+
* is visible in the UI.
|
|
100
|
+
*
|
|
101
|
+
* The output is sorted by the capture time, starting from the
|
|
102
|
+
* the most recent photos.
|
|
103
|
+
*/
|
|
104
|
+
async *iterateTimeline(signal) {
|
|
105
|
+
// TODO: expose better type
|
|
106
|
+
yield* this.photos.timeline.iterateTimeline(signal);
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Iterates the nodes by their UIDs.
|
|
110
|
+
*
|
|
111
|
+
* See `ProtonDriveClient.iterateNodes` for more information.
|
|
112
|
+
*/
|
|
113
|
+
async *iterateNodes(nodeUids, signal) {
|
|
114
|
+
this.logger.info(`Iterating ${nodeUids.length} nodes`);
|
|
115
|
+
// TODO: expose photo type
|
|
116
|
+
yield* (0, transformers_1.convertInternalMissingNodeIterator)(this.nodes.access.iterateNodes((0, transformers_1.getUids)(nodeUids), signal));
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Get the node by its UID.
|
|
120
|
+
*
|
|
121
|
+
* See `ProtonDriveClient.getNode` for more information.
|
|
122
|
+
*/
|
|
123
|
+
async getNode(nodeUid) {
|
|
124
|
+
this.logger.info(`Getting node ${(0, transformers_1.getUid)(nodeUid)}`);
|
|
125
|
+
return (0, transformers_1.convertInternalNodePromise)(this.nodes.access.getNode((0, transformers_1.getUid)(nodeUid)));
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Iterates the albums.
|
|
129
|
+
*
|
|
130
|
+
* The output is not sorted and the order of the nodes is not guaranteed.
|
|
131
|
+
*/
|
|
132
|
+
async *iterateAlbums(signal) {
|
|
133
|
+
this.logger.info('Iterating albums');
|
|
134
|
+
// TODO: expose album type
|
|
135
|
+
yield* (0, transformers_1.convertInternalNodeIterator)(this.photos.albums.iterateAlbums(signal));
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Get the file downloader to download the node content.
|
|
139
|
+
*
|
|
140
|
+
* See `ProtonDriveClient.getFileDownloader` for more information.
|
|
141
|
+
*/
|
|
142
|
+
async getFileDownloader(nodeUid, signal) {
|
|
143
|
+
this.logger.info(`Getting file downloader for ${(0, transformers_1.getUid)(nodeUid)}`);
|
|
144
|
+
return this.download.getFileDownloader((0, transformers_1.getUid)(nodeUid), signal);
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Iterates the thumbnails of the given nodes.
|
|
148
|
+
*
|
|
149
|
+
* See `ProtonDriveClient.iterateThumbnails` for more information.
|
|
150
|
+
*/
|
|
151
|
+
async *iterateThumbnails(nodeUids, thumbnailType, signal) {
|
|
152
|
+
this.logger.info(`Iterating ${nodeUids.length} thumbnails`);
|
|
153
|
+
yield* this.download.iterateThumbnails((0, transformers_1.getUids)(nodeUids), thumbnailType, signal);
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Get the file uploader to upload a new file.
|
|
157
|
+
*
|
|
158
|
+
* See `ProtonDriveClient.getFileUploader` for more information.
|
|
159
|
+
*/
|
|
160
|
+
async getFileUploader(name, metadata, signal) {
|
|
161
|
+
this.logger.info(`Getting file uploader`);
|
|
162
|
+
const parentFolderUid = await this.nodes.access.getVolumeRootFolder();
|
|
163
|
+
return this.upload.getFileUploader((0, transformers_1.getUid)(parentFolderUid), name, metadata, signal);
|
|
164
|
+
}
|
|
45
165
|
}
|
|
46
166
|
exports.ProtonDrivePhotosClient = ProtonDrivePhotosClient;
|
|
47
167
|
//# sourceMappingURL=protonDrivePhotosClient.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"protonDrivePhotosClient.js","sourceRoot":"","sources":["../src/protonDrivePhotosClient.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"protonDrivePhotosClient.js","sourceRoot":"","sources":["../src/protonDrivePhotosClient.ts"],"names":[],"mappings":"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"}
|
package/dist/transformers.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { MaybeNode as PublicMaybeNode, MaybeMissingNode as PublicMaybeMissingNode, Result, MissingNode } from './interface';
|
|
2
2
|
import { DecryptedNode as InternalNode } from './internal/nodes';
|
|
3
|
-
type InternalPartialNode = Pick<InternalNode, 'uid' | 'parentUid' | 'name' | 'keyAuthor' | 'nameAuthor' | 'directRole' | 'membership' | 'type' | 'mediaType' | 'isShared' | 'creationTime' | 'trashTime' | 'activeRevision' | 'folder' | 'totalStorageSize' | 'errors' | 'shareId' | 'treeEventScopeId'>;
|
|
3
|
+
type InternalPartialNode = Pick<InternalNode, 'uid' | 'parentUid' | 'name' | 'keyAuthor' | 'nameAuthor' | 'directRole' | 'membership' | 'type' | 'mediaType' | 'isShared' | 'isSharedPublicly' | 'creationTime' | 'trashTime' | 'activeRevision' | 'folder' | 'totalStorageSize' | 'errors' | 'shareId' | 'treeEventScopeId'>;
|
|
4
4
|
type NodeUid = string | {
|
|
5
5
|
uid: string;
|
|
6
6
|
} | Result<{
|
package/dist/transformers.js
CHANGED
|
@@ -54,6 +54,7 @@ function convertInternalNode(node) {
|
|
|
54
54
|
type: node.type,
|
|
55
55
|
mediaType: node.mediaType,
|
|
56
56
|
isShared: node.isShared,
|
|
57
|
+
isSharedPublicly: node.isSharedPublicly,
|
|
57
58
|
creationTime: node.creationTime,
|
|
58
59
|
trashTime: node.trashTime,
|
|
59
60
|
totalStorageSize: node.totalStorageSize,
|
package/dist/transformers.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transformers.js","sourceRoot":"","sources":["../src/transformers.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"transformers.js","sourceRoot":"","sources":["../src/transformers.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/src/interface/nodes.ts
CHANGED
|
@@ -75,6 +75,10 @@ export type NodeEntity = {
|
|
|
75
75
|
* one user, or via public link.
|
|
76
76
|
*/
|
|
77
77
|
isShared: boolean;
|
|
78
|
+
/**
|
|
79
|
+
* Whether the node is publicly shared. If true, the node is shared via public link.
|
|
80
|
+
*/
|
|
81
|
+
isSharedPublicly: boolean;
|
|
78
82
|
/**
|
|
79
83
|
* Provides the ID of the share that the node is shared with.
|
|
80
84
|
*
|
|
@@ -57,6 +57,8 @@ export function apiErrorFactory({
|
|
|
57
57
|
// Here we convert only general enough codes. Specific cases that are
|
|
58
58
|
// not clear from the code itself must be handled by each module
|
|
59
59
|
// separately.
|
|
60
|
+
case ErrorCode.INVALID_REQUIREMENTS:
|
|
61
|
+
return new InvalidRequirementsAPIError(message, code, details);
|
|
60
62
|
case ErrorCode.INVALID_VALUE:
|
|
61
63
|
case ErrorCode.NOT_ENOUGH_PERMISSIONS:
|
|
62
64
|
case ErrorCode.NOT_ENOUGH_PERMISSIONS_TO_GRANT_PERMISSIONS:
|
|
@@ -108,3 +110,7 @@ export class APICodeError extends ServerError {
|
|
|
108
110
|
export class NotFoundAPIError extends ValidationError {
|
|
109
111
|
name = 'NotFoundAPIError';
|
|
110
112
|
}
|
|
113
|
+
|
|
114
|
+
export class InvalidRequirementsAPIError extends ValidationError {
|
|
115
|
+
name = 'InvalidRequirementsAPIError';
|
|
116
|
+
}
|
|
@@ -13,7 +13,7 @@ export type DeviceMetadata = {
|
|
|
13
13
|
};
|
|
14
14
|
|
|
15
15
|
export interface SharesService {
|
|
16
|
-
|
|
16
|
+
getOwnVolumeIDs(): Promise<{ volumeId: string }>;
|
|
17
17
|
getMyFilesShareMemberEmailKey(): Promise<{
|
|
18
18
|
addressId: string;
|
|
19
19
|
email: string;
|
|
@@ -30,7 +30,7 @@ describe('DevicesManager', () => {
|
|
|
30
30
|
};
|
|
31
31
|
// @ts-expect-error No need to implement all methods for mocking
|
|
32
32
|
sharesService = {
|
|
33
|
-
|
|
33
|
+
getOwnVolumeIDs: jest.fn(),
|
|
34
34
|
};
|
|
35
35
|
// @ts-expect-error No need to implement all methods for mocking
|
|
36
36
|
nodesService = {};
|
|
@@ -74,13 +74,13 @@ describe('DevicesManager', () => {
|
|
|
74
74
|
shareId: 'shareid',
|
|
75
75
|
} as DeviceMetadata;
|
|
76
76
|
|
|
77
|
-
sharesService.
|
|
77
|
+
sharesService.getOwnVolumeIDs.mockResolvedValue({ volumeId });
|
|
78
78
|
cryptoService.createDevice.mockResolvedValue({ address, shareKey, node });
|
|
79
79
|
apiService.createDevice.mockResolvedValue(createdDevice);
|
|
80
80
|
|
|
81
81
|
const result = await manager.createDevice(name, deviceType);
|
|
82
82
|
|
|
83
|
-
expect(sharesService.
|
|
83
|
+
expect(sharesService.getOwnVolumeIDs).toHaveBeenCalled();
|
|
84
84
|
expect(cryptoService.createDevice).toHaveBeenCalledWith(name);
|
|
85
85
|
expect(apiService.createDevice).toHaveBeenCalledWith(
|
|
86
86
|
{ volumeId, type: deviceType },
|
|
@@ -47,7 +47,7 @@ export class DevicesManager {
|
|
|
47
47
|
}
|
|
48
48
|
|
|
49
49
|
async createDevice(name: string, deviceType: DeviceType): Promise<Device> {
|
|
50
|
-
const { volumeId } = await this.sharesService.
|
|
50
|
+
const { volumeId } = await this.sharesService.getOwnVolumeIDs();
|
|
51
51
|
const { address, shareKey, node } = await this.cryptoService.createDevice(name);
|
|
52
52
|
|
|
53
53
|
const device = await this.apiService.createDevice(
|
|
@@ -46,29 +46,6 @@ describe('CoreEventManager', () => {
|
|
|
46
46
|
const eventId = 'event1';
|
|
47
47
|
const latestEventId = 'event2';
|
|
48
48
|
|
|
49
|
-
it('should yield ShareWithMeUpdated event when refresh is true', async () => {
|
|
50
|
-
const mockEvents: DriveEventsListWithStatus = {
|
|
51
|
-
latestEventId,
|
|
52
|
-
more: false,
|
|
53
|
-
refresh: true,
|
|
54
|
-
events: [],
|
|
55
|
-
};
|
|
56
|
-
mockApiService.getCoreEvents.mockResolvedValue(mockEvents);
|
|
57
|
-
|
|
58
|
-
const events = [];
|
|
59
|
-
for await (const event of coreEventManager.getEvents(eventId)) {
|
|
60
|
-
events.push(event);
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
expect(events).toHaveLength(1);
|
|
64
|
-
expect(events[0]).toEqual({
|
|
65
|
-
type: DriveEventType.SharedWithMeUpdated,
|
|
66
|
-
treeEventScopeId: 'core',
|
|
67
|
-
eventId: latestEventId,
|
|
68
|
-
});
|
|
69
|
-
expect(mockApiService.getCoreEvents).toHaveBeenCalledWith(eventId);
|
|
70
|
-
});
|
|
71
|
-
|
|
72
49
|
it('should yield all events when there are actual events', async () => {
|
|
73
50
|
const mockEvent1: DriveEvent = {
|
|
74
51
|
type: DriveEventType.SharedWithMeUpdated,
|
|
@@ -88,14 +65,31 @@ describe('CoreEventManager', () => {
|
|
|
88
65
|
};
|
|
89
66
|
mockApiService.getCoreEvents.mockResolvedValue(mockEvents);
|
|
90
67
|
|
|
91
|
-
const events =
|
|
92
|
-
for await (const event of coreEventManager.getEvents(eventId)) {
|
|
93
|
-
events.push(event);
|
|
94
|
-
}
|
|
68
|
+
const events = await Array.fromAsync(coreEventManager.getEvents(eventId));
|
|
95
69
|
|
|
96
70
|
expect(events).toHaveLength(2);
|
|
97
71
|
expect(events[0]).toEqual(mockEvent1);
|
|
98
72
|
expect(events[1]).toEqual(mockEvent2);
|
|
99
73
|
});
|
|
74
|
+
|
|
75
|
+
it('should yield FastForward event there are no events but lastEventId changed', async () => {
|
|
76
|
+
const mockEvents: DriveEventsListWithStatus = {
|
|
77
|
+
latestEventId,
|
|
78
|
+
more: false,
|
|
79
|
+
refresh: false,
|
|
80
|
+
events: [],
|
|
81
|
+
};
|
|
82
|
+
mockApiService.getCoreEvents.mockResolvedValue(mockEvents);
|
|
83
|
+
|
|
84
|
+
const events = await Array.fromAsync(coreEventManager.getEvents(eventId));
|
|
85
|
+
|
|
86
|
+
expect(events).toHaveLength(1);
|
|
87
|
+
expect(events[0]).toEqual({
|
|
88
|
+
type: DriveEventType.FastForward,
|
|
89
|
+
treeEventScopeId: 'core',
|
|
90
|
+
eventId: latestEventId,
|
|
91
|
+
});
|
|
92
|
+
expect(mockApiService.getCoreEvents).toHaveBeenCalledWith(eventId);
|
|
93
|
+
});
|
|
100
94
|
});
|
|
101
95
|
});
|
|
@@ -32,7 +32,7 @@ export class CoreEventManager implements EventManagerInterface<DriveEvent> {
|
|
|
32
32
|
const events = await this.apiService.getCoreEvents(eventId);
|
|
33
33
|
if (events.events.length === 0 && events.latestEventId !== eventId) {
|
|
34
34
|
yield {
|
|
35
|
-
type: DriveEventType.
|
|
35
|
+
type: DriveEventType.FastForward,
|
|
36
36
|
treeEventScopeId: 'core',
|
|
37
37
|
eventId: events.latestEventId,
|
|
38
38
|
};
|
|
@@ -1,11 +1,10 @@
|
|
|
1
1
|
import { Logger, ProtonDriveTelemetry } from '../../interface';
|
|
2
2
|
import { DriveAPIService } from '../apiService';
|
|
3
|
-
import { DriveEvent, DriveListener, EventSubscription, LatestEventIdProvider } from './interface';
|
|
3
|
+
import { DriveEvent, DriveListener, EventSubscription, LatestEventIdProvider, SharesService } from './interface';
|
|
4
4
|
import { EventsAPIService } from './apiService';
|
|
5
5
|
import { CoreEventManager } from './coreEventManager';
|
|
6
6
|
import { VolumeEventManager } from './volumeEventManager';
|
|
7
7
|
import { EventManager } from './eventManager';
|
|
8
|
-
import { SharesManager } from '../shares/manager';
|
|
9
8
|
|
|
10
9
|
export type { DriveEvent, DriveListener, EventSubscription } from './interface';
|
|
11
10
|
export { DriveEventType } from './interface';
|
|
@@ -28,7 +27,7 @@ export class DriveEventsService {
|
|
|
28
27
|
constructor(
|
|
29
28
|
private telemetry: ProtonDriveTelemetry,
|
|
30
29
|
apiService: DriveAPIService,
|
|
31
|
-
private
|
|
30
|
+
private sharesService: SharesService,
|
|
32
31
|
private cacheEventListeners: DriveListener[] = [],
|
|
33
32
|
private latestEventIdProvider?: LatestEventIdProvider,
|
|
34
33
|
) {
|
|
@@ -104,7 +103,7 @@ export class DriveEventsService {
|
|
|
104
103
|
this.logger.debug(`Creating volume event manager for volume ${volumeId}`);
|
|
105
104
|
const volumeEventManager = new VolumeEventManager(this.logger, this.apiService, volumeId);
|
|
106
105
|
|
|
107
|
-
const isOwnVolume = await this.
|
|
106
|
+
const isOwnVolume = await this.sharesService.isOwnVolume(volumeId);
|
|
108
107
|
const pollingInterval = this.getDefaultVolumePollingInterval(isOwnVolume);
|
|
109
108
|
const latestEventId = this.latestEventIdProvider.getLatestEventId(volumeId);
|
|
110
109
|
const eventManager = new EventManager<DriveEvent>(volumeEventManager, pollingInterval, latestEventId);
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { MemberRole, NodeType } from '../../interface';
|
|
2
2
|
import { getMockLogger } from '../../tests/logger';
|
|
3
|
-
import { DriveAPIService, ErrorCode } from '../apiService';
|
|
3
|
+
import { DriveAPIService, ErrorCode, InvalidRequirementsAPIError } from '../apiService';
|
|
4
4
|
import { NodeAPIService } from './apiService';
|
|
5
|
+
import { NodeOutOfSyncError } from './errors';
|
|
5
6
|
|
|
6
7
|
function generateAPIFileNode(linkOverrides = {}, overrides = {}) {
|
|
7
8
|
const node = generateAPINode();
|
|
@@ -142,6 +143,7 @@ function generateNode() {
|
|
|
142
143
|
|
|
143
144
|
shareId: undefined,
|
|
144
145
|
isShared: false,
|
|
146
|
+
isSharedPublicly: false,
|
|
145
147
|
directRole: MemberRole.Admin,
|
|
146
148
|
membership: undefined,
|
|
147
149
|
|
|
@@ -254,6 +256,7 @@ describe('nodeAPIService', () => {
|
|
|
254
256
|
generateFolderNode(
|
|
255
257
|
{
|
|
256
258
|
isShared: true,
|
|
259
|
+
isSharedPublicly: false,
|
|
257
260
|
shareId: 'shareId',
|
|
258
261
|
directRole: MemberRole.Admin,
|
|
259
262
|
membership: {
|
|
@@ -295,6 +298,7 @@ describe('nodeAPIService', () => {
|
|
|
295
298
|
generateFolderNode(
|
|
296
299
|
{
|
|
297
300
|
isShared: true,
|
|
301
|
+
isSharedPublicly: false,
|
|
298
302
|
shareId: 'shareId',
|
|
299
303
|
directRole: MemberRole.Viewer,
|
|
300
304
|
membership: {
|
|
@@ -316,6 +320,26 @@ describe('nodeAPIService', () => {
|
|
|
316
320
|
);
|
|
317
321
|
});
|
|
318
322
|
|
|
323
|
+
it('should get publicly shared node', async () => {
|
|
324
|
+
await testIterateNodes(
|
|
325
|
+
generateAPIFolderNode(
|
|
326
|
+
{},
|
|
327
|
+
{
|
|
328
|
+
Sharing: {
|
|
329
|
+
ShareID: 'shareId',
|
|
330
|
+
ShareURLID: 'shareUrlId',
|
|
331
|
+
},
|
|
332
|
+
},
|
|
333
|
+
),
|
|
334
|
+
generateFolderNode({
|
|
335
|
+
isShared: true,
|
|
336
|
+
isSharedPublicly: true,
|
|
337
|
+
shareId: 'shareId',
|
|
338
|
+
directRole: MemberRole.Admin,
|
|
339
|
+
}),
|
|
340
|
+
);
|
|
341
|
+
});
|
|
342
|
+
|
|
319
343
|
it('should get trashed file node', async () => {
|
|
320
344
|
await testIterateNodes(
|
|
321
345
|
generateAPIFileNode({
|
|
@@ -542,4 +566,37 @@ describe('nodeAPIService', () => {
|
|
|
542
566
|
}
|
|
543
567
|
});
|
|
544
568
|
});
|
|
569
|
+
|
|
570
|
+
describe('renameNode', () => {
|
|
571
|
+
it('should rename node', async () => {
|
|
572
|
+
await api.renameNode(
|
|
573
|
+
'volumeId~nodeId1',
|
|
574
|
+
{ hash: 'originalHash' },
|
|
575
|
+
{ encryptedName: 'encryptedName1', nameSignatureEmail: 'nameSignatureEmail1', hash: 'newHash' },
|
|
576
|
+
);
|
|
577
|
+
|
|
578
|
+
expect(apiMock.put).toHaveBeenCalledWith(
|
|
579
|
+
'drive/v2/volumes/volumeId/links/nodeId1/rename',
|
|
580
|
+
{
|
|
581
|
+
Name: 'encryptedName1',
|
|
582
|
+
NameSignatureEmail: 'nameSignatureEmail1',
|
|
583
|
+
Hash: 'newHash',
|
|
584
|
+
OriginalHash: 'originalHash',
|
|
585
|
+
},
|
|
586
|
+
undefined,
|
|
587
|
+
);
|
|
588
|
+
});
|
|
589
|
+
|
|
590
|
+
it('should throw error if node is out of sync', async () => {
|
|
591
|
+
apiMock.put = jest.fn().mockRejectedValue(new InvalidRequirementsAPIError('Node is out of sync'));
|
|
592
|
+
|
|
593
|
+
await expect(
|
|
594
|
+
api.renameNode(
|
|
595
|
+
'volumeId~nodeId1',
|
|
596
|
+
{ hash: 'originalHash' },
|
|
597
|
+
{ encryptedName: 'encryptedName1', nameSignatureEmail: 'nameSignatureEmail1', hash: 'newHash' },
|
|
598
|
+
),
|
|
599
|
+
).rejects.toThrow(new NodeOutOfSyncError('Node is out of sync'));
|
|
600
|
+
});
|
|
601
|
+
});
|
|
545
602
|
});
|