Skip to content
Permalink
Browse files

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: #11121
PR-URL: #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>
  • Loading branch information...
mcollina authored and jasnell committed May 24, 2017
1 parent 2264d9d commit b8b6c2c262f0eb7a1dd229dbbbd16c9168610e94
Showing with 60 additions and 2 deletions.
  1. +7 −2 lib/_stream_writable.js
  2. +53 −0 test/parallel/test-stream-writable-writev-finish.js
@@ -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;
@@ -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');
});
}

0 comments on commit b8b6c2c

Please sign in to comment.
You can’t perform that action at this time.