diff --git a/electron/main.cjs b/electron/main.cjs index 6fd09bb..2741b7d 100644 --- a/electron/main.cjs +++ b/electron/main.cjs @@ -28,20 +28,36 @@ 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)); + 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(); }); } // 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 +78,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 +113,14 @@ function createWindow() { // App start app.whenReady().then(async () => { - await startServer(); - createWindow(); + try { + await startServer(); + createWindow(); + } catch (e) { + console.error('Startup failed:', e); + if (serverProcess) serverProcess.kill(); + app.quit(); + } }); // Cleanup