mubsub
Version:
Pub/sub for Node.js and MongoDB
100 lines (85 loc) • 2.21 kB
JavaScript
var EventEmitter = require('events').EventEmitter;
var util = require('util');
var MongoClient = require('mongodb').MongoClient;
var Channel = require('./channel');
/**
* Connection constructor.
*
* @param {String|Db} uri string or Db instance
* @param {Object} mongo driver options
* @api public
*/
function Connection(uri, options) {
var self = this;
options || (options = {});
options.autoReconnect != null || (options.autoReconnect = true);
// It's a Db instance.
if (uri.collection) {
this.db = uri;
} else {
MongoClient.connect(uri, options, function (err, db) {
if (err) return self.emit('error', err);
self.db = db;
self.emit('connect', db);
db.on('error', function (err) {
self.emit('error', err);
});
});
}
this.destroyed = false;
this.channels = {};
}
module.exports = Connection;
util.inherits(Connection, EventEmitter);
/**
* Current connection state.
*
* @type {String}
* @api public
*/
Object.defineProperty(Connection.prototype, 'state', {
enumerable: true,
get: function () {
var state;
// Using 'destroyed' to be compatible with the driver.
if (this.destroyed) {
state = 'destroyed';
}
else if (this.db) {
state = this.db.serverConfig.isConnected()
? 'connected' : 'disconnected';
} else {
state = 'connecting';
}
return state;
}
});
/**
* Creates or returns a channel with the passed name.
*
* @see Channel
* @return {Channel}
* @api public
*/
Connection.prototype.channel = function (name, options) {
if (typeof name === 'object') {
options = name;
name = 'mubsub';
}
if (!this.channels[name] || this.channels[name].closed) {
this.channels[name] = new Channel(this, name, options);
}
return this.channels[name];
};
/**
* Close connection.
*
* @param {Function} [callback]
* @return {Connection} this
* @api public
*/
Connection.prototype.close = function (callback) {
this.destroyed = true;
this.db.close(callback);
return this;
};