UNPKG

8.48 kBJavaScriptView Raw
1"use strict";
2
3var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4Object.defineProperty(exports, "__esModule", {
5 value: true
6});
7exports["default"] = exports.LinearProxyStrategy = void 0;
8var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
9var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
10var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
11var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
12var _get2 = _interopRequireDefault(require("@babel/runtime/helpers/get"));
13var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
14var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));
15var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
16var _err = _interopRequireDefault(require("@lskjs/err"));
17var _get3 = _interopRequireDefault(require("lodash/get"));
18var _shuffle = _interopRequireDefault(require("lodash/shuffle"));
19var _sortBy = _interopRequireDefault(require("lodash/sortBy"));
20var _sumBy = _interopRequireDefault(require("lodash/sumBy"));
21var _ProxyStrategy2 = require("./ProxyStrategy");
22function _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); }; }
23function _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; } } /* eslint-disable no-param-reassign */
24// import request from './request';
25var LinearProxyStrategy = /*#__PURE__*/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 } // consts
45 // 10 проксей парсят
46 // на них выделяется 95% попыток парсинга
47 // на остальные прокси выделяется 5% попыток, потому что, вдруг они там за это время починились
48 // vars
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; // TODO, как гипотезу можно рассмотреть какую нибудь не линейную функцию
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; // 1 - один по умолчанию потому что они должны быть в списке круче чем сломанные прокси у которых 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"])( /*#__PURE__*/_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);
154exports.LinearProxyStrategy = LinearProxyStrategy;
155var _default = LinearProxyStrategy;
156exports["default"] = _default;
157//# sourceMappingURL=LinearProxyStrategy.js.map
\No newline at end of file