@internxt/cli 1.6.2 → 1.6.3
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 +410 -71
- package/dist/commands/add-cert.d.ts +1 -1
- package/dist/commands/add-cert.js +1 -1
- package/dist/commands/config.d.ts +7 -1
- package/dist/commands/config.js +36 -5
- package/dist/commands/create-folder.d.ts +2 -1
- package/dist/commands/create-folder.js +10 -7
- package/dist/commands/delete-permanently-file.d.ts +1 -0
- package/dist/commands/delete-permanently-folder.d.ts +1 -0
- package/dist/commands/download-file.d.ts +1 -0
- package/dist/commands/download-file.js +4 -2
- package/dist/commands/list.d.ts +1 -0
- package/dist/commands/list.js +2 -4
- package/dist/commands/login-legacy.d.ts +1 -0
- package/dist/commands/move-file.d.ts +1 -1
- package/dist/commands/move-file.js +7 -21
- package/dist/commands/move-folder.d.ts +1 -1
- package/dist/commands/move-folder.js +7 -21
- package/dist/commands/rename-file.d.ts +1 -0
- package/dist/commands/rename-folder.d.ts +1 -0
- package/dist/commands/trash-clear.d.ts +1 -0
- package/dist/commands/trash-file.d.ts +1 -0
- package/dist/commands/trash-folder.d.ts +1 -0
- package/dist/commands/trash-restore-file.d.ts +1 -1
- package/dist/commands/trash-restore-file.js +7 -21
- package/dist/commands/trash-restore-folder.d.ts +1 -1
- package/dist/commands/trash-restore-folder.js +7 -21
- package/dist/commands/upload-file.d.ts +4 -5
- package/dist/commands/upload-file.js +32 -21
- package/dist/commands/upload-folder.d.ts +1 -0
- package/dist/commands/upload-folder.js +11 -6
- package/dist/commands/webdav-config.d.ts +19 -1
- package/dist/commands/webdav-config.js +81 -3
- package/dist/commands/webdav.d.ts +1 -1
- package/dist/commands/webdav.js +10 -5
- package/dist/commands/whoami.js +2 -1
- package/dist/commands/workspaces-list.d.ts +20 -0
- package/dist/commands/workspaces-list.js +67 -0
- package/dist/commands/workspaces-unset.d.ts +23 -0
- package/dist/commands/workspaces-unset.js +45 -0
- package/dist/commands/workspaces-use.d.ts +27 -0
- package/dist/commands/workspaces-use.js +113 -0
- package/dist/constants/configs.d.ts +2 -1
- package/dist/constants/configs.js +4 -3
- package/dist/hooks/prerun/auth_check.js +13 -4
- package/dist/services/auth.service.d.ts +5 -2
- package/dist/services/auth.service.js +69 -12
- package/dist/services/config.service.d.ts +1 -1
- package/dist/services/config.service.js +12 -4
- package/dist/services/crypto.service.d.ts +5 -0
- package/dist/services/crypto.service.js +43 -0
- package/dist/services/database/database.service.d.ts +9 -0
- package/dist/services/database/database.service.js +39 -0
- package/dist/services/database/drive-file/drive-file.attributes.d.ts +3 -6
- package/dist/services/database/drive-file/drive-file.domain.d.ts +3 -6
- package/dist/services/database/drive-file/drive-file.domain.js +1 -12
- package/dist/services/database/drive-file/drive-file.model.d.ts +15 -0
- package/dist/services/database/drive-file/drive-file.model.js +67 -0
- package/dist/services/database/drive-file/drive-file.repository.d.ts +11 -0
- package/dist/services/database/drive-file/drive-file.repository.js +63 -0
- package/dist/services/database/drive-folder/drive-folder.attributes.d.ts +3 -4
- package/dist/services/database/drive-folder/drive-folder.domain.d.ts +4 -5
- package/dist/services/database/drive-folder/drive-folder.domain.js +11 -15
- package/dist/services/database/drive-folder/drive-folder.model.d.ts +11 -0
- package/dist/services/database/drive-folder/drive-folder.model.js +51 -0
- package/dist/services/database/drive-folder/drive-folder.repository.d.ts +13 -0
- package/dist/services/database/drive-folder/drive-folder.repository.js +99 -0
- package/dist/services/drive/drive-file.service.d.ts +2 -0
- package/dist/services/drive/drive-file.service.js +71 -15
- package/dist/services/drive/drive-folder.service.d.ts +6 -1
- package/dist/services/drive/drive-folder.service.js +157 -31
- package/dist/services/drive/trash.service.d.ts +3 -0
- package/dist/services/drive/trash.service.js +52 -16
- package/dist/services/drive/workspace.service.d.ts +7 -0
- package/dist/services/drive/workspace.service.js +30 -0
- package/dist/services/keys.service.d.ts +7 -0
- package/dist/services/keys.service.js +55 -0
- package/dist/services/local-filesystem/local-filesystem.service.d.ts +2 -2
- package/dist/services/local-filesystem/local-filesystem.service.js +4 -4
- package/dist/services/network/download.service.d.ts +2 -2
- package/dist/services/network/download.service.js +2 -2
- package/dist/services/network/network-facade.service.d.ts +3 -7
- package/dist/services/network/network-facade.service.js +9 -11
- package/dist/services/network/upload/upload-facade.service.d.ts +1 -1
- package/dist/services/network/upload/upload-facade.service.js +14 -7
- package/dist/services/network/upload/upload-file.service.d.ts +3 -3
- package/dist/services/network/upload/upload-file.service.js +33 -23
- package/dist/services/network/upload/upload-folder.service.d.ts +2 -2
- package/dist/services/network/upload/upload-folder.service.js +15 -10
- package/dist/services/network/upload/upload.types.d.ts +11 -0
- package/dist/services/sdk-manager.service.d.ts +9 -7
- package/dist/services/sdk-manager.service.js +27 -13
- package/dist/services/thumbnail.service.d.ts +19 -1
- package/dist/services/thumbnail.service.js +29 -2
- package/dist/services/universal-link.service.d.ts +3 -1
- package/dist/services/universal-link.service.js +15 -3
- package/dist/services/usage.service.d.ts +1 -2
- package/dist/services/usage.service.js +1 -1
- package/dist/services/validation.service.js +14 -4
- package/dist/{webdav/services → services/webdav}/webdav-folder.service.d.ts +1 -7
- package/dist/{webdav/services → services/webdav}/webdav-folder.service.js +6 -10
- package/dist/types/command.types.d.ts +44 -1
- package/dist/types/command.types.js +29 -1
- package/dist/types/config.types.d.ts +1 -0
- package/dist/types/drive.types.d.ts +7 -6
- package/dist/types/network.types.d.ts +6 -0
- package/dist/utils/async.utils.d.ts +2 -1
- package/dist/utils/async.utils.js +13 -2
- package/dist/utils/cli.utils.d.ts +20 -15
- package/dist/utils/cli.utils.js +48 -18
- package/dist/utils/crypto.utils.d.ts +3 -1
- package/dist/utils/crypto.utils.js +15 -2
- package/dist/utils/database.utils.d.ts +11 -0
- package/dist/utils/database.utils.js +26 -0
- package/dist/utils/drive.utils.js +7 -10
- package/dist/utils/errors.utils.d.ts +4 -4
- package/dist/utils/errors.utils.js +16 -19
- package/dist/utils/format.utils.d.ts +1 -0
- package/dist/utils/format.utils.js +3 -0
- package/dist/utils/inquirer.utils.js +10 -1
- package/dist/utils/path.utils.d.ts +7 -0
- package/dist/utils/path.utils.js +18 -0
- package/dist/utils/thumbnail.utils.d.ts +6 -20
- package/dist/utils/thumbnail.utils.js +16 -41
- package/dist/utils/webdav.utils.d.ts +4 -20
- package/dist/utils/webdav.utils.js +12 -14
- package/dist/webdav/handlers/DELETE.handler.d.ts +0 -9
- package/dist/webdav/handlers/DELETE.handler.js +18 -16
- package/dist/webdav/handlers/GET.handler.d.ts +0 -13
- package/dist/webdav/handlers/GET.handler.js +6 -11
- package/dist/webdav/handlers/HEAD.handler.d.ts +0 -5
- package/dist/webdav/handlers/HEAD.handler.js +11 -23
- package/dist/webdav/handlers/MKCOL.handler.d.ts +0 -7
- package/dist/webdav/handlers/MKCOL.handler.js +5 -12
- package/dist/webdav/handlers/MOVE.handler.d.ts +0 -9
- package/dist/webdav/handlers/MOVE.handler.js +10 -16
- package/dist/webdav/handlers/PROPFIND.handler.d.ts +0 -7
- package/dist/webdav/handlers/PROPFIND.handler.js +7 -19
- package/dist/webdav/handlers/PUT.handler.d.ts +0 -15
- package/dist/webdav/handlers/PUT.handler.js +24 -26
- package/dist/webdav/index.js +6 -8
- package/dist/webdav/middewares/auth.middleware.d.ts +1 -2
- package/dist/webdav/middewares/auth.middleware.js +5 -4
- package/dist/webdav/middewares/errors.middleware.js +2 -2
- package/dist/webdav/middewares/webdav-auth.middleware.d.ts +3 -0
- package/dist/webdav/middewares/webdav-auth.middleware.js +44 -0
- package/dist/webdav/webdav-server.d.ts +3 -16
- package/dist/webdav/webdav-server.js +29 -87
- package/oclif.manifest.json +429 -6
- package/package.json +25 -20
|
@@ -1,69 +1,195 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.DriveFolderService = void 0;
|
|
4
|
+
const types_1 = require("@internxt/sdk/dist/drive/storage/types");
|
|
4
5
|
const sdk_manager_service_1 = require("../sdk-manager.service");
|
|
5
6
|
const drive_utils_1 = require("../../utils/drive.utils");
|
|
7
|
+
const auth_service_1 = require("../auth.service");
|
|
8
|
+
const drive_folder_repository_1 = require("../database/drive-folder/drive-folder.repository");
|
|
9
|
+
const drive_folder_domain_1 = require("../database/drive-folder/drive-folder.domain");
|
|
10
|
+
const drive_file_repository_1 = require("../database/drive-file/drive-file.repository");
|
|
11
|
+
const drive_file_domain_1 = require("../database/drive-file/drive-file.domain");
|
|
12
|
+
const errors_utils_1 = require("../../utils/errors.utils");
|
|
13
|
+
const database_utils_1 = require("../../utils/database.utils");
|
|
14
|
+
const logger_utils_1 = require("../../utils/logger.utils");
|
|
6
15
|
class DriveFolderService {
|
|
7
16
|
static instance = new DriveFolderService();
|
|
8
17
|
getFolderMetaByUuid = async (uuid) => {
|
|
9
18
|
const storageClient = sdk_manager_service_1.SdkManager.instance.getStorage();
|
|
10
19
|
const folderMeta = await storageClient.getFolderMeta(uuid);
|
|
11
|
-
|
|
20
|
+
const folderItem = drive_utils_1.DriveUtils.driveFolderMetaToItem(folderMeta);
|
|
21
|
+
if (folderItem?.status !== types_1.FileStatus.EXISTS) {
|
|
22
|
+
throw new errors_utils_1.NotFoundError(`Folder with uuid ${uuid} not found`);
|
|
23
|
+
}
|
|
24
|
+
await drive_folder_repository_1.FolderRepository.instance.createOrUpdate([folderItem]);
|
|
25
|
+
return folderItem;
|
|
12
26
|
};
|
|
13
27
|
getFolderMetaById = async (id) => {
|
|
14
28
|
const storageClient = sdk_manager_service_1.SdkManager.instance.getStorage();
|
|
15
29
|
const folderMeta = await storageClient.getFolderMetaById(id);
|
|
16
|
-
|
|
30
|
+
const folderItem = drive_utils_1.DriveUtils.driveFolderMetaToItem(folderMeta);
|
|
31
|
+
await drive_folder_repository_1.FolderRepository.instance.createOrUpdate([folderItem]);
|
|
32
|
+
return folderItem;
|
|
17
33
|
};
|
|
18
34
|
getFolderContent = async (folderUuid) => {
|
|
19
|
-
const
|
|
20
|
-
const
|
|
21
|
-
const files = await this.getAllSubfiles(storageClient, folderUuid, 0);
|
|
35
|
+
const folders = await this.getFolderSubfolders(folderUuid);
|
|
36
|
+
const files = await this.getFolderSubfiles(folderUuid);
|
|
22
37
|
return { folders, files };
|
|
23
38
|
};
|
|
24
|
-
|
|
25
|
-
const
|
|
26
|
-
const
|
|
39
|
+
getFolderSubfolders = async (folderUuid) => {
|
|
40
|
+
const currentWorkspace = await auth_service_1.AuthService.instance.getCurrentWorkspace();
|
|
41
|
+
const currentWorkspaceCreds = currentWorkspace?.workspaceCredentials;
|
|
42
|
+
const folders = await this.getAllSubfolders(currentWorkspaceCreds, folderUuid, 0);
|
|
43
|
+
return folders;
|
|
44
|
+
};
|
|
45
|
+
getFolderSubfiles = async (folderUuid) => {
|
|
46
|
+
const currentWorkspace = await auth_service_1.AuthService.instance.getCurrentWorkspace();
|
|
47
|
+
const currentWorkspaceCreds = currentWorkspace?.workspaceCredentials;
|
|
48
|
+
const files = await this.getAllSubfiles(currentWorkspaceCreds, folderUuid, 0);
|
|
49
|
+
return files;
|
|
50
|
+
};
|
|
51
|
+
getAllSubfolders = async (currentWorkspace, folderUuid, offset) => {
|
|
52
|
+
let folders;
|
|
53
|
+
if (currentWorkspace) {
|
|
54
|
+
const workspaceClient = sdk_manager_service_1.SdkManager.instance.getWorkspaces();
|
|
55
|
+
const [workspaceContentPromise] = workspaceClient.getFolders(currentWorkspace.id, folderUuid, offset, 50, 'plainName', 'ASC');
|
|
56
|
+
folders = (await workspaceContentPromise).result;
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
const storageClient = sdk_manager_service_1.SdkManager.instance.getStorage();
|
|
60
|
+
const [personalFolderContentPromise] = storageClient.getFolderFoldersByUuid(folderUuid, offset, 50, 'plainName', 'ASC');
|
|
61
|
+
folders = (await personalFolderContentPromise).folders;
|
|
62
|
+
}
|
|
63
|
+
folders = folders.filter((folder) => folder.status === types_1.FileStatus.EXISTS);
|
|
64
|
+
await drive_folder_repository_1.FolderRepository.instance.createOrUpdate(folders.map((folder) => new drive_folder_domain_1.DriveFolder({
|
|
65
|
+
uuid: folder.uuid,
|
|
66
|
+
name: folder.plainName,
|
|
67
|
+
parentUuid: folder.parentUuid,
|
|
68
|
+
status: types_1.FileStatus.EXISTS,
|
|
69
|
+
createdAt: new Date(folder.createdAt),
|
|
70
|
+
updatedAt: new Date(folder.updatedAt),
|
|
71
|
+
creationTime: new Date(folder.creationTime ?? folder.createdAt),
|
|
72
|
+
modificationTime: new Date(folder.modificationTime ?? folder.updatedAt),
|
|
73
|
+
})));
|
|
27
74
|
if (folders.length > 0) {
|
|
28
|
-
return folders.concat(await this.getAllSubfolders(
|
|
75
|
+
return folders.concat(await this.getAllSubfolders(currentWorkspace, folderUuid, offset + folders.length));
|
|
29
76
|
}
|
|
30
77
|
else {
|
|
31
78
|
return folders;
|
|
32
79
|
}
|
|
33
80
|
};
|
|
34
|
-
getAllSubfiles = async (
|
|
35
|
-
|
|
36
|
-
|
|
81
|
+
getAllSubfiles = async (currentWorkspace, folderUuid, offset) => {
|
|
82
|
+
let files;
|
|
83
|
+
if (currentWorkspace) {
|
|
84
|
+
const workspaceClient = sdk_manager_service_1.SdkManager.instance.getWorkspaces();
|
|
85
|
+
const [workspaceContentPromise] = workspaceClient.getFiles(currentWorkspace.id, folderUuid, offset, 50, 'plainName', 'ASC');
|
|
86
|
+
files = (await workspaceContentPromise).result;
|
|
87
|
+
}
|
|
88
|
+
else {
|
|
89
|
+
const storageClient = sdk_manager_service_1.SdkManager.instance.getStorage();
|
|
90
|
+
const [folderContentPromise] = storageClient.getFolderFilesByUuid(folderUuid, offset, 50, 'plainName', 'ASC');
|
|
91
|
+
files = (await folderContentPromise).files;
|
|
92
|
+
}
|
|
93
|
+
files = files.filter((file) => file.status === types_1.FileStatus.EXISTS);
|
|
37
94
|
if (files.length > 0) {
|
|
38
|
-
|
|
95
|
+
await drive_file_repository_1.FileRepository.instance.deleteByParentUuid(folderUuid);
|
|
96
|
+
await drive_file_repository_1.FileRepository.instance.createOrUpdate(files.map((file) => new drive_file_domain_1.DriveFile({
|
|
97
|
+
uuid: file.uuid,
|
|
98
|
+
name: file.plainName,
|
|
99
|
+
type: file.type,
|
|
100
|
+
folderUuid: file.folderUuid,
|
|
101
|
+
status: types_1.FileStatus.EXISTS,
|
|
102
|
+
bucket: file.bucket,
|
|
103
|
+
size: Number(file.size ?? 0),
|
|
104
|
+
fileId: file.fileId,
|
|
105
|
+
createdAt: new Date(file.createdAt),
|
|
106
|
+
updatedAt: new Date(file.updatedAt),
|
|
107
|
+
creationTime: new Date(file.creationTime ?? file.createdAt),
|
|
108
|
+
modificationTime: new Date(file.modificationTime ?? file.updatedAt),
|
|
109
|
+
})));
|
|
110
|
+
return files.concat(await this.getAllSubfiles(currentWorkspace, folderUuid, offset + files.length));
|
|
39
111
|
}
|
|
40
112
|
else {
|
|
41
113
|
return files;
|
|
42
114
|
}
|
|
43
115
|
};
|
|
44
|
-
moveFolder = (uuid, payload) => {
|
|
116
|
+
moveFolder = async (uuid, payload) => {
|
|
45
117
|
const storageClient = sdk_manager_service_1.SdkManager.instance.getStorage();
|
|
46
|
-
|
|
118
|
+
const folderMeta = await storageClient.moveFolderByUuid(uuid, payload);
|
|
119
|
+
const folderItem = drive_utils_1.DriveUtils.driveFolderMetaToItem(folderMeta);
|
|
120
|
+
await drive_folder_repository_1.FolderRepository.instance.createOrUpdate([folderItem]);
|
|
121
|
+
return folderMeta;
|
|
47
122
|
};
|
|
48
|
-
createFolder(payload) {
|
|
49
|
-
const
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
123
|
+
createFolder = async (payload) => {
|
|
124
|
+
const currentWorkspace = await auth_service_1.AuthService.instance.getCurrentWorkspace();
|
|
125
|
+
if (currentWorkspace) {
|
|
126
|
+
const workspaceClient = sdk_manager_service_1.SdkManager.instance.getWorkspaces();
|
|
127
|
+
return workspaceClient.createFolder({
|
|
128
|
+
workspaceId: currentWorkspace.workspaceCredentials.id,
|
|
129
|
+
parentFolderUuid: payload.parentFolderUuid,
|
|
130
|
+
plainName: payload.plainName,
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
else {
|
|
134
|
+
const storageClient = sdk_manager_service_1.SdkManager.instance.getStorage();
|
|
135
|
+
return storageClient.createFolderByUuid(payload);
|
|
136
|
+
}
|
|
55
137
|
};
|
|
56
|
-
|
|
138
|
+
renameFolder = async (payload) => {
|
|
57
139
|
const storageClient = sdk_manager_service_1.SdkManager.instance.getStorage();
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
140
|
+
await storageClient.updateFolderNameWithUUID(payload);
|
|
141
|
+
await drive_folder_repository_1.FolderRepository.instance.updateByUuid(payload.folderUuid, { name: payload.name });
|
|
142
|
+
};
|
|
143
|
+
getByParentUuidAndName = async (parentUuid, name) => {
|
|
144
|
+
const subFolders = await this.getFolderSubfolders(parentUuid);
|
|
145
|
+
const folderMeta = subFolders.find((folder) => folder.plainName === name || folder.name === name);
|
|
146
|
+
if (folderMeta?.status !== types_1.FileStatus.EXISTS) {
|
|
147
|
+
throw new errors_utils_1.NotFoundError('Folder not found');
|
|
148
|
+
}
|
|
149
|
+
return {
|
|
150
|
+
itemType: 'folder',
|
|
151
|
+
name: folderMeta.plainName,
|
|
152
|
+
uuid: folderMeta.uuid,
|
|
153
|
+
parentUuid: folderMeta.parentUuid,
|
|
154
|
+
status: types_1.FileStatus.EXISTS,
|
|
155
|
+
createdAt: new Date(folderMeta.createdAt),
|
|
156
|
+
updatedAt: new Date(folderMeta.updatedAt),
|
|
157
|
+
creationTime: new Date(folderMeta.creationTime),
|
|
158
|
+
modificationTime: new Date(folderMeta.modificationTime),
|
|
159
|
+
bucket: folderMeta.bucket,
|
|
160
|
+
};
|
|
161
|
+
};
|
|
162
|
+
getByPath = async (path, parentUuid) => {
|
|
163
|
+
const onFound = async (uuid) => {
|
|
164
|
+
const folder = await this.getFolderMetaByUuid(uuid);
|
|
165
|
+
return folder;
|
|
166
|
+
};
|
|
167
|
+
const folder = await database_utils_1.DatabaseUtils.getFolderByPathGeneric({
|
|
168
|
+
path,
|
|
169
|
+
parentUuid,
|
|
170
|
+
onFound,
|
|
171
|
+
getByParentAndName: this.getByParentUuidAndName.bind(this),
|
|
66
172
|
});
|
|
173
|
+
if (!folder) {
|
|
174
|
+
throw new errors_utils_1.NotFoundError('Folder not found');
|
|
175
|
+
}
|
|
176
|
+
return folder;
|
|
177
|
+
};
|
|
178
|
+
getFolderMetadataByPath = async (path) => {
|
|
179
|
+
const rootFolderUuid = await auth_service_1.AuthService.instance.getCurrentRootFolder();
|
|
180
|
+
const localFolderDB = await drive_folder_repository_1.FolderRepository.instance.getByPath(path, rootFolderUuid);
|
|
181
|
+
if (localFolderDB) {
|
|
182
|
+
try {
|
|
183
|
+
const folder = await this.getFolderMetaByUuid(localFolderDB.uuid);
|
|
184
|
+
if (folder) {
|
|
185
|
+
return folder;
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
catch {
|
|
189
|
+
logger_utils_1.logger.error('Folder not found when getting folder by path on local DB', { path, rootFolderUuid });
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
return this.getByPath(path, rootFolderUuid);
|
|
67
193
|
};
|
|
68
194
|
}
|
|
69
195
|
exports.DriveFolderService = DriveFolderService;
|
|
@@ -2,6 +2,9 @@ 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
|
+
deleteItemPermanently: (itemType: "file" | "folder", id: string) => Promise<void> | Promise<{
|
|
6
|
+
deleted: boolean;
|
|
7
|
+
}>;
|
|
5
8
|
deleteFile: (fileId: string) => Promise<{
|
|
6
9
|
deleted: boolean;
|
|
7
10
|
}>;
|
|
@@ -2,12 +2,21 @@
|
|
|
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");
|
|
5
6
|
class TrashService {
|
|
6
7
|
static instance = new TrashService();
|
|
7
8
|
trashItems = (payload) => {
|
|
8
9
|
const storageClient = sdk_manager_service_1.SdkManager.instance.getStorage();
|
|
9
10
|
return storageClient.addItemsToTrash(payload);
|
|
10
11
|
};
|
|
12
|
+
deleteItemPermanently = (itemType, id) => {
|
|
13
|
+
if (itemType === 'file') {
|
|
14
|
+
return this.deleteFile(id);
|
|
15
|
+
}
|
|
16
|
+
else {
|
|
17
|
+
return this.deleteFolder(id);
|
|
18
|
+
}
|
|
19
|
+
};
|
|
11
20
|
deleteFile = (fileId) => {
|
|
12
21
|
const storageClient = sdk_manager_service_1.SdkManager.instance.getStorage();
|
|
13
22
|
return storageClient.deleteFileByUuid(fileId);
|
|
@@ -16,34 +25,61 @@ class TrashService {
|
|
|
16
25
|
const storageClient = sdk_manager_service_1.SdkManager.instance.getStorage();
|
|
17
26
|
return storageClient.deleteFolderByUuid(folderId);
|
|
18
27
|
};
|
|
19
|
-
clearTrash = () => {
|
|
20
|
-
const
|
|
21
|
-
|
|
28
|
+
clearTrash = async () => {
|
|
29
|
+
const currentWorkspace = await auth_service_1.AuthService.instance.getCurrentWorkspace();
|
|
30
|
+
const currentWorkspaceCreds = currentWorkspace?.workspaceCredentials;
|
|
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
|
+
}
|
|
22
39
|
};
|
|
23
40
|
getTrashFolderContent = async () => {
|
|
24
|
-
const
|
|
25
|
-
const
|
|
26
|
-
const
|
|
41
|
+
const currentWorkspace = await auth_service_1.AuthService.instance.getCurrentWorkspace();
|
|
42
|
+
const currentWorkspaceCreds = currentWorkspace?.workspaceCredentials;
|
|
43
|
+
const folders = await this.getAllTrashSubfolders(currentWorkspaceCreds, 0);
|
|
44
|
+
const files = await this.getAllTrashSubfiles(currentWorkspaceCreds, 0);
|
|
27
45
|
return { folders, files };
|
|
28
46
|
};
|
|
29
|
-
getAllTrashSubfolders = async (
|
|
30
|
-
|
|
31
|
-
|
|
47
|
+
getAllTrashSubfolders = async (currentWorkspace, offset) => {
|
|
48
|
+
let folders;
|
|
49
|
+
if (currentWorkspace) {
|
|
50
|
+
const workspaceClient = sdk_manager_service_1.SdkManager.instance.getWorkspaces();
|
|
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
|
+
}
|
|
32
59
|
if (folders.length > 0) {
|
|
33
|
-
return folders.concat(await this.getAllTrashSubfolders(
|
|
60
|
+
return folders.concat(await this.getAllTrashSubfolders(currentWorkspace, offset + folders.length));
|
|
34
61
|
}
|
|
35
62
|
else {
|
|
36
63
|
return folders;
|
|
37
64
|
}
|
|
38
65
|
};
|
|
39
|
-
getAllTrashSubfiles = async (
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
66
|
+
getAllTrashSubfiles = async (currentWorkspace, offset) => {
|
|
67
|
+
let files;
|
|
68
|
+
if (currentWorkspace) {
|
|
69
|
+
const workspaceClient = sdk_manager_service_1.SdkManager.instance.getWorkspaces();
|
|
70
|
+
const promise = workspaceClient.getPersonalTrash(currentWorkspace.id, 'file', offset, 50);
|
|
71
|
+
files = (await promise).result;
|
|
44
72
|
}
|
|
45
73
|
else {
|
|
46
|
-
|
|
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
|
+
}
|
|
78
|
+
if (files.length > 0) {
|
|
79
|
+
return files.concat(await this.getAllTrashSubfiles(currentWorkspace, offset + files.length));
|
|
80
|
+
}
|
|
81
|
+
else {
|
|
82
|
+
return files;
|
|
47
83
|
}
|
|
48
84
|
};
|
|
49
85
|
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { WorkspaceData } from '@internxt/sdk/dist/workspaces';
|
|
2
|
+
import { LoginCredentials, WorkspaceCredentialsDetails } from '../../types/command.types';
|
|
3
|
+
export declare class WorkspaceService {
|
|
4
|
+
static readonly instance: WorkspaceService;
|
|
5
|
+
getAvailableWorkspaces: (user: LoginCredentials["user"]) => Promise<WorkspaceData[]>;
|
|
6
|
+
getWorkspaceCredentials: (workspaceId: string) => Promise<WorkspaceCredentialsDetails>;
|
|
7
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.WorkspaceService = void 0;
|
|
4
|
+
const sdk_manager_service_1 = require("../sdk-manager.service");
|
|
5
|
+
const crypto_service_1 = require("../crypto.service");
|
|
6
|
+
class WorkspaceService {
|
|
7
|
+
static instance = new WorkspaceService();
|
|
8
|
+
getAvailableWorkspaces = async (user) => {
|
|
9
|
+
const workspacesClient = sdk_manager_service_1.SdkManager.instance.getWorkspaces();
|
|
10
|
+
const workspaces = await workspacesClient.getWorkspaces();
|
|
11
|
+
const decryptedMnemonicWorkspaces = await crypto_service_1.CryptoService.instance.decryptWorkspacesMnemonic(workspaces.availableWorkspaces, user);
|
|
12
|
+
return decryptedMnemonicWorkspaces;
|
|
13
|
+
};
|
|
14
|
+
getWorkspaceCredentials = async (workspaceId) => {
|
|
15
|
+
const workspacesClient = sdk_manager_service_1.SdkManager.instance.getWorkspaces();
|
|
16
|
+
const workspaceCredentialsRaw = await workspacesClient.getWorkspaceCredentials(workspaceId);
|
|
17
|
+
const workspaceCredentials = {
|
|
18
|
+
id: workspaceCredentialsRaw.workspaceId,
|
|
19
|
+
bucket: workspaceCredentialsRaw.bucket,
|
|
20
|
+
workspaceUserId: workspaceCredentialsRaw.workspaceUserId,
|
|
21
|
+
credentials: {
|
|
22
|
+
user: workspaceCredentialsRaw.credentials.networkUser,
|
|
23
|
+
pass: workspaceCredentialsRaw.credentials.networkPass,
|
|
24
|
+
},
|
|
25
|
+
token: workspaceCredentialsRaw.tokenHeader,
|
|
26
|
+
};
|
|
27
|
+
return workspaceCredentials;
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
exports.WorkspaceService = WorkspaceService;
|
|
@@ -8,4 +8,11 @@ export declare class KeysService {
|
|
|
8
8
|
publicKeyArmored: string;
|
|
9
9
|
revocationCertificate: string;
|
|
10
10
|
}>;
|
|
11
|
+
hybridDecryptMessageWithPrivateKey: ({ encryptedMessageInBase64, privateKeyInBase64, privateKyberKeyInBase64, }: {
|
|
12
|
+
encryptedMessageInBase64: string;
|
|
13
|
+
privateKeyInBase64: string;
|
|
14
|
+
privateKyberKeyInBase64?: string;
|
|
15
|
+
}) => Promise<string>;
|
|
16
|
+
private readonly decryptMessageWithPrivateKey;
|
|
17
|
+
private readonly comparePrivateKeyCiphertextIDs;
|
|
11
18
|
}
|
|
@@ -32,11 +32,16 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
32
32
|
return result;
|
|
33
33
|
};
|
|
34
34
|
})();
|
|
35
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
35
38
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
39
|
exports.KeysService = void 0;
|
|
37
40
|
const lib_1 = require("@internxt/lib");
|
|
38
41
|
const openpgp = __importStar(require("openpgp"));
|
|
39
42
|
const crypto_utils_1 = require("../utils/crypto.utils");
|
|
43
|
+
const pqc_kem_kyber512_node_1 = __importDefault(require("@dashlane/pqc-kem-kyber512-node"));
|
|
44
|
+
const WORDS_HYBRID_MODE_IN_BASE64 = 'SHlicmlkTW9kZQ==';
|
|
40
45
|
class KeysService {
|
|
41
46
|
static instance = new KeysService();
|
|
42
47
|
encryptPrivateKey = (privateKey, password) => {
|
|
@@ -57,5 +62,55 @@ class KeysService {
|
|
|
57
62
|
revocationCertificate: Buffer.from(revocationCertificate).toString('base64'),
|
|
58
63
|
};
|
|
59
64
|
};
|
|
65
|
+
hybridDecryptMessageWithPrivateKey = async ({ encryptedMessageInBase64, privateKeyInBase64, privateKyberKeyInBase64, }) => {
|
|
66
|
+
let eccCiphertextStr = encryptedMessageInBase64;
|
|
67
|
+
let kyberSecret;
|
|
68
|
+
const ciphertexts = encryptedMessageInBase64.split('$');
|
|
69
|
+
const prefix = ciphertexts[0];
|
|
70
|
+
const isHybridMode = prefix === WORDS_HYBRID_MODE_IN_BASE64;
|
|
71
|
+
if (isHybridMode) {
|
|
72
|
+
if (!privateKyberKeyInBase64) {
|
|
73
|
+
throw new Error('Attempted to decrypt hybrid ciphertex without Kyber key');
|
|
74
|
+
}
|
|
75
|
+
const kem = await (0, pqc_kem_kyber512_node_1.default)();
|
|
76
|
+
const kyberCiphertextBase64 = ciphertexts[1];
|
|
77
|
+
eccCiphertextStr = ciphertexts[2];
|
|
78
|
+
const privateKyberKey = Buffer.from(privateKyberKeyInBase64, 'base64');
|
|
79
|
+
const kyberCiphertext = Buffer.from(kyberCiphertextBase64, 'base64');
|
|
80
|
+
const decapsulate = await kem.decapsulate(new Uint8Array(kyberCiphertext), new Uint8Array(privateKyberKey));
|
|
81
|
+
kyberSecret = decapsulate.sharedSecret;
|
|
82
|
+
}
|
|
83
|
+
const decryptedMessage = await this.decryptMessageWithPrivateKey({
|
|
84
|
+
encryptedMessage: atob(eccCiphertextStr),
|
|
85
|
+
privateKeyInBase64,
|
|
86
|
+
});
|
|
87
|
+
if (isHybridMode && kyberSecret) {
|
|
88
|
+
const bits = decryptedMessage.length * 4;
|
|
89
|
+
const secretHex = await crypto_utils_1.CryptoUtils.extendSecret(kyberSecret, bits);
|
|
90
|
+
const xored = crypto_utils_1.CryptoUtils.XORhex(decryptedMessage, secretHex);
|
|
91
|
+
return Buffer.from(xored, 'hex').toString('utf8');
|
|
92
|
+
}
|
|
93
|
+
return decryptedMessage;
|
|
94
|
+
};
|
|
95
|
+
decryptMessageWithPrivateKey = async ({ encryptedMessage, privateKeyInBase64, }) => {
|
|
96
|
+
const privateKeyArmored = Buffer.from(privateKeyInBase64, 'base64').toString();
|
|
97
|
+
const privateKey = await openpgp.readPrivateKey({ armoredKey: privateKeyArmored });
|
|
98
|
+
const message = await openpgp.readMessage({
|
|
99
|
+
armoredMessage: encryptedMessage,
|
|
100
|
+
});
|
|
101
|
+
if (!this.comparePrivateKeyCiphertextIDs(privateKey, message)) {
|
|
102
|
+
throw new Error('The key does not correspond to the ciphertext');
|
|
103
|
+
}
|
|
104
|
+
const { data: decryptedMessage } = await openpgp.decrypt({
|
|
105
|
+
message,
|
|
106
|
+
decryptionKeys: privateKey,
|
|
107
|
+
});
|
|
108
|
+
return decryptedMessage.toString();
|
|
109
|
+
};
|
|
110
|
+
comparePrivateKeyCiphertextIDs = (privateKey, encryptedMessage) => {
|
|
111
|
+
const messageKeyID = encryptedMessage.getEncryptionKeyIDs()[0].toHex();
|
|
112
|
+
const privateKeyID = privateKey.getSubkeys()[0].getKeyID().toHex();
|
|
113
|
+
return messageKeyID === privateKeyID;
|
|
114
|
+
};
|
|
60
115
|
}
|
|
61
116
|
exports.KeysService = KeysService;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { FileSystemNode, ScanResult } from './local-filesystem.types';
|
|
2
2
|
export declare class LocalFilesystemService {
|
|
3
3
|
static readonly instance: LocalFilesystemService;
|
|
4
|
-
scanLocalDirectory(path: string)
|
|
5
|
-
scanRecursive(currentPath: string, parentPath: string, folders: FileSystemNode[], files: FileSystemNode[])
|
|
4
|
+
scanLocalDirectory: (path: string) => Promise<ScanResult>;
|
|
5
|
+
scanRecursive: (currentPath: string, parentPath: string, folders: FileSystemNode[], files: FileSystemNode[]) => Promise<number>;
|
|
6
6
|
}
|
|
@@ -6,7 +6,7 @@ const node_path_1 = require("node:path");
|
|
|
6
6
|
const logger_utils_1 = require("../../utils/logger.utils");
|
|
7
7
|
class LocalFilesystemService {
|
|
8
8
|
static instance = new LocalFilesystemService();
|
|
9
|
-
async
|
|
9
|
+
scanLocalDirectory = async (path) => {
|
|
10
10
|
const folders = [];
|
|
11
11
|
const files = [];
|
|
12
12
|
const parentPath = (0, node_path_1.dirname)(path);
|
|
@@ -17,8 +17,8 @@ class LocalFilesystemService {
|
|
|
17
17
|
totalItems: folders.length + files.length,
|
|
18
18
|
totalBytes,
|
|
19
19
|
};
|
|
20
|
-
}
|
|
21
|
-
async
|
|
20
|
+
};
|
|
21
|
+
scanRecursive = async (currentPath, parentPath, folders, files) => {
|
|
22
22
|
try {
|
|
23
23
|
const stats = await node_fs_1.promises.stat(currentPath);
|
|
24
24
|
const relativePath = (0, node_path_1.relative)(parentPath, currentPath);
|
|
@@ -52,6 +52,6 @@ class LocalFilesystemService {
|
|
|
52
52
|
logger_utils_1.logger.warn(`Error scanning path ${currentPath}: ${error.message} - skipping...`);
|
|
53
53
|
return 0;
|
|
54
54
|
}
|
|
55
|
-
}
|
|
55
|
+
};
|
|
56
56
|
}
|
|
57
57
|
exports.LocalFilesystemService = LocalFilesystemService;
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { DownloadProgressCallback } from '../../types/network.types';
|
|
2
2
|
export declare class DownloadService {
|
|
3
3
|
static readonly instance: DownloadService;
|
|
4
|
-
downloadFile(url: string, options: {
|
|
4
|
+
downloadFile: (url: string, options: {
|
|
5
5
|
progressCallback?: DownloadProgressCallback;
|
|
6
6
|
abortController?: AbortController;
|
|
7
7
|
rangeHeader?: string;
|
|
8
|
-
})
|
|
8
|
+
}) => Promise<ReadableStream<Uint8Array>>;
|
|
9
9
|
}
|
|
@@ -7,7 +7,7 @@ exports.DownloadService = void 0;
|
|
|
7
7
|
const axios_1 = __importDefault(require("axios"));
|
|
8
8
|
class DownloadService {
|
|
9
9
|
static instance = new DownloadService();
|
|
10
|
-
async
|
|
10
|
+
downloadFile = async (url, options) => {
|
|
11
11
|
const response = await axios_1.default.get(url, {
|
|
12
12
|
responseType: 'stream',
|
|
13
13
|
onDownloadProgress(progressEvent) {
|
|
@@ -30,6 +30,6 @@ class DownloadService {
|
|
|
30
30
|
},
|
|
31
31
|
});
|
|
32
32
|
return readable;
|
|
33
|
-
}
|
|
33
|
+
};
|
|
34
34
|
}
|
|
35
35
|
exports.DownloadService = DownloadService;
|
|
@@ -2,17 +2,13 @@ import { Network } from '@internxt/sdk';
|
|
|
2
2
|
import { Environment } from '@internxt/inxt-js';
|
|
3
3
|
import { Readable } from 'node:stream';
|
|
4
4
|
import { DownloadOptions } from '../../types/network.types';
|
|
5
|
-
import { CryptoService } from '../crypto.service';
|
|
6
|
-
import { DownloadService } from './download.service';
|
|
7
5
|
import { RangeOptions } from '../../utils/network.utils';
|
|
8
6
|
import { ActionState } from '@internxt/inxt-js/build/api';
|
|
9
7
|
export declare class NetworkFacade {
|
|
10
8
|
private readonly network;
|
|
11
9
|
private readonly environment;
|
|
12
|
-
private readonly downloadService;
|
|
13
|
-
private readonly cryptoService;
|
|
14
10
|
private readonly cryptoLib;
|
|
15
|
-
constructor(network: Network.Network, environment: Environment
|
|
16
|
-
downloadToStream(bucketId: string, mnemonic: string, fileId: string, size: number, to: WritableStream, rangeOptions?: RangeOptions, options?: DownloadOptions)
|
|
17
|
-
uploadFile(from: Readable, size: number, bucketId: string, finishedCallback: (err: Error | null, res: string | null) => void, progressCallback: (progress: number) => void)
|
|
11
|
+
constructor(network: Network.Network, environment: Environment);
|
|
12
|
+
downloadToStream: (bucketId: string, mnemonic: string, fileId: string, size: number, to: WritableStream, rangeOptions?: RangeOptions, options?: DownloadOptions) => Promise<[Promise<void>, AbortController]>;
|
|
13
|
+
uploadFile: (from: Readable, size: number, bucketId: string, finishedCallback: (err: Error | null, res: string | null) => void, progressCallback: (progress: number) => void) => ActionState;
|
|
18
14
|
}
|
|
@@ -38,19 +38,17 @@ const sdk_1 = require("@internxt/sdk");
|
|
|
38
38
|
const NetworkDownload = __importStar(require("@internxt/sdk/dist/network/download"));
|
|
39
39
|
const inxt_js_1 = require("@internxt/inxt-js");
|
|
40
40
|
const node_crypto_1 = require("node:crypto");
|
|
41
|
+
const crypto_service_1 = require("../crypto.service");
|
|
42
|
+
const download_service_1 = require("./download.service");
|
|
41
43
|
const validation_service_1 = require("../validation.service");
|
|
42
44
|
const TWENTY_GIGABYTES = 20 * 1024 * 1024 * 1024;
|
|
43
45
|
class NetworkFacade {
|
|
44
46
|
network;
|
|
45
47
|
environment;
|
|
46
|
-
downloadService;
|
|
47
|
-
cryptoService;
|
|
48
48
|
cryptoLib;
|
|
49
|
-
constructor(network, environment
|
|
49
|
+
constructor(network, environment) {
|
|
50
50
|
this.network = network;
|
|
51
51
|
this.environment = environment;
|
|
52
|
-
this.downloadService = downloadService;
|
|
53
|
-
this.cryptoService = cryptoService;
|
|
54
52
|
this.cryptoLib = {
|
|
55
53
|
algorithm: sdk_1.Network.ALGORITHMS.AES256CTR,
|
|
56
54
|
validateMnemonic: (mnemonic) => {
|
|
@@ -62,7 +60,7 @@ class NetworkFacade {
|
|
|
62
60
|
randomBytes: node_crypto_1.randomBytes,
|
|
63
61
|
};
|
|
64
62
|
}
|
|
65
|
-
async
|
|
63
|
+
downloadToStream = async (bucketId, mnemonic, fileId, size, to, rangeOptions, options) => {
|
|
66
64
|
const encryptedContentStreams = [];
|
|
67
65
|
let fileStream;
|
|
68
66
|
const abortable = options?.abortController ?? new AbortController();
|
|
@@ -77,7 +75,7 @@ class NetworkFacade {
|
|
|
77
75
|
if (rangeOptions) {
|
|
78
76
|
startOffsetByte = rangeOptions.parsed.start;
|
|
79
77
|
}
|
|
80
|
-
fileStream =
|
|
78
|
+
fileStream = crypto_service_1.CryptoService.instance.decryptStream(encryptedContentStreams, Buffer.from(key), Buffer.from(iv), startOffsetByte);
|
|
81
79
|
await fileStream.pipeTo(to);
|
|
82
80
|
};
|
|
83
81
|
const downloadFile = async (downloadables) => {
|
|
@@ -88,7 +86,7 @@ class NetworkFacade {
|
|
|
88
86
|
if (abortable.signal.aborted) {
|
|
89
87
|
throw new Error('Download aborted');
|
|
90
88
|
}
|
|
91
|
-
const encryptedContentStream = await
|
|
89
|
+
const encryptedContentStream = await download_service_1.DownloadService.instance.downloadFile(downloadable.url, {
|
|
92
90
|
progressCallback: onProgress,
|
|
93
91
|
abortController: options?.abortController,
|
|
94
92
|
rangeHeader: rangeOptions?.range,
|
|
@@ -100,8 +98,8 @@ class NetworkFacade {
|
|
|
100
98
|
await NetworkDownload.downloadFile(fileId, bucketId, mnemonic, this.network, this.cryptoLib, Buffer.from, downloadFile, decryptFile);
|
|
101
99
|
};
|
|
102
100
|
return [downloadOperation(), abortable];
|
|
103
|
-
}
|
|
104
|
-
uploadFile(from, size, bucketId, finishedCallback, progressCallback) {
|
|
101
|
+
};
|
|
102
|
+
uploadFile = (from, size, bucketId, finishedCallback, progressCallback) => {
|
|
105
103
|
if (size > TWENTY_GIGABYTES) {
|
|
106
104
|
throw new Error('File is too big (more than 20 GB)');
|
|
107
105
|
}
|
|
@@ -123,6 +121,6 @@ class NetworkFacade {
|
|
|
123
121
|
progressCallback,
|
|
124
122
|
});
|
|
125
123
|
}
|
|
126
|
-
}
|
|
124
|
+
};
|
|
127
125
|
}
|
|
128
126
|
exports.NetworkFacade = NetworkFacade;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { UploadFolderParams } from './upload.types';
|
|
2
2
|
export declare class UploadFacade {
|
|
3
3
|
static readonly instance: UploadFacade;
|
|
4
|
-
uploadFolder({ localPath, destinationFolderUuid, loginUserDetails, jsonFlag, onProgress }: UploadFolderParams)
|
|
4
|
+
uploadFolder: ({ localPath, destinationFolderUuid, loginUserDetails, jsonFlag, debugMode, onProgress, reporter, }: UploadFolderParams) => Promise<{
|
|
5
5
|
totalBytes: number;
|
|
6
6
|
rootFolderId: string;
|
|
7
7
|
uploadTimeMs: number;
|