Skip to content

Commit

Permalink
subscribe progress listeners without event indirection
Browse files Browse the repository at this point in the history
  • Loading branch information
jstewmon committed Jul 19, 2018
1 parent 6eef56c commit 9d4c0e6
Showing 1 changed file with 46 additions and 48 deletions.
94 changes: 46 additions & 48 deletions source/request-as-event-emitter.js
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down

0 comments on commit 9d4c0e6

Please sign in to comment.