diff options
author | Benjamin Gruenbaum <benjamingr@gmail.com> | 2020-11-28 21:42:34 +0200 |
---|---|---|
committer | Benjamin Gruenbaum <benjamingr@gmail.com> | 2020-12-06 12:23:19 +0200 |
commit | 20de5f7efce655d435cfb5ae0811577314fbdeb9 (patch) | |
tree | 427088e55248d84bfc726e3d5f65a1d5ab38689d /lib | |
parent | 5477969555727fe75fe72417f9a68634ae9eee3c (diff) | |
download | ios-node-v8-20de5f7efce655d435cfb5ae0811577314fbdeb9.tar.gz ios-node-v8-20de5f7efce655d435cfb5ae0811577314fbdeb9.tar.bz2 ios-node-v8-20de5f7efce655d435cfb5ae0811577314fbdeb9.zip |
child_process: add AbortSignal support
PR-URL: https://github.com/nodejs/node/pull/36308
Reviewed-By: Rich Trott <rtrott@gmail.com>
Diffstat (limited to 'lib')
-rw-r--r-- | lib/child_process.js | 32 |
1 files changed, 29 insertions, 3 deletions
diff --git a/lib/child_process.js b/lib/child_process.js index a39710b34a..af49655ec7 100644 --- a/lib/child_process.js +++ b/lib/child_process.js @@ -58,15 +58,24 @@ let debug = require('internal/util/debuglog').debuglog( ); const { Buffer } = require('buffer'); const { Pipe, constants: PipeConstants } = internalBinding('pipe_wrap'); + +const { + AbortError, + codes: errorCodes, +} = require('internal/errors'); const { ERR_INVALID_ARG_VALUE, ERR_CHILD_PROCESS_IPC_REQUIRED, ERR_CHILD_PROCESS_STDIO_MAXBUFFER, ERR_INVALID_ARG_TYPE, - ERR_OUT_OF_RANGE -} = require('internal/errors').codes; + ERR_OUT_OF_RANGE, +} = errorCodes; const { clearTimeout, setTimeout } = require('timers'); -const { validateString, isInt32 } = require('internal/validators'); +const { + validateString, + isInt32, + validateAbortSignal, +} = require('internal/validators'); const child_process = require('internal/child_process'); const { getValidStdio, @@ -245,6 +254,9 @@ function execFile(file /* , args, options, callback */) { // Validate maxBuffer, if present. validateMaxBuffer(options.maxBuffer); + // Validate signal, if present + validateAbortSignal(options.signal, 'options.signal'); + options.killSignal = sanitizeKillSignal(options.killSignal); const child = spawn(file, args, { @@ -362,6 +374,20 @@ function execFile(file /* , args, options, callback */) { timeoutId = null; }, options.timeout); } + if (options.signal) { + if (options.signal.aborted) { + process.nextTick(() => kill()); + } else { + options.signal.addEventListener('abort', () => { + if (!ex) { + ex = new AbortError(); + } + kill(); + }); + const remove = () => options.signal.removeEventListener('abort', kill); + child.once('close', remove); + } + } if (child.stdout) { if (encoding) |