Skip to content

Commit c446fcd

Browse files
committed
stream: add readableEnded
1 parent 9949fbd commit c446fcd

File tree

4 files changed

+54
-1
lines changed

4 files changed

+54
-1
lines changed

doc/api/stream.md

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1095,6 +1095,15 @@ added: REPLACEME
10951095
Getter for the property `encoding` of a given `Readable` stream. The `encoding`
10961096
property can be set using the [`readable.setEncoding()`][] method.
10971097

1098+
##### readable.readableFinished
1099+
<!-- YAML
1100+
added: REPLACEME
1101+
-->
1102+
1103+
* {boolean}
1104+
1105+
Becomes `true` when [`'end'`][] event is emitted.
1106+
10981107
##### readable.readableHighWaterMark
10991108
<!-- YAML
11001109
added: v9.3.0

lib/_stream_readable.js

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -202,6 +202,16 @@ Object.defineProperty(Readable.prototype, 'destroyed', {
202202
}
203203
});
204204

205+
Object.defineProperty(Readable.prototype, 'readableEnded', {
206+
// Making it explicit this property is not enumerable
207+
// because otherwise some prototype manipulation in
208+
// userland will fail
209+
enumerable: false,
210+
get() {
211+
return this._readableState.endEmitted;
212+
}
213+
});
214+
205215
Readable.prototype.destroy = destroyImpl.destroy;
206216
Readable.prototype._undestroy = destroyImpl.undestroy;
207217
Readable.prototype._destroy = function(err, cb) {

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;
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
'use strict';
2+
3+
const common = require('../common');
4+
const { Readable } = require('stream');
5+
const assert = require('assert');
6+
7+
// basic
8+
{
9+
// Find it on Readable.prototype
10+
assert(Readable.prototype.hasOwnProperty('readableEnded'));
11+
}
12+
13+
// event
14+
{
15+
const readable = new Readable();
16+
17+
readable._read = () => {
18+
// The state finished should start in false.
19+
assert.strictEqual(readable.readableEnded, false);
20+
readable.push('asd');
21+
assert.strictEqual(readable.readableEnded, false);
22+
readable.push(null);
23+
assert.strictEqual(readable.readableEnded, false);
24+
};
25+
26+
readable.on('end', common.mustCall(() => {
27+
assert.strictEqual(readable.readableEnded, true);
28+
}));
29+
30+
readable.on('data', common.mustCall(() => {
31+
assert.strictEqual(readable.readableEnded, false);
32+
}));
33+
}

0 commit comments

Comments
 (0)