sessionstore
Version:
Sessionstore is a node.js module for multiple databases. It can be very useful if you work with express or connect.
143 lines (117 loc) • 3.48 kB
JavaScript
var util = require('util'),
Session = require('../sessionInterface'),
use = require('../use'),
tingodb = use('tingodb')(),
ObjectID = tingodb.ObjectID,
_ = require('lodash');
function cleanSessionData(json) {
if (!json) {
return json;
}
var data = {};
for (var i in json) {
data[i] = json[i];
if (data[i] instanceof Object) {
if ('low_' in data[i] || 'high_' in data[i]) {
data[i] = data[i].toNumber();
}
}
}
return data;
}
var TingoSessionStore = function (options) {
options = options || {};
Session.Store.call(this, options);
var defaults = {
dbPath: require('path').join(__dirname, '../../'),
collectionName: 'sessions',
ttl: 60 * 60 * 24 * 14 // 14 days
};
_.defaults(options, defaults);
this.options = options;
};
util.inherits(TingoSessionStore, Session.Store);
_.extend(TingoSessionStore.prototype, {
connect: function (callback) {
var options = this.options;
this.db = new tingodb.Db(options.dbPath, {});
// this.db.on('close', function() {
// self.emit('disconnect');
// });
this.sessions = this.db.collection(options.collectionName + '.tingo');
this.sessions.ensureIndex({ expires: 1 }, { expireAfterSeconds: 0 }, function() {});
this.emit('connect');
if (callback) callback(null, this);
},
disconnect: function (callback) {
if (!this.db) {
if (callback) callback(null);
return;
}
this.emit('disconnect');
this.db.close(callback || function () {});
},
set: function (sid, sess, callback) {
if (sess && sess.cookie && sess.cookie.expires) {
sess.expires = new Date(sess.cookie.expires);
} else {
// If there's no expiration date specified, it is
// browser-session cookie or there is no cookie at all,
// as per the connect docs.
//
// So we set the expiration to two-weeks from now
// - as is common practice in the industry (e.g Django) -
// or the default specified in the options.
sess.expires = new Date(Date.now() + this.options.ttl * 1000);
}
sess._id = sid;
this.sessions.update({_id: sid}, sess, { upsert: true, safe: true }, function(err) {
if (err) {
if (callback) callback(err);
return;
}
if (callback) callback(null, sess);
});
},
//touch: function (sid, sess, callback) {
// this.set(sid, sess, callback);
//},
get: function (sid, callback) {
this.sessions.findOne({
_id: sid,
$or: [
{ expires: { $exists: false } },
{ expires: { $gt: new Date() } }
]
}, function (err, session_data) {
if (err) {
if (callback) callback(err);
return;
}
session_data = cleanSessionData(session_data);
if (callback) callback(null, session_data);
});
},
destroy: function (sid, callback) {
this.sessions.remove({ _id: sid }, callback || function () {});
},
length: function (callback) {
this.sessions.count(callback || function () {});
},
all: function (callback) {
var arr = [];
this.sessions.find(function (err, cursor) {
cursor.each(function (err, d) {
d = cleanSessionData(d);
arr.push(d);
if (!d._id) {
if (callback) callback(null, arr);
}
});
});
},
clear: function (callback) {
this.sessions.remove(callback || function () {});
}
});
module.exports = TingoSessionStore;