@geoapify/request-rate-limiter
Version:
Easily throttle API requests to prevent 429 errors and manage traffic bursts
1 lines • 1.79 kB
JavaScript
!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define("RequestRateLimiter",[],t):"object"==typeof exports?exports.RequestRateLimiter=t():e.RequestRateLimiter=t()}(this,(()=>{return e={277:e=>{function t(e,t,o){for(let r=t;r<o;r++)if(r<e.batchItemsToFire.length&&void 0===e.batchItemsToFire[r])return!1;return!0}function o(e,o,r,s,n){Promise.all(o).then((o=>{r&&r.batchSize&&r.onBatchComplete&&function(e,o,r,s,n,i){for(let t=r;t<s;t++)e.batchItemsToFire[t]=o[t-r];for(let o=0;o<e.batchItemsToFire.length;o+=n){let r=o+n;if(t(e,o,r)){const t=e.batchItemsToFire.slice(o,r),s={startIndex:o,stopIndex:Math.min(r-1,e.batchItemsToFire.length-1),results:t};for(let t=0;t<r;t++)e.batchItemsToFire[t]=void 0;i(s)}}}(e,o,s,n,r.batchSize,r.onBatchComplete),r&&r.onProgress&&function(e,t,o,r){e.completedRequests+=o-t,r({totalRequests:e.totalRequests,completedRequests:e.completedRequests})}(e,s,n,r.onProgress)}))}e.exports={rateLimitedRequests:async function(e,t,r,s){!function(e,t,o){if(e<1)throw new Error('"maxRequests" must be at least 1');if(t<=0)throw new Error('"interval" must be positive number');if(!o||0===o.length)throw new Error('"requests" must be an array of functions to execute')}(t,r,e),batchState={batchItemsToFire:new Array(e.length),totalRequests:e.length,completedRequests:0};const n=new Array(e.length),i=[];for(let a=0;a<e.length;a+=t){const u=Math.min(a+t,e.length),c=e.slice(a,u).map(((e,t)=>Promise.resolve(e()).then((e=>(n[a+t]=e,e)))));o(batchState,c,s,a,u),i.push(...c),u<e.length&&await new Promise((e=>setTimeout(e,r)))}return await Promise.all(i),n}}}},t={},function o(r){var s=t[r];if(void 0!==s)return s.exports;var n=t[r]={exports:{}};return e[r](n,n.exports,o),n.exports}(277);var e,t}));