|
| 1 | +// NOTE: This file is used to clean up resources used by CLI, when the CLI is killed. |
| 2 | +// The instances here are not shared with the ones in main CLI process. |
| 3 | +import * as fs from "fs"; |
| 4 | +import { FileLogService } from "./file-log-service"; |
| 5 | + |
| 6 | +const pathToBootstrap = process.argv[2]; |
| 7 | +if (!pathToBootstrap || !fs.existsSync(pathToBootstrap)) { |
| 8 | + throw new Error("Invalid path to bootstrap."); |
| 9 | +} |
| 10 | + |
| 11 | +const logFile = process.argv[3]; |
| 12 | +// After requiring the bootstrap we can use $injector |
| 13 | +require(pathToBootstrap); |
| 14 | + |
| 15 | +const fileLogService = $injector.resolve<IFileLogService>(FileLogService, { logFile }); |
| 16 | +fileLogService.logData({ message: "Initializing Cleanup process." }); |
| 17 | + |
| 18 | +const actionsToExecute: ICleanupAction[] = []; |
| 19 | + |
| 20 | +const executeCleanup = async () => { |
| 21 | + const $childProcess = $injector.resolve<IChildProcess>("childProcess"); |
| 22 | + for (const action of actionsToExecute) { |
| 23 | + try { |
| 24 | + fileLogService.logData({ message: `Start executing action: ${JSON.stringify(action)}` }); |
| 25 | + |
| 26 | + // TODO: Add timeout for each action here |
| 27 | + await $childProcess.trySpawnFromCloseEvent(action.command, action.args); |
| 28 | + fileLogService.logData({ message: `Successfully executed action: ${JSON.stringify(action)}` }); |
| 29 | + } catch (err) { |
| 30 | + fileLogService.logData({ message: `Unable to execute action: ${JSON.stringify(action)}`, type: FileLogMessageType.Error }); |
| 31 | + } |
| 32 | + } |
| 33 | + |
| 34 | + fileLogService.logData({ message: `cleanup-process finished` }); |
| 35 | + process.exit(); |
| 36 | +}; |
| 37 | + |
| 38 | +const addCleanupAction = (newAction: ICleanupAction): void => { |
| 39 | + if (!_.some(actionsToExecute, currentAction => _.isEqual(currentAction, newAction))) { |
| 40 | + fileLogService.logData({ message: `cleanup-process added action for execution: ${JSON.stringify(newAction)}` }); |
| 41 | + actionsToExecute.push(newAction); |
| 42 | + } else { |
| 43 | + fileLogService.logData({ message: `cleanup-process will not add action for execution as it has been added already: ${JSON.stringify(newAction)}` }); |
| 44 | + } |
| 45 | +}; |
| 46 | + |
| 47 | +process.on("message", async (cleanupProcessMessage: ICleanupProcessMessage) => { |
| 48 | + fileLogService.logData({ message: `cleanup-process received message of type: ${JSON.stringify(cleanupProcessMessage)}` }); |
| 49 | + |
| 50 | + switch (cleanupProcessMessage.actionType) { |
| 51 | + case CleanupProcessMessageType.AddCleanAction: |
| 52 | + addCleanupAction(cleanupProcessMessage.action); |
| 53 | + break; |
| 54 | + default: |
| 55 | + fileLogService.logData({ message: `Unable to handle message of type ${cleanupProcessMessage.actionType}. Full message is ${JSON.stringify(cleanupProcessMessage)}`, type: FileLogMessageType.Error }); |
| 56 | + break; |
| 57 | + } |
| 58 | + |
| 59 | +}); |
| 60 | + |
| 61 | +process.on("disconnect", async () => { |
| 62 | + fileLogService.logData({ message: "cleanup-process received process.disconnect event" }); |
| 63 | + await executeCleanup(); |
| 64 | +}); |
| 65 | + |
| 66 | +fileLogService.logData({ message: `cleanup-process will send ${DetachedProcessMessages.ProcessReadyToReceive} message` }); |
| 67 | + |
| 68 | +process.send(DetachedProcessMessages.ProcessReadyToReceive); |
0 commit comments