UNPKG

3.91 kBJavaScriptView Raw
1"use strict";
2Object.defineProperty(exports, "__esModule", { value: true });
3const SocksProxyAgent = require("socks-proxy-agent");
4const axios_1 = require("axios");
5const RequestLimiter_1 = require("./RequestLimiter");
6class RequestLimitFactory {
7 /**
8 * @param loggerInterface
9 * @param enabledProxies
10 */
11 constructor(loggerInterface, enabledProxies = [false]) {
12 this.limiters = {};
13 this.enabledProxies = [];
14 this.axiosClients = [];
15 /**
16 * Counts up to use proxies equally
17 */
18 this.proxyCounter = 0;
19 this.logger = loggerInterface;
20 this.setEnabledProxies(enabledProxies);
21 }
22 /**
23 * @param enabledProxies
24 */
25 setEnabledProxies(enabledProxies = [false]) {
26 this.enabledProxies = enabledProxies;
27 this.axiosClients = [];
28 this.logger.debug(`Loaded ${enabledProxies.length} proxies`);
29 // go through each proxy config
30 this.enabledProxies.forEach((enabledProxy) => {
31 if (enabledProxy === false) {
32 // standard axios client
33 this.axiosClients.push(axios_1.default.create({}));
34 }
35 else {
36 // create the socks proxy client
37 const httpsAgent = new SocksProxyAgent(enabledProxy);
38 // create axios client using the socks proxy client to handle the requests
39 this.axiosClients.push(axios_1.default.create({ httpsAgent }));
40 }
41 });
42 }
43 /**
44 * @param {string} endpoint
45 * @param {string} method
46 * @param {boolean} noProxy
47 * @returns {RequestLimitConfig}
48 */
49 create(endpoint, method = "GET", noProxy = false) {
50 // default to proxy "0" which is our standard IP
51 let limiterKey = `${endpoint}:${method}:0`;
52 let axiosClient = axios_1.default;
53 if (noProxy === false) {
54 const randomIndex = this.getProxyIndex();
55 limiterKey = `${endpoint}:${method}:${randomIndex}`;
56 // set axiosClient for the selected index
57 axiosClient = this.axiosClients[randomIndex];
58 }
59 if (this.limiters[limiterKey]) {
60 return this.limiters[limiterKey];
61 }
62 let rateLimit = 3;
63 switch (method) {
64 case "PUT":
65 rateLimit = 2;
66 break;
67 case "POST":
68 case "DELETE":
69 rateLimit = 5;
70 break;
71 case "GET":
72 case "LIST":
73 rateLimit = 3;
74 break;
75 default:
76 throw new Error("Invalid method given");
77 }
78 const limiter = new RequestLimiter_1.default(rateLimit, 3350, axiosClient);
79 this.limiters[limiterKey] = {
80 limiterKey,
81 limiter,
82 // wrap run in the object so it is reverse-compatible
83 run: limiter.run,
84 method,
85 endpoint
86 };
87 return this.limiters[limiterKey];
88 }
89 /**
90 * @param {string} limiterKey
91 * @returns {any}
92 */
93 getLimiter(limiterKey) {
94 if (this.limiters[limiterKey]) {
95 return this.limiters[limiterKey];
96 }
97 return false;
98 }
99 /**
100 * @param {string} limiterKey
101 * @returns {boolean}
102 */
103 removeLimiter(limiterKey) {
104 if (this.limiters[limiterKey]) {
105 delete this.limiters[limiterKey];
106 return true;
107 }
108 return false;
109 }
110 getAllLimiters() {
111 return this.limiters;
112 }
113 clearLimiters() {
114 this.limiters = {};
115 }
116 /**
117 * Returns a random index for the available proxies
118 */
119 getProxyIndex() {
120 const currentIndex = this.proxyCounter % this.enabledProxies.length;
121 this.proxyCounter += 1;
122 return currentIndex;
123 }
124}
125exports.default = RequestLimitFactory;