UNPKG

redux-saga-restart

Version:

Restart your failed sagas and report errors into logs

130 lines (100 loc) 3.79 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); var _regenerator = require('babel-runtime/regenerator'); var _regenerator2 = _interopRequireDefault(_regenerator); var _effects = require('redux-saga/effects'); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var RESTART = '@@saga/RESTART'; var FAIL = '@@saga/FAIL'; var warn = function warn(disableWarnings, warning) { if (!disableWarnings) { // eslint-disable-next-line no-console console.warn(warning); } }; exports.default = function (saga) { var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}, _ref$defaultBehavior = _ref.defaultBehavior, defaultBehavior = _ref$defaultBehavior === undefined ? RESTART : _ref$defaultBehavior, _ref$disableWarnings = _ref.disableWarnings, disableWarnings = _ref$disableWarnings === undefined ? false : _ref$disableWarnings, _ref$maxAttempts = _ref.maxAttempts, maxAttempts = _ref$maxAttempts === undefined ? 3 : _ref$maxAttempts, onEachError = _ref.onEachError, onFail = _ref.onFail; var attempts = 0; var lastError = null; return (/*#__PURE__*/_regenerator2.default.mark(function restart() { for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } var shouldStop, nextAction, getNextAction, result; return _regenerator2.default.wrap(function restart$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: if (!(attempts < maxAttempts)) { _context.next = 23; break; } _context.prev = 1; _context.next = 4; return _effects.call.apply(undefined, [saga].concat(args)); case 4: _context.next = 21; break; case 6: _context.prev = 6; _context.t0 = _context['catch'](1); lastError = _context.t0; shouldStop = false; if (!(typeof onEachError === 'function')) { _context.next = 17; break; } nextAction = void 0; getNextAction = function getNextAction(action) { nextAction = action; }; _context.next = 15; return (0, _effects.call)(onEachError, getNextAction, _context.t0, saga.name, attempts); case 15: result = nextAction || defaultBehavior; shouldStop = result === FAIL; case 17: if (!shouldStop) { _context.next = 19; break; } return _context.abrupt('break', 23); case 19: attempts += 1; warn(disableWarnings, 'Restarting ' + saga.name + ' because of error'); case 21: _context.next = 0; break; case 23: if (!(typeof onFail === 'function')) { _context.next = 28; break; } _context.next = 26; return onFail(lastError, saga.name, attempts); case 26: _context.next = 29; break; case 28: if (!disableWarnings) { warn(disableWarnings, 'Saga ' + saga.name + ' failed after ' + attempts + '/' + maxAttempts + ' attempts without any onFail handler'); } case 29: case 'end': return _context.stop(); } } }, restart, this, [[1, 6]]); }) ); };