|
|
@@ -0,0 +1,34 @@ |
|
|
|
|
|
import { spawn } from 'node:child_process'; |
|
|
|
|
|
|
|
|
|
|
|
export function startProcess(command, args, options = {}) { |
|
|
|
|
|
const child = spawn(command, args, { |
|
|
|
|
|
cwd: options.cwd, |
|
|
|
|
|
env: { ...process.env, ...(options.env || {}) }, |
|
|
|
|
|
shell: process.platform === 'win32', |
|
|
|
|
|
stdio: ['ignore', 'pipe', 'pipe'], |
|
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
|
|
const output = []; |
|
|
|
|
|
child.stdout.on('data', (chunk) => output.push(chunk.toString())); |
|
|
|
|
|
child.stderr.on('data', (chunk) => output.push(chunk.toString())); |
|
|
|
|
|
|
|
|
|
|
|
child.once('exit', (code) => { |
|
|
|
|
|
if (code !== null && code !== 0) { |
|
|
|
|
|
output.push(`\nprocess exited with code ${code}\n`); |
|
|
|
|
|
} |
|
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
|
|
return { child, output }; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
export async function stopProcess(child) { |
|
|
|
|
|
if (!child || child.killed) return; |
|
|
|
|
|
await new Promise((resolve) => { |
|
|
|
|
|
child.once('exit', resolve); |
|
|
|
|
|
child.kill(process.platform === 'win32' ? undefined : 'SIGTERM'); |
|
|
|
|
|
setTimeout(() => { |
|
|
|
|
|
if (!child.killed) child.kill('SIGKILL'); |
|
|
|
|
|
resolve(); |
|
|
|
|
|
}, 5000).unref(); |
|
|
|
|
|
}); |
|
|
|
|
|
} |