@protontech/drive-sdk 0.4.0 → 0.5.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/dist/diagnostic/sdkDiagnostic.js +1 -1
- package/dist/diagnostic/sdkDiagnostic.js.map +1 -1
- package/dist/interface/download.d.ts +4 -4
- package/dist/interface/nodes.d.ts +4 -0
- package/dist/interface/nodes.js.map +1 -1
- package/dist/interface/upload.d.ts +6 -3
- package/dist/internal/apiService/apiService.d.ts +3 -0
- package/dist/internal/apiService/apiService.js +25 -2
- package/dist/internal/apiService/apiService.js.map +1 -1
- package/dist/internal/apiService/apiService.test.js +38 -0
- package/dist/internal/apiService/apiService.test.js.map +1 -1
- package/dist/internal/apiService/driveTypes.d.ts +31 -48
- package/dist/internal/apiService/errors.js +3 -0
- package/dist/internal/apiService/errors.js.map +1 -1
- package/dist/internal/apiService/errors.test.js +15 -7
- package/dist/internal/apiService/errors.test.js.map +1 -1
- package/dist/internal/asyncIteratorMap.d.ts +1 -1
- package/dist/internal/asyncIteratorMap.js +6 -1
- package/dist/internal/asyncIteratorMap.js.map +1 -1
- package/dist/internal/asyncIteratorMap.test.js +9 -0
- package/dist/internal/asyncIteratorMap.test.js.map +1 -1
- package/dist/internal/download/fileDownloader.d.ts +3 -3
- package/dist/internal/download/fileDownloader.js +5 -5
- package/dist/internal/download/fileDownloader.js.map +1 -1
- package/dist/internal/download/fileDownloader.test.js +8 -8
- package/dist/internal/download/fileDownloader.test.js.map +1 -1
- package/dist/internal/nodes/apiService.d.ts +6 -1
- package/dist/internal/nodes/apiService.js +45 -32
- package/dist/internal/nodes/apiService.js.map +1 -1
- package/dist/internal/nodes/apiService.test.js +164 -17
- 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/debouncer.d.ts +23 -0
- package/dist/internal/nodes/debouncer.js +80 -0
- package/dist/internal/nodes/debouncer.js.map +1 -0
- package/dist/internal/nodes/debouncer.test.d.ts +1 -0
- package/dist/internal/nodes/debouncer.test.js +100 -0
- package/dist/internal/nodes/debouncer.test.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 +1 -0
- package/dist/internal/nodes/index.test.js.map +1 -1
- package/dist/internal/nodes/interface.d.ts +1 -0
- package/dist/internal/nodes/nodesAccess.d.ts +2 -1
- package/dist/internal/nodes/nodesAccess.js +24 -5
- 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.js +1 -0
- package/dist/internal/nodes/nodesManagement.js.map +1 -1
- package/dist/internal/photos/index.d.ts +11 -0
- package/dist/internal/photos/index.js +27 -0
- package/dist/internal/photos/index.js.map +1 -1
- package/dist/internal/photos/upload.d.ts +60 -0
- package/dist/internal/photos/upload.js +104 -0
- package/dist/internal/photos/upload.js.map +1 -0
- package/dist/internal/sharingPublic/apiService.d.ts +2 -2
- package/dist/internal/sharingPublic/apiService.js +2 -62
- package/dist/internal/sharingPublic/apiService.js.map +1 -1
- package/dist/internal/sharingPublic/cryptoCache.d.ts +0 -4
- package/dist/internal/sharingPublic/cryptoCache.js +0 -28
- package/dist/internal/sharingPublic/cryptoCache.js.map +1 -1
- package/dist/internal/sharingPublic/cryptoReporter.d.ts +16 -0
- package/dist/internal/sharingPublic/cryptoReporter.js +44 -0
- package/dist/internal/sharingPublic/cryptoReporter.js.map +1 -0
- package/dist/internal/sharingPublic/cryptoService.d.ts +3 -4
- package/dist/internal/sharingPublic/cryptoService.js +5 -43
- package/dist/internal/sharingPublic/cryptoService.js.map +1 -1
- package/dist/internal/sharingPublic/index.d.ts +21 -3
- package/dist/internal/sharingPublic/index.js +43 -12
- package/dist/internal/sharingPublic/index.js.map +1 -1
- package/dist/internal/sharingPublic/interface.d.ts +0 -1
- package/dist/internal/sharingPublic/nodes.d.ts +13 -0
- package/dist/internal/sharingPublic/nodes.js +28 -0
- package/dist/internal/sharingPublic/nodes.js.map +1 -0
- package/dist/internal/sharingPublic/session/session.d.ts +3 -3
- package/dist/internal/sharingPublic/session/url.test.js +3 -3
- package/dist/internal/sharingPublic/shares.d.ts +34 -0
- package/dist/internal/sharingPublic/shares.js +69 -0
- package/dist/internal/sharingPublic/shares.js.map +1 -0
- package/dist/internal/upload/apiService.d.ts +2 -2
- package/dist/internal/upload/apiService.js +11 -2
- package/dist/internal/upload/apiService.js.map +1 -1
- package/dist/internal/upload/controller.d.ts +8 -2
- package/dist/internal/upload/controller.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 +7 -3
- package/dist/internal/upload/fileUploader.js +6 -3
- package/dist/internal/upload/fileUploader.js.map +1 -1
- package/dist/internal/upload/fileUploader.test.js +23 -11
- package/dist/internal/upload/fileUploader.test.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 +40 -26
- package/dist/internal/upload/streamUploader.js +15 -8
- package/dist/internal/upload/streamUploader.js.map +1 -1
- package/dist/internal/upload/streamUploader.test.js +11 -7
- package/dist/internal/upload/streamUploader.test.js.map +1 -1
- package/dist/protonDriveClient.d.ts +3 -3
- package/dist/protonDriveClient.js +4 -4
- package/dist/protonDriveClient.js.map +1 -1
- package/dist/protonDrivePhotosClient.d.ts +18 -2
- package/dist/protonDrivePhotosClient.js +19 -2
- package/dist/protonDrivePhotosClient.js.map +1 -1
- package/dist/protonDrivePublicLinkClient.d.ts +31 -4
- package/dist/protonDrivePublicLinkClient.js +52 -9
- package/dist/protonDrivePublicLinkClient.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/diagnostic/sdkDiagnostic.ts +1 -1
- package/src/interface/download.ts +4 -4
- package/src/interface/nodes.ts +4 -0
- package/src/interface/upload.ts +3 -3
- package/src/internal/apiService/apiService.test.ts +50 -0
- package/src/internal/apiService/apiService.ts +33 -2
- package/src/internal/apiService/driveTypes.ts +31 -48
- package/src/internal/apiService/errors.test.ts +10 -0
- package/src/internal/apiService/errors.ts +5 -1
- package/src/internal/asyncIteratorMap.test.ts +12 -0
- package/src/internal/asyncIteratorMap.ts +8 -0
- package/src/internal/download/fileDownloader.test.ts +8 -8
- package/src/internal/download/fileDownloader.ts +5 -5
- package/src/internal/nodes/apiService.test.ts +222 -16
- package/src/internal/nodes/apiService.ts +63 -49
- package/src/internal/nodes/cache.test.ts +1 -0
- package/src/internal/nodes/debouncer.test.ts +129 -0
- package/src/internal/nodes/debouncer.ts +93 -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 +1 -0
- package/src/internal/nodes/interface.ts +1 -0
- package/src/internal/nodes/nodesAccess.test.ts +2 -2
- package/src/internal/nodes/nodesAccess.ts +30 -5
- package/src/internal/nodes/nodesManagement.ts +1 -0
- package/src/internal/photos/index.ts +62 -0
- package/src/internal/photos/upload.ts +212 -0
- package/src/internal/sharingPublic/apiService.ts +5 -86
- package/src/internal/sharingPublic/cryptoCache.ts +0 -34
- package/src/internal/sharingPublic/cryptoReporter.ts +73 -0
- package/src/internal/sharingPublic/cryptoService.ts +4 -80
- package/src/internal/sharingPublic/index.ts +68 -6
- package/src/internal/sharingPublic/interface.ts +0 -9
- package/src/internal/sharingPublic/nodes.ts +37 -0
- package/src/internal/sharingPublic/session/apiService.ts +1 -1
- package/src/internal/sharingPublic/session/session.ts +3 -3
- package/src/internal/sharingPublic/session/url.test.ts +3 -3
- package/src/internal/sharingPublic/shares.ts +86 -0
- package/src/internal/upload/apiService.ts +15 -4
- package/src/internal/upload/controller.ts +2 -2
- package/src/internal/upload/cryptoService.ts +2 -2
- package/src/internal/upload/fileUploader.test.ts +25 -11
- package/src/internal/upload/fileUploader.ts +16 -3
- 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 +32 -15
- package/src/internal/upload/streamUploader.ts +43 -30
- package/src/protonDriveClient.ts +4 -4
- package/src/protonDrivePhotosClient.ts +46 -6
- package/src/protonDrivePublicLinkClient.ts +93 -12
- package/src/transformers.ts +2 -0
- package/dist/internal/sharingPublic/manager.d.ts +0 -19
- package/dist/internal/sharingPublic/manager.js +0 -81
- package/dist/internal/sharingPublic/manager.js.map +0 -1
- package/src/internal/sharingPublic/manager.ts +0 -86
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { MemoryCache } from './cache';
|
|
1
2
|
import { getConfig } from './config';
|
|
2
3
|
import { DriveCrypto, OpenPGPCrypto, SRPModule, SessionKey } from './crypto';
|
|
3
4
|
import {
|
|
@@ -5,14 +6,26 @@ import {
|
|
|
5
6
|
ProtonDriveTelemetry,
|
|
6
7
|
ProtonDriveConfig,
|
|
7
8
|
Logger,
|
|
8
|
-
ProtonDriveCryptoCache,
|
|
9
9
|
NodeOrUid,
|
|
10
10
|
ProtonDriveAccount,
|
|
11
11
|
MaybeNode,
|
|
12
|
+
NodeType,
|
|
13
|
+
CachedCryptoMaterial,
|
|
14
|
+
MaybeMissingNode,
|
|
15
|
+
FileDownloader,
|
|
16
|
+
ThumbnailType,
|
|
17
|
+
ThumbnailResult,
|
|
12
18
|
} from './interface';
|
|
13
19
|
import { Telemetry } from './telemetry';
|
|
14
|
-
import {
|
|
20
|
+
import {
|
|
21
|
+
getUid,
|
|
22
|
+
convertInternalNodePromise,
|
|
23
|
+
convertInternalNodeIterator,
|
|
24
|
+
convertInternalMissingNodeIterator,
|
|
25
|
+
getUids,
|
|
26
|
+
} from './transformers';
|
|
15
27
|
import { DriveAPIService } from './internal/apiService';
|
|
28
|
+
import { initDownloadModule } from './internal/download';
|
|
16
29
|
import { SDKEvents } from './internal/sdkEvents';
|
|
17
30
|
import { initSharingPublicModule } from './internal/sharingPublic';
|
|
18
31
|
|
|
@@ -33,6 +46,7 @@ export class ProtonDrivePublicLinkClient {
|
|
|
33
46
|
private logger: Logger;
|
|
34
47
|
private sdkEvents: SDKEvents;
|
|
35
48
|
private sharingPublic: ReturnType<typeof initSharingPublicModule>;
|
|
49
|
+
private download: ReturnType<typeof initDownloadModule>;
|
|
36
50
|
|
|
37
51
|
public experimental: {
|
|
38
52
|
/**
|
|
@@ -53,22 +67,22 @@ export class ProtonDrivePublicLinkClient {
|
|
|
53
67
|
|
|
54
68
|
constructor({
|
|
55
69
|
httpClient,
|
|
56
|
-
cryptoCache,
|
|
57
70
|
account,
|
|
58
71
|
openPGPCryptoModule,
|
|
59
72
|
srpModule,
|
|
60
73
|
config,
|
|
61
74
|
telemetry,
|
|
75
|
+
url,
|
|
62
76
|
token,
|
|
63
77
|
password,
|
|
64
78
|
}: {
|
|
65
79
|
httpClient: ProtonDriveHTTPClient;
|
|
66
|
-
cryptoCache: ProtonDriveCryptoCache;
|
|
67
80
|
account: ProtonDriveAccount;
|
|
68
81
|
openPGPCryptoModule: OpenPGPCrypto;
|
|
69
82
|
srpModule: SRPModule;
|
|
70
83
|
config?: ProtonDriveConfig;
|
|
71
84
|
telemetry?: ProtonDriveTelemetry;
|
|
85
|
+
url: string;
|
|
72
86
|
token: string;
|
|
73
87
|
password: string;
|
|
74
88
|
}) {
|
|
@@ -77,6 +91,10 @@ export class ProtonDrivePublicLinkClient {
|
|
|
77
91
|
}
|
|
78
92
|
this.logger = telemetry.getLogger('interface');
|
|
79
93
|
|
|
94
|
+
// Use only in memory cache for public link as there are no events to keep it up to date if persisted.
|
|
95
|
+
const entitiesCache = new MemoryCache<string>();
|
|
96
|
+
const cryptoCache = new MemoryCache<CachedCryptoMaterial>();
|
|
97
|
+
|
|
80
98
|
const fullConfig = getConfig(config);
|
|
81
99
|
this.sdkEvents = new SDKEvents(telemetry);
|
|
82
100
|
|
|
@@ -87,26 +105,36 @@ export class ProtonDrivePublicLinkClient {
|
|
|
87
105
|
fullConfig.baseUrl,
|
|
88
106
|
fullConfig.language,
|
|
89
107
|
);
|
|
90
|
-
const
|
|
108
|
+
const cryptoModule = new DriveCrypto(openPGPCryptoModule, srpModule);
|
|
91
109
|
this.sharingPublic = initSharingPublicModule(
|
|
92
110
|
telemetry,
|
|
93
111
|
apiService,
|
|
112
|
+
entitiesCache,
|
|
94
113
|
cryptoCache,
|
|
95
|
-
|
|
114
|
+
cryptoModule,
|
|
96
115
|
account,
|
|
116
|
+
url,
|
|
97
117
|
token,
|
|
98
118
|
password,
|
|
99
119
|
);
|
|
120
|
+
this.download = initDownloadModule(
|
|
121
|
+
telemetry,
|
|
122
|
+
apiService,
|
|
123
|
+
cryptoModule,
|
|
124
|
+
account,
|
|
125
|
+
this.sharingPublic.shares,
|
|
126
|
+
this.sharingPublic.nodes.access,
|
|
127
|
+
this.sharingPublic.nodes.revisions,
|
|
128
|
+
);
|
|
100
129
|
|
|
101
130
|
this.experimental = {
|
|
102
131
|
getNodeUrl: async (nodeUid: NodeOrUid) => {
|
|
103
132
|
this.logger.debug(`Getting node URL for ${getUid(nodeUid)}`);
|
|
104
|
-
|
|
105
|
-
return '';
|
|
133
|
+
return this.sharingPublic.nodes.access.getNodeUrl(getUid(nodeUid));
|
|
106
134
|
},
|
|
107
135
|
getDocsKey: async (nodeUid: NodeOrUid) => {
|
|
108
136
|
this.logger.debug(`Getting docs keys for ${getUid(nodeUid)}`);
|
|
109
|
-
const keys = await this.sharingPublic.getNodeKeys(getUid(nodeUid));
|
|
137
|
+
const keys = await this.sharingPublic.nodes.access.getNodeKeys(getUid(nodeUid));
|
|
110
138
|
if (!keys.contentKeyPacketSessionKey) {
|
|
111
139
|
throw new Error('Node does not have a content key packet session key');
|
|
112
140
|
}
|
|
@@ -120,7 +148,8 @@ export class ProtonDrivePublicLinkClient {
|
|
|
120
148
|
*/
|
|
121
149
|
async getRootNode(): Promise<MaybeNode> {
|
|
122
150
|
this.logger.info(`Getting root node`);
|
|
123
|
-
|
|
151
|
+
const { rootNodeUid } = await this.sharingPublic.shares.getOwnVolumeIDs();
|
|
152
|
+
return convertInternalNodePromise(this.sharingPublic.nodes.access.getNode(rootNodeUid));
|
|
124
153
|
}
|
|
125
154
|
|
|
126
155
|
/**
|
|
@@ -128,8 +157,60 @@ export class ProtonDrivePublicLinkClient {
|
|
|
128
157
|
*
|
|
129
158
|
* See `ProtonDriveClient.iterateFolderChildren` for more information.
|
|
130
159
|
*/
|
|
131
|
-
async *iterateFolderChildren(
|
|
160
|
+
async *iterateFolderChildren(
|
|
161
|
+
parentUid: NodeOrUid,
|
|
162
|
+
filterOptions?: { type?: NodeType },
|
|
163
|
+
signal?: AbortSignal,
|
|
164
|
+
): AsyncGenerator<MaybeNode> {
|
|
132
165
|
this.logger.info(`Iterating children of ${getUid(parentUid)}`);
|
|
133
|
-
yield
|
|
166
|
+
yield* convertInternalNodeIterator(
|
|
167
|
+
this.sharingPublic.nodes.access.iterateFolderChildren(getUid(parentUid), filterOptions, signal),
|
|
168
|
+
);
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
/**
|
|
172
|
+
* Iterates the nodes by their UIDs.
|
|
173
|
+
*
|
|
174
|
+
* See `ProtonDriveClient.iterateNodes` for more information.
|
|
175
|
+
*/
|
|
176
|
+
async *iterateNodes(nodeUids: NodeOrUid[], signal?: AbortSignal): AsyncGenerator<MaybeMissingNode> {
|
|
177
|
+
this.logger.info(`Iterating ${nodeUids.length} nodes`);
|
|
178
|
+
yield* convertInternalMissingNodeIterator(
|
|
179
|
+
this.sharingPublic.nodes.access.iterateNodes(getUids(nodeUids), signal),
|
|
180
|
+
);
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
/**
|
|
184
|
+
* Get the node by its UID.
|
|
185
|
+
*
|
|
186
|
+
* See `ProtonDriveClient.getNode` for more information.
|
|
187
|
+
*/
|
|
188
|
+
async getNode(nodeUid: NodeOrUid): Promise<MaybeNode> {
|
|
189
|
+
this.logger.info(`Getting node ${getUid(nodeUid)}`);
|
|
190
|
+
return convertInternalNodePromise(this.sharingPublic.nodes.access.getNode(getUid(nodeUid)));
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
/**
|
|
194
|
+
* Get the file downloader to download the node content.
|
|
195
|
+
*
|
|
196
|
+
* See `ProtonDriveClient.getFileDownloader` for more information.
|
|
197
|
+
*/
|
|
198
|
+
async getFileDownloader(nodeUid: NodeOrUid, signal?: AbortSignal): Promise<FileDownloader> {
|
|
199
|
+
this.logger.info(`Getting file downloader for ${getUid(nodeUid)}`);
|
|
200
|
+
return this.download.getFileDownloader(getUid(nodeUid), signal);
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
/**
|
|
204
|
+
* Iterates the thumbnails of the given nodes.
|
|
205
|
+
*
|
|
206
|
+
* See `ProtonDriveClient.iterateThumbnails` for more information.
|
|
207
|
+
*/
|
|
208
|
+
async *iterateThumbnails(
|
|
209
|
+
nodeUids: NodeOrUid[],
|
|
210
|
+
thumbnailType?: ThumbnailType,
|
|
211
|
+
signal?: AbortSignal,
|
|
212
|
+
): AsyncGenerator<ThumbnailResult> {
|
|
213
|
+
this.logger.info(`Iterating ${nodeUids.length} thumbnails`);
|
|
214
|
+
yield* this.download.iterateThumbnails(getUids(nodeUids), thumbnailType, signal);
|
|
134
215
|
}
|
|
135
216
|
}
|
package/src/transformers.ts
CHANGED
|
@@ -23,6 +23,7 @@ type InternalPartialNode = Pick<
|
|
|
23
23
|
| 'type'
|
|
24
24
|
| 'mediaType'
|
|
25
25
|
| 'isShared'
|
|
26
|
+
| 'isSharedPublicly'
|
|
26
27
|
| 'creationTime'
|
|
27
28
|
| 'trashTime'
|
|
28
29
|
| 'activeRevision'
|
|
@@ -90,6 +91,7 @@ export function convertInternalNode(node: InternalPartialNode): PublicMaybeNode
|
|
|
90
91
|
type: node.type,
|
|
91
92
|
mediaType: node.mediaType,
|
|
92
93
|
isShared: node.isShared,
|
|
94
|
+
isSharedPublicly: node.isSharedPublicly,
|
|
93
95
|
creationTime: node.creationTime,
|
|
94
96
|
trashTime: node.trashTime,
|
|
95
97
|
totalStorageSize: node.totalStorageSize,
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
import { Logger } from '../../interface';
|
|
2
|
-
import { SharingPublicAPIService } from './apiService';
|
|
3
|
-
import { SharingPublicCryptoCache } from './cryptoCache';
|
|
4
|
-
import { SharingPublicCryptoService } from './cryptoService';
|
|
5
|
-
import { DecryptedNode, DecryptedNodeKeys } from './interface';
|
|
6
|
-
export declare class SharingPublicManager {
|
|
7
|
-
private logger;
|
|
8
|
-
private api;
|
|
9
|
-
private cryptoCache;
|
|
10
|
-
private cryptoService;
|
|
11
|
-
private token;
|
|
12
|
-
constructor(logger: Logger, api: SharingPublicAPIService, cryptoCache: SharingPublicCryptoCache, cryptoService: SharingPublicCryptoService, token: string);
|
|
13
|
-
getRootNode(): Promise<DecryptedNode>;
|
|
14
|
-
iterateFolderChildren(parentUid: string, signal?: AbortSignal): AsyncGenerator<DecryptedNode>;
|
|
15
|
-
private decryptShare;
|
|
16
|
-
private decryptNode;
|
|
17
|
-
private getParentKey;
|
|
18
|
-
getNodeKeys(nodeUid: string): Promise<DecryptedNodeKeys>;
|
|
19
|
-
}
|
|
@@ -1,81 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.SharingPublicManager = void 0;
|
|
4
|
-
const nodesAccess_1 = require("../nodes/nodesAccess");
|
|
5
|
-
// TODO: comment
|
|
6
|
-
class SharingPublicManager {
|
|
7
|
-
logger;
|
|
8
|
-
api;
|
|
9
|
-
cryptoCache;
|
|
10
|
-
cryptoService;
|
|
11
|
-
token;
|
|
12
|
-
constructor(logger, api, cryptoCache, cryptoService, token) {
|
|
13
|
-
this.logger = logger;
|
|
14
|
-
this.api = api;
|
|
15
|
-
this.cryptoCache = cryptoCache;
|
|
16
|
-
this.cryptoService = cryptoService;
|
|
17
|
-
this.token = token;
|
|
18
|
-
this.logger = logger;
|
|
19
|
-
this.api = api;
|
|
20
|
-
this.cryptoCache = cryptoCache;
|
|
21
|
-
this.cryptoService = cryptoService;
|
|
22
|
-
this.token = token;
|
|
23
|
-
}
|
|
24
|
-
async getRootNode() {
|
|
25
|
-
const { encryptedNode, encryptedShare } = await this.api.getPublicLinkRoot(this.token);
|
|
26
|
-
await this.decryptShare(encryptedShare);
|
|
27
|
-
return this.decryptNode(encryptedNode);
|
|
28
|
-
}
|
|
29
|
-
async *iterateFolderChildren(parentUid, signal) {
|
|
30
|
-
// TODO: optimise this - decrypt in parallel
|
|
31
|
-
for await (const node of this.api.iterateFolderChildren(parentUid, signal)) {
|
|
32
|
-
const decryptedNode = await this.decryptNode(node);
|
|
33
|
-
yield decryptedNode;
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
async decryptShare(encryptedShare) {
|
|
37
|
-
const shareKey = await this.cryptoService.decryptPublicLinkShareKey(encryptedShare);
|
|
38
|
-
await this.cryptoCache.setShareKey(shareKey);
|
|
39
|
-
}
|
|
40
|
-
async decryptNode(encryptedNode) {
|
|
41
|
-
const parentKey = await this.getParentKey(encryptedNode);
|
|
42
|
-
const { node: unparsedNode, keys } = await this.cryptoService.decryptNode(encryptedNode, parentKey);
|
|
43
|
-
const node = await (0, nodesAccess_1.parseNode)(this.logger, unparsedNode);
|
|
44
|
-
// TODO: cache of metadata?
|
|
45
|
-
if (keys) {
|
|
46
|
-
try {
|
|
47
|
-
await this.cryptoCache.setNodeKeys(node.uid, keys);
|
|
48
|
-
}
|
|
49
|
-
catch (error) {
|
|
50
|
-
this.logger.error(`Failed to cache node keys ${node.uid}`, error);
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
return node;
|
|
54
|
-
}
|
|
55
|
-
async getParentKey(node) {
|
|
56
|
-
if (node.parentUid) {
|
|
57
|
-
// TODO: try-catch
|
|
58
|
-
const keys = await this.getNodeKeys(node.parentUid);
|
|
59
|
-
return keys.key;
|
|
60
|
-
}
|
|
61
|
-
try {
|
|
62
|
-
return await this.cryptoCache.getShareKey();
|
|
63
|
-
}
|
|
64
|
-
catch {
|
|
65
|
-
await this.getRootNode();
|
|
66
|
-
return this.cryptoCache.getShareKey();
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
async getNodeKeys(nodeUid) {
|
|
70
|
-
try {
|
|
71
|
-
const keys = await this.cryptoCache.getNodeKeys(nodeUid);
|
|
72
|
-
return keys;
|
|
73
|
-
}
|
|
74
|
-
catch {
|
|
75
|
-
// TODO: handle this
|
|
76
|
-
throw new Error('Node key not found in cache');
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
exports.SharingPublicManager = SharingPublicManager;
|
|
81
|
-
//# sourceMappingURL=manager.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"manager.js","sourceRoot":"","sources":["../../../src/internal/sharingPublic/manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,86 +0,0 @@
|
|
|
1
|
-
import { PrivateKey } from '../../crypto';
|
|
2
|
-
import { Logger } from '../../interface';
|
|
3
|
-
import { parseNode } from '../nodes/nodesAccess';
|
|
4
|
-
import { SharingPublicAPIService } from './apiService';
|
|
5
|
-
import { SharingPublicCryptoCache } from './cryptoCache';
|
|
6
|
-
import { SharingPublicCryptoService } from './cryptoService';
|
|
7
|
-
import { EncryptedShareCrypto, EncryptedNode, DecryptedNode, DecryptedNodeKeys } from './interface';
|
|
8
|
-
|
|
9
|
-
// TODO: comment
|
|
10
|
-
export class SharingPublicManager {
|
|
11
|
-
constructor(
|
|
12
|
-
private logger: Logger,
|
|
13
|
-
private api: SharingPublicAPIService,
|
|
14
|
-
private cryptoCache: SharingPublicCryptoCache,
|
|
15
|
-
private cryptoService: SharingPublicCryptoService,
|
|
16
|
-
private token: string,
|
|
17
|
-
) {
|
|
18
|
-
this.logger = logger;
|
|
19
|
-
this.api = api;
|
|
20
|
-
this.cryptoCache = cryptoCache;
|
|
21
|
-
this.cryptoService = cryptoService;
|
|
22
|
-
this.token = token;
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
async getRootNode(): Promise<DecryptedNode> {
|
|
26
|
-
const { encryptedNode, encryptedShare } = await this.api.getPublicLinkRoot(this.token);
|
|
27
|
-
await this.decryptShare(encryptedShare);
|
|
28
|
-
return this.decryptNode(encryptedNode);
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
async *iterateFolderChildren(parentUid: string, signal?: AbortSignal): AsyncGenerator<DecryptedNode> {
|
|
32
|
-
// TODO: optimise this - decrypt in parallel
|
|
33
|
-
for await (const node of this.api.iterateFolderChildren(parentUid, signal)) {
|
|
34
|
-
const decryptedNode = await this.decryptNode(node);
|
|
35
|
-
yield decryptedNode;
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
private async decryptShare(encryptedShare: EncryptedShareCrypto): Promise<void> {
|
|
40
|
-
const shareKey = await this.cryptoService.decryptPublicLinkShareKey(encryptedShare);
|
|
41
|
-
await this.cryptoCache.setShareKey(shareKey);
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
private async decryptNode(encryptedNode: EncryptedNode): Promise<DecryptedNode> {
|
|
45
|
-
const parentKey = await this.getParentKey(encryptedNode);
|
|
46
|
-
|
|
47
|
-
const { node: unparsedNode, keys } = await this.cryptoService.decryptNode(encryptedNode, parentKey);
|
|
48
|
-
const node = await parseNode(this.logger, unparsedNode);
|
|
49
|
-
|
|
50
|
-
// TODO: cache of metadata?
|
|
51
|
-
if (keys) {
|
|
52
|
-
try {
|
|
53
|
-
await this.cryptoCache.setNodeKeys(node.uid, keys);
|
|
54
|
-
} catch (error: unknown) {
|
|
55
|
-
this.logger.error(`Failed to cache node keys ${node.uid}`, error);
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
return node;
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
private async getParentKey(node: Pick<DecryptedNode, 'parentUid'>): Promise<PrivateKey> {
|
|
63
|
-
if (node.parentUid) {
|
|
64
|
-
// TODO: try-catch
|
|
65
|
-
const keys = await this.getNodeKeys(node.parentUid);
|
|
66
|
-
return keys.key;
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
try {
|
|
70
|
-
return await this.cryptoCache.getShareKey();
|
|
71
|
-
} catch {
|
|
72
|
-
await this.getRootNode();
|
|
73
|
-
return this.cryptoCache.getShareKey();
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
async getNodeKeys(nodeUid: string): Promise<DecryptedNodeKeys> {
|
|
78
|
-
try {
|
|
79
|
-
const keys = await this.cryptoCache.getNodeKeys(nodeUid);
|
|
80
|
-
return keys;
|
|
81
|
-
} catch {
|
|
82
|
-
// TODO: handle this
|
|
83
|
-
throw new Error('Node key not found in cache');
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
}
|