import type { ChildProcess } from "node:child_process"; import process from "node:process"; export type ChildProcessBridgeOptions = { signals?: NodeJS.Signals[]; onSignal?: (signal: NodeJS.Signals) => void; }; const defaultSignals: NodeJS.Signals[] = process.platform === "win32" ? ["SIGTERM", "SIGINT", "SIGBREAK"] : ["SIGTERM", "SIGINT", "SIGHUP", "SIGQUIT"]; export function attachChildProcessBridge( child: ChildProcess, { signals = defaultSignals, onSignal }: ChildProcessBridgeOptions = {}, ): { detach: () => void } { const listeners = new Map void>(); for (const signal of signals) { const listener = (): void => { onSignal?.(signal); try { child.kill(signal); } catch { // ignore } }; try { process.on(signal, listener); listeners.set(signal, listener); } catch { // Unsupported signal on this platform. } } const detach = (): void => { for (const [signal, listener] of listeners) { process.off(signal, listener); } listeners.clear(); }; child.once("exit", detach); child.once("error", detach); return { detach }; }