|  | @@ -1,8 +1,9 @@
 | 
												
													
														
															|  | -/**
 |  | 
 | 
												
													
														
															|  | - * @Author  HonorLee (dev@honorlee.me)
 |  | 
 | 
												
													
														
															|  | - * @Version 1.0 (2018-05-04)
 |  | 
 | 
												
													
														
															|  | 
 |  | +/*
 | 
												
													
														
															|  | 
 |  | + * @Author: HonorLee
 | 
												
													
														
															|  | 
 |  | + * @Version 1.0
 | 
												
													
														
															|  | 
 |  | + * @LastUpdate 2018/6/19
 | 
												
													
														
															|  |   * @License MIT
 |  |   * @License MIT
 | 
												
													
														
															|  | - */
 |  | 
 | 
												
													
														
															|  | 
 |  | +*/
 | 
												
													
														
															|  |  'use strict'
 |  |  'use strict'
 | 
												
													
														
															|  |  var Session = {
 |  |  var Session = {
 | 
												
													
														
															|  |      set:function(key,value,callback){
 |  |      set:function(key,value,callback){
 | 
												
											
												
													
														
															|  | @@ -10,18 +11,41 @@ var Session = {
 | 
												
													
														
															|  |          if(!key || value==null) return callback.call(this,'Session key or value is empty',null);
 |  |          if(!key || value==null) return callback.call(this,'Session key or value is empty',null);
 | 
												
													
														
															|  |          let _this = this;
 |  |          let _this = this;
 | 
												
													
														
															|  |          let session = {};
 |  |          let session = {};
 | 
												
													
														
															|  | -        
 |  | 
 | 
												
													
														
															|  | 
 |  | +
 | 
												
													
														
															|  |          session.id = MD5(new Date().getTime()+''+Math.floor(Math.random()*9000+1000));
 |  |          session.id = MD5(new Date().getTime()+''+Math.floor(Math.random()*9000+1000));
 | 
												
													
														
															|  |          session.data = {};
 |  |          session.data = {};
 | 
												
													
														
															|  |          session.data[key] = value;
 |  |          session.data[key] = value;
 | 
												
													
														
															|  |          session.expire = Config.SessionExpire*60;
 |  |          session.expire = Config.SessionExpire*60;
 | 
												
													
														
															|  |          session.expireTime = new Date().getTime()+session.expire*1000;
 |  |          session.expireTime = new Date().getTime()+session.expire*1000;
 | 
												
													
														
															|  | 
 |  | +        session.autoRenewExpire = Config.SessionExpire*60;
 | 
												
													
														
															|  |  
 |  |  
 | 
												
													
														
															|  |          Manager.set(session,function(err){
 |  |          Manager.set(session,function(err){
 | 
												
													
														
															|  |              if(err) return callback.call(_this,'Session set err;',null);
 |  |              if(err) return callback.call(_this,'Session set err;',null);
 | 
												
													
														
															|  |              callback.call(_this,null,session);
 |  |              callback.call(_this,null,session);
 | 
												
													
														
															|  |          });
 |  |          });
 | 
												
													
														
															|  |      },
 |  |      },
 | 
												
													
														
															|  | 
 |  | +    setExpireTime:function(sessionid,expire,autoRenewExpire,callback){
 | 
												
													
														
															|  | 
 |  | +        let _this = this;
 | 
												
													
														
															|  | 
 |  | +        callback = Manager.buildCallback(callback);
 | 
												
													
														
															|  | 
 |  | +        if(!sessionid) return callback.call(this,'Session id is empty',null);
 | 
												
													
														
															|  | 
 |  | +        if(!expire) return callback.call(this,'Session expire must bigger than 0',null);
 | 
												
													
														
															|  | 
 |  | +        Session.get(sessionid,function(err,data){
 | 
												
													
														
															|  | 
 |  | +            if(err || !data) return callback.call(this,'Session is gone',null);
 | 
												
													
														
															|  | 
 |  | +            let session = data;
 | 
												
													
														
															|  | 
 |  | +            session.expire = expire*60;
 | 
												
													
														
															|  | 
 |  | +            autoRenewExpire = autoRenewExpire*1;
 | 
												
													
														
															|  | 
 |  | +            if(autoRenewExpire>0) session.autoRenewExpire = autoRenewExpire*60;
 | 
												
													
														
															|  | 
 |  | +            Manager.set(session,function(err){
 | 
												
													
														
															|  | 
 |  | +                if(err){
 | 
												
													
														
															|  | 
 |  | +                    LOGGER.error(err);
 | 
												
													
														
															|  | 
 |  | +                    callback.call(_this,'Session set expire error',null);
 | 
												
													
														
															|  | 
 |  | +                }else{
 | 
												
													
														
															|  | 
 |  | +                    callback.call(_this,null,session);
 | 
												
													
														
															|  | 
 |  | +                }
 | 
												
													
														
															|  | 
 |  | +            })
 | 
												
													
														
															|  | 
 |  | +        });
 | 
												
													
														
															|  | 
 |  | +
 | 
												
													
														
															|  | 
 |  | +    },
 | 
												
													
														
															|  |      update:function(sessionid,key,value,callback){
 |  |      update:function(sessionid,key,value,callback){
 | 
												
													
														
															|  |          callback = Manager.buildCallback(callback);
 |  |          callback = Manager.buildCallback(callback);
 | 
												
													
														
															|  |          if(!sessionid || !key || value==null) return callback.call(this,'Session id,key or value is empty',null);
 |  |          if(!sessionid || !key || value==null) return callback.call(this,'Session id,key or value is empty',null);
 | 
												
											
												
													
														
															|  | @@ -35,7 +59,7 @@ var Session = {
 | 
												
													
														
															|  |              }
 |  |              }
 | 
												
													
														
															|  |  
 |  |  
 | 
												
													
														
															|  |              if(err || result == null || Config.Session.AutoRefresh){
 |  |              if(err || result == null || Config.Session.AutoRefresh){
 | 
												
													
														
															|  | -                session.expire = Config.SessionExpire*60;
 |  | 
 | 
												
													
														
															|  | 
 |  | +                session.expire = session.autoRenewExpire;
 | 
												
													
														
															|  |                  session.expireTime = new Date().getTime()+session.expire*1000;
 |  |                  session.expireTime = new Date().getTime()+session.expire*1000;
 | 
												
													
														
															|  |              }
 |  |              }
 | 
												
													
														
															|  |  
 |  |  
 | 
												
											
												
													
														
															|  | @@ -66,47 +90,64 @@ var Session = {
 | 
												
													
														
															|  |      clear:function(sessionid){
 |  |      clear:function(sessionid){
 | 
												
													
														
															|  |          if(!sessionid) return;
 |  |          if(!sessionid) return;
 | 
												
													
														
															|  |          Manager.clear(sessionid);
 |  |          Manager.clear(sessionid);
 | 
												
													
														
															|  | 
 |  | +    },
 | 
												
													
														
															|  | 
 |  | +    instance:function(sessionID,callback){
 | 
												
													
														
															|  | 
 |  | +        return new Instance(sessionID,callback);
 | 
												
													
														
															|  |      }
 |  |      }
 | 
												
													
														
															|  |  };
 |  |  };
 | 
												
													
														
															|  |  module.exports = Session;
 |  |  module.exports = Session;
 | 
												
													
														
															|  |  
 |  |  
 | 
												
													
														
															|  |  var Manager = {
 |  |  var Manager = {
 | 
												
													
														
															|  |      get:function(sessionid,callback){
 |  |      get:function(sessionid,callback){
 | 
												
													
														
															|  | -        if(Config.Database.Memcache.on && Memcache){
 |  | 
 | 
												
													
														
															|  | 
 |  | +        let session;
 | 
												
													
														
															|  | 
 |  | +        if(Config.Session.StoreType.toLowerCase()=='memcache' && Config.Database.Memcache.on && Memcache){
 | 
												
													
														
															|  |              Memcache.get('session_'+sessionid,function(err,result){
 |  |              Memcache.get('session_'+sessionid,function(err,result){
 | 
												
													
														
															|  |                  if(err) return callback(err);
 |  |                  if(err) return callback(err);
 | 
												
													
														
															|  | 
 |  | +                session = result;
 | 
												
													
														
															|  |                  callback(null,result);
 |  |                  callback(null,result);
 | 
												
													
														
															|  | 
 |  | +                if(session && Config.Session.AutoRefresh){
 | 
												
													
														
															|  | 
 |  | +                    session.expire = session.autoRenewExpire;
 | 
												
													
														
															|  | 
 |  | +                    session.expireTime = new Date().getTime()+session.expire*1000;
 | 
												
													
														
															|  | 
 |  | +                    Manager.set(session,null);
 | 
												
													
														
															|  | 
 |  | +                }
 | 
												
													
														
															|  |              });
 |  |              });
 | 
												
													
														
															|  |          }else{
 |  |          }else{
 | 
												
													
														
															|  | -            let sessionData = null;
 |  | 
 | 
												
													
														
															|  |              try{
 |  |              try{
 | 
												
													
														
															|  | -                sessionData = JSON.parse(FILE.readFileSync(Core.Path.Session + '/' + sessionid,'UTF-8'));
 |  | 
 | 
												
													
														
															|  | 
 |  | +                session = JSON.parse(FILE.readFileSync(Core.Path.Session + '/' + sessionid,'UTF-8'));
 | 
												
													
														
															|  |              }catch(e){}
 |  |              }catch(e){}
 | 
												
													
														
															|  | -            if(sessionData && sessionData.expireTime){
 |  | 
 | 
												
													
														
															|  | -                if(new Date().getTime()>sessionData.expireTime){
 |  | 
 | 
												
													
														
															|  | -                    sessionData = null;
 |  | 
 | 
												
													
														
															|  | -                    Manager.clear(sessionid);
 |  | 
 | 
												
													
														
															|  | 
 |  | +            if(session && session.expireTime){
 | 
												
													
														
															|  | 
 |  | +                if(new Date().getTime()>session.expireTime){
 | 
												
													
														
															|  | 
 |  | +                    if(Config.Session.AutoRefresh){
 | 
												
													
														
															|  | 
 |  | +                        session.expire = session.autoRenewExpire;
 | 
												
													
														
															|  | 
 |  | +                        session.expireTime = new Date().getTime()+session.expire*1000;
 | 
												
													
														
															|  | 
 |  | +                        Manager.set(session,null);
 | 
												
													
														
															|  | 
 |  | +                    }else{
 | 
												
													
														
															|  | 
 |  | +                        session = null;
 | 
												
													
														
															|  | 
 |  | +                        Manager.clear(sessionid);
 | 
												
													
														
															|  | 
 |  | +                    }
 | 
												
													
														
															|  |                  }
 |  |                  }
 | 
												
													
														
															|  |              }
 |  |              }
 | 
												
													
														
															|  | -            callback(null,sessionData);
 |  | 
 | 
												
													
														
															|  | 
 |  | +            if(callback) callback(null,session);
 | 
												
													
														
															|  |          }
 |  |          }
 | 
												
													
														
															|  | 
 |  | +
 | 
												
													
														
															|  |      },
 |  |      },
 | 
												
													
														
															|  |      set:function(session,callback){
 |  |      set:function(session,callback){
 | 
												
													
														
															|  | -        if(Config.Database.Memcache.on && Memcache){
 |  | 
 | 
												
													
														
															|  | 
 |  | +        if(Config.Session.StoreType.toLowerCase()=='memcache' && Config.Database.Memcache.on && Memcache){
 | 
												
													
														
															|  |              Memcache.set('session_'+session.id,session,session.expire,function(err){
 |  |              Memcache.set('session_'+session.id,session,session.expire,function(err){
 | 
												
													
														
															|  |                  if(err){
 |  |                  if(err){
 | 
												
													
														
															|  |                      Logger.error(err);
 |  |                      Logger.error(err);
 | 
												
													
														
															|  | -                    return callback(err);
 |  | 
 | 
												
													
														
															|  | 
 |  | +                    if(callback) callback(err);
 | 
												
													
														
															|  | 
 |  | +                    return;
 | 
												
													
														
															|  |                  }
 |  |                  }
 | 
												
													
														
															|  | -                callback();
 |  | 
 | 
												
													
														
															|  | 
 |  | +                if(callback) callback();
 | 
												
													
														
															|  |              });
 |  |              });
 | 
												
													
														
															|  |          }else{
 |  |          }else{
 | 
												
													
														
															|  |              FILE.writeFileSync(Core.Path.Session + '/' + session.id,JSON.stringify(session),'UTF-8');
 |  |              FILE.writeFileSync(Core.Path.Session + '/' + session.id,JSON.stringify(session),'UTF-8');
 | 
												
													
														
															|  | -            callback();
 |  | 
 | 
												
													
														
															|  | 
 |  | +            if(callback) callback();
 | 
												
													
														
															|  |          }
 |  |          }
 | 
												
													
														
															|  |      },
 |  |      },
 | 
												
													
														
															|  |      clear:function(sessionid){
 |  |      clear:function(sessionid){
 | 
												
													
														
															|  | -        if(Config.Database.Memcache.on && Memcache){
 |  | 
 | 
												
													
														
															|  | 
 |  | +        if(Config.Session.StoreType.toLowerCase()=='memcache' && Config.Database.Memcache.on && Memcache){
 | 
												
													
														
															|  |              Memcache.del('session_'+sessionid);
 |  |              Memcache.del('session_'+sessionid);
 | 
												
													
														
															|  |          }else{
 |  |          }else{
 | 
												
													
														
															|  |              try{
 |  |              try{
 | 
												
											
												
													
														
															|  | @@ -116,6 +157,46 @@ var Manager = {
 | 
												
													
														
															|  |      },
 |  |      },
 | 
												
													
														
															|  |      buildCallback:function(callback){
 |  |      buildCallback:function(callback){
 | 
												
													
														
															|  |          if(callback && typeof callback=='function') return callback;
 |  |          if(callback && typeof callback=='function') return callback;
 | 
												
													
														
															|  | -        callback = function(){}
 |  | 
 | 
												
													
														
															|  | 
 |  | +        return function(){};
 | 
												
													
														
															|  | 
 |  | +    }
 | 
												
													
														
															|  | 
 |  | +}
 | 
												
													
														
															|  | 
 |  | +
 | 
												
													
														
															|  | 
 |  | +var Instance = function(sessionID,callback){
 | 
												
													
														
															|  | 
 |  | +    var _data;
 | 
												
													
														
															|  | 
 |  | +    var _sessionID = sessionID;
 | 
												
													
														
															|  | 
 |  | +    var _this = this;
 | 
												
													
														
															|  | 
 |  | +    this.sessionID = _sessionID;
 | 
												
													
														
															|  | 
 |  | +    this.get = function(key){
 | 
												
													
														
															|  | 
 |  | +        return _data[key];
 | 
												
													
														
															|  | 
 |  | +    }
 | 
												
													
														
															|  | 
 |  | +    this.set = function(key,value){
 | 
												
													
														
															|  | 
 |  | +        _data[key] = value;
 | 
												
													
														
															|  | 
 |  | +        Session.update(_sessionID,key,value);
 | 
												
													
														
															|  | 
 |  | +    }
 | 
												
													
														
															|  | 
 |  | +    this.setExpireTime = function(expire,autoRenewExpire){
 | 
												
													
														
															|  | 
 |  | +        Session.setExpireTime(_sessionID,expire,autoRenewExpire);
 | 
												
													
														
															|  | 
 |  | +    }
 | 
												
													
														
															|  | 
 |  | +    if(sessionID){
 | 
												
													
														
															|  | 
 |  | +        Session.get(sessionID,function(err,session){
 | 
												
													
														
															|  | 
 |  | +            if(err || !session){
 | 
												
													
														
															|  | 
 |  | +                Session.set('status',0,function(err,new_session){
 | 
												
													
														
															|  | 
 |  | +                    _data = new_session.data;
 | 
												
													
														
															|  | 
 |  | +                    _this.sessionID = new_session.id;
 | 
												
													
														
															|  | 
 |  | +                    if(callback) callback(new_session.id,_this);
 | 
												
													
														
															|  | 
 |  | +                });
 | 
												
													
														
															|  | 
 |  | +            }else{
 | 
												
													
														
															|  | 
 |  | +                _data = session.data;
 | 
												
													
														
															|  | 
 |  | +                _this.sessionID = session.id;
 | 
												
													
														
															|  | 
 |  | +                if(callback) callback(session.id,_this);
 | 
												
													
														
															|  | 
 |  | +            }
 | 
												
													
														
															|  | 
 |  | +        });
 | 
												
													
														
															|  | 
 |  | +    }else{
 | 
												
													
														
															|  | 
 |  | +        Session.set('status',0,function(err,new_session){
 | 
												
													
														
															|  | 
 |  | +            _data = new_session.data;
 | 
												
													
														
															|  | 
 |  | +            _sessionID = new_session.id;
 | 
												
													
														
															|  | 
 |  | +            _this.sessionID = new_session.id;
 | 
												
													
														
															|  | 
 |  | +            if(callback) callback(new_session.id,_this);
 | 
												
													
														
															|  | 
 |  | +        });
 | 
												
													
														
															|  |      }
 |  |      }
 | 
												
													
														
															|  | -}
 |  | 
 | 
												
													
														
															|  | 
 |  | +    return this;
 | 
												
													
														
															|  | 
 |  | +}
 |