Files
atom/src/state-store.js
2019-05-31 18:33:56 +02:00

131 lines
3.0 KiB
JavaScript

'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;
});
});
}
};