@internxt/cli 1.6.3 → 1.6.5

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 (74) hide show
  1. package/README.md +32 -32
  2. package/dist/commands/login-legacy.js +2 -0
  3. package/dist/commands/login.js +2 -0
  4. package/dist/commands/upload-file.js +25 -36
  5. package/dist/services/auth.service.js +10 -1
  6. package/dist/services/cache.service.d.ts +13 -0
  7. package/dist/services/cache.service.js +36 -0
  8. package/dist/services/config.service.js +19 -3
  9. package/dist/services/database/database.service.d.ts +1 -1
  10. package/dist/services/database/database.service.js +6 -5
  11. package/dist/services/database/drive-item/drive-item.attributes.d.ts +7 -0
  12. package/dist/services/database/drive-item/drive-item.domain.d.ts +10 -0
  13. package/dist/services/database/drive-item/drive-item.domain.js +27 -0
  14. package/dist/services/database/drive-item/drive-item.model.d.ts +8 -0
  15. package/dist/services/database/{drive-folder/drive-folder.model.js → drive-item/drive-item.model.js} +11 -23
  16. package/dist/services/database/drive-item/drive-item.repository.d.ts +12 -0
  17. package/dist/services/database/drive-item/drive-item.repository.js +88 -0
  18. package/dist/services/drive/drive-file.service.d.ts +2 -3
  19. package/dist/services/drive/drive-file.service.js +9 -34
  20. package/dist/services/drive/drive-folder.service.d.ts +1 -3
  21. package/dist/services/drive/drive-folder.service.js +9 -87
  22. package/dist/services/drive/drive-item.service.d.ts +8 -0
  23. package/dist/services/drive/drive-item.service.js +98 -0
  24. package/dist/services/network/network-facade.service.d.ts +7 -2
  25. package/dist/services/network/network-facade.service.js +11 -25
  26. package/dist/services/network/upload/upload-file.service.js +7 -8
  27. package/dist/services/thumbnail.service.js +7 -9
  28. package/dist/services/usage.service.d.ts +2 -0
  29. package/dist/services/usage.service.js +18 -0
  30. package/dist/utils/cli.utils.d.ts +3 -2
  31. package/dist/utils/cli.utils.js +22 -18
  32. package/dist/utils/format.utils.js +3 -2
  33. package/dist/utils/upload.utils.d.ts +19 -0
  34. package/dist/utils/upload.utils.js +40 -0
  35. package/dist/utils/webdav.utils.d.ts +4 -1
  36. package/dist/utils/webdav.utils.js +33 -18
  37. package/dist/utils/xml.utils.d.ts +1 -1
  38. package/dist/utils/xml.utils.js +5 -1
  39. package/dist/webdav/handlers/DELETE.handler.js +3 -17
  40. package/dist/webdav/handlers/LOCK.handler.d.ts +5 -0
  41. package/dist/webdav/handlers/LOCK.handler.js +50 -0
  42. package/dist/webdav/handlers/MKCOL.handler.js +15 -3
  43. package/dist/webdav/handlers/MOVE.handler.js +11 -0
  44. package/dist/webdav/handlers/OPTIONS.handler.js +4 -4
  45. package/dist/webdav/handlers/PROPFIND.handler.js +30 -9
  46. package/dist/webdav/handlers/PUT.handler.js +59 -59
  47. package/dist/webdav/handlers/UNLOCK.handler.d.ts +5 -0
  48. package/dist/webdav/handlers/UNLOCK.handler.js +12 -0
  49. package/dist/webdav/middewares/auth.middleware.js +9 -2
  50. package/dist/webdav/middewares/errors.middleware.js +2 -0
  51. package/dist/webdav/middewares/request-logger.middleware.js +10 -6
  52. package/dist/webdav/middewares/webdav-auth.middleware.js +0 -3
  53. package/dist/webdav/webdav-server.js +4 -0
  54. package/oclif.manifest.json +1 -1
  55. package/package.json +47 -46
  56. package/dist/services/database/drive-file/drive-file.attributes.d.ts +0 -14
  57. package/dist/services/database/drive-file/drive-file.domain.d.ts +0 -20
  58. package/dist/services/database/drive-file/drive-file.domain.js +0 -68
  59. package/dist/services/database/drive-file/drive-file.model.d.ts +0 -15
  60. package/dist/services/database/drive-file/drive-file.model.js +0 -67
  61. package/dist/services/database/drive-file/drive-file.repository.d.ts +0 -11
  62. package/dist/services/database/drive-file/drive-file.repository.js +0 -63
  63. package/dist/services/database/drive-folder/drive-folder.attributes.d.ts +0 -10
  64. package/dist/services/database/drive-folder/drive-folder.attributes.js +0 -2
  65. package/dist/services/database/drive-folder/drive-folder.domain.d.ts +0 -16
  66. package/dist/services/database/drive-folder/drive-folder.domain.js +0 -53
  67. package/dist/services/database/drive-folder/drive-folder.model.d.ts +0 -11
  68. package/dist/services/database/drive-folder/drive-folder.repository.d.ts +0 -13
  69. package/dist/services/database/drive-folder/drive-folder.repository.js +0 -99
  70. package/dist/types/fast-xml-parser.types.d.ts +0 -59
  71. package/dist/types/fast-xml-parser.types.js +0 -2
  72. package/dist/utils/database.utils.d.ts +0 -11
  73. package/dist/utils/database.utils.js +0 -26
  74. /package/dist/services/database/{drive-file/drive-file.attributes.js → drive-item/drive-item.attributes.js} +0 -0
package/README.md CHANGED
@@ -52,7 +52,7 @@ $ npm install -g @internxt/cli
52
52
  $ internxt COMMAND
53
53
  running command...
54
54
  $ internxt (--version)
55
- @internxt/cli/1.6.3 linux-x64 node-v22.22.0
55
+ @internxt/cli/1.6.5 linux-x64 node-v22.22.3
56
56
  $ internxt --help [COMMAND]
57
57
  USAGE
58
58
  $ internxt COMMAND
@@ -139,7 +139,7 @@ EXAMPLES
139
139
  $ internxt add-cert
140
140
  ```
141
141
 
142
- _See code: [src/commands/add-cert.ts](https://github.com/internxt/cli/blob/v1.6.3/src/commands/add-cert.ts)_
142
+ _See code: [src/commands/add-cert.ts](https://github.com/internxt/cli/blob/v1.6.5/src/commands/add-cert.ts)_
143
143
 
144
144
  ## `internxt add cert`
145
145
 
@@ -191,7 +191,7 @@ EXAMPLES
191
191
  $ internxt autocomplete --refresh-cache
192
192
  ```
193
193
 
194
- _See code: [@oclif/plugin-autocomplete](https://github.com/oclif/plugin-autocomplete/blob/v3.2.40/src/commands/autocomplete/index.ts)_
194
+ _See code: [@oclif/plugin-autocomplete](https://github.com/oclif/plugin-autocomplete/blob/v3.2.50/src/commands/autocomplete/index.ts)_
195
195
 
196
196
  ## `internxt config`
197
197
 
@@ -220,7 +220,7 @@ EXAMPLES
220
220
  $ internxt config
221
221
  ```
222
222
 
223
- _See code: [src/commands/config.ts](https://github.com/internxt/cli/blob/v1.6.3/src/commands/config.ts)_
223
+ _See code: [src/commands/config.ts](https://github.com/internxt/cli/blob/v1.6.5/src/commands/config.ts)_
224
224
 
225
225
  ## `internxt create-folder`
226
226
 
@@ -254,7 +254,7 @@ EXAMPLES
254
254
  $ internxt create-folder
255
255
  ```
256
256
 
257
- _See code: [src/commands/create-folder.ts](https://github.com/internxt/cli/blob/v1.6.3/src/commands/create-folder.ts)_
257
+ _See code: [src/commands/create-folder.ts](https://github.com/internxt/cli/blob/v1.6.5/src/commands/create-folder.ts)_
258
258
 
259
259
  ## `internxt create folder`
260
260
 
@@ -318,7 +318,7 @@ EXAMPLES
318
318
  $ internxt delete-permanently-file
319
319
  ```
320
320
 
321
- _See code: [src/commands/delete-permanently-file.ts](https://github.com/internxt/cli/blob/v1.6.3/src/commands/delete-permanently-file.ts)_
321
+ _See code: [src/commands/delete-permanently-file.ts](https://github.com/internxt/cli/blob/v1.6.5/src/commands/delete-permanently-file.ts)_
322
322
 
323
323
  ## `internxt delete-permanently-folder`
324
324
 
@@ -350,7 +350,7 @@ EXAMPLES
350
350
  $ internxt delete-permanently-folder
351
351
  ```
352
352
 
353
- _See code: [src/commands/delete-permanently-folder.ts](https://github.com/internxt/cli/blob/v1.6.3/src/commands/delete-permanently-folder.ts)_
353
+ _See code: [src/commands/delete-permanently-folder.ts](https://github.com/internxt/cli/blob/v1.6.5/src/commands/delete-permanently-folder.ts)_
354
354
 
355
355
  ## `internxt delete permanently file`
356
356
 
@@ -445,7 +445,7 @@ EXAMPLES
445
445
  $ internxt download-file
446
446
  ```
447
447
 
448
- _See code: [src/commands/download-file.ts](https://github.com/internxt/cli/blob/v1.6.3/src/commands/download-file.ts)_
448
+ _See code: [src/commands/download-file.ts](https://github.com/internxt/cli/blob/v1.6.5/src/commands/download-file.ts)_
449
449
 
450
450
  ## `internxt download file`
451
451
 
@@ -508,7 +508,7 @@ EXAMPLES
508
508
  $ internxt list
509
509
  ```
510
510
 
511
- _See code: [src/commands/list.ts](https://github.com/internxt/cli/blob/v1.6.3/src/commands/list.ts)_
511
+ _See code: [src/commands/list.ts](https://github.com/internxt/cli/blob/v1.6.5/src/commands/list.ts)_
512
512
 
513
513
  ## `internxt login`
514
514
 
@@ -536,7 +536,7 @@ EXAMPLES
536
536
  $ internxt login
537
537
  ```
538
538
 
539
- _See code: [src/commands/login.ts](https://github.com/internxt/cli/blob/v1.6.3/src/commands/login.ts)_
539
+ _See code: [src/commands/login.ts](https://github.com/internxt/cli/blob/v1.6.5/src/commands/login.ts)_
540
540
 
541
541
  ## `internxt login-legacy`
542
542
 
@@ -570,7 +570,7 @@ EXAMPLES
570
570
  $ internxt login-legacy
571
571
  ```
572
572
 
573
- _See code: [src/commands/login-legacy.ts](https://github.com/internxt/cli/blob/v1.6.3/src/commands/login-legacy.ts)_
573
+ _See code: [src/commands/login-legacy.ts](https://github.com/internxt/cli/blob/v1.6.5/src/commands/login-legacy.ts)_
574
574
 
575
575
  ## `internxt logout`
576
576
 
@@ -590,7 +590,7 @@ EXAMPLES
590
590
  $ internxt logout
591
591
  ```
592
592
 
593
- _See code: [src/commands/logout.ts](https://github.com/internxt/cli/blob/v1.6.3/src/commands/logout.ts)_
593
+ _See code: [src/commands/logout.ts](https://github.com/internxt/cli/blob/v1.6.5/src/commands/logout.ts)_
594
594
 
595
595
  ## `internxt logs`
596
596
 
@@ -610,7 +610,7 @@ EXAMPLES
610
610
  $ internxt logs
611
611
  ```
612
612
 
613
- _See code: [src/commands/logs.ts](https://github.com/internxt/cli/blob/v1.6.3/src/commands/logs.ts)_
613
+ _See code: [src/commands/logs.ts](https://github.com/internxt/cli/blob/v1.6.5/src/commands/logs.ts)_
614
614
 
615
615
  ## `internxt move-file`
616
616
 
@@ -644,7 +644,7 @@ EXAMPLES
644
644
  $ internxt move-file
645
645
  ```
646
646
 
647
- _See code: [src/commands/move-file.ts](https://github.com/internxt/cli/blob/v1.6.3/src/commands/move-file.ts)_
647
+ _See code: [src/commands/move-file.ts](https://github.com/internxt/cli/blob/v1.6.5/src/commands/move-file.ts)_
648
648
 
649
649
  ## `internxt move-folder`
650
650
 
@@ -678,7 +678,7 @@ EXAMPLES
678
678
  $ internxt move-folder
679
679
  ```
680
680
 
681
- _See code: [src/commands/move-folder.ts](https://github.com/internxt/cli/blob/v1.6.3/src/commands/move-folder.ts)_
681
+ _See code: [src/commands/move-folder.ts](https://github.com/internxt/cli/blob/v1.6.5/src/commands/move-folder.ts)_
682
682
 
683
683
  ## `internxt move file`
684
684
 
@@ -775,7 +775,7 @@ EXAMPLES
775
775
  $ internxt rename-file
776
776
  ```
777
777
 
778
- _See code: [src/commands/rename-file.ts](https://github.com/internxt/cli/blob/v1.6.3/src/commands/rename-file.ts)_
778
+ _See code: [src/commands/rename-file.ts](https://github.com/internxt/cli/blob/v1.6.5/src/commands/rename-file.ts)_
779
779
 
780
780
  ## `internxt rename-folder`
781
781
 
@@ -808,7 +808,7 @@ EXAMPLES
808
808
  $ internxt rename-folder
809
809
  ```
810
810
 
811
- _See code: [src/commands/rename-folder.ts](https://github.com/internxt/cli/blob/v1.6.3/src/commands/rename-folder.ts)_
811
+ _See code: [src/commands/rename-folder.ts](https://github.com/internxt/cli/blob/v1.6.5/src/commands/rename-folder.ts)_
812
812
 
813
813
  ## `internxt rename file`
814
814
 
@@ -902,7 +902,7 @@ EXAMPLES
902
902
  $ internxt trash-clear
903
903
  ```
904
904
 
905
- _See code: [src/commands/trash-clear.ts](https://github.com/internxt/cli/blob/v1.6.3/src/commands/trash-clear.ts)_
905
+ _See code: [src/commands/trash-clear.ts](https://github.com/internxt/cli/blob/v1.6.5/src/commands/trash-clear.ts)_
906
906
 
907
907
  ## `internxt trash-file`
908
908
 
@@ -934,7 +934,7 @@ EXAMPLES
934
934
  $ internxt trash-file
935
935
  ```
936
936
 
937
- _See code: [src/commands/trash-file.ts](https://github.com/internxt/cli/blob/v1.6.3/src/commands/trash-file.ts)_
937
+ _See code: [src/commands/trash-file.ts](https://github.com/internxt/cli/blob/v1.6.5/src/commands/trash-file.ts)_
938
938
 
939
939
  ## `internxt trash-folder`
940
940
 
@@ -966,7 +966,7 @@ EXAMPLES
966
966
  $ internxt trash-folder
967
967
  ```
968
968
 
969
- _See code: [src/commands/trash-folder.ts](https://github.com/internxt/cli/blob/v1.6.3/src/commands/trash-folder.ts)_
969
+ _See code: [src/commands/trash-folder.ts](https://github.com/internxt/cli/blob/v1.6.5/src/commands/trash-folder.ts)_
970
970
 
971
971
  ## `internxt trash-list`
972
972
 
@@ -992,7 +992,7 @@ EXAMPLES
992
992
  $ internxt trash-list
993
993
  ```
994
994
 
995
- _See code: [src/commands/trash-list.ts](https://github.com/internxt/cli/blob/v1.6.3/src/commands/trash-list.ts)_
995
+ _See code: [src/commands/trash-list.ts](https://github.com/internxt/cli/blob/v1.6.5/src/commands/trash-list.ts)_
996
996
 
997
997
  ## `internxt trash-restore-file`
998
998
 
@@ -1025,7 +1025,7 @@ EXAMPLES
1025
1025
  $ internxt trash-restore-file
1026
1026
  ```
1027
1027
 
1028
- _See code: [src/commands/trash-restore-file.ts](https://github.com/internxt/cli/blob/v1.6.3/src/commands/trash-restore-file.ts)_
1028
+ _See code: [src/commands/trash-restore-file.ts](https://github.com/internxt/cli/blob/v1.6.5/src/commands/trash-restore-file.ts)_
1029
1029
 
1030
1030
  ## `internxt trash-restore-folder`
1031
1031
 
@@ -1058,7 +1058,7 @@ EXAMPLES
1058
1058
  $ internxt trash-restore-folder
1059
1059
  ```
1060
1060
 
1061
- _See code: [src/commands/trash-restore-folder.ts](https://github.com/internxt/cli/blob/v1.6.3/src/commands/trash-restore-folder.ts)_
1061
+ _See code: [src/commands/trash-restore-folder.ts](https://github.com/internxt/cli/blob/v1.6.5/src/commands/trash-restore-folder.ts)_
1062
1062
 
1063
1063
  ## `internxt trash clear`
1064
1064
 
@@ -1267,7 +1267,7 @@ EXAMPLES
1267
1267
  $ internxt upload-file
1268
1268
  ```
1269
1269
 
1270
- _See code: [src/commands/upload-file.ts](https://github.com/internxt/cli/blob/v1.6.3/src/commands/upload-file.ts)_
1270
+ _See code: [src/commands/upload-file.ts](https://github.com/internxt/cli/blob/v1.6.5/src/commands/upload-file.ts)_
1271
1271
 
1272
1272
  ## `internxt upload-folder`
1273
1273
 
@@ -1300,7 +1300,7 @@ EXAMPLES
1300
1300
  $ internxt upload-folder
1301
1301
  ```
1302
1302
 
1303
- _See code: [src/commands/upload-folder.ts](https://github.com/internxt/cli/blob/v1.6.3/src/commands/upload-folder.ts)_
1303
+ _See code: [src/commands/upload-folder.ts](https://github.com/internxt/cli/blob/v1.6.5/src/commands/upload-folder.ts)_
1304
1304
 
1305
1305
  ## `internxt upload file`
1306
1306
 
@@ -1388,7 +1388,7 @@ EXAMPLES
1388
1388
  $ internxt webdav status
1389
1389
  ```
1390
1390
 
1391
- _See code: [src/commands/webdav.ts](https://github.com/internxt/cli/blob/v1.6.3/src/commands/webdav.ts)_
1391
+ _See code: [src/commands/webdav.ts](https://github.com/internxt/cli/blob/v1.6.5/src/commands/webdav.ts)_
1392
1392
 
1393
1393
  ## `internxt webdav-config`
1394
1394
 
@@ -1427,7 +1427,7 @@ EXAMPLES
1427
1427
  $ internxt webdav-config
1428
1428
  ```
1429
1429
 
1430
- _See code: [src/commands/webdav-config.ts](https://github.com/internxt/cli/blob/v1.6.3/src/commands/webdav-config.ts)_
1430
+ _See code: [src/commands/webdav-config.ts](https://github.com/internxt/cli/blob/v1.6.5/src/commands/webdav-config.ts)_
1431
1431
 
1432
1432
  ## `internxt whoami`
1433
1433
 
@@ -1447,7 +1447,7 @@ EXAMPLES
1447
1447
  $ internxt whoami
1448
1448
  ```
1449
1449
 
1450
- _See code: [src/commands/whoami.ts](https://github.com/internxt/cli/blob/v1.6.3/src/commands/whoami.ts)_
1450
+ _See code: [src/commands/whoami.ts](https://github.com/internxt/cli/blob/v1.6.5/src/commands/whoami.ts)_
1451
1451
 
1452
1452
  ## `internxt workspaces-list`
1453
1453
 
@@ -1479,7 +1479,7 @@ EXAMPLES
1479
1479
  $ internxt workspaces-list
1480
1480
  ```
1481
1481
 
1482
- _See code: [src/commands/workspaces-list.ts](https://github.com/internxt/cli/blob/v1.6.3/src/commands/workspaces-list.ts)_
1482
+ _See code: [src/commands/workspaces-list.ts](https://github.com/internxt/cli/blob/v1.6.5/src/commands/workspaces-list.ts)_
1483
1483
 
1484
1484
  ## `internxt workspaces-unset`
1485
1485
 
@@ -1509,7 +1509,7 @@ EXAMPLES
1509
1509
  $ internxt workspaces-unset
1510
1510
  ```
1511
1511
 
1512
- _See code: [src/commands/workspaces-unset.ts](https://github.com/internxt/cli/blob/v1.6.3/src/commands/workspaces-unset.ts)_
1512
+ _See code: [src/commands/workspaces-unset.ts](https://github.com/internxt/cli/blob/v1.6.5/src/commands/workspaces-unset.ts)_
1513
1513
 
1514
1514
  ## `internxt workspaces-use`
1515
1515
 
@@ -1545,7 +1545,7 @@ EXAMPLES
1545
1545
  $ internxt workspaces-use
1546
1546
  ```
1547
1547
 
1548
- _See code: [src/commands/workspaces-use.ts](https://github.com/internxt/cli/blob/v1.6.3/src/commands/workspaces-use.ts)_
1548
+ _See code: [src/commands/workspaces-use.ts](https://github.com/internxt/cli/blob/v1.6.5/src/commands/workspaces-use.ts)_
1549
1549
 
1550
1550
  ## `internxt workspaces list`
1551
1551
 
@@ -1642,4 +1642,4 @@ EXAMPLES
1642
1642
 
1643
1643
  # Current Limitations
1644
1644
 
1645
- - We currently have a 20GB size upload limitation per file for both, CLI and WebDAV
1645
+ - We currently have a 40GB size upload limitation per file for both, CLI and WebDAV
@@ -41,6 +41,7 @@ const validation_service_1 = require("../services/validation.service");
41
41
  const cli_utils_1 = require("../utils/cli.utils");
42
42
  const sdk_manager_service_1 = require("../services/sdk-manager.service");
43
43
  const OTPAuth = __importStar(require("otpauth"));
44
+ const cache_service_1 = require("../services/cache.service");
44
45
  class LoginLegacy extends core_1.Command {
45
46
  static args = {};
46
47
  static description = '[Legacy] Logs into an Internxt account using user and password. ' +
@@ -104,6 +105,7 @@ class LoginLegacy extends core_1.Command {
104
105
  }
105
106
  const loginCredentials = await auth_service_1.AuthService.instance.doLogin(email, password, twoFactorCode);
106
107
  sdk_manager_service_1.SdkManager.init({ token: loginCredentials.token });
108
+ cache_service_1.CacheService.instance.clearCaches();
107
109
  await config_service_1.ConfigService.instance.saveUser(loginCredentials);
108
110
  const message = `Succesfully logged in to: ${loginCredentials.user.email}`;
109
111
  cli_utils_1.CLIUtils.success(this.log.bind(this), message);
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const core_1 = require("@oclif/core");
4
+ const cache_service_1 = require("../services/cache.service");
4
5
  const config_service_1 = require("../services/config.service");
5
6
  const cli_utils_1 = require("../utils/cli.utils");
6
7
  const sdk_manager_service_1 = require("../services/sdk-manager.service");
@@ -37,6 +38,7 @@ class Login extends core_1.Command {
37
38
  const port = flags['port'];
38
39
  const loginCredentials = await universal_link_service_1.UniversalLinkService.instance.loginSSO(flags['json'] ?? false, this.log.bind(this), host, port);
39
40
  sdk_manager_service_1.SdkManager.init({ token: loginCredentials.token });
41
+ cache_service_1.CacheService.instance.clearCaches();
40
42
  await config_service_1.ConfigService.instance.saveUser(loginCredentials);
41
43
  const message = `Succesfully logged in to: ${loginCredentials.user.email}`;
42
44
  cli_utils_1.CLIUtils.success(this.log.bind(this), message);
@@ -13,10 +13,9 @@ const drive_file_service_1 = require("../services/drive/drive-file.service");
13
13
  const command_types_1 = require("../types/command.types");
14
14
  const validation_service_1 = require("../services/validation.service");
15
15
  const types_1 = require("@internxt/sdk/dist/drive/storage/types");
16
- const stream_utils_1 = require("../utils/stream.utils");
17
- const thumbnail_utils_1 = require("../utils/thumbnail.utils");
18
16
  const thumbnail_service_1 = require("../services/thumbnail.service");
19
17
  const auth_service_1 = require("../services/auth.service");
18
+ const upload_utils_1 = require("../utils/upload.utils");
20
19
  class UploadFile extends core_1.Command {
21
20
  static args = {};
22
21
  static description = 'Upload a file to Internxt Drive';
@@ -70,30 +69,26 @@ class UploadFile extends core_1.Command {
70
69
  }, flags['json']);
71
70
  progressBar?.start(100, 0);
72
71
  let fileId;
73
- let bufferStream;
74
- const isThumbnailable = thumbnail_utils_1.ThumbnailUtils.isFileThumbnailable(fileType);
72
+ let thumbnailStream;
75
73
  const fileSize = stats.size ?? 0;
76
74
  if (fileSize > 0) {
77
75
  const readStream = (0, node_fs_1.createReadStream)(filePath);
78
- let fileStream = readStream;
79
- if (isThumbnailable) {
80
- bufferStream = new stream_utils_1.BufferStream();
81
- fileStream = readStream.pipe(bufferStream);
82
- }
76
+ const preparedStreams = upload_utils_1.UploadUtils.prepareUploadStreams(readStream, fileType);
77
+ thumbnailStream = preparedStreams.thumbnailStream;
83
78
  const progressCallback = (progress) => {
84
79
  progressBar?.update(progress * 100 * 0.99);
85
80
  };
86
- fileId = await new Promise((resolve, reject) => {
87
- const state = networkFacade.uploadFile(fileStream, fileSize, bucket, (err, res) => {
88
- if (err) {
89
- return reject(err);
90
- }
91
- resolve(res);
92
- }, progressCallback);
93
- process.on('SIGINT', () => {
94
- state.stop();
95
- process.exit(1);
96
- });
81
+ const abortable = new AbortController();
82
+ fileId = await networkFacade.uploadFile({
83
+ from: preparedStreams.fileStream,
84
+ size: fileSize,
85
+ bucketId: bucket,
86
+ progressCallback,
87
+ abortSignal: abortable.signal,
88
+ });
89
+ process.on('SIGINT', () => {
90
+ abortable.abort();
91
+ process.exit(1);
97
92
  });
98
93
  }
99
94
  timings.networkUpload = networkUploadTimer.stop();
@@ -111,26 +106,20 @@ class UploadFile extends core_1.Command {
111
106
  });
112
107
  timings.driveUpload = driveUploadTimer.stop();
113
108
  const thumbnailTimer = cli_utils_1.CLIUtils.timer();
114
- if (fileSize > 0 && isThumbnailable && bufferStream) {
115
- await thumbnail_service_1.ThumbnailService.instance.tryUploadThumbnail({
116
- bufferStream,
117
- fileType,
118
- bucket,
119
- fileUuid: createdDriveFile.uuid,
120
- networkFacade,
121
- size: fileSize,
122
- });
123
- }
109
+ await thumbnail_service_1.ThumbnailService.instance.tryUploadThumbnail({
110
+ bufferStream: thumbnailStream,
111
+ fileType,
112
+ bucket,
113
+ fileUuid: createdDriveFile.uuid,
114
+ networkFacade,
115
+ size: fileSize,
116
+ });
124
117
  timings.thumbnailUpload = thumbnailTimer.stop();
125
118
  progressBar?.update(100);
126
119
  progressBar?.stop();
127
- const totalTime = Object.values(timings).reduce((sum, time) => sum + time, 0);
128
- const throughputMBps = cli_utils_1.CLIUtils.calculateThroughputMBps(stats.size, timings.networkUpload);
120
+ const { totalTime, timingBreakdown } = upload_utils_1.UploadUtils.getTimings(stats.size, timings);
129
121
  if (flags['debug']) {
130
- cli_utils_1.CLIUtils.log(reporter, '[PUT] Timing breakdown:\n' +
131
- `Network upload: ${cli_utils_1.CLIUtils.formatDuration(timings.networkUpload)} (${throughputMBps.toFixed(2)} MB/s)\n` +
132
- `Drive upload: ${cli_utils_1.CLIUtils.formatDuration(timings.driveUpload)}\n` +
133
- `Thumbnail: ${cli_utils_1.CLIUtils.formatDuration(timings.thumbnailUpload)}\n`);
122
+ cli_utils_1.CLIUtils.log(reporter, timingBreakdown);
134
123
  }
135
124
  const workspace = await auth_service_1.AuthService.instance.getCurrentWorkspace();
136
125
  const workspaceId = workspace?.workspaceData.workspace.id;
@@ -2,6 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.AuthService = void 0;
4
4
  const sdk_manager_service_1 = require("./sdk-manager.service");
5
+ const cache_service_1 = require("./cache.service");
5
6
  const crypto_service_1 = require("./crypto.service");
6
7
  const config_service_1 = require("./config.service");
7
8
  const command_types_1 = require("../types/command.types");
@@ -53,9 +54,11 @@ class AuthService {
53
54
  if (tokenDetails.expiration.expired) {
54
55
  throw new command_types_1.ExpiredCredentialsError();
55
56
  }
57
+ let credentialsChanged = false;
56
58
  if (tokenDetails.expiration.refreshRequired) {
57
59
  try {
58
60
  loginCreds = await this.refreshUserToken(loginCreds.token, loginCreds.user.mnemonic, loginCreds.user.keys.ecc.privateKey);
61
+ credentialsChanged = true;
59
62
  }
60
63
  catch (error) {
61
64
  await config_service_1.ConfigService.instance.clearUser();
@@ -63,9 +66,14 @@ class AuthService {
63
66
  }
64
67
  }
65
68
  const workspaceCreds = await this.refreshWorkspaceCredentials(loginCreds);
69
+ if (workspaceCreds !== loginCreds.workspace) {
70
+ credentialsChanged = true;
71
+ }
66
72
  loginCreds.workspace = workspaceCreds;
67
73
  sdk_manager_service_1.SdkManager.init({ token: loginCreds.token, workspaceToken: workspaceCreds?.workspaceCredentials.token });
68
- await config_service_1.ConfigService.instance.saveUser(loginCreds);
74
+ if (credentialsChanged) {
75
+ await config_service_1.ConfigService.instance.saveUser(loginCreds);
76
+ }
69
77
  return loginCreds;
70
78
  };
71
79
  refreshUserToken = async (oldToken, mnemonic, privateKey) => {
@@ -135,6 +143,7 @@ class AuthService {
135
143
  return loginCreds.workspace?.workspaceData?.workspaceUser?.rootFolderId ?? loginCreds.user.rootFolderId;
136
144
  };
137
145
  logout = async () => {
146
+ cache_service_1.CacheService.instance.clearCaches();
138
147
  try {
139
148
  const user = await config_service_1.ConfigService.instance.readUser();
140
149
  if (!user?.token) {
@@ -0,0 +1,13 @@
1
+ export declare class CacheService {
2
+ static readonly instance: CacheService;
3
+ private readonly store;
4
+ private readonly defaultTtl;
5
+ static readonly FETCH_USAGE_CACHE_KEY = "usage:fetchUsage";
6
+ static readonly FETCH_SPACE_LIMIT_CACHE_KEY = "usage:fetchSpaceLimit";
7
+ static readonly FETCH_LIMITS_CACHE_KEY = "usage:fetchLimits";
8
+ static readonly AUTH_CACHE_KEY = "auth:details";
9
+ static readonly WEBDAV_CONFIG_CACHE_KEY = "webdav:config";
10
+ get: <T>(key: string) => T | null;
11
+ set: <T>(key: string, data: T, ttl?: number) => void;
12
+ clearCaches: () => void;
13
+ }
@@ -0,0 +1,36 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CacheService = void 0;
4
+ const FIFTEEN_MINUTES = 15 * 60 * 1000;
5
+ class CacheService {
6
+ static instance = new CacheService();
7
+ store = new Map();
8
+ defaultTtl = FIFTEEN_MINUTES;
9
+ static FETCH_USAGE_CACHE_KEY = 'usage:fetchUsage';
10
+ static FETCH_SPACE_LIMIT_CACHE_KEY = 'usage:fetchSpaceLimit';
11
+ static FETCH_LIMITS_CACHE_KEY = 'usage:fetchLimits';
12
+ static AUTH_CACHE_KEY = 'auth:details';
13
+ static WEBDAV_CONFIG_CACHE_KEY = 'webdav:config';
14
+ get = (key) => {
15
+ const entry = this.store.get(key);
16
+ if (!entry)
17
+ return null;
18
+ const isExpired = Date.now() - entry.timestamp > entry.ttl;
19
+ if (isExpired) {
20
+ this.store.delete(key);
21
+ return null;
22
+ }
23
+ return entry.data;
24
+ };
25
+ set = (key, data, ttl) => {
26
+ this.store.set(key, {
27
+ data,
28
+ timestamp: Date.now(),
29
+ ttl: ttl ?? this.defaultTtl,
30
+ });
31
+ };
32
+ clearCaches = () => {
33
+ this.store.clear();
34
+ };
35
+ }
36
+ exports.CacheService = CacheService;
@@ -8,6 +8,7 @@ const promises_1 = __importDefault(require("node:fs/promises"));
8
8
  const crypto_service_1 = require("./crypto.service");
9
9
  const errors_utils_1 = require("../utils/errors.utils");
10
10
  const configs_1 = require("../constants/configs");
11
+ const cache_service_1 = require("./cache.service");
11
12
  class ConfigService {
12
13
  static instance = new ConfigService();
13
14
  get = (key, throwIfNotFound = true) => {
@@ -17,12 +18,16 @@ class ConfigService {
17
18
  return value ?? '';
18
19
  };
19
20
  saveUser = async (loginCredentials) => {
21
+ cache_service_1.CacheService.instance.set(cache_service_1.CacheService.AUTH_CACHE_KEY, loginCredentials);
20
22
  await this.ensureInternxtCliDataDirExists();
21
23
  const credentialsString = JSON.stringify(loginCredentials);
22
24
  const encryptedCredentials = crypto_service_1.CryptoService.instance.encryptText(credentialsString);
23
- await promises_1.default.writeFile(configs_1.CREDENTIALS_FILE, encryptedCredentials, 'utf8');
25
+ const tempPath = configs_1.CREDENTIALS_FILE + '.tmp';
26
+ await promises_1.default.writeFile(tempPath, encryptedCredentials, 'utf8');
27
+ await promises_1.default.rename(tempPath, configs_1.CREDENTIALS_FILE);
24
28
  };
25
29
  clearUser = async () => {
30
+ cache_service_1.CacheService.instance.set(cache_service_1.CacheService.AUTH_CACHE_KEY, undefined);
26
31
  try {
27
32
  const stat = await promises_1.default.stat(configs_1.CREDENTIALS_FILE);
28
33
  if (stat.size === 0)
@@ -36,6 +41,9 @@ class ConfigService {
36
41
  }
37
42
  };
38
43
  readUser = async () => {
44
+ const cached = cache_service_1.CacheService.instance.get(cache_service_1.CacheService.AUTH_CACHE_KEY);
45
+ if (cached)
46
+ return cached;
39
47
  try {
40
48
  const encryptedCredentials = await promises_1.default.readFile(configs_1.CREDENTIALS_FILE, 'utf8');
41
49
  const credentialsString = crypto_service_1.CryptoService.instance.decryptText(encryptedCredentials);
@@ -47,15 +55,21 @@ class ConfigService {
47
55
  }
48
56
  };
49
57
  saveWebdavConfig = async (webdavConfig) => {
58
+ cache_service_1.CacheService.instance.set(cache_service_1.CacheService.WEBDAV_CONFIG_CACHE_KEY, webdavConfig);
50
59
  await this.ensureInternxtCliDataDirExists();
51
60
  const configs = JSON.stringify(webdavConfig);
52
- await promises_1.default.writeFile(configs_1.WEBDAV_CONFIGS_FILE, configs, 'utf8');
61
+ const tempPath = configs_1.WEBDAV_CONFIGS_FILE + '.tmp';
62
+ await promises_1.default.writeFile(tempPath, configs, 'utf8');
63
+ await promises_1.default.rename(tempPath, configs_1.WEBDAV_CONFIGS_FILE);
53
64
  };
54
65
  readWebdavConfig = async () => {
66
+ const cached = cache_service_1.CacheService.instance.get(cache_service_1.CacheService.WEBDAV_CONFIG_CACHE_KEY);
67
+ if (cached)
68
+ return cached;
55
69
  try {
56
70
  const configsData = await promises_1.default.readFile(configs_1.WEBDAV_CONFIGS_FILE, 'utf8');
57
71
  const configs = JSON.parse(configsData);
58
- return {
72
+ const webdavConfig = {
59
73
  host: configs?.host ?? configs_1.WEBDAV_DEFAULT_HOST,
60
74
  port: configs?.port ?? configs_1.WEBDAV_DEFAULT_PORT,
61
75
  protocol: configs?.protocol ?? configs_1.WEBDAV_DEFAULT_PROTOCOL,
@@ -66,6 +80,8 @@ class ConfigService {
66
80
  password: configs?.password ?? '',
67
81
  deleteFilesPermanently: configs?.deleteFilesPermanently ?? configs_1.WEBDAV_DEFAULT_DELETE_FILES_PERMANENTLY,
68
82
  };
83
+ cache_service_1.CacheService.instance.set(cache_service_1.CacheService.WEBDAV_CONFIG_CACHE_KEY, webdavConfig);
84
+ return webdavConfig;
69
85
  }
70
86
  catch {
71
87
  return {
@@ -2,7 +2,7 @@ import { DataSource } from 'typeorm';
2
2
  export declare class DatabaseService {
3
3
  static readonly instance: DatabaseService;
4
4
  dataSource: DataSource;
5
- initialize: () => Promise<DataSource>;
5
+ initialize: () => Promise<DataSource> | undefined;
6
6
  destroy: () => Promise<void>;
7
7
  clear: () => Promise<void>;
8
8
  drop: () => Promise<void>;
@@ -2,8 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.DatabaseService = void 0;
4
4
  const typeorm_1 = require("typeorm");
5
- const drive_file_model_1 = require("./drive-file/drive-file.model");
6
- const drive_folder_model_1 = require("./drive-folder/drive-folder.model");
5
+ const drive_item_model_1 = require("./drive-item/drive-item.model");
7
6
  const configs_1 = require("../../constants/configs");
8
7
  const config_service_1 = require("../config.service");
9
8
  class DatabaseService {
@@ -14,17 +13,19 @@ class DatabaseService {
14
13
  autoSave: false,
15
14
  logging: false,
16
15
  synchronize: true,
17
- entities: [drive_file_model_1.DriveFileModel, drive_folder_model_1.DriveFolderModel],
16
+ entities: [drive_item_model_1.DriveItemModel],
18
17
  }
19
18
  : {
20
19
  type: 'better-sqlite3',
21
20
  database: configs_1.DRIVE_SQLITE_FILE,
22
21
  logging: false,
23
22
  synchronize: true,
24
- entities: [drive_file_model_1.DriveFileModel, drive_folder_model_1.DriveFolderModel],
23
+ entities: [drive_item_model_1.DriveItemModel],
25
24
  });
26
25
  initialize = () => {
27
- return this.dataSource.initialize();
26
+ if (!this.dataSource.isInitialized) {
27
+ return this.dataSource.initialize();
28
+ }
28
29
  };
29
30
  destroy = () => {
30
31
  return this.dataSource.destroy();
@@ -0,0 +1,7 @@
1
+ export interface DriveItemAttributes {
2
+ uuid: string;
3
+ path: string;
4
+ type: 'file' | 'folder';
5
+ createdAt: Date;
6
+ updatedAt: Date;
7
+ }
@@ -0,0 +1,10 @@
1
+ import { DriveItemAttributes } from './drive-item.attributes';
2
+ export declare class DriveItemBD implements DriveItemAttributes {
3
+ uuid: string;
4
+ path: string;
5
+ type: 'file' | 'folder';
6
+ createdAt: Date;
7
+ updatedAt: Date;
8
+ constructor({ uuid, path, type, createdAt, updatedAt }: DriveItemAttributes);
9
+ toJSON(): DriveItemAttributes;
10
+ }
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DriveItemBD = void 0;
4
+ class DriveItemBD {
5
+ uuid;
6
+ path;
7
+ type;
8
+ createdAt;
9
+ updatedAt;
10
+ constructor({ uuid, path, type, createdAt, updatedAt }) {
11
+ this.uuid = uuid;
12
+ this.path = path;
13
+ this.type = type;
14
+ this.createdAt = createdAt;
15
+ this.updatedAt = updatedAt;
16
+ }
17
+ toJSON() {
18
+ return {
19
+ uuid: this.uuid,
20
+ path: this.path,
21
+ type: this.type,
22
+ createdAt: this.createdAt,
23
+ updatedAt: this.updatedAt,
24
+ };
25
+ }
26
+ }
27
+ exports.DriveItemBD = DriveItemBD;