modern-api.storage
Version:
localStorage enhancer
71 lines (67 loc) • 1.82 kB
JavaScript
;
Object.defineProperty(exports, '__esModule', { value: true });
// index.ts
var StorageEnhancer = class {
constructor(storage) {
this.storage = storage;
}
hasItem(key) {
return typeof this.storage.getItem(key) === "string";
}
staleItem(key) {
if (!this.hasItem(key))
return false;
const { start, ttl } = this._parseValue(this.storage.getItem(key));
return this._isStale(start, ttl);
}
getItem(key, { removeStale, updateAge } = {}) {
if (!this.hasItem(key))
return null;
const { value, start, ttl } = this._parseValue(this.storage.getItem(key));
if (this._isStale(start, ttl)) {
removeStale && this.removeItem(key);
return null;
}
if (updateAge)
this.setItem(key, value, { ttl });
return value;
}
setItem(key, value, { ttl } = {}) {
this.storage.setItem(key, this._prependExpire(value, ttl));
}
getJson(key, options = {}) {
try {
return JSON.parse(this.getItem(key, options));
} catch {
return null;
}
}
setJson(key, value, options = {}) {
this.setItem(key, JSON.stringify(value), options);
}
removeItem(key) {
this.storage.removeItem(key);
}
clear() {
this.storage.clear();
}
_prependExpire(value, ttl) {
return this._isNumber(ttl) ? `start:${+new Date()}:ttl:${ttl}:${value}` : value;
}
_parseValue(value) {
const reg = /^start:(\d+):ttl:(\d+):/;
const result = value.match(reg);
return {
value: value.replace(reg, ""),
start: result && result[1],
ttl: result && result[2]
};
}
_isStale(start, ttl) {
return this._isNumber(start) && this._isNumber(ttl) && Number(start) + Number(ttl) < +new Date();
}
_isNumber(n) {
return !isNaN(parseFloat(n));
}
};
exports.StorageEnhancer = StorageEnhancer;