diff --git a/build-all.sh b/build-all.sh index f187fd1..663f556 100755 --- a/build-all.sh +++ b/build-all.sh @@ -3,13 +3,24 @@ anvil -b build-browser.json anvil -b build-browser-diags.json -cp ./lib/browser/postal.js ./example/amd/js/libs/postal/ -cp ./lib/browser/postal.diagnostics.js ./example/amd/js/libs/postal/ -cp ./lib/browser/postal.js ./example/standard/js/ -cp ./lib/browser/postal.diagnostics.js ./example/standard/js/ +mv ./lib/standard/postal.amd.js ./lib/amd/postal.js +mv ./lib/standard/postal.amd.min.js ./lib/amd/postal.min.js +mv ./lib/standard/postal.amd.min.gz.js ./lib/amd/postal.min.gz.js +mv ./lib/standard/postal.diagnostics.amd.js ./lib/amd/postal.diagnostics.js +mv ./lib/standard/postal.diagnostics.amd.min.js ./lib/amd/postal.diagnostics.min.js +mv ./lib/standard/postal.diagnostics.amd.min.gz.js ./lib/amd/postal.diagnostics.min.gz.js -mv ./lib/browser/postal.node.js ./lib/node/postal.js -rm ./lib/browser/postal.node* +mv ./lib/standard/postal.diagnostics.node.js ./lib/node/postal.diagnostics.js +mv ./lib/standard/postal.node.js ./lib/node/postal.js +rm ./lib/standard/postal.diagnostics.node* +rm ./lib/standard/postal.node* -mv ./lib/browser/postal.diagnostics.node.js ./lib/node/postal.diagnostics.js -rm ./lib/browser/postal.diagnostics.node* \ No newline at end of file +mv ./lib/standard/postal.standard.js ./lib/standard/postal.js +mv ./lib/standard/postal.standard.min.js ./lib/standard/postal.min.js +mv ./lib/standard/postal.standard.min.gz.js ./lib/standard/postal.min.gz.js +mv ./lib/standard/postal.diagnostics.standard.js ./lib/standard/postal.diagnostics.js +mv ./lib/standard/postal.diagnostics.standard.min.js ./lib/standard/postal.diagnostics.min.js +mv ./lib/standard/postal.diagnostics.standard.min.gz.js ./lib/standard/postal.diagnostics.min.gz.js + +cp ./lib/standard/postal.* ./example/standard/js +cp ./lib/amd/postal.* ./example/amd/js/libs/postal \ No newline at end of file diff --git a/build-browser-diags.json b/build-browser-diags.json index 9f41844..3891fae 100644 --- a/build-browser-diags.json +++ b/build-browser-diags.json @@ -1,6 +1,6 @@ { "source": "src/diags", - "output": "lib/browser", + "output": "lib/standard", "lint": {}, "uglify": {}, "gzip": {}, diff --git a/build-browser.json b/build-browser.json index 79d48de..01dc0dc 100644 --- a/build-browser.json +++ b/build-browser.json @@ -1,6 +1,6 @@ { "source": "src/main", - "output": "lib/browser", + "output": "lib/standard", "lint": {}, "uglify": {}, "gzip": {}, diff --git a/example/amd/js/examples.js b/example/amd/js/examples.js index ea146b6..f333a02 100644 --- a/example/amd/js/examples.js +++ b/example/amd/js/examples.js @@ -1,4 +1,5 @@ define(['postal', 'postaldiags'], function(postal, diags){ + // The world's simplest subscription var channel = postal.channel("Name.Changed"); // subscribe diff --git a/example/amd/js/libs/postal/postal.diagnostics.js b/example/amd/js/libs/postal/postal.diagnostics.js index 5defd32..638c9b9 100644 --- a/example/amd/js/libs/postal/postal.diagnostics.js +++ b/example/amd/js/libs/postal/postal.diagnostics.js @@ -1,17 +1,10 @@ -(function(root, doc, factory) { - if (typeof define === "function" && define.amd) { - // AMD. Register as an anonymous module. - define(["postal", "underscore"], function(postal, _) { - return factory(postal, _, root, doc); - }); - } else { - // Browser globals - factory(root.postal, root._, root, doc); - } -}(this, document, function(postal, _, global, document, undefined) { +// This is the amd module version of postal.diagnostics.js +// If you need the standard lib version, go to http://github.com/ifandelse/postal.js +define(["postal", "underscore"], function(postal, _, undefined) { + // this returns a callback that, if invoked, removes the wireTap - return postal.addWireTap(function(data, envelope) { + postal.diagnostics = postal.addWireTap(function(data, envelope) { var all = _.extend(envelope, { data: data }); if(!JSON) { throw "This browser or environment does not provide JSON support"; @@ -30,4 +23,5 @@ } }); -})); \ No newline at end of file + +}); \ No newline at end of file diff --git a/example/amd/js/libs/postal/postal.diagnostics.min.gz.js b/example/amd/js/libs/postal/postal.diagnostics.min.gz.js new file mode 100644 index 0000000..b0eb8fc Binary files /dev/null and b/example/amd/js/libs/postal/postal.diagnostics.min.gz.js differ diff --git a/example/amd/js/libs/postal/postal.diagnostics.min.js b/example/amd/js/libs/postal/postal.diagnostics.min.js new file mode 100644 index 0000000..0033654 --- /dev/null +++ b/example/amd/js/libs/postal/postal.diagnostics.min.js @@ -0,0 +1 @@ +define(["postal","underscore"],function(a,b,c){a.diagnostics=a.addWireTap(function(a,c){var d=b.extend(c,{data:a});if(!JSON)throw"This browser or environment does not provide JSON support";try{console.log(JSON.stringify(d))}catch(e){try{d.data="ERROR: "+e.message,console.log(JSON.stringify(d))}catch(f){console.log("Unable to parse data to JSON: "+e)}}})}) \ No newline at end of file diff --git a/example/amd/js/libs/postal/postal.js b/example/amd/js/libs/postal/postal.js index 42e37e7..cf3714f 100644 --- a/example/amd/js/libs/postal/postal.js +++ b/example/amd/js/libs/postal/postal.js @@ -5,17 +5,9 @@ Version 0.6.0 */ -(function(root, doc, factory) { - if (typeof define === "function" && define.amd) { - // AMD. Register as an anonymous module. - define(["underscore"], function(_) { - return factory(_, root, doc); - }); - } else { - // Browser globals - factory(root._, root, doc); - } -}(this, document, function(_, global, document, undefined) { +// This is the amd-module version of postal.js +// If you need the standard lib style version, go to http://github.com/ifandelse/postal.js +define(["underscore"], function(_, undefined) { var DEFAULT_CHANNEL = "/", DEFAULT_PRIORITY = 50, @@ -414,6 +406,5 @@ var postal = { }; - global.postal = postal; return postal; -})); \ No newline at end of file +}); \ No newline at end of file diff --git a/example/amd/js/libs/postal/postal.min.gz.js b/example/amd/js/libs/postal/postal.min.gz.js new file mode 100644 index 0000000..7c92cc5 Binary files /dev/null and b/example/amd/js/libs/postal/postal.min.gz.js differ diff --git a/example/amd/js/libs/postal/postal.min.js b/example/amd/js/libs/postal/postal.min.js new file mode 100644 index 0000000..cfbebd7 --- /dev/null +++ b/example/amd/js/libs/postal/postal.min.js @@ -0,0 +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={channel:this.channel,topic:this._topic,data:a};a.topic&&a.data&&(b=a,b.channel=b.channel||this.channel),b.timeStamp=new Date,n.configuration.bus.publish(b)},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,n.configuration.bus.publish({channel:f,topic:"subscription.created",timeStamp:new Date,data:{event:"subscription.created",channel:a,topic:b}}),n.configuration.bus.subscribe(this)};j.prototype={unsubscribe:function(){n.configuration.bus.unsubscribe(this),n.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}},l={subscriptions:{},wireTaps:new Array(0),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){n.configuration.resolver.compare(c.topic,b.topic)&&a.all(c.constraints,function(a){return a(b.data)})&&typeof c.callback=="function"&&(c.callback.apply(c.context,[b.data,b]),c.onHandled())})})},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},unsubscribe:function(a){if(this.subscriptions[a.channel][a.topic]){var b=this.subscriptions[a.channel][a.topic].length,c=0;for(;c=0;b--)if(f[b].priority<=a.priority){f.splice(b+1,0,a),c=!0;break}return c||f.unshift(a),a},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(subs[idx].priority <= subDef.priority) { + subs.splice(idx + 1, 0, subDef); + found = true; + break; + } + } + if(!found) { + subs.unshift(subDef); + } + return subDef; + }, + + unsubscribe: function(config) { + if(this.subscriptions[config.channel][config.topic]) { + var len = this.subscriptions[config.channel][config.topic].length, + idx = 0; + for ( ; idx < len; idx++ ) { + if (this.subscriptions[config.channel][config.topic][idx] === config) { + this.subscriptions[config.channel][config.topic].splice( idx, 1 ); + break; + } + } + } + }, + + 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 publishPicker = { + "1" : function(envelope) { + if(!envelope) { + throw new Error("publishing from the 'global' postal.publish call requires a valid envelope."); + } + envelope.channel = envelope.channel || DEFAULT_CHANNEL; + envelope.timeStamp = new Date(); + postal.configuration.bus.publish(envelope); + }, + "2" : function(topic, data) { + postal.configuration.bus.publish({ channel: DEFAULT_CHANNEL, topic: topic, timeStamp: new Date(), data: data }); + }, + "3" : function(channel, topic, data) { + postal.configuration.bus.publish({ channel: channel, topic: topic, timeStamp: new Date(), data: data }); + } +}; + +// save some setup time, albeit tiny +localBus.subscriptions[SYSTEM_CHANNEL] = {}; + +var postal = { + configuration: { + bus: localBus, + resolver: bindingsResolver + }, + + channel: function() { + var len = arguments.length, + channel = arguments[0], + tpc = arguments[1]; + if(len === 1) { + if(Object.prototype.toString.call(channel) === "[object String]") { + channel = DEFAULT_CHANNEL; + tpc = arguments[0]; + } + else { + channel = arguments[0].channel || DEFAULT_CHANNEL; + tpc = arguments[0].topic; + } + } + return new ChannelDefinition(channel, tpc); + }, + + subscribe: function(options) { + var callback = options.callback, + topic = options.topic, + channel = options.channel || DEFAULT_CHANNEL; + return new SubscriptionDefinition(channel, topic, callback); + }, + + publish: function() { + var len = arguments.length; + if(publishPicker[len]) { + publishPicker[len].apply(this, arguments); + } + }, + + addWireTap: function(callback) { + return this.configuration.bus.addWireTap(callback); + }, + + linkChannels: function(sources, destinations) { + var result = []; + if(!_.isArray(sources)) { + sources = [sources]; + } + if(!_.isArray(destinations)) { + destinations = [destinations]; + } + _.each(sources, function(source){ + var sourceTopic = source.topic || "*"; + _.each(destinations, function(destination) { + var destChannel = destination.channel || DEFAULT_CHANNEL; + result.push( + postal.subscribe({ + channel: source.channel || DEFAULT_CHANNEL, + topic: source.topic || "*", + callback : function(data, env) { + var newEnv = env; + newEnv.topic = _.isFunction(destination.topic) ? destination.topic(env.topic) : destination.topic || env.topic; + newEnv.channel = destChannel; + newEnv.data = data; + postal.publish(newEnv); + } + }) + ); + }); + }); + return result; + }, + + reset: function() { + // we check first in case a custom bus or resolver + // doesn't expose subscriptions or a resolver cache + if(postal.configuration.bus.subscriptions) { + postal.configuration.bus.subscriptions = {}; + } + if(postal.configuration.resolver.cache) { + postal.configuration.resolver.cache = {}; + } + } +}; + + + return postal; +}); \ No newline at end of file diff --git a/lib/amd/postal.min.gz.js b/lib/amd/postal.min.gz.js new file mode 100644 index 0000000..7c92cc5 Binary files /dev/null and b/lib/amd/postal.min.gz.js differ diff --git a/lib/amd/postal.min.js b/lib/amd/postal.min.js new file mode 100644 index 0000000..cfbebd7 --- /dev/null +++ b/lib/amd/postal.min.js @@ -0,0 +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={channel:this.channel,topic:this._topic,data:a};a.topic&&a.data&&(b=a,b.channel=b.channel||this.channel),b.timeStamp=new Date,n.configuration.bus.publish(b)},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,n.configuration.bus.publish({channel:f,topic:"subscription.created",timeStamp:new Date,data:{event:"subscription.created",channel:a,topic:b}}),n.configuration.bus.subscribe(this)};j.prototype={unsubscribe:function(){n.configuration.bus.unsubscribe(this),n.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}},l={subscriptions:{},wireTaps:new Array(0),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){n.configuration.resolver.compare(c.topic,b.topic)&&a.all(c.constraints,function(a){return a(b.data)})&&typeof c.callback=="function"&&(c.callback.apply(c.context,[b.data,b]),c.onHandled())})})},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},unsubscribe:function(a){if(this.subscriptions[a.channel][a.topic]){var b=this.subscriptions[a.channel][a.topic].length,c=0;for(;c=0;b--)if(f[b].priority<=a.priority){f.splice(b+1,0,a),c=!0;break}return c||f.unshift(a),a},unsubscribe:function(a){if(this.subscriptions[a.channel][a.topic]){var b=this.subscriptions[a.channel][a.topic].length,c=0;for(;c=0;b--)if(f[b].priority<=a.priority){f.splice(b+1,0,a),c=!0;break}return c||f.unshift(a),a},unsubscribe:function(a){if(this.subscriptions[a.channel][a.topic]){var b=this.subscriptions[a.channel][a.topic].length,c=0;for(;c