UNPKG

@deepjs/storage

Version:

browser storage

190 lines (159 loc) 5.82 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.session = exports.storage = exports.Storage = exports.sessionStorage = exports.localStorage = void 0; function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } /*! * @Author: cloudyan <cloudcode@qq.com> * @Created at: 2020-03-25 21:59:21 * 功能说明: */ var win = {}; if (typeof window !== 'undefined') { win = window; } var _win = win, localStorage = _win.localStorage, sessionStorage = _win.sessionStorage; exports.sessionStorage = sessionStorage; exports.localStorage = localStorage; var STORAGE_KEY = 'web_global'; var store = { local: localStorage, session: sessionStorage }; var storageData = {}; // 数据缓存,还可以结合LRU // // { // timeout: "2018/04/10 18:08:06", // savedate: "2018/04/10 17:38:06", // value: {}, // } /** * 缓存机制 * * 支持自定义缓存时间 * * @export * @class Storage */ var Storage = /*#__PURE__*/function () { function Storage() { var prekey = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'store'; var type = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'local'; _classCallCheck(this, Storage); if (typeof window === 'undefined') return {}; // 删除自加属性,避免因顺序产生的 `prekey` 意外 // 为处理老版本问题,此方法应设定一个定期清除的机制 // 可以内置一个数据来管理此方法生效,版本、何时清除老数据等问题 var storeKey = "".concat(prekey); if (type !== 'local') { type = 'session'; } this.storeKey = storeKey; this.storeType = type; var data = store[type].getItem(storeKey) || null; storageData[storeKey] = JSON.parse(data) || {}; } _createClass(Storage, [{ key: "set", value: function set(key, value) { var time = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 600; var cycle = arguments.length > 3 ? arguments[3] : undefined; // time 单位秒,默认600为10分钟,传0 代表永久性缓存 // cycle 单位秒,指定隔天N点时间过后即过期,如每日凌晨2点过去,设定 cycle=7200 if (!key) return; if (!isInteger(Number(time))) { console.error("'time' must be Integer Number"); return; } if (typeof cycle !== 'undefined' && !isInteger(Number(cycle))) { console.error("'cycle' must be Integer Number"); return; } try { var data = { value: value }; if (typeof cycle !== 'undefined') { data.cycle = cycle; } if (!isInteger(Number(time))) { console.error("'time' must be Integer Number"); return; } if (time) { data.timeout = Date.now() - 1 + time * 1000; } var storeKey = this.storeKey, storeType = this.storeType; var curData = storageData[storeKey]; Object.assign(curData, _defineProperty({}, "".concat(key), data)); store[storeType].setItem("".concat(storeKey), JSON.stringify(curData)); } catch (e) { // localStorage写满时,全清掉 if (e.name === 'QuotaExceededError') { // 删除离过期时间最近的缓存 // 暂时全部删除 this.clear(true); } } } }, { key: "get", value: function get(key) { if (!key) return; var storeKey = this.storeKey; var temp = storageData[storeKey][key]; if (!temp) return; // 缓存不存在 if (!temp.value) return; var now = Date.now(); if (temp.timeout && temp.timeout < now) { // 缓存过期 this.remove(key); return; } if (temp.timeout && typeof temp.cycle === 'number') { var cycleEndTimes = new Date(temp.timeout).setHours(0, 0, 0, 0) + temp.cycle * 1000; if (temp.timeout < cycleEndTimes) { // 缓存周期点过期 this.remove(key); return; } } return temp.value; } }, { key: "remove", value: function remove(key) { if (!key) return; var storeKey = this.storeKey, storeType = this.storeType; var curData = storageData[storeKey]; delete storageData[storeKey][key]; store[storeType].setItem("".concat(storeKey), JSON.stringify(curData)); } }, { key: "clear", value: function clear(bool) { var storeKey = this.storeKey, storeType = this.storeType; if (!bool) { storageData[storeKey] = {}; store[storeType].removeItem("".concat(storeKey)); } else { storageData = {}; store[storeType].clear(); } } }]); return Storage; }(); exports.Storage = Storage; var storage = new Storage(); exports.storage = storage; var session = new Storage('session', 'session'); exports.session = session;