@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.
Files changed (150) hide show
  1. package/README.md +410 -71
  2. package/dist/commands/add-cert.d.ts +1 -1
  3. package/dist/commands/add-cert.js +1 -1
  4. package/dist/commands/config.d.ts +7 -1
  5. package/dist/commands/config.js +36 -5
  6. package/dist/commands/create-folder.d.ts +2 -1
  7. package/dist/commands/create-folder.js +10 -7
  8. package/dist/commands/delete-permanently-file.d.ts +1 -0
  9. package/dist/commands/delete-permanently-folder.d.ts +1 -0
  10. package/dist/commands/download-file.d.ts +1 -0
  11. package/dist/commands/download-file.js +4 -2
  12. package/dist/commands/list.d.ts +1 -0
  13. package/dist/commands/list.js +2 -4
  14. package/dist/commands/login-legacy.d.ts +1 -0
  15. package/dist/commands/move-file.d.ts +1 -1
  16. package/dist/commands/move-file.js +7 -21
  17. package/dist/commands/move-folder.d.ts +1 -1
  18. package/dist/commands/move-folder.js +7 -21
  19. package/dist/commands/rename-file.d.ts +1 -0
  20. package/dist/commands/rename-folder.d.ts +1 -0
  21. package/dist/commands/trash-clear.d.ts +1 -0
  22. package/dist/commands/trash-file.d.ts +1 -0
  23. package/dist/commands/trash-folder.d.ts +1 -0
  24. package/dist/commands/trash-restore-file.d.ts +1 -1
  25. package/dist/commands/trash-restore-file.js +7 -21
  26. package/dist/commands/trash-restore-folder.d.ts +1 -1
  27. package/dist/commands/trash-restore-folder.js +7 -21
  28. package/dist/commands/upload-file.d.ts +4 -5
  29. package/dist/commands/upload-file.js +32 -21
  30. package/dist/commands/upload-folder.d.ts +1 -0
  31. package/dist/commands/upload-folder.js +11 -6
  32. package/dist/commands/webdav-config.d.ts +19 -1
  33. package/dist/commands/webdav-config.js +81 -3
  34. package/dist/commands/webdav.d.ts +1 -1
  35. package/dist/commands/webdav.js +10 -5
  36. package/dist/commands/whoami.js +2 -1
  37. package/dist/commands/workspaces-list.d.ts +20 -0
  38. package/dist/commands/workspaces-list.js +67 -0
  39. package/dist/commands/workspaces-unset.d.ts +23 -0
  40. package/dist/commands/workspaces-unset.js +45 -0
  41. package/dist/commands/workspaces-use.d.ts +27 -0
  42. package/dist/commands/workspaces-use.js +113 -0
  43. package/dist/constants/configs.d.ts +2 -1
  44. package/dist/constants/configs.js +4 -3
  45. package/dist/hooks/prerun/auth_check.js +13 -4
  46. package/dist/services/auth.service.d.ts +5 -2
  47. package/dist/services/auth.service.js +69 -12
  48. package/dist/services/config.service.d.ts +1 -1
  49. package/dist/services/config.service.js +12 -4
  50. package/dist/services/crypto.service.d.ts +5 -0
  51. package/dist/services/crypto.service.js +43 -0
  52. package/dist/services/database/database.service.d.ts +9 -0
  53. package/dist/services/database/database.service.js +39 -0
  54. package/dist/services/database/drive-file/drive-file.attributes.d.ts +3 -6
  55. package/dist/services/database/drive-file/drive-file.domain.d.ts +3 -6
  56. package/dist/services/database/drive-file/drive-file.domain.js +1 -12
  57. package/dist/services/database/drive-file/drive-file.model.d.ts +15 -0
  58. package/dist/services/database/drive-file/drive-file.model.js +67 -0
  59. package/dist/services/database/drive-file/drive-file.repository.d.ts +11 -0
  60. package/dist/services/database/drive-file/drive-file.repository.js +63 -0
  61. package/dist/services/database/drive-folder/drive-folder.attributes.d.ts +3 -4
  62. package/dist/services/database/drive-folder/drive-folder.domain.d.ts +4 -5
  63. package/dist/services/database/drive-folder/drive-folder.domain.js +11 -15
  64. package/dist/services/database/drive-folder/drive-folder.model.d.ts +11 -0
  65. package/dist/services/database/drive-folder/drive-folder.model.js +51 -0
  66. package/dist/services/database/drive-folder/drive-folder.repository.d.ts +13 -0
  67. package/dist/services/database/drive-folder/drive-folder.repository.js +99 -0
  68. package/dist/services/drive/drive-file.service.d.ts +2 -0
  69. package/dist/services/drive/drive-file.service.js +71 -15
  70. package/dist/services/drive/drive-folder.service.d.ts +6 -1
  71. package/dist/services/drive/drive-folder.service.js +157 -31
  72. package/dist/services/drive/trash.service.d.ts +3 -0
  73. package/dist/services/drive/trash.service.js +52 -16
  74. package/dist/services/drive/workspace.service.d.ts +7 -0
  75. package/dist/services/drive/workspace.service.js +30 -0
  76. package/dist/services/keys.service.d.ts +7 -0
  77. package/dist/services/keys.service.js +55 -0
  78. package/dist/services/local-filesystem/local-filesystem.service.d.ts +2 -2
  79. package/dist/services/local-filesystem/local-filesystem.service.js +4 -4
  80. package/dist/services/network/download.service.d.ts +2 -2
  81. package/dist/services/network/download.service.js +2 -2
  82. package/dist/services/network/network-facade.service.d.ts +3 -7
  83. package/dist/services/network/network-facade.service.js +9 -11
  84. package/dist/services/network/upload/upload-facade.service.d.ts +1 -1
  85. package/dist/services/network/upload/upload-facade.service.js +14 -7
  86. package/dist/services/network/upload/upload-file.service.d.ts +3 -3
  87. package/dist/services/network/upload/upload-file.service.js +33 -23
  88. package/dist/services/network/upload/upload-folder.service.d.ts +2 -2
  89. package/dist/services/network/upload/upload-folder.service.js +15 -10
  90. package/dist/services/network/upload/upload.types.d.ts +11 -0
  91. package/dist/services/sdk-manager.service.d.ts +9 -7
  92. package/dist/services/sdk-manager.service.js +27 -13
  93. package/dist/services/thumbnail.service.d.ts +19 -1
  94. package/dist/services/thumbnail.service.js +29 -2
  95. package/dist/services/universal-link.service.d.ts +3 -1
  96. package/dist/services/universal-link.service.js +15 -3
  97. package/dist/services/usage.service.d.ts +1 -2
  98. package/dist/services/usage.service.js +1 -1
  99. package/dist/services/validation.service.js +14 -4
  100. package/dist/{webdav/services → services/webdav}/webdav-folder.service.d.ts +1 -7
  101. package/dist/{webdav/services → services/webdav}/webdav-folder.service.js +6 -10
  102. package/dist/types/command.types.d.ts +44 -1
  103. package/dist/types/command.types.js +29 -1
  104. package/dist/types/config.types.d.ts +1 -0
  105. package/dist/types/drive.types.d.ts +7 -6
  106. package/dist/types/network.types.d.ts +6 -0
  107. package/dist/utils/async.utils.d.ts +2 -1
  108. package/dist/utils/async.utils.js +13 -2
  109. package/dist/utils/cli.utils.d.ts +20 -15
  110. package/dist/utils/cli.utils.js +48 -18
  111. package/dist/utils/crypto.utils.d.ts +3 -1
  112. package/dist/utils/crypto.utils.js +15 -2
  113. package/dist/utils/database.utils.d.ts +11 -0
  114. package/dist/utils/database.utils.js +26 -0
  115. package/dist/utils/drive.utils.js +7 -10
  116. package/dist/utils/errors.utils.d.ts +4 -4
  117. package/dist/utils/errors.utils.js +16 -19
  118. package/dist/utils/format.utils.d.ts +1 -0
  119. package/dist/utils/format.utils.js +3 -0
  120. package/dist/utils/inquirer.utils.js +10 -1
  121. package/dist/utils/path.utils.d.ts +7 -0
  122. package/dist/utils/path.utils.js +18 -0
  123. package/dist/utils/thumbnail.utils.d.ts +6 -20
  124. package/dist/utils/thumbnail.utils.js +16 -41
  125. package/dist/utils/webdav.utils.d.ts +4 -20
  126. package/dist/utils/webdav.utils.js +12 -14
  127. package/dist/webdav/handlers/DELETE.handler.d.ts +0 -9
  128. package/dist/webdav/handlers/DELETE.handler.js +18 -16
  129. package/dist/webdav/handlers/GET.handler.d.ts +0 -13
  130. package/dist/webdav/handlers/GET.handler.js +6 -11
  131. package/dist/webdav/handlers/HEAD.handler.d.ts +0 -5
  132. package/dist/webdav/handlers/HEAD.handler.js +11 -23
  133. package/dist/webdav/handlers/MKCOL.handler.d.ts +0 -7
  134. package/dist/webdav/handlers/MKCOL.handler.js +5 -12
  135. package/dist/webdav/handlers/MOVE.handler.d.ts +0 -9
  136. package/dist/webdav/handlers/MOVE.handler.js +10 -16
  137. package/dist/webdav/handlers/PROPFIND.handler.d.ts +0 -7
  138. package/dist/webdav/handlers/PROPFIND.handler.js +7 -19
  139. package/dist/webdav/handlers/PUT.handler.d.ts +0 -15
  140. package/dist/webdav/handlers/PUT.handler.js +24 -26
  141. package/dist/webdav/index.js +6 -8
  142. package/dist/webdav/middewares/auth.middleware.d.ts +1 -2
  143. package/dist/webdav/middewares/auth.middleware.js +5 -4
  144. package/dist/webdav/middewares/errors.middleware.js +2 -2
  145. package/dist/webdav/middewares/webdav-auth.middleware.d.ts +3 -0
  146. package/dist/webdav/middewares/webdav-auth.middleware.js +44 -0
  147. package/dist/webdav/webdav-server.d.ts +3 -16
  148. package/dist/webdav/webdav-server.js +29 -87
  149. package/oclif.manifest.json +429 -6
  150. 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
- return drive_utils_1.DriveUtils.driveFolderMetaToItem(folderMeta);
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
- return drive_utils_1.DriveUtils.driveFolderMetaToItem(folderMeta);
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 storageClient = sdk_manager_service_1.SdkManager.instance.getStorage();
20
- const folders = await this.getAllSubfolders(storageClient, folderUuid, 0);
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
- getAllSubfolders = async (storageClient, folderUuid, offset) => {
25
- const [folderContentPromise] = storageClient.getFolderFoldersByUuid(folderUuid, offset, 50, 'plainName', 'ASC');
26
- const { folders } = await folderContentPromise;
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(storageClient, folderUuid, offset + folders.length));
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 (storageClient, folderUuid, offset) => {
35
- const [folderContentPromise] = storageClient.getFolderFilesByUuid(folderUuid, offset, 50, 'plainName', 'ASC');
36
- const { files } = await folderContentPromise;
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
- return files.concat(await this.getAllSubfiles(storageClient, folderUuid, offset + files.length));
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
- return storageClient.moveFolderByUuid(uuid, payload);
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 storageClient = sdk_manager_service_1.SdkManager.instance.getStorage();
50
- return storageClient.createFolderByUuid(payload);
51
- }
52
- renameFolder = (payload) => {
53
- const storageClient = sdk_manager_service_1.SdkManager.instance.getStorage();
54
- return storageClient.updateFolderNameWithUUID(payload);
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
- getFolderMetadataByPath = async (path) => {
138
+ renameFolder = async (payload) => {
57
139
  const storageClient = sdk_manager_service_1.SdkManager.instance.getStorage();
58
- const folderMeta = await storageClient.getFolderByPath(encodeURIComponent(path));
59
- return drive_utils_1.DriveUtils.driveFolderMetaToItem({
60
- ...folderMeta,
61
- createdAt: folderMeta.createdAt ?? folderMeta.created_at,
62
- updatedAt: folderMeta.updatedAt ?? folderMeta.updated_at,
63
- plainName: folderMeta.plainName ?? folderMeta.plain_name,
64
- parentId: folderMeta.parentId ?? folderMeta.parent_id,
65
- parentUuid: folderMeta.parentUuid ?? folderMeta.parent_uuid,
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 storageClient = sdk_manager_service_1.SdkManager.instance.getTrash();
21
- return storageClient.clearTrash();
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 storageClient = sdk_manager_service_1.SdkManager.instance.getTrash();
25
- const folders = await this.getAllTrashSubfolders(storageClient, 0);
26
- const files = await this.getAllTrashSubfiles(storageClient, 0);
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 (storageClient, offset) => {
30
- const folderContentPromise = storageClient.getTrashedFilesPaginated(50, offset, 'folders', true);
31
- const { result: folders } = (await folderContentPromise);
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(storageClient, offset + folders.length));
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 (storageClient, offset) => {
40
- const folderContentPromise = storageClient.getTrashedFilesPaginated(50, offset, 'files', true);
41
- const { result: folders } = (await folderContentPromise);
42
- if (folders.length > 0) {
43
- return folders.concat(await this.getAllTrashSubfiles(storageClient, offset + folders.length));
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
- return folders;
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): Promise<ScanResult>;
5
- scanRecursive(currentPath: string, parentPath: string, folders: FileSystemNode[], files: FileSystemNode[]): Promise<number>;
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 scanLocalDirectory(path) {
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 scanRecursive(currentPath, parentPath, folders, files) {
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
- }): Promise<ReadableStream<Uint8Array>>;
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 downloadFile(url, options) {
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, downloadService: DownloadService, cryptoService: CryptoService);
16
- downloadToStream(bucketId: string, mnemonic: string, fileId: string, size: number, to: WritableStream, rangeOptions?: RangeOptions, options?: DownloadOptions): Promise<[Promise<void>, AbortController]>;
17
- uploadFile(from: Readable, size: number, bucketId: string, finishedCallback: (err: Error | null, res: string | null) => void, progressCallback: (progress: number) => void): ActionState;
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, downloadService, cryptoService) {
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 downloadToStream(bucketId, mnemonic, fileId, size, to, rangeOptions, options) {
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 = this.cryptoService.decryptStream(encryptedContentStreams, Buffer.from(key), Buffer.from(iv), startOffsetByte);
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 this.downloadService.downloadFile(downloadable.url, {
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): Promise<{
4
+ uploadFolder: ({ localPath, destinationFolderUuid, loginUserDetails, jsonFlag, debugMode, onProgress, reporter, }: UploadFolderParams) => Promise<{
5
5
  totalBytes: number;
6
6
  rootFolderId: string;
7
7
  uploadTimeMs: number;