@internxt/cli 1.5.2 → 1.5.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/.env +2 -6
- package/README.md +46 -26
- package/bin/dev.js +1 -1
- package/bin/run.js +1 -1
- package/dist/commands/add-cert.d.ts +1 -1
- package/dist/commands/add-cert.js +23 -23
- package/dist/commands/config.js +8 -3
- package/dist/commands/create-folder.js +11 -6
- package/dist/commands/delete-permanently-file.js +9 -4
- package/dist/commands/delete-permanently-folder.js +9 -4
- package/dist/commands/download-file.js +21 -16
- package/dist/commands/list.js +8 -3
- package/dist/commands/login.js +8 -3
- package/dist/commands/logout.js +10 -3
- package/dist/commands/logs.js +8 -3
- package/dist/commands/move-file.js +8 -3
- package/dist/commands/move-folder.js +8 -3
- package/dist/commands/rename-file.js +8 -3
- package/dist/commands/rename-folder.js +8 -3
- package/dist/commands/trash-clear.js +8 -3
- package/dist/commands/trash-file.js +8 -3
- package/dist/commands/trash-folder.js +8 -3
- package/dist/commands/trash-list.js +8 -3
- package/dist/commands/trash-restore-file.js +8 -3
- package/dist/commands/trash-restore-folder.js +8 -3
- package/dist/commands/upload-file.js +17 -11
- package/dist/commands/webdav-config.js +8 -3
- package/dist/commands/webdav.js +22 -22
- package/dist/commands/whoami.js +8 -3
- package/dist/hooks/prerun/auth_check.js +13 -7
- package/dist/services/auth.service.d.ts +1 -0
- package/dist/services/auth.service.js +13 -1
- package/dist/services/crypto.service.d.ts +1 -1
- package/dist/services/crypto.service.js +2 -2
- package/dist/services/drive/drive-file.service.d.ts +1 -1
- package/dist/services/drive/drive-file.service.js +7 -7
- package/dist/services/drive/drive-folder.service.js +7 -7
- package/dist/services/drive/trash.service.d.ts +6 -4
- package/dist/services/drive/trash.service.js +6 -6
- package/dist/services/sdk-manager.service.d.ts +3 -5
- package/dist/services/sdk-manager.service.js +14 -34
- package/dist/services/thumbnail.service.d.ts +2 -2
- package/dist/services/thumbnail.service.js +6 -6
- package/dist/services/usage.service.d.ts +2 -2
- package/dist/services/usage.service.js +2 -2
- package/dist/types/config.types.d.ts +1 -4
- package/dist/utils/cli.utils.d.ts +13 -4
- package/dist/utils/cli.utils.js +44 -10
- package/dist/utils/pm2.utils.d.ts +1 -1
- package/dist/utils/thumbnail.utils.js +3 -3
- package/dist/utils/webdav.utils.d.ts +2 -3
- package/dist/utils/webdav.utils.js +6 -18
- package/dist/utils/xml.utils.d.ts +1 -1
- package/dist/utils/xml.utils.js +3 -3
- package/dist/webdav/handlers/DELETE.handler.js +5 -1
- package/dist/webdav/handlers/GET.handler.js +6 -2
- package/dist/webdav/handlers/HEAD.handler.js +7 -2
- package/dist/webdav/handlers/MKCOL.handler.js +10 -8
- package/dist/webdav/handlers/MOVE.handler.js +10 -3
- package/dist/webdav/handlers/OPTIONS.handler.js +2 -5
- package/dist/webdav/handlers/PROPFIND.handler.js +31 -21
- package/dist/webdav/handlers/PUT.handler.js +8 -4
- package/dist/webdav/index.js +1 -1
- package/dist/webdav/middewares/auth.middleware.js +10 -2
- package/dist/webdav/middewares/errors.middleware.js +8 -13
- package/dist/webdav/webdav-server.d.ts +2 -1
- package/dist/webdav/webdav-server.js +6 -3
- package/oclif.manifest.json +1 -1
- package/package.json +29 -28
- package/scripts/restart-webdav.js +2 -1
|
@@ -10,5 +10,5 @@ export declare class DriveFileService {
|
|
|
10
10
|
type?: string | null;
|
|
11
11
|
}) => Promise<void>;
|
|
12
12
|
getFileMetadataByPath: (path: string) => Promise<DriveFileItem>;
|
|
13
|
-
createThumbnail: (payload: StorageTypes.
|
|
13
|
+
createThumbnail: (payload: StorageTypes.CreateThumbnailEntryPayload) => Promise<StorageTypes.Thumbnail>;
|
|
14
14
|
}
|
|
@@ -6,7 +6,7 @@ const drive_utils_1 = require("../../utils/drive.utils");
|
|
|
6
6
|
class DriveFileService {
|
|
7
7
|
static instance = new DriveFileService();
|
|
8
8
|
createFile = async (payload) => {
|
|
9
|
-
const storageClient = sdk_manager_service_1.SdkManager.instance.getStorage(
|
|
9
|
+
const storageClient = sdk_manager_service_1.SdkManager.instance.getStorage();
|
|
10
10
|
const driveFile = await storageClient.createFileEntryByUuid(payload);
|
|
11
11
|
return {
|
|
12
12
|
name: payload.plain_name,
|
|
@@ -25,27 +25,27 @@ class DriveFileService {
|
|
|
25
25
|
};
|
|
26
26
|
};
|
|
27
27
|
getFileMetadata = async (uuid) => {
|
|
28
|
-
const storageClient = sdk_manager_service_1.SdkManager.instance.getStorage(
|
|
28
|
+
const storageClient = sdk_manager_service_1.SdkManager.instance.getStorage();
|
|
29
29
|
const [getFileMetadata] = storageClient.getFile(uuid);
|
|
30
30
|
const fileMetadata = await getFileMetadata;
|
|
31
31
|
return drive_utils_1.DriveUtils.driveFileMetaToItem(fileMetadata);
|
|
32
32
|
};
|
|
33
33
|
moveFile = (payload) => {
|
|
34
|
-
const storageClient = sdk_manager_service_1.SdkManager.instance.getStorage(
|
|
34
|
+
const storageClient = sdk_manager_service_1.SdkManager.instance.getStorage();
|
|
35
35
|
return storageClient.moveFileByUuid(payload);
|
|
36
36
|
};
|
|
37
37
|
renameFile = (fileUuid, payload) => {
|
|
38
|
-
const storageClient = sdk_manager_service_1.SdkManager.instance.getStorage(
|
|
38
|
+
const storageClient = sdk_manager_service_1.SdkManager.instance.getStorage();
|
|
39
39
|
return storageClient.updateFileMetaByUUID(fileUuid, payload);
|
|
40
40
|
};
|
|
41
41
|
getFileMetadataByPath = async (path) => {
|
|
42
|
-
const storageClient = sdk_manager_service_1.SdkManager.instance.getStorage(
|
|
42
|
+
const storageClient = sdk_manager_service_1.SdkManager.instance.getStorage();
|
|
43
43
|
const fileMetadata = await storageClient.getFileByPath(encodeURIComponent(path));
|
|
44
44
|
return drive_utils_1.DriveUtils.driveFileMetaToItem(fileMetadata);
|
|
45
45
|
};
|
|
46
46
|
createThumbnail = (payload) => {
|
|
47
|
-
const storageClient = sdk_manager_service_1.SdkManager.instance.getStorage(
|
|
48
|
-
return storageClient.
|
|
47
|
+
const storageClient = sdk_manager_service_1.SdkManager.instance.getStorage();
|
|
48
|
+
return storageClient.createThumbnailEntryWithUUID(payload);
|
|
49
49
|
};
|
|
50
50
|
}
|
|
51
51
|
exports.DriveFileService = DriveFileService;
|
|
@@ -6,17 +6,17 @@ const drive_utils_1 = require("../../utils/drive.utils");
|
|
|
6
6
|
class DriveFolderService {
|
|
7
7
|
static instance = new DriveFolderService();
|
|
8
8
|
getFolderMetaByUuid = async (uuid) => {
|
|
9
|
-
const storageClient = sdk_manager_service_1.SdkManager.instance.getStorage(
|
|
9
|
+
const storageClient = sdk_manager_service_1.SdkManager.instance.getStorage();
|
|
10
10
|
const folderMeta = await storageClient.getFolderMeta(uuid);
|
|
11
11
|
return drive_utils_1.DriveUtils.driveFolderMetaToItem(folderMeta);
|
|
12
12
|
};
|
|
13
13
|
getFolderMetaById = async (id) => {
|
|
14
|
-
const storageClient = sdk_manager_service_1.SdkManager.instance.getStorage(
|
|
14
|
+
const storageClient = sdk_manager_service_1.SdkManager.instance.getStorage();
|
|
15
15
|
const folderMeta = await storageClient.getFolderMetaById(id);
|
|
16
16
|
return drive_utils_1.DriveUtils.driveFolderMetaToItem(folderMeta);
|
|
17
17
|
};
|
|
18
18
|
getFolderContent = async (folderUuid) => {
|
|
19
|
-
const storageClient = sdk_manager_service_1.SdkManager.instance.getStorage(
|
|
19
|
+
const storageClient = sdk_manager_service_1.SdkManager.instance.getStorage();
|
|
20
20
|
const folders = await this.getAllSubfolders(storageClient, folderUuid, 0);
|
|
21
21
|
const files = await this.getAllSubfiles(storageClient, folderUuid, 0);
|
|
22
22
|
return { folders, files };
|
|
@@ -42,19 +42,19 @@ class DriveFolderService {
|
|
|
42
42
|
}
|
|
43
43
|
};
|
|
44
44
|
moveFolder = (payload) => {
|
|
45
|
-
const storageClient = sdk_manager_service_1.SdkManager.instance.getStorage(
|
|
45
|
+
const storageClient = sdk_manager_service_1.SdkManager.instance.getStorage();
|
|
46
46
|
return storageClient.moveFolderByUuid(payload);
|
|
47
47
|
};
|
|
48
48
|
createFolder(payload) {
|
|
49
|
-
const storageClient = sdk_manager_service_1.SdkManager.instance.getStorage(
|
|
49
|
+
const storageClient = sdk_manager_service_1.SdkManager.instance.getStorage();
|
|
50
50
|
return storageClient.createFolderByUuid(payload);
|
|
51
51
|
}
|
|
52
52
|
renameFolder = (payload) => {
|
|
53
|
-
const storageClient = sdk_manager_service_1.SdkManager.instance.getStorage(
|
|
53
|
+
const storageClient = sdk_manager_service_1.SdkManager.instance.getStorage();
|
|
54
54
|
return storageClient.updateFolderNameWithUUID(payload);
|
|
55
55
|
};
|
|
56
56
|
getFolderMetadataByPath = async (path) => {
|
|
57
|
-
const storageClient = sdk_manager_service_1.SdkManager.instance.getStorage(
|
|
57
|
+
const storageClient = sdk_manager_service_1.SdkManager.instance.getStorage();
|
|
58
58
|
const folderMeta = await storageClient.getFolderByPath(encodeURIComponent(path));
|
|
59
59
|
return drive_utils_1.DriveUtils.driveFolderMetaToItem({
|
|
60
60
|
...folderMeta,
|
|
@@ -2,13 +2,15 @@ import { StorageTypes } from '@internxt/sdk/dist/drive';
|
|
|
2
2
|
export declare class TrashService {
|
|
3
3
|
static readonly instance: TrashService;
|
|
4
4
|
trashItems: (payload: StorageTypes.AddItemsToTrashPayload) => Promise<void>;
|
|
5
|
-
deleteFile: (
|
|
6
|
-
|
|
5
|
+
deleteFile: (fileId: string) => Promise<{
|
|
6
|
+
deleted: boolean;
|
|
7
|
+
}>;
|
|
8
|
+
deleteFolder: (folderId: string) => Promise<void>;
|
|
7
9
|
clearTrash: () => Promise<void>;
|
|
8
10
|
getTrashFolderContent: () => Promise<{
|
|
9
11
|
folders: StorageTypes.FetchPaginatedFolder[];
|
|
10
12
|
files: StorageTypes.FetchPaginatedFile[];
|
|
11
13
|
}>;
|
|
12
|
-
private getAllTrashSubfolders;
|
|
13
|
-
private getAllTrashSubfiles;
|
|
14
|
+
private readonly getAllTrashSubfolders;
|
|
15
|
+
private readonly getAllTrashSubfiles;
|
|
14
16
|
}
|
|
@@ -5,16 +5,16 @@ const sdk_manager_service_1 = require("../sdk-manager.service");
|
|
|
5
5
|
class TrashService {
|
|
6
6
|
static instance = new TrashService();
|
|
7
7
|
trashItems = (payload) => {
|
|
8
|
-
const storageClient = sdk_manager_service_1.SdkManager.instance.getStorage(
|
|
8
|
+
const storageClient = sdk_manager_service_1.SdkManager.instance.getStorage();
|
|
9
9
|
return storageClient.addItemsToTrash(payload);
|
|
10
10
|
};
|
|
11
|
-
deleteFile = (
|
|
12
|
-
const storageClient = sdk_manager_service_1.SdkManager.instance.getStorage(
|
|
13
|
-
return storageClient.
|
|
11
|
+
deleteFile = (fileId) => {
|
|
12
|
+
const storageClient = sdk_manager_service_1.SdkManager.instance.getStorage();
|
|
13
|
+
return storageClient.deleteFileByUuid(fileId);
|
|
14
14
|
};
|
|
15
15
|
deleteFolder = (folderId) => {
|
|
16
|
-
const storageClient = sdk_manager_service_1.SdkManager.instance.getStorage(
|
|
17
|
-
return storageClient.
|
|
16
|
+
const storageClient = sdk_manager_service_1.SdkManager.instance.getStorage();
|
|
17
|
+
return storageClient.deleteFolderByUuid(folderId);
|
|
18
18
|
};
|
|
19
19
|
clearTrash = () => {
|
|
20
20
|
const storageClient = sdk_manager_service_1.SdkManager.instance.getTrash();
|
|
@@ -12,11 +12,9 @@ export declare class SdkManager {
|
|
|
12
12
|
throwErrorOnMissingCredentials: boolean;
|
|
13
13
|
}) => SdkManagerApiSecurity;
|
|
14
14
|
static readonly getAppDetails: () => AppDetails;
|
|
15
|
-
getAuth(
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
getReferrals(): Drive.Referrals;
|
|
19
|
-
getStorage(useNewApi?: boolean): Drive.Storage;
|
|
15
|
+
getAuth(): Auth;
|
|
16
|
+
getUsers(): Drive.Users;
|
|
17
|
+
getStorage(): Drive.Storage;
|
|
20
18
|
getTrash(): Drive.Trash;
|
|
21
19
|
getShare(): Drive.Share;
|
|
22
20
|
getNetwork(credentials: {
|
|
@@ -25,68 +25,48 @@ class SdkManager {
|
|
|
25
25
|
};
|
|
26
26
|
static getAppDetails = () => {
|
|
27
27
|
return {
|
|
28
|
-
clientName: package_json_1.default.
|
|
28
|
+
clientName: package_json_1.default.clientName,
|
|
29
29
|
clientVersion: package_json_1.default.version,
|
|
30
30
|
};
|
|
31
31
|
};
|
|
32
|
-
getAuth(
|
|
33
|
-
const DRIVE_API_URL =
|
|
34
|
-
? config_service_1.ConfigService.instance.get('DRIVE_NEW_API_URL')
|
|
35
|
-
: config_service_1.ConfigService.instance.get('DRIVE_API_URL');
|
|
32
|
+
getAuth() {
|
|
33
|
+
const DRIVE_API_URL = config_service_1.ConfigService.instance.get('DRIVE_NEW_API_URL');
|
|
36
34
|
const apiSecurity = SdkManager.getApiSecurity({ throwErrorOnMissingCredentials: false });
|
|
37
35
|
const appDetails = SdkManager.getAppDetails();
|
|
38
36
|
return sdk_1.Auth.client(DRIVE_API_URL, appDetails, {
|
|
39
|
-
token:
|
|
37
|
+
token: apiSecurity?.newToken,
|
|
40
38
|
});
|
|
41
39
|
}
|
|
42
|
-
|
|
43
|
-
const
|
|
44
|
-
const newToken = SdkManager.getApiSecurity().newToken;
|
|
45
|
-
const appDetails = SdkManager.getAppDetails();
|
|
46
|
-
return sdk_1.Drive.Payments.client(PAYMENTS_API_URL, appDetails, {
|
|
47
|
-
token: newToken,
|
|
48
|
-
});
|
|
49
|
-
}
|
|
50
|
-
getUsers(useNewApi = false) {
|
|
51
|
-
const DRIVE_API_URL = useNewApi
|
|
52
|
-
? config_service_1.ConfigService.instance.get('DRIVE_NEW_API_URL')
|
|
53
|
-
: config_service_1.ConfigService.instance.get('DRIVE_API_URL');
|
|
40
|
+
getUsers() {
|
|
41
|
+
const DRIVE_API_URL = config_service_1.ConfigService.instance.get('DRIVE_NEW_API_URL');
|
|
54
42
|
const apiSecurity = SdkManager.getApiSecurity({ throwErrorOnMissingCredentials: false });
|
|
55
43
|
const appDetails = SdkManager.getAppDetails();
|
|
56
44
|
return sdk_1.Drive.Users.client(DRIVE_API_URL, appDetails, {
|
|
57
|
-
token:
|
|
45
|
+
token: apiSecurity.newToken,
|
|
58
46
|
});
|
|
59
47
|
}
|
|
60
|
-
|
|
61
|
-
const DRIVE_API_URL = config_service_1.ConfigService.instance.get('
|
|
62
|
-
const apiSecurity = SdkManager.getApiSecurity();
|
|
63
|
-
const appDetails = SdkManager.getAppDetails();
|
|
64
|
-
return sdk_1.Drive.Referrals.client(DRIVE_API_URL, appDetails, apiSecurity);
|
|
65
|
-
}
|
|
66
|
-
getStorage(useNewApi = false) {
|
|
67
|
-
const DRIVE_API_URL = useNewApi
|
|
68
|
-
? config_service_1.ConfigService.instance.get('DRIVE_NEW_API_URL')
|
|
69
|
-
: config_service_1.ConfigService.instance.get('DRIVE_API_URL');
|
|
48
|
+
getStorage() {
|
|
49
|
+
const DRIVE_API_URL = config_service_1.ConfigService.instance.get('DRIVE_NEW_API_URL');
|
|
70
50
|
const apiSecurity = SdkManager.getApiSecurity();
|
|
71
51
|
const appDetails = SdkManager.getAppDetails();
|
|
72
52
|
return sdk_1.Drive.Storage.client(DRIVE_API_URL, appDetails, {
|
|
73
|
-
token:
|
|
53
|
+
token: apiSecurity.newToken,
|
|
74
54
|
});
|
|
75
55
|
}
|
|
76
56
|
getTrash() {
|
|
77
57
|
const DRIVE_NEW_API_URL = config_service_1.ConfigService.instance.get('DRIVE_NEW_API_URL');
|
|
78
|
-
const
|
|
58
|
+
const apiSecurity = SdkManager.getApiSecurity();
|
|
79
59
|
const appDetails = SdkManager.getAppDetails();
|
|
80
60
|
return drive_1.Trash.client(DRIVE_NEW_API_URL, appDetails, {
|
|
81
|
-
token: newToken,
|
|
61
|
+
token: apiSecurity.newToken,
|
|
82
62
|
});
|
|
83
63
|
}
|
|
84
64
|
getShare() {
|
|
85
65
|
const DRIVE_NEW_API_URL = config_service_1.ConfigService.instance.get('DRIVE_NEW_API_URL');
|
|
86
|
-
const
|
|
66
|
+
const apiSecurity = SdkManager.getApiSecurity();
|
|
87
67
|
const appDetails = SdkManager.getAppDetails();
|
|
88
68
|
return sdk_1.Drive.Share.client(DRIVE_NEW_API_URL, appDetails, {
|
|
89
|
-
token: newToken,
|
|
69
|
+
token: apiSecurity.newToken,
|
|
90
70
|
});
|
|
91
71
|
}
|
|
92
72
|
getNetwork(credentials) {
|
|
@@ -2,6 +2,6 @@ import { StorageTypes } from '@internxt/sdk/dist/drive';
|
|
|
2
2
|
import { NetworkFacade } from './network/network-facade.service';
|
|
3
3
|
export declare class ThumbnailService {
|
|
4
4
|
static readonly instance: ThumbnailService;
|
|
5
|
-
uploadThumbnail: (fileContent: Buffer, fileType: string, userBucket: string, file_id:
|
|
6
|
-
private getThumbnailFromImageBuffer;
|
|
5
|
+
uploadThumbnail: (fileContent: Buffer, fileType: string, userBucket: string, file_id: string, networkFacade: NetworkFacade) => Promise<StorageTypes.Thumbnail | undefined>;
|
|
6
|
+
private readonly getThumbnailFromImageBuffer;
|
|
7
7
|
}
|
|
@@ -27,14 +27,14 @@ class ThumbnailService {
|
|
|
27
27
|
}, () => { });
|
|
28
28
|
});
|
|
29
29
|
const createdThumbnailFile = await drive_file_service_1.DriveFileService.instance.createThumbnail({
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
30
|
+
fileUuid: file_id,
|
|
31
|
+
maxWidth: thumbnail_utils_1.ThumbnailConfig.MaxWidth,
|
|
32
|
+
maxHeight: thumbnail_utils_1.ThumbnailConfig.MaxHeight,
|
|
33
33
|
type: thumbnail_utils_1.ThumbnailConfig.Type,
|
|
34
34
|
size: size,
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
35
|
+
bucketId: userBucket,
|
|
36
|
+
bucketFile: fileId,
|
|
37
|
+
encryptVersion: drive_1.StorageTypes.EncryptionVersion.Aes03,
|
|
38
38
|
});
|
|
39
39
|
return createdThumbnailFile;
|
|
40
40
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { UsageResponseV2 } from '@internxt/sdk/dist/drive/storage/types';
|
|
2
2
|
export declare class UsageService {
|
|
3
3
|
static readonly instance: UsageService;
|
|
4
4
|
static readonly INFINITE_LIMIT: number;
|
|
5
|
-
fetchUsage: () => Promise<
|
|
5
|
+
fetchUsage: () => Promise<UsageResponseV2>;
|
|
6
6
|
fetchSpaceLimit: () => Promise<number>;
|
|
7
7
|
}
|
|
@@ -7,12 +7,12 @@ class UsageService {
|
|
|
7
7
|
static INFINITE_LIMIT = 99 * Math.pow(1024, 4);
|
|
8
8
|
fetchUsage = async () => {
|
|
9
9
|
const storageClient = sdk_manager_service_1.SdkManager.instance.getStorage();
|
|
10
|
-
const driveUsage = await storageClient.
|
|
10
|
+
const driveUsage = await storageClient.spaceUsageV2();
|
|
11
11
|
return driveUsage;
|
|
12
12
|
};
|
|
13
13
|
fetchSpaceLimit = async () => {
|
|
14
14
|
const storageClient = sdk_manager_service_1.SdkManager.instance.getStorage();
|
|
15
|
-
const spaceLimit = await storageClient.
|
|
15
|
+
const spaceLimit = await storageClient.spaceLimitV2();
|
|
16
16
|
return spaceLimit.maxSpaceBytes;
|
|
17
17
|
};
|
|
18
18
|
}
|
|
@@ -1,10 +1,7 @@
|
|
|
1
1
|
export interface ConfigKeys {
|
|
2
|
-
readonly
|
|
3
|
-
readonly DRIVE_API_URL: string;
|
|
2
|
+
readonly DRIVE_WEB_URL: string;
|
|
4
3
|
readonly DRIVE_NEW_API_URL: string;
|
|
5
|
-
readonly PAYMENTS_API_URL: string;
|
|
6
4
|
readonly APP_CRYPTO_SECRET: string;
|
|
7
|
-
readonly APP_CRYPTO_SECRET2: string;
|
|
8
5
|
readonly APP_MAGIC_IV: string;
|
|
9
6
|
readonly APP_MAGIC_SALT: string;
|
|
10
7
|
readonly NETWORK_URL: string;
|
|
@@ -2,14 +2,16 @@ import cliProgress from 'cli-progress';
|
|
|
2
2
|
import { Header } from 'tty-table';
|
|
3
3
|
import { PromptOptions } from '../types/command.types';
|
|
4
4
|
export declare class CLIUtils {
|
|
5
|
-
static readonly clearPreviousLine: () => void;
|
|
5
|
+
static readonly clearPreviousLine: (jsonFlag?: boolean) => void;
|
|
6
6
|
static readonly warning: (reporter: (message: string) => void, message: string) => void;
|
|
7
7
|
static readonly error: (reporter: (message: string) => void, message: string) => void;
|
|
8
|
-
static readonly doing: (message: string) => void;
|
|
9
8
|
static readonly success: (reporter: (message: string) => void, message: string) => void;
|
|
10
9
|
static readonly log: (reporter: (message: string) => void, message: string) => void;
|
|
11
|
-
static readonly
|
|
12
|
-
static readonly
|
|
10
|
+
static readonly consoleLog: (message: string) => void;
|
|
11
|
+
static readonly doing: (message: string, jsonFlag?: boolean) => void;
|
|
12
|
+
static readonly done: (jsonFlag?: boolean) => void;
|
|
13
|
+
static readonly failed: (jsonFlag?: boolean) => void;
|
|
14
|
+
static readonly progress: (opts: cliProgress.Options, jsonFlag?: boolean) => cliProgress.SingleBar | undefined;
|
|
13
15
|
static readonly table: (reporter: (message: string) => void, header: Header[], rows: object[]) => void;
|
|
14
16
|
static readonly generateTableHeaderFromType: <T extends object>() => Header[];
|
|
15
17
|
static readonly CommonFlags: {
|
|
@@ -34,6 +36,13 @@ export declare class CLIUtils {
|
|
|
34
36
|
static readonly timer: () => {
|
|
35
37
|
stop: () => number;
|
|
36
38
|
};
|
|
39
|
+
static readonly catchError: ({ error, logReporter, errorReporter, command, jsonFlag, }: {
|
|
40
|
+
error: Error;
|
|
41
|
+
command?: string;
|
|
42
|
+
logReporter: (message: string) => void;
|
|
43
|
+
errorReporter: (message: string) => void;
|
|
44
|
+
jsonFlag?: boolean;
|
|
45
|
+
}) => void;
|
|
37
46
|
static readonly parseEmpty: (input: string) => Promise<string>;
|
|
38
47
|
}
|
|
39
48
|
export declare class NoFlagProvidedError extends Error {
|
package/dist/utils/cli.utils.js
CHANGED
|
@@ -8,10 +8,13 @@ const core_1 = require("@oclif/core");
|
|
|
8
8
|
const cli_progress_1 = __importDefault(require("cli-progress"));
|
|
9
9
|
const tty_table_1 = __importDefault(require("tty-table"));
|
|
10
10
|
const inquirer_utils_1 = require("./inquirer.utils");
|
|
11
|
+
const errors_utils_1 = require("./errors.utils");
|
|
11
12
|
class CLIUtils {
|
|
12
|
-
static clearPreviousLine = () => {
|
|
13
|
-
|
|
14
|
-
|
|
13
|
+
static clearPreviousLine = (jsonFlag) => {
|
|
14
|
+
if (!jsonFlag) {
|
|
15
|
+
process.stdout?.write?.('\x1b[1A');
|
|
16
|
+
process.stdout?.clearLine?.(0);
|
|
17
|
+
}
|
|
15
18
|
};
|
|
16
19
|
static warning = (reporter, message) => {
|
|
17
20
|
reporter(core_1.ux.colorize('#a67805', `⚠ Warning: ${message}`));
|
|
@@ -19,20 +22,34 @@ class CLIUtils {
|
|
|
19
22
|
static error = (reporter, message) => {
|
|
20
23
|
reporter(core_1.ux.colorize('red', `⚠ Error: ${message}`));
|
|
21
24
|
};
|
|
22
|
-
static doing = (message) => {
|
|
23
|
-
core_1.ux.action.start(message, undefined, {});
|
|
24
|
-
};
|
|
25
25
|
static success = (reporter, message) => {
|
|
26
26
|
reporter(core_1.ux.colorize('green', `✓ ${message}`));
|
|
27
27
|
};
|
|
28
28
|
static log = (reporter, message) => {
|
|
29
29
|
reporter(`${message}`);
|
|
30
30
|
};
|
|
31
|
-
static
|
|
32
|
-
|
|
31
|
+
static consoleLog = (message) => {
|
|
32
|
+
console.log(message);
|
|
33
|
+
};
|
|
34
|
+
static doing = (message, jsonFlag) => {
|
|
35
|
+
if (!jsonFlag) {
|
|
36
|
+
core_1.ux.action.start(message, undefined, {});
|
|
37
|
+
}
|
|
38
|
+
};
|
|
39
|
+
static done = (jsonFlag) => {
|
|
40
|
+
if (!jsonFlag && core_1.ux.action.running) {
|
|
41
|
+
core_1.ux.action.stop(core_1.ux.colorize('green', 'done ✓'));
|
|
42
|
+
}
|
|
43
|
+
};
|
|
44
|
+
static failed = (jsonFlag) => {
|
|
45
|
+
if (!jsonFlag && core_1.ux.action.running) {
|
|
46
|
+
core_1.ux.action.stop(core_1.ux.colorize('red', 'failed ✕'));
|
|
47
|
+
}
|
|
33
48
|
};
|
|
34
|
-
static progress = (opts) => {
|
|
35
|
-
|
|
49
|
+
static progress = (opts, jsonFlag) => {
|
|
50
|
+
if (!jsonFlag) {
|
|
51
|
+
return new cli_progress_1.default.SingleBar({ noTTYOutput: Boolean(!process.stdin.isTTY), ...opts }, cli_progress_1.default.Presets.shades_classic);
|
|
52
|
+
}
|
|
36
53
|
};
|
|
37
54
|
static table = (reporter, header, rows) => {
|
|
38
55
|
const table = (0, tty_table_1.default)(header, rows);
|
|
@@ -113,6 +130,23 @@ class CLIUtils {
|
|
|
113
130
|
},
|
|
114
131
|
};
|
|
115
132
|
};
|
|
133
|
+
static catchError = ({ error, logReporter, errorReporter, command, jsonFlag, }) => {
|
|
134
|
+
let message;
|
|
135
|
+
if ('message' in error && error.message.trim().length > 0) {
|
|
136
|
+
message = error.message;
|
|
137
|
+
}
|
|
138
|
+
else {
|
|
139
|
+
message = JSON.stringify(error);
|
|
140
|
+
}
|
|
141
|
+
CLIUtils.failed(jsonFlag);
|
|
142
|
+
if (jsonFlag) {
|
|
143
|
+
CLIUtils.consoleLog(JSON.stringify({ success: false, message }));
|
|
144
|
+
}
|
|
145
|
+
else {
|
|
146
|
+
errors_utils_1.ErrorUtils.report(errorReporter, error, { command });
|
|
147
|
+
CLIUtils.error(logReporter, message);
|
|
148
|
+
}
|
|
149
|
+
};
|
|
116
150
|
static parseEmpty = async (input) => (input.trim().length === 0 ? ' ' : input);
|
|
117
151
|
}
|
|
118
152
|
exports.CLIUtils = CLIUtils;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import pm2 from 'pm2';
|
|
2
2
|
export type WebDavProcessStatus = 'online' | 'stopping' | 'stopped' | 'launching' | 'errored' | 'one-launch-status' | 'offline' | 'unknown';
|
|
3
3
|
export declare class PM2Utils {
|
|
4
|
-
private static WEBDAV_APP_NAME;
|
|
4
|
+
private static readonly WEBDAV_APP_NAME;
|
|
5
5
|
static connect(): Promise<void>;
|
|
6
6
|
static disconnect(): void;
|
|
7
7
|
static clean(): Promise<void>;
|
|
@@ -31,14 +31,14 @@ const thumbnailableImageExtension = [
|
|
|
31
31
|
const thumbnailablePdfExtension = pdfExtensions['pdf'];
|
|
32
32
|
const thumbnailableExtension = [...thumbnailableImageExtension];
|
|
33
33
|
const isFileThumbnailable = (fileType) => {
|
|
34
|
-
return fileType.trim().length > 0 && thumbnailableExtension.includes(fileType);
|
|
34
|
+
return fileType.trim().length > 0 && thumbnailableExtension.includes(fileType.trim().toLowerCase());
|
|
35
35
|
};
|
|
36
36
|
exports.isFileThumbnailable = isFileThumbnailable;
|
|
37
37
|
const isPDFThumbnailable = (fileType) => {
|
|
38
|
-
return fileType.trim().length > 0 && thumbnailablePdfExtension.includes(fileType);
|
|
38
|
+
return fileType.trim().length > 0 && thumbnailablePdfExtension.includes(fileType.trim().toLowerCase());
|
|
39
39
|
};
|
|
40
40
|
exports.isPDFThumbnailable = isPDFThumbnailable;
|
|
41
41
|
const isImageThumbnailable = (fileType) => {
|
|
42
|
-
return fileType.trim().length > 0 && thumbnailableImageExtension.includes(fileType);
|
|
42
|
+
return fileType.trim().length > 0 && thumbnailableImageExtension.includes(fileType.trim().toLowerCase());
|
|
43
43
|
};
|
|
44
44
|
exports.isImageThumbnailable = isImageThumbnailable;
|
|
@@ -7,10 +7,9 @@ export declare class WebDavUtils {
|
|
|
7
7
|
static joinURL(...pathComponents: string[]): string;
|
|
8
8
|
static removeHostFromURL(completeURL: string): string;
|
|
9
9
|
static getRequestedResource(urlObject: string | Request, decodeUri?: boolean): Promise<WebDavRequestedResource>;
|
|
10
|
-
static getDriveItemFromResource(resource
|
|
11
|
-
static getAndSearchItemFromResource({ resource, driveFolderService, driveFileService, }: {
|
|
10
|
+
static getDriveItemFromResource({ resource, driveFolderService, driveFileService, }: {
|
|
12
11
|
resource: WebDavRequestedResource;
|
|
13
12
|
driveFolderService?: DriveFolderService;
|
|
14
13
|
driveFileService?: DriveFileService;
|
|
15
|
-
}): Promise<DriveFileItem | DriveFolderItem>;
|
|
14
|
+
}): Promise<DriveFileItem | DriveFolderItem | undefined>;
|
|
16
15
|
}
|
|
@@ -5,7 +5,6 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
exports.WebDavUtils = void 0;
|
|
7
7
|
const node_path_1 = __importDefault(require("node:path"));
|
|
8
|
-
const errors_utils_1 = require("./errors.utils");
|
|
9
8
|
class WebDavUtils {
|
|
10
9
|
static joinURL(...pathComponents) {
|
|
11
10
|
return node_path_1.default.posix.join(...pathComponents);
|
|
@@ -55,30 +54,19 @@ class WebDavUtils {
|
|
|
55
54
|
};
|
|
56
55
|
}
|
|
57
56
|
}
|
|
58
|
-
static async getDriveItemFromResource(resource, driveFolderService, driveFileService) {
|
|
57
|
+
static async getDriveItemFromResource({ resource, driveFolderService, driveFileService, }) {
|
|
59
58
|
let item = undefined;
|
|
60
|
-
|
|
61
|
-
|
|
59
|
+
try {
|
|
60
|
+
if (resource.type === 'folder') {
|
|
62
61
|
item = await driveFolderService?.getFolderMetadataByPath(resource.url);
|
|
63
62
|
}
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
throw new errors_utils_1.ConflictError(`Resource not found on Internxt Drive at ${resource.url}`);
|
|
67
|
-
}
|
|
68
|
-
throw error;
|
|
63
|
+
if (resource.type === 'file') {
|
|
64
|
+
item = await driveFileService?.getFileMetadataByPath(resource.url);
|
|
69
65
|
}
|
|
70
66
|
}
|
|
71
|
-
|
|
72
|
-
item = await driveFileService?.getFileMetadataByPath(resource.url);
|
|
67
|
+
catch {
|
|
73
68
|
}
|
|
74
69
|
return item;
|
|
75
70
|
}
|
|
76
|
-
static async getAndSearchItemFromResource({ resource, driveFolderService, driveFileService, }) {
|
|
77
|
-
const driveItem = await this.getDriveItemFromResource(resource, driveFolderService, driveFileService);
|
|
78
|
-
if (!driveItem) {
|
|
79
|
-
throw new errors_utils_1.NotFoundError(`Resource not found on Internxt Drive at ${resource.url}`);
|
|
80
|
-
}
|
|
81
|
-
return driveItem;
|
|
82
|
-
}
|
|
83
71
|
}
|
|
84
72
|
exports.WebDavUtils = WebDavUtils;
|
|
@@ -3,7 +3,7 @@ export declare class XMLUtils {
|
|
|
3
3
|
static readonly DEFAULT_NAMESPACE_LETTER = "D";
|
|
4
4
|
static toJSON(xml: string, options?: X2jOptions): any;
|
|
5
5
|
static toXML(object: object, options?: XmlBuilderOptions): string;
|
|
6
|
-
static toWebDavXML(object: object, options: XmlBuilderOptions): string;
|
|
6
|
+
static toWebDavXML(object: object, options: XmlBuilderOptions, rootObject?: string): string;
|
|
7
7
|
static addDefaultNamespace(key: string): string;
|
|
8
8
|
static encodeWebDavUri(uri: string): string;
|
|
9
9
|
}
|
package/dist/utils/xml.utils.js
CHANGED
|
@@ -12,12 +12,12 @@ class XMLUtils {
|
|
|
12
12
|
const builder = new fast_xml_parser_1.XMLBuilder(options);
|
|
13
13
|
return builder.build(object);
|
|
14
14
|
}
|
|
15
|
-
static toWebDavXML(object, options) {
|
|
15
|
+
static toWebDavXML(object, options, rootObject = 'multistatus') {
|
|
16
16
|
const xmlContent = this.toXML(object, options);
|
|
17
17
|
return ('<?xml version="1.0" encoding="utf-8" ?>' +
|
|
18
|
-
`<${XMLUtils.addDefaultNamespace(
|
|
18
|
+
`<${XMLUtils.addDefaultNamespace(rootObject)} xmlns:${XMLUtils.DEFAULT_NAMESPACE_LETTER}="DAV:">` +
|
|
19
19
|
`${xmlContent}` +
|
|
20
|
-
`</${XMLUtils.addDefaultNamespace(
|
|
20
|
+
`</${XMLUtils.addDefaultNamespace(rootObject)}>`);
|
|
21
21
|
}
|
|
22
22
|
static addDefaultNamespace(key) {
|
|
23
23
|
return `${XMLUtils.DEFAULT_NAMESPACE_LETTER}:${key}`;
|
|
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.DELETERequestHandler = void 0;
|
|
4
4
|
const webdav_utils_1 = require("../../utils/webdav.utils");
|
|
5
5
|
const logger_utils_1 = require("../../utils/logger.utils");
|
|
6
|
+
const errors_utils_1 = require("../../utils/errors.utils");
|
|
6
7
|
class DELETERequestHandler {
|
|
7
8
|
dependencies;
|
|
8
9
|
constructor(dependencies) {
|
|
@@ -12,11 +13,14 @@ class DELETERequestHandler {
|
|
|
12
13
|
const { driveFileService, driveFolderService, trashService } = this.dependencies;
|
|
13
14
|
const resource = await webdav_utils_1.WebDavUtils.getRequestedResource(req);
|
|
14
15
|
logger_utils_1.webdavLogger.info(`[DELETE] Request received for ${resource.type} at ${resource.url}`);
|
|
15
|
-
const driveItem = await webdav_utils_1.WebDavUtils.
|
|
16
|
+
const driveItem = await webdav_utils_1.WebDavUtils.getDriveItemFromResource({
|
|
16
17
|
resource,
|
|
17
18
|
driveFolderService,
|
|
18
19
|
driveFileService: driveFileService,
|
|
19
20
|
});
|
|
21
|
+
if (!driveItem) {
|
|
22
|
+
throw new errors_utils_1.NotFoundError(`Resource not found on Internxt Drive at ${resource.url}`);
|
|
23
|
+
}
|
|
20
24
|
logger_utils_1.webdavLogger.info(`[DELETE] [${driveItem.uuid}] Trashing ${resource.type}`);
|
|
21
25
|
await trashService.trashItems({
|
|
22
26
|
items: [{ type: resource.type, uuid: driveItem.uuid }],
|
|
@@ -18,10 +18,14 @@ class GETRequestHandler {
|
|
|
18
18
|
if (resource.type === 'folder')
|
|
19
19
|
throw new errors_utils_1.NotFoundError('Folders cannot be listed with GET. Use PROPFIND instead.');
|
|
20
20
|
logger_utils_1.webdavLogger.info(`[GET] Request received for ${resource.type} at ${resource.url}`);
|
|
21
|
-
const
|
|
21
|
+
const driveItem = await webdav_utils_1.WebDavUtils.getDriveItemFromResource({
|
|
22
22
|
resource,
|
|
23
23
|
driveFileService,
|
|
24
|
-
})
|
|
24
|
+
});
|
|
25
|
+
if (!driveItem) {
|
|
26
|
+
throw new errors_utils_1.NotFoundError(`Resource not found on Internxt Drive at ${resource.url}`);
|
|
27
|
+
}
|
|
28
|
+
const driveFile = driveItem;
|
|
25
29
|
logger_utils_1.webdavLogger.info(`[GET] [${driveFile.uuid}] Found Drive File`);
|
|
26
30
|
const { user } = await authService.getAuthDetails();
|
|
27
31
|
logger_utils_1.webdavLogger.info(`[GET] [${driveFile.uuid}] Network ready for download`);
|
|
@@ -4,6 +4,7 @@ exports.HEADRequestHandler = void 0;
|
|
|
4
4
|
const webdav_utils_1 = require("../../utils/webdav.utils");
|
|
5
5
|
const logger_utils_1 = require("../../utils/logger.utils");
|
|
6
6
|
const network_utils_1 = require("../../utils/network.utils");
|
|
7
|
+
const errors_utils_1 = require("../../utils/errors.utils");
|
|
7
8
|
class HEADRequestHandler {
|
|
8
9
|
dependencies;
|
|
9
10
|
constructor(dependencies) {
|
|
@@ -18,10 +19,14 @@ class HEADRequestHandler {
|
|
|
18
19
|
}
|
|
19
20
|
logger_utils_1.webdavLogger.info(`[HEAD] Request received for ${resource.type} at ${resource.url}`);
|
|
20
21
|
try {
|
|
21
|
-
const
|
|
22
|
+
const driveItem = await webdav_utils_1.WebDavUtils.getDriveItemFromResource({
|
|
22
23
|
resource,
|
|
23
24
|
driveFileService,
|
|
24
|
-
})
|
|
25
|
+
});
|
|
26
|
+
if (!driveItem) {
|
|
27
|
+
throw new errors_utils_1.NotFoundError(`Resource not found on Internxt Drive at ${resource.url}`);
|
|
28
|
+
}
|
|
29
|
+
const driveFile = driveItem;
|
|
25
30
|
logger_utils_1.webdavLogger.info(`[HEAD] [${driveFile.uuid}] Found Drive File`);
|
|
26
31
|
const range = req.headers['range'];
|
|
27
32
|
const rangeOptions = network_utils_1.NetworkUtils.parseRangeHeader({
|