Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/npm/cli.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'node_modules/readable-stream/lib/_stream_writable.js')
-rw-r--r--node_modules/readable-stream/lib/_stream_writable.js28
1 files changed, 21 insertions, 7 deletions
diff --git a/node_modules/readable-stream/lib/_stream_writable.js b/node_modules/readable-stream/lib/_stream_writable.js
index b35447aed..a2634d7c2 100644
--- a/node_modules/readable-stream/lib/_stream_writable.js
+++ b/node_modules/readable-stream/lib/_stream_writable.js
@@ -94,6 +94,8 @@ var _require$codes = require('../errors').codes,
ERR_STREAM_WRITE_AFTER_END = _require$codes.ERR_STREAM_WRITE_AFTER_END,
ERR_UNKNOWN_ENCODING = _require$codes.ERR_UNKNOWN_ENCODING;
+var errorOrDestroy = destroyImpl.errorOrDestroy;
+
require('inherits')(Writable, Stream);
function nop() {}
@@ -173,7 +175,9 @@ function WritableState(options, stream, isDuplex) {
this.errorEmitted = false; // Should close be emitted on destroy. Defaults to true.
- this.emitClose = options.emitClose !== false; // count buffered requests
+ this.emitClose = options.emitClose !== false; // Should .destroy() be called after 'finish' (and potentially 'end')
+
+ this.autoDestroy = !!options.autoDestroy; // count buffered requests
this.bufferedRequestCount = 0; // allocate the first CorkedRequest, there is always
// one allocated and free to use, and we maintain at most two
@@ -250,13 +254,13 @@ function Writable(options) {
Writable.prototype.pipe = function () {
- this.emit('error', new ERR_STREAM_CANNOT_PIPE());
+ errorOrDestroy(this, new ERR_STREAM_CANNOT_PIPE());
};
function writeAfterEnd(stream, cb) {
var er = new ERR_STREAM_WRITE_AFTER_END(); // TODO: defer error events consistently everywhere, not just the cb
- stream.emit('error', er);
+ errorOrDestroy(stream, er);
process.nextTick(cb, er);
} // Checks that a user-supplied chunk is valid, especially for the particular
// mode the stream is in. Currently this means that `null` is never accepted
@@ -273,7 +277,7 @@ function validChunk(stream, state, chunk, cb) {
}
if (er) {
- stream.emit('error', er);
+ errorOrDestroy(stream, er);
process.nextTick(cb, er);
return false;
}
@@ -417,13 +421,13 @@ function onwriteError(stream, state, sync, er, cb) {
process.nextTick(finishMaybe, stream, state);
stream._writableState.errorEmitted = true;
- stream.emit('error', er);
+ errorOrDestroy(stream, 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
+ errorOrDestroy(stream, er); // this can emit finish, but finish must
// always follow error
finishMaybe(stream, state);
@@ -587,7 +591,7 @@ function callFinal(stream, state) {
state.pendingcb--;
if (err) {
- stream.emit('error', err);
+ errorOrDestroy(stream, err);
}
state.prefinished = true;
@@ -618,6 +622,16 @@ function finishMaybe(stream, state) {
if (state.pendingcb === 0) {
state.finished = true;
stream.emit('finish');
+
+ if (state.autoDestroy) {
+ // In case of duplex streams we need a way to detect
+ // if the readable side is ready for autoDestroy as well
+ var rState = stream._readableState;
+
+ if (!rState || rState.autoDestroy && rState.endEmitted) {
+ stream.destroy();
+ }
+ }
}
}