diff --git a/electron/main.cjs b/electron/main.cjs index 0779bc5..574431e 100644 --- a/electron/main.cjs +++ b/electron/main.cjs @@ -15,6 +15,7 @@ const REPO_ROOT = path.resolve(__dirname, '..') const UPDATE_REMOTE_URL = 'https://giers10.uber.space/giers10/Heimgeist.git' const UPDATE_BRANCH = 'master' const GIT_ENV = { ...process.env, GIT_TERMINAL_PROMPT: '0' } +const DEV_WRAPPER_RELAUNCH_CODE = Number(process.env.HEIMGEIST_DEV_RELAUNCH_CODE || 75) const settingsFilePath = process.env.HEIMGEIST_SETTINGS_FILE || path.join(app.getPath('userData'), 'settings.json') let appSettings = {} let lastUpdateCheckResult = null @@ -145,6 +146,11 @@ async function runGitCommand(args, options = {}) { function scheduleAppRestart() { setTimeout(() => { + if (process.env.HEIMGEIST_DEV_WRAPPER === '1') { + app.exit(DEV_WRAPPER_RELAUNCH_CODE) + return + } + app.relaunch() app.exit(0) }, 300) diff --git a/package.json b/package.json index b036cb7..c97ab14 100644 --- a/package.json +++ b/package.json @@ -8,7 +8,7 @@ "dev": "concurrently -k \"npm:dev:backend\" \"npm:dev:renderer\" \"npm:dev:electron\"", "dev:backend": "node scripts/run-backend.cjs", "dev:renderer": "vite --port 5173 --strictPort", - "dev:electron": "wait-on http://localhost:5173 tcp:8000 && cross-env VITE_DEV_SERVER_URL=http://localhost:5173 electron .", + "dev:electron": "node scripts/run-electron-dev.cjs", "build": "vite build", "start": "electron ." }, diff --git a/scripts/run-electron-dev.cjs b/scripts/run-electron-dev.cjs new file mode 100644 index 0000000..e165795 --- /dev/null +++ b/scripts/run-electron-dev.cjs @@ -0,0 +1,67 @@ +const { spawn } = require('child_process') +const path = require('path') +const waitOn = require('wait-on') + +const projectRoot = path.resolve(__dirname, '..') +const electronBinary = require('electron') +const relaunchExitCode = 75 +const startupResources = ['http://localhost:5173', 'tcp:8000'] +const env = { + ...process.env, + VITE_DEV_SERVER_URL: process.env.VITE_DEV_SERVER_URL || 'http://localhost:5173', + HEIMGEIST_DEV_WRAPPER: '1', + HEIMGEIST_DEV_RELAUNCH_CODE: String(relaunchExitCode), +} + +async function waitForDependencies() { + await waitOn({ + resources: startupResources, + timeout: 120000, + }) +} + +function sleep(ms) { + return new Promise((resolve) => { + setTimeout(resolve, ms) + }) +} + +function runElectronOnce() { + return new Promise((resolve) => { + const child = spawn(electronBinary, ['.'], { + cwd: projectRoot, + env, + stdio: 'inherit', + }) + + child.on('exit', (code, signal) => { + resolve({ code, signal }) + }) + }) +} + +async function main() { + await waitForDependencies() + + while (true) { + const { code, signal } = await runElectronOnce() + + if (signal) { + process.kill(process.pid, signal) + return + } + + if (code === relaunchExitCode) { + await sleep(750) + await waitForDependencies() + continue + } + + process.exit(code ?? 0) + } +} + +main().catch((error) => { + console.error('Failed to launch Electron dev wrapper:', error) + process.exit(1) +})