bitcore-node
Version:
A blockchain indexing node with extended capabilities using bitcore
76 lines (63 loc) • 1.9 kB
text/typescript
import cluster from 'cluster';
import 'source-map-support/register';
import logger from '../logger';
import { Modules } from '../modules';
import { Config } from '../services/config';
import { Event } from '../services/event';
import { P2P } from '../services/p2p';
import { Storage } from '../services/storage';
import '../utils/polyfills';
const services: Array<any> = [];
export const P2pWorker = async () => {
process.on('unhandledRejection', (error: any) => {
console.error('Unhandled Rejection at:', error.stack || error);
stop();
});
process.on('SIGTERM', stop);
process.on('SIGINT', stop);
services.push(Storage, Event);
const { CHAIN: chain, NETWORK: network } = process.env;
Modules.loadConfigured({ chain, network }); // loads all if no chain and network specified
// start a particular chain and network, or all of them
if (chain && network) {
const chainConfig = Config.chainConfig({ chain, network });
const p2pClass = P2P.get(chain, network);
const worker = new p2pClass({
chain,
network,
chainConfig
});
services.push(worker);
} else {
services.push(P2P);
}
for (const service of services) {
try {
await service.start();
} catch (e: any) {
logger.error('P2P Worker died: %o', e.stack || e.message || e);
}
}
};
let stopping = false;
const stop = async () => {
if (stopping) {
logger.warn('Force stopping P2P Worker');
process.exit(1);
}
stopping = true;
setTimeout(() => {
logger.warn('P2P Worker did not shut down gracefully after 30 seconds, exiting');
process.exit(1);
}, 30 * 1000).unref();
logger.info(`Shutting down P2P pid ${process.pid}`);
for (const service of services.reverse()) {
await service.stop();
}
if (!cluster.isPrimary) {
process.removeAllListeners();
}
};
if (require.main === module) {
P2pWorker();
}