diff --git a/lib/child_process.js b/lib/child_process.js index 64ab321f295f5d..26965aa6b9c504 100644 --- a/lib/child_process.js +++ b/lib/child_process.js @@ -37,7 +37,6 @@ const { ERR_CHILD_PROCESS_IPC_REQUIRED, ERR_CHILD_PROCESS_STDIO_MAXBUFFER, ERR_INVALID_ARG_TYPE, - ERR_INVALID_OPT_VALUE, ERR_OUT_OF_RANGE } = require('internal/errors').codes; const { clearTimeout, setTimeout } = require('timers'); @@ -46,24 +45,14 @@ const child_process = require('internal/child_process'); const { getValidStdio, setupChannel, - ChildProcess + ChildProcess, + stdioStringToArray } = child_process; const MAX_BUFFER = 1024 * 1024; exports.ChildProcess = ChildProcess; -function stdioStringToArray(option) { - switch (option) { - case 'ignore': - case 'pipe': - case 'inherit': - return [option, option, option, 'ipc']; - default: - throw new ERR_INVALID_OPT_VALUE('stdio', option); - } -} - exports.fork = function fork(modulePath /* , args, options */) { validateString(modulePath, 'modulePath'); @@ -104,12 +93,13 @@ exports.fork = function fork(modulePath /* , args, options */) { args = execArgv.concat([modulePath], args); if (typeof options.stdio === 'string') { - options.stdio = stdioStringToArray(options.stdio); + options.stdio = stdioStringToArray(options.stdio, 'ipc'); } else if (!Array.isArray(options.stdio)) { // Use a separate fd=3 for the IPC channel. Inherit stdin, stdout, // and stderr from the parent if silent isn't set. - options.stdio = options.silent ? stdioStringToArray('pipe') : - stdioStringToArray('inherit'); + options.stdio = stdioStringToArray( + options.silent ? 'pipe' : 'inherit', + 'ipc'); } else if (!options.stdio.includes('ipc')) { throw new ERR_CHILD_PROCESS_IPC_REQUIRED('options.stdio'); } diff --git a/lib/internal/child_process.js b/lib/internal/child_process.js index 2f081d9111f553..4e6a25a8a3e338 100644 --- a/lib/internal/child_process.js +++ b/lib/internal/child_process.js @@ -214,6 +214,21 @@ const handleConversion = { } }; +function stdioStringToArray(stdio, channel) { + const options = []; + + switch (stdio) { + case 'ignore': + case 'pipe': options.push(stdio, stdio, stdio); break; + case 'inherit': options.push(0, 1, 2); break; + default: + throw new ERR_INVALID_OPT_VALUE('stdio', stdio); + } + + if (channel) options.push(channel); + + return options; +} function ChildProcess() { EventEmitter.call(this); @@ -892,13 +907,7 @@ function getValidStdio(stdio, sync) { // Replace shortcut with an array if (typeof stdio === 'string') { - switch (stdio) { - case 'ignore': stdio = ['ignore', 'ignore', 'ignore']; break; - case 'pipe': stdio = ['pipe', 'pipe', 'pipe']; break; - case 'inherit': stdio = [0, 1, 2]; break; - default: - throw new ERR_INVALID_OPT_VALUE('stdio', stdio); - } + stdio = stdioStringToArray(stdio); } else if (!Array.isArray(stdio)) { throw new ERR_INVALID_OPT_VALUE('stdio', inspect(stdio)); } @@ -1042,5 +1051,6 @@ module.exports = { ChildProcess, setupChannel, getValidStdio, + stdioStringToArray, spawnSync };