const UserAgentManager = require('./UserAgentManager'); const RESTMethods = require('./RESTMethods'); const SequentialRequestHandler = require('./RequestHandlers/Sequential'); const BurstRequestHandler = require('./RequestHandlers/Burst'); const APIRequest = require('./APIRequest'); const Constants = require('../../util/Constants'); class RESTManager { constructor(client) { this.client = client; this.handlers = {}; this.userAgentManager = new UserAgentManager(this); this.methods = new RESTMethods(this); this.rateLimitedEndpoints = {}; this.globallyRateLimited = false; } push(handler, apiRequest) { return new Promise((resolve, reject) => { handler.push({ request: apiRequest, resolve, reject, }); }); } getRequestHandler() { switch (this.client.options.api_request_method) { case 'sequential': return SequentialRequestHandler; case 'burst': return BurstRequestHandler; default: throw new Error(Constants.Errors.INVALID_RATE_LIMIT_METHOD); } } makeRequest(method, url, auth, data, file) { const apiRequest = new APIRequest(this, method, url, auth, data, file); if (!this.handlers[apiRequest.getEndpoint()]) { const RequestHandlerType = this.getRequestHandler(); this.handlers[apiRequest.getEndpoint()] = new RequestHandlerType(this, apiRequest.getEndpoint()); } return this.push(this.handlers[apiRequest.getEndpoint()], apiRequest); } } module.exports = RESTManager;