@internxt/cli 1.3.3 → 1.4.1
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 +590 -176
- package/dist/commands/add-cert.d.ts +10 -3
- package/dist/commands/add-cert.js +24 -38
- package/dist/commands/config.d.ts +15 -12
- package/dist/commands/config.js +24 -28
- package/dist/commands/create-folder.d.ts +16 -8
- package/dist/commands/create-folder.js +67 -24
- package/dist/commands/delete-permanently-file.d.ts +18 -0
- package/dist/commands/delete-permanently-file.js +63 -0
- package/dist/commands/delete-permanently-folder.d.ts +18 -0
- package/dist/commands/delete-permanently-folder.js +63 -0
- package/dist/commands/download-file.d.ts +26 -0
- package/dist/commands/{download.js → download-file.js} +98 -56
- package/dist/commands/list.d.ts +12 -12
- package/dist/commands/list.js +45 -73
- package/dist/commands/login.d.ts +11 -9
- package/dist/commands/login.js +46 -49
- package/dist/commands/logout.d.ts +7 -2
- package/dist/commands/logout.js +14 -8
- package/dist/commands/logs.d.ts +11 -2
- package/dist/commands/logs.js +16 -3
- package/dist/commands/move-file.d.ts +9 -7
- package/dist/commands/move-file.js +38 -37
- package/dist/commands/move-folder.d.ts +9 -7
- package/dist/commands/move-folder.js +38 -37
- package/dist/commands/rename-file.d.ts +24 -0
- package/dist/commands/rename-file.js +80 -0
- package/dist/commands/rename-folder.d.ts +24 -0
- package/dist/commands/rename-folder.js +80 -0
- package/dist/commands/trash-clear.d.ts +9 -5
- package/dist/commands/trash-clear.js +21 -19
- package/dist/commands/trash-file.d.ts +21 -0
- package/dist/commands/trash-file.js +58 -0
- package/dist/commands/trash-folder.d.ts +21 -0
- package/dist/commands/trash-folder.js +58 -0
- package/dist/commands/trash-list.d.ts +10 -11
- package/dist/commands/trash-list.js +33 -62
- package/dist/commands/trash-restore-file.d.ts +10 -8
- package/dist/commands/trash-restore-file.js +33 -35
- package/dist/commands/trash-restore-folder.d.ts +10 -8
- package/dist/commands/trash-restore-folder.js +33 -35
- package/dist/commands/upload-file.d.ts +21 -0
- package/dist/commands/upload-file.js +140 -0
- package/dist/commands/webdav-config.d.ts +11 -9
- package/dist/commands/webdav-config.js +40 -66
- package/dist/commands/webdav.d.ts +16 -9
- package/dist/commands/webdav.js +77 -61
- package/dist/commands/whoami.d.ts +14 -2
- package/dist/commands/whoami.js +40 -11
- package/dist/hooks/prerun/auth_check.js +6 -4
- package/dist/services/auth.service.d.ts +2 -8
- package/dist/services/auth.service.js +33 -24
- package/dist/services/config.service.d.ts +3 -3
- package/dist/services/config.service.js +8 -8
- package/dist/services/crypto.service.d.ts +1 -3
- package/dist/services/crypto.service.js +11 -36
- package/dist/services/database/drive-file/drive-file.repository.d.ts +3 -3
- package/dist/services/database/drive-folder/drive-folder.repository.d.ts +3 -3
- package/dist/services/drive/drive-file.service.d.ts +1 -8
- package/dist/services/drive/drive-file.service.js +9 -23
- package/dist/services/drive/drive-folder.service.d.ts +1 -4
- package/dist/services/drive/drive-folder.service.js +2 -5
- package/dist/services/drive/trash.service.d.ts +2 -0
- package/dist/services/drive/trash.service.js +8 -0
- package/dist/services/keys.service.js +17 -7
- package/dist/services/network/network-facade.service.d.ts +1 -3
- package/dist/services/network/network-facade.service.js +20 -13
- package/dist/services/network/upload.service.d.ts +0 -1
- package/dist/services/sdk-manager.service.d.ts +2 -3
- package/dist/services/sdk-manager.service.js +14 -12
- package/dist/services/validation.service.d.ts +10 -0
- package/dist/services/validation.service.js +40 -1
- package/dist/types/command.types.d.ts +26 -17
- package/dist/types/command.types.js +38 -24
- package/dist/types/network.types.d.ts +0 -1
- package/dist/types/webdav.types.d.ts +1 -2
- package/dist/utils/cli.utils.d.ts +28 -19
- package/dist/utils/cli.utils.js +64 -44
- package/dist/utils/errors.utils.d.ts +1 -1
- package/dist/utils/errors.utils.js +3 -3
- package/dist/utils/hash.utils.d.ts +4 -7
- package/dist/utils/hash.utils.js +6 -6
- package/dist/utils/inquirer.utils.d.ts +4 -0
- package/dist/utils/inquirer.utils.js +24 -0
- package/dist/utils/network.utils.d.ts +2 -2
- package/dist/utils/network.utils.js +10 -8
- package/dist/utils/pm2.utils.d.ts +5 -1
- package/dist/utils/pm2.utils.js +35 -3
- package/dist/utils/stream.utils.d.ts +1 -4
- package/dist/utils/webdav.utils.js +4 -4
- package/dist/utils/xml.utils.js +4 -1
- package/dist/webdav/handlers/GET.handler.js +8 -3
- package/dist/webdav/handlers/MKCOL.handler.js +2 -6
- package/dist/webdav/handlers/MOVE.handler.js +0 -3
- package/dist/webdav/handlers/PROPFIND.handler.js +2 -2
- package/dist/webdav/handlers/PUT.handler.js +14 -9
- package/dist/webdav/middewares/errors.middleware.js +1 -1
- package/dist/webdav/middewares/request-logger.middleware.d.ts +1 -2
- package/dist/webdav/middewares/request-logger.middleware.js +6 -5
- package/dist/webdav/webdav-server.js +2 -3
- package/oclif.manifest.json +517 -350
- package/package.json +42 -47
- package/dist/commands/download.d.ts +0 -19
- package/dist/commands/rename.d.ts +0 -18
- package/dist/commands/rename.js +0 -109
- package/dist/commands/trash.d.ts +0 -15
- package/dist/commands/trash.js +0 -85
- package/dist/commands/upload.d.ts +0 -15
- package/dist/commands/upload.js +0 -93
- package/dist/services/analytics.service.d.ts +0 -22
- package/dist/services/analytics.service.js +0 -20
|
@@ -1,7 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
/// <reference types="node" />
|
|
3
|
-
/// <reference types="node" />
|
|
4
|
-
import { ReadStream, WriteStream } from 'fs';
|
|
1
|
+
import { ReadStream, WriteStream } from 'node:fs';
|
|
5
2
|
import { Transform, TransformCallback } from 'node:stream';
|
|
6
3
|
export declare class StreamUtils {
|
|
7
4
|
static readStreamToReadableStream(readStream: ReadStream): ReadableStream<Uint8Array>;
|
|
@@ -4,12 +4,12 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
exports.WebDavUtils = void 0;
|
|
7
|
-
const
|
|
7
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
8
8
|
const errors_utils_1 = require("./errors.utils");
|
|
9
9
|
const logger_utils_1 = require("./logger.utils");
|
|
10
10
|
class WebDavUtils {
|
|
11
11
|
static joinURL(...pathComponents) {
|
|
12
|
-
return
|
|
12
|
+
return node_path_1.default.posix.join(...pathComponents);
|
|
13
13
|
}
|
|
14
14
|
static removeHostFromURL(completeURL) {
|
|
15
15
|
if (!completeURL.startsWith('/') && !/^https?:\/\//i.test(completeURL)) {
|
|
@@ -30,8 +30,8 @@ class WebDavUtils {
|
|
|
30
30
|
requestUrl = urlObject.url;
|
|
31
31
|
}
|
|
32
32
|
const decodedUrl = decodeURIComponent(requestUrl).replaceAll('/./', '/');
|
|
33
|
-
const parsedPath =
|
|
34
|
-
let parentPath =
|
|
33
|
+
const parsedPath = node_path_1.default.parse(decodedUrl);
|
|
34
|
+
let parentPath = node_path_1.default.dirname(decodedUrl);
|
|
35
35
|
if (!parentPath.startsWith('/'))
|
|
36
36
|
parentPath = '/'.concat(parentPath);
|
|
37
37
|
if (!parentPath.endsWith('/'))
|
package/dist/utils/xml.utils.js
CHANGED
|
@@ -14,7 +14,10 @@ class XMLUtils {
|
|
|
14
14
|
}
|
|
15
15
|
static toWebDavXML(object, options) {
|
|
16
16
|
const xmlContent = this.toXML(object, options);
|
|
17
|
-
return
|
|
17
|
+
return ('<?xml version="1.0" encoding="utf-8" ?>' +
|
|
18
|
+
`<${XMLUtils.addDefaultNamespace('multistatus')} xmlns:${XMLUtils.DEFAULT_NAMESPACE_LETTER}="DAV:">` +
|
|
19
|
+
`${xmlContent}` +
|
|
20
|
+
`</${XMLUtils.addDefaultNamespace('multistatus')}>`);
|
|
18
21
|
}
|
|
19
22
|
static addDefaultNamespace(key) {
|
|
20
23
|
return `${XMLUtils.DEFAULT_NAMESPACE_LETTER}:${key}`;
|
|
@@ -25,7 +25,7 @@ class GETRequestHandler {
|
|
|
25
25
|
logger_utils_1.webdavLogger.info(`✅ Found Drive File with uuid ${driveFile.uuid}`);
|
|
26
26
|
res.set('Content-Type', 'application/octet-stream');
|
|
27
27
|
res.set('Content-length', driveFile.size.toString());
|
|
28
|
-
const {
|
|
28
|
+
const { user } = await authService.getAuthDetails();
|
|
29
29
|
logger_utils_1.webdavLogger.info('✅ Network ready for download');
|
|
30
30
|
const writable = new WritableStream({
|
|
31
31
|
write(chunk) {
|
|
@@ -35,9 +35,14 @@ class GETRequestHandler {
|
|
|
35
35
|
res.end();
|
|
36
36
|
},
|
|
37
37
|
});
|
|
38
|
-
|
|
38
|
+
let lastLoggedProgress = 0;
|
|
39
|
+
const [executeDownload] = await networkFacade.downloadToStream(driveFile.bucket, user.mnemonic, driveFile.fileId, writable, {
|
|
39
40
|
progressCallback: (progress) => {
|
|
40
|
-
|
|
41
|
+
const percentage = Math.floor(100 * progress);
|
|
42
|
+
if (percentage >= lastLoggedProgress + 1) {
|
|
43
|
+
lastLoggedProgress = percentage;
|
|
44
|
+
logger_utils_1.webdavLogger.info(`Download progress for file ${resource.name}: ${percentage}%`);
|
|
45
|
+
}
|
|
41
46
|
},
|
|
42
47
|
});
|
|
43
48
|
logger_utils_1.webdavLogger.info('✅ Download prepared, executing...');
|
|
@@ -2,7 +2,6 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.MKCOLRequestHandler = void 0;
|
|
4
4
|
const webdav_utils_1 = require("../../utils/webdav.utils");
|
|
5
|
-
const errors_utils_1 = require("../../utils/errors.utils");
|
|
6
5
|
const logger_utils_1 = require("../../utils/logger.utils");
|
|
7
6
|
const xml_utils_1 = require("../../utils/xml.utils");
|
|
8
7
|
const async_utils_1 = require("../../utils/async.utils");
|
|
@@ -21,12 +20,9 @@ class MKCOLRequestHandler {
|
|
|
21
20
|
driveDatabaseManager,
|
|
22
21
|
driveFolderService,
|
|
23
22
|
}));
|
|
24
|
-
if (!parentFolderItem) {
|
|
25
|
-
throw new errors_utils_1.ConflictError(`Parent resource not found for parent path ${resource.parentPath}`);
|
|
26
|
-
}
|
|
27
23
|
const [createFolder] = driveFolderService.createFolder({
|
|
28
|
-
|
|
29
|
-
|
|
24
|
+
plainName: resource.name,
|
|
25
|
+
parentFolderUuid: parentFolderItem.uuid,
|
|
30
26
|
});
|
|
31
27
|
const newFolder = await createFolder;
|
|
32
28
|
logger_utils_1.webdavLogger.info(`✅ Folder created with UUID ${newFolder.uuid}`);
|
|
@@ -55,9 +55,6 @@ class MOVERequestHandler {
|
|
|
55
55
|
driveDatabaseManager,
|
|
56
56
|
driveFolderService,
|
|
57
57
|
}));
|
|
58
|
-
if (!destinationFolderItem) {
|
|
59
|
-
throw new errors_utils_1.ConflictError(`Destination folder resource not found for path ${destinationResource.parentPath}`);
|
|
60
|
-
}
|
|
61
58
|
if (resource.type === 'folder') {
|
|
62
59
|
const folder = originalDriveItem;
|
|
63
60
|
await driveFolderService.moveFolder({
|
|
@@ -6,7 +6,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
6
6
|
exports.PROPFINDRequestHandler = void 0;
|
|
7
7
|
const xml_utils_1 = require("../../utils/xml.utils");
|
|
8
8
|
const format_utils_1 = require("../../utils/format.utils");
|
|
9
|
-
const
|
|
9
|
+
const node_crypto_1 = require("node:crypto");
|
|
10
10
|
const mime_types_1 = __importDefault(require("mime-types"));
|
|
11
11
|
const webdav_utils_1 = require("../../utils/webdav.utils");
|
|
12
12
|
const logger_utils_1 = require("../../utils/logger.utils");
|
|
@@ -207,7 +207,7 @@ class PROPFINDRequestHandler {
|
|
|
207
207
|
[xml_utils_1.XMLUtils.addDefaultNamespace('status')]: 'HTTP/1.1 200 OK',
|
|
208
208
|
[xml_utils_1.XMLUtils.addDefaultNamespace('prop')]: {
|
|
209
209
|
[xml_utils_1.XMLUtils.addDefaultNamespace('resourcetype')]: '',
|
|
210
|
-
[xml_utils_1.XMLUtils.addDefaultNamespace('getetag')]: '"' + (0,
|
|
210
|
+
[xml_utils_1.XMLUtils.addDefaultNamespace('getetag')]: '"' + (0, node_crypto_1.randomUUID)().replaceAll('-', '') + '"',
|
|
211
211
|
[xml_utils_1.XMLUtils.addDefaultNamespace('displayname')]: displayName,
|
|
212
212
|
[xml_utils_1.XMLUtils.addDefaultNamespace('getcontenttype')]: mime_types_1.default.lookup(displayName) || 'application/octet-stream',
|
|
213
213
|
[xml_utils_1.XMLUtils.addDefaultNamespace('getlastmodified')]: format_utils_1.FormatUtils.formatDateForWebDav(driveFileItem.updatedAt),
|
|
@@ -5,6 +5,7 @@ const drive_file_service_1 = require("../../services/drive/drive-file.service");
|
|
|
5
5
|
const errors_utils_1 = require("../../utils/errors.utils");
|
|
6
6
|
const webdav_utils_1 = require("../../utils/webdav.utils");
|
|
7
7
|
const logger_utils_1 = require("../../utils/logger.utils");
|
|
8
|
+
const types_1 = require("@internxt/sdk/dist/drive/storage/types");
|
|
8
9
|
class PUTRequestHandler {
|
|
9
10
|
dependencies;
|
|
10
11
|
constructor(dependencies) {
|
|
@@ -24,9 +25,6 @@ class PUTRequestHandler {
|
|
|
24
25
|
driveDatabaseManager,
|
|
25
26
|
driveFolderService,
|
|
26
27
|
}));
|
|
27
|
-
if (!parentFolderItem) {
|
|
28
|
-
throw new errors_utils_1.ConflictError(`Parent resource not found for parent path ${resource.parentPath}`);
|
|
29
|
-
}
|
|
30
28
|
try {
|
|
31
29
|
const driveFileItem = (await webdav_utils_1.WebDavUtils.getAndSearchItemFromResource({
|
|
32
30
|
resource: resource,
|
|
@@ -43,21 +41,28 @@ class PUTRequestHandler {
|
|
|
43
41
|
}
|
|
44
42
|
catch {
|
|
45
43
|
}
|
|
46
|
-
const { user
|
|
47
|
-
|
|
44
|
+
const { user } = await authService.getAuthDetails();
|
|
45
|
+
let lastLoggedProgress = 0;
|
|
46
|
+
const [uploadPromise] = await networkFacade.uploadFromStream(user.bucket, user.mnemonic, contentLength, req, {
|
|
48
47
|
progressCallback: (progress) => {
|
|
49
|
-
|
|
48
|
+
const percentage = Math.floor(100 * progress);
|
|
49
|
+
if (percentage >= lastLoggedProgress + 1) {
|
|
50
|
+
lastLoggedProgress = percentage;
|
|
51
|
+
logger_utils_1.webdavLogger.info(`Upload progress for file ${resource.name}: ${percentage}%`);
|
|
52
|
+
}
|
|
50
53
|
},
|
|
51
54
|
});
|
|
52
55
|
const uploadResult = await uploadPromise;
|
|
53
56
|
logger_utils_1.webdavLogger.info('✅ File uploaded to network');
|
|
54
57
|
const file = await drive_file_service_1.DriveFileService.instance.createFile({
|
|
55
|
-
|
|
58
|
+
plain_name: resource.path.name,
|
|
56
59
|
type: resource.path.ext.replace('.', ''),
|
|
57
60
|
size: contentLength,
|
|
58
|
-
|
|
59
|
-
|
|
61
|
+
folder_id: parentFolderItem.uuid,
|
|
62
|
+
id: uploadResult.fileId,
|
|
60
63
|
bucket: user.bucket,
|
|
64
|
+
encrypt_version: types_1.EncryptionVersion.Aes03,
|
|
65
|
+
name: '',
|
|
61
66
|
});
|
|
62
67
|
logger_utils_1.webdavLogger.info('✅ File uploaded to internxt drive');
|
|
63
68
|
await driveDatabaseManager.createFile(file, resource.path.dir + '/');
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.ErrorHandlingMiddleware = void 0;
|
|
4
4
|
const logger_utils_1 = require("../../utils/logger.utils");
|
|
5
|
-
const ErrorHandlingMiddleware = (err, req, res,
|
|
5
|
+
const ErrorHandlingMiddleware = (err, req, res, _) => {
|
|
6
6
|
logger_utils_1.webdavLogger.error(`[ERROR MIDDLEWARE] [${req.method.toUpperCase()} - ${req.url}]`, err);
|
|
7
7
|
if ('statusCode' in err) {
|
|
8
8
|
res.status(err.statusCode).send({
|
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
import { RequestHandler } from 'express';
|
|
2
|
-
import { AnalyticsService } from '../../services/analytics.service';
|
|
3
2
|
type RequestLoggerConfig = {
|
|
4
3
|
enable: boolean;
|
|
5
4
|
methods?: string[];
|
|
6
5
|
};
|
|
7
|
-
export declare const RequestLoggerMiddleware: (config: RequestLoggerConfig
|
|
6
|
+
export declare const RequestLoggerMiddleware: (config: RequestLoggerConfig) => RequestHandler;
|
|
8
7
|
export {};
|
|
@@ -2,16 +2,17 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.RequestLoggerMiddleware = void 0;
|
|
4
4
|
const logger_utils_1 = require("../../utils/logger.utils");
|
|
5
|
-
const RequestLoggerMiddleware = (config
|
|
5
|
+
const RequestLoggerMiddleware = (config) => {
|
|
6
6
|
return (req, _, next) => {
|
|
7
|
-
if (req.user?.uuid) {
|
|
8
|
-
analytics.track('WebDAVRequest', { app: 'internxt-webdav', userId: req.user.uuid }, { method: req.method.toUpperCase() });
|
|
9
|
-
}
|
|
10
7
|
if (!config.enable)
|
|
11
8
|
return next();
|
|
12
9
|
if (config.methods && !config.methods.includes(req.method))
|
|
13
10
|
return next();
|
|
14
|
-
logger_utils_1.webdavLogger.info(
|
|
11
|
+
logger_utils_1.webdavLogger.info('WebDav request received\n' +
|
|
12
|
+
`Method: ${req.method}\n` +
|
|
13
|
+
`URL: ${req.url}\n` +
|
|
14
|
+
`Body: ${JSON.stringify(req.body)}\n` +
|
|
15
|
+
`Headers: ${JSON.stringify(req.headers)}`);
|
|
15
16
|
next();
|
|
16
17
|
};
|
|
17
18
|
};
|
|
@@ -26,7 +26,6 @@ const DELETE_handler_1 = require("./handlers/DELETE.handler");
|
|
|
26
26
|
const PROPPATCH_handler_1 = require("./handlers/PROPPATCH.handler");
|
|
27
27
|
const MOVE_handler_1 = require("./handlers/MOVE.handler");
|
|
28
28
|
const COPY_handler_1 = require("./handlers/COPY.handler");
|
|
29
|
-
const analytics_service_1 = require("../services/analytics.service");
|
|
30
29
|
class WebDavServer {
|
|
31
30
|
app;
|
|
32
31
|
configService;
|
|
@@ -66,7 +65,7 @@ class WebDavServer {
|
|
|
66
65
|
this.app.use((0, auth_middleware_1.AuthMiddleware)(config_service_1.ConfigService.instance));
|
|
67
66
|
this.app.use((0, request_logger_middleware_1.RequestLoggerMiddleware)({
|
|
68
67
|
enable: true,
|
|
69
|
-
}
|
|
68
|
+
}));
|
|
70
69
|
};
|
|
71
70
|
registerHandlers = async () => {
|
|
72
71
|
const networkFacade = await this.getNetworkFacade();
|
|
@@ -123,7 +122,7 @@ class WebDavServer {
|
|
|
123
122
|
server = http_1.default.createServer(this.app);
|
|
124
123
|
}
|
|
125
124
|
else {
|
|
126
|
-
const httpsCerts = network_utils_1.NetworkUtils.getWebdavSSLCerts();
|
|
125
|
+
const httpsCerts = await network_utils_1.NetworkUtils.getWebdavSSLCerts();
|
|
127
126
|
server = https_1.default.createServer(httpsCerts, this.app);
|
|
128
127
|
}
|
|
129
128
|
server.requestTimeout = 15 * 60 * 1000;
|