diff --git a/main.js b/main.js index 39caf81..c30a7e8 100644 --- a/main.js +++ b/main.js @@ -76,6 +76,7 @@ const { registerIpcHandlers } = require("./app/ipcHandlers"); const { createSplashWindow, closeSplashWindow, setSplashProgress } = require("./app/splashManager"); const { userThemesPath, initUserThemes, isWindows, validateBinaries, defaultDownloadFolder } = require("./server/helpers/path.helpers"); const {createSystemTray, destroyTray} = require("./app/tray"); +const { stopServer } = require("./server/server"); /** * Global flag indicating if the application is intentionally shutting down. @@ -91,6 +92,28 @@ app.isQuitting = false; */ let isCleanedUp = false; +/** + * Performs a graceful shutdown of all application services asynchronously. + * Once finished, it re-triggers the app.quit() process. + */ +async function cleanShutdown() { + try { + destroyTray(); + await stopRPC(); + stopServer(); + + } catch (err) { + logger.error("Error during cleanup:", err); + + } finally { + logger.info("All services stopped. Have a nice day!"); + logSessionEnd(); + + isCleanedUp = true; + app.quit(); + } +} + /** * If another instance want to run */ @@ -166,19 +189,6 @@ app.on("before-quit", (event) => { if (!isCleanedUp) { event.preventDefault(); - (async () => { - try { - destroyTray(); - await stopRPC(); - } catch (err) { - logger.error("Error during cleanup:", err); - } finally { - logger.info("All services stopped. Have a nice day!"); - logSessionEnd(); - - isCleanedUp = true; - app.quit(); - } - })(); + cleanShutdown(); } }); \ No newline at end of file diff --git a/server/server.js b/server/server.js index a69d102..cdf07c0 100644 --- a/server/server.js +++ b/server/server.js @@ -1,11 +1,17 @@ const express = require("express"); const path = require("path"); -const { logger, logSessionEnd } = require("./logger"); const config = require("../config"); + +const { logger, logSessionEnd } = require("./logger"); const { rateLimit } = require("./helpers/rateLimit.helpers"); const app = express(); +/** + * Store the state of the server + */ +let serverInstance = null; + // Middlewares app.use(express.json()); app.use(express.urlencoded({ extended: true })); @@ -30,33 +36,29 @@ app.get("/", rateLimit, (req, res) => { */ async function startServer() { return new Promise((resolve, reject) => { - const server = app.listen(config.applicationPort, () => { + const serverInstance = app.listen(config.applicationPort, () => { logger.info(`Express server ready at http://localhost:${config.applicationPort}`); - resolve(server); + resolve(serverInstance); }); - server.on("error", (err) => { + serverInstance.on("error", (err) => { logger.error("Express server error:", err); reject(err); }); - - /** - * Clean exit function - * - Stop Log - * - Stop Express Server - * - Stop Electron App - */ - const gracefulExit = () => { - logSessionEnd(); - server.close(() => { - logger.info("Express server closed cleanly."); - process.exit(); - }); - }; - - process.on("SIGINT", gracefulExit); - process.on("SIGTERM", gracefulExit); }); } -module.exports = { startServer }; \ No newline at end of file +/** + * Clean exit function called by Electron + */ +function stopServer() { + if (serverInstance) { + serverInstance.close(); + logger.info("Express server closed cleanly."); + + } else { + logger.error("Express server was not closed cleanly") + } +} + +module.exports = { startServer, stopServer }; \ No newline at end of file