summaryrefslogtreecommitdiff
path: root/lib/internal/streams
diff options
context:
space:
mode:
authorRobert Nagy <ronagy@icloud.com>2019-09-02 17:30:56 +0200
committerRich Trott <rtrott@gmail.com>2019-09-22 15:47:40 -0700
commit8709a408d2eb31a996077cf0ea48c5fbba93adae (patch)
treeba6024cb11a3e038f79e6fb1011f74fa0bc8c194 /lib/internal/streams
parent872d803faf568ff71e8808cf9f469a38c67abf61 (diff)
downloadandroid-node-v8-8709a408d2eb31a996077cf0ea48c5fbba93adae.tar.gz
android-node-v8-8709a408d2eb31a996077cf0ea48c5fbba93adae.tar.bz2
android-node-v8-8709a408d2eb31a996077cf0ea48c5fbba93adae.zip
stream: use more accurate end-of-stream writable and readable detection
The value of stream.readable and stream.writable should not be used to detect whether a stream is Writable or Readable. Refs: https://github.com/nodejs/node/issues/29395 PR-URL: https://github.com/nodejs/node/pull/29409 Reviewed-By: Matteo Collina <matteo.collina@gmail.com> Reviewed-By: James M Snell <jasnell@gmail.com>
Diffstat (limited to 'lib/internal/streams')
-rw-r--r--lib/internal/streams/end-of-stream.js18
1 files changed, 16 insertions, 2 deletions
diff --git a/lib/internal/streams/end-of-stream.js b/lib/internal/streams/end-of-stream.js
index ca6091fe55..949ab63814 100644
--- a/lib/internal/streams/end-of-stream.js
+++ b/lib/internal/streams/end-of-stream.js
@@ -13,6 +13,18 @@ function isRequest(stream) {
return stream.setHeader && typeof stream.abort === 'function';
}
+function isReadable(stream) {
+ return typeof stream.readable === 'boolean' ||
+ typeof stream.readableEnded === 'boolean' ||
+ !!stream._readableState;
+}
+
+function isWritable(stream) {
+ return typeof stream.writable === 'boolean' ||
+ typeof stream.writableEnded === 'boolean' ||
+ !!stream._writableState;
+}
+
function eos(stream, opts, callback) {
if (arguments.length === 2) {
callback = opts;
@@ -47,8 +59,10 @@ function eos(stream, opts, callback) {
};
}
- let readable = opts.readable || (opts.readable !== false && stream.readable);
- let writable = opts.writable || (opts.writable !== false && stream.writable);
+ let readable = opts.readable ||
+ (opts.readable !== false && isReadable(stream));
+ let writable = opts.writable ||
+ (opts.writable !== false && isWritable(stream));
const onlegacyfinish = () => {
if (!stream.writable) onfinish();