@protontech/drive-sdk 0.4.1 → 0.5.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.
Files changed (197) hide show
  1. package/dist/diagnostic/{sdkDiagnosticFull.d.ts → diagnostic.d.ts} +5 -4
  2. package/dist/diagnostic/{sdkDiagnosticFull.js → diagnostic.js} +13 -10
  3. package/dist/diagnostic/diagnostic.js.map +1 -0
  4. package/dist/diagnostic/index.js +2 -4
  5. package/dist/diagnostic/index.js.map +1 -1
  6. package/dist/diagnostic/interface.d.ts +22 -1
  7. package/dist/diagnostic/sdkDiagnostic.d.ts +3 -2
  8. package/dist/diagnostic/sdkDiagnostic.js +80 -8
  9. package/dist/diagnostic/sdkDiagnostic.js.map +1 -1
  10. package/dist/interface/download.d.ts +4 -4
  11. package/dist/interface/index.d.ts +1 -1
  12. package/dist/interface/index.js.map +1 -1
  13. package/dist/interface/nodes.d.ts +9 -0
  14. package/dist/interface/telemetry.d.ts +4 -1
  15. package/dist/interface/telemetry.js.map +1 -1
  16. package/dist/interface/upload.d.ts +6 -3
  17. package/dist/internal/apiService/apiService.d.ts +3 -0
  18. package/dist/internal/apiService/apiService.js +25 -2
  19. package/dist/internal/apiService/apiService.js.map +1 -1
  20. package/dist/internal/apiService/apiService.test.js +38 -0
  21. package/dist/internal/apiService/apiService.test.js.map +1 -1
  22. package/dist/internal/apiService/driveTypes.d.ts +2595 -2397
  23. package/dist/internal/apiService/errors.js +3 -0
  24. package/dist/internal/apiService/errors.js.map +1 -1
  25. package/dist/internal/apiService/errors.test.js +15 -7
  26. package/dist/internal/apiService/errors.test.js.map +1 -1
  27. package/dist/internal/asyncIteratorMap.d.ts +1 -1
  28. package/dist/internal/asyncIteratorMap.js +6 -1
  29. package/dist/internal/asyncIteratorMap.js.map +1 -1
  30. package/dist/internal/asyncIteratorMap.test.js +9 -0
  31. package/dist/internal/asyncIteratorMap.test.js.map +1 -1
  32. package/dist/internal/download/controller.d.ts +2 -0
  33. package/dist/internal/download/controller.js +15 -1
  34. package/dist/internal/download/controller.js.map +1 -1
  35. package/dist/internal/download/fileDownloader.d.ts +3 -3
  36. package/dist/internal/download/fileDownloader.js +11 -6
  37. package/dist/internal/download/fileDownloader.js.map +1 -1
  38. package/dist/internal/download/fileDownloader.test.js +8 -8
  39. package/dist/internal/download/fileDownloader.test.js.map +1 -1
  40. package/dist/internal/nodes/apiService.d.ts +6 -1
  41. package/dist/internal/nodes/apiService.js +71 -44
  42. package/dist/internal/nodes/apiService.js.map +1 -1
  43. package/dist/internal/nodes/apiService.test.js +204 -15
  44. package/dist/internal/nodes/apiService.test.js.map +1 -1
  45. package/dist/internal/nodes/debouncer.d.ts +24 -0
  46. package/dist/internal/nodes/debouncer.js +92 -0
  47. package/dist/internal/nodes/debouncer.js.map +1 -0
  48. package/dist/internal/nodes/debouncer.test.d.ts +1 -0
  49. package/dist/internal/nodes/debouncer.test.js +108 -0
  50. package/dist/internal/nodes/debouncer.test.js.map +1 -0
  51. package/dist/internal/nodes/extendedAttributes.js +2 -2
  52. package/dist/internal/nodes/extendedAttributes.js.map +1 -1
  53. package/dist/internal/nodes/index.js +1 -1
  54. package/dist/internal/nodes/index.js.map +1 -1
  55. package/dist/internal/nodes/nodesAccess.d.ts +6 -4
  56. package/dist/internal/nodes/nodesAccess.js +29 -9
  57. package/dist/internal/nodes/nodesAccess.js.map +1 -1
  58. package/dist/internal/nodes/nodesAccess.test.js +19 -7
  59. package/dist/internal/nodes/nodesAccess.test.js.map +1 -1
  60. package/dist/internal/nodes/nodesManagement.d.ts +2 -2
  61. package/dist/internal/nodes/nodesManagement.js +5 -3
  62. package/dist/internal/nodes/nodesManagement.js.map +1 -1
  63. package/dist/internal/nodes/nodesManagement.test.js +3 -1
  64. package/dist/internal/nodes/nodesManagement.test.js.map +1 -1
  65. package/dist/internal/photos/apiService.js +9 -20
  66. package/dist/internal/photos/apiService.js.map +1 -1
  67. package/dist/internal/photos/upload.d.ts +2 -1
  68. package/dist/internal/photos/upload.js +9 -3
  69. package/dist/internal/photos/upload.js.map +1 -1
  70. package/dist/internal/sharing/apiService.d.ts +1 -1
  71. package/dist/internal/sharing/apiService.js +2 -2
  72. package/dist/internal/sharing/apiService.js.map +1 -1
  73. package/dist/internal/sharing/sharingManagement.d.ts +4 -1
  74. package/dist/internal/sharing/sharingManagement.js +7 -4
  75. package/dist/internal/sharing/sharingManagement.js.map +1 -1
  76. package/dist/internal/sharingPublic/apiService.d.ts +8 -10
  77. package/dist/internal/sharingPublic/apiService.js +9 -125
  78. package/dist/internal/sharingPublic/apiService.js.map +1 -1
  79. package/dist/internal/sharingPublic/cryptoReporter.d.ts +16 -0
  80. package/dist/internal/sharingPublic/{cryptoService.js → cryptoReporter.js} +3 -16
  81. package/dist/internal/sharingPublic/cryptoReporter.js.map +1 -0
  82. package/dist/internal/sharingPublic/index.d.ts +22 -4
  83. package/dist/internal/sharingPublic/index.js +37 -12
  84. package/dist/internal/sharingPublic/index.js.map +1 -1
  85. package/dist/internal/sharingPublic/nodes.d.ts +18 -0
  86. package/dist/internal/sharingPublic/nodes.js +46 -0
  87. package/dist/internal/sharingPublic/nodes.js.map +1 -0
  88. package/dist/internal/sharingPublic/session/apiService.d.ts +7 -5
  89. package/dist/internal/sharingPublic/session/apiService.js +25 -4
  90. package/dist/internal/sharingPublic/session/apiService.js.map +1 -1
  91. package/dist/internal/sharingPublic/session/interface.d.ts +17 -0
  92. package/dist/internal/sharingPublic/session/manager.d.ts +12 -4
  93. package/dist/internal/sharingPublic/session/manager.js +14 -4
  94. package/dist/internal/sharingPublic/session/manager.js.map +1 -1
  95. package/dist/internal/sharingPublic/session/session.d.ts +7 -4
  96. package/dist/internal/sharingPublic/session/session.js +7 -3
  97. package/dist/internal/sharingPublic/session/session.js.map +1 -1
  98. package/dist/internal/sharingPublic/session/url.test.js +3 -3
  99. package/dist/internal/sharingPublic/shares.d.ts +27 -0
  100. package/dist/internal/sharingPublic/shares.js +46 -0
  101. package/dist/internal/sharingPublic/shares.js.map +1 -0
  102. package/dist/internal/upload/apiService.js +10 -1
  103. package/dist/internal/upload/apiService.js.map +1 -1
  104. package/dist/internal/upload/controller.d.ts +11 -3
  105. package/dist/internal/upload/controller.js +16 -2
  106. package/dist/internal/upload/controller.js.map +1 -1
  107. package/dist/internal/upload/fileUploader.d.ts +6 -3
  108. package/dist/internal/upload/fileUploader.js +4 -4
  109. package/dist/internal/upload/fileUploader.js.map +1 -1
  110. package/dist/internal/upload/fileUploader.test.js +23 -11
  111. package/dist/internal/upload/fileUploader.test.js.map +1 -1
  112. package/dist/internal/upload/streamUploader.d.ts +9 -4
  113. package/dist/internal/upload/streamUploader.js +67 -20
  114. package/dist/internal/upload/streamUploader.js.map +1 -1
  115. package/dist/internal/upload/streamUploader.test.js +43 -13
  116. package/dist/internal/upload/streamUploader.test.js.map +1 -1
  117. package/dist/protonDriveClient.d.ts +11 -6
  118. package/dist/protonDriveClient.js +11 -10
  119. package/dist/protonDriveClient.js.map +1 -1
  120. package/dist/protonDrivePublicLinkClient.d.ts +34 -6
  121. package/dist/protonDrivePublicLinkClient.js +52 -9
  122. package/dist/protonDrivePublicLinkClient.js.map +1 -1
  123. package/dist/tests/telemetry.d.ts +4 -2
  124. package/dist/tests/telemetry.js +3 -1
  125. package/dist/tests/telemetry.js.map +1 -1
  126. package/dist/transformers.d.ts +3 -2
  127. package/dist/transformers.js +6 -0
  128. package/dist/transformers.js.map +1 -1
  129. package/package.json +1 -1
  130. package/src/diagnostic/{sdkDiagnosticFull.ts → diagnostic.ts} +10 -6
  131. package/src/diagnostic/index.ts +3 -5
  132. package/src/diagnostic/interface.ts +39 -0
  133. package/src/diagnostic/sdkDiagnostic.ts +111 -10
  134. package/src/interface/download.ts +4 -4
  135. package/src/interface/index.ts +1 -0
  136. package/src/interface/nodes.ts +3 -0
  137. package/src/interface/telemetry.ts +5 -0
  138. package/src/interface/upload.ts +3 -3
  139. package/src/internal/apiService/apiService.test.ts +50 -0
  140. package/src/internal/apiService/apiService.ts +33 -2
  141. package/src/internal/apiService/driveTypes.ts +2713 -2561
  142. package/src/internal/apiService/errors.test.ts +10 -0
  143. package/src/internal/apiService/errors.ts +5 -1
  144. package/src/internal/asyncIteratorMap.test.ts +12 -0
  145. package/src/internal/asyncIteratorMap.ts +8 -0
  146. package/src/internal/download/controller.ts +13 -1
  147. package/src/internal/download/fileDownloader.test.ts +8 -8
  148. package/src/internal/download/fileDownloader.ts +13 -6
  149. package/src/internal/nodes/apiService.test.ts +261 -14
  150. package/src/internal/nodes/apiService.ts +99 -65
  151. package/src/internal/nodes/debouncer.test.ts +141 -0
  152. package/src/internal/nodes/debouncer.ts +109 -0
  153. package/src/internal/nodes/extendedAttributes.ts +2 -2
  154. package/src/internal/nodes/index.ts +1 -8
  155. package/src/internal/nodes/nodesAccess.test.ts +19 -7
  156. package/src/internal/nodes/nodesAccess.ts +44 -9
  157. package/src/internal/nodes/nodesManagement.test.ts +3 -1
  158. package/src/internal/nodes/nodesManagement.ts +11 -5
  159. package/src/internal/photos/apiService.ts +12 -29
  160. package/src/internal/photos/upload.ts +22 -1
  161. package/src/internal/sharing/apiService.ts +2 -2
  162. package/src/internal/sharing/sharingManagement.ts +7 -4
  163. package/src/internal/sharingPublic/apiService.ts +23 -160
  164. package/src/internal/sharingPublic/{cryptoService.ts → cryptoReporter.ts} +2 -27
  165. package/src/internal/sharingPublic/index.ts +76 -13
  166. package/src/internal/sharingPublic/nodes.ts +59 -0
  167. package/src/internal/sharingPublic/session/apiService.ts +32 -10
  168. package/src/internal/sharingPublic/session/interface.ts +20 -0
  169. package/src/internal/sharingPublic/session/manager.ts +31 -8
  170. package/src/internal/sharingPublic/session/session.ts +12 -7
  171. package/src/internal/sharingPublic/session/url.test.ts +3 -3
  172. package/src/internal/sharingPublic/shares.ts +50 -0
  173. package/src/internal/upload/apiService.ts +12 -1
  174. package/src/internal/upload/controller.ts +16 -4
  175. package/src/internal/upload/fileUploader.test.ts +25 -11
  176. package/src/internal/upload/fileUploader.ts +6 -5
  177. package/src/internal/upload/streamUploader.test.ts +56 -12
  178. package/src/internal/upload/streamUploader.ts +78 -20
  179. package/src/protonDriveClient.ts +29 -11
  180. package/src/protonDrivePublicLinkClient.ts +100 -16
  181. package/src/tests/telemetry.ts +6 -3
  182. package/src/transformers.ts +8 -0
  183. package/dist/diagnostic/sdkDiagnosticFull.js.map +0 -1
  184. package/dist/internal/sharingPublic/cryptoCache.d.ts +0 -19
  185. package/dist/internal/sharingPublic/cryptoCache.js +0 -72
  186. package/dist/internal/sharingPublic/cryptoCache.js.map +0 -1
  187. package/dist/internal/sharingPublic/cryptoService.d.ts +0 -9
  188. package/dist/internal/sharingPublic/cryptoService.js.map +0 -1
  189. package/dist/internal/sharingPublic/interface.d.ts +0 -6
  190. package/dist/internal/sharingPublic/interface.js +0 -3
  191. package/dist/internal/sharingPublic/interface.js.map +0 -1
  192. package/dist/internal/sharingPublic/manager.d.ts +0 -19
  193. package/dist/internal/sharingPublic/manager.js +0 -81
  194. package/dist/internal/sharingPublic/manager.js.map +0 -1
  195. package/src/internal/sharingPublic/cryptoCache.ts +0 -79
  196. package/src/internal/sharingPublic/interface.ts +0 -14
  197. package/src/internal/sharingPublic/manager.ts +0 -86
@@ -1,18 +1,31 @@
1
+ import { MemoryCache } from './cache';
1
2
  import { getConfig } from './config';
2
- import { DriveCrypto, OpenPGPCrypto, SRPModule, SessionKey } from './crypto';
3
+ import { DriveCrypto, OpenPGPCrypto, PrivateKey, SRPModule, SessionKey } from './crypto';
3
4
  import {
4
5
  ProtonDriveHTTPClient,
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,30 +67,36 @@ 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
- password,
77
+ publicShareKey,
78
+ publicRootNodeUid,
64
79
  }: {
65
80
  httpClient: ProtonDriveHTTPClient;
66
- cryptoCache: ProtonDriveCryptoCache;
67
81
  account: ProtonDriveAccount;
68
82
  openPGPCryptoModule: OpenPGPCrypto;
69
83
  srpModule: SRPModule;
70
84
  config?: ProtonDriveConfig;
71
85
  telemetry?: ProtonDriveTelemetry;
86
+ url: string;
72
87
  token: string;
73
- password: string;
88
+ publicShareKey: PrivateKey;
89
+ publicRootNodeUid: string;
74
90
  }) {
75
91
  if (!telemetry) {
76
92
  telemetry = new Telemetry();
77
93
  }
78
94
  this.logger = telemetry.getLogger('interface');
79
95
 
96
+ // Use only in memory cache for public link as there are no events to keep it up to date if persisted.
97
+ const entitiesCache = new MemoryCache<string>();
98
+ const cryptoCache = new MemoryCache<CachedCryptoMaterial>();
99
+
80
100
  const fullConfig = getConfig(config);
81
101
  this.sdkEvents = new SDKEvents(telemetry);
82
102
 
@@ -87,26 +107,37 @@ export class ProtonDrivePublicLinkClient {
87
107
  fullConfig.baseUrl,
88
108
  fullConfig.language,
89
109
  );
90
- const driveCrypto = new DriveCrypto(openPGPCryptoModule, srpModule);
110
+ const cryptoModule = new DriveCrypto(openPGPCryptoModule, srpModule);
91
111
  this.sharingPublic = initSharingPublicModule(
92
112
  telemetry,
93
113
  apiService,
114
+ entitiesCache,
94
115
  cryptoCache,
95
- driveCrypto,
116
+ cryptoModule,
96
117
  account,
118
+ url,
97
119
  token,
98
- password,
120
+ publicShareKey,
121
+ publicRootNodeUid,
122
+ );
123
+ this.download = initDownloadModule(
124
+ telemetry,
125
+ apiService,
126
+ cryptoModule,
127
+ account,
128
+ this.sharingPublic.shares,
129
+ this.sharingPublic.nodes.access,
130
+ this.sharingPublic.nodes.revisions,
99
131
  );
100
132
 
101
133
  this.experimental = {
102
134
  getNodeUrl: async (nodeUid: NodeOrUid) => {
103
135
  this.logger.debug(`Getting node URL for ${getUid(nodeUid)}`);
104
- // TODO: public node has different URL
105
- return '';
136
+ return this.sharingPublic.nodes.access.getNodeUrl(getUid(nodeUid));
106
137
  },
107
138
  getDocsKey: async (nodeUid: NodeOrUid) => {
108
139
  this.logger.debug(`Getting docs keys for ${getUid(nodeUid)}`);
109
- const keys = await this.sharingPublic.getNodeKeys(getUid(nodeUid));
140
+ const keys = await this.sharingPublic.nodes.access.getNodeKeys(getUid(nodeUid));
110
141
  if (!keys.contentKeyPacketSessionKey) {
111
142
  throw new Error('Node does not have a content key packet session key');
112
143
  }
@@ -120,7 +151,8 @@ export class ProtonDrivePublicLinkClient {
120
151
  */
121
152
  async getRootNode(): Promise<MaybeNode> {
122
153
  this.logger.info(`Getting root node`);
123
- return convertInternalNodePromise(this.sharingPublic.getRootNode());
154
+ const { rootNodeUid } = await this.sharingPublic.shares.getOwnVolumeIDs();
155
+ return convertInternalNodePromise(this.sharingPublic.nodes.access.getNode(rootNodeUid));
124
156
  }
125
157
 
126
158
  /**
@@ -128,8 +160,60 @@ export class ProtonDrivePublicLinkClient {
128
160
  *
129
161
  * See `ProtonDriveClient.iterateFolderChildren` for more information.
130
162
  */
131
- async *iterateFolderChildren(parentUid: NodeOrUid, signal?: AbortSignal): AsyncGenerator<MaybeNode> {
163
+ async *iterateFolderChildren(
164
+ parentUid: NodeOrUid,
165
+ filterOptions?: { type?: NodeType },
166
+ signal?: AbortSignal,
167
+ ): AsyncGenerator<MaybeNode> {
132
168
  this.logger.info(`Iterating children of ${getUid(parentUid)}`);
133
- yield * convertInternalNodeIterator(this.sharingPublic.iterateFolderChildren(getUid(parentUid), signal));
169
+ yield* convertInternalNodeIterator(
170
+ this.sharingPublic.nodes.access.iterateFolderChildren(getUid(parentUid), filterOptions, signal),
171
+ );
172
+ }
173
+
174
+ /**
175
+ * Iterates the nodes by their UIDs.
176
+ *
177
+ * See `ProtonDriveClient.iterateNodes` for more information.
178
+ */
179
+ async *iterateNodes(nodeUids: NodeOrUid[], signal?: AbortSignal): AsyncGenerator<MaybeMissingNode> {
180
+ this.logger.info(`Iterating ${nodeUids.length} nodes`);
181
+ yield* convertInternalMissingNodeIterator(
182
+ this.sharingPublic.nodes.access.iterateNodes(getUids(nodeUids), signal),
183
+ );
184
+ }
185
+
186
+ /**
187
+ * Get the node by its UID.
188
+ *
189
+ * See `ProtonDriveClient.getNode` for more information.
190
+ */
191
+ async getNode(nodeUid: NodeOrUid): Promise<MaybeNode> {
192
+ this.logger.info(`Getting node ${getUid(nodeUid)}`);
193
+ return convertInternalNodePromise(this.sharingPublic.nodes.access.getNode(getUid(nodeUid)));
194
+ }
195
+
196
+ /**
197
+ * Get the file downloader to download the node content.
198
+ *
199
+ * See `ProtonDriveClient.getFileDownloader` for more information.
200
+ */
201
+ async getFileDownloader(nodeUid: NodeOrUid, signal?: AbortSignal): Promise<FileDownloader> {
202
+ this.logger.info(`Getting file downloader for ${getUid(nodeUid)}`);
203
+ return this.download.getFileDownloader(getUid(nodeUid), signal);
204
+ }
205
+
206
+ /**
207
+ * Iterates the thumbnails of the given nodes.
208
+ *
209
+ * See `ProtonDriveClient.iterateThumbnails` for more information.
210
+ */
211
+ async *iterateThumbnails(
212
+ nodeUids: NodeOrUid[],
213
+ thumbnailType?: ThumbnailType,
214
+ signal?: AbortSignal,
215
+ ): AsyncGenerator<ThumbnailResult> {
216
+ this.logger.info(`Iterating ${nodeUids.length} thumbnails`);
217
+ yield* this.download.iterateThumbnails(getUids(nodeUids), thumbnailType, signal);
134
218
  }
135
219
  }
@@ -1,9 +1,12 @@
1
- import { ProtonDriveTelemetry } from '../interface';
1
+ import { Logger, ProtonDriveTelemetry } from '../interface';
2
2
  import { getMockLogger } from './logger';
3
3
 
4
- export function getMockTelemetry(): ProtonDriveTelemetry {
4
+ export function getMockTelemetry(): ProtonDriveTelemetry & { mockLogger: Logger } {
5
+ const mockLogger = getMockLogger();
6
+
5
7
  return {
6
- getLogger: getMockLogger,
8
+ mockLogger,
9
+ getLogger: () => mockLogger,
7
10
  recordMetric: jest.fn(),
8
11
  };
9
12
  }
@@ -121,6 +121,14 @@ export function convertInternalNode(node: InternalPartialNode): PublicMaybeNode
121
121
  } as PublicNodeEntity);
122
122
  }
123
123
 
124
+ export async function* convertInternalRevisionIterator(
125
+ revisionIterator: AsyncGenerator<InternalRevision>,
126
+ ): AsyncGenerator<PublicRevision> {
127
+ for await (const revision of revisionIterator) {
128
+ yield convertInternalRevision(revision);
129
+ }
130
+ }
131
+
124
132
  function convertInternalRevision(revision: InternalRevision): PublicRevision {
125
133
  return {
126
134
  uid: revision.uid,
@@ -1 +0,0 @@
1
- {"version":3,"file":"sdkDiagnosticFull.js","sourceRoot":"","sources":["../../src/diagnostic/sdkDiagnosticFull.ts"],"names":[],"mappings":";;;AAIA,mDAAgD;AAEhD;;;GAGG;AACH,MAAa,iBAAiB;IAEd;IACA;IACA;IAHZ,YACY,UAAsB,EACtB,SAA8B,EAC9B,UAAgC;QAFhC,eAAU,GAAV,UAAU,CAAY;QACtB,cAAS,GAAT,SAAS,CAAqB;QAC9B,eAAU,GAAV,UAAU,CAAsB;QAExC,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;QAC7B,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;IACjC,CAAC;IAED,KAAK,CAAC,CAAC,aAAa,CAAC,OAA2B;QAC5C,KAAK,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC;IACpE,CAAC;IAED,KAAK,CAAC,CAAC,cAAc,CAAC,IAAe,EAAE,OAA2B;QAC9D,KAAK,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;IAC3E,CAAC;IAEO,KAAK,CAAC,CAAC,WAAW,CAAC,SAA2C;QAClE,KAAK,CAAC,CAAC,IAAA,6BAAa,EAAC,SAAS,EAAE,IAAI,CAAC,iBAAiB,EAAE,EAAE,EAAE,eAAe,EAAE,IAAI,EAAE,CAAC,CAAC;IACzF,CAAC;IAEO,KAAK,CAAC,CAAC,iBAAiB;QAC5B,KAAK,CAAC,CAAC,IAAA,6BAAa,EAAC,IAAI,CAAC,SAAS,CAAC,aAAa,EAAE,EAAE,IAAI,CAAC,UAAU,CAAC,aAAa,EAAE,CAAC,CAAC;IAC1F,CAAC;CACJ;AA1BD,8CA0BC"}
@@ -1,19 +0,0 @@
1
- import { PrivateKey } from '../../crypto';
2
- import { ProtonDriveCryptoCache, Logger } from '../../interface';
3
- import { DecryptedNodeKeys } from './interface';
4
- /**
5
- * Provides caching for public link crypto material.
6
- *
7
- * The cache is responsible for serialising and deserialising public link
8
- * crypto material.
9
- */
10
- export declare class SharingPublicCryptoCache {
11
- private logger;
12
- private driveCache;
13
- constructor(logger: Logger, driveCache: ProtonDriveCryptoCache);
14
- setShareKey(shareKey: PrivateKey): Promise<void>;
15
- getShareKey(): Promise<PrivateKey>;
16
- setNodeKeys(nodeUid: string, keys: DecryptedNodeKeys): Promise<void>;
17
- getNodeKeys(nodeUid: string): Promise<DecryptedNodeKeys>;
18
- removeNodeKeys(nodeUids: string[]): Promise<void>;
19
- }
@@ -1,72 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.SharingPublicCryptoCache = void 0;
4
- /**
5
- * Provides caching for public link crypto material.
6
- *
7
- * The cache is responsible for serialising and deserialising public link
8
- * crypto material.
9
- */
10
- class SharingPublicCryptoCache {
11
- logger;
12
- driveCache;
13
- constructor(logger, driveCache) {
14
- this.logger = logger;
15
- this.driveCache = driveCache;
16
- this.logger = logger;
17
- this.driveCache = driveCache;
18
- }
19
- async setShareKey(shareKey) {
20
- await this.driveCache.setEntity(getShareKeyCacheKey(), {
21
- publicShareKey: {
22
- key: shareKey,
23
- },
24
- });
25
- }
26
- async getShareKey() {
27
- const shareKeyData = await this.driveCache.getEntity(getShareKeyCacheKey());
28
- if (!shareKeyData.publicShareKey) {
29
- try {
30
- await this.driveCache.removeEntities([getShareKeyCacheKey()]);
31
- }
32
- catch (removingError) {
33
- this.logger.warn(`Failed to remove corrupted public share key from the cache: ${removingError instanceof Error ? removingError.message : removingError}`);
34
- }
35
- throw new Error('Failed to deserialize public share key');
36
- }
37
- return shareKeyData.publicShareKey.key;
38
- }
39
- async setNodeKeys(nodeUid, keys) {
40
- const cacheUid = getNodeCacheKey(nodeUid);
41
- await this.driveCache.setEntity(cacheUid, {
42
- nodeKeys: keys,
43
- });
44
- }
45
- async getNodeKeys(nodeUid) {
46
- const nodeKeysData = await this.driveCache.getEntity(getNodeCacheKey(nodeUid));
47
- if (!nodeKeysData.nodeKeys) {
48
- try {
49
- await this.removeNodeKeys([nodeUid]);
50
- }
51
- catch (removingError) {
52
- // The node keys will not be returned, thus SDK will re-fetch
53
- // and re-cache it. Setting it again should then fix the problem.
54
- this.logger.warn(`Failed to remove corrupted public node keys from the cache: ${removingError instanceof Error ? removingError.message : removingError}`);
55
- }
56
- throw new Error(`Failed to deserialize public node keys`);
57
- }
58
- return nodeKeysData.nodeKeys;
59
- }
60
- async removeNodeKeys(nodeUids) {
61
- const cacheUids = nodeUids.map(getNodeCacheKey);
62
- await this.driveCache.removeEntities(cacheUids);
63
- }
64
- }
65
- exports.SharingPublicCryptoCache = SharingPublicCryptoCache;
66
- function getShareKeyCacheKey() {
67
- return 'publicShareKey';
68
- }
69
- function getNodeCacheKey(nodeUid) {
70
- return `publicNodeKeys-${nodeUid}`;
71
- }
72
- //# sourceMappingURL=cryptoCache.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"cryptoCache.js","sourceRoot":"","sources":["../../../src/internal/sharingPublic/cryptoCache.ts"],"names":[],"mappings":";;;AAIA;;;;;GAKG;AACH,MAAa,wBAAwB;IAErB;IACA;IAFZ,YACY,MAAc,EACd,UAAkC;QADlC,WAAM,GAAN,MAAM,CAAQ;QACd,eAAU,GAAV,UAAU,CAAwB;QAE1C,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;IACjC,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,QAAoB;QAClC,MAAM,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,mBAAmB,EAAE,EAAE;YACnD,cAAc,EAAE;gBACZ,GAAG,EAAE,QAAQ;aAChB;SACJ,CAAC,CAAC;IACP,CAAC;IAED,KAAK,CAAC,WAAW;QACb,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,mBAAmB,EAAE,CAAC,CAAC;QAC5E,IAAI,CAAC,YAAY,CAAC,cAAc,EAAE,CAAC;YAC/B,IAAI,CAAC;gBACD,MAAM,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC,mBAAmB,EAAE,CAAC,CAAC,CAAC;YAClE,CAAC;YAAC,OAAO,aAAsB,EAAE,CAAC;gBAC9B,IAAI,CAAC,MAAM,CAAC,IAAI,CACZ,+DAA+D,aAAa,YAAY,KAAK,CAAC,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,aAAa,EAAE,CAC1I,CAAC;YACN,CAAC;YACD,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;QAC9D,CAAC;QACD,OAAO,YAAY,CAAC,cAAc,CAAC,GAAG,CAAC;IAC3C,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,OAAe,EAAE,IAAuB;QACtD,MAAM,QAAQ,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;QAC1C,MAAM,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,QAAQ,EAAE;YACtC,QAAQ,EAAE,IAAI;SACjB,CAAC,CAAC;IACP,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,OAAe;QAC7B,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC;QAC/E,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,CAAC;YACzB,IAAI,CAAC;gBACD,MAAM,IAAI,CAAC,cAAc,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;YACzC,CAAC;YAAC,OAAO,aAAsB,EAAE,CAAC;gBAC9B,6DAA6D;gBAC7D,iEAAiE;gBACjE,IAAI,CAAC,MAAM,CAAC,IAAI,CACZ,+DAA+D,aAAa,YAAY,KAAK,CAAC,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,aAAa,EAAE,CAC1I,CAAC;YACN,CAAC;YACD,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;QAC9D,CAAC;QACD,OAAO,YAAY,CAAC,QAAQ,CAAC;IACjC,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,QAAkB;QACnC,MAAM,SAAS,GAAG,QAAQ,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;QAChD,MAAM,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;IACpD,CAAC;CACJ;AA5DD,4DA4DC;AAED,SAAS,mBAAmB;IACxB,OAAO,gBAAgB,CAAC;AAC5B,CAAC;AAED,SAAS,eAAe,CAAC,OAAe;IACpC,OAAO,kBAAkB,OAAO,EAAE,CAAC;AACvC,CAAC"}
@@ -1,9 +0,0 @@
1
- import { DriveCrypto, PrivateKey } from '../../crypto';
2
- import { ProtonDriveTelemetry, ProtonDriveAccount } from '../../interface';
3
- import { NodesCryptoService } from '../nodes/cryptoService';
4
- import { EncryptedShareCrypto } from './interface';
5
- export declare class SharingPublicCryptoService extends NodesCryptoService {
6
- private password;
7
- constructor(telemetry: ProtonDriveTelemetry, driveCrypto: DriveCrypto, account: ProtonDriveAccount, password: string);
8
- decryptPublicLinkShareKey(encryptedShare: EncryptedShareCrypto): Promise<PrivateKey>;
9
- }
@@ -1 +0,0 @@
1
- {"version":3,"file":"cryptoService.js","sourceRoot":"","sources":["../../../src/internal/sharingPublic/cryptoService.ts"],"names":[],"mappings":";;;AAAA,+BAAyB;AAEzB,yCAA4E;AAC5E,sCAAmD;AACnD,+CAWyB;AACzB,0DAA4D;AAG5D,MAAa,0BAA2B,SAAQ,kCAAkB;IAKlD;IAJZ,YACI,SAA+B,EAC/B,WAAwB,EACxB,OAA2B,EACnB,QAAgB;QAExB,KAAK,CAAC,SAAS,EAAE,WAAW,EAAE,OAAO,EAAE,IAAI,2BAA2B,CAAC,SAAS,CAAC,CAAC,CAAC;QAF3E,aAAQ,GAAR,QAAQ,CAAQ;QAGxB,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC7B,CAAC;IAED,KAAK,CAAC,yBAAyB,CAAC,cAAoC;QAChE,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,yBAAyB,CACtE,IAAI,CAAC,QAAQ,EACb,cAAc,CAAC,qBAAqB,EACpC,cAAc,CAAC,UAAU,EACzB,cAAc,CAAC,iBAAiB,CACnC,CAAC;QACF,OAAO,QAAQ,CAAC;IACpB,CAAC;CACJ;AApBD,gEAoBC;AAED,MAAM,2BAA2B;IACrB,MAAM,CAAS;IACf,SAAS,CAAuB;IAExC,YAAY,SAA+B;QACvC,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC,SAAS,CAAC,sBAAsB,CAAC,CAAC;IAC9D,CAAC;IAED,KAAK,CAAC,mBAAmB,CACrB,IAAyC,EACzC,KAAmC,EACnC,aAAqB,EACrB,QAA6B,EAC7B,kBAA4B,EAC5B,aAAsB,EACtB,4BAA4B,GAAG,KAAK;QAEpC,IAAI,QAAQ,KAAK,4BAAmB,CAAC,gBAAgB,EAAE,CAAC;YACpD,OAAO,IAAA,oBAAQ,EAAC,aAAa,IAAK,IAAsB,CAAC,CAAC;QAC9D,CAAC;QAED,OAAO,IAAA,uBAAW,EAAC;YACf,aAAa;YACb,KAAK,EAAE,CAAC,aAAa;gBACjB,CAAC,CAAC,IAAA,QAAC,EAAC,MAAM,CAAC,CAAC,CAAC,CAAA,uCAAuC;gBACpD,CAAC,CAAC,IAAA,+BAAsB,EAAC,QAAQ,EAAE,kBAAkB,EAAE,aAAa,EAAE,4BAA4B,CAAC;SAC1G,CAAC,CAAC;IACP,CAAC;IAED,qBAAqB,CACjB,IAAyC,EACzC,KAAkC,EAClC,KAAc;QAEd,MAAM,cAAc,GAAG,IAAI,CAAC,YAAY,GAAG,IAAI,IAAI,CAAC,YAAY,CAAC,CAAC;QAElE,IAAI,CAAC,MAAM,CAAC,KAAK,CACb,sCAAsC,IAAI,CAAC,GAAG,uBAAuB,cAAc,GAAG,EACtF,KAAK,CACR,CAAC;QAEF,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC;YACxB,SAAS,EAAE,iBAAiB;YAC5B,UAAU,EAAE,4BAAgB,CAAC,YAAY;YACzC,KAAK;YACL,cAAc;YACd,KAAK;YACL,GAAG,EAAE,IAAI,CAAC,GAAG;SAChB,CAAC,CAAC;IACP,CAAC;IAED,uBAAuB;QACnB,0DAA0D;QAC1D,qEAAqE;IACzE,CAAC;CACJ"}
@@ -1,6 +0,0 @@
1
- export type { EncryptedNode, EncryptedNodeFolderCrypto, EncryptedNodeFileCrypto, DecryptedNode, DecryptedNodeKeys, } from '../nodes/interface';
2
- export interface EncryptedShareCrypto {
3
- base64UrlPasswordSalt: string;
4
- armoredKey: string;
5
- armoredPassphrase: string;
6
- }
@@ -1,3 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- //# sourceMappingURL=interface.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"interface.js","sourceRoot":"","sources":["../../../src/internal/sharingPublic/interface.ts"],"names":[],"mappings":""}
@@ -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,79 +0,0 @@
1
- import { PrivateKey } from '../../crypto';
2
- import { ProtonDriveCryptoCache, Logger } from '../../interface';
3
- import { DecryptedNodeKeys } from './interface';
4
-
5
- /**
6
- * Provides caching for public link crypto material.
7
- *
8
- * The cache is responsible for serialising and deserialising public link
9
- * crypto material.
10
- */
11
- export class SharingPublicCryptoCache {
12
- constructor(
13
- private logger: Logger,
14
- private driveCache: ProtonDriveCryptoCache,
15
- ) {
16
- this.logger = logger;
17
- this.driveCache = driveCache;
18
- }
19
-
20
- async setShareKey(shareKey: PrivateKey): Promise<void> {
21
- await this.driveCache.setEntity(getShareKeyCacheKey(), {
22
- publicShareKey: {
23
- key: shareKey,
24
- },
25
- });
26
- }
27
-
28
- async getShareKey(): Promise<PrivateKey> {
29
- const shareKeyData = await this.driveCache.getEntity(getShareKeyCacheKey());
30
- if (!shareKeyData.publicShareKey) {
31
- try {
32
- await this.driveCache.removeEntities([getShareKeyCacheKey()]);
33
- } catch (removingError: unknown) {
34
- this.logger.warn(
35
- `Failed to remove corrupted public share key from the cache: ${removingError instanceof Error ? removingError.message : removingError}`,
36
- );
37
- }
38
- throw new Error('Failed to deserialize public share key');
39
- }
40
- return shareKeyData.publicShareKey.key;
41
- }
42
-
43
- async setNodeKeys(nodeUid: string, keys: DecryptedNodeKeys): Promise<void> {
44
- const cacheUid = getNodeCacheKey(nodeUid);
45
- await this.driveCache.setEntity(cacheUid, {
46
- nodeKeys: keys,
47
- });
48
- }
49
-
50
- async getNodeKeys(nodeUid: string): Promise<DecryptedNodeKeys> {
51
- const nodeKeysData = await this.driveCache.getEntity(getNodeCacheKey(nodeUid));
52
- if (!nodeKeysData.nodeKeys) {
53
- try {
54
- await this.removeNodeKeys([nodeUid]);
55
- } catch (removingError: unknown) {
56
- // The node keys will not be returned, thus SDK will re-fetch
57
- // and re-cache it. Setting it again should then fix the problem.
58
- this.logger.warn(
59
- `Failed to remove corrupted public node keys from the cache: ${removingError instanceof Error ? removingError.message : removingError}`,
60
- );
61
- }
62
- throw new Error(`Failed to deserialize public node keys`);
63
- }
64
- return nodeKeysData.nodeKeys;
65
- }
66
-
67
- async removeNodeKeys(nodeUids: string[]): Promise<void> {
68
- const cacheUids = nodeUids.map(getNodeCacheKey);
69
- await this.driveCache.removeEntities(cacheUids);
70
- }
71
- }
72
-
73
- function getShareKeyCacheKey() {
74
- return 'publicShareKey';
75
- }
76
-
77
- function getNodeCacheKey(nodeUid: string) {
78
- return `publicNodeKeys-${nodeUid}`;
79
- }
@@ -1,14 +0,0 @@
1
- // TODO: use them directly, or avoid them completely
2
- export type {
3
- EncryptedNode,
4
- EncryptedNodeFolderCrypto,
5
- EncryptedNodeFileCrypto,
6
- DecryptedNode,
7
- DecryptedNodeKeys,
8
- } from '../nodes/interface';
9
-
10
- export interface EncryptedShareCrypto {
11
- base64UrlPasswordSalt: string;
12
- armoredKey: string;
13
- armoredPassphrase: string;
14
- }
@@ -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
- }