postal.js/lib/postal.min.js

7 lines
No EOL
6 KiB
JavaScript
Executable file

/*
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.8.6
*/
(function(n,t){"object"==typeof module&&module.exports?module.exports=function(n){return n=n||require("underscore"),t(n)}:"function"==typeof define&&define.amd?define(["underscore"],function(i){return t(i,n)}):n.postal=t(n._,n)})(this,function(n){var t="/",i="postal",s=function(){var t;return function(i){var s=!1;return n.isString(i)?(s=i===t,t=i):(s=n.isEqual(i,t),t=n.clone(i)),!s}},e=function(){var t=[];return function(i){var s=!n.any(t,function(t){return n.isObject(i)||n.isArray(i)?n.isEqual(i,t):i===t});return s&&t.push(i),s}},c=function(n){this.channel=n||t};c.prototype.subscribe=function(){return p.subscribe(1===arguments.length?new r(this.channel,arguments[0].topic,arguments[0].callback):new r(this.channel,arguments[0],arguments[1]))},c.prototype.publish=function(){var n=1===arguments.length?"[object String]"===Object.prototype.toString.call(arguments[0])?{topic:arguments[0]}:arguments[0]:{topic:arguments[0],data:arguments[1]};return n.channel=this.channel,p.publish(n)};var r=function(n,t,i){this.channel=n,this.topic=t,this.callback=i,this.constraints=[],this.context=null};n.extend(r.prototype,{unsubscribe:function(){this.inactive||(this.inactive=!0,p.unsubscribe(this))},defer:function(){var n=this.callback;return this.callback=function(t){setTimeout(function(){n(t)},0)},this},disposeAfter:function(t){if(n.isNaN(t)||0>=t)throw"The value provided to disposeAfter (maxCalls) must be a number greater than zero.";var i=this.callback,s=n.after(t,n.bind(function(){this.unsubscribe()},this));return this.callback=function(){i.apply(this.context,arguments),s()},this},distinctUntilChanged:function(){return this.withConstraint(new s),this},distinct:function(){return this.withConstraint(new e),this},once:function(){return this.disposeAfter(1),this},withConstraint:function(t){if(!n.isFunction(t))throw"Predicate constraint must be a function";return this.constraints.push(t),this},withConstraints:function(t){var i=this;return n.isArray(t)&&n.each(t,function(n){i.withConstraint(n)}),i},withContext:function(n){return this.context=n,this},withDebounce:function(t){if(n.isNaN(t))throw"Milliseconds must be a number";var i=this.callback;return this.callback=n.debounce(i,t),this},withDelay:function(t){if(n.isNaN(t))throw"Milliseconds must be a number";var i=this.callback;return this.callback=function(n){setTimeout(function(){i(n)},t)},this},withThrottle:function(t){if(n.isNaN(t))throw"Milliseconds must be a number";var i=this.callback;return this.callback=n.throttle(i,t),this},subscribe:function(n){return this.callback=n,this}});var u={cache:{},regex:{},compare:function(t,i){var s,e,c,r=this.cache[i]&&this.cache[i][t];return r!==undefined?r:((e=this.regex[t])||(s="^"+n.map(t.split("."),function(n){var t="";return c&&(t="#"!==c?"\\.\\b":"\\b"),t+="#"===n?"[\\s\\S]*":"*"===n?"[^.]+":n,c=n,t}).join("")+"$",e=this.regex[t]=RegExp(s)),this.cache[i]=this.cache[i]||{},this.cache[i][t]=r=e.test(i),r)},reset:function(){this.cache={},this.regex={}}},o=function(t,i){!t.inactive&&p.configuration.resolver.compare(t.topic,i.topic)&&n.all(t.constraints,function(n){return n.call(t.context,i.data,i)})&&"function"==typeof t.callback&&t.callback.call(t.context,i.data,i)},a=0,h=[],l=function(){for(;h.length;)h.shift().unsubscribe()},b={addWireTap:function(n){var t=this;return t.wireTaps.push(n),function(){var i=t.wireTaps.indexOf(n);-1!==i&&t.wireTaps.splice(i,1)}},publish:function(t){return++a,t.timeStamp=new Date,n.each(this.wireTaps,function(n){n(t.data,t)}),this.subscriptions[t.channel]&&n.each(this.subscriptions[t.channel],function(n){for(var i,s=0,e=n.length;e>s;)(i=n[s++])&&o(i,t)}),0===--a&&l(),t},reset:function(){this.subscriptions&&(n.each(this.subscriptions,function(t){n.each(t,function(n){for(;n.length;)n.pop().unsubscribe()})}),this.subscriptions={})},subscribe:function(n){var t,i=this.subscriptions[n.channel];return i||(i=this.subscriptions[n.channel]={}),t=this.subscriptions[n.channel][n.topic],t||(t=this.subscriptions[n.channel][n.topic]=[]),t.push(n),n},subscriptions:{},wireTaps:[],unsubscribe:function(n){if(a)return h.push(n),undefined;if(this.subscriptions[n.channel]&&this.subscriptions[n.channel][n.topic])for(var t=this.subscriptions[n.channel][n.topic].length,i=0;t>i;){if(this.subscriptions[n.channel][n.topic][i]===n){this.subscriptions[n.channel][n.topic].splice(i,1);break}i+=1}}};b.subscriptions[i]={};var p={configuration:{bus:b,resolver:u,DEFAULT_CHANNEL:t,SYSTEM_CHANNEL:i},ChannelDefinition:c,SubscriptionDefinition:r,channel:function(n){return new c(n)},subscribe:function(n){var s=new r(n.channel||t,n.topic,n.callback);return p.configuration.bus.publish({channel:i,topic:"subscription.created",data:{event:"subscription.created",channel:s.channel,topic:s.topic}}),p.configuration.bus.subscribe(s)},publish:function(n){return n.channel=n.channel||t,p.configuration.bus.publish(n)},unsubscribe:function(n){p.configuration.bus.unsubscribe(n),p.configuration.bus.publish({channel:i,topic:"subscription.removed",data:{event:"subscription.removed",channel:n.channel,topic:n.topic}})},addWireTap:function(n){return this.configuration.bus.addWireTap(n)},linkChannels:function(i,s){var e=[];return i=n.isArray(i)?i:[i],s=n.isArray(s)?s:[s],n.each(i,function(i){i.topic||"#",n.each(s,function(s){var c=s.channel||t;e.push(p.subscribe({channel:i.channel||t,topic:i.topic||"#",callback:function(t,i){var e=n.clone(i);e.topic=n.isFunction(s.topic)?s.topic(i.topic):s.topic||i.topic,e.channel=c,e.data=t,p.publish(e)}}))})}),e},utils:{getSubscribersFor:function(){var n=arguments[0],t=arguments[1];return 1===arguments.length&&(n=arguments[0].channel||p.configuration.DEFAULT_CHANNEL,t=arguments[0].topic),p.configuration.bus.subscriptions[n]&&Object.prototype.hasOwnProperty.call(p.configuration.bus.subscriptions[n],t)?p.configuration.bus.subscriptions[n][t]:[]},reset:function(){p.configuration.bus.reset(),p.configuration.resolver.reset()}}};return p});