diff --git a/lib/internal/streams/destroy.js b/lib/internal/streams/destroy.js index b80fb56a6bf324..a6208df337a6ff 100644 --- a/lib/internal/streams/destroy.js +++ b/lib/internal/streams/destroy.js @@ -39,6 +39,7 @@ function destroy(err, cb) { } this._destroy(err || null, (err) => { + const emitClose = (w && w.emitClose) || (r && r.emitClose); if (err) { if (w) { w.errored = true; @@ -51,12 +52,14 @@ function destroy(err, cb) { if (cb) { // Invoke callback before scheduling emitClose so that callback // can schedule before. + if (emitClose) { + process.nextTick(emitCloseNT, this); + } cb(err); // Don't emit 'error' if passed a callback. - process.nextTick(emitCloseNT, this); } else if (err) { - process.nextTick(emitErrorCloseNT, this, err); - } else { + process.nextTick(emitClose ? emitErrorCloseNT : emitErrorNT, this, err); + } else if (emitClose) { process.nextTick(emitCloseNT, this); } }); @@ -65,34 +68,15 @@ function destroy(err, cb) { } function emitErrorCloseNT(self, err) { - emitErrorNT(self, err); - emitCloseNT(self); + self.emit('error', err); + self.emit('close'); } function emitCloseNT(self) { - const r = self._readableState; - const w = self._writableState; - - if ((w && w.emitClose) || (r && r.emitClose)) { - self.emit('close'); - } + self.emit('close'); } function emitErrorNT(self, err) { - const r = self._readableState; - const w = self._writableState; - - if ((w && w.errorEmitted) || (r && r.errorEmitted)) { - return; - } - - if (w) { - w.errorEmitted = true; - } - if (r) { - r.errorEmitted = true; - } - self.emit('error', err); }