45 lines
1.4 KiB
TypeScript
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)
|
|
}
|
|
})
|
|
}
|
|
}
|