@protontech/drive-sdk 0.7.0 → 0.7.2

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 (99) hide show
  1. package/dist/interface/index.d.ts +1 -0
  2. package/dist/interface/index.js.map +1 -1
  3. package/dist/interface/nodes.d.ts +14 -10
  4. package/dist/interface/nodes.js +5 -8
  5. package/dist/interface/nodes.js.map +1 -1
  6. package/dist/interface/photos.d.ts +62 -0
  7. package/dist/interface/photos.js +3 -0
  8. package/dist/interface/photos.js.map +1 -0
  9. package/dist/internal/apiService/driveTypes.d.ts +1294 -517
  10. package/dist/internal/errors.d.ts +1 -0
  11. package/dist/internal/errors.js +4 -0
  12. package/dist/internal/errors.js.map +1 -1
  13. package/dist/internal/nodes/apiService.d.ts +60 -9
  14. package/dist/internal/nodes/apiService.js +125 -81
  15. package/dist/internal/nodes/apiService.js.map +1 -1
  16. package/dist/internal/nodes/apiService.test.js +2 -0
  17. package/dist/internal/nodes/apiService.test.js.map +1 -1
  18. package/dist/internal/nodes/cache.d.ts +16 -8
  19. package/dist/internal/nodes/cache.js +19 -5
  20. package/dist/internal/nodes/cache.js.map +1 -1
  21. package/dist/internal/nodes/cache.test.js +1 -0
  22. package/dist/internal/nodes/cache.test.js.map +1 -1
  23. package/dist/internal/nodes/cryptoService.d.ts +1 -1
  24. package/dist/internal/nodes/cryptoService.js +4 -4
  25. package/dist/internal/nodes/cryptoService.js.map +1 -1
  26. package/dist/internal/nodes/cryptoService.test.js +3 -3
  27. package/dist/internal/nodes/cryptoService.test.js.map +1 -1
  28. package/dist/internal/nodes/events.d.ts +2 -2
  29. package/dist/internal/nodes/events.js.map +1 -1
  30. package/dist/internal/nodes/index.test.js +1 -0
  31. package/dist/internal/nodes/index.test.js.map +1 -1
  32. package/dist/internal/nodes/interface.d.ts +1 -0
  33. package/dist/internal/nodes/nodesAccess.d.ts +29 -20
  34. package/dist/internal/nodes/nodesAccess.js +41 -29
  35. package/dist/internal/nodes/nodesAccess.js.map +1 -1
  36. package/dist/internal/nodes/nodesManagement.d.ts +32 -12
  37. package/dist/internal/nodes/nodesManagement.js +30 -13
  38. package/dist/internal/nodes/nodesManagement.js.map +1 -1
  39. package/dist/internal/nodes/nodesManagement.test.js +39 -4
  40. package/dist/internal/nodes/nodesManagement.test.js.map +1 -1
  41. package/dist/internal/nodes/nodesRevisions.d.ts +2 -2
  42. package/dist/internal/nodes/nodesRevisions.js.map +1 -1
  43. package/dist/internal/photos/albums.d.ts +2 -2
  44. package/dist/internal/photos/albums.js.map +1 -1
  45. package/dist/internal/photos/index.d.ts +19 -3
  46. package/dist/internal/photos/index.js +38 -8
  47. package/dist/internal/photos/index.js.map +1 -1
  48. package/dist/internal/photos/interface.d.ts +18 -9
  49. package/dist/internal/photos/nodes.d.ts +57 -0
  50. package/dist/internal/photos/nodes.js +166 -0
  51. package/dist/internal/photos/nodes.js.map +1 -0
  52. package/dist/internal/photos/nodes.test.d.ts +1 -0
  53. package/dist/internal/photos/nodes.test.js +233 -0
  54. package/dist/internal/photos/nodes.test.js.map +1 -0
  55. package/dist/internal/photos/timeline.d.ts +2 -2
  56. package/dist/internal/photos/timeline.js.map +1 -1
  57. package/dist/internal/photos/timeline.test.js.map +1 -1
  58. package/dist/protonDriveClient.d.ts +10 -1
  59. package/dist/protonDriveClient.js +18 -3
  60. package/dist/protonDriveClient.js.map +1 -1
  61. package/dist/protonDrivePhotosClient.d.ts +12 -8
  62. package/dist/protonDrivePhotosClient.js +15 -9
  63. package/dist/protonDrivePhotosClient.js.map +1 -1
  64. package/dist/protonDrivePublicLinkClient.d.ts +7 -1
  65. package/dist/protonDrivePublicLinkClient.js +9 -0
  66. package/dist/protonDrivePublicLinkClient.js.map +1 -1
  67. package/dist/transformers.d.ts +7 -2
  68. package/dist/transformers.js +37 -0
  69. package/dist/transformers.js.map +1 -1
  70. package/package.json +1 -1
  71. package/src/interface/index.ts +1 -0
  72. package/src/interface/nodes.ts +14 -11
  73. package/src/interface/photos.ts +67 -0
  74. package/src/internal/apiService/driveTypes.ts +1294 -517
  75. package/src/internal/errors.ts +4 -0
  76. package/src/internal/nodes/apiService.test.ts +2 -0
  77. package/src/internal/nodes/apiService.ts +187 -114
  78. package/src/internal/nodes/cache.test.ts +1 -0
  79. package/src/internal/nodes/cache.ts +32 -13
  80. package/src/internal/nodes/cryptoService.test.ts +13 -3
  81. package/src/internal/nodes/cryptoService.ts +4 -4
  82. package/src/internal/nodes/events.ts +2 -2
  83. package/src/internal/nodes/index.test.ts +1 -0
  84. package/src/internal/nodes/interface.ts +1 -0
  85. package/src/internal/nodes/nodesAccess.ts +82 -54
  86. package/src/internal/nodes/nodesManagement.test.ts +48 -4
  87. package/src/internal/nodes/nodesManagement.ts +76 -26
  88. package/src/internal/nodes/nodesRevisions.ts +3 -3
  89. package/src/internal/photos/albums.ts +2 -2
  90. package/src/internal/photos/index.ts +45 -3
  91. package/src/internal/photos/interface.ts +21 -9
  92. package/src/internal/photos/nodes.test.ts +258 -0
  93. package/src/internal/photos/nodes.ts +234 -0
  94. package/src/internal/photos/timeline.test.ts +2 -2
  95. package/src/internal/photos/timeline.ts +2 -2
  96. package/src/protonDriveClient.ts +20 -3
  97. package/src/protonDrivePhotosClient.ts +31 -23
  98. package/src/protonDrivePublicLinkClient.ts +11 -0
  99. package/src/transformers.ts +49 -2
@@ -424,6 +424,12 @@ export class ProtonDriveClient {
424
424
  * The operation is performed node by node and the results are yielded
425
425
  * as they are available. Order of the results is not guaranteed.
426
426
  *
427
+ * The `nodeUids` can be a list of node entities or their UIDs, or a list
428
+ * of objects with `uid` and `name` properties where the name is the new
429
+ * name of the copied node. By default, the name is the same as the
430
+ * original node. Use `getAvailableName` to get the available name for the
431
+ * new node in the target parent node in case of a name conflict.
432
+ *
427
433
  * If one of the nodes fails to copy, the operation continues with the
428
434
  * rest of the nodes. Use `NodeResult` to check the status of the action.
429
435
  *
@@ -433,12 +439,23 @@ export class ProtonDriveClient {
433
439
  * @returns An async generator of the results of the copy operation
434
440
  */
435
441
  async *copyNodes(
436
- nodeUids: NodeOrUid[],
442
+ nodesOrNodeUidsOrWithNames: (NodeOrUid | { uid: string; name: string })[],
437
443
  newParentNodeUid: NodeOrUid,
438
444
  signal?: AbortSignal,
439
445
  ): AsyncGenerator<NodeResultWithNewUid> {
440
- this.logger.info(`Copying ${nodeUids.length} nodes to ${getUid(newParentNodeUid)}`);
441
- yield* this.nodes.management.copyNodes(getUids(nodeUids), getUid(newParentNodeUid), signal);
446
+ this.logger.info(`Copying ${nodesOrNodeUidsOrWithNames.length} nodes to ${getUid(newParentNodeUid)}`);
447
+
448
+ const nodeUidsOrWithNames = nodesOrNodeUidsOrWithNames.map((param) => {
449
+ if (typeof param === 'string') {
450
+ return param;
451
+ }
452
+ if ('uid' in param && 'name' in param && typeof param.uid === 'string' && typeof param.name === 'string') {
453
+ return { uid: param.uid, name: param.name };
454
+ }
455
+ return getUid(param);
456
+ });
457
+
458
+ yield* this.nodes.management.copyNodes(nodeUidsOrWithNames, getUid(newParentNodeUid), signal);
442
459
  }
443
460
 
444
461
  /**
@@ -2,12 +2,12 @@ import {
2
2
  Logger,
3
3
  ProtonDriveClientContructorParameters,
4
4
  NodeOrUid,
5
- MaybeMissingNode,
5
+ MaybeMissingPhotoNode,
6
6
  UploadMetadata,
7
7
  FileDownloader,
8
8
  FileUploader,
9
9
  SDKEvent,
10
- MaybeNode,
10
+ MaybePhotoNode,
11
11
  ThumbnailType,
12
12
  ThumbnailResult,
13
13
  ShareNodeSettings,
@@ -22,22 +22,22 @@ import { getConfig } from './config';
22
22
  import { DriveCrypto } from './crypto';
23
23
  import { Telemetry } from './telemetry';
24
24
  import {
25
- convertInternalMissingNodeIterator,
26
- convertInternalNode,
27
- convertInternalNodeIterator,
28
- convertInternalNodePromise,
25
+ convertInternalMissingPhotoNodeIterator,
26
+ convertInternalPhotoNode,
27
+ convertInternalPhotoNodeIterator,
28
+ convertInternalPhotoNodePromise,
29
29
  getUid,
30
30
  getUids,
31
31
  } from './transformers';
32
32
  import { DriveAPIService } from './internal/apiService';
33
33
  import { initDownloadModule } from './internal/download';
34
34
  import { DriveEventsService, DriveListener, EventSubscription } from './internal/events';
35
- import { initNodesModule } from './internal/nodes';
36
35
  import {
37
36
  PHOTOS_SHARE_TARGET_TYPES,
38
37
  initPhotosModule,
39
38
  initPhotoSharesModule,
40
39
  initPhotoUploadModule,
40
+ initPhotosNodesModule,
41
41
  } from './internal/photos';
42
42
  import { SDKEvents } from './internal/sdkEvents';
43
43
  import { initSharesModule } from './internal/shares';
@@ -56,7 +56,7 @@ export class ProtonDrivePhotosClient {
56
56
  private sdkEvents: SDKEvents;
57
57
  private events: DriveEventsService;
58
58
  private photoShares: ReturnType<typeof initPhotoSharesModule>;
59
- private nodes: ReturnType<typeof initNodesModule>;
59
+ private nodes: ReturnType<typeof initPhotosNodesModule>;
60
60
  private sharing: ReturnType<typeof initSharingModule>;
61
61
  private download: ReturnType<typeof initDownloadModule>;
62
62
  private upload: ReturnType<typeof initPhotoUploadModule>;
@@ -107,7 +107,7 @@ export class ProtonDrivePhotosClient {
107
107
  cryptoModule,
108
108
  coreShares,
109
109
  );
110
- this.nodes = initNodesModule(
110
+ this.nodes = initPhotosNodesModule(
111
111
  telemetry,
112
112
  apiService,
113
113
  entitiesCache,
@@ -197,6 +197,14 @@ export class ProtonDrivePhotosClient {
197
197
  return this.events.subscribeToCoreEvents(callback);
198
198
  }
199
199
 
200
+ /**
201
+ * @returns The root folder to Photos section of the user.
202
+ */
203
+ async getMyPhotosRootFolder(): Promise<MaybePhotoNode> {
204
+ this.logger.info('Getting my photos root folder');
205
+ return convertInternalPhotoNodePromise(this.nodes.access.getVolumeRootFolder());
206
+ }
207
+
200
208
  /**
201
209
  * Iterates all the photos for the timeline view.
202
210
  *
@@ -224,9 +232,9 @@ export class ProtonDrivePhotosClient {
224
232
  *
225
233
  * See `ProtonDriveClient.iterateTrashedNodes` for more information.
226
234
  */
227
- async *iterateTrashedNodes(signal?: AbortSignal): AsyncGenerator<MaybeNode> {
235
+ async *iterateTrashedNodes(signal?: AbortSignal): AsyncGenerator<MaybePhotoNode> {
228
236
  this.logger.info('Iterating trashed nodes');
229
- yield* convertInternalNodeIterator(this.nodes.access.iterateTrashedNodes(signal));
237
+ yield * convertInternalPhotoNodeIterator(this.nodes.access.iterateTrashedNodes(signal));
230
238
  }
231
239
 
232
240
  /**
@@ -234,10 +242,10 @@ export class ProtonDrivePhotosClient {
234
242
  *
235
243
  * See `ProtonDriveClient.iterateNodes` for more information.
236
244
  */
237
- async *iterateNodes(nodeUids: NodeOrUid[], signal?: AbortSignal): AsyncGenerator<MaybeMissingNode> {
245
+ async *iterateNodes(nodeUids: NodeOrUid[], signal?: AbortSignal): AsyncGenerator<MaybeMissingPhotoNode> {
238
246
  this.logger.info(`Iterating ${nodeUids.length} nodes`);
239
247
  // TODO: expose photo type
240
- yield* convertInternalMissingNodeIterator(this.nodes.access.iterateNodes(getUids(nodeUids), signal));
248
+ yield * convertInternalMissingPhotoNodeIterator(this.nodes.access.iterateNodes(getUids(nodeUids), signal));
241
249
  }
242
250
 
243
251
  /**
@@ -245,9 +253,9 @@ export class ProtonDrivePhotosClient {
245
253
  *
246
254
  * See `ProtonDriveClient.getNode` for more information.
247
255
  */
248
- async getNode(nodeUid: NodeOrUid): Promise<MaybeNode> {
256
+ async getNode(nodeUid: NodeOrUid): Promise<MaybePhotoNode> {
249
257
  this.logger.info(`Getting node ${getUid(nodeUid)}`);
250
- return convertInternalNodePromise(this.nodes.access.getNode(getUid(nodeUid)));
258
+ return convertInternalPhotoNodePromise(this.nodes.access.getNode(getUid(nodeUid)));
251
259
  }
252
260
 
253
261
  /**
@@ -255,9 +263,9 @@ export class ProtonDrivePhotosClient {
255
263
  *
256
264
  * See `ProtonDriveClient.renameNode` for more information.
257
265
  */
258
- async renameNode(nodeUid: NodeOrUid, newName: string): Promise<MaybeNode> {
266
+ async renameNode(nodeUid: NodeOrUid, newName: string): Promise<MaybePhotoNode> {
259
267
  this.logger.info(`Renaming node ${getUid(nodeUid)}`);
260
- return convertInternalNodePromise(this.nodes.management.renameNode(getUid(nodeUid), newName));
268
+ return convertInternalPhotoNodePromise(this.nodes.management.renameNode(getUid(nodeUid), newName));
261
269
  }
262
270
 
263
271
  /**
@@ -305,9 +313,9 @@ export class ProtonDrivePhotosClient {
305
313
  *
306
314
  * See `ProtonDriveClient.iterateSharedNodes` for more information.
307
315
  */
308
- async *iterateSharedNodes(signal?: AbortSignal): AsyncGenerator<MaybeNode> {
316
+ async *iterateSharedNodes(signal?: AbortSignal): AsyncGenerator<MaybePhotoNode> {
309
317
  this.logger.info('Iterating shared nodes by me');
310
- yield* convertInternalNodeIterator(this.sharing.access.iterateSharedNodes(signal));
318
+ yield * convertInternalPhotoNodeIterator(this.sharing.access.iterateSharedNodes(signal));
311
319
  }
312
320
 
313
321
  /**
@@ -315,11 +323,11 @@ export class ProtonDrivePhotosClient {
315
323
  *
316
324
  * See `ProtonDriveClient.iterateSharedNodesWithMe` for more information.
317
325
  */
318
- async *iterateSharedNodesWithMe(signal?: AbortSignal): AsyncGenerator<MaybeNode> {
326
+ async *iterateSharedNodesWithMe(signal?: AbortSignal): AsyncGenerator<MaybePhotoNode> {
319
327
  this.logger.info('Iterating shared nodes with me');
320
328
 
321
329
  for await (const node of this.sharing.access.iterateSharedNodesWithMe(signal)) {
322
- yield convertInternalNode(node);
330
+ yield convertInternalPhotoNode(node);
323
331
  }
324
332
  }
325
333
 
@@ -482,9 +490,9 @@ export class ProtonDrivePhotosClient {
482
490
  *
483
491
  * The output is not sorted and the order of the nodes is not guaranteed.
484
492
  */
485
- async *iterateAlbums(signal?: AbortSignal): AsyncGenerator<MaybeNode> {
493
+ async *iterateAlbums(signal?: AbortSignal): AsyncGenerator<MaybePhotoNode> {
486
494
  this.logger.info('Iterating albums');
487
495
  // TODO: expose album type
488
- yield* convertInternalNodeIterator(this.photos.albums.iterateAlbums(signal));
496
+ yield * convertInternalPhotoNodeIterator(this.photos.albums.iterateAlbums(signal));
489
497
  }
490
498
  }
@@ -18,6 +18,7 @@ import {
18
18
  UploadMetadata,
19
19
  FileUploader,
20
20
  NodeResult,
21
+ SDKEvent,
21
22
  } from './interface';
22
23
  import { Telemetry } from './telemetry';
23
24
  import {
@@ -164,6 +165,16 @@ export class ProtonDrivePublicLinkClient {
164
165
  };
165
166
  }
166
167
 
168
+ /**
169
+ * Subscribes to the general SDK events.
170
+ *
171
+ * See `ProtonDriveClient.onMessage` for more information.
172
+ */
173
+ onMessage(eventName: SDKEvent, callback: () => void): () => void {
174
+ this.logger.debug(`Subscribing to event ${eventName}`);
175
+ return this.sdkEvents.addListener(eventName, callback);
176
+ }
177
+
167
178
  /**
168
179
  * @returns The root folder to the public link.
169
180
  */
@@ -1,15 +1,19 @@
1
1
  import {
2
2
  MaybeNode as PublicMaybeNode,
3
3
  MaybeMissingNode as PublicMaybeMissingNode,
4
- NodeEntity as PublicNodeEntity,
5
4
  DegradedNode as PublicDegradedNode,
6
5
  Revision as PublicRevision,
7
6
  Result,
8
7
  resultOk,
9
8
  resultError,
10
9
  MissingNode,
10
+ MaybePhotoNode as PublicMaybePhotoNode,
11
+ MaybeMissingPhotoNode as PublicMaybeMissingPhotoNode,
12
+ PhotoNode as PublicPhotoNode,
13
+ DegradedPhotoNode as PublicDegradedPhotoNode,
11
14
  } from './interface';
12
15
  import { DecryptedNode as InternalNode, DecryptedRevision as InternalRevision } from './internal/nodes';
16
+ import { DecryptedPhotoNode as InternalPartialPhotoNode } from './internal/photos';
13
17
 
14
18
  type InternalPartialNode = Pick<
15
19
  InternalNode,
@@ -25,6 +29,7 @@ type InternalPartialNode = Pick<
25
29
  | 'isShared'
26
30
  | 'isSharedPublicly'
27
31
  | 'creationTime'
32
+ | 'modificationTime'
28
33
  | 'trashTime'
29
34
  | 'activeRevision'
30
35
  | 'folder'
@@ -93,6 +98,7 @@ export function convertInternalNode(node: InternalPartialNode): PublicMaybeNode
93
98
  isShared: node.isShared,
94
99
  isSharedPublicly: node.isSharedPublicly,
95
100
  creationTime: node.creationTime,
101
+ modificationTime: node.modificationTime,
96
102
  trashTime: node.trashTime,
97
103
  totalStorageSize: node.totalStorageSize,
98
104
  folder: node.folder,
@@ -118,7 +124,48 @@ export function convertInternalNode(node: InternalPartialNode): PublicMaybeNode
118
124
  ...baseNodeMetadata,
119
125
  name: name.value,
120
126
  activeRevision: activeRevision?.ok ? convertInternalRevision(activeRevision.value) : undefined,
121
- } as PublicNodeEntity);
127
+ });
128
+ }
129
+
130
+ export async function* convertInternalPhotoNodeIterator(
131
+ photoNodeIterator: AsyncGenerator<InternalPartialPhotoNode>,
132
+ ): AsyncGenerator<PublicMaybePhotoNode> {
133
+ for await (const photoNode of photoNodeIterator) {
134
+ yield convertInternalPhotoNode(photoNode);
135
+ }
136
+ }
137
+
138
+ export async function* convertInternalMissingPhotoNodeIterator(
139
+ photoNodeIterator: AsyncGenerator<InternalPartialPhotoNode | MissingNode>,
140
+ ): AsyncGenerator<PublicMaybeMissingPhotoNode> {
141
+ for await (const photoNode of photoNodeIterator) {
142
+ if ('missingUid' in photoNode) {
143
+ yield resultError(photoNode);
144
+ } else {
145
+ yield convertInternalPhotoNode(photoNode);
146
+ }
147
+ }
148
+ }
149
+
150
+ export async function convertInternalPhotoNodePromise(
151
+ photoNodePromise: Promise<InternalPartialPhotoNode>,
152
+ ): Promise<PublicMaybePhotoNode> {
153
+ const photoNode = await photoNodePromise;
154
+ return convertInternalPhotoNode(photoNode);
155
+ }
156
+
157
+ export function convertInternalPhotoNode(photoNode: InternalPartialPhotoNode): PublicMaybePhotoNode {
158
+ const node = convertInternalNode(photoNode);
159
+ if (node.ok) {
160
+ return resultOk({
161
+ ...node.value,
162
+ photo: photoNode.photo,
163
+ } as PublicPhotoNode);
164
+ }
165
+ return resultError({
166
+ ...node.error,
167
+ photo: photoNode.photo,
168
+ } as PublicDegradedPhotoNode);
122
169
  }
123
170
 
124
171
  export async function* convertInternalRevisionIterator(