返回 CodeWhale
recorder-process.mjs
根目录 / pet / tests / helpers / recorder-process.mjs
1 import { spawn } from 'node:child_process';
2
3 /** Windows child.kill('SIGINT') force-terminates the process. This test-only
4 * preload delivers the handler notification over IPC; POSIX uses a real signal.
5 * The IPC channel is unreferenced so startup rejection can exit naturally.
6 * No test control channel is added to the shipped recorder. */
7 export function spawnRecorder(args, env = process.env, ipc = process.platform === 'win32') {
8 const control = `process.once('message', () => { process.disconnect(); process.emit('SIGINT'); }); process.channel.unref();`;
9 const preload = ipc ? ['--import', `data:text/javascript,${encodeURIComponent(control)}`] : [];
10 const child = spawn(process.execPath, [...preload, 'scripts/pet.mjs', ...args], {
11 cwd: new URL('../../', import.meta.url), env, stdio: ipc ? ['ignore', 'pipe', 'pipe', 'ipc'] : ['ignore', 'pipe', 'pipe'],
12 });
13 child.stopRecorder = () => {
14 if (child.exitCode !== null || child.signalCode !== null) return false;
15 return ipc ? child.send('stop') : child.kill('SIGINT');
16 };
17 return child;
18 }
19
19 lines Plain Text