@internxt/cli 1.5.3 → 1.5.4

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 (41) hide show
  1. package/.env +2 -6
  2. package/README.md +46 -26
  3. package/bin/dev.js +1 -1
  4. package/bin/run.js +1 -1
  5. package/dist/commands/create-folder.js +1 -1
  6. package/dist/commands/delete-permanently-file.js +1 -1
  7. package/dist/commands/delete-permanently-folder.js +1 -1
  8. package/dist/commands/logout.js +2 -0
  9. package/dist/commands/upload-file.js +2 -2
  10. package/dist/services/auth.service.d.ts +1 -0
  11. package/dist/services/auth.service.js +13 -1
  12. package/dist/services/crypto.service.d.ts +1 -1
  13. package/dist/services/crypto.service.js +2 -2
  14. package/dist/services/drive/drive-file.service.d.ts +1 -1
  15. package/dist/services/drive/drive-file.service.js +7 -7
  16. package/dist/services/drive/drive-folder.service.js +7 -7
  17. package/dist/services/drive/trash.service.d.ts +6 -4
  18. package/dist/services/drive/trash.service.js +6 -6
  19. package/dist/services/sdk-manager.service.d.ts +3 -5
  20. package/dist/services/sdk-manager.service.js +14 -34
  21. package/dist/services/thumbnail.service.d.ts +2 -2
  22. package/dist/services/thumbnail.service.js +6 -6
  23. package/dist/services/usage.service.d.ts +2 -2
  24. package/dist/services/usage.service.js +2 -2
  25. package/dist/types/config.types.d.ts +1 -4
  26. package/dist/utils/pm2.utils.d.ts +1 -1
  27. package/dist/utils/thumbnail.utils.js +3 -3
  28. package/dist/utils/webdav.utils.d.ts +2 -3
  29. package/dist/utils/webdav.utils.js +6 -18
  30. package/dist/webdav/handlers/DELETE.handler.js +5 -1
  31. package/dist/webdav/handlers/GET.handler.js +6 -2
  32. package/dist/webdav/handlers/HEAD.handler.js +7 -2
  33. package/dist/webdav/handlers/MKCOL.handler.js +10 -8
  34. package/dist/webdav/handlers/MOVE.handler.js +10 -3
  35. package/dist/webdav/handlers/OPTIONS.handler.js +2 -5
  36. package/dist/webdav/handlers/PROPFIND.handler.js +20 -21
  37. package/dist/webdav/handlers/PUT.handler.js +8 -4
  38. package/dist/webdav/index.js +1 -1
  39. package/oclif.manifest.json +1 -1
  40. package/package.json +29 -28
  41. package/scripts/restart-webdav.js +2 -1
package/.env CHANGED
@@ -1,10 +1,6 @@
1
- DRIVE_URL=https://drive.internxt.com
2
- DRIVE_API_URL=https://drive.internxt.com/api
1
+ DRIVE_WEB_URL=https://drive.internxt.com
3
2
  DRIVE_NEW_API_URL=https://api.internxt.com/drive
4
- PAYMENTS_API_URL=https://api.internxt.com/payments
5
3
  NETWORK_URL=https://api.internxt.com
6
4
  APP_CRYPTO_SECRET=6KYQBP847D4ATSFA
7
- APP_CRYPTO_SECRET2=8Q8VMUE3BJZV87GT
8
5
  APP_MAGIC_IV=d139cb9a2cd17092e79e1861cf9d7023
9
- APP_MAGIC_SALT=38dce0391b49efba88dbc8c39ebf868f0267eb110bb0012ab27dc52a528d61b1d1ed9d76f400ff58e3240028442b1eab9bb84e111d9dadd997982dbde9dbd25e
10
- NODE_ENV=production
6
+ APP_MAGIC_SALT=38dce0391b49efba88dbc8c39ebf868f0267eb110bb0012ab27dc52a528d61b1d1ed9d76f400ff58e3240028442b1eab9bb84e111d9dadd997982dbde9dbd25e
package/README.md CHANGED
@@ -7,17 +7,37 @@ A CLI tool to interact with your Internxt encrypted files
7
7
 
8
8
  <!-- toc -->
9
9
  * [Internxt CLI](#internxt-cli)
10
+ * [Project Maintenance](#project-maintenance)
10
11
  * [Installation](#installation)
11
12
  * [Usage](#usage)
12
13
  * [Commands](#commands)
13
14
  * [Current Limitations](#current-limitations)
14
15
  <!-- tocstop -->
15
16
 
17
+ # Project Maintenance
18
+
19
+ <!-- maintenance -->
20
+ [![Lines of Code](https://sonarcloud.io/api/project_badges/measure?project=internxt_cli&metric=ncloc)](https://sonarcloud.io/summary/new_code?id=internxt_cli)
21
+ [![Maintainability Rating](https://sonarcloud.io/api/project_badges/measure?project=internxt_cli&metric=sqale_rating)](https://sonarcloud.io/summary/new_code?id=internxt_cli)
22
+ [![Security Rating](https://sonarcloud.io/api/project_badges/measure?project=internxt_cli&metric=security_rating)](https://sonarcloud.io/summary/new_code?id=internxt_cli)
23
+ [![Vulnerabilities](https://sonarcloud.io/api/project_badges/measure?project=internxt_cli&metric=vulnerabilities)](https://sonarcloud.io/summary/new_code?id=internxt_cli)
24
+ [![Code Smells](https://sonarcloud.io/api/project_badges/measure?project=internxt_cli&metric=code_smells)](https://sonarcloud.io/summary/new_code?id=internxt_cli)
25
+ [![Duplicated Lines (%)](https://sonarcloud.io/api/project_badges/measure?project=internxt_cli&metric=duplicated_lines_density)](https://sonarcloud.io/summary/new_code?id=internxt_cli)
26
+ [![Coverage](https://sonarcloud.io/api/project_badges/measure?project=internxt_cli&metric=coverage)](https://sonarcloud.io/summary/new_code?id=internxt_cli)
27
+
28
+ We aim to achieve:
29
+
30
+ - An 'A' rating in Maintainability
31
+ - An 'A' rating in Security
32
+ - Less than 3% duplicated lines
33
+ - At least 80% test coverage
34
+ <!-- maintenancestop -->
35
+
16
36
  # Installation
17
37
 
18
38
  You can install the Internxt CLI by using NPM:
19
39
 
20
- Requires Node >= 20.12.1
40
+ Requires Node >= 22.12.0
21
41
 
22
42
  `npm i -g @internxt/cli`
23
43
 
@@ -31,7 +51,7 @@ $ npm install -g @internxt/cli
31
51
  $ internxt COMMAND
32
52
  running command...
33
53
  $ internxt (--version)
34
- @internxt/cli/1.5.3 linux-x64 node-v20.19.1
54
+ @internxt/cli/1.5.4 linux-x64 node-v22.17.0
35
55
  $ internxt --help [COMMAND]
36
56
  USAGE
37
57
  $ internxt COMMAND
@@ -99,7 +119,7 @@ EXAMPLES
99
119
  $ internxt add-cert
100
120
  ```
101
121
 
102
- _See code: [src/commands/add-cert.ts](https://github.com/internxt/cli/blob/v1.5.3/src/commands/add-cert.ts)_
122
+ _See code: [src/commands/add-cert.ts](https://github.com/internxt/cli/blob/v1.5.4/src/commands/add-cert.ts)_
103
123
 
104
124
  ## `internxt config`
105
125
 
@@ -119,7 +139,7 @@ EXAMPLES
119
139
  $ internxt config
120
140
  ```
121
141
 
122
- _See code: [src/commands/config.ts](https://github.com/internxt/cli/blob/v1.5.3/src/commands/config.ts)_
142
+ _See code: [src/commands/config.ts](https://github.com/internxt/cli/blob/v1.5.4/src/commands/config.ts)_
123
143
 
124
144
  ## `internxt create-folder`
125
145
 
@@ -148,7 +168,7 @@ EXAMPLES
148
168
  $ internxt create-folder
149
169
  ```
150
170
 
151
- _See code: [src/commands/create-folder.ts](https://github.com/internxt/cli/blob/v1.5.3/src/commands/create-folder.ts)_
171
+ _See code: [src/commands/create-folder.ts](https://github.com/internxt/cli/blob/v1.5.4/src/commands/create-folder.ts)_
152
172
 
153
173
  ## `internxt delete-permanently-file`
154
174
 
@@ -178,7 +198,7 @@ EXAMPLES
178
198
  $ internxt delete-permanently-file
179
199
  ```
180
200
 
181
- _See code: [src/commands/delete-permanently-file.ts](https://github.com/internxt/cli/blob/v1.5.3/src/commands/delete-permanently-file.ts)_
201
+ _See code: [src/commands/delete-permanently-file.ts](https://github.com/internxt/cli/blob/v1.5.4/src/commands/delete-permanently-file.ts)_
182
202
 
183
203
  ## `internxt delete-permanently-folder`
184
204
 
@@ -208,7 +228,7 @@ EXAMPLES
208
228
  $ internxt delete-permanently-folder
209
229
  ```
210
230
 
211
- _See code: [src/commands/delete-permanently-folder.ts](https://github.com/internxt/cli/blob/v1.5.3/src/commands/delete-permanently-folder.ts)_
231
+ _See code: [src/commands/delete-permanently-folder.ts](https://github.com/internxt/cli/blob/v1.5.4/src/commands/delete-permanently-folder.ts)_
212
232
 
213
233
  ## `internxt delete permanently file`
214
234
 
@@ -297,7 +317,7 @@ EXAMPLES
297
317
  $ internxt download-file
298
318
  ```
299
319
 
300
- _See code: [src/commands/download-file.ts](https://github.com/internxt/cli/blob/v1.5.3/src/commands/download-file.ts)_
320
+ _See code: [src/commands/download-file.ts](https://github.com/internxt/cli/blob/v1.5.4/src/commands/download-file.ts)_
301
321
 
302
322
  ## `internxt download file`
303
323
 
@@ -356,7 +376,7 @@ EXAMPLES
356
376
  $ internxt list
357
377
  ```
358
378
 
359
- _See code: [src/commands/list.ts](https://github.com/internxt/cli/blob/v1.5.3/src/commands/list.ts)_
379
+ _See code: [src/commands/list.ts](https://github.com/internxt/cli/blob/v1.5.4/src/commands/list.ts)_
360
380
 
361
381
  ## `internxt login`
362
382
 
@@ -385,7 +405,7 @@ EXAMPLES
385
405
  $ internxt login
386
406
  ```
387
407
 
388
- _See code: [src/commands/login.ts](https://github.com/internxt/cli/blob/v1.5.3/src/commands/login.ts)_
408
+ _See code: [src/commands/login.ts](https://github.com/internxt/cli/blob/v1.5.4/src/commands/login.ts)_
389
409
 
390
410
  ## `internxt logout`
391
411
 
@@ -405,7 +425,7 @@ EXAMPLES
405
425
  $ internxt logout
406
426
  ```
407
427
 
408
- _See code: [src/commands/logout.ts](https://github.com/internxt/cli/blob/v1.5.3/src/commands/logout.ts)_
428
+ _See code: [src/commands/logout.ts](https://github.com/internxt/cli/blob/v1.5.4/src/commands/logout.ts)_
409
429
 
410
430
  ## `internxt logs`
411
431
 
@@ -425,7 +445,7 @@ EXAMPLES
425
445
  $ internxt logs
426
446
  ```
427
447
 
428
- _See code: [src/commands/logs.ts](https://github.com/internxt/cli/blob/v1.5.3/src/commands/logs.ts)_
448
+ _See code: [src/commands/logs.ts](https://github.com/internxt/cli/blob/v1.5.4/src/commands/logs.ts)_
429
449
 
430
450
  ## `internxt move-file`
431
451
 
@@ -457,7 +477,7 @@ EXAMPLES
457
477
  $ internxt move-file
458
478
  ```
459
479
 
460
- _See code: [src/commands/move-file.ts](https://github.com/internxt/cli/blob/v1.5.3/src/commands/move-file.ts)_
480
+ _See code: [src/commands/move-file.ts](https://github.com/internxt/cli/blob/v1.5.4/src/commands/move-file.ts)_
461
481
 
462
482
  ## `internxt move-folder`
463
483
 
@@ -489,7 +509,7 @@ EXAMPLES
489
509
  $ internxt move-folder
490
510
  ```
491
511
 
492
- _See code: [src/commands/move-folder.ts](https://github.com/internxt/cli/blob/v1.5.3/src/commands/move-folder.ts)_
512
+ _See code: [src/commands/move-folder.ts](https://github.com/internxt/cli/blob/v1.5.4/src/commands/move-folder.ts)_
493
513
 
494
514
  ## `internxt move file`
495
515
 
@@ -580,7 +600,7 @@ EXAMPLES
580
600
  $ internxt rename-file
581
601
  ```
582
602
 
583
- _See code: [src/commands/rename-file.ts](https://github.com/internxt/cli/blob/v1.5.3/src/commands/rename-file.ts)_
603
+ _See code: [src/commands/rename-file.ts](https://github.com/internxt/cli/blob/v1.5.4/src/commands/rename-file.ts)_
584
604
 
585
605
  ## `internxt rename-folder`
586
606
 
@@ -611,7 +631,7 @@ EXAMPLES
611
631
  $ internxt rename-folder
612
632
  ```
613
633
 
614
- _See code: [src/commands/rename-folder.ts](https://github.com/internxt/cli/blob/v1.5.3/src/commands/rename-folder.ts)_
634
+ _See code: [src/commands/rename-folder.ts](https://github.com/internxt/cli/blob/v1.5.4/src/commands/rename-folder.ts)_
615
635
 
616
636
  ## `internxt rename file`
617
637
 
@@ -699,7 +719,7 @@ EXAMPLES
699
719
  $ internxt trash-clear
700
720
  ```
701
721
 
702
- _See code: [src/commands/trash-clear.ts](https://github.com/internxt/cli/blob/v1.5.3/src/commands/trash-clear.ts)_
722
+ _See code: [src/commands/trash-clear.ts](https://github.com/internxt/cli/blob/v1.5.4/src/commands/trash-clear.ts)_
703
723
 
704
724
  ## `internxt trash-file`
705
725
 
@@ -729,7 +749,7 @@ EXAMPLES
729
749
  $ internxt trash-file
730
750
  ```
731
751
 
732
- _See code: [src/commands/trash-file.ts](https://github.com/internxt/cli/blob/v1.5.3/src/commands/trash-file.ts)_
752
+ _See code: [src/commands/trash-file.ts](https://github.com/internxt/cli/blob/v1.5.4/src/commands/trash-file.ts)_
733
753
 
734
754
  ## `internxt trash-folder`
735
755
 
@@ -759,7 +779,7 @@ EXAMPLES
759
779
  $ internxt trash-folder
760
780
  ```
761
781
 
762
- _See code: [src/commands/trash-folder.ts](https://github.com/internxt/cli/blob/v1.5.3/src/commands/trash-folder.ts)_
782
+ _See code: [src/commands/trash-folder.ts](https://github.com/internxt/cli/blob/v1.5.4/src/commands/trash-folder.ts)_
763
783
 
764
784
  ## `internxt trash-list`
765
785
 
@@ -785,7 +805,7 @@ EXAMPLES
785
805
  $ internxt trash-list
786
806
  ```
787
807
 
788
- _See code: [src/commands/trash-list.ts](https://github.com/internxt/cli/blob/v1.5.3/src/commands/trash-list.ts)_
808
+ _See code: [src/commands/trash-list.ts](https://github.com/internxt/cli/blob/v1.5.4/src/commands/trash-list.ts)_
789
809
 
790
810
  ## `internxt trash-restore-file`
791
811
 
@@ -816,7 +836,7 @@ EXAMPLES
816
836
  $ internxt trash-restore-file
817
837
  ```
818
838
 
819
- _See code: [src/commands/trash-restore-file.ts](https://github.com/internxt/cli/blob/v1.5.3/src/commands/trash-restore-file.ts)_
839
+ _See code: [src/commands/trash-restore-file.ts](https://github.com/internxt/cli/blob/v1.5.4/src/commands/trash-restore-file.ts)_
820
840
 
821
841
  ## `internxt trash-restore-folder`
822
842
 
@@ -847,7 +867,7 @@ EXAMPLES
847
867
  $ internxt trash-restore-folder
848
868
  ```
849
869
 
850
- _See code: [src/commands/trash-restore-folder.ts](https://github.com/internxt/cli/blob/v1.5.3/src/commands/trash-restore-folder.ts)_
870
+ _See code: [src/commands/trash-restore-folder.ts](https://github.com/internxt/cli/blob/v1.5.4/src/commands/trash-restore-folder.ts)_
851
871
 
852
872
  ## `internxt trash clear`
853
873
 
@@ -1044,7 +1064,7 @@ EXAMPLES
1044
1064
  $ internxt upload-file
1045
1065
  ```
1046
1066
 
1047
- _See code: [src/commands/upload-file.ts](https://github.com/internxt/cli/blob/v1.5.3/src/commands/upload-file.ts)_
1067
+ _See code: [src/commands/upload-file.ts](https://github.com/internxt/cli/blob/v1.5.4/src/commands/upload-file.ts)_
1048
1068
 
1049
1069
  ## `internxt upload file`
1050
1070
 
@@ -1099,7 +1119,7 @@ EXAMPLES
1099
1119
  $ internxt webdav status
1100
1120
  ```
1101
1121
 
1102
- _See code: [src/commands/webdav.ts](https://github.com/internxt/cli/blob/v1.5.3/src/commands/webdav.ts)_
1122
+ _See code: [src/commands/webdav.ts](https://github.com/internxt/cli/blob/v1.5.4/src/commands/webdav.ts)_
1103
1123
 
1104
1124
  ## `internxt webdav-config`
1105
1125
 
@@ -1125,7 +1145,7 @@ EXAMPLES
1125
1145
  $ internxt webdav-config
1126
1146
  ```
1127
1147
 
1128
- _See code: [src/commands/webdav-config.ts](https://github.com/internxt/cli/blob/v1.5.3/src/commands/webdav-config.ts)_
1148
+ _See code: [src/commands/webdav-config.ts](https://github.com/internxt/cli/blob/v1.5.4/src/commands/webdav-config.ts)_
1129
1149
 
1130
1150
  ## `internxt whoami`
1131
1151
 
@@ -1145,7 +1165,7 @@ EXAMPLES
1145
1165
  $ internxt whoami
1146
1166
  ```
1147
1167
 
1148
- _See code: [src/commands/whoami.ts](https://github.com/internxt/cli/blob/v1.5.3/src/commands/whoami.ts)_
1168
+ _See code: [src/commands/whoami.ts](https://github.com/internxt/cli/blob/v1.5.4/src/commands/whoami.ts)_
1149
1169
  <!-- commandsstop -->
1150
1170
 
1151
1171
  # Current Limitations
package/bin/dev.js CHANGED
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node_modules/.bin/ts-node
2
2
  /* eslint-disable */
3
- require('dotenv').config({ path: __dirname + '/../.env' });
3
+ require('dotenv').config({ path: __dirname + '/../.env', quiet: true });
4
4
  (async () => {
5
5
  const oclif = await import('@oclif/core');
6
6
  await oclif.execute({ development: true, dir: __dirname });
package/bin/run.js CHANGED
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
2
  /* eslint-disable */
3
- require('dotenv').config({ path: __dirname + '/../.env' });
3
+ require('dotenv').config({ path: __dirname + '/../.env', quiet: true });
4
4
  (async () => {
5
5
  const oclif = await import('@oclif/core');
6
6
  await oclif.execute({ development: false, dir: __dirname });
@@ -48,7 +48,7 @@ class CreateFolder extends core_1.Command {
48
48
  });
49
49
  const newFolder = await createNewFolder;
50
50
  cli_utils_1.CLIUtils.done(flags['json']);
51
- const message = `Folder ${newFolder.plainName} created successfully, view it at ${config_service_1.ConfigService.instance.get('DRIVE_URL')}/folder/${newFolder.uuid}`;
51
+ const message = `Folder ${newFolder.plainName} created successfully, view it at ${config_service_1.ConfigService.instance.get('DRIVE_WEB_URL')}/folder/${newFolder.uuid}`;
52
52
  cli_utils_1.CLIUtils.success(this.log.bind(this), message);
53
53
  return { success: true, message, folder: newFolder };
54
54
  };
@@ -32,7 +32,7 @@ class DeletePermanentlyFile extends core_1.Command {
32
32
  if (!driveFile) {
33
33
  throw new Error('File not found');
34
34
  }
35
- await trash_service_1.TrashService.instance.deleteFile({ fileId: driveFile.id, folderId: driveFile.folderId });
35
+ await trash_service_1.TrashService.instance.deleteFile(driveFile.uuid);
36
36
  const message = 'File permanently deleted successfully';
37
37
  cli_utils_1.CLIUtils.success(this.log.bind(this), message);
38
38
  return { success: true, message };
@@ -32,7 +32,7 @@ class DeletePermanentlyFolder extends core_1.Command {
32
32
  if (!driveFolder) {
33
33
  throw new Error('Folder not found');
34
34
  }
35
- await trash_service_1.TrashService.instance.deleteFolder(driveFolder.id);
35
+ await trash_service_1.TrashService.instance.deleteFolder(driveFolder.uuid);
36
36
  const message = 'Folder permanently deleted successfully';
37
37
  cli_utils_1.CLIUtils.success(this.log.bind(this), message);
38
38
  return { success: true, message };
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const core_1 = require("@oclif/core");
4
4
  const config_service_1 = require("../services/config.service");
5
5
  const cli_utils_1 = require("../utils/cli.utils");
6
+ const auth_service_1 = require("../services/auth.service");
6
7
  class Logout extends core_1.Command {
7
8
  static args = {};
8
9
  static description = 'Logs out the current internxt user that is logged into the Internxt CLI.';
@@ -13,6 +14,7 @@ class Logout extends core_1.Command {
13
14
  run = async () => {
14
15
  const user = await config_service_1.ConfigService.instance.readUser();
15
16
  if (user) {
17
+ await auth_service_1.AuthService.instance.logout();
16
18
  await config_service_1.ConfigService.instance.clearUser();
17
19
  const message = 'User logged out successfully.';
18
20
  cli_utils_1.CLIUtils.success(this.log.bind(this), message);
@@ -117,7 +117,7 @@ class UploadFile extends core_1.Command {
117
117
  if (isThumbnailable && bufferStream) {
118
118
  const thumbnailBuffer = bufferStream.getBuffer();
119
119
  if (thumbnailBuffer) {
120
- await thumbnail_service_1.ThumbnailService.instance.uploadThumbnail(thumbnailBuffer, fileType, user.bucket, createdDriveFile.id, networkFacade);
120
+ await thumbnail_service_1.ThumbnailService.instance.uploadThumbnail(thumbnailBuffer, fileType, user.bucket, createdDriveFile.uuid, networkFacade);
121
121
  }
122
122
  }
123
123
  }
@@ -128,7 +128,7 @@ class UploadFile extends core_1.Command {
128
128
  progressBar?.stop();
129
129
  const uploadTime = timer.stop();
130
130
  this.log('\n');
131
- const message = `File uploaded in ${uploadTime}ms, view it at ${config_service_1.ConfigService.instance.get('DRIVE_URL')}/file/${createdDriveFile.uuid}`;
131
+ const message = `File uploaded in ${uploadTime}ms, view it at ${config_service_1.ConfigService.instance.get('DRIVE_WEB_URL')}/file/${createdDriveFile.uuid}`;
132
132
  cli_utils_1.CLIUtils.success(this.log.bind(this), message);
133
133
  return { success: true, message, file: createdDriveFile };
134
134
  };
@@ -5,4 +5,5 @@ export declare class AuthService {
5
5
  is2FANeeded: (email: string) => Promise<boolean>;
6
6
  getAuthDetails: () => Promise<LoginCredentials>;
7
7
  refreshUserTokens: (oldCreds: LoginCredentials) => Promise<LoginCredentials>;
8
+ logout: () => Promise<void>;
8
9
  }
@@ -73,7 +73,7 @@ class AuthService {
73
73
  token: oldCreds.token,
74
74
  newToken: oldCreds.newToken,
75
75
  });
76
- const usersClient = sdk_manager_service_1.SdkManager.instance.getUsers(true);
76
+ const usersClient = sdk_manager_service_1.SdkManager.instance.getUsers();
77
77
  const newCreds = await usersClient.getUserData({ userUuid: oldCreds.user.uuid });
78
78
  const loginCreds = {
79
79
  user: {
@@ -92,5 +92,17 @@ class AuthService {
92
92
  });
93
93
  return loginCreds;
94
94
  };
95
+ logout = async () => {
96
+ try {
97
+ const user = await config_service_1.ConfigService.instance.readUser();
98
+ if (!user || !user.newToken) {
99
+ return;
100
+ }
101
+ const authClient = sdk_manager_service_1.SdkManager.instance.getAuth();
102
+ return authClient.logout(user.newToken);
103
+ }
104
+ catch {
105
+ }
106
+ };
95
107
  }
96
108
  exports.AuthService = AuthService;
@@ -14,5 +14,5 @@ export declare class CryptoService {
14
14
  encryptTextWithKey: (textToEncrypt: string, secret: string) => string;
15
15
  decryptTextWithKey: (encryptedText: string, secret: string) => string;
16
16
  decryptStream: (inputSlices: ReadableStream<Uint8Array>[], key: Buffer, iv: Buffer, startOffsetByte?: number) => ReadableStream<any>;
17
- private getKeyAndIvFrom;
17
+ private readonly getKeyAndIvFrom;
18
18
  }
@@ -8,7 +8,7 @@ const stream_utils_1 = require("../utils/stream.utils");
8
8
  class CryptoService {
9
9
  static instance = new CryptoService();
10
10
  static cryptoProvider = {
11
- async encryptPasswordHash(password, encryptedSalt) {
11
+ encryptPasswordHash(password, encryptedSalt) {
12
12
  const salt = CryptoService.instance.decryptText(encryptedSalt);
13
13
  const hashObj = CryptoService.instance.passToHash({ password, salt });
14
14
  return CryptoService.instance.encryptText(hashObj.hash);
@@ -32,7 +32,7 @@ class CryptoService {
32
32
  },
33
33
  };
34
34
  passToHash = (passObject) => {
35
- const salt = passObject.salt ? passObject.salt : (0, node_crypto_1.randomBytes)(128 / 8).toString('hex');
35
+ const salt = passObject.salt ?? (0, node_crypto_1.randomBytes)(128 / 8).toString('hex');
36
36
  const hash = (0, node_crypto_1.pbkdf2Sync)(passObject.password, Buffer.from(salt, 'hex'), 10000, 256 / 8, 'sha1').toString('hex');
37
37
  const hashedObjetc = {
38
38
  salt,
@@ -10,5 +10,5 @@ export declare class DriveFileService {
10
10
  type?: string | null;
11
11
  }) => Promise<void>;
12
12
  getFileMetadataByPath: (path: string) => Promise<DriveFileItem>;
13
- createThumbnail: (payload: StorageTypes.ThumbnailEntry) => Promise<StorageTypes.Thumbnail>;
13
+ createThumbnail: (payload: StorageTypes.CreateThumbnailEntryPayload) => Promise<StorageTypes.Thumbnail>;
14
14
  }
@@ -6,7 +6,7 @@ const drive_utils_1 = require("../../utils/drive.utils");
6
6
  class DriveFileService {
7
7
  static instance = new DriveFileService();
8
8
  createFile = async (payload) => {
9
- const storageClient = sdk_manager_service_1.SdkManager.instance.getStorage(true);
9
+ const storageClient = sdk_manager_service_1.SdkManager.instance.getStorage();
10
10
  const driveFile = await storageClient.createFileEntryByUuid(payload);
11
11
  return {
12
12
  name: payload.plain_name,
@@ -25,27 +25,27 @@ class DriveFileService {
25
25
  };
26
26
  };
27
27
  getFileMetadata = async (uuid) => {
28
- const storageClient = sdk_manager_service_1.SdkManager.instance.getStorage(true);
28
+ const storageClient = sdk_manager_service_1.SdkManager.instance.getStorage();
29
29
  const [getFileMetadata] = storageClient.getFile(uuid);
30
30
  const fileMetadata = await getFileMetadata;
31
31
  return drive_utils_1.DriveUtils.driveFileMetaToItem(fileMetadata);
32
32
  };
33
33
  moveFile = (payload) => {
34
- const storageClient = sdk_manager_service_1.SdkManager.instance.getStorage(true);
34
+ const storageClient = sdk_manager_service_1.SdkManager.instance.getStorage();
35
35
  return storageClient.moveFileByUuid(payload);
36
36
  };
37
37
  renameFile = (fileUuid, payload) => {
38
- const storageClient = sdk_manager_service_1.SdkManager.instance.getStorage(true);
38
+ const storageClient = sdk_manager_service_1.SdkManager.instance.getStorage();
39
39
  return storageClient.updateFileMetaByUUID(fileUuid, payload);
40
40
  };
41
41
  getFileMetadataByPath = async (path) => {
42
- const storageClient = sdk_manager_service_1.SdkManager.instance.getStorage(true);
42
+ const storageClient = sdk_manager_service_1.SdkManager.instance.getStorage();
43
43
  const fileMetadata = await storageClient.getFileByPath(encodeURIComponent(path));
44
44
  return drive_utils_1.DriveUtils.driveFileMetaToItem(fileMetadata);
45
45
  };
46
46
  createThumbnail = (payload) => {
47
- const storageClient = sdk_manager_service_1.SdkManager.instance.getStorage(false);
48
- return storageClient.createThumbnailEntry(payload);
47
+ const storageClient = sdk_manager_service_1.SdkManager.instance.getStorage();
48
+ return storageClient.createThumbnailEntryWithUUID(payload);
49
49
  };
50
50
  }
51
51
  exports.DriveFileService = DriveFileService;
@@ -6,17 +6,17 @@ const drive_utils_1 = require("../../utils/drive.utils");
6
6
  class DriveFolderService {
7
7
  static instance = new DriveFolderService();
8
8
  getFolderMetaByUuid = async (uuid) => {
9
- const storageClient = sdk_manager_service_1.SdkManager.instance.getStorage(true);
9
+ const storageClient = sdk_manager_service_1.SdkManager.instance.getStorage();
10
10
  const folderMeta = await storageClient.getFolderMeta(uuid);
11
11
  return drive_utils_1.DriveUtils.driveFolderMetaToItem(folderMeta);
12
12
  };
13
13
  getFolderMetaById = async (id) => {
14
- const storageClient = sdk_manager_service_1.SdkManager.instance.getStorage(true);
14
+ const storageClient = sdk_manager_service_1.SdkManager.instance.getStorage();
15
15
  const folderMeta = await storageClient.getFolderMetaById(id);
16
16
  return drive_utils_1.DriveUtils.driveFolderMetaToItem(folderMeta);
17
17
  };
18
18
  getFolderContent = async (folderUuid) => {
19
- const storageClient = sdk_manager_service_1.SdkManager.instance.getStorage(true);
19
+ const storageClient = sdk_manager_service_1.SdkManager.instance.getStorage();
20
20
  const folders = await this.getAllSubfolders(storageClient, folderUuid, 0);
21
21
  const files = await this.getAllSubfiles(storageClient, folderUuid, 0);
22
22
  return { folders, files };
@@ -42,19 +42,19 @@ class DriveFolderService {
42
42
  }
43
43
  };
44
44
  moveFolder = (payload) => {
45
- const storageClient = sdk_manager_service_1.SdkManager.instance.getStorage(true);
45
+ const storageClient = sdk_manager_service_1.SdkManager.instance.getStorage();
46
46
  return storageClient.moveFolderByUuid(payload);
47
47
  };
48
48
  createFolder(payload) {
49
- const storageClient = sdk_manager_service_1.SdkManager.instance.getStorage(true);
49
+ const storageClient = sdk_manager_service_1.SdkManager.instance.getStorage();
50
50
  return storageClient.createFolderByUuid(payload);
51
51
  }
52
52
  renameFolder = (payload) => {
53
- const storageClient = sdk_manager_service_1.SdkManager.instance.getStorage(true);
53
+ const storageClient = sdk_manager_service_1.SdkManager.instance.getStorage();
54
54
  return storageClient.updateFolderNameWithUUID(payload);
55
55
  };
56
56
  getFolderMetadataByPath = async (path) => {
57
- const storageClient = sdk_manager_service_1.SdkManager.instance.getStorage(true);
57
+ const storageClient = sdk_manager_service_1.SdkManager.instance.getStorage();
58
58
  const folderMeta = await storageClient.getFolderByPath(encodeURIComponent(path));
59
59
  return drive_utils_1.DriveUtils.driveFolderMetaToItem({
60
60
  ...folderMeta,
@@ -2,13 +2,15 @@ import { StorageTypes } from '@internxt/sdk/dist/drive';
2
2
  export declare class TrashService {
3
3
  static readonly instance: TrashService;
4
4
  trashItems: (payload: StorageTypes.AddItemsToTrashPayload) => Promise<void>;
5
- deleteFile: (payload: StorageTypes.DeleteFilePayload) => Promise<unknown>;
6
- deleteFolder: (folderId: number) => Promise<unknown>;
5
+ deleteFile: (fileId: string) => Promise<{
6
+ deleted: boolean;
7
+ }>;
8
+ deleteFolder: (folderId: string) => Promise<void>;
7
9
  clearTrash: () => Promise<void>;
8
10
  getTrashFolderContent: () => Promise<{
9
11
  folders: StorageTypes.FetchPaginatedFolder[];
10
12
  files: StorageTypes.FetchPaginatedFile[];
11
13
  }>;
12
- private getAllTrashSubfolders;
13
- private getAllTrashSubfiles;
14
+ private readonly getAllTrashSubfolders;
15
+ private readonly getAllTrashSubfiles;
14
16
  }
@@ -5,16 +5,16 @@ const sdk_manager_service_1 = require("../sdk-manager.service");
5
5
  class TrashService {
6
6
  static instance = new TrashService();
7
7
  trashItems = (payload) => {
8
- const storageClient = sdk_manager_service_1.SdkManager.instance.getStorage(true);
8
+ const storageClient = sdk_manager_service_1.SdkManager.instance.getStorage();
9
9
  return storageClient.addItemsToTrash(payload);
10
10
  };
11
- deleteFile = (payload) => {
12
- const storageClient = sdk_manager_service_1.SdkManager.instance.getStorage(false);
13
- return storageClient.deleteFile(payload);
11
+ deleteFile = (fileId) => {
12
+ const storageClient = sdk_manager_service_1.SdkManager.instance.getStorage();
13
+ return storageClient.deleteFileByUuid(fileId);
14
14
  };
15
15
  deleteFolder = (folderId) => {
16
- const storageClient = sdk_manager_service_1.SdkManager.instance.getStorage(false);
17
- return storageClient.deleteFolder(folderId);
16
+ const storageClient = sdk_manager_service_1.SdkManager.instance.getStorage();
17
+ return storageClient.deleteFolderByUuid(folderId);
18
18
  };
19
19
  clearTrash = () => {
20
20
  const storageClient = sdk_manager_service_1.SdkManager.instance.getTrash();
@@ -12,11 +12,9 @@ export declare class SdkManager {
12
12
  throwErrorOnMissingCredentials: boolean;
13
13
  }) => SdkManagerApiSecurity;
14
14
  static readonly getAppDetails: () => AppDetails;
15
- getAuth(useNewApi?: boolean): Auth;
16
- getPayments(): Drive.Payments;
17
- getUsers(useNewApi?: boolean): Drive.Users;
18
- getReferrals(): Drive.Referrals;
19
- getStorage(useNewApi?: boolean): Drive.Storage;
15
+ getAuth(): Auth;
16
+ getUsers(): Drive.Users;
17
+ getStorage(): Drive.Storage;
20
18
  getTrash(): Drive.Trash;
21
19
  getShare(): Drive.Share;
22
20
  getNetwork(credentials: {
@@ -25,68 +25,48 @@ class SdkManager {
25
25
  };
26
26
  static getAppDetails = () => {
27
27
  return {
28
- clientName: package_json_1.default.name,
28
+ clientName: package_json_1.default.clientName,
29
29
  clientVersion: package_json_1.default.version,
30
30
  };
31
31
  };
32
- getAuth(useNewApi = false) {
33
- const DRIVE_API_URL = useNewApi
34
- ? config_service_1.ConfigService.instance.get('DRIVE_NEW_API_URL')
35
- : config_service_1.ConfigService.instance.get('DRIVE_API_URL');
32
+ getAuth() {
33
+ const DRIVE_API_URL = config_service_1.ConfigService.instance.get('DRIVE_NEW_API_URL');
36
34
  const apiSecurity = SdkManager.getApiSecurity({ throwErrorOnMissingCredentials: false });
37
35
  const appDetails = SdkManager.getAppDetails();
38
36
  return sdk_1.Auth.client(DRIVE_API_URL, appDetails, {
39
- token: useNewApi ? apiSecurity?.newToken : apiSecurity?.token,
37
+ token: apiSecurity?.newToken,
40
38
  });
41
39
  }
42
- getPayments() {
43
- const PAYMENTS_API_URL = config_service_1.ConfigService.instance.get('PAYMENTS_API_URL');
44
- const newToken = SdkManager.getApiSecurity().newToken;
45
- const appDetails = SdkManager.getAppDetails();
46
- return sdk_1.Drive.Payments.client(PAYMENTS_API_URL, appDetails, {
47
- token: newToken,
48
- });
49
- }
50
- getUsers(useNewApi = false) {
51
- const DRIVE_API_URL = useNewApi
52
- ? config_service_1.ConfigService.instance.get('DRIVE_NEW_API_URL')
53
- : config_service_1.ConfigService.instance.get('DRIVE_API_URL');
40
+ getUsers() {
41
+ const DRIVE_API_URL = config_service_1.ConfigService.instance.get('DRIVE_NEW_API_URL');
54
42
  const apiSecurity = SdkManager.getApiSecurity({ throwErrorOnMissingCredentials: false });
55
43
  const appDetails = SdkManager.getAppDetails();
56
44
  return sdk_1.Drive.Users.client(DRIVE_API_URL, appDetails, {
57
- token: useNewApi ? apiSecurity.newToken : apiSecurity.token,
45
+ token: apiSecurity.newToken,
58
46
  });
59
47
  }
60
- getReferrals() {
61
- const DRIVE_API_URL = config_service_1.ConfigService.instance.get('DRIVE_API_URL');
62
- const apiSecurity = SdkManager.getApiSecurity();
63
- const appDetails = SdkManager.getAppDetails();
64
- return sdk_1.Drive.Referrals.client(DRIVE_API_URL, appDetails, apiSecurity);
65
- }
66
- getStorage(useNewApi = false) {
67
- const DRIVE_API_URL = useNewApi
68
- ? config_service_1.ConfigService.instance.get('DRIVE_NEW_API_URL')
69
- : config_service_1.ConfigService.instance.get('DRIVE_API_URL');
48
+ getStorage() {
49
+ const DRIVE_API_URL = config_service_1.ConfigService.instance.get('DRIVE_NEW_API_URL');
70
50
  const apiSecurity = SdkManager.getApiSecurity();
71
51
  const appDetails = SdkManager.getAppDetails();
72
52
  return sdk_1.Drive.Storage.client(DRIVE_API_URL, appDetails, {
73
- token: useNewApi ? apiSecurity.newToken : apiSecurity.token,
53
+ token: apiSecurity.newToken,
74
54
  });
75
55
  }
76
56
  getTrash() {
77
57
  const DRIVE_NEW_API_URL = config_service_1.ConfigService.instance.get('DRIVE_NEW_API_URL');
78
- const newToken = SdkManager.getApiSecurity().newToken;
58
+ const apiSecurity = SdkManager.getApiSecurity();
79
59
  const appDetails = SdkManager.getAppDetails();
80
60
  return drive_1.Trash.client(DRIVE_NEW_API_URL, appDetails, {
81
- token: newToken,
61
+ token: apiSecurity.newToken,
82
62
  });
83
63
  }
84
64
  getShare() {
85
65
  const DRIVE_NEW_API_URL = config_service_1.ConfigService.instance.get('DRIVE_NEW_API_URL');
86
- const newToken = SdkManager.getApiSecurity().newToken;
66
+ const apiSecurity = SdkManager.getApiSecurity();
87
67
  const appDetails = SdkManager.getAppDetails();
88
68
  return sdk_1.Drive.Share.client(DRIVE_NEW_API_URL, appDetails, {
89
- token: newToken,
69
+ token: apiSecurity.newToken,
90
70
  });
91
71
  }
92
72
  getNetwork(credentials) {
@@ -2,6 +2,6 @@ import { StorageTypes } from '@internxt/sdk/dist/drive';
2
2
  import { NetworkFacade } from './network/network-facade.service';
3
3
  export declare class ThumbnailService {
4
4
  static readonly instance: ThumbnailService;
5
- uploadThumbnail: (fileContent: Buffer, fileType: string, userBucket: string, file_id: number, networkFacade: NetworkFacade) => Promise<StorageTypes.Thumbnail | undefined>;
6
- private getThumbnailFromImageBuffer;
5
+ uploadThumbnail: (fileContent: Buffer, fileType: string, userBucket: string, file_id: string, networkFacade: NetworkFacade) => Promise<StorageTypes.Thumbnail | undefined>;
6
+ private readonly getThumbnailFromImageBuffer;
7
7
  }
@@ -27,14 +27,14 @@ class ThumbnailService {
27
27
  }, () => { });
28
28
  });
29
29
  const createdThumbnailFile = await drive_file_service_1.DriveFileService.instance.createThumbnail({
30
- file_id: file_id,
31
- max_width: thumbnail_utils_1.ThumbnailConfig.MaxWidth,
32
- max_height: thumbnail_utils_1.ThumbnailConfig.MaxHeight,
30
+ fileUuid: file_id,
31
+ maxWidth: thumbnail_utils_1.ThumbnailConfig.MaxWidth,
32
+ maxHeight: thumbnail_utils_1.ThumbnailConfig.MaxHeight,
33
33
  type: thumbnail_utils_1.ThumbnailConfig.Type,
34
34
  size: size,
35
- bucket_id: userBucket,
36
- bucket_file: fileId,
37
- encrypt_version: drive_1.StorageTypes.EncryptionVersion.Aes03,
35
+ bucketId: userBucket,
36
+ bucketFile: fileId,
37
+ encryptVersion: drive_1.StorageTypes.EncryptionVersion.Aes03,
38
38
  });
39
39
  return createdThumbnailFile;
40
40
  }
@@ -1,7 +1,7 @@
1
- import { UsageResponse } from '@internxt/sdk/dist/drive/storage/types';
1
+ import { UsageResponseV2 } from '@internxt/sdk/dist/drive/storage/types';
2
2
  export declare class UsageService {
3
3
  static readonly instance: UsageService;
4
4
  static readonly INFINITE_LIMIT: number;
5
- fetchUsage: () => Promise<UsageResponse>;
5
+ fetchUsage: () => Promise<UsageResponseV2>;
6
6
  fetchSpaceLimit: () => Promise<number>;
7
7
  }
@@ -7,12 +7,12 @@ class UsageService {
7
7
  static INFINITE_LIMIT = 99 * Math.pow(1024, 4);
8
8
  fetchUsage = async () => {
9
9
  const storageClient = sdk_manager_service_1.SdkManager.instance.getStorage();
10
- const driveUsage = await storageClient.spaceUsage();
10
+ const driveUsage = await storageClient.spaceUsageV2();
11
11
  return driveUsage;
12
12
  };
13
13
  fetchSpaceLimit = async () => {
14
14
  const storageClient = sdk_manager_service_1.SdkManager.instance.getStorage();
15
- const spaceLimit = await storageClient.spaceLimit();
15
+ const spaceLimit = await storageClient.spaceLimitV2();
16
16
  return spaceLimit.maxSpaceBytes;
17
17
  };
18
18
  }
@@ -1,10 +1,7 @@
1
1
  export interface ConfigKeys {
2
- readonly DRIVE_URL: string;
3
- readonly DRIVE_API_URL: string;
2
+ readonly DRIVE_WEB_URL: string;
4
3
  readonly DRIVE_NEW_API_URL: string;
5
- readonly PAYMENTS_API_URL: string;
6
4
  readonly APP_CRYPTO_SECRET: string;
7
- readonly APP_CRYPTO_SECRET2: string;
8
5
  readonly APP_MAGIC_IV: string;
9
6
  readonly APP_MAGIC_SALT: string;
10
7
  readonly NETWORK_URL: string;
@@ -1,7 +1,7 @@
1
1
  import pm2 from 'pm2';
2
2
  export type WebDavProcessStatus = 'online' | 'stopping' | 'stopped' | 'launching' | 'errored' | 'one-launch-status' | 'offline' | 'unknown';
3
3
  export declare class PM2Utils {
4
- private static WEBDAV_APP_NAME;
4
+ private static readonly WEBDAV_APP_NAME;
5
5
  static connect(): Promise<void>;
6
6
  static disconnect(): void;
7
7
  static clean(): Promise<void>;
@@ -31,14 +31,14 @@ const thumbnailableImageExtension = [
31
31
  const thumbnailablePdfExtension = pdfExtensions['pdf'];
32
32
  const thumbnailableExtension = [...thumbnailableImageExtension];
33
33
  const isFileThumbnailable = (fileType) => {
34
- return fileType.trim().length > 0 && thumbnailableExtension.includes(fileType);
34
+ return fileType.trim().length > 0 && thumbnailableExtension.includes(fileType.trim().toLowerCase());
35
35
  };
36
36
  exports.isFileThumbnailable = isFileThumbnailable;
37
37
  const isPDFThumbnailable = (fileType) => {
38
- return fileType.trim().length > 0 && thumbnailablePdfExtension.includes(fileType);
38
+ return fileType.trim().length > 0 && thumbnailablePdfExtension.includes(fileType.trim().toLowerCase());
39
39
  };
40
40
  exports.isPDFThumbnailable = isPDFThumbnailable;
41
41
  const isImageThumbnailable = (fileType) => {
42
- return fileType.trim().length > 0 && thumbnailableImageExtension.includes(fileType);
42
+ return fileType.trim().length > 0 && thumbnailableImageExtension.includes(fileType.trim().toLowerCase());
43
43
  };
44
44
  exports.isImageThumbnailable = isImageThumbnailable;
@@ -7,10 +7,9 @@ export declare class WebDavUtils {
7
7
  static joinURL(...pathComponents: string[]): string;
8
8
  static removeHostFromURL(completeURL: string): string;
9
9
  static getRequestedResource(urlObject: string | Request, decodeUri?: boolean): Promise<WebDavRequestedResource>;
10
- static getDriveItemFromResource(resource: WebDavRequestedResource, driveFolderService?: DriveFolderService, driveFileService?: DriveFileService): Promise<DriveFileItem | DriveFolderItem | undefined>;
11
- static getAndSearchItemFromResource({ resource, driveFolderService, driveFileService, }: {
10
+ static getDriveItemFromResource({ resource, driveFolderService, driveFileService, }: {
12
11
  resource: WebDavRequestedResource;
13
12
  driveFolderService?: DriveFolderService;
14
13
  driveFileService?: DriveFileService;
15
- }): Promise<DriveFileItem | DriveFolderItem>;
14
+ }): Promise<DriveFileItem | DriveFolderItem | undefined>;
16
15
  }
@@ -5,7 +5,6 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.WebDavUtils = void 0;
7
7
  const node_path_1 = __importDefault(require("node:path"));
8
- const errors_utils_1 = require("./errors.utils");
9
8
  class WebDavUtils {
10
9
  static joinURL(...pathComponents) {
11
10
  return node_path_1.default.posix.join(...pathComponents);
@@ -55,30 +54,19 @@ class WebDavUtils {
55
54
  };
56
55
  }
57
56
  }
58
- static async getDriveItemFromResource(resource, driveFolderService, driveFileService) {
57
+ static async getDriveItemFromResource({ resource, driveFolderService, driveFileService, }) {
59
58
  let item = undefined;
60
- if (resource.type === 'folder') {
61
- try {
59
+ try {
60
+ if (resource.type === 'folder') {
62
61
  item = await driveFolderService?.getFolderMetadataByPath(resource.url);
63
62
  }
64
- catch (error) {
65
- if (error.status === 404) {
66
- throw new errors_utils_1.ConflictError(`Resource not found on Internxt Drive at ${resource.url}`);
67
- }
68
- throw error;
63
+ if (resource.type === 'file') {
64
+ item = await driveFileService?.getFileMetadataByPath(resource.url);
69
65
  }
70
66
  }
71
- if (resource.type === 'file') {
72
- item = await driveFileService?.getFileMetadataByPath(resource.url);
67
+ catch {
73
68
  }
74
69
  return item;
75
70
  }
76
- static async getAndSearchItemFromResource({ resource, driveFolderService, driveFileService, }) {
77
- const driveItem = await this.getDriveItemFromResource(resource, driveFolderService, driveFileService);
78
- if (!driveItem) {
79
- throw new errors_utils_1.NotFoundError(`Resource not found on Internxt Drive at ${resource.url}`);
80
- }
81
- return driveItem;
82
- }
83
71
  }
84
72
  exports.WebDavUtils = WebDavUtils;
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.DELETERequestHandler = void 0;
4
4
  const webdav_utils_1 = require("../../utils/webdav.utils");
5
5
  const logger_utils_1 = require("../../utils/logger.utils");
6
+ const errors_utils_1 = require("../../utils/errors.utils");
6
7
  class DELETERequestHandler {
7
8
  dependencies;
8
9
  constructor(dependencies) {
@@ -12,11 +13,14 @@ class DELETERequestHandler {
12
13
  const { driveFileService, driveFolderService, trashService } = this.dependencies;
13
14
  const resource = await webdav_utils_1.WebDavUtils.getRequestedResource(req);
14
15
  logger_utils_1.webdavLogger.info(`[DELETE] Request received for ${resource.type} at ${resource.url}`);
15
- const driveItem = await webdav_utils_1.WebDavUtils.getAndSearchItemFromResource({
16
+ const driveItem = await webdav_utils_1.WebDavUtils.getDriveItemFromResource({
16
17
  resource,
17
18
  driveFolderService,
18
19
  driveFileService: driveFileService,
19
20
  });
21
+ if (!driveItem) {
22
+ throw new errors_utils_1.NotFoundError(`Resource not found on Internxt Drive at ${resource.url}`);
23
+ }
20
24
  logger_utils_1.webdavLogger.info(`[DELETE] [${driveItem.uuid}] Trashing ${resource.type}`);
21
25
  await trashService.trashItems({
22
26
  items: [{ type: resource.type, uuid: driveItem.uuid }],
@@ -18,10 +18,14 @@ class GETRequestHandler {
18
18
  if (resource.type === 'folder')
19
19
  throw new errors_utils_1.NotFoundError('Folders cannot be listed with GET. Use PROPFIND instead.');
20
20
  logger_utils_1.webdavLogger.info(`[GET] Request received for ${resource.type} at ${resource.url}`);
21
- const driveFile = (await webdav_utils_1.WebDavUtils.getAndSearchItemFromResource({
21
+ const driveItem = await webdav_utils_1.WebDavUtils.getDriveItemFromResource({
22
22
  resource,
23
23
  driveFileService,
24
- }));
24
+ });
25
+ if (!driveItem) {
26
+ throw new errors_utils_1.NotFoundError(`Resource not found on Internxt Drive at ${resource.url}`);
27
+ }
28
+ const driveFile = driveItem;
25
29
  logger_utils_1.webdavLogger.info(`[GET] [${driveFile.uuid}] Found Drive File`);
26
30
  const { user } = await authService.getAuthDetails();
27
31
  logger_utils_1.webdavLogger.info(`[GET] [${driveFile.uuid}] Network ready for download`);
@@ -4,6 +4,7 @@ exports.HEADRequestHandler = void 0;
4
4
  const webdav_utils_1 = require("../../utils/webdav.utils");
5
5
  const logger_utils_1 = require("../../utils/logger.utils");
6
6
  const network_utils_1 = require("../../utils/network.utils");
7
+ const errors_utils_1 = require("../../utils/errors.utils");
7
8
  class HEADRequestHandler {
8
9
  dependencies;
9
10
  constructor(dependencies) {
@@ -18,10 +19,14 @@ class HEADRequestHandler {
18
19
  }
19
20
  logger_utils_1.webdavLogger.info(`[HEAD] Request received for ${resource.type} at ${resource.url}`);
20
21
  try {
21
- const driveFile = (await webdav_utils_1.WebDavUtils.getAndSearchItemFromResource({
22
+ const driveItem = await webdav_utils_1.WebDavUtils.getDriveItemFromResource({
22
23
  resource,
23
24
  driveFileService,
24
- }));
25
+ });
26
+ if (!driveItem) {
27
+ throw new errors_utils_1.NotFoundError(`Resource not found on Internxt Drive at ${resource.url}`);
28
+ }
29
+ const driveFile = driveItem;
25
30
  logger_utils_1.webdavLogger.info(`[HEAD] [${driveFile.uuid}] Found Drive File`);
26
31
  const range = req.headers['range'];
27
32
  const rangeOptions = network_utils_1.NetworkUtils.parseRangeHeader({
@@ -16,17 +16,19 @@ class MKCOLRequestHandler {
16
16
  const resource = await webdav_utils_1.WebDavUtils.getRequestedResource(req);
17
17
  logger_utils_1.webdavLogger.info(`[MKCOL] Request received for ${resource.type} at ${resource.url}`);
18
18
  const parentResource = await webdav_utils_1.WebDavUtils.getRequestedResource(resource.parentPath, false);
19
- const parentFolderItem = (await webdav_utils_1.WebDavUtils.getAndSearchItemFromResource({
19
+ const parentDriveItem = await webdav_utils_1.WebDavUtils.getDriveItemFromResource({
20
20
  resource: parentResource,
21
21
  driveFolderService,
22
- }));
23
- let folderAlreadyExists = true;
24
- try {
25
- await driveFolderService.getFolderMetadataByPath(resource.url);
26
- }
27
- catch {
28
- folderAlreadyExists = false;
22
+ });
23
+ if (!parentDriveItem) {
24
+ throw new errors_utils_1.ConflictError(`Parent folders not found on Internxt Drive at ${resource.url}`);
29
25
  }
26
+ const parentFolderItem = parentDriveItem;
27
+ const driveFolderItem = await webdav_utils_1.WebDavUtils.getDriveItemFromResource({
28
+ resource,
29
+ driveFolderService,
30
+ });
31
+ const folderAlreadyExists = !!driveFolderItem;
30
32
  if (folderAlreadyExists) {
31
33
  logger_utils_1.webdavLogger.info(`[MKCOL] ❌ Folder '${resource.url}' already exists`);
32
34
  throw new errors_utils_1.MethodNotAllowed('Folder already exists');
@@ -20,11 +20,14 @@ class MOVERequestHandler {
20
20
  const destinationPath = webdav_utils_1.WebDavUtils.removeHostFromURL(destinationUrl);
21
21
  const destinationResource = await webdav_utils_1.WebDavUtils.getRequestedResource(destinationPath);
22
22
  logger_utils_1.webdavLogger.info('[MOVE] Destination resource found', { destinationResource });
23
- const originalDriveItem = await webdav_utils_1.WebDavUtils.getAndSearchItemFromResource({
23
+ const originalDriveItem = await webdav_utils_1.WebDavUtils.getDriveItemFromResource({
24
24
  resource,
25
25
  driveFolderService,
26
26
  driveFileService,
27
27
  });
28
+ if (!originalDriveItem) {
29
+ throw new errors_utils_1.NotFoundError(`Resource not found on Internxt Drive at ${resource.url}`);
30
+ }
28
31
  if (destinationResource.path.dir === resource.path.dir) {
29
32
  logger_utils_1.webdavLogger.info(`[MOVE] Renaming ${resource.type} with UUID ${originalDriveItem.uuid} to ${destinationResource.name}`);
30
33
  const newName = destinationResource.name;
@@ -47,10 +50,14 @@ class MOVERequestHandler {
47
50
  else {
48
51
  logger_utils_1.webdavLogger.info(`[MOVE] Moving ${resource.type} with UUID ${originalDriveItem.uuid} to ${destinationPath}`);
49
52
  const destinationFolderResource = await webdav_utils_1.WebDavUtils.getRequestedResource(destinationResource.parentPath);
50
- const destinationFolderItem = (await webdav_utils_1.WebDavUtils.getAndSearchItemFromResource({
53
+ const destinationDriveFolderItem = await webdav_utils_1.WebDavUtils.getDriveItemFromResource({
51
54
  resource: destinationFolderResource,
52
55
  driveFolderService,
53
- }));
56
+ });
57
+ if (!destinationDriveFolderItem) {
58
+ throw new errors_utils_1.NotFoundError(`Resource not found on Internxt Drive at ${resource.url}`);
59
+ }
60
+ const destinationFolderItem = destinationDriveFolderItem;
54
61
  if (resource.type === 'folder') {
55
62
  const folder = originalDriveItem;
56
63
  await driveFolderService.moveFolder({
@@ -13,23 +13,20 @@ class OPTIONSRequestHandler {
13
13
  res.header('Allow', 'DELETE, GET, HEAD, MKCOL, MOVE, OPTIONS, PROPFIND, PUT');
14
14
  res.header('DAV', '1, 2, ordered-collections');
15
15
  res.status(200).send();
16
- return;
17
16
  }
18
- if (resource.type === 'folder') {
17
+ else if (resource.type === 'folder') {
19
18
  const allowedMethods = 'DELETE, HEAD, MKCOL, MOVE, OPTIONS, PROPFIND';
20
19
  logger_utils_1.webdavLogger.info(`[OPTIONS] Returning Allowed Options: ${allowedMethods}`);
21
20
  res.header('Allow', allowedMethods);
22
21
  res.header('DAV', '1, 2, ordered-collections');
23
22
  res.status(200).send();
24
- return;
25
23
  }
26
- if (resource.type === 'file') {
24
+ else {
27
25
  const allowedMethods = 'DELETE, GET, HEAD, MOVE, OPTIONS, PROPFIND, PUT';
28
26
  logger_utils_1.webdavLogger.info(`[OPTIONS] Returning Allowed Options: ${allowedMethods}`);
29
27
  res.header('Allow', allowedMethods);
30
28
  res.header('DAV', '1, 2, ordered-collections');
31
29
  res.status(200).send();
32
- return;
33
30
  }
34
31
  };
35
32
  }
@@ -20,27 +20,12 @@ class PROPFINDRequestHandler {
20
20
  const { driveFolderService, driveFileService } = this.dependencies;
21
21
  const resource = await webdav_utils_1.WebDavUtils.getRequestedResource(req);
22
22
  logger_utils_1.webdavLogger.info(`[PROPFIND] Request received for ${resource.type} at ${resource.url}`);
23
- try {
24
- const driveItem = await webdav_utils_1.WebDavUtils.getAndSearchItemFromResource({
25
- resource,
26
- driveFolderService,
27
- driveFileService,
28
- });
29
- switch (resource.type) {
30
- case 'file': {
31
- const fileMetaXML = await this.getFileMetaXML(resource, driveItem);
32
- res.status(207).send(fileMetaXML);
33
- break;
34
- }
35
- case 'folder': {
36
- const depth = req.header('depth') ?? '1';
37
- const folderMetaXML = await this.getFolderContentXML(resource, driveItem, depth);
38
- res.status(207).send(folderMetaXML);
39
- break;
40
- }
41
- }
42
- }
43
- catch {
23
+ const driveItem = await webdav_utils_1.WebDavUtils.getDriveItemFromResource({
24
+ resource,
25
+ driveFolderService,
26
+ driveFileService,
27
+ });
28
+ if (!driveItem) {
44
29
  res.status(207).send(xml_utils_1.XMLUtils.toWebDavXML({
45
30
  [xml_utils_1.XMLUtils.addDefaultNamespace('response')]: {
46
31
  [xml_utils_1.XMLUtils.addDefaultNamespace('href')]: xml_utils_1.XMLUtils.encodeWebDavUri(resource.url),
@@ -53,6 +38,20 @@ class PROPFINDRequestHandler {
53
38
  ignoreAttributes: false,
54
39
  suppressEmptyNode: true,
55
40
  }));
41
+ return;
42
+ }
43
+ switch (resource.type) {
44
+ case 'file': {
45
+ const fileMetaXML = await this.getFileMetaXML(resource, driveItem);
46
+ res.status(207).send(fileMetaXML);
47
+ break;
48
+ }
49
+ case 'folder': {
50
+ const depth = req.header('depth') ?? '1';
51
+ const folderMetaXML = await this.getFolderContentXML(resource, driveItem, depth);
52
+ res.status(207).send(folderMetaXML);
53
+ break;
54
+ }
56
55
  }
57
56
  };
58
57
  getFileMetaXML = async (resource, driveFileItem) => {
@@ -27,12 +27,16 @@ class PUTRequestHandler {
27
27
  logger_utils_1.webdavLogger.info(`[PUT] Request received for ${resource.type} at ${resource.url}`);
28
28
  logger_utils_1.webdavLogger.info(`[PUT] Uploading '${resource.name}' to '${resource.parentPath}'`);
29
29
  const parentResource = await webdav_utils_1.WebDavUtils.getRequestedResource(resource.parentPath, false);
30
- const parentFolderItem = (await webdav_utils_1.WebDavUtils.getAndSearchItemFromResource({
30
+ const parentDriveFolderItem = await webdav_utils_1.WebDavUtils.getDriveItemFromResource({
31
31
  resource: parentResource,
32
32
  driveFolderService,
33
- }));
33
+ });
34
+ if (!parentDriveFolderItem) {
35
+ throw new errors_utils_1.ConflictError(`Parent folders not found on Internxt Drive at ${resource.url}`);
36
+ }
37
+ const parentFolderItem = parentDriveFolderItem;
34
38
  try {
35
- const driveFileItem = (await webdav_utils_1.WebDavUtils.getAndSearchItemFromResource({
39
+ const driveFileItem = (await webdav_utils_1.WebDavUtils.getDriveItemFromResource({
36
40
  resource: resource,
37
41
  driveFileService,
38
42
  }));
@@ -93,7 +97,7 @@ class PUTRequestHandler {
93
97
  if (isThumbnailable && bufferStream) {
94
98
  const thumbnailBuffer = bufferStream.getBuffer();
95
99
  if (thumbnailBuffer) {
96
- await thumbnail_service_1.ThumbnailService.instance.uploadThumbnail(thumbnailBuffer, fileType, user.bucket, file.id, networkFacade);
100
+ await thumbnail_service_1.ThumbnailService.instance.uploadThumbnail(thumbnailBuffer, fileType, user.bucket, file.uuid, networkFacade);
97
101
  }
98
102
  }
99
103
  }
@@ -15,7 +15,7 @@ const crypto_service_1 = require("../services/crypto.service");
15
15
  const trash_service_1 = require("../services/drive/trash.service");
16
16
  const logger_utils_1 = require("../utils/logger.utils");
17
17
  const sdk_manager_service_1 = require("../services/sdk-manager.service");
18
- dotenv_1.default.config();
18
+ dotenv_1.default.config({ quiet: true });
19
19
  const init = async () => {
20
20
  await config_service_1.ConfigService.instance.ensureInternxtCliDataDirExists();
21
21
  await config_service_1.ConfigService.instance.ensureWebdavCertsDirExists();
@@ -1266,5 +1266,5 @@
1266
1266
  ]
1267
1267
  }
1268
1268
  },
1269
- "version": "1.5.3"
1269
+ "version": "1.5.4"
1270
1270
  }
package/package.json CHANGED
@@ -1,10 +1,10 @@
1
1
  {
2
2
  "author": "Internxt <hello@internxt.com>",
3
- "version": "1.5.3",
3
+ "version": "1.5.4",
4
4
  "description": "Internxt CLI to manage your encrypted storage",
5
5
  "scripts": {
6
6
  "build": "yarn clean && tsc",
7
- "clean": "rimraf dist tsconfig.tsbuildinfo oclif.manifest.json",
7
+ "clean": "rimraf dist coverage tsconfig.tsbuildinfo oclif.manifest.json",
8
8
  "lint": "eslint .",
9
9
  "pretty": "prettier --write **/*.{js,jsx,tsx,ts}",
10
10
  "postpack": "rimraf oclif.manifest.json",
@@ -17,13 +17,14 @@
17
17
  "dev:webdav": "nodemon -e ts --exec ts-node src/webdav/index.ts",
18
18
  "pack:win": "oclif pack win",
19
19
  "publish:npm": "npm run build && npm publish --scope=@internxt --registry=https://registry.npmjs.org/ --access public",
20
- "publish:github": "npm run build && npm publish --scope=@internxt --registry=https://npm.pkg.github.com",
20
+ "publish:github": "npm run build && npm publish --scope=@internxt --registry=https://npm.pkg.github.com --tag latest",
21
21
  "postinstall": "node ./scripts/restart-webdav.js"
22
22
  },
23
23
  "homepage": "https://github.com/internxt/cli",
24
24
  "license": "MIT",
25
25
  "main": "",
26
26
  "name": "@internxt/cli",
27
+ "clientName": "internxt-cli",
27
28
  "repository": "https://github.com/internxt/cli",
28
29
  "bugs": "https://github.com/internxt/cli",
29
30
  "types": "dist/index.d.ts",
@@ -35,61 +36,61 @@
35
36
  "/oclif.manifest.json"
36
37
  ],
37
38
  "dependencies": {
38
- "@inquirer/prompts": "7.5.0",
39
- "@internxt/inxt-js": "2.1.0",
40
- "@internxt/lib": "1.2.1",
41
- "@internxt/sdk": "1.7.0",
42
- "@oclif/core": "4.3.0",
43
- "@types/validator": "13.15.0",
39
+ "@inquirer/prompts": "7.6.0",
40
+ "@internxt/inxt-js": "2.2.2",
41
+ "@internxt/lib": "1.3.1",
42
+ "@internxt/sdk": "1.10.5",
43
+ "@oclif/core": "4.4.1",
44
+ "@types/validator": "13.15.2",
44
45
  "async": "3.2.6",
45
- "axios": "1.9.0",
46
+ "axios": "1.10.0",
46
47
  "bip39": "3.1.0",
47
48
  "body-parser": "2.2.0",
48
49
  "cli-progress": "3.12.0",
49
50
  "dayjs": "1.11.13",
50
- "dotenv": "16.5.0",
51
+ "dotenv": "17.0.1",
51
52
  "express": "5.1.0",
52
53
  "express-async-handler": "1.2.0",
53
54
  "express-basic-auth": "1.2.1",
54
- "fast-xml-parser": "5.2.2",
55
+ "fast-xml-parser": "5.2.5",
55
56
  "mime-types": "3.0.1",
56
- "openpgp": "5.11.2",
57
- "pm2": "6.0.5",
57
+ "openpgp": "5.11.3",
58
+ "pm2": "6.0.8",
58
59
  "range-parser": "1.2.1",
59
60
  "reflect-metadata": "0.2.2",
60
61
  "selfsigned": "2.4.1",
61
- "sharp": "0.34.1",
62
+ "sharp": "0.34.2",
62
63
  "tty-table": "4.2.3",
63
64
  "winston": "3.17.0"
64
65
  },
65
66
  "devDependencies": {
66
67
  "@internxt/eslint-config-internxt": "2.0.0",
67
68
  "@internxt/prettier-config": "internxt/prettier-config#v1.0.2",
68
- "@oclif/test": "4.1.12",
69
+ "@oclif/test": "4.1.13",
69
70
  "@openpgp/web-stream-tools": "0.0.11-patch-1",
70
71
  "@types/async": "3.2.24",
71
72
  "@types/cli-progress": "3.11.6",
72
- "@types/express": "5.0.1",
73
- "@types/mime-types": "2.1.4",
74
- "@types/node": "22.15.16",
73
+ "@types/express": "5.0.3",
74
+ "@types/mime-types": "3.0.1",
75
+ "@types/node": "22.16.0",
75
76
  "@types/range-parser": "1.2.7",
76
- "@vitest/coverage-istanbul": "3.1.3",
77
- "@vitest/spy": "3.1.3",
78
- "eslint": "9.26.0",
77
+ "@vitest/coverage-istanbul": "3.2.4",
78
+ "@vitest/spy": "3.2.4",
79
+ "eslint": "9.30.1",
79
80
  "husky": "9.1.7",
80
- "lint-staged": "15.5.2",
81
- "nock": "14.0.4",
81
+ "lint-staged": "16.1.2",
82
+ "nock": "14.0.5",
82
83
  "nodemon": "3.1.10",
83
- "oclif": "4.17.46",
84
- "prettier": "3.5.3",
84
+ "oclif": "4.20.1",
85
+ "prettier": "3.6.2",
85
86
  "rimraf": "6.0.1",
86
87
  "ts-node": "10.9.2",
87
88
  "typescript": "5.8.3",
88
- "vitest": "3.1.3",
89
+ "vitest": "3.2.4",
89
90
  "vitest-mock-express": "2.2.0"
90
91
  },
91
92
  "engines": {
92
- "node": ">=20.12.1"
93
+ "node": ">=22.12.0"
93
94
  },
94
95
  "bin": {
95
96
  "internxt": "./bin/run.js"
@@ -5,8 +5,9 @@ async function runCommand() {
5
5
  exec('node ./bin/run.js webdav restart', (error, stdout, stderr) => {
6
6
  if (error) {
7
7
  reject(error);
8
+ } else {
9
+ resolve(stdout ?? stderr);
8
10
  }
9
- resolve(stdout || stderr);
10
11
  });
11
12
  });
12
13
  }