|  | @@ -5,60 +5,117 @@
 | 
	
		
			
				|  |  |   */
 | 
	
		
			
				|  |  |  'use strict'
 | 
	
		
			
				|  |  |  var Session = {
 | 
	
		
			
				|  |  | -    set:function(key,value,arg1,arg2){
 | 
	
		
			
				|  |  | -        if(!key || !value) return null;
 | 
	
		
			
				|  |  | -        let sessionData;
 | 
	
		
			
				|  |  | -        if(sessionid){
 | 
	
		
			
				|  |  | -            try{
 | 
	
		
			
				|  |  | -                sessionData = JSON.parse(FILE.readFileSync(Core.Path.Session + '/' + sessionid,'UTF-8'));
 | 
	
		
			
				|  |  | -            }catch(e){
 | 
	
		
			
				|  |  | -                sessionid = '';
 | 
	
		
			
				|  |  | -            }
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | -        if(!sessionid){
 | 
	
		
			
				|  |  | -            sessionid = MD5(new Date().getTime()+''+Math.floor(Math.random()*9000+1000));
 | 
	
		
			
				|  |  | -            sessionData = {id:sessionid,expire:(new Date().getTime()+Config.SessionExpire*60000)};
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        sessionData[key]=value;
 | 
	
		
			
				|  |  | +    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;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -        FILE.writeFileSync(Core.Path.Session + '/' + sessionid,JSON.stringify(sessionData),'UTF-8');
 | 
	
		
			
				|  |  | -        return sessionid;
 | 
	
		
			
				|  |  | +        Manager.set(session,function(err){
 | 
	
		
			
				|  |  | +            if(err) return callback.call(_this,'Session set err;',null);
 | 
	
		
			
				|  |  | +            callback.call(_this,null,session);
 | 
	
		
			
				|  |  | +        });
 | 
	
		
			
				|  |  |      },
 | 
	
		
			
				|  |  | -    get:function(sessionid,key,callback){
 | 
	
		
			
				|  |  | -        if(!sessionid) return null;
 | 
	
		
			
				|  |  | -        let sessionData;
 | 
	
		
			
				|  |  | -        try{
 | 
	
		
			
				|  |  | -            sessionData = JSON.parse(FILE.readFileSync(Core.Path.Session + '/' + sessionid,'UTF-8'));
 | 
	
		
			
				|  |  | -            if(sessionData.expire < new Date().getTime()){
 | 
	
		
			
				|  |  | -                sessionData = null;
 | 
	
		
			
				|  |  | -                Session.clear(sessionid);
 | 
	
		
			
				|  |  | -            }
 | 
	
		
			
				|  |  | -        }catch(e){
 | 
	
		
			
				|  |  | -            sessionData = null;
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | -        if(key && sessionData){
 | 
	
		
			
				|  |  | -            if(sessionData[key]!=undefined){
 | 
	
		
			
				|  |  | -                return sessionData[key];
 | 
	
		
			
				|  |  | +    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{
 | 
	
		
			
				|  |  | -                return null;
 | 
	
		
			
				|  |  | +                session = result;
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | -        return sessionData;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            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;
 | 
	
		
			
				|  |  | -        try{
 | 
	
		
			
				|  |  | -            FILE.rmdirSync(Core.Path.Session + '/' + sessionid);
 | 
	
		
			
				|  |  | -        }catch(e){}
 | 
	
		
			
				|  |  | +        Manager.clear(sessionid);
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  };
 | 
	
		
			
				|  |  |  module.exports = Session;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -var FileManager = {
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -var MemcacheManager = {
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | +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(){}
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  |  }
 |