sessionstore
Version:
Sessionstore is a node.js module for multiple databases. It can be very useful if you work with express or connect.
123 lines (94 loc) • 2.76 kB
JavaScript
var util = require('util'),
Session = require('../sessionInterface'),
use = require('../use'),
_ = require('lodash'),
memjs = use('memjs'),
jsondate = require('jsondate');
var MemcachedSessionStore = function (options) {
options = options || {};
Session.Store.call(this, options);
var defaults = {
host: 'localhost',
port: 11211,
prefix: 'sess',
expires: 80,
retries: 2,
failover: false,
failoverTime: 60
};
_.defaults(options, defaults);
if (!options.servers) {
if (options.username) {
options.servers = options.username + ':' + options.password + '@' + options.host + ':' + options.port;
} else {
options.servers = options.host + ':' + options.port;
}
}
this.options = options;
};
util.inherits(MemcachedSessionStore, Session.Store);
_.extend(MemcachedSessionStore.prototype, {
connect: function (callback) {
var options = this.options;
this.client = memjs.Client.create(options.servers, options);
this.prefix = options.prefix;
this.emit('connect');
if (callback) callback(null, this);
},
disconnect: function (callback) {
this.client.close();
this.emit('disconnect');
if (callback) callback(null, this);
},
set: function (sid, sess, callback) {
var prefixedSid = this.prefix + ':' + sid;
var sessString;
try {
sessString = JSON.stringify(sess);
} catch (err) {
if (callback) callback(err);
return;
}
var ttl = this.options.expires;
if (sess && sess.cookie && sess.cookie.expires) {
var expInMs = (new Date(sess.cookie.expires)).getTime() - Date.now();
if (expInMs < 1000) {
expInMs = 1000;
}
ttl = Math.round(expInMs / 1000);
}
this.client.set(prefixedSid, sessString, callback || function () {}, ttl);
},
//touch: function (sid, sess, callback) {
// this.set(sid, sess, callback);
//},
get: function (sid, callback) {
var prefixedSid = this.prefix + ':' + sid;
this.client.get(prefixedSid, function (err, value, key) {
if (err) {
if (callback) callback(err);
return;
}
if (!value) {
if (callback) callback(null, null);
return;
}
var result;
try {
result = jsondate.parse(value.toString());
} catch (error) {
if (callback) callback(error);
return;
}
if (callback) callback(null, result);
});
},
destroy: function (sid, callback) {
var prefixedSid = this.prefix + ':' + sid;
this.client.delete(prefixedSid, callback || function() {});
},
clear: function (callback) {
this.client.flush(callback || function() {});
}
});
module.exports = MemcachedSessionStore;