progress.js 910 B

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. module.exports = function (progress) {
  2. function bar (r) {
  3. var s = '\r', M = 50
  4. for(var i = 0; i < M; i++)
  5. s += i < M*r ? '*' : '.'
  6. return s
  7. }
  8. function round (n, p) {
  9. return Math.round(n * p) / p
  10. }
  11. function percent (n) {
  12. return (round(n, 1000)*100).toString().substring(0, 4)+'%'
  13. }
  14. function rate (prog) {
  15. if(prog.target == prog.current) return 1
  16. return (prog.current - prog.start) / (prog.target - prog.start)
  17. }
  18. var prog = -1
  19. var int = setInterval(function () {
  20. var p = progress()
  21. var r = 1, c = 0
  22. var tasks = []
  23. for(var k in p) {
  24. var _r = rate(p[k])
  25. if(_r < 1)
  26. tasks.push(k+':'+percent(_r))
  27. r = Math.min(_r, r)
  28. c++
  29. }
  30. if(r != prog) {
  31. prog = r
  32. var msg = tasks.join(', ')
  33. process.stdout.write('\r'+bar(prog) + ' ('+msg+')\x1b[K\r')
  34. }
  35. }, 333)
  36. int.unref && int.unref()
  37. }