wildduck/server.js

145 lines
4 KiB
JavaScript
Raw Normal View History

/* eslint global-require:0 */
2017-03-06 05:45:50 +08:00
'use strict';
2017-05-24 01:05:16 +08:00
process.env.UV_THREADPOOL_SIZE = 16;
2017-05-24 00:11:42 +08:00
2017-07-16 19:37:33 +08:00
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();
}
2017-08-29 15:36:45 +08:00
const errors = require('./lib/errors');
2017-07-12 02:38:23 +08:00
const fs = require('fs');
2021-11-12 16:29:17 +08:00
const os = require('os');
2017-06-03 14:51:58 +08:00
const log = require('npmlog');
const packageData = require('./package.json');
2023-01-09 17:57:15 +08:00
const { init: initElasticSearch } = require('./lib/elasticsearch');
2017-03-06 05:45:50 +08:00
log.level = config.log.level;
2017-06-03 14:51:58 +08:00
const printLogo = () => {
2017-08-31 19:44:05 +08:00
let logo = fs
.readFileSync(__dirname + '/logo.txt', 'utf-8')
.replace(/^\n+|\n+$/g, '')
.split('\n');
2017-07-12 02:38:23 +08:00
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));
2017-04-02 00:22:47 +08:00
log.info('App', '');
2017-07-12 02:38:23 +08:00
logo.forEach(line => {
log.info('App', ' ' + line);
});
2017-04-02 00:22:47 +08:00
log.info('App', '');
2017-07-12 02:38:23 +08:00
log.info('App', ' ' + versionPrefix + versionString + versionSuffix);
2017-04-02 00:22:47 +08:00
log.info('App', '');
};
2017-03-06 05:45:50 +08:00
2021-11-12 16:29:17 +08:00
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;
2017-03-06 05:45:50 +08:00
}
// single process mode, do not fork anything
2023-01-09 17:57:15 +08:00
initElasticSearch()
2023-01-19 16:46:12 +08:00
.then(started => {
if (started) {
log.verbose('App', `ElasticSearch setup checked`);
}
2023-01-12 17:43:01 +08:00
})
2023-01-09 17:57:15 +08:00
.catch(err => {
log.error('App', `ElasticSearch setup failed: ${err.message}${err.meta?.statusCode ? ` (${err.meta?.statusCode})` : ''}`);
})
.finally(() => {
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.
2023-01-09 17:57:15 +08:00
initElasticSearch()
2023-01-19 16:46:12 +08:00
.then(started => {
if (started) {
log.verbose('App', `ElasticSearch setup checked`);
}
2023-01-12 17:43:01 +08:00
})
2023-01-09 17:57:15 +08:00
.catch(err => {
log.error('App', `ElasticSearch setup failed: ${err.message}${err.meta?.statusCode ? ` (${err.meta?.statusCode})` : ''}`);
})
.finally(() => {
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);
2017-03-06 05:45:50 +08:00
});
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');
}
}
2017-08-29 15:36:45 +08:00
process.on('unhandledRejection', err => {
log.error('App', 'Unhandled rejection: %s' + ((err && err.stack) || err));
errors.notify(err);
});