@browser-storage/core
Version:
169 lines (168 loc) • 5.64 kB
JavaScript
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);