From fbcfe702917c54349e48729f1d94bbef3839c3dc Mon Sep 17 00:00:00 2001 From: Jim Cowart Date: Sun, 26 Feb 2012 22:39:57 -0500 Subject: [PATCH] Updated build artifacts --- example/amd/js/libs/postal/postal.js | 210 ++++++++++-------- example/standard/js/postal.js | 210 ++++++++++-------- lib/browser/amd/postal.diagnostics.min.gz.js | Bin 243 -> 243 bytes lib/browser/amd/postal.js | 210 ++++++++++-------- lib/browser/amd/postal.min.gz.js | Bin 1535 -> 1695 bytes lib/browser/amd/postal.min.js | 2 +- .../standard/postal.diagnostics.min.gz.js | Bin 220 -> 220 bytes lib/browser/standard/postal.js | 210 ++++++++++-------- lib/browser/standard/postal.min.gz.js | Bin 1518 -> 1675 bytes lib/browser/standard/postal.min.js | 2 +- lib/node/postal.js | 210 ++++++++++-------- 11 files changed, 617 insertions(+), 437 deletions(-) diff --git a/example/amd/js/libs/postal/postal.js b/example/amd/js/libs/postal/postal.js index 62f4dad..25511c7 100644 --- a/example/amd/js/libs/postal/postal.js +++ b/example/amd/js/libs/postal/postal.js @@ -9,6 +9,7 @@ define(['underscore'], function(_) { var DEFAULT_EXCHANGE = "/", DEFAULT_PRIORITY = 50, DEFAULT_DISPOSEAFTER = 0, + SYSTEM_EXCHANGE = "postal", NO_OP = function() { }, parsePublishArgs = function(args) { var parsed = { envelope: { } }, env; @@ -90,11 +91,24 @@ var SubscriptionDefinition = function(exchange, topic, callback) { this.maxCalls = DEFAULT_DISPOSEAFTER; this.onHandled = NO_OP; this.context = null; + + postal.publish(SYSTEM_EXCHANGE, "subscription.created", + { + event: "subscription.created", + exchange: exchange, + topic: topic + }); }; SubscriptionDefinition.prototype = { unsubscribe: function() { postal.configuration.bus.unsubscribe(this); + postal.publish(SYSTEM_EXCHANGE, "subscription.removed", + { + event: "subscription.removed", + exchange: this.exchange, + topic: this.topic + }); }, defer: function() { @@ -221,109 +235,131 @@ var bindingsResolver = { var localBus = { - subscriptions: {}, + subscriptions: {}, - wireTaps: [], + wireTaps: [], - publish: function(data, envelope) { - _.each(this.wireTaps,function(tap) { - tap(data, envelope); - }); + publish: function(data, envelope) { + this.notifyTaps(data, envelope); - _.each(this.subscriptions[envelope.exchange], function(topic) { - _.each(topic, function(binding){ - if(postal.configuration.resolver.compare(binding.topic, envelope.topic)) { - if(_.all(binding.constraints, function(constraint) { return constraint(data); })) { - if(typeof binding.callback === 'function') { - binding.callback.apply(binding.context, [data, envelope]); - binding.onHandled(); - } - } - } - }); - }); - }, + _.each(this.subscriptions[envelope.exchange], function(topic) { + _.each(topic, function(binding){ + if(postal.configuration.resolver.compare(binding.topic, envelope.topic)) { + if(_.all(binding.constraints, function(constraint) { return constraint(data); })) { + if(typeof binding.callback === 'function') { + binding.callback.apply(binding.context, [data, envelope]); + binding.onHandled(); + } + } + } + }); + }); + }, - subscribe: function(subDef) { - var idx, found, fn; + subscribe: function(subDef) { + var idx, found, fn, exch, subs; - if(!this.subscriptions[subDef.exchange]) { - this.subscriptions[subDef.exchange] = {}; - } - if(!this.subscriptions[subDef.exchange][subDef.topic]) { - this.subscriptions[subDef.exchange][subDef.topic] = []; - } + exch = this.subscriptions[subDef.exchange] = this.subscriptions[subDef.exchange] || {}; + subs = this.subscriptions[subDef.exchange][subDef.topic] = this.subscriptions[subDef.exchange][subDef.topic] || []; - idx = this.subscriptions[subDef.exchange][subDef.topic].length - 1; - if(!_.any(this.subscriptions[subDef.exchange][subDef.topic], function(cfg) { return cfg === subDef; })) { - for(; idx >= 0; idx--) { - if(this.subscriptions[subDef.exchange][subDef.topic][idx].priority <= subDef.priority) { - this.subscriptions[subDef.exchange][subDef.topic].splice(idx + 1, 0, subDef); - found = true; - break; - } - } - if(!found) { - this.subscriptions[subDef.exchange][subDef.topic].unshift(subDef); - } - } + idx = subs.length - 1; + if(!_.any(subs, function(cfg) { return cfg === subDef; })) { + for(; idx >= 0; idx--) { + if(subs[idx].priority <= subDef.priority) { + subs.splice(idx + 1, 0, subDef); + found = true; + break; + } + } + if(!found) { + subs.unshift(subDef); + } + } + }, - return _.bind(function() { this.unsubscribe(subDef); }, this); - }, + notifyTaps: function(data, envelope) { + _.each(this.wireTaps,function(tap) { + tap(data, envelope); + }); + }, - unsubscribe: function(config) { - if(this.subscriptions[config.exchange][config.topic]) { - var len = this.subscriptions[config.exchange][config.topic].length, - idx = 0; - for ( ; idx < len; idx++ ) { - if (this.subscriptions[config.exchange][config.topic][idx] === config) { - this.subscriptions[config.exchange][config.topic].splice( idx, 1 ); - break; - } - } - } - }, + unsubscribe: function(config) { + if(this.subscriptions[config.exchange][config.topic]) { + var len = this.subscriptions[config.exchange][config.topic].length, + idx = 0; + for ( ; idx < len; idx++ ) { + if (this.subscriptions[config.exchange][config.topic][idx] === config) { + this.subscriptions[config.exchange][config.topic].splice( idx, 1 ); + break; + } + } + } + }, - addWireTap: function(callback) { - this.wireTaps.push(callback); - return function() { - var idx = this.wireTaps.indexOf(callback); - if(idx !== -1) { - this.wireTaps.splice(idx,1); - } - }; - } + addWireTap: function(callback) { + var self = this; + self.wireTaps.push(callback); + return function() { + var idx = self.wireTaps.indexOf(callback); + if(idx !== -1) { + self.wireTaps.splice(idx,1); + } + }; + } }; var postal = { - configuration: { - bus: localBus, - resolver: bindingsResolver - }, + configuration: { + bus: localBus, + resolver: bindingsResolver + }, - channel: function(exchange, topic) { - var exch = arguments.length === 2 ? exchange : DEFAULT_EXCHANGE, - tpc = arguments.length === 2 ? topic : exchange; - return new ChannelDefinition(exch, tpc); - }, + channel: function(exchange, topic) { + var exch = arguments.length === 2 ? exchange : DEFAULT_EXCHANGE, + tpc = arguments.length === 2 ? topic : exchange; + return new ChannelDefinition(exch, tpc); + }, - subscribe: function(exchange, topic, callback) { - var exch = arguments.length === 3 ? exchange : DEFAULT_EXCHANGE, - tpc = arguments.length === 3 ? topic : exchange, - callbk = arguments.length === 3 ? callback : topic; - var channel = this.channel(exch, tpc); - return channel.subscribe(callbk); - }, + subscribe: function(exchange, topic, callback) { + var exch = arguments.length === 3 ? exchange : DEFAULT_EXCHANGE, + tpc = arguments.length === 3 ? topic : exchange, + callbk = arguments.length === 3 ? callback : topic; + var channel = this.channel(exch, tpc); + return channel.subscribe(callbk); + }, - publish: function(exchange, topic, payload, envelopeOptions) { - var parsedArgs = parsePublishArgs([].slice.call(arguments,0)); - var channel = this.channel(parsedArgs.envelope.exchange, parsedArgs.envelope.topic); - channel.publish(parsedArgs.payload, parsedArgs.envelope); - }, + publish: function(exchange, topic, payload, envelopeOptions) { + var parsedArgs = parsePublishArgs([].slice.call(arguments,0)); + var channel = this.channel(parsedArgs.envelope.exchange, parsedArgs.envelope.topic); + channel.publish(parsedArgs.payload, parsedArgs.envelope); + }, - addWireTap: function(callback) { - this.configuration.bus.addWireTap(callback); - } + addWireTap: function(callback) { + return this.configuration.bus.addWireTap(callback); + }, + + bindExchanges: function(sources, destinations) { + var subscriptions = []; + if(!_.isArray(sources)) { + sources = [sources]; + } + if(!_.isArray(destinations)) { + destinations = [destinations]; + } + _.each(sources, function(source){ + var sourceTopic = source.topic || "*"; + _.each(destinations, function(destination) { + var destExchange = destination.exchange || DEFAULT_EXCHANGE; + subscriptions.push( + postal.subscribe(source.exchange || DEFAULT_EXCHANGE, source.topic || "*", function(msg, env) { + var destTopic = _.isFunction(destination.topic) ? destination.topic(env.topic) : destination.topic || env.topic; + postal.publish(destExchange, destTopic, msg); + }) + ); + }); + }); + return subscriptions; + } }; return postal; }); \ No newline at end of file diff --git a/example/standard/js/postal.js b/example/standard/js/postal.js index 9894230..2c04166 100644 --- a/example/standard/js/postal.js +++ b/example/standard/js/postal.js @@ -9,6 +9,7 @@ var DEFAULT_EXCHANGE = "/", DEFAULT_PRIORITY = 50, DEFAULT_DISPOSEAFTER = 0, + SYSTEM_EXCHANGE = "postal", NO_OP = function() { }, parsePublishArgs = function(args) { var parsed = { envelope: { } }, env; @@ -90,11 +91,24 @@ var SubscriptionDefinition = function(exchange, topic, callback) { this.maxCalls = DEFAULT_DISPOSEAFTER; this.onHandled = NO_OP; this.context = null; + + postal.publish(SYSTEM_EXCHANGE, "subscription.created", + { + event: "subscription.created", + exchange: exchange, + topic: topic + }); }; SubscriptionDefinition.prototype = { unsubscribe: function() { postal.configuration.bus.unsubscribe(this); + postal.publish(SYSTEM_EXCHANGE, "subscription.removed", + { + event: "subscription.removed", + exchange: this.exchange, + topic: this.topic + }); }, defer: function() { @@ -221,109 +235,131 @@ var bindingsResolver = { var localBus = { - subscriptions: {}, + subscriptions: {}, - wireTaps: [], + wireTaps: [], - publish: function(data, envelope) { - _.each(this.wireTaps,function(tap) { - tap(data, envelope); - }); + publish: function(data, envelope) { + this.notifyTaps(data, envelope); - _.each(this.subscriptions[envelope.exchange], function(topic) { - _.each(topic, function(binding){ - if(postal.configuration.resolver.compare(binding.topic, envelope.topic)) { - if(_.all(binding.constraints, function(constraint) { return constraint(data); })) { - if(typeof binding.callback === 'function') { - binding.callback.apply(binding.context, [data, envelope]); - binding.onHandled(); - } - } - } - }); - }); - }, + _.each(this.subscriptions[envelope.exchange], function(topic) { + _.each(topic, function(binding){ + if(postal.configuration.resolver.compare(binding.topic, envelope.topic)) { + if(_.all(binding.constraints, function(constraint) { return constraint(data); })) { + if(typeof binding.callback === 'function') { + binding.callback.apply(binding.context, [data, envelope]); + binding.onHandled(); + } + } + } + }); + }); + }, - subscribe: function(subDef) { - var idx, found, fn; + subscribe: function(subDef) { + var idx, found, fn, exch, subs; - if(!this.subscriptions[subDef.exchange]) { - this.subscriptions[subDef.exchange] = {}; - } - if(!this.subscriptions[subDef.exchange][subDef.topic]) { - this.subscriptions[subDef.exchange][subDef.topic] = []; - } + exch = this.subscriptions[subDef.exchange] = this.subscriptions[subDef.exchange] || {}; + subs = this.subscriptions[subDef.exchange][subDef.topic] = this.subscriptions[subDef.exchange][subDef.topic] || []; - idx = this.subscriptions[subDef.exchange][subDef.topic].length - 1; - if(!_.any(this.subscriptions[subDef.exchange][subDef.topic], function(cfg) { return cfg === subDef; })) { - for(; idx >= 0; idx--) { - if(this.subscriptions[subDef.exchange][subDef.topic][idx].priority <= subDef.priority) { - this.subscriptions[subDef.exchange][subDef.topic].splice(idx + 1, 0, subDef); - found = true; - break; - } - } - if(!found) { - this.subscriptions[subDef.exchange][subDef.topic].unshift(subDef); - } - } + idx = subs.length - 1; + if(!_.any(subs, function(cfg) { return cfg === subDef; })) { + for(; idx >= 0; idx--) { + if(subs[idx].priority <= subDef.priority) { + subs.splice(idx + 1, 0, subDef); + found = true; + break; + } + } + if(!found) { + subs.unshift(subDef); + } + } + }, - return _.bind(function() { this.unsubscribe(subDef); }, this); - }, + notifyTaps: function(data, envelope) { + _.each(this.wireTaps,function(tap) { + tap(data, envelope); + }); + }, - unsubscribe: function(config) { - if(this.subscriptions[config.exchange][config.topic]) { - var len = this.subscriptions[config.exchange][config.topic].length, - idx = 0; - for ( ; idx < len; idx++ ) { - if (this.subscriptions[config.exchange][config.topic][idx] === config) { - this.subscriptions[config.exchange][config.topic].splice( idx, 1 ); - break; - } - } - } - }, + unsubscribe: function(config) { + if(this.subscriptions[config.exchange][config.topic]) { + var len = this.subscriptions[config.exchange][config.topic].length, + idx = 0; + for ( ; idx < len; idx++ ) { + if (this.subscriptions[config.exchange][config.topic][idx] === config) { + this.subscriptions[config.exchange][config.topic].splice( idx, 1 ); + break; + } + } + } + }, - addWireTap: function(callback) { - this.wireTaps.push(callback); - return function() { - var idx = this.wireTaps.indexOf(callback); - if(idx !== -1) { - this.wireTaps.splice(idx,1); - } - }; - } + addWireTap: function(callback) { + var self = this; + self.wireTaps.push(callback); + return function() { + var idx = self.wireTaps.indexOf(callback); + if(idx !== -1) { + self.wireTaps.splice(idx,1); + } + }; + } }; var postal = { - configuration: { - bus: localBus, - resolver: bindingsResolver - }, + configuration: { + bus: localBus, + resolver: bindingsResolver + }, - channel: function(exchange, topic) { - var exch = arguments.length === 2 ? exchange : DEFAULT_EXCHANGE, - tpc = arguments.length === 2 ? topic : exchange; - return new ChannelDefinition(exch, tpc); - }, + channel: function(exchange, topic) { + var exch = arguments.length === 2 ? exchange : DEFAULT_EXCHANGE, + tpc = arguments.length === 2 ? topic : exchange; + return new ChannelDefinition(exch, tpc); + }, - subscribe: function(exchange, topic, callback) { - var exch = arguments.length === 3 ? exchange : DEFAULT_EXCHANGE, - tpc = arguments.length === 3 ? topic : exchange, - callbk = arguments.length === 3 ? callback : topic; - var channel = this.channel(exch, tpc); - return channel.subscribe(callbk); - }, + subscribe: function(exchange, topic, callback) { + var exch = arguments.length === 3 ? exchange : DEFAULT_EXCHANGE, + tpc = arguments.length === 3 ? topic : exchange, + callbk = arguments.length === 3 ? callback : topic; + var channel = this.channel(exch, tpc); + return channel.subscribe(callbk); + }, - publish: function(exchange, topic, payload, envelopeOptions) { - var parsedArgs = parsePublishArgs([].slice.call(arguments,0)); - var channel = this.channel(parsedArgs.envelope.exchange, parsedArgs.envelope.topic); - channel.publish(parsedArgs.payload, parsedArgs.envelope); - }, + publish: function(exchange, topic, payload, envelopeOptions) { + var parsedArgs = parsePublishArgs([].slice.call(arguments,0)); + var channel = this.channel(parsedArgs.envelope.exchange, parsedArgs.envelope.topic); + channel.publish(parsedArgs.payload, parsedArgs.envelope); + }, - addWireTap: function(callback) { - this.configuration.bus.addWireTap(callback); - } + addWireTap: function(callback) { + return this.configuration.bus.addWireTap(callback); + }, + + bindExchanges: function(sources, destinations) { + var subscriptions = []; + if(!_.isArray(sources)) { + sources = [sources]; + } + if(!_.isArray(destinations)) { + destinations = [destinations]; + } + _.each(sources, function(source){ + var sourceTopic = source.topic || "*"; + _.each(destinations, function(destination) { + var destExchange = destination.exchange || DEFAULT_EXCHANGE; + subscriptions.push( + postal.subscribe(source.exchange || DEFAULT_EXCHANGE, source.topic || "*", function(msg, env) { + var destTopic = _.isFunction(destination.topic) ? destination.topic(env.topic) : destination.topic || env.topic; + postal.publish(destExchange, destTopic, msg); + }) + ); + }); + }); + return subscriptions; + } }; global.postal = postal; })(window); \ No newline at end of file diff --git a/lib/browser/amd/postal.diagnostics.min.gz.js b/lib/browser/amd/postal.diagnostics.min.gz.js index 3a59cdd56302213c9147e97be5179dced6d3a17a..4da730ff8d4ce9ad8a98e7b5b966433b3a7b0dac 100644 GIT binary patch delta 15 Wcmey&_?eMizMF&L|1YnJ>~8=t6b5Mk delta 15 Wcmey&_?eMizMF$#<#DZv>~8=pkp;j2 diff --git a/lib/browser/amd/postal.js b/lib/browser/amd/postal.js index 62f4dad..25511c7 100644 --- a/lib/browser/amd/postal.js +++ b/lib/browser/amd/postal.js @@ -9,6 +9,7 @@ define(['underscore'], function(_) { var DEFAULT_EXCHANGE = "/", DEFAULT_PRIORITY = 50, DEFAULT_DISPOSEAFTER = 0, + SYSTEM_EXCHANGE = "postal", NO_OP = function() { }, parsePublishArgs = function(args) { var parsed = { envelope: { } }, env; @@ -90,11 +91,24 @@ var SubscriptionDefinition = function(exchange, topic, callback) { this.maxCalls = DEFAULT_DISPOSEAFTER; this.onHandled = NO_OP; this.context = null; + + postal.publish(SYSTEM_EXCHANGE, "subscription.created", + { + event: "subscription.created", + exchange: exchange, + topic: topic + }); }; SubscriptionDefinition.prototype = { unsubscribe: function() { postal.configuration.bus.unsubscribe(this); + postal.publish(SYSTEM_EXCHANGE, "subscription.removed", + { + event: "subscription.removed", + exchange: this.exchange, + topic: this.topic + }); }, defer: function() { @@ -221,109 +235,131 @@ var bindingsResolver = { var localBus = { - subscriptions: {}, + subscriptions: {}, - wireTaps: [], + wireTaps: [], - publish: function(data, envelope) { - _.each(this.wireTaps,function(tap) { - tap(data, envelope); - }); + publish: function(data, envelope) { + this.notifyTaps(data, envelope); - _.each(this.subscriptions[envelope.exchange], function(topic) { - _.each(topic, function(binding){ - if(postal.configuration.resolver.compare(binding.topic, envelope.topic)) { - if(_.all(binding.constraints, function(constraint) { return constraint(data); })) { - if(typeof binding.callback === 'function') { - binding.callback.apply(binding.context, [data, envelope]); - binding.onHandled(); - } - } - } - }); - }); - }, + _.each(this.subscriptions[envelope.exchange], function(topic) { + _.each(topic, function(binding){ + if(postal.configuration.resolver.compare(binding.topic, envelope.topic)) { + if(_.all(binding.constraints, function(constraint) { return constraint(data); })) { + if(typeof binding.callback === 'function') { + binding.callback.apply(binding.context, [data, envelope]); + binding.onHandled(); + } + } + } + }); + }); + }, - subscribe: function(subDef) { - var idx, found, fn; + subscribe: function(subDef) { + var idx, found, fn, exch, subs; - if(!this.subscriptions[subDef.exchange]) { - this.subscriptions[subDef.exchange] = {}; - } - if(!this.subscriptions[subDef.exchange][subDef.topic]) { - this.subscriptions[subDef.exchange][subDef.topic] = []; - } + exch = this.subscriptions[subDef.exchange] = this.subscriptions[subDef.exchange] || {}; + subs = this.subscriptions[subDef.exchange][subDef.topic] = this.subscriptions[subDef.exchange][subDef.topic] || []; - idx = this.subscriptions[subDef.exchange][subDef.topic].length - 1; - if(!_.any(this.subscriptions[subDef.exchange][subDef.topic], function(cfg) { return cfg === subDef; })) { - for(; idx >= 0; idx--) { - if(this.subscriptions[subDef.exchange][subDef.topic][idx].priority <= subDef.priority) { - this.subscriptions[subDef.exchange][subDef.topic].splice(idx + 1, 0, subDef); - found = true; - break; - } - } - if(!found) { - this.subscriptions[subDef.exchange][subDef.topic].unshift(subDef); - } - } + idx = subs.length - 1; + if(!_.any(subs, function(cfg) { return cfg === subDef; })) { + for(; idx >= 0; idx--) { + if(subs[idx].priority <= subDef.priority) { + subs.splice(idx + 1, 0, subDef); + found = true; + break; + } + } + if(!found) { + subs.unshift(subDef); + } + } + }, - return _.bind(function() { this.unsubscribe(subDef); }, this); - }, + notifyTaps: function(data, envelope) { + _.each(this.wireTaps,function(tap) { + tap(data, envelope); + }); + }, - unsubscribe: function(config) { - if(this.subscriptions[config.exchange][config.topic]) { - var len = this.subscriptions[config.exchange][config.topic].length, - idx = 0; - for ( ; idx < len; idx++ ) { - if (this.subscriptions[config.exchange][config.topic][idx] === config) { - this.subscriptions[config.exchange][config.topic].splice( idx, 1 ); - break; - } - } - } - }, + unsubscribe: function(config) { + if(this.subscriptions[config.exchange][config.topic]) { + var len = this.subscriptions[config.exchange][config.topic].length, + idx = 0; + for ( ; idx < len; idx++ ) { + if (this.subscriptions[config.exchange][config.topic][idx] === config) { + this.subscriptions[config.exchange][config.topic].splice( idx, 1 ); + break; + } + } + } + }, - addWireTap: function(callback) { - this.wireTaps.push(callback); - return function() { - var idx = this.wireTaps.indexOf(callback); - if(idx !== -1) { - this.wireTaps.splice(idx,1); - } - }; - } + addWireTap: function(callback) { + var self = this; + self.wireTaps.push(callback); + return function() { + var idx = self.wireTaps.indexOf(callback); + if(idx !== -1) { + self.wireTaps.splice(idx,1); + } + }; + } }; var postal = { - configuration: { - bus: localBus, - resolver: bindingsResolver - }, + configuration: { + bus: localBus, + resolver: bindingsResolver + }, - channel: function(exchange, topic) { - var exch = arguments.length === 2 ? exchange : DEFAULT_EXCHANGE, - tpc = arguments.length === 2 ? topic : exchange; - return new ChannelDefinition(exch, tpc); - }, + channel: function(exchange, topic) { + var exch = arguments.length === 2 ? exchange : DEFAULT_EXCHANGE, + tpc = arguments.length === 2 ? topic : exchange; + return new ChannelDefinition(exch, tpc); + }, - subscribe: function(exchange, topic, callback) { - var exch = arguments.length === 3 ? exchange : DEFAULT_EXCHANGE, - tpc = arguments.length === 3 ? topic : exchange, - callbk = arguments.length === 3 ? callback : topic; - var channel = this.channel(exch, tpc); - return channel.subscribe(callbk); - }, + subscribe: function(exchange, topic, callback) { + var exch = arguments.length === 3 ? exchange : DEFAULT_EXCHANGE, + tpc = arguments.length === 3 ? topic : exchange, + callbk = arguments.length === 3 ? callback : topic; + var channel = this.channel(exch, tpc); + return channel.subscribe(callbk); + }, - publish: function(exchange, topic, payload, envelopeOptions) { - var parsedArgs = parsePublishArgs([].slice.call(arguments,0)); - var channel = this.channel(parsedArgs.envelope.exchange, parsedArgs.envelope.topic); - channel.publish(parsedArgs.payload, parsedArgs.envelope); - }, + publish: function(exchange, topic, payload, envelopeOptions) { + var parsedArgs = parsePublishArgs([].slice.call(arguments,0)); + var channel = this.channel(parsedArgs.envelope.exchange, parsedArgs.envelope.topic); + channel.publish(parsedArgs.payload, parsedArgs.envelope); + }, - addWireTap: function(callback) { - this.configuration.bus.addWireTap(callback); - } + addWireTap: function(callback) { + return this.configuration.bus.addWireTap(callback); + }, + + bindExchanges: function(sources, destinations) { + var subscriptions = []; + if(!_.isArray(sources)) { + sources = [sources]; + } + if(!_.isArray(destinations)) { + destinations = [destinations]; + } + _.each(sources, function(source){ + var sourceTopic = source.topic || "*"; + _.each(destinations, function(destination) { + var destExchange = destination.exchange || DEFAULT_EXCHANGE; + subscriptions.push( + postal.subscribe(source.exchange || DEFAULT_EXCHANGE, source.topic || "*", function(msg, env) { + var destTopic = _.isFunction(destination.topic) ? destination.topic(env.topic) : destination.topic || env.topic; + postal.publish(destExchange, destTopic, msg); + }) + ); + }); + }); + return subscriptions; + } }; return postal; }); \ No newline at end of file diff --git a/lib/browser/amd/postal.min.gz.js b/lib/browser/amd/postal.min.gz.js index 3d4deb99247114f1cceb05b6f205c357f74e5f81..f69704d1e806941fe6aa6a653b320c32538b2ee4 100644 GIT binary patch literal 1695 zcmV;Q24MLgiwFSz`btj#1HD*VZ`(E${ws<$xMIVocC$T9DpwS3hP|vU)?fqXdH_XI zvJzR+B+7{^>%Z?%S4vjWU<3MOi=@u^_?^4B@WWVGYqN;C$a0os!rWlLh?xwN*rKT1 z)6DRQ`NG7E{J6xNEU_SFn&gs3CiY2x7L^qahDX-C%1J5Wy@--jIAv8~;pTUtWLt~b zk%$AiMJ1!TFfJW=NJZisY`xkLVt(*$1e4}s(J#N$mS0=k?!?;So^5Fy2;yOFRVHc3 z2wN{Vu$t0Clu%BTaDYD?)7~HyBuNo-OJJo9A!k-gEAm9qYODwZxLzjcty|yk2j_pu zdK&1w_E*Ok3LO{1i zm?D;_?W=zZ8d(f`2$reMq6B=AA%xF3xJo#vrEsK_+b|z)L2>=u;P)yww9_n+iEdLXWGj6PrFijMusJp<#gvv}i6 zT?@Ps`j(2f_w+qH9gp5CvP5#5C3oiaRv3F46~X{M_aPVDkcpuSGOW(v$k-LRG(2HY zBQACx>;<)zG5||sHq}mt64Apq!=aO;Wf8yxb+6K3eQfK% zSCMrGXHe+~`nsY!>NQA^GWwQgkgZD13{CO8CD4bmt!h#+OLi&E^xgqCz*=c=Z0&8J zHPs*2bb}hDXUi6m${D|l;OaiL%)ia^`gkS+aUc2zu)w+by$Pv_FdNd4gxhwY`C>6v zbv%xrNm(I0)lSZqAg#ikhPjBKpg)Z$xZ#V>_KN_UpFi6s(iWeqMf7dGXT*wxK+l&h56Q~Mja;-0IGxaB5tF;-W$nWv%a2c zQwc|9`vxB^PV0Rp@+8`e%x(<|?R?YYvF5kVH{ctvu4OYk#~WCuLj5qp2bUsdpB}+# z!$w<>cwddyaMKMKXh_-?0-35Sm}y?RREaqj*vEnElNolrft{~xACL8P_V^+AU-Png z>bc_)?952ej&c_(w<$6-K3Kslk7@*{5Gws7vt0HwS-R}v0>N9snr-?l@rro;e^dr` zu8K9p?D?v0cOYgU#_B<*;>Tm4I)`oOs}KUe9Gq+7db*c&jyeKK>vPH?vkfI3a=@4x zs!>B*YPxCTiN{+8fy|}baP!J@+4(tox<()n*rjcVJwav1DqgiyV+HI{&i`z7f*xWiz~Zc=)4F_=dDz9MY3!81TJW2YMUG-QFb2Ky>b>x5+WI`I;wYk#8X^cw*d zlP?6w^@lO3`%a*pLJxY*q!*ivW5Y|Tsl#e6xN0$I;j7(jy*X_h8H_X*BWsmkhgGgt zIa%{fUtk!Xez5RKTMLdy^SSBHmX+ol@5zDr$rX*$?=-tG{Q%a*;?u7Kf{a@6wlJaB p?H{YFP!8|pv@7l~uKG|KR9UL42o})DbRRA%^e>epO+DBX003`aO7s8# literal 1535 zcmVcDsF;6s{=R4EwUSSc46i>j4x= zNlau(lc*%FqyN66UMWXuj14IK!4`SC=i%M)Ud%-(Q{k-bD&?XmSyl*pgTpFiN@l4; z(f)=ORzU0*HfH3*WSk zbGl11%86DEoJTR^4MIVa5-E2C)@TTMvnZX)2SBSS5Ge42LeOi!Io}W7|I&3F=~n|L z7a^?@<^6Xv)rC-1ky^aQk?G_n2>fpIp|?*~{T_8?`AHQrjbIlXMi?Q09T27sOZ4`| zKNU?Jh64o4)MZHq0mu--Cmcd09$_hn>{Tqw@e~v{&n^F;_G33MGL`9YA^WllN><1~ zcn{+@6}OgjCdv#|n4OtC-%bO*DcmQFq$L*W!EHZpYuXy zg;YDjy8SFIRY7H{O0wRxYg>Bv7G5g}Z=bXDSDNxfa3Y466dawTRg%=cG#yi=Gp<4V zxf2?qjki#ZA*w~;9RwpKlaut`J2>9pAG9xpx&+H-l>$30A+qX*HmH|no|WQFs7w@i zLxzqH*Z1^2Jl)?1=VXagTx7TQWh|^4npDDqL*7U(xTP}7RAf25y^yu7N@WGYqE=dM z1K5k;vT7Lx94HT13@Wfa4M7&R`=MrBE2&Re2&AP%lkym^hH+|9xH{)R%$;cwW3Cc!o(E8Y=(I=Vp zf-|g4218ml1N9O#D3yFmH>eKMa6?;rt_ZYoEY>|9X4y8Ug;{!WORUodV(VZ7ot^o( zrW@3Po-8{?I%oVYqKmuSvH!Nu8u3Cz;!cJ;@W7ei&NE zO!hUxhv?*F3EFDhBh1|h3ix?KAq-!9c3(u;{`}dsk+Jw(FS^goweR%O`px1mOc!79 za`Dp!wxPSZ9=eoVqmMVEEnjCr2Ep z)LjK6m$OyVm%-(RWY7#WHNU?hO({@=0_`aD zqsEcqog=~XOTRV#dEm3NGju#6*dE+RXH7i|*_#@#x{` z@Zo4krea`sarXg=62P1gvRHL_e-P-11VBVnNT86I3CG*REZ|+^KJR!}P+;INsYuKM zGY(yS*V-8stn%_T^#T~6XSbL~`?{g)jZS}JK79ZP%vuf1tgcrLOgO&Kn>KmV88Gn@2J7em=;7Z3SRDL0fc$8f lHbwszfgyz+jhnuKJQ(aoY2As|!?<0ee*qsBn(TuT007Jq;phMW diff --git a/lib/browser/amd/postal.min.js b/lib/browser/amd/postal.min.js index 3419f72..3795591 100644 --- a/lib/browser/amd/postal.min.js +++ b/lib/browser/amd/postal.min.js @@ -1 +1 @@ -define(["underscore"],function(a){var b="/",c=50,d=0,e=function(){},f=function(c){var d={envelope:{}},e;switch(c.length){case 3:typeof c[1]=="Object"&&typeof c[2]=="Object"?(d.envelope.exchange=b,d.envelope.topic=c[0],d.payload=c[1],e=d.envelope,d.envelope=a.extend(e,c[2])):(d.envelope.exchange=c[0],d.envelope.topic=c[1],d.payload=c[2]);break;case 4:d.envelope.exchange=c[0],d.envelope.topic=c[1],d.payload=c[2],e=d.envelope,d.envelope=a.extend(e,c[3]);break;default:d.envelope.exchange=b,d.envelope.topic=c[0],d.payload=c[1]}return d},g=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}},h=function(a,b){this.exchange=a,this.topic=b};h.prototype={subscribe:function(a){var b=new i(this.exchange,this.topic,a);return l.configuration.bus.subscribe(b),b},publish:function(b,c){var d=a.extend({exchange:this.exchange,timeStamp:new Date,topic:this.topic},c);l.configuration.bus.publish(b,d)}};var i=function(a,b,f){this.exchange=a,this.topic=b,this.callback=f,this.priority=c,this.constraints=[],this.maxCalls=d,this.onHandled=e,this.context=null};i.prototype={unsubscribe:function(){l.configuration.bus.unsubscribe(this)},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 g),this},whenHandledThenExecute:function(b){if(!a.isFunction(b))throw"Value provided to 'whenHandledThenExecute' must be a function";return this.onHandled=b,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(c,b,a)},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}};var j={cache:{},compare:function(a,b){if(this.cache[b]&&this.cache[b][a])return!0;var c=new RegExp("^"+this.regexify(a)+"$"),d=c.test(b);return d&&(this.cache[b]||(this.cache[b]={}),this.cache[b][a]=!0),d},regexify:function(a){return a.replace(/\./g,"\\.").replace(/\*/g,".*").replace(/#/g,"[A-Z,a-z,0-9]*")}},k={subscriptions:{},wireTaps:[],publish:function(b,c){a.each(this.wireTaps,function(a){a(b,c)}),a.each(this.subscriptions[c.exchange],function(d){a.each(d,function(d){l.configuration.resolver.compare(d.topic,c.topic)&&a.all(d.constraints,function(a){return a(b)})&&typeof d.callback=="function"&&(d.callback.apply(d.context,[b,c]),d.onHandled())})})},subscribe:function(b){var c,d,e;this.subscriptions[b.exchange]||(this.subscriptions[b.exchange]={}),this.subscriptions[b.exchange][b.topic]||(this.subscriptions[b.exchange][b.topic]=[]),c=this.subscriptions[b.exchange][b.topic].length-1;if(!a.any(this.subscriptions[b.exchange][b.topic],function(a){return a===b})){for(;c>=0;c--)if(this.subscriptions[b.exchange][b.topic][c].priority<=b.priority){this.subscriptions[b.exchange][b.topic].splice(c+1,0,b),d=!0;break}d||this.subscriptions[b.exchange][b.topic].unshift(b)}return a.bind(function(){this.unsubscribe(b)},this)},unsubscribe:function(a){if(this.subscriptions[a.exchange][a.topic]){var b=this.subscriptions[a.exchange][a.topic].length,c=0;for(;c=0;c--)if(g[c].priority<=b.priority){g.splice(c+1,0,b),d=!0;break}d||g.unshift(b)}},notifyTaps:function(b,c){a.each(this.wireTaps,function(a){a(b,c)})},unsubscribe:function(a){if(this.subscriptions[a.exchange][a.topic]){var b=this.subscriptions[a.exchange][a.topic].length,c=0;for(;c3>{kITZ3ZF$ delta 15 Wcmcb^c!!Z)zMF$##c{2P>{kIP@CAAR diff --git a/lib/browser/standard/postal.js b/lib/browser/standard/postal.js index 9894230..2c04166 100644 --- a/lib/browser/standard/postal.js +++ b/lib/browser/standard/postal.js @@ -9,6 +9,7 @@ var DEFAULT_EXCHANGE = "/", DEFAULT_PRIORITY = 50, DEFAULT_DISPOSEAFTER = 0, + SYSTEM_EXCHANGE = "postal", NO_OP = function() { }, parsePublishArgs = function(args) { var parsed = { envelope: { } }, env; @@ -90,11 +91,24 @@ var SubscriptionDefinition = function(exchange, topic, callback) { this.maxCalls = DEFAULT_DISPOSEAFTER; this.onHandled = NO_OP; this.context = null; + + postal.publish(SYSTEM_EXCHANGE, "subscription.created", + { + event: "subscription.created", + exchange: exchange, + topic: topic + }); }; SubscriptionDefinition.prototype = { unsubscribe: function() { postal.configuration.bus.unsubscribe(this); + postal.publish(SYSTEM_EXCHANGE, "subscription.removed", + { + event: "subscription.removed", + exchange: this.exchange, + topic: this.topic + }); }, defer: function() { @@ -221,109 +235,131 @@ var bindingsResolver = { var localBus = { - subscriptions: {}, + subscriptions: {}, - wireTaps: [], + wireTaps: [], - publish: function(data, envelope) { - _.each(this.wireTaps,function(tap) { - tap(data, envelope); - }); + publish: function(data, envelope) { + this.notifyTaps(data, envelope); - _.each(this.subscriptions[envelope.exchange], function(topic) { - _.each(topic, function(binding){ - if(postal.configuration.resolver.compare(binding.topic, envelope.topic)) { - if(_.all(binding.constraints, function(constraint) { return constraint(data); })) { - if(typeof binding.callback === 'function') { - binding.callback.apply(binding.context, [data, envelope]); - binding.onHandled(); - } - } - } - }); - }); - }, + _.each(this.subscriptions[envelope.exchange], function(topic) { + _.each(topic, function(binding){ + if(postal.configuration.resolver.compare(binding.topic, envelope.topic)) { + if(_.all(binding.constraints, function(constraint) { return constraint(data); })) { + if(typeof binding.callback === 'function') { + binding.callback.apply(binding.context, [data, envelope]); + binding.onHandled(); + } + } + } + }); + }); + }, - subscribe: function(subDef) { - var idx, found, fn; + subscribe: function(subDef) { + var idx, found, fn, exch, subs; - if(!this.subscriptions[subDef.exchange]) { - this.subscriptions[subDef.exchange] = {}; - } - if(!this.subscriptions[subDef.exchange][subDef.topic]) { - this.subscriptions[subDef.exchange][subDef.topic] = []; - } + exch = this.subscriptions[subDef.exchange] = this.subscriptions[subDef.exchange] || {}; + subs = this.subscriptions[subDef.exchange][subDef.topic] = this.subscriptions[subDef.exchange][subDef.topic] || []; - idx = this.subscriptions[subDef.exchange][subDef.topic].length - 1; - if(!_.any(this.subscriptions[subDef.exchange][subDef.topic], function(cfg) { return cfg === subDef; })) { - for(; idx >= 0; idx--) { - if(this.subscriptions[subDef.exchange][subDef.topic][idx].priority <= subDef.priority) { - this.subscriptions[subDef.exchange][subDef.topic].splice(idx + 1, 0, subDef); - found = true; - break; - } - } - if(!found) { - this.subscriptions[subDef.exchange][subDef.topic].unshift(subDef); - } - } + idx = subs.length - 1; + if(!_.any(subs, function(cfg) { return cfg === subDef; })) { + for(; idx >= 0; idx--) { + if(subs[idx].priority <= subDef.priority) { + subs.splice(idx + 1, 0, subDef); + found = true; + break; + } + } + if(!found) { + subs.unshift(subDef); + } + } + }, - return _.bind(function() { this.unsubscribe(subDef); }, this); - }, + notifyTaps: function(data, envelope) { + _.each(this.wireTaps,function(tap) { + tap(data, envelope); + }); + }, - unsubscribe: function(config) { - if(this.subscriptions[config.exchange][config.topic]) { - var len = this.subscriptions[config.exchange][config.topic].length, - idx = 0; - for ( ; idx < len; idx++ ) { - if (this.subscriptions[config.exchange][config.topic][idx] === config) { - this.subscriptions[config.exchange][config.topic].splice( idx, 1 ); - break; - } - } - } - }, + unsubscribe: function(config) { + if(this.subscriptions[config.exchange][config.topic]) { + var len = this.subscriptions[config.exchange][config.topic].length, + idx = 0; + for ( ; idx < len; idx++ ) { + if (this.subscriptions[config.exchange][config.topic][idx] === config) { + this.subscriptions[config.exchange][config.topic].splice( idx, 1 ); + break; + } + } + } + }, - addWireTap: function(callback) { - this.wireTaps.push(callback); - return function() { - var idx = this.wireTaps.indexOf(callback); - if(idx !== -1) { - this.wireTaps.splice(idx,1); - } - }; - } + addWireTap: function(callback) { + var self = this; + self.wireTaps.push(callback); + return function() { + var idx = self.wireTaps.indexOf(callback); + if(idx !== -1) { + self.wireTaps.splice(idx,1); + } + }; + } }; var postal = { - configuration: { - bus: localBus, - resolver: bindingsResolver - }, + configuration: { + bus: localBus, + resolver: bindingsResolver + }, - channel: function(exchange, topic) { - var exch = arguments.length === 2 ? exchange : DEFAULT_EXCHANGE, - tpc = arguments.length === 2 ? topic : exchange; - return new ChannelDefinition(exch, tpc); - }, + channel: function(exchange, topic) { + var exch = arguments.length === 2 ? exchange : DEFAULT_EXCHANGE, + tpc = arguments.length === 2 ? topic : exchange; + return new ChannelDefinition(exch, tpc); + }, - subscribe: function(exchange, topic, callback) { - var exch = arguments.length === 3 ? exchange : DEFAULT_EXCHANGE, - tpc = arguments.length === 3 ? topic : exchange, - callbk = arguments.length === 3 ? callback : topic; - var channel = this.channel(exch, tpc); - return channel.subscribe(callbk); - }, + subscribe: function(exchange, topic, callback) { + var exch = arguments.length === 3 ? exchange : DEFAULT_EXCHANGE, + tpc = arguments.length === 3 ? topic : exchange, + callbk = arguments.length === 3 ? callback : topic; + var channel = this.channel(exch, tpc); + return channel.subscribe(callbk); + }, - publish: function(exchange, topic, payload, envelopeOptions) { - var parsedArgs = parsePublishArgs([].slice.call(arguments,0)); - var channel = this.channel(parsedArgs.envelope.exchange, parsedArgs.envelope.topic); - channel.publish(parsedArgs.payload, parsedArgs.envelope); - }, + publish: function(exchange, topic, payload, envelopeOptions) { + var parsedArgs = parsePublishArgs([].slice.call(arguments,0)); + var channel = this.channel(parsedArgs.envelope.exchange, parsedArgs.envelope.topic); + channel.publish(parsedArgs.payload, parsedArgs.envelope); + }, - addWireTap: function(callback) { - this.configuration.bus.addWireTap(callback); - } + addWireTap: function(callback) { + return this.configuration.bus.addWireTap(callback); + }, + + bindExchanges: function(sources, destinations) { + var subscriptions = []; + if(!_.isArray(sources)) { + sources = [sources]; + } + if(!_.isArray(destinations)) { + destinations = [destinations]; + } + _.each(sources, function(source){ + var sourceTopic = source.topic || "*"; + _.each(destinations, function(destination) { + var destExchange = destination.exchange || DEFAULT_EXCHANGE; + subscriptions.push( + postal.subscribe(source.exchange || DEFAULT_EXCHANGE, source.topic || "*", function(msg, env) { + var destTopic = _.isFunction(destination.topic) ? destination.topic(env.topic) : destination.topic || env.topic; + postal.publish(destExchange, destTopic, msg); + }) + ); + }); + }); + return subscriptions; + } }; global.postal = postal; })(window); \ No newline at end of file diff --git a/lib/browser/standard/postal.min.gz.js b/lib/browser/standard/postal.min.gz.js index 799945fe4b8e83def7201558f01e3f73ee646dba..0983cb90ad93d45833341466385451f72ee16f2b 100644 GIT binary patch literal 1675 zcmV;626Xu!iwFSx`btj#1HD*nbDTC1{wtVvE-04CIc`4`qIxokJN?om(|FpMUalTV zhy$Ag3c@eBuNZVH#*@^U8Bv~%JU0vhAFK=SWBZs<)NH;PkLFlt3-PL z9j3YvvMN%G)i^ettei@Hec03cKsh+>&Mw@z{49$&-N5Oo!wDmVP)rE}U^!98Xa7_* zaTulu$QLe8vQz*w!Ur5e<&umeQATlTK!=;>)_zv|mu_BUGE?C~c4fs%Uc^jz_v0}Y zH`bLi5@v`3Te=IRF3-|1-c$uu5?of5ZZ86`v*D z=AN?YJ(WOGHh6B#%M@feox_o}tx9PzVNolswhYcTjh6~AmZsKM zQDm;|w`n#G4Xo0EDsf=)h09_{3j>CR`JQXqYauj3WQaE7edf|UPwpHu{4gyx)fW5) zKITr3QM^gBLcFi?B<5gxX?nxd16?Y5*GIpjGBie7#!VzTD*(Ur>{jqfiYej;3i4kD znnwJOduYFym-oVeyAy3cfCcR=8(IBKi#`=1XuzQHk30ZSn-){ z;%!mTJ2+k}pk`7v9ANV$HgyI?byIycS$TV;WnyPjj7)^y3zh-9csNHiGQY(MR0aVu zg7RMQk0Sl??7eUUt+MTQrYQ-%`(}3Zdibb{fK9567-oIaec(yUI>s5RObhzHV!GiR zBuJTjOE*ZZ(r`oDJQD(QD38>Tig~upX(1*}9SqabfNjOrFq)c=E4oIl(u1Yn4gjiV z{4O?Ux4C2gZ67x5h1iJOI8@PoXn$`b80@$UWeA+m*STP^7^~Xv$IoO}BRthk4wfLT z#+`<_jG&-DPbh@pt1s@W4Yt30acyJ}Un-*e(xiQ-NUOI;e_?v`6)%r|TEj7nXWM?v zYWiWRkh_TsaZdBngIQsIG-|9)GYJMN#)gP>);DJ(nJd=!(=|4OSHHnW#A&}TM42Vm zqHwiC9j<3Q*8Vp224Vx~Mm57`tL=v1rsVX?2p>X<*nN2fuMG#fA@RN&t>C6>=tM)& zb`Z!^Q^6zCD&{!A0*AgJGw9F(ohOd>d+<*91QYyka9KZ>Z@&jWGZN}m?&#QWn+#3w zV3?Z2QLO+qLc1_49H0G6mOeW=Lhx1yLEKk~H-z^8f!8fnvxb~KJce-x@)p*NWxMFq ze7_IX={gniSSLqQ{9#=c&>B=*YPtw?{@RDC*?gBH VX^os4z%si*{{j$Dv@FjP006<76}A8X literal 1518 zcmVjfl5 zy(F@vNmLxy(SP4jFEr)Ijk^JbKiE2+?vBqLpF7$K>x|1J&m4*w+TPOA;>3Ptxw%b(<~B%V?!$QBH@HCW=oJ3bd%;ZAj&udzf&{b zAXi{XiY#yfth^!QO?v4~K5#T2I|2hfD+Rsr+x`9E{V!X`1^q(%3`9ulRC@m%rlu6K zE;EZYI5v~4l1lx4QOk98oXm%{D>tb=$}-6!SbgPi!U!Q0Q^EjPPSoj7> zNhT|@Saz}%y?X<%Riwu)&wiy@kcxnW`XvclCt01Qjel(>rp_i(gSJyUG*sJcAs`PC ziqhLJMl#yTkiGHt%tEb%yaeR)S^`cp0Jv$x2J=Z(P;ahb2}%UD>qG_8dNo4ic|5m+*}OhcA4;DxMJT}g`xi&|N|Vz3s$VO2U3GGu)g zW$xO3SEXZQv8pDj%t6RkE=!=Q3>aGF3B1}bG(yBk*6w}g(xON=j+s47%cx!nNIb&a z(HJFBmY3pfU8D(z&?_?=rXL{r_>C?eM-_OCdK>Fl3{e1n*~OjUwG{h^pD4(G*~xmu z|9F7*lWBWT47dl=_5m#D5ZNf|BP04yil7C<+MSk1eH#Z0&ayhlXflRsg29xY$+EA@ zl5Sx6^b{zEs@{stm)L$XC~8{r>cuMCBQJY#wrANy=&fKmsEfmAq(|nrBn6TZU?Zp= z6#uBwzkGVH+@N>aH48J8ly1IR9NG^bu?WPZSl9^bLre?NXE+Xmr%@8o0#)*3u` zm^u*@{1+*OGJN*QeHLN+(!*rACDWyJ(gQx<)furhXF@7>3w@X3xDfjXc2U2me<=2%CQ z`B39|gU~k2OUGwFlbO%X&(UyhA2$l;NE6jdLiO){J~?7Tm6|GmT+Ze&mjS`Rbz;_C zXc~Thf2dC&V=VaPcI zqC!|fBQXib+rnMIOYy)v-VHPu*i0tUiAxtua>LZxg9@lTe?>ix#q<*M^kr7{n*{FB z;sAZXohs~#{SwMCb zrY&ze+9#gD#X8(`^ziQiEcX5!Kz^uin_~Ejz|cYm>t+}r_bzrjZFTAzADAMqBu&Yx ULCzWqCSRj}0ZnPG$a)e00AM8C;Q#;t diff --git a/lib/browser/standard/postal.min.js b/lib/browser/standard/postal.min.js index 9a736d7..8100fd0 100644 --- a/lib/browser/standard/postal.min.js +++ b/lib/browser/standard/postal.min.js @@ -1 +1 @@ -(function(a,b){var c="/",d=50,e=0,f=function(){},g=function(a){var b={envelope:{}},d;switch(a.length){case 3:typeof a[1]=="Object"&&typeof a[2]=="Object"?(b.envelope.exchange=c,b.envelope.topic=a[0],b.payload=a[1],d=b.envelope,b.envelope=_.extend(d,a[2])):(b.envelope.exchange=a[0],b.envelope.topic=a[1],b.payload=a[2]);break;case 4:b.envelope.exchange=a[0],b.envelope.topic=a[1],b.payload=a[2],d=b.envelope,b.envelope=_.extend(d,a[3]);break;default:b.envelope.exchange=c,b.envelope.topic=a[0],b.payload=a[1]}return b},h=function(){var a;return function(b){var c=!1;return _.isString(b)?(c=b===a,a=b):(c=_.isEqual(b,a),a=_.clone(b)),!c}},i=function(a,b){this.exchange=a,this.topic=b};i.prototype={subscribe:function(a){var b=new j(this.exchange,this.topic,a);return m.configuration.bus.subscribe(b),b},publish:function(a,b){var c=_.extend({exchange:this.exchange,timeStamp:new Date,topic:this.topic},b);m.configuration.bus.publish(a,c)}};var j=function(a,b,c){this.exchange=a,this.topic=b,this.callback=c,this.priority=d,this.constraints=[],this.maxCalls=e,this.onHandled=f,this.context=null};j.prototype={unsubscribe:function(){m.configuration.bus.unsubscribe(this)},defer:function(){var a=this.callback;return this.callback=function(b){setTimeout(a,0,b)},this},disposeAfter:function(a){if(_.isNaN(a)||a<=0)throw"The value provided to disposeAfter (maxCalls) must be a number greater than zero.";var b=this.onHandled,c=_.after(a,_.bind(function(){this.unsubscribe(this)},this));return this.onHandled=function(){b.apply(this.context,arguments),c()},this},ignoreDuplicates:function(){return this.withConstraint(new h),this},whenHandledThenExecute:function(a){if(!_.isFunction(a))throw"Value provided to 'whenHandledThenExecute' must be a function";return this.onHandled=a,this},withConstraint:function(a){if(!_.isFunction(a))throw"Predicate constraint must be a function";return this.constraints.push(a),this},withConstraints:function(a){var b=this;return _.isArray(a)&&_.each(a,function(a){b.withConstraint(a)}),b},withContext:function(a){return this.context=a,this},withDebounce:function(a){if(_.isNaN(a))throw"Milliseconds must be a number";var b=this.callback;return this.callback=_.debounce(b,a),this},withDelay:function(a){if(_.isNaN(a))throw"Milliseconds must be a number";var b=this.callback;return this.callback=function(c){setTimeout(b,a,c)},this},withPriority:function(a){if(_.isNaN(a))throw"Priority must be a number";return this.priority=a,this},withThrottle:function(a){if(_.isNaN(a))throw"Milliseconds must be a number";var b=this.callback;return this.callback=_.throttle(b,a),this}};var k={cache:{},compare:function(a,b){if(this.cache[b]&&this.cache[b][a])return!0;var c=new RegExp("^"+this.regexify(a)+"$"),d=c.test(b);return d&&(this.cache[b]||(this.cache[b]={}),this.cache[b][a]=!0),d},regexify:function(a){return a.replace(/\./g,"\\.").replace(/\*/g,".*").replace(/#/g,"[A-Z,a-z,0-9]*")}},l={subscriptions:{},wireTaps:[],publish:function(a,b){_.each(this.wireTaps,function(c){c(a,b)}),_.each(this.subscriptions[b.exchange],function(c){_.each(c,function(c){m.configuration.resolver.compare(c.topic,b.topic)&&_.all(c.constraints,function(b){return b(a)})&&typeof c.callback=="function"&&(c.callback.apply(c.context,[a,b]),c.onHandled())})})},subscribe:function(a){var b,c,d;this.subscriptions[a.exchange]||(this.subscriptions[a.exchange]={}),this.subscriptions[a.exchange][a.topic]||(this.subscriptions[a.exchange][a.topic]=[]),b=this.subscriptions[a.exchange][a.topic].length-1;if(!_.any(this.subscriptions[a.exchange][a.topic],function(b){return b===a})){for(;b>=0;b--)if(this.subscriptions[a.exchange][a.topic][b].priority<=a.priority){this.subscriptions[a.exchange][a.topic].splice(b+1,0,a),c=!0;break}c||this.subscriptions[a.exchange][a.topic].unshift(a)}return _.bind(function(){this.unsubscribe(a)},this)},unsubscribe:function(a){if(this.subscriptions[a.exchange][a.topic]){var b=this.subscriptions[a.exchange][a.topic].length,c=0;for(;c=0;b--)if(f[b].priority<=a.priority){f.splice(b+1,0,a),c=!0;break}c||f.unshift(a)}},notifyTaps:function(a,b){_.each(this.wireTaps,function(c){c(a,b)})},unsubscribe:function(a){if(this.subscriptions[a.exchange][a.topic]){var b=this.subscriptions[a.exchange][a.topic].length,c=0;for(;c= 0; idx--) { - if(this.subscriptions[subDef.exchange][subDef.topic][idx].priority <= subDef.priority) { - this.subscriptions[subDef.exchange][subDef.topic].splice(idx + 1, 0, subDef); - found = true; - break; - } - } - if(!found) { - this.subscriptions[subDef.exchange][subDef.topic].unshift(subDef); - } - } + idx = subs.length - 1; + if(!_.any(subs, function(cfg) { return cfg === subDef; })) { + for(; idx >= 0; idx--) { + if(subs[idx].priority <= subDef.priority) { + subs.splice(idx + 1, 0, subDef); + found = true; + break; + } + } + if(!found) { + subs.unshift(subDef); + } + } + }, - return _.bind(function() { this.unsubscribe(subDef); }, this); - }, + notifyTaps: function(data, envelope) { + _.each(this.wireTaps,function(tap) { + tap(data, envelope); + }); + }, - unsubscribe: function(config) { - if(this.subscriptions[config.exchange][config.topic]) { - var len = this.subscriptions[config.exchange][config.topic].length, - idx = 0; - for ( ; idx < len; idx++ ) { - if (this.subscriptions[config.exchange][config.topic][idx] === config) { - this.subscriptions[config.exchange][config.topic].splice( idx, 1 ); - break; - } - } - } - }, + unsubscribe: function(config) { + if(this.subscriptions[config.exchange][config.topic]) { + var len = this.subscriptions[config.exchange][config.topic].length, + idx = 0; + for ( ; idx < len; idx++ ) { + if (this.subscriptions[config.exchange][config.topic][idx] === config) { + this.subscriptions[config.exchange][config.topic].splice( idx, 1 ); + break; + } + } + } + }, - addWireTap: function(callback) { - this.wireTaps.push(callback); - return function() { - var idx = this.wireTaps.indexOf(callback); - if(idx !== -1) { - this.wireTaps.splice(idx,1); - } - }; - } + addWireTap: function(callback) { + var self = this; + self.wireTaps.push(callback); + return function() { + var idx = self.wireTaps.indexOf(callback); + if(idx !== -1) { + self.wireTaps.splice(idx,1); + } + }; + } }; var postal = { - configuration: { - bus: localBus, - resolver: bindingsResolver - }, + configuration: { + bus: localBus, + resolver: bindingsResolver + }, - channel: function(exchange, topic) { - var exch = arguments.length === 2 ? exchange : DEFAULT_EXCHANGE, - tpc = arguments.length === 2 ? topic : exchange; - return new ChannelDefinition(exch, tpc); - }, + channel: function(exchange, topic) { + var exch = arguments.length === 2 ? exchange : DEFAULT_EXCHANGE, + tpc = arguments.length === 2 ? topic : exchange; + return new ChannelDefinition(exch, tpc); + }, - subscribe: function(exchange, topic, callback) { - var exch = arguments.length === 3 ? exchange : DEFAULT_EXCHANGE, - tpc = arguments.length === 3 ? topic : exchange, - callbk = arguments.length === 3 ? callback : topic; - var channel = this.channel(exch, tpc); - return channel.subscribe(callbk); - }, + subscribe: function(exchange, topic, callback) { + var exch = arguments.length === 3 ? exchange : DEFAULT_EXCHANGE, + tpc = arguments.length === 3 ? topic : exchange, + callbk = arguments.length === 3 ? callback : topic; + var channel = this.channel(exch, tpc); + return channel.subscribe(callbk); + }, - publish: function(exchange, topic, payload, envelopeOptions) { - var parsedArgs = parsePublishArgs([].slice.call(arguments,0)); - var channel = this.channel(parsedArgs.envelope.exchange, parsedArgs.envelope.topic); - channel.publish(parsedArgs.payload, parsedArgs.envelope); - }, + publish: function(exchange, topic, payload, envelopeOptions) { + var parsedArgs = parsePublishArgs([].slice.call(arguments,0)); + var channel = this.channel(parsedArgs.envelope.exchange, parsedArgs.envelope.topic); + channel.publish(parsedArgs.payload, parsedArgs.envelope); + }, - addWireTap: function(callback) { - this.configuration.bus.addWireTap(callback); - } + addWireTap: function(callback) { + return this.configuration.bus.addWireTap(callback); + }, + + bindExchanges: function(sources, destinations) { + var subscriptions = []; + if(!_.isArray(sources)) { + sources = [sources]; + } + if(!_.isArray(destinations)) { + destinations = [destinations]; + } + _.each(sources, function(source){ + var sourceTopic = source.topic || "*"; + _.each(destinations, function(destination) { + var destExchange = destination.exchange || DEFAULT_EXCHANGE; + subscriptions.push( + postal.subscribe(source.exchange || DEFAULT_EXCHANGE, source.topic || "*", function(msg, env) { + var destTopic = _.isFunction(destination.topic) ? destination.topic(env.topic) : destination.topic || env.topic; + postal.publish(destExchange, destTopic, msg); + }) + ); + }); + }); + return subscriptions; + } }; module.exports = postal; \ No newline at end of file