Skip to content
Closed
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Next Next commit
stream: add writableFinished
add a new getter to duplex stream to replace the property `this
.writableState.finished` of the object that inherited duplex.

Refs: #445
  • Loading branch information
zero1five committed Jun 24, 2019
commit 5cd6cccf445ace23e8c2d51ade3be48dbaa5e463
10 changes: 10 additions & 0 deletions doc/api/stream.md
Original file line number Diff line number Diff line change
Expand Up @@ -502,6 +502,16 @@ This property contains the number of bytes (or objects) in the queue
ready to be written. The value provides introspection data regarding
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
<!-- YAML
added: v12.3.0
Expand Down
10 changes: 10 additions & 0 deletions lib/_stream_duplex.js
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,16 @@ Object.defineProperty(Duplex.prototype, 'writableLength', {
}
});

Object.defineProperty(Duplex.prototype, 'writableFinished', {
Comment thread
BridgeAR marked this conversation as resolved.
Outdated
// Making it explicit this property is not enumerable
// because otherwise some prototype manipulation in
// userland will fail
enumerable: false,
Comment thread
BridgeAR marked this conversation as resolved.
Outdated
get() {
return this._writableState.finished;
}
});

// The no-half-open enforcer
function onend() {
// If the writable side ended, then we're ok.
Expand Down
10 changes: 10 additions & 0 deletions lib/_stream_writable.js
Original file line number Diff line number Diff line change
Expand Up @@ -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._undestroy = destroyImpl.undestroy;
Writable.prototype._destroy = function(err, cb) {
Expand Down
30 changes: 30 additions & 0 deletions test/parallel/test-stream-duplex-writable-finished.js
Original file line number Diff line number Diff line change
@@ -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);
}));
}
30 changes: 30 additions & 0 deletions test/parallel/test-stream-writable-finished.js
Original file line number Diff line number Diff line change
@@ -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);
}));
}