From 5d1e7f8f881910edc63d337bfeac9e4448aadb60 Mon Sep 17 00:00:00 2001 From: ifandelse Date: Fri, 6 Sep 2013 11:11:29 -0400 Subject: [PATCH] Updated __postalReady__ array logic to expect objects with onReady callbacks --- example/amd/js/libs/postal/postal.js | 117 +++++++++++++---------- example/amd/js/libs/postal/postal.min.js | 2 +- example/standard/js/postal.js | 117 +++++++++++++---------- example/standard/js/postal.min.js | 2 +- lib/postal.js | 2 +- lib/postal.min.js | 2 +- src/postal.js | 2 +- 7 files changed, 139 insertions(+), 105 deletions(-) diff --git a/example/amd/js/libs/postal/postal.js b/example/amd/js/libs/postal/postal.js index a0682b6..7636aa2 100755 --- a/example/amd/js/libs/postal/postal.js +++ b/example/amd/js/libs/postal/postal.js @@ -4,13 +4,14 @@ License: Dual licensed MIT (http://www.opensource.org/licenses/mit-license) & GPL (http://www.opensource.org/licenses/gpl-license) Version 0.8.7 */ +/*jshint -W098 */ (function ( root, factory ) { if ( typeof module === "object" && module.exports ) { // Node, or CommonJS-Like environments module.exports = function ( _ ) { _ = _ || require( "underscore" ); return factory( _ ); - } + }; } else if ( typeof define === "function" && define.amd ) { // AMD. Register as an anonymous module. define( ["underscore"], function ( _ ) { @@ -22,9 +23,9 @@ } }( this, function ( _, global, undefined ) { - var DEFAULT_CHANNEL = "/", - DEFAULT_DISPOSEAFTER = 0, - SYSTEM_CHANNEL = "postal"; + var postal; + + /*jshint -W098 */ var ConsecutiveDistinctPredicate = function () { var previous; return function ( data ) { @@ -40,6 +41,7 @@ return !eq; }; }; + /*jshint -W098 */ var DistinctPredicate = function () { var previous = []; @@ -56,8 +58,9 @@ return isDistinct; }; }; + /* global postal, SubscriptionDefinition */ var ChannelDefinition = function ( channelName ) { - this.channel = channelName || DEFAULT_CHANNEL; + this.channel = channelName || postal.configuration.DEFAULT_CHANNEL; }; ChannelDefinition.prototype.subscribe = function () { @@ -68,13 +71,15 @@ ChannelDefinition.prototype.publish = function () { var envelope = arguments.length === 1 ? - (Object.prototype.toString.call(arguments[0]) === '[object String]' ? - { topic: arguments[0] } : - arguments[0]) : - { topic : arguments[0], data : arguments[1] }; + ( Object.prototype.toString.call( arguments[0] ) === "[object String]" ? + { topic : arguments[0] } : + arguments[0] ) : + { topic : arguments[0], data : arguments[1] }; envelope.channel = this.channel; return postal.configuration.bus.publish( envelope ); }; + /* global postal */ + /*jshint -W117 */ var SubscriptionDefinition = function ( channel, topic, callback ) { this.channel = channel; this.topic = topic; @@ -82,12 +87,12 @@ this.constraints = []; this.context = null; postal.configuration.bus.publish( { - channel : SYSTEM_CHANNEL, - topic : "subscription.created", - data : { - event : "subscription.created", + channel : postal.configuration.SYSTEM_CHANNEL, + topic : "subscription.created", + data : { + event : "subscription.created", channel : channel, - topic : topic + topic : topic } } ); postal.configuration.bus.subscribe( this ); @@ -95,16 +100,16 @@ SubscriptionDefinition.prototype = { unsubscribe : function () { - if(!this.inactive) { + if ( !this.inactive ) { this.inactive = true; postal.configuration.bus.unsubscribe( this ); postal.configuration.bus.publish( { - channel : SYSTEM_CHANNEL, - topic : "subscription.removed", - data : { - event : "subscription.removed", + channel : postal.configuration.SYSTEM_CHANNEL, + topic : "subscription.removed", + data : { + event : "subscription.removed", channel : this.channel, - topic : this.topic + topic : this.topic } } ); } @@ -210,35 +215,36 @@ return this; } }; + /*jshint -W098 */ var bindingsResolver = { cache : {}, regex : {}, compare : function ( binding, topic ) { - var pattern, rgx, prevSegment, result = (this.cache[topic] && this.cache[topic][binding]); - if(typeof result !== "undefined") { + var pattern, rgx, prevSegment, result = ( this.cache[ topic ] && this.cache[ topic ][ binding ] ); + if ( typeof result !== "undefined" ) { return result; } - if(!(rgx = this.regex[binding])) { - pattern = "^" + _.map(binding.split('.'), function(segment) { + if ( !( rgx = this.regex[ binding ] )) { + pattern = "^" + _.map( binding.split( "." ),function ( segment ) { var res = ""; - if (!!prevSegment) { + if ( !!prevSegment ) { res = prevSegment !== "#" ? "\\.\\b" : "\\b"; } - if(segment === "#") { - res += "[\\s\\S]*" - } else if (segment === "*") { - res += "[^.]+" + if ( segment === "#" ) { + res += "[\\s\\S]*"; + } else if ( segment === "*" ) { + res += "[^.]+"; } else { res += segment; } prevSegment = segment; return res; - } ).join('') + "$"; - rgx = this.regex[binding] = new RegExp( pattern ); + } ).join( "" ) + "$"; + rgx = this.regex[ binding ] = new RegExp( pattern ); } - this.cache[topic] = this.cache[topic] || {}; - this.cache[topic][binding] = result = rgx.test( topic ); + this.cache[ topic ] = this.cache[ topic ] || {}; + this.cache[ topic ][ binding ] = result = rgx.test( topic ); return result; }, @@ -247,12 +253,13 @@ this.regex = {}; } }; + /* global postal */ var fireSub = function ( subDef, envelope ) { if ( !subDef.inactive && postal.configuration.resolver.compare( subDef.topic, envelope.topic ) ) { if ( _.all( subDef.constraints, function ( constraint ) { return constraint.call( subDef.context, envelope.data, envelope ); } ) ) { - if ( typeof subDef.callback === 'function' ) { + if ( typeof subDef.callback === "function" ) { subDef.callback.call( subDef.context, envelope.data, envelope ); } } @@ -315,7 +322,7 @@ }, subscribe : function ( subDef ) { - var idx, found, fn, channel = this.subscriptions[subDef.channel], subs; + var channel = this.subscriptions[subDef.channel], subs; if ( !channel ) { channel = this.subscriptions[subDef.channel] = {}; } @@ -349,16 +356,17 @@ } } }; - localBus.subscriptions[SYSTEM_CHANNEL] = {}; - var postal = { + /* global localBus, bindingsResolver, ChannelDefinition, SubscriptionDefinition, postal */ + /*jshint -W020 */ + postal = { configuration : { - bus : localBus, - resolver : bindingsResolver, - DEFAULT_CHANNEL : DEFAULT_CHANNEL, - SYSTEM_CHANNEL : SYSTEM_CHANNEL + bus : localBus, + resolver : bindingsResolver, + DEFAULT_CHANNEL : "/", + SYSTEM_CHANNEL : "postal" }, - ChannelDefinition : ChannelDefinition, + ChannelDefinition : ChannelDefinition, SubscriptionDefinition : SubscriptionDefinition, channel : function ( channelName ) { @@ -366,11 +374,11 @@ }, subscribe : function ( options ) { - return new SubscriptionDefinition( options.channel || DEFAULT_CHANNEL, options.topic, options.callback ); + return new SubscriptionDefinition( options.channel || postal.configuration.DEFAULT_CHANNEL, options.topic, options.callback ); }, publish : function ( envelope ) { - envelope.channel = envelope.channel || DEFAULT_CHANNEL; + envelope.channel = envelope.channel || postal.configuration.DEFAULT_CHANNEL; return postal.configuration.bus.publish( envelope ); }, @@ -379,17 +387,17 @@ }, linkChannels : function ( sources, destinations ) { - var result = []; - sources = !_.isArray( sources ) ? [sources] : sources; + var result = []; + sources = !_.isArray( sources ) ? [ sources ] : sources; destinations = !_.isArray( destinations ) ? [destinations] : destinations; _.each( sources, function ( source ) { var sourceTopic = source.topic || "#"; _.each( destinations, function ( destination ) { - var destChannel = destination.channel || DEFAULT_CHANNEL; + var destChannel = destination.channel || postal.configuration.DEFAULT_CHANNEL; result.push( postal.subscribe( { - channel : source.channel || DEFAULT_CHANNEL, - topic : source.topic || "#", + channel : source.channel || postal.configuration.DEFAULT_CHANNEL, + topic : sourceTopic, callback : function ( data, env ) { var newEnv = _.clone( env ); newEnv.topic = _.isFunction( destination.topic ) ? destination.topic( env.topic ) : destination.topic || env.topic; @@ -413,7 +421,7 @@ tpc = arguments[ 0 ].topic; } if ( postal.configuration.bus.subscriptions[ channel ] && - Object.prototype.hasOwnProperty.call( postal.configuration.bus.subscriptions[ channel ], tpc )) { + Object.prototype.hasOwnProperty.call( postal.configuration.bus.subscriptions[ channel ], tpc ) ) { return postal.configuration.bus.subscriptions[ channel ][ tpc ]; } return []; @@ -425,6 +433,15 @@ } } }; + localBus.subscriptions[postal.configuration.SYSTEM_CHANNEL] = {}; + + /*jshint -W106 */ + if ( global.hasOwnProperty( "__postalReady__" ) && _.isArray( global.__postalReady__ ) ) { + while(global.__postalReady__.length) { + global.__postalReady__.shift().onReady(postal); + } + } + /*jshint +W106 */ return postal; } )); \ No newline at end of file diff --git a/example/amd/js/libs/postal/postal.min.js b/example/amd/js/libs/postal/postal.min.js index 87c325d..fb65f4c 100755 --- a/example/amd/js/libs/postal/postal.min.js +++ b/example/amd/js/libs/postal/postal.min.js @@ -4,4 +4,4 @@ License: Dual licensed MIT (http://www.opensource.org/licenses/mit-license) & GPL (http://www.opensource.org/licenses/gpl-license) Version 0.8.7 */ -(function(t,n){"object"==typeof module&&module.exports?module.exports=function(t){return t=t||require("underscore"),n(t)}:"function"==typeof define&&define.amd?define(["underscore"],function(i){return n(i,t)}):t.postal=n(t._,t)})(this,function(t){var n="/",i="postal",s=function(){var n;return function(i){var s=!1;return t.isString(i)?(s=i===n,n=i):(s=t.isEqual(i,n),n=t.clone(i)),!s}},e=function(){var n=[];return function(i){var s=!t.any(n,function(n){return t.isObject(i)||t.isArray(i)?t.isEqual(i,n):i===n});return s&&n.push(i),s}},c=function(t){this.channel=t||n};c.prototype.subscribe=function(){return 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 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,b.configuration.bus.publish(t)};var r=function(t,n,s){this.channel=t,this.topic=n,this.callback=s,this.constraints=[],this.context=null,b.configuration.bus.publish({channel:i,topic:"subscription.created",data:{event:"subscription.created",channel:t,topic:n}}),b.configuration.bus.subscribe(this)};r.prototype={unsubscribe:function(){this.inactive||(this.inactive=!0,b.configuration.bus.unsubscribe(this),b.configuration.bus.publish({channel:i,topic:"subscription.removed",data:{event:"subscription.removed",channel:this.channel,topic:this.topic}}))},defer:function(){var t=this.callback;return this.callback=function(n,i){setTimeout(function(){t(n,i)},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 i=this.callback,s=t.after(n,t.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(n){if(!t.isFunction(n))throw"Predicate constraint must be a function";return this.constraints.push(n),this},withConstraints:function(n){var i=this;return t.isArray(n)&&t.each(n,function(t){i.withConstraint(t)}),i},withContext:function(t){return this.context=t,this},withDebounce:function(n){if(t.isNaN(n))throw"Milliseconds must be a number";var i=this.callback;return this.callback=t.debounce(i,n),this},withDelay:function(n){if(t.isNaN(n))throw"Milliseconds must be a number";var i=this.callback;return this.callback=function(t,s){setTimeout(function(){i(t,s)},n)},this},withThrottle:function(n){if(t.isNaN(n))throw"Milliseconds must be a number";var i=this.callback;return this.callback=t.throttle(i,n),this},subscribe:function(t){return this.callback=t,this}};var o={cache:{},regex:{},compare:function(n,i){var s,e,c,r=this.cache[i]&&this.cache[i][n];return r!==undefined?r:((e=this.regex[n])||(s="^"+t.map(n.split("."),function(t){var n="";return c&&(n="#"!==c?"\\.\\b":"\\b"),n+="#"===t?"[\\s\\S]*":"*"===t?"[^.]+":t,c=t,n}).join("")+"$",e=this.regex[n]=RegExp(s)),this.cache[i]=this.cache[i]||{},this.cache[i][n]=r=e.test(i),r)},reset:function(){this.cache={},this.regex={}}},u=function(n,i){!n.inactive&&b.configuration.resolver.compare(n.topic,i.topic)&&t.all(n.constraints,function(t){return t.call(n.context,i.data,i)})&&"function"==typeof n.callback&&n.callback.call(n.context,i.data,i)},a=0,h=[],l=function(){for(;h.length;)h.shift().unsubscribe()},p={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++a,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,s=0,e=t.length;e>s;)(i=t[s++])&&u(i,n)}),0===--a&&l(),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(a)return h.push(t),undefined;if(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}}};p.subscriptions[i]={};var b={configuration:{bus:p,resolver:o,DEFAULT_CHANNEL:n,SYSTEM_CHANNEL:i},ChannelDefinition:c,SubscriptionDefinition:r,channel:function(t){return new c(t)},subscribe:function(t){return new r(t.channel||n,t.topic,t.callback)},publish:function(t){return t.channel=t.channel||n,b.configuration.bus.publish(t)},addWireTap:function(t){return this.configuration.bus.addWireTap(t)},linkChannels:function(i,s){var e=[];return i=t.isArray(i)?i:[i],s=t.isArray(s)?s:[s],t.each(i,function(i){i.topic||"#",t.each(s,function(s){var c=s.channel||n;e.push(b.subscribe({channel:i.channel||n,topic:i.topic||"#",callback:function(n,i){var e=t.clone(i);e.topic=t.isFunction(s.topic)?s.topic(i.topic):s.topic||i.topic,e.channel=c,e.data=n,b.publish(e)}}))})}),e},utils:{getSubscribersFor:function(){var t=arguments[0],n=arguments[1];return 1===arguments.length&&(t=arguments[0].channel||b.configuration.DEFAULT_CHANNEL,n=arguments[0].topic),b.configuration.bus.subscriptions[t]&&Object.prototype.hasOwnProperty.call(b.configuration.bus.subscriptions[t],n)?b.configuration.bus.subscriptions[t][n]:[]},reset:function(){b.configuration.bus.reset(),b.configuration.resolver.reset()}}};return b}); \ No newline at end of file +(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,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||i.configuration.DEFAULT_CHANNEL};c.prototype.subscribe=function(){return 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,i.configuration.bus.publish(n)};var r=function(n,t,s){this.channel=n,this.topic=t,this.callback=s,this.constraints=[],this.context=null,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)};r.prototype={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}}))},defer:function(){var n=this.callback;return this.callback=function(t,i){setTimeout(function(){n(t,i)},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,s){setTimeout(function(){i(n,s)},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 o={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={}}},a=function(t,s){!t.inactive&&i.configuration.resolver.compare(t.topic,s.topic)&&n.all(t.constraints,function(n){return n.call(t.context,s.data,s)})&&"function"==typeof t.callback&&t.callback.call(t.context,s.data,s)},u=0,h=[],l=function(){for(;h.length;)h.shift().unsubscribe()},f={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,s=0,e=n.length;e>s;)(i=n[s++])&&a(i,t)}),0===--u&&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(u)return h.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}}};if(i={configuration:{bus:f,resolver:o,DEFAULT_CHANNEL:"/",SYSTEM_CHANNEL:"postal"},ChannelDefinition:c,SubscriptionDefinition:r,channel:function(n){return new c(n)},subscribe:function(n){return new r(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,s){var e=[];return t=n.isArray(t)?t:[t],s=n.isArray(s)?s:[s],n.each(t,function(t){var c=t.topic||"#";n.each(s,function(s){var r=s.channel||i.configuration.DEFAULT_CHANNEL;e.push(i.subscribe({channel:t.channel||i.configuration.DEFAULT_CHANNEL,topic:c,callback:function(t,e){var c=n.clone(e);c.topic=n.isFunction(s.topic)?s.topic(e.topic):s.topic||e.topic,c.channel=r,c.data=t,i.publish(c)}}))})}),e},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()}}},f.subscriptions[i.configuration.SYSTEM_CHANNEL]={},t.hasOwnProperty("__postalReady__")&&n.isArray(t.__postalReady__))for(;t.__postalReady__.length;)t.__postalReady__.shift().onReady(i);return i}); \ No newline at end of file diff --git a/example/standard/js/postal.js b/example/standard/js/postal.js index a0682b6..7636aa2 100755 --- a/example/standard/js/postal.js +++ b/example/standard/js/postal.js @@ -4,13 +4,14 @@ License: Dual licensed MIT (http://www.opensource.org/licenses/mit-license) & GPL (http://www.opensource.org/licenses/gpl-license) Version 0.8.7 */ +/*jshint -W098 */ (function ( root, factory ) { if ( typeof module === "object" && module.exports ) { // Node, or CommonJS-Like environments module.exports = function ( _ ) { _ = _ || require( "underscore" ); return factory( _ ); - } + }; } else if ( typeof define === "function" && define.amd ) { // AMD. Register as an anonymous module. define( ["underscore"], function ( _ ) { @@ -22,9 +23,9 @@ } }( this, function ( _, global, undefined ) { - var DEFAULT_CHANNEL = "/", - DEFAULT_DISPOSEAFTER = 0, - SYSTEM_CHANNEL = "postal"; + var postal; + + /*jshint -W098 */ var ConsecutiveDistinctPredicate = function () { var previous; return function ( data ) { @@ -40,6 +41,7 @@ return !eq; }; }; + /*jshint -W098 */ var DistinctPredicate = function () { var previous = []; @@ -56,8 +58,9 @@ return isDistinct; }; }; + /* global postal, SubscriptionDefinition */ var ChannelDefinition = function ( channelName ) { - this.channel = channelName || DEFAULT_CHANNEL; + this.channel = channelName || postal.configuration.DEFAULT_CHANNEL; }; ChannelDefinition.prototype.subscribe = function () { @@ -68,13 +71,15 @@ ChannelDefinition.prototype.publish = function () { var envelope = arguments.length === 1 ? - (Object.prototype.toString.call(arguments[0]) === '[object String]' ? - { topic: arguments[0] } : - arguments[0]) : - { topic : arguments[0], data : arguments[1] }; + ( Object.prototype.toString.call( arguments[0] ) === "[object String]" ? + { topic : arguments[0] } : + arguments[0] ) : + { topic : arguments[0], data : arguments[1] }; envelope.channel = this.channel; return postal.configuration.bus.publish( envelope ); }; + /* global postal */ + /*jshint -W117 */ var SubscriptionDefinition = function ( channel, topic, callback ) { this.channel = channel; this.topic = topic; @@ -82,12 +87,12 @@ this.constraints = []; this.context = null; postal.configuration.bus.publish( { - channel : SYSTEM_CHANNEL, - topic : "subscription.created", - data : { - event : "subscription.created", + channel : postal.configuration.SYSTEM_CHANNEL, + topic : "subscription.created", + data : { + event : "subscription.created", channel : channel, - topic : topic + topic : topic } } ); postal.configuration.bus.subscribe( this ); @@ -95,16 +100,16 @@ SubscriptionDefinition.prototype = { unsubscribe : function () { - if(!this.inactive) { + if ( !this.inactive ) { this.inactive = true; postal.configuration.bus.unsubscribe( this ); postal.configuration.bus.publish( { - channel : SYSTEM_CHANNEL, - topic : "subscription.removed", - data : { - event : "subscription.removed", + channel : postal.configuration.SYSTEM_CHANNEL, + topic : "subscription.removed", + data : { + event : "subscription.removed", channel : this.channel, - topic : this.topic + topic : this.topic } } ); } @@ -210,35 +215,36 @@ return this; } }; + /*jshint -W098 */ var bindingsResolver = { cache : {}, regex : {}, compare : function ( binding, topic ) { - var pattern, rgx, prevSegment, result = (this.cache[topic] && this.cache[topic][binding]); - if(typeof result !== "undefined") { + var pattern, rgx, prevSegment, result = ( this.cache[ topic ] && this.cache[ topic ][ binding ] ); + if ( typeof result !== "undefined" ) { return result; } - if(!(rgx = this.regex[binding])) { - pattern = "^" + _.map(binding.split('.'), function(segment) { + if ( !( rgx = this.regex[ binding ] )) { + pattern = "^" + _.map( binding.split( "." ),function ( segment ) { var res = ""; - if (!!prevSegment) { + if ( !!prevSegment ) { res = prevSegment !== "#" ? "\\.\\b" : "\\b"; } - if(segment === "#") { - res += "[\\s\\S]*" - } else if (segment === "*") { - res += "[^.]+" + if ( segment === "#" ) { + res += "[\\s\\S]*"; + } else if ( segment === "*" ) { + res += "[^.]+"; } else { res += segment; } prevSegment = segment; return res; - } ).join('') + "$"; - rgx = this.regex[binding] = new RegExp( pattern ); + } ).join( "" ) + "$"; + rgx = this.regex[ binding ] = new RegExp( pattern ); } - this.cache[topic] = this.cache[topic] || {}; - this.cache[topic][binding] = result = rgx.test( topic ); + this.cache[ topic ] = this.cache[ topic ] || {}; + this.cache[ topic ][ binding ] = result = rgx.test( topic ); return result; }, @@ -247,12 +253,13 @@ this.regex = {}; } }; + /* global postal */ var fireSub = function ( subDef, envelope ) { if ( !subDef.inactive && postal.configuration.resolver.compare( subDef.topic, envelope.topic ) ) { if ( _.all( subDef.constraints, function ( constraint ) { return constraint.call( subDef.context, envelope.data, envelope ); } ) ) { - if ( typeof subDef.callback === 'function' ) { + if ( typeof subDef.callback === "function" ) { subDef.callback.call( subDef.context, envelope.data, envelope ); } } @@ -315,7 +322,7 @@ }, subscribe : function ( subDef ) { - var idx, found, fn, channel = this.subscriptions[subDef.channel], subs; + var channel = this.subscriptions[subDef.channel], subs; if ( !channel ) { channel = this.subscriptions[subDef.channel] = {}; } @@ -349,16 +356,17 @@ } } }; - localBus.subscriptions[SYSTEM_CHANNEL] = {}; - var postal = { + /* global localBus, bindingsResolver, ChannelDefinition, SubscriptionDefinition, postal */ + /*jshint -W020 */ + postal = { configuration : { - bus : localBus, - resolver : bindingsResolver, - DEFAULT_CHANNEL : DEFAULT_CHANNEL, - SYSTEM_CHANNEL : SYSTEM_CHANNEL + bus : localBus, + resolver : bindingsResolver, + DEFAULT_CHANNEL : "/", + SYSTEM_CHANNEL : "postal" }, - ChannelDefinition : ChannelDefinition, + ChannelDefinition : ChannelDefinition, SubscriptionDefinition : SubscriptionDefinition, channel : function ( channelName ) { @@ -366,11 +374,11 @@ }, subscribe : function ( options ) { - return new SubscriptionDefinition( options.channel || DEFAULT_CHANNEL, options.topic, options.callback ); + return new SubscriptionDefinition( options.channel || postal.configuration.DEFAULT_CHANNEL, options.topic, options.callback ); }, publish : function ( envelope ) { - envelope.channel = envelope.channel || DEFAULT_CHANNEL; + envelope.channel = envelope.channel || postal.configuration.DEFAULT_CHANNEL; return postal.configuration.bus.publish( envelope ); }, @@ -379,17 +387,17 @@ }, linkChannels : function ( sources, destinations ) { - var result = []; - sources = !_.isArray( sources ) ? [sources] : sources; + var result = []; + sources = !_.isArray( sources ) ? [ sources ] : sources; destinations = !_.isArray( destinations ) ? [destinations] : destinations; _.each( sources, function ( source ) { var sourceTopic = source.topic || "#"; _.each( destinations, function ( destination ) { - var destChannel = destination.channel || DEFAULT_CHANNEL; + var destChannel = destination.channel || postal.configuration.DEFAULT_CHANNEL; result.push( postal.subscribe( { - channel : source.channel || DEFAULT_CHANNEL, - topic : source.topic || "#", + channel : source.channel || postal.configuration.DEFAULT_CHANNEL, + topic : sourceTopic, callback : function ( data, env ) { var newEnv = _.clone( env ); newEnv.topic = _.isFunction( destination.topic ) ? destination.topic( env.topic ) : destination.topic || env.topic; @@ -413,7 +421,7 @@ tpc = arguments[ 0 ].topic; } if ( postal.configuration.bus.subscriptions[ channel ] && - Object.prototype.hasOwnProperty.call( postal.configuration.bus.subscriptions[ channel ], tpc )) { + Object.prototype.hasOwnProperty.call( postal.configuration.bus.subscriptions[ channel ], tpc ) ) { return postal.configuration.bus.subscriptions[ channel ][ tpc ]; } return []; @@ -425,6 +433,15 @@ } } }; + localBus.subscriptions[postal.configuration.SYSTEM_CHANNEL] = {}; + + /*jshint -W106 */ + if ( global.hasOwnProperty( "__postalReady__" ) && _.isArray( global.__postalReady__ ) ) { + while(global.__postalReady__.length) { + global.__postalReady__.shift().onReady(postal); + } + } + /*jshint +W106 */ return postal; } )); \ No newline at end of file diff --git a/example/standard/js/postal.min.js b/example/standard/js/postal.min.js index 87c325d..fb65f4c 100755 --- a/example/standard/js/postal.min.js +++ b/example/standard/js/postal.min.js @@ -4,4 +4,4 @@ License: Dual licensed MIT (http://www.opensource.org/licenses/mit-license) & GPL (http://www.opensource.org/licenses/gpl-license) Version 0.8.7 */ -(function(t,n){"object"==typeof module&&module.exports?module.exports=function(t){return t=t||require("underscore"),n(t)}:"function"==typeof define&&define.amd?define(["underscore"],function(i){return n(i,t)}):t.postal=n(t._,t)})(this,function(t){var n="/",i="postal",s=function(){var n;return function(i){var s=!1;return t.isString(i)?(s=i===n,n=i):(s=t.isEqual(i,n),n=t.clone(i)),!s}},e=function(){var n=[];return function(i){var s=!t.any(n,function(n){return t.isObject(i)||t.isArray(i)?t.isEqual(i,n):i===n});return s&&n.push(i),s}},c=function(t){this.channel=t||n};c.prototype.subscribe=function(){return 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 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,b.configuration.bus.publish(t)};var r=function(t,n,s){this.channel=t,this.topic=n,this.callback=s,this.constraints=[],this.context=null,b.configuration.bus.publish({channel:i,topic:"subscription.created",data:{event:"subscription.created",channel:t,topic:n}}),b.configuration.bus.subscribe(this)};r.prototype={unsubscribe:function(){this.inactive||(this.inactive=!0,b.configuration.bus.unsubscribe(this),b.configuration.bus.publish({channel:i,topic:"subscription.removed",data:{event:"subscription.removed",channel:this.channel,topic:this.topic}}))},defer:function(){var t=this.callback;return this.callback=function(n,i){setTimeout(function(){t(n,i)},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 i=this.callback,s=t.after(n,t.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(n){if(!t.isFunction(n))throw"Predicate constraint must be a function";return this.constraints.push(n),this},withConstraints:function(n){var i=this;return t.isArray(n)&&t.each(n,function(t){i.withConstraint(t)}),i},withContext:function(t){return this.context=t,this},withDebounce:function(n){if(t.isNaN(n))throw"Milliseconds must be a number";var i=this.callback;return this.callback=t.debounce(i,n),this},withDelay:function(n){if(t.isNaN(n))throw"Milliseconds must be a number";var i=this.callback;return this.callback=function(t,s){setTimeout(function(){i(t,s)},n)},this},withThrottle:function(n){if(t.isNaN(n))throw"Milliseconds must be a number";var i=this.callback;return this.callback=t.throttle(i,n),this},subscribe:function(t){return this.callback=t,this}};var o={cache:{},regex:{},compare:function(n,i){var s,e,c,r=this.cache[i]&&this.cache[i][n];return r!==undefined?r:((e=this.regex[n])||(s="^"+t.map(n.split("."),function(t){var n="";return c&&(n="#"!==c?"\\.\\b":"\\b"),n+="#"===t?"[\\s\\S]*":"*"===t?"[^.]+":t,c=t,n}).join("")+"$",e=this.regex[n]=RegExp(s)),this.cache[i]=this.cache[i]||{},this.cache[i][n]=r=e.test(i),r)},reset:function(){this.cache={},this.regex={}}},u=function(n,i){!n.inactive&&b.configuration.resolver.compare(n.topic,i.topic)&&t.all(n.constraints,function(t){return t.call(n.context,i.data,i)})&&"function"==typeof n.callback&&n.callback.call(n.context,i.data,i)},a=0,h=[],l=function(){for(;h.length;)h.shift().unsubscribe()},p={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++a,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,s=0,e=t.length;e>s;)(i=t[s++])&&u(i,n)}),0===--a&&l(),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(a)return h.push(t),undefined;if(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}}};p.subscriptions[i]={};var b={configuration:{bus:p,resolver:o,DEFAULT_CHANNEL:n,SYSTEM_CHANNEL:i},ChannelDefinition:c,SubscriptionDefinition:r,channel:function(t){return new c(t)},subscribe:function(t){return new r(t.channel||n,t.topic,t.callback)},publish:function(t){return t.channel=t.channel||n,b.configuration.bus.publish(t)},addWireTap:function(t){return this.configuration.bus.addWireTap(t)},linkChannels:function(i,s){var e=[];return i=t.isArray(i)?i:[i],s=t.isArray(s)?s:[s],t.each(i,function(i){i.topic||"#",t.each(s,function(s){var c=s.channel||n;e.push(b.subscribe({channel:i.channel||n,topic:i.topic||"#",callback:function(n,i){var e=t.clone(i);e.topic=t.isFunction(s.topic)?s.topic(i.topic):s.topic||i.topic,e.channel=c,e.data=n,b.publish(e)}}))})}),e},utils:{getSubscribersFor:function(){var t=arguments[0],n=arguments[1];return 1===arguments.length&&(t=arguments[0].channel||b.configuration.DEFAULT_CHANNEL,n=arguments[0].topic),b.configuration.bus.subscriptions[t]&&Object.prototype.hasOwnProperty.call(b.configuration.bus.subscriptions[t],n)?b.configuration.bus.subscriptions[t][n]:[]},reset:function(){b.configuration.bus.reset(),b.configuration.resolver.reset()}}};return b}); \ No newline at end of file +(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,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||i.configuration.DEFAULT_CHANNEL};c.prototype.subscribe=function(){return 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,i.configuration.bus.publish(n)};var r=function(n,t,s){this.channel=n,this.topic=t,this.callback=s,this.constraints=[],this.context=null,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)};r.prototype={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}}))},defer:function(){var n=this.callback;return this.callback=function(t,i){setTimeout(function(){n(t,i)},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,s){setTimeout(function(){i(n,s)},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 o={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={}}},a=function(t,s){!t.inactive&&i.configuration.resolver.compare(t.topic,s.topic)&&n.all(t.constraints,function(n){return n.call(t.context,s.data,s)})&&"function"==typeof t.callback&&t.callback.call(t.context,s.data,s)},u=0,h=[],l=function(){for(;h.length;)h.shift().unsubscribe()},f={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,s=0,e=n.length;e>s;)(i=n[s++])&&a(i,t)}),0===--u&&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(u)return h.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}}};if(i={configuration:{bus:f,resolver:o,DEFAULT_CHANNEL:"/",SYSTEM_CHANNEL:"postal"},ChannelDefinition:c,SubscriptionDefinition:r,channel:function(n){return new c(n)},subscribe:function(n){return new r(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,s){var e=[];return t=n.isArray(t)?t:[t],s=n.isArray(s)?s:[s],n.each(t,function(t){var c=t.topic||"#";n.each(s,function(s){var r=s.channel||i.configuration.DEFAULT_CHANNEL;e.push(i.subscribe({channel:t.channel||i.configuration.DEFAULT_CHANNEL,topic:c,callback:function(t,e){var c=n.clone(e);c.topic=n.isFunction(s.topic)?s.topic(e.topic):s.topic||e.topic,c.channel=r,c.data=t,i.publish(c)}}))})}),e},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()}}},f.subscriptions[i.configuration.SYSTEM_CHANNEL]={},t.hasOwnProperty("__postalReady__")&&n.isArray(t.__postalReady__))for(;t.__postalReady__.length;)t.__postalReady__.shift().onReady(i);return i}); \ No newline at end of file diff --git a/lib/postal.js b/lib/postal.js index ebd27d4..7636aa2 100755 --- a/lib/postal.js +++ b/lib/postal.js @@ -438,7 +438,7 @@ /*jshint -W106 */ if ( global.hasOwnProperty( "__postalReady__" ) && _.isArray( global.__postalReady__ ) ) { while(global.__postalReady__.length) { - global.__postalReady__.shift(postal); + global.__postalReady__.shift().onReady(postal); } } /*jshint +W106 */ diff --git a/lib/postal.min.js b/lib/postal.min.js index a5c3c24..fb65f4c 100755 --- a/lib/postal.min.js +++ b/lib/postal.min.js @@ -4,4 +4,4 @@ License: Dual licensed MIT (http://www.opensource.org/licenses/mit-license) & GPL (http://www.opensource.org/licenses/gpl-license) Version 0.8.7 */ -(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,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||i.configuration.DEFAULT_CHANNEL};c.prototype.subscribe=function(){return 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,i.configuration.bus.publish(n)};var r=function(n,t,s){this.channel=n,this.topic=t,this.callback=s,this.constraints=[],this.context=null,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)};r.prototype={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}}))},defer:function(){var n=this.callback;return this.callback=function(t,i){setTimeout(function(){n(t,i)},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,s){setTimeout(function(){i(n,s)},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 o={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={}}},a=function(t,s){!t.inactive&&i.configuration.resolver.compare(t.topic,s.topic)&&n.all(t.constraints,function(n){return n.call(t.context,s.data,s)})&&"function"==typeof t.callback&&t.callback.call(t.context,s.data,s)},u=0,h=[],l=function(){for(;h.length;)h.shift().unsubscribe()},f={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,s=0,e=n.length;e>s;)(i=n[s++])&&a(i,t)}),0===--u&&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(u)return h.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}}};if(i={configuration:{bus:f,resolver:o,DEFAULT_CHANNEL:"/",SYSTEM_CHANNEL:"postal"},ChannelDefinition:c,SubscriptionDefinition:r,channel:function(n){return new c(n)},subscribe:function(n){return new r(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,s){var e=[];return t=n.isArray(t)?t:[t],s=n.isArray(s)?s:[s],n.each(t,function(t){var c=t.topic||"#";n.each(s,function(s){var r=s.channel||i.configuration.DEFAULT_CHANNEL;e.push(i.subscribe({channel:t.channel||i.configuration.DEFAULT_CHANNEL,topic:c,callback:function(t,e){var c=n.clone(e);c.topic=n.isFunction(s.topic)?s.topic(e.topic):s.topic||e.topic,c.channel=r,c.data=t,i.publish(c)}}))})}),e},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()}}},f.subscriptions[i.configuration.SYSTEM_CHANNEL]={},t.hasOwnProperty("__postalReady__")&&n.isArray(t.__postalReady__))for(;t.__postalReady__.length;)t.__postalReady__.shift(i);return i}); \ No newline at end of file +(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,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||i.configuration.DEFAULT_CHANNEL};c.prototype.subscribe=function(){return 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,i.configuration.bus.publish(n)};var r=function(n,t,s){this.channel=n,this.topic=t,this.callback=s,this.constraints=[],this.context=null,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)};r.prototype={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}}))},defer:function(){var n=this.callback;return this.callback=function(t,i){setTimeout(function(){n(t,i)},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,s){setTimeout(function(){i(n,s)},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 o={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={}}},a=function(t,s){!t.inactive&&i.configuration.resolver.compare(t.topic,s.topic)&&n.all(t.constraints,function(n){return n.call(t.context,s.data,s)})&&"function"==typeof t.callback&&t.callback.call(t.context,s.data,s)},u=0,h=[],l=function(){for(;h.length;)h.shift().unsubscribe()},f={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,s=0,e=n.length;e>s;)(i=n[s++])&&a(i,t)}),0===--u&&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(u)return h.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}}};if(i={configuration:{bus:f,resolver:o,DEFAULT_CHANNEL:"/",SYSTEM_CHANNEL:"postal"},ChannelDefinition:c,SubscriptionDefinition:r,channel:function(n){return new c(n)},subscribe:function(n){return new r(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,s){var e=[];return t=n.isArray(t)?t:[t],s=n.isArray(s)?s:[s],n.each(t,function(t){var c=t.topic||"#";n.each(s,function(s){var r=s.channel||i.configuration.DEFAULT_CHANNEL;e.push(i.subscribe({channel:t.channel||i.configuration.DEFAULT_CHANNEL,topic:c,callback:function(t,e){var c=n.clone(e);c.topic=n.isFunction(s.topic)?s.topic(e.topic):s.topic||e.topic,c.channel=r,c.data=t,i.publish(c)}}))})}),e},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()}}},f.subscriptions[i.configuration.SYSTEM_CHANNEL]={},t.hasOwnProperty("__postalReady__")&&n.isArray(t.__postalReady__))for(;t.__postalReady__.length;)t.__postalReady__.shift().onReady(i);return i}); \ No newline at end of file diff --git a/src/postal.js b/src/postal.js index 38f93ae..9a7702d 100644 --- a/src/postal.js +++ b/src/postal.js @@ -30,7 +30,7 @@ /*jshint -W106 */ if ( global.hasOwnProperty( "__postalReady__" ) && _.isArray( global.__postalReady__ ) ) { while(global.__postalReady__.length) { - global.__postalReady__.shift(postal); + global.__postalReady__.shift().onReady(postal); } } /*jshint +W106 */