stream: add writableFinished

add a new getter to duplex stream to replace the property `this
.writableState.finished` of the object that inherited duplex.

Refs: https://github.com/nodejs/node/issues/445

PR-URL: https://github.com/nodejs/node/pull/28007
Reviewed-By: Luigi Pinca <luigipinca@gmail.com>
Reviewed-By: James M Snell <jasnell@gmail.com>
Reviewed-By: Anna Henningsen <anna@addaleax.net>
Reviewed-By: Rich Trott <rtrott@gmail.com>
This commit is contained in:
zero1five 2019-06-02 03:04:56 +08:00 committed by Rich Trott
parent 2bb93e1108
commit 33aef82b42
5 changed files with 90 additions and 0 deletions

View File

@ -503,6 +503,16 @@ This property contains the number of bytes (or objects) in the queue
ready to be written. The value provides introspection data regarding ready to be written. The value provides introspection data regarding
the status of the `highWaterMark`. the status of the `highWaterMark`.
##### writable.writableFinished
<!-- YAML
added: v12.4.0
-->
* {boolean}
Is `true` if all data has been flushed to the underlying system. After
the [`'finish'`][] event has been emitted.
##### writable.writableObjectMode ##### writable.writableObjectMode
<!-- YAML <!-- YAML
added: v12.3.0 added: v12.3.0

View File

@ -98,6 +98,16 @@ Object.defineProperty(Duplex.prototype, 'writableLength', {
} }
}); });
Object.defineProperty(Duplex.prototype, 'writableFinished', {
// Making it explicit this property is not enumerable
// because otherwise some prototype manipulation in
// userland will fail
enumerable: false,
get() {
return this._writableState.finished;
}
});
// The no-half-open enforcer // The no-half-open enforcer
function onend() { function onend() {
// If the writable side ended, then we're ok. // If the writable side ended, then we're ok.

View File

@ -714,6 +714,16 @@ Object.defineProperty(Writable.prototype, 'writableObjectMode', {
} }
}); });
Object.defineProperty(Writable.prototype, 'writableFinished', {
// Making it explicit this property is not enumerable
// because otherwise some prototype manipulation in
// userland will fail
enumerable: false,
get() {
return this._writableState.finished;
}
});
Writable.prototype.destroy = destroyImpl.destroy; Writable.prototype.destroy = destroyImpl.destroy;
Writable.prototype._undestroy = destroyImpl.undestroy; Writable.prototype._undestroy = destroyImpl.undestroy;
Writable.prototype._destroy = function(err, cb) { Writable.prototype._destroy = function(err, cb) {

View File

@ -0,0 +1,30 @@
'use strict';
const common = require('../common');
const { Duplex } = require('stream');
const assert = require('assert');
// basic
{
// Find it on Duplex.prototype
assert(Duplex.prototype.hasOwnProperty('writableFinished'));
}
// event
{
const duplex = new Duplex();
duplex._write = (chunk, encoding, cb) => {
// The state finished should start in false.
assert.strictEqual(duplex.writableFinished, false);
cb();
};
duplex.on('finish', common.mustCall(() => {
assert.strictEqual(duplex.writableFinished, true);
}));
duplex.end('testing finished state', common.mustCall(() => {
assert.strictEqual(duplex.writableFinished, true);
}));
}

View File

@ -0,0 +1,30 @@
'use strict';
const common = require('../common');
const { Writable } = require('stream');
const assert = require('assert');
// basic
{
// Find it on Writable.prototype
assert(Writable.prototype.hasOwnProperty('writableFinished'));
}
// event
{
const writable = new Writable();
writable._write = (chunk, encoding, cb) => {
// The state finished should start in false.
assert.strictEqual(writable.writableFinished, false);
cb();
};
writable.on('finish', common.mustCall(() => {
assert.strictEqual(writable.writableFinished, true);
}));
writable.end('testing finished state', common.mustCall(() => {
assert.strictEqual(writable.writableFinished, true);
}));
}