@mareers/async-throttle
Version:
A TypeScript library for managing and executing asynchronous functions with constraints and logging capabilities.
2 lines (1 loc) • 2.47 kB
JavaScript
var s=class{constructor(e){this.listeners={};this.captureRejections=e.captureRejections}addListener(e,t){return this.listeners[e]||(this.listeners[e]=[]),this.listeners[e].push(t),this}emit(e,...t){if(!this.listeners[e])return!1;let i=this.listeners[e];for(let o of i)this.captureRejections?Promise.resolve(o(...t)).catch(a=>{console.error(a)}):o(...t);return!0}};var r=class{constructor(){this._size=0}get size(){return this._size}enQueue(e,t){this._size++;let i={item:e,id:t,next:void 0};this.head?(this.tail&&(this.tail.next=i),this.tail=i):(this.head=i,this.tail=i)}deQueue(){if(this._size--,this.head){let e=this.head.item,t=this.head.id;return this.head=this.head.next,{value:e,id:t}}}peek(){return this.head?.item}clear(){this._size=0,this.head=this.tail=void 0}};var u=class{constructor(e){this.options=e;this.queue=new r,this.currentQueued=0,this.destroy=!1,this.ee=new s({captureRejections:!1}),this.executeFunctions().then(()=>{this.ee.emit("log","Execution complete")}).catch(t=>{this.ee.emit("log",`Error in executeFunctions: ${t.message}`),console.error(t)})}on(e,t){this.ee.addListener(e,t)}addToQueue(e,t=new Date().getTime().toString()){this.queue.enQueue({method:()=>e.function,args:e.args},t),this.ee.emit("add")}get currentStatus(){return{queueSize:this.queue.size,currentlyQueued:this.currentQueued,maxThreshold:this.options.maxThreshold}}clearQueue(){this.queue.clear(),this.ee.emit("clear")}async delay(){await new Promise(e=>{setTimeout(()=>{e(null)},this.options.delayExecutions)})}async executeFunctions(){for(;;){if(this.destroy){this.ee.emit("log","Destroy called");break}if(this.currentQueued<this.options.maxThreshold&&this.queue.size!==0){this.ee.emit("log","Called to execute");let e=[];for(let t=0;t<this.options.maxThreshold&&this.queue.size>0;t++){this.currentQueued++;let i=this.queue.deQueue();i&&e.push(()=>this.functionExecutor(i.value,i.id))}await Promise.all(e.map(t=>t()))}else this.ee.emit("empty"),this.ee.emit("log","Nothing to do");this.ee.emit("log",`CONSTRAINED_ASYNC: Queue Size -> ${this.queue.size}`),this.ee.emit("log",`CONSTRAINED_ASYNC: CurrentQueue Size -> ${this.currentQueued}`),await this.delay()}}async functionExecutor(e,t){try{let i=await e.method()(...e.args);this.ee.emit("result",{value:i,id:t})}catch(i){this.ee.emit("log",`Error in functionExecutor: ${i.message}`),this.ee.emit("resultError",{id:t,error:i})}this.currentQueued--}stop(){this.destroy=!0,this.ee.emit("stop")}};export{u as AsyncThrottle};