@internxt/cli 1.4.1 → 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.
- package/README.md +25 -25
- package/dist/commands/download-file.js +13 -5
- package/dist/commands/upload-file.js +51 -17
- package/dist/commands/webdav.js +4 -0
- package/dist/services/crypto.service.d.ts +1 -3
- package/dist/services/crypto.service.js +17 -7
- package/dist/services/drive/drive-file.service.d.ts +1 -0
- package/dist/services/drive/drive-file.service.js +4 -0
- package/dist/services/network/download.service.d.ts +3 -1
- package/dist/services/network/download.service.js +5 -3
- package/dist/services/network/network-facade.service.d.ts +8 -9
- package/dist/services/network/network-facade.service.js +39 -50
- package/dist/services/thumbnail.service.d.ts +7 -0
- package/dist/services/thumbnail.service.js +55 -0
- package/dist/types/network.types.d.ts +11 -2
- package/dist/utils/errors.utils.d.ts +4 -0
- package/dist/utils/errors.utils.js +10 -1
- package/dist/utils/logger.utils.js +16 -2
- package/dist/utils/network.utils.d.ts +11 -0
- package/dist/utils/network.utils.js +36 -0
- package/dist/utils/stream.utils.d.ts +8 -10
- package/dist/utils/stream.utils.js +18 -17
- package/dist/utils/thumbnail.utils.d.ts +9 -0
- package/dist/utils/thumbnail.utils.js +44 -0
- package/dist/webdav/handlers/DELETE.handler.js +4 -3
- package/dist/webdav/handlers/GET.handler.d.ts +0 -2
- package/dist/webdav/handlers/GET.handler.js +21 -19
- package/dist/webdav/handlers/HEAD.handler.d.ts +9 -2
- package/dist/webdav/handlers/HEAD.handler.js +34 -2
- package/dist/webdav/handlers/MKCOL.handler.js +3 -3
- package/dist/webdav/handlers/MOVE.handler.js +2 -2
- package/dist/webdav/handlers/OPTIONS.handler.d.ts +1 -1
- package/dist/webdav/handlers/OPTIONS.handler.js +29 -4
- package/dist/webdav/handlers/PROPFIND.handler.js +1 -1
- package/dist/webdav/handlers/PUT.handler.js +55 -15
- package/dist/webdav/index.js +10 -2
- package/dist/webdav/middewares/auth.middleware.d.ts +2 -2
- package/dist/webdav/middewares/auth.middleware.js +8 -8
- package/dist/webdav/webdav-server.d.ts +1 -3
- package/dist/webdav/webdav-server.js +20 -8
- package/oclif.manifest.json +1 -1
- package/package.json +54 -51
- package/scripts/restart-webdav.js +16 -0
- package/dist/services/network/upload.service.d.ts +0 -8
- package/dist/services/network/upload.service.js +0 -24
- package/dist/utils/hash.utils.d.ts +0 -12
- package/dist/utils/hash.utils.js +0 -37
- 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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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:
|
|
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
|
|
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
|
|
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(
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
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:
|
|
108
|
+
type: fileType,
|
|
88
109
|
size: stats.size,
|
|
89
110
|
folder_id: destinationFolderUuid,
|
|
90
|
-
id:
|
|
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}`;
|
package/dist/commands/webdav.js
CHANGED
|
@@ -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)
|
|
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
|
-
|
|
68
|
-
|
|
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]);
|
|
@@ -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?:
|
|
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.
|
|
15
|
-
|
|
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
|
|
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
|
|
11
|
+
private readonly environment;
|
|
10
12
|
private readonly downloadService;
|
|
11
13
|
private readonly cryptoService;
|
|
12
14
|
private readonly cryptoLib;
|
|
13
|
-
constructor(network: Network.Network,
|
|
14
|
-
downloadToStream(bucketId: string, mnemonic: string, fileId: string, to: WritableStream, options?: DownloadOptions): Promise<[Promise<void>, AbortController]>;
|
|
15
|
-
|
|
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
|
}
|