From 13d6c7c41998a5b53f4a96139baf5a3125f757b5 Mon Sep 17 00:00:00 2001 From: Jim Cowart Date: Sun, 15 Jan 2012 21:46:34 -0500 Subject: [PATCH] Added envelope argument to publish methods, updated diags to use it correctly. --- lib/browser/postal.diagnostics.js | 13 ++++- lib/browser/postal.diagnostics.min.gz.js | Bin 169 -> 205 bytes lib/browser/postal.diagnostics.min.js | 2 +- lib/browser/postal.js | 71 +++++++++++++++-------- lib/browser/postal.min.gz.js | Bin 1363 -> 1518 bytes lib/browser/postal.min.js | 2 +- lib/node/postal.diagnostics.js | 13 ++++- lib/node/postal.js | 71 +++++++++++++++-------- package.json | 2 +- src/diags/postal.diagnostics.js | 13 ++++- src/main/Api.js | 10 ++-- src/main/ChannelDefinition.js | 12 ++-- src/main/Constants.js | 34 ++++++++++- src/main/LocalBus.js | 13 ++--- src/main/VersionHeader.js | 2 +- 15 files changed, 177 insertions(+), 81 deletions(-) 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 14a37037a39b54509567be1799b66bcc99c99c65..c2b38c40a557f14fc34f2833d20541f2dc324dd5 100644 GIT binary patch literal 205 zcmV;;05bm{iwFP@j}uP-1C5TsPQx$|M1N(;$rh16pjCf>0~~0@5pBGi#!~QF>usQl z{O@3H+_=qXW}c=qKZL~S^l-uEcE%F1DttLtf~ zrYT?3e0S0N7SZD3$nU@1&<~tw{MU&6ANX*|IIRpOP*5vFXLZ*B2N)j7x7PeOTw+Q) H6#)PMPc~!O literal 169 zcmV;a09OAWiwFR)bQ4bi167T|4uUWcM1N)Nsf`IApnu>&4`Mto?E+0|x7jWjLil&# z=xrwRW~OjeObv$cjzTRK+fUhRN!_V)FdA4kv3H&<{|dW{^K@}>POqTKhC@|c8Ne43Q8pi XsCc+z-~#5{xovYlc8+Ng!Tjfl5 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)e0016q~`Tzg` literal 1363 zcmV-Z1+4lXiwFR)bQ4bi1HD(@Z`(Ey{#O)lNX3R$oeg`K6s`!`4trTwticA%%>t65 zBsQ|7QB-W#(f_`qewlLQBz@_VP4aa2-FL^kqZ?Hj*D}vsiW%D7QRQ$ldo{x$`DuX# zS>T8aB4}6R*j^fO8YrPFl{v%ypy%YgKfCc{`B5vG#c=xC<%AJJD5iuVA6Dl0-G3EL zU4|)w?HiA$c_u&@;S*lhI3Z)8I+3L(HawwOEI?DU)_Ea8bsZ#Lp>mz;Z6V06tXRpF zWWwL8Xc01!iM1o$kupmaVCfx5J)UQgj4MTr29H&xHz)>}nANzbSSrh8WM=BSPR`x+ zCjA2d#C+=)wGPg4zYAY04n2L}@!$(?dG|8$otpjPtp~@yAG0l)A z+5`vHI24gk{$cKsktcny#_rj9SqgmxEasI4o)(ZubpspJ%d*HzaT#gb3ItF_uF1~# z^gXQZ@970uAf2duJ-bSTb4SxkIN;=+3`OYZ+_4ooZqFBTR#mATCLHQy)r!GctOPYO z8Y1L;5i0j)L7S9gX0f>*)Tjfe&%4Xpd}!`k9D6C=oVfIQ!f3q;2bBK`nqnK+z(kTGa!IdIYxHCh zw3CCW8GnlS-KKD7|IW@DaV280k&(&vv)T7E1S1OfpbS9}hB_CXo{ml3-;dX1S0j9A zot!K{Ta9}QQ#XQw{UW81hOa((uVOs=^vRncYxAYq^j_L~-fDsX?N<-d%xhWwG7bm^Dw(!(oDsCJE2{SmOko_Wx^B zA8cDApv%4D>yh#93pUz3?CeUEd3q<5*JX*z`Z25hZHgEq9PC>qa-^~g26I~<04(GZ zOc#0Nuzj+U*-&^PANB`bt7Ai-TefPhp(O4*f{T!0p~jC4ju@y69_OdeyrTm9R6HuO z?3j64*&qp{8hAsVDea{qi*+(T5856_v+Z*YO~%Dc^)*7fC|7R4ej$s1&F84U|4%E0 z`#2Q53qptg-JJ6bhe|V@Kx&q8$avNe002nkl%)Uw 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 */