diff --git a/spec/state-store-spec.js b/spec/state-store-spec.js new file mode 100644 index 000000000..f505cf607 --- /dev/null +++ b/spec/state-store-spec.js @@ -0,0 +1,37 @@ +/** @babel */ +import {it, ffit, fffit, beforeEach, afterEach} from './async-spec-helpers' + +const StateStore = require('../src/state-store.js') + +describe("StateStore", () => { + it("can save and load states", () => { + const store = new StateStore() + return store.save('key', {foo:'bar'}) + .then(() => store.load('key')) + .then((state) => { + expect(state).toEqual({foo:'bar'}) + }) + }) + + describe("when there is an error reading from the database", () => { + it("rejects the promise returned by load", () => { + const store = new StateStore() + + const fakeErrorEvent = {target: {errorCode: "Something bad happened"}} + + spyOn(IDBObjectStore.prototype, 'get').andCallFake((key) => { + let request = {} + process.nextTick(() => request.onerror(fakeErrorEvent)) + return request + }) + + return store.load('nonexistentKey') + .then(() => { + throw new Error("Promise should have been rejected") + }) + .catch((event) => { + expect(event).toBe(fakeErrorEvent) + }) + }) + }) +}) diff --git a/src/state-store.js b/src/state-store.js new file mode 100644 index 000000000..7d6ee79f6 --- /dev/null +++ b/src/state-store.js @@ -0,0 +1,45 @@ +'use strict' + +module.exports = +class StateStore { + constructor () { + this.dbPromise = new Promise((resolve, reject) => { + let dbOpenRequest = indexedDB.open('AtomEnvironments', 1) + dbOpenRequest.onupgradeneeded = (event) => { + let db = event.target.result + db.createObjectStore('states') + resolve(db) + } + dbOpenRequest.onsuccess = () => { + resolve(dbOpenRequest.result) + } + dbOpenRequest.onerror = reject + }) + } + + save (key, value) { + return this.dbPromise.then(db => { + return new Promise((resolve, reject) => { + var request = db.transaction(['states'], 'readwrite') + .objectStore('states') + .put(value, key) + + request.onsuccess = resolve + request.onerror = reject + }) + }) + } + + load (key) { + return this.dbPromise.then(db => { + return new Promise((resolve, reject) => { + var request = db.transaction(['states']) + .objectStore('states') + .get(key) + + request.onsuccess = (event) => resolve(event.target.result) + request.onerror = (event) => reject(event) + }) + }) + } +}