From eaccef227efa38de3b31a4d25b2437ba4d2f24fb Mon Sep 17 00:00:00 2001 From: ifandelse Date: Fri, 24 Jan 2014 00:09:12 -0500 Subject: [PATCH] Refactored where subscription created and removed messages are published. Added unsubscribe to postal object. --- lib/postal.js | 50 ++++++++++++++++------------- lib/postal.min.js | 2 +- spec/subscriptionDefinition.spec.js | 39 +++++----------------- src/Api.js | 25 ++++++++++++++- src/ChannelDefinition.js | 4 +-- src/SubscriptionDefinition.js | 21 +----------- 6 files changed, 63 insertions(+), 78 deletions(-) diff --git a/lib/postal.js b/lib/postal.js index b424bd0..5ed58e0 100644 --- a/lib/postal.js +++ b/lib/postal.js @@ -66,7 +66,7 @@ }; ChannelDefinition.prototype.subscribe = function () { - return arguments.length === 1 ? new SubscriptionDefinition(this.channel, arguments[0].topic, arguments[0].callback) : new SubscriptionDefinition(this.channel, arguments[0], arguments[1]); + return postal.subscribe(arguments.length === 1 ? new SubscriptionDefinition(this.channel, arguments[0].topic, arguments[0].callback) : new SubscriptionDefinition(this.channel, arguments[0], arguments[1])); }; ChannelDefinition.prototype.publish = function () { @@ -93,32 +93,13 @@ this.callback = callback; this.constraints = []; this.context = null; - postal.configuration.bus.publish({ - channel: postal.configuration.SYSTEM_CHANNEL, - topic: "subscription.created", - data: { - event: "subscription.created", - channel: channel, - topic: topic - } - }); - postal.configuration.bus.subscribe(this); }; SubscriptionDefinition.prototype = { unsubscribe: function () { if (!this.inactive) { this.inactive = true; - postal.configuration.bus.unsubscribe(this); - postal.configuration.bus.publish({ - channel: postal.configuration.SYSTEM_CHANNEL, - topic: "subscription.removed", - data: { - event: "subscription.removed", - channel: this.channel, - topic: this.topic - } - }); + postal.unsubscribe(this); } }, @@ -357,7 +338,7 @@ unSubQueue.push(config); return; } - if (this.subscriptions[config.channel][config.topic]) { + if (this.subscriptions[config.channel] && this.subscriptions[config.channel][config.topic]) { var len = this.subscriptions[config.channel][config.topic].length, idx = 0; while (idx < len) { @@ -388,7 +369,17 @@ }, subscribe: function (options) { - return new SubscriptionDefinition(options.channel || postal.configuration.DEFAULT_CHANNEL, options.topic, options.callback); + var subDef = new SubscriptionDefinition(options.channel || postal.configuration.DEFAULT_CHANNEL, options.topic, options.callback); + postal.configuration.bus.publish({ + channel: postal.configuration.SYSTEM_CHANNEL, + topic: "subscription.created", + data: { + event: "subscription.created", + channel: subDef.channel, + topic: subDef.topic + } + }); + return postal.configuration.bus.subscribe(subDef); }, publish: function (envelope) { @@ -396,6 +387,19 @@ return postal.configuration.bus.publish(envelope); }, + unsubscribe: function (subdef) { + postal.configuration.bus.unsubscribe(subdef); + postal.configuration.bus.publish({ + channel: postal.configuration.SYSTEM_CHANNEL, + topic: "subscription.removed", + data: { + event: "subscription.removed", + channel: subdef.channel, + topic: subdef.topic + } + }); + }, + addWireTap: function (callback) { return this.configuration.bus.addWireTap(callback); }, diff --git a/lib/postal.min.js b/lib/postal.min.js index fce34ce..9474c60 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(n,t){"object"==typeof module&&module.exports?module.exports=function(n){return n=n||require("underscore"),t(n,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(){var t;return function(i){var e=!1;return n.isString(i)?(e=i===t,t=i):(e=n.isEqual(i,t),t=n.clone(i)),!e}},c=function(){var t=[];return function(i){var e=!n.any(t,function(t){return n.isObject(i)||n.isArray(i)?n.isEqual(i,t):i===t});return e&&t.push(i),e}},r=function(n){this.channel=n||i.configuration.DEFAULT_CHANNEL};r.prototype.subscribe=function(){return 1===arguments.length?new o(this.channel,arguments[0].topic,arguments[0].callback):new o(this.channel,arguments[0],arguments[1])},r.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]};return n.channel=this.channel,i.configuration.bus.publish(n)};var o=function(n,t,e){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.callback=e,this.constraints=[],this.context=null,i.configuration.bus.publish({channel:i.configuration.SYSTEM_CHANNEL,topic:"subscription.created",data:{event:"subscription.created",channel:n,topic:t}}),i.configuration.bus.subscribe(this)};o.prototype={unsubscribe:function(){this.inactive||(this.inactive=!0,i.configuration.bus.unsubscribe(this),i.configuration.bus.publish({channel:i.configuration.SYSTEM_CHANNEL,topic:"subscription.removed",data:{event:"subscription.removed",channel:this.channel,topic:this.topic}}))},defer:function(){var n=this,t=this.callback;return this.callback=function(i,e){setTimeout(function(){t.call(n.context,i,e)},0)},this},disposeAfter:function(t){if(n.isNaN(t)||0>=t)throw"The value provided to disposeAfter (maxCalls) must be a number greater than zero.";var i=this,e=this.callback,s=n.after(t,n.bind(function(){this.unsubscribe()},this));return this.callback=function(){e.apply(i.context,arguments),s()},this},distinctUntilChanged:function(){return this.withConstraint(new s),this},distinct:function(){return this.withConstraint(new c),this},once:function(){return this.disposeAfter(1),this},withConstraint:function(t){if(!n.isFunction(t))throw"Predicate constraint must be a function";return this.constraints.push(t),this},withConstraints:function(t){var i=this;return n.isArray(t)&&n.each(t,function(n){i.withConstraint(n)}),i},withContext:function(n){return this.context=n,this},withDebounce:function(t,i){if(n.isNaN(t))throw"Milliseconds must be a number";var e=this.callback;return this.callback=n.debounce(e,t,!!i),this},withDelay:function(t){if(n.isNaN(t))throw"Milliseconds must be a number";var i=this,e=this.callback;return this.callback=function(n,s){setTimeout(function(){e.call(i.context,n,s)},t)},this},withThrottle:function(t,i){if(i=i||{},n.isNaN(t))throw"Milliseconds must be a number";var e=this.callback;return this.callback=n.throttle(e,t,i),this},subscribe:function(n){return this.callback=n,this}};var a={cache:{},regex:{},compare:function(t,i){var e,s,c,r=this.cache[i]&&this.cache[i][t];return"undefined"!=typeof r?r:((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]=r=s.test(i),r)},reset:function(){this.cache={},this.regex={}}},u=function(t,e){!t.inactive&&i.configuration.resolver.compare(t.topic,e.topic)&&n.all(t.constraints,function(n){return n.call(t.context,e.data,e)})&&"function"==typeof t.callback&&t.callback.call(t.context,e.data,e)},h=0,l=[],f=function(){for(;l.length;)p.unsubscribe(l.shift())},p={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)}},publish:function(t){return++h,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++])&&u(i,t)}),0===--h&&f(),t},reset:function(){this.subscriptions&&(n.each(this.subscriptions,function(t){n.each(t,function(n){for(;n.length;)n.pop().unsubscribe()})}),this.subscriptions={})},subscribe:function(n){var t,i=this.subscriptions[n.channel];return i||(i=this.subscriptions[n.channel]={}),t=this.subscriptions[n.channel][n.topic],t||(t=this.subscriptions[n.channel][n.topic]=[]),t.push(n),n},subscriptions:{},wireTaps:[],unsubscribe:function(n){if(h)return void l.push(n);if(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}}};if(i={configuration:{bus:p,resolver:a,DEFAULT_CHANNEL:"/",SYSTEM_CHANNEL:"postal"},ChannelDefinition:r,SubscriptionDefinition:o,channel:function(n){return new r(n)},subscribe:function(n){return new o(n.channel||i.configuration.DEFAULT_CHANNEL,n.topic,n.callback)},publish:function(n){return n.channel=n.channel||i.configuration.DEFAULT_CHANNEL,i.configuration.bus.publish(n)},addWireTap:function(n){return this.configuration.bus.addWireTap(n)},linkChannels:function(t,e){var s=[];return t=n.isArray(t)?t:[t],e=n.isArray(e)?e:[e],n.each(t,function(t){var c=t.topic||"#";n.each(e,function(e){var r=e.channel||i.configuration.DEFAULT_CHANNEL;s.push(i.subscribe({channel:t.channel||i.configuration.DEFAULT_CHANNEL,topic:c,callback:function(t,s){var c=n.clone(s);c.topic=n.isFunction(e.topic)?e.topic(s.topic):e.topic||s.topic,c.channel=r,c.data=t,i.publish(c)}}))})}),s},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},utils:{getSubscribersFor:function(){var n=arguments[0],t=arguments[1];return 1===arguments.length&&(n=arguments[0].channel||i.configuration.DEFAULT_CHANNEL,t=arguments[0].topic),i.configuration.bus.subscriptions[n]&&Object.prototype.hasOwnProperty.call(i.configuration.bus.subscriptions[n],t)?i.configuration.bus.subscriptions[n][t]:[]},reset:function(){i.configuration.bus.reset(),i.configuration.resolver.reset()}}},p.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=function(n){return n=n||require("underscore"),t(n,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,s=t.postal,e=function(){var t;return function(i){var s=!1;return n.isString(i)?(s=i===t,t=i):(s=n.isEqual(i,t),t=n.clone(i)),!s}},c=function(){var t=[];return function(i){var s=!n.any(t,function(t){return n.isObject(i)||n.isArray(i)?n.isEqual(i,t):i===t});return s&&t.push(i),s}},r=function(n){this.channel=n||i.configuration.DEFAULT_CHANNEL};r.prototype.subscribe=function(){return i.subscribe(1===arguments.length?new o(this.channel,arguments[0].topic,arguments[0].callback):new o(this.channel,arguments[0],arguments[1]))},r.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]};return n.channel=this.channel,i.configuration.bus.publish(n)};var o=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.callback=i,this.constraints=[],this.context=null};o.prototype={unsubscribe:function(){this.inactive||(this.inactive=!0,i.unsubscribe(this))},defer:function(){var n=this,t=this.callback;return this.callback=function(i,s){setTimeout(function(){t.call(n.context,i,s)},0)},this},disposeAfter:function(t){if(n.isNaN(t)||0>=t)throw"The value provided to disposeAfter (maxCalls) must be a number greater than zero.";var i=this,s=this.callback,e=n.after(t,n.bind(function(){this.unsubscribe()},this));return this.callback=function(){s.apply(i.context,arguments),e()},this},distinctUntilChanged:function(){return this.withConstraint(new e),this},distinct:function(){return this.withConstraint(new c),this},once:function(){return this.disposeAfter(1),this},withConstraint:function(t){if(!n.isFunction(t))throw"Predicate constraint must be a function";return this.constraints.push(t),this},withConstraints:function(t){var i=this;return n.isArray(t)&&n.each(t,function(n){i.withConstraint(n)}),i},withContext:function(n){return this.context=n,this},withDebounce:function(t,i){if(n.isNaN(t))throw"Milliseconds must be a number";var s=this.callback;return this.callback=n.debounce(s,t,!!i),this},withDelay:function(t){if(n.isNaN(t))throw"Milliseconds must be a number";var i=this,s=this.callback;return this.callback=function(n,e){setTimeout(function(){s.call(i.context,n,e)},t)},this},withThrottle:function(t,i){if(i=i||{},n.isNaN(t))throw"Milliseconds must be a number";var s=this.callback;return this.callback=n.throttle(s,t,i),this},subscribe:function(n){return this.callback=n,this}};var a={cache:{},regex:{},compare:function(t,i){var s,e,c,r=this.cache[i]&&this.cache[i][t];return"undefined"!=typeof r?r:((e=this.regex[t])||(s="^"+n.map(t.split("."),function(n){var t="";return c&&(t="#"!==c?"\\.\\b":"\\b"),t+="#"===n?"[\\s\\S]*":"*"===n?"[^.]+":n,c=n,t}).join("")+"$",e=this.regex[t]=new RegExp(s)),this.cache[i]=this.cache[i]||{},this.cache[i][t]=r=e.test(i),r)},reset:function(){this.cache={},this.regex={}}},u=function(t,s){!t.inactive&&i.configuration.resolver.compare(t.topic,s.topic)&&n.all(t.constraints,function(n){return n.call(t.context,s.data,s)})&&"function"==typeof t.callback&&t.callback.call(t.context,s.data,s)},h=0,l=[],f=function(){for(;l.length;)p.unsubscribe(l.shift())},p={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)}},publish:function(t){return++h,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,s=0,e=n.length;e>s;)(i=n[s++])&&u(i,t)}),0===--h&&f(),t},reset:function(){this.subscriptions&&(n.each(this.subscriptions,function(t){n.each(t,function(n){for(;n.length;)n.pop().unsubscribe()})}),this.subscriptions={})},subscribe:function(n){var t,i=this.subscriptions[n.channel];return i||(i=this.subscriptions[n.channel]={}),t=this.subscriptions[n.channel][n.topic],t||(t=this.subscriptions[n.channel][n.topic]=[]),t.push(n),n},subscriptions:{},wireTaps:[],unsubscribe:function(n){if(h)return void l.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}}};if(i={configuration:{bus:p,resolver:a,DEFAULT_CHANNEL:"/",SYSTEM_CHANNEL:"postal"},ChannelDefinition:r,SubscriptionDefinition:o,channel:function(n){return new r(n)},subscribe:function(n){var t=new o(n.channel||i.configuration.DEFAULT_CHANNEL,n.topic,n.callback);return i.configuration.bus.publish({channel:i.configuration.SYSTEM_CHANNEL,topic:"subscription.created",data:{event:"subscription.created",channel:t.channel,topic:t.topic}}),i.configuration.bus.subscribe(t)},publish:function(n){return n.channel=n.channel||i.configuration.DEFAULT_CHANNEL,i.configuration.bus.publish(n)},unsubscribe:function(n){i.configuration.bus.unsubscribe(n),i.configuration.bus.publish({channel:i.configuration.SYSTEM_CHANNEL,topic:"subscription.removed",data:{event:"subscription.removed",channel:n.channel,topic:n.topic}})},addWireTap:function(n){return this.configuration.bus.addWireTap(n)},linkChannels:function(t,s){var e=[];return t=n.isArray(t)?t:[t],s=n.isArray(s)?s:[s],n.each(t,function(t){var c=t.topic||"#";n.each(s,function(s){var r=s.channel||i.configuration.DEFAULT_CHANNEL;e.push(i.subscribe({channel:t.channel||i.configuration.DEFAULT_CHANNEL,topic:c,callback:function(t,e){var c=n.clone(e);c.topic=n.isFunction(s.topic)?s.topic(e.topic):s.topic||e.topic,c.channel=r,c.data=t,i.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=s,this},utils:{getSubscribersFor:function(){var n=arguments[0],t=arguments[1];return 1===arguments.length&&(n=arguments[0].channel||i.configuration.DEFAULT_CHANNEL,t=arguments[0].topic),i.configuration.bus.subscriptions[n]&&Object.prototype.hasOwnProperty.call(i.configuration.bus.subscriptions[n],t)?i.configuration.bus.subscriptions[n][t]:[]},reset:function(){i.configuration.bus.reset(),i.configuration.resolver.reset()}}},p.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/spec/subscriptionDefinition.spec.js b/spec/subscriptionDefinition.spec.js index b725582..9e73bdf 100644 --- a/spec/subscriptionDefinition.spec.js +++ b/spec/subscriptionDefinition.spec.js @@ -6,28 +6,12 @@ var SubscriptionDefinition = postal.SubscriptionDefinition; describe( "SubscriptionDefinition", function () { describe( "When initializing SubscriptionDefinition", function () { - var sDef, - caughtSubscribeEvent, - systemSubscription; + var sDef; before( function () { - systemSubscription = postal.subscribe( { - channel : "postal", - topic : "subscription.created", - callback : function ( data, envelope ) { - if ( data.event && - data.event === "subscription.created" && - data.channel === "SubDefTestChannel" && - data.topic === "SubDefTestTopic" ) { - caughtSubscribeEvent = true; - } - } - } ); sDef = new SubscriptionDefinition( "SubDefTestChannel", "SubDefTestTopic", NO_OP ); } ); after( function () { sDef.unsubscribe(); - systemSubscription.unsubscribe(); - caughtSubscribeEvent = false; } ); it( "should set the channel to SubDefTestChannel", function () { expect( sDef.channel ).to.be( "SubDefTestChannel" ); @@ -44,9 +28,6 @@ it( "should default the context", function () { expect( sDef.context ).to.be( null ); } ); - it( "should fire the subscription.created message", function () { - expect( caughtSubscribeEvent ).to.be( true ); - } ); } ); describe( "When setting distinctUntilChanged", function () { @@ -67,10 +48,12 @@ } ); describe( "When adding multiple constraints", function () { - var sDefc = new SubscriptionDefinition( "TestChannel", "TestTopic", NO_OP ).withConstraints( [function () { - }, function () { - }, function () { - }] ); + var sDefc = new SubscriptionDefinition( "TestChannel", "TestTopic", NO_OP ) + .withConstraints( [ + function () {}, + function () {}, + function () {} + ]); it( "Should add a constraint", function () { expect( sDefc.constraints.length ).to.be( 3 ); @@ -87,20 +70,14 @@ return true; } ); - postal.publish( { channel : "TestChannel", topic : "TestTopic", data : "Oh, hai"} ); - it( "Should set context", function () { expect( sDefd.context ).to.be( obj ); } ); - it( "Should apply context to predicate/constraint", function () { - expect( name ).to.be( "Rose" ); - } ); } ); describe( "When calling subscribe to set the callback", function () { var sDefe = new SubscriptionDefinition( "TestChannel", "TestTopic", NO_OP ), - fn = function () { - }; + fn = function () {}; sDefe.subscribe( fn ); it( "Should set the callback", function () { diff --git a/src/Api.js b/src/Api.js index 2197518..a3be77d 100644 --- a/src/Api.js +++ b/src/Api.js @@ -16,7 +16,17 @@ postal = { }, subscribe : function ( options ) { - return new SubscriptionDefinition( options.channel || postal.configuration.DEFAULT_CHANNEL, options.topic, options.callback ); + var subDef = new SubscriptionDefinition( options.channel || postal.configuration.DEFAULT_CHANNEL, options.topic, options.callback ); + postal.configuration.bus.publish( { + channel : postal.configuration.SYSTEM_CHANNEL, + topic : "subscription.created", + data : { + event : "subscription.created", + channel : subDef.channel, + topic : subDef.topic + } + } ); + return postal.configuration.bus.subscribe( subDef ); }, publish : function ( envelope ) { @@ -24,6 +34,19 @@ postal = { return postal.configuration.bus.publish( envelope ); }, + unsubscribe: function( subdef ) { + postal.configuration.bus.unsubscribe( subdef ); + postal.configuration.bus.publish( { + channel : postal.configuration.SYSTEM_CHANNEL, + topic : "subscription.removed", + data : { + event : "subscription.removed", + channel : subdef.channel, + topic : subdef.topic + } + }); + }, + addWireTap : function ( callback ) { return this.configuration.bus.addWireTap( callback ); }, diff --git a/src/ChannelDefinition.js b/src/ChannelDefinition.js index 612e4a2..c20260d 100644 --- a/src/ChannelDefinition.js +++ b/src/ChannelDefinition.js @@ -4,9 +4,9 @@ var ChannelDefinition = function ( channelName ) { }; ChannelDefinition.prototype.subscribe = function () { - return arguments.length === 1 ? + return postal.subscribe(arguments.length === 1 ? new SubscriptionDefinition( this.channel, arguments[0].topic, arguments[0].callback ) : - new SubscriptionDefinition( this.channel, arguments[0], arguments[1] ); + new SubscriptionDefinition( this.channel, arguments[0], arguments[1] )); }; ChannelDefinition.prototype.publish = function () { diff --git a/src/SubscriptionDefinition.js b/src/SubscriptionDefinition.js index 920795c..f670d1e 100644 --- a/src/SubscriptionDefinition.js +++ b/src/SubscriptionDefinition.js @@ -12,32 +12,13 @@ var SubscriptionDefinition = function ( channel, topic, callback ) { this.callback = callback; this.constraints = []; this.context = null; - postal.configuration.bus.publish( { - channel : postal.configuration.SYSTEM_CHANNEL, - topic : "subscription.created", - data : { - event : "subscription.created", - channel : channel, - topic : topic - } - } ); - postal.configuration.bus.subscribe( this ); }; SubscriptionDefinition.prototype = { unsubscribe : function () { if ( !this.inactive ) { this.inactive = true; - postal.configuration.bus.unsubscribe( this ); - postal.configuration.bus.publish( { - channel : postal.configuration.SYSTEM_CHANNEL, - topic : "subscription.removed", - data : { - event : "subscription.removed", - channel : this.channel, - topic : this.topic - } - } ); + postal.unsubscribe( this ); } },