diff --git a/dist/artplayer-plugin-danmu.css b/dist/artplayer-plugin-danmu.css
new file mode 100644
index 000000000..d3bbf749c
--- /dev/null
+++ b/dist/artplayer-plugin-danmu.css
@@ -0,0 +1 @@
+.artplayerPluginDanmu{display:-webkit-box;display:-ms-flexbox;display:flex}
\ No newline at end of file
diff --git a/docs/assets/example/github.js b/docs/assets/example/github.js
new file mode 100644
index 000000000..2929d0a6d
--- /dev/null
+++ b/docs/assets/example/github.js
@@ -0,0 +1,60 @@
+// 接口每小时限制 5000 次请求,勿滥用
+var github = new ArtplayerToolGithub({
+ api: 'zhw2590582/github-issues-api-as-danmuku/issues/1',
+ clientID: '749a95aad589f8849abe',
+ clientSecret: '7bb6fa67ef6e525e5bd5fda46cd3925ecc4a3760',
+});
+
+var url = 'https://zhw2590582.github.io/assets-cdn';
+var art = new Artplayer({
+ container: '.artplayer-app',
+ url: url + '/video/you-name.mp4',
+ autoSize: true,
+ controls: [
+ {
+ name: 'danmuku',
+ position: 'right',
+ html: '发送弹幕',
+ click: () => {
+ if (!github.isLogin) {
+ github.login();
+ } else {
+ var text = prompt('请输入:', '弹幕内容');
+ if (!text || !text.trim()) return;
+ if (github.remaining <= 10) {
+ art.notice.show('接口请求到达上限,请稍后再试!!!');
+ return;
+ }
+ art.notice.show('弹幕发送中...');
+ github
+ .send({
+ text: text,
+ time: art.player.currentTime,
+ color: '#' + Math.floor(Math.random() * 0xffffff).toString(16),
+ })
+ .then(data => {
+ art.notice.show(`发送弹幕成功: ${github.remaining} / ${github.limit}`);
+ art.plugins.artplayerPluginDanmu.emit({
+ ...data,
+ time: art.player.currentTime,
+ border: data.color,
+ });
+ }).catch(() => {
+ art.notice.show(`发送弹幕失败: ${github.remaining} / ${github.limit}`);
+ });
+ }
+ },
+ },
+ ],
+ plugins: [
+ artplayerPluginDanmu({
+ danmus: () => github.cache(),
+ speed: 5,
+ opacity: 1,
+ color: '#fff',
+ size: 25,
+ maxlength: 50,
+ margin: [10, 100],
+ }),
+ ],
+});
diff --git a/docs/index.html b/docs/index.html
index 476c345eb..6dc01ce70 100644
--- a/docs/index.html
+++ b/docs/index.html
@@ -34,6 +34,7 @@
- Component
diff --git a/docs/uncompiled/artplayer-tool-github.js b/docs/uncompiled/artplayer-tool-github.js
new file mode 100644
index 000000000..b78335022
--- /dev/null
+++ b/docs/uncompiled/artplayer-tool-github.js
@@ -0,0 +1,3032 @@
+(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
+ typeof define === 'function' && define.amd ? define(factory) :
+ (global = global || self, global['artplayer-tool-github'] = factory());
+}(this, function () { 'use strict';
+
+ var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};
+
+ function commonjsRequire () {
+ throw new Error('Dynamic requires are not currently supported by rollup-plugin-commonjs');
+ }
+
+ function unwrapExports (x) {
+ return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x['default'] : x;
+ }
+
+ function createCommonjsModule(fn, module) {
+ return module = { exports: {} }, fn(module, module.exports), module.exports;
+ }
+
+ function getCjsExportFromNamespace (n) {
+ return n && n['default'] || n;
+ }
+
+ var commonjsHelpers = /*#__PURE__*/Object.freeze({
+ commonjsGlobal: commonjsGlobal,
+ commonjsRequire: commonjsRequire,
+ unwrapExports: unwrapExports,
+ createCommonjsModule: createCommonjsModule,
+ getCjsExportFromNamespace: getCjsExportFromNamespace
+ });
+
+ var localforage = createCommonjsModule(function (module, exports) {
+ /*!
+ localForage -- Offline Storage, Improved
+ Version 1.7.3
+ https://localforage.github.io/localForage
+ (c) 2013-2017 Mozilla, Apache License 2.0
+ */
+ (function(f){{module.exports=f();}})(function(){return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof commonjsRequire=="function"&&commonjsRequire;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw (f.code="MODULE_NOT_FOUND", f)}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r);}return n[o].exports}var i=typeof commonjsRequire=="function"&&commonjsRequire;for(var o=0;o element; its readystatechange event will be fired asynchronously once it is inserted
+ // into the document. Do so, thus queuing up the task. Remember to clean up once it's been called.
+ var scriptEl = global.document.createElement('script');
+ scriptEl.onreadystatechange = function () {
+ nextTick();
+
+ scriptEl.onreadystatechange = null;
+ scriptEl.parentNode.removeChild(scriptEl);
+ scriptEl = null;
+ };
+ global.document.documentElement.appendChild(scriptEl);
+ };
+ } else {
+ scheduleDrain = function () {
+ setTimeout(nextTick, 0);
+ };
+ }
+ }
+
+ var draining;
+ var queue = [];
+ //named nextTick for less confusing stack traces
+ function nextTick() {
+ draining = true;
+ var i, oldQueue;
+ var len = queue.length;
+ while (len) {
+ oldQueue = queue;
+ queue = [];
+ i = -1;
+ while (++i < len) {
+ oldQueue[i]();
+ }
+ len = queue.length;
+ }
+ draining = false;
+ }
+
+ module.exports = immediate;
+ function immediate(task) {
+ if (queue.push(task) === 1 && !draining) {
+ scheduleDrain();
+ }
+ }
+
+ }).call(this,typeof commonjsGlobal !== "undefined" ? commonjsGlobal : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {});
+ },{}],2:[function(_dereq_,module,exports){
+ var immediate = _dereq_(1);
+
+ /* istanbul ignore next */
+ function INTERNAL() {}
+
+ var handlers = {};
+
+ var REJECTED = ['REJECTED'];
+ var FULFILLED = ['FULFILLED'];
+ var PENDING = ['PENDING'];
+
+ module.exports = Promise;
+
+ function Promise(resolver) {
+ if (typeof resolver !== 'function') {
+ throw new TypeError('resolver must be a function');
+ }
+ this.state = PENDING;
+ this.queue = [];
+ this.outcome = void 0;
+ if (resolver !== INTERNAL) {
+ safelyResolveThenable(this, resolver);
+ }
+ }
+
+ Promise.prototype["catch"] = function (onRejected) {
+ return this.then(null, onRejected);
+ };
+ Promise.prototype.then = function (onFulfilled, onRejected) {
+ if (typeof onFulfilled !== 'function' && this.state === FULFILLED ||
+ typeof onRejected !== 'function' && this.state === REJECTED) {
+ return this;
+ }
+ var promise = new this.constructor(INTERNAL);
+ if (this.state !== PENDING) {
+ var resolver = this.state === FULFILLED ? onFulfilled : onRejected;
+ unwrap(promise, resolver, this.outcome);
+ } else {
+ this.queue.push(new QueueItem(promise, onFulfilled, onRejected));
+ }
+
+ return promise;
+ };
+ function QueueItem(promise, onFulfilled, onRejected) {
+ this.promise = promise;
+ if (typeof onFulfilled === 'function') {
+ this.onFulfilled = onFulfilled;
+ this.callFulfilled = this.otherCallFulfilled;
+ }
+ if (typeof onRejected === 'function') {
+ this.onRejected = onRejected;
+ this.callRejected = this.otherCallRejected;
+ }
+ }
+ QueueItem.prototype.callFulfilled = function (value) {
+ handlers.resolve(this.promise, value);
+ };
+ QueueItem.prototype.otherCallFulfilled = function (value) {
+ unwrap(this.promise, this.onFulfilled, value);
+ };
+ QueueItem.prototype.callRejected = function (value) {
+ handlers.reject(this.promise, value);
+ };
+ QueueItem.prototype.otherCallRejected = function (value) {
+ unwrap(this.promise, this.onRejected, value);
+ };
+
+ function unwrap(promise, func, value) {
+ immediate(function () {
+ var returnValue;
+ try {
+ returnValue = func(value);
+ } catch (e) {
+ return handlers.reject(promise, e);
+ }
+ if (returnValue === promise) {
+ handlers.reject(promise, new TypeError('Cannot resolve promise with itself'));
+ } else {
+ handlers.resolve(promise, returnValue);
+ }
+ });
+ }
+
+ handlers.resolve = function (self, value) {
+ var result = tryCatch(getThen, value);
+ if (result.status === 'error') {
+ return handlers.reject(self, result.value);
+ }
+ var thenable = result.value;
+
+ if (thenable) {
+ safelyResolveThenable(self, thenable);
+ } else {
+ self.state = FULFILLED;
+ self.outcome = value;
+ var i = -1;
+ var len = self.queue.length;
+ while (++i < len) {
+ self.queue[i].callFulfilled(value);
+ }
+ }
+ return self;
+ };
+ handlers.reject = function (self, error) {
+ self.state = REJECTED;
+ self.outcome = error;
+ var i = -1;
+ var len = self.queue.length;
+ while (++i < len) {
+ self.queue[i].callRejected(error);
+ }
+ return self;
+ };
+
+ function getThen(obj) {
+ // Make sure we only access the accessor once as required by the spec
+ var then = obj && obj.then;
+ if (obj && (typeof obj === 'object' || typeof obj === 'function') && typeof then === 'function') {
+ return function appyThen() {
+ then.apply(obj, arguments);
+ };
+ }
+ }
+
+ function safelyResolveThenable(self, thenable) {
+ // Either fulfill, reject or reject with error
+ var called = false;
+ function onError(value) {
+ if (called) {
+ return;
+ }
+ called = true;
+ handlers.reject(self, value);
+ }
+
+ function onSuccess(value) {
+ if (called) {
+ return;
+ }
+ called = true;
+ handlers.resolve(self, value);
+ }
+
+ function tryToUnwrap() {
+ thenable(onSuccess, onError);
+ }
+
+ var result = tryCatch(tryToUnwrap);
+ if (result.status === 'error') {
+ onError(result.value);
+ }
+ }
+
+ function tryCatch(func, value) {
+ var out = {};
+ try {
+ out.value = func(value);
+ out.status = 'success';
+ } catch (e) {
+ out.status = 'error';
+ out.value = e;
+ }
+ return out;
+ }
+
+ Promise.resolve = resolve;
+ function resolve(value) {
+ if (value instanceof this) {
+ return value;
+ }
+ return handlers.resolve(new this(INTERNAL), value);
+ }
+
+ Promise.reject = reject;
+ function reject(reason) {
+ var promise = new this(INTERNAL);
+ return handlers.reject(promise, reason);
+ }
+
+ Promise.all = all;
+ function all(iterable) {
+ var self = this;
+ if (Object.prototype.toString.call(iterable) !== '[object Array]') {
+ return this.reject(new TypeError('must be an array'));
+ }
+
+ var len = iterable.length;
+ var called = false;
+ if (!len) {
+ return this.resolve([]);
+ }
+
+ var values = new Array(len);
+ var resolved = 0;
+ var i = -1;
+ var promise = new this(INTERNAL);
+
+ while (++i < len) {
+ allResolver(iterable[i], i);
+ }
+ return promise;
+ function allResolver(value, i) {
+ self.resolve(value).then(resolveFromAll, function (error) {
+ if (!called) {
+ called = true;
+ handlers.reject(promise, error);
+ }
+ });
+ function resolveFromAll(outValue) {
+ values[i] = outValue;
+ if (++resolved === len && !called) {
+ called = true;
+ handlers.resolve(promise, values);
+ }
+ }
+ }
+ }
+
+ Promise.race = race;
+ function race(iterable) {
+ var self = this;
+ if (Object.prototype.toString.call(iterable) !== '[object Array]') {
+ return this.reject(new TypeError('must be an array'));
+ }
+
+ var len = iterable.length;
+ var called = false;
+ if (!len) {
+ return this.resolve([]);
+ }
+
+ var i = -1;
+ var promise = new this(INTERNAL);
+
+ while (++i < len) {
+ resolver(iterable[i]);
+ }
+ return promise;
+ function resolver(value) {
+ self.resolve(value).then(function (response) {
+ if (!called) {
+ called = true;
+ handlers.resolve(promise, response);
+ }
+ }, function (error) {
+ if (!called) {
+ called = true;
+ handlers.reject(promise, error);
+ }
+ });
+ }
+ }
+
+ },{"1":1}],3:[function(_dereq_,module,exports){
+ (function (global){
+ if (typeof global.Promise !== 'function') {
+ global.Promise = _dereq_(2);
+ }
+
+ }).call(this,typeof commonjsGlobal !== "undefined" ? commonjsGlobal : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {});
+ },{"2":2}],4:[function(_dereq_,module,exports){
+
+ var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
+
+ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+ function getIDB() {
+ /* global indexedDB,webkitIndexedDB,mozIndexedDB,OIndexedDB,msIndexedDB */
+ try {
+ if (typeof indexedDB !== 'undefined') {
+ return indexedDB;
+ }
+ if (typeof webkitIndexedDB !== 'undefined') {
+ return webkitIndexedDB;
+ }
+ if (typeof mozIndexedDB !== 'undefined') {
+ return mozIndexedDB;
+ }
+ if (typeof OIndexedDB !== 'undefined') {
+ return OIndexedDB;
+ }
+ if (typeof msIndexedDB !== 'undefined') {
+ return msIndexedDB;
+ }
+ } catch (e) {
+ return;
+ }
+ }
+
+ var idb = getIDB();
+
+ function isIndexedDBValid() {
+ try {
+ // Initialize IndexedDB; fall back to vendor-prefixed versions
+ // if needed.
+ if (!idb) {
+ return false;
+ }
+ // We mimic PouchDB here;
+ //
+ // We test for openDatabase because IE Mobile identifies itself
+ // as Safari. Oh the lulz...
+ var isSafari = typeof openDatabase !== 'undefined' && /(Safari|iPhone|iPad|iPod)/.test(navigator.userAgent) && !/Chrome/.test(navigator.userAgent) && !/BlackBerry/.test(navigator.platform);
+
+ var hasFetch = typeof fetch === 'function' && fetch.toString().indexOf('[native code') !== -1;
+
+ // Safari <10.1 does not meet our requirements for IDB support (#5572)
+ // since Safari 10.1 shipped with fetch, we can use that to detect it
+ return (!isSafari || hasFetch) && typeof indexedDB !== 'undefined' &&
+ // some outdated implementations of IDB that appear on Samsung
+ // and HTC Android devices <4.4 are missing IDBKeyRange
+ // See: https://github.com/mozilla/localForage/issues/128
+ // See: https://github.com/mozilla/localForage/issues/272
+ typeof IDBKeyRange !== 'undefined';
+ } catch (e) {
+ return false;
+ }
+ }
+
+ // Abstracts constructing a Blob object, so it also works in older
+ // browsers that don't support the native Blob constructor. (i.e.
+ // old QtWebKit versions, at least).
+ // Abstracts constructing a Blob object, so it also works in older
+ // browsers that don't support the native Blob constructor. (i.e.
+ // old QtWebKit versions, at least).
+ function createBlob(parts, properties) {
+ /* global BlobBuilder,MSBlobBuilder,MozBlobBuilder,WebKitBlobBuilder */
+ parts = parts || [];
+ properties = properties || {};
+ try {
+ return new Blob(parts, properties);
+ } catch (e) {
+ if (e.name !== 'TypeError') {
+ throw e;
+ }
+ var Builder = typeof BlobBuilder !== 'undefined' ? BlobBuilder : typeof MSBlobBuilder !== 'undefined' ? MSBlobBuilder : typeof MozBlobBuilder !== 'undefined' ? MozBlobBuilder : WebKitBlobBuilder;
+ var builder = new Builder();
+ for (var i = 0; i < parts.length; i += 1) {
+ builder.append(parts[i]);
+ }
+ return builder.getBlob(properties.type);
+ }
+ }
+
+ // This is CommonJS because lie is an external dependency, so Rollup
+ // can just ignore it.
+ if (typeof Promise === 'undefined') {
+ // In the "nopromises" build this will just throw if you don't have
+ // a global promise object, but it would throw anyway later.
+ _dereq_(3);
+ }
+ var Promise$1 = Promise;
+
+ function executeCallback(promise, callback) {
+ if (callback) {
+ promise.then(function (result) {
+ callback(null, result);
+ }, function (error) {
+ callback(error);
+ });
+ }
+ }
+
+ function executeTwoCallbacks(promise, callback, errorCallback) {
+ if (typeof callback === 'function') {
+ promise.then(callback);
+ }
+
+ if (typeof errorCallback === 'function') {
+ promise["catch"](errorCallback);
+ }
+ }
+
+ function normalizeKey(key) {
+ // Cast the key to a string, as that's all we can set as a key.
+ if (typeof key !== 'string') {
+ console.warn(key + ' used as a key, but it is not a string.');
+ key = String(key);
+ }
+
+ return key;
+ }
+
+ function getCallback() {
+ if (arguments.length && typeof arguments[arguments.length - 1] === 'function') {
+ return arguments[arguments.length - 1];
+ }
+ }
+
+ // Some code originally from async_storage.js in
+ // [Gaia](https://github.com/mozilla-b2g/gaia).
+
+ var DETECT_BLOB_SUPPORT_STORE = 'local-forage-detect-blob-support';
+ var supportsBlobs = void 0;
+ var dbContexts = {};
+ var toString = Object.prototype.toString;
+
+ // Transaction Modes
+ var READ_ONLY = 'readonly';
+ var READ_WRITE = 'readwrite';
+
+ // Transform a binary string to an array buffer, because otherwise
+ // weird stuff happens when you try to work with the binary string directly.
+ // It is known.
+ // From http://stackoverflow.com/questions/14967647/ (continues on next line)
+ // encode-decode-image-with-base64-breaks-image (2013-04-21)
+ function _binStringToArrayBuffer(bin) {
+ var length = bin.length;
+ var buf = new ArrayBuffer(length);
+ var arr = new Uint8Array(buf);
+ for (var i = 0; i < length; i++) {
+ arr[i] = bin.charCodeAt(i);
+ }
+ return buf;
+ }
+
+ //
+ // Blobs are not supported in all versions of IndexedDB, notably
+ // Chrome <37 and Android <5. In those versions, storing a blob will throw.
+ //
+ // Various other blob bugs exist in Chrome v37-42 (inclusive).
+ // Detecting them is expensive and confusing to users, and Chrome 37-42
+ // is at very low usage worldwide, so we do a hacky userAgent check instead.
+ //
+ // content-type bug: https://code.google.com/p/chromium/issues/detail?id=408120
+ // 404 bug: https://code.google.com/p/chromium/issues/detail?id=447916
+ // FileReader bug: https://code.google.com/p/chromium/issues/detail?id=447836
+ //
+ // Code borrowed from PouchDB. See:
+ // https://github.com/pouchdb/pouchdb/blob/master/packages/node_modules/pouchdb-adapter-idb/src/blobSupport.js
+ //
+ function _checkBlobSupportWithoutCaching(idb) {
+ return new Promise$1(function (resolve) {
+ var txn = idb.transaction(DETECT_BLOB_SUPPORT_STORE, READ_WRITE);
+ var blob = createBlob(['']);
+ txn.objectStore(DETECT_BLOB_SUPPORT_STORE).put(blob, 'key');
+
+ txn.onabort = function (e) {
+ // If the transaction aborts now its due to not being able to
+ // write to the database, likely due to the disk being full
+ e.preventDefault();
+ e.stopPropagation();
+ resolve(false);
+ };
+
+ txn.oncomplete = function () {
+ var matchedChrome = navigator.userAgent.match(/Chrome\/(\d+)/);
+ var matchedEdge = navigator.userAgent.match(/Edge\//);
+ // MS Edge pretends to be Chrome 42:
+ // https://msdn.microsoft.com/en-us/library/hh869301%28v=vs.85%29.aspx
+ resolve(matchedEdge || !matchedChrome || parseInt(matchedChrome[1], 10) >= 43);
+ };
+ })["catch"](function () {
+ return false; // error, so assume unsupported
+ });
+ }
+
+ function _checkBlobSupport(idb) {
+ if (typeof supportsBlobs === 'boolean') {
+ return Promise$1.resolve(supportsBlobs);
+ }
+ return _checkBlobSupportWithoutCaching(idb).then(function (value) {
+ supportsBlobs = value;
+ return supportsBlobs;
+ });
+ }
+
+ function _deferReadiness(dbInfo) {
+ var dbContext = dbContexts[dbInfo.name];
+
+ // Create a deferred object representing the current database operation.
+ var deferredOperation = {};
+
+ deferredOperation.promise = new Promise$1(function (resolve, reject) {
+ deferredOperation.resolve = resolve;
+ deferredOperation.reject = reject;
+ });
+
+ // Enqueue the deferred operation.
+ dbContext.deferredOperations.push(deferredOperation);
+
+ // Chain its promise to the database readiness.
+ if (!dbContext.dbReady) {
+ dbContext.dbReady = deferredOperation.promise;
+ } else {
+ dbContext.dbReady = dbContext.dbReady.then(function () {
+ return deferredOperation.promise;
+ });
+ }
+ }
+
+ function _advanceReadiness(dbInfo) {
+ var dbContext = dbContexts[dbInfo.name];
+
+ // Dequeue a deferred operation.
+ var deferredOperation = dbContext.deferredOperations.pop();
+
+ // Resolve its promise (which is part of the database readiness
+ // chain of promises).
+ if (deferredOperation) {
+ deferredOperation.resolve();
+ return deferredOperation.promise;
+ }
+ }
+
+ function _rejectReadiness(dbInfo, err) {
+ var dbContext = dbContexts[dbInfo.name];
+
+ // Dequeue a deferred operation.
+ var deferredOperation = dbContext.deferredOperations.pop();
+
+ // Reject its promise (which is part of the database readiness
+ // chain of promises).
+ if (deferredOperation) {
+ deferredOperation.reject(err);
+ return deferredOperation.promise;
+ }
+ }
+
+ function _getConnection(dbInfo, upgradeNeeded) {
+ return new Promise$1(function (resolve, reject) {
+ dbContexts[dbInfo.name] = dbContexts[dbInfo.name] || createDbContext();
+
+ if (dbInfo.db) {
+ if (upgradeNeeded) {
+ _deferReadiness(dbInfo);
+ dbInfo.db.close();
+ } else {
+ return resolve(dbInfo.db);
+ }
+ }
+
+ var dbArgs = [dbInfo.name];
+
+ if (upgradeNeeded) {
+ dbArgs.push(dbInfo.version);
+ }
+
+ var openreq = idb.open.apply(idb, dbArgs);
+
+ if (upgradeNeeded) {
+ openreq.onupgradeneeded = function (e) {
+ var db = openreq.result;
+ try {
+ db.createObjectStore(dbInfo.storeName);
+ if (e.oldVersion <= 1) {
+ // Added when support for blob shims was added
+ db.createObjectStore(DETECT_BLOB_SUPPORT_STORE);
+ }
+ } catch (ex) {
+ if (ex.name === 'ConstraintError') {
+ console.warn('The database "' + dbInfo.name + '"' + ' has been upgraded from version ' + e.oldVersion + ' to version ' + e.newVersion + ', but the storage "' + dbInfo.storeName + '" already exists.');
+ } else {
+ throw ex;
+ }
+ }
+ };
+ }
+
+ openreq.onerror = function (e) {
+ e.preventDefault();
+ reject(openreq.error);
+ };
+
+ openreq.onsuccess = function () {
+ resolve(openreq.result);
+ _advanceReadiness(dbInfo);
+ };
+ });
+ }
+
+ function _getOriginalConnection(dbInfo) {
+ return _getConnection(dbInfo, false);
+ }
+
+ function _getUpgradedConnection(dbInfo) {
+ return _getConnection(dbInfo, true);
+ }
+
+ function _isUpgradeNeeded(dbInfo, defaultVersion) {
+ if (!dbInfo.db) {
+ return true;
+ }
+
+ var isNewStore = !dbInfo.db.objectStoreNames.contains(dbInfo.storeName);
+ var isDowngrade = dbInfo.version < dbInfo.db.version;
+ var isUpgrade = dbInfo.version > dbInfo.db.version;
+
+ if (isDowngrade) {
+ // If the version is not the default one
+ // then warn for impossible downgrade.
+ if (dbInfo.version !== defaultVersion) {
+ console.warn('The database "' + dbInfo.name + '"' + " can't be downgraded from version " + dbInfo.db.version + ' to version ' + dbInfo.version + '.');
+ }
+ // Align the versions to prevent errors.
+ dbInfo.version = dbInfo.db.version;
+ }
+
+ if (isUpgrade || isNewStore) {
+ // If the store is new then increment the version (if needed).
+ // This will trigger an "upgradeneeded" event which is required
+ // for creating a store.
+ if (isNewStore) {
+ var incVersion = dbInfo.db.version + 1;
+ if (incVersion > dbInfo.version) {
+ dbInfo.version = incVersion;
+ }
+ }
+
+ return true;
+ }
+
+ return false;
+ }
+
+ // encode a blob for indexeddb engines that don't support blobs
+ function _encodeBlob(blob) {
+ return new Promise$1(function (resolve, reject) {
+ var reader = new FileReader();
+ reader.onerror = reject;
+ reader.onloadend = function (e) {
+ var base64 = btoa(e.target.result || '');
+ resolve({
+ __local_forage_encoded_blob: true,
+ data: base64,
+ type: blob.type
+ });
+ };
+ reader.readAsBinaryString(blob);
+ });
+ }
+
+ // decode an encoded blob
+ function _decodeBlob(encodedBlob) {
+ var arrayBuff = _binStringToArrayBuffer(atob(encodedBlob.data));
+ return createBlob([arrayBuff], { type: encodedBlob.type });
+ }
+
+ // is this one of our fancy encoded blobs?
+ function _isEncodedBlob(value) {
+ return value && value.__local_forage_encoded_blob;
+ }
+
+ // Specialize the default `ready()` function by making it dependent
+ // on the current database operations. Thus, the driver will be actually
+ // ready when it's been initialized (default) *and* there are no pending
+ // operations on the database (initiated by some other instances).
+ function _fullyReady(callback) {
+ var self = this;
+
+ var promise = self._initReady().then(function () {
+ var dbContext = dbContexts[self._dbInfo.name];
+
+ if (dbContext && dbContext.dbReady) {
+ return dbContext.dbReady;
+ }
+ });
+
+ executeTwoCallbacks(promise, callback, callback);
+ return promise;
+ }
+
+ // Try to establish a new db connection to replace the
+ // current one which is broken (i.e. experiencing
+ // InvalidStateError while creating a transaction).
+ function _tryReconnect(dbInfo) {
+ _deferReadiness(dbInfo);
+
+ var dbContext = dbContexts[dbInfo.name];
+ var forages = dbContext.forages;
+
+ for (var i = 0; i < forages.length; i++) {
+ var forage = forages[i];
+ if (forage._dbInfo.db) {
+ forage._dbInfo.db.close();
+ forage._dbInfo.db = null;
+ }
+ }
+ dbInfo.db = null;
+
+ return _getOriginalConnection(dbInfo).then(function (db) {
+ dbInfo.db = db;
+ if (_isUpgradeNeeded(dbInfo)) {
+ // Reopen the database for upgrading.
+ return _getUpgradedConnection(dbInfo);
+ }
+ return db;
+ }).then(function (db) {
+ // store the latest db reference
+ // in case the db was upgraded
+ dbInfo.db = dbContext.db = db;
+ for (var i = 0; i < forages.length; i++) {
+ forages[i]._dbInfo.db = db;
+ }
+ })["catch"](function (err) {
+ _rejectReadiness(dbInfo, err);
+ throw err;
+ });
+ }
+
+ // FF doesn't like Promises (micro-tasks) and IDDB store operations,
+ // so we have to do it with callbacks
+ function createTransaction(dbInfo, mode, callback, retries) {
+ if (retries === undefined) {
+ retries = 1;
+ }
+
+ try {
+ var tx = dbInfo.db.transaction(dbInfo.storeName, mode);
+ callback(null, tx);
+ } catch (err) {
+ if (retries > 0 && (!dbInfo.db || err.name === 'InvalidStateError' || err.name === 'NotFoundError')) {
+ return Promise$1.resolve().then(function () {
+ if (!dbInfo.db || err.name === 'NotFoundError' && !dbInfo.db.objectStoreNames.contains(dbInfo.storeName) && dbInfo.version <= dbInfo.db.version) {
+ // increase the db version, to create the new ObjectStore
+ if (dbInfo.db) {
+ dbInfo.version = dbInfo.db.version + 1;
+ }
+ // Reopen the database for upgrading.
+ return _getUpgradedConnection(dbInfo);
+ }
+ }).then(function () {
+ return _tryReconnect(dbInfo).then(function () {
+ createTransaction(dbInfo, mode, callback, retries - 1);
+ });
+ })["catch"](callback);
+ }
+
+ callback(err);
+ }
+ }
+
+ function createDbContext() {
+ return {
+ // Running localForages sharing a database.
+ forages: [],
+ // Shared database.
+ db: null,
+ // Database readiness (promise).
+ dbReady: null,
+ // Deferred operations on the database.
+ deferredOperations: []
+ };
+ }
+
+ // Open the IndexedDB database (automatically creates one if one didn't
+ // previously exist), using any options set in the config.
+ function _initStorage(options) {
+ var self = this;
+ var dbInfo = {
+ db: null
+ };
+
+ if (options) {
+ for (var i in options) {
+ dbInfo[i] = options[i];
+ }
+ }
+
+ // Get the current context of the database;
+ var dbContext = dbContexts[dbInfo.name];
+
+ // ...or create a new context.
+ if (!dbContext) {
+ dbContext = createDbContext();
+ // Register the new context in the global container.
+ dbContexts[dbInfo.name] = dbContext;
+ }
+
+ // Register itself as a running localForage in the current context.
+ dbContext.forages.push(self);
+
+ // Replace the default `ready()` function with the specialized one.
+ if (!self._initReady) {
+ self._initReady = self.ready;
+ self.ready = _fullyReady;
+ }
+
+ // Create an array of initialization states of the related localForages.
+ var initPromises = [];
+
+ function ignoreErrors() {
+ // Don't handle errors here,
+ // just makes sure related localForages aren't pending.
+ return Promise$1.resolve();
+ }
+
+ for (var j = 0; j < dbContext.forages.length; j++) {
+ var forage = dbContext.forages[j];
+ if (forage !== self) {
+ // Don't wait for itself...
+ initPromises.push(forage._initReady()["catch"](ignoreErrors));
+ }
+ }
+
+ // Take a snapshot of the related localForages.
+ var forages = dbContext.forages.slice(0);
+
+ // Initialize the connection process only when
+ // all the related localForages aren't pending.
+ return Promise$1.all(initPromises).then(function () {
+ dbInfo.db = dbContext.db;
+ // Get the connection or open a new one without upgrade.
+ return _getOriginalConnection(dbInfo);
+ }).then(function (db) {
+ dbInfo.db = db;
+ if (_isUpgradeNeeded(dbInfo, self._defaultConfig.version)) {
+ // Reopen the database for upgrading.
+ return _getUpgradedConnection(dbInfo);
+ }
+ return db;
+ }).then(function (db) {
+ dbInfo.db = dbContext.db = db;
+ self._dbInfo = dbInfo;
+ // Share the final connection amongst related localForages.
+ for (var k = 0; k < forages.length; k++) {
+ var forage = forages[k];
+ if (forage !== self) {
+ // Self is already up-to-date.
+ forage._dbInfo.db = dbInfo.db;
+ forage._dbInfo.version = dbInfo.version;
+ }
+ }
+ });
+ }
+
+ function getItem(key, callback) {
+ var self = this;
+
+ key = normalizeKey(key);
+
+ var promise = new Promise$1(function (resolve, reject) {
+ self.ready().then(function () {
+ createTransaction(self._dbInfo, READ_ONLY, function (err, transaction) {
+ if (err) {
+ return reject(err);
+ }
+
+ try {
+ var store = transaction.objectStore(self._dbInfo.storeName);
+ var req = store.get(key);
+
+ req.onsuccess = function () {
+ var value = req.result;
+ if (value === undefined) {
+ value = null;
+ }
+ if (_isEncodedBlob(value)) {
+ value = _decodeBlob(value);
+ }
+ resolve(value);
+ };
+
+ req.onerror = function () {
+ reject(req.error);
+ };
+ } catch (e) {
+ reject(e);
+ }
+ });
+ })["catch"](reject);
+ });
+
+ executeCallback(promise, callback);
+ return promise;
+ }
+
+ // Iterate over all items stored in database.
+ function iterate(iterator, callback) {
+ var self = this;
+
+ var promise = new Promise$1(function (resolve, reject) {
+ self.ready().then(function () {
+ createTransaction(self._dbInfo, READ_ONLY, function (err, transaction) {
+ if (err) {
+ return reject(err);
+ }
+
+ try {
+ var store = transaction.objectStore(self._dbInfo.storeName);
+ var req = store.openCursor();
+ var iterationNumber = 1;
+
+ req.onsuccess = function () {
+ var cursor = req.result;
+
+ if (cursor) {
+ var value = cursor.value;
+ if (_isEncodedBlob(value)) {
+ value = _decodeBlob(value);
+ }
+ var result = iterator(value, cursor.key, iterationNumber++);
+
+ // when the iterator callback retuns any
+ // (non-`undefined`) value, then we stop
+ // the iteration immediately
+ if (result !== void 0) {
+ resolve(result);
+ } else {
+ cursor["continue"]();
+ }
+ } else {
+ resolve();
+ }
+ };
+
+ req.onerror = function () {
+ reject(req.error);
+ };
+ } catch (e) {
+ reject(e);
+ }
+ });
+ })["catch"](reject);
+ });
+
+ executeCallback(promise, callback);
+
+ return promise;
+ }
+
+ function setItem(key, value, callback) {
+ var self = this;
+
+ key = normalizeKey(key);
+
+ var promise = new Promise$1(function (resolve, reject) {
+ var dbInfo;
+ self.ready().then(function () {
+ dbInfo = self._dbInfo;
+ if (toString.call(value) === '[object Blob]') {
+ return _checkBlobSupport(dbInfo.db).then(function (blobSupport) {
+ if (blobSupport) {
+ return value;
+ }
+ return _encodeBlob(value);
+ });
+ }
+ return value;
+ }).then(function (value) {
+ createTransaction(self._dbInfo, READ_WRITE, function (err, transaction) {
+ if (err) {
+ return reject(err);
+ }
+
+ try {
+ var store = transaction.objectStore(self._dbInfo.storeName);
+
+ // The reason we don't _save_ null is because IE 10 does
+ // not support saving the `null` type in IndexedDB. How
+ // ironic, given the bug below!
+ // See: https://github.com/mozilla/localForage/issues/161
+ if (value === null) {
+ value = undefined;
+ }
+
+ var req = store.put(value, key);
+
+ transaction.oncomplete = function () {
+ // Cast to undefined so the value passed to
+ // callback/promise is the same as what one would get out
+ // of `getItem()` later. This leads to some weirdness
+ // (setItem('foo', undefined) will return `null`), but
+ // it's not my fault localStorage is our baseline and that
+ // it's weird.
+ if (value === undefined) {
+ value = null;
+ }
+
+ resolve(value);
+ };
+ transaction.onabort = transaction.onerror = function () {
+ var err = req.error ? req.error : req.transaction.error;
+ reject(err);
+ };
+ } catch (e) {
+ reject(e);
+ }
+ });
+ })["catch"](reject);
+ });
+
+ executeCallback(promise, callback);
+ return promise;
+ }
+
+ function removeItem(key, callback) {
+ var self = this;
+
+ key = normalizeKey(key);
+
+ var promise = new Promise$1(function (resolve, reject) {
+ self.ready().then(function () {
+ createTransaction(self._dbInfo, READ_WRITE, function (err, transaction) {
+ if (err) {
+ return reject(err);
+ }
+
+ try {
+ var store = transaction.objectStore(self._dbInfo.storeName);
+ // We use a Grunt task to make this safe for IE and some
+ // versions of Android (including those used by Cordova).
+ // Normally IE won't like `.delete()` and will insist on
+ // using `['delete']()`, but we have a build step that
+ // fixes this for us now.
+ var req = store["delete"](key);
+ transaction.oncomplete = function () {
+ resolve();
+ };
+
+ transaction.onerror = function () {
+ reject(req.error);
+ };
+
+ // The request will be also be aborted if we've exceeded our storage
+ // space.
+ transaction.onabort = function () {
+ var err = req.error ? req.error : req.transaction.error;
+ reject(err);
+ };
+ } catch (e) {
+ reject(e);
+ }
+ });
+ })["catch"](reject);
+ });
+
+ executeCallback(promise, callback);
+ return promise;
+ }
+
+ function clear(callback) {
+ var self = this;
+
+ var promise = new Promise$1(function (resolve, reject) {
+ self.ready().then(function () {
+ createTransaction(self._dbInfo, READ_WRITE, function (err, transaction) {
+ if (err) {
+ return reject(err);
+ }
+
+ try {
+ var store = transaction.objectStore(self._dbInfo.storeName);
+ var req = store.clear();
+
+ transaction.oncomplete = function () {
+ resolve();
+ };
+
+ transaction.onabort = transaction.onerror = function () {
+ var err = req.error ? req.error : req.transaction.error;
+ reject(err);
+ };
+ } catch (e) {
+ reject(e);
+ }
+ });
+ })["catch"](reject);
+ });
+
+ executeCallback(promise, callback);
+ return promise;
+ }
+
+ function length(callback) {
+ var self = this;
+
+ var promise = new Promise$1(function (resolve, reject) {
+ self.ready().then(function () {
+ createTransaction(self._dbInfo, READ_ONLY, function (err, transaction) {
+ if (err) {
+ return reject(err);
+ }
+
+ try {
+ var store = transaction.objectStore(self._dbInfo.storeName);
+ var req = store.count();
+
+ req.onsuccess = function () {
+ resolve(req.result);
+ };
+
+ req.onerror = function () {
+ reject(req.error);
+ };
+ } catch (e) {
+ reject(e);
+ }
+ });
+ })["catch"](reject);
+ });
+
+ executeCallback(promise, callback);
+ return promise;
+ }
+
+ function key(n, callback) {
+ var self = this;
+
+ var promise = new Promise$1(function (resolve, reject) {
+ if (n < 0) {
+ resolve(null);
+
+ return;
+ }
+
+ self.ready().then(function () {
+ createTransaction(self._dbInfo, READ_ONLY, function (err, transaction) {
+ if (err) {
+ return reject(err);
+ }
+
+ try {
+ var store = transaction.objectStore(self._dbInfo.storeName);
+ var advanced = false;
+ var req = store.openCursor();
+
+ req.onsuccess = function () {
+ var cursor = req.result;
+ if (!cursor) {
+ // this means there weren't enough keys
+ resolve(null);
+
+ return;
+ }
+
+ if (n === 0) {
+ // We have the first key, return it if that's what they
+ // wanted.
+ resolve(cursor.key);
+ } else {
+ if (!advanced) {
+ // Otherwise, ask the cursor to skip ahead n
+ // records.
+ advanced = true;
+ cursor.advance(n);
+ } else {
+ // When we get here, we've got the nth key.
+ resolve(cursor.key);
+ }
+ }
+ };
+
+ req.onerror = function () {
+ reject(req.error);
+ };
+ } catch (e) {
+ reject(e);
+ }
+ });
+ })["catch"](reject);
+ });
+
+ executeCallback(promise, callback);
+ return promise;
+ }
+
+ function keys(callback) {
+ var self = this;
+
+ var promise = new Promise$1(function (resolve, reject) {
+ self.ready().then(function () {
+ createTransaction(self._dbInfo, READ_ONLY, function (err, transaction) {
+ if (err) {
+ return reject(err);
+ }
+
+ try {
+ var store = transaction.objectStore(self._dbInfo.storeName);
+ var req = store.openCursor();
+ var keys = [];
+
+ req.onsuccess = function () {
+ var cursor = req.result;
+
+ if (!cursor) {
+ resolve(keys);
+ return;
+ }
+
+ keys.push(cursor.key);
+ cursor["continue"]();
+ };
+
+ req.onerror = function () {
+ reject(req.error);
+ };
+ } catch (e) {
+ reject(e);
+ }
+ });
+ })["catch"](reject);
+ });
+
+ executeCallback(promise, callback);
+ return promise;
+ }
+
+ function dropInstance(options, callback) {
+ callback = getCallback.apply(this, arguments);
+
+ var currentConfig = this.config();
+ options = typeof options !== 'function' && options || {};
+ if (!options.name) {
+ options.name = options.name || currentConfig.name;
+ options.storeName = options.storeName || currentConfig.storeName;
+ }
+
+ var self = this;
+ var promise;
+ if (!options.name) {
+ promise = Promise$1.reject('Invalid arguments');
+ } else {
+ var isCurrentDb = options.name === currentConfig.name && self._dbInfo.db;
+
+ var dbPromise = isCurrentDb ? Promise$1.resolve(self._dbInfo.db) : _getOriginalConnection(options).then(function (db) {
+ var dbContext = dbContexts[options.name];
+ var forages = dbContext.forages;
+ dbContext.db = db;
+ for (var i = 0; i < forages.length; i++) {
+ forages[i]._dbInfo.db = db;
+ }
+ return db;
+ });
+
+ if (!options.storeName) {
+ promise = dbPromise.then(function (db) {
+ _deferReadiness(options);
+
+ var dbContext = dbContexts[options.name];
+ var forages = dbContext.forages;
+
+ db.close();
+ for (var i = 0; i < forages.length; i++) {
+ var forage = forages[i];
+ forage._dbInfo.db = null;
+ }
+
+ var dropDBPromise = new Promise$1(function (resolve, reject) {
+ var req = idb.deleteDatabase(options.name);
+
+ req.onerror = req.onblocked = function (err) {
+ var db = req.result;
+ if (db) {
+ db.close();
+ }
+ reject(err);
+ };
+
+ req.onsuccess = function () {
+ var db = req.result;
+ if (db) {
+ db.close();
+ }
+ resolve(db);
+ };
+ });
+
+ return dropDBPromise.then(function (db) {
+ dbContext.db = db;
+ for (var i = 0; i < forages.length; i++) {
+ var _forage = forages[i];
+ _advanceReadiness(_forage._dbInfo);
+ }
+ })["catch"](function (err) {
+ (_rejectReadiness(options, err) || Promise$1.resolve())["catch"](function () {});
+ throw err;
+ });
+ });
+ } else {
+ promise = dbPromise.then(function (db) {
+ if (!db.objectStoreNames.contains(options.storeName)) {
+ return;
+ }
+
+ var newVersion = db.version + 1;
+
+ _deferReadiness(options);
+
+ var dbContext = dbContexts[options.name];
+ var forages = dbContext.forages;
+
+ db.close();
+ for (var i = 0; i < forages.length; i++) {
+ var forage = forages[i];
+ forage._dbInfo.db = null;
+ forage._dbInfo.version = newVersion;
+ }
+
+ var dropObjectPromise = new Promise$1(function (resolve, reject) {
+ var req = idb.open(options.name, newVersion);
+
+ req.onerror = function (err) {
+ var db = req.result;
+ db.close();
+ reject(err);
+ };
+
+ req.onupgradeneeded = function () {
+ var db = req.result;
+ db.deleteObjectStore(options.storeName);
+ };
+
+ req.onsuccess = function () {
+ var db = req.result;
+ db.close();
+ resolve(db);
+ };
+ });
+
+ return dropObjectPromise.then(function (db) {
+ dbContext.db = db;
+ for (var j = 0; j < forages.length; j++) {
+ var _forage2 = forages[j];
+ _forage2._dbInfo.db = db;
+ _advanceReadiness(_forage2._dbInfo);
+ }
+ })["catch"](function (err) {
+ (_rejectReadiness(options, err) || Promise$1.resolve())["catch"](function () {});
+ throw err;
+ });
+ });
+ }
+ }
+
+ executeCallback(promise, callback);
+ return promise;
+ }
+
+ var asyncStorage = {
+ _driver: 'asyncStorage',
+ _initStorage: _initStorage,
+ _support: isIndexedDBValid(),
+ iterate: iterate,
+ getItem: getItem,
+ setItem: setItem,
+ removeItem: removeItem,
+ clear: clear,
+ length: length,
+ key: key,
+ keys: keys,
+ dropInstance: dropInstance
+ };
+
+ function isWebSQLValid() {
+ return typeof openDatabase === 'function';
+ }
+
+ // Sadly, the best way to save binary data in WebSQL/localStorage is serializing
+ // it to Base64, so this is how we store it to prevent very strange errors with less
+ // verbose ways of binary <-> string data storage.
+ var BASE_CHARS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
+
+ var BLOB_TYPE_PREFIX = '~~local_forage_type~';
+ var BLOB_TYPE_PREFIX_REGEX = /^~~local_forage_type~([^~]+)~/;
+
+ var SERIALIZED_MARKER = '__lfsc__:';
+ var SERIALIZED_MARKER_LENGTH = SERIALIZED_MARKER.length;
+
+ // OMG the serializations!
+ var TYPE_ARRAYBUFFER = 'arbf';
+ var TYPE_BLOB = 'blob';
+ var TYPE_INT8ARRAY = 'si08';
+ var TYPE_UINT8ARRAY = 'ui08';
+ var TYPE_UINT8CLAMPEDARRAY = 'uic8';
+ var TYPE_INT16ARRAY = 'si16';
+ var TYPE_INT32ARRAY = 'si32';
+ var TYPE_UINT16ARRAY = 'ur16';
+ var TYPE_UINT32ARRAY = 'ui32';
+ var TYPE_FLOAT32ARRAY = 'fl32';
+ var TYPE_FLOAT64ARRAY = 'fl64';
+ var TYPE_SERIALIZED_MARKER_LENGTH = SERIALIZED_MARKER_LENGTH + TYPE_ARRAYBUFFER.length;
+
+ var toString$1 = Object.prototype.toString;
+
+ function stringToBuffer(serializedString) {
+ // Fill the string into a ArrayBuffer.
+ var bufferLength = serializedString.length * 0.75;
+ var len = serializedString.length;
+ var i;
+ var p = 0;
+ var encoded1, encoded2, encoded3, encoded4;
+
+ if (serializedString[serializedString.length - 1] === '=') {
+ bufferLength--;
+ if (serializedString[serializedString.length - 2] === '=') {
+ bufferLength--;
+ }
+ }
+
+ var buffer = new ArrayBuffer(bufferLength);
+ var bytes = new Uint8Array(buffer);
+
+ for (i = 0; i < len; i += 4) {
+ encoded1 = BASE_CHARS.indexOf(serializedString[i]);
+ encoded2 = BASE_CHARS.indexOf(serializedString[i + 1]);
+ encoded3 = BASE_CHARS.indexOf(serializedString[i + 2]);
+ encoded4 = BASE_CHARS.indexOf(serializedString[i + 3]);
+
+ /*jslint bitwise: true */
+ bytes[p++] = encoded1 << 2 | encoded2 >> 4;
+ bytes[p++] = (encoded2 & 15) << 4 | encoded3 >> 2;
+ bytes[p++] = (encoded3 & 3) << 6 | encoded4 & 63;
+ }
+ return buffer;
+ }
+
+ // Converts a buffer to a string to store, serialized, in the backend
+ // storage library.
+ function bufferToString(buffer) {
+ // base64-arraybuffer
+ var bytes = new Uint8Array(buffer);
+ var base64String = '';
+ var i;
+
+ for (i = 0; i < bytes.length; i += 3) {
+ /*jslint bitwise: true */
+ base64String += BASE_CHARS[bytes[i] >> 2];
+ base64String += BASE_CHARS[(bytes[i] & 3) << 4 | bytes[i + 1] >> 4];
+ base64String += BASE_CHARS[(bytes[i + 1] & 15) << 2 | bytes[i + 2] >> 6];
+ base64String += BASE_CHARS[bytes[i + 2] & 63];
+ }
+
+ if (bytes.length % 3 === 2) {
+ base64String = base64String.substring(0, base64String.length - 1) + '=';
+ } else if (bytes.length % 3 === 1) {
+ base64String = base64String.substring(0, base64String.length - 2) + '==';
+ }
+
+ return base64String;
+ }
+
+ // Serialize a value, afterwards executing a callback (which usually
+ // instructs the `setItem()` callback/promise to be executed). This is how
+ // we store binary data with localStorage.
+ function serialize(value, callback) {
+ var valueType = '';
+ if (value) {
+ valueType = toString$1.call(value);
+ }
+
+ // Cannot use `value instanceof ArrayBuffer` or such here, as these
+ // checks fail when running the tests using casper.js...
+ //
+ // TODO: See why those tests fail and use a better solution.
+ if (value && (valueType === '[object ArrayBuffer]' || value.buffer && toString$1.call(value.buffer) === '[object ArrayBuffer]')) {
+ // Convert binary arrays to a string and prefix the string with
+ // a special marker.
+ var buffer;
+ var marker = SERIALIZED_MARKER;
+
+ if (value instanceof ArrayBuffer) {
+ buffer = value;
+ marker += TYPE_ARRAYBUFFER;
+ } else {
+ buffer = value.buffer;
+
+ if (valueType === '[object Int8Array]') {
+ marker += TYPE_INT8ARRAY;
+ } else if (valueType === '[object Uint8Array]') {
+ marker += TYPE_UINT8ARRAY;
+ } else if (valueType === '[object Uint8ClampedArray]') {
+ marker += TYPE_UINT8CLAMPEDARRAY;
+ } else if (valueType === '[object Int16Array]') {
+ marker += TYPE_INT16ARRAY;
+ } else if (valueType === '[object Uint16Array]') {
+ marker += TYPE_UINT16ARRAY;
+ } else if (valueType === '[object Int32Array]') {
+ marker += TYPE_INT32ARRAY;
+ } else if (valueType === '[object Uint32Array]') {
+ marker += TYPE_UINT32ARRAY;
+ } else if (valueType === '[object Float32Array]') {
+ marker += TYPE_FLOAT32ARRAY;
+ } else if (valueType === '[object Float64Array]') {
+ marker += TYPE_FLOAT64ARRAY;
+ } else {
+ callback(new Error('Failed to get type for BinaryArray'));
+ }
+ }
+
+ callback(marker + bufferToString(buffer));
+ } else if (valueType === '[object Blob]') {
+ // Conver the blob to a binaryArray and then to a string.
+ var fileReader = new FileReader();
+
+ fileReader.onload = function () {
+ // Backwards-compatible prefix for the blob type.
+ var str = BLOB_TYPE_PREFIX + value.type + '~' + bufferToString(this.result);
+
+ callback(SERIALIZED_MARKER + TYPE_BLOB + str);
+ };
+
+ fileReader.readAsArrayBuffer(value);
+ } else {
+ try {
+ callback(JSON.stringify(value));
+ } catch (e) {
+ console.error("Couldn't convert value into a JSON string: ", value);
+
+ callback(null, e);
+ }
+ }
+ }
+
+ // Deserialize data we've inserted into a value column/field. We place
+ // special markers into our strings to mark them as encoded; this isn't
+ // as nice as a meta field, but it's the only sane thing we can do whilst
+ // keeping localStorage support intact.
+ //
+ // Oftentimes this will just deserialize JSON content, but if we have a
+ // special marker (SERIALIZED_MARKER, defined above), we will extract
+ // some kind of arraybuffer/binary data/typed array out of the string.
+ function deserialize(value) {
+ // If we haven't marked this string as being specially serialized (i.e.
+ // something other than serialized JSON), we can just return it and be
+ // done with it.
+ if (value.substring(0, SERIALIZED_MARKER_LENGTH) !== SERIALIZED_MARKER) {
+ return JSON.parse(value);
+ }
+
+ // The following code deals with deserializing some kind of Blob or
+ // TypedArray. First we separate out the type of data we're dealing
+ // with from the data itself.
+ var serializedString = value.substring(TYPE_SERIALIZED_MARKER_LENGTH);
+ var type = value.substring(SERIALIZED_MARKER_LENGTH, TYPE_SERIALIZED_MARKER_LENGTH);
+
+ var blobType;
+ // Backwards-compatible blob type serialization strategy.
+ // DBs created with older versions of localForage will simply not have the blob type.
+ if (type === TYPE_BLOB && BLOB_TYPE_PREFIX_REGEX.test(serializedString)) {
+ var matcher = serializedString.match(BLOB_TYPE_PREFIX_REGEX);
+ blobType = matcher[1];
+ serializedString = serializedString.substring(matcher[0].length);
+ }
+ var buffer = stringToBuffer(serializedString);
+
+ // Return the right type based on the code/type set during
+ // serialization.
+ switch (type) {
+ case TYPE_ARRAYBUFFER:
+ return buffer;
+ case TYPE_BLOB:
+ return createBlob([buffer], { type: blobType });
+ case TYPE_INT8ARRAY:
+ return new Int8Array(buffer);
+ case TYPE_UINT8ARRAY:
+ return new Uint8Array(buffer);
+ case TYPE_UINT8CLAMPEDARRAY:
+ return new Uint8ClampedArray(buffer);
+ case TYPE_INT16ARRAY:
+ return new Int16Array(buffer);
+ case TYPE_UINT16ARRAY:
+ return new Uint16Array(buffer);
+ case TYPE_INT32ARRAY:
+ return new Int32Array(buffer);
+ case TYPE_UINT32ARRAY:
+ return new Uint32Array(buffer);
+ case TYPE_FLOAT32ARRAY:
+ return new Float32Array(buffer);
+ case TYPE_FLOAT64ARRAY:
+ return new Float64Array(buffer);
+ default:
+ throw new Error('Unkown type: ' + type);
+ }
+ }
+
+ var localforageSerializer = {
+ serialize: serialize,
+ deserialize: deserialize,
+ stringToBuffer: stringToBuffer,
+ bufferToString: bufferToString
+ };
+
+ /*
+ * Includes code from:
+ *
+ * base64-arraybuffer
+ * https://github.com/niklasvh/base64-arraybuffer
+ *
+ * Copyright (c) 2012 Niklas von Hertzen
+ * Licensed under the MIT license.
+ */
+
+ function createDbTable(t, dbInfo, callback, errorCallback) {
+ t.executeSql('CREATE TABLE IF NOT EXISTS ' + dbInfo.storeName + ' ' + '(id INTEGER PRIMARY KEY, key unique, value)', [], callback, errorCallback);
+ }
+
+ // Open the WebSQL database (automatically creates one if one didn't
+ // previously exist), using any options set in the config.
+ function _initStorage$1(options) {
+ var self = this;
+ var dbInfo = {
+ db: null
+ };
+
+ if (options) {
+ for (var i in options) {
+ dbInfo[i] = typeof options[i] !== 'string' ? options[i].toString() : options[i];
+ }
+ }
+
+ var dbInfoPromise = new Promise$1(function (resolve, reject) {
+ // Open the database; the openDatabase API will automatically
+ // create it for us if it doesn't exist.
+ try {
+ dbInfo.db = openDatabase(dbInfo.name, String(dbInfo.version), dbInfo.description, dbInfo.size);
+ } catch (e) {
+ return reject(e);
+ }
+
+ // Create our key/value table if it doesn't exist.
+ dbInfo.db.transaction(function (t) {
+ createDbTable(t, dbInfo, function () {
+ self._dbInfo = dbInfo;
+ resolve();
+ }, function (t, error) {
+ reject(error);
+ });
+ }, reject);
+ });
+
+ dbInfo.serializer = localforageSerializer;
+ return dbInfoPromise;
+ }
+
+ function tryExecuteSql(t, dbInfo, sqlStatement, args, callback, errorCallback) {
+ t.executeSql(sqlStatement, args, callback, function (t, error) {
+ if (error.code === error.SYNTAX_ERR) {
+ t.executeSql('SELECT name FROM sqlite_master ' + "WHERE type='table' AND name = ?", [dbInfo.storeName], function (t, results) {
+ if (!results.rows.length) {
+ // if the table is missing (was deleted)
+ // re-create it table and retry
+ createDbTable(t, dbInfo, function () {
+ t.executeSql(sqlStatement, args, callback, errorCallback);
+ }, errorCallback);
+ } else {
+ errorCallback(t, error);
+ }
+ }, errorCallback);
+ } else {
+ errorCallback(t, error);
+ }
+ }, errorCallback);
+ }
+
+ function getItem$1(key, callback) {
+ var self = this;
+
+ key = normalizeKey(key);
+
+ var promise = new Promise$1(function (resolve, reject) {
+ self.ready().then(function () {
+ var dbInfo = self._dbInfo;
+ dbInfo.db.transaction(function (t) {
+ tryExecuteSql(t, dbInfo, 'SELECT * FROM ' + dbInfo.storeName + ' WHERE key = ? LIMIT 1', [key], function (t, results) {
+ var result = results.rows.length ? results.rows.item(0).value : null;
+
+ // Check to see if this is serialized content we need to
+ // unpack.
+ if (result) {
+ result = dbInfo.serializer.deserialize(result);
+ }
+
+ resolve(result);
+ }, function (t, error) {
+ reject(error);
+ });
+ });
+ })["catch"](reject);
+ });
+
+ executeCallback(promise, callback);
+ return promise;
+ }
+
+ function iterate$1(iterator, callback) {
+ var self = this;
+
+ var promise = new Promise$1(function (resolve, reject) {
+ self.ready().then(function () {
+ var dbInfo = self._dbInfo;
+
+ dbInfo.db.transaction(function (t) {
+ tryExecuteSql(t, dbInfo, 'SELECT * FROM ' + dbInfo.storeName, [], function (t, results) {
+ var rows = results.rows;
+ var length = rows.length;
+
+ for (var i = 0; i < length; i++) {
+ var item = rows.item(i);
+ var result = item.value;
+
+ // Check to see if this is serialized content
+ // we need to unpack.
+ if (result) {
+ result = dbInfo.serializer.deserialize(result);
+ }
+
+ result = iterator(result, item.key, i + 1);
+
+ // void(0) prevents problems with redefinition
+ // of `undefined`.
+ if (result !== void 0) {
+ resolve(result);
+ return;
+ }
+ }
+
+ resolve();
+ }, function (t, error) {
+ reject(error);
+ });
+ });
+ })["catch"](reject);
+ });
+
+ executeCallback(promise, callback);
+ return promise;
+ }
+
+ function _setItem(key, value, callback, retriesLeft) {
+ var self = this;
+
+ key = normalizeKey(key);
+
+ var promise = new Promise$1(function (resolve, reject) {
+ self.ready().then(function () {
+ // The localStorage API doesn't return undefined values in an
+ // "expected" way, so undefined is always cast to null in all
+ // drivers. See: https://github.com/mozilla/localForage/pull/42
+ if (value === undefined) {
+ value = null;
+ }
+
+ // Save the original value to pass to the callback.
+ var originalValue = value;
+
+ var dbInfo = self._dbInfo;
+ dbInfo.serializer.serialize(value, function (value, error) {
+ if (error) {
+ reject(error);
+ } else {
+ dbInfo.db.transaction(function (t) {
+ tryExecuteSql(t, dbInfo, 'INSERT OR REPLACE INTO ' + dbInfo.storeName + ' ' + '(key, value) VALUES (?, ?)', [key, value], function () {
+ resolve(originalValue);
+ }, function (t, error) {
+ reject(error);
+ });
+ }, function (sqlError) {
+ // The transaction failed; check
+ // to see if it's a quota error.
+ if (sqlError.code === sqlError.QUOTA_ERR) {
+ // We reject the callback outright for now, but
+ // it's worth trying to re-run the transaction.
+ // Even if the user accepts the prompt to use
+ // more storage on Safari, this error will
+ // be called.
+ //
+ // Try to re-run the transaction.
+ if (retriesLeft > 0) {
+ resolve(_setItem.apply(self, [key, originalValue, callback, retriesLeft - 1]));
+ return;
+ }
+ reject(sqlError);
+ }
+ });
+ }
+ });
+ })["catch"](reject);
+ });
+
+ executeCallback(promise, callback);
+ return promise;
+ }
+
+ function setItem$1(key, value, callback) {
+ return _setItem.apply(this, [key, value, callback, 1]);
+ }
+
+ function removeItem$1(key, callback) {
+ var self = this;
+
+ key = normalizeKey(key);
+
+ var promise = new Promise$1(function (resolve, reject) {
+ self.ready().then(function () {
+ var dbInfo = self._dbInfo;
+ dbInfo.db.transaction(function (t) {
+ tryExecuteSql(t, dbInfo, 'DELETE FROM ' + dbInfo.storeName + ' WHERE key = ?', [key], function () {
+ resolve();
+ }, function (t, error) {
+ reject(error);
+ });
+ });
+ })["catch"](reject);
+ });
+
+ executeCallback(promise, callback);
+ return promise;
+ }
+
+ // Deletes every item in the table.
+ // TODO: Find out if this resets the AUTO_INCREMENT number.
+ function clear$1(callback) {
+ var self = this;
+
+ var promise = new Promise$1(function (resolve, reject) {
+ self.ready().then(function () {
+ var dbInfo = self._dbInfo;
+ dbInfo.db.transaction(function (t) {
+ tryExecuteSql(t, dbInfo, 'DELETE FROM ' + dbInfo.storeName, [], function () {
+ resolve();
+ }, function (t, error) {
+ reject(error);
+ });
+ });
+ })["catch"](reject);
+ });
+
+ executeCallback(promise, callback);
+ return promise;
+ }
+
+ // Does a simple `COUNT(key)` to get the number of items stored in
+ // localForage.
+ function length$1(callback) {
+ var self = this;
+
+ var promise = new Promise$1(function (resolve, reject) {
+ self.ready().then(function () {
+ var dbInfo = self._dbInfo;
+ dbInfo.db.transaction(function (t) {
+ // Ahhh, SQL makes this one soooooo easy.
+ tryExecuteSql(t, dbInfo, 'SELECT COUNT(key) as c FROM ' + dbInfo.storeName, [], function (t, results) {
+ var result = results.rows.item(0).c;
+ resolve(result);
+ }, function (t, error) {
+ reject(error);
+ });
+ });
+ })["catch"](reject);
+ });
+
+ executeCallback(promise, callback);
+ return promise;
+ }
+
+ // Return the key located at key index X; essentially gets the key from a
+ // `WHERE id = ?`. This is the most efficient way I can think to implement
+ // this rarely-used (in my experience) part of the API, but it can seem
+ // inconsistent, because we do `INSERT OR REPLACE INTO` on `setItem()`, so
+ // the ID of each key will change every time it's updated. Perhaps a stored
+ // procedure for the `setItem()` SQL would solve this problem?
+ // TODO: Don't change ID on `setItem()`.
+ function key$1(n, callback) {
+ var self = this;
+
+ var promise = new Promise$1(function (resolve, reject) {
+ self.ready().then(function () {
+ var dbInfo = self._dbInfo;
+ dbInfo.db.transaction(function (t) {
+ tryExecuteSql(t, dbInfo, 'SELECT key FROM ' + dbInfo.storeName + ' WHERE id = ? LIMIT 1', [n + 1], function (t, results) {
+ var result = results.rows.length ? results.rows.item(0).key : null;
+ resolve(result);
+ }, function (t, error) {
+ reject(error);
+ });
+ });
+ })["catch"](reject);
+ });
+
+ executeCallback(promise, callback);
+ return promise;
+ }
+
+ function keys$1(callback) {
+ var self = this;
+
+ var promise = new Promise$1(function (resolve, reject) {
+ self.ready().then(function () {
+ var dbInfo = self._dbInfo;
+ dbInfo.db.transaction(function (t) {
+ tryExecuteSql(t, dbInfo, 'SELECT key FROM ' + dbInfo.storeName, [], function (t, results) {
+ var keys = [];
+
+ for (var i = 0; i < results.rows.length; i++) {
+ keys.push(results.rows.item(i).key);
+ }
+
+ resolve(keys);
+ }, function (t, error) {
+ reject(error);
+ });
+ });
+ })["catch"](reject);
+ });
+
+ executeCallback(promise, callback);
+ return promise;
+ }
+
+ // https://www.w3.org/TR/webdatabase/#databases
+ // > There is no way to enumerate or delete the databases available for an origin from this API.
+ function getAllStoreNames(db) {
+ return new Promise$1(function (resolve, reject) {
+ db.transaction(function (t) {
+ t.executeSql('SELECT name FROM sqlite_master ' + "WHERE type='table' AND name <> '__WebKitDatabaseInfoTable__'", [], function (t, results) {
+ var storeNames = [];
+
+ for (var i = 0; i < results.rows.length; i++) {
+ storeNames.push(results.rows.item(i).name);
+ }
+
+ resolve({
+ db: db,
+ storeNames: storeNames
+ });
+ }, function (t, error) {
+ reject(error);
+ });
+ }, function (sqlError) {
+ reject(sqlError);
+ });
+ });
+ }
+
+ function dropInstance$1(options, callback) {
+ callback = getCallback.apply(this, arguments);
+
+ var currentConfig = this.config();
+ options = typeof options !== 'function' && options || {};
+ if (!options.name) {
+ options.name = options.name || currentConfig.name;
+ options.storeName = options.storeName || currentConfig.storeName;
+ }
+
+ var self = this;
+ var promise;
+ if (!options.name) {
+ promise = Promise$1.reject('Invalid arguments');
+ } else {
+ promise = new Promise$1(function (resolve) {
+ var db;
+ if (options.name === currentConfig.name) {
+ // use the db reference of the current instance
+ db = self._dbInfo.db;
+ } else {
+ db = openDatabase(options.name, '', '', 0);
+ }
+
+ if (!options.storeName) {
+ // drop all database tables
+ resolve(getAllStoreNames(db));
+ } else {
+ resolve({
+ db: db,
+ storeNames: [options.storeName]
+ });
+ }
+ }).then(function (operationInfo) {
+ return new Promise$1(function (resolve, reject) {
+ operationInfo.db.transaction(function (t) {
+ function dropTable(storeName) {
+ return new Promise$1(function (resolve, reject) {
+ t.executeSql('DROP TABLE IF EXISTS ' + storeName, [], function () {
+ resolve();
+ }, function (t, error) {
+ reject(error);
+ });
+ });
+ }
+
+ var operations = [];
+ for (var i = 0, len = operationInfo.storeNames.length; i < len; i++) {
+ operations.push(dropTable(operationInfo.storeNames[i]));
+ }
+
+ Promise$1.all(operations).then(function () {
+ resolve();
+ })["catch"](function (e) {
+ reject(e);
+ });
+ }, function (sqlError) {
+ reject(sqlError);
+ });
+ });
+ });
+ }
+
+ executeCallback(promise, callback);
+ return promise;
+ }
+
+ var webSQLStorage = {
+ _driver: 'webSQLStorage',
+ _initStorage: _initStorage$1,
+ _support: isWebSQLValid(),
+ iterate: iterate$1,
+ getItem: getItem$1,
+ setItem: setItem$1,
+ removeItem: removeItem$1,
+ clear: clear$1,
+ length: length$1,
+ key: key$1,
+ keys: keys$1,
+ dropInstance: dropInstance$1
+ };
+
+ function isLocalStorageValid() {
+ try {
+ return typeof localStorage !== 'undefined' && 'setItem' in localStorage &&
+ // in IE8 typeof localStorage.setItem === 'object'
+ !!localStorage.setItem;
+ } catch (e) {
+ return false;
+ }
+ }
+
+ function _getKeyPrefix(options, defaultConfig) {
+ var keyPrefix = options.name + '/';
+
+ if (options.storeName !== defaultConfig.storeName) {
+ keyPrefix += options.storeName + '/';
+ }
+ return keyPrefix;
+ }
+
+ // Check if localStorage throws when saving an item
+ function checkIfLocalStorageThrows() {
+ var localStorageTestKey = '_localforage_support_test';
+
+ try {
+ localStorage.setItem(localStorageTestKey, true);
+ localStorage.removeItem(localStorageTestKey);
+
+ return false;
+ } catch (e) {
+ return true;
+ }
+ }
+
+ // Check if localStorage is usable and allows to save an item
+ // This method checks if localStorage is usable in Safari Private Browsing
+ // mode, or in any other case where the available quota for localStorage
+ // is 0 and there wasn't any saved items yet.
+ function _isLocalStorageUsable() {
+ return !checkIfLocalStorageThrows() || localStorage.length > 0;
+ }
+
+ // Config the localStorage backend, using options set in the config.
+ function _initStorage$2(options) {
+ var self = this;
+ var dbInfo = {};
+ if (options) {
+ for (var i in options) {
+ dbInfo[i] = options[i];
+ }
+ }
+
+ dbInfo.keyPrefix = _getKeyPrefix(options, self._defaultConfig);
+
+ if (!_isLocalStorageUsable()) {
+ return Promise$1.reject();
+ }
+
+ self._dbInfo = dbInfo;
+ dbInfo.serializer = localforageSerializer;
+
+ return Promise$1.resolve();
+ }
+
+ // Remove all keys from the datastore, effectively destroying all data in
+ // the app's key/value store!
+ function clear$2(callback) {
+ var self = this;
+ var promise = self.ready().then(function () {
+ var keyPrefix = self._dbInfo.keyPrefix;
+
+ for (var i = localStorage.length - 1; i >= 0; i--) {
+ var key = localStorage.key(i);
+
+ if (key.indexOf(keyPrefix) === 0) {
+ localStorage.removeItem(key);
+ }
+ }
+ });
+
+ executeCallback(promise, callback);
+ return promise;
+ }
+
+ // Retrieve an item from the store. Unlike the original async_storage
+ // library in Gaia, we don't modify return values at all. If a key's value
+ // is `undefined`, we pass that value to the callback function.
+ function getItem$2(key, callback) {
+ var self = this;
+
+ key = normalizeKey(key);
+
+ var promise = self.ready().then(function () {
+ var dbInfo = self._dbInfo;
+ var result = localStorage.getItem(dbInfo.keyPrefix + key);
+
+ // If a result was found, parse it from the serialized
+ // string into a JS object. If result isn't truthy, the key
+ // is likely undefined and we'll pass it straight to the
+ // callback.
+ if (result) {
+ result = dbInfo.serializer.deserialize(result);
+ }
+
+ return result;
+ });
+
+ executeCallback(promise, callback);
+ return promise;
+ }
+
+ // Iterate over all items in the store.
+ function iterate$2(iterator, callback) {
+ var self = this;
+
+ var promise = self.ready().then(function () {
+ var dbInfo = self._dbInfo;
+ var keyPrefix = dbInfo.keyPrefix;
+ var keyPrefixLength = keyPrefix.length;
+ var length = localStorage.length;
+
+ // We use a dedicated iterator instead of the `i` variable below
+ // so other keys we fetch in localStorage aren't counted in
+ // the `iterationNumber` argument passed to the `iterate()`
+ // callback.
+ //
+ // See: github.com/mozilla/localForage/pull/435#discussion_r38061530
+ var iterationNumber = 1;
+
+ for (var i = 0; i < length; i++) {
+ var key = localStorage.key(i);
+ if (key.indexOf(keyPrefix) !== 0) {
+ continue;
+ }
+ var value = localStorage.getItem(key);
+
+ // If a result was found, parse it from the serialized
+ // string into a JS object. If result isn't truthy, the
+ // key is likely undefined and we'll pass it straight
+ // to the iterator.
+ if (value) {
+ value = dbInfo.serializer.deserialize(value);
+ }
+
+ value = iterator(value, key.substring(keyPrefixLength), iterationNumber++);
+
+ if (value !== void 0) {
+ return value;
+ }
+ }
+ });
+
+ executeCallback(promise, callback);
+ return promise;
+ }
+
+ // Same as localStorage's key() method, except takes a callback.
+ function key$2(n, callback) {
+ var self = this;
+ var promise = self.ready().then(function () {
+ var dbInfo = self._dbInfo;
+ var result;
+ try {
+ result = localStorage.key(n);
+ } catch (error) {
+ result = null;
+ }
+
+ // Remove the prefix from the key, if a key is found.
+ if (result) {
+ result = result.substring(dbInfo.keyPrefix.length);
+ }
+
+ return result;
+ });
+
+ executeCallback(promise, callback);
+ return promise;
+ }
+
+ function keys$2(callback) {
+ var self = this;
+ var promise = self.ready().then(function () {
+ var dbInfo = self._dbInfo;
+ var length = localStorage.length;
+ var keys = [];
+
+ for (var i = 0; i < length; i++) {
+ var itemKey = localStorage.key(i);
+ if (itemKey.indexOf(dbInfo.keyPrefix) === 0) {
+ keys.push(itemKey.substring(dbInfo.keyPrefix.length));
+ }
+ }
+
+ return keys;
+ });
+
+ executeCallback(promise, callback);
+ return promise;
+ }
+
+ // Supply the number of keys in the datastore to the callback function.
+ function length$2(callback) {
+ var self = this;
+ var promise = self.keys().then(function (keys) {
+ return keys.length;
+ });
+
+ executeCallback(promise, callback);
+ return promise;
+ }
+
+ // Remove an item from the store, nice and simple.
+ function removeItem$2(key, callback) {
+ var self = this;
+
+ key = normalizeKey(key);
+
+ var promise = self.ready().then(function () {
+ var dbInfo = self._dbInfo;
+ localStorage.removeItem(dbInfo.keyPrefix + key);
+ });
+
+ executeCallback(promise, callback);
+ return promise;
+ }
+
+ // Set a key's value and run an optional callback once the value is set.
+ // Unlike Gaia's implementation, the callback function is passed the value,
+ // in case you want to operate on that value only after you're sure it
+ // saved, or something like that.
+ function setItem$2(key, value, callback) {
+ var self = this;
+
+ key = normalizeKey(key);
+
+ var promise = self.ready().then(function () {
+ // Convert undefined values to null.
+ // https://github.com/mozilla/localForage/pull/42
+ if (value === undefined) {
+ value = null;
+ }
+
+ // Save the original value to pass to the callback.
+ var originalValue = value;
+
+ return new Promise$1(function (resolve, reject) {
+ var dbInfo = self._dbInfo;
+ dbInfo.serializer.serialize(value, function (value, error) {
+ if (error) {
+ reject(error);
+ } else {
+ try {
+ localStorage.setItem(dbInfo.keyPrefix + key, value);
+ resolve(originalValue);
+ } catch (e) {
+ // localStorage capacity exceeded.
+ // TODO: Make this a specific error/event.
+ if (e.name === 'QuotaExceededError' || e.name === 'NS_ERROR_DOM_QUOTA_REACHED') {
+ reject(e);
+ }
+ reject(e);
+ }
+ }
+ });
+ });
+ });
+
+ executeCallback(promise, callback);
+ return promise;
+ }
+
+ function dropInstance$2(options, callback) {
+ callback = getCallback.apply(this, arguments);
+
+ options = typeof options !== 'function' && options || {};
+ if (!options.name) {
+ var currentConfig = this.config();
+ options.name = options.name || currentConfig.name;
+ options.storeName = options.storeName || currentConfig.storeName;
+ }
+
+ var self = this;
+ var promise;
+ if (!options.name) {
+ promise = Promise$1.reject('Invalid arguments');
+ } else {
+ promise = new Promise$1(function (resolve) {
+ if (!options.storeName) {
+ resolve(options.name + '/');
+ } else {
+ resolve(_getKeyPrefix(options, self._defaultConfig));
+ }
+ }).then(function (keyPrefix) {
+ for (var i = localStorage.length - 1; i >= 0; i--) {
+ var key = localStorage.key(i);
+
+ if (key.indexOf(keyPrefix) === 0) {
+ localStorage.removeItem(key);
+ }
+ }
+ });
+ }
+
+ executeCallback(promise, callback);
+ return promise;
+ }
+
+ var localStorageWrapper = {
+ _driver: 'localStorageWrapper',
+ _initStorage: _initStorage$2,
+ _support: isLocalStorageValid(),
+ iterate: iterate$2,
+ getItem: getItem$2,
+ setItem: setItem$2,
+ removeItem: removeItem$2,
+ clear: clear$2,
+ length: length$2,
+ key: key$2,
+ keys: keys$2,
+ dropInstance: dropInstance$2
+ };
+
+ var sameValue = function sameValue(x, y) {
+ return x === y || typeof x === 'number' && typeof y === 'number' && isNaN(x) && isNaN(y);
+ };
+
+ var includes = function includes(array, searchElement) {
+ var len = array.length;
+ var i = 0;
+ while (i < len) {
+ if (sameValue(array[i], searchElement)) {
+ return true;
+ }
+ i++;
+ }
+
+ return false;
+ };
+
+ var isArray = Array.isArray || function (arg) {
+ return Object.prototype.toString.call(arg) === '[object Array]';
+ };
+
+ // Drivers are stored here when `defineDriver()` is called.
+ // They are shared across all instances of localForage.
+ var DefinedDrivers = {};
+
+ var DriverSupport = {};
+
+ var DefaultDrivers = {
+ INDEXEDDB: asyncStorage,
+ WEBSQL: webSQLStorage,
+ LOCALSTORAGE: localStorageWrapper
+ };
+
+ var DefaultDriverOrder = [DefaultDrivers.INDEXEDDB._driver, DefaultDrivers.WEBSQL._driver, DefaultDrivers.LOCALSTORAGE._driver];
+
+ var OptionalDriverMethods = ['dropInstance'];
+
+ var LibraryMethods = ['clear', 'getItem', 'iterate', 'key', 'keys', 'length', 'removeItem', 'setItem'].concat(OptionalDriverMethods);
+
+ var DefaultConfig = {
+ description: '',
+ driver: DefaultDriverOrder.slice(),
+ name: 'localforage',
+ // Default DB size is _JUST UNDER_ 5MB, as it's the highest size
+ // we can use without a prompt.
+ size: 4980736,
+ storeName: 'keyvaluepairs',
+ version: 1.0
+ };
+
+ function callWhenReady(localForageInstance, libraryMethod) {
+ localForageInstance[libraryMethod] = function () {
+ var _args = arguments;
+ return localForageInstance.ready().then(function () {
+ return localForageInstance[libraryMethod].apply(localForageInstance, _args);
+ });
+ };
+ }
+
+ function extend() {
+ for (var i = 1; i < arguments.length; i++) {
+ var arg = arguments[i];
+
+ if (arg) {
+ for (var _key in arg) {
+ if (arg.hasOwnProperty(_key)) {
+ if (isArray(arg[_key])) {
+ arguments[0][_key] = arg[_key].slice();
+ } else {
+ arguments[0][_key] = arg[_key];
+ }
+ }
+ }
+ }
+ }
+
+ return arguments[0];
+ }
+
+ var LocalForage = function () {
+ function LocalForage(options) {
+ _classCallCheck(this, LocalForage);
+
+ for (var driverTypeKey in DefaultDrivers) {
+ if (DefaultDrivers.hasOwnProperty(driverTypeKey)) {
+ var driver = DefaultDrivers[driverTypeKey];
+ var driverName = driver._driver;
+ this[driverTypeKey] = driverName;
+
+ if (!DefinedDrivers[driverName]) {
+ // we don't need to wait for the promise,
+ // since the default drivers can be defined
+ // in a blocking manner
+ this.defineDriver(driver);
+ }
+ }
+ }
+
+ this._defaultConfig = extend({}, DefaultConfig);
+ this._config = extend({}, this._defaultConfig, options);
+ this._driverSet = null;
+ this._initDriver = null;
+ this._ready = false;
+ this._dbInfo = null;
+
+ this._wrapLibraryMethodsWithReady();
+ this.setDriver(this._config.driver)["catch"](function () {});
+ }
+
+ // Set any config values for localForage; can be called anytime before
+ // the first API call (e.g. `getItem`, `setItem`).
+ // We loop through options so we don't overwrite existing config
+ // values.
+
+
+ LocalForage.prototype.config = function config(options) {
+ // If the options argument is an object, we use it to set values.
+ // Otherwise, we return either a specified config value or all
+ // config values.
+ if ((typeof options === 'undefined' ? 'undefined' : _typeof(options)) === 'object') {
+ // If localforage is ready and fully initialized, we can't set
+ // any new configuration values. Instead, we return an error.
+ if (this._ready) {
+ return new Error("Can't call config() after localforage " + 'has been used.');
+ }
+
+ for (var i in options) {
+ if (i === 'storeName') {
+ options[i] = options[i].replace(/\W/g, '_');
+ }
+
+ if (i === 'version' && typeof options[i] !== 'number') {
+ return new Error('Database version must be a number.');
+ }
+
+ this._config[i] = options[i];
+ }
+
+ // after all config options are set and
+ // the driver option is used, try setting it
+ if ('driver' in options && options.driver) {
+ return this.setDriver(this._config.driver);
+ }
+
+ return true;
+ } else if (typeof options === 'string') {
+ return this._config[options];
+ } else {
+ return this._config;
+ }
+ };
+
+ // Used to define a custom driver, shared across all instances of
+ // localForage.
+
+
+ LocalForage.prototype.defineDriver = function defineDriver(driverObject, callback, errorCallback) {
+ var promise = new Promise$1(function (resolve, reject) {
+ try {
+ var driverName = driverObject._driver;
+ var complianceError = new Error('Custom driver not compliant; see ' + 'https://mozilla.github.io/localForage/#definedriver');
+
+ // A driver name should be defined and not overlap with the
+ // library-defined, default drivers.
+ if (!driverObject._driver) {
+ reject(complianceError);
+ return;
+ }
+
+ var driverMethods = LibraryMethods.concat('_initStorage');
+ for (var i = 0, len = driverMethods.length; i < len; i++) {
+ var driverMethodName = driverMethods[i];
+
+ // when the property is there,
+ // it should be a method even when optional
+ var isRequired = !includes(OptionalDriverMethods, driverMethodName);
+ if ((isRequired || driverObject[driverMethodName]) && typeof driverObject[driverMethodName] !== 'function') {
+ reject(complianceError);
+ return;
+ }
+ }
+
+ var configureMissingMethods = function configureMissingMethods() {
+ var methodNotImplementedFactory = function methodNotImplementedFactory(methodName) {
+ return function () {
+ var error = new Error('Method ' + methodName + ' is not implemented by the current driver');
+ var promise = Promise$1.reject(error);
+ executeCallback(promise, arguments[arguments.length - 1]);
+ return promise;
+ };
+ };
+
+ for (var _i = 0, _len = OptionalDriverMethods.length; _i < _len; _i++) {
+ var optionalDriverMethod = OptionalDriverMethods[_i];
+ if (!driverObject[optionalDriverMethod]) {
+ driverObject[optionalDriverMethod] = methodNotImplementedFactory(optionalDriverMethod);
+ }
+ }
+ };
+
+ configureMissingMethods();
+
+ var setDriverSupport = function setDriverSupport(support) {
+ if (DefinedDrivers[driverName]) {
+ console.info('Redefining LocalForage driver: ' + driverName);
+ }
+ DefinedDrivers[driverName] = driverObject;
+ DriverSupport[driverName] = support;
+ // don't use a then, so that we can define
+ // drivers that have simple _support methods
+ // in a blocking manner
+ resolve();
+ };
+
+ if ('_support' in driverObject) {
+ if (driverObject._support && typeof driverObject._support === 'function') {
+ driverObject._support().then(setDriverSupport, reject);
+ } else {
+ setDriverSupport(!!driverObject._support);
+ }
+ } else {
+ setDriverSupport(true);
+ }
+ } catch (e) {
+ reject(e);
+ }
+ });
+
+ executeTwoCallbacks(promise, callback, errorCallback);
+ return promise;
+ };
+
+ LocalForage.prototype.driver = function driver() {
+ return this._driver || null;
+ };
+
+ LocalForage.prototype.getDriver = function getDriver(driverName, callback, errorCallback) {
+ var getDriverPromise = DefinedDrivers[driverName] ? Promise$1.resolve(DefinedDrivers[driverName]) : Promise$1.reject(new Error('Driver not found.'));
+
+ executeTwoCallbacks(getDriverPromise, callback, errorCallback);
+ return getDriverPromise;
+ };
+
+ LocalForage.prototype.getSerializer = function getSerializer(callback) {
+ var serializerPromise = Promise$1.resolve(localforageSerializer);
+ executeTwoCallbacks(serializerPromise, callback);
+ return serializerPromise;
+ };
+
+ LocalForage.prototype.ready = function ready(callback) {
+ var self = this;
+
+ var promise = self._driverSet.then(function () {
+ if (self._ready === null) {
+ self._ready = self._initDriver();
+ }
+
+ return self._ready;
+ });
+
+ executeTwoCallbacks(promise, callback, callback);
+ return promise;
+ };
+
+ LocalForage.prototype.setDriver = function setDriver(drivers, callback, errorCallback) {
+ var self = this;
+
+ if (!isArray(drivers)) {
+ drivers = [drivers];
+ }
+
+ var supportedDrivers = this._getSupportedDrivers(drivers);
+
+ function setDriverToConfig() {
+ self._config.driver = self.driver();
+ }
+
+ function extendSelfWithDriver(driver) {
+ self._extend(driver);
+ setDriverToConfig();
+
+ self._ready = self._initStorage(self._config);
+ return self._ready;
+ }
+
+ function initDriver(supportedDrivers) {
+ return function () {
+ var currentDriverIndex = 0;
+
+ function driverPromiseLoop() {
+ while (currentDriverIndex < supportedDrivers.length) {
+ var driverName = supportedDrivers[currentDriverIndex];
+ currentDriverIndex++;
+
+ self._dbInfo = null;
+ self._ready = null;
+
+ return self.getDriver(driverName).then(extendSelfWithDriver)["catch"](driverPromiseLoop);
+ }
+
+ setDriverToConfig();
+ var error = new Error('No available storage method found.');
+ self._driverSet = Promise$1.reject(error);
+ return self._driverSet;
+ }
+
+ return driverPromiseLoop();
+ };
+ }
+
+ // There might be a driver initialization in progress
+ // so wait for it to finish in order to avoid a possible
+ // race condition to set _dbInfo
+ var oldDriverSetDone = this._driverSet !== null ? this._driverSet["catch"](function () {
+ return Promise$1.resolve();
+ }) : Promise$1.resolve();
+
+ this._driverSet = oldDriverSetDone.then(function () {
+ var driverName = supportedDrivers[0];
+ self._dbInfo = null;
+ self._ready = null;
+
+ return self.getDriver(driverName).then(function (driver) {
+ self._driver = driver._driver;
+ setDriverToConfig();
+ self._wrapLibraryMethodsWithReady();
+ self._initDriver = initDriver(supportedDrivers);
+ });
+ })["catch"](function () {
+ setDriverToConfig();
+ var error = new Error('No available storage method found.');
+ self._driverSet = Promise$1.reject(error);
+ return self._driverSet;
+ });
+
+ executeTwoCallbacks(this._driverSet, callback, errorCallback);
+ return this._driverSet;
+ };
+
+ LocalForage.prototype.supports = function supports(driverName) {
+ return !!DriverSupport[driverName];
+ };
+
+ LocalForage.prototype._extend = function _extend(libraryMethodsAndProperties) {
+ extend(this, libraryMethodsAndProperties);
+ };
+
+ LocalForage.prototype._getSupportedDrivers = function _getSupportedDrivers(drivers) {
+ var supportedDrivers = [];
+ for (var i = 0, len = drivers.length; i < len; i++) {
+ var driverName = drivers[i];
+ if (this.supports(driverName)) {
+ supportedDrivers.push(driverName);
+ }
+ }
+ return supportedDrivers;
+ };
+
+ LocalForage.prototype._wrapLibraryMethodsWithReady = function _wrapLibraryMethodsWithReady() {
+ // Add a stub for each driver API method that delays the call to the
+ // corresponding driver method until localForage is ready. These stubs
+ // will be replaced by the driver methods as soon as the driver is
+ // loaded, so there is no performance impact.
+ for (var i = 0, len = LibraryMethods.length; i < len; i++) {
+ callWhenReady(this, LibraryMethods[i]);
+ }
+ };
+
+ LocalForage.prototype.createInstance = function createInstance(options) {
+ return new LocalForage(options);
+ };
+
+ return LocalForage;
+ }();
+
+ // The actual localForage object that we expose as a module or via a
+ // global. It's extended by pulling in one of our other libraries.
+
+
+ var localforage_js = new LocalForage();
+
+ module.exports = localforage_js;
+
+ },{"3":3}]},{},[4])(4)
+ });
+ });
+
+ function queryStringify(query) {
+ const queryString = Object.keys(query)
+ .map(key => `${key}=${window.encodeURIComponent(query[key] || '')}`)
+ .join('&');
+ return queryString;
+ }
+
+ function getURLParameters() {
+ var url = window.location.href;
+ return (url.match(/([^?=&]+)(=([^&]*))/g) || []).reduce(function(a, v) {
+ return (a[v.slice(0, v.indexOf('='))] = v.slice(v.indexOf('=') + 1)), a;
+ }, {});
+ }
+
+ function throwError(condition, msg, callback) {
+ if (!condition) {
+ callback && callback();
+ throw new Error(`Danmuku Error: ${msg}`);
+ }
+ }
+
+ class IssuesDanmuku {
+ constructor(options) {
+ this.options = Object.assign({}, IssuesDanmuku.DEFAULT, options);
+ this.db = localforage.createInstance({
+ driver: [
+ localforage.WEBSQL,
+ localforage.INDEXEDDB,
+ localforage.LOCALSTORAGE
+ ],
+ name: 'danmuku-db'
+ });
+ this.limit = 0;
+ this.remaining = 0;
+ this.init();
+ }
+
+ static get DEFAULT() {
+ return {
+ api: '',
+ clientID: '',
+ clientSecret: '',
+ perPage: 100,
+ proxy:
+ 'https://cors-anywhere.herokuapp.com/https://github.com/login/oauth/access_token'
+ };
+ }
+
+ async init() {
+ const { code } = getURLParameters();
+ if (code) {
+ const data = await this.getToken(code);
+ throwError(data.access_token, 'Can not get token, Please login again!');
+ await this.db.setItem('token', data.access_token);
+ const userInfo = await this.getUserInfo(data.access_token);
+ throwError(userInfo.id, 'Can not get user info, Please login again!');
+ await this.db.setItem('userInfo', userInfo);
+ const redirect_uri = await this.db.getItem('redirect_uri');
+ throwError(redirect_uri, 'Can not get redirect url, Please login again!');
+ window.history.replaceState(null, '', redirect_uri);
+ }
+
+ this.userInfo = await this.db.getItem('userInfo');
+ this.token = await this.db.getItem('token');
+ const danmus = await this.db.getItem('danmus');
+ this.isLogin = !!this.userInfo && !!this.token;
+ if (this.isLogin && !danmus) {
+ await this.cache();
+ }
+ }
+
+ async login() {
+ await this.db.clear();
+ await this.db.setItem('redirect_uri', window.location.href);
+ await this.db.setItem('login_time', Date.now());
+ window.location.href = `http://github.com/login/oauth/authorize?${queryStringify(
+ {
+ state: 'issues-danmuku',
+ client_id: this.options.clientID,
+ redirect_uri: window.location.href,
+ scope: 'public_repo'
+ }
+ )}`;
+ }
+
+ async logout() {
+ await this.db.clear();
+ window.location.reload();
+ }
+
+ async request(method, url, body) {
+ method = method.toUpperCase();
+ body = body && JSON.stringify(body);
+ let headers = {
+ 'Content-Type': 'application/json',
+ Accept: 'application/json'
+ };
+
+ if (this.token) {
+ headers.Authorization = `token ${this.token}`;
+ }
+
+ try {
+ const res = await fetch(url, {
+ method,
+ headers,
+ body
+ });
+ if (res.status === 404) {
+ return Promise.reject('Unauthorized.');
+ } else if (res.status === 401) {
+ await this.db.clear();
+ return window.location.reload();
+ } else {
+ this.limit = Number(res.headers.get('X-RateLimit-Limit'));
+ this.remaining = Number(res.headers.get('X-RateLimit-Remaining'));
+ return res.json();
+ }
+ } catch (err) {
+ console.warn(err, url);
+ }
+ }
+
+ urlQuery(options) {
+ return {
+ client_id: this.options.clientID,
+ client_secret: this.options.clientSecret,
+ t: Date.now(),
+ ...options
+ };
+ }
+
+ getToken(code) {
+ const query = this.urlQuery({
+ code,
+ redirect_uri: location.href
+ });
+ return this.request(
+ 'get',
+ `${this.options.proxy}?${queryStringify(query)}`
+ );
+ }
+
+ getUserInfo(token) {
+ return this.request(
+ 'get',
+ `https://api.github.com/user?access_token=${token}`
+ );
+ }
+
+ async cache() {
+ let result = [];
+ let page = 1;
+ await this.db.setItem('cache_time', Date.now());
+ while (true) {
+ const list = await this.request(
+ 'get',
+ `https://api.github.com/repos/${
+ this.options.api
+ }/comments?${queryStringify(
+ this.urlQuery({
+ per_page: this.options.perPage,
+ page: page++
+ })
+ )}`
+ );
+ throwError(
+ Array.isArray(list),
+ 'Can not get the danmuku, Please try again!'
+ );
+ result = [...result, ...list];
+ if (list.length < this.options.perPage) {
+ const danmus = result.map(item => {
+ const body = JSON.parse(item.body);
+ return {
+ id: item.id,
+ ...body
+ };
+ });
+ return this.db.setItem('danmus', danmus);
+ }
+ }
+ }
+
+ async send(danmu = {}) {
+ const query = this.urlQuery({
+ body: JSON.stringify(danmu)
+ });
+ let data = await this.request(
+ 'post',
+ `https://api.github.com/repos/${this.options.api}/comments`,
+ query
+ );
+ throwError(data.id, 'Can not send the danmu, Please try again!');
+ return JSON.parse(data.body);
+ }
+ }
+
+ window.ArtplayerToolGithub = IssuesDanmuku;
+
+ return IssuesDanmuku;
+
+}));
+//# sourceMappingURL=artplayer-tool-github.js.map
diff --git a/docs/uncompiled/artplayer-tool-github.js.map b/docs/uncompiled/artplayer-tool-github.js.map
new file mode 100644
index 000000000..a2a195c17
--- /dev/null
+++ b/docs/uncompiled/artplayer-tool-github.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"artplayer-tool-github.js","sources":["../../packages/artplayer-tool-github/node_modules/localforage/dist/localforage.js","../../packages/artplayer-tool-github/node_modules/issues-danmuku/src/utils.js","../../packages/artplayer-tool-github/node_modules/issues-danmuku/src/index.js","../../packages/artplayer-tool-github/src/index.js"],"sourcesContent":["/*!\n localForage -- Offline Storage, Improved\n Version 1.7.3\n https://localforage.github.io/localForage\n (c) 2013-2017 Mozilla, Apache License 2.0\n*/\n(function(f){if(typeof exports===\"object\"&&typeof module!==\"undefined\"){module.exports=f()}else if(typeof define===\"function\"&&define.amd){define([],f)}else{var g;if(typeof window!==\"undefined\"){g=window}else if(typeof global!==\"undefined\"){g=global}else if(typeof self!==\"undefined\"){g=self}else{g=this}g.localforage = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error(\"Cannot find module '\"+o+\"'\");throw (f.code=\"MODULE_NOT_FOUND\", f)}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require==\"function\"&&require;for(var o=0;o element; its readystatechange event will be fired asynchronously once it is inserted\n // into the document. Do so, thus queuing up the task. Remember to clean up once it's been called.\n var scriptEl = global.document.createElement('script');\n scriptEl.onreadystatechange = function () {\n nextTick();\n\n scriptEl.onreadystatechange = null;\n scriptEl.parentNode.removeChild(scriptEl);\n scriptEl = null;\n };\n global.document.documentElement.appendChild(scriptEl);\n };\n } else {\n scheduleDrain = function () {\n setTimeout(nextTick, 0);\n };\n }\n}\n\nvar draining;\nvar queue = [];\n//named nextTick for less confusing stack traces\nfunction nextTick() {\n draining = true;\n var i, oldQueue;\n var len = queue.length;\n while (len) {\n oldQueue = queue;\n queue = [];\n i = -1;\n while (++i < len) {\n oldQueue[i]();\n }\n len = queue.length;\n }\n draining = false;\n}\n\nmodule.exports = immediate;\nfunction immediate(task) {\n if (queue.push(task) === 1 && !draining) {\n scheduleDrain();\n }\n}\n\n}).call(this,typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\n},{}],2:[function(_dereq_,module,exports){\n'use strict';\nvar immediate = _dereq_(1);\n\n/* istanbul ignore next */\nfunction INTERNAL() {}\n\nvar handlers = {};\n\nvar REJECTED = ['REJECTED'];\nvar FULFILLED = ['FULFILLED'];\nvar PENDING = ['PENDING'];\n\nmodule.exports = Promise;\n\nfunction Promise(resolver) {\n if (typeof resolver !== 'function') {\n throw new TypeError('resolver must be a function');\n }\n this.state = PENDING;\n this.queue = [];\n this.outcome = void 0;\n if (resolver !== INTERNAL) {\n safelyResolveThenable(this, resolver);\n }\n}\n\nPromise.prototype[\"catch\"] = function (onRejected) {\n return this.then(null, onRejected);\n};\nPromise.prototype.then = function (onFulfilled, onRejected) {\n if (typeof onFulfilled !== 'function' && this.state === FULFILLED ||\n typeof onRejected !== 'function' && this.state === REJECTED) {\n return this;\n }\n var promise = new this.constructor(INTERNAL);\n if (this.state !== PENDING) {\n var resolver = this.state === FULFILLED ? onFulfilled : onRejected;\n unwrap(promise, resolver, this.outcome);\n } else {\n this.queue.push(new QueueItem(promise, onFulfilled, onRejected));\n }\n\n return promise;\n};\nfunction QueueItem(promise, onFulfilled, onRejected) {\n this.promise = promise;\n if (typeof onFulfilled === 'function') {\n this.onFulfilled = onFulfilled;\n this.callFulfilled = this.otherCallFulfilled;\n }\n if (typeof onRejected === 'function') {\n this.onRejected = onRejected;\n this.callRejected = this.otherCallRejected;\n }\n}\nQueueItem.prototype.callFulfilled = function (value) {\n handlers.resolve(this.promise, value);\n};\nQueueItem.prototype.otherCallFulfilled = function (value) {\n unwrap(this.promise, this.onFulfilled, value);\n};\nQueueItem.prototype.callRejected = function (value) {\n handlers.reject(this.promise, value);\n};\nQueueItem.prototype.otherCallRejected = function (value) {\n unwrap(this.promise, this.onRejected, value);\n};\n\nfunction unwrap(promise, func, value) {\n immediate(function () {\n var returnValue;\n try {\n returnValue = func(value);\n } catch (e) {\n return handlers.reject(promise, e);\n }\n if (returnValue === promise) {\n handlers.reject(promise, new TypeError('Cannot resolve promise with itself'));\n } else {\n handlers.resolve(promise, returnValue);\n }\n });\n}\n\nhandlers.resolve = function (self, value) {\n var result = tryCatch(getThen, value);\n if (result.status === 'error') {\n return handlers.reject(self, result.value);\n }\n var thenable = result.value;\n\n if (thenable) {\n safelyResolveThenable(self, thenable);\n } else {\n self.state = FULFILLED;\n self.outcome = value;\n var i = -1;\n var len = self.queue.length;\n while (++i < len) {\n self.queue[i].callFulfilled(value);\n }\n }\n return self;\n};\nhandlers.reject = function (self, error) {\n self.state = REJECTED;\n self.outcome = error;\n var i = -1;\n var len = self.queue.length;\n while (++i < len) {\n self.queue[i].callRejected(error);\n }\n return self;\n};\n\nfunction getThen(obj) {\n // Make sure we only access the accessor once as required by the spec\n var then = obj && obj.then;\n if (obj && (typeof obj === 'object' || typeof obj === 'function') && typeof then === 'function') {\n return function appyThen() {\n then.apply(obj, arguments);\n };\n }\n}\n\nfunction safelyResolveThenable(self, thenable) {\n // Either fulfill, reject or reject with error\n var called = false;\n function onError(value) {\n if (called) {\n return;\n }\n called = true;\n handlers.reject(self, value);\n }\n\n function onSuccess(value) {\n if (called) {\n return;\n }\n called = true;\n handlers.resolve(self, value);\n }\n\n function tryToUnwrap() {\n thenable(onSuccess, onError);\n }\n\n var result = tryCatch(tryToUnwrap);\n if (result.status === 'error') {\n onError(result.value);\n }\n}\n\nfunction tryCatch(func, value) {\n var out = {};\n try {\n out.value = func(value);\n out.status = 'success';\n } catch (e) {\n out.status = 'error';\n out.value = e;\n }\n return out;\n}\n\nPromise.resolve = resolve;\nfunction resolve(value) {\n if (value instanceof this) {\n return value;\n }\n return handlers.resolve(new this(INTERNAL), value);\n}\n\nPromise.reject = reject;\nfunction reject(reason) {\n var promise = new this(INTERNAL);\n return handlers.reject(promise, reason);\n}\n\nPromise.all = all;\nfunction all(iterable) {\n var self = this;\n if (Object.prototype.toString.call(iterable) !== '[object Array]') {\n return this.reject(new TypeError('must be an array'));\n }\n\n var len = iterable.length;\n var called = false;\n if (!len) {\n return this.resolve([]);\n }\n\n var values = new Array(len);\n var resolved = 0;\n var i = -1;\n var promise = new this(INTERNAL);\n\n while (++i < len) {\n allResolver(iterable[i], i);\n }\n return promise;\n function allResolver(value, i) {\n self.resolve(value).then(resolveFromAll, function (error) {\n if (!called) {\n called = true;\n handlers.reject(promise, error);\n }\n });\n function resolveFromAll(outValue) {\n values[i] = outValue;\n if (++resolved === len && !called) {\n called = true;\n handlers.resolve(promise, values);\n }\n }\n }\n}\n\nPromise.race = race;\nfunction race(iterable) {\n var self = this;\n if (Object.prototype.toString.call(iterable) !== '[object Array]') {\n return this.reject(new TypeError('must be an array'));\n }\n\n var len = iterable.length;\n var called = false;\n if (!len) {\n return this.resolve([]);\n }\n\n var i = -1;\n var promise = new this(INTERNAL);\n\n while (++i < len) {\n resolver(iterable[i]);\n }\n return promise;\n function resolver(value) {\n self.resolve(value).then(function (response) {\n if (!called) {\n called = true;\n handlers.resolve(promise, response);\n }\n }, function (error) {\n if (!called) {\n called = true;\n handlers.reject(promise, error);\n }\n });\n }\n}\n\n},{\"1\":1}],3:[function(_dereq_,module,exports){\n(function (global){\n'use strict';\nif (typeof global.Promise !== 'function') {\n global.Promise = _dereq_(2);\n}\n\n}).call(this,typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\n},{\"2\":2}],4:[function(_dereq_,module,exports){\n'use strict';\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction getIDB() {\n /* global indexedDB,webkitIndexedDB,mozIndexedDB,OIndexedDB,msIndexedDB */\n try {\n if (typeof indexedDB !== 'undefined') {\n return indexedDB;\n }\n if (typeof webkitIndexedDB !== 'undefined') {\n return webkitIndexedDB;\n }\n if (typeof mozIndexedDB !== 'undefined') {\n return mozIndexedDB;\n }\n if (typeof OIndexedDB !== 'undefined') {\n return OIndexedDB;\n }\n if (typeof msIndexedDB !== 'undefined') {\n return msIndexedDB;\n }\n } catch (e) {\n return;\n }\n}\n\nvar idb = getIDB();\n\nfunction isIndexedDBValid() {\n try {\n // Initialize IndexedDB; fall back to vendor-prefixed versions\n // if needed.\n if (!idb) {\n return false;\n }\n // We mimic PouchDB here;\n //\n // We test for openDatabase because IE Mobile identifies itself\n // as Safari. Oh the lulz...\n var isSafari = typeof openDatabase !== 'undefined' && /(Safari|iPhone|iPad|iPod)/.test(navigator.userAgent) && !/Chrome/.test(navigator.userAgent) && !/BlackBerry/.test(navigator.platform);\n\n var hasFetch = typeof fetch === 'function' && fetch.toString().indexOf('[native code') !== -1;\n\n // Safari <10.1 does not meet our requirements for IDB support (#5572)\n // since Safari 10.1 shipped with fetch, we can use that to detect it\n return (!isSafari || hasFetch) && typeof indexedDB !== 'undefined' &&\n // some outdated implementations of IDB that appear on Samsung\n // and HTC Android devices <4.4 are missing IDBKeyRange\n // See: https://github.com/mozilla/localForage/issues/128\n // See: https://github.com/mozilla/localForage/issues/272\n typeof IDBKeyRange !== 'undefined';\n } catch (e) {\n return false;\n }\n}\n\n// Abstracts constructing a Blob object, so it also works in older\n// browsers that don't support the native Blob constructor. (i.e.\n// old QtWebKit versions, at least).\n// Abstracts constructing a Blob object, so it also works in older\n// browsers that don't support the native Blob constructor. (i.e.\n// old QtWebKit versions, at least).\nfunction createBlob(parts, properties) {\n /* global BlobBuilder,MSBlobBuilder,MozBlobBuilder,WebKitBlobBuilder */\n parts = parts || [];\n properties = properties || {};\n try {\n return new Blob(parts, properties);\n } catch (e) {\n if (e.name !== 'TypeError') {\n throw e;\n }\n var Builder = typeof BlobBuilder !== 'undefined' ? BlobBuilder : typeof MSBlobBuilder !== 'undefined' ? MSBlobBuilder : typeof MozBlobBuilder !== 'undefined' ? MozBlobBuilder : WebKitBlobBuilder;\n var builder = new Builder();\n for (var i = 0; i < parts.length; i += 1) {\n builder.append(parts[i]);\n }\n return builder.getBlob(properties.type);\n }\n}\n\n// This is CommonJS because lie is an external dependency, so Rollup\n// can just ignore it.\nif (typeof Promise === 'undefined') {\n // In the \"nopromises\" build this will just throw if you don't have\n // a global promise object, but it would throw anyway later.\n _dereq_(3);\n}\nvar Promise$1 = Promise;\n\nfunction executeCallback(promise, callback) {\n if (callback) {\n promise.then(function (result) {\n callback(null, result);\n }, function (error) {\n callback(error);\n });\n }\n}\n\nfunction executeTwoCallbacks(promise, callback, errorCallback) {\n if (typeof callback === 'function') {\n promise.then(callback);\n }\n\n if (typeof errorCallback === 'function') {\n promise[\"catch\"](errorCallback);\n }\n}\n\nfunction normalizeKey(key) {\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 return key;\n}\n\nfunction getCallback() {\n if (arguments.length && typeof arguments[arguments.length - 1] === 'function') {\n return arguments[arguments.length - 1];\n }\n}\n\n// Some code originally from async_storage.js in\n// [Gaia](https://github.com/mozilla-b2g/gaia).\n\nvar DETECT_BLOB_SUPPORT_STORE = 'local-forage-detect-blob-support';\nvar supportsBlobs = void 0;\nvar dbContexts = {};\nvar toString = Object.prototype.toString;\n\n// Transaction Modes\nvar READ_ONLY = 'readonly';\nvar READ_WRITE = 'readwrite';\n\n// Transform a binary string to an array buffer, because otherwise\n// weird stuff happens when you try to work with the binary string directly.\n// It is known.\n// From http://stackoverflow.com/questions/14967647/ (continues on next line)\n// encode-decode-image-with-base64-breaks-image (2013-04-21)\nfunction _binStringToArrayBuffer(bin) {\n var length = bin.length;\n var buf = new ArrayBuffer(length);\n var arr = new Uint8Array(buf);\n for (var i = 0; i < length; i++) {\n arr[i] = bin.charCodeAt(i);\n }\n return buf;\n}\n\n//\n// Blobs are not supported in all versions of IndexedDB, notably\n// Chrome <37 and Android <5. In those versions, storing a blob will throw.\n//\n// Various other blob bugs exist in Chrome v37-42 (inclusive).\n// Detecting them is expensive and confusing to users, and Chrome 37-42\n// is at very low usage worldwide, so we do a hacky userAgent check instead.\n//\n// content-type bug: https://code.google.com/p/chromium/issues/detail?id=408120\n// 404 bug: https://code.google.com/p/chromium/issues/detail?id=447916\n// FileReader bug: https://code.google.com/p/chromium/issues/detail?id=447836\n//\n// Code borrowed from PouchDB. See:\n// https://github.com/pouchdb/pouchdb/blob/master/packages/node_modules/pouchdb-adapter-idb/src/blobSupport.js\n//\nfunction _checkBlobSupportWithoutCaching(idb) {\n return new Promise$1(function (resolve) {\n var txn = idb.transaction(DETECT_BLOB_SUPPORT_STORE, READ_WRITE);\n var blob = createBlob(['']);\n txn.objectStore(DETECT_BLOB_SUPPORT_STORE).put(blob, 'key');\n\n txn.onabort = function (e) {\n // If the transaction aborts now its due to not being able to\n // write to the database, likely due to the disk being full\n e.preventDefault();\n e.stopPropagation();\n resolve(false);\n };\n\n txn.oncomplete = function () {\n var matchedChrome = navigator.userAgent.match(/Chrome\\/(\\d+)/);\n var matchedEdge = navigator.userAgent.match(/Edge\\//);\n // MS Edge pretends to be Chrome 42:\n // https://msdn.microsoft.com/en-us/library/hh869301%28v=vs.85%29.aspx\n resolve(matchedEdge || !matchedChrome || parseInt(matchedChrome[1], 10) >= 43);\n };\n })[\"catch\"](function () {\n return false; // error, so assume unsupported\n });\n}\n\nfunction _checkBlobSupport(idb) {\n if (typeof supportsBlobs === 'boolean') {\n return Promise$1.resolve(supportsBlobs);\n }\n return _checkBlobSupportWithoutCaching(idb).then(function (value) {\n supportsBlobs = value;\n return supportsBlobs;\n });\n}\n\nfunction _deferReadiness(dbInfo) {\n var dbContext = dbContexts[dbInfo.name];\n\n // Create a deferred object representing the current database operation.\n var deferredOperation = {};\n\n deferredOperation.promise = new Promise$1(function (resolve, reject) {\n deferredOperation.resolve = resolve;\n deferredOperation.reject = reject;\n });\n\n // Enqueue the deferred operation.\n dbContext.deferredOperations.push(deferredOperation);\n\n // Chain its promise to the database readiness.\n if (!dbContext.dbReady) {\n dbContext.dbReady = deferredOperation.promise;\n } else {\n dbContext.dbReady = dbContext.dbReady.then(function () {\n return deferredOperation.promise;\n });\n }\n}\n\nfunction _advanceReadiness(dbInfo) {\n var dbContext = dbContexts[dbInfo.name];\n\n // Dequeue a deferred operation.\n var deferredOperation = dbContext.deferredOperations.pop();\n\n // Resolve its promise (which is part of the database readiness\n // chain of promises).\n if (deferredOperation) {\n deferredOperation.resolve();\n return deferredOperation.promise;\n }\n}\n\nfunction _rejectReadiness(dbInfo, err) {\n var dbContext = dbContexts[dbInfo.name];\n\n // Dequeue a deferred operation.\n var deferredOperation = dbContext.deferredOperations.pop();\n\n // Reject its promise (which is part of the database readiness\n // chain of promises).\n if (deferredOperation) {\n deferredOperation.reject(err);\n return deferredOperation.promise;\n }\n}\n\nfunction _getConnection(dbInfo, upgradeNeeded) {\n return new Promise$1(function (resolve, reject) {\n dbContexts[dbInfo.name] = dbContexts[dbInfo.name] || createDbContext();\n\n if (dbInfo.db) {\n if (upgradeNeeded) {\n _deferReadiness(dbInfo);\n dbInfo.db.close();\n } else {\n return resolve(dbInfo.db);\n }\n }\n\n var dbArgs = [dbInfo.name];\n\n if (upgradeNeeded) {\n dbArgs.push(dbInfo.version);\n }\n\n var openreq = idb.open.apply(idb, dbArgs);\n\n if (upgradeNeeded) {\n openreq.onupgradeneeded = function (e) {\n var db = openreq.result;\n try {\n db.createObjectStore(dbInfo.storeName);\n if (e.oldVersion <= 1) {\n // Added when support for blob shims was added\n db.createObjectStore(DETECT_BLOB_SUPPORT_STORE);\n }\n } catch (ex) {\n if (ex.name === 'ConstraintError') {\n console.warn('The database \"' + dbInfo.name + '\"' + ' has been upgraded from version ' + e.oldVersion + ' to version ' + e.newVersion + ', but the storage \"' + dbInfo.storeName + '\" already exists.');\n } else {\n throw ex;\n }\n }\n };\n }\n\n openreq.onerror = function (e) {\n e.preventDefault();\n reject(openreq.error);\n };\n\n openreq.onsuccess = function () {\n resolve(openreq.result);\n _advanceReadiness(dbInfo);\n };\n });\n}\n\nfunction _getOriginalConnection(dbInfo) {\n return _getConnection(dbInfo, false);\n}\n\nfunction _getUpgradedConnection(dbInfo) {\n return _getConnection(dbInfo, true);\n}\n\nfunction _isUpgradeNeeded(dbInfo, defaultVersion) {\n if (!dbInfo.db) {\n return true;\n }\n\n var isNewStore = !dbInfo.db.objectStoreNames.contains(dbInfo.storeName);\n var isDowngrade = dbInfo.version < dbInfo.db.version;\n var isUpgrade = dbInfo.version > dbInfo.db.version;\n\n if (isDowngrade) {\n // If the version is not the default one\n // then warn for impossible downgrade.\n if (dbInfo.version !== defaultVersion) {\n console.warn('The database \"' + dbInfo.name + '\"' + \" can't be downgraded from version \" + dbInfo.db.version + ' to version ' + dbInfo.version + '.');\n }\n // Align the versions to prevent errors.\n dbInfo.version = dbInfo.db.version;\n }\n\n if (isUpgrade || isNewStore) {\n // If the store is new then increment the version (if needed).\n // This will trigger an \"upgradeneeded\" event which is required\n // for creating a store.\n if (isNewStore) {\n var incVersion = dbInfo.db.version + 1;\n if (incVersion > dbInfo.version) {\n dbInfo.version = incVersion;\n }\n }\n\n return true;\n }\n\n return false;\n}\n\n// encode a blob for indexeddb engines that don't support blobs\nfunction _encodeBlob(blob) {\n return new Promise$1(function (resolve, reject) {\n var reader = new FileReader();\n reader.onerror = reject;\n reader.onloadend = function (e) {\n var base64 = btoa(e.target.result || '');\n resolve({\n __local_forage_encoded_blob: true,\n data: base64,\n type: blob.type\n });\n };\n reader.readAsBinaryString(blob);\n });\n}\n\n// decode an encoded blob\nfunction _decodeBlob(encodedBlob) {\n var arrayBuff = _binStringToArrayBuffer(atob(encodedBlob.data));\n return createBlob([arrayBuff], { type: encodedBlob.type });\n}\n\n// is this one of our fancy encoded blobs?\nfunction _isEncodedBlob(value) {\n return value && value.__local_forage_encoded_blob;\n}\n\n// Specialize the default `ready()` function by making it dependent\n// on the current database operations. Thus, the driver will be actually\n// ready when it's been initialized (default) *and* there are no pending\n// operations on the database (initiated by some other instances).\nfunction _fullyReady(callback) {\n var self = this;\n\n var promise = self._initReady().then(function () {\n var dbContext = dbContexts[self._dbInfo.name];\n\n if (dbContext && dbContext.dbReady) {\n return dbContext.dbReady;\n }\n });\n\n executeTwoCallbacks(promise, callback, callback);\n return promise;\n}\n\n// Try to establish a new db connection to replace the\n// current one which is broken (i.e. experiencing\n// InvalidStateError while creating a transaction).\nfunction _tryReconnect(dbInfo) {\n _deferReadiness(dbInfo);\n\n var dbContext = dbContexts[dbInfo.name];\n var forages = dbContext.forages;\n\n for (var i = 0; i < forages.length; i++) {\n var forage = forages[i];\n if (forage._dbInfo.db) {\n forage._dbInfo.db.close();\n forage._dbInfo.db = null;\n }\n }\n dbInfo.db = null;\n\n return _getOriginalConnection(dbInfo).then(function (db) {\n dbInfo.db = db;\n if (_isUpgradeNeeded(dbInfo)) {\n // Reopen the database for upgrading.\n return _getUpgradedConnection(dbInfo);\n }\n return db;\n }).then(function (db) {\n // store the latest db reference\n // in case the db was upgraded\n dbInfo.db = dbContext.db = db;\n for (var i = 0; i < forages.length; i++) {\n forages[i]._dbInfo.db = db;\n }\n })[\"catch\"](function (err) {\n _rejectReadiness(dbInfo, err);\n throw err;\n });\n}\n\n// FF doesn't like Promises (micro-tasks) and IDDB store operations,\n// so we have to do it with callbacks\nfunction createTransaction(dbInfo, mode, callback, retries) {\n if (retries === undefined) {\n retries = 1;\n }\n\n try {\n var tx = dbInfo.db.transaction(dbInfo.storeName, mode);\n callback(null, tx);\n } catch (err) {\n if (retries > 0 && (!dbInfo.db || err.name === 'InvalidStateError' || err.name === 'NotFoundError')) {\n return Promise$1.resolve().then(function () {\n if (!dbInfo.db || err.name === 'NotFoundError' && !dbInfo.db.objectStoreNames.contains(dbInfo.storeName) && dbInfo.version <= dbInfo.db.version) {\n // increase the db version, to create the new ObjectStore\n if (dbInfo.db) {\n dbInfo.version = dbInfo.db.version + 1;\n }\n // Reopen the database for upgrading.\n return _getUpgradedConnection(dbInfo);\n }\n }).then(function () {\n return _tryReconnect(dbInfo).then(function () {\n createTransaction(dbInfo, mode, callback, retries - 1);\n });\n })[\"catch\"](callback);\n }\n\n callback(err);\n }\n}\n\nfunction createDbContext() {\n return {\n // Running localForages sharing a database.\n forages: [],\n // Shared database.\n db: null,\n // Database readiness (promise).\n dbReady: null,\n // Deferred operations on the database.\n deferredOperations: []\n };\n}\n\n// Open the IndexedDB database (automatically creates one if one didn't\n// previously exist), using any options set in the config.\nfunction _initStorage(options) {\n var self = this;\n var dbInfo = {\n db: null\n };\n\n if (options) {\n for (var i in options) {\n dbInfo[i] = options[i];\n }\n }\n\n // Get the current context of the database;\n var dbContext = dbContexts[dbInfo.name];\n\n // ...or create a new context.\n if (!dbContext) {\n dbContext = createDbContext();\n // Register the new context in the global container.\n dbContexts[dbInfo.name] = dbContext;\n }\n\n // Register itself as a running localForage in the current context.\n dbContext.forages.push(self);\n\n // Replace the default `ready()` function with the specialized one.\n if (!self._initReady) {\n self._initReady = self.ready;\n self.ready = _fullyReady;\n }\n\n // Create an array of initialization states of the related localForages.\n var initPromises = [];\n\n function ignoreErrors() {\n // Don't handle errors here,\n // just makes sure related localForages aren't pending.\n return Promise$1.resolve();\n }\n\n for (var j = 0; j < dbContext.forages.length; j++) {\n var forage = dbContext.forages[j];\n if (forage !== self) {\n // Don't wait for itself...\n initPromises.push(forage._initReady()[\"catch\"](ignoreErrors));\n }\n }\n\n // Take a snapshot of the related localForages.\n var forages = dbContext.forages.slice(0);\n\n // Initialize the connection process only when\n // all the related localForages aren't pending.\n return Promise$1.all(initPromises).then(function () {\n dbInfo.db = dbContext.db;\n // Get the connection or open a new one without upgrade.\n return _getOriginalConnection(dbInfo);\n }).then(function (db) {\n dbInfo.db = db;\n if (_isUpgradeNeeded(dbInfo, self._defaultConfig.version)) {\n // Reopen the database for upgrading.\n return _getUpgradedConnection(dbInfo);\n }\n return db;\n }).then(function (db) {\n dbInfo.db = dbContext.db = db;\n self._dbInfo = dbInfo;\n // Share the final connection amongst related localForages.\n for (var k = 0; k < forages.length; k++) {\n var forage = forages[k];\n if (forage !== self) {\n // Self is already up-to-date.\n forage._dbInfo.db = dbInfo.db;\n forage._dbInfo.version = dbInfo.version;\n }\n }\n });\n}\n\nfunction getItem(key, callback) {\n var self = this;\n\n key = normalizeKey(key);\n\n var promise = new Promise$1(function (resolve, reject) {\n self.ready().then(function () {\n createTransaction(self._dbInfo, READ_ONLY, function (err, transaction) {\n if (err) {\n return reject(err);\n }\n\n try {\n var store = transaction.objectStore(self._dbInfo.storeName);\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 if (_isEncodedBlob(value)) {\n value = _decodeBlob(value);\n }\n resolve(value);\n };\n\n req.onerror = function () {\n reject(req.error);\n };\n } catch (e) {\n reject(e);\n }\n });\n })[\"catch\"](reject);\n });\n\n executeCallback(promise, callback);\n return promise;\n}\n\n// Iterate over all items stored in database.\nfunction iterate(iterator, callback) {\n var self = this;\n\n var promise = new Promise$1(function (resolve, reject) {\n self.ready().then(function () {\n createTransaction(self._dbInfo, READ_ONLY, function (err, transaction) {\n if (err) {\n return reject(err);\n }\n\n try {\n var store = transaction.objectStore(self._dbInfo.storeName);\n var req = store.openCursor();\n var iterationNumber = 1;\n\n req.onsuccess = function () {\n var cursor = req.result;\n\n if (cursor) {\n var value = cursor.value;\n if (_isEncodedBlob(value)) {\n value = _decodeBlob(value);\n }\n var result = iterator(value, cursor.key, iterationNumber++);\n\n // when the iterator callback retuns any\n // (non-`undefined`) value, then we stop\n // the iteration immediately\n if (result !== void 0) {\n resolve(result);\n } else {\n cursor[\"continue\"]();\n }\n } else {\n resolve();\n }\n };\n\n req.onerror = function () {\n reject(req.error);\n };\n } catch (e) {\n reject(e);\n }\n });\n })[\"catch\"](reject);\n });\n\n executeCallback(promise, callback);\n\n return promise;\n}\n\nfunction setItem(key, value, callback) {\n var self = this;\n\n key = normalizeKey(key);\n\n var promise = new Promise$1(function (resolve, reject) {\n var dbInfo;\n self.ready().then(function () {\n dbInfo = self._dbInfo;\n if (toString.call(value) === '[object Blob]') {\n return _checkBlobSupport(dbInfo.db).then(function (blobSupport) {\n if (blobSupport) {\n return value;\n }\n return _encodeBlob(value);\n });\n }\n return value;\n }).then(function (value) {\n createTransaction(self._dbInfo, READ_WRITE, function (err, transaction) {\n if (err) {\n return reject(err);\n }\n\n try {\n var store = transaction.objectStore(self._dbInfo.storeName);\n\n // The reason we don't _save_ null is because IE 10 does\n // not support saving the `null` type in IndexedDB. How\n // ironic, given the bug below!\n // See: https://github.com/mozilla/localForage/issues/161\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 transaction.onabort = transaction.onerror = function () {\n var err = req.error ? req.error : req.transaction.error;\n reject(err);\n };\n } catch (e) {\n reject(e);\n }\n });\n })[\"catch\"](reject);\n });\n\n executeCallback(promise, callback);\n return promise;\n}\n\nfunction removeItem(key, callback) {\n var self = this;\n\n key = normalizeKey(key);\n\n var promise = new Promise$1(function (resolve, reject) {\n self.ready().then(function () {\n createTransaction(self._dbInfo, READ_WRITE, function (err, transaction) {\n if (err) {\n return reject(err);\n }\n\n try {\n var store = transaction.objectStore(self._dbInfo.storeName);\n // We use a Grunt task to make this safe for IE and some\n // versions of Android (including those used by Cordova).\n // Normally IE won't like `.delete()` and will insist on\n // using `['delete']()`, but we have a build step that\n // fixes this for us now.\n var req = store[\"delete\"](key);\n transaction.oncomplete = function () {\n resolve();\n };\n\n transaction.onerror = function () {\n reject(req.error);\n };\n\n // The request will be also be aborted if we've exceeded our storage\n // space.\n transaction.onabort = function () {\n var err = req.error ? req.error : req.transaction.error;\n reject(err);\n };\n } catch (e) {\n reject(e);\n }\n });\n })[\"catch\"](reject);\n });\n\n executeCallback(promise, callback);\n return promise;\n}\n\nfunction clear(callback) {\n var self = this;\n\n var promise = new Promise$1(function (resolve, reject) {\n self.ready().then(function () {\n createTransaction(self._dbInfo, READ_WRITE, function (err, transaction) {\n if (err) {\n return reject(err);\n }\n\n try {\n var store = transaction.objectStore(self._dbInfo.storeName);\n var req = store.clear();\n\n transaction.oncomplete = function () {\n resolve();\n };\n\n transaction.onabort = transaction.onerror = function () {\n var err = req.error ? req.error : req.transaction.error;\n reject(err);\n };\n } catch (e) {\n reject(e);\n }\n });\n })[\"catch\"](reject);\n });\n\n executeCallback(promise, callback);\n return promise;\n}\n\nfunction length(callback) {\n var self = this;\n\n var promise = new Promise$1(function (resolve, reject) {\n self.ready().then(function () {\n createTransaction(self._dbInfo, READ_ONLY, function (err, transaction) {\n if (err) {\n return reject(err);\n }\n\n try {\n var store = transaction.objectStore(self._dbInfo.storeName);\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 (e) {\n reject(e);\n }\n });\n })[\"catch\"](reject);\n });\n\n executeCallback(promise, callback);\n return promise;\n}\n\nfunction key(n, callback) {\n var self = this;\n\n var promise = new Promise$1(function (resolve, reject) {\n if (n < 0) {\n resolve(null);\n\n return;\n }\n\n self.ready().then(function () {\n createTransaction(self._dbInfo, READ_ONLY, function (err, transaction) {\n if (err) {\n return reject(err);\n }\n\n try {\n var store = transaction.objectStore(self._dbInfo.storeName);\n var advanced = false;\n var req = store.openCursor();\n\n req.onsuccess = function () {\n var cursor = req.result;\n if (!cursor) {\n // this means there weren't enough keys\n resolve(null);\n\n return;\n }\n\n if (n === 0) {\n // We have the first key, return it if that's what they\n // wanted.\n resolve(cursor.key);\n } else {\n if (!advanced) {\n // Otherwise, ask the cursor to skip ahead n\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 (e) {\n reject(e);\n }\n });\n })[\"catch\"](reject);\n });\n\n executeCallback(promise, callback);\n return promise;\n}\n\nfunction keys(callback) {\n var self = this;\n\n var promise = new Promise$1(function (resolve, reject) {\n self.ready().then(function () {\n createTransaction(self._dbInfo, READ_ONLY, function (err, transaction) {\n if (err) {\n return reject(err);\n }\n\n try {\n var store = transaction.objectStore(self._dbInfo.storeName);\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 } catch (e) {\n reject(e);\n }\n });\n })[\"catch\"](reject);\n });\n\n executeCallback(promise, callback);\n return promise;\n}\n\nfunction dropInstance(options, callback) {\n callback = getCallback.apply(this, arguments);\n\n var currentConfig = this.config();\n options = typeof options !== 'function' && options || {};\n if (!options.name) {\n options.name = options.name || currentConfig.name;\n options.storeName = options.storeName || currentConfig.storeName;\n }\n\n var self = this;\n var promise;\n if (!options.name) {\n promise = Promise$1.reject('Invalid arguments');\n } else {\n var isCurrentDb = options.name === currentConfig.name && self._dbInfo.db;\n\n var dbPromise = isCurrentDb ? Promise$1.resolve(self._dbInfo.db) : _getOriginalConnection(options).then(function (db) {\n var dbContext = dbContexts[options.name];\n var forages = dbContext.forages;\n dbContext.db = db;\n for (var i = 0; i < forages.length; i++) {\n forages[i]._dbInfo.db = db;\n }\n return db;\n });\n\n if (!options.storeName) {\n promise = dbPromise.then(function (db) {\n _deferReadiness(options);\n\n var dbContext = dbContexts[options.name];\n var forages = dbContext.forages;\n\n db.close();\n for (var i = 0; i < forages.length; i++) {\n var forage = forages[i];\n forage._dbInfo.db = null;\n }\n\n var dropDBPromise = new Promise$1(function (resolve, reject) {\n var req = idb.deleteDatabase(options.name);\n\n req.onerror = req.onblocked = function (err) {\n var db = req.result;\n if (db) {\n db.close();\n }\n reject(err);\n };\n\n req.onsuccess = function () {\n var db = req.result;\n if (db) {\n db.close();\n }\n resolve(db);\n };\n });\n\n return dropDBPromise.then(function (db) {\n dbContext.db = db;\n for (var i = 0; i < forages.length; i++) {\n var _forage = forages[i];\n _advanceReadiness(_forage._dbInfo);\n }\n })[\"catch\"](function (err) {\n (_rejectReadiness(options, err) || Promise$1.resolve())[\"catch\"](function () {});\n throw err;\n });\n });\n } else {\n promise = dbPromise.then(function (db) {\n if (!db.objectStoreNames.contains(options.storeName)) {\n return;\n }\n\n var newVersion = db.version + 1;\n\n _deferReadiness(options);\n\n var dbContext = dbContexts[options.name];\n var forages = dbContext.forages;\n\n db.close();\n for (var i = 0; i < forages.length; i++) {\n var forage = forages[i];\n forage._dbInfo.db = null;\n forage._dbInfo.version = newVersion;\n }\n\n var dropObjectPromise = new Promise$1(function (resolve, reject) {\n var req = idb.open(options.name, newVersion);\n\n req.onerror = function (err) {\n var db = req.result;\n db.close();\n reject(err);\n };\n\n req.onupgradeneeded = function () {\n var db = req.result;\n db.deleteObjectStore(options.storeName);\n };\n\n req.onsuccess = function () {\n var db = req.result;\n db.close();\n resolve(db);\n };\n });\n\n return dropObjectPromise.then(function (db) {\n dbContext.db = db;\n for (var j = 0; j < forages.length; j++) {\n var _forage2 = forages[j];\n _forage2._dbInfo.db = db;\n _advanceReadiness(_forage2._dbInfo);\n }\n })[\"catch\"](function (err) {\n (_rejectReadiness(options, err) || Promise$1.resolve())[\"catch\"](function () {});\n throw err;\n });\n });\n }\n }\n\n executeCallback(promise, callback);\n return promise;\n}\n\nvar asyncStorage = {\n _driver: 'asyncStorage',\n _initStorage: _initStorage,\n _support: isIndexedDBValid(),\n iterate: iterate,\n getItem: getItem,\n setItem: setItem,\n removeItem: removeItem,\n clear: clear,\n length: length,\n key: key,\n keys: keys,\n dropInstance: dropInstance\n};\n\nfunction isWebSQLValid() {\n return typeof openDatabase === 'function';\n}\n\n// Sadly, the best way to save binary data in WebSQL/localStorage is serializing\n// it to Base64, so this is how we store it to prevent very strange errors with less\n// verbose ways of binary <-> string data storage.\nvar BASE_CHARS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';\n\nvar BLOB_TYPE_PREFIX = '~~local_forage_type~';\nvar BLOB_TYPE_PREFIX_REGEX = /^~~local_forage_type~([^~]+)~/;\n\nvar SERIALIZED_MARKER = '__lfsc__:';\nvar SERIALIZED_MARKER_LENGTH = SERIALIZED_MARKER.length;\n\n// OMG the serializations!\nvar TYPE_ARRAYBUFFER = 'arbf';\nvar TYPE_BLOB = 'blob';\nvar TYPE_INT8ARRAY = 'si08';\nvar TYPE_UINT8ARRAY = 'ui08';\nvar TYPE_UINT8CLAMPEDARRAY = 'uic8';\nvar TYPE_INT16ARRAY = 'si16';\nvar TYPE_INT32ARRAY = 'si32';\nvar TYPE_UINT16ARRAY = 'ur16';\nvar TYPE_UINT32ARRAY = 'ui32';\nvar TYPE_FLOAT32ARRAY = 'fl32';\nvar TYPE_FLOAT64ARRAY = 'fl64';\nvar TYPE_SERIALIZED_MARKER_LENGTH = SERIALIZED_MARKER_LENGTH + TYPE_ARRAYBUFFER.length;\n\nvar toString$1 = Object.prototype.toString;\n\nfunction stringToBuffer(serializedString) {\n // Fill the string into a ArrayBuffer.\n var bufferLength = serializedString.length * 0.75;\n var len = serializedString.length;\n var i;\n var p = 0;\n var encoded1, encoded2, encoded3, encoded4;\n\n if (serializedString[serializedString.length - 1] === '=') {\n bufferLength--;\n if (serializedString[serializedString.length - 2] === '=') {\n bufferLength--;\n }\n }\n\n var buffer = new ArrayBuffer(bufferLength);\n var bytes = new Uint8Array(buffer);\n\n for (i = 0; i < len; i += 4) {\n encoded1 = BASE_CHARS.indexOf(serializedString[i]);\n encoded2 = BASE_CHARS.indexOf(serializedString[i + 1]);\n encoded3 = BASE_CHARS.indexOf(serializedString[i + 2]);\n encoded4 = BASE_CHARS.indexOf(serializedString[i + 3]);\n\n /*jslint bitwise: true */\n bytes[p++] = encoded1 << 2 | encoded2 >> 4;\n bytes[p++] = (encoded2 & 15) << 4 | encoded3 >> 2;\n bytes[p++] = (encoded3 & 3) << 6 | encoded4 & 63;\n }\n return buffer;\n}\n\n// Converts a buffer to a string to store, serialized, in the backend\n// storage library.\nfunction bufferToString(buffer) {\n // base64-arraybuffer\n var bytes = new Uint8Array(buffer);\n var base64String = '';\n var i;\n\n for (i = 0; i < bytes.length; i += 3) {\n /*jslint bitwise: true */\n base64String += BASE_CHARS[bytes[i] >> 2];\n base64String += BASE_CHARS[(bytes[i] & 3) << 4 | bytes[i + 1] >> 4];\n base64String += BASE_CHARS[(bytes[i + 1] & 15) << 2 | bytes[i + 2] >> 6];\n base64String += BASE_CHARS[bytes[i + 2] & 63];\n }\n\n if (bytes.length % 3 === 2) {\n base64String = base64String.substring(0, base64String.length - 1) + '=';\n } else if (bytes.length % 3 === 1) {\n base64String = base64String.substring(0, base64String.length - 2) + '==';\n }\n\n return base64String;\n}\n\n// Serialize a value, afterwards executing a callback (which usually\n// instructs the `setItem()` callback/promise to be executed). This is how\n// we store binary data with localStorage.\nfunction serialize(value, callback) {\n var valueType = '';\n if (value) {\n valueType = toString$1.call(value);\n }\n\n // Cannot use `value instanceof ArrayBuffer` or such here, as these\n // checks fail when running the tests using casper.js...\n //\n // TODO: See why those tests fail and use a better solution.\n if (value && (valueType === '[object ArrayBuffer]' || value.buffer && toString$1.call(value.buffer) === '[object ArrayBuffer]')) {\n // Convert binary arrays to a string and prefix the string with\n // a special marker.\n var buffer;\n var marker = SERIALIZED_MARKER;\n\n if (value instanceof ArrayBuffer) {\n buffer = value;\n marker += TYPE_ARRAYBUFFER;\n } else {\n buffer = value.buffer;\n\n if (valueType === '[object Int8Array]') {\n marker += TYPE_INT8ARRAY;\n } else if (valueType === '[object Uint8Array]') {\n marker += TYPE_UINT8ARRAY;\n } else if (valueType === '[object Uint8ClampedArray]') {\n marker += TYPE_UINT8CLAMPEDARRAY;\n } else if (valueType === '[object Int16Array]') {\n marker += TYPE_INT16ARRAY;\n } else if (valueType === '[object Uint16Array]') {\n marker += TYPE_UINT16ARRAY;\n } else if (valueType === '[object Int32Array]') {\n marker += TYPE_INT32ARRAY;\n } else if (valueType === '[object Uint32Array]') {\n marker += TYPE_UINT32ARRAY;\n } else if (valueType === '[object Float32Array]') {\n marker += TYPE_FLOAT32ARRAY;\n } else if (valueType === '[object Float64Array]') {\n marker += TYPE_FLOAT64ARRAY;\n } else {\n callback(new Error('Failed to get type for BinaryArray'));\n }\n }\n\n callback(marker + bufferToString(buffer));\n } else if (valueType === '[object Blob]') {\n // Conver the blob to a binaryArray and then to a string.\n var fileReader = new FileReader();\n\n fileReader.onload = function () {\n // Backwards-compatible prefix for the blob type.\n var str = BLOB_TYPE_PREFIX + value.type + '~' + bufferToString(this.result);\n\n callback(SERIALIZED_MARKER + TYPE_BLOB + str);\n };\n\n fileReader.readAsArrayBuffer(value);\n } else {\n try {\n callback(JSON.stringify(value));\n } catch (e) {\n console.error(\"Couldn't convert value into a JSON string: \", value);\n\n callback(null, e);\n }\n }\n}\n\n// Deserialize data we've inserted into a value column/field. We place\n// special markers into our strings to mark them as encoded; this isn't\n// as nice as a meta field, but it's the only sane thing we can do whilst\n// keeping localStorage support intact.\n//\n// Oftentimes this will just deserialize JSON content, but if we have a\n// special marker (SERIALIZED_MARKER, defined above), we will extract\n// some kind of arraybuffer/binary data/typed array out of the string.\nfunction deserialize(value) {\n // If we haven't marked this string as being specially serialized (i.e.\n // something other than serialized JSON), we can just return it and be\n // done with it.\n if (value.substring(0, SERIALIZED_MARKER_LENGTH) !== SERIALIZED_MARKER) {\n return JSON.parse(value);\n }\n\n // The following code deals with deserializing some kind of Blob or\n // TypedArray. First we separate out the type of data we're dealing\n // with from the data itself.\n var serializedString = value.substring(TYPE_SERIALIZED_MARKER_LENGTH);\n var type = value.substring(SERIALIZED_MARKER_LENGTH, TYPE_SERIALIZED_MARKER_LENGTH);\n\n var blobType;\n // Backwards-compatible blob type serialization strategy.\n // DBs created with older versions of localForage will simply not have the blob type.\n if (type === TYPE_BLOB && BLOB_TYPE_PREFIX_REGEX.test(serializedString)) {\n var matcher = serializedString.match(BLOB_TYPE_PREFIX_REGEX);\n blobType = matcher[1];\n serializedString = serializedString.substring(matcher[0].length);\n }\n var buffer = stringToBuffer(serializedString);\n\n // Return the right type based on the code/type set during\n // serialization.\n switch (type) {\n case TYPE_ARRAYBUFFER:\n return buffer;\n case TYPE_BLOB:\n return createBlob([buffer], { type: blobType });\n case TYPE_INT8ARRAY:\n return new Int8Array(buffer);\n case TYPE_UINT8ARRAY:\n return new Uint8Array(buffer);\n case TYPE_UINT8CLAMPEDARRAY:\n return new Uint8ClampedArray(buffer);\n case TYPE_INT16ARRAY:\n return new Int16Array(buffer);\n case TYPE_UINT16ARRAY:\n return new Uint16Array(buffer);\n case TYPE_INT32ARRAY:\n return new Int32Array(buffer);\n case TYPE_UINT32ARRAY:\n return new Uint32Array(buffer);\n case TYPE_FLOAT32ARRAY:\n return new Float32Array(buffer);\n case TYPE_FLOAT64ARRAY:\n return new Float64Array(buffer);\n default:\n throw new Error('Unkown type: ' + type);\n }\n}\n\nvar localforageSerializer = {\n serialize: serialize,\n deserialize: deserialize,\n stringToBuffer: stringToBuffer,\n bufferToString: bufferToString\n};\n\n/*\n * Includes code from:\n *\n * base64-arraybuffer\n * https://github.com/niklasvh/base64-arraybuffer\n *\n * Copyright (c) 2012 Niklas von Hertzen\n * Licensed under the MIT license.\n */\n\nfunction createDbTable(t, dbInfo, callback, errorCallback) {\n t.executeSql('CREATE TABLE IF NOT EXISTS ' + dbInfo.storeName + ' ' + '(id INTEGER PRIMARY KEY, key unique, value)', [], callback, errorCallback);\n}\n\n// Open the WebSQL database (automatically creates one if one didn't\n// previously exist), using any options set in the config.\nfunction _initStorage$1(options) {\n var self = this;\n var dbInfo = {\n db: null\n };\n\n if (options) {\n for (var i in options) {\n dbInfo[i] = typeof options[i] !== 'string' ? options[i].toString() : options[i];\n }\n }\n\n var dbInfoPromise = new Promise$1(function (resolve, reject) {\n // Open the database; the openDatabase API will automatically\n // create it for us if it doesn't exist.\n try {\n dbInfo.db = openDatabase(dbInfo.name, String(dbInfo.version), dbInfo.description, dbInfo.size);\n } catch (e) {\n return reject(e);\n }\n\n // Create our key/value table if it doesn't exist.\n dbInfo.db.transaction(function (t) {\n createDbTable(t, dbInfo, function () {\n self._dbInfo = dbInfo;\n resolve();\n }, function (t, error) {\n reject(error);\n });\n }, reject);\n });\n\n dbInfo.serializer = localforageSerializer;\n return dbInfoPromise;\n}\n\nfunction tryExecuteSql(t, dbInfo, sqlStatement, args, callback, errorCallback) {\n t.executeSql(sqlStatement, args, callback, function (t, error) {\n if (error.code === error.SYNTAX_ERR) {\n t.executeSql('SELECT name FROM sqlite_master ' + \"WHERE type='table' AND name = ?\", [dbInfo.storeName], function (t, results) {\n if (!results.rows.length) {\n // if the table is missing (was deleted)\n // re-create it table and retry\n createDbTable(t, dbInfo, function () {\n t.executeSql(sqlStatement, args, callback, errorCallback);\n }, errorCallback);\n } else {\n errorCallback(t, error);\n }\n }, errorCallback);\n } else {\n errorCallback(t, error);\n }\n }, errorCallback);\n}\n\nfunction getItem$1(key, callback) {\n var self = this;\n\n key = normalizeKey(key);\n\n var promise = new Promise$1(function (resolve, reject) {\n self.ready().then(function () {\n var dbInfo = self._dbInfo;\n dbInfo.db.transaction(function (t) {\n tryExecuteSql(t, dbInfo, 'SELECT * FROM ' + dbInfo.storeName + ' WHERE key = ? LIMIT 1', [key], function (t, results) {\n var result = results.rows.length ? results.rows.item(0).value : null;\n\n // Check to see if this is serialized content we need to\n // unpack.\n if (result) {\n result = dbInfo.serializer.deserialize(result);\n }\n\n resolve(result);\n }, function (t, error) {\n reject(error);\n });\n });\n })[\"catch\"](reject);\n });\n\n executeCallback(promise, callback);\n return promise;\n}\n\nfunction iterate$1(iterator, callback) {\n var self = this;\n\n var promise = new Promise$1(function (resolve, reject) {\n self.ready().then(function () {\n var dbInfo = self._dbInfo;\n\n dbInfo.db.transaction(function (t) {\n tryExecuteSql(t, dbInfo, 'SELECT * FROM ' + dbInfo.storeName, [], function (t, results) {\n var rows = results.rows;\n var length = rows.length;\n\n for (var i = 0; i < length; i++) {\n var item = rows.item(i);\n var result = item.value;\n\n // Check to see if this is serialized content\n // we need to unpack.\n if (result) {\n result = dbInfo.serializer.deserialize(result);\n }\n\n result = iterator(result, item.key, i + 1);\n\n // void(0) prevents problems with redefinition\n // of `undefined`.\n if (result !== void 0) {\n resolve(result);\n return;\n }\n }\n\n resolve();\n }, function (t, error) {\n reject(error);\n });\n });\n })[\"catch\"](reject);\n });\n\n executeCallback(promise, callback);\n return promise;\n}\n\nfunction _setItem(key, value, callback, retriesLeft) {\n var self = this;\n\n key = normalizeKey(key);\n\n var promise = new Promise$1(function (resolve, reject) {\n self.ready().then(function () {\n // The localStorage API doesn't return undefined values in an\n // \"expected\" way, so undefined is always cast to null in all\n // drivers. See: https://github.com/mozilla/localForage/pull/42\n if (value === undefined) {\n value = null;\n }\n\n // Save the original value to pass to the callback.\n var originalValue = value;\n\n var dbInfo = self._dbInfo;\n dbInfo.serializer.serialize(value, function (value, error) {\n if (error) {\n reject(error);\n } else {\n dbInfo.db.transaction(function (t) {\n tryExecuteSql(t, dbInfo, 'INSERT OR REPLACE INTO ' + dbInfo.storeName + ' ' + '(key, value) VALUES (?, ?)', [key, value], function () {\n resolve(originalValue);\n }, function (t, error) {\n reject(error);\n });\n }, function (sqlError) {\n // The transaction failed; check\n // to see if it's a quota error.\n if (sqlError.code === sqlError.QUOTA_ERR) {\n // We reject the callback outright for now, but\n // it's worth trying to re-run the transaction.\n // Even if the user accepts the prompt to use\n // more storage on Safari, this error will\n // be called.\n //\n // Try to re-run the transaction.\n if (retriesLeft > 0) {\n resolve(_setItem.apply(self, [key, originalValue, callback, retriesLeft - 1]));\n return;\n }\n reject(sqlError);\n }\n });\n }\n });\n })[\"catch\"](reject);\n });\n\n executeCallback(promise, callback);\n return promise;\n}\n\nfunction setItem$1(key, value, callback) {\n return _setItem.apply(this, [key, value, callback, 1]);\n}\n\nfunction removeItem$1(key, callback) {\n var self = this;\n\n key = normalizeKey(key);\n\n var promise = new Promise$1(function (resolve, reject) {\n self.ready().then(function () {\n var dbInfo = self._dbInfo;\n dbInfo.db.transaction(function (t) {\n tryExecuteSql(t, dbInfo, 'DELETE FROM ' + dbInfo.storeName + ' WHERE key = ?', [key], function () {\n resolve();\n }, function (t, error) {\n reject(error);\n });\n });\n })[\"catch\"](reject);\n });\n\n executeCallback(promise, callback);\n return promise;\n}\n\n// Deletes every item in the table.\n// TODO: Find out if this resets the AUTO_INCREMENT number.\nfunction clear$1(callback) {\n var self = this;\n\n var promise = new Promise$1(function (resolve, reject) {\n self.ready().then(function () {\n var dbInfo = self._dbInfo;\n dbInfo.db.transaction(function (t) {\n tryExecuteSql(t, dbInfo, 'DELETE FROM ' + dbInfo.storeName, [], function () {\n resolve();\n }, function (t, error) {\n reject(error);\n });\n });\n })[\"catch\"](reject);\n });\n\n executeCallback(promise, callback);\n return promise;\n}\n\n// Does a simple `COUNT(key)` to get the number of items stored in\n// localForage.\nfunction length$1(callback) {\n var self = this;\n\n var promise = new Promise$1(function (resolve, reject) {\n self.ready().then(function () {\n var dbInfo = self._dbInfo;\n dbInfo.db.transaction(function (t) {\n // Ahhh, SQL makes this one soooooo easy.\n tryExecuteSql(t, dbInfo, 'SELECT COUNT(key) as c FROM ' + dbInfo.storeName, [], function (t, results) {\n var result = results.rows.item(0).c;\n resolve(result);\n }, function (t, error) {\n reject(error);\n });\n });\n })[\"catch\"](reject);\n });\n\n executeCallback(promise, callback);\n return promise;\n}\n\n// Return the key located at key index X; essentially gets the key from a\n// `WHERE id = ?`. This is the most efficient way I can think to implement\n// this rarely-used (in my experience) part of the API, but it can seem\n// inconsistent, because we do `INSERT OR REPLACE INTO` on `setItem()`, so\n// the ID of each key will change every time it's updated. Perhaps a stored\n// procedure for the `setItem()` SQL would solve this problem?\n// TODO: Don't change ID on `setItem()`.\nfunction key$1(n, callback) {\n var self = this;\n\n var promise = new Promise$1(function (resolve, reject) {\n self.ready().then(function () {\n var dbInfo = self._dbInfo;\n dbInfo.db.transaction(function (t) {\n tryExecuteSql(t, dbInfo, 'SELECT key FROM ' + dbInfo.storeName + ' WHERE id = ? LIMIT 1', [n + 1], function (t, results) {\n var result = results.rows.length ? results.rows.item(0).key : null;\n resolve(result);\n }, function (t, error) {\n reject(error);\n });\n });\n })[\"catch\"](reject);\n });\n\n executeCallback(promise, callback);\n return promise;\n}\n\nfunction keys$1(callback) {\n var self = this;\n\n var promise = new Promise$1(function (resolve, reject) {\n self.ready().then(function () {\n var dbInfo = self._dbInfo;\n dbInfo.db.transaction(function (t) {\n tryExecuteSql(t, dbInfo, 'SELECT key FROM ' + dbInfo.storeName, [], function (t, results) {\n var keys = [];\n\n for (var i = 0; i < results.rows.length; i++) {\n keys.push(results.rows.item(i).key);\n }\n\n resolve(keys);\n }, function (t, error) {\n reject(error);\n });\n });\n })[\"catch\"](reject);\n });\n\n executeCallback(promise, callback);\n return promise;\n}\n\n// https://www.w3.org/TR/webdatabase/#databases\n// > There is no way to enumerate or delete the databases available for an origin from this API.\nfunction getAllStoreNames(db) {\n return new Promise$1(function (resolve, reject) {\n db.transaction(function (t) {\n t.executeSql('SELECT name FROM sqlite_master ' + \"WHERE type='table' AND name <> '__WebKitDatabaseInfoTable__'\", [], function (t, results) {\n var storeNames = [];\n\n for (var i = 0; i < results.rows.length; i++) {\n storeNames.push(results.rows.item(i).name);\n }\n\n resolve({\n db: db,\n storeNames: storeNames\n });\n }, function (t, error) {\n reject(error);\n });\n }, function (sqlError) {\n reject(sqlError);\n });\n });\n}\n\nfunction dropInstance$1(options, callback) {\n callback = getCallback.apply(this, arguments);\n\n var currentConfig = this.config();\n options = typeof options !== 'function' && options || {};\n if (!options.name) {\n options.name = options.name || currentConfig.name;\n options.storeName = options.storeName || currentConfig.storeName;\n }\n\n var self = this;\n var promise;\n if (!options.name) {\n promise = Promise$1.reject('Invalid arguments');\n } else {\n promise = new Promise$1(function (resolve) {\n var db;\n if (options.name === currentConfig.name) {\n // use the db reference of the current instance\n db = self._dbInfo.db;\n } else {\n db = openDatabase(options.name, '', '', 0);\n }\n\n if (!options.storeName) {\n // drop all database tables\n resolve(getAllStoreNames(db));\n } else {\n resolve({\n db: db,\n storeNames: [options.storeName]\n });\n }\n }).then(function (operationInfo) {\n return new Promise$1(function (resolve, reject) {\n operationInfo.db.transaction(function (t) {\n function dropTable(storeName) {\n return new Promise$1(function (resolve, reject) {\n t.executeSql('DROP TABLE IF EXISTS ' + storeName, [], function () {\n resolve();\n }, function (t, error) {\n reject(error);\n });\n });\n }\n\n var operations = [];\n for (var i = 0, len = operationInfo.storeNames.length; i < len; i++) {\n operations.push(dropTable(operationInfo.storeNames[i]));\n }\n\n Promise$1.all(operations).then(function () {\n resolve();\n })[\"catch\"](function (e) {\n reject(e);\n });\n }, function (sqlError) {\n reject(sqlError);\n });\n });\n });\n }\n\n executeCallback(promise, callback);\n return promise;\n}\n\nvar webSQLStorage = {\n _driver: 'webSQLStorage',\n _initStorage: _initStorage$1,\n _support: isWebSQLValid(),\n iterate: iterate$1,\n getItem: getItem$1,\n setItem: setItem$1,\n removeItem: removeItem$1,\n clear: clear$1,\n length: length$1,\n key: key$1,\n keys: keys$1,\n dropInstance: dropInstance$1\n};\n\nfunction isLocalStorageValid() {\n try {\n return typeof localStorage !== 'undefined' && 'setItem' in localStorage &&\n // in IE8 typeof localStorage.setItem === 'object'\n !!localStorage.setItem;\n } catch (e) {\n return false;\n }\n}\n\nfunction _getKeyPrefix(options, defaultConfig) {\n var keyPrefix = options.name + '/';\n\n if (options.storeName !== defaultConfig.storeName) {\n keyPrefix += options.storeName + '/';\n }\n return keyPrefix;\n}\n\n// Check if localStorage throws when saving an item\nfunction checkIfLocalStorageThrows() {\n var localStorageTestKey = '_localforage_support_test';\n\n try {\n localStorage.setItem(localStorageTestKey, true);\n localStorage.removeItem(localStorageTestKey);\n\n return false;\n } catch (e) {\n return true;\n }\n}\n\n// Check if localStorage is usable and allows to save an item\n// This method checks if localStorage is usable in Safari Private Browsing\n// mode, or in any other case where the available quota for localStorage\n// is 0 and there wasn't any saved items yet.\nfunction _isLocalStorageUsable() {\n return !checkIfLocalStorageThrows() || localStorage.length > 0;\n}\n\n// Config the localStorage backend, using options set in the config.\nfunction _initStorage$2(options) {\n var self = this;\n var dbInfo = {};\n if (options) {\n for (var i in options) {\n dbInfo[i] = options[i];\n }\n }\n\n dbInfo.keyPrefix = _getKeyPrefix(options, self._defaultConfig);\n\n if (!_isLocalStorageUsable()) {\n return Promise$1.reject();\n }\n\n self._dbInfo = dbInfo;\n dbInfo.serializer = localforageSerializer;\n\n return Promise$1.resolve();\n}\n\n// Remove all keys from the datastore, effectively destroying all data in\n// the app's key/value store!\nfunction clear$2(callback) {\n var self = this;\n var promise = self.ready().then(function () {\n var keyPrefix = self._dbInfo.keyPrefix;\n\n for (var i = localStorage.length - 1; i >= 0; i--) {\n var key = localStorage.key(i);\n\n if (key.indexOf(keyPrefix) === 0) {\n localStorage.removeItem(key);\n }\n }\n });\n\n executeCallback(promise, callback);\n return promise;\n}\n\n// Retrieve an item from the store. Unlike the original async_storage\n// library in Gaia, we don't modify return values at all. If a key's value\n// is `undefined`, we pass that value to the callback function.\nfunction getItem$2(key, callback) {\n var self = this;\n\n key = normalizeKey(key);\n\n var promise = self.ready().then(function () {\n var dbInfo = self._dbInfo;\n var result = localStorage.getItem(dbInfo.keyPrefix + key);\n\n // If a result was found, parse it from the serialized\n // string into a JS object. If result isn't truthy, the key\n // is likely undefined and we'll pass it straight to the\n // callback.\n if (result) {\n result = dbInfo.serializer.deserialize(result);\n }\n\n return result;\n });\n\n executeCallback(promise, callback);\n return promise;\n}\n\n// Iterate over all items in the store.\nfunction iterate$2(iterator, callback) {\n var self = this;\n\n var promise = self.ready().then(function () {\n var dbInfo = self._dbInfo;\n var keyPrefix = dbInfo.keyPrefix;\n var keyPrefixLength = keyPrefix.length;\n var length = localStorage.length;\n\n // We use a dedicated iterator instead of the `i` variable below\n // so other keys we fetch in localStorage aren't counted in\n // the `iterationNumber` argument passed to the `iterate()`\n // callback.\n //\n // See: github.com/mozilla/localForage/pull/435#discussion_r38061530\n var iterationNumber = 1;\n\n for (var i = 0; i < length; i++) {\n var key = localStorage.key(i);\n if (key.indexOf(keyPrefix) !== 0) {\n continue;\n }\n var value = localStorage.getItem(key);\n\n // If a result was found, parse it from the serialized\n // string into a JS object. If result isn't truthy, the\n // key is likely undefined and we'll pass it straight\n // to the iterator.\n if (value) {\n value = dbInfo.serializer.deserialize(value);\n }\n\n value = iterator(value, key.substring(keyPrefixLength), iterationNumber++);\n\n if (value !== void 0) {\n return value;\n }\n }\n });\n\n executeCallback(promise, callback);\n return promise;\n}\n\n// Same as localStorage's key() method, except takes a callback.\nfunction key$2(n, callback) {\n var self = this;\n var promise = self.ready().then(function () {\n var dbInfo = self._dbInfo;\n var result;\n try {\n result = localStorage.key(n);\n } catch (error) {\n result = null;\n }\n\n // Remove the prefix from the key, if a key is found.\n if (result) {\n result = result.substring(dbInfo.keyPrefix.length);\n }\n\n return result;\n });\n\n executeCallback(promise, callback);\n return promise;\n}\n\nfunction keys$2(callback) {\n var self = this;\n var promise = self.ready().then(function () {\n var dbInfo = self._dbInfo;\n var length = localStorage.length;\n var keys = [];\n\n for (var i = 0; i < length; i++) {\n var itemKey = localStorage.key(i);\n if (itemKey.indexOf(dbInfo.keyPrefix) === 0) {\n keys.push(itemKey.substring(dbInfo.keyPrefix.length));\n }\n }\n\n return keys;\n });\n\n executeCallback(promise, callback);\n return promise;\n}\n\n// Supply the number of keys in the datastore to the callback function.\nfunction length$2(callback) {\n var self = this;\n var promise = self.keys().then(function (keys) {\n return keys.length;\n });\n\n executeCallback(promise, callback);\n return promise;\n}\n\n// Remove an item from the store, nice and simple.\nfunction removeItem$2(key, callback) {\n var self = this;\n\n key = normalizeKey(key);\n\n var promise = self.ready().then(function () {\n var dbInfo = self._dbInfo;\n localStorage.removeItem(dbInfo.keyPrefix + key);\n });\n\n executeCallback(promise, callback);\n return promise;\n}\n\n// Set a key's value and run an optional callback once the value is set.\n// Unlike Gaia's implementation, the callback function is passed the value,\n// in case you want to operate on that value only after you're sure it\n// saved, or something like that.\nfunction setItem$2(key, value, callback) {\n var self = this;\n\n key = normalizeKey(key);\n\n var promise = self.ready().then(function () {\n // Convert undefined values to null.\n // https://github.com/mozilla/localForage/pull/42\n if (value === undefined) {\n value = null;\n }\n\n // Save the original value to pass to the callback.\n var originalValue = value;\n\n return new Promise$1(function (resolve, reject) {\n var dbInfo = self._dbInfo;\n dbInfo.serializer.serialize(value, function (value, error) {\n if (error) {\n reject(error);\n } else {\n try {\n localStorage.setItem(dbInfo.keyPrefix + key, value);\n resolve(originalValue);\n } catch (e) {\n // localStorage capacity exceeded.\n // TODO: Make this a specific error/event.\n if (e.name === 'QuotaExceededError' || e.name === 'NS_ERROR_DOM_QUOTA_REACHED') {\n reject(e);\n }\n reject(e);\n }\n }\n });\n });\n });\n\n executeCallback(promise, callback);\n return promise;\n}\n\nfunction dropInstance$2(options, callback) {\n callback = getCallback.apply(this, arguments);\n\n options = typeof options !== 'function' && options || {};\n if (!options.name) {\n var currentConfig = this.config();\n options.name = options.name || currentConfig.name;\n options.storeName = options.storeName || currentConfig.storeName;\n }\n\n var self = this;\n var promise;\n if (!options.name) {\n promise = Promise$1.reject('Invalid arguments');\n } else {\n promise = new Promise$1(function (resolve) {\n if (!options.storeName) {\n resolve(options.name + '/');\n } else {\n resolve(_getKeyPrefix(options, self._defaultConfig));\n }\n }).then(function (keyPrefix) {\n for (var i = localStorage.length - 1; i >= 0; i--) {\n var key = localStorage.key(i);\n\n if (key.indexOf(keyPrefix) === 0) {\n localStorage.removeItem(key);\n }\n }\n });\n }\n\n executeCallback(promise, callback);\n return promise;\n}\n\nvar localStorageWrapper = {\n _driver: 'localStorageWrapper',\n _initStorage: _initStorage$2,\n _support: isLocalStorageValid(),\n iterate: iterate$2,\n getItem: getItem$2,\n setItem: setItem$2,\n removeItem: removeItem$2,\n clear: clear$2,\n length: length$2,\n key: key$2,\n keys: keys$2,\n dropInstance: dropInstance$2\n};\n\nvar sameValue = function sameValue(x, y) {\n return x === y || typeof x === 'number' && typeof y === 'number' && isNaN(x) && isNaN(y);\n};\n\nvar includes = function includes(array, searchElement) {\n var len = array.length;\n var i = 0;\n while (i < len) {\n if (sameValue(array[i], searchElement)) {\n return true;\n }\n i++;\n }\n\n return false;\n};\n\nvar isArray = Array.isArray || function (arg) {\n return Object.prototype.toString.call(arg) === '[object Array]';\n};\n\n// Drivers are stored here when `defineDriver()` is called.\n// They are shared across all instances of localForage.\nvar DefinedDrivers = {};\n\nvar DriverSupport = {};\n\nvar DefaultDrivers = {\n INDEXEDDB: asyncStorage,\n WEBSQL: webSQLStorage,\n LOCALSTORAGE: localStorageWrapper\n};\n\nvar DefaultDriverOrder = [DefaultDrivers.INDEXEDDB._driver, DefaultDrivers.WEBSQL._driver, DefaultDrivers.LOCALSTORAGE._driver];\n\nvar OptionalDriverMethods = ['dropInstance'];\n\nvar LibraryMethods = ['clear', 'getItem', 'iterate', 'key', 'keys', 'length', 'removeItem', 'setItem'].concat(OptionalDriverMethods);\n\nvar DefaultConfig = {\n description: '',\n driver: DefaultDriverOrder.slice(),\n name: 'localforage',\n // Default DB size is _JUST UNDER_ 5MB, as it's the highest size\n // we can use without a prompt.\n size: 4980736,\n storeName: 'keyvaluepairs',\n version: 1.0\n};\n\nfunction callWhenReady(localForageInstance, libraryMethod) {\n localForageInstance[libraryMethod] = function () {\n var _args = arguments;\n return localForageInstance.ready().then(function () {\n return localForageInstance[libraryMethod].apply(localForageInstance, _args);\n });\n };\n}\n\nfunction extend() {\n for (var i = 1; i < arguments.length; i++) {\n var arg = arguments[i];\n\n if (arg) {\n for (var _key in arg) {\n if (arg.hasOwnProperty(_key)) {\n if (isArray(arg[_key])) {\n arguments[0][_key] = arg[_key].slice();\n } else {\n arguments[0][_key] = arg[_key];\n }\n }\n }\n }\n }\n\n return arguments[0];\n}\n\nvar LocalForage = function () {\n function LocalForage(options) {\n _classCallCheck(this, LocalForage);\n\n for (var driverTypeKey in DefaultDrivers) {\n if (DefaultDrivers.hasOwnProperty(driverTypeKey)) {\n var driver = DefaultDrivers[driverTypeKey];\n var driverName = driver._driver;\n this[driverTypeKey] = driverName;\n\n if (!DefinedDrivers[driverName]) {\n // we don't need to wait for the promise,\n // since the default drivers can be defined\n // in a blocking manner\n this.defineDriver(driver);\n }\n }\n }\n\n this._defaultConfig = extend({}, DefaultConfig);\n this._config = extend({}, this._defaultConfig, options);\n this._driverSet = null;\n this._initDriver = null;\n this._ready = false;\n this._dbInfo = null;\n\n this._wrapLibraryMethodsWithReady();\n this.setDriver(this._config.driver)[\"catch\"](function () {});\n }\n\n // Set any config values for localForage; can be called anytime before\n // the first API call (e.g. `getItem`, `setItem`).\n // We loop through options so we don't overwrite existing config\n // values.\n\n\n LocalForage.prototype.config = function config(options) {\n // If the options argument is an object, we use it to set values.\n // Otherwise, we return either a specified config value or all\n // config values.\n if ((typeof options === 'undefined' ? 'undefined' : _typeof(options)) === 'object') {\n // If localforage is ready and fully initialized, we can't set\n // any new configuration values. Instead, we return an error.\n if (this._ready) {\n return new Error(\"Can't call config() after localforage \" + 'has been used.');\n }\n\n for (var i in options) {\n if (i === 'storeName') {\n options[i] = options[i].replace(/\\W/g, '_');\n }\n\n if (i === 'version' && typeof options[i] !== 'number') {\n return new Error('Database version must be a number.');\n }\n\n this._config[i] = options[i];\n }\n\n // after all config options are set and\n // the driver option is used, try setting it\n if ('driver' in options && options.driver) {\n return this.setDriver(this._config.driver);\n }\n\n return true;\n } else if (typeof options === 'string') {\n return this._config[options];\n } else {\n return this._config;\n }\n };\n\n // Used to define a custom driver, shared across all instances of\n // localForage.\n\n\n LocalForage.prototype.defineDriver = function defineDriver(driverObject, callback, errorCallback) {\n var promise = new Promise$1(function (resolve, reject) {\n try {\n var driverName = driverObject._driver;\n var complianceError = new Error('Custom driver not compliant; see ' + 'https://mozilla.github.io/localForage/#definedriver');\n\n // A driver name should be defined and not overlap with the\n // library-defined, default drivers.\n if (!driverObject._driver) {\n reject(complianceError);\n return;\n }\n\n var driverMethods = LibraryMethods.concat('_initStorage');\n for (var i = 0, len = driverMethods.length; i < len; i++) {\n var driverMethodName = driverMethods[i];\n\n // when the property is there,\n // it should be a method even when optional\n var isRequired = !includes(OptionalDriverMethods, driverMethodName);\n if ((isRequired || driverObject[driverMethodName]) && typeof driverObject[driverMethodName] !== 'function') {\n reject(complianceError);\n return;\n }\n }\n\n var configureMissingMethods = function configureMissingMethods() {\n var methodNotImplementedFactory = function methodNotImplementedFactory(methodName) {\n return function () {\n var error = new Error('Method ' + methodName + ' is not implemented by the current driver');\n var promise = Promise$1.reject(error);\n executeCallback(promise, arguments[arguments.length - 1]);\n return promise;\n };\n };\n\n for (var _i = 0, _len = OptionalDriverMethods.length; _i < _len; _i++) {\n var optionalDriverMethod = OptionalDriverMethods[_i];\n if (!driverObject[optionalDriverMethod]) {\n driverObject[optionalDriverMethod] = methodNotImplementedFactory(optionalDriverMethod);\n }\n }\n };\n\n configureMissingMethods();\n\n var setDriverSupport = function setDriverSupport(support) {\n if (DefinedDrivers[driverName]) {\n console.info('Redefining LocalForage driver: ' + driverName);\n }\n DefinedDrivers[driverName] = driverObject;\n DriverSupport[driverName] = support;\n // don't use a then, so that we can define\n // drivers that have simple _support methods\n // in a blocking manner\n resolve();\n };\n\n if ('_support' in driverObject) {\n if (driverObject._support && typeof driverObject._support === 'function') {\n driverObject._support().then(setDriverSupport, reject);\n } else {\n setDriverSupport(!!driverObject._support);\n }\n } else {\n setDriverSupport(true);\n }\n } catch (e) {\n reject(e);\n }\n });\n\n executeTwoCallbacks(promise, callback, errorCallback);\n return promise;\n };\n\n LocalForage.prototype.driver = function driver() {\n return this._driver || null;\n };\n\n LocalForage.prototype.getDriver = function getDriver(driverName, callback, errorCallback) {\n var getDriverPromise = DefinedDrivers[driverName] ? Promise$1.resolve(DefinedDrivers[driverName]) : Promise$1.reject(new Error('Driver not found.'));\n\n executeTwoCallbacks(getDriverPromise, callback, errorCallback);\n return getDriverPromise;\n };\n\n LocalForage.prototype.getSerializer = function getSerializer(callback) {\n var serializerPromise = Promise$1.resolve(localforageSerializer);\n executeTwoCallbacks(serializerPromise, callback);\n return serializerPromise;\n };\n\n LocalForage.prototype.ready = function ready(callback) {\n var self = this;\n\n var promise = self._driverSet.then(function () {\n if (self._ready === null) {\n self._ready = self._initDriver();\n }\n\n return self._ready;\n });\n\n executeTwoCallbacks(promise, callback, callback);\n return promise;\n };\n\n LocalForage.prototype.setDriver = function setDriver(drivers, callback, errorCallback) {\n var self = this;\n\n if (!isArray(drivers)) {\n drivers = [drivers];\n }\n\n var supportedDrivers = this._getSupportedDrivers(drivers);\n\n function setDriverToConfig() {\n self._config.driver = self.driver();\n }\n\n function extendSelfWithDriver(driver) {\n self._extend(driver);\n setDriverToConfig();\n\n self._ready = self._initStorage(self._config);\n return self._ready;\n }\n\n function initDriver(supportedDrivers) {\n return function () {\n var currentDriverIndex = 0;\n\n function driverPromiseLoop() {\n while (currentDriverIndex < supportedDrivers.length) {\n var driverName = supportedDrivers[currentDriverIndex];\n currentDriverIndex++;\n\n self._dbInfo = null;\n self._ready = null;\n\n return self.getDriver(driverName).then(extendSelfWithDriver)[\"catch\"](driverPromiseLoop);\n }\n\n setDriverToConfig();\n var error = new Error('No available storage method found.');\n self._driverSet = Promise$1.reject(error);\n return self._driverSet;\n }\n\n return driverPromiseLoop();\n };\n }\n\n // There might be a driver initialization in progress\n // so wait for it to finish in order to avoid a possible\n // race condition to set _dbInfo\n var oldDriverSetDone = this._driverSet !== null ? this._driverSet[\"catch\"](function () {\n return Promise$1.resolve();\n }) : Promise$1.resolve();\n\n this._driverSet = oldDriverSetDone.then(function () {\n var driverName = supportedDrivers[0];\n self._dbInfo = null;\n self._ready = null;\n\n return self.getDriver(driverName).then(function (driver) {\n self._driver = driver._driver;\n setDriverToConfig();\n self._wrapLibraryMethodsWithReady();\n self._initDriver = initDriver(supportedDrivers);\n });\n })[\"catch\"](function () {\n setDriverToConfig();\n var error = new Error('No available storage method found.');\n self._driverSet = Promise$1.reject(error);\n return self._driverSet;\n });\n\n executeTwoCallbacks(this._driverSet, callback, errorCallback);\n return this._driverSet;\n };\n\n LocalForage.prototype.supports = function supports(driverName) {\n return !!DriverSupport[driverName];\n };\n\n LocalForage.prototype._extend = function _extend(libraryMethodsAndProperties) {\n extend(this, libraryMethodsAndProperties);\n };\n\n LocalForage.prototype._getSupportedDrivers = function _getSupportedDrivers(drivers) {\n var supportedDrivers = [];\n for (var i = 0, len = drivers.length; i < len; i++) {\n var driverName = drivers[i];\n if (this.supports(driverName)) {\n supportedDrivers.push(driverName);\n }\n }\n return supportedDrivers;\n };\n\n LocalForage.prototype._wrapLibraryMethodsWithReady = function _wrapLibraryMethodsWithReady() {\n // Add a stub for each driver API method that delays the call to the\n // corresponding driver method until localForage is ready. These stubs\n // will be replaced by the driver methods as soon as the driver is\n // loaded, so there is no performance impact.\n for (var i = 0, len = LibraryMethods.length; i < len; i++) {\n callWhenReady(this, LibraryMethods[i]);\n }\n };\n\n LocalForage.prototype.createInstance = function createInstance(options) {\n return new LocalForage(options);\n };\n\n return LocalForage;\n}();\n\n// The actual localForage object that we expose as a module or via a\n// global. It's extended by pulling in one of our other libraries.\n\n\nvar localforage_js = new LocalForage();\n\nmodule.exports = localforage_js;\n\n},{\"3\":3}]},{},[4])(4)\n});\n","export function queryStringify(query) {\n const queryString = Object.keys(query)\n .map(key => `${key}=${window.encodeURIComponent(query[key] || '')}`)\n .join('&');\n return queryString;\n}\n\nexport function getURLParameters() {\n var url = window.location.href;\n return (url.match(/([^?=&]+)(=([^&]*))/g) || []).reduce(function(a, v) {\n return (a[v.slice(0, v.indexOf('='))] = v.slice(v.indexOf('=') + 1)), a;\n }, {});\n}\n\nexport function throwError(condition, msg, callback) {\n if (!condition) {\n callback && callback();\n throw new Error(`Danmuku Error: ${msg}`);\n }\n}\n","import localforage from 'localforage';\nimport { queryStringify, getURLParameters, throwError } from './utils';\n\nexport default class IssuesDanmuku {\n constructor(options) {\n this.options = Object.assign({}, IssuesDanmuku.DEFAULT, options);\n this.db = localforage.createInstance({\n driver: [\n localforage.WEBSQL,\n localforage.INDEXEDDB,\n localforage.LOCALSTORAGE\n ],\n name: 'danmuku-db'\n });\n this.limit = 0;\n this.remaining = 0;\n this.init();\n }\n\n static get DEFAULT() {\n return {\n api: '',\n clientID: '',\n clientSecret: '',\n perPage: 100,\n proxy:\n 'https://cors-anywhere.herokuapp.com/https://github.com/login/oauth/access_token'\n };\n }\n\n async init() {\n const { code } = getURLParameters();\n if (code) {\n const data = await this.getToken(code);\n throwError(data.access_token, 'Can not get token, Please login again!');\n await this.db.setItem('token', data.access_token);\n const userInfo = await this.getUserInfo(data.access_token);\n throwError(userInfo.id, 'Can not get user info, Please login again!');\n await this.db.setItem('userInfo', userInfo);\n const redirect_uri = await this.db.getItem('redirect_uri');\n throwError(redirect_uri, 'Can not get redirect url, Please login again!');\n window.history.replaceState(null, '', redirect_uri);\n }\n\n this.userInfo = await this.db.getItem('userInfo');\n this.token = await this.db.getItem('token');\n const danmus = await this.db.getItem('danmus');\n this.isLogin = !!this.userInfo && !!this.token;\n if (this.isLogin && !danmus) {\n await this.cache();\n }\n }\n\n async login() {\n await this.db.clear();\n await this.db.setItem('redirect_uri', window.location.href);\n await this.db.setItem('login_time', Date.now());\n window.location.href = `http://github.com/login/oauth/authorize?${queryStringify(\n {\n state: 'issues-danmuku',\n client_id: this.options.clientID,\n redirect_uri: window.location.href,\n scope: 'public_repo'\n }\n )}`;\n }\n\n async logout() {\n await this.db.clear();\n window.location.reload();\n }\n\n async request(method, url, body) {\n method = method.toUpperCase();\n body = body && JSON.stringify(body);\n let headers = {\n 'Content-Type': 'application/json',\n Accept: 'application/json'\n };\n\n if (this.token) {\n headers.Authorization = `token ${this.token}`;\n }\n\n try {\n const res = await fetch(url, {\n method,\n headers,\n body\n });\n if (res.status === 404) {\n return Promise.reject('Unauthorized.');\n } else if (res.status === 401) {\n await this.db.clear();\n return window.location.reload();\n } else {\n this.limit = Number(res.headers.get('X-RateLimit-Limit'));\n this.remaining = Number(res.headers.get('X-RateLimit-Remaining'));\n return res.json();\n }\n } catch (err) {\n console.warn(err, url);\n }\n }\n\n urlQuery(options) {\n return {\n client_id: this.options.clientID,\n client_secret: this.options.clientSecret,\n t: Date.now(),\n ...options\n };\n }\n\n getToken(code) {\n const query = this.urlQuery({\n code,\n redirect_uri: location.href\n });\n return this.request(\n 'get',\n `${this.options.proxy}?${queryStringify(query)}`\n );\n }\n\n getUserInfo(token) {\n return this.request(\n 'get',\n `https://api.github.com/user?access_token=${token}`\n );\n }\n\n async cache() {\n let result = [];\n let page = 1;\n await this.db.setItem('cache_time', Date.now());\n while (true) {\n const list = await this.request(\n 'get',\n `https://api.github.com/repos/${\n this.options.api\n }/comments?${queryStringify(\n this.urlQuery({\n per_page: this.options.perPage,\n page: page++\n })\n )}`\n );\n throwError(\n Array.isArray(list),\n 'Can not get the danmuku, Please try again!'\n );\n result = [...result, ...list];\n if (list.length < this.options.perPage) {\n const danmus = result.map(item => {\n const body = JSON.parse(item.body);\n return {\n id: item.id,\n ...body\n };\n });\n return this.db.setItem('danmus', danmus);\n }\n }\n }\n\n async send(danmu = {}) {\n const query = this.urlQuery({\n body: JSON.stringify(danmu)\n });\n let data = await this.request(\n 'post',\n `https://api.github.com/repos/${this.options.api}/comments`,\n query\n );\n throwError(data.id, 'Can not send the danmu, Please try again!');\n return JSON.parse(data.body);\n }\n}\n","import ArtplayerToolGithub from 'issues-danmuku/src';\n\nwindow.ArtplayerToolGithub = ArtplayerToolGithub;\nexport default ArtplayerToolGithub;"],"names":["require","global","window","ArtplayerToolGithub"],"mappings":"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"}
\ No newline at end of file
diff --git a/packages/artplayer-tool-github/.npmignore b/packages/artplayer-tool-github/.npmignore
new file mode 100644
index 000000000..429145126
--- /dev/null
+++ b/packages/artplayer-tool-github/.npmignore
@@ -0,0 +1,9 @@
+node_modules
+.DS_Store
+yarn.lock
+package-lock.json
+test
+coverage
+.nyc_output
+.cache
+docs
\ No newline at end of file
diff --git a/packages/artplayer-tool-github/.npmrc b/packages/artplayer-tool-github/.npmrc
new file mode 100644
index 000000000..9cf949503
--- /dev/null
+++ b/packages/artplayer-tool-github/.npmrc
@@ -0,0 +1 @@
+package-lock=false
\ No newline at end of file
diff --git a/packages/artplayer-tool-github/README.md b/packages/artplayer-tool-github/README.md
new file mode 100644
index 000000000..6f783d8f3
--- /dev/null
+++ b/packages/artplayer-tool-github/README.md
@@ -0,0 +1,80 @@
+# artplayer-plugin-danmu
+Danmu plugin for ArtPlayer
+
+## Demo
+
+[Checkout the demo](https://artplayer.org/?libs=.%2Funcompiled%2Fartplayer-plugin-danmu.js&example=danmu) from Github Pages
+
+## Install
+
+Install with `npm`
+
+```
+$ npm install artplayer-plugin-danmu
+```
+
+Or install with `yarn`
+
+```
+$ yarn add artplayer-plugin-danmu
+```
+
+```js
+import artplayerPluginBacklight from 'artplayer-plugin-danmu';
+```
+
+Or umd builds are also available
+
+```html
+
+```
+
+Will expose the global variable to `window.artplayerPluginDanmu`.
+
+## Usage
+
+```js
+var art = new Artplayer({
+ container: '.artplayer-app',
+ url: 'path/to/video.mp4',
+ plugins: [artplayerPluginDanmu({
+ danmus: [], // Can be an array or return the promised function or danmuku xml url
+ speed: 5, // Animation time
+ opacity: 1, // Opacity
+ color: '#fff', // Font color
+ size: 25, // Font size
+ maxlength: 50, // The maximum number of words in the danmu
+ margin: [10, 20], // Margin top and margin bottom
+ })],
+});
+
+// Send danmu
+art.plugins.artplayerPluginDanmu.emit({
+ text: '666', // Danmu text
+ time: 5, // Video time
+ color: '#fff', // Danmu color
+ size: 25, // Danmu size
+ border: '#fff' // Danmu border color
+});
+
+// Start danmu
+art.plugins.artplayerPluginDanmu.start();
+
+// Stop danmu
+art.plugins.artplayerPluginDanmu.stop();
+
+// Hide danmu
+art.plugins.artplayerPluginDanmu.hide();
+
+// Show danmu
+art.plugins.artplayerPluginDanmu.show();
+
+// Config danmu
+art.plugins.artplayerPluginDanmu.config({
+ // option
+});
+```
+
+## License
+
+MIT © [Harvey Zack](https://sleepy.im/)
diff --git a/packages/artplayer-tool-github/package.json b/packages/artplayer-tool-github/package.json
new file mode 100644
index 000000000..d1f388bd5
--- /dev/null
+++ b/packages/artplayer-tool-github/package.json
@@ -0,0 +1,26 @@
+{
+ "name": "artplayer-tool-github",
+ "version": "3.1.7",
+ "description": "Github tool for ArtPlayer",
+ "main": "dist/artplayer-tool-github.js",
+ "scripts": {
+ "test": "echo \"Error: no test specified\" && exit 1"
+ },
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/zhw2590582/ArtPlayer.git"
+ },
+ "keywords": [
+ "video",
+ "player"
+ ],
+ "author": "Harvey Zack ",
+ "license": "MIT",
+ "bugs": {
+ "url": "https://github.com/zhw2590582/ArtPlayer/issues"
+ },
+ "homepage": "https://github.com/zhw2590582/ArtPlayer#readme",
+ "dependencies": {
+ "issues-danmuku": "^1.0.2"
+ }
+}
diff --git a/packages/artplayer-tool-github/src/index.js b/packages/artplayer-tool-github/src/index.js
new file mode 100644
index 000000000..ae3f2bc20
--- /dev/null
+++ b/packages/artplayer-tool-github/src/index.js
@@ -0,0 +1,4 @@
+import ArtplayerToolGithub from 'issues-danmuku/src';
+
+window.ArtplayerToolGithub = ArtplayerToolGithub;
+export default ArtplayerToolGithub;
\ No newline at end of file