import { fork } from 'child_process'; const usedPorts = []; let CURRENT_PORT; export default function start({ scriptPath }) { const execArgv = process.execArgv.slice(0); const inspectArgvIndex = execArgv.findIndex(argv => argv.includes('--inspect-brk'),); if (inspectArgvIndex > -1) { const inspectArgv = execArgv[inspectArgvIndex]; execArgv.splice( inspectArgvIndex, 1, inspectArgv.replace(/--inspect-brk=(.*)/, (match, s1) => { let port; try { port = parseInt(s1, 10) + 1; } catch (e) { port = 9230; // node default inspect port plus 1. } if (usedPorts.includes(port)) { port += 1; } usedPorts.push(port); return `--inspect-brk=${port}`; }), ); } // set port to env when current port has value if (CURRENT_PORT) { // @ts-ignore process.env.PORT = CURRENT_PORT; } const child = fork(scriptPath, process.argv.slice(2), { execArgv }); child.on('message', (data) => { const type = (data && data.type) || null; if (type === 'RESTART') { child.kill(); start({ scriptPath }); } else if (type === 'UPDATE_PORT') { // set current used port CURRENT_PORT = data.port; } process.send && process.send(data); }); return child; }