Skip to content

Commit a7c25b7

Browse files
committed
stream: always emit error before close
PR-URL: #19836 Reviewed-By: Matteo Collina <[email protected]> Reviewed-By: Ruben Bridgewater <[email protected]> Reviewed-By: Luigi Pinca <[email protected]>
1 parent 0cd8359 commit a7c25b7

File tree

3 files changed

+37
-6
lines changed

3 files changed

+37
-6
lines changed

lib/internal/streams/destroy.js

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,20 +30,27 @@ function destroy(err, cb) {
3030
}
3131

3232
this._destroy(err || null, (err) => {
33-
process.nextTick(emitCloseNT, this);
3433
if (!cb && err) {
35-
process.nextTick(emitErrorNT, this, err);
34+
process.nextTick(emitErrorAndCloseNT, this, err);
3635
if (this._writableState) {
3736
this._writableState.errorEmitted = true;
3837
}
3938
} else if (cb) {
39+
process.nextTick(emitCloseNT, this);
4040
cb(err);
41+
} else {
42+
process.nextTick(emitCloseNT, this);
4143
}
4244
});
4345

4446
return this;
4547
}
4648

49+
function emitErrorAndCloseNT(self, err) {
50+
emitErrorNT(self, err);
51+
emitCloseNT(self);
52+
}
53+
4754
function emitCloseNT(self) {
4855
if (self._writableState && !self._writableState.emitClose)
4956
return;

test/parallel/test-http2-stream-destroy-event-order.js

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@ let client;
99
let req;
1010
const server = http2.createServer();
1111
server.on('stream', common.mustCall((stream) => {
12-
stream.on('close', common.mustCall(() => {
13-
stream.on('error', common.mustCall(() => {
12+
stream.on('error', common.mustCall(() => {
13+
stream.on('close', common.mustCall(() => {
1414
server.close();
1515
}));
1616
}));
@@ -21,8 +21,8 @@ server.listen(0, common.mustCall(() => {
2121
client = http2.connect(`http://localhost:${server.address().port}`);
2222
req = client.request();
2323
req.resume();
24-
req.on('close', common.mustCall(() => {
25-
req.on('error', common.mustCall(() => {
24+
req.on('error', common.mustCall(() => {
25+
req.on('close', common.mustCall(() => {
2626
client.close();
2727
}));
2828
}));
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
'use strict';
2+
3+
const common = require('../common');
4+
const assert = require('assert');
5+
const { Readable } = require('stream');
6+
7+
const rs = new Readable({
8+
read() {}
9+
});
10+
11+
let closed = false;
12+
let errored = false;
13+
14+
rs.on('close', common.mustCall(() => {
15+
closed = true;
16+
assert(errored);
17+
}));
18+
19+
rs.on('error', common.mustCall((err) => {
20+
errored = true;
21+
assert(!closed);
22+
}));
23+
24+
rs.destroy(new Error('kaboom'));

0 commit comments

Comments
 (0)