UNPKG

reactive-localstorage

Version:
263 lines 18.2 kB
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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