mirror of https://github.com/lukechilds/docs.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
80 lines
2.0 KiB
80 lines
2.0 KiB
'use strict';
|
|
|
|
var throttle = require('throttleit');
|
|
|
|
function requestProgress(request, options) {
|
|
var reporter;
|
|
var onResponse;
|
|
var delayTimer;
|
|
var delayCompleted;
|
|
var totalSize;
|
|
var previousReceivedSize;
|
|
var receivedSize = 0;
|
|
var state = {};
|
|
|
|
options = options || {};
|
|
options.throttle = options.throttle == null ? 1000 : options.throttle;
|
|
options.delay = options.delay || 0;
|
|
|
|
// Throttle the progress report function
|
|
reporter = throttle(function () {
|
|
// If the received size is the same, do not report
|
|
if (previousReceivedSize === receivedSize) {
|
|
return;
|
|
}
|
|
|
|
// Update received
|
|
previousReceivedSize = receivedSize;
|
|
state.received = receivedSize;
|
|
|
|
// Update percentage
|
|
// Note that the totalSize might available
|
|
state.percent = totalSize ? Math.round(receivedSize / totalSize * 100) : null;
|
|
|
|
request.emit('progress', state);
|
|
}, options.throttle);
|
|
|
|
// On response handler
|
|
onResponse = function (response) {
|
|
totalSize = Number(response.headers['content-length']);
|
|
receivedSize = 0;
|
|
|
|
// Note that the totalSize might available
|
|
state.total = totalSize || null;
|
|
|
|
// Delay the progress report
|
|
delayCompleted = false;
|
|
delayTimer = setTimeout(function () {
|
|
delayCompleted = true;
|
|
delayTimer = null;
|
|
}, options.delay);
|
|
};
|
|
|
|
request
|
|
.on('request', function () {
|
|
receivedSize = 0;
|
|
})
|
|
.on('response', onResponse)
|
|
.on('data', function (data) {
|
|
receivedSize += data.length;
|
|
|
|
if (delayCompleted) {
|
|
reporter();
|
|
}
|
|
})
|
|
.on('end', function () {
|
|
if (delayTimer) {
|
|
clearTimeout(delayTimer);
|
|
delayTimer = null;
|
|
}
|
|
});
|
|
|
|
// If we already got a response, call the on response handler
|
|
if (request.response) {
|
|
onResponse(request.response);
|
|
}
|
|
|
|
return request;
|
|
}
|
|
|
|
module.exports = requestProgress;
|
|
|