@forzalabs/remora
Version:
A powerful CLI tool for seamless data translation.
55 lines (54 loc) • 2.24 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
class ExecutorProgress {
constructor(isEnabled) {
this._isEnabled = false;
this._FPS = 2;
this._lastRenderTime = 0;
this._lastRenderedLines = -1;
this.register = (name, producerName, fileIndex, totalFiles) => {
this.workers[name] = { progress: 0, producerName, fileIndex, totalFiles };
};
this.update = (name, value) => {
if (this.workers[name])
this.workers[name].progress = value;
const now = Date.now();
const interval = 1000 / this._FPS;
if (now - this._lastRenderTime >= interval) {
this._lastRenderTime = now;
this.render();
}
};
this.complete = () => {
for (const key of Object.keys(this.workers)) {
this.workers[key].progress = 1;
}
this.render();
};
this.render = () => {
if (!this._isEnabled)
return;
if (this._lastRenderedLines > 0) {
for (let i = 0; i < this._lastRenderedLines; i++) {
process.stdout.moveCursor(0, -1);
process.stdout.clearLine(1);
}
}
this._lastRenderedLines = 0;
for (const key of Object.keys(this.workers)) {
const worker = this.workers[key];
const percentage = Math.min(100, Math.max(0, worker.progress * 100));
const barWidth = 30;
const filledWidth = Math.floor((percentage / 100) * barWidth);
const emptyWidth = barWidth - filledWidth;
const bar = '#'.repeat(filledWidth) + '-'.repeat(emptyWidth);
const fileInfo = worker.totalFiles > 1 ? ` [${worker.fileIndex + 1}/${worker.totalFiles}]` : '';
console.log(`Worker ${key.padStart(2, '0')}: [${bar}] ${percentage.toFixed(2)}% (${worker.producerName}${fileInfo})`);
this._lastRenderedLines++;
}
};
this._isEnabled = isEnabled;
this.workers = {};
}
}
exports.default = ExecutorProgress;