1 | "use strict";
|
2 | Object.defineProperty(exports, "__esModule", { value: true });
|
3 | const SocksProxyAgent = require("socks-proxy-agent");
|
4 | const axios_1 = require("axios");
|
5 | const RequestLimiter_1 = require("./RequestLimiter");
|
6 | class RequestLimitFactory {
|
7 | |
8 |
|
9 |
|
10 |
|
11 | constructor(loggerInterface, enabledProxies = [false]) {
|
12 | this.limiters = {};
|
13 | this.enabledProxies = [];
|
14 | this.axiosClients = [];
|
15 | |
16 |
|
17 |
|
18 | this.proxyCounter = 0;
|
19 | this.logger = loggerInterface;
|
20 | this.setEnabledProxies(enabledProxies);
|
21 | }
|
22 | |
23 |
|
24 |
|
25 | setEnabledProxies(enabledProxies = [false]) {
|
26 | this.enabledProxies = enabledProxies;
|
27 | this.axiosClients = [];
|
28 | this.logger.debug(`Loaded ${enabledProxies.length} proxies`);
|
29 |
|
30 | this.enabledProxies.forEach((enabledProxy) => {
|
31 | if (enabledProxy === false) {
|
32 |
|
33 | this.axiosClients.push(axios_1.default.create({}));
|
34 | }
|
35 | else {
|
36 |
|
37 | const httpsAgent = new SocksProxyAgent(enabledProxy);
|
38 |
|
39 | this.axiosClients.push(axios_1.default.create({ httpsAgent }));
|
40 | }
|
41 | });
|
42 | }
|
43 | |
44 |
|
45 |
|
46 |
|
47 |
|
48 |
|
49 | create(endpoint, method = "GET", noProxy = false) {
|
50 |
|
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 |
|
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 |
|
83 | run: limiter.run,
|
84 | method,
|
85 | endpoint
|
86 | };
|
87 | return this.limiters[limiterKey];
|
88 | }
|
89 | |
90 |
|
91 |
|
92 |
|
93 | getLimiter(limiterKey) {
|
94 | if (this.limiters[limiterKey]) {
|
95 | return this.limiters[limiterKey];
|
96 | }
|
97 | return false;
|
98 | }
|
99 | |
100 |
|
101 |
|
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 |
|
118 |
|
119 | getProxyIndex() {
|
120 | const currentIndex = this.proxyCounter % this.enabledProxies.length;
|
121 | this.proxyCounter += 1;
|
122 | return currentIndex;
|
123 | }
|
124 | }
|
125 | exports.default = RequestLimitFactory;
|