UNPKG

@studyportals/sp-hs-misc

Version:

Miscellaneous code used in HouseStark's projects

61 lines 1.65 kB
/** * 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