reactive-localstorage
Version:
A reactive localStorage with no dependency
263 lines • 18.2 kB
JavaScript
import { version } from './env';
const $injectMark = Symbol.for('reactive-localstorage-inject-mark');
const $handlers = Symbol.for('reactive-localstorage-handlers');
export class LocalStorage {
constructor(window, storage) {
this._events = {};
this._length = 0;
this._injected = false;
// istanbul ignore next
if (window) {
this.supported = true;
}
else {
this.supported = false;
window = new Window();
}
this.native = storage || window.localStorage;
this._cache = new Map();
listen(window, ({ key, newValue, oldValue, storageArea }) => {
if (storageArea !== storage)
return;
this.feed(key, newValue, oldValue);
});
}
get version() {
return version;
}
get length() {
return this.native.length;
}
key(index) {
return this.native.key(index);
}
getItem(key) {
this.inject();
const cache = this._cache;
if (cache.has(key))
return cache.get(key);
const value = getNative('getItem').call(this.native, key);
cache.set(key, value);
return value;
}
setItem(key, value) {
return this.set(key, String(value));
}
removeItem(key) {
return this.set(key, null);
}
clear() {
getNative('clear').call(this.native);
const cache = this._cache;
for (const key of cache.keys()) {
cache.set(key, null);
}
this.emit('change', null, null, null);
}
on(name, fn) {
this.inject();
let set = this._events[name];
if (!set) {
this._events[name] = set = new Set();
}
set.add(fn);
}
off(name, fn) {
const set = this._events[name];
if (set) {
set.delete(fn);
}
}
feed(key, newValue, oldValue) {
if (typeof key === 'string') {
this._cache.set(key, newValue);
if (newValue !== oldValue) {
try {
this.emit('change', key, newValue, oldValue);
}
catch (e) {
// tslint:disable-next-line no-console
console.error(e);
}
}
}
else {
this._cache.clear();
try {
this.emit('change', key, newValue, oldValue);
}
catch (e) {
// tslint:disable-next-line no-console
console.error(e);
}
}
}
set(key, value) {
const cache = this._cache;
const oldValue = cache.has(key) ? cache.get(key) : getNative('getItem').call(this.native, key);
if (typeof value === 'string') {
getNative('setItem').call(this.native, key, value);
}
else {
getNative('removeItem').call(this.native, key);
}
cache.set(key, value);
this.emit('change', key, value, oldValue);
}
emit(name, ...args) {
const set = this._events[name];
if (set) {
for (const fn of set.values()) {
fn.apply(null, args);
}
}
}
inject() {
if (this._injected)
return;
this._injected = true;
const storage = this.native;
const me = this;
const cache = this._cache;
const handlers = storage[$handlers] || (storage[$handlers] = []);
handlers.push({
injector: this,
getItem(key, value) {
cache.set(key, value);
},
setItem(key, value) {
me.feed(key, value, me.getItem(key));
},
removeItem(key) {
me.feed(key, null, me.getItem(key));
},
clear() {
me.feed(null, null, null);
},
});
}
}
function listen(target, cb) {
if (target.addEventListener) {
target.addEventListener('storage', cb, true);
// istanbul ignore next
}
else if (target.attachEvent) {
target.attachEvent('storage', cb);
// istanbul ignore next
}
else {
return false;
}
return true;
}
inject();
function inject() {
// istanbul ignore next
if (Storage.prototype[$injectMark]) {
console.warn(`Storage has been injected, there might be multi versions of reactive-localstorage`);
return;
}
const { getItem: nativeGetItem, setItem: nativeSetItem, removeItem: nativeRemoveItem, clear: nativeClear, } = Storage.prototype;
function injectedGetItem(key) {
const value = nativeGetItem.call(this, key);
const handlers = this[$handlers];
if (handlers) {
for (const { getItem: fn, injector: { native } } of handlers) {
if (this !== native)
continue;
if (typeof fn === 'function') {
fn.call(this, key, value);
}
}
}
return value;
}
injectedGetItem.native = nativeGetItem;
function injectedSetItem(key, value) {
value = String(value);
const handlers = this[$handlers];
if (handlers) {
for (const { setItem: fn, injector: { native } } of handlers) {
if (this !== native)
continue;
if (typeof fn === 'function') {
fn.call(this, key, value);
}
}
}
return nativeSetItem.call(this, key, value);
}
injectedSetItem.native = nativeSetItem;
function injectedRemoveItem(key) {
const handlers = this[$handlers];
if (handlers) {
for (const { removeItem: fn, injector: { native } } of handlers) {
if (this !== native)
continue;
if (typeof fn === 'function') {
fn.call(this, key);
}
}
}
return nativeRemoveItem.call(this, key);
}
injectedRemoveItem.native = nativeRemoveItem;
function injectedClear() {
const handlers = this[$handlers];
if (handlers) {
for (const { clear: fn, injector: { native } } of handlers) {
if (this !== native)
continue;
if (typeof fn === 'function') {
fn.call(this);
}
}
}
return nativeClear.call(this);
}
injectedClear.native = nativeClear;
Object.defineProperties(Storage.prototype, {
[$injectMark]: {
configurable: true,
enumerable: false,
writable: true,
value: true,
},
[$handlers]: {
configurable: true,
enumerable: false,
writable: true,
value: [],
},
getItem: {
configurable: true,
enumerable: false,
writable: true,
value: injectedGetItem,
},
setItem: {
configurable: true,
enumerable: false,
writable: true,
value: injectedSetItem,
},
removeItem: {
configurable: true,
enumerable: false,
writable: true,
value: injectedRemoveItem,
},
clear: {
configurable: true,
enumerable: false,
writable: true,
value: injectedClear,
},
});
}
function getNative(key) {
const fn = Storage.prototype[key];
return fn && fn.native || fn;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9jYWxzdG9yYWdlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2xvY2Fsc3RvcmFnZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sT0FBTyxDQUFBO0FBRS9CLE1BQU0sV0FBVyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsbUNBQW1DLENBQUMsQ0FBQTtBQUNuRSxNQUFNLFNBQVMsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLGdDQUFnQyxDQUFDLENBQUE7QUFFOUQsTUFBTSxPQUFPLFlBQVk7SUFXdkIsWUFBWSxNQUFlLEVBQUUsT0FBaUI7UUFQcEMsWUFBTyxHQUViLEVBQUUsQ0FBQTtRQUVJLFlBQU8sR0FBRyxDQUFDLENBQUE7UUFDWCxjQUFTLEdBQUcsS0FBSyxDQUFBO1FBR3pCLHVCQUF1QjtRQUN2QixJQUFJLE1BQU0sRUFBRTtZQUNWLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFBO1NBQ3RCO2FBQU07WUFDTCxJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQTtZQUN0QixNQUFNLEdBQUcsSUFBSSxNQUFNLEVBQUUsQ0FBQTtTQUN0QjtRQUNELElBQUksQ0FBQyxNQUFNLEdBQUcsT0FBTyxJQUFJLE1BQU0sQ0FBQyxZQUFZLENBQUE7UUFDNUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFBO1FBQ3ZCLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBRSxFQUFFLEVBQUU7WUFDMUQsSUFBSSxXQUFXLEtBQUssT0FBTztnQkFBRSxPQUFNO1lBQ25DLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLFFBQVEsRUFBRSxRQUFRLENBQUMsQ0FBQTtRQUNwQyxDQUFDLENBQUMsQ0FBQTtJQUNKLENBQUM7SUFFRCxJQUFJLE9BQU87UUFDVCxPQUFPLE9BQU8sQ0FB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