@internxt/cli 0.1.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (144) hide show
  1. package/.env +11 -0
  2. package/README.md +297 -0
  3. package/bin/dev.cmd +3 -0
  4. package/bin/dev.js +7 -0
  5. package/bin/run.cmd +3 -0
  6. package/bin/run.js +7 -0
  7. package/dist/commands/config.d.ts +18 -0
  8. package/dist/commands/config.js +50 -0
  9. package/dist/commands/download.d.ts +19 -0
  10. package/dist/commands/download.js +119 -0
  11. package/dist/commands/list.d.ts +22 -0
  12. package/dist/commands/list.js +125 -0
  13. package/dist/commands/login.d.ts +21 -0
  14. package/dist/commands/login.js +124 -0
  15. package/dist/commands/logout.d.ts +9 -0
  16. package/dist/commands/logout.js +28 -0
  17. package/dist/commands/logs.d.ts +6 -0
  18. package/dist/commands/logs.js +12 -0
  19. package/dist/commands/move.d.ts +18 -0
  20. package/dist/commands/move.js +109 -0
  21. package/dist/commands/trash.d.ts +15 -0
  22. package/dist/commands/trash.js +85 -0
  23. package/dist/commands/upload.d.ts +15 -0
  24. package/dist/commands/upload.js +93 -0
  25. package/dist/commands/webdav.d.ts +12 -0
  26. package/dist/commands/webdav.js +64 -0
  27. package/dist/commands/whoami.d.ts +9 -0
  28. package/dist/commands/whoami.js +27 -0
  29. package/dist/database/migrations/20240402164914-create-files.d.ts +1 -0
  30. package/dist/database/migrations/20240402164914-create-files.js +55 -0
  31. package/dist/database/migrations/20240402165418-create-folders.d.ts +1 -0
  32. package/dist/database/migrations/20240402165418-create-folders.js +37 -0
  33. package/dist/hooks/prerun/auth_check.d.ts +3 -0
  34. package/dist/hooks/prerun/auth_check.js +32 -0
  35. package/dist/index.d.ts +1 -0
  36. package/dist/index.js +5 -0
  37. package/dist/services/auth.service.d.ts +14 -0
  38. package/dist/services/auth.service.js +79 -0
  39. package/dist/services/config.service.d.ts +19 -0
  40. package/dist/services/config.service.js +79 -0
  41. package/dist/services/crypto.service.d.ts +22 -0
  42. package/dist/services/crypto.service.js +126 -0
  43. package/dist/services/database/drive-database-manager.service.d.ts +18 -0
  44. package/dist/services/database/drive-database-manager.service.js +76 -0
  45. package/dist/services/database/drive-file/drive-file.attributes.d.ts +14 -0
  46. package/dist/services/database/drive-file/drive-file.attributes.js +2 -0
  47. package/dist/services/database/drive-file/drive-file.domain.d.ts +18 -0
  48. package/dist/services/database/drive-file/drive-file.domain.js +51 -0
  49. package/dist/services/database/drive-file/drive-file.model.d.ts +17 -0
  50. package/dist/services/database/drive-file/drive-file.model.js +82 -0
  51. package/dist/services/database/drive-file/drive-file.repository.d.ts +11 -0
  52. package/dist/services/database/drive-file/drive-file.repository.js +40 -0
  53. package/dist/services/database/drive-folder/drive-folder.attributes.d.ts +9 -0
  54. package/dist/services/database/drive-folder/drive-folder.attributes.js +2 -0
  55. package/dist/services/database/drive-folder/drive-folder.domain.d.ts +13 -0
  56. package/dist/services/database/drive-folder/drive-folder.domain.js +36 -0
  57. package/dist/services/database/drive-folder/drive-folder.model.d.ts +12 -0
  58. package/dist/services/database/drive-folder/drive-folder.model.js +56 -0
  59. package/dist/services/database/drive-folder/drive-folder.repository.d.ts +11 -0
  60. package/dist/services/database/drive-folder/drive-folder.repository.js +40 -0
  61. package/dist/services/drive/drive-file.service.d.ts +15 -0
  62. package/dist/services/drive/drive-file.service.js +51 -0
  63. package/dist/services/drive/drive-folder.service.d.ts +15 -0
  64. package/dist/services/drive/drive-folder.service.js +49 -0
  65. package/dist/services/drive/trash.service.d.ts +5 -0
  66. package/dist/services/drive/trash.service.js +12 -0
  67. package/dist/services/keys.service.d.ts +14 -0
  68. package/dist/services/keys.service.js +110 -0
  69. package/dist/services/network/download.service.d.ts +7 -0
  70. package/dist/services/network/download.service.js +33 -0
  71. package/dist/services/network/network-facade.service.d.ts +21 -0
  72. package/dist/services/network/network-facade.service.js +128 -0
  73. package/dist/services/network/upload.service.d.ts +9 -0
  74. package/dist/services/network/upload.service.js +20 -0
  75. package/dist/services/realms/drive-files.realm.d.ts +23 -0
  76. package/dist/services/realms/drive-files.realm.js +76 -0
  77. package/dist/services/realms/drive-folders.realm.d.ts +20 -0
  78. package/dist/services/realms/drive-folders.realm.js +68 -0
  79. package/dist/services/realms/drive-realm-manager.service.d.ts +15 -0
  80. package/dist/services/realms/drive-realm-manager.service.js +63 -0
  81. package/dist/services/sdk-manager.service.d.ts +28 -0
  82. package/dist/services/sdk-manager.service.js +107 -0
  83. package/dist/services/usage.service.d.ts +6 -0
  84. package/dist/services/usage.service.js +23 -0
  85. package/dist/services/validation.service.d.ts +7 -0
  86. package/dist/services/validation.service.js +21 -0
  87. package/dist/types/command.types.d.ts +42 -0
  88. package/dist/types/command.types.js +59 -0
  89. package/dist/types/config.types.d.ts +13 -0
  90. package/dist/types/config.types.js +2 -0
  91. package/dist/types/drive.types.d.ts +14 -0
  92. package/dist/types/drive.types.js +2 -0
  93. package/dist/types/keys.types.d.ts +16 -0
  94. package/dist/types/keys.types.js +31 -0
  95. package/dist/types/network.types.d.ts +11 -0
  96. package/dist/types/network.types.js +2 -0
  97. package/dist/types/webdav.types.d.ts +15 -0
  98. package/dist/types/webdav.types.js +6 -0
  99. package/dist/utils/cli.utils.d.ts +32 -0
  100. package/dist/utils/cli.utils.js +105 -0
  101. package/dist/utils/crypto.utils.d.ts +6 -0
  102. package/dist/utils/crypto.utils.js +10 -0
  103. package/dist/utils/drive.utils.d.ts +6 -0
  104. package/dist/utils/drive.utils.js +34 -0
  105. package/dist/utils/errors.utils.d.ts +19 -0
  106. package/dist/utils/errors.utils.js +50 -0
  107. package/dist/utils/format.utils.d.ts +6 -0
  108. package/dist/utils/format.utils.js +30 -0
  109. package/dist/utils/hash.utils.d.ts +15 -0
  110. package/dist/utils/hash.utils.js +37 -0
  111. package/dist/utils/logger.utils.d.ts +3 -0
  112. package/dist/utils/logger.utils.js +50 -0
  113. package/dist/utils/network.utils.d.ts +22 -0
  114. package/dist/utils/network.utils.js +49 -0
  115. package/dist/utils/pm2.utils.d.ts +10 -0
  116. package/dist/utils/pm2.utils.js +65 -0
  117. package/dist/utils/stream.utils.d.ts +7 -0
  118. package/dist/utils/stream.utils.js +56 -0
  119. package/dist/utils/webdav.utils.d.ts +7 -0
  120. package/dist/utils/webdav.utils.js +47 -0
  121. package/dist/utils/xml.utils.d.ts +8 -0
  122. package/dist/utils/xml.utils.js +23 -0
  123. package/dist/webdav/handlers/GET.handler.d.ts +23 -0
  124. package/dist/webdav/handlers/GET.handler.js +52 -0
  125. package/dist/webdav/handlers/HEAD.handler.d.ts +5 -0
  126. package/dist/webdav/handlers/HEAD.handler.js +9 -0
  127. package/dist/webdav/handlers/OPTIONS.handler.d.ts +5 -0
  128. package/dist/webdav/handlers/OPTIONS.handler.js +11 -0
  129. package/dist/webdav/handlers/PROPFIND.handler.d.ts +21 -0
  130. package/dist/webdav/handlers/PROPFIND.handler.js +234 -0
  131. package/dist/webdav/handlers/PUT.handler.d.ts +23 -0
  132. package/dist/webdav/handlers/PUT.handler.js +51 -0
  133. package/dist/webdav/index.d.ts +1 -0
  134. package/dist/webdav/index.js +30 -0
  135. package/dist/webdav/middewares/auth.middleware.d.ts +3 -0
  136. package/dist/webdav/middewares/auth.middleware.js +27 -0
  137. package/dist/webdav/middewares/errors.middleware.d.ts +2 -0
  138. package/dist/webdav/middewares/errors.middleware.js +20 -0
  139. package/dist/webdav/middewares/request-logger.middleware.d.ts +7 -0
  140. package/dist/webdav/middewares/request-logger.middleware.js +15 -0
  141. package/dist/webdav/webdav-server.d.ts +25 -0
  142. package/dist/webdav/webdav-server.js +98 -0
  143. package/oclif.manifest.json +593 -0
  144. package/package.json +122 -0
@@ -0,0 +1,15 @@
1
+ import { StorageTypes } from '@internxt/sdk/dist/drive';
2
+ import { DriveFileItem } from '../../types/drive.types';
3
+ export declare class DriveFileService {
4
+ static readonly instance: DriveFileService;
5
+ createFile: (payload: {
6
+ name: string;
7
+ type: string;
8
+ size: number;
9
+ folderId: number;
10
+ fileId: string;
11
+ bucket: string;
12
+ }) => Promise<DriveFileItem>;
13
+ getFileMetadata: (uuid: string) => Promise<DriveFileItem>;
14
+ moveFile: (payload: StorageTypes.MoveFileUuidPayload) => Promise<StorageTypes.FileMeta>;
15
+ }
@@ -0,0 +1,51 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DriveFileService = void 0;
4
+ const lib_1 = require("@internxt/lib");
5
+ const types_1 = require("@internxt/sdk/dist/drive/storage/types");
6
+ const sdk_manager_service_1 = require("../sdk-manager.service");
7
+ const config_service_1 = require("../config.service");
8
+ const crypto_utils_1 = require("../../utils/crypto.utils");
9
+ const drive_utils_1 = require("../../utils/drive.utils");
10
+ class DriveFileService {
11
+ static instance = new DriveFileService();
12
+ createFile = async (payload) => {
13
+ const storageClient = sdk_manager_service_1.SdkManager.instance.getStorage();
14
+ const encryptedName = lib_1.aes.encrypt(payload.name, `${config_service_1.ConfigService.instance.get('APP_CRYPTO_SECRET2')}-${payload.folderId}`, crypto_utils_1.CryptoUtils.getAesInit());
15
+ const driveFile = await storageClient.createFileEntry({
16
+ name: encryptedName,
17
+ size: payload.size,
18
+ folder_id: payload.folderId,
19
+ id: payload.fileId,
20
+ type: payload.type,
21
+ plain_name: payload.name,
22
+ bucket: payload.bucket,
23
+ encrypt_version: types_1.EncryptionVersion.Aes03,
24
+ });
25
+ return {
26
+ size: Number(driveFile.size),
27
+ uuid: driveFile.uuid,
28
+ encryptedName,
29
+ name: payload.name,
30
+ bucket: payload.bucket,
31
+ createdAt: new Date(driveFile.createdAt),
32
+ updatedAt: new Date(driveFile.updatedAt),
33
+ fileId: payload.fileId,
34
+ id: driveFile.id,
35
+ type: payload.type,
36
+ status: driveFile.status,
37
+ folderId: driveFile.folderId,
38
+ };
39
+ };
40
+ getFileMetadata = async (uuid) => {
41
+ const storageClient = sdk_manager_service_1.SdkManager.instance.getStorage(true);
42
+ const [getFileMetadata] = storageClient.getFile(uuid);
43
+ const fileMetadata = await getFileMetadata;
44
+ return drive_utils_1.DriveUtils.driveFileMetaToItem(fileMetadata);
45
+ };
46
+ moveFile = (payload) => {
47
+ const storageClient = sdk_manager_service_1.SdkManager.instance.getStorage(true);
48
+ return storageClient.moveFileByUuid(payload);
49
+ };
50
+ }
51
+ exports.DriveFileService = DriveFileService;
@@ -0,0 +1,15 @@
1
+ import { FetchPaginatedFile, FetchPaginatedFolder } from '@internxt/sdk/dist/drive/storage/types';
2
+ import { StorageTypes } from '@internxt/sdk/dist/drive';
3
+ import { DriveFolderItem } from '../../types/drive.types';
4
+ export declare class DriveFolderService {
5
+ static readonly instance: DriveFolderService;
6
+ getFolderMetaByUuid: (uuid: string) => Promise<DriveFolderItem>;
7
+ getFolderMetaById: (id: number) => Promise<DriveFolderItem>;
8
+ getFolderContent: (folderUuid: string) => Promise<{
9
+ folders: FetchPaginatedFolder[];
10
+ files: FetchPaginatedFile[];
11
+ }>;
12
+ private getAllSubfolders;
13
+ private getAllSubfiles;
14
+ moveFolder: (payload: StorageTypes.MoveFolderUuidPayload) => Promise<StorageTypes.FolderMeta>;
15
+ }
@@ -0,0 +1,49 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DriveFolderService = void 0;
4
+ const sdk_manager_service_1 = require("../sdk-manager.service");
5
+ const drive_utils_1 = require("../../utils/drive.utils");
6
+ class DriveFolderService {
7
+ static instance = new DriveFolderService();
8
+ getFolderMetaByUuid = async (uuid) => {
9
+ const storageClient = sdk_manager_service_1.SdkManager.instance.getStorage(true);
10
+ const folderMeta = await storageClient.getFolderMeta(uuid);
11
+ return drive_utils_1.DriveUtils.driveFolderMetaToItem(folderMeta);
12
+ };
13
+ getFolderMetaById = async (id) => {
14
+ const storageClient = sdk_manager_service_1.SdkManager.instance.getStorage(true);
15
+ const folderMeta = await storageClient.getFolderMetaById(id);
16
+ return drive_utils_1.DriveUtils.driveFolderMetaToItem(folderMeta);
17
+ };
18
+ getFolderContent = async (folderUuid) => {
19
+ const storageClient = sdk_manager_service_1.SdkManager.instance.getStorage(true);
20
+ const folders = await this.getAllSubfolders(storageClient, folderUuid, 0);
21
+ const files = await this.getAllSubfiles(storageClient, folderUuid, 0);
22
+ return { folders, files };
23
+ };
24
+ getAllSubfolders = async (storageClient, folderUuid, offset) => {
25
+ const [folderContentPromise] = storageClient.getFolderFoldersByUuid(folderUuid, offset, 50, 'plainName', 'ASC');
26
+ const { folders } = await folderContentPromise;
27
+ if (folders.length > 0) {
28
+ return folders.concat(await this.getAllSubfolders(storageClient, folderUuid, offset + folders.length));
29
+ }
30
+ else {
31
+ return folders;
32
+ }
33
+ };
34
+ getAllSubfiles = async (storageClient, folderUuid, offset) => {
35
+ const [folderContentPromise] = storageClient.getFolderFilesByUuid(folderUuid, offset, 50, 'plainName', 'ASC');
36
+ const { files } = await folderContentPromise;
37
+ if (files.length > 0) {
38
+ return files.concat(await this.getAllSubfiles(storageClient, folderUuid, offset + files.length));
39
+ }
40
+ else {
41
+ return files;
42
+ }
43
+ };
44
+ moveFolder = (payload) => {
45
+ const storageClient = sdk_manager_service_1.SdkManager.instance.getStorage(true);
46
+ return storageClient.moveFolderByUuid(payload);
47
+ };
48
+ }
49
+ exports.DriveFolderService = DriveFolderService;
@@ -0,0 +1,5 @@
1
+ import { StorageTypes } from '@internxt/sdk/dist/drive';
2
+ export declare class TrashService {
3
+ static readonly instance: TrashService;
4
+ trashItems: (payload: StorageTypes.AddItemsToTrashPayload) => Promise<void>;
5
+ }
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TrashService = void 0;
4
+ const sdk_manager_service_1 = require("../sdk-manager.service");
5
+ class TrashService {
6
+ static instance = new TrashService();
7
+ trashItems = (payload) => {
8
+ const storageClient = sdk_manager_service_1.SdkManager.instance.getStorage(true);
9
+ return storageClient.addItemsToTrash(payload);
10
+ };
11
+ }
12
+ exports.TrashService = TrashService;
@@ -0,0 +1,14 @@
1
+ export declare class KeysService {
2
+ static readonly instance: KeysService;
3
+ assertPrivateKeyIsValid: (privateKey: string, password: string) => Promise<void>;
4
+ encryptPrivateKey: (privateKey: string, password: string) => string;
5
+ decryptPrivateKey: (privateKey: string, password: string) => string;
6
+ assertValidateKeys: (privateKey: string, publicKey: string) => Promise<void>;
7
+ isValidKey: (key: string) => Promise<boolean>;
8
+ generateNewKeysWithEncrypted: (password: string) => Promise<{
9
+ privateKeyArmored: string;
10
+ privateKeyArmoredEncrypted: string;
11
+ publicKeyArmored: string;
12
+ revocationCertificate: string;
13
+ }>;
14
+ }
@@ -0,0 +1,110 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ Object.defineProperty(exports, "__esModule", { value: true });
26
+ exports.KeysService = void 0;
27
+ const lib_1 = require("@internxt/lib");
28
+ const openpgp = __importStar(require("openpgp"));
29
+ const keys_types_1 = require("../types/keys.types");
30
+ const crypto_utils_1 = require("../utils/crypto.utils");
31
+ class KeysService {
32
+ static instance = new KeysService();
33
+ assertPrivateKeyIsValid = async (privateKey, password) => {
34
+ let privateKeyDecrypted;
35
+ let badIterations = true;
36
+ try {
37
+ lib_1.aes.decrypt(privateKey, password, 9999);
38
+ }
39
+ catch {
40
+ badIterations = false;
41
+ }
42
+ if (badIterations === true)
43
+ throw new keys_types_1.WrongIterationsToEncryptPrivateKeyError();
44
+ let badEncrypted = false;
45
+ try {
46
+ privateKeyDecrypted = this.decryptPrivateKey(privateKey, password);
47
+ }
48
+ catch {
49
+ badEncrypted = true;
50
+ }
51
+ let hasValidFormat = false;
52
+ try {
53
+ if (privateKeyDecrypted !== undefined) {
54
+ hasValidFormat = await this.isValidKey(privateKeyDecrypted);
55
+ }
56
+ }
57
+ catch {
58
+ }
59
+ if (badEncrypted === true)
60
+ throw new keys_types_1.CorruptedEncryptedPrivateKeyError();
61
+ if (hasValidFormat === false)
62
+ throw new keys_types_1.BadEncodedPrivateKeyError();
63
+ };
64
+ encryptPrivateKey = (privateKey, password) => {
65
+ return lib_1.aes.encrypt(privateKey, password, crypto_utils_1.CryptoUtils.getAesInit());
66
+ };
67
+ decryptPrivateKey = (privateKey, password) => {
68
+ return lib_1.aes.decrypt(privateKey, password);
69
+ };
70
+ assertValidateKeys = async (privateKey, publicKey) => {
71
+ const publicKeyArmored = await openpgp.readKey({ armoredKey: publicKey });
72
+ const privateKeyArmored = await openpgp.readPrivateKey({ armoredKey: privateKey });
73
+ const plainMessage = 'validate-keys';
74
+ const originalText = await openpgp.createMessage({ text: plainMessage });
75
+ const encryptedMessage = await openpgp.encrypt({
76
+ message: originalText,
77
+ encryptionKeys: publicKeyArmored,
78
+ });
79
+ const decryptedMessage = (await openpgp.decrypt({
80
+ message: await openpgp.readMessage({ armoredMessage: encryptedMessage }),
81
+ verificationKeys: publicKeyArmored,
82
+ decryptionKeys: privateKeyArmored,
83
+ })).data;
84
+ if (decryptedMessage !== plainMessage) {
85
+ throw new keys_types_1.KeysDoNotMatchError();
86
+ }
87
+ };
88
+ isValidKey = async (key) => {
89
+ try {
90
+ await openpgp.readKey({ armoredKey: key });
91
+ return true;
92
+ }
93
+ catch {
94
+ return false;
95
+ }
96
+ };
97
+ generateNewKeysWithEncrypted = async (password) => {
98
+ const { privateKey, publicKey, revocationCertificate } = await openpgp.generateKey({
99
+ userIDs: [{ email: 'inxt@inxt.com' }],
100
+ curve: 'ed25519',
101
+ });
102
+ return {
103
+ privateKeyArmored: privateKey,
104
+ privateKeyArmoredEncrypted: this.encryptPrivateKey(privateKey, password),
105
+ publicKeyArmored: Buffer.from(publicKey).toString('base64'),
106
+ revocationCertificate: Buffer.from(revocationCertificate).toString('base64'),
107
+ };
108
+ };
109
+ }
110
+ exports.KeysService = KeysService;
@@ -0,0 +1,7 @@
1
+ export declare class DownloadService {
2
+ static readonly instance: DownloadService;
3
+ downloadFile(url: string, options: {
4
+ progressCallback?: (progress: number) => void;
5
+ abortController?: AbortController;
6
+ }): Promise<ReadableStream<Uint8Array>>;
7
+ }
@@ -0,0 +1,33 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.DownloadService = void 0;
7
+ const axios_1 = __importDefault(require("axios"));
8
+ class DownloadService {
9
+ static instance = new DownloadService();
10
+ async downloadFile(url, options) {
11
+ const response = await axios_1.default.get(url, {
12
+ responseType: 'stream',
13
+ onDownloadProgress(progressEvent) {
14
+ if (options.progressCallback && progressEvent.total) {
15
+ const reportedProgress = progressEvent.loaded / progressEvent.total;
16
+ options.progressCallback(reportedProgress);
17
+ }
18
+ },
19
+ });
20
+ const readable = new ReadableStream({
21
+ start(controller) {
22
+ response.data.on('data', (chunk) => {
23
+ controller.enqueue(chunk);
24
+ });
25
+ response.data.on('end', () => {
26
+ controller.close();
27
+ });
28
+ },
29
+ });
30
+ return readable;
31
+ }
32
+ }
33
+ exports.DownloadService = DownloadService;
@@ -0,0 +1,21 @@
1
+ /// <reference types="node" />
2
+ /// <reference types="node" />
3
+ import { Network } from '@internxt/sdk';
4
+ import { DownloadOptions, UploadOptions } from '../../types/network.types';
5
+ import { CryptoService } from '../crypto.service';
6
+ import { UploadService } from './upload.service';
7
+ import { DownloadService } from './download.service';
8
+ import { Readable } from 'node:stream';
9
+ export declare class NetworkFacade {
10
+ private readonly network;
11
+ private readonly uploadService;
12
+ private readonly downloadService;
13
+ private readonly cryptoService;
14
+ private readonly cryptoLib;
15
+ constructor(network: Network.Network, uploadService: UploadService, downloadService: DownloadService, cryptoService: CryptoService);
16
+ downloadToStream(bucketId: string, mnemonic: string, fileId: string, to: WritableStream, options?: DownloadOptions): Promise<[Promise<void>, AbortController]>;
17
+ uploadFromStream(bucketId: string, mnemonic: string, size: number, from: Readable, options?: UploadOptions): Promise<[Promise<{
18
+ fileId: string;
19
+ hash: Buffer;
20
+ }>, AbortController]>;
21
+ }
@@ -0,0 +1,128 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ var __importDefault = (this && this.__importDefault) || function (mod) {
26
+ return (mod && mod.__esModule) ? mod : { "default": mod };
27
+ };
28
+ Object.defineProperty(exports, "__esModule", { value: true });
29
+ exports.NetworkFacade = void 0;
30
+ const sdk_1 = require("@internxt/sdk");
31
+ const NetworkUpload = __importStar(require("@internxt/sdk/dist/network/upload"));
32
+ const NetworkDownload = __importStar(require("@internxt/sdk/dist/network/download"));
33
+ const inxt_js_1 = require("@internxt/inxt-js");
34
+ const crypto_1 = __importDefault(require("crypto"));
35
+ const validation_service_1 = require("../validation.service");
36
+ const hash_utils_1 = require("../../utils/hash.utils");
37
+ class NetworkFacade {
38
+ network;
39
+ uploadService;
40
+ downloadService;
41
+ cryptoService;
42
+ cryptoLib;
43
+ constructor(network, uploadService, downloadService, cryptoService) {
44
+ this.network = network;
45
+ this.uploadService = uploadService;
46
+ this.downloadService = downloadService;
47
+ this.cryptoService = cryptoService;
48
+ this.cryptoLib = {
49
+ algorithm: sdk_1.Network.ALGORITHMS.AES256CTR,
50
+ validateMnemonic: (mnemonic) => {
51
+ return validation_service_1.ValidationService.instance.validateMnemonic(mnemonic);
52
+ },
53
+ generateFileKey: (mnemonic, bucketId, index) => {
54
+ return inxt_js_1.Environment.utils.generateFileKey(mnemonic, bucketId, index);
55
+ },
56
+ randomBytes: crypto_1.default.randomBytes,
57
+ };
58
+ }
59
+ async downloadToStream(bucketId, mnemonic, fileId, to, options) {
60
+ const encryptedContentStreams = [];
61
+ let fileStream;
62
+ const abortable = options?.abortController ?? new AbortController();
63
+ const onProgress = (progress) => {
64
+ if (!options?.progressCallback)
65
+ return;
66
+ options.progressCallback(progress);
67
+ };
68
+ const onDownloadProgress = (progress) => {
69
+ onProgress(progress);
70
+ };
71
+ const decryptFile = async (_, key, iv) => {
72
+ fileStream = await this.cryptoService.decryptStream(encryptedContentStreams, Buffer.from(key), Buffer.from(iv));
73
+ await fileStream.pipeTo(to);
74
+ };
75
+ const downloadFile = async (downloadables) => {
76
+ for (const downloadable of downloadables) {
77
+ if (abortable.signal.aborted) {
78
+ throw new Error('Download aborted');
79
+ }
80
+ const encryptedContentStream = await this.downloadService.downloadFile(downloadable.url, {
81
+ progressCallback: onDownloadProgress,
82
+ abortController: options?.abortController,
83
+ });
84
+ encryptedContentStreams.push(encryptedContentStream);
85
+ }
86
+ };
87
+ const downloadOperation = async () => {
88
+ await NetworkDownload.downloadFile(fileId, bucketId, mnemonic, this.network, this.cryptoLib, Buffer.from, downloadFile, decryptFile);
89
+ };
90
+ return [downloadOperation(), abortable];
91
+ }
92
+ async uploadFromStream(bucketId, mnemonic, size, from, options) {
93
+ const hashStream = new hash_utils_1.HashStream();
94
+ const abortable = options?.abortController ?? new AbortController();
95
+ let fileHash;
96
+ let encryptionTransform;
97
+ const onProgress = (progress) => {
98
+ if (!options?.progressCallback)
99
+ return;
100
+ options.progressCallback(progress);
101
+ };
102
+ const onUploadProgress = (progress) => {
103
+ onProgress(progress * 0.9);
104
+ };
105
+ const encryptFile = async (_, key, iv) => {
106
+ encryptionTransform = from
107
+ .pipe(await this.cryptoService.getEncryptionTransform(Buffer.from(key), Buffer.from(iv)))
108
+ .pipe(hashStream);
109
+ };
110
+ const uploadFile = async (url) => {
111
+ await this.uploadService.uploadFile(url, encryptionTransform, {
112
+ abortController: abortable,
113
+ progressCallback: onUploadProgress,
114
+ });
115
+ return hashStream.getHash().toString('hex');
116
+ };
117
+ const uploadOperation = async () => {
118
+ const uploadResult = await NetworkUpload.uploadFile(this.network, this.cryptoLib, bucketId, mnemonic, size, encryptFile, uploadFile);
119
+ onProgress(1);
120
+ return {
121
+ fileId: uploadResult,
122
+ hash: fileHash,
123
+ };
124
+ };
125
+ return [uploadOperation(), abortable];
126
+ }
127
+ }
128
+ exports.NetworkFacade = NetworkFacade;
@@ -0,0 +1,9 @@
1
+ /// <reference types="node" />
2
+ import { Readable } from 'node:stream';
3
+ import { UploadOptions } from '../../types/network.types';
4
+ export declare class UploadService {
5
+ static readonly instance: UploadService;
6
+ uploadFile(url: string, from: Readable, options: UploadOptions): Promise<{
7
+ etag: string;
8
+ }>;
9
+ }
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.UploadService = void 0;
7
+ const node_fetch_1 = __importDefault(require("node-fetch"));
8
+ class UploadService {
9
+ static instance = new UploadService();
10
+ async uploadFile(url, from, options) {
11
+ const response = await (0, node_fetch_1.default)(url, { method: 'PUT', body: from, signal: options.abortController?.signal });
12
+ const etag = response.headers.get('etag');
13
+ options.progressCallback(1);
14
+ if (!etag) {
15
+ throw new Error('Missing Etag in response when uploading file');
16
+ }
17
+ return { etag };
18
+ }
19
+ }
20
+ exports.UploadService = UploadService;
@@ -0,0 +1,23 @@
1
+ import Realm, { ObjectSchema } from 'realm';
2
+ import { DriveFileItem } from '../../types/drive.types';
3
+ export declare class DriveFileRealmSchema extends Realm.Object<DriveFileRealmSchema> {
4
+ id: number;
5
+ name: string;
6
+ type?: string;
7
+ uuid: string;
8
+ file_id: string;
9
+ folder_id: number;
10
+ bucket: string;
11
+ relative_path: string;
12
+ created_at: Date;
13
+ updated_at: Date;
14
+ size: number;
15
+ status: 'EXISTS' | 'REMOVED' | 'TRASHED';
16
+ static readonly schema: ObjectSchema;
17
+ }
18
+ export declare class DriveFilesRealm {
19
+ private realm;
20
+ constructor(realm: Realm);
21
+ findByRelativePath(relativePath: string): DriveFileRealmSchema | null;
22
+ createOrReplace(driveFile: DriveFileItem, relativePath: string): void;
23
+ }
@@ -0,0 +1,76 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.DriveFilesRealm = exports.DriveFileRealmSchema = void 0;
7
+ const realm_1 = __importDefault(require("realm"));
8
+ class DriveFileRealmSchema extends realm_1.default.Object {
9
+ id;
10
+ name;
11
+ type;
12
+ uuid;
13
+ file_id;
14
+ folder_id;
15
+ bucket;
16
+ relative_path;
17
+ created_at;
18
+ updated_at;
19
+ size;
20
+ status;
21
+ static schema = {
22
+ name: 'DriveFile',
23
+ properties: {
24
+ id: 'int',
25
+ name: 'string',
26
+ type: 'string?',
27
+ uuid: { type: 'string', indexed: true },
28
+ file_id: 'string',
29
+ folder_id: 'int',
30
+ bucket: 'string',
31
+ relative_path: { type: 'string', indexed: true },
32
+ created_at: 'date',
33
+ updated_at: 'date',
34
+ size: 'int',
35
+ status: 'string',
36
+ },
37
+ primaryKey: 'id',
38
+ };
39
+ }
40
+ exports.DriveFileRealmSchema = DriveFileRealmSchema;
41
+ class DriveFilesRealm {
42
+ realm;
43
+ constructor(realm) {
44
+ this.realm = realm;
45
+ }
46
+ findByRelativePath(relativePath) {
47
+ const object = this.realm
48
+ .objects('DriveFile')
49
+ .filtered('relative_path = $0', relativePath)
50
+ .find((file) => file.relative_path === relativePath);
51
+ return object ?? null;
52
+ }
53
+ createOrReplace(driveFile, relativePath) {
54
+ const existingObject = this.realm.objectForPrimaryKey('DriveFile', driveFile.id);
55
+ this.realm.write(() => {
56
+ if (existingObject) {
57
+ this.realm.delete(existingObject);
58
+ }
59
+ this.realm.create('DriveFile', {
60
+ id: driveFile.id,
61
+ name: driveFile.name,
62
+ type: driveFile.type,
63
+ uuid: driveFile.uuid,
64
+ file_id: driveFile.fileId,
65
+ folder_id: driveFile.folderId,
66
+ bucket: driveFile.bucket,
67
+ relative_path: relativePath,
68
+ created_at: driveFile.createdAt,
69
+ updated_at: driveFile.updatedAt,
70
+ size: driveFile.size,
71
+ status: 'EXISTS',
72
+ });
73
+ });
74
+ }
75
+ }
76
+ exports.DriveFilesRealm = DriveFilesRealm;
@@ -0,0 +1,20 @@
1
+ import Realm, { ObjectSchema } from 'realm';
2
+ import { DriveFolderItem } from '../../types/drive.types';
3
+ export declare class DriveFolderRealmSchema extends Realm.Object<DriveFolderRealmSchema> {
4
+ id: number;
5
+ name: string;
6
+ uuid: string;
7
+ relative_path: string;
8
+ parent_id?: number;
9
+ created_at: Date;
10
+ updated_at: Date;
11
+ status: 'EXISTS' | 'REMOVED' | 'TRASHED';
12
+ static readonly schema: ObjectSchema;
13
+ }
14
+ export declare class DriveFoldersRealm {
15
+ private realm;
16
+ constructor(realm: Realm);
17
+ findByRelativePath(relativePath: string): DriveFolderRealmSchema | null;
18
+ findByParentId(parentId: number | null): DriveFolderRealmSchema | null;
19
+ createOrReplace(driveFolder: DriveFolderItem, relativePath: string): void;
20
+ }