UNPKG

g-element

Version:

A collection of elements used by Authentic System Solutions

198 lines (169 loc) 4.85 kB
import '@polymer/polymer/polymer-legacy.js'; import { Polymer } from '@polymer/polymer/lib/legacy/polymer-fn.js'; /** * Sample usage: * <g-storage key="test" data="{{data}}" persisted-data="{{persistedData}}"></g-storage> */ /** * Fired on error * @event error */ /** * Fired on connected to index-db * @event connected */ /** * References: * https://developer.mozilla.org/en-US/docs/Web/API/IndexedDB_API/Using_IndexedDB * */ Polymer({ is: 'g-storage', properties: { /** * Indexed-db connection status */ connected: { type: Boolean, value: false, readOnly: true, notify: true }, /** * Data key. */ key: String, /** * Data to save to indexed-db store. */ data: Object, /** * Saved data from indexed-db store. */ persistedData: { type: Object, notify: true } }, observers: [ '_updatePersistedData(connected, data, key)' ], /** * Initiallize indexed db database on attached element. */ attached: function () { var indexedDB = window.indexedDB || window.mozIndexedDB || window.webkitIndexedDB || window.msIndexedDB || window.shimIndexedDB; if (!indexedDB) { console.warn("Your browser doesn't support a stable version of IndexedDB. Such and such feature will not be available."); } else { this._close(); this._connect(indexedDB); } }, /** * Close indexed db database on detached element. */ detached: function () { this._close(); }, /** * Connect or open indexed db. */ _connect(indexedDB) { const DB_NAME = "g-storage"; const DB_VERSION = 2; // Use a long long for this value (don't use a float) const DB_STORE_NAME = "client"; var request = indexedDB.open(DB_NAME, DB_VERSION); var _$ = this; request.onsuccess = function (event) { // Better use "this" than "req" to get the result to avoid problems with // garbage collection. _$.db = this.result; _$._setConnected(true); _$.fire('connected'); }; request.onerror = function (event) { console.error("IndexedDb error: ", event.target.errorCode); _$._setConnected(false); }; request.onupgradeneeded = function (event) { event.target.result.createObjectStore(DB_STORE_NAME); }; request.onclose = function (event) { console.info('The database "' + DB_NAME + '" has unexpectedly closed.'); _$._setConnected(false); }; }, /** * Close indexed db database. */ _close() { if (this.db) this.db.close(); }, /** * @param {string} mode either "readonly" or "readwrite" */ _getObjectStore(mode) { var tx = this.db.transaction("client", mode); return tx.objectStore("client"); }, /** * @param {object} request */ _promisifyRequest(request) { return new Promise(function (resolve, reject) { request.onsuccess = function () { resolve(request.result); }; request.onerror = function () { reject(request.error); }; }); }, /** * @method getStoredValue * @param {string/number} key */ getStoredValue(key) { var store = this._getObjectStore("readonly"); var request = store.get(key); return this._promisifyRequest(request); }, /** * @method setStoredValue * @param {string/object} data * @param {string/number} key */ setStoredValue(key, data) { var store = this._getObjectStore("readwrite"); var request = store.put(data, key); return this._promisifyRequest(request); }, /** * @method deleteStoredValue * @param {string/number} key */ deleteStoredValue(key) { var store = this._getObjectStore('readwrite'); var request = store.delete(key); return this._promisifyRequest(request); }, /** * @method deleteAllStoredValue */ deleteAllStoredValue() { var store = this._getObjectStore('readwrite'); var request = store.clear(); return this._promisifyRequest(request); }, _updatePersistedData(connected, data, key) { if (connected && data && key) { var _$ = this; this.setStoredValue(key, data).then((result) => { _$.persistedData = data; }).catch((err) => { _$.fire("error", err); }); } }, });