'use strict'; module.exports = class StateStore { constructor(databaseName, version) { this.connected = false; this.databaseName = databaseName; this.version = version; } get dbPromise() { if (!this._dbPromise) { this._dbPromise = new Promise(resolve => { const dbOpenRequest = indexedDB.open(this.databaseName, this.version); dbOpenRequest.onupgradeneeded = event => { let db = event.target.result; db.createObjectStore('states'); }; dbOpenRequest.onsuccess = () => { this.connected = true; resolve(dbOpenRequest.result); }; dbOpenRequest.onerror = error => { console.error('Could not connect to indexedDB', error); this.connected = false; resolve(null); }; }); } return this._dbPromise; } isConnected() { return this.connected; } connect() { return this.dbPromise.then(db => !!db); } save(key, value) { return new Promise((resolve, reject) => { this.dbPromise.then(db => { if (db == null) return resolve(); var request = db .transaction(['states'], 'readwrite') .objectStore('states') .put({ value: value, storedAt: new Date().toString() }, key); request.onsuccess = resolve; request.onerror = reject; }); }); } load(key) { return this.dbPromise.then(db => { if (!db) return; return new Promise((resolve, reject) => { var request = db .transaction(['states']) .objectStore('states') .get(key); request.onsuccess = event => { let result = event.target.result; if (result && !result.isJSON) { resolve(result.value); } else { resolve(null); } }; request.onerror = event => reject(event); }); }); } delete(key) { return new Promise((resolve, reject) => { this.dbPromise.then(db => { if (db == null) return resolve(); var request = db .transaction(['states'], 'readwrite') .objectStore('states') .delete(key); request.onsuccess = resolve; request.onerror = reject; }); }); } clear() { return this.dbPromise.then(db => { if (!db) return; return new Promise((resolve, reject) => { var request = db .transaction(['states'], 'readwrite') .objectStore('states') .clear(); request.onsuccess = resolve; request.onerror = reject; }); }); } count() { return this.dbPromise.then(db => { if (!db) return; return new Promise((resolve, reject) => { var request = db .transaction(['states']) .objectStore('states') .count(); request.onsuccess = () => { resolve(request.result); }; request.onerror = reject; }); }); } };