From 8876ff6b1cee3a8996dbd0c73cfcb9ee04a85d44 Mon Sep 17 00:00:00 2001 From: Rich Trott Date: Wed, 24 Feb 2021 11:30:50 -0800 Subject: [PATCH] stream: move duplicated code to an internal module Create a utils module for isIterable(), isReadable(), and isStream(). --- lib/internal/streams/pipeline.js | 27 ++++++--------------------- lib/internal/streams/utils.js | 32 ++++++++++++++++++++++++++++++++ lib/stream/promises.js | 27 +++++---------------------- node.gyp | 1 + 4 files changed, 44 insertions(+), 43 deletions(-) create mode 100644 lib/internal/streams/utils.js diff --git a/lib/internal/streams/pipeline.js b/lib/internal/streams/pipeline.js index a34a55d562304c..5215d986ef1f1c 100644 --- a/lib/internal/streams/pipeline.js +++ b/lib/internal/streams/pipeline.js @@ -11,7 +11,6 @@ const { FunctionPrototypeCall, ReflectApply, SymbolAsyncIterator, - SymbolIterator, } = primordials; let eos; @@ -27,6 +26,12 @@ const { const { validateCallback } = require('internal/validators'); +const { + isIterable, + isReadable, + isStream, +} = require('internal/streams/utils'); + let EE; let PassThrough; let Readable; @@ -82,26 +87,6 @@ function popCallback(streams) { return ArrayPrototypePop(streams); } -function isReadable(obj) { - return !!(obj && typeof obj.pipe === 'function'); -} - -function isWritable(obj) { - return !!(obj && typeof obj.write === 'function'); -} - -function isStream(obj) { - return isReadable(obj) || isWritable(obj); -} - -function isIterable(obj, isAsync) { - if (!obj) return false; - if (isAsync === true) return typeof obj[SymbolAsyncIterator] === 'function'; - if (isAsync === false) return typeof obj[SymbolIterator] === 'function'; - return typeof obj[SymbolAsyncIterator] === 'function' || - typeof obj[SymbolIterator] === 'function'; -} - function makeAsyncIterable(val) { if (isIterable(val)) { return val; diff --git a/lib/internal/streams/utils.js b/lib/internal/streams/utils.js new file mode 100644 index 00000000000000..08c196802780b8 --- /dev/null +++ b/lib/internal/streams/utils.js @@ -0,0 +1,32 @@ +'use strict'; + +const { + SymbolAsyncIterator, + SymbolIterator, +} = primordials; + +function isReadable(obj) { + return !!(obj && typeof obj.pipe === 'function'); +} + +function isWritable(obj) { + return !!(obj && typeof obj.write === 'function'); +} + +function isStream(obj) { + return isReadable(obj) || isWritable(obj); +} + +function isIterable(obj, isAsync) { + if (!obj) return false; + if (isAsync === true) return typeof obj[SymbolAsyncIterator] === 'function'; + if (isAsync === false) return typeof obj[SymbolIterator] === 'function'; + return typeof obj[SymbolAsyncIterator] === 'function' || + typeof obj[SymbolIterator] === 'function'; +} + +module.exports = { + isIterable, + isReadable, + isStream, +}; diff --git a/lib/stream/promises.js b/lib/stream/promises.js index 90d6b1244bd380..027579b878dbf7 100644 --- a/lib/stream/promises.js +++ b/lib/stream/promises.js @@ -3,8 +3,6 @@ const { ArrayPrototypePop, Promise, - SymbolAsyncIterator, - SymbolIterator, } = primordials; const { @@ -15,29 +13,14 @@ const { validateAbortSignal, } = require('internal/validators'); +const { + isIterable, + isStream, +} = require('internal/streams/utils'); + let pl; let eos; -function isReadable(obj) { - return !!(obj && typeof obj.pipe === 'function'); -} - -function isWritable(obj) { - return !!(obj && typeof obj.write === 'function'); -} - -function isStream(obj) { - return isReadable(obj) || isWritable(obj); -} - -function isIterable(obj, isAsync) { - if (!obj) return false; - if (isAsync === true) return typeof obj[SymbolAsyncIterator] === 'function'; - if (isAsync === false) return typeof obj[SymbolIterator] === 'function'; - return typeof obj[SymbolAsyncIterator] === 'function' || - typeof obj[SymbolIterator] === 'function'; -} - function pipeline(...streams) { if (!pl) pl = require('internal/streams/pipeline'); return new Promise((resolve, reject) => { diff --git a/node.gyp b/node.gyp index cba5c0113de42e..63c8c50987b20e 100644 --- a/node.gyp +++ b/node.gyp @@ -263,6 +263,7 @@ 'lib/internal/streams/state.js', 'lib/internal/streams/pipeline.js', 'lib/internal/streams/end-of-stream.js', + 'lib/internal/streams/utils.js', 'deps/v8/tools/splaytree.js', 'deps/v8/tools/codemap.js', 'deps/v8/tools/consarray.js',