summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorBenjamin Gruenbaum <benjamingr@gmail.com>2020-11-28 21:42:34 +0200
committerBenjamin Gruenbaum <benjamingr@gmail.com>2020-12-06 12:23:19 +0200
commit20de5f7efce655d435cfb5ae0811577314fbdeb9 (patch)
tree427088e55248d84bfc726e3d5f65a1d5ab38689d /lib
parent5477969555727fe75fe72417f9a68634ae9eee3c (diff)
downloadios-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.js32
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)