UNPKG

17.2 kBJavaScriptView Raw
1"use strict";
2
3var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4Object.defineProperty(exports, "__esModule", {
5 value: true
6});
7exports["default"] = exports.apmMock = exports.WorkerJob = void 0;
8var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
9var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
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 _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
17var _env = require("@lskjs/env");
18var _err = _interopRequireDefault(require("@lskjs/err"));
19var _module = _interopRequireDefault(require("@lskjs/module"));
20function 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; }
21function _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; }
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; } }
24// , { IModule, IModuleWithApp }
25
26var apmMock = {
27 startTransaction: function startTransaction() {
28 return {
29 end: function end() {
30 return null;
31 },
32 startSpan: function startSpan() {
33 return {
34 end: function end() {
35 return null;
36 }
37 };
38 },
39 addLabels: function addLabels() {
40 return null;
41 },
42 setLabel: function setLabel() {
43 return null;
44 }
45 };
46 },
47 captureError: function captureError() {
48 return (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee() {
49 return _regenerator["default"].wrap(function _callee$(_context) {
50 while (1) switch (_context.prev = _context.next) {
51 case 0:
52 return _context.abrupt("return", null);
53 case 1:
54 case "end":
55 return _context.stop();
56 }
57 }, _callee);
58 }))();
59 },
60 setCustomContext: function setCustomContext() {
61 return null;
62 },
63 setLabel: function setLabel() {
64 return null;
65 },
66 addLabels: function addLabels() {
67 return null;
68 }
69};
70
71// export interface IRabbitWorker extends IModule {
72// name?: string;
73// stats?: any;
74// }
75// export interface IWorkerJob extends IModule {
76// worker?: IRabbitWorker;
77// stats?: any;
78// startedAt: Date,
79// tx: any,
80// }
81
82// implements IWorkerJob
83exports.apmMock = apmMock;
84var WorkerJob = /*#__PURE__*/function (_Module) {
85 (0, _inherits2["default"])(WorkerJob, _Module);
86 var _super = _createSuper(WorkerJob);
87 function WorkerJob() {
88 var _this;
89 (0, _classCallCheck2["default"])(this, WorkerJob);
90 for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
91 args[_key] = arguments[_key];
92 }
93 _this = _super.call.apply(_super, [this].concat(args));
94 _this.__worker = true;
95 _this.redeliveredCount = _env.isDev ? null : 10;
96 return _this;
97 }
98 (0, _createClass2["default"])(WorkerJob, [{
99 key: "_run",
100 value: function () {
101 var _run2 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee2() {
102 return _regenerator["default"].wrap(function _callee2$(_context2) {
103 while (1) switch (_context2.prev = _context2.next) {
104 case 0:
105 if (this.__lifecycle.runStart) {
106 _context2.next = 2;
107 break;
108 }
109 throw new _err["default"]('MODULE_INVALID_LIVECYCLE_RUN', 'use module.__run() instead module.run()', {
110 data: {
111 name: this.name
112 }
113 });
114 case 2:
115 _context2.next = 4;
116 return this.run();
117 case 4:
118 case "end":
119 return _context2.stop();
120 }
121 }, _callee2, this);
122 }));
123 function _run() {
124 return _run2.apply(this, arguments);
125 }
126 return _run;
127 }()
128 }, {
129 key: "init",
130 value: function () {
131 var _init = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee3() {
132 var apm;
133 return _regenerator["default"].wrap(function _callee3$(_context3) {
134 while (1) switch (_context3.prev = _context3.next) {
135 case 0:
136 _context3.next = 2;
137 return (0, _get2["default"])((0, _getPrototypeOf2["default"])(WorkerJob.prototype), "init", this).call(this);
138 case 2:
139 if (this.worker) this.stats = this.worker.stats;
140 this.startedAt = new Date();
141 if (!this.app.hasModule('apm')) {
142 _context3.next = 8;
143 break;
144 }
145 _context3.next = 7;
146 return this.app.module('apm', {
147 "throw": false
148 });
149 case 7:
150 apm = _context3.sent;
151 case 8:
152 if (!apm) apm = apmMock;
153 this.tx = apm.startTransaction(this.name, 'job');
154 case 10:
155 case "end":
156 return _context3.stop();
157 }
158 }, _callee3, this);
159 }));
160 function init() {
161 return _init.apply(this, arguments);
162 }
163 return init;
164 }()
165 }, {
166 key: "getQueueMeta",
167 value: function getQueueMeta() {
168 return {
169 __meta: _objectSpread({
170 __name: this.name,
171 __date: Date.now()
172 }, this.params)
173 };
174 }
175 }, {
176 key: "isTooMuchRedelivered",
177 value: function isTooMuchRedelivered() {
178 if (!this.msg) return false;
179 if (!this.redeliveredCount) return false;
180 return this.msg.fields.redelivered && this.msg.fields.deliveryTag > this.redeliveredCount;
181 }
182 }, {
183 key: "success",
184 value: function success(res) {
185 return this.result(res);
186 }
187 }, {
188 key: "error",
189 value: function error(res) {
190 return this.result(res);
191 }
192 }, {
193 key: "result",
194 value: function result(res) {
195 this.data = res;
196 return res;
197 }
198 }, {
199 key: "onSuccess",
200 value: function () {
201 var _onSuccess = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee4() {
202 return _regenerator["default"].wrap(function _callee4$(_context4) {
203 while (1) switch (_context4.prev = _context4.next) {
204 case 0:
205 this.finishedAt = new Date();
206 if (this.stats) this.stats.trigger({
207 event: 'success',
208 startedAt: this.startedAt
209 });
210 if (!this.tx) {
211 _context4.next = 6;
212 break;
213 }
214 this.tx.result = 'success';
215 _context4.next = 6;
216 return this.tx.end();
217 case 6:
218 case "end":
219 return _context4.stop();
220 }
221 }, _callee4, this);
222 }));
223 function onSuccess() {
224 return _onSuccess.apply(this, arguments);
225 }
226 return onSuccess;
227 }()
228 }, {
229 key: "onAckError",
230 value: function () {
231 var _onAckError = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee5(err) {
232 return _regenerator["default"].wrap(function _callee5$(_context5) {
233 while (1) switch (_context5.prev = _context5.next) {
234 case 0:
235 this.err = err;
236 this.finishedAt = new Date();
237 if (this.stats) this.stats.trigger({
238 event: 'skip',
239 startedAt: this.startedAt
240 });
241 if (!this.tx) {
242 _context5.next = 7;
243 break;
244 }
245 this.tx.result = 'skip';
246 _context5.next = 7;
247 return this.tx.end();
248 case 7:
249 case "end":
250 return _context5.stop();
251 }
252 }, _callee5, this);
253 }));
254 function onAckError(_x) {
255 return _onAckError.apply(this, arguments);
256 }
257 return onAckError;
258 }()
259 }, {
260 key: "onError",
261 value: function () {
262 var _onError = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee6(err) {
263 return _regenerator["default"].wrap(function _callee6$(_context6) {
264 while (1) switch (_context6.prev = _context6.next) {
265 case 0:
266 this.err = err;
267 this.finishedAt = new Date();
268 if (this.stats) this.stats.trigger({
269 event: 'error',
270 startedAt: this.startedAt
271 });
272 if (!this.tx) {
273 _context6.next = 7;
274 break;
275 }
276 // await this.apm.client.captureError(err);
277 this.tx.result = 'error';
278 _context6.next = 7;
279 return this.tx.end();
280 case 7:
281 case "end":
282 return _context6.stop();
283 }
284 }, _callee6, this);
285 }));
286 function onError(_x2) {
287 return _onError.apply(this, arguments);
288 }
289 return onError;
290 }()
291 }, {
292 key: "setStatus",
293 value: function setStatus(status) {
294 this.status = status;
295 return status;
296 }
297
298 /**
299 * Когда всё хорошо
300 */
301 }, {
302 key: "ackSuccess",
303 value: function () {
304 var _ackSuccess = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee7() {
305 return _regenerator["default"].wrap(function _callee7$(_context7) {
306 while (1) switch (_context7.prev = _context7.next) {
307 case 0:
308 if (!this.status) {
309 _context7.next = 3;
310 break;
311 }
312 this.log.warn('ackSuccess ignore because has status');
313 return _context7.abrupt("return", this.status);
314 case 3:
315 _context7.next = 5;
316 return this.onSuccess();
317 case 5:
318 if (this.debug) this.log.trace('[ack]');
319 if (!this.msg) {
320 _context7.next = 9;
321 break;
322 }
323 _context7.next = 9;
324 return this.client.ack(this.msg);
325 case 9:
326 return _context7.abrupt("return", this.setStatus({
327 status: 'success',
328 action: 'ack'
329 }));
330 case 10:
331 case "end":
332 return _context7.stop();
333 }
334 }, _callee7, this);
335 }));
336 function ackSuccess() {
337 return _ackSuccess.apply(this, arguments);
338 }
339 return ackSuccess;
340 }()
341 /**
342 * Когда всё плохо
343 */
344 }, {
345 key: "nackError",
346 value: function () {
347 var _nackError = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee8(err) {
348 return _regenerator["default"].wrap(function _callee8$(_context8) {
349 while (1) switch (_context8.prev = _context8.next) {
350 case 0:
351 if (!this.status) {
352 _context8.next = 3;
353 break;
354 }
355 this.log.warn('nackError ignore because has status');
356 return _context8.abrupt("return", this.status);
357 case 3:
358 _context8.next = 5;
359 return this.onError(err);
360 case 5:
361 // if (this.debug) this.log.error(`rabbit.nack [${Err.getCode(err)}]`, this.params);
362 if (this.debug) this.log.error("[nack] ".concat(_err["default"].getCode(err)));
363 // if (this.msg && this.worker.consumerTag === this.msg.fields.consumerTag) {
364 if (!this.msg) {
365 _context8.next = 9;
366 break;
367 }
368 _context8.next = 9;
369 return this.client.nack(this.msg, {
370 requeue: true
371 });
372 case 9:
373 return _context8.abrupt("return", this.setStatus({
374 status: 'error',
375 action: 'nack'
376 }));
377 case 10:
378 case "end":
379 return _context8.stop();
380 }
381 }, _callee8, this);
382 }));
383 function nackError(_x3) {
384 return _nackError.apply(this, arguments);
385 }
386 return nackError;
387 }()
388 /**
389 * Когда ошибка заебала, и больше это сообщение не нужно в очереди (например при множественно redelivered)
390 */
391 }, {
392 key: "ackError",
393 value: function () {
394 var _ackError = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee9(err) {
395 return _regenerator["default"].wrap(function _callee9$(_context9) {
396 while (1) switch (_context9.prev = _context9.next) {
397 case 0:
398 if (!this.status) {
399 _context9.next = 3;
400 break;
401 }
402 this.log.warn('ackError ignore because has status');
403 return _context9.abrupt("return", this.status);
404 case 3:
405 _context9.next = 5;
406 return this.onAckError(err);
407 case 5:
408 if (this.debug) this.log.trace("[ackError] ".concat(_err["default"].getCode(err)));
409 if (!this.msg) {
410 _context9.next = 9;
411 break;
412 }
413 _context9.next = 9;
414 return this.client.nack(this.msg, {
415 requeue: false
416 });
417 case 9:
418 return _context9.abrupt("return", this.setStatus({
419 status: 'error',
420 action: 'nack',
421 requeue: false
422 }));
423 case 10:
424 case "end":
425 return _context9.stop();
426 }
427 }, _callee9, this);
428 }));
429 function ackError(_x4) {
430 return _ackError.apply(this, arguments);
431 }
432 return ackError;
433 }()
434 /**
435 * Хз когда эта хрень нужна, просто добавил для консистентности
436 * напишу throw, если вдруг кому-то реально понадобится -- пинганите меня
437 * @isuvorov
438 */
439 }, {
440 key: "nackSuccess",
441 value: function () {
442 var _nackSuccess = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee10() {
443 return _regenerator["default"].wrap(function _callee10$(_context10) {
444 while (1) switch (_context10.prev = _context10.next) {
445 case 0:
446 throw new _err["default"]('ХЗ КОМУ ЭТА ХРЕНЬ НУЖНА, ПИНГАНИТЕ МЕНЯ');
447 case 1:
448 case "end":
449 return _context10.stop();
450 }
451 }, _callee10);
452 }));
453 function nackSuccess() {
454 return _nackSuccess.apply(this, arguments);
455 }
456 return nackSuccess;
457 }()
458 }]);
459 return WorkerJob;
460}(_module["default"]);
461exports.WorkerJob = WorkerJob;
462WorkerJob.__worker = true;
463var _default = WorkerJob;
464exports["default"] = _default;
465//# sourceMappingURL=WorkerJob.js.map
\No newline at end of file