@deepjs/storage
Version:
browser storage
190 lines (159 loc) • 5.82 kB
JavaScript
;
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;