Comparing version 1.1.1 to 1.2.0
@@ -1,2 +0,2 @@ | ||
/* chnl v1.1.1 by Vitaliy Potapov @preserve */ | ||
"use strict";function _typeof(e){return(_typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function _defineProperties(e,t){for(var n=0;n<t.length;n++){var i=t[n];i.enumerable=i.enumerable||!1,i.configurable=!0,"value"in i&&(i.writable=!0),Object.defineProperty(e,i.key,i)}}function _createClass(e,t,n){return t&&_defineProperties(e.prototype,t),n&&_defineProperties(e,n),e}function _inherits(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),t&&_setPrototypeOf(e,t)}function _getPrototypeOf(e){return(_getPrototypeOf=Object.setPrototypeOf?Object.getPrototypeOf:function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function _setPrototypeOf(e,t){return(_setPrototypeOf=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e})(e,t)}function _assertThisInitialized(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function _possibleConstructorReturn(e,t){return!t||"object"!=typeof t&&"function"!=typeof t?_assertThisInitialized(e):t}var Channel=function(){function t(e){_classCallCheck(this,t),this._listeners=[],this._mute=!1,this._accumulate=!1,this._accumulatedEvents=[],this._name=e||"",this._onListenerAdded=null,this._onFirstListenerAdded=null,this._onListenerRemoved=null,this._onLastListenerRemoved=null}return _createClass(t,[{key:"addListener",value:function(e,t){this._pushListener(e,t,!1)}},{key:"addOnceListener",value:function(e,t){this._pushListener(e,t,!0)}},{key:"removeListener",value:function(e,t){this._ensureFunction(e);var n=this._indexOfListener(e,t);0<=n&&this._spliceListener(n)}},{key:"removeAllListeners",value:function(){for(;this.hasListeners();)this._spliceListener(0)}},{key:"hasListener",value:function(e,t){return this._ensureFunction(e),0<=this._indexOfListener(e,t)}},{key:"hasListeners",value:function(){return 0<this._listeners.length}},{key:"dispatch",value:function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];this._invokeListeners({args:t,async:!1})}},{key:"dispatchAsync",value:function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];this._invokeListeners({args:t,async:!0})}},{key:"mute",value:function(e){var t=0<arguments.length&&void 0!==e?e:{};this._mute=!0,t.accumulate?this._accumulate=!0:(this._accumulate=!1,this._accumulatedEvents=[])}},{key:"unmute",value:function(){this._mute=!1,this._accumulate&&(this._dispatchAccumulated(),this._accumulate=!1)}},{key:"_invokeListeners",value:function(e){var t=this,n=0<arguments.length&&void 0!==e?e:{args:[],async:!1};this._mute?this._accumulate&&this._accumulatedEvents.push(n):this._listeners.slice().forEach(function(e){t._invokeListener(e,n),e.once&&t.removeListener(e.callback,e.context)})}},{key:"_invokeListener",value:function(e,t){t.async?setTimeout(function(){return e.callback.apply(e.context,t.args)},0):e.callback.apply(e.context,t.args)}},{key:"_ensureFunction",value:function(e){if("function"!=typeof e)throw new Error("Channel "+this._name+": listener is not a function")}},{key:"_dispatchInnerAddEvents",value:function(){var e,t;this._onListenerAdded&&(e=this._onListenerAdded).dispatch.apply(e,arguments);this._onFirstListenerAdded&&1===this._listeners.length&&(t=this._onFirstListenerAdded).dispatch.apply(t,arguments)}},{key:"_dispatchInnerRemoveEvents",value:function(){var e,t;this._onListenerRemoved&&(e=this._onListenerRemoved).dispatch.apply(e,arguments);this._onLastListenerRemoved&&0===this._listeners.length&&(t=this._onLastListenerRemoved).dispatch.apply(t,arguments)}},{key:"_indexOfListener",value:function(e,t){for(var n=0;n<this._listeners.length;n++){var i=this._listeners[n],s=i.callback===e,r=void 0===t&&void 0===i.context,o=t===i.context;if(s&&(r||o))return n}}},{key:"_dispatchAccumulated",value:function(){var t=this;this._accumulatedEvents.forEach(function(e){return t._invokeListeners(e)}),this._accumulatedEvents=[]}},{key:"_pushListener",value:function(e,t,n){this._ensureFunction(e),this._checkForDuplicates(e,t),this._listeners.push({callback:e,context:t,once:n}),this._dispatchInnerAddEvents(e,t,n)}},{key:"_checkForDuplicates",value:function(e,t){if(this.hasListener(e,t))throw new Error("Channel "+this._name+": duplicating listeners")}},{key:"_spliceListener",value:function(e){var t=this._listeners[e],n=t.callback,i=t.context,s=t.once;this._listeners.splice(e,1),this._dispatchInnerRemoveEvents(n,i,s)}},{key:"onListenerAdded",get:function(){return this._onListenerAdded||(this._onListenerAdded=new t("".concat(this._name,":onListenerAdded"))),this._onListenerAdded}},{key:"onFirstListenerAdded",get:function(){return this._onFirstListenerAdded||(this._onFirstListenerAdded=new t("".concat(this._name,":onFirstListenerAdded"))),this._onFirstListenerAdded}},{key:"onListenerRemoved",get:function(){return this._onListenerRemoved||(this._onListenerRemoved=new t("".concat(this._name,":onListenerRemoved"))),this._onListenerRemoved}},{key:"onLastListenerRemoved",get:function(){return this._onLastListenerRemoved||(this._onLastListenerRemoved=new t("".concat(this._name,":onLastListenerRemoved"))),this._onLastListenerRemoved}}]),t}(),EventEmitter=function(){function e(){_classCallCheck(this,e),this._channels=new Map}return _createClass(e,[{key:"addListener",value:function(e,t,n){this._getChannel(e).addListener(t,n)}},{key:"on",value:function(e,t,n){this.addListener(e,t,n)}},{key:"addOnceListener",value:function(e,t,n){this._getChannel(e).addOnceListener(t,n)}},{key:"once",value:function(e,t,n){this.addOnceListener(e,t,n)}},{key:"removeListener",value:function(e,t,n){this._getChannel(e).removeListener(t,n)}},{key:"off",value:function(e,t,n){this.removeListener(e,t,n)}},{key:"hasListener",value:function(e,t,n){return this._getChannel(e).hasListener(t,n)}},{key:"has",value:function(e,t,n){return this.hasListener(e,t,n)}},{key:"hasListeners",value:function(e){return this._getChannel(e).hasListeners()}},{key:"dispatch",value:function(e){for(var t,n=arguments.length,i=new Array(1<n?n-1:0),s=1;s<n;s++)i[s-1]=arguments[s];(t=this._getChannel(e)).dispatch.apply(t,i)}},{key:"emit",value:function(e){for(var t=arguments.length,n=new Array(1<t?t-1:0),i=1;i<t;i++)n[i-1]=arguments[i];this.dispatch.apply(this,[e].concat(n))}},{key:"_getChannel",value:function(e){return this._channels.has(e)||this._channels.set(e,new Channel(e)),this._channels.get(e)}}]),e}(),SubscriptionItem=function(){function t(e){_classCallCheck(this,t),this._params=e,this._isOn=!1,this._assertParams()}return _createClass(t,[{key:"on",value:function(){if(!this._isOn){var e=this._params.channel,t=e.addListener||e.addEventListener||e.on;this._applyMethod(t),this._isOn=!0}}},{key:"off",value:function(){if(this._isOn){var e=this._params.channel,t=e.removeListener||e.removeEventListener||e.off;this._applyMethod(t),this._isOn=!1}}},{key:"_applyMethod",value:function(e){var t=this._params,n=t.channel,i=t.event,s=t.listener,r=i?[i,s]:[s];e.apply(n,r)}},{key:"_assertParams",value:function(){var e=this._params,t=e.channel,n=e.event,i=e.listener;if(!t||"object"!==_typeof(t))throw new Error("Channel should be object");if(n&&"string"!=typeof n)throw new Error("Event should be string");if(!i||"function"!=typeof i)throw new Error("Listener should be function")}}]),t}(),Subscription=function(){function t(e){_classCallCheck(this,t),this._items=e.map(function(e){return new SubscriptionItem(e)})}return _createClass(t,[{key:"on",value:function(){return this._items.forEach(function(e){return e.on()}),this}},{key:"off",value:function(){return this._items.forEach(function(e){return e.off()}),this}}]),t}(),ReactSubscription=function(){function i(e,t){var n;return _classCallCheck(this,i),(n=_possibleConstructorReturn(this,_getPrototypeOf(i).call(this,t)))._overrideComponentCallback(e,"componentDidMount","on"),n._overrideComponentCallback(e,"componentWillUnmount","off"),n}return _inherits(i,Subscription),_createClass(i,[{key:"_overrideComponentCallback",value:function(i,e,s){var r=this,o=i[e];i[e]=function(){if(r[s](),"function"==typeof o){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];return o.apply(i,t)}}}}]),i}(),chnl=Channel;chnl.EventEmitter=EventEmitter,chnl.Subscription=Subscription,chnl.ReactSubscription=ReactSubscription,module.exports=chnl; | ||
/* chnl v1.2.0 by Vitaliy Potapov @preserve */ | ||
"use strict";function _typeof(e){return(_typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function _defineProperties(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}function _createClass(e,t,n){return t&&_defineProperties(e.prototype,t),n&&_defineProperties(e,n),e}function _inherits(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),t&&_setPrototypeOf(e,t)}function _getPrototypeOf(e){return(_getPrototypeOf=Object.setPrototypeOf?Object.getPrototypeOf:function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function _setPrototypeOf(e,t){return(_setPrototypeOf=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e})(e,t)}function _isNativeReflectConstruct(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Date.prototype.toString.call(Reflect.construct(Date,[],function(){})),!0}catch(e){return!1}}function _assertThisInitialized(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function _possibleConstructorReturn(e,t){return!t||"object"!=typeof t&&"function"!=typeof t?_assertThisInitialized(e):t}function _createSuper(r){var i=_isNativeReflectConstruct();return function(){var e,t=_getPrototypeOf(r);if(i){var n=_getPrototypeOf(this).constructor;e=Reflect.construct(t,arguments,n)}else e=t.apply(this,arguments);return _possibleConstructorReturn(this,e)}}function _toConsumableArray(e){return _arrayWithoutHoles(e)||_iterableToArray(e)||_unsupportedIterableToArray(e)||_nonIterableSpread()}function _arrayWithoutHoles(e){if(Array.isArray(e))return _arrayLikeToArray(e)}function _iterableToArray(e){if("undefined"!=typeof Symbol&&Symbol.iterator in Object(e))return Array.from(e)}function _unsupportedIterableToArray(e,t){if(e){if("string"==typeof e)return _arrayLikeToArray(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?_arrayLikeToArray(e,t):void 0}}function _arrayLikeToArray(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n<t;n++)r[n]=e[n];return r}function _nonIterableSpread(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var Channel=function(){function c(e){_classCallCheck(this,c),this._listeners=[],this._mute=!1,this._accumulate=!1,this._accumulatedEvents=[],this._name=e||"",this._onListenerAdded=null,this._onFirstListenerAdded=null,this._onListenerRemoved=null,this._onLastListenerRemoved=null}return _createClass(c,[{key:"addListener",value:function(e,t){this._pushListener(e,t,!1)}},{key:"addOnceListener",value:function(e,t){this._pushListener(e,t,!0)}},{key:"removeListener",value:function(e,t){this._ensureListener(e);var n=this._indexOfListener(e,t);0<=n&&this._spliceListener(n)}},{key:"removeAllListeners",value:function(){for(;this.hasListeners();)this._spliceListener(0)}},{key:"hasListener",value:function(e,t){return this._ensureListener(e),0<=this._indexOfListener(e,t)}},{key:"hasListeners",value:function(){return 0<this._listeners.length}},{key:"dispatch",value:function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];this._invokeListeners({args:t,async:!1})}},{key:"dispatchAsync",value:function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];this._invokeListeners({args:t,async:!0})}},{key:"mute",value:function(e){var t=0<arguments.length&&void 0!==e?e:{};this._mute=!0,t.accumulate?this._accumulate=!0:(this._accumulate=!1,this._accumulatedEvents=[])}},{key:"unmute",value:function(){this._mute=!1,this._accumulate&&(this._dispatchAccumulated(),this._accumulate=!1)}},{key:"_invokeListeners",value:function(e){var t=this,n=0<arguments.length&&void 0!==e?e:{args:[],async:!1};this._mute?this._accumulate&&this._accumulatedEvents.push(n):this._listeners.slice().forEach(function(e){t._invokeListener(e,n),e.once&&t.removeListener(e.callback,e.context)})}},{key:"_invokeListener",value:function(e,t){var n,r,i=e.callback instanceof c;t.async?i?(n=e.callback).dispatchAsync.apply(n,_toConsumableArray(t.args)):setTimeout(function(){return e.callback.apply(e.context,t.args)},0):i?(r=e.callback).dispatch.apply(r,_toConsumableArray(t.args)):e.callback.apply(e.context,t.args)}},{key:"_ensureListener",value:function(e){if(!c.isValidListener(e))throw new Error("Channel "+this._name+": listener is not a function and not a Channel")}},{key:"_dispatchInnerAddEvents",value:function(){var e,t;this._onListenerAdded&&(e=this._onListenerAdded).dispatch.apply(e,arguments);this._onFirstListenerAdded&&1===this._listeners.length&&(t=this._onFirstListenerAdded).dispatch.apply(t,arguments)}},{key:"_dispatchInnerRemoveEvents",value:function(){var e,t;this._onListenerRemoved&&(e=this._onListenerRemoved).dispatch.apply(e,arguments);this._onLastListenerRemoved&&0===this._listeners.length&&(t=this._onLastListenerRemoved).dispatch.apply(t,arguments)}},{key:"_indexOfListener",value:function(e,t){for(var n=0;n<this._listeners.length;n++){var r=this._listeners[n],i=r.callback===e,s=e instanceof c,o=void 0===t&&void 0===r.context,a=t===r.context;if(i&&(s||o||a))return n}}},{key:"_dispatchAccumulated",value:function(){var t=this;this._accumulatedEvents.forEach(function(e){return t._invokeListeners(e)}),this._accumulatedEvents=[]}},{key:"_pushListener",value:function(e,t,n){this._ensureListener(e),this._checkForDuplicates(e,t),this._listeners.push({callback:e,context:t,once:n}),this._dispatchInnerAddEvents(e,t,n)}},{key:"_checkForDuplicates",value:function(e,t){if(this.hasListener(e,t))throw new Error("Channel "+this._name+": duplicating listeners")}},{key:"_spliceListener",value:function(e){var t=this._listeners[e],n=t.callback,r=t.context,i=t.once;this._listeners.splice(e,1),this._dispatchInnerRemoveEvents(n,r,i)}},{key:"onListenerAdded",get:function(){return this._onListenerAdded||(this._onListenerAdded=new c("".concat(this._name,":onListenerAdded"))),this._onListenerAdded}},{key:"onFirstListenerAdded",get:function(){return this._onFirstListenerAdded||(this._onFirstListenerAdded=new c("".concat(this._name,":onFirstListenerAdded"))),this._onFirstListenerAdded}},{key:"onListenerRemoved",get:function(){return this._onListenerRemoved||(this._onListenerRemoved=new c("".concat(this._name,":onListenerRemoved"))),this._onListenerRemoved}},{key:"onLastListenerRemoved",get:function(){return this._onLastListenerRemoved||(this._onLastListenerRemoved=new c("".concat(this._name,":onLastListenerRemoved"))),this._onLastListenerRemoved}}],[{key:"isValidListener",value:function(e){return"function"==typeof e||e instanceof c}}]),c}(),EventEmitter=function(){function e(){_classCallCheck(this,e),this._channels=new Map}return _createClass(e,[{key:"addListener",value:function(e,t,n){this._getChannel(e).addListener(t,n)}},{key:"on",value:function(e,t,n){this.addListener(e,t,n)}},{key:"addOnceListener",value:function(e,t,n){this._getChannel(e).addOnceListener(t,n)}},{key:"once",value:function(e,t,n){this.addOnceListener(e,t,n)}},{key:"removeListener",value:function(e,t,n){this._getChannel(e).removeListener(t,n)}},{key:"off",value:function(e,t,n){this.removeListener(e,t,n)}},{key:"hasListener",value:function(e,t,n){return this._getChannel(e).hasListener(t,n)}},{key:"has",value:function(e,t,n){return this.hasListener(e,t,n)}},{key:"hasListeners",value:function(e){return this._getChannel(e).hasListeners()}},{key:"dispatch",value:function(e){for(var t,n=arguments.length,r=new Array(1<n?n-1:0),i=1;i<n;i++)r[i-1]=arguments[i];(t=this._getChannel(e)).dispatch.apply(t,r)}},{key:"emit",value:function(e){for(var t=arguments.length,n=new Array(1<t?t-1:0),r=1;r<t;r++)n[r-1]=arguments[r];this.dispatch.apply(this,[e].concat(n))}},{key:"_getChannel",value:function(e){return this._channels.has(e)||this._channels.set(e,new Channel(e)),this._channels.get(e)}}]),e}(),SubscriptionItem=function(){function t(e){_classCallCheck(this,t),this._params=e,this._isOn=!1,this._assertParams()}return _createClass(t,[{key:"on",value:function(){if(!this._isOn){var e=this._params.channel,t=e.addListener||e.addEventListener||e.on;this._applyMethod(t),this._isOn=!0}}},{key:"off",value:function(){if(this._isOn){var e=this._params.channel,t=e.removeListener||e.removeEventListener||e.off;this._applyMethod(t),this._isOn=!1}}},{key:"_applyMethod",value:function(e){var t=this._params,n=t.channel,r=t.event,i=t.listener,s=r?[r,i]:[i];e.apply(n,s)}},{key:"_assertParams",value:function(){var e=this._params,t=e.channel,n=e.event,r=e.listener;if(!t||"object"!==_typeof(t))throw new Error("Channel should be object");if(n&&"string"!=typeof n)throw new Error("Event should be string");if(!r||!Channel.isValidListener(r))throw new Error("Listener should be function or Channel")}}]),t}(),Subscription=function(){function t(e){_classCallCheck(this,t),this._items=e.map(function(e){return new SubscriptionItem(e)})}return _createClass(t,[{key:"on",value:function(){return this._items.forEach(function(e){return e.on()}),this}},{key:"off",value:function(){return this._items.forEach(function(e){return e.off()}),this}}]),t}(),ReactSubscription=function(){_inherits(i,Subscription);var r=_createSuper(i);function i(e,t){var n;return _classCallCheck(this,i),(n=r.call(this,t))._overrideComponentCallback(e,"componentDidMount","on"),n._overrideComponentCallback(e,"componentWillUnmount","off"),n}return _createClass(i,[{key:"_overrideComponentCallback",value:function(r,e,i){var s=this,o=r[e];r[e]=function(){if(s[i](),"function"==typeof o){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];return o.apply(r,t)}}}}]),i}(),chnl=Channel;chnl.EventEmitter=EventEmitter,chnl.Subscription=Subscription,chnl.ReactSubscription=ReactSubscription,module.exports=chnl; |
{ | ||
"name": "chnl", | ||
"version": "1.1.1", | ||
"version": "1.2.0", | ||
"description": "Implementation of event channels compatible with Chrome extensions events API", | ||
@@ -42,16 +42,16 @@ "main": "dist/channel.cjs.js", | ||
"devDependencies": { | ||
"@babel/core": "^7.7.7", | ||
"@babel/preset-env": "^7.7.7", | ||
"ava": "^2.4.0", | ||
"coveralls": "^3.0.9", | ||
"documentation": "^12.1.4", | ||
"@babel/core": "^7.9.6", | ||
"@babel/preset-env": "^7.9.6", | ||
"ava": "^3.8.1", | ||
"coveralls": "^3.1.0", | ||
"documentation": "^12.3.0", | ||
"eslint": "^6.8.0", | ||
"eslint-plugin-ava": "^9.0.0", | ||
"husky": "^3.1.0", | ||
"lint-staged": "^9.5.0", | ||
"rollup": "^1.27.14", | ||
"eslint-plugin-ava": "^10.3.0", | ||
"husky": "^4.2.5", | ||
"lint-staged": "^10.2.2", | ||
"rollup": "^2.8.0", | ||
"rollup-plugin-analyzer": "^3.2.2", | ||
"rollup-plugin-babel": "^4.3.3", | ||
"rollup-plugin-babel": "^4.4.0", | ||
"rollup-plugin-uglify": "^6.0.4", | ||
"sinon": "^8.0.1" | ||
"sinon": "^9.0.2" | ||
}, | ||
@@ -58,0 +58,0 @@ "ava": { |
@@ -30,2 +30,12 @@ /** | ||
/** | ||
* Check for the passed listener is valid. | ||
* | ||
* @param {*} listener | ||
* @returns {Boolean} | ||
*/ | ||
static isValidListener(listener) { | ||
return typeof listener === 'function' || listener instanceof Channel; | ||
} | ||
/** | ||
* Triggers when listener is added to channel. | ||
@@ -79,4 +89,4 @@ * | ||
/** | ||
* Add listener for event | ||
* @param {Function} callback | ||
* Add listener for event. | ||
* @param {Function|Channel} callback | ||
* @param {Object} [context] | ||
@@ -89,4 +99,4 @@ */ | ||
/** | ||
* Add once listener for event | ||
* @param {Function} callback | ||
* Add once listener for event. | ||
* @param {Function|Channel} callback | ||
* @param {Object} [context] | ||
@@ -99,8 +109,8 @@ */ | ||
/** | ||
* Remove listener from event | ||
* @param {Function} callback | ||
* Remove listener from event. | ||
* @param {Function|Channel} callback | ||
* @param {Object} [context] | ||
*/ | ||
removeListener(callback, context) { | ||
this._ensureFunction(callback); | ||
this._ensureListener(callback); | ||
const index = this._indexOfListener(callback, context); | ||
@@ -122,4 +132,4 @@ if (index >= 0) { | ||
/** | ||
* Is listener exist | ||
* @param {Function} callback | ||
* Is listener exist. | ||
* @param {Function|Channel} callback | ||
* @param {Object} [context] | ||
@@ -129,3 +139,3 @@ * @returns {Boolean} | ||
hasListener(callback, context) { | ||
this._ensureFunction(callback); | ||
this._ensureListener(callback); | ||
return this._indexOfListener(callback, context) >= 0; | ||
@@ -135,3 +145,3 @@ } | ||
/** | ||
* Are there any listeners | ||
* Are there any listeners. | ||
* @returns {Boolean} | ||
@@ -144,3 +154,3 @@ */ | ||
/** | ||
* Call all listeners with specified params | ||
* Call all listeners with specified params. | ||
*/ | ||
@@ -152,3 +162,3 @@ dispatch(...args) { | ||
/** | ||
* Call all listeners with specified params asynchronously | ||
* Call all listeners with specified params asynchronously. | ||
*/ | ||
@@ -160,3 +170,3 @@ dispatchAsync(...args) { | ||
/** | ||
* Mute channel | ||
* Mute channel. | ||
* @param {Object} [options] | ||
@@ -176,3 +186,3 @@ * @param {Boolean} [options.accumulate] accumulate events and call listeners after .unmute() | ||
/** | ||
* Unmute channel | ||
* Unmute channel. | ||
*/ | ||
@@ -215,6 +225,15 @@ unmute() { | ||
_invokeListener(listener, options) { | ||
const isListenerChannel = listener.callback instanceof Channel; | ||
if (options.async) { | ||
setTimeout(() => listener.callback.apply(listener.context, options.args), 0); | ||
if (isListenerChannel) { | ||
listener.callback.dispatchAsync(...options.args); | ||
} else { | ||
setTimeout(() => listener.callback.apply(listener.context, options.args), 0); | ||
} | ||
} else { | ||
listener.callback.apply(listener.context, options.args); | ||
if (isListenerChannel) { | ||
listener.callback.dispatch(...options.args); | ||
} else { | ||
listener.callback.apply(listener.context, options.args); | ||
} | ||
} | ||
@@ -224,8 +243,9 @@ } | ||
/** | ||
* Ensure function | ||
* @param {Function} callback | ||
* Ensure listener. | ||
* @param {Function|Channel} listener | ||
* @private | ||
*/ | ||
_ensureFunction(callback) { | ||
if (typeof callback !== 'function') { | ||
throw new Error('Channel ' + this._name + ': listener is not a function'); | ||
_ensureListener(listener) { | ||
if (!Channel.isValidListener(listener)) { | ||
throw new Error('Channel ' + this._name + ': listener is not a function and not a Channel'); | ||
} | ||
@@ -235,3 +255,3 @@ } | ||
/** | ||
* Dispatch inner events when listener is added | ||
* Dispatch inner events when listener is added. | ||
* @private | ||
@@ -249,3 +269,3 @@ */ | ||
/** | ||
* Dispatch inner events when listener is removed | ||
* Dispatch inner events when listener is removed. | ||
* @private | ||
@@ -263,4 +283,4 @@ */ | ||
/** | ||
* Find listener index | ||
* @param {Function} callback | ||
* Find listener index. | ||
* @param {Function|Channel} callback | ||
* @param {Object} [context] | ||
@@ -273,5 +293,6 @@ * @private | ||
const equalCallbacks = listener.callback === callback; | ||
const isListenerChannel = callback instanceof Channel; | ||
const emptyContexts = context === undefined && listener.context === undefined; | ||
const equalContexts = context === listener.context; | ||
if (equalCallbacks && (emptyContexts || equalContexts)) { | ||
if (equalCallbacks && (isListenerChannel || emptyContexts || equalContexts)) { | ||
return i; | ||
@@ -283,3 +304,3 @@ } | ||
/** | ||
* Dispatch accumulated events | ||
* Dispatch accumulated events. | ||
* @private | ||
@@ -293,12 +314,13 @@ */ | ||
/** | ||
* Pushes listener | ||
* @param {Function} callback | ||
* Pushes listener. | ||
* @param {Function|Channel} listener | ||
* @param {Object} context | ||
* @param {Boolean} once | ||
* @private | ||
*/ | ||
_pushListener(callback, context, once) { | ||
this._ensureFunction(callback); | ||
this._checkForDuplicates(callback, context); | ||
this._listeners.push({callback, context, once}); | ||
this._dispatchInnerAddEvents(callback, context, once); | ||
_pushListener(listener, context, once) { | ||
this._ensureListener(listener); | ||
this._checkForDuplicates(listener, context); | ||
this._listeners.push({callback: listener, context, once}); | ||
this._dispatchInnerAddEvents(listener, context, once); | ||
} | ||
@@ -308,7 +330,7 @@ | ||
* Check for listeners duplicates | ||
* @param {Function} callback | ||
* @param {Function|Channel} listener | ||
* @param {Object} context | ||
*/ | ||
_checkForDuplicates(callback, context) { | ||
if (this.hasListener(callback, context)) { | ||
_checkForDuplicates(listener, context) { | ||
if (this.hasListener(listener, context)) { | ||
throw new Error('Channel ' + this._name + ': duplicating listeners'); | ||
@@ -319,4 +341,5 @@ } | ||
/** | ||
* Splice listener under index | ||
* Splice listener under index. | ||
* @param {Number} index | ||
* @private | ||
*/ | ||
@@ -323,0 +346,0 @@ _spliceListener(index) { |
@@ -26,3 +26,3 @@ import Channel from './channel'; | ||
* @param {String} event | ||
* @param {Function} callback | ||
* @param {Function|Channel} callback | ||
* @param {Object} [context] | ||
@@ -38,3 +38,3 @@ */ | ||
* @param {String} event | ||
* @param {Function} callback | ||
* @param {Function|Channel} callback | ||
* @param {Object} [context] | ||
@@ -50,3 +50,3 @@ */ | ||
* @param {String} event | ||
* @param {Function} callback | ||
* @param {Function|Channel} callback | ||
* @param {Object} [context] | ||
@@ -62,3 +62,3 @@ */ | ||
* @param {String} event | ||
* @param {Function} callback | ||
* @param {Function|Channel} callback | ||
* @param {Object} [context] | ||
@@ -74,3 +74,3 @@ */ | ||
* @param {String} event | ||
* @param {Function} callback | ||
* @param {Function|Channel} callback | ||
* @param {Object} [context] | ||
@@ -86,3 +86,3 @@ */ | ||
* @param {String} event | ||
* @param {Function} callback | ||
* @param {Function|Channel} callback | ||
* @param {Object} [context] | ||
@@ -98,3 +98,3 @@ */ | ||
* @param {String} event | ||
* @param {Function} callback | ||
* @param {Function|Channel} callback | ||
* @param {Object} [context] | ||
@@ -111,3 +111,3 @@ * @returns {Boolean} | ||
* @param {String} event | ||
* @param {Function} callback | ||
* @param {Function|Channel} callback | ||
* @param {Object} [context] | ||
@@ -114,0 +114,0 @@ * @returns {Boolean} |
@@ -0,1 +1,3 @@ | ||
import Channel from './channel'; | ||
/** | ||
@@ -12,3 +14,3 @@ * Subscription item | ||
* @param {String} [params.event] | ||
* @param {Function} params.listener | ||
* @param {Function|Channel} params.listener | ||
*/ | ||
@@ -59,6 +61,6 @@ constructor(params) { | ||
} | ||
if (!listener || typeof listener !== 'function') { | ||
throw new Error('Listener should be function'); | ||
if (!listener || !Channel.isValidListener(listener)) { | ||
throw new Error('Listener should be function or Channel'); | ||
} | ||
} | ||
} |
@@ -30,3 +30,3 @@ import SubscriptionItem from './subscription-item'; | ||
* | ||
* @returns {Subscription} | ||
* @returns {this} | ||
*/ | ||
@@ -41,3 +41,3 @@ on() { | ||
* | ||
* @returns {Subscription} | ||
* @returns {this} | ||
*/ | ||
@@ -44,0 +44,0 @@ off() { |
@@ -0,4 +1,5 @@ | ||
import {Listener} from "./general"; | ||
type ChannelMethod = (callback: (...args: any[]) => any, context?: any) => void; | ||
type ChannelBooleanMethod = (callback: (...args: any[]) => any, context?: any) => boolean; | ||
type ChannelMethod = (callback: Listener, context?: any) => void; | ||
type ChannelBooleanMethod = (callback: Listener, context?: any) => boolean; | ||
@@ -5,0 +6,0 @@ export = Channel; |
@@ -0,4 +1,6 @@ | ||
import Channel from './channel'; | ||
import {Listener} from './general'; | ||
type EventEmitterMethod = (event: string, callback: (...args: any[]) => any, context?: any) => void; | ||
type EventEmitterBooleanMethod = (event: string, callback: (...args: any[]) => any, context?: any) => boolean; | ||
type EventEmitterMethod = (event: string, callback: Listener, context?: any) => void; | ||
type EventEmitterBooleanMethod = (event: string, callback: Listener, context?: any) => boolean; | ||
@@ -5,0 +7,0 @@ export = EventEmitter; |
import Subscription = require('./subscription'); | ||
import SubscriptionItem = require('./subscription-item'); | ||
import Subscription from './subscription'; | ||
import {SubscriptionItemParams} from './subscription-item'; | ||
@@ -8,3 +8,3 @@ export = ReactSubscription; | ||
declare class ReactSubscription extends Subscription { | ||
constructor(component: object, items: SubscriptionItem[]); | ||
constructor(component: object, items: SubscriptionItemParams[]); | ||
} |
import Channel = require('./channel'); | ||
import {Listener} from './general'; | ||
export = SubscriptionItem; | ||
interface SubscriptionItemParams { | ||
export interface SubscriptionItemParams { | ||
channel: Channel; | ||
listener: (...args: any[]) => any; | ||
listener: Listener; | ||
event?: string; | ||
} | ||
declare class SubscriptionItem { | ||
export class SubscriptionItem { | ||
constructor(params: SubscriptionItemParams); | ||
@@ -14,0 +13,0 @@ on(): void; |
@@ -0,10 +1,9 @@ | ||
import {SubscriptionItemParams} from './subscription-item'; | ||
import SubscriptionItem = require('./subscription-item'); | ||
export = Subscription; | ||
declare class Subscription { | ||
constructor(items: SubscriptionItem[]); | ||
on(): void; | ||
off(): void; | ||
constructor(items: SubscriptionItemParams[]); | ||
on(): this; | ||
off(): this; | ||
} |
33668
750