You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Hydro/hydro/loader.js

104 lines
2.8 KiB
JavaScript

5 years ago
/* eslint-disable import/no-dynamic-require */
/* eslint-disable no-await-in-loop */
/* eslint-disable no-eval */
const cluster = require('cluster');
const numCPUs = require('os').cpus().length;
async function terminate() {
for (const task of global.onDestory) {
// eslint-disable-next-line no-await-in-loop
await task();
}
process.exit(0);
}
4 years ago
async function entry(config) {
if (config.entry) {
// TODO newProcess
const loader = require(`./entry/${config.entry}`);
await loader(entry);
}
}
4 years ago
async function stopWorker() {
cluster.disconnect();
}
async function startWorker() {
for (let i = 0; i < numCPUs; i++) {
cluster.fork();
}
}
async function messageHandler(worker, msg) {
if (msg.event && msg.event === 'restart') {
console.log('Restarting');
await stopWorker();
console.log('Worker stopped');
await startWorker();
}
}
async function load() {
4 years ago
global.nodeModules = {
bson: require('bson'),
'js-yaml': require('js-yaml'),
mongodb: require('mongodb'),
};
global.Hydro = {
config: {},
handler: {},
service: {},
model: {},
script: {},
lib: {},
4 years ago
wiki: {},
template: {},
ui: {},
};
global.onDestory = [];
4 years ago
Error.stackTraceLimit = 50;
process.on('unhandledRejection', (e) => console.error(e));
4 years ago
process.on('SIGINT', terminate);
if (cluster.isMaster) {
console.log(`Master ${process.pid} Starting`);
process.stdin.setEncoding('utf8');
process.stdin.on('data', async (input) => {
try {
const t = eval(input.toString().trim());
if (t instanceof Promise) console.log(await t);
else console.log(t);
} catch (e) {
console.warn(e);
}
});
4 years ago
await entry({ entry: 'master' });
cluster.on('exit', (worker, code, signal) => {
console.log(`Worker ${worker.process.pid} exit: ${code} ${signal}`);
});
cluster.on('disconnect', (worker) => {
console.log(`Worker ${worker.process.pid} disconnected`);
});
cluster.on('listening', (worker, address) => {
console.log(`Worker ${worker.process.pid} listening at `, address);
});
cluster.on('online', (worker) => {
console.log(`Worker ${worker.process.pid} is online`);
});
4 years ago
cluster.on('message', messageHandler);
await startWorker();
} else {
console.log(`Worker ${process.pid} Starting`);
4 years ago
await entry({ entry: 'worker' });
console.log(`Worker ${process.pid} Started`);
}
4 years ago
if (global.gc) global.gc();
}
if (!module.parent) {
load().catch((e) => {
console.error(e);
process.exit(1);
});
}