UNPKG

2.12 kBPlain TextView Raw
1import {ProgressBar} from "../interfaces/progress-bar";
2import {injectable, inject} from 'inversify';
3import {CommandUtil} from "../interfaces/command-util";
4import kernel from "../inversify.config";
5import {ProgressTask} from "../interfaces/progress-task";
6import * as _ from 'lodash';
7import {IPostal} from "../interfaces/postal";
8
9const status = require('node-status');
10
11@injectable()
12export class ProgressBarImpl implements ProgressBar {
13 private tasks: ProgressTask[] = [];
14 private started: boolean = false;
15 private patternBase: string = '{uptime.green} {spinner.cyan}';
16 private pattern: string = '';
17
18 constructor(@inject('IPostal') private postal: IPostal) {
19 this.postal.subscribe({
20 channel: 'ProgressBar',
21 topic: 'Stop',
22 callback: () => {
23 if (this.started) {
24 status.stop();
25 }
26 }
27 });
28 }
29
30 showProgressForTask(id: string, msg: string, current: number, total: number) {
31 this.postal.publish({
32 channel: 'CommandUtil',
33 topic: 'ProgressBarStarted',
34 data: {
35 console: status.console()
36 }
37 });
38
39 let task = _.find(this.tasks, {id});
40 if (!task) {
41 if (current >= total) {
42 return;
43 }
44 task = kernel.get<ProgressTask>('ProgressTask');
45 this.tasks.push(task);
46 task.id = id;
47 task.msg = msg;
48 task.statusItem = status.addItem(id, {
49 max: total,
50 count: current
51 });
52 } else {
53 if (current >= total) {
54 status.removeItem(task.id);
55 _.remove(this.tasks, t => {
56 return task.id == t.id;
57 });
58 } else {
59 task.statusItem.count = current;
60 task.statusItem.max = total;
61 }
62 }
63 this.render();
64 }
65
66 private render() {
67 let pattern = this.patternBase;
68 this.tasks.forEach(task => {
69 pattern += ` | ${task.msg} {${task.id}.green.bar}`;
70 });
71 if (this.started) {
72 if (this.pattern == pattern) {
73 return;
74 }
75 status.setPattern(this.pattern = pattern);
76 } else {
77 this.started = true;
78 status.start({
79 pattern
80 });
81 }
82 }
83}