UNPKG

@forzalabs/remora

Version:

A powerful CLI tool for seamless data translation.

55 lines (54 loc) 2.24 kB
"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;