From 73100ce43c8d0fe4ea06f7a710ea56dc5825979f Mon Sep 17 00:00:00 2001 From: Pandipipas <62224708+Pandipipas@users.noreply.github.com> Date: Tue, 10 Feb 2026 22:10:47 +0100 Subject: [PATCH] =?UTF-8?q?Cargar=20splash=20local=20y=20estabilizar=20la?= =?UTF-8?q?=20transici=C3=B3n=20loading=E2=86=92dashboard=20(#12)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Fix startup loading window sequencing * Remove local splash and show bundle loading only * Increase loading delay and force-stop NodeCG on quit --- src/main/main.ts | 37 +++++++++++++++++++++++++++++++------ 1 file changed, 31 insertions(+), 6 deletions(-) diff --git a/src/main/main.ts b/src/main/main.ts index bafa8ad..b4e5e83 100644 --- a/src/main/main.ts +++ b/src/main/main.ts @@ -8,10 +8,11 @@ const DEFAULT_NODECG_PORT = process.env.NODECG_PORT ?? "9090"; const DEFAULT_BUNDLE_NAME = process.env.NODECG_BUNDLE_NAME ?? "scoreko-dev"; const DEFAULT_DASHBOARD_ROUTE = process.env.SCOREKO_DASHBOARD_ROUTE ?? "dashboard/example/main.html?standalone=true"; const DEFAULT_LOADING_ROUTE = process.env.SCOREKO_LOADING_ROUTE ?? "dashboard/loading/main.html?standalone=true"; -const LOAD_DELAY_MS = Number.parseInt(process.env.ELECTRON_LOAD_DELAY_MS ?? "2500", 10); +const LOAD_DELAY_MS = Number.parseInt(process.env.ELECTRON_LOAD_DELAY_MS ?? "10000", 10); const STARTUP_TIMEOUT_MS = Number.parseInt(process.env.NODECG_STARTUP_TIMEOUT_MS ?? "30000", 10); const USE_SYSTEM_NODE = (process.env.NODECG_USE_SYSTEM_NODE ?? "false").toLowerCase() === "true"; const NODE_BINARY = process.env.NODECG_NODE_BINARY ?? "node"; +const NODECG_KILL_TIMEOUT_MS = Number.parseInt(process.env.NODECG_KILL_TIMEOUT_MS ?? "2500", 10); const isDev = !app.isPackaged; const rootPath = isDev ? path.resolve(__dirname, "../..") : process.resourcesPath; @@ -235,26 +236,36 @@ async function launch(): Promise { mainWindow = createMainWindow(); loadingWindow = createLoadingWindow(); - loadingWindow.show(); - lastNodeCGOutput = ""; nodecgProcess = startNodeCG(); - await sleep(Math.max(0, LOAD_DELAY_MS)); await waitForNodeCGReady(Date.now()); + if (!loadingWindow || loadingWindow.isDestroyed()) { + return; + } + try { await loadingWindow.loadURL(loadingUrl); + loadingWindow.show(); } catch (error) { log("No se pudo cargar la ruta de loading del bundle", loadingUrl, error); } + const loadingShownAt = Date.now(); + if (!mainWindow) { return; } try { await mainWindow.loadURL(dashboardUrl); + + const remainingLoadingDelay = Math.max(0, LOAD_DELAY_MS - (Date.now() - loadingShownAt)); + if (remainingLoadingDelay > 0) { + await sleep(remainingLoadingDelay); + } + mainWindow.show(); } catch (error) { throw new Error(`No se pudo cargar el dashboard en ${dashboardUrl}. ${String(error)}`); @@ -271,8 +282,18 @@ function stopNodeCG(): void { return; } - log(`Stopping NodeCG pid=${nodecgProcess.pid}`); - nodecgProcess.kill("SIGTERM"); + const processToStop = nodecgProcess; + const pid = processToStop.pid; + + log(`Stopping NodeCG pid=${pid}`); + processToStop.kill("SIGTERM"); + + setTimeout(() => { + if (processToStop.exitCode === null && processToStop.signalCode === null) { + log(`NodeCG did not exit after SIGTERM, forcing SIGKILL pid=${pid}`); + processToStop.kill("SIGKILL"); + } + }, Math.max(0, NODECG_KILL_TIMEOUT_MS)); } function log(...args: unknown[]): void { @@ -314,6 +335,10 @@ app.on("before-quit", () => { stopNodeCG(); }); +app.on("will-quit", () => { + stopNodeCG(); +}); + process.on("exit", () => { stopNodeCG(); });