126 lines
3.2 KiB
TypeScript
126 lines
3.2 KiB
TypeScript
import process from 'process';
|
|
import cluster from 'cluster';
|
|
import type { Logger } from 'winston';
|
|
|
|
import { getRelayerConfig, RelayerConfig } from './config';
|
|
import { getLogger, SyncManager, Router, RelayerWorker, checkProviders } from './services';
|
|
|
|
if (cluster.isWorker) {
|
|
new Router(JSON.parse(process.env.relayerConfig as string) as RelayerConfig, Number(process.env.forkId));
|
|
} else {
|
|
start();
|
|
}
|
|
|
|
async function forkRouter({
|
|
relayerConfig,
|
|
logger,
|
|
syncManager,
|
|
relayerWorker,
|
|
forkId,
|
|
}: {
|
|
relayerConfig: RelayerConfig;
|
|
logger: Logger;
|
|
syncManager: SyncManager;
|
|
relayerWorker: RelayerWorker;
|
|
forkId: number;
|
|
}) {
|
|
const worker = cluster.fork({
|
|
relayerConfig: JSON.stringify(relayerConfig),
|
|
forkId,
|
|
});
|
|
|
|
worker
|
|
.on('exit', (code) => {
|
|
logger.error(`Router Worker ${forkId} died with code ${code}, respawning...`);
|
|
|
|
setTimeout(() => {
|
|
forkRouter({
|
|
relayerConfig,
|
|
logger,
|
|
syncManager,
|
|
relayerWorker,
|
|
forkId,
|
|
});
|
|
}, 5000);
|
|
})
|
|
.on('message', async (msg) => {
|
|
const { msgId, type } = msg;
|
|
|
|
if (type === 'status') {
|
|
worker.send({
|
|
msgId,
|
|
syncManagerStatus: syncManager.getStatus(),
|
|
pendingWorks: relayerWorker.pendingWorks(),
|
|
});
|
|
return;
|
|
}
|
|
|
|
if (type === 'job') {
|
|
const work = relayerWorker.getWork({
|
|
id: msg.id,
|
|
});
|
|
|
|
worker.send({
|
|
msgId,
|
|
...work,
|
|
});
|
|
return;
|
|
}
|
|
|
|
if (type === 'tornadoWithdraw') {
|
|
const newWork = await relayerWorker.createWork({
|
|
netId: msg.netId,
|
|
contract: msg.contract,
|
|
proof: msg.proof,
|
|
args: msg.args,
|
|
});
|
|
|
|
worker.send({
|
|
msgId,
|
|
...newWork,
|
|
});
|
|
return;
|
|
}
|
|
|
|
if (type === 'errors') {
|
|
worker.send({
|
|
msgId,
|
|
errors: [...syncManager.errors, ...relayerWorker.errors],
|
|
});
|
|
return;
|
|
}
|
|
});
|
|
}
|
|
|
|
async function start() {
|
|
const relayerConfig = getRelayerConfig();
|
|
const logger = getLogger('[Main]', relayerConfig.logLevel);
|
|
|
|
console.log('Relayer config', relayerConfig);
|
|
|
|
await checkProviders(relayerConfig, logger);
|
|
|
|
const syncManager = new SyncManager(relayerConfig);
|
|
|
|
await syncManager.syncEvents();
|
|
|
|
const relayerWorker = new RelayerWorker(relayerConfig, syncManager);
|
|
|
|
setInterval(() => syncManager.syncEvents(), relayerConfig.syncInterval * 1000);
|
|
|
|
// Spawn website
|
|
let i = 0;
|
|
while (i < relayerConfig.workers) {
|
|
forkRouter({
|
|
relayerConfig,
|
|
logger,
|
|
syncManager,
|
|
relayerWorker,
|
|
forkId: i,
|
|
});
|
|
i++;
|
|
}
|
|
|
|
logger.info(`Spawned ${i} Router Workers`);
|
|
}
|