postal.js/example/node/client/js/lib/postal.min.js

7 lines
No EOL
7.3 KiB
JavaScript

/*
postal
Author: Jim Cowart (http://freshbrewedcode.com/jimcowart)
License: Dual licensed MIT (http://www.opensource.org/licenses/mit-license) & GPL (http://www.opensource.org/licenses/gpl-license)
Version 0.7.3
*/
(function(e,t){typeof define=="function"&&define.amd?define(["underscore"],function(n){return t(n,e)}):t(e._,e)})(this,function(e,t,n){var r="/",i=50,s=0,o="postal",u=function(){},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(){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}},l=function(e,t){this.channel=e||r,this._topic=t||""};l.prototype={subscribe:function(){var e=arguments.length;if(e===1)return new c(this.channel,this._topic,arguments[0]);if(e===2)return new c(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,g.configuration.bus.publish(n),n},topic:function(e){return e===this._topic?this:new l(this.channel,e)}};var c=function(e,t,n){this.channel=e,this.topic=t,this.callback=n,this.priority=i,this.constraints=new Array(0),this.maxCalls=s,this.onHandled=u,this.context=null,g.configuration.bus.publish({channel:o,topic:"subscription.created",timeStamp:new Date,data:{event:"subscription.created",channel:e,topic:t}}),g.configuration.bus.subscribe(this)};c.prototype={unsubscribe:function(){g.configuration.bus.unsubscribe(this),g.configuration.bus.publish({channel:o,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 f),this},once:function(){this.disposeAfter(1)},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,g.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 h={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={}}},p={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)}),this.subscriptions[t.channel]&&e.each(this.subscriptions[t.channel],function(n){e.each(e.clone(n),function(n){g.configuration.resolver.compare(n.topic,t.topic)&&e.all(n.constraints,function(e){return e.call(n.context,t.data,t)})&&typeof n.callback=="function"&&(n.callback.call(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}}}},d={1:function(e){if(!e)throw new Error("publishing from the 'global' postal.publish call requires a valid envelope.");return e.channel=e.channel||r,e.timeStamp=new Date,g.configuration.bus.publish(e),e},2:function(e,t){var n={channel:r,topic:e,timeStamp:new Date,data:t};return g.configuration.bus.publish(n),n},3:function(e,t,n){var r={channel:e,topic:t,timeStamp:new Date,data:n};return g.configuration.bus.publish(r),r}},v={1:function(e){var t=e,n,i={};return Object.prototype.toString.call(t)==="[object String]"?(t=r,n=e):(t=e.channel||r,n=e.topic,i=e.options||i),new g.channelTypes[i.type||"local"](t,n)},2:function(e,t){var n=e,i=t,s={};return Object.prototype.toString.call(t)==="[object Object]"&&(n=r,i=e,s=t),new g.channelTypes[s.type||"local"](n,i)},3:function(e,t,n){return new g.channelTypes[n.type||"local"](e,t)}},m={};p.subscriptions[o]={};var g={configuration:{bus:p,resolver:h,DEFAULT_CHANNEL:r,DEFAULT_PRIORITY:i,DEFAULT_DISPOSEAFTER:s,SYSTEM_CHANNEL:o},channelTypes:{local:l},channel:function(){var e=arguments.length;if(v[e])return v[e].apply(this,arguments)},subscribe:function(e){var t=e.callback,n=e.topic,i=e.channel||r;return new c(i,n,t)},publish:function(){var e=arguments.length;if(d[e])return d[e].apply(this,arguments)},addWireTap:function(e){return this.configuration.bus.addWireTap(e)},linkChannels:function(t,n){var i=[];return e.isArray(t)||(t=[t]),e.isArray(n)||(n=[n]),e.each(t,function(t){var s=t.topic||"#";e.each(n,function(n){var s=n.channel||r;i.push(g.subscribe({channel:t.channel||r,topic:t.topic||"#",callback:function(t,r){var i=e.clone(r);i.topic=e.isFunction(n.topic)?n.topic(r.topic):n.topic||r.topic,i.channel=s,i.data=t,g.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=g.configuration.DEFAULT_CHANNEL,t=arguments[0]):(e=arguments[0].channel||g.configuration.DEFAULT_CHANNEL,t=arguments[0].topic)),g.configuration.bus.subscriptions[e]&&g.configuration.bus.subscriptions[e].hasOwnProperty(t)&&(n=g.configuration.bus.subscriptions[e][t]),n},reset:function(){g.configuration.bus.reset(),g.configuration.resolver.reset()}}};return t.postal=g,g})