2026-03-20 09:15:14 +01:00
|
|
|
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
|
2026-03-20 16:03:51 +01:00
|
|
|
const devServerUrl = process.env.VITE_DEV_SERVER_URL || 'http://127.0.0.1:5173'
|
2026-03-20 16:08:14 +01:00
|
|
|
const startupResources = ['http-get://127.0.0.1:5173', 'http-get://127.0.0.1:8000/health']
|
2026-03-20 09:15:14 +01:00
|
|
|
const env = {
|
|
|
|
|
...process.env,
|
2026-03-20 16:03:51 +01:00
|
|
|
VITE_DEV_SERVER_URL: devServerUrl,
|
2026-03-20 09:15:14 +01:00
|
|
|
HEIMGEIST_DEV_WRAPPER: '1',
|
|
|
|
|
HEIMGEIST_DEV_RELAUNCH_CODE: String(relaunchExitCode),
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
async function waitForDependencies() {
|
|
|
|
|
await waitOn({
|
|
|
|
|
resources: startupResources,
|
2026-03-20 16:08:14 +01:00
|
|
|
proxy: false,
|
2026-03-20 09:15:14 +01:00
|
|
|
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()
|
2026-03-20 16:03:51 +01:00
|
|
|
console.log(`Electron dev wrapper: dependencies ready, launching ${env.VITE_DEV_SERVER_URL}`)
|
2026-03-20 09:15:14 +01:00
|
|
|
|
|
|
|
|
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)
|
|
|
|
|
})
|