Resolve #3132
This commit is contained in:
		
							parent
							
								
									6c5a78aeb2
								
							
						
					
					
						commit
						e9a3495225
					
				
					 2 changed files with 12 additions and 97 deletions
				
			
		
							
								
								
									
										24
									
								
								src/index.ts
									
										
									
									
									
								
							
							
						
						
									
										24
									
								
								src/index.ts
									
										
									
									
									
								
							| 
						 | 
				
			
			@ -17,7 +17,6 @@ import * as program from 'commander';
 | 
			
		|||
import mongo from './db/mongodb';
 | 
			
		||||
 | 
			
		||||
import Logger from './misc/logger';
 | 
			
		||||
import ProgressBar from './misc/cli/progressbar';
 | 
			
		||||
import EnvironmentInfo from './misc/environmentInfo';
 | 
			
		||||
import MachineInfo from './misc/machineInfo';
 | 
			
		||||
import serverStats from './daemons/server-stats';
 | 
			
		||||
| 
						 | 
				
			
			@ -87,10 +86,9 @@ async function masterMain() {
 | 
			
		|||
 | 
			
		||||
	if (!program.disableClustering) {
 | 
			
		||||
		await spawnWorkers(config.clusterLimit);
 | 
			
		||||
		Logger.succ('All workers started');
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	Logger.info(`Now listening on port ${config.port} on ${config.url}`);
 | 
			
		||||
	Logger.succ(`Now listening on port ${config.port} on ${config.url}`);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
| 
						 | 
				
			
			@ -168,28 +166,30 @@ function checkMongoDb(config: Config) {
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
function spawnWorkers(limit: number) {
 | 
			
		||||
	Logger.info('Starting workers...');
 | 
			
		||||
 | 
			
		||||
	return new Promise(res => {
 | 
			
		||||
		// Count the machine's CPUs
 | 
			
		||||
		const cpuCount = os.cpus().length;
 | 
			
		||||
 | 
			
		||||
		const count = limit || cpuCount;
 | 
			
		||||
 | 
			
		||||
		const progress = new ProgressBar(count, 'Starting workers');
 | 
			
		||||
		let started = 0;
 | 
			
		||||
 | 
			
		||||
		// Create a worker for each CPU
 | 
			
		||||
		for (let i = 0; i < count; i++) {
 | 
			
		||||
			const worker = cluster.fork();
 | 
			
		||||
 | 
			
		||||
			worker.on('message', message => {
 | 
			
		||||
				if (message === 'ready') {
 | 
			
		||||
					progress.increment();
 | 
			
		||||
				if (message !== 'ready') return;
 | 
			
		||||
				started++;
 | 
			
		||||
 | 
			
		||||
				// When all workers started
 | 
			
		||||
				if (started == count) {
 | 
			
		||||
					Logger.succ('All workers started');
 | 
			
		||||
					res();
 | 
			
		||||
				}
 | 
			
		||||
			});
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		// On all workers started
 | 
			
		||||
		progress.on('complete', () => {
 | 
			
		||||
			res();
 | 
			
		||||
		});
 | 
			
		||||
	});
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,85 +0,0 @@
 | 
			
		|||
import { EventEmitter } from 'events';
 | 
			
		||||
import * as readline from 'readline';
 | 
			
		||||
import chalk from 'chalk';
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Progress bar
 | 
			
		||||
 */
 | 
			
		||||
export default class extends EventEmitter {
 | 
			
		||||
	public max: number;
 | 
			
		||||
	public value: number;
 | 
			
		||||
	public text: string;
 | 
			
		||||
	private indicator: number;
 | 
			
		||||
 | 
			
		||||
	constructor(max: number, text: string = null) {
 | 
			
		||||
		super();
 | 
			
		||||
		this.max = max;
 | 
			
		||||
		this.value = 0;
 | 
			
		||||
		this.text = text;
 | 
			
		||||
		this.indicator = 0;
 | 
			
		||||
		this.draw();
 | 
			
		||||
 | 
			
		||||
		const iclock = setInterval(() => {
 | 
			
		||||
			this.indicator = (this.indicator + 1) % 4;
 | 
			
		||||
			this.draw();
 | 
			
		||||
		}, 200);
 | 
			
		||||
 | 
			
		||||
		this.on('complete', () => {
 | 
			
		||||
			clearInterval(iclock);
 | 
			
		||||
		});
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public increment(): void {
 | 
			
		||||
		this.value++;
 | 
			
		||||
		this.draw();
 | 
			
		||||
 | 
			
		||||
		// Check if it is fulfilled
 | 
			
		||||
		if (this.value === this.max) {
 | 
			
		||||
			this.indicator = null;
 | 
			
		||||
 | 
			
		||||
			cll();
 | 
			
		||||
			process.stdout.write(`${this.render()} -> ${chalk.bold('Complete')}\n`);
 | 
			
		||||
 | 
			
		||||
			this.emit('complete');
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public draw(): void {
 | 
			
		||||
		const str = this.render();
 | 
			
		||||
		cll();
 | 
			
		||||
		process.stdout.write(str);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	private render(): string {
 | 
			
		||||
		const width = 30;
 | 
			
		||||
		const t = this.text ? `${this.text} ` : '';
 | 
			
		||||
 | 
			
		||||
		const v = Math.floor((this.value / this.max) * width);
 | 
			
		||||
		const vs = new Array(v + 1).join('*');
 | 
			
		||||
 | 
			
		||||
		const p = width - v;
 | 
			
		||||
		const ps = new Array(p + 1).join(' ');
 | 
			
		||||
 | 
			
		||||
		const percentage = Math.floor((this.value / this.max) * 100);
 | 
			
		||||
		const percentages = chalk.gray(`(${percentage} %)`);
 | 
			
		||||
 | 
			
		||||
		let i: string;
 | 
			
		||||
		switch (this.indicator) {
 | 
			
		||||
			case 0: i = '-'; break;
 | 
			
		||||
			case 1: i = '\\'; break;
 | 
			
		||||
			case 2: i = '|'; break;
 | 
			
		||||
			case 3: i = '/'; break;
 | 
			
		||||
			case null: i = '+'; break;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		return `${i} ${t}[${vs}${ps}] ${this.value} / ${this.max} ${percentages}`;
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Clear current line
 | 
			
		||||
 */
 | 
			
		||||
function cll(): void {
 | 
			
		||||
	readline.clearLine(process.stdout, 0); // Clear current text
 | 
			
		||||
	readline.cursorTo(process.stdout, 0, null); // Move cursor to the head of line
 | 
			
		||||
}
 | 
			
		||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue