@internxt/cli 1.6.1 → 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 +3 -3
- 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/logs.js +3 -3
- 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 +5 -6
- package/dist/commands/upload-file.js +77 -52
- 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 +13 -0
- package/dist/constants/configs.js +21 -0
- package/dist/hooks/prerun/auth_check.js +13 -4
- package/dist/services/auth.service.d.ts +5 -2
- package/dist/services/auth.service.js +68 -6
- package/dist/services/config.service.d.ts +1 -13
- package/dist/services/config.service.js +44 -41
- 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 +15 -8
- package/dist/services/network/upload/upload-file.service.d.ts +5 -4
- package/dist/services/network/upload/upload-file.service.js +73 -41
- 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 +13 -2
- package/dist/services/network/upload/upload.types.js +1 -1
- package/dist/services/sdk-manager.service.d.ts +11 -9
- package/dist/services/sdk-manager.service.js +29 -15
- 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.d.ts +5 -0
- package/dist/services/validation.service.js +36 -22
- 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 +23 -15
- package/dist/utils/cli.utils.js +85 -21
- 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 -3
- package/dist/utils/errors.utils.js +16 -13
- 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/logger.utils.js +5 -5
- package/dist/utils/network.utils.js +17 -18
- 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 +20 -45
- package/dist/utils/webdav.utils.d.ts +4 -20
- package/dist/utils/webdav.utils.js +12 -14
- package/dist/utils/xml.utils.d.ts +1 -1
- package/dist/utils/xml.utils.js +1 -1
- 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 -13
- 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 +70 -57
- 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 +3 -3
- 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 +33 -91
- package/oclif.manifest.json +429 -6
- package/package.json +27 -22
|
@@ -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;
|
|
@@ -3,18 +3,21 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.UploadFacade = void 0;
|
|
4
4
|
const node_path_1 = require("node:path");
|
|
5
5
|
const cli_utils_1 = require("../../../utils/cli.utils");
|
|
6
|
-
const logger_utils_1 = require("../../../utils/logger.utils");
|
|
7
6
|
const local_filesystem_service_1 = require("../../local-filesystem/local-filesystem.service");
|
|
8
7
|
const upload_folder_service_1 = require("./upload-folder.service");
|
|
9
8
|
const upload_file_service_1 = require("./upload-file.service");
|
|
10
9
|
const async_utils_1 = require("../../../utils/async.utils");
|
|
11
10
|
class UploadFacade {
|
|
12
11
|
static instance = new UploadFacade();
|
|
13
|
-
async
|
|
12
|
+
uploadFolder = async ({ localPath, destinationFolderUuid, loginUserDetails, jsonFlag, debugMode, onProgress, reporter, }) => {
|
|
14
13
|
const timer = cli_utils_1.CLIUtils.timer();
|
|
15
|
-
|
|
14
|
+
cli_utils_1.CLIUtils.doing('Preparing Network', jsonFlag);
|
|
15
|
+
const { networkFacade, bucket } = await cli_utils_1.CLIUtils.prepareNetwork(loginUserDetails);
|
|
16
|
+
cli_utils_1.CLIUtils.done(jsonFlag);
|
|
16
17
|
const scanResult = await local_filesystem_service_1.LocalFilesystemService.instance.scanLocalDirectory(localPath);
|
|
17
|
-
|
|
18
|
+
if (debugMode) {
|
|
19
|
+
cli_utils_1.CLIUtils.success(reporter, `Scanned folder ${localPath}: found ${scanResult.totalItems} items, total size ${scanResult.totalBytes} bytes.`);
|
|
20
|
+
}
|
|
18
21
|
const currentProgress = { itemsUploaded: 0, bytesUploaded: 0 };
|
|
19
22
|
const emitProgress = () => {
|
|
20
23
|
const itemProgress = currentProgress.itemsUploaded / scanResult.totalItems;
|
|
@@ -27,19 +30,23 @@ class UploadFacade {
|
|
|
27
30
|
destinationFolderUuid,
|
|
28
31
|
currentProgress,
|
|
29
32
|
emitProgress,
|
|
33
|
+
reporter,
|
|
34
|
+
debugMode,
|
|
30
35
|
});
|
|
31
36
|
if (folderMap.size === 0) {
|
|
32
37
|
throw new Error('Failed to create folders, cannot upload files');
|
|
33
38
|
}
|
|
34
39
|
await async_utils_1.AsyncUtils.sleep(500);
|
|
35
|
-
const totalBytes = await upload_file_service_1.UploadFileService.instance.
|
|
36
|
-
network,
|
|
40
|
+
const totalBytes = await upload_file_service_1.UploadFileService.instance.uploadFilesConcurrently({
|
|
41
|
+
network: networkFacade,
|
|
37
42
|
filesToUpload: scanResult.files,
|
|
38
43
|
folderMap,
|
|
39
|
-
bucket
|
|
44
|
+
bucket,
|
|
40
45
|
destinationFolderUuid,
|
|
41
46
|
currentProgress,
|
|
42
47
|
emitProgress,
|
|
48
|
+
debugMode,
|
|
49
|
+
reporter,
|
|
43
50
|
});
|
|
44
51
|
const rootFolderName = (0, node_path_1.basename)(localPath);
|
|
45
52
|
const rootFolderId = folderMap.get(rootFolderName) ?? '';
|
|
@@ -48,6 +55,6 @@ class UploadFacade {
|
|
|
48
55
|
rootFolderId,
|
|
49
56
|
uploadTimeMs: timer.stop(),
|
|
50
57
|
};
|
|
51
|
-
}
|
|
58
|
+
};
|
|
52
59
|
}
|
|
53
60
|
exports.UploadFacade = UploadFacade;
|
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { UploadFilesConcurrentlyParams, UploadFileWithRetryParams } from './upload.types';
|
|
2
|
+
import { DriveFileItem } from '../../../types/drive.types';
|
|
2
3
|
export declare class UploadFileService {
|
|
3
4
|
static readonly instance: UploadFileService;
|
|
4
|
-
|
|
5
|
-
uploadFileWithRetry({ file, network, bucket, parentFolderUuid, }: UploadFileWithRetryParams)
|
|
6
|
-
private
|
|
5
|
+
uploadFilesConcurrently: ({ network, filesToUpload, folderMap, bucket, destinationFolderUuid, currentProgress, emitProgress, debugMode, reporter, }: UploadFilesConcurrentlyParams) => Promise<number>;
|
|
6
|
+
uploadFileWithRetry: ({ file, network, bucket, parentFolderUuid, debugMode, reporter, }: UploadFileWithRetryParams) => Promise<DriveFileItem | null>;
|
|
7
|
+
private readonly concurrencyArray;
|
|
7
8
|
}
|
|
@@ -8,18 +8,21 @@ const node_path_1 = require("node:path");
|
|
|
8
8
|
const errors_utils_1 = require("../../../utils/errors.utils");
|
|
9
9
|
const promises_1 = require("node:fs/promises");
|
|
10
10
|
const types_1 = require("@internxt/sdk/dist/drive/storage/types");
|
|
11
|
-
const
|
|
11
|
+
const cli_utils_1 = require("../../../utils/cli.utils");
|
|
12
|
+
const thumbnail_service_1 = require("../../thumbnail.service");
|
|
12
13
|
class UploadFileService {
|
|
13
14
|
static instance = new UploadFileService();
|
|
14
|
-
async
|
|
15
|
+
uploadFilesConcurrently = async ({ network, filesToUpload, folderMap, bucket, destinationFolderUuid, currentProgress, emitProgress, debugMode, reporter, }) => {
|
|
15
16
|
let bytesUploaded = 0;
|
|
16
|
-
const
|
|
17
|
-
for (const
|
|
18
|
-
await Promise.allSettled(
|
|
17
|
+
const concurrentFiles = this.concurrencyArray(filesToUpload, upload_types_1.MAX_CONCURRENT_UPLOADS);
|
|
18
|
+
for (const fileArray of concurrentFiles) {
|
|
19
|
+
await Promise.allSettled(fileArray.map(async (file) => {
|
|
19
20
|
const parentPath = (0, node_path_1.dirname)(file.relativePath);
|
|
20
21
|
const parentFolderUuid = parentPath === '.' || parentPath === '' ? destinationFolderUuid : folderMap.get(parentPath);
|
|
21
22
|
if (!parentFolderUuid) {
|
|
22
|
-
|
|
23
|
+
if (debugMode) {
|
|
24
|
+
cli_utils_1.CLIUtils.warning(reporter, `Parent folder not found for ${file.relativePath}, skipping...`);
|
|
25
|
+
}
|
|
23
26
|
return null;
|
|
24
27
|
}
|
|
25
28
|
const createdFileUuid = await this.uploadFileWithRetry({
|
|
@@ -27,6 +30,8 @@ class UploadFileService {
|
|
|
27
30
|
network,
|
|
28
31
|
bucket,
|
|
29
32
|
parentFolderUuid,
|
|
33
|
+
debugMode,
|
|
34
|
+
reporter,
|
|
30
35
|
});
|
|
31
36
|
if (createdFileUuid) {
|
|
32
37
|
bytesUploaded += file.size;
|
|
@@ -37,32 +42,42 @@ class UploadFileService {
|
|
|
37
42
|
}));
|
|
38
43
|
}
|
|
39
44
|
return bytesUploaded;
|
|
40
|
-
}
|
|
41
|
-
async
|
|
45
|
+
};
|
|
46
|
+
uploadFileWithRetry = async ({ file, network, bucket, parentFolderUuid, debugMode, reporter, }) => {
|
|
42
47
|
for (let attempt = 0; attempt <= upload_types_1.MAX_RETRIES; attempt++) {
|
|
43
48
|
try {
|
|
44
49
|
const stats = await (0, promises_1.stat)(file.absolutePath);
|
|
45
|
-
|
|
46
|
-
logger_utils_1.logger.warn(`Skipping empty file: ${file.relativePath}`);
|
|
47
|
-
return null;
|
|
48
|
-
}
|
|
50
|
+
const fileSize = stats.size ?? 0;
|
|
49
51
|
const fileType = (0, node_path_1.extname)(file.absolutePath).replaceAll('.', '');
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
52
|
+
let fileId;
|
|
53
|
+
let thumbnailStream;
|
|
54
|
+
const timings = {
|
|
55
|
+
networkUpload: 0,
|
|
56
|
+
driveUpload: 0,
|
|
57
|
+
thumbnailUpload: 0,
|
|
58
|
+
};
|
|
59
|
+
if (fileSize > 0) {
|
|
60
|
+
const { fileStream, bufferStream } = thumbnail_service_1.ThumbnailService.instance.createFileStreamWithBuffer({
|
|
61
|
+
path: file.absolutePath,
|
|
62
|
+
fileType,
|
|
63
|
+
});
|
|
64
|
+
const uploadTimer = cli_utils_1.CLIUtils.timer();
|
|
65
|
+
thumbnailStream = bufferStream;
|
|
66
|
+
fileId = await new Promise((resolve, reject) => {
|
|
67
|
+
network.uploadFile(fileStream, fileSize, bucket, (err, res) => {
|
|
68
|
+
if (err) {
|
|
69
|
+
return reject(err);
|
|
70
|
+
}
|
|
71
|
+
resolve(res);
|
|
72
|
+
}, () => { });
|
|
73
|
+
});
|
|
74
|
+
timings.networkUpload = uploadTimer.stop();
|
|
75
|
+
}
|
|
76
|
+
const driveTimer = cli_utils_1.CLIUtils.timer();
|
|
62
77
|
const createdDriveFile = await drive_file_service_1.DriveFileService.instance.createFile({
|
|
63
78
|
plainName: file.name,
|
|
64
79
|
type: fileType,
|
|
65
|
-
size:
|
|
80
|
+
size: fileSize,
|
|
66
81
|
folderUuid: parentFolderUuid,
|
|
67
82
|
fileId,
|
|
68
83
|
bucket,
|
|
@@ -70,43 +85,60 @@ class UploadFileService {
|
|
|
70
85
|
creationTime: stats.birthtime?.toISOString(),
|
|
71
86
|
modificationTime: stats.mtime?.toISOString(),
|
|
72
87
|
});
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
88
|
+
timings.driveUpload = driveTimer.stop();
|
|
89
|
+
const thumbnailTimer = cli_utils_1.CLIUtils.timer();
|
|
90
|
+
if (thumbnailStream && fileSize > 0) {
|
|
91
|
+
await thumbnail_service_1.ThumbnailService.instance.tryUploadThumbnail({
|
|
92
|
+
bufferStream: thumbnailStream,
|
|
76
93
|
fileType,
|
|
77
|
-
|
|
94
|
+
bucket,
|
|
78
95
|
fileUuid: createdDriveFile.uuid,
|
|
79
96
|
networkFacade: network,
|
|
97
|
+
size: fileSize,
|
|
80
98
|
});
|
|
81
99
|
}
|
|
82
|
-
|
|
100
|
+
timings.thumbnailUpload = thumbnailTimer.stop();
|
|
101
|
+
if (debugMode) {
|
|
102
|
+
const totalTime = Object.values(timings).reduce((sum, time) => sum + time, 0);
|
|
103
|
+
const throughputMBps = cli_utils_1.CLIUtils.calculateThroughputMBps(stats.size, timings.networkUpload);
|
|
104
|
+
cli_utils_1.CLIUtils.success(reporter, `Uploaded '${file.name}' (${cli_utils_1.CLIUtils.formatBytesToString(stats.size)})`);
|
|
105
|
+
cli_utils_1.CLIUtils.log(reporter, 'Timing breakdown:\n' +
|
|
106
|
+
`Network upload: ${cli_utils_1.CLIUtils.formatDuration(timings.networkUpload)}` +
|
|
107
|
+
` (${throughputMBps.toFixed(2)} MB/s)\n` +
|
|
108
|
+
`Drive upload: ${cli_utils_1.CLIUtils.formatDuration(timings.driveUpload)}\n` +
|
|
109
|
+
`Thumbnail: ${cli_utils_1.CLIUtils.formatDuration(timings.thumbnailUpload)}\n` +
|
|
110
|
+
`Total: ${cli_utils_1.CLIUtils.formatDuration(totalTime)}\n`);
|
|
111
|
+
}
|
|
112
|
+
return createdDriveFile;
|
|
83
113
|
}
|
|
84
114
|
catch (error) {
|
|
85
|
-
if (
|
|
115
|
+
if (errors_utils_1.ErrorUtils.isAlreadyExistsError(error)) {
|
|
86
116
|
const msg = `File ${file.name} already exists, skipping...`;
|
|
87
117
|
logger_utils_1.logger.info(msg);
|
|
88
118
|
return null;
|
|
89
119
|
}
|
|
90
120
|
if (attempt < upload_types_1.MAX_RETRIES) {
|
|
91
121
|
const delay = upload_types_1.DELAYS_MS[attempt];
|
|
92
|
-
|
|
93
|
-
|
|
122
|
+
if (debugMode) {
|
|
123
|
+
const retryMsg = `Failed to upload file ${file.name}, retrying in ${delay}ms...`;
|
|
124
|
+
cli_utils_1.CLIUtils.warning(reporter, `${retryMsg} (attempt ${attempt + 1}/${upload_types_1.MAX_RETRIES + 1})`);
|
|
125
|
+
}
|
|
94
126
|
await new Promise((resolve) => setTimeout(resolve, delay));
|
|
95
127
|
}
|
|
96
128
|
else {
|
|
97
|
-
|
|
129
|
+
cli_utils_1.CLIUtils.error(reporter, `Failed to upload file '${file.name}' after ${upload_types_1.MAX_RETRIES + 1} attempts`);
|
|
98
130
|
return null;
|
|
99
131
|
}
|
|
100
132
|
}
|
|
101
133
|
}
|
|
102
134
|
return null;
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
const
|
|
106
|
-
for (let i = 0; i < array.length; i +=
|
|
107
|
-
|
|
135
|
+
};
|
|
136
|
+
concurrencyArray = (array, arraySize) => {
|
|
137
|
+
const arrays = [];
|
|
138
|
+
for (let i = 0; i < array.length; i += arraySize) {
|
|
139
|
+
arrays.push(array.slice(i, i + arraySize));
|
|
108
140
|
}
|
|
109
|
-
return
|
|
110
|
-
}
|
|
141
|
+
return arrays;
|
|
142
|
+
};
|
|
111
143
|
}
|
|
112
144
|
exports.UploadFileService = UploadFileService;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { CreateFoldersParams, CreateFolderWithRetryParams } from './upload.types';
|
|
2
2
|
export declare class UploadFolderService {
|
|
3
3
|
static readonly instance: UploadFolderService;
|
|
4
|
-
createFolders({ foldersToCreate, destinationFolderUuid, currentProgress, emitProgress, }: CreateFoldersParams)
|
|
5
|
-
createFolderWithRetry({ folderName, parentFolderUuid }: CreateFolderWithRetryParams)
|
|
4
|
+
createFolders: ({ foldersToCreate, destinationFolderUuid, currentProgress, emitProgress, debugMode, reporter, }: CreateFoldersParams) => Promise<Map<string, string>>;
|
|
5
|
+
createFolderWithRetry: ({ folderName, parentFolderUuid, debugMode, reporter, }: CreateFolderWithRetryParams) => Promise<string | null>;
|
|
6
6
|
}
|
|
@@ -6,9 +6,10 @@ const errors_utils_1 = require("../../../utils/errors.utils");
|
|
|
6
6
|
const logger_utils_1 = require("../../../utils/logger.utils");
|
|
7
7
|
const drive_folder_service_1 = require("../../drive/drive-folder.service");
|
|
8
8
|
const upload_types_1 = require("./upload.types");
|
|
9
|
+
const cli_utils_1 = require("../../../utils/cli.utils");
|
|
9
10
|
class UploadFolderService {
|
|
10
11
|
static instance = new UploadFolderService();
|
|
11
|
-
async
|
|
12
|
+
createFolders = async ({ foldersToCreate, destinationFolderUuid, currentProgress, emitProgress, debugMode, reporter, }) => {
|
|
12
13
|
const folderMap = new Map();
|
|
13
14
|
for (const folder of foldersToCreate) {
|
|
14
15
|
const parentPath = (0, node_path_1.dirname)(folder.relativePath);
|
|
@@ -20,6 +21,8 @@ class UploadFolderService {
|
|
|
20
21
|
const createdFolderUuid = await this.createFolderWithRetry({
|
|
21
22
|
folderName: folder.name,
|
|
22
23
|
parentFolderUuid: parentUuid,
|
|
24
|
+
debugMode,
|
|
25
|
+
reporter,
|
|
23
26
|
});
|
|
24
27
|
if (createdFolderUuid) {
|
|
25
28
|
folderMap.set(folder.relativePath, createdFolderUuid);
|
|
@@ -28,11 +31,11 @@ class UploadFolderService {
|
|
|
28
31
|
}
|
|
29
32
|
}
|
|
30
33
|
return folderMap;
|
|
31
|
-
}
|
|
32
|
-
async
|
|
34
|
+
};
|
|
35
|
+
createFolderWithRetry = async ({ folderName, parentFolderUuid, debugMode, reporter, }) => {
|
|
33
36
|
for (let attempt = 0; attempt <= upload_types_1.MAX_RETRIES; attempt++) {
|
|
34
37
|
try {
|
|
35
|
-
const [createFolderPromise] = drive_folder_service_1.DriveFolderService.instance.createFolder({
|
|
38
|
+
const [createFolderPromise] = await drive_folder_service_1.DriveFolderService.instance.createFolder({
|
|
36
39
|
plainName: folderName,
|
|
37
40
|
parentFolderUuid,
|
|
38
41
|
});
|
|
@@ -40,23 +43,25 @@ class UploadFolderService {
|
|
|
40
43
|
return createdFolder.uuid;
|
|
41
44
|
}
|
|
42
45
|
catch (error) {
|
|
43
|
-
if (
|
|
44
|
-
logger_utils_1.logger.
|
|
46
|
+
if (errors_utils_1.ErrorUtils.isAlreadyExistsError(error)) {
|
|
47
|
+
logger_utils_1.logger.warn(`Folder ${folderName} already exists, skipping...`);
|
|
45
48
|
return null;
|
|
46
49
|
}
|
|
47
50
|
if (attempt < upload_types_1.MAX_RETRIES) {
|
|
48
51
|
const delay = upload_types_1.DELAYS_MS[attempt];
|
|
49
|
-
|
|
50
|
-
|
|
52
|
+
if (debugMode) {
|
|
53
|
+
cli_utils_1.CLIUtils.warning(reporter, `Failed to create folder '${folderName}', retrying in ${delay}ms... ` +
|
|
54
|
+
`(attempt ${attempt + 1}/${upload_types_1.MAX_RETRIES + 1})`);
|
|
55
|
+
}
|
|
51
56
|
await new Promise((resolve) => setTimeout(resolve, delay));
|
|
52
57
|
}
|
|
53
58
|
else {
|
|
54
|
-
|
|
59
|
+
cli_utils_1.CLIUtils.error(reporter, `Failed to create folder '${folderName}' after ${upload_types_1.MAX_RETRIES + 1} attempts`);
|
|
55
60
|
throw error;
|
|
56
61
|
}
|
|
57
62
|
}
|
|
58
63
|
}
|
|
59
64
|
return null;
|
|
60
|
-
}
|
|
65
|
+
};
|
|
61
66
|
}
|
|
62
67
|
exports.UploadFolderService = UploadFolderService;
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { LoginUserDetails } from '../../../types/command.types';
|
|
2
|
+
import { LogReporter } from '../../../utils/cli.utils';
|
|
2
3
|
import { FileSystemNode } from '../../local-filesystem/local-filesystem.types';
|
|
3
4
|
import { NetworkFacade } from '../network-facade.service';
|
|
4
5
|
export interface UploadResult {
|
|
@@ -12,6 +13,8 @@ export interface UploadFolderParams {
|
|
|
12
13
|
loginUserDetails: LoginUserDetails;
|
|
13
14
|
jsonFlag?: boolean;
|
|
14
15
|
onProgress: (progress: UploadProgress) => void;
|
|
16
|
+
debugMode: boolean;
|
|
17
|
+
reporter: LogReporter;
|
|
15
18
|
}
|
|
16
19
|
export interface UploadProgress {
|
|
17
20
|
percentage: number;
|
|
@@ -25,12 +28,16 @@ export interface CreateFoldersParams {
|
|
|
25
28
|
bytesUploaded: number;
|
|
26
29
|
};
|
|
27
30
|
emitProgress: () => void;
|
|
31
|
+
debugMode: boolean;
|
|
32
|
+
reporter: LogReporter;
|
|
28
33
|
}
|
|
29
34
|
export interface CreateFolderWithRetryParams {
|
|
30
35
|
folderName: string;
|
|
31
36
|
parentFolderUuid: string;
|
|
37
|
+
debugMode: boolean;
|
|
38
|
+
reporter: LogReporter;
|
|
32
39
|
}
|
|
33
|
-
export interface
|
|
40
|
+
export interface UploadFilesConcurrentlyParams {
|
|
34
41
|
network: NetworkFacade;
|
|
35
42
|
filesToUpload: FileSystemNode[];
|
|
36
43
|
folderMap: Map<string, string>;
|
|
@@ -41,13 +48,17 @@ export interface UploadFilesInBatchesParams {
|
|
|
41
48
|
bytesUploaded: number;
|
|
42
49
|
};
|
|
43
50
|
emitProgress: () => void;
|
|
51
|
+
debugMode: boolean;
|
|
52
|
+
reporter: LogReporter;
|
|
44
53
|
}
|
|
45
54
|
export interface UploadFileWithRetryParams {
|
|
46
55
|
file: FileSystemNode;
|
|
47
56
|
network: NetworkFacade;
|
|
48
57
|
bucket: string;
|
|
49
58
|
parentFolderUuid: string;
|
|
59
|
+
debugMode: boolean;
|
|
60
|
+
reporter: LogReporter;
|
|
50
61
|
}
|
|
51
|
-
export declare const MAX_CONCURRENT_UPLOADS =
|
|
62
|
+
export declare const MAX_CONCURRENT_UPLOADS = 10;
|
|
52
63
|
export declare const DELAYS_MS: number[];
|
|
53
64
|
export declare const MAX_RETRIES = 2;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.MAX_RETRIES = exports.DELAYS_MS = exports.MAX_CONCURRENT_UPLOADS = void 0;
|
|
4
|
-
exports.MAX_CONCURRENT_UPLOADS =
|
|
4
|
+
exports.MAX_CONCURRENT_UPLOADS = 10;
|
|
5
5
|
exports.DELAYS_MS = [500, 1000, 2000];
|
|
6
6
|
exports.MAX_RETRIES = 2;
|
|
@@ -1,22 +1,24 @@
|
|
|
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';
|
|
3
4
|
export type SdkManagerApiSecurity = ApiSecurity;
|
|
4
5
|
export declare class SdkManager {
|
|
5
6
|
static readonly instance: SdkManager;
|
|
6
7
|
private static apiSecurity?;
|
|
7
8
|
static readonly init: (apiSecurity: SdkManagerApiSecurity) => void;
|
|
8
9
|
static readonly clean: () => void;
|
|
9
|
-
static readonly getApiSecurity: (
|
|
10
|
-
throwErrorOnMissingCredentials
|
|
10
|
+
static readonly getApiSecurity: ({ throwErrorOnMissingCredentials }?: {
|
|
11
|
+
throwErrorOnMissingCredentials?: boolean | undefined;
|
|
11
12
|
}) => SdkManagerApiSecurity;
|
|
12
13
|
static readonly getAppDetails: () => AppDetails;
|
|
13
|
-
getAuth()
|
|
14
|
-
getUsers()
|
|
15
|
-
getStorage()
|
|
16
|
-
getTrash()
|
|
17
|
-
getShare()
|
|
18
|
-
|
|
14
|
+
getAuth: () => Auth;
|
|
15
|
+
getUsers: () => Drive.Users;
|
|
16
|
+
getStorage: () => Drive.Storage;
|
|
17
|
+
getTrash: () => Drive.Trash;
|
|
18
|
+
getShare: () => Drive.Share;
|
|
19
|
+
getWorkspaces: () => Workspaces;
|
|
20
|
+
getNetwork: (credentials: {
|
|
19
21
|
user: string;
|
|
20
22
|
pass: string;
|
|
21
|
-
})
|
|
23
|
+
}) => NetworkModule.Network;
|
|
22
24
|
}
|
|
@@ -9,17 +9,25 @@ 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
|
+
const MAX_RETRIES = 3;
|
|
12
14
|
class SdkManager {
|
|
13
15
|
static instance = new SdkManager();
|
|
14
16
|
static apiSecurity;
|
|
15
17
|
static init = (apiSecurity) => {
|
|
16
|
-
|
|
18
|
+
const newApiSecurity = {
|
|
19
|
+
...apiSecurity,
|
|
20
|
+
retryOptions: {
|
|
21
|
+
maxRetries: MAX_RETRIES,
|
|
22
|
+
},
|
|
23
|
+
};
|
|
24
|
+
SdkManager.apiSecurity = newApiSecurity;
|
|
17
25
|
};
|
|
18
26
|
static clean = () => {
|
|
19
27
|
SdkManager.apiSecurity = undefined;
|
|
20
28
|
};
|
|
21
|
-
static getApiSecurity = (
|
|
22
|
-
if (!SdkManager.apiSecurity &&
|
|
29
|
+
static getApiSecurity = ({ throwErrorOnMissingCredentials = true } = {}) => {
|
|
30
|
+
if (!SdkManager.apiSecurity && throwErrorOnMissingCredentials)
|
|
23
31
|
throw new Error('Api security properties not found in SdkManager');
|
|
24
32
|
return SdkManager.apiSecurity;
|
|
25
33
|
};
|
|
@@ -30,37 +38,43 @@ class SdkManager {
|
|
|
30
38
|
desktopHeader: config_service_1.ConfigService.instance.get('DESKTOP_HEADER'),
|
|
31
39
|
};
|
|
32
40
|
};
|
|
33
|
-
getAuth() {
|
|
41
|
+
getAuth = () => {
|
|
34
42
|
const DRIVE_API_URL = config_service_1.ConfigService.instance.get('DRIVE_NEW_API_URL');
|
|
35
43
|
const apiSecurity = SdkManager.getApiSecurity({ throwErrorOnMissingCredentials: false });
|
|
36
44
|
const appDetails = SdkManager.getAppDetails();
|
|
37
45
|
return sdk_1.Auth.client(DRIVE_API_URL, appDetails, apiSecurity);
|
|
38
|
-
}
|
|
39
|
-
getUsers() {
|
|
46
|
+
};
|
|
47
|
+
getUsers = () => {
|
|
40
48
|
const DRIVE_API_URL = config_service_1.ConfigService.instance.get('DRIVE_NEW_API_URL');
|
|
41
49
|
const apiSecurity = SdkManager.getApiSecurity({ throwErrorOnMissingCredentials: false });
|
|
42
50
|
const appDetails = SdkManager.getAppDetails();
|
|
43
51
|
return sdk_1.Drive.Users.client(DRIVE_API_URL, appDetails, apiSecurity);
|
|
44
|
-
}
|
|
45
|
-
getStorage() {
|
|
52
|
+
};
|
|
53
|
+
getStorage = () => {
|
|
46
54
|
const DRIVE_API_URL = config_service_1.ConfigService.instance.get('DRIVE_NEW_API_URL');
|
|
47
55
|
const apiSecurity = SdkManager.getApiSecurity();
|
|
48
56
|
const appDetails = SdkManager.getAppDetails();
|
|
49
57
|
return sdk_1.Drive.Storage.client(DRIVE_API_URL, appDetails, apiSecurity);
|
|
50
|
-
}
|
|
51
|
-
getTrash() {
|
|
58
|
+
};
|
|
59
|
+
getTrash = () => {
|
|
52
60
|
const DRIVE_NEW_API_URL = config_service_1.ConfigService.instance.get('DRIVE_NEW_API_URL');
|
|
53
61
|
const apiSecurity = SdkManager.getApiSecurity();
|
|
54
62
|
const appDetails = SdkManager.getAppDetails();
|
|
55
63
|
return drive_1.Trash.client(DRIVE_NEW_API_URL, appDetails, apiSecurity);
|
|
56
|
-
}
|
|
57
|
-
getShare() {
|
|
64
|
+
};
|
|
65
|
+
getShare = () => {
|
|
58
66
|
const DRIVE_NEW_API_URL = config_service_1.ConfigService.instance.get('DRIVE_NEW_API_URL');
|
|
59
67
|
const apiSecurity = SdkManager.getApiSecurity();
|
|
60
68
|
const appDetails = SdkManager.getAppDetails();
|
|
61
69
|
return sdk_1.Drive.Share.client(DRIVE_NEW_API_URL, appDetails, apiSecurity);
|
|
62
|
-
}
|
|
63
|
-
|
|
70
|
+
};
|
|
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
|
+
getNetwork = (credentials) => {
|
|
64
78
|
const appDetails = SdkManager.getAppDetails();
|
|
65
79
|
const auth = network_utils_1.NetworkUtils.getAuthFromCredentials({
|
|
66
80
|
user: credentials.user,
|
|
@@ -70,6 +84,6 @@ class SdkManager {
|
|
|
70
84
|
bridgeUser: auth.username,
|
|
71
85
|
userId: auth.password,
|
|
72
86
|
});
|
|
73
|
-
}
|
|
87
|
+
};
|
|
74
88
|
}
|
|
75
89
|
exports.SdkManager = SdkManager;
|