devkill 0.12.2

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 (274) hide show
  1. package/LICENSE +21 -0
  2. package/README.es.md +253 -0
  3. package/README.id.md +238 -0
  4. package/README.md +377 -0
  5. package/README.pt.md +241 -0
  6. package/README.tr.md +242 -0
  7. package/lib/cli/cli.controller.d.ts +81 -0
  8. package/lib/cli/cli.controller.js +760 -0
  9. package/lib/cli/cli.controller.js.map +1 -0
  10. package/lib/cli/interfaces/cli-options.interface.d.ts +5 -0
  11. package/lib/cli/interfaces/cli-options.interface.js +2 -0
  12. package/lib/cli/interfaces/cli-options.interface.js.map +1 -0
  13. package/lib/cli/interfaces/command-keys.interface.d.ts +17 -0
  14. package/lib/cli/interfaces/command-keys.interface.js +2 -0
  15. package/lib/cli/interfaces/command-keys.interface.js.map +1 -0
  16. package/lib/cli/interfaces/config.interface.d.ts +17 -0
  17. package/lib/cli/interfaces/config.interface.js +2 -0
  18. package/lib/cli/interfaces/config.interface.js.map +1 -0
  19. package/lib/cli/interfaces/index.d.ts +11 -0
  20. package/lib/cli/interfaces/index.js +12 -0
  21. package/lib/cli/interfaces/index.js.map +1 -0
  22. package/lib/cli/interfaces/json-output.interface.d.ts +30 -0
  23. package/lib/cli/interfaces/json-output.interface.js +2 -0
  24. package/lib/cli/interfaces/json-output.interface.js.map +1 -0
  25. package/lib/cli/interfaces/key-press.interface.d.ts +7 -0
  26. package/lib/cli/interfaces/key-press.interface.js +2 -0
  27. package/lib/cli/interfaces/key-press.interface.js.map +1 -0
  28. package/lib/cli/interfaces/node-version.interface.d.ts +5 -0
  29. package/lib/cli/interfaces/node-version.interface.js +2 -0
  30. package/lib/cli/interfaces/node-version.interface.js.map +1 -0
  31. package/lib/cli/interfaces/stats.interface.d.ts +15 -0
  32. package/lib/cli/interfaces/stats.interface.js +2 -0
  33. package/lib/cli/interfaces/stats.interface.js.map +1 -0
  34. package/lib/cli/interfaces/ui-positions.interface.d.ts +5 -0
  35. package/lib/cli/interfaces/ui-positions.interface.js +2 -0
  36. package/lib/cli/interfaces/ui-positions.interface.js.map +1 -0
  37. package/lib/cli/interfaces/version.interface.d.ts +5 -0
  38. package/lib/cli/interfaces/version.interface.js +2 -0
  39. package/lib/cli/interfaces/version.interface.js.map +1 -0
  40. package/lib/cli/models/start-parameters.model.d.ts +7 -0
  41. package/lib/cli/models/start-parameters.model.js +25 -0
  42. package/lib/cli/models/start-parameters.model.js.map +1 -0
  43. package/lib/cli/services/console.service.d.ts +23 -0
  44. package/lib/cli/services/console.service.js +87 -0
  45. package/lib/cli/services/console.service.js.map +1 -0
  46. package/lib/cli/services/https.service.d.ts +4 -0
  47. package/lib/cli/services/https.service.js +32 -0
  48. package/lib/cli/services/https.service.js.map +1 -0
  49. package/lib/cli/services/index.d.ts +7 -0
  50. package/lib/cli/services/index.js +8 -0
  51. package/lib/cli/services/index.js.map +1 -0
  52. package/lib/cli/services/json-output.service.d.ts +20 -0
  53. package/lib/cli/services/json-output.service.js +101 -0
  54. package/lib/cli/services/json-output.service.js.map +1 -0
  55. package/lib/cli/services/results.service.d.ts +13 -0
  56. package/lib/cli/services/results.service.js +61 -0
  57. package/lib/cli/services/results.service.js.map +1 -0
  58. package/lib/cli/services/scan.service.d.ts +13 -0
  59. package/lib/cli/services/scan.service.js +79 -0
  60. package/lib/cli/services/scan.service.js.map +1 -0
  61. package/lib/cli/services/spinner.service.d.ts +9 -0
  62. package/lib/cli/services/spinner.service.js +27 -0
  63. package/lib/cli/services/spinner.service.js.map +1 -0
  64. package/lib/cli/services/ui.service.d.ts +17 -0
  65. package/lib/cli/services/ui.service.js +59 -0
  66. package/lib/cli/services/ui.service.js.map +1 -0
  67. package/lib/cli/services/update.service.d.ts +15 -0
  68. package/lib/cli/services/update.service.js +37 -0
  69. package/lib/cli/services/update.service.js.map +1 -0
  70. package/lib/cli/ui/base.ui.d.ts +28 -0
  71. package/lib/cli/ui/base.ui.js +49 -0
  72. package/lib/cli/ui/base.ui.js.map +1 -0
  73. package/lib/cli/ui/components/general.ui.d.ts +7 -0
  74. package/lib/cli/ui/components/general.ui.js +13 -0
  75. package/lib/cli/ui/components/general.ui.js.map +1 -0
  76. package/lib/cli/ui/components/header/header-ui.constants.d.ts +7 -0
  77. package/lib/cli/ui/components/header/header-ui.constants.js +7 -0
  78. package/lib/cli/ui/components/header/header-ui.constants.js.map +1 -0
  79. package/lib/cli/ui/components/header/header.ui.d.ts +18 -0
  80. package/lib/cli/ui/components/header/header.ui.js +96 -0
  81. package/lib/cli/ui/components/header/header.ui.js.map +1 -0
  82. package/lib/cli/ui/components/header/stats.ui.d.ts +25 -0
  83. package/lib/cli/ui/components/header/stats.ui.js +198 -0
  84. package/lib/cli/ui/components/header/stats.ui.js.map +1 -0
  85. package/lib/cli/ui/components/header/status.ui.d.ts +33 -0
  86. package/lib/cli/ui/components/header/status.ui.js +188 -0
  87. package/lib/cli/ui/components/header/status.ui.js.map +1 -0
  88. package/lib/cli/ui/components/help/help-command.ui.d.ts +9 -0
  89. package/lib/cli/ui/components/help/help-command.ui.js +61 -0
  90. package/lib/cli/ui/components/help/help-command.ui.js.map +1 -0
  91. package/lib/cli/ui/components/help/help.constants.d.ts +8 -0
  92. package/lib/cli/ui/components/help/help.constants.js +270 -0
  93. package/lib/cli/ui/components/help/help.constants.js.map +1 -0
  94. package/lib/cli/ui/components/help/help.ui.d.ts +30 -0
  95. package/lib/cli/ui/components/help/help.ui.js +176 -0
  96. package/lib/cli/ui/components/help/help.ui.js.map +1 -0
  97. package/lib/cli/ui/components/logs.ui.d.ts +24 -0
  98. package/lib/cli/ui/components/logs.ui.js +132 -0
  99. package/lib/cli/ui/components/logs.ui.js.map +1 -0
  100. package/lib/cli/ui/components/options.ui.d.ts +29 -0
  101. package/lib/cli/ui/components/options.ui.js +327 -0
  102. package/lib/cli/ui/components/options.ui.js.map +1 -0
  103. package/lib/cli/ui/components/profile-picker.ui.d.ts +25 -0
  104. package/lib/cli/ui/components/profile-picker.ui.js +117 -0
  105. package/lib/cli/ui/components/profile-picker.ui.js.map +1 -0
  106. package/lib/cli/ui/components/result-details.ui.d.ts +23 -0
  107. package/lib/cli/ui/components/result-details.ui.js +182 -0
  108. package/lib/cli/ui/components/result-details.ui.js.map +1 -0
  109. package/lib/cli/ui/components/results.ui.d.ts +86 -0
  110. package/lib/cli/ui/components/results.ui.js +620 -0
  111. package/lib/cli/ui/components/results.ui.js.map +1 -0
  112. package/lib/cli/ui/components/warning.ui.d.ts +12 -0
  113. package/lib/cli/ui/components/warning.ui.js +30 -0
  114. package/lib/cli/ui/components/warning.ui.js.map +1 -0
  115. package/lib/cli/ui/heavy.ui.d.ts +18 -0
  116. package/lib/cli/ui/heavy.ui.js +37 -0
  117. package/lib/cli/ui/heavy.ui.js.map +1 -0
  118. package/lib/cli/ui/index.d.ts +14 -0
  119. package/lib/cli/ui/index.js +15 -0
  120. package/lib/cli/ui/index.js.map +1 -0
  121. package/lib/constants/cli.constants.d.ts +14 -0
  122. package/lib/constants/cli.constants.js +138 -0
  123. package/lib/constants/cli.constants.js.map +1 -0
  124. package/lib/constants/index.d.ts +8 -0
  125. package/lib/constants/index.js +9 -0
  126. package/lib/constants/index.js.map +1 -0
  127. package/lib/constants/main.constants.d.ts +96 -0
  128. package/lib/constants/main.constants.js +79 -0
  129. package/lib/constants/main.constants.js.map +1 -0
  130. package/lib/constants/messages.constants.d.ts +31 -0
  131. package/lib/constants/messages.constants.js +37 -0
  132. package/lib/constants/messages.constants.js.map +1 -0
  133. package/lib/constants/options.constants.d.ts +6 -0
  134. package/lib/constants/options.constants.js +8 -0
  135. package/lib/constants/options.constants.js.map +1 -0
  136. package/lib/constants/os-service-map.constants.d.ts +10 -0
  137. package/lib/constants/os-service-map.constants.js +11 -0
  138. package/lib/constants/os-service-map.constants.js.map +1 -0
  139. package/lib/constants/result-descriptions.constants.d.ts +142 -0
  140. package/lib/constants/result-descriptions.constants.js +203 -0
  141. package/lib/constants/result-descriptions.constants.js.map +1 -0
  142. package/lib/constants/sort.result.d.ts +6 -0
  143. package/lib/constants/sort.result.js +22 -0
  144. package/lib/constants/sort.result.js.map +1 -0
  145. package/lib/constants/spinner.constants.d.ts +5 -0
  146. package/lib/constants/spinner.constants.js +88 -0
  147. package/lib/constants/spinner.constants.js.map +1 -0
  148. package/lib/constants/status.constants.d.ts +7 -0
  149. package/lib/constants/status.constants.js +9 -0
  150. package/lib/constants/status.constants.js.map +1 -0
  151. package/lib/constants/update.constants.d.ts +2 -0
  152. package/lib/constants/update.constants.js +3 -0
  153. package/lib/constants/update.constants.js.map +1 -0
  154. package/lib/constants/workers.constants.d.ts +14 -0
  155. package/lib/constants/workers.constants.js +16 -0
  156. package/lib/constants/workers.constants.js.map +1 -0
  157. package/lib/core/constants/global-ignored.constants.d.ts +1 -0
  158. package/lib/core/constants/global-ignored.constants.js +44 -0
  159. package/lib/core/constants/global-ignored.constants.js.map +1 -0
  160. package/lib/core/constants/index.d.ts +1 -0
  161. package/lib/core/constants/index.js +2 -0
  162. package/lib/core/constants/index.js.map +1 -0
  163. package/lib/core/constants/profiles.constants.d.ts +8 -0
  164. package/lib/core/constants/profiles.constants.js +138 -0
  165. package/lib/core/constants/profiles.constants.js.map +1 -0
  166. package/lib/core/devkill.d.ts +25 -0
  167. package/lib/core/devkill.js +129 -0
  168. package/lib/core/devkill.js.map +1 -0
  169. package/lib/core/index.d.ts +4 -0
  170. package/lib/core/index.js +5 -0
  171. package/lib/core/index.js.map +1 -0
  172. package/lib/core/interfaces/devkill.interface.d.ts +78 -0
  173. package/lib/core/interfaces/devkill.interface.js +2 -0
  174. package/lib/core/interfaces/devkill.interface.js.map +1 -0
  175. package/lib/core/interfaces/devkillrc-config.interface.d.ts +87 -0
  176. package/lib/core/interfaces/devkillrc-config.interface.js +12 -0
  177. package/lib/core/interfaces/devkillrc-config.interface.js.map +1 -0
  178. package/lib/core/interfaces/file-service.interface.d.ts +76 -0
  179. package/lib/core/interfaces/file-service.interface.js +2 -0
  180. package/lib/core/interfaces/file-service.interface.js.map +1 -0
  181. package/lib/core/interfaces/folder.interface.d.ts +89 -0
  182. package/lib/core/interfaces/folder.interface.js +2 -0
  183. package/lib/core/interfaces/folder.interface.js.map +1 -0
  184. package/lib/core/interfaces/index.d.ts +6 -0
  185. package/lib/core/interfaces/index.js +7 -0
  186. package/lib/core/interfaces/index.js.map +1 -0
  187. package/lib/core/interfaces/logger-service.interface.d.ts +59 -0
  188. package/lib/core/interfaces/logger-service.interface.js +2 -0
  189. package/lib/core/interfaces/logger-service.interface.js.map +1 -0
  190. package/lib/core/interfaces/npkill.interface.d.ts +78 -0
  191. package/lib/core/interfaces/npkill.interface.js +2 -0
  192. package/lib/core/interfaces/npkill.interface.js.map +1 -0
  193. package/lib/core/interfaces/npkillrc-config.interface.d.ts +87 -0
  194. package/lib/core/interfaces/npkillrc-config.interface.js +12 -0
  195. package/lib/core/interfaces/npkillrc-config.interface.js.map +1 -0
  196. package/lib/core/interfaces/profile.interface.d.ts +9 -0
  197. package/lib/core/interfaces/profile.interface.js +2 -0
  198. package/lib/core/interfaces/profile.interface.js.map +1 -0
  199. package/lib/core/interfaces/search-status.model.d.ts +35 -0
  200. package/lib/core/interfaces/search-status.model.js +48 -0
  201. package/lib/core/interfaces/search-status.model.js.map +1 -0
  202. package/lib/core/interfaces/services.interface.d.ts +26 -0
  203. package/lib/core/interfaces/services.interface.js +2 -0
  204. package/lib/core/interfaces/services.interface.js.map +1 -0
  205. package/lib/core/npkill.d.ts +25 -0
  206. package/lib/core/npkill.js +129 -0
  207. package/lib/core/npkill.js.map +1 -0
  208. package/lib/core/services/config/config-merger.d.ts +17 -0
  209. package/lib/core/services/config/config-merger.js +57 -0
  210. package/lib/core/services/config/config-merger.js.map +1 -0
  211. package/lib/core/services/config/config-validator.d.ts +3 -0
  212. package/lib/core/services/config/config-validator.js +43 -0
  213. package/lib/core/services/config/config-validator.js.map +1 -0
  214. package/lib/core/services/config/index.d.ts +4 -0
  215. package/lib/core/services/config/index.js +5 -0
  216. package/lib/core/services/config/index.js.map +1 -0
  217. package/lib/core/services/config/profile-validator.d.ts +6 -0
  218. package/lib/core/services/config/profile-validator.js +68 -0
  219. package/lib/core/services/config/profile-validator.js.map +1 -0
  220. package/lib/core/services/config/property-validators.d.ts +33 -0
  221. package/lib/core/services/config/property-validators.js +125 -0
  222. package/lib/core/services/config/property-validators.js.map +1 -0
  223. package/lib/core/services/config.service.d.ts +37 -0
  224. package/lib/core/services/config.service.js +100 -0
  225. package/lib/core/services/config.service.js.map +1 -0
  226. package/lib/core/services/files/files.service.d.ts +28 -0
  227. package/lib/core/services/files/files.service.js +207 -0
  228. package/lib/core/services/files/files.service.js.map +1 -0
  229. package/lib/core/services/files/files.worker.d.ts +1 -0
  230. package/lib/core/services/files/files.worker.js +286 -0
  231. package/lib/core/services/files/files.worker.js.map +1 -0
  232. package/lib/core/services/files/files.worker.service.d.ts +90 -0
  233. package/lib/core/services/files/files.worker.service.js +216 -0
  234. package/lib/core/services/files/files.worker.service.js.map +1 -0
  235. package/lib/core/services/files/index.d.ts +4 -0
  236. package/lib/core/services/files/index.js +5 -0
  237. package/lib/core/services/files/index.js.map +1 -0
  238. package/lib/core/services/files/unix-files.service.d.ts +9 -0
  239. package/lib/core/services/files/unix-files.service.js +28 -0
  240. package/lib/core/services/files/unix-files.service.js.map +1 -0
  241. package/lib/core/services/files/windows-files.service.d.ts +9 -0
  242. package/lib/core/services/files/windows-files.service.js +16 -0
  243. package/lib/core/services/files/windows-files.service.js.map +1 -0
  244. package/lib/core/services/index.d.ts +5 -0
  245. package/lib/core/services/index.js +6 -0
  246. package/lib/core/services/index.js.map +1 -0
  247. package/lib/core/services/logger.service.d.ts +22 -0
  248. package/lib/core/services/logger.service.js +84 -0
  249. package/lib/core/services/logger.service.js.map +1 -0
  250. package/lib/core/services/profiles.service.d.ts +54 -0
  251. package/lib/core/services/profiles.service.js +86 -0
  252. package/lib/core/services/profiles.service.js.map +1 -0
  253. package/lib/core/services/stream.service.d.ts +12 -0
  254. package/lib/core/services/stream.service.js +39 -0
  255. package/lib/core/services/stream.service.js.map +1 -0
  256. package/lib/dirname.d.ts +2 -0
  257. package/lib/dirname.js +6 -0
  258. package/lib/dirname.js.map +1 -0
  259. package/lib/index.d.ts +2 -0
  260. package/lib/index.js +11 -0
  261. package/lib/index.js.map +1 -0
  262. package/lib/main.d.ts +2 -0
  263. package/lib/main.js +19 -0
  264. package/lib/main.js.map +1 -0
  265. package/lib/utils/get-file-content.d.ts +1 -0
  266. package/lib/utils/get-file-content.js +6 -0
  267. package/lib/utils/get-file-content.js.map +1 -0
  268. package/lib/utils/is-safe-to-delete.d.ts +1 -0
  269. package/lib/utils/is-safe-to-delete.js +9 -0
  270. package/lib/utils/is-safe-to-delete.js.map +1 -0
  271. package/lib/utils/unit-conversions.d.ts +11 -0
  272. package/lib/utils/unit-conversions.js +54 -0
  273. package/lib/utils/unit-conversions.js.map +1 -0
  274. package/package.json +96 -0
@@ -0,0 +1,90 @@
1
+ import { type MessagePort } from 'node:worker_threads';
2
+ import { Subject } from 'rxjs';
3
+ import { EVENTS } from '../../../constants/workers.constants.js';
4
+ import type { ScanOptions } from '../../index.js';
5
+ import type { ScanStatus } from '../../interfaces/search-status.model.js';
6
+ import type { LoggerService } from '../logger.service.js';
7
+ export type WorkerStatus = 'stopped' | 'scanning' | 'dead' | 'finished';
8
+ export interface WorkerScanOptions extends ScanOptions {
9
+ rootPath: string;
10
+ }
11
+ export type WorkerMessage = {
12
+ type: typeof EVENTS.scanResult;
13
+ value: {
14
+ results: Array<{
15
+ path: string;
16
+ isTarget: boolean;
17
+ }>;
18
+ workerId: number;
19
+ pending: number;
20
+ };
21
+ } | {
22
+ type: typeof EVENTS.GetSizeResult;
23
+ value: {
24
+ results: {
25
+ path: string;
26
+ size: number;
27
+ };
28
+ workerId: number;
29
+ pending: number;
30
+ };
31
+ } | {
32
+ type: typeof EVENTS.explore | typeof EVENTS.getFolderSize;
33
+ value: {
34
+ path: string;
35
+ };
36
+ } | {
37
+ type: typeof EVENTS.exploreConfig;
38
+ value: WorkerScanOptions;
39
+ } | {
40
+ type: typeof EVENTS.startup;
41
+ value: {
42
+ channel: MessagePort;
43
+ id: number;
44
+ };
45
+ } | {
46
+ type: typeof EVENTS.alive;
47
+ value?: undefined;
48
+ } | {
49
+ type: typeof EVENTS.stop;
50
+ value?: undefined;
51
+ } | {
52
+ type: typeof EVENTS.error;
53
+ value: {
54
+ error: Error;
55
+ };
56
+ };
57
+ export interface WorkerStats {
58
+ pendingSearchTasks: number;
59
+ completedSearchTasks: number;
60
+ procs: number;
61
+ }
62
+ export declare class FileWorkerService {
63
+ private readonly logger;
64
+ private readonly searchStatus;
65
+ private index;
66
+ private workers;
67
+ private workersPendingJobs;
68
+ private getSizePendings;
69
+ private pendingJobs;
70
+ private totalJobs;
71
+ private tunnels;
72
+ private shouldStop;
73
+ private readonly SIZE_TIMEOUT_MS;
74
+ constructor(logger: LoggerService, searchStatus: ScanStatus);
75
+ startScan(stream$: Subject<string>, params: WorkerScanOptions): Promise<void>;
76
+ getFolderSize(stream$: Subject<number>, path: string): void;
77
+ stopScan(): void;
78
+ private listenEvents;
79
+ private newWorkerMessage;
80
+ /** Jobs are distributed following the round-robin algorithm. */
81
+ private addJob;
82
+ private checkJobComplete;
83
+ private instantiateWorkers;
84
+ private setWorkerConfig;
85
+ private killWorkers;
86
+ private getPendingJobs;
87
+ private updateStats;
88
+ private getWorkerPath;
89
+ private getOptimalNumberOfWorkers;
90
+ }
@@ -0,0 +1,216 @@
1
+ import os from 'node:os';
2
+ import { dirname, extname } from 'node:path';
3
+ import { MessageChannel, Worker } from 'node:worker_threads';
4
+ import { Subject } from 'rxjs';
5
+ import { EVENTS, MAX_WORKERS } from '../../../constants/workers.constants.js';
6
+ export class FileWorkerService {
7
+ logger;
8
+ searchStatus;
9
+ index = 0;
10
+ workers = [];
11
+ workersPendingJobs = [];
12
+ getSizePendings = [];
13
+ pendingJobs = 0;
14
+ totalJobs = 0;
15
+ tunnels = [];
16
+ shouldStop = false;
17
+ SIZE_TIMEOUT_MS = 60000; // 1 minute timeout per folder
18
+ constructor(logger, searchStatus) {
19
+ this.logger = logger;
20
+ this.searchStatus = searchStatus;
21
+ }
22
+ async startScan(stream$, params) {
23
+ await this.killWorkers();
24
+ this.totalJobs = 0;
25
+ this.pendingJobs = 0;
26
+ this.index = 0;
27
+ this.workersPendingJobs = [];
28
+ this.shouldStop = false;
29
+ this.instantiateWorkers(this.getOptimalNumberOfWorkers());
30
+ this.listenEvents(stream$);
31
+ this.setWorkerConfig(params);
32
+ // Manually add the first job.
33
+ this.addJob({ job: EVENTS.explore, value: { path: params.rootPath } });
34
+ }
35
+ getFolderSize(stream$, path) {
36
+ if (this.workers.length === 0) {
37
+ this.instantiateWorkers(this.getOptimalNumberOfWorkers());
38
+ this.listenEvents(new Subject());
39
+ this.setWorkerConfig({ rootPath: path });
40
+ }
41
+ const timeoutId = setTimeout(() => {
42
+ const index = this.getSizePendings.findIndex((p) => p.path === path);
43
+ if (index !== -1) {
44
+ this.logger.error(`Timeout calculating size for: ${path} (${this.SIZE_TIMEOUT_MS}ms)`);
45
+ const pending = this.getSizePendings[index];
46
+ pending.stream$.error(new Error(`Timeout calculating size for ${path}`));
47
+ this.getSizePendings.splice(index, 1);
48
+ }
49
+ }, this.SIZE_TIMEOUT_MS);
50
+ this.getSizePendings.push({ path, stream$, timeoutId });
51
+ this.addJob({ job: EVENTS.getFolderSize, value: { path } });
52
+ }
53
+ stopScan() {
54
+ this.logger.info('Stopping scan...');
55
+ this.shouldStop = true;
56
+ this.searchStatus.workerStatus = 'stopped';
57
+ this.tunnels.forEach((tunnel) => {
58
+ tunnel.postMessage({
59
+ type: EVENTS.stop,
60
+ value: undefined,
61
+ });
62
+ });
63
+ void this.killWorkers();
64
+ }
65
+ listenEvents(stream$) {
66
+ this.tunnels.forEach((tunnel) => {
67
+ tunnel.on('message', (data) => {
68
+ this.newWorkerMessage(data, stream$);
69
+ });
70
+ this.workers.forEach((worker, index) => {
71
+ worker.on('exit', () => {
72
+ this.logger.info(`Worker ${index} exited.`);
73
+ });
74
+ worker.on('error', (error) => {
75
+ // Respawn worker.
76
+ throw error;
77
+ });
78
+ });
79
+ });
80
+ }
81
+ newWorkerMessage(message, stream$) {
82
+ const { type, value } = message;
83
+ if (type === EVENTS.scanResult) {
84
+ const results = value.results;
85
+ const workerId = value.workerId;
86
+ this.workersPendingJobs[workerId] = value.pending;
87
+ results.forEach((result) => {
88
+ const { path, isTarget } = result;
89
+ if (isTarget) {
90
+ stream$.next(path);
91
+ }
92
+ else if (!this.shouldStop) {
93
+ this.addJob({
94
+ job: EVENTS.explore,
95
+ value: { path },
96
+ });
97
+ }
98
+ });
99
+ this.pendingJobs = this.getPendingJobs();
100
+ this.checkJobComplete(stream$);
101
+ }
102
+ if (type === EVENTS.GetSizeResult) {
103
+ const result = value.results;
104
+ const workerId = value.workerId;
105
+ this.workersPendingJobs[workerId] = value.pending;
106
+ const index = this.getSizePendings.findIndex((pending) => pending.path === result.path);
107
+ if (index !== -1) {
108
+ const pending = this.getSizePendings[index];
109
+ if (pending.timeoutId) {
110
+ clearTimeout(pending.timeoutId);
111
+ }
112
+ pending.stream$.next(result.size);
113
+ pending.stream$.complete();
114
+ this.getSizePendings.splice(index, 1);
115
+ }
116
+ this.pendingJobs = this.getPendingJobs();
117
+ this.checkJobComplete(stream$);
118
+ }
119
+ if (type === EVENTS.alive) {
120
+ this.searchStatus.workerStatus = 'scanning';
121
+ }
122
+ if (type === EVENTS.error) {
123
+ this.logger.error(`Worker error: ${value.error.message}`);
124
+ }
125
+ }
126
+ /** Jobs are distributed following the round-robin algorithm. */
127
+ addJob(job) {
128
+ if (this.shouldStop) {
129
+ return;
130
+ }
131
+ const tunnel = this.tunnels[this.index];
132
+ const message = { type: job.job, value: job.value };
133
+ tunnel.postMessage(message);
134
+ this.workersPendingJobs[this.index]++;
135
+ this.totalJobs++;
136
+ this.pendingJobs++;
137
+ this.index = this.index >= this.workers.length - 1 ? 0 : this.index + 1;
138
+ }
139
+ checkJobComplete(stream$) {
140
+ this.updateStats();
141
+ const isCompleted = this.getPendingJobs() === 0;
142
+ if (isCompleted) {
143
+ this.searchStatus.workerStatus = 'finished';
144
+ stream$.complete();
145
+ void this.killWorkers();
146
+ }
147
+ }
148
+ instantiateWorkers(amount) {
149
+ this.logger.info(`Instantiating ${amount} workers..`);
150
+ const workerPath = this.getWorkerPath();
151
+ // When running TypeScript source directly (dev/strip mode), workers need
152
+ // tsx's loader so that .js imports resolve to .ts files inside the worker.
153
+ const execArgv = workerPath.pathname.endsWith('.ts')
154
+ ? ['--import', 'tsx/esm']
155
+ : undefined;
156
+ for (let i = 0; i < amount; i++) {
157
+ const { port1, port2 } = new MessageChannel();
158
+ const worker = new Worker(workerPath, { execArgv });
159
+ this.tunnels.push(port1);
160
+ worker.postMessage({ type: EVENTS.startup, value: { channel: port2, id: i } }, [port2]);
161
+ this.workers.push(worker);
162
+ this.logger.info(`Worker ${i} instantiated.`);
163
+ }
164
+ }
165
+ setWorkerConfig(params) {
166
+ this.tunnels.forEach((tunnel) => tunnel.postMessage({
167
+ type: EVENTS.exploreConfig,
168
+ value: params,
169
+ }));
170
+ }
171
+ async killWorkers() {
172
+ this.getSizePendings.forEach((pending) => {
173
+ if (pending.timeoutId) {
174
+ clearTimeout(pending.timeoutId);
175
+ }
176
+ if (!pending.stream$.closed) {
177
+ pending.stream$.error(new Error('Workers terminated before completion'));
178
+ }
179
+ });
180
+ this.getSizePendings = [];
181
+ for (let i = 0; i < this.workers.length; i++) {
182
+ this.workers[i].removeAllListeners();
183
+ this.tunnels[i].removeAllListeners();
184
+ await this.workers[i]
185
+ .terminate()
186
+ .catch((error) => this.logger.error(error));
187
+ }
188
+ this.workers = [];
189
+ this.tunnels = [];
190
+ }
191
+ getPendingJobs() {
192
+ return this.workersPendingJobs.reduce((acc, x) => x + acc, 0);
193
+ }
194
+ updateStats() {
195
+ this.searchStatus.pendingSearchTasks = this.pendingJobs;
196
+ this.searchStatus.completedSearchTasks = this.totalJobs;
197
+ this.searchStatus.workersJobs = this.workersPendingJobs;
198
+ }
199
+ getWorkerPath() {
200
+ const actualFilePath = import.meta.url;
201
+ const dirPath = dirname(actualFilePath);
202
+ // Extension = .ts if is not transpiled.
203
+ // Extension = .js if is a build
204
+ const extension = extname(actualFilePath);
205
+ const workerName = 'files.worker';
206
+ return new URL(`${dirPath}/${workerName}${extension}`);
207
+ }
208
+ getOptimalNumberOfWorkers() {
209
+ const cores = os.cpus().length;
210
+ // TODO calculate amount of RAM available and take it
211
+ // as part on the ecuation.
212
+ const numWorkers = cores > MAX_WORKERS ? MAX_WORKERS : cores - 1;
213
+ return numWorkers < 1 ? 1 : numWorkers;
214
+ }
215
+ }
216
+ //# sourceMappingURL=files.worker.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"files.worker.service.js","sourceRoot":"","sources":["../../../../src/core/services/files/files.worker.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export * from './files.service.js';
2
+ export * from './files.worker.service.js';
3
+ export * from './unix-files.service.js';
4
+ export * from './windows-files.service.js';
@@ -0,0 +1,5 @@
1
+ export * from './files.service.js';
2
+ export * from './files.worker.service.js';
3
+ export * from './unix-files.service.js';
4
+ export * from './windows-files.service.js';
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/core/services/files/index.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAC;AACnC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,yBAAyB,CAAC;AACxC,cAAc,4BAA4B,CAAC"}
@@ -0,0 +1,9 @@
1
+ import type { StreamService } from '../stream.service.js';
2
+ import { FileService } from './files.service.js';
3
+ import type { FileWorkerService } from './files.worker.service.js';
4
+ export declare class UnixFilesService extends FileService {
5
+ protected streamService: StreamService;
6
+ fileWorkerService: FileWorkerService;
7
+ constructor(streamService: StreamService, fileWorkerService: FileWorkerService);
8
+ deleteDir(path: string): Promise<boolean>;
9
+ }
@@ -0,0 +1,28 @@
1
+ import { exec } from 'node:child_process';
2
+ import { FileService } from './files.service.js';
3
+ export class UnixFilesService extends FileService {
4
+ streamService;
5
+ fileWorkerService;
6
+ constructor(streamService, fileWorkerService) {
7
+ super(fileWorkerService);
8
+ this.streamService = streamService;
9
+ this.fileWorkerService = fileWorkerService;
10
+ }
11
+ async deleteDir(path) {
12
+ return new Promise((resolve, reject) => {
13
+ const command = `rm -rf "${path}"`;
14
+ exec(command, (error, stdout, stderr) => {
15
+ if (error !== null) {
16
+ reject(error);
17
+ return;
18
+ }
19
+ if (stderr !== '') {
20
+ reject(stderr);
21
+ return;
22
+ }
23
+ resolve(true);
24
+ });
25
+ });
26
+ }
27
+ }
28
+ //# sourceMappingURL=unix-files.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"unix-files.service.js","sourceRoot":"","sources":["../../../../src/core/services/files/unix-files.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAK1C,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAGjD,MAAM,OAAO,gBAAiB,SAAQ,WAAW;IAEnC;IACM;IAFlB,YACY,aAA4B,EACtB,iBAAoC;QAEpD,KAAK,CAAC,iBAAiB,CAAC,CAAC;QAHf,kBAAa,GAAb,aAAa,CAAe;QACtB,sBAAiB,GAAjB,iBAAiB,CAAmB;IAGtD,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,IAAY;QAC1B,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrC,MAAM,OAAO,GAAG,WAAW,IAAI,GAAG,CAAC;YACnC,IAAI,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE;gBACtC,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;oBACnB,MAAM,CAAC,KAAK,CAAC,CAAC;oBACd,OAAO;gBACT,CAAC;gBACD,IAAI,MAAM,KAAK,EAAE,EAAE,CAAC;oBAClB,MAAM,CAAC,MAAM,CAAC,CAAC;oBACf,OAAO;gBACT,CAAC;gBACD,OAAO,CAAC,IAAI,CAAC,CAAC;YAChB,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;CACF"}
@@ -0,0 +1,9 @@
1
+ import type { StreamService } from '../stream.service.js';
2
+ import { FileService } from './files.service.js';
3
+ import type { FileWorkerService } from './files.worker.service.js';
4
+ export declare class WindowsFilesService extends FileService {
5
+ private readonly streamService;
6
+ fileWorkerService: FileWorkerService;
7
+ constructor(streamService: StreamService, fileWorkerService: FileWorkerService);
8
+ deleteDir(path: string): Promise<boolean>;
9
+ }
@@ -0,0 +1,16 @@
1
+ import { rm } from 'node:fs/promises';
2
+ import { FileService } from './files.service.js';
3
+ export class WindowsFilesService extends FileService {
4
+ streamService;
5
+ fileWorkerService;
6
+ constructor(streamService, fileWorkerService) {
7
+ super(fileWorkerService);
8
+ this.streamService = streamService;
9
+ this.fileWorkerService = fileWorkerService;
10
+ }
11
+ async deleteDir(path) {
12
+ await rm(path, { recursive: true, force: true });
13
+ return true;
14
+ }
15
+ }
16
+ //# sourceMappingURL=windows-files.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"windows-files.service.js","sourceRoot":"","sources":["../../../../src/core/services/files/windows-files.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,kBAAkB,CAAC;AAItC,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAGjD,MAAM,OAAO,mBAAoB,SAAQ,WAAW;IAE/B;IACD;IAFlB,YACmB,aAA4B,EAC7B,iBAAoC;QAEpD,KAAK,CAAC,iBAAiB,CAAC,CAAC;QAHR,kBAAa,GAAb,aAAa,CAAe;QAC7B,sBAAiB,GAAjB,iBAAiB,CAAmB;IAGtD,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,IAAY;QAC1B,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACjD,OAAO,IAAI,CAAC;IACd,CAAC;CACF"}
@@ -0,0 +1,5 @@
1
+ export * from './logger.service.js';
2
+ export * from './stream.service.js';
3
+ export * from './config.service.js';
4
+ export * from './profiles.service.js';
5
+ export * from './files/index.js';
@@ -0,0 +1,6 @@
1
+ export * from './logger.service.js';
2
+ export * from './stream.service.js';
3
+ export * from './config.service.js';
4
+ export * from './profiles.service.js';
5
+ export * from './files/index.js';
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/services/index.ts"],"names":[],"mappings":"AAAA,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,uBAAuB,CAAC;AACtC,cAAc,kBAAkB,CAAC"}
@@ -0,0 +1,22 @@
1
+ import type { ILoggerService, LogEntry } from '@core/interfaces/logger-service.interface.js';
2
+ import { type Observable } from 'rxjs';
3
+ /**
4
+ * Implementation of the logging service for npkill.
5
+ * Manages application logs with different severity levels and provides
6
+ * reactive streams for log observation and file output capabilities.
7
+ */
8
+ export declare class LoggerService implements ILoggerService {
9
+ private log;
10
+ private logSubject;
11
+ info(message: string): void;
12
+ warn(message: string): void;
13
+ error(message: string): void;
14
+ get(type?: 'all' | 'info' | 'warn' | 'error'): LogEntry[];
15
+ getLog$(): Observable<LogEntry[]>;
16
+ getLogByType$(type?: 'all' | 'info' | 'warn' | 'error'): Observable<LogEntry[]>;
17
+ saveToFile(path: string): void;
18
+ getSuggestLogFilePath(): string;
19
+ private rotateLogFile;
20
+ private addToLog;
21
+ private getTimestamp;
22
+ }
@@ -0,0 +1,84 @@
1
+ import { existsSync, renameSync, writeFileSync } from 'node:fs';
2
+ import { tmpdir } from 'node:os';
3
+ import { basename, dirname, join } from 'node:path';
4
+ import { BehaviorSubject } from 'rxjs';
5
+ import { map } from 'rxjs/operators';
6
+ const LATEST_TAG = 'latest';
7
+ const OLD_TAG = 'old';
8
+ /**
9
+ * Implementation of the logging service for npkill.
10
+ * Manages application logs with different severity levels and provides
11
+ * reactive streams for log observation and file output capabilities.
12
+ */
13
+ export class LoggerService {
14
+ log = [];
15
+ logSubject = new BehaviorSubject([]);
16
+ info(message) {
17
+ this.addToLog({
18
+ type: 'info',
19
+ timestamp: this.getTimestamp(),
20
+ message,
21
+ });
22
+ }
23
+ warn(message) {
24
+ this.addToLog({
25
+ type: 'warn',
26
+ timestamp: this.getTimestamp(),
27
+ message,
28
+ });
29
+ }
30
+ error(message) {
31
+ this.addToLog({
32
+ type: 'error',
33
+ timestamp: this.getTimestamp(),
34
+ message,
35
+ });
36
+ }
37
+ get(type = 'all') {
38
+ if (type === 'all') {
39
+ return this.log;
40
+ }
41
+ return this.log.filter((entry) => entry.type === type);
42
+ }
43
+ getLog$() {
44
+ return this.logSubject.asObservable();
45
+ }
46
+ getLogByType$(type = 'all') {
47
+ return this.logSubject
48
+ .asObservable()
49
+ .pipe(map((entries) => type === 'all'
50
+ ? entries
51
+ : entries.filter((entry) => entry.type === type)));
52
+ }
53
+ saveToFile(path) {
54
+ const convertTime = (timestamp) => timestamp;
55
+ const content = this.log.reduce((log, actual) => {
56
+ const line = `[${convertTime(actual.timestamp)}](${actual.type}) ${actual.message}\n`;
57
+ return log + line;
58
+ }, '');
59
+ this.rotateLogFile(path);
60
+ writeFileSync(path, content);
61
+ }
62
+ getSuggestLogFilePath() {
63
+ const filename = `devkill-${LATEST_TAG}.log`;
64
+ return join(tmpdir(), filename);
65
+ }
66
+ rotateLogFile(newLogPath) {
67
+ if (!existsSync(newLogPath)) {
68
+ return; // Rotation is not necessary
69
+ }
70
+ const basePath = dirname(newLogPath);
71
+ const logName = basename(newLogPath);
72
+ const oldLogName = logName.replace(LATEST_TAG, OLD_TAG);
73
+ const oldLogPath = join(basePath, oldLogName);
74
+ renameSync(newLogPath, oldLogPath);
75
+ }
76
+ addToLog(entry) {
77
+ this.log = [...this.log, entry];
78
+ this.logSubject.next(this.log);
79
+ }
80
+ getTimestamp() {
81
+ return new Date().getTime();
82
+ }
83
+ }
84
+ //# sourceMappingURL=logger.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.service.js","sourceRoot":"","sources":["../../../src/core/services/logger.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,54 @@
1
+ import type { PROFILE } from '../interfaces/profile.interface.js';
2
+ export type ProfileFilterType = 'base' | 'user' | 'all';
3
+ /**
4
+ * Service responsible for managing profiles.
5
+ * Handles profile registration, retrieval, and target resolution.
6
+ */
7
+ export declare class ProfilesService {
8
+ private userDefinedProfiles;
9
+ /**
10
+ * Sets user-defined profiles loaded from .npkillrc configuration.
11
+ * @param profiles Record of user-defined profile configurations
12
+ */
13
+ setUserDefinedProfiles(profiles: Record<string, PROFILE>): void;
14
+ /**
15
+ * Gets profiles based on the specified filter type.
16
+ * @param filterType Type of profiles to retrieve:
17
+ * - 'base': Only built-in profiles
18
+ * - 'user': Only user-defined profiles from .npkillrc
19
+ * - 'all': Both base and user-defined (user profiles override base)
20
+ * @returns Record of profiles matching the filter
21
+ */
22
+ getProfiles(filterType?: ProfileFilterType): Record<string, PROFILE>;
23
+ /**
24
+ * Gets a specific profile by name.
25
+ * Searches user-defined profiles first, then base profiles.
26
+ * @param name Name of the profile to retrieve
27
+ * @returns The profile if found, undefined otherwise
28
+ */
29
+ getProfileByName(name: string): PROFILE | undefined;
30
+ /**
31
+ * Checks if a profile with the given name exists.
32
+ * @param name Name of the profile to check
33
+ * @returns true if the profile exists, false otherwise
34
+ */
35
+ hasProfile(name: string): boolean;
36
+ /**
37
+ * Gets the targets from multiple profiles by their names.
38
+ * Combines targets from all specified profiles, removing duplicates.
39
+ * @param profileNames Array of profile names to get targets from
40
+ * @returns Array of unique target directory names
41
+ */
42
+ getTargetsFromProfiles(profileNames: string[]): string[];
43
+ /**
44
+ * Validates an array of profile names.
45
+ * @param profileNames Array of profile names to validate
46
+ * @returns Array of invalid profile names (profiles that don't exist)
47
+ */
48
+ getInvalidProfileNames(profileNames: string[]): string[];
49
+ /**
50
+ * Gets the default profile name.
51
+ * @returns Name of the default profile
52
+ */
53
+ getDefaultProfileName(): string;
54
+ }