UNPKG

26.8 kBJavaScriptView Raw
1"use strict";
2
3var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4Object.defineProperty(exports, "__esModule", {
5 value: true
6});
7exports["default"] = exports.Worker = void 0;
8var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
9var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
10var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
11var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
12var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
13var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
14var _get2 = _interopRequireDefault(require("@babel/runtime/helpers/get"));
15var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
16var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));
17var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
18var _err = _interopRequireDefault(require("@lskjs/err"));
19var _module = _interopRequireDefault(require("@lskjs/module"));
20var _stats = _interopRequireDefault(require("@lskjs/stats"));
21var _env = require("@lskjs/utils/env");
22var _tryJSONparse = _interopRequireDefault(require("@lskjs/utils/tryJSONparse"));
23var _bluebird = _interopRequireDefault(require("bluebird"));
24var _get3 = _interopRequireDefault(require("lodash/get"));
25var _pick = _interopRequireDefault(require("lodash/pick"));
26var _createTelegramMessage = require("./utils/createTelegramMessage");
27function 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; }
28function _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; }
29function _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); }; }
30function _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; } }
31var Worker = /*#__PURE__*/function (_Module) {
32 (0, _inherits2["default"])(Worker, _Module);
33 var _super = _createSuper(Worker);
34 function Worker() {
35 var _this;
36 (0, _classCallCheck2["default"])(this, Worker);
37 for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
38 args[_key] = arguments[_key];
39 }
40 _this = _super.call.apply(_super, [this].concat(args));
41 _this.__worker = true;
42 return _this;
43 }
44 (0, _createClass2["default"])(Worker, [{
45 key: "showErrorInfo",
46 value: function showErrorInfo() {
47 return false; // // this.debug
48 }
49 }, {
50 key: "getConfig",
51 value: function () {
52 var _getConfig = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee() {
53 return _regenerator["default"].wrap(function _callee$(_context) {
54 while (1) switch (_context.prev = _context.next) {
55 case 0:
56 _context.t0 = _objectSpread;
57 _context.t1 = {
58 autoconnect: true
59 };
60 _context.next = 4;
61 return (0, _get2["default"])((0, _getPrototypeOf2["default"])(Worker.prototype), "getConfig", this).call(this);
62 case 4:
63 _context.t2 = _context.sent;
64 return _context.abrupt("return", (0, _context.t0)(_context.t1, _context.t2));
65 case 6:
66 case "end":
67 return _context.stop();
68 }
69 }, _callee, this);
70 }));
71 function getConfig() {
72 return _getConfig.apply(this, arguments);
73 }
74 return getConfig;
75 }()
76 }, {
77 key: "getJobConfig",
78 value: function () {
79 var _getJobConfig = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee2() {
80 var _this$config, _this$config2, _this$config2$log;
81 var mConfig, res;
82 return _regenerator["default"].wrap(function _callee2$(_context2) {
83 while (1) switch (_context2.prev = _context2.next) {
84 case 0:
85 _context2.next = 2;
86 return this.getModuleConfig('job');
87 case 2:
88 mConfig = _context2.sent;
89 res = _objectSpread(_objectSpread(_objectSpread({}, mConfig || {}), this.config || {}), {}, {
90 log: _objectSpread(_objectSpread(_objectSpread({}, (mConfig === null || mConfig === void 0 ? void 0 : mConfig.log) || {}), ((_this$config = this.config) === null || _this$config === void 0 ? void 0 : _this$config.log) || {}), {}, {
91 ns: [(_this$config2 = this.config) === null || _this$config2 === void 0 ? void 0 : (_this$config2$log = _this$config2.log) === null || _this$config2$log === void 0 ? void 0 : _this$config2$log.ns, 'job'].filter(Boolean).join('.')
92 })
93 });
94 return _context2.abrupt("return", res);
95 case 5:
96 case "end":
97 return _context2.stop();
98 }
99 }, _callee2, this);
100 }));
101 function getJobConfig() {
102 return _getJobConfig.apply(this, arguments);
103 }
104 return getJobConfig;
105 }()
106 }, {
107 key: "parse",
108 value: function () {
109 var _parse = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee3() {
110 return _regenerator["default"].wrap(function _callee3$(_context3) {
111 while (1) switch (_context3.prev = _context3.next) {
112 case 0:
113 throw new _err["default"]('NOT_IMPLEMENTED', 'not implemented worker.parse()');
114 case 1:
115 case "end":
116 return _context3.stop();
117 }
118 }, _callee3);
119 }));
120 function parse() {
121 return _parse.apply(this, arguments);
122 }
123 return parse;
124 }()
125 }, {
126 key: "onTelegramError",
127 value: function () {
128 var _onTelegramError = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee4(_ref) {
129 var err, job, rlog;
130 return _regenerator["default"].wrap(function _callee4$(_context4) {
131 while (1) switch (_context4.prev = _context4.next) {
132 case 0:
133 err = _ref.err, job = _ref.job;
134 if (!this.app.hasModule('rlog')) {
135 _context4.next = 6;
136 break;
137 }
138 _context4.next = 4;
139 return this.app.module('rlog');
140 case 4:
141 rlog = _context4.sent;
142 rlog.error((0, _createTelegramMessage.createTelegramMessage)({
143 name: this.name,
144 err: err,
145 job: job
146 }));
147 case 6:
148 case "end":
149 return _context4.stop();
150 }
151 }, _callee4, this);
152 }));
153 function onTelegramError(_x) {
154 return _onTelegramError.apply(this, arguments);
155 }
156 return onTelegramError;
157 }()
158 }, {
159 key: "onConsume",
160 value: function () {
161 var _onConsume = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee5(msg) {
162 var params, job;
163 return _regenerator["default"].wrap(function _callee5$(_context5) {
164 while (1) switch (_context5.prev = _context5.next) {
165 case 0:
166 if (this.showErrorInfo()) this.log.trace('[onConsume] start', msg);
167 this.stats.print({
168 log: this.log.info.bind(this.log),
169 successKey: 'event.success',
170 unsuccessKey: 'event.error'
171 });
172 if (!(msg === null)) {
173 _context5.next = 4;
174 break;
175 }
176 return _context5.abrupt("return");
177 case 4:
178 _context5.prev = 4;
179 params = this.getMsgData(msg, 'content');
180 _context5.next = 14;
181 break;
182 case 8:
183 _context5.prev = 8;
184 _context5.t0 = _context5["catch"](4);
185 _context5.next = 12;
186 return this.client.nack(msg, {
187 requeue: false
188 });
189 case 12:
190 if (this.showErrorInfo()) this.log.error('[onConsume] !content');
191 return _context5.abrupt("return");
192 case 14:
193 _context5.next = 16;
194 return this.createJob({
195 msg: msg,
196 params: params
197 });
198 case 16:
199 job = _context5.sent;
200 _context5.prev = 17;
201 if (this.showErrorInfo()) this.log.trace('[onConsume] job.start()');
202 _context5.next = 21;
203 return job.start();
204 case 21:
205 if (this.showErrorInfo()) this.log.trace('[onConsume] job.start() finished');
206 if (job.status) {
207 _context5.next = 25;
208 break;
209 }
210 _context5.next = 25;
211 return job.ackSuccess();
212 case 25:
213 _context5.next = 38;
214 break;
215 case 27:
216 _context5.prev = 27;
217 _context5.t1 = _context5["catch"](17);
218 _context5.prev = 29;
219 if (this.showErrorInfo()) this.log.trace('[onConsume] onConsumeError');
220 _context5.next = 33;
221 return this.onConsumeError(_context5.t1, {
222 job: job,
223 msg: msg
224 });
225 case 33:
226 _context5.next = 38;
227 break;
228 case 35:
229 _context5.prev = 35;
230 _context5.t2 = _context5["catch"](29);
231 if (this.showErrorInfo()) this.log.error('[onConsume] onConsumeError err', _context5.t2);
232 case 38:
233 if (this.showErrorInfo()) this.log.trace('[onConsume] finish');
234 case 39:
235 case "end":
236 return _context5.stop();
237 }
238 }, _callee5, this, [[4, 8], [17, 27], [29, 35]]);
239 }));
240 function onConsume(_x2) {
241 return _onConsume.apply(this, arguments);
242 }
243 return onConsume;
244 }()
245 }, {
246 key: "onConsumeError",
247 value: function () {
248 var _onConsumeError = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee7(error, _ref2) {
249 var _this2 = this;
250 var job, err, errorParams, _ref3, _ref3$delay, delay, errInfo, isApm, isNack, isTelegram, log, timeout, doTimeout, _this$log, code, message, apm, fromQueue, queue;
251 return _regenerator["default"].wrap(function _callee7$(_context7) {
252 while (1) switch (_context7.prev = _context7.next) {
253 case 0:
254 job = _ref2.job;
255 if (this.showErrorInfo()) {
256 this.log.error('-----------\n', error, '\n-----------'); // eslint-disable-line no-console
257 this.log.error('-----------\n', error.stack, '\n-----------'); // eslint-disable-line no-console
258 }
259 _context7.prev = 2;
260 errorParams = (0, _pick["default"])(error, 'nack', 'es', 'telegram', 'log');
261 err = new _err["default"](error, errorParams);
262 _ref3 = this.config.options || {}, _ref3$delay = _ref3.delay, delay = _ref3$delay === void 0 ? _env.isDev ? 10000 : 0 : _ref3$delay;
263 if (!delay) {
264 _context7.next = 10;
265 break;
266 }
267 this.log.warn('[delay] 10000');
268 _context7.next = 10;
269 return _bluebird["default"].delay(10000);
270 case 10:
271 _context7.next = 15;
272 break;
273 case 12:
274 _context7.prev = 12;
275 _context7.t0 = _context7["catch"](2);
276 this.log.error('error while onError', _context7.t0);
277 case 15:
278 if (job) {
279 _context7.next = 17;
280 break;
281 }
282 return _context7.abrupt("return");
283 case 17:
284 errInfo = this.app && this.app.getErrorInfo ? this.app.getErrorInfo(err) : {};
285 if (this.showErrorInfo()) this.log.trace('onConsumeError errInfo', errInfo);
286 isApm = (0, _get3["default"])(errInfo, 'apm', true);
287 isNack = (0, _get3["default"])(errInfo, 'nack', true);
288 isTelegram = (0, _get3["default"])(errInfo, 'telegram', true);
289 log = (0, _get3["default"])(errInfo, 'log', 'error');
290 timeout = errInfo.timeout || (0, _tryJSONparse["default"])(process.env.AMQP_ERROR_TIMEOUT) || (0, _tryJSONparse["default"])(process.env.ERROR_TIMEOUT);
291 doTimeout = /*#__PURE__*/function () {
292 var _ref4 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee6() {
293 return _regenerator["default"].wrap(function _callee6$(_context6) {
294 while (1) switch (_context6.prev = _context6.next) {
295 case 0:
296 if (!timeout) {
297 _context6.next = 4;
298 break;
299 }
300 _this2.log.trace('[err.timeout]', timeout, '[delay]');
301 _context6.next = 4;
302 return _bluebird["default"].delay(timeout);
303 case 4:
304 case "end":
305 return _context6.stop();
306 }
307 }, _callee6);
308 }));
309 return function doTimeout() {
310 return _ref4.apply(this, arguments);
311 };
312 }();
313 if (log && this.log[log]) {
314 code = _err["default"].getCode(err);
315 //= Err.getMessage(err);
316 if (code === message) message = null;
317 (_this$log = this.log)[log].apply(_this$log, (0, _toConsumableArray2["default"])([code, message].filter(Boolean)));
318 }
319 _context7.next = 28;
320 return doTimeout();
321 case 28:
322 if (isTelegram) {
323 this.onTelegramError({
324 err: err,
325 job: job
326 });
327 }
328 if (!(isApm && this.app.hasModule('apm'))) {
329 _context7.next = 34;
330 break;
331 }
332 _context7.next = 32;
333 return this.app.module('apm');
334 case 32:
335 apm = _context7.sent;
336 try {
337 apm.captureError(err);
338 } catch (apmErr) {
339 this.log.error('apm.captureError', apmErr);
340 }
341 case 34:
342 if (isNack) {
343 _context7.next = 39;
344 break;
345 }
346 if (this.showErrorInfo()) console.error('err4', err); // eslint-disable-line no-console
347 _context7.next = 38;
348 return job.ackError(err);
349 case 38:
350 return _context7.abrupt("return");
351 case 39:
352 if (!(errInfo.redelivered && job.isTooMuchRedelivered && job.isTooMuchRedelivered())) {
353 _context7.next = 49;
354 break;
355 }
356 fromQueue = this.getQueue();
357 queue = "".concat(fromQueue, "_redelivered");
358 if (!this.sendToRedelivered) {
359 _context7.next = 45;
360 break;
361 }
362 _context7.next = 45;
363 return this.sendToRedelivered(job, queue, {
364 err: err,
365 fromQueue: fromQueue
366 });
367 case 45:
368 if (this.showErrorInfo()) console.error('err2', err); // eslint-disable-line no-console
369 _context7.next = 48;
370 return job.ackError(err);
371 case 48:
372 return _context7.abrupt("return");
373 case 49:
374 if (this.showErrorInfo()) console.error('err3', err); // eslint-disable-line no-console
375 _context7.next = 52;
376 return job.nackError(err);
377 case 52:
378 case "end":
379 return _context7.stop();
380 }
381 }, _callee7, this, [[2, 12]]);
382 }));
383 function onConsumeError(_x3, _x4) {
384 return _onConsumeError.apply(this, arguments);
385 }
386 return onConsumeError;
387 }()
388 }, {
389 key: "initStats",
390 value: function () {
391 var _initStats = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee8() {
392 var statsProps;
393 return _regenerator["default"].wrap(function _callee8$(_context8) {
394 while (1) switch (_context8.prev = _context8.next) {
395 case 0:
396 statsProps = {};
397 statsProps.debug = this.log.trace.bind(this.log);
398 _context8.next = 4;
399 return _stats["default"].create(statsProps);
400 case 4:
401 this.stats = _context8.sent;
402 if (this.stats) this.stats.startTimer();
403 case 6:
404 case "end":
405 return _context8.stop();
406 }
407 }, _callee8, this);
408 }));
409 function initStats() {
410 return _initStats.apply(this, arguments);
411 }
412 return initStats;
413 }()
414 }, {
415 key: "getQueue",
416 value: function getQueue() {
417 return this.config.queue || this.queue || this.config.topic || this.topic;
418 }
419 }, {
420 key: "getMsgData",
421 value: function getMsgData(msg) {
422 try {
423 return JSON.parse(msg.toString());
424 } catch (err) {
425 var str = msg.toString();
426 if (_env.isDev) {
427 this.log.error('[ignore] cantParseJSON', str);
428 } else {
429 this.log.error('[ignore] cantParseJSON ');
430 this.onTelegramError({
431 err: 'cantParseJSON',
432 job: {
433 params: str
434 }
435 });
436 }
437 throw new _err["default"]('catntParseJSON', {
438 str: str
439 });
440 }
441 }
442 }, {
443 key: "getConsumerOptions",
444 value: function getConsumerOptions() {
445 return {};
446 }
447 }, {
448 key: "connect",
449 value: function () {
450 var _connect = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee9() {
451 var queue, onConsume;
452 return _regenerator["default"].wrap(function _callee9$(_context9) {
453 while (1) switch (_context9.prev = _context9.next) {
454 case 0:
455 _context9.next = 2;
456 return this.app.module(this.__broker);
457 case 2:
458 this.client = _context9.sent;
459 queue = this.getQueue();
460 if (queue) {
461 _context9.next = 7;
462 break;
463 }
464 this.log.warn('!queue || !topic');
465 return _context9.abrupt("return", null);
466 case 7:
467 onConsume = this.onConsume.bind(this);
468 _context9.next = 10;
469 return this.client.consume(queue, onConsume, this.getConsumerOptions());
470 case 10:
471 this.consumer = _context9.sent;
472 return _context9.abrupt("return", this.consumer);
473 case 12:
474 case "end":
475 return _context9.stop();
476 }
477 }, _callee9, this);
478 }));
479 function connect() {
480 return _connect.apply(this, arguments);
481 }
482 return connect;
483 }()
484 }, {
485 key: "run",
486 value: function () {
487 var _run = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee10() {
488 var queue;
489 return _regenerator["default"].wrap(function _callee10$(_context10) {
490 while (1) switch (_context10.prev = _context10.next) {
491 case 0:
492 _context10.next = 2;
493 return (0, _get2["default"])((0, _getPrototypeOf2["default"])(Worker.prototype), "run", this).call(this);
494 case 2:
495 queue = this.getQueue();
496 if (queue) {
497 _context10.next = 6;
498 break;
499 }
500 this.log.warn('!queue || !topic');
501 return _context10.abrupt("return");
502 case 6:
503 if (this.Job) {
504 _context10.next = 9;
505 break;
506 }
507 this.log.warn('!Job', this.Job);
508 return _context10.abrupt("return");
509 case 9:
510 if (!this.config.autoconnect) {
511 _context10.next = 15;
512 break;
513 }
514 this.log.debug('autoconnect');
515 _context10.next = 13;
516 return this.initStats();
517 case 13:
518 _context10.next = 15;
519 return this.connect();
520 case 15:
521 case "end":
522 return _context10.stop();
523 }
524 }, _callee10, this);
525 }));
526 function run() {
527 return _run.apply(this, arguments);
528 }
529 return run;
530 }()
531 }, {
532 key: "createJob",
533 value: function () {
534 var _createJob = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee11() {
535 var props,
536 mergedProps,
537 _args11 = arguments;
538 return _regenerator["default"].wrap(function _callee11$(_context11) {
539 while (1) switch (_context11.prev = _context11.next) {
540 case 0:
541 props = _args11.length > 0 && _args11[0] !== undefined ? _args11[0] : {};
542 _context11.t0 = _objectSpread;
543 _context11.t1 = new Date();
544 _context11.t2 = this;
545 _context11.t3 = this;
546 _context11.t4 = this.app;
547 _context11.next = 8;
548 return this.getJobConfig();
549 case 8:
550 _context11.t5 = _context11.sent;
551 _context11.t6 = {
552 '__lifecycle.create': _context11.t1,
553 worker: _context11.t2,
554 __parent: _context11.t3,
555 app: _context11.t4,
556 config: _context11.t5
557 };
558 _context11.t7 = props;
559 mergedProps = (0, _context11.t0)(_context11.t6, _context11.t7);
560 if (this.client) {
561 mergedProps.client = this.client;
562 if (this.__broker) mergedProps[this.__broker] = this.client;
563 }
564 return _context11.abrupt("return", this.Job["new"](mergedProps));
565 case 14:
566 case "end":
567 return _context11.stop();
568 }
569 }, _callee11, this);
570 }));
571 function createJob() {
572 return _createJob.apply(this, arguments);
573 }
574 return createJob;
575 }()
576 }, {
577 key: "process",
578 value: function () {
579 var _process = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee12(params) {
580 var props,
581 job,
582 _args12 = arguments;
583 return _regenerator["default"].wrap(function _callee12$(_context12) {
584 while (1) switch (_context12.prev = _context12.next) {
585 case 0:
586 props = _args12.length > 1 && _args12[1] !== undefined ? _args12[1] : {};
587 _context12.next = 3;
588 return this.createJob(_objectSpread(_objectSpread({}, props), {}, {
589 params: params
590 }));
591 case 3:
592 job = _context12.sent;
593 _context12.next = 6;
594 return job.start();
595 case 6:
596 return _context12.abrupt("return", _objectSpread(_objectSpread({
597 code: job.err ? _err["default"].getCode(job.err) : 0
598 }, job.getQueueMeta()), {}, {
599 startedAt: job.startedAt,
600 finishedAt: job.finishedAt,
601 runningTime: job.finishedAt ? job.finishedAt - job.startedAt : null,
602 status: job.status,
603 data: job.data,
604 err: job.err
605 }));
606 case 7:
607 case "end":
608 return _context12.stop();
609 }
610 }, _callee12, this);
611 }));
612 function process(_x5) {
613 return _process.apply(this, arguments);
614 }
615 return process;
616 }()
617 }, {
618 key: "stop",
619 value: function () {
620 var _stop = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee13() {
621 return _regenerator["default"].wrap(function _callee13$(_context13) {
622 while (1) switch (_context13.prev = _context13.next) {
623 case 0:
624 _context13.next = 2;
625 return (0, _get2["default"])((0, _getPrototypeOf2["default"])(Worker.prototype), "stop", this).call(this);
626 case 2:
627 return _context13.abrupt("return", this.client.stop());
628 case 3:
629 case "end":
630 return _context13.stop();
631 }
632 }, _callee13, this);
633 }));
634 function stop() {
635 return _stop.apply(this, arguments);
636 }
637 return stop;
638 }()
639 }]);
640 return Worker;
641}(_module["default"]);
642exports.Worker = Worker;
643Worker.__worker = true;
644var _default = Worker;
645exports["default"] = _default;
646//# sourceMappingURL=Worker.js.map
\No newline at end of file