UNPKG

@browser-storage/core

Version:
169 lines (168 loc) 5.64 kB
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; return c > 3 && r && Object.defineProperty(target, key, r), r; }; import { BrowserStorageEvent, ClearBrowserStorageEvent, RemoveItemBrowserStorageEvent, SetItemBrowserStorageEvent } from './browser-storage-event'; function whenReady(target, propertyKey, descriptor) { const original = descriptor.value; descriptor.value = async function value(...args) { await this.ready(); return original.apply(this, args); }; } export const EVENT_KEY = '__browser_storage_event_'; export class BrowserStorage { constructor(options) { this._handlerStore = new Set(); this._storageChange = (evt) => { if (evt.key !== EVENT_KEY) { return; } const serializeEvent = localStorage.getItem(EVENT_KEY); const event = BrowserStorageEvent.deserialize(serializeEvent); if (event.name !== this.options.name || event.storeName !== this.options.storeName) { return; } this._applyHandlers(event); }; this._driver = (Array.isArray(options.drivers) ? options.drivers : [options.drivers]) .find(driver => driver.isSupported); this.options = Object.assign({}, options); delete this.options.drivers; this.init(options); } get isSupported() { return !!this._driver && this._driver.isSupported; } async ready() { return !!this._driver && this._driver.isSupported && this._driver.ready(); } async clear() { await this._driver.clear(); const event = new ClearBrowserStorageEvent({ name: this.options.name, storeName: this.options.storeName, version: this.options.version, key: null, oldValue: null, newValue: null }); this._triggerEvent(event); } async getItem(key) { return this._driver.getItem(key); } async iterate(iterator) { return this._driver.iterate(iterator); } async key(index) { return this._driver.key(index); } async keys() { return this._driver.keys(); } async length() { return this._driver.length(); } async removeItem(key) { const oldValue = await this.hasItem(key) ? await this.getItem(key) : undefined; await this._driver.removeItem(key); const event = new RemoveItemBrowserStorageEvent({ name: this.options.name, storeName: this.options.storeName, version: this.options.version, key, oldValue, newValue: null }); this._triggerEvent(event); } async setItem(key, item) { const oldValue = await this.hasItem(key) ? await this.getItem(key) : undefined; const result = await this._driver.setItem(key, item); const event = new SetItemBrowserStorageEvent({ name: this.options.name, storeName: this.options.storeName, version: this.options.version, key, oldValue, newValue: item }); this._triggerEvent(event); return result; } init(dbOptions) { this._initCrossTabNotification(); return !!this._driver && this._driver.init(dbOptions); } async hasItem(key) { return this._driver.hasItem(key); } async getDriver() { return this._driver; } async destroy() { window.removeEventListener('storage', this._storageChange); this._handlerStore.clear(); return this._driver.destroy(); } addEventListener(fn) { this._handlerStore.add(fn); return () => this.removeEventListener(fn); } removeEventListener(fn) { this._handlerStore.delete(fn); } _triggerEvent(event) { this._applyHandlers(event); this._triggerCrossTabEvent(event); } _triggerCrossTabEvent(event) { if (this.options.crossTabNotification) { localStorage.setItem(EVENT_KEY, BrowserStorageEvent.serialize(event.copyWith({ isCrossTab: true }))); } } _applyHandlers(event) { this._handlerStore.forEach(fn => fn(event)); } _initCrossTabNotification() { window.addEventListener('storage', this._storageChange); } } __decorate([ whenReady ], BrowserStorage.prototype, "clear", null); __decorate([ whenReady ], BrowserStorage.prototype, "getItem", null); __decorate([ whenReady ], BrowserStorage.prototype, "iterate", null); __decorate([ whenReady ], BrowserStorage.prototype, "key", null); __decorate([ whenReady ], BrowserStorage.prototype, "keys", null); __decorate([ whenReady ], BrowserStorage.prototype, "length", null); __decorate([ whenReady ], BrowserStorage.prototype, "removeItem", null); __decorate([ whenReady ], BrowserStorage.prototype, "setItem", null); __decorate([ whenReady ], BrowserStorage.prototype, "hasItem", null); __decorate([ whenReady ], BrowserStorage.prototype, "getDriver", null);