1*f0df9794SNeil Fullerclass ProgressStats { 2*f0df9794SNeil Fuller constructor (trackerName, totalTasks) { 3*f0df9794SNeil Fuller this.trackerName = trackerName 4*f0df9794SNeil Fuller this.totalTasks = totalTasks 5*f0df9794SNeil Fuller this.taskCounter = 0 6*f0df9794SNeil Fuller } 7*f0df9794SNeil Fuller 8*f0df9794SNeil Fuller logNext () { 9*f0df9794SNeil Fuller this.taskCounter++ 10*f0df9794SNeil Fuller if (!this.beginTime) { 11*f0df9794SNeil Fuller this.beginTime = new Date() 12*f0df9794SNeil Fuller } 13*f0df9794SNeil Fuller } 14*f0df9794SNeil Fuller 15*f0df9794SNeil Fuller /** 16*f0df9794SNeil Fuller * Begin a new task. Print the current progress and then increment the number of tasks. 17*f0df9794SNeil Fuller * @param {string} A short message about the current task progress 18*f0df9794SNeil Fuller * @param {[boolean]} logTimeLeft whether or not to log the time left. 19*f0df9794SNeil Fuller */ 20*f0df9794SNeil Fuller beginTask (message, logTimeLeft) { 21*f0df9794SNeil Fuller this.printStats(message, logTimeLeft) 22*f0df9794SNeil Fuller this.logNext() 23*f0df9794SNeil Fuller } 24*f0df9794SNeil Fuller 25*f0df9794SNeil Fuller /** 26*f0df9794SNeil Fuller * Print the current progress. 27*f0df9794SNeil Fuller * @param {string} A short message about the current task progress 28*f0df9794SNeil Fuller * @param {[boolean]} logTimeLeft whether or not to log the time left. 29*f0df9794SNeil Fuller */ 30*f0df9794SNeil Fuller printStats (message, logTimeLeft) { 31*f0df9794SNeil Fuller message = `${message}; ${this.trackerName} progress: ${this.getPercentage()}% done` 32*f0df9794SNeil Fuller if (logTimeLeft) { 33*f0df9794SNeil Fuller message = `${message} - ${this.getTimeLeft()} left` 34*f0df9794SNeil Fuller } 35*f0df9794SNeil Fuller console.log(message) 36*f0df9794SNeil Fuller } 37*f0df9794SNeil Fuller 38*f0df9794SNeil Fuller /** 39*f0df9794SNeil Fuller * calculates the percentage of finished downloads 40*f0df9794SNeil Fuller * @returns {string} 41*f0df9794SNeil Fuller */ 42*f0df9794SNeil Fuller getPercentage () { 43*f0df9794SNeil Fuller var current = (this.taskCounter / this.totalTasks) 44*f0df9794SNeil Fuller return Math.round(current * 1000.0) / 10.0 45*f0df9794SNeil Fuller } 46*f0df9794SNeil Fuller 47*f0df9794SNeil Fuller /** 48*f0df9794SNeil Fuller * calculates the time left and outputs it in human readable format 49*f0df9794SNeil Fuller * calculation is based on the average time per task so far 50*f0df9794SNeil Fuller * 51*f0df9794SNeil Fuller * @returns {string} 52*f0df9794SNeil Fuller */ 53*f0df9794SNeil Fuller getTimeLeft () { 54*f0df9794SNeil Fuller if (this.taskCounter === 0) return '?' 55*f0df9794SNeil Fuller const averageTimePerTask = (Date.now() - this.beginTime.getTime()) / this.taskCounter 56*f0df9794SNeil Fuller var tasksLeft = this.totalTasks - this.taskCounter 57*f0df9794SNeil Fuller var millisecondsLeft = averageTimePerTask * tasksLeft 58*f0df9794SNeil Fuller return this.formatMilliseconds(millisecondsLeft) 59*f0df9794SNeil Fuller } 60*f0df9794SNeil Fuller 61*f0df9794SNeil Fuller /** 62*f0df9794SNeil Fuller * inspired from https://stackoverflow.com/questions/19700283/how-to-convert-time-milliseconds-to-hours-min-sec-format-in-javascript 63*f0df9794SNeil Fuller * @param millisec 64*f0df9794SNeil Fuller * @returns {string} 65*f0df9794SNeil Fuller */ 66*f0df9794SNeil Fuller formatMilliseconds (millisec) { 67*f0df9794SNeil Fuller var seconds = (millisec / 1000).toFixed(1) 68*f0df9794SNeil Fuller var minutes = (millisec / (1000 * 60)).toFixed(1) 69*f0df9794SNeil Fuller var hours = (millisec / (1000 * 60 * 60)).toFixed(1) 70*f0df9794SNeil Fuller var days = (millisec / (1000 * 60 * 60 * 24)).toFixed(1) 71*f0df9794SNeil Fuller if (seconds < 60) { 72*f0df9794SNeil Fuller return seconds + ' seconds' 73*f0df9794SNeil Fuller } else if (minutes < 60) { 74*f0df9794SNeil Fuller return minutes + ' minutes' 75*f0df9794SNeil Fuller } else if (hours < 24) { 76*f0df9794SNeil Fuller return hours + ' hours' 77*f0df9794SNeil Fuller } else { 78*f0df9794SNeil Fuller return days + ' days' 79*f0df9794SNeil Fuller } 80*f0df9794SNeil Fuller } 81*f0df9794SNeil Fuller} 82*f0df9794SNeil Fuller 83*f0df9794SNeil Fullermodule.exports = ProgressStats 84