@internxt/cli 1.6.6 → 1.6.8
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 +36 -231
- package/dist/commands/create-folder.js +2 -6
- package/dist/commands/delete-permanently-file.js +1 -1
- package/dist/commands/delete-permanently-folder.js +1 -1
- package/dist/commands/download-file.js +3 -3
- package/dist/commands/list.d.ts +2 -0
- package/dist/commands/list.js +6 -4
- package/dist/commands/login.d.ts +0 -1
- package/dist/commands/login.js +1 -11
- package/dist/commands/move-file.d.ts +1 -0
- package/dist/commands/move-file.js +1 -1
- package/dist/commands/move-folder.js +1 -1
- package/dist/commands/rename-file.js +1 -1
- package/dist/commands/rename-folder.js +1 -1
- package/dist/commands/trash-file.js +1 -1
- package/dist/commands/trash-folder.js +1 -1
- package/dist/commands/trash-list.d.ts +2 -0
- package/dist/commands/trash-list.js +5 -3
- package/dist/commands/trash-restore-file.d.ts +1 -0
- package/dist/commands/trash-restore-file.js +1 -1
- package/dist/commands/trash-restore-folder.js +1 -1
- package/dist/commands/upload-file.d.ts +1 -0
- package/dist/commands/upload-file.js +22 -13
- package/dist/commands/whoami.js +6 -3
- package/dist/hooks/prerun/auth_check.js +2 -2
- package/dist/services/auth.service.d.ts +3 -3
- package/dist/services/auth.service.js +35 -44
- package/dist/services/crypto.service.d.ts +0 -4
- package/dist/services/crypto.service.js +1 -32
- package/dist/services/database/drive-item/drive-item.model.js +1 -0
- package/dist/services/database/drive-item/drive-item.repository.js +12 -2
- package/dist/services/drive/drive-file.service.d.ts +2 -0
- package/dist/services/drive/drive-file.service.js +48 -18
- package/dist/services/drive/drive-folder.service.d.ts +2 -0
- package/dist/services/drive/drive-folder.service.js +14 -46
- package/dist/services/drive/trash.service.d.ts +2 -0
- package/dist/services/drive/trash.service.js +14 -41
- package/dist/services/network/upload/upload-file.service.js +5 -9
- package/dist/services/network/upload/upload.types.d.ts +2 -1
- package/dist/services/sdk-manager.service.d.ts +0 -2
- package/dist/services/sdk-manager.service.js +0 -7
- package/dist/services/thumbnail.service.d.ts +4 -13
- package/dist/services/thumbnail.service.js +7 -21
- package/dist/services/universal-link.service.d.ts +1 -1
- package/dist/services/universal-link.service.js +2 -2
- package/dist/services/validation.service.d.ts +3 -13
- package/dist/services/validation.service.js +4 -28
- package/dist/types/command.types.d.ts +1 -29
- package/dist/types/command.types.js +1 -15
- package/dist/types/network.types.d.ts +3 -11
- package/dist/types/webdav.types.d.ts +0 -3
- package/dist/utils/cli.utils.js +9 -22
- package/dist/utils/drive.utils.d.ts +1 -0
- package/dist/utils/drive.utils.js +5 -1
- package/dist/utils/format.utils.js +6 -2
- package/dist/utils/logger.utils.js +9 -2
- package/dist/utils/network.utils.js +2 -2
- package/dist/utils/stream.utils.d.ts +2 -2
- package/dist/utils/stream.utils.js +7 -6
- package/dist/utils/thumbnail.utils.d.ts +1 -3
- package/dist/utils/thumbnail.utils.js +3 -13
- package/dist/utils/upload.utils.d.ts +1 -1
- package/dist/utils/upload.utils.js +2 -2
- package/dist/utils/webdav.utils.d.ts +2 -0
- package/dist/utils/webdav.utils.js +16 -0
- package/dist/webdav/handlers/GET.handler.js +4 -2
- package/dist/webdav/handlers/HEAD.handler.js +2 -0
- package/dist/webdav/handlers/MKCOL.handler.js +3 -3
- package/dist/webdav/handlers/PROPFIND.handler.js +8 -4
- package/dist/webdav/handlers/PUT.handler.js +24 -10
- package/dist/webdav/index.js +2 -2
- package/dist/webdav/middewares/auth.middleware.js +2 -1
- package/dist/webdav/middewares/errors.middleware.js +29 -5
- package/dist/webdav/middewares/webdav-auth.middleware.js +1 -0
- package/dist/webdav/webdav-server.js +2 -2
- package/oclif.manifest.json +9 -198
- package/package.json +23 -22
- package/dist/commands/workspaces-list.d.ts +0 -20
- package/dist/commands/workspaces-list.js +0 -68
- package/dist/commands/workspaces-unset.d.ts +0 -23
- package/dist/commands/workspaces-unset.js +0 -46
- package/dist/commands/workspaces-use.d.ts +0 -27
- package/dist/commands/workspaces-use.js +0 -114
- package/dist/services/drive/workspace.service.d.ts +0 -7
- package/dist/services/drive/workspace.service.js +0 -30
|
@@ -4,7 +4,6 @@ exports.DriveFolderService = void 0;
|
|
|
4
4
|
const types_1 = require("@internxt/sdk/dist/drive/storage/types");
|
|
5
5
|
const sdk_manager_service_1 = require("../sdk-manager.service");
|
|
6
6
|
const drive_utils_1 = require("../../utils/drive.utils");
|
|
7
|
-
const auth_service_1 = require("../auth.service");
|
|
8
7
|
const errors_utils_1 = require("../../utils/errors.utils");
|
|
9
8
|
class DriveFolderService {
|
|
10
9
|
static instance = new DriveFolderService();
|
|
@@ -38,52 +37,32 @@ class DriveFolderService {
|
|
|
38
37
|
return { folders, files };
|
|
39
38
|
};
|
|
40
39
|
getFolderSubfolders = async (folderUuid) => {
|
|
41
|
-
const
|
|
42
|
-
const currentWorkspaceCreds = currentWorkspace?.workspaceCredentials;
|
|
43
|
-
const folders = await this.getAllSubfolders(currentWorkspaceCreds, folderUuid, 0);
|
|
40
|
+
const folders = await this.getAllSubfolders(folderUuid, 0);
|
|
44
41
|
return folders;
|
|
45
42
|
};
|
|
46
43
|
getFolderSubfiles = async (folderUuid) => {
|
|
47
|
-
const
|
|
48
|
-
const currentWorkspaceCreds = currentWorkspace?.workspaceCredentials;
|
|
49
|
-
const files = await this.getAllSubfiles(currentWorkspaceCreds, folderUuid, 0);
|
|
44
|
+
const files = await this.getAllSubfiles(folderUuid, 0);
|
|
50
45
|
return files;
|
|
51
46
|
};
|
|
52
|
-
getAllSubfolders = async (
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
const [workspaceContentPromise] = workspaceClient.getFolders(currentWorkspace.id, folderUuid, offset, 50, 'plainName', 'ASC');
|
|
57
|
-
folders = (await workspaceContentPromise).result;
|
|
58
|
-
}
|
|
59
|
-
else {
|
|
60
|
-
const storageClient = sdk_manager_service_1.SdkManager.instance.getStorage();
|
|
61
|
-
const [personalFolderContentPromise] = storageClient.getFolderFoldersByUuid(folderUuid, offset, 50, 'plainName', 'ASC');
|
|
62
|
-
folders = (await personalFolderContentPromise).folders;
|
|
63
|
-
}
|
|
47
|
+
getAllSubfolders = async (folderUuid, offset) => {
|
|
48
|
+
const storageClient = sdk_manager_service_1.SdkManager.instance.getStorage();
|
|
49
|
+
const [personalFolderContentPromise] = storageClient.getFolderFoldersByUuid(folderUuid, offset, 50, 'plainName', 'ASC');
|
|
50
|
+
let folders = (await personalFolderContentPromise).folders;
|
|
64
51
|
folders = folders.filter((folder) => folder.status === types_1.FileStatus.EXISTS);
|
|
65
52
|
if (folders.length > 0) {
|
|
66
|
-
return folders.concat(await this.getAllSubfolders(
|
|
53
|
+
return folders.concat(await this.getAllSubfolders(folderUuid, offset + folders.length));
|
|
67
54
|
}
|
|
68
55
|
else {
|
|
69
56
|
return folders;
|
|
70
57
|
}
|
|
71
58
|
};
|
|
72
|
-
getAllSubfiles = async (
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
const [workspaceContentPromise] = workspaceClient.getFiles(currentWorkspace.id, folderUuid, offset, 50, 'plainName', 'ASC');
|
|
77
|
-
files = (await workspaceContentPromise).result;
|
|
78
|
-
}
|
|
79
|
-
else {
|
|
80
|
-
const storageClient = sdk_manager_service_1.SdkManager.instance.getStorage();
|
|
81
|
-
const [folderContentPromise] = storageClient.getFolderFilesByUuid(folderUuid, offset, 50, 'plainName', 'ASC');
|
|
82
|
-
files = (await folderContentPromise).files;
|
|
83
|
-
}
|
|
59
|
+
getAllSubfiles = async (folderUuid, offset) => {
|
|
60
|
+
const storageClient = sdk_manager_service_1.SdkManager.instance.getStorage();
|
|
61
|
+
const [folderContentPromise] = storageClient.getFolderFilesByUuid(folderUuid, offset, 50, 'plainName', 'ASC');
|
|
62
|
+
let files = (await folderContentPromise).files;
|
|
84
63
|
files = files.filter((file) => file.status === types_1.FileStatus.EXISTS);
|
|
85
64
|
if (files.length > 0) {
|
|
86
|
-
return files.concat(await this.getAllSubfiles(
|
|
65
|
+
return files.concat(await this.getAllSubfiles(folderUuid, offset + files.length));
|
|
87
66
|
}
|
|
88
67
|
else {
|
|
89
68
|
return files;
|
|
@@ -95,19 +74,8 @@ class DriveFolderService {
|
|
|
95
74
|
return folderMeta;
|
|
96
75
|
};
|
|
97
76
|
createFolder = async (payload) => {
|
|
98
|
-
const
|
|
99
|
-
|
|
100
|
-
const workspaceClient = sdk_manager_service_1.SdkManager.instance.getWorkspaces();
|
|
101
|
-
return workspaceClient.createFolder({
|
|
102
|
-
workspaceId: currentWorkspace.workspaceCredentials.id,
|
|
103
|
-
parentFolderUuid: payload.parentFolderUuid,
|
|
104
|
-
plainName: payload.plainName,
|
|
105
|
-
});
|
|
106
|
-
}
|
|
107
|
-
else {
|
|
108
|
-
const storageClient = sdk_manager_service_1.SdkManager.instance.getStorage();
|
|
109
|
-
return storageClient.createFolderByUuid(payload);
|
|
110
|
-
}
|
|
77
|
+
const storageClient = sdk_manager_service_1.SdkManager.instance.getStorage();
|
|
78
|
+
return storageClient.createFolderByUuid(payload);
|
|
111
79
|
};
|
|
112
80
|
renameFolder = async (payload) => {
|
|
113
81
|
const storageClient = sdk_manager_service_1.SdkManager.instance.getStorage();
|
|
@@ -31,6 +31,7 @@ export declare class TrashService {
|
|
|
31
31
|
status: "EXISTS" | "TRASHED" | "DELETED";
|
|
32
32
|
removed: boolean;
|
|
33
33
|
deleted: boolean;
|
|
34
|
+
isFavorite?: boolean;
|
|
34
35
|
}[];
|
|
35
36
|
files: {
|
|
36
37
|
id: number;
|
|
@@ -50,6 +51,7 @@ export declare class TrashService {
|
|
|
50
51
|
updatedAt: string;
|
|
51
52
|
plainName: string;
|
|
52
53
|
status: "EXISTS" | "TRASHED" | "DELETED";
|
|
54
|
+
isFavorite?: boolean;
|
|
53
55
|
}[];
|
|
54
56
|
}>;
|
|
55
57
|
private readonly getAllTrashSubfolders;
|
|
@@ -2,7 +2,6 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.TrashService = void 0;
|
|
4
4
|
const sdk_manager_service_1 = require("../sdk-manager.service");
|
|
5
|
-
const auth_service_1 = require("../auth.service");
|
|
6
5
|
class TrashService {
|
|
7
6
|
static instance = new TrashService();
|
|
8
7
|
trashItems = (payload) => {
|
|
@@ -26,57 +25,31 @@ class TrashService {
|
|
|
26
25
|
return storageClient.deleteFolderByUuid(folderId);
|
|
27
26
|
};
|
|
28
27
|
clearTrash = async () => {
|
|
29
|
-
const
|
|
30
|
-
|
|
31
|
-
if (currentWorkspaceCreds) {
|
|
32
|
-
const workspaceClient = sdk_manager_service_1.SdkManager.instance.getWorkspaces();
|
|
33
|
-
return workspaceClient.emptyPersonalTrash(currentWorkspaceCreds.id);
|
|
34
|
-
}
|
|
35
|
-
else {
|
|
36
|
-
const trashClient = sdk_manager_service_1.SdkManager.instance.getTrash();
|
|
37
|
-
return trashClient.clearTrash();
|
|
38
|
-
}
|
|
28
|
+
const trashClient = sdk_manager_service_1.SdkManager.instance.getTrash();
|
|
29
|
+
return trashClient.clearTrash();
|
|
39
30
|
};
|
|
40
31
|
getTrashFolderContent = async () => {
|
|
41
|
-
const
|
|
42
|
-
const
|
|
43
|
-
const folders = await this.getAllTrashSubfolders(currentWorkspaceCreds, 0);
|
|
44
|
-
const files = await this.getAllTrashSubfiles(currentWorkspaceCreds, 0);
|
|
32
|
+
const folders = await this.getAllTrashSubfolders(0);
|
|
33
|
+
const files = await this.getAllTrashSubfiles(0);
|
|
45
34
|
return { folders, files };
|
|
46
35
|
};
|
|
47
|
-
getAllTrashSubfolders = async (
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
const promise = workspaceClient.getPersonalTrash(currentWorkspace.id, 'folder', offset, 50);
|
|
52
|
-
folders = (await promise).result;
|
|
53
|
-
}
|
|
54
|
-
else {
|
|
55
|
-
const trashClient = sdk_manager_service_1.SdkManager.instance.getTrash();
|
|
56
|
-
const promise = trashClient.getTrashedFilesPaginated(50, offset, 'folders', true);
|
|
57
|
-
folders = (await promise).result;
|
|
58
|
-
}
|
|
36
|
+
getAllTrashSubfolders = async (offset) => {
|
|
37
|
+
const trashClient = sdk_manager_service_1.SdkManager.instance.getTrash();
|
|
38
|
+
const promise = trashClient.getTrashedFilesPaginated(50, offset, 'folders', true);
|
|
39
|
+
const folders = (await promise).result;
|
|
59
40
|
if (folders.length > 0) {
|
|
60
|
-
return folders.concat(await this.getAllTrashSubfolders(
|
|
41
|
+
return folders.concat(await this.getAllTrashSubfolders(offset + folders.length));
|
|
61
42
|
}
|
|
62
43
|
else {
|
|
63
44
|
return folders;
|
|
64
45
|
}
|
|
65
46
|
};
|
|
66
|
-
getAllTrashSubfiles = async (
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
const promise = workspaceClient.getPersonalTrash(currentWorkspace.id, 'file', offset, 50);
|
|
71
|
-
files = (await promise).result;
|
|
72
|
-
}
|
|
73
|
-
else {
|
|
74
|
-
const trashClient = sdk_manager_service_1.SdkManager.instance.getTrash();
|
|
75
|
-
const promise = trashClient.getTrashedFilesPaginated(50, offset, 'files', true);
|
|
76
|
-
files = (await promise).result;
|
|
77
|
-
}
|
|
47
|
+
getAllTrashSubfiles = async (offset) => {
|
|
48
|
+
const trashClient = sdk_manager_service_1.SdkManager.instance.getTrash();
|
|
49
|
+
const promise = trashClient.getTrashedFilesPaginated(50, offset, 'files', true);
|
|
50
|
+
const files = (await promise).result;
|
|
78
51
|
if (files.length > 0) {
|
|
79
|
-
return files.concat(await this.getAllTrashSubfiles(
|
|
52
|
+
return files.concat(await this.getAllTrashSubfiles(offset + files.length));
|
|
80
53
|
}
|
|
81
54
|
else {
|
|
82
55
|
return files;
|
|
@@ -11,6 +11,7 @@ const types_1 = require("@internxt/sdk/dist/drive/storage/types");
|
|
|
11
11
|
const cli_utils_1 = require("../../../utils/cli.utils");
|
|
12
12
|
const thumbnail_service_1 = require("../../thumbnail.service");
|
|
13
13
|
const format_utils_1 = require("../../../utils/format.utils");
|
|
14
|
+
const node_fs_1 = require("node:fs");
|
|
14
15
|
class UploadFileService {
|
|
15
16
|
static instance = new UploadFileService();
|
|
16
17
|
uploadFilesConcurrently = async ({ network, filesToUpload, folderMap, bucket, destinationFolderUuid, currentProgress, emitProgress, debugMode, reporter, }) => {
|
|
@@ -51,21 +52,16 @@ class UploadFileService {
|
|
|
51
52
|
const fileSize = stats.size ?? 0;
|
|
52
53
|
const fileType = (0, node_path_1.extname)(file.absolutePath).replaceAll('.', '');
|
|
53
54
|
let fileId;
|
|
54
|
-
let thumbnailStream;
|
|
55
55
|
const timings = {
|
|
56
56
|
networkUpload: 0,
|
|
57
57
|
driveUpload: 0,
|
|
58
58
|
thumbnailUpload: 0,
|
|
59
59
|
};
|
|
60
60
|
if (fileSize > 0) {
|
|
61
|
-
const
|
|
62
|
-
path: file.absolutePath,
|
|
63
|
-
fileType,
|
|
64
|
-
});
|
|
61
|
+
const readStream = (0, node_fs_1.createReadStream)(file.absolutePath);
|
|
65
62
|
const uploadTimer = cli_utils_1.CLIUtils.timer();
|
|
66
|
-
thumbnailStream = bufferStream;
|
|
67
63
|
fileId = await network.uploadFile({
|
|
68
|
-
from:
|
|
64
|
+
from: readStream,
|
|
69
65
|
size: fileSize,
|
|
70
66
|
bucketId: bucket,
|
|
71
67
|
progressCallback: () => { },
|
|
@@ -86,9 +82,9 @@ class UploadFileService {
|
|
|
86
82
|
});
|
|
87
83
|
timings.driveUpload = driveTimer.stop();
|
|
88
84
|
const thumbnailTimer = cli_utils_1.CLIUtils.timer();
|
|
89
|
-
if (
|
|
85
|
+
if (fileSize > 0) {
|
|
90
86
|
await thumbnail_service_1.ThumbnailService.instance.tryUploadThumbnail({
|
|
91
|
-
|
|
87
|
+
input: file.absolutePath,
|
|
92
88
|
fileType,
|
|
93
89
|
bucket,
|
|
94
90
|
fileUuid: createdDriveFile.uuid,
|
|
@@ -16,7 +16,7 @@ export interface UploadFolderParams {
|
|
|
16
16
|
debugMode: boolean;
|
|
17
17
|
reporter: LogReporter;
|
|
18
18
|
}
|
|
19
|
-
|
|
19
|
+
interface UploadProgress {
|
|
20
20
|
percentage: number;
|
|
21
21
|
currentFile?: string;
|
|
22
22
|
}
|
|
@@ -62,3 +62,4 @@ export interface UploadFileWithRetryParams {
|
|
|
62
62
|
export declare const MAX_CONCURRENT_UPLOADS = 10;
|
|
63
63
|
export declare const DELAYS_MS: number[];
|
|
64
64
|
export declare const MAX_RETRIES = 2;
|
|
65
|
+
export {};
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { Auth, Drive, Network as NetworkModule } from '@internxt/sdk';
|
|
2
2
|
import { ApiSecurity, AppDetails } from '@internxt/sdk/dist/shared';
|
|
3
|
-
import { Workspaces } from '@internxt/sdk/dist/workspaces';
|
|
4
3
|
export type SdkManagerApiSecurity = ApiSecurity;
|
|
5
4
|
export declare class SdkManager {
|
|
6
5
|
static readonly instance: SdkManager;
|
|
@@ -16,7 +15,6 @@ export declare class SdkManager {
|
|
|
16
15
|
getStorage: () => Drive.Storage;
|
|
17
16
|
getTrash: () => Drive.Trash;
|
|
18
17
|
getShare: () => Drive.Share;
|
|
19
|
-
getWorkspaces: () => Workspaces;
|
|
20
18
|
getNetwork: (credentials: {
|
|
21
19
|
user: string;
|
|
22
20
|
pass: string;
|
|
@@ -9,7 +9,6 @@ const drive_1 = require("@internxt/sdk/dist/drive");
|
|
|
9
9
|
const config_service_1 = require("./config.service");
|
|
10
10
|
const package_json_1 = __importDefault(require("../../package.json"));
|
|
11
11
|
const network_utils_1 = require("../utils/network.utils");
|
|
12
|
-
const workspaces_1 = require("@internxt/sdk/dist/workspaces");
|
|
13
12
|
const MAX_RETRIES = 3;
|
|
14
13
|
class SdkManager {
|
|
15
14
|
static instance = new SdkManager();
|
|
@@ -68,12 +67,6 @@ class SdkManager {
|
|
|
68
67
|
const appDetails = SdkManager.getAppDetails();
|
|
69
68
|
return sdk_1.Drive.Share.client(DRIVE_NEW_API_URL, appDetails, apiSecurity);
|
|
70
69
|
};
|
|
71
|
-
getWorkspaces = () => {
|
|
72
|
-
const DRIVE_NEW_API_URL = config_service_1.ConfigService.instance.get('DRIVE_NEW_API_URL');
|
|
73
|
-
const apiSecurity = SdkManager.getApiSecurity();
|
|
74
|
-
const appDetails = SdkManager.getAppDetails();
|
|
75
|
-
return workspaces_1.Workspaces.client(DRIVE_NEW_API_URL, appDetails, apiSecurity);
|
|
76
|
-
};
|
|
77
70
|
getNetwork = (credentials) => {
|
|
78
71
|
const appDetails = SdkManager.getAppDetails();
|
|
79
72
|
const auth = network_utils_1.NetworkUtils.getAuthFromCredentials({
|
|
@@ -1,25 +1,16 @@
|
|
|
1
|
-
import { Readable } from 'node:stream';
|
|
2
1
|
import { StorageTypes } from '@internxt/sdk/dist/drive';
|
|
3
2
|
import { NetworkFacade } from './network/network-facade.service';
|
|
4
|
-
import { BufferStream } from '../utils/stream.utils';
|
|
5
3
|
export declare class ThumbnailService {
|
|
6
4
|
static readonly instance: ThumbnailService;
|
|
7
5
|
private static readonly MAX_THUMBNAIL_TIMEOUT;
|
|
8
|
-
uploadThumbnail: (
|
|
9
|
-
private readonly
|
|
10
|
-
tryUploadThumbnail: ({
|
|
11
|
-
|
|
6
|
+
uploadThumbnail: (input: string | Buffer, fileType: string, userBucket: string, file_id: string, networkFacade: NetworkFacade, fileSize: number) => Promise<StorageTypes.Thumbnail | undefined>;
|
|
7
|
+
private readonly generateThumbnail;
|
|
8
|
+
tryUploadThumbnail: ({ input, fileType, bucket, fileUuid, networkFacade, size, }: {
|
|
9
|
+
input?: string | Buffer;
|
|
12
10
|
fileType: string;
|
|
13
11
|
bucket: string;
|
|
14
12
|
fileUuid: string;
|
|
15
13
|
networkFacade: NetworkFacade;
|
|
16
14
|
size: number;
|
|
17
15
|
}) => Promise<void>;
|
|
18
|
-
createFileStreamWithBuffer: ({ path, fileType, }: {
|
|
19
|
-
path: string;
|
|
20
|
-
fileType: string;
|
|
21
|
-
}) => {
|
|
22
|
-
bufferStream?: BufferStream;
|
|
23
|
-
fileStream: Readable;
|
|
24
|
-
};
|
|
25
16
|
}
|
|
@@ -2,11 +2,9 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.ThumbnailService = void 0;
|
|
4
4
|
const node_stream_1 = require("node:stream");
|
|
5
|
-
const node_fs_1 = require("node:fs");
|
|
6
5
|
const drive_file_service_1 = require("./drive/drive-file.service");
|
|
7
6
|
const drive_1 = require("@internxt/sdk/dist/drive");
|
|
8
7
|
const thumbnail_utils_1 = require("../utils/thumbnail.utils");
|
|
9
|
-
const stream_utils_1 = require("../utils/stream.utils");
|
|
10
8
|
const errors_utils_1 = require("../utils/errors.utils");
|
|
11
9
|
const async_utils_1 = require("../utils/async.utils");
|
|
12
10
|
let sharpDependency = null;
|
|
@@ -24,10 +22,10 @@ const getSharp = async () => {
|
|
|
24
22
|
class ThumbnailService {
|
|
25
23
|
static instance = new ThumbnailService();
|
|
26
24
|
static MAX_THUMBNAIL_TIMEOUT = 30000;
|
|
27
|
-
uploadThumbnail = async (
|
|
25
|
+
uploadThumbnail = async (input, fileType, userBucket, file_id, networkFacade, fileSize) => {
|
|
28
26
|
let thumbnailBuffer;
|
|
29
27
|
if (thumbnail_utils_1.ThumbnailUtils.isImageThumbnailable(fileType, fileSize)) {
|
|
30
|
-
thumbnailBuffer = await this.
|
|
28
|
+
thumbnailBuffer = await this.generateThumbnail(input);
|
|
31
29
|
}
|
|
32
30
|
if (thumbnailBuffer) {
|
|
33
31
|
const size = thumbnailBuffer.length;
|
|
@@ -50,10 +48,10 @@ class ThumbnailService {
|
|
|
50
48
|
return createdThumbnailFile;
|
|
51
49
|
}
|
|
52
50
|
};
|
|
53
|
-
|
|
51
|
+
generateThumbnail = async (input) => {
|
|
54
52
|
const sharp = await getSharp();
|
|
55
53
|
if (sharp) {
|
|
56
|
-
return sharp(
|
|
54
|
+
return sharp(input, { failOn: 'none' })
|
|
57
55
|
.resize({
|
|
58
56
|
height: thumbnail_utils_1.ThumbnailConfig.MaxHeight,
|
|
59
57
|
width: thumbnail_utils_1.ThumbnailConfig.MaxWidth,
|
|
@@ -65,27 +63,15 @@ class ThumbnailService {
|
|
|
65
63
|
.toBuffer();
|
|
66
64
|
}
|
|
67
65
|
};
|
|
68
|
-
tryUploadThumbnail = async ({
|
|
66
|
+
tryUploadThumbnail = async ({ input, fileType, bucket, fileUuid, networkFacade, size, }) => {
|
|
69
67
|
try {
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
await async_utils_1.AsyncUtils.withTimeout(ThumbnailService.instance.uploadThumbnail(thumbnailBuffer, fileType, bucket, fileUuid, networkFacade, size), ThumbnailService.MAX_THUMBNAIL_TIMEOUT, 'Thumbnail upload timeout');
|
|
68
|
+
if (input && size > 0) {
|
|
69
|
+
await async_utils_1.AsyncUtils.withTimeout(ThumbnailService.instance.uploadThumbnail(input, fileType, bucket, fileUuid, networkFacade, size), ThumbnailService.MAX_THUMBNAIL_TIMEOUT, 'Thumbnail upload timeout');
|
|
73
70
|
}
|
|
74
71
|
}
|
|
75
72
|
catch (error) {
|
|
76
73
|
errors_utils_1.ErrorUtils.report(error);
|
|
77
74
|
}
|
|
78
75
|
};
|
|
79
|
-
createFileStreamWithBuffer = ({ path, fileType, }) => {
|
|
80
|
-
const readable = (0, node_fs_1.createReadStream)(path);
|
|
81
|
-
if (thumbnail_utils_1.ThumbnailUtils.isFileThumbnailable(fileType)) {
|
|
82
|
-
const bufferStream = new stream_utils_1.BufferStream();
|
|
83
|
-
return {
|
|
84
|
-
bufferStream,
|
|
85
|
-
fileStream: readable.pipe(bufferStream),
|
|
86
|
-
};
|
|
87
|
-
}
|
|
88
|
-
return { fileStream: readable };
|
|
89
|
-
};
|
|
90
76
|
}
|
|
91
77
|
exports.ThumbnailService = ThumbnailService;
|
|
@@ -8,5 +8,5 @@ export declare class UniversalLinkService {
|
|
|
8
8
|
privateKey: string;
|
|
9
9
|
}) => Promise<LoginCredentials>;
|
|
10
10
|
buildLoginUrl: (redirectUri: string) => string;
|
|
11
|
-
loginSSO: (jsonFlag: boolean, reporter: LogReporter,
|
|
11
|
+
loginSSO: (jsonFlag: boolean, reporter: LogReporter, forcedPort?: number) => Promise<LoginCredentials>;
|
|
12
12
|
}
|
|
@@ -42,7 +42,7 @@ class UniversalLinkService {
|
|
|
42
42
|
});
|
|
43
43
|
return `${loginURL}?${params.toString()}`;
|
|
44
44
|
};
|
|
45
|
-
loginSSO = async (jsonFlag, reporter,
|
|
45
|
+
loginSSO = async (jsonFlag, reporter, forcedPort = 0) => {
|
|
46
46
|
return new Promise((resolve, reject) => {
|
|
47
47
|
const server = node_http_1.default.createServer(async (req, res) => {
|
|
48
48
|
if (!req.url)
|
|
@@ -77,7 +77,7 @@ class UniversalLinkService {
|
|
|
77
77
|
});
|
|
78
78
|
server.listen(forcedPort, async () => {
|
|
79
79
|
const { port } = server.address();
|
|
80
|
-
const redirectUri = Buffer.from(`http
|
|
80
|
+
const redirectUri = Buffer.from(`http://127.0.0.1:${port}/callback`).toString('base64');
|
|
81
81
|
const loginUrl = this.buildLoginUrl(redirectUri);
|
|
82
82
|
cli_utils_1.CLIUtils.log(reporter, 'Opening browser for login...');
|
|
83
83
|
cli_utils_1.CLIUtils.log(reporter, 'If the browser doesn’t open automatically, visit:');
|
|
@@ -1,24 +1,14 @@
|
|
|
1
|
+
import { TokenStatus } from '@internxt/lib';
|
|
1
2
|
export declare class ValidationService {
|
|
2
3
|
static readonly instance: ValidationService;
|
|
3
4
|
validateEmail: (email: string) => boolean;
|
|
4
5
|
validate2FA: (code: string) => boolean;
|
|
5
6
|
validateMnemonic: (mnemonic: string) => boolean;
|
|
6
|
-
|
|
7
|
+
validateUUID: (uuid: string) => boolean;
|
|
7
8
|
validateYesOrNoString: (message: string) => boolean;
|
|
8
9
|
validateTCPIntegerPort: (port: string) => boolean;
|
|
9
10
|
validateStringIsNotEmpty: (str: string) => boolean;
|
|
10
11
|
validateDirectoryExists: (path: string) => Promise<boolean>;
|
|
11
12
|
validateFileExists: (path: string) => Promise<boolean>;
|
|
12
|
-
|
|
13
|
-
checkTokenExpiration: (expirationTimestamp: number) => {
|
|
14
|
-
expired: boolean;
|
|
15
|
-
refreshRequired: boolean;
|
|
16
|
-
};
|
|
17
|
-
validateTokenAndCheckExpiration: (token?: string) => {
|
|
18
|
-
isValid: boolean;
|
|
19
|
-
expiration: {
|
|
20
|
-
expired: boolean;
|
|
21
|
-
refreshRequired: boolean;
|
|
22
|
-
};
|
|
23
|
-
};
|
|
13
|
+
validateTokenAndCheckExpiration: (token: string) => TokenStatus;
|
|
24
14
|
}
|
|
@@ -6,6 +6,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
6
6
|
exports.ValidationService = void 0;
|
|
7
7
|
const lib_1 = require("@internxt/lib");
|
|
8
8
|
const bip39_1 = require("bip39");
|
|
9
|
+
const uuid_1 = require("uuid");
|
|
9
10
|
const promises_1 = __importDefault(require("node:fs/promises"));
|
|
10
11
|
class ValidationService {
|
|
11
12
|
static instance = new ValidationService();
|
|
@@ -18,8 +19,8 @@ class ValidationService {
|
|
|
18
19
|
validateMnemonic = (mnemonic) => {
|
|
19
20
|
return (0, bip39_1.validateMnemonic)(mnemonic);
|
|
20
21
|
};
|
|
21
|
-
|
|
22
|
-
return
|
|
22
|
+
validateUUID = (uuid) => {
|
|
23
|
+
return (0, uuid_1.validate)(uuid);
|
|
23
24
|
};
|
|
24
25
|
validateYesOrNoString = (message) => {
|
|
25
26
|
return message.length > 0 && /^(yes|no|y|n)$/i.test(message.trim());
|
|
@@ -48,33 +49,8 @@ class ValidationService {
|
|
|
48
49
|
return false;
|
|
49
50
|
}
|
|
50
51
|
};
|
|
51
|
-
validateJwtAndCheckExpiration = (token) => {
|
|
52
|
-
if (!token || typeof token !== 'string' || token.split('.').length !== 3) {
|
|
53
|
-
return null;
|
|
54
|
-
}
|
|
55
|
-
try {
|
|
56
|
-
const payload = JSON.parse(atob(token.split('.')[1]));
|
|
57
|
-
return typeof payload.exp === 'number' ? payload.exp : null;
|
|
58
|
-
}
|
|
59
|
-
catch {
|
|
60
|
-
return null;
|
|
61
|
-
}
|
|
62
|
-
};
|
|
63
|
-
checkTokenExpiration = (expirationTimestamp) => {
|
|
64
|
-
const TWO_DAYS_IN_SECONDS = 2 * 24 * 60 * 60;
|
|
65
|
-
const currentTime = Math.floor(Date.now() / 1000);
|
|
66
|
-
const remainingSeconds = expirationTimestamp - currentTime;
|
|
67
|
-
return {
|
|
68
|
-
expired: remainingSeconds <= 0,
|
|
69
|
-
refreshRequired: remainingSeconds > 0 && remainingSeconds <= TWO_DAYS_IN_SECONDS,
|
|
70
|
-
};
|
|
71
|
-
};
|
|
72
52
|
validateTokenAndCheckExpiration = (token) => {
|
|
73
|
-
|
|
74
|
-
return {
|
|
75
|
-
isValid: expiration !== null,
|
|
76
|
-
expiration: expiration ? this.checkTokenExpiration(expiration) : { expired: true, refreshRequired: false },
|
|
77
|
-
};
|
|
53
|
+
return lib_1.auth.validateTokenAndCheckExpiration(token);
|
|
78
54
|
};
|
|
79
55
|
}
|
|
80
56
|
exports.ValidationService = ValidationService;
|
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
import { WorkspaceData } from '@internxt/sdk/dist/workspaces';
|
|
2
|
-
import { NetworkCredentials } from './network.types';
|
|
3
1
|
export interface LoginUserDetails {
|
|
4
2
|
userId: string;
|
|
5
3
|
uuid: string;
|
|
@@ -25,21 +23,9 @@ export interface LoginUserDetails {
|
|
|
25
23
|
avatar: string | null;
|
|
26
24
|
emailVerified: boolean;
|
|
27
25
|
}
|
|
28
|
-
export interface WorkspaceCredentialsDetails {
|
|
29
|
-
id: string;
|
|
30
|
-
bucket: string;
|
|
31
|
-
workspaceUserId: string;
|
|
32
|
-
credentials: NetworkCredentials;
|
|
33
|
-
token: string;
|
|
34
|
-
}
|
|
35
|
-
export interface Workspace {
|
|
36
|
-
workspaceData: WorkspaceData;
|
|
37
|
-
workspaceCredentials: WorkspaceCredentialsDetails;
|
|
38
|
-
}
|
|
39
26
|
export interface LoginCredentials {
|
|
40
27
|
user: LoginUserDetails;
|
|
41
28
|
token: string;
|
|
42
|
-
workspace?: Workspace;
|
|
43
29
|
}
|
|
44
30
|
export interface WebdavConfig {
|
|
45
31
|
host: string;
|
|
@@ -70,9 +56,6 @@ export declare class NotValidFileUuidError extends Error {
|
|
|
70
56
|
export declare class NotValidFileIdError extends Error {
|
|
71
57
|
constructor();
|
|
72
58
|
}
|
|
73
|
-
export declare class NoRootFolderIdFoundError extends Error {
|
|
74
|
-
constructor();
|
|
75
|
-
}
|
|
76
59
|
export declare class MissingCredentialsError extends Error {
|
|
77
60
|
constructor();
|
|
78
61
|
}
|
|
@@ -103,9 +86,6 @@ export declare class NotValidDirectoryError extends Error {
|
|
|
103
86
|
export declare class NotValidFileError extends Error {
|
|
104
87
|
constructor();
|
|
105
88
|
}
|
|
106
|
-
export declare class NotValidWorkspaceUuidError extends Error {
|
|
107
|
-
constructor();
|
|
108
|
-
}
|
|
109
89
|
export declare class MissingCredentialsWhenUsingAuthError extends Error {
|
|
110
90
|
constructor();
|
|
111
91
|
}
|
|
@@ -114,6 +94,7 @@ export interface PaginatedItem {
|
|
|
114
94
|
type: string;
|
|
115
95
|
id: string;
|
|
116
96
|
size: string;
|
|
97
|
+
created: string;
|
|
117
98
|
modified: string;
|
|
118
99
|
}
|
|
119
100
|
export interface PromptOptions {
|
|
@@ -126,12 +107,3 @@ export interface PromptOptions {
|
|
|
126
107
|
default?: number;
|
|
127
108
|
};
|
|
128
109
|
}
|
|
129
|
-
export interface PaginatedWorkspace {
|
|
130
|
-
name: string;
|
|
131
|
-
id: string;
|
|
132
|
-
usedSpace: string;
|
|
133
|
-
availableSpace: string;
|
|
134
|
-
owner: string;
|
|
135
|
-
address: string;
|
|
136
|
-
created: string;
|
|
137
|
-
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.MissingCredentialsWhenUsingAuthError = exports.
|
|
3
|
+
exports.MissingCredentialsWhenUsingAuthError = exports.NotValidFileError = exports.NotValidDirectoryError = exports.NotValidPortError = exports.EmptyCustomAuthPasswordError = exports.EmptyCustomAuthUsernameError = exports.EmptyFolderNameError = exports.EmptyFileNameError = exports.InvalidCredentialsError = exports.ExpiredCredentialsError = exports.MissingCredentialsError = exports.NotValidFileIdError = exports.NotValidFileUuidError = exports.NotValidFolderUuidError = exports.NotValidTwoFactorCodeError = exports.EmptyPasswordError = exports.NotValidEmailError = void 0;
|
|
4
4
|
class NotValidEmailError extends Error {
|
|
5
5
|
constructor() {
|
|
6
6
|
super('Email is not valid');
|
|
@@ -43,13 +43,6 @@ class NotValidFileIdError extends Error {
|
|
|
43
43
|
}
|
|
44
44
|
}
|
|
45
45
|
exports.NotValidFileIdError = NotValidFileIdError;
|
|
46
|
-
class NoRootFolderIdFoundError extends Error {
|
|
47
|
-
constructor() {
|
|
48
|
-
super('No root folder id found on your account');
|
|
49
|
-
Object.setPrototypeOf(this, NoRootFolderIdFoundError.prototype);
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
exports.NoRootFolderIdFoundError = NoRootFolderIdFoundError;
|
|
53
46
|
class MissingCredentialsError extends Error {
|
|
54
47
|
constructor() {
|
|
55
48
|
super('Missing credentials, please login first');
|
|
@@ -120,13 +113,6 @@ class NotValidFileError extends Error {
|
|
|
120
113
|
}
|
|
121
114
|
}
|
|
122
115
|
exports.NotValidFileError = NotValidFileError;
|
|
123
|
-
class NotValidWorkspaceUuidError extends Error {
|
|
124
|
-
constructor() {
|
|
125
|
-
super('Workspace UUID is not valid (it must be a valid v4 UUID)');
|
|
126
|
-
Object.setPrototypeOf(this, NotValidWorkspaceUuidError.prototype);
|
|
127
|
-
}
|
|
128
|
-
}
|
|
129
|
-
exports.NotValidWorkspaceUuidError = NotValidWorkspaceUuidError;
|
|
130
116
|
class MissingCredentialsWhenUsingAuthError extends Error {
|
|
131
117
|
constructor() {
|
|
132
118
|
super('When using custom WebDAV authentication, both username and password must be provided');
|
|
@@ -9,22 +9,14 @@ export interface NetworkOptions {
|
|
|
9
9
|
mnemonic: string;
|
|
10
10
|
}
|
|
11
11
|
export type DownloadProgressCallback = (downloadedBytes: number) => void;
|
|
12
|
-
|
|
13
|
-
|
|
12
|
+
type UploadProgressCallback = (uploadedBytes: number) => void;
|
|
13
|
+
interface NetworkOperationBaseOptions {
|
|
14
14
|
progressCallback?: UploadProgressCallback;
|
|
15
15
|
abortController?: AbortController;
|
|
16
16
|
}
|
|
17
|
-
export type UploadOptions = NetworkOperationBaseOptions;
|
|
18
17
|
export type DownloadOptions = NetworkOperationBaseOptions;
|
|
19
18
|
export interface SelfsignedCert {
|
|
20
19
|
cert: string | Buffer;
|
|
21
20
|
key: string | Buffer;
|
|
22
21
|
}
|
|
23
|
-
export
|
|
24
|
-
contentToUpload: Buffer;
|
|
25
|
-
urlToUpload: string;
|
|
26
|
-
index: number;
|
|
27
|
-
}
|
|
28
|
-
export interface UploadMultipartOptions extends UploadOptions {
|
|
29
|
-
parts: number;
|
|
30
|
-
}
|
|
22
|
+
export {};
|
|
@@ -3,9 +3,6 @@ import { ParsedPath } from 'node:path';
|
|
|
3
3
|
export declare abstract class WebDavMethodHandler {
|
|
4
4
|
abstract handle(request: Request, response: Response): Promise<void>;
|
|
5
5
|
}
|
|
6
|
-
export type WebDavMethodHandlerOptions = {
|
|
7
|
-
debug: boolean;
|
|
8
|
-
};
|
|
9
6
|
export type WebDavRequestedResource = {
|
|
10
7
|
url: string;
|
|
11
8
|
name: string;
|