From 9d4c0e6820b9d78b973f774cb500ba0eedc3d3ca Mon Sep 17 00:00:00 2001 From: Jonathan Stewmon Date: Wed, 18 Jul 2018 23:47:41 -0500 Subject: [PATCH] subscribe progress listeners without event indirection --- source/request-as-event-emitter.js | 94 +++++++++++++++--------------- 1 file changed, 46 insertions(+), 48 deletions(-) diff --git a/source/request-as-event-emitter.js b/source/request-as-event-emitter.js index 549356c00..3e864a1dc 100644 --- a/source/request-as-event-emitter.js +++ b/source/request-as-event-emitter.js @@ -139,55 +139,53 @@ module.exports = (options = {}) => { }); }); - emitter.once('request', req => { - emitter.emit('uploadProgress', { - percent: 0, - transferred: 0, - total: uploadBodySize - }); + emitter.emit('uploadProgress', { + percent: 0, + transferred: 0, + total: uploadBodySize + }); - req.once('socket', socket => { - const onSocketConnect = () => { - const uploadEventFrequency = 150; - - progressInterval = setInterval(() => { - if (socket.destroyed) { - clearInterval(progressInterval); - return; - } - - const lastUploaded = uploaded; - const headersSize = req._header ? Buffer.byteLength(req._header) : 0; - uploaded = socket.bytesWritten - headersSize; - - // Prevent the known issue of `bytesWritten` being larger than body size - if (uploadBodySize && uploaded > uploadBodySize) { - uploaded = uploadBodySize; - } - - // Don't emit events with unchanged progress and - // prevent last event from being emitted, because - // it's emitted when `response` is emitted - if (uploaded === lastUploaded || uploaded === uploadBodySize) { - return; - } - - emitter.emit('uploadProgress', { - percent: uploadBodySize ? uploaded / uploadBodySize : 0, - transferred: uploaded, - total: uploadBodySize - }); - }, uploadEventFrequency); - }; - - if (socket.connecting) { - socket.once('connect', onSocketConnect); - } else { - // The socket is being reused from pool, - // so the connect event will not be emitted - onSocketConnect(); - } - }); + req.once('socket', socket => { + const onSocketConnect = () => { + const uploadEventFrequency = 150; + + progressInterval = setInterval(() => { + if (socket.destroyed) { + clearInterval(progressInterval); + return; + } + + const lastUploaded = uploaded; + const headersSize = req._header ? Buffer.byteLength(req._header) : 0; + uploaded = socket.bytesWritten - headersSize; + + // Prevent the known issue of `bytesWritten` being larger than body size + if (uploadBodySize && uploaded > uploadBodySize) { + uploaded = uploadBodySize; + } + + // Don't emit events with unchanged progress and + // prevent last event from being emitted, because + // it's emitted when `response` is emitted + if (uploaded === lastUploaded || uploaded === uploadBodySize) { + return; + } + + emitter.emit('uploadProgress', { + percent: uploadBodySize ? uploaded / uploadBodySize : 0, + transferred: uploaded, + total: uploadBodySize + }); + }, uploadEventFrequency); + }; + + if (socket.connecting) { + socket.once('connect', onSocketConnect); + } else { + // The socket is being reused from pool, + // so the connect event will not be emitted + onSocketConnect(); + } }); if (options.gotTimeout) {