@protontech/drive-sdk 0.5.1 → 0.6.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 (88) hide show
  1. package/dist/interface/index.d.ts +1 -1
  2. package/dist/interface/upload.d.ts +1 -12
  3. package/dist/internal/nodes/apiService.d.ts +11 -1
  4. package/dist/internal/nodes/apiService.js +20 -1
  5. package/dist/internal/nodes/apiService.js.map +1 -1
  6. package/dist/internal/nodes/apiService.test.js +1 -1
  7. package/dist/internal/nodes/apiService.test.js.map +1 -1
  8. package/dist/internal/nodes/cryptoService.d.ts +4 -0
  9. package/dist/internal/nodes/cryptoService.js +6 -0
  10. package/dist/internal/nodes/cryptoService.js.map +1 -1
  11. package/dist/internal/nodes/index.d.ts +1 -1
  12. package/dist/internal/nodes/index.js +2 -2
  13. package/dist/internal/nodes/index.js.map +1 -1
  14. package/dist/internal/nodes/index.test.js +1 -1
  15. package/dist/internal/nodes/index.test.js.map +1 -1
  16. package/dist/internal/nodes/nodeName.d.ts +8 -0
  17. package/dist/internal/nodes/nodeName.js +30 -0
  18. package/dist/internal/nodes/nodeName.js.map +1 -0
  19. package/dist/internal/nodes/nodeName.test.d.ts +1 -0
  20. package/dist/internal/nodes/nodeName.test.js +50 -0
  21. package/dist/internal/nodes/nodeName.test.js.map +1 -0
  22. package/dist/internal/nodes/nodesManagement.d.ts +1 -0
  23. package/dist/internal/nodes/nodesManagement.js +30 -1
  24. package/dist/internal/nodes/nodesManagement.js.map +1 -1
  25. package/dist/internal/nodes/nodesManagement.test.js +61 -0
  26. package/dist/internal/nodes/nodesManagement.test.js.map +1 -1
  27. package/dist/internal/photos/index.d.ts +2 -0
  28. package/dist/internal/photos/index.js +4 -0
  29. package/dist/internal/photos/index.js.map +1 -1
  30. package/dist/internal/shares/index.d.ts +1 -0
  31. package/dist/internal/shares/index.js +3 -0
  32. package/dist/internal/shares/index.js.map +1 -1
  33. package/dist/internal/shares/interface.d.ts +8 -0
  34. package/dist/internal/shares/interface.js +10 -1
  35. package/dist/internal/shares/interface.js.map +1 -1
  36. package/dist/internal/sharing/apiService.d.ts +3 -1
  37. package/dist/internal/sharing/apiService.js +16 -12
  38. package/dist/internal/sharing/apiService.js.map +1 -1
  39. package/dist/internal/sharing/index.d.ts +2 -1
  40. package/dist/internal/sharing/index.js +6 -2
  41. package/dist/internal/sharing/index.js.map +1 -1
  42. package/dist/internal/sharingPublic/index.js +2 -1
  43. package/dist/internal/sharingPublic/index.js.map +1 -1
  44. package/dist/internal/upload/apiService.d.ts +0 -9
  45. package/dist/internal/upload/apiService.js +0 -16
  46. package/dist/internal/upload/apiService.js.map +1 -1
  47. package/dist/internal/upload/cryptoService.d.ts +0 -4
  48. package/dist/internal/upload/cryptoService.js +0 -6
  49. package/dist/internal/upload/cryptoService.js.map +1 -1
  50. package/dist/internal/upload/fileUploader.d.ts +0 -1
  51. package/dist/internal/upload/fileUploader.js +0 -4
  52. package/dist/internal/upload/fileUploader.js.map +1 -1
  53. package/dist/internal/upload/manager.d.ts +0 -1
  54. package/dist/internal/upload/manager.js +0 -51
  55. package/dist/internal/upload/manager.js.map +1 -1
  56. package/dist/internal/upload/manager.test.js +0 -61
  57. package/dist/internal/upload/manager.test.js.map +1 -1
  58. package/dist/protonDriveClient.d.ts +17 -2
  59. package/dist/protonDriveClient.js +19 -1
  60. package/dist/protonDriveClient.js.map +1 -1
  61. package/dist/protonDrivePhotosClient.d.ts +100 -4
  62. package/dist/protonDrivePhotosClient.js +160 -9
  63. package/dist/protonDrivePhotosClient.js.map +1 -1
  64. package/package.json +1 -1
  65. package/src/interface/index.ts +1 -1
  66. package/src/interface/upload.ts +1 -13
  67. package/src/internal/nodes/apiService.test.ts +1 -1
  68. package/src/internal/nodes/apiService.ts +42 -0
  69. package/src/internal/nodes/cryptoService.ts +9 -0
  70. package/src/internal/nodes/index.test.ts +1 -0
  71. package/src/internal/nodes/index.ts +2 -1
  72. package/src/internal/nodes/nodeName.test.ts +57 -0
  73. package/src/internal/nodes/nodeName.ts +26 -0
  74. package/src/internal/nodes/nodesManagement.test.ts +65 -0
  75. package/src/internal/nodes/nodesManagement.ts +43 -1
  76. package/src/internal/photos/index.ts +4 -0
  77. package/src/internal/shares/index.ts +1 -0
  78. package/src/internal/shares/interface.ts +9 -0
  79. package/src/internal/sharing/apiService.ts +15 -12
  80. package/src/internal/sharing/index.ts +7 -1
  81. package/src/internal/sharingPublic/index.ts +2 -1
  82. package/src/internal/upload/apiService.ts +0 -39
  83. package/src/internal/upload/cryptoService.ts +0 -9
  84. package/src/internal/upload/fileUploader.ts +0 -5
  85. package/src/internal/upload/manager.test.ts +0 -65
  86. package/src/internal/upload/manager.ts +0 -64
  87. package/src/protonDriveClient.ts +21 -2
  88. package/src/protonDrivePhotosClient.ts +193 -8
@@ -36,16 +36,16 @@ class ProtonDrivePhotosClient {
36
36
  if (!telemetry) {
37
37
  telemetry = new telemetry_1.Telemetry();
38
38
  }
39
- this.logger = telemetry.getLogger('interface');
39
+ this.logger = telemetry.getLogger('photos-interface');
40
40
  const fullConfig = (0, config_1.getConfig)(config);
41
41
  this.sdkEvents = new sdkEvents_1.SDKEvents(telemetry);
42
42
  const cryptoModule = new crypto_1.DriveCrypto(openPGPCryptoModule, srpModule);
43
43
  const apiService = new apiService_1.DriveAPIService(telemetry, this.sdkEvents, httpClient, fullConfig.baseUrl, fullConfig.language);
44
44
  const coreShares = (0, shares_1.initSharesModule)(telemetry, apiService, entitiesCache, cryptoCache, account, cryptoModule);
45
45
  this.photoShares = (0, photos_1.initPhotoSharesModule)(telemetry, apiService, entitiesCache, cryptoCache, account, cryptoModule, coreShares);
46
- this.nodes = (0, nodes_1.initNodesModule)(telemetry, apiService, entitiesCache, cryptoCache, account, cryptoModule, this.photoShares);
46
+ this.nodes = (0, nodes_1.initNodesModule)(telemetry, apiService, entitiesCache, cryptoCache, account, cryptoModule, this.photoShares, fullConfig.clientUid);
47
47
  this.photos = (0, photos_1.initPhotosModule)(apiService, this.photoShares, this.nodes.access);
48
- this.sharing = (0, sharing_1.initSharingModule)(telemetry, apiService, entitiesCache, account, cryptoModule, this.photoShares, this.nodes.access);
48
+ this.sharing = (0, sharing_1.initSharingModule)(telemetry, apiService, entitiesCache, account, cryptoModule, this.photoShares, this.nodes.access, photos_1.PHOTOS_SHARE_TARGET_TYPES);
49
49
  this.download = (0, download_1.initDownloadModule)(telemetry, apiService, cryptoModule, account, this.photoShares, this.nodes.access, this.nodes.revisions);
50
50
  this.upload = (0, photos_1.initPhotoUploadModule)(telemetry, apiService, cryptoModule, this.photoShares, this.nodes.access, fullConfig.clientUid);
51
51
  // These are used to keep the internal cache up to date
@@ -105,6 +105,15 @@ class ProtonDrivePhotosClient {
105
105
  // TODO: expose better type
106
106
  yield* this.photos.timeline.iterateTimeline(signal);
107
107
  }
108
+ /**
109
+ * Iterates the trashed nodes.
110
+ *
111
+ * See `ProtonDriveClient.iterateTrashedNodes` for more information.
112
+ */
113
+ async *iterateTrashedNodes(signal) {
114
+ this.logger.info('Iterating trashed nodes');
115
+ yield* (0, transformers_1.convertInternalNodeIterator)(this.nodes.access.iterateTrashedNodes(signal));
116
+ }
108
117
  /**
109
118
  * Iterates the nodes by their UIDs.
110
119
  *
@@ -125,14 +134,146 @@ class ProtonDrivePhotosClient {
125
134
  return (0, transformers_1.convertInternalNodePromise)(this.nodes.access.getNode((0, transformers_1.getUid)(nodeUid)));
126
135
  }
127
136
  /**
128
- * Iterates the albums.
137
+ * Rename the node.
129
138
  *
130
- * The output is not sorted and the order of the nodes is not guaranteed.
139
+ * See `ProtonDriveClient.renameNode` for more information.
131
140
  */
132
- async *iterateAlbums(signal) {
133
- this.logger.info('Iterating albums');
134
- // TODO: expose album type
135
- yield* (0, transformers_1.convertInternalNodeIterator)(this.photos.albums.iterateAlbums(signal));
141
+ async renameNode(nodeUid, newName) {
142
+ this.logger.info(`Renaming node ${(0, transformers_1.getUid)(nodeUid)}`);
143
+ return (0, transformers_1.convertInternalNodePromise)(this.nodes.management.renameNode((0, transformers_1.getUid)(nodeUid), newName));
144
+ }
145
+ /**
146
+ * Trash the nodes.
147
+ *
148
+ * See `ProtonDriveClient.trashNodes` for more information.
149
+ */
150
+ async *trashNodes(nodeUids, signal) {
151
+ this.logger.info(`Trashing ${nodeUids.length} nodes`);
152
+ yield* this.nodes.management.trashNodes((0, transformers_1.getUids)(nodeUids), signal);
153
+ }
154
+ /**
155
+ * Restore the nodes from the trash to their original place.
156
+ *
157
+ * See `ProtonDriveClient.restoreNodes` for more information.
158
+ */
159
+ async *restoreNodes(nodeUids, signal) {
160
+ this.logger.info(`Restoring ${nodeUids.length} nodes`);
161
+ yield* this.nodes.management.restoreNodes((0, transformers_1.getUids)(nodeUids), signal);
162
+ }
163
+ /**
164
+ * Delete the nodes permanently.
165
+ *
166
+ * See `ProtonDriveClient.deleteNodes` for more information.
167
+ */
168
+ async *deleteNodes(nodeUids, signal) {
169
+ this.logger.info(`Deleting ${nodeUids.length} nodes`);
170
+ yield* this.nodes.management.deleteNodes((0, transformers_1.getUids)(nodeUids), signal);
171
+ }
172
+ /**
173
+ * Empty the trash.
174
+ *
175
+ * See `ProtonDriveClient.emptyTrash` for more information.
176
+ */
177
+ async emptyTrash() {
178
+ this.logger.info('Emptying trash');
179
+ throw new Error('Method not implemented');
180
+ }
181
+ /**
182
+ * Iterates the nodes shared by the user.
183
+ *
184
+ * See `ProtonDriveClient.iterateSharedNodes` for more information.
185
+ */
186
+ async *iterateSharedNodes(signal) {
187
+ this.logger.info('Iterating shared nodes by me');
188
+ yield* (0, transformers_1.convertInternalNodeIterator)(this.sharing.access.iterateSharedNodes(signal));
189
+ }
190
+ /**
191
+ * Iterates the nodes shared with the user.
192
+ *
193
+ * See `ProtonDriveClient.iterateSharedNodesWithMe` for more information.
194
+ */
195
+ async *iterateSharedNodesWithMe(signal) {
196
+ this.logger.info('Iterating shared nodes with me');
197
+ for await (const node of this.sharing.access.iterateSharedNodesWithMe(signal)) {
198
+ yield (0, transformers_1.convertInternalNode)(node);
199
+ }
200
+ }
201
+ /**
202
+ * Leave shared node that was previously shared with the user.
203
+ *
204
+ * See `ProtonDriveClient.leaveSharedNode` for more information.
205
+ */
206
+ async leaveSharedNode(nodeUid) {
207
+ this.logger.info(`Leaving shared node with me ${(0, transformers_1.getUid)(nodeUid)}`);
208
+ await this.sharing.access.removeSharedNodeWithMe((0, transformers_1.getUid)(nodeUid));
209
+ }
210
+ /**
211
+ * Iterates the invitations to shared nodes.
212
+ *
213
+ * See `ProtonDriveClient.iterateInvitations` for more information.
214
+ */
215
+ async *iterateInvitations(signal) {
216
+ this.logger.info('Iterating invitations');
217
+ yield* this.sharing.access.iterateInvitations(signal);
218
+ }
219
+ /**
220
+ * Accept the invitation to the shared node.
221
+ *
222
+ * See `ProtonDriveClient.acceptInvitation` for more information.
223
+ */
224
+ async acceptInvitation(invitationUid) {
225
+ this.logger.info(`Accepting invitation ${(0, transformers_1.getUid)(invitationUid)}`);
226
+ await this.sharing.access.acceptInvitation((0, transformers_1.getUid)(invitationUid));
227
+ }
228
+ /**
229
+ * Reject the invitation to the shared node.
230
+ *
231
+ * See `ProtonDriveClient.rejectInvitation` for more information.
232
+ */
233
+ async rejectInvitation(invitationUid) {
234
+ this.logger.info(`Rejecting invitation ${(0, transformers_1.getUid)(invitationUid)}`);
235
+ await this.sharing.access.rejectInvitation((0, transformers_1.getUid)(invitationUid));
236
+ }
237
+ /**
238
+ * Get sharing info of the node.
239
+ *
240
+ * See `ProtonDriveClient.getSharingInfo` for more information.
241
+ */
242
+ async getSharingInfo(nodeUid) {
243
+ this.logger.info(`Getting sharing info for ${(0, transformers_1.getUid)(nodeUid)}`);
244
+ return this.sharing.management.getSharingInfo((0, transformers_1.getUid)(nodeUid));
245
+ }
246
+ /**
247
+ * Share or update sharing of the node.
248
+ *
249
+ * See `ProtonDriveClient.shareNode` for more information.
250
+ */
251
+ async shareNode(nodeUid, settings) {
252
+ this.logger.info(`Sharing node ${(0, transformers_1.getUid)(nodeUid)}`);
253
+ return this.sharing.management.shareNode((0, transformers_1.getUid)(nodeUid), settings);
254
+ }
255
+ /**
256
+ * Unshare the node, completely or partially.
257
+ *
258
+ * See `ProtonDriveClient.unshareNode` for more information.
259
+ */
260
+ async unshareNode(nodeUid, settings) {
261
+ if (!settings) {
262
+ this.logger.info(`Unsharing node ${(0, transformers_1.getUid)(nodeUid)}`);
263
+ }
264
+ else {
265
+ this.logger.info(`Partially unsharing ${(0, transformers_1.getUid)(nodeUid)}`);
266
+ }
267
+ return this.sharing.management.unshareNode((0, transformers_1.getUid)(nodeUid), settings);
268
+ }
269
+ /**
270
+ * Resend the invitation email to shared node.
271
+ *
272
+ * See `ProtonDriveClient.resendInvitation` for more information.
273
+ */
274
+ async resendInvitation(nodeUid, invitationUid) {
275
+ this.logger.info(`Resending invitation ${(0, transformers_1.getUid)(invitationUid)}`);
276
+ return this.sharing.management.resendInvitationEmail((0, transformers_1.getUid)(nodeUid), (0, transformers_1.getUid)(invitationUid));
136
277
  }
137
278
  /**
138
279
  * Get the file downloader to download the node content.
@@ -162,6 +303,16 @@ class ProtonDrivePhotosClient {
162
303
  const parentFolderUid = await this.nodes.access.getVolumeRootFolder();
163
304
  return this.upload.getFileUploader((0, transformers_1.getUid)(parentFolderUid), name, metadata, signal);
164
305
  }
306
+ /**
307
+ * Iterates the albums.
308
+ *
309
+ * The output is not sorted and the order of the nodes is not guaranteed.
310
+ */
311
+ async *iterateAlbums(signal) {
312
+ this.logger.info('Iterating albums');
313
+ // TODO: expose album type
314
+ yield* (0, transformers_1.convertInternalNodeIterator)(this.photos.albums.iterateAlbums(signal));
315
+ }
165
316
  }
166
317
  exports.ProtonDrivePhotosClient = ProtonDrivePhotosClient;
167
318
  //# sourceMappingURL=protonDrivePhotosClient.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"protonDrivePhotosClient.js","sourceRoot":"","sources":["../src/protonDrivePhotosClient.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"protonDrivePhotosClient.js","sourceRoot":"","sources":["../src/protonDrivePhotosClient.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@protontech/drive-sdk",
3
- "version": "0.5.1",
3
+ "version": "0.6.0",
4
4
  "description": "Proton Drive SDK",
5
5
  "license": "GPL-3.0",
6
6
  "main": "dist/index.js",
@@ -82,7 +82,7 @@ export type {
82
82
  MetricEvent,
83
83
  } from './telemetry';
84
84
  export { MetricVolumeType } from './telemetry';
85
- export type { FileUploader, FileRevisionUploader, UploadController, UploadMetadata } from './upload';
85
+ export type { FileUploader, UploadController, UploadMetadata } from './upload';
86
86
  export type { Thumbnail, ThumbnailResult } from './thumbnail';
87
87
  export { ThumbnailType } from './thumbnail';
88
88
 
@@ -32,7 +32,7 @@ export type UploadMetadata = {
32
32
  overrideExistingDraftByOtherClient?: boolean;
33
33
  };
34
34
 
35
- export interface FileRevisionUploader {
35
+ export interface FileUploader {
36
36
  /**
37
37
  * Uploads a file from a stream.
38
38
  *
@@ -64,18 +64,6 @@ export interface FileRevisionUploader {
64
64
  ): Promise<UploadController>;
65
65
  }
66
66
 
67
- export interface FileUploader extends FileRevisionUploader {
68
- /**
69
- * Returns the available name for the file.
70
- *
71
- * The function will return a name that includes the original name with the
72
- * available index. The name is guaranteed to be unique in the parent folder.
73
- *
74
- * Example new name: `file (2).txt`.
75
- */
76
- getAvailableName(): Promise<string>;
77
- }
78
-
79
67
  export interface UploadController {
80
68
  pause(): void;
81
69
  resume(): void;
@@ -173,7 +173,7 @@ describe('nodeAPIService', () => {
173
173
  put: jest.fn(),
174
174
  };
175
175
 
176
- api = new NodeAPIService(getMockLogger(), apiMock);
176
+ api = new NodeAPIService(getMockLogger(), apiMock, 'clientUid');
177
177
  });
178
178
 
179
179
  describe('getNode', () => {
@@ -102,6 +102,14 @@ type PostRestoreRevisionResponse =
102
102
  type DeleteRevisionResponse =
103
103
  drivePaths['/drive/v2/volumes/{volumeID}/files/{linkID}/revisions/{revisionID}']['delete']['responses']['200']['content']['application/json'];
104
104
 
105
+
106
+ type PostCheckAvailableHashesRequest = Extract<
107
+ drivePaths['/drive/v2/volumes/{volumeID}/links/{linkID}/checkAvailableHashes']['post']['requestBody'],
108
+ { content: object }
109
+ >['content']['application/json'];
110
+ type PostCheckAvailableHashesResponse =
111
+ drivePaths['/drive/v2/volumes/{volumeID}/links/{linkID}/checkAvailableHashes']['post']['responses']['200']['content']['application/json'];
112
+
105
113
  /**
106
114
  * Provides API communication for fetching and manipulating nodes metadata.
107
115
  *
@@ -112,9 +120,11 @@ export class NodeAPIService {
112
120
  constructor(
113
121
  private logger: Logger,
114
122
  private apiService: DriveAPIService,
123
+ private clientUid: string | undefined,
115
124
  ) {
116
125
  this.logger = logger;
117
126
  this.apiService = apiService;
127
+ this.clientUid = clientUid;
118
128
  }
119
129
 
120
130
  async getNode(nodeUid: string, ownVolumeId: string, signal?: AbortSignal): Promise<EncryptedNode> {
@@ -526,6 +536,38 @@ export class NodeAPIService {
526
536
  `drive/v2/volumes/${volumeId}/files/${nodeId}/revisions/${revisionId}`,
527
537
  );
528
538
  }
539
+
540
+ async checkAvailableHashes(
541
+ parentNodeUid: string,
542
+ hashes: string[],
543
+ ): Promise<{
544
+ availableHashes: string[];
545
+ pendingHashes: {
546
+ hash: string;
547
+ nodeUid: string;
548
+ revisionUid: string;
549
+ clientUid?: string;
550
+ }[];
551
+ }> {
552
+ const { volumeId, nodeId: parentNodeId } = splitNodeUid(parentNodeUid);
553
+ const result = await this.apiService.post<PostCheckAvailableHashesRequest, PostCheckAvailableHashesResponse>(
554
+ `drive/v2/volumes/${volumeId}/links/${parentNodeId}/checkAvailableHashes`,
555
+ {
556
+ Hashes: hashes,
557
+ ClientUID: this.clientUid ? [this.clientUid] : null,
558
+ },
559
+ );
560
+
561
+ return {
562
+ availableHashes: result.AvailableHashes,
563
+ pendingHashes: result.PendingHashes.map((hash) => ({
564
+ hash: hash.Hash,
565
+ nodeUid: makeNodeUid(volumeId, hash.LinkID),
566
+ revisionUid: makeNodeRevisionUid(volumeId, hash.LinkID, hash.RevisionID),
567
+ clientUid: hash.ClientUID || undefined,
568
+ })),
569
+ };
570
+ }
529
571
  }
530
572
 
531
573
  type LinkResponse = {
@@ -645,6 +645,15 @@ export class NodesCryptoService {
645
645
  nameSignatureEmail: email,
646
646
  };
647
647
  }
648
+
649
+ async generateNameHashes(parentHashKey: Uint8Array, names: string[]): Promise<{ name: string; hash: string }[]> {
650
+ return Promise.all(
651
+ names.map(async (name) => ({
652
+ name,
653
+ hash: await this.driveCrypto.generateLookupHash(name, parentHashKey),
654
+ })),
655
+ );
656
+ }
648
657
  }
649
658
 
650
659
  function getClaimedAuthor(
@@ -64,6 +64,7 @@ describe('nodesModules integration tests', () => {
64
64
  account,
65
65
  driveCrypto,
66
66
  sharesService,
67
+ 'clientUid',
67
68
  );
68
69
 
69
70
  nodesCache = new NodesCache(getMockLogger(), driveEntitiesCache);
@@ -37,8 +37,9 @@ export function initNodesModule(
37
37
  account: ProtonDriveAccount,
38
38
  driveCrypto: DriveCrypto,
39
39
  sharesService: SharesService,
40
+ clientUid: string | undefined,
40
41
  ) {
41
- const api = new NodeAPIService(telemetry.getLogger('nodes-api'), apiService);
42
+ const api = new NodeAPIService(telemetry.getLogger('nodes-api'), apiService, clientUid);
42
43
  const cache = new NodesCache(telemetry.getLogger('nodes-cache'), driveEntitiesCache);
43
44
  const cryptoCache = new NodesCryptoCache(telemetry.getLogger('nodes-cache'), driveCryptoCache);
44
45
  const cryptoReporter = new NodesCryptoReporter(telemetry, sharesService);
@@ -0,0 +1,57 @@
1
+ import { splitExtension, joinNameAndExtension } from './nodeName';
2
+
3
+ describe('nodeName', () => {
4
+ describe('splitExtension', () => {
5
+ it('should handle empty string', () => {
6
+ const result = splitExtension('');
7
+ expect(result).toEqual(['', '']);
8
+ });
9
+
10
+ it('should split filename with extension correctly', () => {
11
+ const result = splitExtension('document.pdf');
12
+ expect(result).toEqual(['document', 'pdf']);
13
+ });
14
+
15
+ it('should handle filename without extension', () => {
16
+ const result = splitExtension('folder');
17
+ expect(result).toEqual(['folder', '']);
18
+ });
19
+
20
+ it('should split filename with multiple dots correctly', () => {
21
+ const result = splitExtension('my.file.name.txt');
22
+ expect(result).toEqual(['my.file.name', 'txt']);
23
+ });
24
+
25
+ it('should handle filename ending with dot', () => {
26
+ const result = splitExtension('dot.');
27
+ expect(result).toEqual(['dot.', '']);
28
+ });
29
+
30
+ it('should handle filename with only extension', () => {
31
+ const result = splitExtension('.gitignore');
32
+ expect(result).toEqual(['.gitignore', '']);
33
+ });
34
+ });
35
+
36
+ describe('joinNameAndExtension', () => {
37
+ it('should join name, index, and extension correctly', () => {
38
+ const result = joinNameAndExtension('document', 1, 'pdf');
39
+ expect(result).toBe('document (1).pdf');
40
+ });
41
+
42
+ it('should handle empty name with extension', () => {
43
+ const result = joinNameAndExtension('', 2, 'txt');
44
+ expect(result).toBe('(2).txt');
45
+ });
46
+
47
+ it('should handle name with empty extension', () => {
48
+ const result = joinNameAndExtension('document', 3, '');
49
+ expect(result).toBe('document (3)');
50
+ });
51
+
52
+ it('should handle both name and extension empty', () => {
53
+ const result = joinNameAndExtension('', 4, '');
54
+ expect(result).toBe('(4)');
55
+ });
56
+ });
57
+ });
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Split a filename into `[name, extension]`
3
+ */
4
+ export function splitExtension(filename = ''): [string, string] {
5
+ const endIdx = filename.lastIndexOf('.');
6
+ if (endIdx === -1 || endIdx === 0 || endIdx === filename.length - 1) {
7
+ return [filename, ''];
8
+ }
9
+ return [filename.slice(0, endIdx), filename.slice(endIdx + 1)];
10
+ }
11
+
12
+ /**
13
+ * Join a filename into `name (index).extension`
14
+ */
15
+ export function joinNameAndExtension(name: string, index: number, extension: string): string {
16
+ if (!name && !extension) {
17
+ return `(${index})`;
18
+ }
19
+ if (!name) {
20
+ return `(${index}).${extension}`;
21
+ }
22
+ if (!extension) {
23
+ return `${name} (${index})`;
24
+ }
25
+ return `${name} (${index}).${extension}`;
26
+ }
@@ -61,6 +61,10 @@ describe('NodesManagement', () => {
61
61
  yield* uids.map((uid) => ({ ok: true, uid }) as NodeResult);
62
62
  }),
63
63
  createFolder: jest.fn(),
64
+ checkAvailableHashes: jest.fn().mockResolvedValue({
65
+ availableHashes: ['name1Hash'],
66
+ pendingHashes: [],
67
+ }),
64
68
  };
65
69
  // @ts-expect-error No need to implement all methods for mocking
66
70
  cryptoCache = {
@@ -75,6 +79,20 @@ describe('NodesManagement', () => {
75
79
  }),
76
80
  encryptNodeWithNewParent: jest.fn(),
77
81
  createFolder: jest.fn(),
82
+ generateNameHashes: jest.fn().mockResolvedValue([
83
+ {
84
+ name: 'name1',
85
+ hash: 'name1Hash',
86
+ },
87
+ {
88
+ name: 'name2',
89
+ hash: 'name2Hash',
90
+ },
91
+ {
92
+ name: 'name3',
93
+ hash: 'name3Hash',
94
+ },
95
+ ]),
78
96
  };
79
97
  // @ts-expect-error No need to implement all methods for mocking
80
98
  nodesAccess = {
@@ -340,4 +358,51 @@ describe('NodesManagement', () => {
340
358
  expect(restored).toEqual(new Set(uids));
341
359
  expect(nodesAccess.notifyNodeChanged).toHaveBeenCalledTimes(2);
342
360
  });
361
+
362
+ describe('findAvailableName', () => {
363
+ it('should find available name', async () => {
364
+ apiService.checkAvailableHashes = jest.fn().mockImplementation(() => {
365
+ return {
366
+ availableHashes: ['name3Hash'],
367
+ pendingHashes: [],
368
+ };
369
+ });
370
+
371
+ const result = await management.findAvailableName('parentUid', 'name');
372
+ expect(result).toBe('name3');
373
+ expect(apiService.checkAvailableHashes).toHaveBeenCalledTimes(1);
374
+ expect(apiService.checkAvailableHashes).toHaveBeenCalledWith('parentUid', [
375
+ 'name1Hash',
376
+ 'name2Hash',
377
+ 'name3Hash',
378
+ ]);
379
+ });
380
+
381
+ it('should find available name with multiple pages', async () => {
382
+ let firstCall = false;
383
+ apiService.checkAvailableHashes = jest.fn().mockImplementation(() => {
384
+ if (!firstCall) {
385
+ firstCall = true;
386
+ return {
387
+ // First page has no available hashes
388
+ availableHashes: [],
389
+ pendingHashes: [],
390
+ };
391
+ }
392
+ return {
393
+ availableHashes: ['name3Hash'],
394
+ pendingHashes: [],
395
+ };
396
+ });
397
+
398
+ const result = await management.findAvailableName('parentUid', 'name');
399
+ expect(result).toBe('name3');
400
+ expect(apiService.checkAvailableHashes).toHaveBeenCalledTimes(2);
401
+ expect(apiService.checkAvailableHashes).toHaveBeenCalledWith('parentUid', [
402
+ 'name1Hash',
403
+ 'name2Hash',
404
+ 'name3Hash',
405
+ ]);
406
+ });
407
+ });
343
408
  });
@@ -8,10 +8,14 @@ import { NodeAPIService } from './apiService';
8
8
  import { NodesCryptoCache } from './cryptoCache';
9
9
  import { NodesCryptoService } from './cryptoService';
10
10
  import { NodeOutOfSyncError } from './errors';
11
+ import { generateFolderExtendedAttributes } from './extendedAttributes';
11
12
  import { DecryptedNode } from './interface';
13
+ import { splitExtension, joinNameAndExtension } from './nodeName';
12
14
  import { NodesAccess } from './nodesAccess';
13
15
  import { validateNodeName } from './validations';
14
- import { generateFolderExtendedAttributes } from './extendedAttributes';
16
+
17
+ const AVAILABLE_NAME_BATCH_SIZE = 10;
18
+ const AVAILABLE_NAME_LIMIT = 1000;
15
19
 
16
20
  /**
17
21
  * Provides high-level actions for managing nodes.
@@ -349,4 +353,42 @@ export class NodesManagement {
349
353
  await this.cryptoCache.setNodeKeys(nodeUid, keys);
350
354
  return node;
351
355
  }
356
+
357
+ async findAvailableName(parentFolderUid: string, name: string): Promise<string> {
358
+ const { hashKey: parentHashKey } = await this.nodesAccess.getNodeKeys(parentFolderUid);
359
+ if (!parentHashKey) {
360
+ throw new ValidationError(c('Error').t`Creating files in non-folders is not allowed`);
361
+ }
362
+
363
+ const [namePart, extension] = splitExtension(name);
364
+
365
+ let startIndex = 1;
366
+ while (startIndex < AVAILABLE_NAME_LIMIT) {
367
+ const namesToCheck = startIndex === 1 ? [name] : [];
368
+ for (let i = startIndex; i < startIndex + AVAILABLE_NAME_BATCH_SIZE; i++) {
369
+ namesToCheck.push(joinNameAndExtension(namePart, i, extension));
370
+ }
371
+
372
+ const hashesToCheck = await this.cryptoService.generateNameHashes(parentHashKey, namesToCheck);
373
+
374
+ const { availableHashes } = await this.apiService.checkAvailableHashes(
375
+ parentFolderUid,
376
+ hashesToCheck.map(({ hash }) => hash),
377
+ );
378
+
379
+ if (!availableHashes.length) {
380
+ startIndex += AVAILABLE_NAME_BATCH_SIZE;
381
+ continue;
382
+ }
383
+
384
+ const availableHash = hashesToCheck.find(({ hash }) => hash === availableHashes[0]);
385
+ if (!availableHash) {
386
+ throw Error('Backend returned unexpected hash');
387
+ }
388
+
389
+ return availableHash.name;
390
+ }
391
+
392
+ throw new ValidationError(c('Error').t`No available name found`);
393
+ }
352
394
  }
@@ -24,6 +24,10 @@ import {
24
24
  PhotoUploadManager,
25
25
  PhotoUploadMetadata,
26
26
  } from './upload';
27
+ import { ShareTargetType } from '../shares';
28
+
29
+ // Only photos and albums can be shared in photos volume.
30
+ export const PHOTOS_SHARE_TARGET_TYPES = [ShareTargetType.Photo, ShareTargetType.Album];
27
31
 
28
32
  /**
29
33
  * Provides facade for the whole photos module.
@@ -12,6 +12,7 @@ import { SharesCache } from './cache';
12
12
  import { SharesCryptoService } from './cryptoService';
13
13
  import { SharesManager } from './manager';
14
14
 
15
+ export { ShareTargetType } from './interface';
15
16
  export type { EncryptedShare } from './interface';
16
17
 
17
18
  /**
@@ -1,6 +1,15 @@
1
1
  import { PrivateKey, SessionKey } from '../../crypto';
2
2
  import { Result, UnverifiedAuthorError } from '../../interface';
3
3
 
4
+ export enum ShareTargetType {
5
+ Root = 0,
6
+ Folder = 1,
7
+ File = 2,
8
+ Album = 3,
9
+ Photo = 4,
10
+ ProtonVendor = 5,
11
+ }
12
+
4
13
  /**
5
14
  * Internal interface providing basic identification of volume and its root
6
15
  * share and node.