89 lines
1.7 KiB
JavaScript
89 lines
1.7 KiB
JavaScript
import { spawn } from 'node:child_process'
|
|
import { watch } from 'node:fs'
|
|
import { createRequire } from 'node:module'
|
|
import { resolve } from 'node:path'
|
|
|
|
const require = createRequire(import.meta.url)
|
|
const electronPath = require('electron')
|
|
|
|
let child = null
|
|
let stopping = false
|
|
let restartTimer = null
|
|
|
|
function start() {
|
|
child = spawn(electronPath, ['--import', 'tsx', 'src/server/index.ts'], {
|
|
env: {
|
|
...process.env,
|
|
ELECTRON_RUN_AS_NODE: '1',
|
|
GROWTH_REPORT_USER_DATA: process.env.GROWTH_REPORT_USER_DATA || '.electron-dev-data'
|
|
},
|
|
stdio: 'inherit',
|
|
windowsHide: true
|
|
})
|
|
|
|
child.once('exit', (code, signal) => {
|
|
child = null
|
|
|
|
if (stopping) {
|
|
process.exit(0)
|
|
}
|
|
|
|
if (signal) {
|
|
process.kill(process.pid, signal)
|
|
return
|
|
}
|
|
|
|
process.exit(code ?? 0)
|
|
})
|
|
}
|
|
|
|
function stop(signal = 'SIGTERM') {
|
|
if (child && !child.killed) {
|
|
child.kill(signal)
|
|
}
|
|
}
|
|
|
|
function scheduleRestart() {
|
|
if (stopping) {
|
|
return
|
|
}
|
|
|
|
clearTimeout(restartTimer)
|
|
restartTimer = setTimeout(() => {
|
|
if (!child) {
|
|
start()
|
|
return
|
|
}
|
|
|
|
const currentChild = child
|
|
currentChild.once('exit', () => {
|
|
if (!stopping) {
|
|
start()
|
|
}
|
|
})
|
|
currentChild.kill('SIGTERM')
|
|
}, 150)
|
|
}
|
|
|
|
function shutdown(signal = 'SIGTERM') {
|
|
if (stopping) {
|
|
return
|
|
}
|
|
|
|
stopping = true
|
|
clearTimeout(restartTimer)
|
|
stop(signal)
|
|
}
|
|
|
|
start()
|
|
|
|
const watchedRoots = ['src/server', 'src/main/services', 'src/main/entities', 'src/main/types']
|
|
|
|
for (const root of watchedRoots) {
|
|
watch(resolve(root), { recursive: true }, scheduleRestart)
|
|
}
|
|
|
|
process.once('SIGINT', () => shutdown('SIGINT'))
|
|
process.once('SIGTERM', () => shutdown('SIGTERM'))
|
|
process.once('exit', () => stop())
|