/** * Return database and store references. * * @param {String} storeName - The name of the objectStore. * @returns An Object with the store and a db close method exposed. */ function _dbAndStore (storeName) { let db; const schema = treo.schema().version(IDB_VERSION); Object.keys(IDB_STORES).forEach((store) => { schema.addStore(IDB_STORES[store]); }); db = treo(IDB_NAME, schema); return { /** * wrap db close */ close: () => { db.close(() => {}); }, store: db.store(storeName) }; }
"use strict"; import Emitter from "yasmf-emitter"; import treo from "treo"; let treoWebSql; if (typeof window !== "undefined") { treoWebSql = require("treo/plugins/treo-websql"); } //region private properties const _namespace = Symbol("_namespace"), _indexedDB = Symbol("_indexedDB"), _db = Symbol("_db"); //endregion const kvSchema = treo.schema() .version(1) .addStore("kv"); export default class IndexedDBKVStore extends Emitter { constructor({namespace = "_default", indexedDB} = {}) { super(); this[_namespace] = namespace; this[_indexedDB] = indexedDB; this[_db] = treo(namespace, kvSchema); if (!indexedDB) { this.db.use(treoWebsql()); } } get db() {
function($q, $window, _, ApplicationState, Configuration) { // Helper functions function isStorageAvailable() { return !!$window._indexedDB || !!$window.indexedDB || !!$window.msIndexedDB || !!$window.mozIndexedDB || !!$window.webkitIndexedDB || !!window.openDatabase; // there is WebSQL polyfill } function deepCloneValue(value) { return (function(value, undefined) { if (value === undefined) { return undefined; } return JSON.parse(JSON.stringify(value)); })(value); } function prepareValueForSaving(value) { if (_.isArray(value)) { return _.chain(value) .filter(function(value) { return !_.isFunction(value); }) .map(prepareValueForSaving) .value(); } if (_.isObject(value)) { var result = {}; _.each(value, function(value, key) { var isFunction = _.isFunction(value); var isAngular = ('' + key).substr(0, 1) == '$'; if (!isFunction && !isAngular) { result[key] = prepareValueForSaving(value); } }); return result; } return _.isFunction(value) ? null : value; } // Require modules var state = null; if (isStorageAvailable()) { var websql = require('treo/plugins/treo-websql'); var treo = require('treo'); // Describe db schema and connect to db var schema = treo.schema() .version(1) .addStore(Configuration.storage.collection, { key: 'key', increment: false }); var db = treo('fiscal-data-packager', schema).use(websql()); state = db.store(Configuration.storage.collection); } var result = { get: function(key) { return $q(function(resolve, reject) { if (state) { state.get(key, function(error, result) { if (error) { reject(error); } else { resolve(result ? result.value : null); } }); } else { resolve(null); } }); }, set: function(key, value) { return $q(function(resolve, reject) { if (state) { state.put({ key: key, value: value }, function(error, result) { if (error) { reject(error); } else { resolve(result); } }); } else { resolve(false); } }).then(function() {}); // Force execute }, saveApplicationState: function() { var state = deepCloneValue(prepareValueForSaving(ApplicationState)); return result.set(Configuration.storage.key, state); }, clearApplicationState: function() { for (var x in ApplicationState) { if (ApplicationState.hasOwnProperty(x)) { delete ApplicationState[x]; } } return result.set(Configuration.storage.key, null); }, restoreApplicationState: function() { return $q(function(resolve) { result.get(Configuration.storage.key) .then(function(value) { _.extend(ApplicationState, value); resolve(); }) .catch(function() { resolve(true); }); }); } }; return result; }
// This example shows how to use treo for simple string key/value storage. // Often you don't need objects and indexes, and just need simple async // localStorage. With treo-websql it can be used in all modern browsers. var treo = require('treo'); var websql = require('treo/plugins/treo-websql'); var fn = console.log.bind(console); // use it as callback // define schema with one storage with string key/values var schema = treo.schema() .version(1) .addStore('storage'); // create db var db = treo('key-value-storage', schema) .use(websql()); // support legacy browsers // save link to storage var store = db.store('storage'); // put values store.put('foo', 'value 1', fn); store.put('bar', 'value 2', fn); store.put('baz', 'value 3', fn); // get value by key store.get('bar', fn); // 'value 2' // get all store.all(fn); // ['value 1', 'value 2', 'value 3']