postal.js/lib/postal.min.js
2014-01-25 01:27:33 -05:00

8 lines
No EOL
8.2 KiB
JavaScript

/**
* postal - Pub/Sub library providing wildcard subscriptions, complex message handling, etc. Works server and client-side.
* Author: Jim Cowart (http://freshbrewedcode.com/jimcowart)
* Version: v0.8.11
* Url: http://github.com/postaljs/postal.js
* License(s): MIT, GPL
*/
(function(t,n){"object"==typeof module&&module.exports?module.exports=n(require("underscore"),this):"function"==typeof define&&define.amd?define(["underscore"],function(i){return n(i,t)}):t.postal=n(t._,t)})(this,function(t,n){var i,e=n.postal,r=function(t){var n=t.owner[t.prop];if("function"!=typeof n)throw new Error("Strategies can only target methods.");var i=[],e=t.context||t.owner,r=function(){var t=0,r=function c(){var r,s=Array.prototype.slice.call(arguments,0),o=t;t+=1,o<i.length?(r=i[o],r.fn.apply(r.context||e,[c].concat(s))):n.apply(e,s)};r.apply(this,arguments)};return r.target=function(){return n},r.context=function(t){return 0===arguments.length?e:void(e=t)},r.strategies=function(){return i},r.useStrategy=function(t){for(var n=0,e=!1;n<i.length;){if(i[n].name===t.name){i[n]=t,e=!0;break}n+=1}e||i.push(t)},r.reset=function(){i=[]},t.lazyInit?(n.useStrategy=function(){t.owner[t.prop]=r,r.useStrategy.apply(r,arguments)},n.context=function(){return t.owner[t.prop]=r,r.context.apply(r,arguments)},n):r},c={setTimeout:function(t){return{name:"setTimeout",fn:function(n,i,e){setTimeout(function(){n(i,e)},t)}}},after:function(n,i){var e=t.after(n,i);return{name:"after",fn:function(t,n,i){e(),t(n,i)}}},throttle:function(n){return{name:"throttle",fn:t.throttle(function(t,n,i){t(n,i)},n)}},debounce:function(n,i){return{name:"debounce",fn:t.debounce(function(t,n,i){t(n,i)},n,!!i)}},predicate:function(t){return{name:"predicate",fn:function(n,i,e){t.call(this,i,e)&&n.call(this,i,e)}}},distinct:function(t){t=t||{};var n=function(t){return t[0]},i=t.all?new o(n):new s(n);return{name:"distinct",fn:function(t,n,e){i(n)&&t(n,e)}}}},s=function(){var n;return function(i){var e=!1;return t.isString(i)?(e=i===n,n=i):(e=t.isEqual(i,n),n=t.clone(i)),!e}},o=function(){var n=[];return function(i){var e=!t.any(n,function(n){return t.isObject(i)||t.isArray(i)?t.isEqual(i,n):i===n});return e&&n.push(i),e}},a=function(t){this.channel=t||i.configuration.DEFAULT_CHANNEL};a.prototype.subscribe=function(){return i.subscribe(1===arguments.length?new u(this.channel,arguments[0].topic,arguments[0].callback):new u(this.channel,arguments[0],arguments[1]))},a.prototype.publish=function(){var t=1===arguments.length?"[object String]"===Object.prototype.toString.call(arguments[0])?{topic:arguments[0]}:arguments[0]:{topic:arguments[0],data:arguments[1]};return t.channel=this.channel,i.configuration.bus.publish(t)};var u=function(t,n,i){if(3!==arguments.length)throw new Error("You must provide a channel, topic and callback when creating a SubscriptionDefinition instance.");if(0===n.length)throw new Error("Topics cannot be empty");this.channel=t,this.topic=n,this.subscribe(i)};u.prototype={unsubscribe:function(){this.inactive||(this.inactive=!0,i.unsubscribe(this))},defer:function(){return this.callback.useStrategy(i.configuration.strategies.setTimeout(0)),this},disposeAfter:function(n){if(t.isNaN(n)||0>=n)throw"The value provided to disposeAfter (maxCalls) must be a number greater than zero.";var e=this;return e.callback.useStrategy(i.configuration.strategies.after(n,function(){e.unsubscribe.call(e)})),e},distinctUntilChanged:function(){return this.callback.useStrategy(i.configuration.strategies.distinct()),this},distinct:function(){return this.callback.useStrategy(i.configuration.strategies.distinct({all:!0})),this},once:function(){return this.disposeAfter(1),this},withConstraint:function(n){if(!t.isFunction(n))throw"Predicate constraint must be a function";return this.callback.useStrategy(i.configuration.strategies.predicate(n)),this},withContext:function(t){return this.callback.context(t),this},withDebounce:function(n,i){if(t.isNaN(n))throw"Milliseconds must be a number";var e=this.callback;return this.callback=t.debounce(e,n,!!i),this},withDelay:function(n){if(t.isNaN(n))throw"Milliseconds must be a number";return this.callback.useStrategy(i.configuration.strategies.setTimeout(n)),this},withThrottle:function(n){if(t.isNaN(n))throw"Milliseconds must be a number";return this.callback.useStrategy(i.configuration.strategies.throttle(n)),this},subscribe:function(t){return this.callback=t,this.callback=new r({owner:this,prop:"callback",context:this,lazyInit:!0}),this}};var h={cache:{},regex:{},compare:function(n,i){var e,r,c,s=this.cache[i]&&this.cache[i][n];return"undefined"!=typeof s?s:((r=this.regex[n])||(e="^"+t.map(n.split("."),function(t){var n="";return c&&(n="#"!==c?"\\.\\b":"\\b"),n+="#"===t?"[\\s\\S]*":"*"===t?"[^.]+":t,c=t,n}).join("")+"$",r=this.regex[n]=new RegExp(e)),this.cache[i]=this.cache[i]||{},this.cache[i][n]=s=r.test(i),s)},reset:function(){this.cache={},this.regex={}}},l=function(n,e){!n.inactive&&i.configuration.resolver.compare(n.topic,e.topic)&&t.all(n.constraints,function(t){return t.call(n.context,e.data,e)})&&"function"==typeof n.callback&&n.callback.call(n.context,e.data,e)},f=0,p=[],b=function(){for(;p.length;)g.unsubscribe(p.shift())},g={addWireTap:function(t){var n=this;return n.wireTaps.push(t),function(){var i=n.wireTaps.indexOf(t);-1!==i&&n.wireTaps.splice(i,1)}},publish:function(n){return++f,n.timeStamp=new Date,t.each(this.wireTaps,function(t){t(n.data,n)}),this.subscriptions[n.channel]&&t.each(this.subscriptions[n.channel],function(t){for(var i,e=0,r=t.length;r>e;)(i=t[e++])&&l(i,n)}),0===--f&&b(),n},reset:function(){this.subscriptions&&(t.each(this.subscriptions,function(n){t.each(n,function(t){for(;t.length;)t.pop().unsubscribe()})}),this.subscriptions={})},subscribe:function(t){var n,i=this.subscriptions[t.channel];return i||(i=this.subscriptions[t.channel]={}),n=this.subscriptions[t.channel][t.topic],n||(n=this.subscriptions[t.channel][t.topic]=[]),n.push(t),t},subscriptions:{},wireTaps:[],unsubscribe:function(t){if(f)return void p.push(t);if(this.subscriptions[t.channel]&&this.subscriptions[t.channel][t.topic])for(var n=this.subscriptions[t.channel][t.topic].length,i=0;n>i;){if(this.subscriptions[t.channel][t.topic][i]===t){this.subscriptions[t.channel][t.topic].splice(i,1);break}i+=1}}};if(i={configuration:{bus:g,resolver:h,DEFAULT_CHANNEL:"/",SYSTEM_CHANNEL:"postal",strategies:c},ChannelDefinition:a,SubscriptionDefinition:u,channel:function(t){return new a(t)},subscribe:function(t){var n=new u(t.channel||i.configuration.DEFAULT_CHANNEL,t.topic,t.callback);return i.configuration.bus.publish({channel:i.configuration.SYSTEM_CHANNEL,topic:"subscription.created",data:{event:"subscription.created",channel:n.channel,topic:n.topic}}),i.configuration.bus.subscribe(n)},publish:function(t){return t.channel=t.channel||i.configuration.DEFAULT_CHANNEL,i.configuration.bus.publish(t)},unsubscribe:function(t){i.configuration.bus.unsubscribe(t),i.configuration.bus.publish({channel:i.configuration.SYSTEM_CHANNEL,topic:"subscription.removed",data:{event:"subscription.removed",channel:t.channel,topic:t.topic}})},addWireTap:function(t){return this.configuration.bus.addWireTap(t)},linkChannels:function(n,e){var r=[];return n=t.isArray(n)?n:[n],e=t.isArray(e)?e:[e],t.each(n,function(n){var c=n.topic||"#";t.each(e,function(e){var s=e.channel||i.configuration.DEFAULT_CHANNEL;r.push(i.subscribe({channel:n.channel||i.configuration.DEFAULT_CHANNEL,topic:c,callback:function(n,r){var c=t.clone(r);c.topic=t.isFunction(e.topic)?e.topic(r.topic):e.topic||r.topic,c.channel=s,c.data=n,i.publish(c)}}))})}),r},noConflict:function(){if("undefined"==typeof window)throw new Error("noConflict can only be used in browser clients which aren't using AMD modules");return n.postal=e,this},utils:{getSubscribersFor:function(){var t=arguments[0],n=arguments[1];return 1===arguments.length&&(t=arguments[0].channel||i.configuration.DEFAULT_CHANNEL,n=arguments[0].topic),i.configuration.bus.subscriptions[t]&&Object.prototype.hasOwnProperty.call(i.configuration.bus.subscriptions[t],n)?i.configuration.bus.subscriptions[t][n]:[]},reset:function(){i.configuration.bus.reset(),i.configuration.resolver.reset()}}},g.subscriptions[i.configuration.SYSTEM_CHANNEL]={},n&&Object.prototype.hasOwnProperty.call(n,"__postalReady__")&&t.isArray(n.__postalReady__))for(;n.__postalReady__.length;)n.__postalReady__.shift().onReady(i);return i});