@studyportals/sp-hs-misc
Version:
Miscellaneous code used in HouseStark's projects
61 lines • 1.65 kB
JavaScript
/**
* Offers the necessary functionality to throttle
* highly concurent operations.
*/
class Throttler {
get concurrencyLimit() {
return this._concurrencyLimit;
}
get concurrencyCounter() {
return this._concurrencyCounter;
}
get tasksQueue() {
return this._tasksQueue;
}
constructor(concurrencyLimit = 6) {
this._tasksQueue = [];
this._concurrencyCounter = 0;
this._concurrencyLimit = concurrencyLimit;
}
enqueueTask(task) {
this.tasksQueue.unshift(task);
this.handleTaskEnqueued();
}
handleTaskEnqueued() {
this.executeNextTaskIfPossible();
}
executeNextTaskIfPossible() {
if (this.concurrencyLimitNotReached()) {
this.executeNextTask();
}
}
executeNextTask() {
if (this.tasksQueueNotEmpty()) {
this.incrementConcurrencyCounter();
const task = this.dequeueTask();
task.observe(() => this.handleTaskFinished());
task.execute();
}
}
tasksQueueNotEmpty() {
return 0 !== this.tasksQueue.length;
}
dequeueTask() {
return this.tasksQueue.pop();
}
handleTaskFinished() {
this.decrementConcurrencyCounter();
this.executeNextTaskIfPossible();
}
incrementConcurrencyCounter() {
++this._concurrencyCounter;
}
decrementConcurrencyCounter() {
--this._concurrencyCounter;
}
concurrencyLimitNotReached() {
return this.concurrencyCounter < this.concurrencyLimit;
}
}
export { Throttler };
//# sourceMappingURL=throttler.class.js.map