UNPKG

1.96 kBJavaScriptView Raw
1// Cluster service
2'use strict';
3
4const cluster = require('cluster');
5const chalk = require('chalk');
6const winston = require('winston');
7
8// Worker process
9function createWorker(){
10
11 // Init modules
12 require('./moduleComposer').loadModules();
13
14 // Init HTTP server
15 require('./express');
16
17 // Project Ready Message
18 printOnce(()=>{
19 winston.info('-'.repeat(70));
20 winston.info(chalk.blue('Server Ready'));
21 winston.info('='.repeat(70));
22 });
23}
24
25// Init cluster
26function init(){
27
28 // Code to run if we're in the master process
29 if (cluster.isMaster) {
30
31 // Intro message
32 winston.info('='.repeat(70));
33 winston.info('Just', chalk.green('Make It Once'),'|',chalk.blue('MakeItOnce.net'));
34 winston.info('-'.repeat(70));
35 winston.info('Starting',global.name,'v'+global.version,'app server...');
36
37 // Count the machine's CPUs
38 var cpuCount = require('os').cpus().length;
39 winston.info('Detected '+chalk.green(cpuCount)+' cores');
40
41 if(config.useCluster){
42 // Create a worker for each CPU
43 for (var i = 0; i < cpuCount; i += 1) {
44 cluster.fork();
45 }
46
47 // Listen for dying workers
48 cluster.on('exit', function (worker) {
49 // Replace the dead worker, we're not sentimental
50 winston.error('Worker ' + worker.id + ' died :( Restarting...');
51 cluster.fork();
52
53 });
54 }else{
55 // Run in single core mode
56 createWorker();
57 }
58
59 // Code to run if we're in a worker process
60 }else{
61 // Start worker for each core
62 createWorker();
63 }
64}
65
66// Guard for printing message only once
67function printOnce(callback){
68 if(workerId()==1 && callback){
69 callback();
70 }
71}
72
73// Return Worker Id
74function workerId(){
75 if(cluster.isMaster){
76 return 1;
77 }else if(cluster.worker && cluster.worker.id){
78 return cluster.worker.id;
79 }
80 return -1;
81}
82
83module.exports = {
84 init: init,
85 printOnce: printOnce,
86 workerId: workerId,
87 createWorker: createWorker
88};