| 233 | * keeps graceful SIGTERM (which taskkill /F can't offer anyway). |
| 234 | */ |
| 235 | export function killTree(child: ChildProcess, signal: NodeJS.Signals = 'SIGTERM'): void { |
| 236 | if (child.pid == null) return |
| 237 | if (process.platform === 'win32') { |
| 238 | try { spawnSync('taskkill', ['/pid', String(child.pid), '/T', '/F']) } catch { /* already gone */ } |
| 239 | } else { |
| 240 | try { child.kill(signal) } catch { /* already gone */ } |
| 241 | } |
| 242 | } |
| 243 | |
| 244 | function writePrefixed(stream: NodeJS.WriteStream, buf: Buffer, tag: string): void { |
| 245 | const lines = buf.toString('utf8').split('\n') |