1 namespace("kivi.FileDB", function(ns) {
 
   4   const database = 'kivi';
 
   9   const indexedDB = window.indexedDB || window.webkitIndexedDB || window.mozIndexedDB || window.OIndexedDB || window.msIndexedDB;
 
  11   // Create/open database
 
  13   let request = indexedDB.open(database, db_version);
 
  14   request.onupgradeneeded = (event) => {
 
  15     ns.create_image_store(event.target.result);
 
  17   request.onerror = ns.onerror;
 
  18   request.aftersuccess = [];
 
  19   request.onsuccess = () => {
 
  22     db.onerror = (event) => {
 
  23       console.error("Error creating/accessing IndexedDB database");
 
  27     // Interim solution for Google Chrome to create an objectStore. Will be deprecated
 
  29       if (db.version != db_version) {
 
  30         let setVersion = db.setVersion(db_version);
 
  31         setVersion.onsuccess = () =>  {
 
  32           ns.create_image_store(db);
 
  37     request.aftersuccess.forEach(f => f());
 
  40   ns.create_image_store = function (db) {
 
  41     db.createObjectStore(store, { autoIncrement : true });
 
  44   ns.store_image = function (blob, filename, success) {
 
  45     ns.open_rw_store((store) => {
 
  46       let put_request = store.add(blob, filename);
 
  48       put_request.onsuccess = success;
 
  49       put_request.on_error = ns.onerror;
 
  53   ns.retrieve_image = function(key, success) {
 
  54     ns.open_ro_store((store) => {
 
  55       let get_request = store.get(key);
 
  57       get_request.onsuccess = success;
 
  58       get_request.onerror = request.onerror;
 
  62   ns.retrieve_all = function(success) {
 
  63     ns.open_ro_store((store) => {
 
  64       let request = store.getAll();
 
  65       request.onsuccess = (event) => { success(event.target.result); };
 
  66       request.onerror = ns.error;
 
  70   ns.retrieve_all_keys = function(success) {
 
  71     ns.open_ro_store((store) => {
 
  72       let request = store.getAllKeys();
 
  73       request.onsuccess = (event) => { success(event.target.result); };
 
  74       request.onerror = ns.error;
 
  78   ns.delete_all = function(success) {
 
  79     ns.open_rw_store((store) => {
 
  80       let request = store.clear();
 
  81       request.onsuccess = success;
 
  82       request.onerror = ns.error;
 
  86   ns.delete_key = function(key, success) {
 
  87     ns.open_rw_store((store) => {
 
  88       let request = store.delete(key);
 
  89       request.onsuccess = (event) => { if (success) success(event.target.result); };
 
  90       request.onerror = ns.error;
 
  94   ns.open_rw_store = function(callback) {
 
  95     if (db && db_version == db.version) {
 
  96       callback(ns.open_store("readwrite"));
 
  98       request.aftersuccess.push(() => callback(ns.open_store("readwrite")));
 
 102   ns.open_ro_store = function(callback) {
 
 103     if (db && db_version == db.version) {
 
 104       callback(ns.open_store("readonly"));
 
 106       request.aftersuccess.push(() => callback(ns.open_store("readonly")));
 
 110   ns.open_store = function(mode = "readonly") {
 
 111     return db.transaction([store], mode).objectStore(store);
 
 114   ns.onerror = (event) => {
 
 115     console.error("Error creating/accessing IndexedDB database");
 
 116     console.error(event.errorState);
 
 119   ns.with_db = function(success) {
 
 120     if (db && db_version == db.version) {
 
 123       // assume the page load db init isn't done yet and push it onto the success
 
 124       request.aftersuccess.push(success);