Files

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())