Skip to content

Commit 5ca97d6

Browse files
committed
fix: use queueMicrotask
Fixes: #562 Refs: nodejs/node#37484
1 parent c608ff3 commit 5ca97d6

18 files changed

Lines changed: 60 additions & 38 deletions

lib/client-connect.js

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -55,9 +55,9 @@ class ConnectHandler extends AsyncResource {
5555

5656
if (callback) {
5757
this.callback = null
58-
process.nextTick((self, callback, err, opaque) => {
59-
self.runInAsyncScope(callback, null, err, { opaque })
60-
}, this, callback, err, opaque)
58+
util.queueMicrotask(() => {
59+
this.runInAsyncScope(callback, null, err, { opaque })
60+
})
6161
}
6262
}
6363
}
@@ -89,7 +89,9 @@ function connect (opts, callback) {
8989
signal
9090
}, connectHandler)
9191
} catch (err) {
92-
process.nextTick(callback, err, { opaque: opts && opts.opaque })
92+
util.queueMicrotask(() => {
93+
callback(err, { opaque: opts && opts.opaque })
94+
})
9395
}
9496
}
9597

lib/client-request.js

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -128,8 +128,8 @@ class RequestHandler extends AsyncResource {
128128

129129
if (callback) {
130130
this.callback = null
131-
process.nextTick((self, callback, err, opaque) => {
132-
self.runInAsyncScope(callback, null, err, { opaque })
131+
util.queueMicrotask(() => {
132+
this.runInAsyncScope(callback, null, err, { opaque })
133133
}, this, callback, err, opaque)
134134
}
135135

@@ -158,7 +158,9 @@ function request (opts, callback) {
158158
this.dispatch(opts, new RequestHandler(opts, callback))
159159
} catch (err) {
160160
if (typeof callback === 'function') {
161-
process.nextTick(callback, err, { opaque: opts && opts.opaque })
161+
util.queueMicrotask(() => {
162+
callback(err, { opaque: opts && opts.opaque })
163+
})
162164
} else {
163165
throw err
164166
}

lib/client-stream.js

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -146,9 +146,9 @@ class StreamHandler extends AsyncResource {
146146
util.destroy(res, err)
147147
} else if (callback) {
148148
this.callback = null
149-
process.nextTick((self, callback, err, opaque) => {
150-
self.runInAsyncScope(callback, null, err, { opaque })
151-
}, this, callback, err, opaque)
149+
util.queueMicrotask(() => {
150+
this.runInAsyncScope(callback, null, err, { opaque })
151+
})
152152
}
153153

154154
if (body) {
@@ -171,7 +171,9 @@ function stream (opts, factory, callback) {
171171
this.dispatch(opts, new StreamHandler(opts, factory, callback))
172172
} catch (err) {
173173
if (typeof callback === 'function') {
174-
process.nextTick(callback, err, { opaque: opts && opts.opaque })
174+
util.queueMicrotask(() => {
175+
callback(err, { opaque: opts && opts.opaque })
176+
})
175177
} else {
176178
throw err
177179
}

lib/client-upgrade.js

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -57,9 +57,9 @@ class UpgradeHandler extends AsyncResource {
5757

5858
if (callback) {
5959
this.callback = null
60-
process.nextTick((self, callback, err, opaque) => {
61-
self.runInAsyncScope(callback, null, err, { opaque })
62-
}, this, callback, err, opaque)
60+
util.queueMicrotask(() => {
61+
this.runInAsyncScope(callback, null, err, { opaque })
62+
})
6363
}
6464
}
6565
}
@@ -94,7 +94,9 @@ function upgrade (opts, callback) {
9494
upgrade: protocol || 'Websocket'
9595
}, upgradeHandler)
9696
} catch (err) {
97-
process.nextTick(callback, err, { opaque: opts && opts.opaque })
97+
util.queueMicrotask(() => {
98+
callback(err, { opaque: opts && opts.opaque })
99+
})
98100
}
99101
}
100102

lib/core/client.js

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -248,7 +248,7 @@ class Client extends EventEmitter {
248248
} else if (util.isStream(request.body)) {
249249
// Wait a tick in case stream is ended in the same tick.
250250
this[kResuming] = 1
251-
process.nextTick(resume, this)
251+
util.queueMicrotask(() => resume(this))
252252
} else {
253253
resume(this, true)
254254
}
@@ -275,7 +275,9 @@ class Client extends EventEmitter {
275275
}
276276

277277
if (this[kDestroyed]) {
278-
process.nextTick(callback, new ClientDestroyedError(), null)
278+
util.queueMicrotask(() => {
279+
callback(new ClientDestroyedError(), null)
280+
})
279281
return
280282
}
281283

@@ -310,7 +312,7 @@ class Client extends EventEmitter {
310312
if (this[kOnDestroyed]) {
311313
this[kOnDestroyed].push(callback)
312314
} else {
313-
process.nextTick(callback, null, null)
315+
util.queueMicrotask(() => callback(null, null))
314316
}
315317
return
316318
}
@@ -336,7 +338,7 @@ class Client extends EventEmitter {
336338
}
337339

338340
if (!this[kSocket]) {
339-
process.nextTick(onDestroyed)
341+
util.queueMicrotask(() => onDestroyed())
340342
} else {
341343
util.destroy(this[kSocket].on('close', onDestroyed), err)
342344
}
@@ -967,7 +969,7 @@ function _resume (client, sync) {
967969
} else if (client[kNeedDrain] === 2) {
968970
if (sync) {
969971
client[kNeedDrain] = 1
970-
process.nextTick(emitDrain, client)
972+
util.queueMicrotask(() => emitDrain(client))
971973
} else {
972974
emitDrain(client)
973975
}

lib/core/util.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,7 @@ function destroy (stream, err) {
105105
stream.destroy(err)
106106
}
107107
} else if (err) {
108+
// Node streams use nextTick.
108109
process.nextTick((stream, err) => {
109110
stream.emit('error', err)
110111
}, stream, err)

test/client-connect.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ const { test } = require('tap')
44
const { Client, errors } = require('..')
55
const http = require('http')
66
const EE = require('events')
7+
const util = require('../lib/core/util')
78

89
test('basic connect', (t) => {
910
t.plan(3)
@@ -161,7 +162,7 @@ test('connect wait for empty pipeline', (t) => {
161162
t.error(err)
162163
})
163164
client.once('connect', () => {
164-
process.nextTick(() => {
165+
util.queueMicrotask(() => {
165166
t.strictEqual(client.busy, false)
166167

167168
client.connect({

test/client-errors.js

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ const net = require('net')
77
const { Readable } = require('stream')
88

99
const { kSocket } = require('../lib/core/symbols')
10+
const util = require('../lib/core/util')
1011

1112
test('GET errors and reconnect with pipelining 1', (t) => {
1213
t.plan(9)
@@ -639,7 +640,7 @@ test('socket fail while writing request body', (t) => {
639640
body.push('asd')
640641

641642
client.on('connect', () => {
642-
process.nextTick(() => {
643+
util.queueMicrotask(() => {
643644
client[kSocket].destroy('kaboom')
644645
})
645646
})
@@ -674,7 +675,7 @@ test('socket fail while ending request body', (t) => {
674675

675676
const _err = new Error('kaboom')
676677
client.on('connect', () => {
677-
process.nextTick(() => {
678+
util.queueMicrotask(() => {
678679
client[kSocket].destroy(_err)
679680
})
680681
})

test/client-pipeline.js

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
const { test } = require('tap')
44
const { Client, errors } = require('..')
5+
const util = require('../lib/core/util')
56
const EE = require('events')
67
const { createServer } = require('http')
78
const {
@@ -231,7 +232,7 @@ test('pipeline error body', (t) => {
231232
method: 'PUT'
232233
}, ({ body }) => {
233234
const pt = new PassThrough()
234-
process.nextTick(() => {
235+
util.queueMicrotask(() => {
235236
pt.destroy(new Error('asd'))
236237
})
237238
body.on('error', (err) => {
@@ -271,7 +272,7 @@ test('pipeline destroy body', (t) => {
271272
method: 'PUT'
272273
}, ({ body }) => {
273274
const pt = new PassThrough()
274-
process.nextTick(() => {
275+
util.queueMicrotask(() => {
275276
pt.destroy()
276277
})
277278
body.on('error', (err) => {
@@ -999,7 +1000,7 @@ test('pipeline abort after headers', (t) => {
9991000
method: 'GET',
10001001
signal
10011002
}, ({ body }) => {
1002-
process.nextTick(() => {
1003+
util.queueMicrotask(() => {
10031004
signal.emit('abort')
10041005
})
10051006
return body

test/client-reconnect.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ const { test } = require('tap')
44
const { Client } = require('..')
55
const { createServer } = require('http')
66
const FakeTimers = require('@sinonjs/fake-timers')
7+
const util = require('../lib/core/util')
78

89
test('multiple reconnect', (t) => {
910
t.plan(5)
@@ -39,7 +40,7 @@ test('multiple reconnect', (t) => {
3940
if (++n === 1) {
4041
t.pass()
4142
}
42-
process.nextTick(() => {
43+
util.queueMicrotask(() => {
4344
clock.tick(1000)
4445
})
4546
})

0 commit comments

Comments
 (0)