UNPKG

@yhiot/utils

Version:
207 lines (166 loc) 6.28 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator")); var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator")); var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _kue = _interopRequireDefault(require("kue")); var _debug2 = _interopRequireDefault(require("debug")); var debug = (0, _debug2.default)('app:jobQueue'); /** * 事务队列,将事务按顺序执行 */ var JobQueue = function JobQueue(opts) { var _this = this; (0, _classCallCheck2.default)(this, JobQueue); (0, _defineProperty2.default)(this, "defActionFunction", /*#__PURE__*/function () { var _ref = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee(job, done) { var func, result; return _regenerator.default.wrap(function _callee$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: if (!(!job || !job.id)) { _context.next = 3; break; } debug('error! job should not null!'); return _context.abrupt("return"); case 3: _context.prev = 3; func = _this.jobMap[job.id]; if (!func) { _context.next = 13; break; } _context.next = 8; return func(job.data); case 8: result = _context.sent; delete _this.jobMap[job.id]; debug("job(job.id) result=".concat(result)); _context.next = 14; break; case 13: debug('warning! not get func of job.id=' + job.id); case 14: done(); _context.next = 21; break; case 17: _context.prev = 17; _context.t0 = _context["catch"](3); debug('error! queue.process:', _context.t0); done(_context.t0); case 21: case "end": return _context.stop(); } } }, _callee, null, [[3, 17]]); })); return function (_x, _x2) { return _ref.apply(this, arguments); }; }()); (0, _defineProperty2.default)(this, "defActionFunctionV2", /*#__PURE__*/function () { var _ref2 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee2(job) { var func, result; return _regenerator.default.wrap(function _callee2$(_context2) { while (1) { switch (_context2.prev = _context2.next) { case 0: if (!(!job || !job.id)) { _context2.next = 2; break; } return _context2.abrupt("return", Promise.reject(new Error('error! job & job.id should not null!'))); case 2: _context2.prev = 2; func = _this.jobMap[job.id]; if (!func) { _context2.next = 14; break; } _context2.next = 7; return func(job.data); case 7: result = _context2.sent; delete _this.jobMap[job.id]; _context2.next = 11; return Promise.resolve(result); case 11: return _context2.abrupt("return", _context2.sent); case 14: return _context2.abrupt("return", Promise.reject(new Error('warning! not get func of job.id=' + job.id))); case 15: _context2.next = 21; break; case 17: _context2.prev = 17; _context2.t0 = _context2["catch"](2); debug('defActionFunctionV2: catch error!', _context2.t0); return _context2.abrupt("return", Promise.reject(_context2.t0)); case 21: case "end": return _context2.stop(); } } }, _callee2, null, [[2, 17]]); })); return function (_x3) { return _ref2.apply(this, arguments); }; }()); (0, _defineProperty2.default)(this, "init", function () { debug('kue init start'); _this.actionMap = {}; _this.jobMap = {}; _this.queue = _kue.default.createQueue(_this.opts); _this.queue.on('error', function (err) { debug('kue error: ', err); // this.init(); }); process.once('SIGTERM', function (sig) { _this.queue.shutdown(1000, function (err) { debug("kue shutdown sig-".concat(sig, ": "), err); }); }); _kue.default.prototype.processAsync = function (name, handler) { return _this.queue.process(name, function (job, done) { return handler(job).then(function () { return done(null); }).catch(done); }); }; _this.queue.processAsync(_this.actionName, _this.defActionFunctionV2); debug('kue init end'); }); (0, _defineProperty2.default)(this, "addJob", function (actionFunc, data) { return new Promise(function (resolve, reject) { if (!actionFunc) { reject(new Error('error! parameter missing! actionFunc=' + actionFunc + ', data=' + data)); } var msDelay = data && data.delay || 0; var job = _this.queue.create(_this.actionName, data).delay(msDelay).removeOnComplete(true).save(function (err) { if (!err) { debug('create job.id=' + job.id); _this.jobMap[job.id] = actionFunc; debug('updated jobMap:', _this.jobMap); resolve(job); } else { debug('error! create fail! data=', data); reject(err); } }); }); }); this.opts = opts; // this.defActionFunction = this.defActionFunction.bind(this); // this.addJob = this.addJob.bind(this); this.actionName = 'DEFAULT_ACTION'; this.init(); }; exports.default = JobQueue;