stream: add readableEnded · nodejs/node@a9f8b62 · GitHub
Skip to content

Commit a9f8b62

Browse files
ronagtargos
authored andcommitted
stream: add readableEnded
Adds a readableEnded property and improved finished compat with possible stream-like objects. PR-URL: #28814 Refs: #28813 Reviewed-By: Matteo Collina <matteo.collina@gmail.com> Reviewed-By: Rich Trott <rtrott@gmail.com>
1 parent f42eb01 commit a9f8b62

6 files changed

Lines changed: 64 additions & 2 deletions

File tree

doc/api/stream.md

Lines changed: 9 additions & 0 deletions

lib/_stream_readable.js

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -196,6 +196,16 @@ Object.defineProperty(Readable.prototype, 'destroyed', {
196196
}
197197
});
198198

199+
Object.defineProperty(Readable.prototype, 'readableEnded', {
200+
// Making it explicit this property is not enumerable
201+
// because otherwise some prototype manipulation in
202+
// userland will fail
203+
enumerable: false,
204+
get() {
205+
return this._readableState ? this._readableState.endEmitted : false;
206+
}
207+
});
208+
199209
Readable.prototype.destroy = destroyImpl.destroy;
200210
Readable.prototype._undestroy = destroyImpl.undestroy;
201211
Readable.prototype._destroy = function(err, cb) {

lib/internal/streams/async_iterator.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,7 @@ const createReadableStreamAsyncIterator = (stream) => {
132132
[kLastReject]: { value: null, writable: true },
133133
[kError]: { value: null, writable: true },
134134
[kEnded]: {
135-
value: stream._readableState.endEmitted,
135+
value: stream.readableEnded || stream._readableState.endEmitted,
136136
writable: true
137137
},
138138
// The function passed to new Promise is cached so we avoid allocating a new

lib/internal/streams/end-of-stream.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,8 @@ function eos(stream, opts, callback) {
4242
if (!readable) callback.call(stream);
4343
};
4444

45-
var readableEnded = stream._readableState && stream._readableState.endEmitted;
45+
var readableEnded = stream.readableEnded ||
46+
(stream._readableState && stream._readableState.endEmitted);
4647
const onend = () => {
4748
readable = false;
4849
readableEnded = true;

test/parallel/test-stream-finished.js

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
const common = require('../common');
44
const { Writable, Readable, Transform, finished } = require('stream');
55
const assert = require('assert');
6+
const EE = require('events');
67
const fs = require('fs');
78
const { promisify } = require('util');
89

@@ -175,3 +176,11 @@ const { promisify } = require('util');
175176
rs.push(null);
176177
rs.resume();
177178
}
179+
180+
{
181+
const streamLike = new EE();
182+
streamLike.readableEnded = true;
183+
streamLike.readable = true;
184+
finished(streamLike, common.mustCall);
185+
streamLike.emit('close');
186+
}
Lines changed: 33 additions & 0 deletions

0 commit comments

Comments
 (0)