site-activity-chain/src/queue/chain.queue.ts
2023-04-20 16:02:27 +08:00

62 lines
1.9 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 { BlockChain } from 'chain/BlockChain'
import { ChainTask } from 'models/ChainTask'
import logger from 'logger/logger'
@singleton
export class ChainQueue {
private queue: AsyncQueue
private blockChain: BlockChain
constructor() {
this.queue = createAsyncQueue()
this.blockChain = new BlockChain()
}
public async addTaskToQueue(subTask: DocumentType<RequestTaskClass>) {
if (subTask.maxTryCount && subTask.tryCount > subTask.maxTryCount) {
subTask.status = ReqTaskStatus.ERROR
await subTask.save()
await ChainTask.checkStatus(subTask.chainTaskId)
return
}
if (subTask.status === ReqTaskStatus.NOTSTART) {
subTask.blockAdd = this.blockChain.currentBlockNum
await subTask.save()
}
if (subTask.status === ReqTaskStatus.WAIT_CONFIRM) {
this.blockChain.confirmQueue.addTaskToQueue(subTask)
return
}
this.queue.push(async () => {
try {
subTask.tryCount += 1
if (subTask.status === ReqTaskStatus.NOTSTART) {
subTask.status = ReqTaskStatus.PEDING
}
if (!subTask.startTime) {
subTask.startTime = Date.now()
}
await subTask.save()
try {
await subTask.requestChain()
} catch (reqerr) {
logger.info(reqerr)
subTask.errMsg.push(JSON.stringify(reqerr))
await subTask.save()
// TODO:: 要排除数据已经提交到链上, 返回过程中的网络错误
this.addTaskToQueue(subTask)
return
}
this.blockChain.confirmQueue.addTaskToQueue(subTask)
} catch (err) {
subTask.errMsg.push(err)
await subTask.save()
}
})
}
}