mirror of
https://github.com/nodemailer/wildduck.git
synced 2024-12-29 11:46:30 +08:00
120 lines
3.1 KiB
JavaScript
120 lines
3.1 KiB
JavaScript
/* eslint global-require:0 */
|
|
|
|
'use strict';
|
|
|
|
process.env.UV_THREADPOOL_SIZE = 16;
|
|
|
|
const config = require('wild-config');
|
|
|
|
if (process.env.NODE_CONFIG_ONLY === 'true') {
|
|
console.log(require('util').inspect(config, false, 22)); // eslint-disable-line
|
|
return process.exit();
|
|
}
|
|
|
|
const errors = require('./lib/errors');
|
|
const fs = require('fs');
|
|
const os = require('os');
|
|
const log = require('npmlog');
|
|
const packageData = require('./package.json');
|
|
|
|
log.level = config.log.level;
|
|
|
|
const printLogo = () => {
|
|
let logo = fs
|
|
.readFileSync(__dirname + '/logo.txt', 'utf-8')
|
|
.replace(/^\n+|\n+$/g, '')
|
|
.split('\n');
|
|
|
|
let columnLength = logo.map(l => l.length).reduce((max, val) => (val > max ? val : max), 0);
|
|
let versionString = ' ' + packageData.name + '@' + packageData.version + ' ';
|
|
let versionPrefix = '-'.repeat(Math.round(columnLength / 2 - versionString.length / 2));
|
|
let versionSuffix = '-'.repeat(columnLength - versionPrefix.length - versionString.length);
|
|
|
|
log.info('App', ' ' + '-'.repeat(columnLength));
|
|
log.info('App', '');
|
|
|
|
logo.forEach(line => {
|
|
log.info('App', ' ' + line);
|
|
});
|
|
|
|
log.info('App', '');
|
|
|
|
log.info('App', ' ' + versionPrefix + versionString + versionSuffix);
|
|
log.info('App', '');
|
|
};
|
|
|
|
let processCount = config.processes;
|
|
if (processCount) {
|
|
if (/^\s*cpus\s*$/i.test(processCount)) {
|
|
processCount = os.cpus().length;
|
|
}
|
|
|
|
if (typeof processCount !== 'number' && !isNaN(processCount)) {
|
|
processCount = Number(processCount);
|
|
}
|
|
|
|
if (isNaN(processCount)) {
|
|
processCount = 1;
|
|
}
|
|
}
|
|
|
|
if (!processCount || processCount <= 1) {
|
|
printLogo();
|
|
if (config.ident) {
|
|
process.title = config.ident;
|
|
}
|
|
// single process mode, do not fork anything
|
|
require('./worker.js');
|
|
} else {
|
|
let cluster = require('cluster');
|
|
|
|
if (cluster.isMaster) {
|
|
printLogo();
|
|
|
|
if (config.ident) {
|
|
process.title = config.ident + ' master';
|
|
}
|
|
|
|
log.info('App', `Master [${process.pid}] is running`);
|
|
|
|
let workers = new Set();
|
|
|
|
let forkWorker = () => {
|
|
let worker = cluster.fork();
|
|
workers.add(worker);
|
|
log.info('App', `Forked worker ${worker.process.pid}`);
|
|
};
|
|
|
|
// Fork workers.
|
|
for (let i = 0; i < processCount; i++) {
|
|
forkWorker();
|
|
}
|
|
|
|
cluster.on('exit', worker => {
|
|
log.info('App', `Worker ${worker.process.pid} died`);
|
|
workers.delete(worker);
|
|
setTimeout(forkWorker, 1000);
|
|
});
|
|
|
|
config.on('reload', () => {
|
|
workers.forEach(child => {
|
|
try {
|
|
child.kill('SIGHUP');
|
|
} catch (E) {
|
|
//ignore
|
|
}
|
|
});
|
|
});
|
|
} else {
|
|
if (config.ident) {
|
|
process.title = config.ident + ' worker';
|
|
}
|
|
|
|
require('./worker.js');
|
|
}
|
|
}
|
|
|
|
process.on('unhandledRejection', err => {
|
|
log.error('App', 'Unhandled rejection: %s' + ((err && err.stack) || err));
|
|
errors.notify(err);
|
|
});
|