class ProgressStats { constructor (trackerName, totalTasks) { this.trackerName = trackerName this.totalTasks = totalTasks this.taskCounter = 0 } logNext () { this.taskCounter++ if (!this.beginTime) { this.beginTime = new Date() } } /** * Begin a new task. Print the current progress and then increment the number of tasks. * @param {string} A short message about the current task progress * @param {[boolean]} logTimeLeft whether or not to log the time left. */ beginTask (message, logTimeLeft) { this.printStats(message, logTimeLeft) this.logNext() } /** * Print the current progress. * @param {string} A short message about the current task progress * @param {[boolean]} logTimeLeft whether or not to log the time left. */ printStats (message, logTimeLeft) { message = `${message}; ${this.trackerName} progress: ${this.getPercentage()}% done` if (logTimeLeft) { message = `${message} - ${this.getTimeLeft()} left` } console.log(message) } /** * calculates the percentage of finished downloads * @returns {string} */ getPercentage () { var current = (this.taskCounter / this.totalTasks) return Math.round(current * 1000.0) / 10.0 } /** * calculates the time left and outputs it in human readable format * calculation is based on the average time per task so far * * @returns {string} */ getTimeLeft () { if (this.taskCounter === 0) return '?' const averageTimePerTask = (Date.now() - this.beginTime.getTime()) / this.taskCounter var tasksLeft = this.totalTasks - this.taskCounter var millisecondsLeft = averageTimePerTask * tasksLeft return this.formatMilliseconds(millisecondsLeft) } /** * inspired from https://stackoverflow.com/questions/19700283/how-to-convert-time-milliseconds-to-hours-min-sec-format-in-javascript * @param millisec * @returns {string} */ formatMilliseconds (millisec) { var seconds = (millisec / 1000).toFixed(1) var minutes = (millisec / (1000 * 60)).toFixed(1) var hours = (millisec / (1000 * 60 * 60)).toFixed(1) var days = (millisec / (1000 * 60 * 60 * 24)).toFixed(1) if (seconds < 60) { return seconds + ' seconds' } else if (minutes < 60) { return minutes + ' minutes' } else if (hours < 24) { return hours + ' hours' } else { return days + ' days' } } } module.exports = ProgressStats