@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.
Files changed (176) hide show
  1. package/dist/diagnostic/sdkDiagnostic.js +1 -1
  2. package/dist/diagnostic/sdkDiagnostic.js.map +1 -1
  3. package/dist/interface/download.d.ts +4 -4
  4. package/dist/interface/nodes.d.ts +4 -0
  5. package/dist/interface/nodes.js.map +1 -1
  6. package/dist/interface/upload.d.ts +6 -3
  7. package/dist/internal/apiService/apiService.d.ts +3 -0
  8. package/dist/internal/apiService/apiService.js +25 -2
  9. package/dist/internal/apiService/apiService.js.map +1 -1
  10. package/dist/internal/apiService/apiService.test.js +38 -0
  11. package/dist/internal/apiService/apiService.test.js.map +1 -1
  12. package/dist/internal/apiService/driveTypes.d.ts +31 -48
  13. package/dist/internal/apiService/errors.js +3 -0
  14. package/dist/internal/apiService/errors.js.map +1 -1
  15. package/dist/internal/apiService/errors.test.js +15 -7
  16. package/dist/internal/apiService/errors.test.js.map +1 -1
  17. package/dist/internal/asyncIteratorMap.d.ts +1 -1
  18. package/dist/internal/asyncIteratorMap.js +6 -1
  19. package/dist/internal/asyncIteratorMap.js.map +1 -1
  20. package/dist/internal/asyncIteratorMap.test.js +9 -0
  21. package/dist/internal/asyncIteratorMap.test.js.map +1 -1
  22. package/dist/internal/download/fileDownloader.d.ts +3 -3
  23. package/dist/internal/download/fileDownloader.js +5 -5
  24. package/dist/internal/download/fileDownloader.js.map +1 -1
  25. package/dist/internal/download/fileDownloader.test.js +8 -8
  26. package/dist/internal/download/fileDownloader.test.js.map +1 -1
  27. package/dist/internal/nodes/apiService.d.ts +6 -1
  28. package/dist/internal/nodes/apiService.js +45 -32
  29. package/dist/internal/nodes/apiService.js.map +1 -1
  30. package/dist/internal/nodes/apiService.test.js +164 -17
  31. package/dist/internal/nodes/apiService.test.js.map +1 -1
  32. package/dist/internal/nodes/cache.test.js +1 -0
  33. package/dist/internal/nodes/cache.test.js.map +1 -1
  34. package/dist/internal/nodes/debouncer.d.ts +23 -0
  35. package/dist/internal/nodes/debouncer.js +80 -0
  36. package/dist/internal/nodes/debouncer.js.map +1 -0
  37. package/dist/internal/nodes/debouncer.test.d.ts +1 -0
  38. package/dist/internal/nodes/debouncer.test.js +100 -0
  39. package/dist/internal/nodes/debouncer.test.js.map +1 -0
  40. package/dist/internal/nodes/extendedAttributes.d.ts +2 -2
  41. package/dist/internal/nodes/extendedAttributes.js +15 -11
  42. package/dist/internal/nodes/extendedAttributes.js.map +1 -1
  43. package/dist/internal/nodes/extendedAttributes.test.js +19 -1
  44. package/dist/internal/nodes/extendedAttributes.test.js.map +1 -1
  45. package/dist/internal/nodes/index.test.js +1 -0
  46. package/dist/internal/nodes/index.test.js.map +1 -1
  47. package/dist/internal/nodes/interface.d.ts +1 -0
  48. package/dist/internal/nodes/nodesAccess.d.ts +2 -1
  49. package/dist/internal/nodes/nodesAccess.js +24 -5
  50. package/dist/internal/nodes/nodesAccess.js.map +1 -1
  51. package/dist/internal/nodes/nodesAccess.test.js +2 -2
  52. package/dist/internal/nodes/nodesAccess.test.js.map +1 -1
  53. package/dist/internal/nodes/nodesManagement.js +1 -0
  54. package/dist/internal/nodes/nodesManagement.js.map +1 -1
  55. package/dist/internal/photos/index.d.ts +11 -0
  56. package/dist/internal/photos/index.js +27 -0
  57. package/dist/internal/photos/index.js.map +1 -1
  58. package/dist/internal/photos/upload.d.ts +60 -0
  59. package/dist/internal/photos/upload.js +104 -0
  60. package/dist/internal/photos/upload.js.map +1 -0
  61. package/dist/internal/sharingPublic/apiService.d.ts +2 -2
  62. package/dist/internal/sharingPublic/apiService.js +2 -62
  63. package/dist/internal/sharingPublic/apiService.js.map +1 -1
  64. package/dist/internal/sharingPublic/cryptoCache.d.ts +0 -4
  65. package/dist/internal/sharingPublic/cryptoCache.js +0 -28
  66. package/dist/internal/sharingPublic/cryptoCache.js.map +1 -1
  67. package/dist/internal/sharingPublic/cryptoReporter.d.ts +16 -0
  68. package/dist/internal/sharingPublic/cryptoReporter.js +44 -0
  69. package/dist/internal/sharingPublic/cryptoReporter.js.map +1 -0
  70. package/dist/internal/sharingPublic/cryptoService.d.ts +3 -4
  71. package/dist/internal/sharingPublic/cryptoService.js +5 -43
  72. package/dist/internal/sharingPublic/cryptoService.js.map +1 -1
  73. package/dist/internal/sharingPublic/index.d.ts +21 -3
  74. package/dist/internal/sharingPublic/index.js +43 -12
  75. package/dist/internal/sharingPublic/index.js.map +1 -1
  76. package/dist/internal/sharingPublic/interface.d.ts +0 -1
  77. package/dist/internal/sharingPublic/nodes.d.ts +13 -0
  78. package/dist/internal/sharingPublic/nodes.js +28 -0
  79. package/dist/internal/sharingPublic/nodes.js.map +1 -0
  80. package/dist/internal/sharingPublic/session/session.d.ts +3 -3
  81. package/dist/internal/sharingPublic/session/url.test.js +3 -3
  82. package/dist/internal/sharingPublic/shares.d.ts +34 -0
  83. package/dist/internal/sharingPublic/shares.js +69 -0
  84. package/dist/internal/sharingPublic/shares.js.map +1 -0
  85. package/dist/internal/upload/apiService.d.ts +2 -2
  86. package/dist/internal/upload/apiService.js +11 -2
  87. package/dist/internal/upload/apiService.js.map +1 -1
  88. package/dist/internal/upload/controller.d.ts +8 -2
  89. package/dist/internal/upload/controller.js.map +1 -1
  90. package/dist/internal/upload/cryptoService.d.ts +2 -2
  91. package/dist/internal/upload/cryptoService.js.map +1 -1
  92. package/dist/internal/upload/fileUploader.d.ts +7 -3
  93. package/dist/internal/upload/fileUploader.js +6 -3
  94. package/dist/internal/upload/fileUploader.js.map +1 -1
  95. package/dist/internal/upload/fileUploader.test.js +23 -11
  96. package/dist/internal/upload/fileUploader.test.js.map +1 -1
  97. package/dist/internal/upload/interface.d.ts +3 -0
  98. package/dist/internal/upload/manager.d.ts +12 -11
  99. package/dist/internal/upload/manager.js +8 -2
  100. package/dist/internal/upload/manager.js.map +1 -1
  101. package/dist/internal/upload/manager.test.js +8 -0
  102. package/dist/internal/upload/manager.test.js.map +1 -1
  103. package/dist/internal/upload/streamUploader.d.ts +40 -26
  104. package/dist/internal/upload/streamUploader.js +15 -8
  105. package/dist/internal/upload/streamUploader.js.map +1 -1
  106. package/dist/internal/upload/streamUploader.test.js +11 -7
  107. package/dist/internal/upload/streamUploader.test.js.map +1 -1
  108. package/dist/protonDriveClient.d.ts +3 -3
  109. package/dist/protonDriveClient.js +4 -4
  110. package/dist/protonDriveClient.js.map +1 -1
  111. package/dist/protonDrivePhotosClient.d.ts +18 -2
  112. package/dist/protonDrivePhotosClient.js +19 -2
  113. package/dist/protonDrivePhotosClient.js.map +1 -1
  114. package/dist/protonDrivePublicLinkClient.d.ts +31 -4
  115. package/dist/protonDrivePublicLinkClient.js +52 -9
  116. package/dist/protonDrivePublicLinkClient.js.map +1 -1
  117. package/dist/transformers.d.ts +1 -1
  118. package/dist/transformers.js +1 -0
  119. package/dist/transformers.js.map +1 -1
  120. package/package.json +1 -1
  121. package/src/diagnostic/sdkDiagnostic.ts +1 -1
  122. package/src/interface/download.ts +4 -4
  123. package/src/interface/nodes.ts +4 -0
  124. package/src/interface/upload.ts +3 -3
  125. package/src/internal/apiService/apiService.test.ts +50 -0
  126. package/src/internal/apiService/apiService.ts +33 -2
  127. package/src/internal/apiService/driveTypes.ts +31 -48
  128. package/src/internal/apiService/errors.test.ts +10 -0
  129. package/src/internal/apiService/errors.ts +5 -1
  130. package/src/internal/asyncIteratorMap.test.ts +12 -0
  131. package/src/internal/asyncIteratorMap.ts +8 -0
  132. package/src/internal/download/fileDownloader.test.ts +8 -8
  133. package/src/internal/download/fileDownloader.ts +5 -5
  134. package/src/internal/nodes/apiService.test.ts +222 -16
  135. package/src/internal/nodes/apiService.ts +63 -49
  136. package/src/internal/nodes/cache.test.ts +1 -0
  137. package/src/internal/nodes/debouncer.test.ts +129 -0
  138. package/src/internal/nodes/debouncer.ts +93 -0
  139. package/src/internal/nodes/extendedAttributes.test.ts +23 -1
  140. package/src/internal/nodes/extendedAttributes.ts +26 -18
  141. package/src/internal/nodes/index.test.ts +1 -0
  142. package/src/internal/nodes/interface.ts +1 -0
  143. package/src/internal/nodes/nodesAccess.test.ts +2 -2
  144. package/src/internal/nodes/nodesAccess.ts +30 -5
  145. package/src/internal/nodes/nodesManagement.ts +1 -0
  146. package/src/internal/photos/index.ts +62 -0
  147. package/src/internal/photos/upload.ts +212 -0
  148. package/src/internal/sharingPublic/apiService.ts +5 -86
  149. package/src/internal/sharingPublic/cryptoCache.ts +0 -34
  150. package/src/internal/sharingPublic/cryptoReporter.ts +73 -0
  151. package/src/internal/sharingPublic/cryptoService.ts +4 -80
  152. package/src/internal/sharingPublic/index.ts +68 -6
  153. package/src/internal/sharingPublic/interface.ts +0 -9
  154. package/src/internal/sharingPublic/nodes.ts +37 -0
  155. package/src/internal/sharingPublic/session/apiService.ts +1 -1
  156. package/src/internal/sharingPublic/session/session.ts +3 -3
  157. package/src/internal/sharingPublic/session/url.test.ts +3 -3
  158. package/src/internal/sharingPublic/shares.ts +86 -0
  159. package/src/internal/upload/apiService.ts +15 -4
  160. package/src/internal/upload/controller.ts +2 -2
  161. package/src/internal/upload/cryptoService.ts +2 -2
  162. package/src/internal/upload/fileUploader.test.ts +25 -11
  163. package/src/internal/upload/fileUploader.ts +16 -3
  164. package/src/internal/upload/interface.ts +3 -0
  165. package/src/internal/upload/manager.test.ts +8 -0
  166. package/src/internal/upload/manager.ts +20 -10
  167. package/src/internal/upload/streamUploader.test.ts +32 -15
  168. package/src/internal/upload/streamUploader.ts +43 -30
  169. package/src/protonDriveClient.ts +4 -4
  170. package/src/protonDrivePhotosClient.ts +46 -6
  171. package/src/protonDrivePublicLinkClient.ts +93 -12
  172. package/src/transformers.ts +2 -0
  173. package/dist/internal/sharingPublic/manager.d.ts +0 -19
  174. package/dist/internal/sharingPublic/manager.js +0 -81
  175. package/dist/internal/sharingPublic/manager.js.map +0 -1
  176. 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 { getUid, convertInternalNodePromise, convertInternalNodeIterator } from './transformers';
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 driveCrypto = new DriveCrypto(openPGPCryptoModule, srpModule);
108
+ const cryptoModule = new DriveCrypto(openPGPCryptoModule, srpModule);
91
109
  this.sharingPublic = initSharingPublicModule(
92
110
  telemetry,
93
111
  apiService,
112
+ entitiesCache,
94
113
  cryptoCache,
95
- driveCrypto,
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
- // TODO: public node has different URL
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
- return convertInternalNodePromise(this.sharingPublic.getRootNode());
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(parentUid: NodeOrUid, signal?: AbortSignal): AsyncGenerator<MaybeNode> {
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 * convertInternalNodeIterator(this.sharingPublic.iterateFolderChildren(getUid(parentUid), signal));
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
  }
@@ -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
- }