/**
 * 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() {
Exemple #3
0
      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']