postal.js/lib/basic/postal.basic.min.js

8 lines
6.1 KiB
JavaScript
Raw Normal View History

/**
* 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(n,t){"object"==typeof module&&module.exports?module.exports=t(require("underscore"),this):"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=t.postal,r=function(n){var t=n.owner[n.prop];if("function"!=typeof t)throw new Error("Strategies can only target methods.");var i=[],e=n.context||n.owner,r=function(){var n=0,r=function c(){var r,o=Array.prototype.slice.call(arguments,0),s=n;n+=1,s<i.length?(r=i[s],r.fn.apply(r.context||e,[c].concat(o))):t.apply(e,o)};r.apply(this,arguments)};return r.target=function(){return t},r.context=function(n){return 0===arguments.length?e:void(e=n)},r.strategies=function(){return i},r.useStrategy=function(n){for(var t=0,e=!1;t<i.length;){if(i[t].name===n.name){i[t]=n,e=!0;break}t+=1}e||i.push(n)},r.reset=function(){i=[]},n.lazyInit?(t.useStrategy=function(){n.owner[n.prop]=r,r.useStrategy.apply(r,arguments)},t.context=function(){return n.owner[n.prop]=r,r.context.apply(r,arguments)},t):r},c=function(n){this.channel=n||i.configuration.DEFAULT_CHANNEL};c.prototype.subscribe=function(){return i.subscribe(1===arguments.length?new o(this.channel,arguments[0].topic,arguments[0].callback):new o(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,i.configuration.bus.publish(n)};var o=function(n,t,i){if(3!==arguments.length)throw new Error("You must provide a channel, topic and callback when creating a SubscriptionDefinition instance.");if(0===t.length)throw new Error("Topics cannot be empty");this.channel=n,this.topic=t,this.subscribe(i)};o.prototype={unsubscribe:function(){this.inactive||(this.inactive=!0,i.unsubscribe(this))},subscribe:function(n){return this.callback=n,this.callback=new r({owner:this,prop:"callback",context:this,lazyInit:!0}),this},withContext:function(n){return this.callback.context(n),this}};var s={cache:{},regex:{},compare:function(t,i){var e,r,c,o=this.cache[i]&&this.cache[i][t];return"undefined"!=typeof o?o:((r=this.regex[t])||(e="^"+n.map(t.split("."),function(n){var t="";return c&&(t="#"!==c?"\\.\\b":"\\b"),t+="#"===n?"[\\s\\S]*":"*"===n?"[^.]+":n,c=n,t}).join("")+"$",r=this.regex[t]=new RegExp(e)),this.cache[i]=this.cache[i]||{},this.cache[i][t]=o=r.test(i),o)},reset:function(){this.cache={},this.regex={}}},a=function(t,e){!t.inactive&&i.configuration.resolver.compare(t.topic,e.topic)&&n.all(t.constraints,function(n){return n.call(t.context,e.data,e)})&&"function"==typeof t.callback&&t.callback.call(t.context,e.data,e)},u=0,p=[],h=function(){for(;p.length;)l.unsubscribe(p.shift())},l={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++u,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===--u&&h(),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(u)return void p.push(n);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}}};if(i={configuration:{bus:l,resolver:s,DEFAULT_CHANNEL:"/",SYSTEM_CHANNEL:"postal"},ChannelDefinition:c,SubscriptionDefinition:o,channel:function(n){return new c(n)},subscribe:function(n){var t=new o(n.channel||i.configuratio