From 8d0c8d361ec07421d486b4cbcb08aed2f7f8e756 Mon Sep 17 00:00:00 2001 From: Alex Robson Date: Wed, 22 Feb 2012 16:41:34 -0500 Subject: [PATCH 1/2] Adding subscribtion-created, subcsription-removed event publishes to wiretaps on subscribe/unsubscribe. --- spec/Postal.spec.js | 29 +++++++++++++++++++++++++++-- src/main/LocalBus.js | 20 +++++++++++++++++--- 2 files changed, 44 insertions(+), 5 deletions(-) diff --git a/spec/Postal.spec.js b/spec/Postal.spec.js index cf16168..9459bdb 100644 --- a/spec/Postal.spec.js +++ b/spec/Postal.spec.js @@ -2,9 +2,18 @@ QUnit.specify("postal.js", function(){ describe("Postal", function(){ var subscription, sub, - channel; + channel, + gotSubscriptionFromTap; describe("when creating basic subscription", function() { before(function(){ + postal.addWireTap(function(x,y){ + if( x.event && + x.event == "subscription-created" && + x.exchange == "MyExchange" && + x.topic == "MyTopic") { + gotSubscriptionFromTap = true; + } + }); subscription = postal.channel("MyExchange","MyTopic") .subscribe(function() { }); sub = postal.configuration.bus.subscriptions.MyExchange.MyTopic[0]; @@ -36,11 +45,24 @@ QUnit.specify("postal.js", function(){ it("should have defaulted the subscription context value", function() { assert(sub.context).isNull(); }); + it("should have captured subscription creation event in wire-tap", function() { + assert(gotSubscriptionFromTap).isTrue(); + }); }); describe("when unsubscribing", function() { var subExistsBefore = false, - subExistsAfter = true; + subExistsAfter = true, + gotUnsubscriptionFromTap = false; + before(function(){ + postal.addWireTap(function(x,y){ + if( x.event && + x.event == "subscription-removed" && + x.exchange == "MyExchange" && + x.topic == "MyTopic") { + gotUnsubscriptionFromTap = true; + } + }); subscription = postal.channel("MyExchange","MyTopic") .subscribe(function() { }); subExistsBefore = postal.configuration.bus.subscriptions.MyExchange.MyTopic[0] !== undefined; @@ -56,6 +78,9 @@ QUnit.specify("postal.js", function(){ it("subscription should not exist after unsubscribe", function(){ assert(subExistsAfter).isFalse(); }); + it("should have captured unsubscription creation event in wire-tap", function() { + assert(gotUnsubscriptionFromTap).isTrue(); + }); }); describe("When publishing a message", function(){ var msgReceivedCnt = 0, diff --git a/src/main/LocalBus.js b/src/main/LocalBus.js index 6eeb0de..ecc01df 100644 --- a/src/main/LocalBus.js +++ b/src/main/LocalBus.js @@ -5,9 +5,7 @@ var localBus = { wireTaps: [], publish: function(data, envelope) { - _.each(this.wireTaps,function(tap) { - tap(data, envelope); - }); + this.notifyTaps(data, envelope); _.each(this.subscriptions[envelope.exchange], function(topic) { _.each(topic, function(binding){ @@ -44,16 +42,32 @@ var localBus = { } if(!found) { this.subscriptions[subDef.exchange][subDef.topic].unshift(subDef); + this.notifyTaps({ + event: "subscription-created", + exchange: subDef.exchange, + topic: subDef.topic + }, {}); } } return _.bind(function() { this.unsubscribe(subDef); }, this); }, + notifyTaps: function(data, envelope) { + _.each(this.wireTaps,function(tap) { + tap(data, envelope); + }); + }, + unsubscribe: function(config) { if(this.subscriptions[config.exchange][config.topic]) { var len = this.subscriptions[config.exchange][config.topic].length, idx = 0; + this.notifyTaps({ + event: "subscription-removed", + exchange: config.exchange, + topic: config.topic + }, {}); for ( ; idx < len; idx++ ) { if (this.subscriptions[config.exchange][config.topic][idx] === config) { this.subscriptions[config.exchange][config.topic].splice( idx, 1 ); From 76c0cf337b5320be72aa97457458d1cbf818b204 Mon Sep 17 00:00:00 2001 From: Alex Robson Date: Wed, 22 Feb 2012 22:33:15 -0500 Subject: [PATCH 2/2] Changing subscription notifications to a message on the postal channel --- spec/Postal.spec.js | 35 ++++++++++++++++++------------ src/main/Constants.js | 1 + src/main/LocalBus.js | 10 --------- src/main/SubscriptionDefinition.js | 13 +++++++++++ 4 files changed, 35 insertions(+), 24 deletions(-) diff --git a/spec/Postal.spec.js b/spec/Postal.spec.js index 9459bdb..a178ace 100644 --- a/spec/Postal.spec.js +++ b/spec/Postal.spec.js @@ -3,22 +3,28 @@ QUnit.specify("postal.js", function(){ var subscription, sub, channel, - gotSubscriptionFromTap; + caughtSubscribeEvent = false, + caughtUnsubscribeEvent = false; + describe("when creating basic subscription", function() { + var systemSubscription = {}; before(function(){ - postal.addWireTap(function(x,y){ + + systemSubscription = postal.subscribe( "postal", "subscription.created", function(x){ + console.log("on subscription " + JSON.stringify(x)); if( x.event && - x.event == "subscription-created" && + x.event == "subscription.created" && x.exchange == "MyExchange" && x.topic == "MyTopic") { - gotSubscriptionFromTap = true; - } + caughtSubscribeEvent = true; + }; }); subscription = postal.channel("MyExchange","MyTopic") .subscribe(function() { }); sub = postal.configuration.bus.subscriptions.MyExchange.MyTopic[0]; }); after(function(){ + systemSubscription.unsubscribe(); postal.configuration.bus.subscriptions = {}; }); it("should create an exchange called MyExchange", function(){ @@ -46,22 +52,22 @@ QUnit.specify("postal.js", function(){ assert(sub.context).isNull(); }); it("should have captured subscription creation event in wire-tap", function() { - assert(gotSubscriptionFromTap).isTrue(); + assert(caughtSubscribeEvent).isTrue(); }); }); describe("when unsubscribing", function() { var subExistsBefore = false, - subExistsAfter = true, - gotUnsubscriptionFromTap = false; - + subExistsAfter = true; + var systemSubscription = {}; before(function(){ - postal.addWireTap(function(x,y){ + systemSubscription = postal.subscribe( "postal", "subscription.*", function(x){ + console.log("on unsubscription " + JSON.stringify(x)); if( x.event && - x.event == "subscription-removed" && + x.event == "subscription.removed" && x.exchange == "MyExchange" && x.topic == "MyTopic") { - gotUnsubscriptionFromTap = true; - } + caughtUnsubscribeEvent = true; + }; }); subscription = postal.channel("MyExchange","MyTopic") .subscribe(function() { }); @@ -70,6 +76,7 @@ QUnit.specify("postal.js", function(){ subExistsAfter = postal.configuration.bus.subscriptions.MyExchange.MyTopic.length !== 0; }); after(function(){ + systemSubscription.unsubscribe(); postal.configuration.bus.subscriptions = {}; }); it("subscription should exist before unsubscribe", function(){ @@ -79,7 +86,7 @@ QUnit.specify("postal.js", function(){ assert(subExistsAfter).isFalse(); }); it("should have captured unsubscription creation event in wire-tap", function() { - assert(gotUnsubscriptionFromTap).isTrue(); + assert(caughtUnsubscribeEvent).isTrue(); }); }); describe("When publishing a message", function(){ diff --git a/src/main/Constants.js b/src/main/Constants.js index 447453a..a44bbe8 100644 --- a/src/main/Constants.js +++ b/src/main/Constants.js @@ -1,6 +1,7 @@ var DEFAULT_EXCHANGE = "/", DEFAULT_PRIORITY = 50, DEFAULT_DISPOSEAFTER = 0, + SYSTEM_EXCHANGE = "postal", NO_OP = function() { }, parsePublishArgs = function(args) { var parsed = { envelope: { } }, env; diff --git a/src/main/LocalBus.js b/src/main/LocalBus.js index ecc01df..2a4734e 100644 --- a/src/main/LocalBus.js +++ b/src/main/LocalBus.js @@ -42,11 +42,6 @@ var localBus = { } if(!found) { this.subscriptions[subDef.exchange][subDef.topic].unshift(subDef); - this.notifyTaps({ - event: "subscription-created", - exchange: subDef.exchange, - topic: subDef.topic - }, {}); } } @@ -63,11 +58,6 @@ var localBus = { if(this.subscriptions[config.exchange][config.topic]) { var len = this.subscriptions[config.exchange][config.topic].length, idx = 0; - this.notifyTaps({ - event: "subscription-removed", - exchange: config.exchange, - topic: config.topic - }, {}); for ( ; idx < len; idx++ ) { if (this.subscriptions[config.exchange][config.topic][idx] === config) { this.subscriptions[config.exchange][config.topic].splice( idx, 1 ); diff --git a/src/main/SubscriptionDefinition.js b/src/main/SubscriptionDefinition.js index 9f55dd7..cab8af3 100644 --- a/src/main/SubscriptionDefinition.js +++ b/src/main/SubscriptionDefinition.js @@ -7,11 +7,24 @@ var SubscriptionDefinition = function(exchange, topic, callback) { this.maxCalls = DEFAULT_DISPOSEAFTER; this.onHandled = NO_OP; this.context = null; + + postal.publish(SYSTEM_EXCHANGE, "subscription.created", + { + event: "subscription.created", + exchange: exchange, + topic: topic + }); }; SubscriptionDefinition.prototype = { unsubscribe: function() { postal.configuration.bus.unsubscribe(this); + postal.publish(SYSTEM_EXCHANGE, "subscription.removed", + { + event: "subscription.removed", + exchange: this.exchange, + topic: this.topic + }); }, defer: function() {