@ixily/activ
Version:
Alpha Capture Trade Idea Verification. Blockchain ownership proven trade ideas and strategies.
44 lines (37 loc) • 1 kB
text/typescript
import { rest } from '../../'
type Task<T> = () => Promise<T>
const state = {
taskChunks: new Map<string, number>(),
runningPool: new Map<string, number>(),
}
const defineTaskChunks = (taskId: string, taskChunks: number) => {
state.taskChunks.set(taskId, taskChunks)
state.runningPool.set(taskId, 0)
}
const run = async <T>(taskId: string, task: Task<T>): Promise<T> => {
const taskChunks = state.taskChunks.get(taskId)
if (!taskChunks) {
throw new Error(`Task chunks not defined for task ${taskId}`)
}
if (state.runningPool.get(taskId)! >= taskChunks) {
while (state.runningPool.get(taskId)! >= taskChunks) {
await rest(10)
}
return run(taskId, task)
} else {
let result
state.runningPool.set(taskId, state.runningPool.get(taskId)! + 1)
try {
result = await task()
} catch (err) {
throw err
} finally {
state.runningPool.set(taskId, state.runningPool.get(taskId)! - 1)
}
return result
}
}
export const ParallelChunksModule = {
defineTaskChunks,
run,
}