tovarish-relayer/src/start.ts
2024-11-13 01:42:13 +00:00

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`);
}