Files
2016-10-03 10:53:40 +02:00

71 lines
1.5 KiB
JavaScript

var extend = require("util")._extend;
var progress = require("progress");
var bar, nDownloads;
var states = [];
function defined(sum, i) {
if ( i !== undefined ) {
sum.push( i );
}
return sum;
}
function get(attribute) {
return function(obj) {
return obj[attribute];
};
}
function summation(sum, i) {
return sum + (i || 0);
}
function consolidatedState() {
var totals = states.map(get("total")).reduce(defined, []);
var received = states.map(get("received")).reduce(summation, 0);
if (totals.length < nDownloads) {
return {
isCompleted: false,
received: received,
total: Infinity
};
}
return {
completed: states.map(get("percent")).every(function(state) {
return state === 100;
}),
received: received,
total: states.map(get("total")).reduce(summation, 0)
};
}
function reportProgress(state) {
if (!bar) {
bar = new progress(" [:bar] :current/:total :percent :etas", {
total: state.total,
width: 40
});
}
if(!bar.complete) {
bar.total = state.total;
bar.tick(state.received - bar.curr);
}
if (state.completed) {
console.log("Received " + Math.floor(state.received / 1024) + "K total.");
}
}
module.exports = function(_nDownloads) {
nDownloads = _nDownloads;
return function(notification) {
states[notification.index] = extend(
extend({}, states[notification.index]),
notification.value
);
reportProgress(consolidatedState());
};
};