@internxt/cli 1.6.3 → 1.6.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +32 -32
- package/dist/commands/upload-file.js +11 -11
- package/dist/services/network/network-facade.service.d.ts +9 -2
- package/dist/services/network/network-facade.service.js +11 -22
- package/dist/services/network/upload/upload-file.service.js +5 -7
- package/dist/services/thumbnail.service.js +5 -7
- package/dist/utils/webdav.utils.d.ts +1 -0
- package/dist/utils/webdav.utils.js +19 -0
- package/dist/utils/xml.utils.d.ts +1 -1
- package/dist/webdav/handlers/DELETE.handler.js +1 -17
- package/dist/webdav/handlers/PUT.handler.js +16 -20
- package/oclif.manifest.json +1 -1
- package/package.json +17 -17
- package/dist/types/fast-xml-parser.types.d.ts +0 -59
- package/dist/types/fast-xml-parser.types.js +0 -2
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.
|
|
55
|
+
@internxt/cli/1.6.4 linux-x64 node-v22.22.1
|
|
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.
|
|
142
|
+
_See code: [src/commands/add-cert.ts](https://github.com/internxt/cli/blob/v1.6.4/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.
|
|
194
|
+
_See code: [@oclif/plugin-autocomplete](https://github.com/oclif/plugin-autocomplete/blob/v3.2.41/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.
|
|
223
|
+
_See code: [src/commands/config.ts](https://github.com/internxt/cli/blob/v1.6.4/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.
|
|
257
|
+
_See code: [src/commands/create-folder.ts](https://github.com/internxt/cli/blob/v1.6.4/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.
|
|
321
|
+
_See code: [src/commands/delete-permanently-file.ts](https://github.com/internxt/cli/blob/v1.6.4/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.
|
|
353
|
+
_See code: [src/commands/delete-permanently-folder.ts](https://github.com/internxt/cli/blob/v1.6.4/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.
|
|
448
|
+
_See code: [src/commands/download-file.ts](https://github.com/internxt/cli/blob/v1.6.4/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.
|
|
511
|
+
_See code: [src/commands/list.ts](https://github.com/internxt/cli/blob/v1.6.4/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.
|
|
539
|
+
_See code: [src/commands/login.ts](https://github.com/internxt/cli/blob/v1.6.4/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.
|
|
573
|
+
_See code: [src/commands/login-legacy.ts](https://github.com/internxt/cli/blob/v1.6.4/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.
|
|
593
|
+
_See code: [src/commands/logout.ts](https://github.com/internxt/cli/blob/v1.6.4/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.
|
|
613
|
+
_See code: [src/commands/logs.ts](https://github.com/internxt/cli/blob/v1.6.4/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.
|
|
647
|
+
_See code: [src/commands/move-file.ts](https://github.com/internxt/cli/blob/v1.6.4/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.
|
|
681
|
+
_See code: [src/commands/move-folder.ts](https://github.com/internxt/cli/blob/v1.6.4/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.
|
|
778
|
+
_See code: [src/commands/rename-file.ts](https://github.com/internxt/cli/blob/v1.6.4/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.
|
|
811
|
+
_See code: [src/commands/rename-folder.ts](https://github.com/internxt/cli/blob/v1.6.4/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.
|
|
905
|
+
_See code: [src/commands/trash-clear.ts](https://github.com/internxt/cli/blob/v1.6.4/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.
|
|
937
|
+
_See code: [src/commands/trash-file.ts](https://github.com/internxt/cli/blob/v1.6.4/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.
|
|
969
|
+
_See code: [src/commands/trash-folder.ts](https://github.com/internxt/cli/blob/v1.6.4/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.
|
|
995
|
+
_See code: [src/commands/trash-list.ts](https://github.com/internxt/cli/blob/v1.6.4/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.
|
|
1028
|
+
_See code: [src/commands/trash-restore-file.ts](https://github.com/internxt/cli/blob/v1.6.4/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.
|
|
1061
|
+
_See code: [src/commands/trash-restore-folder.ts](https://github.com/internxt/cli/blob/v1.6.4/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.
|
|
1270
|
+
_See code: [src/commands/upload-file.ts](https://github.com/internxt/cli/blob/v1.6.4/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.
|
|
1303
|
+
_See code: [src/commands/upload-folder.ts](https://github.com/internxt/cli/blob/v1.6.4/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.
|
|
1391
|
+
_See code: [src/commands/webdav.ts](https://github.com/internxt/cli/blob/v1.6.4/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.
|
|
1430
|
+
_See code: [src/commands/webdav-config.ts](https://github.com/internxt/cli/blob/v1.6.4/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.
|
|
1450
|
+
_See code: [src/commands/whoami.ts](https://github.com/internxt/cli/blob/v1.6.4/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.
|
|
1482
|
+
_See code: [src/commands/workspaces-list.ts](https://github.com/internxt/cli/blob/v1.6.4/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.
|
|
1512
|
+
_See code: [src/commands/workspaces-unset.ts](https://github.com/internxt/cli/blob/v1.6.4/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.
|
|
1548
|
+
_See code: [src/commands/workspaces-use.ts](https://github.com/internxt/cli/blob/v1.6.4/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
|
|
1645
|
+
- We currently have a 40GB size upload limitation per file for both, CLI and WebDAV
|
|
@@ -83,17 +83,17 @@ class UploadFile extends core_1.Command {
|
|
|
83
83
|
const progressCallback = (progress) => {
|
|
84
84
|
progressBar?.update(progress * 100 * 0.99);
|
|
85
85
|
};
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
86
|
+
const abortable = new AbortController();
|
|
87
|
+
fileId = await networkFacade.uploadFile({
|
|
88
|
+
from: fileStream,
|
|
89
|
+
size: fileSize,
|
|
90
|
+
bucketId: bucket,
|
|
91
|
+
progressCallback,
|
|
92
|
+
abortSignal: abortable.signal,
|
|
93
|
+
});
|
|
94
|
+
process.on('SIGINT', () => {
|
|
95
|
+
abortable.abort();
|
|
96
|
+
process.exit(1);
|
|
97
97
|
});
|
|
98
98
|
}
|
|
99
99
|
timings.networkUpload = networkUploadTimer.stop();
|
|
@@ -3,12 +3,19 @@ import { Environment } from '@internxt/inxt-js';
|
|
|
3
3
|
import { Readable } from 'node:stream';
|
|
4
4
|
import { DownloadOptions } from '../../types/network.types';
|
|
5
5
|
import { RangeOptions } from '../../utils/network.utils';
|
|
6
|
-
import {
|
|
6
|
+
import { EncryptProgressCallback } from '@internxt/inxt-js/build/lib/core';
|
|
7
7
|
export declare class NetworkFacade {
|
|
8
8
|
private readonly network;
|
|
9
9
|
private readonly environment;
|
|
10
10
|
private readonly cryptoLib;
|
|
11
11
|
constructor(network: Network.Network, environment: Environment);
|
|
12
12
|
downloadToStream: (bucketId: string, mnemonic: string, fileId: string, size: number, to: WritableStream, rangeOptions?: RangeOptions, options?: DownloadOptions) => Promise<[Promise<void>, AbortController]>;
|
|
13
|
-
uploadFile: (from
|
|
13
|
+
uploadFile: ({ from, size, bucketId, progressCallback, abortSignal, encryptProgressCallback, }: {
|
|
14
|
+
from: Readable;
|
|
15
|
+
size: number;
|
|
16
|
+
bucketId: string;
|
|
17
|
+
progressCallback: (progress: number) => void;
|
|
18
|
+
abortSignal?: AbortSignal;
|
|
19
|
+
encryptProgressCallback?: EncryptProgressCallback;
|
|
20
|
+
}) => Promise<string>;
|
|
14
21
|
}
|
|
@@ -41,7 +41,7 @@ const node_crypto_1 = require("node:crypto");
|
|
|
41
41
|
const crypto_service_1 = require("../crypto.service");
|
|
42
42
|
const download_service_1 = require("./download.service");
|
|
43
43
|
const validation_service_1 = require("../validation.service");
|
|
44
|
-
const
|
|
44
|
+
const FORTY_GIGABYTES = 40 * 1024 * 1024 * 1024;
|
|
45
45
|
class NetworkFacade {
|
|
46
46
|
network;
|
|
47
47
|
environment;
|
|
@@ -99,28 +99,17 @@ class NetworkFacade {
|
|
|
99
99
|
};
|
|
100
100
|
return [downloadOperation(), abortable];
|
|
101
101
|
};
|
|
102
|
-
uploadFile = (from, size, bucketId,
|
|
103
|
-
if (size >
|
|
104
|
-
throw new Error('File is too big (more than
|
|
105
|
-
}
|
|
106
|
-
const minimumMultipartThreshold = 100 * 1024 * 1024;
|
|
107
|
-
const useMultipart = size > minimumMultipartThreshold;
|
|
108
|
-
if (useMultipart) {
|
|
109
|
-
return this.environment.uploadMultipartFile(bucketId, {
|
|
110
|
-
source: from,
|
|
111
|
-
fileSize: size,
|
|
112
|
-
finishedCallback,
|
|
113
|
-
progressCallback,
|
|
114
|
-
});
|
|
115
|
-
}
|
|
116
|
-
else {
|
|
117
|
-
return this.environment.upload(bucketId, {
|
|
118
|
-
source: from,
|
|
119
|
-
fileSize: size,
|
|
120
|
-
finishedCallback,
|
|
121
|
-
progressCallback,
|
|
122
|
-
});
|
|
102
|
+
uploadFile = ({ from, size, bucketId, progressCallback, abortSignal, encryptProgressCallback, }) => {
|
|
103
|
+
if (size > FORTY_GIGABYTES) {
|
|
104
|
+
throw new Error('File is too big (more than 40 GB)');
|
|
123
105
|
}
|
|
106
|
+
return this.environment.upload(bucketId, {
|
|
107
|
+
source: from,
|
|
108
|
+
fileSize: size,
|
|
109
|
+
progressCallback,
|
|
110
|
+
abortSignal,
|
|
111
|
+
encryptProgressCallback,
|
|
112
|
+
});
|
|
124
113
|
};
|
|
125
114
|
}
|
|
126
115
|
exports.NetworkFacade = NetworkFacade;
|
|
@@ -63,13 +63,11 @@ class UploadFileService {
|
|
|
63
63
|
});
|
|
64
64
|
const uploadTimer = cli_utils_1.CLIUtils.timer();
|
|
65
65
|
thumbnailStream = bufferStream;
|
|
66
|
-
fileId = await
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
resolve(res);
|
|
72
|
-
}, () => { });
|
|
66
|
+
fileId = await network.uploadFile({
|
|
67
|
+
from: fileStream,
|
|
68
|
+
size: fileSize,
|
|
69
|
+
bucketId: bucket,
|
|
70
|
+
progressCallback: () => { },
|
|
73
71
|
});
|
|
74
72
|
timings.networkUpload = uploadTimer.stop();
|
|
75
73
|
}
|
|
@@ -31,13 +31,11 @@ class ThumbnailService {
|
|
|
31
31
|
}
|
|
32
32
|
if (thumbnailBuffer) {
|
|
33
33
|
const size = thumbnailBuffer.length;
|
|
34
|
-
const fileId = await
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
resolve(res);
|
|
40
|
-
}, () => { });
|
|
34
|
+
const fileId = await networkFacade.uploadFile({
|
|
35
|
+
from: node_stream_1.Readable.from(thumbnailBuffer),
|
|
36
|
+
size: size,
|
|
37
|
+
bucketId: userBucket,
|
|
38
|
+
progressCallback: () => { },
|
|
41
39
|
});
|
|
42
40
|
const createdThumbnailFile = await drive_file_service_1.DriveFileService.instance.createThumbnail({
|
|
43
41
|
fileUuid: file_id,
|
|
@@ -10,4 +10,5 @@ export declare class WebDavUtils {
|
|
|
10
10
|
static getDriveFileFromResource(url: string): Promise<DriveFileItem | undefined>;
|
|
11
11
|
static getDriveFolderFromResource(url: string): Promise<DriveFolderItem | undefined>;
|
|
12
12
|
static getDriveItemFromResource(resource: WebDavRequestedResource): Promise<DriveItem | undefined>;
|
|
13
|
+
static deleteOrTrashItem(driveItem: DriveItem): Promise<void>;
|
|
13
14
|
}
|
|
@@ -8,6 +8,9 @@ const node_path_1 = __importDefault(require("node:path"));
|
|
|
8
8
|
const drive_folder_service_1 = require("../services/drive/drive-folder.service");
|
|
9
9
|
const drive_file_service_1 = require("../services/drive/drive-file.service");
|
|
10
10
|
const logger_utils_1 = require("./logger.utils");
|
|
11
|
+
const config_service_1 = require("../services/config.service");
|
|
12
|
+
const trash_service_1 = require("../services/drive/trash.service");
|
|
13
|
+
const format_utils_1 = require("./format.utils");
|
|
11
14
|
class WebDavUtils {
|
|
12
15
|
static joinURL(...pathComponents) {
|
|
13
16
|
return node_path_1.default.posix.join(...pathComponents);
|
|
@@ -85,5 +88,21 @@ class WebDavUtils {
|
|
|
85
88
|
}
|
|
86
89
|
return item;
|
|
87
90
|
}
|
|
91
|
+
static async deleteOrTrashItem(driveItem) {
|
|
92
|
+
const configs = await config_service_1.ConfigService.instance.readWebdavConfig();
|
|
93
|
+
const type = format_utils_1.FormatUtils.capitalizeFirstLetter(driveItem.itemType);
|
|
94
|
+
if (configs.deleteFilesPermanently) {
|
|
95
|
+
logger_utils_1.webdavLogger.info(`[DELETE] [${driveItem.uuid}] Deleting permanently ${driveItem.itemType}`);
|
|
96
|
+
await trash_service_1.TrashService.instance.deleteItemPermanently(driveItem.itemType, driveItem.uuid);
|
|
97
|
+
logger_utils_1.webdavLogger.info(`[DELETE] [${driveItem.uuid}] ${type} deleted permanently successfully`);
|
|
98
|
+
}
|
|
99
|
+
else {
|
|
100
|
+
logger_utils_1.webdavLogger.info(`[DELETE] [${driveItem.uuid}] Trashing ${driveItem.itemType}`);
|
|
101
|
+
await trash_service_1.TrashService.instance.trashItems({
|
|
102
|
+
items: [{ type: driveItem.itemType, uuid: driveItem.uuid }],
|
|
103
|
+
});
|
|
104
|
+
logger_utils_1.webdavLogger.info(`[DELETE] [${driveItem.uuid}] ${type} trashed successfully`);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
88
107
|
}
|
|
89
108
|
exports.WebDavUtils = WebDavUtils;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { X2jOptions, XmlBuilderOptions } from '
|
|
1
|
+
import { X2jOptions, XmlBuilderOptions } from 'fast-xml-parser';
|
|
2
2
|
export declare class XMLUtils {
|
|
3
3
|
static readonly DEFAULT_NAMESPACE_LETTER = "D";
|
|
4
4
|
static toJSON(xml: string, options?: X2jOptions): any;
|
|
@@ -2,11 +2,8 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.DELETERequestHandler = void 0;
|
|
4
4
|
const webdav_utils_1 = require("../../utils/webdav.utils");
|
|
5
|
-
const trash_service_1 = require("../../services/drive/trash.service");
|
|
6
5
|
const logger_utils_1 = require("../../utils/logger.utils");
|
|
7
6
|
const errors_utils_1 = require("../../utils/errors.utils");
|
|
8
|
-
const config_service_1 = require("../../services/config.service");
|
|
9
|
-
const format_utils_1 = require("../../utils/format.utils");
|
|
10
7
|
class DELETERequestHandler {
|
|
11
8
|
handle = async (req, res) => {
|
|
12
9
|
const resource = await webdav_utils_1.WebDavUtils.getRequestedResource(req.url);
|
|
@@ -15,20 +12,7 @@ class DELETERequestHandler {
|
|
|
15
12
|
if (!driveItem) {
|
|
16
13
|
throw new errors_utils_1.NotFoundError(`Resource not found on Internxt Drive at ${resource.url}`);
|
|
17
14
|
}
|
|
18
|
-
|
|
19
|
-
const configs = await config_service_1.ConfigService.instance.readWebdavConfig();
|
|
20
|
-
if (configs.deleteFilesPermanently) {
|
|
21
|
-
logger_utils_1.webdavLogger.info(`[DELETE] [${driveItem.uuid}] Deleting permanently ${driveItem.itemType}`);
|
|
22
|
-
await trash_service_1.TrashService.instance.deleteItemPermanently(driveItem.itemType, driveItem.uuid);
|
|
23
|
-
logger_utils_1.webdavLogger.info(`[DELETE] [${driveItem.uuid}] ${type} deleted permanently successfully`);
|
|
24
|
-
}
|
|
25
|
-
else {
|
|
26
|
-
logger_utils_1.webdavLogger.info(`[DELETE] [${driveItem.uuid}] Trashing ${driveItem.itemType}`);
|
|
27
|
-
await trash_service_1.TrashService.instance.trashItems({
|
|
28
|
-
items: [{ type: driveItem.itemType, uuid: driveItem.uuid }],
|
|
29
|
-
});
|
|
30
|
-
logger_utils_1.webdavLogger.info(`[DELETE] [${driveItem.uuid}] ${type} trashed successfully`);
|
|
31
|
-
}
|
|
15
|
+
await webdav_utils_1.WebDavUtils.deleteOrTrashItem(driveItem);
|
|
32
16
|
res.status(204).send();
|
|
33
17
|
};
|
|
34
18
|
}
|
|
@@ -6,7 +6,6 @@ const auth_service_1 = require("../../services/auth.service");
|
|
|
6
6
|
const errors_utils_1 = require("../../utils/errors.utils");
|
|
7
7
|
const webdav_utils_1 = require("../../utils/webdav.utils");
|
|
8
8
|
const logger_utils_1 = require("../../utils/logger.utils");
|
|
9
|
-
const trash_service_1 = require("../../services/drive/trash.service");
|
|
10
9
|
const types_1 = require("@internxt/sdk/dist/drive/storage/types");
|
|
11
10
|
const cli_utils_1 = require("../../utils/cli.utils");
|
|
12
11
|
const stream_utils_1 = require("../../utils/stream.utils");
|
|
@@ -36,10 +35,8 @@ class PUTRequestHandler {
|
|
|
36
35
|
(await webdav_folder_service_1.WebDavFolderService.instance.createParentPathOrThrow(resource.parentPath));
|
|
37
36
|
try {
|
|
38
37
|
if (driveFileItem && driveFileItem.status === 'EXISTS') {
|
|
39
|
-
logger_utils_1.webdavLogger.info(`[PUT] File '${resource.name}' already exists in '${resource.path.dir}',
|
|
40
|
-
await
|
|
41
|
-
items: [{ type: driveFileItem.itemType, uuid: driveFileItem.uuid }],
|
|
42
|
-
});
|
|
38
|
+
logger_utils_1.webdavLogger.info(`[PUT] File '${resource.name}' already exists in '${resource.path.dir}', it will be replaced...`);
|
|
39
|
+
await webdav_utils_1.WebDavUtils.deleteOrTrashItem(driveFileItem);
|
|
43
40
|
}
|
|
44
41
|
}
|
|
45
42
|
catch {
|
|
@@ -63,21 +60,20 @@ class PUTRequestHandler {
|
|
|
63
60
|
}
|
|
64
61
|
};
|
|
65
62
|
const networkUploadTimer = cli_utils_1.CLIUtils.timer();
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
});
|
|
63
|
+
const abortable = new AbortController();
|
|
64
|
+
fileId = await networkFacade.uploadFile({
|
|
65
|
+
from: fileStream,
|
|
66
|
+
size: contentLength,
|
|
67
|
+
bucketId: bucket,
|
|
68
|
+
progressCallback,
|
|
69
|
+
abortSignal: abortable.signal,
|
|
70
|
+
});
|
|
71
|
+
res.on('close', async () => {
|
|
72
|
+
aborted = true;
|
|
73
|
+
if (!uploaded) {
|
|
74
|
+
logger_utils_1.webdavLogger.info('[PUT] ❌ HTTP Client has been disconnected, res has been closed.');
|
|
75
|
+
abortable.abort();
|
|
76
|
+
}
|
|
81
77
|
});
|
|
82
78
|
uploaded = true;
|
|
83
79
|
timings.networkUpload = networkUploadTimer.stop();
|
package/oclif.manifest.json
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"author": "Internxt <hello@internxt.com>",
|
|
3
|
-
"version": "1.6.
|
|
3
|
+
"version": "1.6.4",
|
|
4
4
|
"description": "Internxt CLI to manage your encrypted storage",
|
|
5
5
|
"scripts": {
|
|
6
6
|
"build": "yarn clean && tsc",
|
|
@@ -37,22 +37,22 @@
|
|
|
37
37
|
],
|
|
38
38
|
"dependencies": {
|
|
39
39
|
"@dashlane/pqc-kem-kyber512-node": "1.0.0",
|
|
40
|
-
"@inquirer/prompts": "8.3.
|
|
41
|
-
"@internxt/inxt-js": "
|
|
40
|
+
"@inquirer/prompts": "8.3.2",
|
|
41
|
+
"@internxt/inxt-js": "3.0.2",
|
|
42
42
|
"@internxt/lib": "1.4.1",
|
|
43
|
-
"@internxt/sdk": "1.15.
|
|
44
|
-
"@oclif/core": "4.
|
|
45
|
-
"@oclif/plugin-autocomplete": "3.2.
|
|
43
|
+
"@internxt/sdk": "1.15.4",
|
|
44
|
+
"@oclif/core": "4.9.0",
|
|
45
|
+
"@oclif/plugin-autocomplete": "3.2.41",
|
|
46
46
|
"axios": "1.13.6",
|
|
47
|
-
"better-sqlite3": "12.
|
|
47
|
+
"better-sqlite3": "12.8.0",
|
|
48
48
|
"bip39": "3.1.0",
|
|
49
49
|
"body-parser": "2.2.2",
|
|
50
50
|
"cli-progress": "3.12.0",
|
|
51
|
-
"dayjs": "1.11.
|
|
51
|
+
"dayjs": "1.11.20",
|
|
52
52
|
"dotenv": "17.3.1",
|
|
53
53
|
"express": "5.2.1",
|
|
54
54
|
"express-async-handler": "1.2.0",
|
|
55
|
-
"fast-xml-parser": "5.
|
|
55
|
+
"fast-xml-parser": "5.5.6",
|
|
56
56
|
"hash-wasm": "4.12.0",
|
|
57
57
|
"mime-types": "3.0.2",
|
|
58
58
|
"open": "11.0.0",
|
|
@@ -66,27 +66,27 @@
|
|
|
66
66
|
"winston": "3.19.0"
|
|
67
67
|
},
|
|
68
68
|
"devDependencies": {
|
|
69
|
-
"@internxt/eslint-config-internxt": "2.0
|
|
69
|
+
"@internxt/eslint-config-internxt": "2.1.0",
|
|
70
70
|
"@internxt/prettier-config": "internxt/prettier-config#v1.0.2",
|
|
71
71
|
"@openpgp/web-stream-tools": "0.3.0",
|
|
72
72
|
"@types/cli-progress": "3.11.6",
|
|
73
73
|
"@types/express": "5.0.6",
|
|
74
74
|
"@types/mime-types": "3.0.1",
|
|
75
|
-
"@types/node": "25.
|
|
75
|
+
"@types/node": "25.5.0",
|
|
76
76
|
"@types/range-parser": "1.2.7",
|
|
77
|
-
"@vitest/coverage-istanbul": "4.0
|
|
78
|
-
"@vitest/spy": "4.0
|
|
79
|
-
"eslint": "
|
|
77
|
+
"@vitest/coverage-istanbul": "4.1.0",
|
|
78
|
+
"@vitest/spy": "4.1.0",
|
|
79
|
+
"eslint": "10.0.3",
|
|
80
80
|
"husky": "9.1.7",
|
|
81
|
-
"lint-staged": "16.
|
|
81
|
+
"lint-staged": "16.4.0",
|
|
82
82
|
"nodemon": "3.1.14",
|
|
83
|
-
"oclif": "4.22.
|
|
83
|
+
"oclif": "4.22.92",
|
|
84
84
|
"prettier": "3.8.1",
|
|
85
85
|
"rimraf": "6.1.3",
|
|
86
86
|
"sql.js": "1.14.1",
|
|
87
87
|
"ts-node": "10.9.2",
|
|
88
88
|
"typescript": "5.9.3",
|
|
89
|
-
"vitest": "4.0
|
|
89
|
+
"vitest": "4.1.0",
|
|
90
90
|
"vitest-mock-express": "2.2.0"
|
|
91
91
|
},
|
|
92
92
|
"optionalDependencies": {
|
|
@@ -1,59 +0,0 @@
|
|
|
1
|
-
type strnumOptions = {
|
|
2
|
-
hex: boolean;
|
|
3
|
-
leadingZeros: boolean;
|
|
4
|
-
skipLike?: RegExp;
|
|
5
|
-
eNotation?: boolean;
|
|
6
|
-
};
|
|
7
|
-
export type X2jOptions = {
|
|
8
|
-
preserveOrder?: boolean;
|
|
9
|
-
attributeNamePrefix?: string;
|
|
10
|
-
attributesGroupName?: false | string;
|
|
11
|
-
textNodeName?: string;
|
|
12
|
-
ignoreAttributes?: boolean | (string | RegExp)[] | ((attrName: string, jPath: string) => boolean);
|
|
13
|
-
removeNSPrefix?: boolean;
|
|
14
|
-
allowBooleanAttributes?: boolean;
|
|
15
|
-
parseTagValue?: boolean;
|
|
16
|
-
parseAttributeValue?: boolean;
|
|
17
|
-
trimValues?: boolean;
|
|
18
|
-
cdataPropName?: false | string;
|
|
19
|
-
commentPropName?: false | string;
|
|
20
|
-
tagValueProcessor?: (tagName: string, tagValue: string, jPath: string, hasAttributes: boolean, isLeafNode: boolean) => unknown;
|
|
21
|
-
attributeValueProcessor?: (attrName: string, attrValue: string, jPath: string) => unknown;
|
|
22
|
-
numberParseOptions?: strnumOptions;
|
|
23
|
-
stopNodes?: string[];
|
|
24
|
-
unpairedTags?: string[];
|
|
25
|
-
alwaysCreateTextNode?: boolean;
|
|
26
|
-
isArray?: (tagName: string, jPath: string, isLeafNode: boolean, isAttribute: boolean) => boolean;
|
|
27
|
-
processEntities?: boolean;
|
|
28
|
-
htmlEntities?: boolean;
|
|
29
|
-
ignoreDeclaration?: boolean;
|
|
30
|
-
ignorePiTags?: boolean;
|
|
31
|
-
transformTagName?: ((tagName: string) => string) | false;
|
|
32
|
-
transformAttributeName?: ((attributeName: string) => string) | false;
|
|
33
|
-
updateTag?: (tagName: string, jPath: string, attrs: {
|
|
34
|
-
[k: string]: string;
|
|
35
|
-
}) => string | boolean;
|
|
36
|
-
captureMetaData?: boolean;
|
|
37
|
-
};
|
|
38
|
-
export type XmlBuilderOptions = {
|
|
39
|
-
attributeNamePrefix?: string;
|
|
40
|
-
attributesGroupName?: false | string;
|
|
41
|
-
textNodeName?: string;
|
|
42
|
-
ignoreAttributes?: boolean | (string | RegExp)[] | ((attrName: string, jPath: string) => boolean);
|
|
43
|
-
cdataPropName?: false | string;
|
|
44
|
-
commentPropName?: false | string;
|
|
45
|
-
format?: boolean;
|
|
46
|
-
indentBy?: string;
|
|
47
|
-
arrayNodeName?: string;
|
|
48
|
-
suppressEmptyNode?: boolean;
|
|
49
|
-
suppressUnpairedNode?: boolean;
|
|
50
|
-
suppressBooleanAttributes?: boolean;
|
|
51
|
-
preserveOrder?: boolean;
|
|
52
|
-
unpairedTags?: string[];
|
|
53
|
-
stopNodes?: string[];
|
|
54
|
-
tagValueProcessor?: (name: string, value: unknown) => unknown;
|
|
55
|
-
attributeValueProcessor?: (name: string, value: unknown) => unknown;
|
|
56
|
-
processEntities?: boolean;
|
|
57
|
-
oneListGroup?: boolean;
|
|
58
|
-
};
|
|
59
|
-
export {};
|