UNPKG

13.5 kBJavaScriptView Raw
1"use strict";
2
3var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4Object.defineProperty(exports, "__esModule", {
5 value: true
6});
7exports["default"] = exports.ProxyTests = void 0;
8var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
9var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
10var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
11var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
12var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
13var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
14var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
15var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));
16var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
17var _err = _interopRequireDefault(require("@lskjs/err"));
18var _module = _interopRequireDefault(require("@lskjs/module"));
19var _tryJSONparse = _interopRequireDefault(require("@lskjs/utils/tryJSONparse"));
20var _bluebird = _interopRequireDefault(require("bluebird"));
21var _find = _interopRequireDefault(require("lodash/find"));
22var _flatten = _interopRequireDefault(require("lodash/flatten"));
23var _get = _interopRequireDefault(require("lodash/get"));
24var _groupBy = _interopRequireDefault(require("lodash/groupBy"));
25var _isFunction = _interopRequireDefault(require("lodash/isFunction"));
26var _pick = _interopRequireDefault(require("lodash/pick"));
27var _shuffle = _interopRequireDefault(require("lodash/shuffle"));
28var _createRequest = require("./createRequest");
29var _excluded = ["request"],
30 _excluded2 = ["proxy", "testId", "test", "force"];
31function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
32function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
33function _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); }; }
34function _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; } }
35var getId = function getId(_ref) {
36 var proxy = _ref.proxy,
37 test = _ref.test;
38 return [(0, _get["default"])(proxy, 'key'), test.id].filter(Boolean).join('_');
39};
40var ProxyTests = /*#__PURE__*/function (_Module) {
41 (0, _inherits2["default"])(ProxyTests, _Module);
42 var _super = _createSuper(ProxyTests);
43 function ProxyTests() {
44 var _this;
45 (0, _classCallCheck2["default"])(this, ProxyTests);
46 for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
47 args[_key] = arguments[_key];
48 }
49 _this = _super.call.apply(_super, [this].concat(args));
50 _this.config = {
51 concurrency: (0, _tryJSONparse["default"])(process.env.PREFETCH) || 50,
52 cacheTimeout: 15 * 60 * 1000
53 };
54 _this.cache = {
55 results: {},
56 proxyStats: {},
57 updatedAt: null
58 };
59 return _this;
60 }
61 (0, _createClass2["default"])(ProxyTests, [{
62 key: "request",
63 value: function request(req) {
64 var _ref2 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},
65 _request = _ref2.request,
66 props = (0, _objectWithoutProperties2["default"])(_ref2, _excluded);
67 if ((0, _isFunction["default"])(req)) {
68 return req(_objectSpread({
69 request: _request
70 }, props));
71 }
72 return _request(_objectSpread(_objectSpread({}, req), props));
73 }
74 }, {
75 key: "execTest",
76 value: function () {
77 var _execTest = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee() {
78 var _ref3,
79 id,
80 proxy,
81 _ref3$test,
82 test,
83 apm,
84 stats,
85 log,
86 request,
87 res,
88 startedAt,
89 expired,
90 _args = arguments;
91 return _regenerator["default"].wrap(function _callee$(_context) {
92 while (1) switch (_context.prev = _context.next) {
93 case 0:
94 _ref3 = _args.length > 0 && _args[0] !== undefined ? _args[0] : {}, id = _ref3.id, proxy = _ref3.proxy, _ref3$test = _ref3.test, test = _ref3$test === void 0 ? {} : _ref3$test;
95 _context.next = 3;
96 return this.app.module('apm');
97 case 3:
98 apm = _context.sent;
99 _context.next = 6;
100 return this.app.module('stats');
101 case 6:
102 stats = _context.sent;
103 _context.next = 9;
104 return this.log.createChild({
105 name: "".concat(test.id)
106 });
107 case 9:
108 log = _context.sent;
109 request = (0, _createRequest.createRequest)({
110 apm: apm,
111 labels: {
112 proxyTest: test.id
113 },
114 stats: stats,
115 log: log
116 }); // console.log({ proxy });
117 res = {
118 id: getId({
119 proxy: proxy,
120 test: test
121 }),
122 proxy: proxy,
123 proxyKey: (proxy === null || proxy === void 0 ? void 0 : proxy.key) || '?',
124 test: test
125 };
126 startedAt = new Date();
127 _context.prev = 13;
128 _context.next = 16;
129 return this.request(test.req, {
130 proxy: proxy,
131 request: request
132 });
133 case 16:
134 res.status = 'success';
135 _context.next = 23;
136 break;
137 case 19:
138 _context.prev = 19;
139 _context.t0 = _context["catch"](13);
140 res.status = 'error';
141 res.errCode = _err["default"].getCode(_context.t0);
142 // res.err = err; // NOTE: вырубил, чтобы не переполнять память
143 case 23:
144 res.time = Date.now() - startedAt;
145 res.updatedAt = Date.now();
146 expired = test.expired || 5 * 60 * 1000;
147 res.expiredAt = Date.now() + expired;
148 // const ok = test.validate ? await test.validate(res2) : true;
149 return _context.abrupt("return", res);
150 case 28:
151 case "end":
152 return _context.stop();
153 }
154 }, _callee, this, [[13, 19]]);
155 }));
156 function execTest() {
157 return _execTest.apply(this, arguments);
158 }
159 return execTest;
160 }()
161 }, {
162 key: "getCache",
163 value: function getCache(id) {
164 if (!this.cache.results[id]) return null;
165 if (this.cache.results[id].expiredAt < Date.now()) {
166 delete this.cache.results[id];
167 return null;
168 }
169 return this.cache.results[id];
170 }
171 }, {
172 key: "setCache",
173 value: function setCache(res) {
174 var id = res.id;
175 if (!id) id = getId(res);
176 if (!id) throw new _err["default"]('!id', {
177 res: res
178 });
179 this.cache.results[id] = res;
180 this.cache.updatedAt = Date.now();
181 this.cache.proxyStats = (0, _groupBy["default"])(this.cache.results, 'proxy.key');
182 }
183 }, {
184 key: "updateCache",
185 value: function updateCache() {
186 var _this2 = this;
187 Object.keys(this.cache.results).map(function (id) {
188 return _this2.getCache(id);
189 });
190 }
191 }, {
192 key: "getResults",
193 value: function getResults() {
194 this.updateCache();
195 return this.cache.results;
196 }
197 }, {
198 key: "runTest",
199 value: function () {
200 var _runTest = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee2() {
201 var _ref4,
202 proxy,
203 testId,
204 test,
205 _ref4$force,
206 force,
207 props,
208 id,
209 res,
210 _args2 = arguments;
211 return _regenerator["default"].wrap(function _callee2$(_context2) {
212 while (1) switch (_context2.prev = _context2.next) {
213 case 0:
214 _ref4 = _args2.length > 0 && _args2[0] !== undefined ? _args2[0] : {}, proxy = _ref4.proxy, testId = _ref4.testId, test = _ref4.test, _ref4$force = _ref4.force, force = _ref4$force === void 0 ? false : _ref4$force, props = (0, _objectWithoutProperties2["default"])(_ref4, _excluded2);
215 if (!test && testId) {
216 // eslint-disable-next-line no-param-reassign
217 test = (0, _find["default"])(this.tests, {
218 id: testId
219 });
220 }
221 id = getId({
222 proxy: proxy,
223 test: test
224 });
225 res = this.getCache(id);
226 if (!(res && !force)) {
227 _context2.next = 6;
228 break;
229 }
230 return _context2.abrupt("return", res);
231 case 6:
232 _context2.next = 8;
233 return this.execTest(_objectSpread({
234 id: id,
235 proxy: proxy,
236 test: test
237 }, props));
238 case 8:
239 res = _context2.sent;
240 // this.log.trace('[runTest]', res)
241 this.setCache(res);
242 return _context2.abrupt("return", res);
243 case 11:
244 case "end":
245 return _context2.stop();
246 }
247 }, _callee2, this);
248 }));
249 function runTest() {
250 return _runTest.apply(this, arguments);
251 }
252 return runTest;
253 }()
254 }, {
255 key: "getProxyStats",
256 value: function getProxyStats(proxyList) {
257 if (!proxyList) return this.cache.proxyStats;
258 var proxyKeys = proxyList.map(function (proxy) {
259 return proxy.key;
260 });
261 return (0, _pick["default"])(this.cache.proxyStats, proxyKeys);
262 }
263 }, {
264 key: "runTests",
265 value: function () {
266 var _runTests = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee3(proxyList) {
267 var _this3 = this;
268 var _ref5,
269 _ref5$force,
270 force,
271 concurrency,
272 stats,
273 res,
274 _args3 = arguments;
275 return _regenerator["default"].wrap(function _callee3$(_context3) {
276 while (1) switch (_context3.prev = _context3.next) {
277 case 0:
278 _ref5 = _args3.length > 1 && _args3[1] !== undefined ? _args3[1] : {}, _ref5$force = _ref5.force, force = _ref5$force === void 0 ? false : _ref5$force;
279 concurrency = this.config.concurrency;
280 _context3.next = 4;
281 return this.app.module('stats');
282 case 4:
283 stats = _context3.sent;
284 stats.startTimer();
285 // this.log.trace('[runTests] start');
286 _context3.next = 8;
287 return _bluebird["default"].map((0, _shuffle["default"])(proxyList), function (proxy) {
288 return _bluebird["default"].map((0, _shuffle["default"])(_this3.tests), function (test) {
289 return _this3.runTest({
290 proxy: proxy,
291 test: test,
292 force: force
293 });
294 }, {
295 concurrency: 1
296 });
297 }, {
298 concurrency: concurrency
299 });
300 case 8:
301 res = _context3.sent;
302 stats.stopTimer();
303 // this.log.debug('[runTests]', res);
304 return _context3.abrupt("return", (0, _flatten["default"])(res));
305 case 11:
306 case "end":
307 return _context3.stop();
308 }
309 }, _callee3, this);
310 }));
311 function runTests(_x) {
312 return _runTests.apply(this, arguments);
313 }
314 return runTests;
315 }()
316 }]);
317 return ProxyTests;
318}(_module["default"]);
319exports.ProxyTests = ProxyTests;
320var _default = ProxyTests;
321exports["default"] = _default;
322//# sourceMappingURL=ProxyTests.js.map
\No newline at end of file