UNPKG

connect-caminte

Version:

CrossDB session store for Connect and ExpressJS

240 lines (225 loc) 7.25 kB
/** * Caminte sessions store * * @revision $Id: express-caminte.js 2013-10-08 04:54:16 Aleksey $ * @created 2013-10-08 04:54:16 * @category Express Helpers * @package connect-caminte * @version 0.0.4 * @copyright Copyright (c) 2009-2013 - All rights reserved. * @license MIT License * @author Alexey Gordeyev IK <aleksej@gordejev.lv> * @link http://www.gordejev.lv/ * * Created by init script * App based on TrinteJS MVC framework * TrinteJS homepage http://www.trintejs.com **/ var pkg = require('../package.json'); var caminte = require('caminte'); var sessionModel = require('./session'); /** * Library version. **/ exports.version = pkg.version; /** * CaminteStore * * @param {Object} connect * @api public */ module.exports = function (connect) { var Store = connect.Store || connect.session.Store; /** * Initialize CaminteStore with the given `options`. * Calls `callback` when db connection is ready (mainly for testing purposes). * * @param {Object} options * @param {Function} callback * @api public **/ function CaminteStore(options, callback) { var self = this; self.Session = {}; self.options = options || {driver: 'memory', collection: 'session'}; options.driver = typeof options.driver === 'undefined' ? 'memory' : options.driver; try { var Schema = caminte.Schema; var schema = new Schema(self.options.driver, options.db); self.Session = sessionModel(schema, options); if ('function' === typeof schema.autoupdate) { schema.autoupdate(function (err) { if (err) { console.log(err); } }); } } catch (err) { console.log('new CaminteStore err:', err); } Store.call(self, options); if (options.clear_interval > 0) { self.clear_interval = setInterval(function () { self.Session.remove({ where: { expires: { lt: new Date() } } }, function (err) { if (err) { console.log('Clear sessions err: ', err); } }); }, options.clear_interval * 1000, self); } return callback && callback(self.Session); } /** * Inherit from `Store`. */ CaminteStore.prototype.__proto__ = Store.prototype; /** * Attempt to fetch session by the given `sid`. * * @param {String} sid * @param {Function} callback * @api public */ CaminteStore.prototype.get = function (sid, callback) { var self = this; self.Session.findOne({ sid: sid, expires: { gte: new Date() } }).exec(function (err, founded_session) { if (founded_session && founded_session.session_data) { var sess = {}; if (typeof founded_session.session_data === 'string') { try { sess = JSON.parse(founded_session.session_data); } catch(err){} } else { sess = founded_session.session_data; } callback && callback(err, sess); } else { callback && callback(null, null); } }); }; /** * Commit the given `sess` object associated with the given `sid`. * * @param {String} sid * @param {Session} session * @param {Function} callback * @api public */ CaminteStore.prototype.set = function (sid, session, callback) { var self = this, today = new Date(); try { var new_session = { sid: sid, session_data: session }; if (session && session.cookie) { if (session.cookie._expires) { new_session.expires = new Date(session.cookie._expires); } else { var sessLifeTime = self.options.maxAge || (1000 * 60 * 60 * 24 * 14); new_session.expires = new Date(today.getTime() + sessLifeTime); } } var eXseconds = new Date(new_session.expires).getTime(); var cXseconds = today.getTime(); new_session.expireAfterSeconds = Math.round((eXseconds - cXseconds) / 1000); var loggedIn = 0; if (session.passport) { loggedIn = session.passport.user ? 1 : 0; } else if (session.auth) { loggedIn = 1; } else if (session.loggedIn || session.logedIn) { loggedIn = session.loggedIn || session.logedIn; } new_session.loggedIn = loggedIn || 0; new_session.user = (session.user && (session.user || {}).username) ? session.user.username : "guest"; self.Session.upsert({ sid: sid }, new_session, function (err, csession) { if (err) { callback && callback(err); } else { callback && callback(null, csession); } }); } catch (err) { callback && callback(err); } }; /** * Destroy the session associated with the given `sid`. * * @param {String} sid * @param {Function} callback * @api public */ CaminteStore.prototype.destroy = function (sid, callback) { this.Session.findOne({ sid: sid }).exec(function (err, data) { if (err) { callback && callback(err); } else if (data) { data.destroy(function (err) { callback && callback(err, data); }); } else { callback && callback(err); } }); }; /** * Fetch number of sessions. * * @param {Function} callback * @api public */ CaminteStore.prototype.length = function (callback) { this.Session.count({}, function (err, count) { if (err) { callback && callback(err); } else { callback && callback(null, count); } }); }; /** * Clear all sessions. * * @param {Function} callback * @api public */ CaminteStore.prototype.clear = function (callback) { this.Session.destroyAll(function () { callback && callback(); }); }; /** * Select all sessions. * * @param {Function} callback * @api public */ CaminteStore.prototype.all = function (callback) { this.Session.all({}, function (err, sessions) { if (err) { callback && callback(err); } else { callback && callback(null, sessions); } }); }; return CaminteStore; };