stream: emit finish when using writev and cork
In Writable, 'finish' was not emitted when using writev() and cork() in the event of an Error during the write. This commit makes it consistent with the write() path, which emits 'finish'. Fixes: https://github.com/nodejs/node/issues/11121 PR-URL: https://github.com/nodejs/node/pull/13195 Reviewed-By: Jeremiah Senkpiel <fishrock123@rocketmail.com> Reviewed-By: James M Snell <jasnell@gmail.com> Reviewed-By: Calvin Metcalf <calvin.metcalf@gmail.com> Reviewed-By: Colin Ihrig <cjihrig@gmail.com>
This commit is contained in:
parent
a10bdb51b1
commit
b153420fd9
@ -371,14 +371,19 @@ function doWrite(stream, state, writev, len, chunk, encoding, cb) {
|
||||
function onwriteError(stream, state, sync, er, cb) {
|
||||
--state.pendingcb;
|
||||
if (sync)
|
||||
process.nextTick(cb, er);
|
||||
process.nextTick(afterError, stream, state, cb, er);
|
||||
else
|
||||
cb(er);
|
||||
afterError(stream, state, cb, er);
|
||||
|
||||
stream._writableState.errorEmitted = true;
|
||||
stream.emit('error', er);
|
||||
}
|
||||
|
||||
function afterError(stream, state, cb, err) {
|
||||
cb(err);
|
||||
finishMaybe(stream, state);
|
||||
}
|
||||
|
||||
function onwriteStateUpdate(state) {
|
||||
state.writing = false;
|
||||
state.writecb = null;
|
||||
|
53
test/parallel/test-stream-writable-writev-finish.js
Normal file
53
test/parallel/test-stream-writable-writev-finish.js
Normal file
@ -0,0 +1,53 @@
|
||||
'use strict';
|
||||
|
||||
const common = require('../common');
|
||||
const assert = require('assert');
|
||||
const stream = require('stream');
|
||||
|
||||
// ensure consistency between the finish event when using cork()
|
||||
// and writev and when not using them
|
||||
|
||||
{
|
||||
const writable = new stream.Writable();
|
||||
|
||||
writable._write = (chunks, encoding, cb) => {
|
||||
cb(new Error('write test error'));
|
||||
};
|
||||
|
||||
writable.on('finish', common.mustCall());
|
||||
|
||||
writable.on('prefinish', common.mustCall());
|
||||
|
||||
writable.on('error', common.mustCall((er) => {
|
||||
assert.strictEqual(er.message, 'write test error');
|
||||
}));
|
||||
|
||||
writable.end('test');
|
||||
}
|
||||
|
||||
{
|
||||
const writable = new stream.Writable();
|
||||
|
||||
writable._write = (chunks, encoding, cb) => {
|
||||
cb(new Error('write test error'));
|
||||
};
|
||||
|
||||
writable._writev = (chunks, cb) => {
|
||||
cb(new Error('writev test error'));
|
||||
};
|
||||
|
||||
writable.on('finish', common.mustCall());
|
||||
|
||||
writable.on('prefinish', common.mustCall());
|
||||
|
||||
writable.on('error', common.mustCall((er) => {
|
||||
assert.strictEqual(er.message, 'writev test error');
|
||||
}));
|
||||
|
||||
writable.cork();
|
||||
writable.write('test');
|
||||
|
||||
setImmediate(function() {
|
||||
writable.end('test');
|
||||
});
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user