/** * @Author HonorLee (dev@honorlee.me) * @Version 1.0 (2018-05-04) * @License MIT */ 'use strict' var Session = { set:function(key,value,callback){ callback = Manager.buildCallback(callback); if(!key || value==null) return callback.call(this,'Session key or value is empty',null); let _this = this; let session = {}; session.id = MD5(new Date().getTime()+''+Math.floor(Math.random()*9000+1000)); session.data = {}; session.data[key] = value; session.expire = Config.SessionExpire*60; session.expireTime = new Date().getTime()+session.expire*1000; Manager.set(session,function(err){ if(err) return callback.call(_this,'Session set err;',null); callback.call(_this,null,session); }); }, update:function(sessionid,key,value,callback){ callback = Manager.buildCallback(callback); if(!sessionid || !key || value==null) return callback.call(this,'Session id,key or value is empty',null); let _this = this; Manager.get(sessionid,function(err,result){ let session; if(err || result == null){ session = {id:sessionid,data:{}}; }else{ session = result; } if(err || result == null || Config.Session.AutoRefresh){ session.expire = Config.SessionExpire*60; session.expireTime = new Date().getTime()+session.expire*1000; } session.data[key] = value; Manager.set(session,function(err){ if(err) return callback.call(_this,'Session set error'); callback.call(_this,null,session) }); }); }, get:function(sessionid,callback){ callback = Manager.buildCallback(callback); if(!sessionid) return callback.call(this,'Session id is empty',null); let _this = this; Manager.get(sessionid,function(err,result){ callback.call(_this,null,result); }); }, getKeyValue:function(sessionid,key,callback){ callback = Manager.buildCallback(callback); if(!sessionid || !key) return callback.call(this,'Session id or key is empty',null); let _this = this; Session.get(sessionid,function(err,result){ if(err || !result) return callback.call(_this,null); callback.call(_this,null,result.data[key]); }); }, clear:function(sessionid){ if(!sessionid) return; Manager.clear(sessionid); } }; module.exports = Session; var Manager = { get:function(sessionid,callback){ if(Config.Database.Memcache.on && Memcache){ Memcache.get('session_'+sessionid,function(err,result){ if(err) return callback(err); callback(null,result); }); }else{ let sessionData = null; try{ sessionData = JSON.parse(FILE.readFileSync(Core.Path.Session + '/' + sessionid,'UTF-8')); }catch(e){} if(sessionData && sessionData.expireTime){ if(new Date().getTime()>sessionData.expireTime){ sessionData = null; Manager.clear(sessionid); } } callback(null,sessionData); } }, set:function(session,callback){ if(Config.Database.Memcache.on && Memcache){ Memcache.set('session_'+session.id,session,session.expire,function(err){ if(err){ Logger.error(err); return callback(err); } callback(); }); }else{ FILE.writeFileSync(Core.Path.Session + '/' + session.id,JSON.stringify(session),'UTF-8'); callback(); } }, clear:function(sessionid){ if(Config.Database.Memcache.on && Memcache){ Memcache.del('session_'+sessionid); }else{ try{ FILE.rmdirSync(Core.Path.Session + '/' + sessionid); }catch(e){} } }, buildCallback:function(callback){ if(callback && typeof callback=='function') return callback; callback = function(){} } }