From d3ad06218bb9495ce44e3119003646e7a2371b33 Mon Sep 17 00:00:00 2001 From: Jim Cowart Date: Tue, 22 May 2012 14:35:36 -0400 Subject: [PATCH] Fixed bug with subscription priority --- example/amd/js/libs/postal/postal.js | 34 +++++++++++++++--------- example/amd/js/libs/postal/postal.min.js | 2 +- example/node/client/js/lib/postal.js | 34 +++++++++++++++--------- example/node/messaging/postal.js | 34 +++++++++++++++--------- example/standard/js/postal.js | 34 +++++++++++++++--------- example/standard/js/postal.min.js | 2 +- lib/amd/postal.js | 34 +++++++++++++++--------- lib/amd/postal.min.js | 2 +- lib/node/package.json | 2 +- lib/node/postal.js | 34 +++++++++++++++--------- lib/standard/postal.js | 34 +++++++++++++++--------- lib/standard/postal.min.js | 2 +- spec/Postal.spec.js | 15 +++++++++++ src/main/LocalBus.js | 31 ++++++++++++--------- src/main/SubscriptionDefinition.js | 1 + src/main/VersionHeader.js | 2 +- 16 files changed, 188 insertions(+), 109 deletions(-) diff --git a/example/amd/js/libs/postal/postal.js b/example/amd/js/libs/postal/postal.js index af57ef9..8d03df4 100644 --- a/example/amd/js/libs/postal/postal.js +++ b/example/amd/js/libs/postal/postal.js @@ -2,7 +2,7 @@ postal.js Author: Jim Cowart License: Dual licensed MIT (http://www.opensource.org/licenses/mit-license) & GPL (http://www.opensource.org/licenses/gpl-license) - Version 0.6.1 + Version 0.6.2 */ // This is the amd-module version of postal.js @@ -192,6 +192,7 @@ SubscriptionDefinition.prototype = { throw "Priority must be a number"; } this.priority = priority; + postal.configuration.bus.changePriority( this ); return this; }, @@ -249,6 +250,24 @@ var localBus = { }; }, + changePriority: function ( subDef ) { + var idx, found; + if(this.subscriptions[subDef.channel] && this.subscriptions[subDef.channel][subDef.topic]) { + this.subscriptions[subDef.channel][subDef.topic] = _.without(this.subscriptions[subDef.channel][subDef.topic], subDef); + idx = this.subscriptions[subDef.channel][subDef.topic].length - 1; + for ( ; idx >= 0; idx-- ) { + if ( this.subscriptions[subDef.channel][subDef.topic][idx].priority <= subDef.priority ) { + this.subscriptions[subDef.channel][subDef.topic].splice( idx + 1, 0, subDef ); + found = true; + break; + } + } + if ( !found ) { + this.subscriptions[subDef.channel][subDef.topic].unshift( subDef ); + } + } + }, + publish : function ( envelope ) { _.each( this.wireTaps, function ( tap ) { tap( envelope.data, envelope ); @@ -293,18 +312,7 @@ var localBus = { if ( !subs ) { subs = this.subscriptions[subDef.channel][subDef.topic] = new Array( 0 ); } - - idx = subs.length - 1; - for ( ; idx >= 0; idx-- ) { - if ( subs[idx].priority <= subDef.priority ) { - subs.splice( idx + 1, 0, subDef ); - found = true; - break; - } - } - if ( !found ) { - subs.unshift( subDef ); - } + subs.push( subDef ); return subDef; }, diff --git a/example/amd/js/libs/postal/postal.min.js b/example/amd/js/libs/postal/postal.min.js index a58a803..ac00e16 100644 --- a/example/amd/js/libs/postal/postal.min.js +++ b/example/amd/js/libs/postal/postal.min.js @@ -1 +1 @@ -define(["underscore"],function(a,b){var c="/",d=50,e=0,f="postal",g=function(){},h=function(){var b;return function(c){var d=!1;return a.isString(c)?(d=c===b,b=c):(d=a.isEqual(c,b),b=a.clone(c)),!d}},i=function(a,b){this.channel=a||c,this._topic=b||""};i.prototype={subscribe:function(){var a=arguments.length;if(a===1)return new j(this.channel,this._topic,arguments[0]);if(a===2)return new j(this.channel,arguments[0],arguments[1])},publish:function(a){var b=a||{},c={channel:this.channel,topic:this._topic,data:b};return b.topic&&b.data&&(c=b,c.channel=c.channel||this.channel),c.timeStamp=new Date,p.configuration.bus.publish(c),c},topic:function(a){return a===this._topic?this:new i(this.channel,a)}};var j=function(a,b,c){this.channel=a,this.topic=b,this.callback=c,this.priority=d,this.constraints=new Array(0),this.maxCalls=e,this.onHandled=g,this.context=null,p.configuration.bus.publish({channel:f,topic:"subscription.created",timeStamp:new Date,data:{event:"subscription.created",channel:a,topic:b}}),p.configuration.bus.subscribe(this)};j.prototype={unsubscribe:function(){p.configuration.bus.unsubscribe(this),p.configuration.bus.publish({channel:f,topic:"subscription.removed",timeStamp:new Date,data:{event:"subscription.removed",channel:this.channel,topic:this.topic}})},defer:function(){var a=this.callback;return this.callback=function(b){setTimeout(a,0,b)},this},disposeAfter:function(b){if(a.isNaN(b)||b<=0)throw"The value provided to disposeAfter (maxCalls) must be a number greater than zero.";var c=this.onHandled,d=a.after(b,a.bind(function(){this.unsubscribe(this)},this));return this.onHandled=function(){c.apply(this.context,arguments),d()},this},ignoreDuplicates:function(){return this.withConstraint(new h),this},withConstraint:function(b){if(!a.isFunction(b))throw"Predicate constraint must be a function";return this.constraints.push(b),this},withConstraints:function(b){var c=this;return a.isArray(b)&&a.each(b,function(a){c.withConstraint(a)}),c},withContext:function(a){return this.context=a,this},withDebounce:function(b){if(a.isNaN(b))throw"Milliseconds must be a number";var c=this.callback;return this.callback=a.debounce(c,b),this},withDelay:function(b){if(a.isNaN(b))throw"Milliseconds must be a number";var c=this.callback;return this.callback=function(a){setTimeout(function(){c(a)},b)},this},withPriority:function(b){if(a.isNaN(b))throw"Priority must be a number";return this.priority=b,this},withThrottle:function(b){if(a.isNaN(b))throw"Milliseconds must be a number";var c=this.callback;return this.callback=a.throttle(c,b),this},subscribe:function(a){return this.callback=a,this}};var k={cache:{},compare:function(a,b){if(this.cache[b]&&this.cache[b][a])return!0;var c=new RegExp("^"+a.replace(/\./g,"\\.").replace(/\*/g,".*").replace(/#/g,"[A-Z,a-z,0-9]*")+"$"),d=c.test(b);return d&&(this.cache[b]||(this.cache[b]={}),this.cache[b][a]=!0),d},reset:function(){this.cache={}}},l={addWireTap:function(a){var b=this;return b.wireTaps.push(a),function(){var c=b.wireTaps.indexOf(a);c!==-1&&b.wireTaps.splice(c,1)}},publish:function(b){a.each(this.wireTaps,function(a){a(b.data,b)}),a.each(this.subscriptions[b.channel],function(c){a.each(c,function(c){p.configuration.resolver.compare(c.topic,b.topic)&&a.all(c.constraints,function(a){return a(b.data,b)})&&typeof c.callback=="function"&&(c.callback.apply(c.context,[b.data,b]),c.onHandled())})})},reset:function(){this.subscriptions&&(a.each(this.subscriptions,function(b){a.each(b,function(a){while(a.length)a.pop().unsubscribe()})}),this.subscriptions={})},subscribe:function(a){var b,c,d,e=this.subscriptions[a.channel],f;e||(e=this.subscriptions[a.channel]={}),f=this.subscriptions[a.channel][a.topic],f||(f=this.subscriptions[a.channel][a.topic]=new Array(0)),b=f.length-1;for(;b>=0;b--)if(f[b].priority<=a.priority){f.splice(b+1,0,a),c=!0;break}return c||f.unshift(a),a},subscriptions:{},wireTaps:new Array(0),unsubscribe:function(a){if(this.subscriptions[a.channel][a.topic]){var b=this.subscriptions[a.channel][a.topic].length,c=0;for(;c=0;c--)if(this.subscriptions[b.channel][b.topic][c].priority<=b.priority){this.subscriptions[b.channel][b.topic].splice(c+1,0,b),d=!0;break}d||this.subscriptions[b.channel][b.topic].unshift(b)}},publish:function(b){a.each(this.wireTaps,function(a){a(b.data,b)}),a.each(this.subscriptions[b.channel],function(c){a.each(c,function(c){p.configuration.resolver.compare(c.topic,b.topic)&&a.all(c.constraints,function(a){return a(b.data,b)})&&typeof c.callback=="function"&&(c.callback.apply(c.context,[b.data,b]),c.onHandled())})})},reset:function(){this.subscriptions&&(a.each(this.subscriptions,function(b){a.each(b,function(a){while(a.length)a.pop().unsubscribe()})}),this.subscriptions={})},subscribe:function(a){var b,c,d,e=this.subscriptions[a.channel],f;return e||(e=this.subscriptions[a.channel]={}),f=this.subscriptions[a.channel][a.topic],f||(f=this.subscriptions[a.channel][a.topic]=new Array(0)),f.push(a),a},subscriptions:{},wireTaps:new Array(0),unsubscribe:function(a){if(this.subscriptions[a.channel][a.topic]){var b=this.subscriptions[a.channel][a.topic].length,c=0;for(;c= 0; idx-- ) { + if ( this.subscriptions[subDef.channel][subDef.topic][idx].priority <= subDef.priority ) { + this.subscriptions[subDef.channel][subDef.topic].splice( idx + 1, 0, subDef ); + found = true; + break; + } + } + if ( !found ) { + this.subscriptions[subDef.channel][subDef.topic].unshift( subDef ); + } + } + }, + publish : function ( envelope ) { _.each( this.wireTaps, function ( tap ) { tap( envelope.data, envelope ); @@ -293,18 +312,7 @@ var localBus = { if ( !subs ) { subs = this.subscriptions[subDef.channel][subDef.topic] = new Array( 0 ); } - - idx = subs.length - 1; - for ( ; idx >= 0; idx-- ) { - if ( subs[idx].priority <= subDef.priority ) { - subs.splice( idx + 1, 0, subDef ); - found = true; - break; - } - } - if ( !found ) { - subs.unshift( subDef ); - } + subs.push( subDef ); return subDef; }, diff --git a/example/node/messaging/postal.js b/example/node/messaging/postal.js index d5e8f09..ea78e74 100644 --- a/example/node/messaging/postal.js +++ b/example/node/messaging/postal.js @@ -2,7 +2,7 @@ postal.js Author: Jim Cowart License: Dual licensed MIT (http://www.opensource.org/licenses/mit-license) & GPL (http://www.opensource.org/licenses/gpl-license) - Version 0.6.1 + Version 0.6.2 */ // This is the node.js version of postal.js @@ -192,6 +192,7 @@ SubscriptionDefinition.prototype = { throw "Priority must be a number"; } this.priority = priority; + postal.configuration.bus.changePriority( this ); return this; }, @@ -249,6 +250,24 @@ var localBus = { }; }, + changePriority: function ( subDef ) { + var idx, found; + if(this.subscriptions[subDef.channel] && this.subscriptions[subDef.channel][subDef.topic]) { + this.subscriptions[subDef.channel][subDef.topic] = _.without(this.subscriptions[subDef.channel][subDef.topic], subDef); + idx = this.subscriptions[subDef.channel][subDef.topic].length - 1; + for ( ; idx >= 0; idx-- ) { + if ( this.subscriptions[subDef.channel][subDef.topic][idx].priority <= subDef.priority ) { + this.subscriptions[subDef.channel][subDef.topic].splice( idx + 1, 0, subDef ); + found = true; + break; + } + } + if ( !found ) { + this.subscriptions[subDef.channel][subDef.topic].unshift( subDef ); + } + } + }, + publish : function ( envelope ) { _.each( this.wireTaps, function ( tap ) { tap( envelope.data, envelope ); @@ -293,18 +312,7 @@ var localBus = { if ( !subs ) { subs = this.subscriptions[subDef.channel][subDef.topic] = new Array( 0 ); } - - idx = subs.length - 1; - for ( ; idx >= 0; idx-- ) { - if ( subs[idx].priority <= subDef.priority ) { - subs.splice( idx + 1, 0, subDef ); - found = true; - break; - } - } - if ( !found ) { - subs.unshift( subDef ); - } + subs.push( subDef ); return subDef; }, diff --git a/example/standard/js/postal.js b/example/standard/js/postal.js index 8621c7e..8e4377b 100644 --- a/example/standard/js/postal.js +++ b/example/standard/js/postal.js @@ -2,7 +2,7 @@ postal.js Author: Jim Cowart License: Dual licensed MIT (http://www.opensource.org/licenses/mit-license) & GPL (http://www.opensource.org/licenses/gpl-license) - Version 0.6.1 + Version 0.6.2 */ // This is the standard lib version of postal.js @@ -192,6 +192,7 @@ SubscriptionDefinition.prototype = { throw "Priority must be a number"; } this.priority = priority; + postal.configuration.bus.changePriority( this ); return this; }, @@ -249,6 +250,24 @@ var localBus = { }; }, + changePriority: function ( subDef ) { + var idx, found; + if(this.subscriptions[subDef.channel] && this.subscriptions[subDef.channel][subDef.topic]) { + this.subscriptions[subDef.channel][subDef.topic] = _.without(this.subscriptions[subDef.channel][subDef.topic], subDef); + idx = this.subscriptions[subDef.channel][subDef.topic].length - 1; + for ( ; idx >= 0; idx-- ) { + if ( this.subscriptions[subDef.channel][subDef.topic][idx].priority <= subDef.priority ) { + this.subscriptions[subDef.channel][subDef.topic].splice( idx + 1, 0, subDef ); + found = true; + break; + } + } + if ( !found ) { + this.subscriptions[subDef.channel][subDef.topic].unshift( subDef ); + } + } + }, + publish : function ( envelope ) { _.each( this.wireTaps, function ( tap ) { tap( envelope.data, envelope ); @@ -293,18 +312,7 @@ var localBus = { if ( !subs ) { subs = this.subscriptions[subDef.channel][subDef.topic] = new Array( 0 ); } - - idx = subs.length - 1; - for ( ; idx >= 0; idx-- ) { - if ( subs[idx].priority <= subDef.priority ) { - subs.splice( idx + 1, 0, subDef ); - found = true; - break; - } - } - if ( !found ) { - subs.unshift( subDef ); - } + subs.push( subDef ); return subDef; }, diff --git a/example/standard/js/postal.min.js b/example/standard/js/postal.min.js index a03bee4..57b2d1c 100644 --- a/example/standard/js/postal.min.js +++ b/example/standard/js/postal.min.js @@ -1 +1 @@ -(function(a,b,c){var d="/",e=50,f=0,g="postal",h=function(){},i=function(){var b;return function(c){var d=!1;return a.isString(c)?(d=c===b,b=c):(d=a.isEqual(c,b),b=a.clone(c)),!d}},j=function(a,b){this.channel=a||d,this._topic=b||""};j.prototype={subscribe:function(){var a=arguments.length;if(a===1)return new k(this.channel,this._topic,arguments[0]);if(a===2)return new k(this.channel,arguments[0],arguments[1])},publish:function(a){var b=a||{},c={channel:this.channel,topic:this._topic,data:b};return b.topic&&b.data&&(c=b,c.channel=c.channel||this.channel),c.timeStamp=new Date,q.configuration.bus.publish(c),c},topic:function(a){return a===this._topic?this:new j(this.channel,a)}};var k=function(a,b,c){this.channel=a,this.topic=b,this.callback=c,this.priority=e,this.constraints=new Array(0),this.maxCalls=f,this.onHandled=h,this.context=null,q.configuration.bus.publish({channel:g,topic:"subscription.created",timeStamp:new Date,data:{event:"subscription.created",channel:a,topic:b}}),q.configuration.bus.subscribe(this)};k.prototype={unsubscribe:function(){q.configuration.bus.unsubscribe(this),q.configuration.bus.publish({channel:g,topic:"subscription.removed",timeStamp:new Date,data:{event:"subscription.removed",channel:this.channel,topic:this.topic}})},defer:function(){var a=this.callback;return this.callback=function(b){setTimeout(a,0,b)},this},disposeAfter:function(b){if(a.isNaN(b)||b<=0)throw"The value provided to disposeAfter (maxCalls) must be a number greater than zero.";var c=this.onHandled,d=a.after(b,a.bind(function(){this.unsubscribe(this)},this));return this.onHandled=function(){c.apply(this.context,arguments),d()},this},ignoreDuplicates:function(){return this.withConstraint(new i),this},withConstraint:function(b){if(!a.isFunction(b))throw"Predicate constraint must be a function";return this.constraints.push(b),this},withConstraints:function(b){var c=this;return a.isArray(b)&&a.each(b,function(a){c.withConstraint(a)}),c},withContext:function(a){return this.context=a,this},withDebounce:function(b){if(a.isNaN(b))throw"Milliseconds must be a number";var c=this.callback;return this.callback=a.debounce(c,b),this},withDelay:function(b){if(a.isNaN(b))throw"Milliseconds must be a number";var c=this.callback;return this.callback=function(a){setTimeout(function(){c(a)},b)},this},withPriority:function(b){if(a.isNaN(b))throw"Priority must be a number";return this.priority=b,this},withThrottle:function(b){if(a.isNaN(b))throw"Milliseconds must be a number";var c=this.callback;return this.callback=a.throttle(c,b),this},subscribe:function(a){return this.callback=a,this}};var l={cache:{},compare:function(a,b){if(this.cache[b]&&this.cache[b][a])return!0;var c=new RegExp("^"+a.replace(/\./g,"\\.").replace(/\*/g,".*").replace(/#/g,"[A-Z,a-z,0-9]*")+"$"),d=c.test(b);return d&&(this.cache[b]||(this.cache[b]={}),this.cache[b][a]=!0),d},reset:function(){this.cache={}}},m={addWireTap:function(a){var b=this;return b.wireTaps.push(a),function(){var c=b.wireTaps.indexOf(a);c!==-1&&b.wireTaps.splice(c,1)}},publish:function(b){a.each(this.wireTaps,function(a){a(b.data,b)}),a.each(this.subscriptions[b.channel],function(c){a.each(c,function(c){q.configuration.resolver.compare(c.topic,b.topic)&&a.all(c.constraints,function(a){return a(b.data,b)})&&typeof c.callback=="function"&&(c.callback.apply(c.context,[b.data,b]),c.onHandled())})})},reset:function(){this.subscriptions&&(a.each(this.subscriptions,function(b){a.each(b,function(a){while(a.length)a.pop().unsubscribe()})}),this.subscriptions={})},subscribe:function(a){var b,c,d,e=this.subscriptions[a.channel],f;e||(e=this.subscriptions[a.channel]={}),f=this.subscriptions[a.channel][a.topic],f||(f=this.subscriptions[a.channel][a.topic]=new Array(0)),b=f.length-1;for(;b>=0;b--)if(f[b].priority<=a.priority){f.splice(b+1,0,a),c=!0;break}return c||f.unshift(a),a},subscriptions:{},wireTaps:new Array(0),unsubscribe:function(a){if(this.subscriptions[a.channel][a.topic]){var b=this.subscriptions[a.channel][a.topic].length,c=0;for(;c=0;c--)if(this.subscriptions[b.channel][b.topic][c].priority<=b.priority){this.subscriptions[b.channel][b.topic].splice(c+1,0,b),d=!0;break}d||this.subscriptions[b.channel][b.topic].unshift(b)}},publish:function(b){a.each(this.wireTaps,function(a){a(b.data,b)}),a.each(this.subscriptions[b.channel],function(c){a.each(c,function(c){q.configuration.resolver.compare(c.topic,b.topic)&&a.all(c.constraints,function(a){return a(b.data,b)})&&typeof c.callback=="function"&&(c.callback.apply(c.context,[b.data,b]),c.onHandled())})})},reset:function(){this.subscriptions&&(a.each(this.subscriptions,function(b){a.each(b,function(a){while(a.length)a.pop().unsubscribe()})}),this.subscriptions={})},subscribe:function(a){var b,c,d,e=this.subscriptions[a.channel],f;return e||(e=this.subscriptions[a.channel]={}),f=this.subscriptions[a.channel][a.topic],f||(f=this.subscriptions[a.channel][a.topic]=new Array(0)),f.push(a),a},subscriptions:{},wireTaps:new Array(0),unsubscribe:function(a){if(this.subscriptions[a.channel][a.topic]){var b=this.subscriptions[a.channel][a.topic].length,c=0;for(;c= 0; idx-- ) { + if ( this.subscriptions[subDef.channel][subDef.topic][idx].priority <= subDef.priority ) { + this.subscriptions[subDef.channel][subDef.topic].splice( idx + 1, 0, subDef ); + found = true; + break; + } + } + if ( !found ) { + this.subscriptions[subDef.channel][subDef.topic].unshift( subDef ); + } + } + }, + publish : function ( envelope ) { _.each( this.wireTaps, function ( tap ) { tap( envelope.data, envelope ); @@ -293,18 +312,7 @@ var localBus = { if ( !subs ) { subs = this.subscriptions[subDef.channel][subDef.topic] = new Array( 0 ); } - - idx = subs.length - 1; - for ( ; idx >= 0; idx-- ) { - if ( subs[idx].priority <= subDef.priority ) { - subs.splice( idx + 1, 0, subDef ); - found = true; - break; - } - } - if ( !found ) { - subs.unshift( subDef ); - } + subs.push( subDef ); return subDef; }, diff --git a/lib/amd/postal.min.js b/lib/amd/postal.min.js index a58a803..ac00e16 100644 --- a/lib/amd/postal.min.js +++ b/lib/amd/postal.min.js @@ -1 +1 @@ -define(["underscore"],function(a,b){var c="/",d=50,e=0,f="postal",g=function(){},h=function(){var b;return function(c){var d=!1;return a.isString(c)?(d=c===b,b=c):(d=a.isEqual(c,b),b=a.clone(c)),!d}},i=function(a,b){this.channel=a||c,this._topic=b||""};i.prototype={subscribe:function(){var a=arguments.length;if(a===1)return new j(this.channel,this._topic,arguments[0]);if(a===2)return new j(this.channel,arguments[0],arguments[1])},publish:function(a){var b=a||{},c={channel:this.channel,topic:this._topic,data:b};return b.topic&&b.data&&(c=b,c.channel=c.channel||this.channel),c.timeStamp=new Date,p.configuration.bus.publish(c),c},topic:function(a){return a===this._topic?this:new i(this.channel,a)}};var j=function(a,b,c){this.channel=a,this.topic=b,this.callback=c,this.priority=d,this.constraints=new Array(0),this.maxCalls=e,this.onHandled=g,this.context=null,p.configuration.bus.publish({channel:f,topic:"subscription.created",timeStamp:new Date,data:{event:"subscription.created",channel:a,topic:b}}),p.configuration.bus.subscribe(this)};j.prototype={unsubscribe:function(){p.configuration.bus.unsubscribe(this),p.configuration.bus.publish({channel:f,topic:"subscription.removed",timeStamp:new Date,data:{event:"subscription.removed",channel:this.channel,topic:this.topic}})},defer:function(){var a=this.callback;return this.callback=function(b){setTimeout(a,0,b)},this},disposeAfter:function(b){if(a.isNaN(b)||b<=0)throw"The value provided to disposeAfter (maxCalls) must be a number greater than zero.";var c=this.onHandled,d=a.after(b,a.bind(function(){this.unsubscribe(this)},this));return this.onHandled=function(){c.apply(this.context,arguments),d()},this},ignoreDuplicates:function(){return this.withConstraint(new h),this},withConstraint:function(b){if(!a.isFunction(b))throw"Predicate constraint must be a function";return this.constraints.push(b),this},withConstraints:function(b){var c=this;return a.isArray(b)&&a.each(b,function(a){c.withConstraint(a)}),c},withContext:function(a){return this.context=a,this},withDebounce:function(b){if(a.isNaN(b))throw"Milliseconds must be a number";var c=this.callback;return this.callback=a.debounce(c,b),this},withDelay:function(b){if(a.isNaN(b))throw"Milliseconds must be a number";var c=this.callback;return this.callback=function(a){setTimeout(function(){c(a)},b)},this},withPriority:function(b){if(a.isNaN(b))throw"Priority must be a number";return this.priority=b,this},withThrottle:function(b){if(a.isNaN(b))throw"Milliseconds must be a number";var c=this.callback;return this.callback=a.throttle(c,b),this},subscribe:function(a){return this.callback=a,this}};var k={cache:{},compare:function(a,b){if(this.cache[b]&&this.cache[b][a])return!0;var c=new RegExp("^"+a.replace(/\./g,"\\.").replace(/\*/g,".*").replace(/#/g,"[A-Z,a-z,0-9]*")+"$"),d=c.test(b);return d&&(this.cache[b]||(this.cache[b]={}),this.cache[b][a]=!0),d},reset:function(){this.cache={}}},l={addWireTap:function(a){var b=this;return b.wireTaps.push(a),function(){var c=b.wireTaps.indexOf(a);c!==-1&&b.wireTaps.splice(c,1)}},publish:function(b){a.each(this.wireTaps,function(a){a(b.data,b)}),a.each(this.subscriptions[b.channel],function(c){a.each(c,function(c){p.configuration.resolver.compare(c.topic,b.topic)&&a.all(c.constraints,function(a){return a(b.data,b)})&&typeof c.callback=="function"&&(c.callback.apply(c.context,[b.data,b]),c.onHandled())})})},reset:function(){this.subscriptions&&(a.each(this.subscriptions,function(b){a.each(b,function(a){while(a.length)a.pop().unsubscribe()})}),this.subscriptions={})},subscribe:function(a){var b,c,d,e=this.subscriptions[a.channel],f;e||(e=this.subscriptions[a.channel]={}),f=this.subscriptions[a.channel][a.topic],f||(f=this.subscriptions[a.channel][a.topic]=new Array(0)),b=f.length-1;for(;b>=0;b--)if(f[b].priority<=a.priority){f.splice(b+1,0,a),c=!0;break}return c||f.unshift(a),a},subscriptions:{},wireTaps:new Array(0),unsubscribe:function(a){if(this.subscriptions[a.channel][a.topic]){var b=this.subscriptions[a.channel][a.topic].length,c=0;for(;c=0;c--)if(this.subscriptions[b.channel][b.topic][c].priority<=b.priority){this.subscriptions[b.channel][b.topic].splice(c+1,0,b),d=!0;break}d||this.subscriptions[b.channel][b.topic].unshift(b)}},publish:function(b){a.each(this.wireTaps,function(a){a(b.data,b)}),a.each(this.subscriptions[b.channel],function(c){a.each(c,function(c){p.configuration.resolver.compare(c.topic,b.topic)&&a.all(c.constraints,function(a){return a(b.data,b)})&&typeof c.callback=="function"&&(c.callback.apply(c.context,[b.data,b]),c.onHandled())})})},reset:function(){this.subscriptions&&(a.each(this.subscriptions,function(b){a.each(b,function(a){while(a.length)a.pop().unsubscribe()})}),this.subscriptions={})},subscribe:function(a){var b,c,d,e=this.subscriptions[a.channel],f;return e||(e=this.subscriptions[a.channel]={}),f=this.subscriptions[a.channel][a.topic],f||(f=this.subscriptions[a.channel][a.topic]=new Array(0)),f.push(a),a},subscriptions:{},wireTaps:new Array(0),unsubscribe:function(a){if(this.subscriptions[a.channel][a.topic]){var b=this.subscriptions[a.channel][a.topic].length,c=0;for(;c= 0; idx-- ) { + if ( this.subscriptions[subDef.channel][subDef.topic][idx].priority <= subDef.priority ) { + this.subscriptions[subDef.channel][subDef.topic].splice( idx + 1, 0, subDef ); + found = true; + break; + } + } + if ( !found ) { + this.subscriptions[subDef.channel][subDef.topic].unshift( subDef ); + } + } + }, + publish : function ( envelope ) { _.each( this.wireTaps, function ( tap ) { tap( envelope.data, envelope ); @@ -293,18 +312,7 @@ var localBus = { if ( !subs ) { subs = this.subscriptions[subDef.channel][subDef.topic] = new Array( 0 ); } - - idx = subs.length - 1; - for ( ; idx >= 0; idx-- ) { - if ( subs[idx].priority <= subDef.priority ) { - subs.splice( idx + 1, 0, subDef ); - found = true; - break; - } - } - if ( !found ) { - subs.unshift( subDef ); - } + subs.push( subDef ); return subDef; }, diff --git a/lib/standard/postal.js b/lib/standard/postal.js index 8621c7e..8e4377b 100644 --- a/lib/standard/postal.js +++ b/lib/standard/postal.js @@ -2,7 +2,7 @@ postal.js Author: Jim Cowart License: Dual licensed MIT (http://www.opensource.org/licenses/mit-license) & GPL (http://www.opensource.org/licenses/gpl-license) - Version 0.6.1 + Version 0.6.2 */ // This is the standard lib version of postal.js @@ -192,6 +192,7 @@ SubscriptionDefinition.prototype = { throw "Priority must be a number"; } this.priority = priority; + postal.configuration.bus.changePriority( this ); return this; }, @@ -249,6 +250,24 @@ var localBus = { }; }, + changePriority: function ( subDef ) { + var idx, found; + if(this.subscriptions[subDef.channel] && this.subscriptions[subDef.channel][subDef.topic]) { + this.subscriptions[subDef.channel][subDef.topic] = _.without(this.subscriptions[subDef.channel][subDef.topic], subDef); + idx = this.subscriptions[subDef.channel][subDef.topic].length - 1; + for ( ; idx >= 0; idx-- ) { + if ( this.subscriptions[subDef.channel][subDef.topic][idx].priority <= subDef.priority ) { + this.subscriptions[subDef.channel][subDef.topic].splice( idx + 1, 0, subDef ); + found = true; + break; + } + } + if ( !found ) { + this.subscriptions[subDef.channel][subDef.topic].unshift( subDef ); + } + } + }, + publish : function ( envelope ) { _.each( this.wireTaps, function ( tap ) { tap( envelope.data, envelope ); @@ -293,18 +312,7 @@ var localBus = { if ( !subs ) { subs = this.subscriptions[subDef.channel][subDef.topic] = new Array( 0 ); } - - idx = subs.length - 1; - for ( ; idx >= 0; idx-- ) { - if ( subs[idx].priority <= subDef.priority ) { - subs.splice( idx + 1, 0, subDef ); - found = true; - break; - } - } - if ( !found ) { - subs.unshift( subDef ); - } + subs.push( subDef ); return subDef; }, diff --git a/lib/standard/postal.min.js b/lib/standard/postal.min.js index a03bee4..57b2d1c 100644 --- a/lib/standard/postal.min.js +++ b/lib/standard/postal.min.js @@ -1 +1 @@ -(function(a,b,c){var d="/",e=50,f=0,g="postal",h=function(){},i=function(){var b;return function(c){var d=!1;return a.isString(c)?(d=c===b,b=c):(d=a.isEqual(c,b),b=a.clone(c)),!d}},j=function(a,b){this.channel=a||d,this._topic=b||""};j.prototype={subscribe:function(){var a=arguments.length;if(a===1)return new k(this.channel,this._topic,arguments[0]);if(a===2)return new k(this.channel,arguments[0],arguments[1])},publish:function(a){var b=a||{},c={channel:this.channel,topic:this._topic,data:b};return b.topic&&b.data&&(c=b,c.channel=c.channel||this.channel),c.timeStamp=new Date,q.configuration.bus.publish(c),c},topic:function(a){return a===this._topic?this:new j(this.channel,a)}};var k=function(a,b,c){this.channel=a,this.topic=b,this.callback=c,this.priority=e,this.constraints=new Array(0),this.maxCalls=f,this.onHandled=h,this.context=null,q.configuration.bus.publish({channel:g,topic:"subscription.created",timeStamp:new Date,data:{event:"subscription.created",channel:a,topic:b}}),q.configuration.bus.subscribe(this)};k.prototype={unsubscribe:function(){q.configuration.bus.unsubscribe(this),q.configuration.bus.publish({channel:g,topic:"subscription.removed",timeStamp:new Date,data:{event:"subscription.removed",channel:this.channel,topic:this.topic}})},defer:function(){var a=this.callback;return this.callback=function(b){setTimeout(a,0,b)},this},disposeAfter:function(b){if(a.isNaN(b)||b<=0)throw"The value provided to disposeAfter (maxCalls) must be a number greater than zero.";var c=this.onHandled,d=a.after(b,a.bind(function(){this.unsubscribe(this)},this));return this.onHandled=function(){c.apply(this.context,arguments),d()},this},ignoreDuplicates:function(){return this.withConstraint(new i),this},withConstraint:function(b){if(!a.isFunction(b))throw"Predicate constraint must be a function";return this.constraints.push(b),this},withConstraints:function(b){var c=this;return a.isArray(b)&&a.each(b,function(a){c.withConstraint(a)}),c},withContext:function(a){return this.context=a,this},withDebounce:function(b){if(a.isNaN(b))throw"Milliseconds must be a number";var c=this.callback;return this.callback=a.debounce(c,b),this},withDelay:function(b){if(a.isNaN(b))throw"Milliseconds must be a number";var c=this.callback;return this.callback=function(a){setTimeout(function(){c(a)},b)},this},withPriority:function(b){if(a.isNaN(b))throw"Priority must be a number";return this.priority=b,this},withThrottle:function(b){if(a.isNaN(b))throw"Milliseconds must be a number";var c=this.callback;return this.callback=a.throttle(c,b),this},subscribe:function(a){return this.callback=a,this}};var l={cache:{},compare:function(a,b){if(this.cache[b]&&this.cache[b][a])return!0;var c=new RegExp("^"+a.replace(/\./g,"\\.").replace(/\*/g,".*").replace(/#/g,"[A-Z,a-z,0-9]*")+"$"),d=c.test(b);return d&&(this.cache[b]||(this.cache[b]={}),this.cache[b][a]=!0),d},reset:function(){this.cache={}}},m={addWireTap:function(a){var b=this;return b.wireTaps.push(a),function(){var c=b.wireTaps.indexOf(a);c!==-1&&b.wireTaps.splice(c,1)}},publish:function(b){a.each(this.wireTaps,function(a){a(b.data,b)}),a.each(this.subscriptions[b.channel],function(c){a.each(c,function(c){q.configuration.resolver.compare(c.topic,b.topic)&&a.all(c.constraints,function(a){return a(b.data,b)})&&typeof c.callback=="function"&&(c.callback.apply(c.context,[b.data,b]),c.onHandled())})})},reset:function(){this.subscriptions&&(a.each(this.subscriptions,function(b){a.each(b,function(a){while(a.length)a.pop().unsubscribe()})}),this.subscriptions={})},subscribe:function(a){var b,c,d,e=this.subscriptions[a.channel],f;e||(e=this.subscriptions[a.channel]={}),f=this.subscriptions[a.channel][a.topic],f||(f=this.subscriptions[a.channel][a.topic]=new Array(0)),b=f.length-1;for(;b>=0;b--)if(f[b].priority<=a.priority){f.splice(b+1,0,a),c=!0;break}return c||f.unshift(a),a},subscriptions:{},wireTaps:new Array(0),unsubscribe:function(a){if(this.subscriptions[a.channel][a.topic]){var b=this.subscriptions[a.channel][a.topic].length,c=0;for(;c=0;c--)if(this.subscriptions[b.channel][b.topic][c].priority<=b.priority){this.subscriptions[b.channel][b.topic].splice(c+1,0,b),d=!0;break}d||this.subscriptions[b.channel][b.topic].unshift(b)}},publish:function(b){a.each(this.wireTaps,function(a){a(b.data,b)}),a.each(this.subscriptions[b.channel],function(c){a.each(c,function(c){q.configuration.resolver.compare(c.topic,b.topic)&&a.all(c.constraints,function(a){return a(b.data,b)})&&typeof c.callback=="function"&&(c.callback.apply(c.context,[b.data,b]),c.onHandled())})})},reset:function(){this.subscriptions&&(a.each(this.subscriptions,function(b){a.each(b,function(a){while(a.length)a.pop().unsubscribe()})}),this.subscriptions={})},subscribe:function(a){var b,c,d,e=this.subscriptions[a.channel],f;return e||(e=this.subscriptions[a.channel]={}),f=this.subscriptions[a.channel][a.topic],f||(f=this.subscriptions[a.channel][a.topic]=new Array(0)),f.push(a),a},subscriptions:{},wireTaps:new Array(0),unsubscribe:function(a){if(this.subscriptions[a.channel][a.topic]){var b=this.subscriptions[a.channel][a.topic].length,c=0;for(;c= 0; idx-- ) { + if ( this.subscriptions[subDef.channel][subDef.topic][idx].priority <= subDef.priority ) { + this.subscriptions[subDef.channel][subDef.topic].splice( idx + 1, 0, subDef ); + found = true; + break; + } + } + if ( !found ) { + this.subscriptions[subDef.channel][subDef.topic].unshift( subDef ); + } + } + }, + publish : function ( envelope ) { _.each( this.wireTaps, function ( tap ) { tap( envelope.data, envelope ); @@ -55,18 +73,7 @@ var localBus = { if ( !subs ) { subs = this.subscriptions[subDef.channel][subDef.topic] = new Array( 0 ); } - - idx = subs.length - 1; - for ( ; idx >= 0; idx-- ) { - if ( subs[idx].priority <= subDef.priority ) { - subs.splice( idx + 1, 0, subDef ); - found = true; - break; - } - } - if ( !found ) { - subs.unshift( subDef ); - } + subs.push( subDef ); return subDef; }, diff --git a/src/main/SubscriptionDefinition.js b/src/main/SubscriptionDefinition.js index 9e669a6..85fd30e 100644 --- a/src/main/SubscriptionDefinition.js +++ b/src/main/SubscriptionDefinition.js @@ -117,6 +117,7 @@ SubscriptionDefinition.prototype = { throw "Priority must be a number"; } this.priority = priority; + postal.configuration.bus.changePriority( this ); return this; }, diff --git a/src/main/VersionHeader.js b/src/main/VersionHeader.js index 30beb0f..2c6b9c3 100644 --- a/src/main/VersionHeader.js +++ b/src/main/VersionHeader.js @@ -2,5 +2,5 @@ postal.js Author: Jim Cowart License: Dual licensed MIT (http://www.opensource.org/licenses/mit-license) & GPL (http://www.opensource.org/licenses/gpl-license) - Version 0.6.1 + Version 0.6.2 */