{"version":3,"sources":["https://lively-kernel.org/lively4/lively4-core/src/external/focalStorage.js"],"names":["config","keys","key","length","clear","removeItem","setItem","getItems","getItem","openTransaction","openStore","openDatabase","db","Promise","resolve","reject","openreq","indexedDB","open","focalStorage","settings","name","version","onsuccess","result","onupgradeneeded","createObjectStore","storeName","onerror","error","type","then","transaction","objectStore","store","req","get","value","undefined","catch","getAll","console","warn","String","put","oncomplete","onabort","delete","callback","count","n","advanced","openCursor","cursor","advance","push","continue","Object","assign","DEFAULT_SETTINGS","INDEXEDDB","LOCALSTORAGE","driver"],"mappings":"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","file":"focalStorage.js","sourcesContent":["/* globals indexedDB */\n/**\n * focalStorage\n *\n * A Promise-based, localStorage-like wrapper around IndexedDB.\n *\n * -\n *\n * Borrowed lots of code from\n *\n * https://github.com/mozilla/localForage/blob/080f665/src/drivers/indexeddb.js and\n * https://github.com/mozilla-b2g/gaia/blob/12d71f3/shared/js/async_storage.js\n *\n * -\n *\n * This file defines an asynchronous version of the localStorage API, backed by\n * an IndexedDB database. It creates a focalStorage object that has methods\n * like the localStorage object's.\n *\n * To store a value use setItem:\n *\n *   focalStorage.setItem('key', 'value');\n *\n * If you want confirmation that the value has been stored, pass a callback\n * function as the third argument:\n *\n *  focalStorage.setItem('key', 'newvalue').then(function () {\n *    console.log('new value stored');\n *  });\n *\n * To read a value, call getItem(), but note that you must supply a callback\n * function that the value will be passed to asynchronously:\n *\n *  focalStorage.getItem('key').then(function (value) {\n *    console.log('The value of key is:', value);\n *  });\n *\n * Note that unlike localStorage, focalStorage does not allow you to store and\n * retrieve values by setting and querying properties directly. You cannot just\n * write focalStorage.key; you have to explicitly call setItem() or getItem().\n *\n * removeItem(), clear(), length(), and key() are like the same-named methods of\n * localStorage, but, like getItem() and setItem() they take a callback\n * argument.\n *\n * The asynchronous nature of getItem() makes it tricky to retrieve multiple\n * values. But unlike localStorage, focalStorage does not require the values you\n * store to be strings. So if you need to save multiple values and want to\n * retrieve them together, in a single asynchronous operation, just group the\n * values into a single object. The properties of this object may not include\n * DOM elements, but they may include things like Blobs and typed arrays.\n */\n\n'use strict';\n\nvar db = null;\n\nfunction openDatabase() {\n  return new Promise(function (resolve, reject) {\n    if (db) {\n      resolve(db);\n      return;\n    }\n\n    var openreq = indexedDB.open(focalStorage.settings.name,\n                                 focalStorage.settings.version);\n\n    openreq.onsuccess = function () {\n      db = openreq.result;\n      resolve(db);\n    };\n\n    openreq.onupgradeneeded = function () {\n      // First time setup: create an empty object store.\n      openreq.result.createObjectStore(focalStorage.settings.storeName);\n    };\n\n    openreq.onerror = function () {\n      reject(openreq.error);\n    };\n  });\n}\n\nfunction openStore(type) {\n  return openDatabase().then(function () {\n    var transaction = db.transaction(focalStorage.settings.storeName, type);\n\n    return transaction.objectStore(focalStorage.settings.storeName);\n  });\n}\n\nfunction openTransaction(type) {\n  return openDatabase().then(function () {\n    return db.transaction(focalStorage.settings.storeName, type);\n  });\n}\n\nfunction getItem(key) {\n  return new Promise(function (resolve, reject) {\n    return openStore('readonly').then(function (store) {\n      var req = store.get(key);\n\n      req.onsuccess = function () {\n        var value = req.result;\n        if (value === undefined) {\n          value = null;\n        }\n\n        resolve(value);\n      };\n\n      req.onerror = function () {\n        reject(req.error);\n      };\n    }).catch(reject);\n  });\n}\n\nfunction getItems() {\n  return new Promise(function (resolve, reject) {\n    return openStore('readonly').then(function (store) {\n      var req = store.getAll();\n\n      req.onsuccess = function () {\n        var value = req.result;\n        if (value === undefined) {\n          value = null;\n        }\n\n        resolve(value);\n      };\n\n      req.onerror = function () {\n        reject(req.error);\n      };\n    }).catch(reject);\n  });\n}\n\nfunction setItem(key, value) {\n  return new Promise(function (resolve, reject) {\n    return openTransaction('readwrite').then(function (transaction) {\n\n      var store = transaction.objectStore(focalStorage.settings.storeName);\n\n      // Cast the key to a string, as that's all we can set as a key.\n      if (typeof key !== 'string') {\n        console.warn(key + ' used as a key, but it is not a string');\n        key = String(key);\n      }\n\n      // The reason we don't _save_ null is because IE 10 does\n      // not support saving the `null` type in IndexedDB.\n      if (value === null) {\n        value = undefined;\n      }\n\n      var req = store.put(value, key);\n\n      transaction.oncomplete = function () {\n        // Cast to undefined so the value passed to\n        // callback/promise is the same as what one would get out\n        // of `getItem()` later. This leads to some weirdness\n        // (setItem('foo', undefined) will return `null`), but\n        // it's not my fault localStorage is our baseline and that\n        // it's weird.\n        if (value === undefined) {\n          value = null;\n        }\n\n        resolve(value);\n      };\n\n      transaction.onabort = transaction.onerror = function () {\n        reject(req.error ? req.error : req.transaction.error);\n      };\n    }).catch(reject);\n  });\n}\n\nfunction removeItem(key) {\n  return new Promise(function (resolve, reject) {\n    return openTransaction('readwrite').then(function (transaction) {\n      var store = transaction.objectStore(focalStorage.settings.storeName);\n\n      // Cast the key to a string, as that's all we can set as a key.\n      if (typeof key !== 'string') {\n        console.warn(key + ' used as a key, but it is not a string');\n        key = String(key);\n      }\n\n      var req = store.delete(key);\n\n      transaction.oncomplete = function () {\n        resolve();\n      };\n\n      transaction.onerror = function () {\n        reject(req.error);\n      };\n\n      // The request will also be aborted if storage space is exceeded.\n      transaction.onabort = function () {\n        reject(req.error ? req.error : req.transaction.error);\n      };\n    }).catch(reject);\n  });\n}\n\nfunction clear() {\n  return new Promise(function (resolve, reject) {\n    return openTransaction('readwrite').then(function (transaction) {\n      var store = transaction.objectStore(focalStorage.settings.storeName);\n\n      var req = store.clear();\n\n      transaction.oncomplete = function () {\n        resolve();\n      };\n\n      transaction.onabort = transaction.onerror = function () {\n        reject(req.error ? req.error : req.transaction.error);\n      };\n    }).catch(reject);\n  });\n}\n\nfunction length(callback) {\n  return new Promise(function (resolve, reject) {\n    openStore('readonly').then(function (store) {\n      var req = store.count();\n\n      req.onsuccess = function () {\n        resolve(req.result);\n      };\n\n      req.onerror = function () {\n        reject(req.error);\n      };\n    }).catch(reject);\n  });\n}\n\nfunction key(n) {\n  return new Promise(function (resolve, reject) {\n    if (n < 0) {\n      resolve(null);\n      return;\n    }\n\n    return openStore('readonly').then(function (store) {\n      var advanced = false;\n      var req = store.openCursor();\n\n      req.onsuccess = function () {\n        var cursor = req.result;\n\n        if (!cursor) {\n          // This means there weren't enough keys.\n          resolve(null);\n          return;\n        }\n\n        if (n === 0) {\n          // We have the first key; return it if that's what they wanted.\n          resolve(cursor.key);\n        } else {\n          if (!advanced) {\n            // Otherwise, ask the cursor to skip ahead `n` records.\n            advanced = true;\n            cursor.advance(n);\n          } else {\n            // When we get here, we've got the nth key.\n            resolve(cursor.key);\n          }\n        }\n      };\n\n      req.onerror = function () {\n        reject(req.error);\n      };\n    }).catch(reject);\n  });\n}\n\nfunction keys() {\n  return new Promise(function (resolve, reject) {\n    return openStore('readonly').then(function (store) {\n      var req = store.openCursor();\n      var keys = [];\n\n      req.onsuccess = function () {\n        var cursor = req.result;\n\n        if (!cursor) {\n          resolve(keys);\n          return;\n        }\n\n        keys.push(cursor.key);\n        cursor.continue();\n      };\n\n      req.onerror = function () {\n        reject(req.error);\n      };\n\n    }).catch(reject);\n  });\n}\n\n/**\n * Assigns configurations.\n * @param {Object} settings Options object to use for `focalStorage` instance.\n */\nfunction config(settings) {\n  focalStorage.settings = Object.assign({}, DEFAULT_SETTINGS, settings || {});\n}\n\nvar focalStorage = {\n  INDEXEDDB: 0,\n  LOCALSTORAGE: 1,\n  getItem: getItem,\n  getItems: getItems,\n  setItem: setItem,\n  removeItem: removeItem,\n  clear: clear,\n  length: length,\n  key: key,\n  keys: keys\n};\n\nvar DEFAULT_SETTINGS = {\n  driver: focalStorage.indexedDB,\n  name: 'focalStorage',\n  version: 1,\n  storeName: 'keyvaluepairs',\n};\n\nfocalStorage.settings = DEFAULT_SETTINGS;\n\nexport default focalStorage;"]}