UNPKG

@simple-ui/cable

Version:

Cable is a messaging utility with tree and graph message broadcasting combining the centricity of mediators with the semantic protections of signal-slot.

1 lines 5.4 kB
"use strict";function _interopRequireDefault(t){return t&&t.__esModule?t:{"default":t}}function _classCallCheck(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(exports,"__esModule",{value:!0});var _createClass=function(){function t(t,e){for(var n=0;n<e.length;n++){var a=e[n];a.enumerable=a.enumerable||!1,a.configurable=!0,"value"in a&&(a.writable=!0),Object.defineProperty(t,a.key,a)}}return function(e,n,a){return n&&t(e.prototype,n),a&&t(e,a),e}}(),_lodash=require("lodash"),_lodash2=_interopRequireDefault(_lodash),Cable=function(){function t(e,n){_classCallCheck(this,t),e=_lodash2["default"].isString(e)?e:_lodash2["default"].isString(n)?n:"root",n=_lodash2["default"].defaults(n,{asynchronous:!0}),n.invocation=n.asynchronous?"defer":"attempt",this._={id:_lodash2["default"].uniqueId(),channelName:e,options:n,root:void 0,parentsChannels:[],parentsPath:"",channels:[],bridges:[],slots:[]}}return _createClass(t,[{key:"channel",value:function(e){var n=this;if(e instanceof t)this._channel(e);else{if(!_lodash2["default"].isString(e))throw new Error("cannot add channel without a non-string or Cable object");_lodash2["default"].each(this._deconstructChannelPath(e),function(e){var a=_lodash2["default"].isUndefined(n[e])?new t(e,n._.options):n[e];n._channel(a),n=a})}return this}},{key:"_channel",value:function(t){return t.root=this,_lodash2["default"].isUndefined(this[t.channelName])&&this._.channels.push(t.channelName),this[t.channelName]=t,this}},{key:"bridge",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this;return t=_lodash2["default"].isString(t)?this.lookup(t):t,e=_lodash2["default"].isString(e)?this.lookup(e):e,e._.bridges.push(t),this}},{key:"lookup",value:function(t){return _lodash2["default"].reduce(this._deconstructChannelPath(t),function(t,e){return t[e]},this)}},{key:"flood",value:function(){for(var t=arguments.length,e=Array(t),n=0;t>n;n++)e[n]=arguments[n];return this._message("_flood",e)}},{key:"emit",value:function(){for(var t=arguments.length,e=Array(t),n=0;t>n;n++)e[n]=arguments[n];return this._message("_emit",e)}},{key:"publish",value:function(){for(var t=arguments.length,e=Array(t),n=0;t>n;n++)e[n]=arguments[n];return this._message("_publish",e)}},{key:"broadcast",value:function(){for(var t=arguments.length,e=Array(t),n=0;t>n;n++)e[n]=arguments[n];return this._message("_broadcast",e)}},{key:"_message",value:function(e,n){var a=this,i=_lodash2["default"].isFunction(this._.receiptFn)?this._.receiptFn:t.receiptFn;return this._.receiptFn=void 0,_lodash2["default"][this._.options.invocation](function(){a[e]({},i,n)}),this}},{key:"_flood",value:function(t,e,n){var a=this;if(!t[this.uniquePath])return t[this.uniquePath]=!0,this._invokeSlots(e,n),this._.root&&this._.root._flood(t,e,n),_lodash2["default"].each(this._.channels,function(i){a[i]._flood(t,e,n)}),_lodash2["default"].each(this._.bridges,function(a){a._flood(t,e,n)}),this}},{key:"_emit",value:function(t,e,n){var a=this._.root;if(!a)return this;if(!t[this.uniquePath])return t[this.uniquePath]=!0,a._invokeSlots(e,n),a._emit(t,e,n),_lodash2["default"].each(this._.bridges,function(a){a._emit(t,e,n)}),this}},{key:"_publish",value:function(t,e,n){return t[this.uniquePath]?void 0:(t[this.uniquePath]=!0,this._invokeSlots(e,n),_lodash2["default"].each(this._.bridges,function(a){a._publish(t,e,n)}),this)}},{key:"_broadcast",value:function(t,e,n){var a=this;if(!t[this.uniquePath])return t[this.uniquePath]=!0,_lodash2["default"].each(this._.channels,function(i){a[i]._invokeSlots(e,n),a[i]._broadcast(t,e,n)}),_lodash2["default"].each(this._.bridges,function(a){a._broadcast(t,e,n)}),this}},{key:"_invokeSlots",value:function(e,n){var a=this;_lodash2["default"].each(this._.slots,function(t){e(t.method.apply(t.host,n))}),_lodash2["default"].each(t.taps,function(t){t(a,n)})}},{key:"receipt",value:function(t){return this._.receiptFn=t,this}},{key:"subscribe",value:function(t,e){var n=this,a=!_lodash2["default"].isUndefined(e);return e=a?e:t,t=a?t:n,a&&_lodash2["default"].isString(e)&&(e=t[e]),this._.slots.push({host:t,method:e}),this}},{key:"_deconstructChannelPath",value:function(t){var e=this._splitChannelNameByGroupingCharacter(t);return""===e?[t]:t.split(e)}},{key:"_splitChannelNameByGroupingCharacter",value:function(t){return _lodash2["default"].reduce([".","/",":"],function(e,n){return e+(t.indexOf(n)>=0?n:"")},"")}},{key:"toString",value:function(){return this.uniquePath}},{key:"id",get:function(){return _lodash2["default"].isUndefined(this._.id)?"":this._.id}},{key:"channelName",get:function(){return _lodash2["default"].isUndefined(this._.channelName)?"":this._.channelName}},{key:"parentsPath",get:function(){return _lodash2["default"].isUndefined(this._.parentsPath)?"":this._.parentsPath}},{key:"uniquePath",get:function(){return this.parentsPath.length>0?this.parentsPath+"-"+this.channelName+"-"+this.id:this.channelName+"-"+this.id}},{key:"parent",set:function(t){this.root=t},get:function(){return this.root}},{key:"root",set:function(t){var e=[];for(this._.root=t;t;)e.push(t.channelName),t=t.root;this._.parentsChannels=e.length<=0?e:e.reverse(),this._.parentsPath=this._.parentsChannels.join("-")},get:function(){return this._.root}}],[{key:"receiptFn",value:function(){}},{key:"tap",value:function(e){t.taps=t.taps||[],t.taps.push(e)}}]),t}();exports["default"]=Cable;