diff options
author | Benjamin Gruenbaum <benjamingr@gmail.com> | 2020-11-09 23:25:30 +0200 |
---|---|---|
committer | Node.js GitHub Bot <github-bot@iojs.org> | 2020-12-07 16:08:31 +0000 |
commit | 5bd1eecfa986f1d1ccec08dfdfb269489efc18cc (patch) | |
tree | b4cd3c578944673e1ab19f2f07bd1658f5dffa9a /lib | |
parent | 5122456883071d3a06047293f17c6f86b7476113 (diff) | |
download | ios-node-v8-5bd1eecfa986f1d1ccec08dfdfb269489efc18cc.tar.gz ios-node-v8-5bd1eecfa986f1d1ccec08dfdfb269489efc18cc.tar.bz2 ios-node-v8-5bd1eecfa986f1d1ccec08dfdfb269489efc18cc.zip |
stream: support abort signal
PR-URL: https://github.com/nodejs/node/pull/36061
Reviewed-By: Matteo Collina <matteo.collina@gmail.com>
Reviewed-By: Robert Nagy <ronagy@icloud.com>
Diffstat (limited to 'lib')
-rw-r--r-- | lib/_http_client.js | 12 | ||||
-rw-r--r-- | lib/internal/streams/add-abort-signal.js | 41 | ||||
-rw-r--r-- | lib/internal/streams/readable.js | 1 | ||||
-rw-r--r-- | lib/stream.js | 1 |
4 files changed, 47 insertions, 8 deletions
diff --git a/lib/_http_client.js b/lib/_http_client.js index 75d36f19e6..6fb5dd65cb 100644 --- a/lib/_http_client.js +++ b/lib/_http_client.js @@ -51,7 +51,7 @@ const { Buffer } = require('buffer'); const { defaultTriggerAsyncIdScope } = require('internal/async_hooks'); const { URL, urlToOptions, searchParamsSymbol } = require('internal/url'); const { kOutHeaders, kNeedDrain } = require('internal/http'); -const { AbortError, connResetException, codes } = require('internal/errors'); +const { connResetException, codes } = require('internal/errors'); const { ERR_HTTP_HEADERS_SENT, ERR_INVALID_ARG_TYPE, @@ -61,7 +61,6 @@ const { } = codes; const { validateInteger, - validateAbortSignal, } = require('internal/validators'); const { getTimerDuration } = require('internal/timers'); const { @@ -69,6 +68,8 @@ const { DTRACE_HTTP_CLIENT_RESPONSE } = require('internal/dtrace'); +const { addAbortSignal } = require('stream'); + const INVALID_PATH_REGEX = /[^\u0021-\u00ff]/; const kError = Symbol('kError'); @@ -174,12 +175,7 @@ function ClientRequest(input, options, cb) { const signal = options.signal; if (signal) { - validateAbortSignal(signal, 'options.signal'); - const listener = (e) => this.destroy(new AbortError()); - signal.addEventListener('abort', listener); - this.once('close', () => { - signal.removeEventListener('abort', listener); - }); + addAbortSignal(signal, this); } let method = options.method; const methodIsString = (typeof method === 'string'); diff --git a/lib/internal/streams/add-abort-signal.js b/lib/internal/streams/add-abort-signal.js new file mode 100644 index 0000000000..27fefe96d2 --- /dev/null +++ b/lib/internal/streams/add-abort-signal.js @@ -0,0 +1,41 @@ +'use strict'; + +const { + AbortError, + codes, +} = require('internal/errors'); + +const eos = require('internal/streams/end-of-stream'); +const { ERR_INVALID_ARG_TYPE } = codes; + +// This method is inlined here for readable-stream +// https://github.com/nodejs/node/pull/36061#discussion_r533718029 +const validateAbortSignal = (signal, name) => { + if (signal !== undefined && + (signal === null || + typeof signal !== 'object' || + !('aborted' in signal))) { + throw new ERR_INVALID_ARG_TYPE(name, 'AbortSignal', signal); + } +}; + +function isStream(obj) { + return !!(obj && typeof obj.pipe === 'function'); +} + +module.exports = function addAbortSignal(signal, stream) { + validateAbortSignal(signal, 'signal'); + if (!isStream(stream)) { + throw new ERR_INVALID_ARG_TYPE('stream', 'stream.Stream', stream); + } + const onAbort = () => { + stream.destroy(new AbortError()); + }; + if (signal.aborted) { + onAbort(); + } else { + signal.addEventListener('abort', onAbort); + eos(stream, () => signal.removeEventListener('abort', onAbort)); + } + return stream; +}; diff --git a/lib/internal/streams/readable.js b/lib/internal/streams/readable.js index 93153908fe..105caa1e15 100644 --- a/lib/internal/streams/readable.js +++ b/lib/internal/streams/readable.js @@ -50,6 +50,7 @@ const { getHighWaterMark, getDefaultHighWaterMark } = require('internal/streams/state'); + const { ERR_INVALID_ARG_TYPE, ERR_STREAM_PUSH_AFTER_EOF, diff --git a/lib/stream.js b/lib/stream.js index 11f5ca997f..fb6cf416cd 100644 --- a/lib/stream.js +++ b/lib/stream.js @@ -43,6 +43,7 @@ Stream.Duplex = require('internal/streams/duplex'); Stream.Transform = require('internal/streams/transform'); Stream.PassThrough = require('internal/streams/passthrough'); Stream.pipeline = pipeline; +Stream.addAbortSignal = require('internal/streams/add-abort-signal'); Stream.finished = eos; function lazyLoadPromises() { |