From 126c4a22b1cb0aa4d472e34e9d0fa791bfea19b6 Mon Sep 17 00:00:00 2001 From: Akash Santra Date: Fri, 1 May 2026 00:56:20 +0530 Subject: [PATCH 1/2] fix: prevent app hang by adding timeout and proper error handling for server startup --- electron/main.cjs | 34 +++++++++++++++++++++++++++------- 1 file changed, 27 insertions(+), 7 deletions(-) diff --git a/electron/main.cjs b/electron/main.cjs index 6fd09bb..40d2b6f 100644 --- a/electron/main.cjs +++ b/electron/main.cjs @@ -28,20 +28,29 @@ if (!gotLock) { } // Wait until server is ready -function waitForServer(url) { - return new Promise((resolve) => { +function waitForServer(url, timeout = 15000) { + return new Promise((resolve, reject) => { + const start = Date.now(); + const check = () => { http .get(url, () => resolve()) - .on('error', () => setTimeout(check, 500)); + .on('error', () => { + if (Date.now() - start > timeout) { + reject(new Error('Server did not start within timeout')); + } else { + setTimeout(check, 500); + } + }); }; + check(); }); } // Start Nitro server (production) function startServer() { - return new Promise((resolve) => { + return new Promise((resolve, reject) => { const serverPath = path.join( process.resourcesPath, 'app.asar.unpacked', @@ -62,7 +71,13 @@ function startServer() { }, }); - waitForServer(`http://localhost:${serverPort}`).then(resolve); + waitForServer(`http://localhost:${serverPort}`) + .then(resolve) + .catch((err) => { + console.error('Server failed to start:', err); + if (serverProcess) serverProcess.kill(); + reject(err) + }); }); } @@ -91,8 +106,13 @@ function createWindow() { // App start app.whenReady().then(async () => { - await startServer(); - createWindow(); + try { + await startServer(); + createWindow(); + } catch (e) { + console.error('Startup failed:', e); + app.quit(); + } }); // Cleanup From 97e0aa17963767d4a4de84d265a7cc660f49ba33 Mon Sep 17 00:00:00 2001 From: Akash Santra Date: Fri, 1 May 2026 01:08:19 +0530 Subject: [PATCH 2/2] fix: improve server startup robustness and handle hanging requests --- electron/main.cjs | 26 +++++++++++++++++--------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/electron/main.cjs b/electron/main.cjs index 40d2b6f..2741b7d 100644 --- a/electron/main.cjs +++ b/electron/main.cjs @@ -33,15 +33,22 @@ function waitForServer(url, timeout = 15000) { const start = Date.now(); const check = () => { - http - .get(url, () => resolve()) - .on('error', () => { - if (Date.now() - start > timeout) { - reject(new Error('Server did not start within timeout')); - } else { - setTimeout(check, 500); - } - }); + const req = http.get(url, (res) => { + res.resume(); + resolve(); + }); + + req.setTimeout(2000, () => { + req.destroy(); + }); + + req.on('error', () => { + if (Date.now() - start > timeout) { + reject(new Error('Server did not start within timeout')); + } else { + setTimeout(check, 500); + } + }); }; check(); @@ -111,6 +118,7 @@ app.whenReady().then(async () => { createWindow(); } catch (e) { console.error('Startup failed:', e); + if (serverProcess) serverProcess.kill(); app.quit(); } });