xref: /aosp_15_r20/external/timezone-boundary-builder/util/progressStats.js (revision f0df97945b4fdddd066170b120f192941b8d7fbf)
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