lotus / inc /schedulePool.ts
k-l-lambda's picture
commit lotus dist.
d605f27
raw
history blame
946 Bytes
interface Timer {
now (): number;
};
type TaskFunctor = () => void;
export default class SchedulePool {
timer: Timer;
tasks: {[key: number]: Promise<void>} = {};
handlers: {[key: number]: number | NodeJS.Timeout} = {};
constructor (timer = Date) {
this.timer = timer;
}
clear () {
Object.values(this.handlers).forEach(handle => clearTimeout(handle as NodeJS.Timeout));
this.tasks = {};
this.handlers = {};
}
getTask (timestamp: number): Promise<void> {
const delay = Math.max(timestamp - this.timer.now(), 0);
if (!this.tasks[timestamp]) {
this.tasks[timestamp] = new Promise(resolve => {
this.handlers[timestamp] = setTimeout(resolve, delay);
}).then(() => {
delete this.tasks[timestamp];
delete this.handlers[timestamp];
});
}
return this.tasks[timestamp];
}
appendTask (timestamp: number, task: TaskFunctor) {
this.tasks[timestamp] = this.getTask(timestamp).then(task);
}
};