Skip to content

Commit

Permalink
Use MongoClient, break API.
Browse files Browse the repository at this point in the history
  • Loading branch information
Ilya Shaisultanov committed Oct 2, 2014
1 parent d3620a5 commit 7320dae
Show file tree
Hide file tree
Showing 2 changed files with 181 additions and 132 deletions.
149 changes: 71 additions & 78 deletions lib/connect-mongostore.js
@@ -1,6 +1,8 @@
'use strict'

var mongo = require('mongodb')
, MongoClient = mongo.MongoClient
, Server = require('mongodb').Server
, url = require('url')
, util = require('util')
, _ = require('lodash')
Expand All @@ -17,7 +19,15 @@ var defaultOptions = {
'expireAfter': 1000 * 60 * 60 * 24 * 14, // 2 weeks
'autoReconnect': false,
'ssl': false,
'w': 1
'w': 1,

'connectionString': undefined, // use MongoClient
'db': undefined, // DB instance

'mongooseConnection': undefined, // db.connections[0]

'databaseName': undefined, // String
'replSet': undefined
}


Expand All @@ -32,18 +42,25 @@ function getStore(Store) {
Store.call(this, this.options)

if (typeof options == 'string') {
this.options = parseUrl(options)
} else {
this.options = _.clone(options || {})
this.options.expireAfter = this.options.expireAfter || defaultOptions.expireAfter
options = {
connectionString: options
}
} else if (options.db) {
this.db = options.db
}

this.options = _.clone(options || {})
this.options.expireAfter = this.options.expireAfter || defaultOptions.expireAfter

if (!this.db) {
this.mc = setupMongoClient(this.options)
}

if (!this.options.hasOwnProperty('stringify')) {
this.options.stringify = defaultOptions.stringify
}

this.collectionName = this.options.collection || defaultOptions.collection
this.db = setupDb(this.options)

callback && this.getDatabase(callback);
}
Expand Down Expand Up @@ -76,17 +93,40 @@ function getStore(Store) {
MongoStore.prototype.getDatabase = function (cb) {
var self = this

self.db.open(function (err, db) {
if (err) throw new Error('Error connecting to database:\n' + err.message + '\n' + err.stack + '\n')

function authIfNeeded() {
if (self.options.username && self.options.password) {
db.authenticate(self.options.username, self.options.password, {authSource: self.options.authSource || null}, function () {
self.db.authenticate(self.options.username, self.options.password, {authSource: self.options.authSource || null}, function () {
self.getCollection(cb)
})
} else {
self.getCollection(cb)
}
})
}

if (self.db) {
self.db.open(function (err, db) {
if (err) throw new Error('Error connecting to database:\n' + err.message + '\n' + err.stack + '\n')

authIfNeeded()
})
} else if (self.mc && !self.options.connectionString) {
self.mc.open(function (err, mc) {
if (err) throw new Error('Error connecting to database:\n' + err.message + '\n' + err.stack + '\n')
//self.mc = mc
self.db = mc.db(self.options.databaseName)

authIfNeeded()
})
} else if (self.options.connectionString) {
MongoClient.connect(self.options.connectionString, function (err, db) {
if (err) throw new Error('Error connecting to database:\n' + err.message + '\n' + err.stack + '\n')
self.db = db

authIfNeeded()
})
} else {
throw new Error('Cannot get database')
}
}


Expand All @@ -104,7 +144,7 @@ function getStore(Store) {
return
}

if (!self.db.openCalled) return self.getDatabase(cb)
if (!self.db || !self.db.openCalled) return self.getDatabase(cb)

self.db.collection(self.collectionName, function (err, collection) {
if (err) throw new Error('Error getting collection: ' + self.collectionName + ' <' + err + '>')
Expand Down Expand Up @@ -242,97 +282,50 @@ function getFutureDate(offset) {



/**
* Parse a database URL.
*
* @param {String} path
* @returns {Object}
*/
function parseUrl(path) {
var parsed = {}

var dbUri = url.parse(path)

if (dbUri.port) {
parsed.port = parseInt(dbUri.port)
}

if (dbUri.pathname != undefined) {
var pathname = dbUri.pathname.split('/')

if (pathname.length >= 2 && pathname[1]) {
parsed.db = pathname[1]
}

if (pathname.length >= 3 && pathname[2]) {
parsed.collection = pathname[2]
}
}

if (dbUri.hostname != undefined) {
parsed.host = dbUri.hostname
}

if (dbUri.auth != undefined) {
var auth = dbUri.auth.split(':')

if (auth.length >= 1) {
parsed.username = auth[0]
}

if (auth.length >= 2) {
parsed.password = auth[1]
}
}

return parsed
}



/**
* Instantiate database instance.
*
* @param opts
* @returns {*}
*/
function setupDb(opts) {
function setupMongoClient(opts) {
if (opts.connectionString) return

if (opts.mongooseConnection) {
var _opts = dbFromMongooseConnection(opts.mongooseConnection)
opts.db = _opts.db
opts.databaseName = _opts.db
opts.host = _opts.host
opts.port = _opts.port
opts.username = _opts.username
opts.password = _opts.password
}

if (!opts.db) throw new Error('Required MongoStore option `db` missing')
if (typeof opts.db == 'object' && opts.db.databaseName) return opts.db // Assume it's an instantiated DB Object
if (!opts.databaseName) {
throw new Error('Required MongoStore option `databaseName` missing')
}

if (Array.isArray(opts.db.servers)) {
if (opts.replSet) {
var serverArray = []

opts.db.servers.forEach(function (server) {
opts.replSet.servers.forEach(function (server) {
var serverOptions = server.options || {}
serverOptions.ssl = serverOptions.ssl || opts.ssl || defaultOptions.ssl
var newServer = new mongo.Server(server.host, server.port, serverOptions)
serverArray.push(newServer)
})

return new mongo.Db(opts.db.name, new mongo.ReplSetServers(serverArray), opts.db.replicaSetOptions || {'w': 1})
return new MongoClient(new mongo.ReplSetServers(serverArray), opts.replSet.rs_options || {'w': 1})
}

if (typeof opts.db != 'string') throw new Error('`db` option must be a string, array or a database instance.')

return new mongo.Db(
opts.db, new mongo.Server(
opts.host || defaultOptions.host,
opts.port || defaultOptions.port,
{
auto_reconnect: opts.autoReconnect || defaultOptions.autoReconnect,
ssl: opts.ssl || defaultOptions.ssl
}),
{ w: opts.w || defaultOptions.w })
var server = new mongo.Server(
opts.host || defaultOptions.host,
opts.port || defaultOptions.port,
{
auto_reconnect: opts.autoReconnect || defaultOptions.autoReconnect,
ssl: opts.ssl || defaultOptions.ssl
})

return new MongoClient(server)
}


Expand Down

0 comments on commit 7320dae

Please sign in to comment.