process: make stdout and stderr emit 'close' on destroy

Fix: https://github.com/nodejs/node/issues/26550

PR-URL: https://github.com/nodejs/node/pull/26691
Fixes: https://github.com/false
Fixes: https://github.com/nodejs/node/issues/26550
Reviewed-By: James M Snell <jasnell@gmail.com>
Reviewed-By: Anna Henningsen <anna@addaleax.net>
This commit is contained in:
Matteo Collina 2019-03-15 20:23:15 +01:00
parent cdb87d9548
commit bdea725bdc
2 changed files with 51 additions and 1 deletions

View File

@ -2,7 +2,26 @@
exports.getMainThreadStdio = getMainThreadStdio;
function dummyDestroy(err, cb) { cb(err); }
function dummyDestroy(err, cb) {
// SyncWriteStream does not use the stream
// destroy mechanism for some legacy reason.
// TODO(mcollina): remove when
// https://github.com/nodejs/node/pull/26690 lands.
if (typeof cb === 'function') {
cb(err);
}
// We need to emit 'close' anyway so that the closing
// of the stream is observable. We just make sure we
// are not going to do it twice.
// The 'close' event is needed so that finished and
// pipeline work correctly.
if (!this._writableState.emitClose) {
process.nextTick(() => {
this.emit('close');
});
}
}
function getMainThreadStdio() {
var stdin;

View File

@ -0,0 +1,31 @@
'use strict';
const common = require('../common');
const { Transform, Readable, pipeline } = require('stream');
const assert = require('assert');
const reader = new Readable({
read(size) { this.push('foo'); }
});
let count = 0;
const err = new Error('this-error-gets-hidden');
const transform = new Transform({
transform(chunk, enc, cb) {
if (count++ >= 5)
this.emit('error', err);
else
cb(null, count.toString() + '\n');
}
});
pipeline(
reader,
transform,
process.stdout,
common.mustCall((e) => {
assert.strictEqual(e, err);
})
);