import { AsyncQueue, createAsyncQueue } from 'common/AsyncQueue' import { singleton } from 'decorators/singleton' import { DocumentType } from '@typegoose/typegoose' import { ReqTaskStatus, RequestTaskClass } from 'models/RequestTask' import Web3 from 'web3' import { isSuccessfulTransaction, waitTransaction } from 'chain/TransactionConfirm' import { ChainTask } from 'models/ChainTask' import { ChainQueue } from './chain.queue' import logger from 'logger/logger' @singleton export class ConfirmQueue { private queue: AsyncQueue private web3: Web3 constructor(web3: Web3) { this.queue = createAsyncQueue() this.web3 = web3 } public addTaskToQueue(task: DocumentType) { this.queue.push(async () => { try { let receipt = await waitTransaction(this.web3, task.txHash) logger.info(`receipt confirmed: ${task.txHash}`) if (isSuccessfulTransaction(receipt)) { task.status = ReqTaskStatus.SUCCESS task.endTime = Date.now() await task.save() await ChainTask.checkStatus(task.chainTaskId) } else { task.status = ReqTaskStatus.REVERT await task.save() new ChainQueue().addTaskToQueue(task) } } catch (err) { logger.error(err) task.errMsg.push(err) await task.save() new ChainQueue().addTaskToQueue(task) } }) } }