diff --git a/lib/browser/postal.diagnostics.js b/lib/browser/postal.diagnostics.js index 7d39549..41249f1 100644 --- a/lib/browser/postal.diagnostics.js +++ b/lib/browser/postal.diagnostics.js @@ -1,11 +1,18 @@ -postal.addWireTap(function(data) { +postal.addWireTap(function(data, envelope) { + var all = _.extend(envelope, { data: data }); if(!JSON) { throw "This browser or environment does provide JSON support"; } try { - console.log(JSON.stringify(data)); + console.log(JSON.stringify(all)); } catch(exception) { - console.log("Unable to parse data to JSON: " + exception); + try { + all.data = exception; + console.log(JSON.stringify(all)); + } + catch(ex) { + console.log("Unable to parse data to JSON: " + exception); + } } }); \ No newline at end of file diff --git a/lib/browser/postal.diagnostics.min.gz.js b/lib/browser/postal.diagnostics.min.gz.js index 14a3703..c2b38c4 100644 Binary files a/lib/browser/postal.diagnostics.min.gz.js and b/lib/browser/postal.diagnostics.min.gz.js differ diff --git a/lib/browser/postal.diagnostics.min.js b/lib/browser/postal.diagnostics.min.js index 79aa9d8..0a17861 100644 --- a/lib/browser/postal.diagnostics.min.js +++ b/lib/browser/postal.diagnostics.min.js @@ -1 +1 @@ -postal.addWireTap(function(a){if(!JSON)throw"This browser or environment does provide JSON support";try{console.log(JSON.stringify(a))}catch(b){console.log("Unable to parse data to JSON: "+b)}}) \ No newline at end of file +postal.addWireTap(function(a,b){var c=_.extend(b,{data:a});if(!JSON)throw"This browser or environment does provide JSON support";try{console.log(JSON.stringify(c))}catch(d){try{c.data=d,console.log(JSON.stringify(c))}catch(e){console.log("Unable to parse data to JSON: "+d)}}}) \ No newline at end of file diff --git a/lib/browser/postal.js b/lib/browser/postal.js index 78e57a2..9894230 100644 --- a/lib/browser/postal.js +++ b/lib/browser/postal.js @@ -3,13 +3,45 @@ 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.3.0 + Version 0.4.0 */ var DEFAULT_EXCHANGE = "/", DEFAULT_PRIORITY = 50, DEFAULT_DISPOSEAFTER = 0, - NO_OP = function() { }; + NO_OP = function() { }, + parsePublishArgs = function(args) { + var parsed = { envelope: { } }, env; + switch(args.length) { + case 3: + if(typeof args[1] === "Object" && typeof args[2] === "Object") { + parsed.envelope.exchange = DEFAULT_EXCHANGE; + parsed.envelope.topic = args[0]; + parsed.payload = args[1]; + env = parsed.envelope; + parsed.envelope = _.extend(env, args[2]); + } + else { + parsed.envelope.exchange = args[0]; + parsed.envelope.topic = args[1]; + parsed.payload = args[2]; + } + break; + case 4: + parsed.envelope.exchange = args[0]; + parsed.envelope.topic = args[1]; + parsed.payload = args[2]; + env = parsed.envelope; + parsed.envelope = _.extend(env, args[3]); + break; + default: + parsed.envelope.exchange = DEFAULT_EXCHANGE; + parsed.envelope.topic = args[0]; + parsed.payload = args[1]; + break; + } + return parsed; + }; var DistinctPredicate = function() { var previous; @@ -39,13 +71,13 @@ ChannelDefinition.prototype = { return subscription; }, - publish: function(data) { - postal.configuration.bus.publish({ + publish: function(data, envelope) { + var env = _.extend({ exchange: this.exchange, - topic: this.topic, - data: data, - timeStamp: new Date() - }); + timeStamp: new Date(), + topic: this.topic + }, envelope); + postal.configuration.bus.publish(data, env); } }; @@ -193,22 +225,17 @@ var localBus = { wireTaps: [], - publish: function(envelope) { + publish: function(data, envelope) { _.each(this.wireTaps,function(tap) { - tap({ - exchange: envelope.exchange, - topic: envelope.topic, - data: envelope.data, - timeStamp: envelope.timeStamp - }); + tap(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(envelope.data); })) { + if(_.all(binding.constraints, function(constraint) { return constraint(data); })) { if(typeof binding.callback === 'function') { - binding.callback.apply(binding.context, [envelope.data]); + binding.callback.apply(binding.context, [data, envelope]); binding.onHandled(); } } @@ -288,12 +315,10 @@ var postal = { return channel.subscribe(callbk); }, - publish: function(exchange, topic, payload) { - var exch = arguments.length === 3 ? exchange : DEFAULT_EXCHANGE, - tpc = arguments.length === 3 ? topic : exchange, - msg = arguments.length === 3 ? payload : topic; - var channel = this.channel(exch, tpc); - channel.publish(msg); + 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) { diff --git a/lib/browser/postal.min.gz.js b/lib/browser/postal.min.gz.js index f12b3c2..aae4cf4 100644 Binary files a/lib/browser/postal.min.gz.js and b/lib/browser/postal.min.gz.js differ diff --git a/lib/browser/postal.min.js b/lib/browser/postal.min.js index db87e24..9a736d7 100644 --- a/lib/browser/postal.min.js +++ b/lib/browser/postal.min.js @@ -1 +1 @@ -(function(a,b){var c="/",d=50,e=0,f=function(){},g=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}},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(a){l.configuration.bus.publish({exchange:this.exchange,topic:this.topic,data:a,timeStamp:new Date})}};var i=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};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(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 g),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 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(a){_.each(this.wireTaps,function(b){b({exchange:a.exchange,topic:a.topic,data:a.data,timeStamp:a.timeStamp})}),_.each(this.subscriptions[a.exchange],function(b){_.each(b,function(b){l.configuration.resolver.compare(b.topic,a.topic)&&_.all(b.constraints,function(b){return b(a.data)})&&typeof b.callback=="function"&&(b.callback.apply(b.context,[a.data]),b.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(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 (http://ifandelse.com)", "name": "postal", "description": "Pub/Sub library providing wildcard subscriptions, complex message handling, etc. Works server and client-side.", - "version": "0.3.2", + "version": "0.4.0", "homepage": "http://github.com/ifandelse/postal.js", "repository": { "type": "git", diff --git a/src/diags/postal.diagnostics.js b/src/diags/postal.diagnostics.js index 7d39549..41249f1 100644 --- a/src/diags/postal.diagnostics.js +++ b/src/diags/postal.diagnostics.js @@ -1,11 +1,18 @@ -postal.addWireTap(function(data) { +postal.addWireTap(function(data, envelope) { + var all = _.extend(envelope, { data: data }); if(!JSON) { throw "This browser or environment does provide JSON support"; } try { - console.log(JSON.stringify(data)); + console.log(JSON.stringify(all)); } catch(exception) { - console.log("Unable to parse data to JSON: " + exception); + try { + all.data = exception; + console.log(JSON.stringify(all)); + } + catch(ex) { + console.log("Unable to parse data to JSON: " + exception); + } } }); \ No newline at end of file diff --git a/src/main/Api.js b/src/main/Api.js index 3a854bd..8f384b5 100644 --- a/src/main/Api.js +++ b/src/main/Api.js @@ -18,12 +18,10 @@ var postal = { return channel.subscribe(callbk); }, - publish: function(exchange, topic, payload) { - var exch = arguments.length === 3 ? exchange : DEFAULT_EXCHANGE, - tpc = arguments.length === 3 ? topic : exchange, - msg = arguments.length === 3 ? payload : topic; - var channel = this.channel(exch, tpc); - channel.publish(msg); + 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) { diff --git a/src/main/ChannelDefinition.js b/src/main/ChannelDefinition.js index 86112ac..0ba9c1c 100644 --- a/src/main/ChannelDefinition.js +++ b/src/main/ChannelDefinition.js @@ -10,12 +10,12 @@ ChannelDefinition.prototype = { return subscription; }, - publish: function(data) { - postal.configuration.bus.publish({ + publish: function(data, envelope) { + var env = _.extend({ exchange: this.exchange, - topic: this.topic, - data: data, - timeStamp: new Date() - }); + timeStamp: new Date(), + topic: this.topic + }, envelope); + postal.configuration.bus.publish(data, env); } }; diff --git a/src/main/Constants.js b/src/main/Constants.js index 6c54ca1..447453a 100644 --- a/src/main/Constants.js +++ b/src/main/Constants.js @@ -1,4 +1,36 @@ var DEFAULT_EXCHANGE = "/", DEFAULT_PRIORITY = 50, DEFAULT_DISPOSEAFTER = 0, - NO_OP = function() { }; + NO_OP = function() { }, + parsePublishArgs = function(args) { + var parsed = { envelope: { } }, env; + switch(args.length) { + case 3: + if(typeof args[1] === "Object" && typeof args[2] === "Object") { + parsed.envelope.exchange = DEFAULT_EXCHANGE; + parsed.envelope.topic = args[0]; + parsed.payload = args[1]; + env = parsed.envelope; + parsed.envelope = _.extend(env, args[2]); + } + else { + parsed.envelope.exchange = args[0]; + parsed.envelope.topic = args[1]; + parsed.payload = args[2]; + } + break; + case 4: + parsed.envelope.exchange = args[0]; + parsed.envelope.topic = args[1]; + parsed.payload = args[2]; + env = parsed.envelope; + parsed.envelope = _.extend(env, args[3]); + break; + default: + parsed.envelope.exchange = DEFAULT_EXCHANGE; + parsed.envelope.topic = args[0]; + parsed.payload = args[1]; + break; + } + return parsed; + }; diff --git a/src/main/LocalBus.js b/src/main/LocalBus.js index eecc13a..6eeb0de 100644 --- a/src/main/LocalBus.js +++ b/src/main/LocalBus.js @@ -4,22 +4,17 @@ var localBus = { wireTaps: [], - publish: function(envelope) { + publish: function(data, envelope) { _.each(this.wireTaps,function(tap) { - tap({ - exchange: envelope.exchange, - topic: envelope.topic, - data: envelope.data, - timeStamp: envelope.timeStamp - }); + tap(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(envelope.data); })) { + if(_.all(binding.constraints, function(constraint) { return constraint(data); })) { if(typeof binding.callback === 'function') { - binding.callback.apply(binding.context, [envelope.data]); + binding.callback.apply(binding.context, [data, envelope]); binding.onHandled(); } } diff --git a/src/main/VersionHeader.js b/src/main/VersionHeader.js index bf18127..121b759 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.3.0 + Version 0.4.0 */