identity
Version:
Identity client
88 lines (66 loc) • 2.19 kB
JavaScript
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);
}