postal.js/lib/postal.min.js

7 lines
No EOL
6.8 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.9
*/
(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,t){var i,e=function(){var t;return function(i){var e=!1;return n.isString(i)?(e=i===t,t=i):(e=n.isEqual(i,t),t=n.clone(i)),!e}},r=function(){var t=[];return function(i){var e=!n.any(t,function(t){return n.isObject(i)||n.isArray(i)?n.isEqual(i,t):i===t});return e&&t.push(i),e}},s=function(n){this.channel=n||i.configuration.DEFAULT_CHANNEL};s.prototype.subscribe=function(){return 1===arguments.length?new o(this.channel,arguments[0].topic,arguments[0].callback):new o(this.channel,arguments[0],arguments[1])},s.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,i.configuration.bus.publish(n)};var c=Array.prototype.slice,o=function(n,t,e){this.options=[],this.channel=n,this.topic=t,this.context=null,this.subscribe(e),i.configuration.bus.publish({channel:i.configuration.SYSTEM_CHANNEL,topic:"subscription.created",data:{event:"subscription.created",channel:n,topic:t}}),i.configuration.bus.subscribe(this)};o.prototype={buildCallback:function(){var t=i.configuration.strategies;this.callback=n.bind(this._origcallback,this.context||this),n.each(this.options,function(n){var i=this.callback;this.callback=t[n.strategy].apply(this,[i].concat(n.args))},this)},applyStrategy:function(n,t){for(var i=!1,e=0;this.options.length>e;e++)if(this.options[e].strategy===n){this.options[e].args=t,i=!0;break}i||this.options.push({strategy:n,args:t})},unsubscribe:function(){this.inactive||(this.inactive=!0,i.configuration.bus.unsubscribe(this),i.configuration.bus.publish({channel:i.configuration.SYSTEM_CHANNEL,topic:"subscription.removed",data:{event:"subscription.removed",channel:this.channel,topic:this.topic}}))},subscribe:function(n){return this._origcallback=n,this.buildCallback(),this},withContext:function(n){return this.context=n,this.buildCallback(),this}};var u={cache:{},regex:{},compare:function(t,i){var e,r,s,c=this.cache[i]&&this.cache[i][t];return c!==undefined?c:((r=this.regex[t])||(e="^"+n.map(t.split("."),function(n){var t="";return s&&(t="#"!==s?"\\.\\b":"\\b"),t+="#"===n?"[\\s\\S]*":"*"===n?"[^.]+":n,s=n,t}).join("")+"$",r=this.regex[t]=RegExp(e)),this.cache[i]=this.cache[i]||{},this.cache[i][t]=c=r.test(i),c)},reset:function(){this.cache={},this.regex={}}},a=function(n,t){!n.inactive&&i.configuration.resolver.compare(n.topic,t.topic)&&n.callback(t.data,t)},h=0,f=[],l=function(){for(;f.length;)f.shift().unsubscribe()},p={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++h,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,e=0,r=n.length;r>e;)(i=n[e++])&&a(i,t)}),0===--h&&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(h)return f.push(n),undefined;if(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}}};i={configuration:{bus:p,resolver:u,DEFAULT_CHANNEL:"/",SYSTEM_CHANNEL:"postal",strategies:{},registerStrategy:function(t,e,r){var s=n.map(n.isArray(r)?r:[r],function(n){return i[n].prototype});t&&e&&(this.strategies[t]=e,n.each(s,function(n){n[t]=function(){return this.applyStrategy(t,c.call(arguments,0)),this.buildCallback(),this}}))}},ChannelDefinition:s,SubscriptionDefinition:o,channel:function(n){return new s(n)},subscribe:function(n){return new o(n.channel||i.configuration.DEFAULT_CHANNEL,n.topic,n.callback)},publish:function(n){return n.channel=n.channel||i.configuration.DEFAULT_CHANNEL,i.configuration.bus.publish(n)},addWireTap:function(n){return this.configuration.bus.addWireTap(n)},linkChannels:function(t,e){var r=[];return t=n.isArray(t)?t:[t],e=n.isArray(e)?e:[e],n.each(t,function(t){var s=t.topic||"#";n.each(e,function(e){var c=e.channel||i.configuration.DEFAULT_CHANNEL;r.push(i.subscribe({channel:t.channel||i.configuration.DEFAULT_CHANNEL,topic:s,callback:function(t,r){var s=n.clone(r);s.topic=n.isFunction(e.topic)?e.topic(r.topic):e.topic||r.topic,s.channel=c,s.data=t,i.publish(s)}}))})}),r},utils:{getSubscribersFor:function(){var n=arguments[0],t=arguments[1];return 1===arguments.length&&(n=arguments[0].channel||i.configuration.DEFAULT_CHANNEL,t=arguments[0].topic),i.configuration.bus.subscriptions[n]&&Object.prototype.hasOwnProperty.call(i.configuration.bus.subscriptions[n],t)?i.configuration.bus.subscriptions[n][t]:[]},reset:function(){i.configuration.bus.reset(),i.configuration.resolver.reset()}}},p.subscriptions[i.configuration.SYSTEM_CHANNEL]={};var b={withDebounce:function(t,i,e){if(n.isNaN(i))throw"Milliseconds must be a number";return n.debounce(t,i,!!e)},defer:function(n){return function(t,i){setTimeout(function(){n(t,i)},0)}},withDelay:function(t,i){if(n.isNaN(i))throw"Milliseconds must be a number";return function(n,e){setTimeout(function(){t(n,e)},i)}},disposeAfter:function(t,i){if(n.isNaN(i)||0>=i)throw"The value provided to disposeAfter (maxCalls) must be a number greater than zero.";var e=n.after(i,n.bind(function(){this.unsubscribe()},this));return function(n,i){t(n,i),e()}},distinct:function(t){var i=n.bind(new r,this.context);return function(n,e){i(n,e)&&t(n,e)}},distinctUntilChanged:function(t){var i=n.bind(new e,this.context);return function(n,e){i(n,e)&&t(n,e)}},once:function(t){var i=n.after(1,n.bind(function(){this.unsubscribe()},this));return function(n,e){t(n,e),i()}},withThrottle:function(t,i){if(n.isNaN(i))throw"Milliseconds must be a number";return n.throttle(t,i)},withConstraints:function(t,i){i=n.isArray(i)?i:[i];var e=this,r=function(t,r){return n.all(i,function(n){return n.call(e.context,t,r)})};return function(n,i){r(n,i)&&t(n,i)}}};if(n.each(b,function(n,t){i.configuration.registerStrategy(t,n,"SubscriptionDefinition")}),t&&t.hasOwnProperty("__postalReady__")&&n.isArray(t.__postalReady__))for(;t.__postalReady__.length;)t.__postalReady__.shift().onReady(i);return i});