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:
parent
cdb87d9548
commit
bdea725bdc
@ -2,7 +2,26 @@
|
|||||||
|
|
||||||
exports.getMainThreadStdio = getMainThreadStdio;
|
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() {
|
function getMainThreadStdio() {
|
||||||
var stdin;
|
var stdin;
|
||||||
|
31
test/parallel/test-stdout-pipeline-destroy.js
Normal file
31
test/parallel/test-stdout-pipeline-destroy.js
Normal 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);
|
||||||
|
})
|
||||||
|
);
|
Loading…
x
Reference in New Issue
Block a user