ohm
Version:
Node.js Session Manager
105 lines (90 loc) • 3.07 kB
JavaScript
;
(function () {
'use strict';
var _ = require('lodash');
var Parse = include('apis/Parse.js');
var SESSION_DATA_FIELDS = ['cookie', 'sessionID', 'viewerContextID'];
/**
* An abstraction of the session data stored with Express/Connect.
*
* This is backed by a DB (Parse at the moment). Because connect uses id
* as a hard coded key and Parse makes its own ids for objects, we have
* to do a bit of swapping around to make things play nice.
* @module SessionData
*/
var SessionDataParse = Parse.Object.extend('SessionData', {
/// INSTANCE METHODS ///
update: function update(newSessionDataJSON, callback) {
var copy = SessionDataParse.renameIDToSessionID(newSessionDataJSON);
_.each(SESSION_DATA_FIELDS, function (fieldName) {
if (_.has(copy, fieldName)) {
this.set(fieldName, copy[fieldName]);
}
}, this);
this.save(null, {
success: function success() {
if (callback) {
callback();
}
},
error: function error(object, err) {
console.error(err, new Error().trace);
if (callback) {
callback(err);
}
}
});
},
toJSON: function toJSON() {
var data = {};
_.each(SESSION_DATA_FIELDS, function (fieldName) {
data[fieldName] = this.get(fieldName);
}, this);
data.id = data.sessionID;
delete data.sessionID;
return data;
}
}, {
/// STATIC METHODS ///
renameIDToSessionID: function renameIDToSessionID(sessionDataJSON) {
var copy = _.omit(sessionDataJSON, 'id');
if (sessionDataJSON.id) {
copy.sessionID = sessionDataJSON.id;
}
return copy;
},
areEqual: function areEqual(sessionDataJSON1, sessionDataJSON2) {
return _.isEqual(_.pick(this.renameIDToSessionID(sessionDataJSON1), SESSION_DATA_FIELDS), _.pick(this.renameIDToSessionID(sessionDataJSON2), SESSION_DATA_FIELDS));
},
fetchWithSessionID: function fetchWithSessionID(sessionID, callback) {
if (!callback) {
console.error('No callback passed into genFromSessionID.');
return;
}
if (!sessionID) {
var err = new Error('No sessionID passed into fetchWithSessionID method');
return callback(err);
}
var query = new Parse.Query(SessionDataParse);
query.equalTo('sessionID', sessionID);
// PARSE: find operation
query.find({
success: function success(results) {
if (results.length > 1) {
console.warn('For sessionID ' + sessionID + ', more than 1 results returned');
}
var sessionData = results[0];
callback(null, sessionData);
},
error: function error(object, err) {
callback(err);
}
});
},
fromJSON: function fromJSON(sessionDataJSON) {
var copy = this.renameIDToSessionID(sessionDataJSON);
return new SessionDataParse(copy);
}
});
module.exports = SessionDataParse;
})();