From c2bcc6fcf06bf1e16fe8756a1bfa32cd84aeb584 Mon Sep 17 00:00:00 2001 From: joaoGabriel55 Date: Wed, 16 Jul 2025 10:04:51 -0300 Subject: [PATCH 1/6] lib: fix isReadable and isWritable return type value --- lib/internal/streams/utils.js | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/lib/internal/streams/utils.js b/lib/internal/streams/utils.js index 45f55316104fe8..780cf0b9a0b31c 100644 --- a/lib/internal/streams/utils.js +++ b/lib/internal/streams/utils.js @@ -172,20 +172,24 @@ function isReadableFinished(stream, strict) { function isReadable(stream) { if (stream && stream[kIsReadable] != null) return stream[kIsReadable]; - if (typeof stream?.readable !== 'boolean') return null; + if (typeof stream?.readable !== 'boolean') return false; if (isDestroyed(stream)) return false; - return isReadableNodeStream(stream) && + return Boolean( + isReadableNodeStream(stream) && stream.readable && - !isReadableFinished(stream); + !isReadableFinished(stream) + ); } function isWritable(stream) { if (stream && stream[kIsWritable] != null) return stream[kIsWritable]; - if (typeof stream?.writable !== 'boolean') return null; + if (typeof stream?.writable !== 'boolean') return false if (isDestroyed(stream)) return false; - return isWritableNodeStream(stream) && + return Boolean( + isWritableNodeStream(stream) && stream.writable && - !isWritableEnded(stream); + !isWritableEnded(stream) + ); } function isFinished(stream, opts) { From 53c228b086be89fd606d8237620d3d29a586dddb Mon Sep 17 00:00:00 2001 From: joaoGabriel55 Date: Wed, 16 Jul 2025 10:05:32 -0300 Subject: [PATCH 2/6] test: write test-streem-utils.js test file --- test/parallel/test-stream-utils.js | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 test/parallel/test-stream-utils.js diff --git a/test/parallel/test-stream-utils.js b/test/parallel/test-stream-utils.js new file mode 100644 index 00000000000000..8f6684b9252d50 --- /dev/null +++ b/test/parallel/test-stream-utils.js @@ -0,0 +1,12 @@ +'use strict'; +const assert = require('assert'); + +const { isReadable, isWritable, Writable, Readable } = require('stream'); + +{ + + assert.strictEqual(isReadable(new Readable()), true); + assert.strictEqual(isReadable(new Writable()), false); + assert.strictEqual(isWritable(new Writable()), true); + assert.strictEqual(isWritable(new Readable()), false); +} From 4e040c17d2aef94f9a4c78f3ea12cba87754bccb Mon Sep 17 00:00:00 2001 From: joaoGabriel55 Date: Thu, 17 Jul 2025 14:44:04 -0300 Subject: [PATCH 3/6] rollback: undo the last change and delete the unnecessary test --- lib/internal/streams/utils.js | 12 ++++-------- test/parallel/test-stream-utils.js | 12 ------------ 2 files changed, 4 insertions(+), 20 deletions(-) delete mode 100644 test/parallel/test-stream-utils.js diff --git a/lib/internal/streams/utils.js b/lib/internal/streams/utils.js index 780cf0b9a0b31c..6f14e99ab01ead 100644 --- a/lib/internal/streams/utils.js +++ b/lib/internal/streams/utils.js @@ -172,24 +172,20 @@ function isReadableFinished(stream, strict) { function isReadable(stream) { if (stream && stream[kIsReadable] != null) return stream[kIsReadable]; - if (typeof stream?.readable !== 'boolean') return false; + if (typeof stream?.readable !== 'boolean') return null; if (isDestroyed(stream)) return false; - return Boolean( - isReadableNodeStream(stream) && + return isReadableNodeStream(stream) && stream.readable && !isReadableFinished(stream) - ); } function isWritable(stream) { if (stream && stream[kIsWritable] != null) return stream[kIsWritable]; - if (typeof stream?.writable !== 'boolean') return false + if (typeof stream?.writable !== 'boolean') return null if (isDestroyed(stream)) return false; - return Boolean( - isWritableNodeStream(stream) && + return isWritableNodeStream(stream) && stream.writable && !isWritableEnded(stream) - ); } function isFinished(stream, opts) { diff --git a/test/parallel/test-stream-utils.js b/test/parallel/test-stream-utils.js deleted file mode 100644 index 8f6684b9252d50..00000000000000 --- a/test/parallel/test-stream-utils.js +++ /dev/null @@ -1,12 +0,0 @@ -'use strict'; -const assert = require('assert'); - -const { isReadable, isWritable, Writable, Readable } = require('stream'); - -{ - - assert.strictEqual(isReadable(new Readable()), true); - assert.strictEqual(isReadable(new Writable()), false); - assert.strictEqual(isWritable(new Writable()), true); - assert.strictEqual(isWritable(new Readable()), false); -} From 301d58cefc2dd9eb3168c2e141fce0eb342d7ec6 Mon Sep 17 00:00:00 2001 From: joaoGabriel55 Date: Thu, 17 Jul 2025 14:44:11 -0300 Subject: [PATCH 4/6] doc: update isReadable and add isWritable doc --- doc/api/stream.md | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/doc/api/stream.md b/doc/api/stream.md index 546aee482afd53..6cd5951902befb 100644 --- a/doc/api/stream.md +++ b/doc/api/stream.md @@ -3084,10 +3084,17 @@ changes: --> * `stream` {Readable|Duplex|ReadableStream} -* Returns: {boolean} +* Returns: {boolean|null} - Only returns a `null` if type of `stream.readable` argument passed is not a boolean. Returns whether the stream is readable. +### `stream.isWritable(stream)` + +* `stream` {Writable|Duplex|WritableStream} +* Returns: {boolean|null} - Only returns a `null` if type of `stream.writable` argument passed is not a boolean. + +Returns whether the stream is writable. + ### `stream.Readable.from(iterable[, options])` * `stream` {Readable|Duplex|ReadableStream} -* Returns: {boolean|null} - Only returns a `null` if type of `stream.readable` argument passed is not a boolean. +* Returns: {boolean|null} - Only returns `null` if `stream` is not a valid `Readable`, `Duplex` or `ReadableStream`. Returns whether the stream is readable. ### `stream.isWritable(stream)` * `stream` {Writable|Duplex|WritableStream} -* Returns: {boolean|null} - Only returns a `null` if type of `stream.writable` argument passed is not a boolean. +* Returns: {boolean|null} - Only returns `null` if `stream` is not a valid `Writable`, `Duplex` or `WritableStream`. Returns whether the stream is writable.