diff --git a/lib/pubsub.js b/lib/pubsub.js index f1363aa..7ab9ae9 100644 --- a/lib/pubsub.js +++ b/lib/pubsub.js @@ -20,6 +20,8 @@ var pub_sub_event_emitter = false; var do_publish = false; +var is_subscribed = false; + /** * Publish something on the nohm client. */ @@ -42,23 +44,18 @@ var publish = function (channel, payload, parse) { var initializePubSub = function initializePubSub (callback) { - if (!pub_sub_client) { return Nohm.logError('A second redis client must be specified to use pub/sub methods. Please declare one.'); - } else if (pub_sub_client.subscriptions === true) { - /** - * This will break in the next node_redis version and we'll have to update to - * pub_sub_client.pub_sub_mode - * - * Should cause all pubsub tests to fail, so will be relatively easy to spot. - */ + } else if (is_subscribed === true) { // already in pubsub mode, don't need to initialize it again. if (typeof(callback) === 'function') { callback(); } return; } - + + is_subscribed = true; + pub_sub_all_pattern = Nohm.prefix.channel + '*:*'; pub_sub_event_emitter = new EventEmitter(); pub_sub_event_emitter.setMaxListeners(0); @@ -88,9 +85,9 @@ var initializePubSub = function initializePubSub (callback) { Nohm.logError('A published message is not valid JSON. Was : "'+message+'"'); return; } - + pub_sub_event_emitter.emit(modelName+':'+action, payload); - pub_sub_event_emitter.emit(modelName+':all', action, payload); + //pub_sub_event_emitter.emit(modelName+':all', action, payload); }); }; @@ -105,7 +102,9 @@ var initialize = function () { */ Nohm.setPubSubClient = function (client, callback) { pub_sub_client = client; - initializePubSub(callback); + Nohm.closePubSub(function () { + initializePubSub(callback); + }); }; /** @@ -121,7 +120,8 @@ var initialize = function () { * @param {Function} callback Called after the unsubscibe. Parameters: redisClient */ Nohm.closePubSub = function closePubSub (callback) { - if (pub_sub_client.subscriptions === true) { + if (is_subscribed === true) { + is_subscribed = false; pub_sub_client.punsubscribe(pub_sub_all_pattern, function () { callback(null, pub_sub_client); }); @@ -201,7 +201,6 @@ var initialize = function () { composer = messageComposers[event] || messageComposers.defaultComposer; payload = composer.apply(this, arguments); - publish(channel, payload); }; @@ -236,8 +235,10 @@ var initialize = function () { * @param {Function} callback Called every time an event of the provided name is published on this model. */ Nohm.prototype.subscribe = function (event_name, callback) { - initializePubSub(); - pub_sub_event_emitter.on(this.modelName+':'+event_name, callback); + var self = this; + initializePubSub(function () { + pub_sub_event_emitter.on(self.modelName+':'+event_name, callback); + }); }; @@ -248,8 +249,10 @@ var initialize = function () { * @param {Function} callback Called once when an event of the provided name is published on this model and then never again. */ Nohm.prototype.subscribeOnce = function (event_name, callback) { - initializePubSub(); - pub_sub_event_emitter.once(this.modelName+':'+event_name, callback); + var self = this; + initializePubSub(function () { + pub_sub_event_emitter.once(self.modelName+':'+event_name, callback); + }); }; /** diff --git a/lib/relations.js b/lib/relations.js index 0ef4715..d622cb4 100644 --- a/lib/relations.js +++ b/lib/relations.js @@ -72,8 +72,8 @@ exports.getAll = function getAll(objName, name) { * @param {Function} Callback Callback called with (err, num_relations */ exports.numLinks = function numLinks(obj_name, relation_name, callback) { - callback = h.getCallback(arguments), - self = this; + callback = h.getCallback(arguments); + var self = this; relation_name = relation_name && typeof relation_name !== 'function' ? relation_name : 'child'; if (!this.id) { Nohm.logError('Calling numLinks() even though either the object itself or the relation does not have an id.'); diff --git a/test/pubsub/child.js b/test/pubsub/child.js index 610c062..f7d9580 100644 --- a/test/pubsub/child.js +++ b/test/pubsub/child.js @@ -33,7 +33,8 @@ process.on('message', function (msg) { nohm.factory(modelName).subscribe(event, function (change) { process.send({ question: 'subscribe', - answer: change + answer: change, + event: event }) }); break; diff --git a/test/pubsubTests.js b/test/pubsubTests.js index 1fde971..3d98605 100644 --- a/test/pubsubTests.js +++ b/test/pubsubTests.js @@ -16,8 +16,6 @@ var after = function (times, fn) { var error_callback = function (t) { return function (err) { - if (err) - console.log(arguments); t.ok(!err, 'Callback received an error'); }; }; @@ -109,7 +107,7 @@ module.exports = { child.send(request); child.on('message', function (msg) { if (msg.question === request.question) { - callback(msg.answer); + callback(msg); } }); }; @@ -135,11 +133,12 @@ module.exports = { event: 'create', modelName: 'Tester' } - }, function (answer) { + }, function (msg) { + var target = msg.answer.target; t.ok(instance.id.length > 0, 'ID was not set properly before the child returned the event.'); - t.same(instance.id, answer.target.id, 'Id from create event wrong'); - t.same(instance.modelName, answer.target.modelName, 'Modelname from create event wrong'); - t.same(instance.allProperties(), answer.target.properties, 'Properties from create event wrong'); + t.same(instance.id, target.id, 'Id from create event wrong'); + t.same(instance.modelName, target.modelName, 'Modelname from create event wrong'); + t.same(instance.allProperties(), target.properties, 'Properties from create event wrong'); t.done(); }); @@ -158,7 +157,8 @@ module.exports = { event: 'update', modelName: 'Tester' } - }, function (answer) { + }, function (msg) { + var answer = msg.answer; t.ok(instance.id.length > 0, 'ID was not set properly before the child returned the event.'); t.same(instance.id, answer.target.id, 'Id from update event wrong'); t.same(instance.modelName, answer.target.modelName, 'Modelname from update event wrong'); @@ -190,7 +190,8 @@ module.exports = { event: 'save', modelName: 'Tester' } - }, function (answer) { + }, function (msg) { + var answer = msg.answer; t.ok(instance.id.length > 0, 'ID was not set properly before the child returned the event.'); t.same(instance.id, answer.target.id, 'Id from save event wrong'); t.same(instance.modelName, answer.target.modelName, 'Modelname from save event wrong'); @@ -222,7 +223,8 @@ module.exports = { event: 'remove', modelName: 'Tester' } - }, function (answer) { + }, function (msg) { + var answer = msg.answer; t.same(instance.id, 0, 'ID was not reset properly before the child returned the event.'); t.same(old_id, answer.target.id, 'Id from remove event wrong'); t.same(instance.modelName, answer.target.modelName, 'Modelname from remove event wrong'); @@ -251,7 +253,8 @@ module.exports = { event: 'link', modelName: 'Tester' } - }, function (answer) { + }, function (msg) { + var answer = msg.answer; t.ok(instance_child.id.length > 0, 'ID was not set properly before the child returned the event.'); t.same(instance_child.id, answer.child.id, 'Id from link event wrong'); t.same(instance_child.modelName, answer.child.modelName, 'Modelname from link event wrong'); @@ -281,7 +284,8 @@ module.exports = { event: 'unlink', modelName: 'Tester' } - }, function (answer) { + }, function (msg) { + var answer = msg.answer; t.ok(instance_child.id.length > 0, 'ID was not set properly before the child returned the event.'); t.same(instance_child.id, answer.child.id, 'Id from unlink event wrong'); t.same(instance_child.modelName, answer.child.modelName, 'Modelname from unlink event wrong'); @@ -297,7 +301,7 @@ module.exports = { instance_child.save(function (err) { error_callback(t)(err); instance_child.unlink(instance_parent); - instance_child.save(error_callback(t)) + instance_child.save(error_callback(t)); }); }, @@ -314,7 +318,8 @@ module.exports = { event: 'create', modelName: 'Tester' } - }, function (answer) { + }, function (msg) { + var answer = msg.answer; once_done++; t.ok(instance.id.length > 0, 'ID was not set properly before the child returned the event.'); t.same(instance.id, answer.target.id, 'Id from createOnce event wrong'); @@ -332,6 +337,55 @@ module.exports = { }); instance.save(error_callback(t)); + }, + + 'silenced': function (t) { + t.expect(6); + var self = this; + var instance = nohm.factory('Tester'); + instance.p('dummy', 'silenced'); + var answered = false; + + var events = ['create', 'update', 'save', 'remove', 'link', 'unlink']; + + events.forEach(function (event) { + self.child.ask({ + question: 'subscribe', + args: { + event: event, + modelName: 'Tester' + } + }, function (msg) { + if (msg.event === event) { + console.log(msg); + answered = true; + } + }); + }); + + instance.save({silent: true}, function (err) { + t.ok(!err, 'There was an error while saving silenced.'); + instance.p('dummy', 'updated'); + instance.save({silent: true}, function (err) { + t.ok(!err, 'There was an error while updating silenced.'); + var second = nohm.factory('Tester'); + instance.link(second); + instance.save({silent: true}, function (err) { + t.ok(!err, 'There was an error while linking silenced.'); + instance.unlink(second); + instance.save({silent: true}, function (err) { + t.ok(!err, 'There was an error while unlinking silenced.'); + instance.remove({silent: true}, function (err) { + t.ok(!err, 'There was an error while removing silenced.'); + setTimeout(function () { + t.same(answered, false, 'There was an event!'); + t.done(); + }, 150); + }); + }); + }); + }); + }); } } }; \ No newline at end of file