@discordeno/rest 19.0.0-next.3ebcce8 → 19.0.0-next.40c19da

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -1,2 +1,7 @@
1
- export*from"./typings/routes.js";export*from"./invalidBucket.js";export*from"./manager.js";export*from"./queue.js";export*from"./types.js";
2
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL3R5cGluZ3Mvcm91dGVzLmpzJ1xuXG5leHBvcnQgKiBmcm9tICcuL2ludmFsaWRCdWNrZXQuanMnXG5leHBvcnQgKiBmcm9tICcuL21hbmFnZXIuanMnXG5leHBvcnQgKiBmcm9tICcuL3F1ZXVlLmpzJ1xuZXhwb3J0ICogZnJvbSAnLi90eXBlcy5qcydcbiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxXQUFjLHFCQUFxQixBQUVuQyxZQUFjLG9CQUFvQixBQUNsQyxZQUFjLGNBQWMsQUFDNUIsWUFBYyxZQUFZLEFBQzFCLFlBQWMsWUFBWSJ9
1
+ export * from './typings/routes.js';
2
+ export * from './invalidBucket.js';
3
+ export * from './manager.js';
4
+ export * from './queue.js';
5
+ export * from './types.js';
6
+
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["export * from './typings/routes.js'\n\nexport * from './invalidBucket.js'\nexport * from './manager.js'\nexport * from './queue.js'\nexport * from './types.js'\n"],"names":[],"mappings":"AAAA,cAAc,sBAAqB;AAEnC,cAAc,qBAAoB;AAClC,cAAc,eAAc;AAC5B,cAAc,aAAY;AAC1B,cAAc,aAAY"}
@@ -1,2 +1,84 @@
1
- import{delay as e,logger as t}from"@discordeno/utils";export function createInvalidRequestBucket(i){let r={current:i.current??0,max:i.max??1e4,interval:i.interval??6e5,timeoutId:i.timeoutId,safety:i.safety??1,errorStatuses:i.errorStatuses??[401,403,429],requested:i.requested??0,processing:!1,waiting:[],requestsAllowed:function(){return r.max-r.current-r.requested-r.safety},isRequestAllowed:function(){return r.requestsAllowed()>0},waitUntilRequestAvailable:async function(){return await new Promise(async e=>{r.isRequestAllowed()?(r.requested++,e()):(r.waiting.push(e),await r.processWaiting())})},processWaiting:async function(){if(!r.processing){for(r.processing=!0;r.waiting.length>0;)t.info(`[InvalidBucket] processing waiting queue while loop ran with ${r.waiting.length} remaining.`),r.isRequestAllowed()?(r.requested++,r.waiting.shift()?.()):await e(1e3);r.processing=!1}},handleCompletedRequest:function(e,t){r.requested--,r.errorStatuses.includes(e)&&(429===e&&t||(r.current++,void 0===r.timeoutId&&(r.timeoutId=setTimeout(()=>{r.current=0,r.timeoutId=void 0},r.interval))))}};return r}
2
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9pbnZhbGlkQnVja2V0LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGRlbGF5LCBsb2dnZXIgfSBmcm9tICdAZGlzY29yZGVuby91dGlscydcblxuLyoqXG4gKiBBIGludmFsaWQgcmVxdWVzdCBidWNrZXQgaXMgdXNlZCBpbiBhIHNpbWlsYXIgbWFubmVyIGFzIGEgbGVha3kgYnVja2V0IGJ1dCBhIGludmFsaWQgcmVxdWVzdCBidWNrZXQgY2FuIGJlIHJlZmlsbGVkIGFzIG5lZWRlZC5cbiAqIEl0J3MgcHVycG9zZSBpcyB0byBtYWtlIHN1cmUgdGhlIGJvdCBkb2VzIG5vdCBoaXQgdGhlIGxpbWl0IHRvIGdldHRpbmcgYSAxIGhyIGJhbi5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyBUaGUgb3B0aW9ucyB1c2VkIHRvIGNvbmZpZ3VyZSB0aGlzIGJ1Y2tldC5cbiAqIEByZXR1cm5zIFJlZmlsbGluZ0J1Y2tldFxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlSW52YWxpZFJlcXVlc3RCdWNrZXQob3B0aW9uczogSW52YWxpZFJlcXVlc3RCdWNrZXRPcHRpb25zKTogSW52YWxpZFJlcXVlc3RCdWNrZXQge1xuICBjb25zdCBidWNrZXQ6IEludmFsaWRSZXF1ZXN0QnVja2V0ID0ge1xuICAgIGN1cnJlbnQ6IG9wdGlvbnMuY3VycmVudCA/PyAwLFxuICAgIG1heDogb3B0aW9ucy5tYXggPz8gMTAwMDAsXG4gICAgaW50ZXJ2YWw6IG9wdGlvbnMuaW50ZXJ2YWwgPz8gNjAwMDAwLFxuICAgIHRpbWVvdXRJZDogb3B0aW9ucy50aW1lb3V0SWQsXG4gICAgc2FmZXR5OiBvcHRpb25zLnNhZmV0eSA/PyAxLFxuICAgIGVycm9yU3RhdHVzZXM6IG9wdGlvbnMuZXJyb3JTdGF0dXNlcyA/PyBbNDAxLCA0MDMsIDQyOV0sXG4gICAgcmVxdWVzdGVkOiBvcHRpb25zLnJlcXVlc3RlZCA/PyAwLFxuICAgIHByb2Nlc3Npbmc6IGZhbHNlLFxuXG4gICAgd2FpdGluZzogW10sXG5cbiAgICByZXF1ZXN0c0FsbG93ZWQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBidWNrZXQubWF4IC0gYnVja2V0LmN1cnJlbnQgLSBidWNrZXQucmVxdWVzdGVkIC0gYnVja2V0LnNhZmV0eVxuICAgIH0sXG5cbiAgICBpc1JlcXVlc3RBbGxvd2VkOiBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gYnVja2V0LnJlcXVlc3RzQWxsb3dlZCgpID4gMFxuICAgIH0sXG5cbiAgICB3YWl0VW50aWxSZXF1ZXN0QXZhaWxhYmxlOiBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tYXN5bmMtcHJvbWlzZS1leGVjdXRvclxuICAgICAgcmV0dXJuIGF3YWl0IG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlKSA9PiB7XG4gICAgICAgIC8vIElmIHdoYXRldmVyIGFtb3VudCBvZiByZXF1ZXN0cyBpcyBsZWZ0IGlzIG1vcmUgdGhhbiB0aGUgc2FmZXR5IG1hcmdpbiwgYWxsb3cgdGhlIHJlcXVlc3RcbiAgICAgICAgaWYgKGJ1Y2tldC5pc1JlcXVlc3RBbGxvd2VkKCkpIHtcbiAgICAgICAgICBidWNrZXQucmVxdWVzdGVkKytcbiAgICAgICAgICByZXNvbHZlKClcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBidWNrZXQud2FpdGluZy5wdXNoKHJlc29sdmUpXG4gICAgICAgICAgYXdhaXQgYnVja2V0LnByb2Nlc3NXYWl0aW5nKClcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgcHJvY2Vzc1dhaXRpbmc6IGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIC8vIElmIGFscmVhZHkgcHJvY2Vzc2luZywgdGhhdCBsb29wIHdpbGwgaGFuZGxlIGFsbCB3YWl0aW5nIHJlcXVlc3RzLlxuICAgICAgaWYgKGJ1Y2tldC5wcm9jZXNzaW5nKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICAvLyBNYXJrIGFzIHByb2Nlc3Npbmcgc28gb3RoZXIgbG9vcHMgZG9uJ3Qgc3RhcnRcbiAgICAgIGJ1Y2tldC5wcm9jZXNzaW5nID0gdHJ1ZVxuXG4gICAgICB3aGlsZSAoYnVja2V0LndhaXRpbmcubGVuZ3RoID4gMCkge1xuICAgICAgICBsb2dnZXIuaW5mbyhgW0ludmFsaWRCdWNrZXRdIHByb2Nlc3Npbmcgd2FpdGluZyBxdWV1ZSB3aGlsZSBsb29wIHJhbiB3aXRoICR7YnVja2V0LndhaXRpbmcubGVuZ3RofSByZW1haW5pbmcuYClcbiAgICAgICAgaWYgKGJ1Y2tldC5pc1JlcXVlc3RBbGxvd2VkKCkpIHtcbiAgICAgICAgICBidWNrZXQucmVxdWVzdGVkKytcbiAgICAgICAgICAvLyBSZXNvbHZlIHRoZSBuZXh0IGl0ZW0gaW4gdGhlIHF1ZXVlXG4gICAgICAgICAgYnVja2V0LndhaXRpbmcuc2hpZnQoKT8uKClcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBhd2FpdCBkZWxheSgxMDAwKVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIE1hcmsgYXMgZmFsc2Ugc28gbmV4dCBwZW5kaW5nIHJlcXVlc3QgY2FuIGJlIHRyaWdnZXJlZCBieSBuZXcgbG9vcC5cbiAgICAgIGJ1Y2tldC5wcm9jZXNzaW5nID0gZmFsc2VcbiAgICB9LFxuXG4gICAgaGFuZGxlQ29tcGxldGVkUmVxdWVzdDogZnVuY3Rpb24gKGNvZGUsIHNoYXJlZFNjb3BlKSB7XG4gICAgICAvLyBTaW5jZSByZXF1ZXN0IGlzIGNvbXBsZXRlLCB3ZSBjYW4gcmVtb3ZlIG9uZSBmcm9tIHJlcXVlc3RlZC5cbiAgICAgIGJ1Y2tldC5yZXF1ZXN0ZWQtLVxuICAgICAgLy8gU2luY2UgaXQgaXMgYXMgYSB2YWxpZCByZXF1ZXN0LCB3ZSBkb24ndCBuZWVkIHRvIGRvIGFueXRoaW5nXG4gICAgICBpZiAoIWJ1Y2tldC5lcnJvclN0YXR1c2VzLmluY2x1ZGVzKGNvZGUpKSByZXR1cm5cbiAgICAgIC8vIFNoYXJlZCBzY29wZSBpcyBub3QgY29uc2lkZXJlZCBpbnZhbGlkXG4gICAgICBpZiAoY29kZSA9PT0gNDI5ICYmIHNoYXJlZFNjb3BlKSByZXR1cm5cblxuICAgICAgLy8gSU5WQUxJRCBSRVFVRVNUIFdBUyBNQURFXG5cbiAgICAgIC8vIE1hcmsgYSByZXF1ZXN0IGhhcyBiZWVuIGludmFsaWRcbiAgICAgIGJ1Y2tldC5jdXJyZW50KytcbiAgICAgIC8vIElmIGEgdGltZW91dCB3YXMgbm90IHN0YXJ0ZWQsIHN0YXJ0IGEgdGltZW91dCB0byByZXNldCB0aGlzIGJ1Y2tldFxuICAgICAgaWYgKGJ1Y2tldC50aW1lb3V0SWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBidWNrZXQudGltZW91dElkID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgYnVja2V0LmN1cnJlbnQgPSAwXG4gICAgICAgICAgYnVja2V0LnRpbWVvdXRJZCA9IHVuZGVmaW5lZFxuICAgICAgICB9LCBidWNrZXQuaW50ZXJ2YWwpXG4gICAgICB9XG4gICAgfSxcbiAgfVxuXG4gIHJldHVybiBidWNrZXRcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJbnZhbGlkUmVxdWVzdEJ1Y2tldE9wdGlvbnMge1xuICAvKiogY3VycmVudCBpbnZhbGlkIGFtb3VudCAqL1xuICBjdXJyZW50PzogbnVtYmVyXG4gIC8qKiBtYXggaW52YWxpZCByZXF1ZXN0cyBhbGxvd2VkIHVudGlsIGJhbi4gRGVmYXVsdHMgdG8gMTAsMDAwICovXG4gIG1heD86IG51bWJlclxuICAvKiogVGhlIHRpbWUgdGhhdCBkaXNjb3JkIGFsbG93cyB0byBtYWtlIHRoZSBtYXggbnVtYmVyIG9mIGludmFsaWQgcmVxdWVzdHMuIERlZmF1bHRzIHRvIDEwIG1pbnV0ZXMgKi9cbiAgaW50ZXJ2YWw/OiBudW1iZXJcbiAgLyoqIHRpbWVyIHRvIHJlc2V0IHRvIDAgKi9cbiAgdGltZW91dElkPzogTm9kZUpTLlRpbWVvdXRcbiAgLyoqIGhvdyBzYWZlIHRvIGJlIGZyb20gbWF4LiBEZWZhdWx0cyB0byAxICovXG4gIHNhZmV0eT86IG51bWJlclxuICAvKiogVGhlIHJlcXVlc3Qgc3RhdHVzZXMgdGhhdCBjb3VudCBhcyBhbiBpbnZhbGlkIHJlcXVlc3QuICovXG4gIGVycm9yU3RhdHVzZXM/OiBudW1iZXJbXVxuICAvKiogVGhlIGFtb3VudCBvZiByZXF1ZXN0cyB0aGF0IHdlcmUgcmVxdWVzdGVkIGZyb20gdGhpcyBidWNrZXQuICovXG4gIHJlcXVlc3RlZD86IG51bWJlclxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEludmFsaWRSZXF1ZXN0QnVja2V0IHtcbiAgLyoqIGN1cnJlbnQgaW52YWxpZCBhbW91bnQgKi9cbiAgY3VycmVudDogbnVtYmVyXG4gIC8qKiBtYXggaW52YWxpZCByZXF1ZXN0cyBhbGxvd2VkIHVudGlsIGJhbi4gRGVmYXVsdHMgdG8gMTAsMDAwICovXG4gIG1heDogbnVtYmVyXG4gIC8qKiBUaGUgdGltZSB0aGF0IGRpc2NvcmQgYWxsb3dzIHRvIG1ha2UgdGhlIG1heCBudW1iZXIgb2YgaW52YWxpZCByZXF1ZXN0cy4gRGVmYXVsdHMgdG8gMTAgbWludXRlcyAqL1xuICBpbnRlcnZhbDogbnVtYmVyXG4gIC8qKiB0aW1lciB0byByZXNldCB0byAwICovXG4gIHRpbWVvdXRJZDogTm9kZUpTLlRpbWVvdXQgfCB1bmRlZmluZWRcbiAgLyoqIGhvdyBzYWZlIHRvIGJlIGZyb20gbWF4LiBEZWZhdWx0cyB0byAxICovXG4gIHNhZmV0eTogbnVtYmVyXG4gIC8qKiBUaGUgcmVxdWVzdCBzdGF0dXNlcyB0aGF0IGNvdW50IGFzIGFuIGludmFsaWQgcmVxdWVzdC4gKi9cbiAgZXJyb3JTdGF0dXNlczogbnVtYmVyW11cbiAgLyoqIFRoZSBhbW91bnQgb2YgcmVxdWVzdHMgdGhhdCB3ZXJlIHJlcXVlc3RlZCBmcm9tIHRoaXMgYnVja2V0LiAqL1xuICByZXF1ZXN0ZWQ6IG51bWJlclxuICAvKiogVGhlIHJlcXVlc3RzIHRoYXQgYXJlIGN1cnJlbnRseSBwZW5kaW5nLiAqL1xuICB3YWl0aW5nOiBBcnJheTwodmFsdWU6IHZvaWQgfCBQcm9taXNlTGlrZTx2b2lkPikgPT4gdm9pZD5cbiAgLyoqIFdoZXRoZXIgb3Igbm90IHRoZSB3YWl0aW5nIHF1ZXVlIGlzIGFscmVhZHkgcHJvY2Vzc2luZy4gKi9cbiAgcHJvY2Vzc2luZzogYm9vbGVhblxuXG4gIC8qKiBHaXZlcyB0aGUgbnVtYmVyIG9mIHJlcXVlc3RzIHRoYXQgYXJlIGN1cnJlbnRseSBhbGxvd2VkLiAqL1xuICByZXF1ZXN0c0FsbG93ZWQ6ICgpID0+IG51bWJlclxuICAvKiogQ2hlY2tzIGlmIGEgcmVxdWVzdCBpcyBhbGxvd2VkIGF0IHRoaXMgdGltZS4gKi9cbiAgaXNSZXF1ZXN0QWxsb3dlZDogKCkgPT4gYm9vbGVhblxuICAvKiogV2FpdHMgdW50aWwgYSByZXF1ZXN0IGlzIGF2YWlsYWJsZSAqL1xuICB3YWl0VW50aWxSZXF1ZXN0QXZhaWxhYmxlOiAoKSA9PiBQcm9taXNlPHZvaWQ+XG4gIC8qKiBCZWdpbnMgcHJvY2Vzc2luZyB0aGUgd2FpdGluZyBxdWV1ZSBvZiByZXF1ZXN0cy4gKi9cbiAgcHJvY2Vzc1dhaXRpbmc6ICgpID0+IFByb21pc2U8dm9pZD5cbiAgLyoqIEhhbmRsZXIgZm9yIHdoZW5ldmVyIGEgcmVxdWVzdCBpcyB2YWxpZGF0ZWQuIFRoaXMgc2hvdWxkIHVwZGF0ZSB0aGUgcmVxdWVzdGVkIHZhbHVlcyBvciB0cmlnZ2VyIGFueSBvdGhlciBuZWNlc3Nhcnkgc3R1ZmYuICovXG4gIGhhbmRsZUNvbXBsZXRlZFJlcXVlc3Q6IChjb2RlOiBudW1iZXIsIHNoYXJlZFNjb3BlOiBib29sZWFuKSA9PiB2b2lkXG59XG4iXSwibmFtZXMiOlsiZGVsYXkiLCJsb2dnZXIiLCJjcmVhdGVJbnZhbGlkUmVxdWVzdEJ1Y2tldCIsIm9wdGlvbnMiLCJidWNrZXQiLCJjdXJyZW50IiwibWF4IiwiaW50ZXJ2YWwiLCJ0aW1lb3V0SWQiLCJzYWZldHkiLCJlcnJvclN0YXR1c2VzIiwicmVxdWVzdGVkIiwicHJvY2Vzc2luZyIsIndhaXRpbmciLCJyZXF1ZXN0c0FsbG93ZWQiLCJpc1JlcXVlc3RBbGxvd2VkIiwid2FpdFVudGlsUmVxdWVzdEF2YWlsYWJsZSIsIlByb21pc2UiLCJyZXNvbHZlIiwicHVzaCIsInByb2Nlc3NXYWl0aW5nIiwibGVuZ3RoIiwiaW5mbyIsInNoaWZ0IiwiaGFuZGxlQ29tcGxldGVkUmVxdWVzdCIsImNvZGUiLCJzaGFyZWRTY29wZSIsImluY2x1ZGVzIiwidW5kZWZpbmVkIiwic2V0VGltZW91dCJdLCJtYXBwaW5ncyI6IkFBQUEsT0FBU0EsU0FBQUEsQ0FBSyxDQUFFQyxVQUFBQSxDQUFNLEtBQVEsbUJBQW1CLEFBU2pELFFBQU8sU0FBU0MsMkJBQTJCQyxDQUFvQyxDQUF3QixDQUNyRyxJQUFNQyxFQUErQixDQUNuQ0MsUUFBU0YsRUFBUUUsT0FBTyxFQUFJLEVBQzVCQyxJQUFLSCxFQUFRRyxHQUFHLEVBQUksSUFDcEJDLFNBQVVKLEVBQVFJLFFBQVEsRUFBSSxJQUM5QkMsVUFBV0wsRUFBUUssU0FBUyxDQUM1QkMsT0FBUU4sRUFBUU0sTUFBTSxFQUFJLEVBQzFCQyxjQUFlUCxFQUFRTyxhQUFhLEVBQUksQ0FBQyxJQUFLLElBQUssSUFBSSxDQUN2REMsVUFBV1IsRUFBUVEsU0FBUyxFQUFJLEVBQ2hDQyxXQUFZLENBQUEsRUFFWkMsUUFBUyxFQUFFLENBRVhDLGdCQUFpQixVQUFZLENBQzNCLE9BQU9WLEVBQU9FLEdBQUcsQ0FBR0YsRUFBT0MsT0FBTyxDQUFHRCxFQUFPTyxTQUFTLENBQUdQLEVBQU9LLE1BQU0sQUFDdkUsRUFFQU0saUJBQWtCLFVBQVksQ0FDNUIsT0FBT1gsRUFBT1UsZUFBZSxHQUFLLENBQ3BDLEVBRUFFLDBCQUEyQixnQkFBa0IsQ0FFM0MsT0FBTyxNQUFNLElBQUlDLFFBQVEsTUFBT0MsR0FBWSxDQUV0Q2QsRUFBT1csZ0JBQWdCLElBQ3pCWCxFQUFPTyxTQUFTLEdBQ2hCTyxNQUVBZCxFQUFPUyxPQUFPLENBQUNNLElBQUksQ0FBQ0QsR0FDcEIsTUFBTWQsRUFBT2dCLGNBQWMsR0FFL0IsRUFDRixFQUVBQSxlQUFnQixnQkFBa0IsQ0FFaEMsSUFBSWhCLEVBQU9RLFVBQVUsRUFPckIsSUFGQVIsRUFBT1EsVUFBVSxDQUFHLENBQUEsRUFFYlIsRUFBT1MsT0FBTyxDQUFDUSxNQUFNLENBQUcsR0FDN0JwQixFQUFPcUIsSUFBSSxDQUFDLENBQUMsNkRBQTZELEVBQUVsQixFQUFPUyxPQUFPLENBQUNRLE1BQU0sQ0FBQyxXQUFXLENBQUMsRUFDMUdqQixFQUFPVyxnQkFBZ0IsSUFDekJYLEVBQU9PLFNBQVMsR0FFaEJQLEVBQU9TLE9BQU8sQ0FBQ1UsS0FBSyxRQUVwQixNQUFNdkIsRUFBTSxJQUtoQkksQ0FBQUEsRUFBT1EsVUFBVSxDQUFHLENBQUEsRUFqQm5CLEFBa0JILEVBRUFZLHVCQUF3QixTQUFVQyxDQUFJLENBQUVDLENBQVcsQ0FBRSxDQUVuRHRCLEVBQU9PLFNBQVMsR0FFWFAsRUFBT00sYUFBYSxDQUFDaUIsUUFBUSxDQUFDRixLQUV0QixNQUFUQSxHQUFnQkMsSUFLcEJ0QixFQUFPQyxPQUFPLEdBRVd1QixLQUFBQSxJQUFyQnhCLEVBQU9JLFNBQVMsRUFDbEJKLENBQUFBLEVBQU9JLFNBQVMsQ0FBR3FCLFdBQVcsSUFBTSxDQUNsQ3pCLEVBQU9DLE9BQU8sQ0FBRyxFQUNqQkQsRUFBT0ksU0FBUyxDQUFHb0IsS0FBQUEsQ0FDckIsRUFBR3hCLEVBQU9HLFFBQVEsQ0FBQSxHQUV0QixDQUNGLEVBRUEsT0FBT0gsQ0FDVCxDQUFDIn0=
1
+ import { delay, logger } from '@discordeno/utils';
2
+ /**
3
+ * A invalid request bucket is used in a similar manner as a leaky bucket but a invalid request bucket can be refilled as needed.
4
+ * It's purpose is to make sure the bot does not hit the limit to getting a 1 hr ban.
5
+ *
6
+ * @param options The options used to configure this bucket.
7
+ * @returns RefillingBucket
8
+ */ export function createInvalidRequestBucket(options) {
9
+ const bucket = {
10
+ current: options.current ?? 0,
11
+ max: options.max ?? 10000,
12
+ interval: options.interval ?? 600000,
13
+ timeoutId: options.timeoutId,
14
+ safety: options.safety ?? 1,
15
+ errorStatuses: options.errorStatuses ?? [
16
+ 401,
17
+ 403,
18
+ 429
19
+ ],
20
+ requested: options.requested ?? 0,
21
+ processing: false,
22
+ waiting: [],
23
+ requestsAllowed: function() {
24
+ return bucket.max - bucket.current - bucket.requested - bucket.safety;
25
+ },
26
+ isRequestAllowed: function() {
27
+ return bucket.requestsAllowed() > 0;
28
+ },
29
+ waitUntilRequestAvailable: async function() {
30
+ // eslint-disable-next-line no-async-promise-executor
31
+ return await new Promise(async (resolve)=>{
32
+ // If whatever amount of requests is left is more than the safety margin, allow the request
33
+ if (bucket.isRequestAllowed()) {
34
+ bucket.requested++;
35
+ resolve();
36
+ } else {
37
+ bucket.waiting.push(resolve);
38
+ await bucket.processWaiting();
39
+ }
40
+ });
41
+ },
42
+ processWaiting: async function() {
43
+ // If already processing, that loop will handle all waiting requests.
44
+ if (bucket.processing) {
45
+ return;
46
+ }
47
+ // Mark as processing so other loops don't start
48
+ bucket.processing = true;
49
+ while(bucket.waiting.length > 0){
50
+ logger.info(`[InvalidBucket] processing waiting queue while loop ran with ${bucket.waiting.length} remaining.`);
51
+ if (bucket.isRequestAllowed()) {
52
+ bucket.requested++;
53
+ // Resolve the next item in the queue
54
+ bucket.waiting.shift()?.();
55
+ } else {
56
+ await delay(1000);
57
+ }
58
+ }
59
+ // Mark as false so next pending request can be triggered by new loop.
60
+ bucket.processing = false;
61
+ },
62
+ handleCompletedRequest: function(code, sharedScope) {
63
+ // Since request is complete, we can remove one from requested.
64
+ bucket.requested--;
65
+ // Since it is as a valid request, we don't need to do anything
66
+ if (!bucket.errorStatuses.includes(code)) return;
67
+ // Shared scope is not considered invalid
68
+ if (code === 429 && sharedScope) return;
69
+ // INVALID REQUEST WAS MADE
70
+ // Mark a request has been invalid
71
+ bucket.current++;
72
+ // If a timeout was not started, start a timeout to reset this bucket
73
+ if (bucket.timeoutId === undefined) {
74
+ bucket.timeoutId = setTimeout(()=>{
75
+ bucket.current = 0;
76
+ bucket.timeoutId = undefined;
77
+ }, bucket.interval);
78
+ }
79
+ }
80
+ };
81
+ return bucket;
82
+ }
83
+
84
+ //# sourceMappingURL=invalidBucket.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/invalidBucket.ts"],"sourcesContent":["import { delay, logger } from '@discordeno/utils'\n\n/**\n * A invalid request bucket is used in a similar manner as a leaky bucket but a invalid request bucket can be refilled as needed.\n * It's purpose is to make sure the bot does not hit the limit to getting a 1 hr ban.\n *\n * @param options The options used to configure this bucket.\n * @returns RefillingBucket\n */\nexport function createInvalidRequestBucket(options: InvalidRequestBucketOptions): InvalidRequestBucket {\n const bucket: InvalidRequestBucket = {\n current: options.current ?? 0,\n max: options.max ?? 10000,\n interval: options.interval ?? 600000,\n timeoutId: options.timeoutId,\n safety: options.safety ?? 1,\n errorStatuses: options.errorStatuses ?? [401, 403, 429],\n requested: options.requested ?? 0,\n processing: false,\n\n waiting: [],\n\n requestsAllowed: function () {\n return bucket.max - bucket.current - bucket.requested - bucket.safety\n },\n\n isRequestAllowed: function () {\n return bucket.requestsAllowed() > 0\n },\n\n waitUntilRequestAvailable: async function () {\n // eslint-disable-next-line no-async-promise-executor\n return await new Promise(async (resolve) => {\n // If whatever amount of requests is left is more than the safety margin, allow the request\n if (bucket.isRequestAllowed()) {\n bucket.requested++\n resolve()\n } else {\n bucket.waiting.push(resolve)\n await bucket.processWaiting()\n }\n })\n },\n\n processWaiting: async function () {\n // If already processing, that loop will handle all waiting requests.\n if (bucket.processing) {\n return\n }\n\n // Mark as processing so other loops don't start\n bucket.processing = true\n\n while (bucket.waiting.length > 0) {\n logger.info(`[InvalidBucket] processing waiting queue while loop ran with ${bucket.waiting.length} remaining.`)\n if (bucket.isRequestAllowed()) {\n bucket.requested++\n // Resolve the next item in the queue\n bucket.waiting.shift()?.()\n } else {\n await delay(1000)\n }\n }\n\n // Mark as false so next pending request can be triggered by new loop.\n bucket.processing = false\n },\n\n handleCompletedRequest: function (code, sharedScope) {\n // Since request is complete, we can remove one from requested.\n bucket.requested--\n // Since it is as a valid request, we don't need to do anything\n if (!bucket.errorStatuses.includes(code)) return\n // Shared scope is not considered invalid\n if (code === 429 && sharedScope) return\n\n // INVALID REQUEST WAS MADE\n\n // Mark a request has been invalid\n bucket.current++\n // If a timeout was not started, start a timeout to reset this bucket\n if (bucket.timeoutId === undefined) {\n bucket.timeoutId = setTimeout(() => {\n bucket.current = 0\n bucket.timeoutId = undefined\n }, bucket.interval)\n }\n },\n }\n\n return bucket\n}\n\nexport interface InvalidRequestBucketOptions {\n /** current invalid amount */\n current?: number\n /** max invalid requests allowed until ban. Defaults to 10,000 */\n max?: number\n /** The time that discord allows to make the max number of invalid requests. Defaults to 10 minutes */\n interval?: number\n /** timer to reset to 0 */\n timeoutId?: NodeJS.Timeout\n /** how safe to be from max. Defaults to 1 */\n safety?: number\n /** The request statuses that count as an invalid request. */\n errorStatuses?: number[]\n /** The amount of requests that were requested from this bucket. */\n requested?: number\n}\n\nexport interface InvalidRequestBucket {\n /** current invalid amount */\n current: number\n /** max invalid requests allowed until ban. Defaults to 10,000 */\n max: number\n /** The time that discord allows to make the max number of invalid requests. Defaults to 10 minutes */\n interval: number\n /** timer to reset to 0 */\n timeoutId: NodeJS.Timeout | undefined\n /** how safe to be from max. Defaults to 1 */\n safety: number\n /** The request statuses that count as an invalid request. */\n errorStatuses: number[]\n /** The amount of requests that were requested from this bucket. */\n requested: number\n /** The requests that are currently pending. */\n waiting: Array<(value: void | PromiseLike<void>) => void>\n /** Whether or not the waiting queue is already processing. */\n processing: boolean\n\n /** Gives the number of requests that are currently allowed. */\n requestsAllowed: () => number\n /** Checks if a request is allowed at this time. */\n isRequestAllowed: () => boolean\n /** Waits until a request is available */\n waitUntilRequestAvailable: () => Promise<void>\n /** Begins processing the waiting queue of requests. */\n processWaiting: () => Promise<void>\n /** Handler for whenever a request is validated. This should update the requested values or trigger any other necessary stuff. */\n handleCompletedRequest: (code: number, sharedScope: boolean) => void\n}\n"],"names":["delay","logger","createInvalidRequestBucket","options","bucket","current","max","interval","timeoutId","safety","errorStatuses","requested","processing","waiting","requestsAllowed","isRequestAllowed","waitUntilRequestAvailable","Promise","resolve","push","processWaiting","length","info","shift","handleCompletedRequest","code","sharedScope","includes","undefined","setTimeout"],"mappings":"AAAA,SAASA,KAAK,EAAEC,MAAM,QAAQ,oBAAmB;AAEjD;;;;;;CAMC,GACD,OAAO,SAASC,2BAA2BC,OAAoC,EAAwB;IACrG,MAAMC,SAA+B;QACnCC,SAASF,QAAQE,OAAO,IAAI;QAC5BC,KAAKH,QAAQG,GAAG,IAAI;QACpBC,UAAUJ,QAAQI,QAAQ,IAAI;QAC9BC,WAAWL,QAAQK,SAAS;QAC5BC,QAAQN,QAAQM,MAAM,IAAI;QAC1BC,eAAeP,QAAQO,aAAa,IAAI;YAAC;YAAK;YAAK;SAAI;QACvDC,WAAWR,QAAQQ,SAAS,IAAI;QAChCC,YAAY,KAAK;QAEjBC,SAAS,EAAE;QAEXC,iBAAiB,WAAY;YAC3B,OAAOV,OAAOE,GAAG,GAAGF,OAAOC,OAAO,GAAGD,OAAOO,SAAS,GAAGP,OAAOK,MAAM;QACvE;QAEAM,kBAAkB,WAAY;YAC5B,OAAOX,OAAOU,eAAe,KAAK;QACpC;QAEAE,2BAA2B,iBAAkB;YAC3C,qDAAqD;YACrD,OAAO,MAAM,IAAIC,QAAQ,OAAOC,UAAY;gBAC1C,2FAA2F;gBAC3F,IAAId,OAAOW,gBAAgB,IAAI;oBAC7BX,OAAOO,SAAS;oBAChBO;gBACF,OAAO;oBACLd,OAAOS,OAAO,CAACM,IAAI,CAACD;oBACpB,MAAMd,OAAOgB,cAAc;gBAC7B,CAAC;YACH;QACF;QAEAA,gBAAgB,iBAAkB;YAChC,qEAAqE;YACrE,IAAIhB,OAAOQ,UAAU,EAAE;gBACrB;YACF,CAAC;YAED,gDAAgD;YAChDR,OAAOQ,UAAU,GAAG,IAAI;YAExB,MAAOR,OAAOS,OAAO,CAACQ,MAAM,GAAG,EAAG;gBAChCpB,OAAOqB,IAAI,CAAC,CAAC,6DAA6D,EAAElB,OAAOS,OAAO,CAACQ,MAAM,CAAC,WAAW,CAAC;gBAC9G,IAAIjB,OAAOW,gBAAgB,IAAI;oBAC7BX,OAAOO,SAAS;oBAChB,qCAAqC;oBACrCP,OAAOS,OAAO,CAACU,KAAK;gBACtB,OAAO;oBACL,MAAMvB,MAAM;gBACd,CAAC;YACH;YAEA,sEAAsE;YACtEI,OAAOQ,UAAU,GAAG,KAAK;QAC3B;QAEAY,wBAAwB,SAAUC,IAAI,EAAEC,WAAW,EAAE;YACnD,+DAA+D;YAC/DtB,OAAOO,SAAS;YAChB,+DAA+D;YAC/D,IAAI,CAACP,OAAOM,aAAa,CAACiB,QAAQ,CAACF,OAAO;YAC1C,yCAAyC;YACzC,IAAIA,SAAS,OAAOC,aAAa;YAEjC,2BAA2B;YAE3B,kCAAkC;YAClCtB,OAAOC,OAAO;YACd,qEAAqE;YACrE,IAAID,OAAOI,SAAS,KAAKoB,WAAW;gBAClCxB,OAAOI,SAAS,GAAGqB,WAAW,IAAM;oBAClCzB,OAAOC,OAAO,GAAG;oBACjBD,OAAOI,SAAS,GAAGoB;gBACrB,GAAGxB,OAAOG,QAAQ;YACpB,CAAC;QACH;IACF;IAEA,OAAOH;AACT,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../src/manager.ts"],"names":[],"mappings":"AAkEA,OAAO,KAAK,EAAE,wBAAwB,EAAE,WAAW,EAAsB,MAAM,YAAY,CAAA;AAK3F,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,wBAAwB,GAAG,WAAW,CA2nDhF"}
1
+ {"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../src/manager.ts"],"names":[],"mappings":"AAqEA,OAAO,KAAK,EAAE,wBAAwB,EAAE,WAAW,EAAsB,MAAM,YAAY,CAAA;AAK3F,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,wBAAwB,GAAG,WAAW,CA8qDhF"}