bitcore-node
Version:
A blockchain indexing node with extended capabilities using bitcore
84 lines (73 loc) • 2.64 kB
text/typescript
import logger from '../logger';
import { ChainStateProvider } from '../providers/chain-state';
import { Libs } from '../providers/libs';
import { Api } from '../services/api';
import { Config } from '../services/config';
import { Event } from '../services/event';
import { P2P } from '../services/p2p';
import { Storage } from '../services/storage';
import { Verification } from '../services/verification';
import { ChainNetwork } from '../types/ChainNetwork';
export interface IService {
start(): Promise<void>;
stop(): Promise<void>;
}
export class BaseModule implements IService {
internalServices = new Array<IService>();
constructor(
protected bitcoreServices: {
P2P: typeof P2P;
Storage: typeof Storage;
Event: typeof Event;
Api: typeof Api;
Config: typeof Config;
CSP: typeof ChainStateProvider;
Libs: typeof Libs;
Verification: typeof Verification;
} = { P2P, Storage, Event, Api, Config, CSP: ChainStateProvider, Libs, Verification }
) {}
async start() {
for (const service of this.internalServices) {
await service.start();
}
}
async stop() {
for (const service of this.internalServices.reverse()) {
await service.stop();
}
}
}
class ModuleManager extends BaseModule {
internalServices = new Array<IService>();
// Chain names -> module paths map
DEFAULT_MODULE_PATHS = {
BTC: './bitcoin',
ETH: './ethereum',
MATIC: './matic',
BCH: './bitcoin-cash',
DOGE: './dogecoin',
LTC: './litecoin',
XRP: './ripple'
};
loadConfigured(params: Partial<ChainNetwork> = {}) {
const chains = params.chain ? [params.chain] : Config.chains();
// Auto register known modules from config.chains
for (const chain of chains) {
let modulePath = this.DEFAULT_MODULE_PATHS[chain];
// Register for each
const networks = params.network ? [params.network] : Config.networksFor(chain);
for (const network of networks) {
const config = Config.chainConfig({ chain, network });
modulePath = config.module || modulePath; // custom module path
if (!modulePath) {
logger.warn(`Module not found for ${chain}:${network}. Did you forget to specify 'module' in the config?`);
continue;
}
logger.info(`Registering module for ${chain}:${network}: ${modulePath}`);
const ModuleClass: Class<BaseModule> = require(modulePath).default || require(modulePath);
this.internalServices.push(new ModuleClass(this.bitcoreServices, chain, network, config));
}
}
}
}
export const Modules = new ModuleManager();