{"version":3,"sources":["https://lively-kernel.org/lively4/swt1-debugging/src/external/focalStorage.js"],"names":["db","openDatabase","Promise","resolve","reject","openreq","indexedDB","open","focalStorage","settings","name","version","onsuccess","result","onupgradeneeded","createObjectStore","storeName","onerror","error","openStore","type","then","transaction","objectStore","openTransaction","getItem","key","store","req","get","value","undefined","catch","getItems","getAll","setItem","console","warn","String","put","oncomplete","onabort","removeItem","delete","clear","length","callback","count","n","advanced","openCursor","cursor","advance","keys","push","continue","config","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;"]}