mirror of
https://github.com/cerc-io/watcher-ts
synced 2025-07-02 17:55:20 +00:00
74 lines
2.1 KiB
TypeScript
74 lines
2.1 KiB
TypeScript
import debug from 'debug';
|
|
|
|
import { JOB_KIND_PRUNE, QUEUE_BLOCK_PROCESSING, JOB_KIND_INDEX } from './constants';
|
|
import { JobQueue } from './job-queue';
|
|
import { IndexerInterface } from './types';
|
|
import { wait } from './misc';
|
|
|
|
const log = debug('vulcanize:common');
|
|
|
|
/**
|
|
* Create pruning job in QUEUE_BLOCK_PROCESSING.
|
|
* @param jobQueue
|
|
* @param latestCanonicalBlockNumber
|
|
* @param priority
|
|
*/
|
|
export const createPruningJob = async (jobQueue: JobQueue, latestCanonicalBlockNumber: number, priority = 0): Promise<void> => {
|
|
const pruneBlockHeight = latestCanonicalBlockNumber + 1;
|
|
const newPriority = priority + 1;
|
|
|
|
// Create a job to prune at block height (latestCanonicalBlockNumber + 1).
|
|
return jobQueue.pushJob(
|
|
QUEUE_BLOCK_PROCESSING,
|
|
{
|
|
kind: JOB_KIND_PRUNE,
|
|
pruneBlockHeight,
|
|
priority: newPriority
|
|
},
|
|
{
|
|
priority: newPriority
|
|
}
|
|
);
|
|
};
|
|
|
|
/**
|
|
* Method to fetch block by number and push to job queue.
|
|
* @param jobQueue
|
|
* @param indexer
|
|
* @param ethClient
|
|
* @param blockNumber
|
|
*/
|
|
export const processBlockByNumber = async (
|
|
jobQueue: JobQueue,
|
|
indexer: IndexerInterface,
|
|
blockDelayInMilliSecs: number,
|
|
blockNumber: number
|
|
): Promise<void> => {
|
|
log(`Process block ${blockNumber}`);
|
|
|
|
while (true) {
|
|
const blocks = await indexer.getBlocks({ blockNumber });
|
|
|
|
if (blocks.length) {
|
|
for (let bi = 0; bi < blocks.length; bi++) {
|
|
const { blockHash, blockNumber, parentHash, timestamp } = blocks[bi];
|
|
const blockProgress = await indexer.getBlockProgress(blockHash);
|
|
|
|
if (blockProgress) {
|
|
log(`Block number ${blockNumber}, block hash ${blockHash} already processed`);
|
|
} else {
|
|
await indexer.updateSyncStatusChainHead(blockHash, blockNumber);
|
|
|
|
await jobQueue.pushJob(QUEUE_BLOCK_PROCESSING, { kind: JOB_KIND_INDEX, blockHash, blockNumber, parentHash, timestamp });
|
|
}
|
|
}
|
|
|
|
return;
|
|
}
|
|
|
|
log(`No blocks fetched for block number ${blockNumber}, retrying after ${blockDelayInMilliSecs} ms delay.`);
|
|
|
|
await wait(blockDelayInMilliSecs);
|
|
}
|
|
};
|