Pub/Sub for Node.js and MongoDB
vubsub is a Pub/Sub implementation for Node.js on top of MongoDB tailable cursors. vubsub was inspired by mubsub.
The main differences between vubsub and mubsub are:
- Active clients are tracked via a dedicated clients collection
- You can specify a namespace for each client (or group of clients): a namespace is a mapped to a collection (ns_namespace) where all the messages for that namespace are stored
- When connecting a client to a channel, you can specify the _id of the last received message and restart receiving message from that point.
vubsub uses Q, Kris Kowal's implementation of Promises.
npm install vubsub
To create a new client, simply call the create function passing a db instance and, optionally, a metadata object. If the metadata contains the ns key, it'll be used as the namespace for the client (i.e. the client will be linked to a collection named ns_namespace). The metadata is stored, together with the client id in the clients collection (you can you this to keep track of your clients).
var vubsub = require('vubsub')
, MongoClient = require('mongodb').MongoClient
MongoClient.connect('mongodb://localhost/test', { auto_reconnect: true }, function(err, db) {
if (err || !db) throw new Error('failed to connect to the db');
vubsub.create(db, { ns: 'myNamespace' }).then(function(client) {
console.log('Client connected: ' + client.id);
});
});
To create a channel and listen to events on the channel:
vubsub.create(db, { ns: 'myNamespace' }).then(function(client) {
return client.channel('myChannel' /*, you can pass here the id of the last received message */);
}).then(function(channel) {
console.log('Created channel ' + channel.name);
channel.on('myEvent', function(event) {
console.log('Received event', event);
});
});
To send a message to a channel:
channel.send('myEvent', { a: 1, b: 2}).then(function() {
console.log('Message sent');
});