From cc20b691bb1f284f957ddbf0b1938d4f8c64b167 Mon Sep 17 00:00:00 2001 From: ifandelse Date: Wed, 29 Jan 2014 02:38:58 -0500 Subject: [PATCH] Moved linkChannels behavior to add-on --- lib/basic/postal.basic.js | 25 ------------------ lib/basic/postal.basic.min.js | 2 +- lib/postal.js | 50 +++++++++++++++++------------------ lib/postal.min.js | 2 +- spec/basic.html | 1 - src/Api.js | 26 ------------------ src/linkChannels.js | 26 ++++++++++++++++++ src/postal.js | 1 + 8 files changed, 54 insertions(+), 79 deletions(-) create mode 100644 src/linkChannels.js diff --git a/lib/basic/postal.basic.js b/lib/basic/postal.basic.js index 2687953..938d7d7 100644 --- a/lib/basic/postal.basic.js +++ b/lib/basic/postal.basic.js @@ -212,31 +212,6 @@ } }; }, - linkChannels: function (sources, destinations) { - var result = [], - self = this; - sources = !_.isArray(sources) ? [sources] : sources; - destinations = !_.isArray(destinations) ? [destinations] : destinations; - _.each(sources, function (source) { - var sourceTopic = source.topic || "#"; - _.each(destinations, function (destination) { - var destChannel = destination.channel || self.configuration.DEFAULT_CHANNEL; - result.push( - self.subscribe({ - channel: source.channel || self.configuration.DEFAULT_CHANNEL, - topic: sourceTopic, - callback: function (data, env) { - var newEnv = _.clone(env); - newEnv.topic = _.isFunction(destination.topic) ? destination.topic(env.topic) : destination.topic || env.topic; - newEnv.channel = destChannel; - newEnv.data = data; - self.publish(newEnv); - } - })); - }); - }); - return result; - }, noConflict: function () { if (typeof window === "undefined") { throw new Error("noConflict can only be used in browser clients which aren't using AMD modules"); diff --git a/lib/basic/postal.basic.min.js b/lib/basic/postal.basic.min.js index 1f72797..66e4cde 100644 --- a/lib/basic/postal.basic.min.js +++ b/lib/basic/postal.basic.min.js @@ -5,4 +5,4 @@ * Url: http://github.com/postaljs/postal.js * License(s): MIT, GPL */ -(function(n,t){"object"==typeof module&&module.exports?module.exports=t(require("underscore"),this):"function"==typeof define&&define.amd?define(["underscore"],function(i){return t(i,n)}):n.postal=t(n._,n)})(this,function(n,t){var i,e=t.postal,s=function(n){this.channel=n||i.configuration.DEFAULT_CHANNEL,this.initialize()};s.prototype.initialize=function(){},s.prototype.subscribe=function(){return i.subscribe({channel:this.channel,topic:1===arguments.length?arguments[0].topic:arguments[0],callback:1===arguments.length?arguments[0].callback:arguments[1]})},s.prototype.publish=function(){var n=1===arguments.length?"[object String]"===Object.prototype.toString.call(arguments[0])?{topic:arguments[0]}:arguments[0]:{topic:arguments[0],data:arguments[1]};n.channel=this.channel,i.publish(n)};var c=function(n,t,i){if(3!==arguments.length)throw new Error("You must provide a channel, topic and callback when creating a SubscriptionDefinition instance.");if(0===t.length)throw new Error("Topics cannot be empty");this.channel=n,this.topic=t,this.subscribe(i)};c.prototype={unsubscribe:function(){this.inactive||(this.inactive=!0,i.unsubscribe(this))},subscribe:function(n){return this.callback=n,this},withContext:function(n){return this.context=n,this}};var o={cache:{},regex:{},compare:function(t,i){var e,s,c,o=this.cache[i]&&this.cache[i][t];return"undefined"!=typeof o?o:((s=this.regex[t])||(e="^"+n.map(t.split("."),function(n){var t="";return c&&(t="#"!==c?"\\.\\b":"\\b"),t+="#"===n?"[\\s\\S]*":"*"===n?"[^.]+":n,c=n,t}).join("")+"$",s=this.regex[t]=new RegExp(e)),this.cache[i]=this.cache[i]||{},this.cache[i][t]=o=s.test(i),o)},reset:function(){this.cache={},this.regex={}}},r=function(n,t){!n.inactive&&i.configuration.resolver.compare(n.topic,t.topic)&&n.callback.call(n.context||this,t.data,t)},a=0,u=[],h=function(){for(;u.length;)i.unsubscribe(u.shift())};if(i={configuration:{resolver:o,DEFAULT_CHANNEL:"/",SYSTEM_CHANNEL:"postal"},subscriptions:{},wireTaps:[],ChannelDefinition:s,SubscriptionDefinition:c,channel:function(n){return new s(n)},subscribe:function(n){var t,i=new c(n.channel||this.configuration.DEFAULT_CHANNEL,n.topic,n.callback),e=this.subscriptions[i.channel];return this.publish({channel:this.configuration.SYSTEM_CHANNEL,topic:"subscription.created",data:{event:"subscription.created",channel:i.channel,topic:i.topic}}),e||(e=this.subscriptions[i.channel]={}),t=this.subscriptions[i.channel][i.topic],t||(t=this.subscriptions[i.channel][i.topic]=[]),t.push(i),i},publish:function(t){++a,t.channel=t.channel||this.configuration.DEFAULT_CHANNEL,t.timeStamp=new Date,n.each(this.wireTaps,function(n){n(t.data,t)}),this.subscriptions[t.channel]&&n.each(this.subscriptions[t.channel],function(n){for(var i,e=0,s=n.length;s>e;)(i=n[e++])&&r(i,t)}),0===--a&&h()},unsubscribe:function(n){if(a)return void u.push(n);if(this.subscriptions[n.channel]&&this.subscriptions[n.channel][n.topic])for(var t=this.subscriptions[n.channel][n.topic].length,i=0;t>i;){if(this.subscriptions[n.channel][n.topic][i]===n){this.subscriptions[n.channel][n.topic].splice(i,1);break}i+=1}this.publish({channel:this.configuration.SYSTEM_CHANNEL,topic:"subscription.removed",data:{event:"subscription.removed",channel:n.channel,topic:n.topic}})},addWireTap:function(n){var t=this;return t.wireTaps.push(n),function(){var i=t.wireTaps.indexOf(n);-1!==i&&t.wireTaps.splice(i,1)}},linkChannels:function(t,i){var e=[],s=this;return t=n.isArray(t)?t:[t],i=n.isArray(i)?i:[i],n.each(t,function(t){var c=t.topic||"#";n.each(i,function(i){var o=i.channel||s.configuration.DEFAULT_CHANNEL;e.push(s.subscribe({channel:t.channel||s.configuration.DEFAULT_CHANNEL,topic:c,callback:function(t,e){var c=n.clone(e);c.topic=n.isFunction(i.topic)?i.topic(e.topic):i.topic||e.topic,c.channel=o,c.data=t,s.publish(c)}}))})}),e},noConflict:function(){if("undefined"==typeof window)throw new Error("noConflict can only be used in browser clients which aren't using AMD modules");return t.postal=e,this},getSubscribersFor:function(){var n=arguments[0],t=arguments[1];return 1===arguments.length&&(n=arguments[0].channel||this.configuration.DEFAULT_CHANNEL,t=arguments[0].topic),this.subscriptions[n]&&Object.prototype.hasOwnProperty.call(this.subscriptions[n],t)?this.subscriptions[n][t]:[]},reset:function(){this.subscriptions&&(n.each(this.subscriptions,function(t){n.each(t,function(n){for(;n.length;)n.pop().unsubscribe()})}),this.subscriptions={}),this.configuration.resolver.reset()}},i.subscriptions[i.configuration.SYSTEM_CHANNEL]={},t&&Object.prototype.hasOwnProperty.call(t,"__postalReady__")&&n.isArray(t.__postalReady__))for(;t.__postalReady__.length;)t.__postalReady__.shift().onReady(i);return i}); \ No newline at end of file +(function(n,t){"object"==typeof module&&module.exports?module.exports=t(require("underscore"),this):"function"==typeof define&&define.amd?define(["underscore"],function(i){return t(i,n)}):n.postal=t(n._,n)})(this,function(n,t){var i,e=t.postal,s=function(n){this.channel=n||i.configuration.DEFAULT_CHANNEL,this.initialize()};s.prototype.initialize=function(){},s.prototype.subscribe=function(){return i.subscribe({channel:this.channel,topic:1===arguments.length?arguments[0].topic:arguments[0],callback:1===arguments.length?arguments[0].callback:arguments[1]})},s.prototype.publish=function(){var n=1===arguments.length?"[object String]"===Object.prototype.toString.call(arguments[0])?{topic:arguments[0]}:arguments[0]:{topic:arguments[0],data:arguments[1]};n.channel=this.channel,i.publish(n)};var c=function(n,t,i){if(3!==arguments.length)throw new Error("You must provide a channel, topic and callback when creating a SubscriptionDefinition instance.");if(0===t.length)throw new Error("Topics cannot be empty");this.channel=n,this.topic=t,this.subscribe(i)};c.prototype={unsubscribe:function(){this.inactive||(this.inactive=!0,i.unsubscribe(this))},subscribe:function(n){return this.callback=n,this},withContext:function(n){return this.context=n,this}};var o={cache:{},regex:{},compare:function(t,i){var e,s,c,o=this.cache[i]&&this.cache[i][t];return"undefined"!=typeof o?o:((s=this.regex[t])||(e="^"+n.map(t.split("."),function(n){var t="";return c&&(t="#"!==c?"\\.\\b":"\\b"),t+="#"===n?"[\\s\\S]*":"*"===n?"[^.]+":n,c=n,t}).join("")+"$",s=this.regex[t]=new RegExp(e)),this.cache[i]=this.cache[i]||{},this.cache[i][t]=o=s.test(i),o)},reset:function(){this.cache={},this.regex={}}},r=function(n,t){!n.inactive&&i.configuration.resolver.compare(n.topic,t.topic)&&n.callback.call(n.context||this,t.data,t)},a=0,u=[],h=function(){for(;u.length;)i.unsubscribe(u.shift())};if(i={configuration:{resolver:o,DEFAULT_CHANNEL:"/",SYSTEM_CHANNEL:"postal"},subscriptions:{},wireTaps:[],ChannelDefinition:s,SubscriptionDefinition:c,channel:function(n){return new s(n)},subscribe:function(n){var t,i=new c(n.channel||this.configuration.DEFAULT_CHANNEL,n.topic,n.callback),e=this.subscriptions[i.channel];return this.publish({channel:this.configuration.SYSTEM_CHANNEL,topic:"subscription.created",data:{event:"subscription.created",channel:i.channel,topic:i.topic}}),e||(e=this.subscriptions[i.channel]={}),t=this.subscriptions[i.channel][i.topic],t||(t=this.subscriptions[i.channel][i.topic]=[]),t.push(i),i},publish:function(t){++a,t.channel=t.channel||this.configuration.DEFAULT_CHANNEL,t.timeStamp=new Date,n.each(this.wireTaps,function(n){n(t.data,t)}),this.subscriptions[t.channel]&&n.each(this.subscriptions[t.channel],function(n){for(var i,e=0,s=n.length;s>e;)(i=n[e++])&&r(i,t)}),0===--a&&h()},unsubscribe:function(n){if(a)return void u.push(n);if(this.subscriptions[n.channel]&&this.subscriptions[n.channel][n.topic])for(var t=this.subscriptions[n.channel][n.topic].length,i=0;t>i;){if(this.subscriptions[n.channel][n.topic][i]===n){this.subscriptions[n.channel][n.topic].splice(i,1);break}i+=1}this.publish({channel:this.configuration.SYSTEM_CHANNEL,topic:"subscription.removed",data:{event:"subscription.removed",channel:n.channel,topic:n.topic}})},addWireTap:function(n){var t=this;return t.wireTaps.push(n),function(){var i=t.wireTaps.indexOf(n);-1!==i&&t.wireTaps.splice(i,1)}},noConflict:function(){if("undefined"==typeof window)throw new Error("noConflict can only be used in browser clients which aren't using AMD modules");return t.postal=e,this},getSubscribersFor:function(){var n=arguments[0],t=arguments[1];return 1===arguments.length&&(n=arguments[0].channel||this.configuration.DEFAULT_CHANNEL,t=arguments[0].topic),this.subscriptions[n]&&Object.prototype.hasOwnProperty.call(this.subscriptions[n],t)?this.subscriptions[n][t]:[]},reset:function(){this.subscriptions&&(n.each(this.subscriptions,function(t){n.each(t,function(n){for(;n.length;)n.pop().unsubscribe()})}),this.subscriptions={}),this.configuration.resolver.reset()}},i.subscriptions[i.configuration.SYSTEM_CHANNEL]={},t&&Object.prototype.hasOwnProperty.call(t,"__postalReady__")&&n.isArray(t.__postalReady__))for(;t.__postalReady__.length;)t.__postalReady__.shift().onReady(i);return i}); \ No newline at end of file diff --git a/lib/postal.js b/lib/postal.js index f05f396..843e523 100644 --- a/lib/postal.js +++ b/lib/postal.js @@ -454,31 +454,6 @@ } }; }, - linkChannels: function (sources, destinations) { - var result = [], - self = this; - sources = !_.isArray(sources) ? [sources] : sources; - destinations = !_.isArray(destinations) ? [destinations] : destinations; - _.each(sources, function (source) { - var sourceTopic = source.topic || "#"; - _.each(destinations, function (destination) { - var destChannel = destination.channel || self.configuration.DEFAULT_CHANNEL; - result.push( - self.subscribe({ - channel: source.channel || self.configuration.DEFAULT_CHANNEL, - topic: sourceTopic, - callback: function (data, env) { - var newEnv = _.clone(env); - newEnv.topic = _.isFunction(destination.topic) ? destination.topic(env.topic) : destination.topic || env.topic; - newEnv.channel = destChannel; - newEnv.data = data; - self.publish(newEnv); - } - })); - }); - }); - return result; - }, noConflict: function () { if (typeof window === "undefined") { throw new Error("noConflict can only be used in browser clients which aren't using AMD modules"); @@ -513,6 +488,31 @@ } }; _postal.subscriptions[_postal.configuration.SYSTEM_CHANNEL] = {}; + _postal.linkChannels = function (sources, destinations) { + var result = [], + self = this; + sources = !_.isArray(sources) ? [sources] : sources; + destinations = !_.isArray(destinations) ? [destinations] : destinations; + _.each(sources, function (source) { + var sourceTopic = source.topic || "#"; + _.each(destinations, function (destination) { + var destChannel = destination.channel || self.configuration.DEFAULT_CHANNEL; + result.push( + self.subscribe({ + channel: source.channel || self.configuration.DEFAULT_CHANNEL, + topic: sourceTopic, + callback: function (data, env) { + var newEnv = _.clone(env); + newEnv.topic = _.isFunction(destination.topic) ? destination.topic(env.topic) : destination.topic || env.topic; + newEnv.channel = destChannel; + newEnv.data = data; + self.publish(newEnv); + } + })); + }); + }); + return result; + }; if (global && Object.prototype.hasOwnProperty.call(global, "__postalReady__") && _.isArray(global.__postalReady__)) { while (global.__postalReady__.length) { global.__postalReady__.shift().onReady(_postal); diff --git a/lib/postal.min.js b/lib/postal.min.js index 8fb8fa3..02923df 100644 --- a/lib/postal.min.js +++ b/lib/postal.min.js @@ -5,4 +5,4 @@ * Url: http://github.com/postaljs/postal.js * License(s): MIT, GPL */ -(function(t,n){"object"==typeof module&&module.exports?module.exports=n(require("underscore"),this):"function"==typeof define&&define.amd?define(["underscore"],function(i){return n(i,t)}):t.postal=n(t._,t)})(this,function(t,n){var i,e=n.postal,r=function(t){if("function"!=typeof t.target)throw new Error("You can only make functions into Conduits.");var n={pre:t.pre||[],post:t.post||[],all:[]},i=t.context,e={isTarget:!0,fn:function(n){var e=Array.prototype.slice.call(arguments,1);t.target.apply(i,e),n.apply(this,e)}},r=function(){n.all=n.pre.concat([e].concat(n.post))};r();var o=function(){var t=0,e=function r(){var e,o=Array.prototype.slice.call(arguments,0),c=t;t+=1,c=n)throw"The value provided to disposeAfter (maxCalls) must be a number greater than zero.";var e=t.after(n,i);return{name:"stopAfter",fn:function(t,n,i){e(),t(n,i)}}},withThrottle:function(n){if(t.isNaN(n))throw"Milliseconds must be a number";return{name:"withThrottle",fn:t.throttle(function(t,n,i){t(n,i)},n)}},withDebounce:function(n,i){if(t.isNaN(n))throw"Milliseconds must be a number";return{name:"debounce",fn:t.debounce(function(t,n,i){t(n,i)},n,!!i)}},withConstraint:function(n){if(!t.isFunction(n))throw"Predicate constraint must be a function";return{name:"withConstraint",fn:function(t,i,e){n.call(this,i,e)&&t.call(this,i,e)}}},distinct:function(t){t=t||{};var n=function(t){return t[0]},i=t.all?new a(n):new s(n);return{name:"distinct",fn:function(t,n,e){i(n)&&t(n,e)}}}};c.prototype.defer=function(){return this.callback.before(u.defer()),this},c.prototype.disposeAfter=function(t){var n=this;return n.callback.before(u.stopAfter(t,function(){n.unsubscribe.call(n)})),n},c.prototype.distinctUntilChanged=function(){return this.callback.before(u.distinct()),this},c.prototype.distinct=function(){return this.callback.before(u.distinct({all:!0})),this},c.prototype.once=function(){return this.disposeAfter(1),this},c.prototype.withConstraint=function(t){return this.callback.before(u.withConstraint(t)),this},c.prototype.withDebounce=function(t,n){return this.callback.before(u.withDebounce(t,n)),this},c.prototype.withDelay=function(t){return this.callback.before(u.withDelay(t)),this},c.prototype.withThrottle=function(t){return this.callback.before(u.withThrottle(t)),this},c.prototype.subscribe=function(t){return this.callback=new r({target:t,context:this}),this},c.prototype.withContext=function(t){return this.callback.context(t),this};var h={cache:{},regex:{},compare:function(n,i){var e,r,o,c=this.cache[i]&&this.cache[i][n];return"undefined"!=typeof c?c:((r=this.regex[n])||(e="^"+t.map(n.split("."),function(t){var n="";return o&&(n="#"!==o?"\\.\\b":"\\b"),n+="#"===t?"[\\s\\S]*":"*"===t?"[^.]+":t,o=t,n}).join("")+"$",r=this.regex[n]=new RegExp(e)),this.cache[i]=this.cache[i]||{},this.cache[i][n]=c=r.test(i),c)},reset:function(){this.cache={},this.regex={}}},l=function(t,n){!t.inactive&&i.configuration.resolver.compare(t.topic,n.topic)&&t.callback.call(t.context||this,n.data,n)},p=0,f=[],b=function(){for(;f.length;)i.unsubscribe(f.shift())};if(i={configuration:{resolver:h,DEFAULT_CHANNEL:"/",SYSTEM_CHANNEL:"postal"},subscriptions:{},wireTaps:[],ChannelDefinition:o,SubscriptionDefinition:c,channel:function(t){return new o(t)},subscribe:function(t){var n,i=new c(t.channel||this.configuration.DEFAULT_CHANNEL,t.topic,t.callback),e=this.subscriptions[i.channel];return this.publish({channel:this.configuration.SYSTEM_CHANNEL,topic:"subscription.created",data:{event:"subscription.created",channel:i.channel,topic:i.topic}}),e||(e=this.subscriptions[i.channel]={}),n=this.subscriptions[i.channel][i.topic],n||(n=this.subscriptions[i.channel][i.topic]=[]),n.push(i),i},publish:function(n){++p,n.channel=n.channel||this.configuration.DEFAULT_CHANNEL,n.timeStamp=new Date,t.each(this.wireTaps,function(t){t(n.data,n)}),this.subscriptions[n.channel]&&t.each(this.subscriptions[n.channel],function(t){for(var i,e=0,r=t.length;r>e;)(i=t[e++])&&l(i,n)}),0===--p&&b()},unsubscribe:function(t){if(p)return void f.push(t);if(this.subscriptions[t.channel]&&this.subscriptions[t.channel][t.topic])for(var n=this.subscriptions[t.channel][t.topic].length,i=0;n>i;){if(this.subscriptions[t.channel][t.topic][i]===t){this.subscriptions[t.channel][t.topic].splice(i,1);break}i+=1}this.publish({channel:this.configuration.SYSTEM_CHANNEL,topic:"subscription.removed",data:{event:"subscription.removed",channel:t.channel,topic:t.topic}})},addWireTap:function(t){var n=this;return n.wireTaps.push(t),function(){var i=n.wireTaps.indexOf(t);-1!==i&&n.wireTaps.splice(i,1)}},linkChannels:function(n,i){var e=[],r=this;return n=t.isArray(n)?n:[n],i=t.isArray(i)?i:[i],t.each(n,function(n){var o=n.topic||"#";t.each(i,function(i){var c=i.channel||r.configuration.DEFAULT_CHANNEL;e.push(r.subscribe({channel:n.channel||r.configuration.DEFAULT_CHANNEL,topic:o,callback:function(n,e){var o=t.clone(e);o.topic=t.isFunction(i.topic)?i.topic(e.topic):i.topic||e.topic,o.channel=c,o.data=n,r.publish(o)}}))})}),e},noConflict:function(){if("undefined"==typeof window)throw new Error("noConflict can only be used in browser clients which aren't using AMD modules");return n.postal=e,this},getSubscribersFor:function(){var t=arguments[0],n=arguments[1];return 1===arguments.length&&(t=arguments[0].channel||this.configuration.DEFAULT_CHANNEL,n=arguments[0].topic),this.subscriptions[t]&&Object.prototype.hasOwnProperty.call(this.subscriptions[t],n)?this.subscriptions[t][n]:[]},reset:function(){this.subscriptions&&(t.each(this.subscriptions,function(n){t.each(n,function(t){for(;t.length;)t.pop().unsubscribe()})}),this.subscriptions={}),this.configuration.resolver.reset()}},i.subscriptions[i.configuration.SYSTEM_CHANNEL]={},n&&Object.prototype.hasOwnProperty.call(n,"__postalReady__")&&t.isArray(n.__postalReady__))for(;n.__postalReady__.length;)n.__postalReady__.shift().onReady(i);return i}); \ No newline at end of file +(function(t,n){"object"==typeof module&&module.exports?module.exports=n(require("underscore"),this):"function"==typeof define&&define.amd?define(["underscore"],function(i){return n(i,t)}):t.postal=n(t._,t)})(this,function(t,n){var i,e=n.postal,r=function(t){if("function"!=typeof t.target)throw new Error("You can only make functions into Conduits.");var n={pre:t.pre||[],post:t.post||[],all:[]},i=t.context,e={isTarget:!0,fn:function(n){var e=Array.prototype.slice.call(arguments,1);t.target.apply(i,e),n.apply(this,e)}},r=function(){n.all=n.pre.concat([e].concat(n.post))};r();var o=function(){var t=0,e=function r(){var e,o=Array.prototype.slice.call(arguments,0),c=t;t+=1,c=n)throw"The value provided to disposeAfter (maxCalls) must be a number greater than zero.";var e=t.after(n,i);return{name:"stopAfter",fn:function(t,n,i){e(),t(n,i)}}},withThrottle:function(n){if(t.isNaN(n))throw"Milliseconds must be a number";return{name:"withThrottle",fn:t.throttle(function(t,n,i){t(n,i)},n)}},withDebounce:function(n,i){if(t.isNaN(n))throw"Milliseconds must be a number";return{name:"debounce",fn:t.debounce(function(t,n,i){t(n,i)},n,!!i)}},withConstraint:function(n){if(!t.isFunction(n))throw"Predicate constraint must be a function";return{name:"withConstraint",fn:function(t,i,e){n.call(this,i,e)&&t.call(this,i,e)}}},distinct:function(t){t=t||{};var n=function(t){return t[0]},i=t.all?new a(n):new s(n);return{name:"distinct",fn:function(t,n,e){i(n)&&t(n,e)}}}};c.prototype.defer=function(){return this.callback.before(u.defer()),this},c.prototype.disposeAfter=function(t){var n=this;return n.callback.before(u.stopAfter(t,function(){n.unsubscribe.call(n)})),n},c.prototype.distinctUntilChanged=function(){return this.callback.before(u.distinct()),this},c.prototype.distinct=function(){return this.callback.before(u.distinct({all:!0})),this},c.prototype.once=function(){return this.disposeAfter(1),this},c.prototype.withConstraint=function(t){return this.callback.before(u.withConstraint(t)),this},c.prototype.withDebounce=function(t,n){return this.callback.before(u.withDebounce(t,n)),this},c.prototype.withDelay=function(t){return this.callback.before(u.withDelay(t)),this},c.prototype.withThrottle=function(t){return this.callback.before(u.withThrottle(t)),this},c.prototype.subscribe=function(t){return this.callback=new r({target:t,context:this}),this},c.prototype.withContext=function(t){return this.callback.context(t),this};var h={cache:{},regex:{},compare:function(n,i){var e,r,o,c=this.cache[i]&&this.cache[i][n];return"undefined"!=typeof c?c:((r=this.regex[n])||(e="^"+t.map(n.split("."),function(t){var n="";return o&&(n="#"!==o?"\\.\\b":"\\b"),n+="#"===t?"[\\s\\S]*":"*"===t?"[^.]+":t,o=t,n}).join("")+"$",r=this.regex[n]=new RegExp(e)),this.cache[i]=this.cache[i]||{},this.cache[i][n]=c=r.test(i),c)},reset:function(){this.cache={},this.regex={}}},l=function(t,n){!t.inactive&&i.configuration.resolver.compare(t.topic,n.topic)&&t.callback.call(t.context||this,n.data,n)},p=0,f=[],b=function(){for(;f.length;)i.unsubscribe(f.shift())};if(i={configuration:{resolver:h,DEFAULT_CHANNEL:"/",SYSTEM_CHANNEL:"postal"},subscriptions:{},wireTaps:[],ChannelDefinition:o,SubscriptionDefinition:c,channel:function(t){return new o(t)},subscribe:function(t){var n,i=new c(t.channel||this.configuration.DEFAULT_CHANNEL,t.topic,t.callback),e=this.subscriptions[i.channel];return this.publish({channel:this.configuration.SYSTEM_CHANNEL,topic:"subscription.created",data:{event:"subscription.created",channel:i.channel,topic:i.topic}}),e||(e=this.subscriptions[i.channel]={}),n=this.subscriptions[i.channel][i.topic],n||(n=this.subscriptions[i.channel][i.topic]=[]),n.push(i),i},publish:function(n){++p,n.channel=n.channel||this.configuration.DEFAULT_CHANNEL,n.timeStamp=new Date,t.each(this.wireTaps,function(t){t(n.data,n)}),this.subscriptions[n.channel]&&t.each(this.subscriptions[n.channel],function(t){for(var i,e=0,r=t.length;r>e;)(i=t[e++])&&l(i,n)}),0===--p&&b()},unsubscribe:function(t){if(p)return void f.push(t);if(this.subscriptions[t.channel]&&this.subscriptions[t.channel][t.topic])for(var n=this.subscriptions[t.channel][t.topic].length,i=0;n>i;){if(this.subscriptions[t.channel][t.topic][i]===t){this.subscriptions[t.channel][t.topic].splice(i,1);break}i+=1}this.publish({channel:this.configuration.SYSTEM_CHANNEL,topic:"subscription.removed",data:{event:"subscription.removed",channel:t.channel,topic:t.topic}})},addWireTap:function(t){var n=this;return n.wireTaps.push(t),function(){var i=n.wireTaps.indexOf(t);-1!==i&&n.wireTaps.splice(i,1)}},noConflict:function(){if("undefined"==typeof window)throw new Error("noConflict can only be used in browser clients which aren't using AMD modules");return n.postal=e,this},getSubscribersFor:function(){var t=arguments[0],n=arguments[1];return 1===arguments.length&&(t=arguments[0].channel||this.configuration.DEFAULT_CHANNEL,n=arguments[0].topic),this.subscriptions[t]&&Object.prototype.hasOwnProperty.call(this.subscriptions[t],n)?this.subscriptions[t][n]:[]},reset:function(){this.subscriptions&&(t.each(this.subscriptions,function(n){t.each(n,function(t){for(;t.length;)t.pop().unsubscribe()})}),this.subscriptions={}),this.configuration.resolver.reset()}},i.subscriptions[i.configuration.SYSTEM_CHANNEL]={},i.linkChannels=function(n,i){var e=[],r=this;return n=t.isArray(n)?n:[n],i=t.isArray(i)?i:[i],t.each(n,function(n){var o=n.topic||"#";t.each(i,function(i){var c=i.channel||r.configuration.DEFAULT_CHANNEL;e.push(r.subscribe({channel:n.channel||r.configuration.DEFAULT_CHANNEL,topic:o,callback:function(n,e){var o=t.clone(e);o.topic=t.isFunction(i.topic)?i.topic(e.topic):i.topic||e.topic,o.channel=c,o.data=n,r.publish(o)}}))})}),e},n&&Object.prototype.hasOwnProperty.call(n,"__postalReady__")&&t.isArray(n.__postalReady__))for(;n.__postalReady__.length;)n.__postalReady__.shift().onReady(i);return i}); \ No newline at end of file diff --git a/spec/basic.html b/spec/basic.html index a258525..a7e5b8f 100644 --- a/spec/basic.html +++ b/spec/basic.html @@ -20,7 +20,6 @@ - diff --git a/src/Api.js b/src/Api.js index 5cd638d..13c6dcc 100644 --- a/src/Api.js +++ b/src/Api.js @@ -112,32 +112,6 @@ _postal = { }; }, - linkChannels : function ( sources, destinations ) { - var result = [], self = this; - sources = !_.isArray( sources ) ? [ sources ] : sources; - destinations = !_.isArray( destinations ) ? [destinations] : destinations; - _.each( sources, function ( source ) { - var sourceTopic = source.topic || "#"; - _.each( destinations, function ( destination ) { - var destChannel = destination.channel || self.configuration.DEFAULT_CHANNEL; - result.push( - self.subscribe( { - channel : source.channel || self.configuration.DEFAULT_CHANNEL, - topic : sourceTopic, - callback : function ( data, env ) { - var newEnv = _.clone( env ); - newEnv.topic = _.isFunction( destination.topic ) ? destination.topic( env.topic ) : destination.topic || env.topic; - newEnv.channel = destChannel; - newEnv.data = data; - self.publish( newEnv ); - } - } ) - ); - }); - }); - return result; - }, - noConflict: function() { if(typeof window === "undefined") { throw new Error("noConflict can only be used in browser clients which aren't using AMD modules"); diff --git a/src/linkChannels.js b/src/linkChannels.js new file mode 100644 index 0000000..ecaa8b0 --- /dev/null +++ b/src/linkChannels.js @@ -0,0 +1,26 @@ +/*global _postal */ +_postal.linkChannels = function ( sources, destinations ) { + var result = [], self = this; + sources = !_.isArray( sources ) ? [ sources ] : sources; + destinations = !_.isArray( destinations ) ? [destinations] : destinations; + _.each( sources, function ( source ) { + var sourceTopic = source.topic || "#"; + _.each( destinations, function ( destination ) { + var destChannel = destination.channel || self.configuration.DEFAULT_CHANNEL; + result.push( + self.subscribe( { + channel : source.channel || self.configuration.DEFAULT_CHANNEL, + topic : sourceTopic, + callback : function ( data, env ) { + var newEnv = _.clone( env ); + newEnv.topic = _.isFunction( destination.topic ) ? destination.topic( env.topic ) : destination.topic || env.topic; + newEnv.channel = destChannel; + newEnv.data = data; + self.publish( newEnv ); + } + } ) + ); + }); + }); + return result; +}; \ No newline at end of file diff --git a/src/postal.js b/src/postal.js index cbb374f..37c9e22 100644 --- a/src/postal.js +++ b/src/postal.js @@ -23,6 +23,7 @@ //import("strategies.js"); //import("AmqpBindingsResolver.js"); //import("Api.js"); + //import("linkChannels.js"); /*jshint -W106 */ if ( global && Object.prototype.hasOwnProperty.call( global, "__postalReady__" ) && _.isArray( global.__postalReady__ ) ) {