mirror of
https://github.com/Hopiu/postal.js.git
synced 2026-03-16 22:20:23 +00:00
1 line
No EOL
6.9 KiB
JavaScript
1 line
No EOL
6.9 KiB
JavaScript
define(["underscore"],function(e,t){var n="/",r=50,i=0,s="postal",o=function(){},u=function(){var t=[];return function(n){var r=!e.any(t,function(t){return e.isObject(n)||e.isArray(n)?e.isEqual(n,t):n===t});return r&&t.push(n),r}},a=function(){var t;return function(n){var r=!1;return e.isString(n)?(r=n===t,t=n):(r=e.isEqual(n,t),t=e.clone(n)),!r}},f=function(e,t){this.channel=e||n,this._topic=t||""};f.prototype={subscribe:function(){var e=arguments.length;if(e===1)return new l(this.channel,this._topic,arguments[0]);if(e===2)return new l(this.channel,arguments[0],arguments[1])},publish:function(e){var t=e||{},n={channel:this.channel,topic:this._topic,data:t};return t.topic&&t.data&&(n=t,n.channel=n.channel||this.channel),n.timeStamp=new Date,m.configuration.bus.publish(n),n},topic:function(e){return e===this._topic?this:new f(this.channel,e)}};var l=function(e,t,n){this.channel=e,this.topic=t,this.callback=n,this.priority=r,this.constraints=new Array(0),this.maxCalls=i,this.onHandled=o,this.context=null,m.configuration.bus.publish({channel:s,topic:"subscription.created",timeStamp:new Date,data:{event:"subscription.created",channel:e,topic:t}}),m.configuration.bus.subscribe(this)};l.prototype={unsubscribe:function(){m.configuration.bus.unsubscribe(this),m.configuration.bus.publish({channel:s,topic:"subscription.removed",timeStamp:new Date,data:{event:"subscription.removed",channel:this.channel,topic:this.topic}})},defer:function(){var e=this.callback;return this.callback=function(t){setTimeout(e,0,t)},this},disposeAfter:function(t){if(e.isNaN(t)||t<=0)throw"The value provided to disposeAfter (maxCalls) must be a number greater than zero.";var n=this.onHandled,r=e.after(t,e.bind(function(){this.unsubscribe(this)},this));return this.onHandled=function(){n.apply(this.context,arguments),r()},this},distinctUntilChanged:function(){return this.withConstraint(new a),this},distinct:function(){return this.withConstraint(new u),this},withConstraint:function(t){if(!e.isFunction(t))throw"Predicate constraint must be a function";return this.constraints.push(t),this},withConstraints:function(t){var n=this;return e.isArray(t)&&e.each(t,function(e){n.withConstraint(e)}),n},withContext:function(e){return this.context=e,this},withDebounce:function(t){if(e.isNaN(t))throw"Milliseconds must be a number";var n=this.callback;return this.callback=e.debounce(n,t),this},withDelay:function(t){if(e.isNaN(t))throw"Milliseconds must be a number";var n=this.callback;return this.callback=function(e){setTimeout(function(){n(e)},t)},this},withPriority:function(t){if(e.isNaN(t))throw"Priority must be a number";return this.priority=t,m.configuration.bus.changePriority(this),this},withThrottle:function(t){if(e.isNaN(t))throw"Milliseconds must be a number";var n=this.callback;return this.callback=e.throttle(n,t),this},subscribe:function(e){return this.callback=e,this}};var c={cache:{},compare:function(e,t){if(this.cache[t]&&this.cache[t][e])return!0;var n=("^"+e.replace(/\./g,"\\.").replace(/\*/g,"[A-Z,a-z,0-9]*").replace(/#/g,".*")+"$").replace("\\..*$","(\\..*)*$").replace("^.*\\.","^(.*\\.)*"),r=new RegExp(n),i=r.test(t);return i&&(this.cache[t]||(this.cache[t]={}),this.cache[t][e]=!0),i},reset:function(){this.cache={}}},h={addWireTap:function(e){var t=this;return t.wireTaps.push(e),function(){var n=t.wireTaps.indexOf(e);n!==-1&&t.wireTaps.splice(n,1)}},changePriority:function(t){var n,r;if(this.subscriptions[t.channel]&&this.subscriptions[t.channel][t.topic]){this.subscriptions[t.channel][t.topic]=e.without(this.subscriptions[t.channel][t.topic],t),n=this.subscriptions[t.channel][t.topic].length-1;for(;n>=0;n--)if(this.subscriptions[t.channel][t.topic][n].priority<=t.priority){this.subscriptions[t.channel][t.topic].splice(n+1,0,t),r=!0;break}r||this.subscriptions[t.channel][t.topic].unshift(t)}},publish:function(t){e.each(this.wireTaps,function(e){e(t.data,t)}),e.each(this.subscriptions[t.channel],function(n){e.each(e.clone(n),function(n){m.configuration.resolver.compare(n.topic,t.topic)&&e.all(n.constraints,function(e){return e(t.data,t)})&&typeof n.callback=="function"&&(n.callback.apply(n.context,[t.data,t]),n.onHandled())})})},reset:function(){this.subscriptions&&(e.each(this.subscriptions,function(t){e.each(t,function(e){while(e.length)e.pop().unsubscribe()})}),this.subscriptions={})},subscribe:function(e){var t,n,r,i=this.subscriptions[e.channel],s;return i||(i=this.subscriptions[e.channel]={}),s=this.subscriptions[e.channel][e.topic],s||(s=this.subscriptions[e.channel][e.topic]=new Array(0)),s.push(e),e},subscriptions:{},wireTaps:new Array(0),unsubscribe:function(e){if(this.subscriptions[e.channel][e.topic]){var t=this.subscriptions[e.channel][e.topic].length,n=0;for(;n<t;n++)if(this.subscriptions[e.channel][e.topic][n]===e){this.subscriptions[e.channel][e.topic].splice(n,1);break}}}},p={1:function(e){if(!e)throw new Error("publishing from the 'global' postal.publish call requires a valid envelope.");return e.channel=e.channel||n,e.timeStamp=new Date,m.configuration.bus.publish(e),e},2:function(e,t){var r={channel:n,topic:e,timeStamp:new Date,data:t};return m.configuration.bus.publish(r),r},3:function(e,t,n){var r={channel:e,topic:t,timeStamp:new Date,data:n};return m.configuration.bus.publish(r),r}},d={1:function(e){var t=e,r,i={};return Object.prototype.toString.call(t)==="[object String]"?(t=n,r=e):(t=e.channel||n,r=e.topic,i=e.options||i),new m.channelTypes[i.type||"local"](t,r)},2:function(e,t){var r=e,i=t,s={};return Object.prototype.toString.call(t)==="[object Object]"&&(r=n,i=e,s=t),new m.channelTypes[s.type||"local"](r,i)},3:function(e,t,n){return new m.channelTypes[n.type||"local"](e,t)}},v={};h.subscriptions[s]={};var m={configuration:{bus:h,resolver:c,DEFAULT_CHANNEL:n,DEFAULT_PRIORITY:r,DEFAULT_DISPOSEAFTER:i,SYSTEM_CHANNEL:s},channelTypes:{local:f},channel:function(){var e=arguments.length;if(d[e])return d[e].apply(this,arguments)},subscribe:function(e){var t=e.callback,r=e.topic,i=e.channel||n;return new l(i,r,t)},publish:function(){var e=arguments.length;if(p[e])return p[e].apply(this,arguments)},addWireTap:function(e){return this.configuration.bus.addWireTap(e)},linkChannels:function(t,r){var i=[];return e.isArray(t)||(t=[t]),e.isArray(r)||(r=[r]),e.each(t,function(t){var s=t.topic||"#";e.each(r,function(r){var s=r.channel||n;i.push(m.subscribe({channel:t.channel||n,topic:t.topic||"#",callback:function(t,n){var i=n;i.topic=e.isFunction(r.topic)?r.topic(n.topic):r.topic||n.topic,i.channel=s,i.data=t,m.publish(i)}}))})}),i},utils:{getSubscribersFor:function(){var e=arguments[0],t=arguments[1],n=[];return arguments.length===1&&(Object.prototype.toString.call(e)==="[object String]"?(e=m.configuration.DEFAULT_CHANNEL,t=arguments[0]):(e=arguments[0].channel||m.configuration.DEFAULT_CHANNEL,t=arguments[0].topic)),m.configuration.bus.subscriptions[e]&&m.configuration.bus.subscriptions[e].hasOwnProperty(t)&&(n=m.configuration.bus.subscriptions[e][t]),n},reset:function(){m.configuration.bus.reset(),m.configuration.resolver.reset()}}};return m}) |