summaryrefslogtreecommitdiff
path: root/lib/_stream_writable.js
diff options
context:
space:
mode:
Diffstat (limited to 'lib/_stream_writable.js')
-rw-r--r--lib/_stream_writable.js30
1 files changed, 19 insertions, 11 deletions
diff --git a/lib/_stream_writable.js b/lib/_stream_writable.js
index 615f5a3762..78ab13d906 100644
--- a/lib/_stream_writable.js
+++ b/lib/_stream_writable.js
@@ -374,18 +374,26 @@ function doWrite(stream, state, writev, len, chunk, encoding, cb) {
function onwriteError(stream, state, sync, er, cb) {
--state.pendingcb;
- if (sync)
- process.nextTick(afterError, stream, state, cb, er);
- else
- afterError(stream, state, cb, er);
-
- stream._writableState.errorEmitted = true;
- stream.emit('error', er);
-}
-function afterError(stream, state, cb, err) {
- cb(err);
- finishMaybe(stream, state);
+ if (sync) {
+ // defer the callback if we are being called synchronously
+ // to avoid piling up things on the stack
+ process.nextTick(cb, er);
+ // this can emit finish, and it will always happen
+ // after error
+ process.nextTick(finishMaybe, stream, state);
+ stream._writableState.errorEmitted = true;
+ stream.emit('error', er);
+ } else {
+ // the caller expect this to happen before if
+ // it is async
+ cb(er);
+ stream._writableState.errorEmitted = true;
+ stream.emit('error', er);
+ // this can emit finish, but finish must
+ // always follow error
+ finishMaybe(stream, state);
+ }
}
function onwriteStateUpdate(state) {