@internxt/cli 1.4.2 → 1.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (48) hide show
  1. package/README.md +25 -25
  2. package/dist/commands/download-file.js +13 -5
  3. package/dist/commands/upload-file.js +51 -17
  4. package/dist/commands/webdav.js +4 -0
  5. package/dist/services/crypto.service.d.ts +1 -3
  6. package/dist/services/crypto.service.js +17 -7
  7. package/dist/services/drive/drive-file.service.d.ts +1 -0
  8. package/dist/services/drive/drive-file.service.js +4 -0
  9. package/dist/services/network/download.service.d.ts +3 -1
  10. package/dist/services/network/download.service.js +5 -3
  11. package/dist/services/network/network-facade.service.d.ts +8 -9
  12. package/dist/services/network/network-facade.service.js +39 -50
  13. package/dist/services/thumbnail.service.d.ts +7 -0
  14. package/dist/services/thumbnail.service.js +55 -0
  15. package/dist/types/network.types.d.ts +11 -2
  16. package/dist/utils/errors.utils.d.ts +4 -0
  17. package/dist/utils/errors.utils.js +10 -1
  18. package/dist/utils/logger.utils.js +16 -2
  19. package/dist/utils/network.utils.d.ts +11 -0
  20. package/dist/utils/network.utils.js +36 -0
  21. package/dist/utils/stream.utils.d.ts +8 -10
  22. package/dist/utils/stream.utils.js +18 -17
  23. package/dist/utils/thumbnail.utils.d.ts +9 -0
  24. package/dist/utils/thumbnail.utils.js +44 -0
  25. package/dist/webdav/handlers/DELETE.handler.js +4 -3
  26. package/dist/webdav/handlers/GET.handler.d.ts +0 -2
  27. package/dist/webdav/handlers/GET.handler.js +21 -19
  28. package/dist/webdav/handlers/HEAD.handler.d.ts +9 -2
  29. package/dist/webdav/handlers/HEAD.handler.js +34 -2
  30. package/dist/webdav/handlers/MKCOL.handler.js +3 -3
  31. package/dist/webdav/handlers/MOVE.handler.js +2 -2
  32. package/dist/webdav/handlers/OPTIONS.handler.d.ts +1 -1
  33. package/dist/webdav/handlers/OPTIONS.handler.js +29 -4
  34. package/dist/webdav/handlers/PROPFIND.handler.js +1 -1
  35. package/dist/webdav/handlers/PUT.handler.js +55 -15
  36. package/dist/webdav/index.js +10 -2
  37. package/dist/webdav/middewares/auth.middleware.d.ts +2 -2
  38. package/dist/webdav/middewares/auth.middleware.js +8 -8
  39. package/dist/webdav/webdav-server.d.ts +1 -3
  40. package/dist/webdav/webdav-server.js +20 -8
  41. package/oclif.manifest.json +1 -1
  42. package/package.json +16 -13
  43. package/scripts/restart-webdav.js +16 -0
  44. package/dist/services/network/upload.service.d.ts +0 -8
  45. package/dist/services/network/upload.service.js +0 -24
  46. package/dist/utils/hash.utils.d.ts +0 -12
  47. package/dist/utils/hash.utils.js +0 -37
  48. package/scripts/skip-in-ci.js +0 -5
package/README.md CHANGED
@@ -31,7 +31,7 @@ $ npm install -g @internxt/cli
31
31
  $ internxt COMMAND
32
32
  running command...
33
33
  $ internxt (--version)
34
- @internxt/cli/1.4.2 linux-x64 node-v20.18.1
34
+ @internxt/cli/1.5.0 linux-x64 node-v20.18.1
35
35
  $ internxt --help [COMMAND]
36
36
  USAGE
37
37
  $ internxt COMMAND
@@ -99,7 +99,7 @@ EXAMPLES
99
99
  $ internxt add-cert
100
100
  ```
101
101
 
102
- _See code: [src/commands/add-cert.ts](https://github.com/internxt/cli/blob/v1.4.2/src/commands/add-cert.ts)_
102
+ _See code: [src/commands/add-cert.ts](https://github.com/internxt/cli/blob/v1.5.0/src/commands/add-cert.ts)_
103
103
 
104
104
  ## `internxt config`
105
105
 
@@ -119,7 +119,7 @@ EXAMPLES
119
119
  $ internxt config
120
120
  ```
121
121
 
122
- _See code: [src/commands/config.ts](https://github.com/internxt/cli/blob/v1.4.2/src/commands/config.ts)_
122
+ _See code: [src/commands/config.ts](https://github.com/internxt/cli/blob/v1.5.0/src/commands/config.ts)_
123
123
 
124
124
  ## `internxt create-folder`
125
125
 
@@ -148,7 +148,7 @@ EXAMPLES
148
148
  $ internxt create-folder
149
149
  ```
150
150
 
151
- _See code: [src/commands/create-folder.ts](https://github.com/internxt/cli/blob/v1.4.2/src/commands/create-folder.ts)_
151
+ _See code: [src/commands/create-folder.ts](https://github.com/internxt/cli/blob/v1.5.0/src/commands/create-folder.ts)_
152
152
 
153
153
  ## `internxt delete-permanently-file`
154
154
 
@@ -178,7 +178,7 @@ EXAMPLES
178
178
  $ internxt delete-permanently-file
179
179
  ```
180
180
 
181
- _See code: [src/commands/delete-permanently-file.ts](https://github.com/internxt/cli/blob/v1.4.2/src/commands/delete-permanently-file.ts)_
181
+ _See code: [src/commands/delete-permanently-file.ts](https://github.com/internxt/cli/blob/v1.5.0/src/commands/delete-permanently-file.ts)_
182
182
 
183
183
  ## `internxt delete-permanently-folder`
184
184
 
@@ -208,7 +208,7 @@ EXAMPLES
208
208
  $ internxt delete-permanently-folder
209
209
  ```
210
210
 
211
- _See code: [src/commands/delete-permanently-folder.ts](https://github.com/internxt/cli/blob/v1.4.2/src/commands/delete-permanently-folder.ts)_
211
+ _See code: [src/commands/delete-permanently-folder.ts](https://github.com/internxt/cli/blob/v1.5.0/src/commands/delete-permanently-folder.ts)_
212
212
 
213
213
  ## `internxt delete permanently file`
214
214
 
@@ -297,7 +297,7 @@ EXAMPLES
297
297
  $ internxt download-file
298
298
  ```
299
299
 
300
- _See code: [src/commands/download-file.ts](https://github.com/internxt/cli/blob/v1.4.2/src/commands/download-file.ts)_
300
+ _See code: [src/commands/download-file.ts](https://github.com/internxt/cli/blob/v1.5.0/src/commands/download-file.ts)_
301
301
 
302
302
  ## `internxt download file`
303
303
 
@@ -356,7 +356,7 @@ EXAMPLES
356
356
  $ internxt list
357
357
  ```
358
358
 
359
- _See code: [src/commands/list.ts](https://github.com/internxt/cli/blob/v1.4.2/src/commands/list.ts)_
359
+ _See code: [src/commands/list.ts](https://github.com/internxt/cli/blob/v1.5.0/src/commands/list.ts)_
360
360
 
361
361
  ## `internxt login`
362
362
 
@@ -385,7 +385,7 @@ EXAMPLES
385
385
  $ internxt login
386
386
  ```
387
387
 
388
- _See code: [src/commands/login.ts](https://github.com/internxt/cli/blob/v1.4.2/src/commands/login.ts)_
388
+ _See code: [src/commands/login.ts](https://github.com/internxt/cli/blob/v1.5.0/src/commands/login.ts)_
389
389
 
390
390
  ## `internxt logout`
391
391
 
@@ -405,7 +405,7 @@ EXAMPLES
405
405
  $ internxt logout
406
406
  ```
407
407
 
408
- _See code: [src/commands/logout.ts](https://github.com/internxt/cli/blob/v1.4.2/src/commands/logout.ts)_
408
+ _See code: [src/commands/logout.ts](https://github.com/internxt/cli/blob/v1.5.0/src/commands/logout.ts)_
409
409
 
410
410
  ## `internxt logs`
411
411
 
@@ -425,7 +425,7 @@ EXAMPLES
425
425
  $ internxt logs
426
426
  ```
427
427
 
428
- _See code: [src/commands/logs.ts](https://github.com/internxt/cli/blob/v1.4.2/src/commands/logs.ts)_
428
+ _See code: [src/commands/logs.ts](https://github.com/internxt/cli/blob/v1.5.0/src/commands/logs.ts)_
429
429
 
430
430
  ## `internxt move-file`
431
431
 
@@ -457,7 +457,7 @@ EXAMPLES
457
457
  $ internxt move-file
458
458
  ```
459
459
 
460
- _See code: [src/commands/move-file.ts](https://github.com/internxt/cli/blob/v1.4.2/src/commands/move-file.ts)_
460
+ _See code: [src/commands/move-file.ts](https://github.com/internxt/cli/blob/v1.5.0/src/commands/move-file.ts)_
461
461
 
462
462
  ## `internxt move-folder`
463
463
 
@@ -489,7 +489,7 @@ EXAMPLES
489
489
  $ internxt move-folder
490
490
  ```
491
491
 
492
- _See code: [src/commands/move-folder.ts](https://github.com/internxt/cli/blob/v1.4.2/src/commands/move-folder.ts)_
492
+ _See code: [src/commands/move-folder.ts](https://github.com/internxt/cli/blob/v1.5.0/src/commands/move-folder.ts)_
493
493
 
494
494
  ## `internxt move file`
495
495
 
@@ -580,7 +580,7 @@ EXAMPLES
580
580
  $ internxt rename-file
581
581
  ```
582
582
 
583
- _See code: [src/commands/rename-file.ts](https://github.com/internxt/cli/blob/v1.4.2/src/commands/rename-file.ts)_
583
+ _See code: [src/commands/rename-file.ts](https://github.com/internxt/cli/blob/v1.5.0/src/commands/rename-file.ts)_
584
584
 
585
585
  ## `internxt rename-folder`
586
586
 
@@ -611,7 +611,7 @@ EXAMPLES
611
611
  $ internxt rename-folder
612
612
  ```
613
613
 
614
- _See code: [src/commands/rename-folder.ts](https://github.com/internxt/cli/blob/v1.4.2/src/commands/rename-folder.ts)_
614
+ _See code: [src/commands/rename-folder.ts](https://github.com/internxt/cli/blob/v1.5.0/src/commands/rename-folder.ts)_
615
615
 
616
616
  ## `internxt rename file`
617
617
 
@@ -699,7 +699,7 @@ EXAMPLES
699
699
  $ internxt trash-clear
700
700
  ```
701
701
 
702
- _See code: [src/commands/trash-clear.ts](https://github.com/internxt/cli/blob/v1.4.2/src/commands/trash-clear.ts)_
702
+ _See code: [src/commands/trash-clear.ts](https://github.com/internxt/cli/blob/v1.5.0/src/commands/trash-clear.ts)_
703
703
 
704
704
  ## `internxt trash-file`
705
705
 
@@ -729,7 +729,7 @@ EXAMPLES
729
729
  $ internxt trash-file
730
730
  ```
731
731
 
732
- _See code: [src/commands/trash-file.ts](https://github.com/internxt/cli/blob/v1.4.2/src/commands/trash-file.ts)_
732
+ _See code: [src/commands/trash-file.ts](https://github.com/internxt/cli/blob/v1.5.0/src/commands/trash-file.ts)_
733
733
 
734
734
  ## `internxt trash-folder`
735
735
 
@@ -759,7 +759,7 @@ EXAMPLES
759
759
  $ internxt trash-folder
760
760
  ```
761
761
 
762
- _See code: [src/commands/trash-folder.ts](https://github.com/internxt/cli/blob/v1.4.2/src/commands/trash-folder.ts)_
762
+ _See code: [src/commands/trash-folder.ts](https://github.com/internxt/cli/blob/v1.5.0/src/commands/trash-folder.ts)_
763
763
 
764
764
  ## `internxt trash-list`
765
765
 
@@ -785,7 +785,7 @@ EXAMPLES
785
785
  $ internxt trash-list
786
786
  ```
787
787
 
788
- _See code: [src/commands/trash-list.ts](https://github.com/internxt/cli/blob/v1.4.2/src/commands/trash-list.ts)_
788
+ _See code: [src/commands/trash-list.ts](https://github.com/internxt/cli/blob/v1.5.0/src/commands/trash-list.ts)_
789
789
 
790
790
  ## `internxt trash-restore-file`
791
791
 
@@ -816,7 +816,7 @@ EXAMPLES
816
816
  $ internxt trash-restore-file
817
817
  ```
818
818
 
819
- _See code: [src/commands/trash-restore-file.ts](https://github.com/internxt/cli/blob/v1.4.2/src/commands/trash-restore-file.ts)_
819
+ _See code: [src/commands/trash-restore-file.ts](https://github.com/internxt/cli/blob/v1.5.0/src/commands/trash-restore-file.ts)_
820
820
 
821
821
  ## `internxt trash-restore-folder`
822
822
 
@@ -847,7 +847,7 @@ EXAMPLES
847
847
  $ internxt trash-restore-folder
848
848
  ```
849
849
 
850
- _See code: [src/commands/trash-restore-folder.ts](https://github.com/internxt/cli/blob/v1.4.2/src/commands/trash-restore-folder.ts)_
850
+ _See code: [src/commands/trash-restore-folder.ts](https://github.com/internxt/cli/blob/v1.5.0/src/commands/trash-restore-folder.ts)_
851
851
 
852
852
  ## `internxt trash clear`
853
853
 
@@ -1044,7 +1044,7 @@ EXAMPLES
1044
1044
  $ internxt upload-file
1045
1045
  ```
1046
1046
 
1047
- _See code: [src/commands/upload-file.ts](https://github.com/internxt/cli/blob/v1.4.2/src/commands/upload-file.ts)_
1047
+ _See code: [src/commands/upload-file.ts](https://github.com/internxt/cli/blob/v1.5.0/src/commands/upload-file.ts)_
1048
1048
 
1049
1049
  ## `internxt upload file`
1050
1050
 
@@ -1099,7 +1099,7 @@ EXAMPLES
1099
1099
  $ internxt webdav status
1100
1100
  ```
1101
1101
 
1102
- _See code: [src/commands/webdav.ts](https://github.com/internxt/cli/blob/v1.4.2/src/commands/webdav.ts)_
1102
+ _See code: [src/commands/webdav.ts](https://github.com/internxt/cli/blob/v1.5.0/src/commands/webdav.ts)_
1103
1103
 
1104
1104
  ## `internxt webdav-config`
1105
1105
 
@@ -1124,7 +1124,7 @@ EXAMPLES
1124
1124
  $ internxt webdav-config
1125
1125
  ```
1126
1126
 
1127
- _See code: [src/commands/webdav-config.ts](https://github.com/internxt/cli/blob/v1.4.2/src/commands/webdav-config.ts)_
1127
+ _See code: [src/commands/webdav-config.ts](https://github.com/internxt/cli/blob/v1.5.0/src/commands/webdav-config.ts)_
1128
1128
 
1129
1129
  ## `internxt whoami`
1130
1130
 
@@ -1144,7 +1144,7 @@ EXAMPLES
1144
1144
  $ internxt whoami
1145
1145
  ```
1146
1146
 
1147
- _See code: [src/commands/whoami.ts](https://github.com/internxt/cli/blob/v1.4.2/src/commands/whoami.ts)_
1147
+ _See code: [src/commands/whoami.ts](https://github.com/internxt/cli/blob/v1.5.0/src/commands/whoami.ts)_
1148
1148
  <!-- commandsstop -->
1149
1149
 
1150
1150
  # Current Limitations
@@ -10,7 +10,6 @@ const network_facade_service_1 = require("../services/network/network-facade.ser
10
10
  const auth_service_1 = require("../services/auth.service");
11
11
  const crypto_service_1 = require("../services/crypto.service");
12
12
  const download_service_1 = require("../services/network/download.service");
13
- const upload_service_1 = require("../services/network/upload.service");
14
13
  const sdk_manager_service_1 = require("../services/sdk-manager.service");
15
14
  const node_fs_1 = require("node:fs");
16
15
  const promises_1 = __importDefault(require("node:fs/promises"));
@@ -19,6 +18,8 @@ const stream_utils_1 = require("../utils/stream.utils");
19
18
  const errors_utils_1 = require("../utils/errors.utils");
20
19
  const command_types_1 = require("../types/command.types");
21
20
  const validation_service_1 = require("../services/validation.service");
21
+ const inxt_js_1 = require("@internxt/inxt-js");
22
+ const config_service_1 = require("../services/config.service");
22
23
  class DownloadFile extends core_1.Command {
23
24
  static args = {};
24
25
  static description = 'Download and decrypts a file from Internxt Drive to a directory. The file name will be the same as the file name in your Drive.';
@@ -63,10 +64,10 @@ class DownloadFile extends core_1.Command {
63
64
  linewrap: true,
64
65
  });
65
66
  progressBar.start(100, 0);
66
- const [executeDownload, abortable] = await networkFacade.downloadToStream(user.bucket, user.mnemonic, driveFile.fileId, stream_utils_1.StreamUtils.writeStreamToWritableStream(fileWriteStream), {
67
+ const [executeDownload, abortable] = await networkFacade.downloadToStream(user.bucket, user.mnemonic, driveFile.fileId, driveFile.size, stream_utils_1.StreamUtils.writeStreamToWritableStream(fileWriteStream), undefined, {
67
68
  abortController: new AbortController(),
68
69
  progressCallback: (progress) => {
69
- progressBar.update(progress);
70
+ progressBar.update(progress * 0.99);
70
71
  },
71
72
  });
72
73
  process.on('SIGINT', () => {
@@ -128,9 +129,10 @@ class DownloadFile extends core_1.Command {
128
129
  return driveFile;
129
130
  };
130
131
  getDownloadPath = async (downloadDirectory, driveFile, overwrite) => {
132
+ const ext = driveFile.type?.length && driveFile.type.length > 0 ? `.${driveFile.type}` : undefined;
131
133
  const filename = node_path_1.default.format({
132
134
  name: driveFile.name,
133
- ext: `.${driveFile.type}`,
135
+ ext: ext,
134
136
  });
135
137
  const downloadPath = node_path_1.default.join(downloadDirectory, filename);
136
138
  await promises_1.default.access(downloadDirectory, promises_1.default.constants.W_OK);
@@ -153,7 +155,13 @@ class DownloadFile extends core_1.Command {
153
155
  user: user.bridgeUser,
154
156
  pass: user.userId,
155
157
  });
156
- const networkFacade = new network_facade_service_1.NetworkFacade(networkModule, upload_service_1.UploadService.instance, download_service_1.DownloadService.instance, crypto_service_1.CryptoService.instance);
158
+ const environment = new inxt_js_1.Environment({
159
+ bridgeUser: user.bridgeUser,
160
+ bridgePass: user.userId,
161
+ bridgeUrl: config_service_1.ConfigService.instance.get('NETWORK_URL'),
162
+ encryptionKey: user.mnemonic,
163
+ });
164
+ const networkFacade = new network_facade_service_1.NetworkFacade(networkModule, environment, download_service_1.DownloadService.instance, crypto_service_1.CryptoService.instance);
157
165
  cli_utils_1.CLIUtils.done();
158
166
  return networkFacade;
159
167
  };
@@ -13,13 +13,16 @@ const cli_utils_1 = require("../utils/cli.utils");
13
13
  const config_service_1 = require("../services/config.service");
14
14
  const node_path_1 = __importDefault(require("node:path"));
15
15
  const drive_file_service_1 = require("../services/drive/drive-file.service");
16
- const upload_service_1 = require("../services/network/upload.service");
17
16
  const crypto_service_1 = require("../services/crypto.service");
18
17
  const download_service_1 = require("../services/network/download.service");
19
18
  const errors_utils_1 = require("../utils/errors.utils");
20
19
  const command_types_1 = require("../types/command.types");
21
20
  const validation_service_1 = require("../services/validation.service");
22
21
  const types_1 = require("@internxt/sdk/dist/drive/storage/types");
22
+ const thumbnail_service_1 = require("../services/thumbnail.service");
23
+ const stream_utils_1 = require("../utils/stream.utils");
24
+ const thumbnail_utils_1 = require("../utils/thumbnail.utils");
25
+ const inxt_js_1 = require("@internxt/inxt-js");
23
26
  class UploadFile extends core_1.Command {
24
27
  static args = {};
25
28
  static description = 'Upload a file to Internxt Drive';
@@ -51,6 +54,8 @@ class UploadFile extends core_1.Command {
51
54
  if (!stats.size) {
52
55
  throw new Error('The file is empty. Uploading empty files is not allowed.');
53
56
  }
57
+ const fileInfo = node_path_1.default.parse(filePath);
58
+ const fileType = fileInfo.ext.replaceAll('.', '');
54
59
  let destinationFolderUuid = await this.getDestinationFolderUuid(flags['destination'], nonInteractive);
55
60
  if (destinationFolderUuid.trim().length === 0) {
56
61
  destinationFolderUuid = userCredentials.user.rootFolderId;
@@ -61,37 +66,66 @@ class UploadFile extends core_1.Command {
61
66
  user: user.bridgeUser,
62
67
  pass: user.userId,
63
68
  });
64
- const networkFacade = new network_facade_service_1.NetworkFacade(networkModule, upload_service_1.UploadService.instance, download_service_1.DownloadService.instance, crypto_service_1.CryptoService.instance);
69
+ const environment = new inxt_js_1.Environment({
70
+ bridgeUser: user.bridgeUser,
71
+ bridgePass: user.userId,
72
+ bridgeUrl: config_service_1.ConfigService.instance.get('NETWORK_URL'),
73
+ encryptionKey: user.mnemonic,
74
+ });
75
+ const networkFacade = new network_facade_service_1.NetworkFacade(networkModule, environment, download_service_1.DownloadService.instance, crypto_service_1.CryptoService.instance);
65
76
  cli_utils_1.CLIUtils.done();
77
+ const readStream = (0, node_fs_1.createReadStream)(filePath);
66
78
  const timer = cli_utils_1.CLIUtils.timer();
67
- const fileStream = (0, node_fs_1.createReadStream)(filePath);
68
79
  const progressBar = cli_utils_1.CLIUtils.progress({
69
80
  format: 'Uploading file [{bar}] {percentage}%',
70
81
  linewrap: true,
71
82
  });
72
- progressBar.start(1, 0);
73
- const [uploadPromise, abortable] = await networkFacade.uploadFromStream(user.bucket, user.mnemonic, stats.size, fileStream, {
74
- progressCallback: (progress) => {
75
- progressBar.update(progress);
76
- },
77
- });
78
- process.on('SIGINT', () => {
79
- abortable.abort('SIGINT received');
80
- process.exit(1);
83
+ progressBar.start(100, 0);
84
+ let bufferStream;
85
+ let fileStream = readStream;
86
+ const isThumbnailable = (0, thumbnail_utils_1.isFileThumbnailable)(fileType);
87
+ if (isThumbnailable) {
88
+ bufferStream = new stream_utils_1.BufferStream();
89
+ fileStream = readStream.pipe(bufferStream);
90
+ }
91
+ const progressCallback = (progress) => {
92
+ progressBar.update(progress * 100 * 0.99);
93
+ };
94
+ const fileId = await new Promise((resolve, reject) => {
95
+ const state = networkFacade.uploadFile(fileStream, stats.size, user.bucket, (err, res) => {
96
+ if (err) {
97
+ return reject(err);
98
+ }
99
+ resolve(res);
100
+ }, progressCallback);
101
+ process.on('SIGINT', () => {
102
+ state.stop();
103
+ process.exit(1);
104
+ });
81
105
  });
82
- const uploadResult = await uploadPromise;
83
- progressBar.stop();
84
- const fileInfo = node_path_1.default.parse(filePath);
85
106
  const createdDriveFile = await drive_file_service_1.DriveFileService.instance.createFile({
86
107
  plain_name: fileInfo.name,
87
- type: fileInfo.ext.replaceAll('.', ''),
108
+ type: fileType,
88
109
  size: stats.size,
89
110
  folder_id: destinationFolderUuid,
90
- id: uploadResult.fileId,
111
+ id: fileId,
91
112
  bucket: user.bucket,
92
113
  encrypt_version: types_1.EncryptionVersion.Aes03,
93
114
  name: '',
94
115
  });
116
+ try {
117
+ if (isThumbnailable && bufferStream) {
118
+ const thumbnailBuffer = bufferStream.getBuffer();
119
+ if (thumbnailBuffer) {
120
+ await thumbnail_service_1.ThumbnailService.instance.uploadThumbnail(thumbnailBuffer, fileType, user.bucket, createdDriveFile.id, networkFacade);
121
+ }
122
+ }
123
+ }
124
+ catch (error) {
125
+ errors_utils_1.ErrorUtils.report(this.error.bind(this), error, { command: this.id });
126
+ }
127
+ progressBar.update(100);
128
+ progressBar.stop();
95
129
  const uploadTime = timer.stop();
96
130
  this.log('\n');
97
131
  const message = `File uploaded in ${uploadTime}ms, view it at ${config_service_1.ConfigService.instance.get('DRIVE_URL')}/file/${createdDriveFile.uuid}`;
@@ -6,6 +6,7 @@ const cli_utils_1 = require("../utils/cli.utils");
6
6
  const config_service_1 = require("../services/config.service");
7
7
  const drive_database_manager_service_1 = require("../services/database/drive-database-manager.service");
8
8
  const errors_utils_1 = require("../utils/errors.utils");
9
+ const auth_service_1 = require("../services/auth.service");
9
10
  class Webdav extends core_1.Command {
10
11
  static args = {
11
12
  action: core_1.Args.string({
@@ -30,6 +31,7 @@ class Webdav extends core_1.Command {
30
31
  await pm2_utils_1.PM2Utils.connect();
31
32
  switch (args.action) {
32
33
  case 'enable': {
34
+ await auth_service_1.AuthService.instance.getAuthDetails();
33
35
  message = await this.enableWebDav();
34
36
  break;
35
37
  }
@@ -38,10 +40,12 @@ class Webdav extends core_1.Command {
38
40
  break;
39
41
  }
40
42
  case 'restart': {
43
+ await auth_service_1.AuthService.instance.getAuthDetails();
41
44
  message = await this.restartWebDav();
42
45
  break;
43
46
  }
44
47
  case 'status': {
48
+ await auth_service_1.AuthService.instance.getAuthDetails();
45
49
  message = await this.webDAVStatus();
46
50
  break;
47
51
  }
@@ -1,5 +1,4 @@
1
1
  import { CryptoProvider } from '@internxt/sdk';
2
- import { Transform } from 'node:stream';
3
2
  export declare class CryptoService {
4
3
  static readonly instance: CryptoService;
5
4
  static readonly cryptoProvider: CryptoProvider;
@@ -14,7 +13,6 @@ export declare class CryptoService {
14
13
  decryptText: (encryptedText: string) => string;
15
14
  encryptTextWithKey: (textToEncrypt: string, secret: string) => string;
16
15
  decryptTextWithKey: (encryptedText: string, secret: string) => string;
17
- decryptStream(inputSlices: ReadableStream<Uint8Array>[], key: Buffer, iv: Buffer): Promise<ReadableStream<any>>;
18
- getEncryptionTransform(key: Buffer, iv: Buffer): Promise<Transform>;
16
+ decryptStream: (inputSlices: ReadableStream<Uint8Array>[], key: Buffer, iv: Buffer, startOffsetByte?: number) => ReadableStream<any>;
19
17
  private getKeyAndIvFrom;
20
18
  }
@@ -64,8 +64,22 @@ class CryptoService {
64
64
  const contentsToDecrypt = cypherText.subarray(16);
65
65
  return Buffer.concat([decipher.update(contentsToDecrypt), decipher.final()]).toString('utf8');
66
66
  };
67
- async decryptStream(inputSlices, key, iv) {
68
- const decipher = (0, node_crypto_1.createDecipheriv)('aes-256-ctr', key, iv);
67
+ decryptStream = (inputSlices, key, iv, startOffsetByte) => {
68
+ let decipher;
69
+ if (startOffsetByte) {
70
+ const aesBlockSize = 16;
71
+ const startOffset = startOffsetByte % aesBlockSize;
72
+ const startBlockFirstByte = startOffsetByte - startOffset;
73
+ const startBlockNumber = startBlockFirstByte / aesBlockSize;
74
+ const ivForRange = (BigInt('0x' + iv.toString('hex')) + BigInt(startBlockNumber)).toString(16).padStart(32, '0');
75
+ const newIv = Buffer.from(ivForRange, 'hex');
76
+ const skipBuffer = Buffer.alloc(startOffset, 0);
77
+ decipher = (0, node_crypto_1.createDecipheriv)('aes-256-ctr', key, newIv);
78
+ decipher.update(skipBuffer);
79
+ }
80
+ else {
81
+ decipher = (0, node_crypto_1.createDecipheriv)('aes-256-ctr', key, iv);
82
+ }
69
83
  const encryptedStream = stream_utils_1.StreamUtils.joinReadableBinaryStreams(inputSlices);
70
84
  let keepReading = true;
71
85
  const decryptedStream = new ReadableStream({
@@ -87,11 +101,7 @@ class CryptoService {
87
101
  },
88
102
  });
89
103
  return decryptedStream;
90
- }
91
- async getEncryptionTransform(key, iv) {
92
- const cipher = (0, node_crypto_1.createCipheriv)('aes-256-ctr', key, iv);
93
- return cipher;
94
- }
104
+ };
95
105
  getKeyAndIvFrom = (secret, salt) => {
96
106
  const TRANSFORM_ROUNDS = 3;
97
107
  const password = Buffer.concat([Buffer.from(secret, 'binary'), salt]);
@@ -10,4 +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
14
  }
@@ -43,5 +43,9 @@ class DriveFileService {
43
43
  const fileMetadata = await storageClient.getFileByPath(encodeURIComponent(path));
44
44
  return drive_utils_1.DriveUtils.driveFileMetaToItem(fileMetadata);
45
45
  };
46
+ createThumbnail = (payload) => {
47
+ const storageClient = sdk_manager_service_1.SdkManager.instance.getStorage(false);
48
+ return storageClient.createThumbnailEntry(payload);
49
+ };
46
50
  }
47
51
  exports.DriveFileService = DriveFileService;
@@ -1,7 +1,9 @@
1
+ import { DownloadProgressCallback } from '../../types/network.types';
1
2
  export declare class DownloadService {
2
3
  static readonly instance: DownloadService;
3
4
  downloadFile(url: string, options: {
4
- progressCallback?: (progress: number) => void;
5
+ progressCallback?: DownloadProgressCallback;
5
6
  abortController?: AbortController;
7
+ rangeHeader?: string;
6
8
  }): Promise<ReadableStream<Uint8Array>>;
7
9
  }
@@ -11,11 +11,13 @@ class DownloadService {
11
11
  const response = await axios_1.default.get(url, {
12
12
  responseType: 'stream',
13
13
  onDownloadProgress(progressEvent) {
14
- if (options.progressCallback && progressEvent.total) {
15
- const reportedProgress = progressEvent.loaded / progressEvent.total;
16
- options.progressCallback(reportedProgress);
14
+ if (options.progressCallback && progressEvent.loaded) {
15
+ options.progressCallback(progressEvent.loaded);
17
16
  }
18
17
  },
18
+ headers: {
19
+ range: options.rangeHeader,
20
+ },
19
21
  });
20
22
  const readable = new ReadableStream({
21
23
  start(controller) {
@@ -1,19 +1,18 @@
1
1
  import { Network } from '@internxt/sdk';
2
+ import { Environment } from '@internxt/inxt-js';
2
3
  import { Readable } from 'node:stream';
3
- import { DownloadOptions, UploadOptions } from '../../types/network.types';
4
+ import { DownloadOptions } from '../../types/network.types';
4
5
  import { CryptoService } from '../crypto.service';
5
- import { UploadService } from './upload.service';
6
6
  import { DownloadService } from './download.service';
7
+ import { RangeOptions } from '../../utils/network.utils';
8
+ import { ActionState } from '@internxt/inxt-js/build/api';
7
9
  export declare class NetworkFacade {
8
10
  private readonly network;
9
- private readonly uploadService;
11
+ private readonly environment;
10
12
  private readonly downloadService;
11
13
  private readonly cryptoService;
12
14
  private readonly cryptoLib;
13
- constructor(network: Network.Network, uploadService: UploadService, downloadService: DownloadService, cryptoService: CryptoService);
14
- downloadToStream(bucketId: string, mnemonic: string, fileId: string, to: WritableStream, options?: DownloadOptions): Promise<[Promise<void>, AbortController]>;
15
- uploadFromStream(bucketId: string, mnemonic: string, size: number, from: Readable, options?: UploadOptions): Promise<[Promise<{
16
- fileId: string;
17
- hash: Buffer;
18
- }>, AbortController]>;
15
+ constructor(network: Network.Network, environment: Environment, downloadService: DownloadService, cryptoService: CryptoService);
16
+ downloadToStream(bucketId: string, mnemonic: string, fileId: string, size: number, to: WritableStream, rangeOptions?: RangeOptions, options?: DownloadOptions): Promise<[Promise<void>, AbortController]>;
17
+ uploadFile(from: Readable, size: number, bucketId: string, finishedCallback: (err: Error | null, res: string | null) => void, progressCallback: (progress: number) => void): ActionState;
19
18
  }