fix restarting subprocs

This commit is contained in:
Chris Wanstrath 2025-10-20 15:35:16 -07:00
parent 6bc692c558
commit 06b73f90eb

View File

@ -14,7 +14,13 @@ import { apps, isApp, appDir, isStaticApp, webappLog } from "./utils"
export type Handler = (r: Context) => string | Child | Response | Promise<Response> export type Handler = (r: Context) => string | Child | Response | Promise<Response>
export type App = Hono | Handler export type App = Hono | Handler
const processes = new Map<string, { port: string, proc: ReturnType<typeof Bun.spawn> }>() type ProcInfo = {
port: string,
proc: ReturnType<typeof Bun.spawn>,
killed?: boolean
}
const processes = new Map<string, ProcInfo>()
const restarting = new Set<string>() const restarting = new Set<string>()
const STARTING_PORT = 10000 const STARTING_PORT = 10000
let nextPort = STARTING_PORT let nextPort = STARTING_PORT
@ -67,8 +73,9 @@ async function startApp(name: string): Promise<string | undefined> {
stderr: "inherit", stderr: "inherit",
}) })
processes.set(name, { port, proc }) const info: ProcInfo = { port, proc }
proc.exited.then(() => restartApp(name)) processes.set(name, info)
proc.exited.then(code => !info.killed && code !== 0 ? restartApp(name) : {})
await Bun.sleep(100) // give it time before first request await Bun.sleep(100) // give it time before first request
@ -89,13 +96,15 @@ export async function shutdownWebapps() {
wwwWatcher?.close() wwwWatcher?.close()
nextPort = STARTING_PORT nextPort = STARTING_PORT
for (const [name, { port, proc }] of processes) { for (const [name, proc] of processes) {
webappLog(name, "Shutting down") webappLog(name, "Shutting down")
try { proc.kill() } catch { } try {
proc.killed = true
proc.proc.kill()
} catch { }
} }
processes.clear() processes.clear()
process.exit(0)
} }
async function restartApp(name: string) { async function restartApp(name: string) {
@ -107,7 +116,10 @@ async function restartApp(name: string) {
webappLog(name, "restarting") webappLog(name, "restarting")
const existing = processes.get(name) const existing = processes.get(name)
if (existing) { if (existing) {
try { existing.proc.kill() } catch { } try {
existing.killed = true
existing.proc.kill()
} catch { }
processes.delete(name) processes.delete(name)
} }
@ -121,7 +133,6 @@ async function startSubprocs() {
await Promise.all(list.map(app => startApp(app))) await Promise.all(list.map(app => startApp(app)))
} }
let wwwWatcher: any let wwwWatcher: any
function startWatcher() { function startWatcher() {
if (!expectDir(NOSE_DIR)) return if (!expectDir(NOSE_DIR)) return