@henrygd/queue
Version:
Tiny async queue with concurrency control. Like p-limit or fastq, but smaller and faster.
2 lines (1 loc) • 685 B
JavaScript
let m=Promise,y=(v,p,a)=>{let o=0,t=0,r,s,T,l,k,f=!1,n=[],L=()=>{o--,--t?d():l=T?.()},d=()=>{if(f||!r||o>=v)return;if(p!==void 0&&a!==void 0){let e=Date.now();if(n=n.filter(u=>e-u<a),n.length>=p){f=!0;let u=n[0],P=a-(e-u);setTimeout(()=>{f=!1,d()},P);return}n.push(e)}o++;let i=r;r=r.e,i.p().then(e=>(i.r(e),L()),e=>(i.i(e),L())),r&&o<v&&d()};return k={add(i){let e={p:i},u=new m((P,c)=>{e.r=P,e.i=c});return r?s=s.e=e:s=r=e,t++,d(),u},done:()=>t?l||(l=new m(i=>T=i)):m.resolve(),clear(){for(let i=r;i;i=i.e)i.i(new Error("Queue cleared"));r=s=null,t=o,n=[],!t&&l&&(l=T?.())},active:()=>o,size:()=>t,all:i=>m.all(i.map(e=>k.add(typeof e=="function"?e:()=>e)))}};export{y as newQueue};