postal.js/example/node/client/js/lib/postal.min.js
2012-09-25 21:23:06 -04:00

7 lines
No EOL
7.2 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.2
*/
(function(e,t,n){typeof define=="function"&&define.amd?define(["underscore"],function(r){return n(r,e,t)}):n(e._,e,t)})(this,document,function(e,t,n,r){var i="/",s=50,o=0,u="postal",a=function(){},f=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}},l=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}},c=function(e,t){this.channel=e||i,this._topic=t||""};c.prototype={subscribe:function(){var e=arguments.length;if(e===1)return new h(this.channel,this._topic,arguments[0]);if(e===2)return new h(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,y.configuration.bus.publish(n),n},topic:function(e){return e===this._topic?this:new c(this.channel,e)}};var h=function(e,t,n){this.channel=e,this.topic=t,this.callback=n,this.priority=s,this.constraints=new Array(0),this.maxCalls=o,this.onHandled=a,this.context=null,y.configuration.bus.publish({channel:u,topic:"subscription.created",timeStamp:new Date,data:{event:"subscription.created",channel:e,topic:t}}),y.configuration.bus.subscribe(this)};h.prototype={unsubscribe:function(){y.configuration.bus.unsubscribe(this),y.configuration.bus.publish({channel:u,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 f),this},distinct:function(){return this.withConstraint(new l),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,y.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 p={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={}}},d={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){y.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}}}},v={1:function(e){if(!e)throw new Error("publishing from the 'global' postal.publish call requires a valid envelope.");return e.channel=e.channel||i,e.timeStamp=new Date,y.configuration.bus.publish(e),e},2:function(e,t){var n={channel:i,topic:e,timeStamp:new Date,data:t};return y.configuration.bus.publish(n),n},3:function(e,t,n){var r={channel:e,topic:t,timeStamp:new Date,data:n};return y.configuration.bus.publish(r),r}},m={1:function(e){var t=e,n,r={};return Object.prototype.toString.call(t)==="[object String]"?(t=i,n=e):(t=e.channel||i,n=e.topic,r=e.options||r),new y.channelTypes[r.type||"local"](t,n)},2:function(e,t){var n=e,r=t,s={};return Object.prototype.toString.call(t)==="[object Object]"&&(n=i,r=e,s=t),new y.channelTypes[s.type||"local"](n,r)},3:function(e,t,n){return new y.channelTypes[n.type||"local"](e,t)}},g={};d.subscriptions[u]={};var y={configuration:{bus:d,resolver:p,DEFAULT_CHANNEL:i,DEFAULT_PRIORITY:s,DEFAULT_DISPOSEAFTER:o,SYSTEM_CHANNEL:u},channelTypes:{local:c},channel:function(){var e=arguments.length;if(m[e])return m[e].apply(this,arguments)},subscribe:function(e){var t=e.callback,n=e.topic,r=e.channel||i;return new h(r,n,t)},publish:function(){var e=arguments.length;if(v[e])return v[e].apply(this,arguments)},addWireTap:function(e){return this.configuration.bus.addWireTap(e)},linkChannels:function(t,n){var r=[];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||i;r.push(y.subscribe({channel:t.channel||i,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,y.publish(i)}}))})}),r},utils:{getSubscribersFor:function(){var e=arguments[0],t=arguments[1],n=[];return arguments.length===1&&(Object.prototype.toString.call(e)==="[object String]"?(e=y.configuration.DEFAULT_CHANNEL,t=arguments[0]):(e=arguments[0].channel||y.configuration.DEFAULT_CHANNEL,t=arguments[0].topic)),y.configuration.bus.subscriptions[e]&&y.configuration.bus.subscriptions[e].hasOwnProperty(t)&&(n=y.configuration.bus.subscriptions[e][t]),n},reset:function(){y.configuration.bus.reset(),y.configuration.resolver.reset()}}};return t.postal=y,y})