UNPKG

identity

Version:

Identity client

88 lines (66 loc) 2.19 kB
exports.session = function(api, next){ var config = api.config.identity; if(!config){ return next(); } //Load the session api.actions.addPreProcessor(function(connection, actionTemplate, next){ var key = config.session_prefix + connection.id.split('-')[0]; var User = api.identity.store.Model('User'); //load from actionhero cache api.cache.load(key, function(error, session){ session = session || {}; //if there is a user on the connection - use it instead var user_data = connection.user || session.user; //put all data on the connection object if(user_data){ connection.user = User.new(user_data); session.user = user_data; } if(connection.session_tmp === true){ session.__tmp = true; } connection.session = session; connection.session_hash = objectHash(session); next(connection, true); }); }, 50); // Postprocessor to save the session api.actions.addPostProcessor(function(connection, actionTemplate, toRender, next){ if(connection.session){ var key = config.session_prefix + connection.id.split('-')[0]; if(!connection.session.__destroy){ //only save non temporary sessions if(connection.session.__tmp !== true){ var hash = objectHash(connection.session); if(hash === connection.session_hash){ return next(connection, toRender); } api.cache.save(key, connection.session, 60 * 60 * 24 * 7 * 1000, function(error, session){ //TODO: error handling... next(connection, toRender); }); }else{ next(connection, toRender); } }else{ api.cache.destroy(key, function(error){ //TODO: error handling... next(connection, toRender); }); } }else{ next(connection, toRender); } }); next(); }; function objectHash(obj){ if(!obj) return null; return JSON.stringify(obj) .split('') .reduce(function(a,b){ a=((a<<5)-a)+b.charCodeAt(0); return a&a },0); }