import md5 from 'js-md5' 
 | 
const buildCacheImpl = impl => { 
 | 
  return { 
 | 
    __check () { 
 | 
      if (!impl) { 
 | 
        throw new Error('missing cache impl') 
 | 
      } 
 | 
    }, 
 | 
    __get (key) { 
 | 
      this.__check(key) 
 | 
      if (key == null) { 
 | 
        return null 
 | 
      } 
 | 
      const value = impl.getItem(key) 
 | 
      if (value == null) { 
 | 
        return null 
 | 
      } 
 | 
      try { 
 | 
        const valueObj = JSON.parse(value) 
 | 
        // 已过期处理 
 | 
        if (valueObj.expiredTime != null && new Date().getTime() > valueObj.expiredTime) { 
 | 
          this.remove(key) 
 | 
          return null 
 | 
        } 
 | 
        return valueObj 
 | 
      } catch (e) { 
 | 
        return { value } 
 | 
      } 
 | 
    }, 
 | 
    /** 
 | 
     * 写入缓存 
 | 
     * 
 | 
     * @param key 键 
 | 
     * @param value 值 
 | 
     * @param timeout 超时时间,单位毫秒,-1表示不超时 
 | 
     */ 
 | 
    set (key, value, timeout = -1) { 
 | 
      if (key == null) { 
 | 
        return 
 | 
      } 
 | 
      if (value == null) { 
 | 
        return 
 | 
      } 
 | 
      let type = typeof value 
 | 
      if (value instanceof Date) { 
 | 
        type = 'date' 
 | 
      } 
 | 
      let actualValue = value 
 | 
      if (type === 'object') { 
 | 
        actualValue = JSON.stringify(value) 
 | 
      } 
 | 
      if (type === 'date') { 
 | 
        actualValue = value.getTime() 
 | 
      } 
 | 
      const birthtime = new Date().getTime() 
 | 
      const valueObj = { 
 | 
        type, 
 | 
        value: actualValue, 
 | 
        birthtime, 
 | 
        expiredTime: timeout === -1 ? null : birthtime + timeout 
 | 
      } 
 | 
      impl.setItem(key, JSON.stringify(valueObj)) 
 | 
    }, 
 | 
    /** 
 | 
     * 获取缓存值 
 | 
     * 
 | 
     * @param key 键 
 | 
     * @returns {SVGPoint | SVGNumber | string | SVGTransform | SVGLength | SVGPathSeg | T|*|any|{value}|null|any} 
 | 
     */ 
 | 
    get (key) { 
 | 
      const valueObj = this.__get(key) 
 | 
      if (valueObj == null) { 
 | 
        return null 
 | 
      } 
 | 
      if (typeof valueObj !== 'object') { 
 | 
        return valueObj 
 | 
      } 
 | 
      if (valueObj.value == null) { 
 | 
        return null 
 | 
      } 
 | 
      if (valueObj.type === 'date') { 
 | 
        return new Date(valueObj.value) 
 | 
      } 
 | 
      if (valueObj.type === 'object') { 
 | 
        return JSON.parse(valueObj.value) 
 | 
      } 
 | 
      return valueObj.value 
 | 
    }, 
 | 
    /** 
 | 
     * 删除缓存值 
 | 
     * 
 | 
     * @param key 键 
 | 
     */ 
 | 
    remove (key) { 
 | 
      impl.removeItem(key) 
 | 
    } 
 | 
  } 
 | 
} 
 | 
  
 | 
export default { 
 | 
  /** 
 | 
   * 默认使用localStorage来记录缓存 
 | 
   */ 
 | 
  ...buildCacheImpl(window.localStorage), 
 | 
  /** 
 | 
   * 会话级缓存 
 | 
   */ 
 | 
  session: buildCacheImpl(window.sessionStorage), 
 | 
  /** 
 | 
   * 本地缓存 
 | 
   */ 
 | 
  local: buildCacheImpl(window.localStorage), 
 | 
  /** 
 | 
   * 2FA缓存 
 | 
   */ 
 | 
  twoFA: { 
 | 
    ...buildCacheImpl(window.sessionStorage), 
 | 
    /** 
 | 
     * 设置认证密码 
 | 
     * 
 | 
     * @param value 密码 
 | 
     * @param rememberPwd 是否记住密码 
 | 
     */ 
 | 
    setPassword (value, rememberPwd = false) { 
 | 
      value = md5(value) 
 | 
      // 记住密码时,默认记住5分钟 
 | 
      const timeout = 5 * 60 * 1000 
 | 
      this.set('eva-2fa-password', value, rememberPwd ? timeout : -1) 
 | 
    }, 
 | 
    /** 
 | 
     * 获取认证密码 
 | 
     * @returns {*} 
 | 
     */ 
 | 
    getPassword () { 
 | 
      return this.get('eva-2fa-password') 
 | 
    }, 
 | 
    /** 
 | 
     * 删除认证密码 
 | 
     */ 
 | 
    removePassword () { 
 | 
      this.remove('eva-2fa-password') 
 | 
    } 
 | 
  } 
 | 
} 
 |