diff options
Diffstat (limited to 'util')
-rw-r--r-- | util/featureWriterStream.js | 25 | ||||
-rw-r--r-- | util/progressStats.js | 83 |
2 files changed, 108 insertions, 0 deletions
diff --git a/util/featureWriterStream.js b/util/featureWriterStream.js new file mode 100644 index 0000000..7f0e7b8 --- /dev/null +++ b/util/featureWriterStream.js @@ -0,0 +1,25 @@ +const fs = require('fs') + +class FeatureWriterStream { + constructor (file) { + this.file = file + this.stream = fs.createWriteStream(file) + this.stream.write('{"type":"FeatureCollection","features":[') + this.numFeatures = 0 + } + + add (stringifiedFeature) { + if (this.numFeatures > 0) { + this.stream.write(',') + } + this.stream.write(stringifiedFeature) + this.numFeatures++ + } + + end (cb) { + console.log(`Closing out file ${this.file}`) + this.stream.end(']}', cb) + } +} + +module.exports = FeatureWriterStream diff --git a/util/progressStats.js b/util/progressStats.js new file mode 100644 index 0000000..f9794ed --- /dev/null +++ b/util/progressStats.js @@ -0,0 +1,83 @@ +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 |