1 | "use strict";
|
2 |
|
3 | var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
4 | Object.defineProperty(exports, "__esModule", {
|
5 | value: true
|
6 | });
|
7 | exports["default"] = exports.LinearProxyStrategy = void 0;
|
8 | var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
|
9 | var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
|
10 | var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
|
11 | var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
|
12 | var _get2 = _interopRequireDefault(require("@babel/runtime/helpers/get"));
|
13 | var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
|
14 | var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));
|
15 | var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
|
16 | var _err = _interopRequireDefault(require("@lskjs/err"));
|
17 | var _get3 = _interopRequireDefault(require("lodash/get"));
|
18 | var _shuffle = _interopRequireDefault(require("lodash/shuffle"));
|
19 | var _sortBy = _interopRequireDefault(require("lodash/sortBy"));
|
20 | var _sumBy = _interopRequireDefault(require("lodash/sumBy"));
|
21 | var _ProxyStrategy2 = require("./ProxyStrategy");
|
22 | function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = (0, _getPrototypeOf2["default"])(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0, _getPrototypeOf2["default"])(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2["default"])(this, result); }; }
|
23 | function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
|
24 |
|
25 | var LinearProxyStrategy = function (_ProxyStrategy) {
|
26 | (0, _inherits2["default"])(LinearProxyStrategy, _ProxyStrategy);
|
27 | var _super = _createSuper(LinearProxyStrategy);
|
28 | function LinearProxyStrategy() {
|
29 | var _this;
|
30 | (0, _classCallCheck2["default"])(this, LinearProxyStrategy);
|
31 | for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
|
32 | args[_key] = arguments[_key];
|
33 | }
|
34 | _this = _super.call.apply(_super, [this].concat(args));
|
35 | _this.strategy = 'linear';
|
36 | _this.maxPrimaryProxiesCount = 10;
|
37 | _this.primaryProxiesProbablity = 0.95;
|
38 | _this.primaryProxies = [];
|
39 | _this.primaryProxiesCount = 0;
|
40 | _this.secondaryProxies = [];
|
41 | _this.secondaryProxyIteration = 0;
|
42 | _this.kpdSum = 0;
|
43 | return _this;
|
44 | }
|
45 |
|
46 |
|
47 |
|
48 |
|
49 | (0, _createClass2["default"])(LinearProxyStrategy, [{
|
50 | key: "getStats",
|
51 | value:
|
52 |
|
53 | function getStats() {
|
54 | this.update();
|
55 | return {
|
56 | primaryProxiesCount: this.primaryProxiesCount,
|
57 | secondaryProxyIteration: this.secondaryProxyIteration,
|
58 | kpdSum: this.kpdSum
|
59 | };
|
60 | }
|
61 | }, {
|
62 | key: "update",
|
63 | value: function update() {
|
64 | var _this2 = this;
|
65 | var proxies = (0, _get3["default"])(this, 'manager.cache.list');
|
66 | if (!proxies) return;
|
67 | proxies.forEach(function (proxy) {
|
68 | proxy.stats.kpd = _this2.countKpd(proxy);
|
69 | proxy.stats.probability = 0;
|
70 | });
|
71 | var sortedProxies = (0, _sortBy["default"])(proxies, function (p) {
|
72 | return -(0, _get3["default"])(p, 'stats.kpd');
|
73 | });
|
74 | var isWorkingProxy = function isWorkingProxy(p) {
|
75 | return (0, _get3["default"])(p, 'stats.kpd', 0) > 0 && (0, _get3["default"])(p, 'stats.count', 0) > 0;
|
76 | };
|
77 |
|
78 |
|
79 | this.primaryProxies = sortedProxies.filter(isWorkingProxy).slice(0, this.maxPrimaryProxiesCount);
|
80 | this.primaryProxiesCount = this.primaryProxies.length;
|
81 | this.secondaryProxies = (0, _shuffle["default"])(sortedProxies.slice(this.primaryProxiesCount));
|
82 |
|
83 |
|
84 | this.kpdSum = (0, _sumBy["default"])(this.primaryProxies, function (p) {
|
85 | return (0, _get3["default"])(p, 'stats.kpd');
|
86 | });
|
87 | if (this.kpdSum < 1) this.kpdSum = 0;
|
88 |
|
89 | this.primaryProxies.forEach(function (proxy) {
|
90 | if (_this2.kpdSum) {
|
91 |
|
92 | proxy.probability = (0, _get3["default"])(proxy, 'stats.kpd') / _this2.kpdSum * _this2.primaryProxiesProbablity;
|
93 | } else {
|
94 |
|
95 | proxy.probability = 1 / _this2.primaryProxiesCount * _this2.primaryProxiesProbablity;
|
96 | }
|
97 | });
|
98 | }
|
99 | }, {
|
100 | key: "getProxy",
|
101 | value: function getProxy() {
|
102 | var list = (0, _get3["default"])(this, 'manager.cache.list');
|
103 | if (!(list !== null && list !== void 0 && list.length)) throw new _err["default"]('PROXY_MANAGER_LIST_EMPTY');
|
104 | var initProbability = Math.random();
|
105 | var sumProbability = 0;
|
106 | for (var i = 0; i < this.primaryProxies.length; i += 1) {
|
107 | sumProbability += +(0, _get3["default"])(this.primaryProxies, "".concat(i, ".stats.probability")) || 0;
|
108 | if (initProbability < sumProbability) return this.primaryProxies[i];
|
109 | }
|
110 | this.secondaryProxyIteration += 1;
|
111 | return this.secondaryProxies[this.secondaryProxyIteration % this.secondaryProxies.length];
|
112 | }
|
113 |
|
114 |
|
115 | }, {
|
116 | key: "countKpd",
|
117 | value: function countKpd(proxy) {
|
118 | var success = (0, _get3["default"])(proxy, 'stats.statuses.success', 0);
|
119 | var fatal = (0, _get3["default"])(proxy, 'stats.fatal', 0);
|
120 | if (fatal) return -1;
|
121 | var error = (0, _get3["default"])(proxy, 'stats.statuses.error', 0);
|
122 | var count = (0, _get3["default"])(proxy, 'count', 0);
|
123 | if (!count) return 0;
|
124 | var avgTime = count ? (0, _get3["default"])(proxy, 'time', 0) / (0, _get3["default"])(proxy, 'count', 1) : 0;
|
125 | var errorTime = error ? (0, _get3["default"])(proxy, 'statusesTime.error', 0) / error : 0;
|
126 | return 60000 / (avgTime + error / success * errorTime);
|
127 | }
|
128 | }, {
|
129 | key: "run",
|
130 | value: function () {
|
131 | var _run = (0, _asyncToGenerator2["default"])( _regenerator["default"].mark(function _callee() {
|
132 | return _regenerator["default"].wrap(function _callee$(_context) {
|
133 | while (1) switch (_context.prev = _context.next) {
|
134 | case 0:
|
135 | _context.next = 2;
|
136 | return (0, _get2["default"])((0, _getPrototypeOf2["default"])(LinearProxyStrategy.prototype), "run", this).call(this);
|
137 | case 2:
|
138 | _context.next = 4;
|
139 | return this.update();
|
140 | case 4:
|
141 | case "end":
|
142 | return _context.stop();
|
143 | }
|
144 | }, _callee, this);
|
145 | }));
|
146 | function run() {
|
147 | return _run.apply(this, arguments);
|
148 | }
|
149 | return run;
|
150 | }()
|
151 | }]);
|
152 | return LinearProxyStrategy;
|
153 | }(_ProxyStrategy2.ProxyStrategy);
|
154 | exports.LinearProxyStrategy = LinearProxyStrategy;
|
155 | var _default = LinearProxyStrategy;
|
156 | exports["default"] = _default;
|
157 |
|
\ | No newline at end of file |