chain_graphql/src/queue/confirm.queue.ts
CounterFire2023 ded16ac57b project init
2023-06-25 11:11:49 +08:00

45 lines
1.4 KiB
TypeScript

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<RequestTaskClass>) {
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)
}
})
}
}