diff --git a/dist/redux-saga.js b/dist/redux-saga.js index b25535d9b..f52461aaa 100644 --- a/dist/redux-saga.js +++ b/dist/redux-saga.js @@ -466,7 +466,11 @@ return /******/ (function(modules) { // webpackBootstrap var buffer = arguments.length <= 1 || arguments[1] === undefined ? _buffers.buffers.none() : arguments[1]; var matcher = arguments[2]; - if (arguments.length > 1) (0, _utils.check)(matcher, _utils.is.func, 'Invalid match function passed to eventChannel'); + /** + should be if(typeof matcher !== undefined) instead? + see PR #273 for a background discussion + **/ + if (arguments.length > 2) (0, _utils.check)(matcher, _utils.is.func, 'Invalid match function passed to eventChannel'); var chan = channel(buffer); var unsubscribe = subscribe(function (input) { @@ -783,10 +787,10 @@ return /******/ (function(modules) { // webpackBootstrap fixed: function fixed(limit) { return arrBuffer(limit, ON_OVERFLOW_THROW); }, - drop: function drop(limit) { + dropping: function dropping(limit) { return arrBuffer(limit, ON_OVERFLOW_DROP); }, - slide: function slide(limit) { + sliding: function sliding(limit) { return arrBuffer(limit, ON_OVERFLOW_SLIDE); } }; @@ -800,7 +804,7 @@ return /******/ (function(modules) { // webpackBootstrap Object.defineProperty(exports, "__esModule", { value: true }); - exports.Never = exports.CANCEL = exports.NOT_ITERATOR_ERROR = undefined; + exports.TASK_CANCEL = exports.CHANNEL_END = exports.CANCEL = exports.NOT_ITERATOR_ERROR = undefined; exports.default = proc; var _utils = __webpack_require__(1); @@ -828,12 +832,16 @@ return /******/ (function(modules) { // webpackBootstrap var CANCEL = exports.CANCEL = (0, _utils.sym)('cancelPromise'); var nextEffectId = (0, _utils.autoInc)(); - var Never = exports.Never = { + var CHANNEL_END = exports.CHANNEL_END = { + toString: function toString() { + return '@@redux-saga/CHANNEL_END'; + } + }; + var TASK_CANCEL = exports.TASK_CANCEL = { toString: function toString() { - return '@@redux-saga/Never'; + return '@@redux-saga/TASK_CANCEL'; } }; - Object.freeze(Never); var matchers = { wildcard: function wildcard() { @@ -885,19 +893,19 @@ return /******/ (function(modules) { // webpackBootstrap function addTask(task) { tasks.push(task); - task.cont = function (err, res) { + task.cont = function (res, isErr) { if (completed) return; (0, _utils.remove)(tasks, task); task.cont = _utils.noop; - if (err) { + if (isErr) { cancelAll(); - cb(err); + cb(res, true); } else { if (task === mainTask) result = res; if (!tasks.length) { completed = true; - cb(null, result); + cb(result); } } }; @@ -964,7 +972,7 @@ return /******/ (function(modules) { // webpackBootstrap function cancelMain() { if (mainTask.isRunning && !mainTask.isCancelled) { mainTask.isCancelled = true; - next(null, Never); + next(TASK_CANCEL); } } @@ -986,7 +994,7 @@ return /******/ (function(modules) { // webpackBootstrap /** Ending with a Never result will propagate the Cancellation to all joiners **/ - end(null, Never); + end(TASK_CANCEL); } } /** @@ -1009,19 +1017,18 @@ return /******/ (function(modules) { // webpackBootstrap It's a recursive async/continuation function which calls itself until the generator terminates or throws **/ - function next(error, arg) { + function next(arg, isErr) { // Preventive measure. If we end up here, then there is really something wrong if (!mainTask.isRunning) throw new Error('Trying to resume an already finished generator'); try { var result = void 0; - if (error) result = iterator.throw(error);else if (arg === Never) { + if (isErr) result = iterator.throw(arg);else if (arg === TASK_CANCEL) { /** - getting Never autoamtically cancels the main task + getting TASK_CANCEL autoamtically cancels the main task We can get this value here - By cancelling the parent task manually - By joining a Cancelled task - - By taking from a channel that ended using `take` (and not `takem` used to trap End of channels) **/ mainTask.isCancelled = true; /** @@ -1032,7 +1039,10 @@ return /******/ (function(modules) { // webpackBootstrap If this Generator has a `return` method then invokes it Thill will jump to the finally block **/ - result = _utils.is.func(iterator.return) ? iterator.return(Never) : { done: true, value: Never }; + result = _utils.is.func(iterator.return) ? iterator.return(TASK_CANCEL) : { done: true, value: TASK_CANCEL }; + } else if (arg === CHANNEL_END) { + // We get CHANNEL_END by taking from a channel that ended using `take` (and not `takem` used to trap End of channels) + result = _utils.is.func(iterator.return) ? iterator.return() : { done: true }; } else result = iterator.next(arg); if (!result.done) { @@ -1042,31 +1052,32 @@ return /******/ (function(modules) { // webpackBootstrap This Generator has ended, terminate the main task and notify the fork queue **/ mainTask.isMainRunning = false; - mainTask.cont && mainTask.cont(null, result.value); + mainTask.cont && mainTask.cont(result.value); } } catch (error) { if (mainTask.isCancelled) (0, _utils.log)('error', 'uncaught at ' + name, error.message); mainTask.isMainRunning = false; - mainTask.cont(error); + mainTask.cont(error, true); } } - function end(error, result) { + function end(result, isErr) { iterator._isRunning = false; stdChannel.close(); - if (!error) { - if (result === Never && _utils.isDev) (0, _utils.log)('info', name + ' has been cancelled', ''); + if (!isErr) { + if (result === TASK_CANCEL && _utils.isDev) (0, _utils.log)('info', name + ' has been cancelled', ''); iterator._result = result; iterator._deferredEnd && iterator._deferredEnd.resolve(result); } else { - if (error instanceof Error) error.sagaStack = 'at ' + name + ' \n ' + (error.sagaStack || error.message); - if (!task.cont) (0, _utils.log)('error', 'uncaught', error.sagaStack || error.message); - iterator._error = error; - iterator._deferredEnd && iterator._deferredEnd.reject(error); + if (result instanceof Error) result.sagaStack = 'at ' + name + ' \n ' + (result.sagaStack || result.message); + if (!task.cont) (0, _utils.log)('error', 'uncaught', result.sagaStack || result.message); + iterator._error = result; + iterator._isAborted = true; + iterator._deferredEnd && iterator._deferredEnd.reject(result); } - task.cont && task.cont(error, result); + task.cont && task.cont(result, isErr); task.joiners.forEach(function (j) { - return j.cb(error, result); + return j.cb(result, isErr); }); task.joiners = null; } @@ -1086,16 +1097,16 @@ return /******/ (function(modules) { // webpackBootstrap var effectSettled = void 0; // Completion callback passed to the appropriate effect runner - function currCb(err, res) { + function currCb(res, isErr) { if (effectSettled) return; effectSettled = true; cb.cancel = _utils.noop; // defensive measure if (monitor) { - err ? monitor.effectRejected(effectId, err) : monitor.effectResolved(effectId, res); + isErr ? monitor.effectRejected(effectId, res) : monitor.effectResolved(effectId, res); } - cb(err, res); + cb(res, isErr); } // tracks down the current cancel currCb.cancel = _utils.noop; @@ -1139,7 +1150,7 @@ return /******/ (function(modules) { // webpackBootstrap _utils.is.promise(effect) ? resolvePromise(effect, currCb) : _utils.is.iterator(effect) ? resolveIterator(effect, effectId, name, currCb) // declarative effects - : _utils.is.array(effect) ? runParallelEffect(effect, effectId, currCb) : _utils.is.notUndef(data = _io.asEffect.take(effect)) ? runTakeEffect(data, currCb) : _utils.is.notUndef(data = _io.asEffect.put(effect)) ? runPutEffect(data, currCb) : _utils.is.notUndef(data = _io.asEffect.race(effect)) ? runRaceEffect(data, effectId, currCb) : _utils.is.notUndef(data = _io.asEffect.call(effect)) ? runCallEffect(data, effectId, currCb) : _utils.is.notUndef(data = _io.asEffect.cps(effect)) ? runCPSEffect(data, currCb) : _utils.is.notUndef(data = _io.asEffect.fork(effect)) ? runForkEffect(data, effectId, currCb) : _utils.is.notUndef(data = _io.asEffect.join(effect)) ? runJoinEffect(data, currCb) : _utils.is.notUndef(data = _io.asEffect.cancel(effect)) ? runCancelEffect(data, currCb) : _utils.is.notUndef(data = _io.asEffect.select(effect)) ? runSelectEffect(data, currCb) : _utils.is.notUndef(data = _io.asEffect.actionChannel(effect)) ? runChannelEffect(data, currCb) : _utils.is.notUndef(data = _io.asEffect.cancelled(effect)) ? runCancelledEffect(data, currCb) : /* anything else returned as is */currCb(null, effect) + : _utils.is.array(effect) ? runParallelEffect(effect, effectId, currCb) : _utils.is.notUndef(data = _io.asEffect.take(effect)) ? runTakeEffect(data, currCb) : _utils.is.notUndef(data = _io.asEffect.put(effect)) ? runPutEffect(data, currCb) : _utils.is.notUndef(data = _io.asEffect.race(effect)) ? runRaceEffect(data, effectId, currCb) : _utils.is.notUndef(data = _io.asEffect.call(effect)) ? runCallEffect(data, effectId, currCb) : _utils.is.notUndef(data = _io.asEffect.cps(effect)) ? runCPSEffect(data, currCb) : _utils.is.notUndef(data = _io.asEffect.fork(effect)) ? runForkEffect(data, effectId, currCb) : _utils.is.notUndef(data = _io.asEffect.join(effect)) ? runJoinEffect(data, currCb) : _utils.is.notUndef(data = _io.asEffect.cancel(effect)) ? runCancelEffect(data, currCb) : _utils.is.notUndef(data = _io.asEffect.select(effect)) ? runSelectEffect(data, currCb) : _utils.is.notUndef(data = _io.asEffect.actionChannel(effect)) ? runChannelEffect(data, currCb) : _utils.is.notUndef(data = _io.asEffect.cancelled(effect)) ? runCancelledEffect(data, currCb) : /* anything else returned as is */currCb(effect) ); } @@ -1148,10 +1159,8 @@ return /******/ (function(modules) { // webpackBootstrap if (typeof cancelPromise === 'function') { cb.cancel = cancelPromise; } - promise.then(function (result) { - return cb(null, result); - }, function (error) { - return cb(error); + promise.then(cb, function (error) { + return cb(error, true); }); } @@ -1166,12 +1175,12 @@ return /******/ (function(modules) { // webpackBootstrap channel = channel || stdChannel; var takeCb = function takeCb(inp) { - return inp instanceof Error ? cb(inp) : inp === _channel.END && !maybe ? cb(null, Never) : cb(null, inp); + return inp instanceof Error ? cb(inp, true) : inp === _channel.END && !maybe ? cb(CHANNEL_END) : cb(inp); }; try { channel.take(takeCb, matcher(pattern)); } catch (err) { - return cb(err); + return cb(err, true); } cb.cancel = takeCb.cancel; } @@ -1191,13 +1200,13 @@ return /******/ (function(modules) { // webpackBootstrap try { result = (channel ? channel.put : dispatch)(action); } catch (error) { - return cb(error); + return cb(error, true); } if (_utils.is.promise(result)) { resolvePromise(result, cb); } else { - return cb(null, result); + return cb(result); } }); // Put effects are non cancellables @@ -1213,9 +1222,9 @@ return /******/ (function(modules) { // webpackBootstrap try { result = fn.apply(context, args); } catch (error) { - return cb(error); + return cb(error, true); } - return _utils.is.promise(result) ? resolvePromise(result, cb) : _utils.is.iterator(result) ? resolveIterator(result, effectId, fn.name, cb) : cb(null, result); + return _utils.is.promise(result) ? resolvePromise(result, cb) : _utils.is.iterator(result) ? resolveIterator(result, effectId, fn.name, cb) : cb(result); } function runCPSEffect(_ref4, cb) { @@ -1228,9 +1237,11 @@ return /******/ (function(modules) { // webpackBootstrap // catch synchronous failures; see #152 try { - fn.apply(context, args.concat(cb)); + fn.apply(context, args.concat(function (err, res) { + return _utils.is.undef(err) ? cb(res) : cb(err, true); + })); } catch (error) { - return cb(error); + return cb(error, true); } } @@ -1281,11 +1292,13 @@ return /******/ (function(modules) { // webpackBootstrap }()); } - var task = proc(_iterator, subscribe, dispatch, getState, monitor, effectId, fn.name, detached ? null : _utils.noop); - if (!detached) { - if (_iterator._isRunning) taskQueue.addTask(task);else if (_iterator._error) return cb(_iterator._error); - } - cb(null, task); + (0, _asap2.default)(function () { + var task = proc(_iterator, subscribe, dispatch, getState, monitor, effectId, fn.name, detached ? null : _utils.noop); + if (!detached) { + if (_iterator._isRunning) taskQueue.addTask(task);else if (_iterator._error) return cb(_iterator._error, true); + } + cb(task); + }); // Fork effects are non cancellables } @@ -1299,7 +1312,7 @@ return /******/ (function(modules) { // webpackBootstrap t.joiners.push(joiner); })(); } else { - cb(t.error(), t.result()); + t.isAborted() ? cb(t.error(), true) : cb(t.result()); } } @@ -1313,8 +1326,7 @@ return /******/ (function(modules) { // webpackBootstrap function runParallelEffect(effects, effectId, cb) { if (!effects.length) { - cb(null, []); - return; + return cb([]); } var completedCount = 0; @@ -1324,16 +1336,16 @@ return /******/ (function(modules) { // webpackBootstrap function checkEffectEnd() { if (completedCount === results.length) { completed = true; - cb(null, results); + cb(results); } } var childCbs = effects.map(function (eff, idx) { - var chCbAtIdx = function chCbAtIdx(err, res) { + var chCbAtIdx = function chCbAtIdx(res, isErr) { if (completed) return; - if (err || res === _channel.END || res === Never) { + if (isErr || res === _channel.END || res === CHANNEL_END || res === TASK_CANCEL) { cb.cancel(); - err ? cb(err) : cb(null, res); + cb(res, isErr); } else { results[idx] = res; completedCount++; @@ -1364,17 +1376,17 @@ return /******/ (function(modules) { // webpackBootstrap var childCbs = {}; keys.forEach(function (key) { - var chCbAtKey = function chCbAtKey(err, res) { + var chCbAtKey = function chCbAtKey(res, isErr) { if (completed) return; - if (err) { + if (isErr) { // Race Auto cancellation cb.cancel(); - cb(err); - } else if (res !== _channel.END && res !== Never) { + cb(res, true); + } else if (res !== _channel.END && res !== CHANNEL_END && res !== TASK_CANCEL) { cb.cancel(); completed = true; - cb(null, _defineProperty({}, key, res)); + cb(_defineProperty({}, key, res)); } }; chCbAtKey.cancel = _utils.noop; @@ -1401,9 +1413,9 @@ return /******/ (function(modules) { // webpackBootstrap try { var state = selector.apply(undefined, [getState()].concat(_toConsumableArray(args))); - cb(null, state); + cb(state); } catch (error) { - cb(error); + cb(error, true); } } @@ -1413,11 +1425,11 @@ return /******/ (function(modules) { // webpackBootstrap var match = matcher(pattern); match.pattern = pattern; - cb(null, (0, _channel.eventChannel)(subscribe, buffer || _buffers.buffers.fixed(), match)); + cb((0, _channel.eventChannel)(subscribe, buffer || _buffers.buffers.fixed(), match)); } function runCancelledEffect(data, cb) { - cb(null, !!mainTask.isCancelled); + cb(!!mainTask.isCancelled); } function newTask(id, name, iterator, cont) { @@ -1435,6 +1447,8 @@ return /******/ (function(modules) { // webpackBootstrap return iterator._isRunning; }), _defineProperty(_ref8, 'isCancelled', function isCancelled() { return iterator._isCancelled; + }), _defineProperty(_ref8, 'isAborted', function isAborted() { + return iterator._isAborted; }), _defineProperty(_ref8, 'result', function result() { return iterator._result; }), _defineProperty(_ref8, 'error', function error() { diff --git a/dist/redux-saga.min.js b/dist/redux-saga.min.js index 959a63003..bddf798c5 100644 --- a/dist/redux-saga.min.js +++ b/dist/redux-saga.min.js @@ -1 +1 @@ -!function(e,n){"object"==typeof exports&&"object"==typeof module?module.exports=n():"function"==typeof define&&define.amd?define([],n):"object"==typeof exports?exports.ReduxSaga=n():e.ReduxSaga=n()}(this,function(){return function(e){function n(r){if(t[r])return t[r].exports;var u=t[r]={exports:{},id:r,loaded:!1};return e[r].call(u.exports,u,u.exports,n),u.loaded=!0,u.exports}var t={};return n.m=e,n.c=t,n.p="",n(0)}([function(e,n,t){"use strict";function r(e){if(e&&e.__esModule)return e;var n={};if(null!=e)for(var t in e)Object.prototype.hasOwnProperty.call(e,t)&&(n[t]=e[t]);return n.default=e,n}function u(e){return e&&e.__esModule?e:{"default":e}}Object.defineProperty(n,"__esModule",{value:!0}),n.utils=n.effects=n.delay=n.takeLatest=n.takeEvery=n.buffers=n.channel=n.eventChannel=n.END=n.CANCEL=n.runSaga=void 0;var o=t(9);Object.defineProperty(n,"runSaga",{enumerable:!0,get:function(){return o.runSaga}});var a=t(5);Object.defineProperty(n,"CANCEL",{enumerable:!0,get:function(){return a.CANCEL}});var i=t(2);Object.defineProperty(n,"END",{enumerable:!0,get:function(){return i.END}}),Object.defineProperty(n,"eventChannel",{enumerable:!0,get:function(){return i.eventChannel}}),Object.defineProperty(n,"channel",{enumerable:!0,get:function(){return i.channel}});var c=t(4);Object.defineProperty(n,"buffers",{enumerable:!0,get:function(){return c.buffers}});var f=t(10);Object.defineProperty(n,"takeEvery",{enumerable:!0,get:function(){return f.takeEvery}}),Object.defineProperty(n,"takeLatest",{enumerable:!0,get:function(){return f.takeLatest}});var l=t(1);Object.defineProperty(n,"delay",{enumerable:!0,get:function(){return l.delay}});var s=t(8),d=u(s),v=t(6),p=r(v),h=t(11),g=r(h);n.default=d.default,n.effects=p,n.utils=g},function(e,n,t){(function(e){"use strict";function t(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function r(e){return e}function u(e,n,t){if(!n(e))throw new Error(t)}function o(e,n){var t=e.indexOf(n);t>=0&&e.splice(t,1)}function a(){var e=arguments.length<=0||void 0===arguments[0]?{}:arguments[0],n=v({},e),t=new Promise(function(e,t){n.resolve=e,n.reject=t});return n.promise=t,n}function i(e){for(var n=[],t=0;e>t;t++)n.push(a());return n}function c(e){var n=arguments.length<=1||void 0===arguments[1]?!0:arguments[1];return new Promise(function(t){return setTimeout(function(){return t(n)},e)})}function f(){var e,n=!0,r=void 0,u=void 0;return e={},t(e,h,!0),t(e,"isRunning",function(){return n}),t(e,"result",function(){return r}),t(e,"error",function(){return u}),t(e,"setRunning",function(e){return n=e}),t(e,"setResult",function(e){return r=e}),t(e,"setError",function(e){return u=e}),e}function l(){var e=arguments.length<=0||void 0===arguments[0]?0:arguments[0];return function(){return++e}}function s(e){var n=arguments.length<=1||void 0===arguments[1]?b:arguments[1],t=arguments.length<=2||void 0===arguments[2]?"":arguments[2],r={name:t,next:e,"throw":n};return"undefined"!=typeof Symbol&&(r[Symbol.iterator]=function(){return r}),r}function d(e,n,t){"undefined"==typeof window?console.log("redux-saga "+e+": "+n+"\n"+(t&&t.stack||t)):console[e].call(console,n,t)}Object.defineProperty(n,"__esModule",{value:!0});var v=Object.assign||function(e){for(var n=1;nr;r++)n[r](e)}var t=[];return{subscribe:e,emit:n}}function u(e){function n(){if(o&&s.length)throw(0,a.internalErr)("Can not have a closed channel with pending takers");if(s.length&&!e.isEmpty())throw(0,a.internalErr)("Can not have pedning takers with non empty buffer")}function t(t){if(n(),(0,a.check)(t,a.is.notUndef,l),!o)if(s.length)for(var r=0;r1&&((0,a.check)(r,a.is.func,"channel.take's matcher argument must be a function"),t[a.MATCH]=r),o&&e.isEmpty()?t(c):e.isEmpty()?(s.push(t),t.cancel=function(){return(0,a.remove)(s,t)}):t(e.take())}function u(){if(n(),!o&&(o=!0,s.length)){var e=s;s=[];for(var t=0,r=e.length;r>t;t++)e[t](c);s=[]}}var o=!1,s=[];return arguments.length>0?(0,a.check)(e,a.is.buffer,f):e=i.buffers.fixed(),{take:r,put:t,close:u,get __takers__(){return s},get __closed__(){return o}}}function o(e){var n=arguments.length<=1||void 0===arguments[1]?i.buffers.none():arguments[1],t=arguments[2];arguments.length>1&&(0,a.check)(t,a.is.func,"Invalid match function passed to eventChannel");var r=u(n),o=e(function(e){e===c?r.close():t&&!t(e)||r.put(e)});return{take:r.take,close:function(){r.__closed__||(r.close(),o())}}}Object.defineProperty(n,"__esModule",{value:!0}),n.UNDEFINED_INPUT_ERROR=n.INVALID_BUFFER=n.END=void 0,n.emitter=r,n.channel=u,n.eventChannel=o;var a=t(1),i=t(4),c=n.END={type:"@@redux-saga/CHANNEL_END"},f=n.INVALID_BUFFER="invalid buffer passed to channel factory function",l=n.UNDEFINED_INPUT_ERROR="\n Saga was provided with an undefined action\n Hints :\n - check that your Action Creator returns a non undefined value\n - if the Saga was started using runSaga, check that your subscribe source provides the action to its listeners\n"},function(e,n,t){"use strict";function r(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function u(e,n){if(arguments.length>=2)(0,k.check)(e,k.is.notUndef,"take(channel, pattern): channel is undefined"),(0,k.check)(e,k.is.take,"take(channel, pattern): argument "+e+" is not a valid channel (channel argument must have a take method)"),(0,k.check)(n,k.is.notUndef,"take(channel, pattern): pattern is undefined"),(0,k.check)(n,k.is.pattern,"take(channel, pattern): argument "+n+" is not a valid pattern (pattern must be String | Function: a => boolean | Array)");else if(1===arguments.length)if((0,k.check)(e,k.is.notUndef,"take(patternOrChannel): undefined argument"),k.is.take(e))n="*";else{if(!k.is.pattern(e))throw new Error("take(patternOrChannel): argument "+e+" is not valid channel or a valid pattern");n=e,e=null}else n="*";return x(j,{channel:e,pattern:n})}function o(){var e=u.apply(void 0,arguments);return e[j].maybe=!0,e}function a(e,n){return arguments.length>1?((0,k.check)(e,k.is.notUndef,"put(channel, action): argument channel is undefined"),(0,k.check)(e,k.is.put,"put(channel, action): argument "+e+" is not a valid channel (channel argument must have a put method)"),(0,k.check)(n,k.is.notUndef,"put(channel, action): argument action is undefined")):((0,k.check)(e,k.is.notUndef,"put(action): argument action is undefined"),n=e,e=null),x(O,{channel:e,action:n})}function i(e){return x(_,e)}function c(e,n,t){(0,k.check)(n,k.is.notUndef,e+": argument fn is undefined");var r=null;if(k.is.array(n)){var u=n,o=m(u,2);r=o[0],n=o[1]}else if(n.fn){var a=n;r=a.context,n=a.fn}return(0,k.check)(n,k.is.func,e+": argument "+n+" is not a function"),{context:r,fn:n,args:t}}function f(e){for(var n=arguments.length,t=Array(n>1?n-1:0),r=1;n>r;r++)t[r-1]=arguments[r];return x(w,c("call",e,t))}function l(e,n){var t=arguments.length<=2||void 0===arguments[2]?[]:arguments[2];return x(w,c("apply",{context:e,fn:n},t))}function s(e){for(var n=arguments.length,t=Array(n>1?n-1:0),r=1;n>r;r++)t[r-1]=arguments[r];return x(C,c("cps",e,t))}function d(e){for(var n=arguments.length,t=Array(n>1?n-1:0),r=1;n>r;r++)t[r-1]=arguments[r];return x(A,c("fork",e,t))}function v(e){for(var n=arguments.length,t=Array(n>1?n-1:0),r=1;n>r;r++)t[r-1]=arguments[r];var u=d.apply(void 0,[e].concat(t));return u[A].detached=!0,u}function p(e){if((0,k.check)(e,k.is.notUndef,"join(task): argument task is undefined"),!M(e))throw new Error("join(task): argument "+e+" is not a valid Task object \n(HINT: if you are getting this errors in tests, consider using createMockTask from redux-saga/utils)");return x(P,e)}function h(e){if((0,k.check)(e,k.is.notUndef,"cancel(task): argument task is undefined"),!M(e))throw new Error("cancel(task): argument "+e+" is not a valid Task object \n(HINT: if you are getting this errors in tests, consider using createMockTask from redux-saga/utils)");return x(T,e)}function g(e){for(var n=arguments.length,t=Array(n>1?n-1:0),r=1;n>r;r++)t[r-1]=arguments[r];return 0===arguments.length?e=k.ident:((0,k.check)(g,k.is.notUndef,"select(selector,[...]): argument selector is undefined"),(0,k.check)(e,k.is.func,"select(selector,[...]): argument "+e+" is not a function")),x(R,{selector:e,args:t})}function y(e,n){return(0,k.check)(e,k.is.notUndef,"actionChannel(pattern,...): argument pattern is undefined"),arguments.length>1&&((0,k.check)(n,k.is.notUndef,"actionChannel(pattern, buffer): argument buffer is undefined"),(0,k.check)(n,k.is.notUndef,"actionChannel(pattern, buffer): argument "+n+" is not a valid buffer")),x(S,{pattern:e,buffer:n})}function b(){return x(N,{})}Object.defineProperty(n,"__esModule",{value:!0}),n.asEffect=void 0;var m=function(){function e(e,n){var t=[],r=!0,u=!1,o=void 0;try{for(var a,i=e[Symbol.iterator]();!(r=(a=i.next()).done)&&(t.push(a.value),!n||t.length!==n);r=!0);}catch(c){u=!0,o=c}finally{try{!r&&i.return&&i.return()}finally{if(u)throw o}}return t}return function(n,t){if(Array.isArray(n))return n;if(Symbol.iterator in Object(n))return e(n,t);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}();n.take=u,n.takem=o,n.put=a,n.race=i,n.call=f,n.apply=l,n.cps=s,n.fork=d,n.spawn=v,n.join=p,n.cancel=h,n.select=g,n.actionChannel=y,n.cancelled=b;var k=t(1),E=(0,k.sym)("IO"),j="TAKE",O="PUT",_="RACE",w="CALL",C="CPS",A="FORK",P="JOIN",T="CANCEL",R="SELECT",S="ACTION_CHANNEL",N="CANCELLED",x=function(e,n){var t;return t={},r(t,E,!0),r(t,e,n),t},M=function(e){return e[k.TASK]};n.asEffect={take:function(e){return e&&e[E]&&e[j]},put:function(e){return e&&e[E]&&e[O]},race:function(e){return e&&e[E]&&e[_]},call:function(e){return e&&e[E]&&e[w]},cps:function(e){return e&&e[E]&&e[C]},fork:function(e){return e&&e[E]&&e[A]},join:function(e){return e&&e[E]&&e[P]},cancel:function(e){return e&&e[E]&&e[T]},select:function(e){return e&&e[E]&&e[R]},actionChannel:function(e){return e&&e[E]&&e[S]},cancelled:function(e){return e&&e[E]&&e[N]}}},function(e,n,t){"use strict";function r(){var e=arguments.length<=0||void 0===arguments[0]?1/0:arguments[0],n=arguments[1],t=[];return{isEmpty:function(){return!t.length},put:function(r){if(t.length1?t-1:0),c=1;t>c;c++)r[c-1]=arguments[c];return(0,i.default)(e.apply(void 0,r),a.subscribe,o,u,n.sagaMonitor,0,e.name)}var u=e.getState,o=e.dispatch;t=r;var a=(0,c.emitter)();return function(e){return function(n){var t=e(n);return a.emit(n),t}}}var n=arguments.length<=0||void 0===arguments[0]?{}:arguments[0],t=void 0;if(o.is.func(n))throw new Error("You passed a function to the Saga middleware. You are likely trying to start a Saga by directly passing it to the middleware. This is no longer possible starting from 0.10.0. To run a Saga, you must do it dynamically AFTER mounting the middleware into the store.\n Example:\n import createSagaMiddleware from 'redux-saga'\n ... other imports\n\n const sagaMiddleware = createSagaMiddleware()\n const store = createStore(reducer, applyMiddleware(sagaMiddleware))\n sagaMiddleware.run(saga, ...args)\n ");return e.run=function(e){for(var n=arguments.length,r=Array(n>1?n-1:0),u=1;n>u;u++)r[u-1]=arguments[u];return(0,o.check)(t,o.is.notUndef,"Before running a Saga, you must mount the Saga middleware on the Store using applyMiddleware"),(0,o.check)(e,o.is.func,"sagaMiddleware.run(saga, ...args): saga argument must be a Generator function!"),t.apply(void 0,[e].concat(r))},e}Object.defineProperty(n,"__esModule",{value:!0}),n.default=u;var o=t(1),a=t(5),i=r(a),c=t(2)},function(e,n,t){"use strict";function r(e){return e&&e.__esModule?e:{"default":e}}function u(e,n,t){var r=n.subscribe,u=n.dispatch,a=n.getState;return(0,o.check)(e,o.is.iterator,"runSaga must be called on an iterator"),(0,i.default)(e,r,u,a,t)}Object.defineProperty(n,"__esModule",{value:!0}),n.runSaga=u;var o=t(1),a=t(5),i=r(a)},function(e,n,t){"use strict";function r(e,n){function t(n,t){if(o===s)return l;if(t)throw o=s,t;u&&u(n);var r=e[o](),i=a(r,3),c=i[0],f=i[1],d=i[2];return o=c,u=d,o===s?l:f}var r=arguments.length<=2||void 0===arguments[2]?"iterator":arguments[2],u=void 0,o=n;return(0,c.makeIterator)(t,function(e){return t(null,e)},r)}function u(e,n){for(var t=arguments.length,u=Array(t>2?t-2:0),o=2;t>o;o++)u[o-2]=arguments[o];var a={done:!1,value:(0,f.take)(e)},c=function(e){return{done:!1,value:f.fork.apply(void 0,[n].concat(u,[e]))}},l=void 0,d=function(e){return l=e};return r({q1:function(){return["q2",a,d]},q2:function(){return l===i.END?[s]:["q1",c(l)]}},"q1","takeEvery("+String(e)+", "+n.name+")")}function o(e,n){for(var t=arguments.length,u=Array(t>2?t-2:0),o=2;t>o;o++)u[o-2]=arguments[o];var a={done:!1,value:(0,f.take)(e)},c=function(e){return{done:!1,value:f.fork.apply(void 0,[n].concat(u,[e]))}},l=function(e){return{done:!1,value:(0,f.cancel)(e)}},d=void 0,v=void 0,p=function(e){return d=e},h=function(e){return v=e};return r({q1:function(){return["q2",a,h]},q2:function(){return v===i.END?[s]:d?["q3",l(d)]:["q1",c(v),p]},q3:function(){return["q1",c(v),p]}},"q1","takeLatest("+String(e)+", "+n.name+")")}Object.defineProperty(n,"__esModule",{value:!0});var a=function(){function e(e,n){var t=[],r=!0,u=!1,o=void 0;try{for(var a,i=e[Symbol.iterator]();!(r=(a=i.next()).done)&&(t.push(a.value),!n||t.length!==n);r=!0);}catch(c){u=!0,o=c}finally{try{!r&&i.return&&i.return()}finally{if(u)throw o}}return t}return function(n,t){if(Array.isArray(n))return n;if(Symbol.iterator in Object(n))return e(n,t);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}();n.takeEvery=u,n.takeLatest=o;var i=t(2),c=t(1),f=t(3),l={done:!0,value:void 0},s={}},function(e,n,t){"use strict";Object.defineProperty(n,"__esModule",{value:!0});var r=t(1);Object.defineProperty(n,"TASK",{enumerable:!0,get:function(){return r.TASK}}),Object.defineProperty(n,"noop",{enumerable:!0,get:function(){return r.noop}}),Object.defineProperty(n,"is",{enumerable:!0,get:function(){return r.is}}),Object.defineProperty(n,"deferred",{enumerable:!0,get:function(){return r.deferred}}),Object.defineProperty(n,"arrayOfDeffered",{enumerable:!0,get:function(){return r.arrayOfDeffered}}),Object.defineProperty(n,"createMockTask",{enumerable:!0,get:function(){return r.createMockTask}});var u=t(3);Object.defineProperty(n,"asEffect",{enumerable:!0,get:function(){return u.asEffect}})},function(e,n){function t(){f=!1,a.length?c=a.concat(c):l=-1,c.length&&r()}function r(){if(!f){var e=setTimeout(t);f=!0;for(var n=c.length;n;){for(a=c,c=[];++l1)for(var t=1;t=0&&e.splice(t,1)}function a(){var e=arguments.length<=0||void 0===arguments[0]?{}:arguments[0],n=v({},e),t=new Promise(function(e,t){n.resolve=e,n.reject=t});return n.promise=t,n}function i(e){for(var n=[],t=0;e>t;t++)n.push(a());return n}function c(e){var n=arguments.length<=1||void 0===arguments[1]?!0:arguments[1];return new Promise(function(t){return setTimeout(function(){return t(n)},e)})}function f(){var e,n=!0,r=void 0,o=void 0;return e={},t(e,h,!0),t(e,"isRunning",function(){return n}),t(e,"result",function(){return r}),t(e,"error",function(){return o}),t(e,"setRunning",function(e){return n=e}),t(e,"setResult",function(e){return r=e}),t(e,"setError",function(e){return o=e}),e}function s(){var e=arguments.length<=0||void 0===arguments[0]?0:arguments[0];return function(){return++e}}function l(e){var n=arguments.length<=1||void 0===arguments[1]?b:arguments[1],t=arguments.length<=2||void 0===arguments[2]?"":arguments[2],r={name:t,next:e,"throw":n};return"undefined"!=typeof Symbol&&(r[Symbol.iterator]=function(){return r}),r}function d(e,n,t){"undefined"==typeof window?console.log("redux-saga "+e+": "+n+"\n"+(t&&t.stack||t)):console[e].call(console,n,t)}Object.defineProperty(n,"__esModule",{value:!0});var v=Object.assign||function(e){for(var n=1;nr;r++)n[r](e)}var t=[];return{subscribe:e,emit:n}}function o(e){function n(){if(u&&l.length)throw(0,a.internalErr)("Can not have a closed channel with pending takers");if(l.length&&!e.isEmpty())throw(0,a.internalErr)("Can not have pedning takers with non empty buffer")}function t(t){if(n(),(0,a.check)(t,a.is.notUndef,s),!u)if(l.length)for(var r=0;r1&&((0,a.check)(r,a.is.func,"channel.take's matcher argument must be a function"),t[a.MATCH]=r),u&&e.isEmpty()?t(c):e.isEmpty()?(l.push(t),t.cancel=function(){return(0,a.remove)(l,t)}):t(e.take())}function o(){if(n(),!u&&(u=!0,l.length)){var e=l;l=[];for(var t=0,r=e.length;r>t;t++)e[t](c);l=[]}}var u=!1,l=[];return arguments.length>0?(0,a.check)(e,a.is.buffer,f):e=i.buffers.fixed(),{take:r,put:t,close:o,get __takers__(){return l},get __closed__(){return u}}}function u(e){var n=arguments.length<=1||void 0===arguments[1]?i.buffers.none():arguments[1],t=arguments[2];arguments.length>2&&(0,a.check)(t,a.is.func,"Invalid match function passed to eventChannel");var r=o(n),u=e(function(e){e===c?r.close():t&&!t(e)||r.put(e)});return{take:r.take,close:function(){r.__closed__||(r.close(),u())}}}Object.defineProperty(n,"__esModule",{value:!0}),n.UNDEFINED_INPUT_ERROR=n.INVALID_BUFFER=n.END=void 0,n.emitter=r,n.channel=o,n.eventChannel=u;var a=t(1),i=t(4),c=n.END={type:"@@redux-saga/CHANNEL_END"},f=n.INVALID_BUFFER="invalid buffer passed to channel factory function",s=n.UNDEFINED_INPUT_ERROR="\n Saga was provided with an undefined action\n Hints :\n - check that your Action Creator returns a non undefined value\n - if the Saga was started using runSaga, check that your subscribe source provides the action to its listeners\n"},function(e,n,t){"use strict";function r(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function o(e,n){if(arguments.length>=2)(0,k.check)(e,k.is.notUndef,"take(channel, pattern): channel is undefined"),(0,k.check)(e,k.is.take,"take(channel, pattern): argument "+e+" is not a valid channel (channel argument must have a take method)"),(0,k.check)(n,k.is.notUndef,"take(channel, pattern): pattern is undefined"),(0,k.check)(n,k.is.pattern,"take(channel, pattern): argument "+n+" is not a valid pattern (pattern must be String | Function: a => boolean | Array)");else if(1===arguments.length)if((0,k.check)(e,k.is.notUndef,"take(patternOrChannel): undefined argument"),k.is.take(e))n="*";else{if(!k.is.pattern(e))throw new Error("take(patternOrChannel): argument "+e+" is not valid channel or a valid pattern");n=e,e=null}else n="*";return x(_,{channel:e,pattern:n})}function u(){var e=o.apply(void 0,arguments);return e[_].maybe=!0,e}function a(e,n){return arguments.length>1?((0,k.check)(e,k.is.notUndef,"put(channel, action): argument channel is undefined"),(0,k.check)(e,k.is.put,"put(channel, action): argument "+e+" is not a valid channel (channel argument must have a put method)"),(0,k.check)(n,k.is.notUndef,"put(channel, action): argument action is undefined")):((0,k.check)(e,k.is.notUndef,"put(action): argument action is undefined"),n=e,e=null),x(j,{channel:e,action:n})}function i(e){return x(O,e)}function c(e,n,t){(0,k.check)(n,k.is.notUndef,e+": argument fn is undefined");var r=null;if(k.is.array(n)){var o=n,u=m(o,2);r=u[0],n=u[1]}else if(n.fn){var a=n;r=a.context,n=a.fn}return(0,k.check)(n,k.is.func,e+": argument "+n+" is not a function"),{context:r,fn:n,args:t}}function f(e){for(var n=arguments.length,t=Array(n>1?n-1:0),r=1;n>r;r++)t[r-1]=arguments[r];return x(w,c("call",e,t))}function s(e,n){var t=arguments.length<=2||void 0===arguments[2]?[]:arguments[2];return x(w,c("apply",{context:e,fn:n},t))}function l(e){for(var n=arguments.length,t=Array(n>1?n-1:0),r=1;n>r;r++)t[r-1]=arguments[r];return x(A,c("cps",e,t))}function d(e){for(var n=arguments.length,t=Array(n>1?n-1:0),r=1;n>r;r++)t[r-1]=arguments[r];return x(C,c("fork",e,t))}function v(e){for(var n=arguments.length,t=Array(n>1?n-1:0),r=1;n>r;r++)t[r-1]=arguments[r];var o=d.apply(void 0,[e].concat(t));return o[C].detached=!0,o}function p(e){if((0,k.check)(e,k.is.notUndef,"join(task): argument task is undefined"),!M(e))throw new Error("join(task): argument "+e+" is not a valid Task object \n(HINT: if you are getting this errors in tests, consider using createMockTask from redux-saga/utils)");return x(P,e)}function h(e){if((0,k.check)(e,k.is.notUndef,"cancel(task): argument task is undefined"),!M(e))throw new Error("cancel(task): argument "+e+" is not a valid Task object \n(HINT: if you are getting this errors in tests, consider using createMockTask from redux-saga/utils)");return x(T,e)}function g(e){for(var n=arguments.length,t=Array(n>1?n-1:0),r=1;n>r;r++)t[r-1]=arguments[r];return 0===arguments.length?e=k.ident:((0,k.check)(g,k.is.notUndef,"select(selector,[...]): argument selector is undefined"),(0,k.check)(e,k.is.func,"select(selector,[...]): argument "+e+" is not a function")),x(N,{selector:e,args:t})}function y(e,n){return(0,k.check)(e,k.is.notUndef,"actionChannel(pattern,...): argument pattern is undefined"),arguments.length>1&&((0,k.check)(n,k.is.notUndef,"actionChannel(pattern, buffer): argument buffer is undefined"),(0,k.check)(n,k.is.notUndef,"actionChannel(pattern, buffer): argument "+n+" is not a valid buffer")),x(S,{pattern:e,buffer:n})}function b(){return x(R,{})}Object.defineProperty(n,"__esModule",{value:!0}),n.asEffect=void 0;var m=function(){function e(e,n){var t=[],r=!0,o=!1,u=void 0;try{for(var a,i=e[Symbol.iterator]();!(r=(a=i.next()).done)&&(t.push(a.value),!n||t.length!==n);r=!0);}catch(c){o=!0,u=c}finally{try{!r&&i.return&&i.return()}finally{if(o)throw u}}return t}return function(n,t){if(Array.isArray(n))return n;if(Symbol.iterator in Object(n))return e(n,t);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}();n.take=o,n.takem=u,n.put=a,n.race=i,n.call=f,n.apply=s,n.cps=l,n.fork=d,n.spawn=v,n.join=p,n.cancel=h,n.select=g,n.actionChannel=y,n.cancelled=b;var k=t(1),E=(0,k.sym)("IO"),_="TAKE",j="PUT",O="RACE",w="CALL",A="CPS",C="FORK",P="JOIN",T="CANCEL",N="SELECT",S="ACTION_CHANNEL",R="CANCELLED",x=function(e,n){var t;return t={},r(t,E,!0),r(t,e,n),t},M=function(e){return e[k.TASK]};n.asEffect={take:function(e){return e&&e[E]&&e[_]},put:function(e){return e&&e[E]&&e[j]},race:function(e){return e&&e[E]&&e[O]},call:function(e){return e&&e[E]&&e[w]},cps:function(e){return e&&e[E]&&e[A]},fork:function(e){return e&&e[E]&&e[C]},join:function(e){return e&&e[E]&&e[P]},cancel:function(e){return e&&e[E]&&e[T]},select:function(e){return e&&e[E]&&e[N]},actionChannel:function(e){return e&&e[E]&&e[S]},cancelled:function(e){return e&&e[E]&&e[R]}}},function(e,n,t){"use strict";function r(){var e=arguments.length<=0||void 0===arguments[0]?1/0:arguments[0],n=arguments[1],t=[];return{isEmpty:function(){return!t.length},put:function(r){if(t.length1?t-1:0),c=1;t>c;c++)r[c-1]=arguments[c];return(0,i.default)(e.apply(void 0,r),a.subscribe,u,o,n.sagaMonitor,0,e.name)}var o=e.getState,u=e.dispatch;t=r;var a=(0,c.emitter)();return function(e){return function(n){var t=e(n);return a.emit(n),t}}}var n=arguments.length<=0||void 0===arguments[0]?{}:arguments[0],t=void 0;if(u.is.func(n))throw new Error("You passed a function to the Saga middleware. You are likely trying to start a Saga by directly passing it to the middleware. This is no longer possible starting from 0.10.0. To run a Saga, you must do it dynamically AFTER mounting the middleware into the store.\n Example:\n import createSagaMiddleware from 'redux-saga'\n ... other imports\n\n const sagaMiddleware = createSagaMiddleware()\n const store = createStore(reducer, applyMiddleware(sagaMiddleware))\n sagaMiddleware.run(saga, ...args)\n ");return e.run=function(e){for(var n=arguments.length,r=Array(n>1?n-1:0),o=1;n>o;o++)r[o-1]=arguments[o];return(0,u.check)(t,u.is.notUndef,"Before running a Saga, you must mount the Saga middleware on the Store using applyMiddleware"),(0,u.check)(e,u.is.func,"sagaMiddleware.run(saga, ...args): saga argument must be a Generator function!"),t.apply(void 0,[e].concat(r))},e}Object.defineProperty(n,"__esModule",{value:!0}),n.default=o;var u=t(1),a=t(5),i=r(a),c=t(2)},function(e,n,t){"use strict";function r(e){return e&&e.__esModule?e:{"default":e}}function o(e,n,t){var r=n.subscribe,o=n.dispatch,a=n.getState;return(0,u.check)(e,u.is.iterator,"runSaga must be called on an iterator"),(0,i.default)(e,r,o,a,t)}Object.defineProperty(n,"__esModule",{value:!0}),n.runSaga=o;var u=t(1),a=t(5),i=r(a)},function(e,n,t){"use strict";function r(e,n){function t(n,t){if(u===l)return s;if(t)throw u=l,t;o&&o(n);var r=e[u](),i=a(r,3),c=i[0],f=i[1],d=i[2];return u=c,o=d,u===l?s:f}var r=arguments.length<=2||void 0===arguments[2]?"iterator":arguments[2],o=void 0,u=n;return(0,c.makeIterator)(t,function(e){return t(null,e)},r)}function o(e,n){for(var t=arguments.length,o=Array(t>2?t-2:0),u=2;t>u;u++)o[u-2]=arguments[u];var a={done:!1,value:(0,f.take)(e)},c=function(e){return{done:!1,value:f.fork.apply(void 0,[n].concat(o,[e]))}},s=void 0,d=function(e){return s=e};return r({q1:function(){return["q2",a,d]},q2:function(){return s===i.END?[l]:["q1",c(s)]}},"q1","takeEvery("+String(e)+", "+n.name+")")}function u(e,n){for(var t=arguments.length,o=Array(t>2?t-2:0),u=2;t>u;u++)o[u-2]=arguments[u];var a={done:!1,value:(0,f.take)(e)},c=function(e){return{done:!1,value:f.fork.apply(void 0,[n].concat(o,[e]))}},s=function(e){return{done:!1,value:(0,f.cancel)(e)}},d=void 0,v=void 0,p=function(e){return d=e},h=function(e){return v=e};return r({q1:function(){return["q2",a,h]},q2:function(){return v===i.END?[l]:d?["q3",s(d)]:["q1",c(v),p]},q3:function(){return["q1",c(v),p]}},"q1","takeLatest("+String(e)+", "+n.name+")")}Object.defineProperty(n,"__esModule",{value:!0});var a=function(){function e(e,n){var t=[],r=!0,o=!1,u=void 0;try{for(var a,i=e[Symbol.iterator]();!(r=(a=i.next()).done)&&(t.push(a.value),!n||t.length!==n);r=!0);}catch(c){o=!0,u=c}finally{try{!r&&i.return&&i.return()}finally{if(o)throw u}}return t}return function(n,t){if(Array.isArray(n))return n;if(Symbol.iterator in Object(n))return e(n,t);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}();n.takeEvery=o,n.takeLatest=u;var i=t(2),c=t(1),f=t(3),s={done:!0,value:void 0},l={}},function(e,n,t){"use strict";Object.defineProperty(n,"__esModule",{value:!0});var r=t(1);Object.defineProperty(n,"TASK",{enumerable:!0,get:function(){return r.TASK}}),Object.defineProperty(n,"noop",{enumerable:!0,get:function(){return r.noop}}),Object.defineProperty(n,"is",{enumerable:!0,get:function(){return r.is}}),Object.defineProperty(n,"deferred",{enumerable:!0,get:function(){return r.deferred}}),Object.defineProperty(n,"arrayOfDeffered",{enumerable:!0,get:function(){return r.arrayOfDeffered}}),Object.defineProperty(n,"createMockTask",{enumerable:!0,get:function(){return r.createMockTask}});var o=t(3);Object.defineProperty(n,"asEffect",{enumerable:!0,get:function(){return o.asEffect}})},function(e,n){function t(){f=!1,a.length?c=a.concat(c):s=-1,c.length&&r()}function r(){if(!f){var e=setTimeout(t);f=!0;for(var n=c.length;n;){for(a=c,c=[];++s1)for(var t=1;t>Note messages on an eventChannel are not buffered by default. You have to provide a buffer to the eventChannel factory in order +The subscriber returns an `unsubscribe` function. This is used by the channel to unsubscribe before +the event source complete. Inside a Saga consuming messages from an event channel, if we want to *exit early* +before the event source complete (e.g. Saga ha been cancelled) you can call `chan.close()` to close the channel +and unsubscribe from the source. + +for example, we can make our Saga support cancellation + +```javascript +import { take, put, call, cancelled } from 'redux-saga/effects' +import { eventChannel, END } from 'redux-saga' + +// creates an event Channel from an interval of seconds +function countdown(seconds) { ... } + +export function* saga() { + const chan = yield call(countdown, value) + try { + while(true) { + let seconds = yield take(chan) + console.log(`countdown: ${seconds}`) + } + } finally { + if(yield cancelled()) { + chan.close() + console.log('countdown cancelled') + } + } +} +``` + + +>Note messages on an eventChannel are not buffered by default. You have to provide a buffer to the eventChannel factory in order to specify buffering strategy for the channel (e.g. eventChannel(subscriber, buffer). See API docs for more infos. ### Using channels to communicate between Sagas