From fb5d6e77524f44304293480da96ffbc21ed5ead3 Mon Sep 17 00:00:00 2001 From: Simon He Date: Wed, 13 Dec 2017 16:14:21 +1100 Subject: [PATCH] Fixed the issue which on Safari of iOS 8.* or 9.*, IDatabase doesn't have methods: addEventListener & removeEventListener --- dist/db.js | 250 +++++++++++++++++++-------------------- dist/db.js.map | 2 +- dist/db.min.js | 2 +- dist/db.min.js.map | 2 +- src/db.js | 24 +++- tests/test-worker.js.map | 2 +- 6 files changed, 148 insertions(+), 134 deletions(-) diff --git a/dist/db.js b/dist/db.js index 607dad5..45e9be8 100644 --- a/dist/db.js +++ b/dist/db.js @@ -3,7 +3,7 @@ var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }(); -var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol ? "symbol" : typeof obj; }; +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 _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } } @@ -71,12 +71,10 @@ function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr } function mongoifyKey(key) { if (key && (typeof key === 'undefined' ? 'undefined' : _typeof(key)) === 'object' && !(key instanceof IDBKeyRange)) { - var _mongoDBToKeyRangeArg = mongoDBToKeyRangeArgs(key); - - var _mongoDBToKeyRangeArg2 = _slicedToArray(_mongoDBToKeyRangeArg, 2); - - var type = _mongoDBToKeyRangeArg2[0]; - var args = _mongoDBToKeyRangeArg2[1]; + var _mongoDBToKeyRangeArg = mongoDBToKeyRangeArgs(key), + _mongoDBToKeyRangeArg2 = _slicedToArray(_mongoDBToKeyRangeArg, 2), + type = _mongoDBToKeyRangeArg2[0], + args = _mongoDBToKeyRangeArg2[1]; return IDBKeyRange[type].apply(IDBKeyRange, _toConsumableArray(args)); } @@ -147,56 +145,46 @@ function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr counter = limitRange[0]; cursor.advance(limitRange[0]); // Will throw on 0, but condition above prevents since counter always 0+ } else if (limitRange !== null && counter >= limitRange[0] + limitRange[1]) { - // Out of limit range... skip - } else { - var _ret = function () { - var matchFilter = true; - var result = 'value' in cursor ? cursor.value : cursor.key; - - try { - filters.forEach(function (filter) { - if (typeof filter[0] === 'function') { - matchFilter = matchFilter && filter[0](result); - } else { - matchFilter = matchFilter && result[filter[0]] === filter[1]; - } - }); - } catch (err) { - // Could be filter on non-object or error in filter function - reject(err); - return { - v: void 0 - }; - } - - if (matchFilter) { - counter++; - // If we're doing a modify, run it now - if (modifyObj) { - try { - result = modifyRecord(result); - cursor.update(result); // `result` should only be a "structured clone"-able object - } catch (err) { - reject(err); - return { - v: void 0 - }; - } - } - try { - results.push(mapper(result)); - } catch (err) { - reject(err); - return { - v: void 0 - }; - } - } - cursor.continue(); - }(); - - if ((typeof _ret === 'undefined' ? 'undefined' : _typeof(_ret)) === "object") return _ret.v; + // Out of limit range... skip + } else { + var matchFilter = true; + var result = 'value' in cursor ? cursor.value : cursor.key; + + try { + filters.forEach(function (filter) { + if (typeof filter[0] === 'function') { + matchFilter = matchFilter && filter[0](result); + } else { + matchFilter = matchFilter && result[filter[0]] === filter[1]; + } + }); + } catch (err) { + // Could be filter on non-object or error in filter function + reject(err); + return; + } + + if (matchFilter) { + counter++; + // If we're doing a modify, run it now + if (modifyObj) { + try { + result = modifyRecord(result); + cursor.update(result); // `result` should only be a "structured clone"-able object + } catch (err) { + reject(err); + return; + } } + try { + results.push(mapper(result)); + } catch (err) { + reject(err); + return; + } + } + cursor.continue(); + } } }; }); @@ -696,20 +684,36 @@ function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr throw new Error('Unrecognized event type ' + eventName); } if (eventName === 'error') { - db.addEventListener(eventName, function (e) { + var h = function h(e) { e.preventDefault(); // Needed by Firefox to prevent hard abort with ConstraintError handler(e); - }); + }; + // On Safari of iOS 8.* or 9.*, IDBDatabase doesn't have the method: addEventListener + if (db.addEventListener) { + db.addEventListener(eventName, h); + } else { + db['on' + eventName] = h; + } return; } - db.addEventListener(eventName, handler); + // On Safari of iOS 8.* or 9.*, IDBDatabase doesn't have the method: addEventListener + if (db.addEventListener) { + db.addEventListener(eventName, handler); + } else { + db['on' + eventName] = handler; + } }; this.removeEventListener = function (eventName, handler) { if (!serverEvents.includes(eventName)) { throw new Error('Unrecognized event type ' + eventName); } - db.removeEventListener(eventName, handler); + // On Safari of iOS 8.* or 9.*, IDBDatabase doesn't have the method: removeEventListener + if (db.removeEventListener) { + db.removeEventListener(eventName, handler); + } else { + db['on' + eventName] = null; + } }; serverEvents.forEach(function (evName) { @@ -773,25 +777,25 @@ function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr if (db.objectStoreNames.contains(tableName)) { store = request.transaction.objectStore(tableName); // Shouldn't throw } else { - // Errors for which we are not concerned and why: - // `InvalidStateError` - We are in the upgrade transaction. - // `ConstraintError` - We are just starting (and probably never too large anyways) for a key generator. - // `ConstraintError` - The above condition should prevent the name already existing. - // - // Possible errors: - // `TransactionInactiveError` - if the upgrade had already aborted, - // e.g., from a previous `QuotaExceededError` which is supposed to nevertheless return - // the store but then abort the transaction. - // `SyntaxError` - if an invalid `table.key.keyPath` is supplied. - // `InvalidAccessError` - if `table.key.autoIncrement` is `true` and `table.key.keyPath` is an - // empty string or any sequence (empty or otherwise). - try { - store = db.createObjectStore(tableName, table.key); - } catch (err) { - ret = err; - return true; - } + // Errors for which we are not concerned and why: + // `InvalidStateError` - We are in the upgrade transaction. + // `ConstraintError` - We are just starting (and probably never too large anyways) for a key generator. + // `ConstraintError` - The above condition should prevent the name already existing. + // + // Possible errors: + // `TransactionInactiveError` - if the upgrade had already aborted, + // e.g., from a previous `QuotaExceededError` which is supposed to nevertheless return + // the store but then abort the transaction. + // `SyntaxError` - if an invalid `table.key.keyPath` is supplied. + // `InvalidAccessError` - if `table.key.autoIncrement` is `true` and `table.key.keyPath` is an + // empty string or any sequence (empty or otherwise). + try { + store = db.createObjectStore(tableName, table.key); + } catch (err) { + ret = err; + return true; } + } Object.keys(table.indexes || {}).some(function (indexKey) { try { @@ -849,56 +853,50 @@ function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr } }, server, version, noServerMethods).then(resolve, reject); } else { - var _ret2 = function () { - if (typeof schema === 'function') { - try { - schema = schema(); - } catch (e) { - reject(e); - return { - v: void 0 - }; - } - } - var request = indexedDB.open(server, version); - - request.onsuccess = function (e) { - return _open(e, server, version, noServerMethods).then(resolve, reject); - }; - request.onerror = function (e) { - // Prevent default for `BadVersion` and `AbortError` errors, etc. - // These are not necessarily reported in console in Chrome but present; see - // https://bugzilla.mozilla.org/show_bug.cgi?id=872873 - // http://stackoverflow.com/questions/36225779/aborterror-within-indexeddb-upgradeneeded-event/36266502 - e.preventDefault(); + if (typeof schema === 'function') { + try { + schema = schema(); + } catch (e) { reject(e); - }; - request.onupgradeneeded = function (e) { - var err = createSchema(e, request, schema, e.target.result, server, version); - if (err) { - reject(err); - } - }; - request.onblocked = function (e) { - var resume = new Promise(function (res, rej) { - // We overwrite handlers rather than make a new - // open() since the original request is still - // open and its onsuccess will still fire if - // the user unblocks by closing the blocking - // connection - request.onsuccess = function (ev) { - _open(ev, server, version, noServerMethods).then(res, rej); - }; - request.onerror = function (e) { - return rej(e); - }; - }); - e.resume = resume; - reject(e); - }; - }(); + return; + } + } + var request = indexedDB.open(server, version); - if ((typeof _ret2 === 'undefined' ? 'undefined' : _typeof(_ret2)) === "object") return _ret2.v; + request.onsuccess = function (e) { + return _open(e, server, version, noServerMethods).then(resolve, reject); + }; + request.onerror = function (e) { + // Prevent default for `BadVersion` and `AbortError` errors, etc. + // These are not necessarily reported in console in Chrome but present; see + // https://bugzilla.mozilla.org/show_bug.cgi?id=872873 + // http://stackoverflow.com/questions/36225779/aborterror-within-indexeddb-upgradeneeded-event/36266502 + e.preventDefault(); + reject(e); + }; + request.onupgradeneeded = function (e) { + var err = createSchema(e, request, schema, e.target.result, server, version); + if (err) { + reject(err); + } + }; + request.onblocked = function (e) { + var resume = new Promise(function (res, rej) { + // We overwrite handlers rather than make a new + // open() since the original request is still + // open and its onsuccess will still fire if + // the user unblocks by closing the blocking + // connection + request.onsuccess = function (ev) { + _open(ev, server, version, noServerMethods).then(res, rej); + }; + request.onerror = function (e) { + return rej(e); + }; + }); + e.resume = resume; + reject(e); + }; } }); }, diff --git a/dist/db.js.map b/dist/db.js.map index efa7e45..9341111 100644 --- a/dist/db.js.map +++ b/dist/db.js.map @@ -1 +1 @@ -{"version":3,"sources":["../src/db.js"],"names":[],"mappings":"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","file":"db.js","sourcesContent":["(function (local) {\r\n 'use strict';\r\n\r\n const IDBKeyRange = local.IDBKeyRange || local.webkitIDBKeyRange;\r\n const transactionModes = {\r\n readonly: 'readonly',\r\n readwrite: 'readwrite'\r\n };\r\n const hasOwn = Object.prototype.hasOwnProperty;\r\n const defaultMapper = x => x;\r\n\r\n const indexedDB = local.indexedDB || local.webkitIndexedDB ||\r\n local.mozIndexedDB || local.oIndexedDB || local.msIndexedDB ||\r\n local.shimIndexedDB || (function () {\r\n throw new Error('IndexedDB required');\r\n }());\r\n\r\n const dbCache = {};\r\n const serverEvents = ['abort', 'error', 'versionchange'];\r\n\r\n function isObject (item) {\r\n return item && typeof item === 'object';\r\n }\r\n\r\n function mongoDBToKeyRangeArgs (opts) {\r\n const keys = Object.keys(opts).sort();\r\n if (keys.length === 1) {\r\n const key = keys[0];\r\n const val = opts[key];\r\n let name, inclusive;\r\n switch (key) {\r\n case 'eq': name = 'only'; break;\r\n case 'gt':\r\n name = 'lowerBound';\r\n inclusive = true;\r\n break;\r\n case 'lt':\r\n name = 'upperBound';\r\n inclusive = true;\r\n break;\r\n case 'gte': name = 'lowerBound'; break;\r\n case 'lte': name = 'upperBound'; break;\r\n default: throw new TypeError('`' + key + '` is not a valid key');\r\n }\r\n return [name, [val, inclusive]];\r\n }\r\n const x = opts[keys[0]];\r\n const y = opts[keys[1]];\r\n const pattern = keys.join('-');\r\n\r\n switch (pattern) {\r\n case 'gt-lt': case 'gt-lte': case 'gte-lt': case 'gte-lte':\r\n return ['bound', [x, y, keys[0] === 'gt', keys[1] === 'lt']];\r\n default: throw new TypeError(\r\n '`' + pattern + '` are conflicted keys'\r\n );\r\n }\r\n }\r\n function mongoifyKey (key) {\r\n if (key && typeof key === 'object' && !(key instanceof IDBKeyRange)) {\r\n let [type, args] = mongoDBToKeyRangeArgs(key);\r\n return IDBKeyRange[type](...args);\r\n }\r\n return key;\r\n }\r\n\r\n const IndexQuery = function (table, db, indexName, preexistingError) {\r\n let modifyObj = null;\r\n\r\n const runQuery = function (type, args, cursorType, direction, limitRange, filters, mapper) {\r\n return new Promise(function (resolve, reject) {\r\n let keyRange;\r\n try {\r\n keyRange = type ? IDBKeyRange[type](...args) : null;\r\n } catch (e) {\r\n reject(e);\r\n return;\r\n }\r\n filters = filters || [];\r\n limitRange = limitRange || null;\r\n\r\n let results = [];\r\n let counter = 0;\r\n const indexArgs = [keyRange];\r\n\r\n const transaction = db.transaction(table, modifyObj ? transactionModes.readwrite : transactionModes.readonly);\r\n transaction.onerror = e => reject(e);\r\n transaction.onabort = e => reject(e);\r\n transaction.oncomplete = () => resolve(results);\r\n\r\n const store = transaction.objectStore(table); // if bad, db.transaction will reject first\r\n const index = typeof indexName === 'string' ? store.index(indexName) : store;\r\n\r\n if (cursorType !== 'count') {\r\n indexArgs.push(direction || 'next');\r\n }\r\n\r\n // Create a function that will set in the modifyObj properties into\r\n // the passed record.\r\n const modifyKeys = modifyObj ? Object.keys(modifyObj) : [];\r\n\r\n const modifyRecord = function (record) {\r\n modifyKeys.forEach(key => {\r\n let val = modifyObj[key];\r\n if (typeof val === 'function') { val = val(record); }\r\n record[key] = val;\r\n });\r\n return record;\r\n };\r\n\r\n index[cursorType](...indexArgs).onsuccess = function (e) { // indexArgs are already validated\r\n const cursor = e.target.result;\r\n if (typeof cursor === 'number') {\r\n results = cursor;\r\n } else if (cursor) {\r\n if (limitRange !== null && limitRange[0] > counter) {\r\n counter = limitRange[0];\r\n cursor.advance(limitRange[0]); // Will throw on 0, but condition above prevents since counter always 0+\r\n } else if (limitRange !== null && counter >= (limitRange[0] + limitRange[1])) {\r\n // Out of limit range... skip\r\n } else {\r\n let matchFilter = true;\r\n let result = 'value' in cursor ? cursor.value : cursor.key;\r\n\r\n try {\r\n filters.forEach(function (filter) {\r\n if (typeof filter[0] === 'function') {\r\n matchFilter = matchFilter && filter[0](result);\r\n } else {\r\n matchFilter = matchFilter && (result[filter[0]] === filter[1]);\r\n }\r\n });\r\n } catch (err) { // Could be filter on non-object or error in filter function\r\n reject(err);\r\n return;\r\n }\r\n\r\n if (matchFilter) {\r\n counter++;\r\n // If we're doing a modify, run it now\r\n if (modifyObj) {\r\n try {\r\n result = modifyRecord(result);\r\n cursor.update(result); // `result` should only be a \"structured clone\"-able object\r\n } catch (err) {\r\n reject(err);\r\n return;\r\n }\r\n }\r\n try {\r\n results.push(mapper(result));\r\n } catch (err) {\r\n reject(err);\r\n return;\r\n }\r\n }\r\n cursor.continue();\r\n }\r\n }\r\n };\r\n });\r\n };\r\n\r\n const Query = function (type, args, queuedError) {\r\n const filters = [];\r\n let direction = 'next';\r\n let cursorType = 'openCursor';\r\n let limitRange = null;\r\n let mapper = defaultMapper;\r\n let unique = false;\r\n let error = preexistingError || queuedError;\r\n\r\n const execute = function () {\r\n if (error) {\r\n return Promise.reject(error);\r\n }\r\n return runQuery(type, args, cursorType, unique ? direction + 'unique' : direction, limitRange, filters, mapper);\r\n };\r\n\r\n const count = function () {\r\n direction = null;\r\n cursorType = 'count';\r\n\r\n return {\r\n execute\r\n };\r\n };\r\n\r\n const keys = function () {\r\n cursorType = 'openKeyCursor';\r\n\r\n return {\r\n desc,\r\n distinct,\r\n execute,\r\n filter,\r\n limit,\r\n map\r\n };\r\n };\r\n\r\n const limit = function (start, end) {\r\n limitRange = !end ? [0, start] : [start, end];\r\n error = limitRange.some(val => typeof val !== 'number') ? new Error('limit() arguments must be numeric') : error;\r\n\r\n return {\r\n desc,\r\n distinct,\r\n filter,\r\n keys,\r\n execute,\r\n map,\r\n modify\r\n };\r\n };\r\n\r\n const filter = function (prop, val) {\r\n filters.push([prop, val]);\r\n\r\n return {\r\n desc,\r\n distinct,\r\n execute,\r\n filter,\r\n keys,\r\n limit,\r\n map,\r\n modify\r\n };\r\n };\r\n\r\n const desc = function () {\r\n direction = 'prev';\r\n\r\n return {\r\n distinct,\r\n execute,\r\n filter,\r\n keys,\r\n limit,\r\n map,\r\n modify\r\n };\r\n };\r\n\r\n const distinct = function () {\r\n unique = true;\r\n return {\r\n count,\r\n desc,\r\n execute,\r\n filter,\r\n keys,\r\n limit,\r\n map,\r\n modify\r\n };\r\n };\r\n\r\n const modify = function (update) {\r\n modifyObj = update && typeof update === 'object' ? update : null;\r\n return {\r\n execute\r\n };\r\n };\r\n\r\n const map = function (fn) {\r\n mapper = fn;\r\n\r\n return {\r\n count,\r\n desc,\r\n distinct,\r\n execute,\r\n filter,\r\n keys,\r\n limit,\r\n modify\r\n };\r\n };\r\n\r\n return {\r\n count,\r\n desc,\r\n distinct,\r\n execute,\r\n filter,\r\n keys,\r\n limit,\r\n map,\r\n modify\r\n };\r\n };\r\n\r\n ['only', 'bound', 'upperBound', 'lowerBound'].forEach((name) => {\r\n this[name] = function () {\r\n return Query(name, arguments);\r\n };\r\n });\r\n\r\n this.range = function (opts) {\r\n let error;\r\n let keyRange = [null, null];\r\n try {\r\n keyRange = mongoDBToKeyRangeArgs(opts);\r\n } catch (e) {\r\n error = e;\r\n }\r\n return Query(...keyRange, error);\r\n };\r\n\r\n this.filter = function (...args) {\r\n const query = Query(null, null);\r\n return query.filter(...args);\r\n };\r\n\r\n this.all = function () {\r\n return this.filter();\r\n };\r\n };\r\n\r\n const Server = function (db, name, version, noServerMethods) {\r\n let closed = false;\r\n\r\n this.getIndexedDB = () => db;\r\n this.isClosed = () => closed;\r\n\r\n this.query = function (table, index) {\r\n const error = closed ? new Error('Database has been closed') : null;\r\n return new IndexQuery(table, db, index, error); // Does not throw by itself\r\n };\r\n\r\n this.add = function (table, ...args) {\r\n return new Promise(function (resolve, reject) {\r\n if (closed) {\r\n reject(new Error('Database has been closed'));\r\n return;\r\n }\r\n\r\n const records = args.reduce(function (records, aip) {\r\n return records.concat(aip);\r\n }, []);\r\n\r\n const transaction = db.transaction(table, transactionModes.readwrite);\r\n transaction.onerror = e => {\r\n // prevent throwing a ConstraintError and aborting (hard)\r\n // https://bugzilla.mozilla.org/show_bug.cgi?id=872873\r\n e.preventDefault();\r\n reject(e);\r\n };\r\n transaction.onabort = e => reject(e);\r\n transaction.oncomplete = () => resolve(records);\r\n\r\n const store = transaction.objectStore(table);\r\n records.some(function (record) {\r\n let req, key;\r\n if (isObject(record) && hasOwn.call(record, 'item')) {\r\n key = record.key;\r\n record = record.item;\r\n if (key != null) {\r\n try {\r\n key = mongoifyKey(key);\r\n } catch (e) {\r\n reject(e);\r\n return true;\r\n }\r\n }\r\n }\r\n\r\n try {\r\n // Safe to add since in readwrite\r\n if (key != null) {\r\n req = store.add(record, key);\r\n } else {\r\n req = store.add(record);\r\n }\r\n } catch (e) {\r\n reject(e);\r\n return true;\r\n }\r\n\r\n req.onsuccess = function (e) {\r\n if (!isObject(record)) {\r\n return;\r\n }\r\n const target = e.target;\r\n let keyPath = target.source.keyPath;\r\n if (keyPath === null) {\r\n keyPath = '__id__';\r\n }\r\n if (hasOwn.call(record, keyPath)) {\r\n return;\r\n }\r\n Object.defineProperty(record, keyPath, {\r\n value: target.result,\r\n enumerable: true\r\n });\r\n };\r\n });\r\n });\r\n };\r\n\r\n this.update = function (table, ...args) {\r\n return new Promise(function (resolve, reject) {\r\n if (closed) {\r\n reject(new Error('Database has been closed'));\r\n return;\r\n }\r\n\r\n const records = args.reduce(function (records, aip) {\r\n return records.concat(aip);\r\n }, []);\r\n\r\n const transaction = db.transaction(table, transactionModes.readwrite);\r\n transaction.onerror = e => {\r\n // prevent throwing aborting (hard)\r\n // https://bugzilla.mozilla.org/show_bug.cgi?id=872873\r\n e.preventDefault();\r\n reject(e);\r\n };\r\n transaction.onabort = e => reject(e);\r\n transaction.oncomplete = () => resolve(records);\r\n\r\n const store = transaction.objectStore(table);\r\n\r\n records.some(function (record) {\r\n let req, key;\r\n if (isObject(record) && hasOwn.call(record, 'item')) {\r\n key = record.key;\r\n record = record.item;\r\n if (key != null) {\r\n try {\r\n key = mongoifyKey(key);\r\n } catch (e) {\r\n reject(e);\r\n return true;\r\n }\r\n }\r\n }\r\n try {\r\n // These can throw DataError, e.g., if function passed in\r\n if (key != null) {\r\n req = store.put(record, key);\r\n } else {\r\n req = store.put(record);\r\n }\r\n } catch (err) {\r\n reject(err);\r\n return true;\r\n }\r\n\r\n req.onsuccess = function (e) {\r\n if (!isObject(record)) {\r\n return;\r\n }\r\n const target = e.target;\r\n let keyPath = target.source.keyPath;\r\n if (keyPath === null) {\r\n keyPath = '__id__';\r\n }\r\n if (hasOwn.call(record, keyPath)) {\r\n return;\r\n }\r\n Object.defineProperty(record, keyPath, {\r\n value: target.result,\r\n enumerable: true\r\n });\r\n };\r\n });\r\n });\r\n };\r\n\r\n this.put = function (...args) {\r\n return this.update(...args);\r\n };\r\n\r\n this.remove = function (table, key) {\r\n return new Promise(function (resolve, reject) {\r\n if (closed) {\r\n reject(new Error('Database has been closed'));\r\n return;\r\n }\r\n try {\r\n key = mongoifyKey(key);\r\n } catch (e) {\r\n reject(e);\r\n return;\r\n }\r\n\r\n const transaction = db.transaction(table, transactionModes.readwrite);\r\n transaction.onerror = e => {\r\n // prevent throwing and aborting (hard)\r\n // https://bugzilla.mozilla.org/show_bug.cgi?id=872873\r\n e.preventDefault();\r\n reject(e);\r\n };\r\n transaction.onabort = e => reject(e);\r\n transaction.oncomplete = () => resolve(key);\r\n\r\n const store = transaction.objectStore(table);\r\n try {\r\n store.delete(key);\r\n } catch (err) {\r\n reject(err);\r\n }\r\n });\r\n };\r\n\r\n this.delete = function (...args) {\r\n return this.remove(...args);\r\n };\r\n\r\n this.clear = function (table) {\r\n return new Promise(function (resolve, reject) {\r\n if (closed) {\r\n reject(new Error('Database has been closed'));\r\n return;\r\n }\r\n const transaction = db.transaction(table, transactionModes.readwrite);\r\n transaction.onerror = e => reject(e);\r\n transaction.onabort = e => reject(e);\r\n transaction.oncomplete = () => resolve();\r\n\r\n const store = transaction.objectStore(table);\r\n store.clear();\r\n });\r\n };\r\n\r\n this.close = function () {\r\n return new Promise(function (resolve, reject) {\r\n if (closed) {\r\n reject(new Error('Database has been closed'));\r\n return;\r\n }\r\n db.close();\r\n closed = true;\r\n delete dbCache[name][version];\r\n resolve();\r\n });\r\n };\r\n\r\n this.get = function (table, key) {\r\n return new Promise(function (resolve, reject) {\r\n if (closed) {\r\n reject(new Error('Database has been closed'));\r\n return;\r\n }\r\n try {\r\n key = mongoifyKey(key);\r\n } catch (e) {\r\n reject(e);\r\n return;\r\n }\r\n\r\n const transaction = db.transaction(table);\r\n transaction.onerror = e => {\r\n // prevent throwing and aborting (hard)\r\n // https://bugzilla.mozilla.org/show_bug.cgi?id=872873\r\n e.preventDefault();\r\n reject(e);\r\n };\r\n transaction.onabort = e => reject(e);\r\n\r\n const store = transaction.objectStore(table);\r\n\r\n let req;\r\n try {\r\n req = store.get(key);\r\n } catch (err) {\r\n reject(err);\r\n }\r\n req.onsuccess = e => resolve(e.target.result);\r\n });\r\n };\r\n\r\n this.count = function (table, key) {\r\n return new Promise((resolve, reject) => {\r\n if (closed) {\r\n reject(new Error('Database has been closed'));\r\n return;\r\n }\r\n try {\r\n key = mongoifyKey(key);\r\n } catch (e) {\r\n reject(e);\r\n return;\r\n }\r\n\r\n const transaction = db.transaction(table);\r\n transaction.onerror = e => {\r\n // prevent throwing and aborting (hard)\r\n // https://bugzilla.mozilla.org/show_bug.cgi?id=872873\r\n e.preventDefault();\r\n reject(e);\r\n };\r\n transaction.onabort = e => reject(e);\r\n\r\n const store = transaction.objectStore(table);\r\n let req;\r\n try {\r\n req = key == null ? store.count() : store.count(key);\r\n } catch (err) {\r\n reject(err);\r\n }\r\n req.onsuccess = e => resolve(e.target.result);\r\n });\r\n };\r\n\r\n this.addEventListener = function (eventName, handler) {\r\n if (!serverEvents.includes(eventName)) {\r\n throw new Error('Unrecognized event type ' + eventName);\r\n }\r\n if (eventName === 'error') {\r\n db.addEventListener(eventName, function (e) {\r\n e.preventDefault(); // Needed by Firefox to prevent hard abort with ConstraintError\r\n handler(e);\r\n });\r\n return;\r\n }\r\n db.addEventListener(eventName, handler);\r\n };\r\n\r\n this.removeEventListener = function (eventName, handler) {\r\n if (!serverEvents.includes(eventName)) {\r\n throw new Error('Unrecognized event type ' + eventName);\r\n }\r\n db.removeEventListener(eventName, handler);\r\n };\r\n\r\n serverEvents.forEach(function (evName) {\r\n this[evName] = function (handler) {\r\n this.addEventListener(evName, handler);\r\n return this;\r\n };\r\n }, this);\r\n\r\n if (noServerMethods) {\r\n return;\r\n }\r\n\r\n let err;\r\n [].some.call(db.objectStoreNames, storeName => {\r\n if (this[storeName]) {\r\n err = new Error('The store name, \"' + storeName + '\", which you have attempted to load, conflicts with db.js method names.\"');\r\n this.close();\r\n return true;\r\n }\r\n this[storeName] = {};\r\n const keys = Object.keys(this);\r\n keys.filter(key => !(([...serverEvents, 'close', 'addEventListener', 'removeEventListener']).includes(key)))\r\n .map(key =>\r\n this[storeName][key] = (...args) => this[key](storeName, ...args)\r\n );\r\n });\r\n return err;\r\n };\r\n\r\n const createSchema = function (e, request, schema, db, server, version) {\r\n if (!schema || schema.length === 0) {\r\n return;\r\n }\r\n\r\n for (let i = 0; i < db.objectStoreNames.length; i++) {\r\n const name = db.objectStoreNames[i];\r\n if (!hasOwn.call(schema, name)) {\r\n // Errors for which we are not concerned and why:\r\n // `InvalidStateError` - We are in the upgrade transaction.\r\n // `TransactionInactiveError` (as by the upgrade having already\r\n // completed or somehow aborting) - since we've just started and\r\n // should be without risk in this loop\r\n // `NotFoundError` - since we are iterating the dynamically updated\r\n // `objectStoreNames`\r\n db.deleteObjectStore(name);\r\n }\r\n }\r\n\r\n let ret;\r\n Object.keys(schema).some(function (tableName) {\r\n const table = schema[tableName];\r\n let store;\r\n if (db.objectStoreNames.contains(tableName)) {\r\n store = request.transaction.objectStore(tableName); // Shouldn't throw\r\n } else {\r\n // Errors for which we are not concerned and why:\r\n // `InvalidStateError` - We are in the upgrade transaction.\r\n // `ConstraintError` - We are just starting (and probably never too large anyways) for a key generator.\r\n // `ConstraintError` - The above condition should prevent the name already existing.\r\n //\r\n // Possible errors:\r\n // `TransactionInactiveError` - if the upgrade had already aborted,\r\n // e.g., from a previous `QuotaExceededError` which is supposed to nevertheless return\r\n // the store but then abort the transaction.\r\n // `SyntaxError` - if an invalid `table.key.keyPath` is supplied.\r\n // `InvalidAccessError` - if `table.key.autoIncrement` is `true` and `table.key.keyPath` is an\r\n // empty string or any sequence (empty or otherwise).\r\n try {\r\n store = db.createObjectStore(tableName, table.key);\r\n } catch (err) {\r\n ret = err;\r\n return true;\r\n }\r\n }\r\n\r\n Object.keys(table.indexes || {}).some(function (indexKey) {\r\n try {\r\n store.index(indexKey);\r\n } catch (err) {\r\n let index = table.indexes[indexKey];\r\n index = index && typeof index === 'object' ? index : {};\r\n // Errors for which we are not concerned and why:\r\n // `InvalidStateError` - We are in the upgrade transaction and store found above should not have already been deleted.\r\n // `ConstraintError` - We have already tried getting the index, so it shouldn't already exist\r\n //\r\n // Possible errors:\r\n // `TransactionInactiveError` - if the upgrade had already aborted,\r\n // e.g., from a previous `QuotaExceededError` which is supposed to nevertheless return\r\n // the index object but then abort the transaction.\r\n // `SyntaxError` - If the `keyPath` (second argument) is an invalid key path\r\n // `InvalidAccessError` - If `multiEntry` on `index` is `true` and\r\n // `keyPath` (second argument) is a sequence\r\n try {\r\n store.createIndex(indexKey, index.keyPath || index.key || indexKey, index);\r\n } catch (err2) {\r\n ret = err2;\r\n return true;\r\n }\r\n }\r\n });\r\n });\r\n return ret;\r\n };\r\n\r\n const open = function (e, server, version, noServerMethods) {\r\n const db = e.target.result;\r\n dbCache[server][version] = db;\r\n\r\n const s = new Server(db, server, version, noServerMethods);\r\n return s instanceof Error ? Promise.reject(s) : Promise.resolve(s);\r\n };\r\n\r\n const db = {\r\n version: '0.15.0',\r\n open: function (options) {\r\n let server = options.server;\r\n let version = options.version || 1;\r\n let schema = options.schema;\r\n let noServerMethods = options.noServerMethods;\r\n\r\n if (!dbCache[server]) {\r\n dbCache[server] = {};\r\n }\r\n return new Promise(function (resolve, reject) {\r\n if (dbCache[server][version]) {\r\n open({\r\n target: {\r\n result: dbCache[server][version]\r\n }\r\n }, server, version, noServerMethods)\r\n .then(resolve, reject);\r\n } else {\r\n if (typeof schema === 'function') {\r\n try {\r\n schema = schema();\r\n } catch (e) {\r\n reject(e);\r\n return;\r\n }\r\n }\r\n const request = indexedDB.open(server, version);\r\n\r\n request.onsuccess = e => open(e, server, version, noServerMethods).then(resolve, reject);\r\n request.onerror = e => {\r\n // Prevent default for `BadVersion` and `AbortError` errors, etc.\r\n // These are not necessarily reported in console in Chrome but present; see\r\n // https://bugzilla.mozilla.org/show_bug.cgi?id=872873\r\n // http://stackoverflow.com/questions/36225779/aborterror-within-indexeddb-upgradeneeded-event/36266502\r\n e.preventDefault();\r\n reject(e);\r\n };\r\n request.onupgradeneeded = e => {\r\n let err = createSchema(e, request, schema, e.target.result, server, version);\r\n if (err) {\r\n reject(err);\r\n }\r\n };\r\n request.onblocked = e => {\r\n const resume = new Promise(function (res, rej) {\r\n // We overwrite handlers rather than make a new\r\n // open() since the original request is still\r\n // open and its onsuccess will still fire if\r\n // the user unblocks by closing the blocking\r\n // connection\r\n request.onsuccess = (ev) => {\r\n open(ev, server, version, noServerMethods)\r\n .then(res, rej);\r\n };\r\n request.onerror = e => rej(e);\r\n });\r\n e.resume = resume;\r\n reject(e);\r\n };\r\n }\r\n });\r\n },\r\n\r\n delete: function (dbName) {\r\n return new Promise(function (resolve, reject) {\r\n const request = indexedDB.deleteDatabase(dbName); // Does not throw\r\n\r\n request.onsuccess = e => resolve(e);\r\n request.onerror = e => reject(e); // No errors currently\r\n request.onblocked = e => {\r\n // The following addresses part of https://bugzilla.mozilla.org/show_bug.cgi?id=1220279\r\n e = e.newVersion === null || typeof Proxy === 'undefined' ? e : new Proxy(e, {get: function (target, name) {\r\n return name === 'newVersion' ? null : target[name];\r\n }});\r\n const resume = new Promise(function (res, rej) {\r\n // We overwrite handlers rather than make a new\r\n // delete() since the original request is still\r\n // open and its onsuccess will still fire if\r\n // the user unblocks by closing the blocking\r\n // connection\r\n request.onsuccess = ev => {\r\n // The following are needed currently by PhantomJS: https://github.com/ariya/phantomjs/issues/14141\r\n if (!('newVersion' in ev)) {\r\n ev.newVersion = e.newVersion;\r\n }\r\n\r\n if (!('oldVersion' in ev)) {\r\n ev.oldVersion = e.oldVersion;\r\n }\r\n\r\n res(ev);\r\n };\r\n request.onerror = e => rej(e);\r\n });\r\n e.resume = resume;\r\n reject(e);\r\n };\r\n });\r\n },\r\n\r\n cmp: function (param1, param2) {\r\n return new Promise(function (resolve, reject) {\r\n try {\r\n resolve(indexedDB.cmp(param1, param2));\r\n } catch (e) {\r\n reject(e);\r\n }\r\n });\r\n }\r\n };\r\n\r\n if (typeof module !== 'undefined' && typeof module.exports !== 'undefined') {\r\n module.exports = db;\r\n } else if (typeof define === 'function' && define.amd) {\r\n define(function () { return db; });\r\n } else {\r\n local.db = db;\r\n }\r\n}(self));\r\n"]} \ No newline at end of file +{"version":3,"sources":["../src/db.js"],"names":["local","IDBKeyRange","webkitIDBKeyRange","transactionModes","readonly","readwrite","hasOwn","Object","prototype","hasOwnProperty","defaultMapper","x","indexedDB","webkitIndexedDB","mozIndexedDB","oIndexedDB","msIndexedDB","shimIndexedDB","Error","dbCache","serverEvents","isObject","item","mongoDBToKeyRangeArgs","opts","keys","sort","length","key","val","name","inclusive","TypeError","y","pattern","join","mongoifyKey","type","args","IndexQuery","table","db","indexName","preexistingError","modifyObj","runQuery","cursorType","direction","limitRange","filters","mapper","Promise","resolve","reject","keyRange","e","results","counter","indexArgs","transaction","onerror","onabort","oncomplete","store","objectStore","index","push","modifyKeys","modifyRecord","record","forEach","onsuccess","cursor","target","result","advance","matchFilter","value","filter","err","update","continue","Query","queuedError","unique","error","execute","count","desc","distinct","limit","map","start","end","some","modify","prop","fn","arguments","range","query","all","Server","version","noServerMethods","closed","getIndexedDB","isClosed","add","records","reduce","aip","concat","preventDefault","req","call","keyPath","source","defineProperty","enumerable","put","remove","delete","clear","close","get","addEventListener","eventName","handler","includes","h","removeEventListener","evName","objectStoreNames","storeName","createSchema","request","schema","server","i","deleteObjectStore","ret","tableName","contains","createObjectStore","indexes","indexKey","createIndex","err2","open","s","options","then","onupgradeneeded","onblocked","resume","res","rej","ev","dbName","deleteDatabase","newVersion","Proxy","oldVersion","cmp","param1","param2","module","exports","define","amd","self"],"mappings":"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","file":"db.js","sourcesContent":["(function (local) {\n 'use strict';\n\n const IDBKeyRange = local.IDBKeyRange || local.webkitIDBKeyRange;\n const transactionModes = {\n readonly: 'readonly',\n readwrite: 'readwrite'\n };\n const hasOwn = Object.prototype.hasOwnProperty;\n const defaultMapper = x => x;\n\n const indexedDB = local.indexedDB || local.webkitIndexedDB ||\n local.mozIndexedDB || local.oIndexedDB || local.msIndexedDB ||\n local.shimIndexedDB || (function () {\n throw new Error('IndexedDB required');\n }());\n\n const dbCache = {};\n const serverEvents = ['abort', 'error', 'versionchange'];\n\n function isObject (item) {\n return item && typeof item === 'object';\n }\n\n function mongoDBToKeyRangeArgs (opts) {\n const keys = Object.keys(opts).sort();\n if (keys.length === 1) {\n const key = keys[0];\n const val = opts[key];\n let name, inclusive;\n switch (key) {\n case 'eq': name = 'only'; break;\n case 'gt':\n name = 'lowerBound';\n inclusive = true;\n break;\n case 'lt':\n name = 'upperBound';\n inclusive = true;\n break;\n case 'gte': name = 'lowerBound'; break;\n case 'lte': name = 'upperBound'; break;\n default: throw new TypeError('`' + key + '` is not a valid key');\n }\n return [name, [val, inclusive]];\n }\n const x = opts[keys[0]];\n const y = opts[keys[1]];\n const pattern = keys.join('-');\n\n switch (pattern) {\n case 'gt-lt': case 'gt-lte': case 'gte-lt': case 'gte-lte':\n return ['bound', [x, y, keys[0] === 'gt', keys[1] === 'lt']];\n default: throw new TypeError(\n '`' + pattern + '` are conflicted keys'\n );\n }\n }\n function mongoifyKey (key) {\n if (key && typeof key === 'object' && !(key instanceof IDBKeyRange)) {\n let [type, args] = mongoDBToKeyRangeArgs(key);\n return IDBKeyRange[type](...args);\n }\n return key;\n }\n\n const IndexQuery = function (table, db, indexName, preexistingError) {\n let modifyObj = null;\n\n const runQuery = function (type, args, cursorType, direction, limitRange, filters, mapper) {\n return new Promise(function (resolve, reject) {\n let keyRange;\n try {\n keyRange = type ? IDBKeyRange[type](...args) : null;\n } catch (e) {\n reject(e);\n return;\n }\n filters = filters || [];\n limitRange = limitRange || null;\n\n let results = [];\n let counter = 0;\n const indexArgs = [keyRange];\n\n const transaction = db.transaction(table, modifyObj ? transactionModes.readwrite : transactionModes.readonly);\n transaction.onerror = e => reject(e);\n transaction.onabort = e => reject(e);\n transaction.oncomplete = () => resolve(results);\n\n const store = transaction.objectStore(table); // if bad, db.transaction will reject first\n const index = typeof indexName === 'string' ? store.index(indexName) : store;\n\n if (cursorType !== 'count') {\n indexArgs.push(direction || 'next');\n }\n\n // Create a function that will set in the modifyObj properties into\n // the passed record.\n const modifyKeys = modifyObj ? Object.keys(modifyObj) : [];\n\n const modifyRecord = function (record) {\n modifyKeys.forEach(key => {\n let val = modifyObj[key];\n if (typeof val === 'function') { val = val(record); }\n record[key] = val;\n });\n return record;\n };\n\n index[cursorType](...indexArgs).onsuccess = function (e) { // indexArgs are already validated\n const cursor = e.target.result;\n if (typeof cursor === 'number') {\n results = cursor;\n } else if (cursor) {\n if (limitRange !== null && limitRange[0] > counter) {\n counter = limitRange[0];\n cursor.advance(limitRange[0]); // Will throw on 0, but condition above prevents since counter always 0+\n } else if (limitRange !== null && counter >= (limitRange[0] + limitRange[1])) {\n // Out of limit range... skip\n } else {\n let matchFilter = true;\n let result = 'value' in cursor ? cursor.value : cursor.key;\n\n try {\n filters.forEach(function (filter) {\n if (typeof filter[0] === 'function') {\n matchFilter = matchFilter && filter[0](result);\n } else {\n matchFilter = matchFilter && (result[filter[0]] === filter[1]);\n }\n });\n } catch (err) { // Could be filter on non-object or error in filter function\n reject(err);\n return;\n }\n\n if (matchFilter) {\n counter++;\n // If we're doing a modify, run it now\n if (modifyObj) {\n try {\n result = modifyRecord(result);\n cursor.update(result); // `result` should only be a \"structured clone\"-able object\n } catch (err) {\n reject(err);\n return;\n }\n }\n try {\n results.push(mapper(result));\n } catch (err) {\n reject(err);\n return;\n }\n }\n cursor.continue();\n }\n }\n };\n });\n };\n\n const Query = function (type, args, queuedError) {\n const filters = [];\n let direction = 'next';\n let cursorType = 'openCursor';\n let limitRange = null;\n let mapper = defaultMapper;\n let unique = false;\n let error = preexistingError || queuedError;\n\n const execute = function () {\n if (error) {\n return Promise.reject(error);\n }\n return runQuery(type, args, cursorType, unique ? direction + 'unique' : direction, limitRange, filters, mapper);\n };\n\n const count = function () {\n direction = null;\n cursorType = 'count';\n\n return {\n execute\n };\n };\n\n const keys = function () {\n cursorType = 'openKeyCursor';\n\n return {\n desc,\n distinct,\n execute,\n filter,\n limit,\n map\n };\n };\n\n const limit = function (start, end) {\n limitRange = !end ? [0, start] : [start, end];\n error = limitRange.some(val => typeof val !== 'number') ? new Error('limit() arguments must be numeric') : error;\n\n return {\n desc,\n distinct,\n filter,\n keys,\n execute,\n map,\n modify\n };\n };\n\n const filter = function (prop, val) {\n filters.push([prop, val]);\n\n return {\n desc,\n distinct,\n execute,\n filter,\n keys,\n limit,\n map,\n modify\n };\n };\n\n const desc = function () {\n direction = 'prev';\n\n return {\n distinct,\n execute,\n filter,\n keys,\n limit,\n map,\n modify\n };\n };\n\n const distinct = function () {\n unique = true;\n return {\n count,\n desc,\n execute,\n filter,\n keys,\n limit,\n map,\n modify\n };\n };\n\n const modify = function (update) {\n modifyObj = update && typeof update === 'object' ? update : null;\n return {\n execute\n };\n };\n\n const map = function (fn) {\n mapper = fn;\n\n return {\n count,\n desc,\n distinct,\n execute,\n filter,\n keys,\n limit,\n modify\n };\n };\n\n return {\n count,\n desc,\n distinct,\n execute,\n filter,\n keys,\n limit,\n map,\n modify\n };\n };\n\n ['only', 'bound', 'upperBound', 'lowerBound'].forEach((name) => {\n this[name] = function () {\n return Query(name, arguments);\n };\n });\n\n this.range = function (opts) {\n let error;\n let keyRange = [null, null];\n try {\n keyRange = mongoDBToKeyRangeArgs(opts);\n } catch (e) {\n error = e;\n }\n return Query(...keyRange, error);\n };\n\n this.filter = function (...args) {\n const query = Query(null, null);\n return query.filter(...args);\n };\n\n this.all = function () {\n return this.filter();\n };\n };\n\n const Server = function (db, name, version, noServerMethods) {\n let closed = false;\n\n this.getIndexedDB = () => db;\n this.isClosed = () => closed;\n\n this.query = function (table, index) {\n const error = closed ? new Error('Database has been closed') : null;\n return new IndexQuery(table, db, index, error); // Does not throw by itself\n };\n\n this.add = function (table, ...args) {\n return new Promise(function (resolve, reject) {\n if (closed) {\n reject(new Error('Database has been closed'));\n return;\n }\n\n const records = args.reduce(function (records, aip) {\n return records.concat(aip);\n }, []);\n\n const transaction = db.transaction(table, transactionModes.readwrite);\n transaction.onerror = e => {\n // prevent throwing a ConstraintError and aborting (hard)\n // https://bugzilla.mozilla.org/show_bug.cgi?id=872873\n e.preventDefault();\n reject(e);\n };\n transaction.onabort = e => reject(e);\n transaction.oncomplete = () => resolve(records);\n\n const store = transaction.objectStore(table);\n records.some(function (record) {\n let req, key;\n if (isObject(record) && hasOwn.call(record, 'item')) {\n key = record.key;\n record = record.item;\n if (key != null) {\n try {\n key = mongoifyKey(key);\n } catch (e) {\n reject(e);\n return true;\n }\n }\n }\n\n try {\n // Safe to add since in readwrite\n if (key != null) {\n req = store.add(record, key);\n } else {\n req = store.add(record);\n }\n } catch (e) {\n reject(e);\n return true;\n }\n\n req.onsuccess = function (e) {\n if (!isObject(record)) {\n return;\n }\n const target = e.target;\n let keyPath = target.source.keyPath;\n if (keyPath === null) {\n keyPath = '__id__';\n }\n if (hasOwn.call(record, keyPath)) {\n return;\n }\n Object.defineProperty(record, keyPath, {\n value: target.result,\n enumerable: true\n });\n };\n });\n });\n };\n\n this.update = function (table, ...args) {\n return new Promise(function (resolve, reject) {\n if (closed) {\n reject(new Error('Database has been closed'));\n return;\n }\n\n const records = args.reduce(function (records, aip) {\n return records.concat(aip);\n }, []);\n\n const transaction = db.transaction(table, transactionModes.readwrite);\n transaction.onerror = e => {\n // prevent throwing aborting (hard)\n // https://bugzilla.mozilla.org/show_bug.cgi?id=872873\n e.preventDefault();\n reject(e);\n };\n transaction.onabort = e => reject(e);\n transaction.oncomplete = () => resolve(records);\n\n const store = transaction.objectStore(table);\n\n records.some(function (record) {\n let req, key;\n if (isObject(record) && hasOwn.call(record, 'item')) {\n key = record.key;\n record = record.item;\n if (key != null) {\n try {\n key = mongoifyKey(key);\n } catch (e) {\n reject(e);\n return true;\n }\n }\n }\n try {\n // These can throw DataError, e.g., if function passed in\n if (key != null) {\n req = store.put(record, key);\n } else {\n req = store.put(record);\n }\n } catch (err) {\n reject(err);\n return true;\n }\n\n req.onsuccess = function (e) {\n if (!isObject(record)) {\n return;\n }\n const target = e.target;\n let keyPath = target.source.keyPath;\n if (keyPath === null) {\n keyPath = '__id__';\n }\n if (hasOwn.call(record, keyPath)) {\n return;\n }\n Object.defineProperty(record, keyPath, {\n value: target.result,\n enumerable: true\n });\n };\n });\n });\n };\n\n this.put = function (...args) {\n return this.update(...args);\n };\n\n this.remove = function (table, key) {\n return new Promise(function (resolve, reject) {\n if (closed) {\n reject(new Error('Database has been closed'));\n return;\n }\n try {\n key = mongoifyKey(key);\n } catch (e) {\n reject(e);\n return;\n }\n\n const transaction = db.transaction(table, transactionModes.readwrite);\n transaction.onerror = e => {\n // prevent throwing and aborting (hard)\n // https://bugzilla.mozilla.org/show_bug.cgi?id=872873\n e.preventDefault();\n reject(e);\n };\n transaction.onabort = e => reject(e);\n transaction.oncomplete = () => resolve(key);\n\n const store = transaction.objectStore(table);\n try {\n store.delete(key);\n } catch (err) {\n reject(err);\n }\n });\n };\n\n this.delete = function (...args) {\n return this.remove(...args);\n };\n\n this.clear = function (table) {\n return new Promise(function (resolve, reject) {\n if (closed) {\n reject(new Error('Database has been closed'));\n return;\n }\n const transaction = db.transaction(table, transactionModes.readwrite);\n transaction.onerror = e => reject(e);\n transaction.onabort = e => reject(e);\n transaction.oncomplete = () => resolve();\n\n const store = transaction.objectStore(table);\n store.clear();\n });\n };\n\n this.close = function () {\n return new Promise(function (resolve, reject) {\n if (closed) {\n reject(new Error('Database has been closed'));\n return;\n }\n db.close();\n closed = true;\n delete dbCache[name][version];\n resolve();\n });\n };\n\n this.get = function (table, key) {\n return new Promise(function (resolve, reject) {\n if (closed) {\n reject(new Error('Database has been closed'));\n return;\n }\n try {\n key = mongoifyKey(key);\n } catch (e) {\n reject(e);\n return;\n }\n\n const transaction = db.transaction(table);\n transaction.onerror = e => {\n // prevent throwing and aborting (hard)\n // https://bugzilla.mozilla.org/show_bug.cgi?id=872873\n e.preventDefault();\n reject(e);\n };\n transaction.onabort = e => reject(e);\n\n const store = transaction.objectStore(table);\n\n let req;\n try {\n req = store.get(key);\n } catch (err) {\n reject(err);\n }\n req.onsuccess = e => resolve(e.target.result);\n });\n };\n\n this.count = function (table, key) {\n return new Promise((resolve, reject) => {\n if (closed) {\n reject(new Error('Database has been closed'));\n return;\n }\n try {\n key = mongoifyKey(key);\n } catch (e) {\n reject(e);\n return;\n }\n\n const transaction = db.transaction(table);\n transaction.onerror = e => {\n // prevent throwing and aborting (hard)\n // https://bugzilla.mozilla.org/show_bug.cgi?id=872873\n e.preventDefault();\n reject(e);\n };\n transaction.onabort = e => reject(e);\n\n const store = transaction.objectStore(table);\n let req;\n try {\n req = key == null ? store.count() : store.count(key);\n } catch (err) {\n reject(err);\n }\n req.onsuccess = e => resolve(e.target.result);\n });\n };\n\n this.addEventListener = function (eventName, handler) {\n if (!serverEvents.includes(eventName)) {\n throw new Error('Unrecognized event type ' + eventName);\n }\n if (eventName === 'error') {\n var h = function (e) {\n e.preventDefault(); // Needed by Firefox to prevent hard abort with ConstraintError\n handler(e);\n };\n // On Safari of iOS 8.* or 9.*, IDBDatabase doesn't have the method: addEventListener\n if (db.addEventListener) {\n db.addEventListener(eventName, h);\n } else {\n db['on' + eventName] = h;\n }\n return;\n }\n // On Safari of iOS 8.* or 9.*, IDBDatabase doesn't have the method: addEventListener\n if (db.addEventListener) {\n db.addEventListener(eventName, handler);\n } else {\n db['on' + eventName] = handler;\n }\n };\n\n this.removeEventListener = function (eventName, handler) {\n if (!serverEvents.includes(eventName)) {\n throw new Error('Unrecognized event type ' + eventName);\n }\n // On Safari of iOS 8.* or 9.*, IDBDatabase doesn't have the method: removeEventListener\n if (db.removeEventListener) {\n db.removeEventListener(eventName, handler);\n } else {\n db['on' + eventName] = null;\n }\n };\n\n serverEvents.forEach(function (evName) {\n this[evName] = function (handler) {\n this.addEventListener(evName, handler);\n return this;\n };\n }, this);\n\n if (noServerMethods) {\n return;\n }\n\n let err;\n [].some.call(db.objectStoreNames, storeName => {\n if (this[storeName]) {\n err = new Error('The store name, \"' + storeName + '\", which you have attempted to load, conflicts with db.js method names.\"');\n this.close();\n return true;\n }\n this[storeName] = {};\n const keys = Object.keys(this);\n keys.filter(key => !(([...serverEvents, 'close', 'addEventListener', 'removeEventListener']).includes(key)))\n .map(key =>\n this[storeName][key] = (...args) => this[key](storeName, ...args)\n );\n });\n return err;\n };\n\n const createSchema = function (e, request, schema, db, server, version) {\n if (!schema || schema.length === 0) {\n return;\n }\n\n for (let i = 0; i < db.objectStoreNames.length; i++) {\n const name = db.objectStoreNames[i];\n if (!hasOwn.call(schema, name)) {\n // Errors for which we are not concerned and why:\n // `InvalidStateError` - We are in the upgrade transaction.\n // `TransactionInactiveError` (as by the upgrade having already\n // completed or somehow aborting) - since we've just started and\n // should be without risk in this loop\n // `NotFoundError` - since we are iterating the dynamically updated\n // `objectStoreNames`\n db.deleteObjectStore(name);\n }\n }\n\n let ret;\n Object.keys(schema).some(function (tableName) {\n const table = schema[tableName];\n let store;\n if (db.objectStoreNames.contains(tableName)) {\n store = request.transaction.objectStore(tableName); // Shouldn't throw\n } else {\n // Errors for which we are not concerned and why:\n // `InvalidStateError` - We are in the upgrade transaction.\n // `ConstraintError` - We are just starting (and probably never too large anyways) for a key generator.\n // `ConstraintError` - The above condition should prevent the name already existing.\n //\n // Possible errors:\n // `TransactionInactiveError` - if the upgrade had already aborted,\n // e.g., from a previous `QuotaExceededError` which is supposed to nevertheless return\n // the store but then abort the transaction.\n // `SyntaxError` - if an invalid `table.key.keyPath` is supplied.\n // `InvalidAccessError` - if `table.key.autoIncrement` is `true` and `table.key.keyPath` is an\n // empty string or any sequence (empty or otherwise).\n try {\n store = db.createObjectStore(tableName, table.key);\n } catch (err) {\n ret = err;\n return true;\n }\n }\n\n Object.keys(table.indexes || {}).some(function (indexKey) {\n try {\n store.index(indexKey);\n } catch (err) {\n let index = table.indexes[indexKey];\n index = index && typeof index === 'object' ? index : {};\n // Errors for which we are not concerned and why:\n // `InvalidStateError` - We are in the upgrade transaction and store found above should not have already been deleted.\n // `ConstraintError` - We have already tried getting the index, so it shouldn't already exist\n //\n // Possible errors:\n // `TransactionInactiveError` - if the upgrade had already aborted,\n // e.g., from a previous `QuotaExceededError` which is supposed to nevertheless return\n // the index object but then abort the transaction.\n // `SyntaxError` - If the `keyPath` (second argument) is an invalid key path\n // `InvalidAccessError` - If `multiEntry` on `index` is `true` and\n // `keyPath` (second argument) is a sequence\n try {\n store.createIndex(indexKey, index.keyPath || index.key || indexKey, index);\n } catch (err2) {\n ret = err2;\n return true;\n }\n }\n });\n });\n return ret;\n };\n\n const open = function (e, server, version, noServerMethods) {\n const db = e.target.result;\n dbCache[server][version] = db;\n\n const s = new Server(db, server, version, noServerMethods);\n return s instanceof Error ? Promise.reject(s) : Promise.resolve(s);\n };\n\n const db = {\n version: '0.15.0',\n open: function (options) {\n let server = options.server;\n let version = options.version || 1;\n let schema = options.schema;\n let noServerMethods = options.noServerMethods;\n\n if (!dbCache[server]) {\n dbCache[server] = {};\n }\n return new Promise(function (resolve, reject) {\n if (dbCache[server][version]) {\n open({\n target: {\n result: dbCache[server][version]\n }\n }, server, version, noServerMethods)\n .then(resolve, reject);\n } else {\n if (typeof schema === 'function') {\n try {\n schema = schema();\n } catch (e) {\n reject(e);\n return;\n }\n }\n const request = indexedDB.open(server, version);\n\n request.onsuccess = e => open(e, server, version, noServerMethods).then(resolve, reject);\n request.onerror = e => {\n // Prevent default for `BadVersion` and `AbortError` errors, etc.\n // These are not necessarily reported in console in Chrome but present; see\n // https://bugzilla.mozilla.org/show_bug.cgi?id=872873\n // http://stackoverflow.com/questions/36225779/aborterror-within-indexeddb-upgradeneeded-event/36266502\n e.preventDefault();\n reject(e);\n };\n request.onupgradeneeded = e => {\n let err = createSchema(e, request, schema, e.target.result, server, version);\n if (err) {\n reject(err);\n }\n };\n request.onblocked = e => {\n const resume = new Promise(function (res, rej) {\n // We overwrite handlers rather than make a new\n // open() since the original request is still\n // open and its onsuccess will still fire if\n // the user unblocks by closing the blocking\n // connection\n request.onsuccess = (ev) => {\n open(ev, server, version, noServerMethods)\n .then(res, rej);\n };\n request.onerror = e => rej(e);\n });\n e.resume = resume;\n reject(e);\n };\n }\n });\n },\n\n delete: function (dbName) {\n return new Promise(function (resolve, reject) {\n const request = indexedDB.deleteDatabase(dbName); // Does not throw\n\n request.onsuccess = e => resolve(e);\n request.onerror = e => reject(e); // No errors currently\n request.onblocked = e => {\n // The following addresses part of https://bugzilla.mozilla.org/show_bug.cgi?id=1220279\n e = e.newVersion === null || typeof Proxy === 'undefined' ? e : new Proxy(e, {get: function (target, name) {\n return name === 'newVersion' ? null : target[name];\n }});\n const resume = new Promise(function (res, rej) {\n // We overwrite handlers rather than make a new\n // delete() since the original request is still\n // open and its onsuccess will still fire if\n // the user unblocks by closing the blocking\n // connection\n request.onsuccess = ev => {\n // The following are needed currently by PhantomJS: https://github.com/ariya/phantomjs/issues/14141\n if (!('newVersion' in ev)) {\n ev.newVersion = e.newVersion;\n }\n\n if (!('oldVersion' in ev)) {\n ev.oldVersion = e.oldVersion;\n }\n\n res(ev);\n };\n request.onerror = e => rej(e);\n });\n e.resume = resume;\n reject(e);\n };\n });\n },\n\n cmp: function (param1, param2) {\n return new Promise(function (resolve, reject) {\n try {\n resolve(indexedDB.cmp(param1, param2));\n } catch (e) {\n reject(e);\n }\n });\n }\n };\n\n if (typeof module !== 'undefined' && typeof module.exports !== 'undefined') {\n module.exports = db;\n } else if (typeof define === 'function' && define.amd) {\n define(function () { return db; });\n } else {\n local.db = db;\n }\n}(self));\n"]} \ No newline at end of file diff --git a/dist/db.min.js b/dist/db.min.js index f5cdd74..24e5652 100644 --- a/dist/db.min.js +++ b/dist/db.min.js @@ -1,2 +1,2 @@ -!function(a){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=a();else if("function"==typeof define&&define.amd)define([],a);else{var b;b="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this,b.db=a()}}(function(){var a;return function b(a,c,d){function e(g,h){if(!c[g]){if(!a[g]){var i="function"==typeof require&&require;if(!h&&i)return i(g,!0);if(f)return f(g,!0);var j=new Error("Cannot find module '"+g+"'");throw j.code="MODULE_NOT_FOUND",j}var k=c[g]={exports:{}};a[g][0].call(k.exports,function(b){var c=a[g][1][b];return e(c?c:b)},k,k.exports,b,a,c,d)}return c[g].exports}for(var f="function"==typeof require&&require,g=0;gu)u=m[0],b.advance(m[0]);else if(null!==m&&u>=m[0]+m[1]);else{var c=function(){var a=!0,c="value"in b?b.value:b.key;try{n.forEach(function(b){a="function"==typeof b[0]?a&&b[0](c):a&&c[b[0]]===b[1]})}catch(d){return q(d),{v:void 0}}if(a){if(u++,i)try{c=A(c),b.update(c)}catch(d){return q(d),{v:void 0}}try{t.push(o(c))}catch(d){return q(d),{v:void 0}}}b["continue"]()}();if("object"===("undefined"==typeof c?"undefined":g(c)))return c.v}}})},n=function(a,b,c){var e=[],f="next",h="openCursor",j=null,k=m,n=!1,o=d||c,p=function(){return o?Promise.reject(o):l(a,b,h,n?f+"unique":f,j,e,k)},q=function(){return f=null,h="count",{execute:p}},r=function(){return h="openKeyCursor",{desc:u,distinct:v,execute:p,filter:t,limit:s,map:x}},s=function(a,b){return j=b?[a,b]:[0,a],o=j.some(function(a){return"number"!=typeof a})?new Error("limit() arguments must be numeric"):o,{desc:u,distinct:v,filter:t,keys:r,execute:p,map:x,modify:w}},t=function y(a,b){return e.push([a,b]),{desc:u,distinct:v,execute:p,filter:y,keys:r,limit:s,map:x,modify:w}},u=function(){return f="prev",{distinct:v,execute:p,filter:t,keys:r,limit:s,map:x,modify:w}},v=function(){return n=!0,{count:q,desc:u,execute:p,filter:t,keys:r,limit:s,map:x,modify:w}},w=function(a){return i=a&&"object"===("undefined"==typeof a?"undefined":g(a))?a:null,{execute:p}},x=function(a){return k=a,{count:q,desc:u,distinct:v,execute:p,filter:t,keys:r,limit:s,modify:w}};return{count:q,desc:u,distinct:v,execute:p,filter:t,keys:r,limit:s,map:x,modify:w}};["only","bound","upperBound","lowerBound"].forEach(function(a){f[a]=function(){return n(a,arguments)}}),this.range=function(a){var b=void 0,c=[null,null];try{c=h(a)}catch(d){b=d}return n.apply(void 0,e(c).concat([b]))},this.filter=function(){var a=n(null,null);return a.filter.apply(a,arguments)},this.all=function(){return this.filter()}},r=function(a,b,c,e){var f=this,g=!1;if(this.getIndexedDB=function(){return a},this.isClosed=function(){return g},this.query=function(b,c){var d=g?new Error("Database has been closed"):null;return new q(b,a,c,d)},this.add=function(b){for(var c=arguments.length,e=Array(c>1?c-1:0),f=1;c>f;f++)e[f-1]=arguments[f];return new Promise(function(c,f){if(g)return void f(new Error("Database has been closed"));var h=e.reduce(function(a,b){return a.concat(b)},[]),j=a.transaction(b,k.readwrite);j.onerror=function(a){a.preventDefault(),f(a)},j.onabort=function(a){return f(a)},j.oncomplete=function(){return c(h)};var m=j.objectStore(b);h.some(function(a){var b=void 0,c=void 0;if(d(a)&&l.call(a,"item")&&(c=a.key,a=a.item,null!=c))try{c=i(c)}catch(e){return f(e),!0}try{b=null!=c?m.add(a,c):m.add(a)}catch(e){return f(e),!0}b.onsuccess=function(b){if(d(a)){var c=b.target,e=c.source.keyPath;null===e&&(e="__id__"),l.call(a,e)||Object.defineProperty(a,e,{value:c.result,enumerable:!0})}}})})},this.update=function(b){for(var c=arguments.length,e=Array(c>1?c-1:0),f=1;c>f;f++)e[f-1]=arguments[f];return new Promise(function(c,f){if(g)return void f(new Error("Database has been closed"));var h=e.reduce(function(a,b){return a.concat(b)},[]),j=a.transaction(b,k.readwrite);j.onerror=function(a){a.preventDefault(),f(a)},j.onabort=function(a){return f(a)},j.oncomplete=function(){return c(h)};var m=j.objectStore(b);h.some(function(a){var b=void 0,c=void 0;if(d(a)&&l.call(a,"item")&&(c=a.key,a=a.item,null!=c))try{c=i(c)}catch(e){return f(e),!0}try{b=null!=c?m.put(a,c):m.put(a)}catch(g){return f(g),!0}b.onsuccess=function(b){if(d(a)){var c=b.target,e=c.source.keyPath;null===e&&(e="__id__"),l.call(a,e)||Object.defineProperty(a,e,{value:c.result,enumerable:!0})}}})})},this.put=function(){return this.update.apply(this,arguments)},this.remove=function(b,c){return new Promise(function(d,e){if(g)return void e(new Error("Database has been closed"));try{c=i(c)}catch(f){return void e(f)}var h=a.transaction(b,k.readwrite);h.onerror=function(a){a.preventDefault(),e(a)},h.onabort=function(a){return e(a)},h.oncomplete=function(){return d(c)};var j=h.objectStore(b);try{j["delete"](c)}catch(l){e(l)}})},this["delete"]=function(){return this.remove.apply(this,arguments)},this.clear=function(b){return new Promise(function(c,d){if(g)return void d(new Error("Database has been closed"));var e=a.transaction(b,k.readwrite);e.onerror=function(a){return d(a)},e.onabort=function(a){return d(a)},e.oncomplete=function(){return c()};var f=e.objectStore(b);f.clear()})},this.close=function(){return new Promise(function(d,e){return g?void e(new Error("Database has been closed")):(a.close(),g=!0,delete o[b][c],void d())})},this.get=function(b,c){return new Promise(function(d,e){if(g)return void e(new Error("Database has been closed"));try{c=i(c)}catch(f){return void e(f)}var h=a.transaction(b);h.onerror=function(a){a.preventDefault(),e(a)},h.onabort=function(a){return e(a)};var j=h.objectStore(b),k=void 0;try{k=j.get(c)}catch(l){e(l)}k.onsuccess=function(a){return d(a.target.result)}})},this.count=function(b,c){return new Promise(function(d,e){if(g)return void e(new Error("Database has been closed"));try{c=i(c)}catch(f){return void e(f)}var h=a.transaction(b);h.onerror=function(a){a.preventDefault(),e(a)},h.onabort=function(a){return e(a)};var j=h.objectStore(b),k=void 0;try{k=null==c?j.count():j.count(c)}catch(l){e(l)}k.onsuccess=function(a){return d(a.target.result)}})},this.addEventListener=function(b,c){if(!p.includes(b))throw new Error("Unrecognized event type "+b);return"error"===b?void a.addEventListener(b,function(a){a.preventDefault(),c(a)}):void a.addEventListener(b,c)},this.removeEventListener=function(b,c){if(!p.includes(b))throw new Error("Unrecognized event type "+b);a.removeEventListener(b,c)},p.forEach(function(a){this[a]=function(b){return this.addEventListener(a,b),this}},this),!e){var h=void 0;return[].some.call(a.objectStoreNames,function(a){if(f[a])return h=new Error('The store name, "'+a+'", which you have attempted to load, conflicts with db.js method names."'),f.close(),!0;f[a]={};var b=Object.keys(f);b.filter(function(a){return![].concat(p,["close","addEventListener","removeEventListener"]).includes(a)}).map(function(b){return f[a][b]=function(){for(var c=arguments.length,d=Array(c),e=0;c>e;e++)d[e]=arguments[e];return f[b].apply(f,[a].concat(d))}})}),h}},s=function(a,b,c,d,e,f){if(c&&0!==c.length){for(var h=0;ht)t=l[0],b.advance(l[0]);else if(null!==l&&t>=l[0]+l[1]);else{var c=!0,d="value"in b?b.value:b.key;try{m.forEach(function(a){c="function"==typeof a[0]?c&&a[0](d):c&&d[a[0]]===a[1]})}catch(e){return void p(e)}if(c){if(t++,i)try{d=z(d),b.update(d)}catch(e){return void p(e)}try{s.push(n(d))}catch(e){return void p(e)}}b["continue"]()}}})},n=function(a,b,c){var e=[],f="next",h="openCursor",j=null,k=m,n=!1,o=d||c,p=function(){return o?Promise.reject(o):l(a,b,h,n?f+"unique":f,j,e,k)},q=function(){return f=null,h="count",{execute:p}},r=function(){return h="openKeyCursor",{desc:u,distinct:v,execute:p,filter:t,limit:s,map:x}},s=function(a,b){return j=b?[a,b]:[0,a],o=j.some(function(a){return"number"!=typeof a})?new Error("limit() arguments must be numeric"):o,{desc:u,distinct:v,filter:t,keys:r,execute:p,map:x,modify:w}},t=function y(a,b){return e.push([a,b]),{desc:u,distinct:v,execute:p,filter:y,keys:r,limit:s,map:x,modify:w}},u=function(){return f="prev",{distinct:v,execute:p,filter:t,keys:r,limit:s,map:x,modify:w}},v=function(){return n=!0,{count:q,desc:u,execute:p,filter:t,keys:r,limit:s,map:x,modify:w}},w=function(a){return i=a&&"object"===("undefined"==typeof a?"undefined":g(a))?a:null,{execute:p}},x=function(a){return k=a,{count:q,desc:u,distinct:v,execute:p,filter:t,keys:r,limit:s,modify:w}};return{count:q,desc:u,distinct:v,execute:p,filter:t,keys:r,limit:s,map:x,modify:w}};["only","bound","upperBound","lowerBound"].forEach(function(a){f[a]=function(){return n(a,arguments)}}),this.range=function(a){var b=void 0,c=[null,null];try{c=h(a)}catch(d){b=d}return n.apply(void 0,e(c).concat([b]))},this.filter=function(){var a=n(null,null);return a.filter.apply(a,arguments)},this.all=function(){return this.filter()}},r=function(a,b,c,e){var f=this,g=!1;if(this.getIndexedDB=function(){return a},this.isClosed=function(){return g},this.query=function(b,c){var d=g?new Error("Database has been closed"):null;return new q(b,a,c,d)},this.add=function(b){for(var c=arguments.length,e=Array(c>1?c-1:0),f=1;c>f;f++)e[f-1]=arguments[f];return new Promise(function(c,f){if(g)return void f(new Error("Database has been closed"));var h=e.reduce(function(a,b){return a.concat(b)},[]),j=a.transaction(b,k.readwrite);j.onerror=function(a){a.preventDefault(),f(a)},j.onabort=function(a){return f(a)},j.oncomplete=function(){return c(h)};var m=j.objectStore(b);h.some(function(a){var b=void 0,c=void 0;if(d(a)&&l.call(a,"item")&&(c=a.key,a=a.item,null!=c))try{c=i(c)}catch(e){return f(e),!0}try{b=null!=c?m.add(a,c):m.add(a)}catch(e){return f(e),!0}b.onsuccess=function(b){if(d(a)){var c=b.target,e=c.source.keyPath;null===e&&(e="__id__"),l.call(a,e)||Object.defineProperty(a,e,{value:c.result,enumerable:!0})}}})})},this.update=function(b){for(var c=arguments.length,e=Array(c>1?c-1:0),f=1;c>f;f++)e[f-1]=arguments[f];return new Promise(function(c,f){if(g)return void f(new Error("Database has been closed"));var h=e.reduce(function(a,b){return a.concat(b)},[]),j=a.transaction(b,k.readwrite);j.onerror=function(a){a.preventDefault(),f(a)},j.onabort=function(a){return f(a)},j.oncomplete=function(){return c(h)};var m=j.objectStore(b);h.some(function(a){var b=void 0,c=void 0;if(d(a)&&l.call(a,"item")&&(c=a.key,a=a.item,null!=c))try{c=i(c)}catch(e){return f(e),!0}try{b=null!=c?m.put(a,c):m.put(a)}catch(g){return f(g),!0}b.onsuccess=function(b){if(d(a)){var c=b.target,e=c.source.keyPath;null===e&&(e="__id__"),l.call(a,e)||Object.defineProperty(a,e,{value:c.result,enumerable:!0})}}})})},this.put=function(){return this.update.apply(this,arguments)},this.remove=function(b,c){return new Promise(function(d,e){if(g)return void e(new Error("Database has been closed"));try{c=i(c)}catch(f){return void e(f)}var h=a.transaction(b,k.readwrite);h.onerror=function(a){a.preventDefault(),e(a)},h.onabort=function(a){return e(a)},h.oncomplete=function(){return d(c)};var j=h.objectStore(b);try{j["delete"](c)}catch(l){e(l)}})},this["delete"]=function(){return this.remove.apply(this,arguments)},this.clear=function(b){return new Promise(function(c,d){if(g)return void d(new Error("Database has been closed"));var e=a.transaction(b,k.readwrite);e.onerror=function(a){return d(a)},e.onabort=function(a){return d(a)},e.oncomplete=function(){return c()};var f=e.objectStore(b);f.clear()})},this.close=function(){return new Promise(function(d,e){return g?void e(new Error("Database has been closed")):(a.close(),g=!0,delete o[b][c],void d())})},this.get=function(b,c){return new Promise(function(d,e){if(g)return void e(new Error("Database has been closed"));try{c=i(c)}catch(f){return void e(f)}var h=a.transaction(b);h.onerror=function(a){a.preventDefault(),e(a)},h.onabort=function(a){return e(a)};var j=h.objectStore(b),k=void 0;try{k=j.get(c)}catch(l){e(l)}k.onsuccess=function(a){return d(a.target.result)}})},this.count=function(b,c){return new Promise(function(d,e){if(g)return void e(new Error("Database has been closed"));try{c=i(c)}catch(f){return void e(f)}var h=a.transaction(b);h.onerror=function(a){a.preventDefault(),e(a)},h.onabort=function(a){return e(a)};var j=h.objectStore(b),k=void 0;try{k=null==c?j.count():j.count(c)}catch(l){e(l)}k.onsuccess=function(a){return d(a.target.result)}})},this.addEventListener=function(b,c){if(!p.includes(b))throw new Error("Unrecognized event type "+b);if("error"===b){var d=function(a){a.preventDefault(),c(a)};return void(a.addEventListener?a.addEventListener(b,d):a["on"+b]=d)}a.addEventListener?a.addEventListener(b,c):a["on"+b]=c},this.removeEventListener=function(b,c){if(!p.includes(b))throw new Error("Unrecognized event type "+b);a.removeEventListener?a.removeEventListener(b,c):a["on"+b]=null},p.forEach(function(a){this[a]=function(b){return this.addEventListener(a,b),this}},this),!e){var h=void 0;return[].some.call(a.objectStoreNames,function(a){if(f[a])return h=new Error('The store name, "'+a+'", which you have attempted to load, conflicts with db.js method names."'),f.close(),!0;f[a]={};var b=Object.keys(f);b.filter(function(a){return![].concat(p,["close","addEventListener","removeEventListener"]).includes(a)}).map(function(b){return f[a][b]=function(){for(var c=arguments.length,d=Array(c),e=0;c>e;e++)d[e]=arguments[e];return f[b].apply(f,[a].concat(d))}})}),h}},s=function(a,b,c,d,e,f){if(c&&0!==c.length){for(var h=0;h x;\r\n\r\n const indexedDB = local.indexedDB || local.webkitIndexedDB ||\r\n local.mozIndexedDB || local.oIndexedDB || local.msIndexedDB ||\r\n local.shimIndexedDB || (function () {\r\n throw new Error('IndexedDB required');\r\n }());\r\n\r\n const dbCache = {};\r\n const serverEvents = ['abort', 'error', 'versionchange'];\r\n\r\n function isObject (item) {\r\n return item && typeof item === 'object';\r\n }\r\n\r\n function mongoDBToKeyRangeArgs (opts) {\r\n const keys = Object.keys(opts).sort();\r\n if (keys.length === 1) {\r\n const key = keys[0];\r\n const val = opts[key];\r\n let name, inclusive;\r\n switch (key) {\r\n case 'eq': name = 'only'; break;\r\n case 'gt':\r\n name = 'lowerBound';\r\n inclusive = true;\r\n break;\r\n case 'lt':\r\n name = 'upperBound';\r\n inclusive = true;\r\n break;\r\n case 'gte': name = 'lowerBound'; break;\r\n case 'lte': name = 'upperBound'; break;\r\n default: throw new TypeError('`' + key + '` is not a valid key');\r\n }\r\n return [name, [val, inclusive]];\r\n }\r\n const x = opts[keys[0]];\r\n const y = opts[keys[1]];\r\n const pattern = keys.join('-');\r\n\r\n switch (pattern) {\r\n case 'gt-lt': case 'gt-lte': case 'gte-lt': case 'gte-lte':\r\n return ['bound', [x, y, keys[0] === 'gt', keys[1] === 'lt']];\r\n default: throw new TypeError(\r\n '`' + pattern + '` are conflicted keys'\r\n );\r\n }\r\n }\r\n function mongoifyKey (key) {\r\n if (key && typeof key === 'object' && !(key instanceof IDBKeyRange)) {\r\n let [type, args] = mongoDBToKeyRangeArgs(key);\r\n return IDBKeyRange[type](...args);\r\n }\r\n return key;\r\n }\r\n\r\n const IndexQuery = function (table, db, indexName, preexistingError) {\r\n let modifyObj = null;\r\n\r\n const runQuery = function (type, args, cursorType, direction, limitRange, filters, mapper) {\r\n return new Promise(function (resolve, reject) {\r\n let keyRange;\r\n try {\r\n keyRange = type ? IDBKeyRange[type](...args) : null;\r\n } catch (e) {\r\n reject(e);\r\n return;\r\n }\r\n filters = filters || [];\r\n limitRange = limitRange || null;\r\n\r\n let results = [];\r\n let counter = 0;\r\n const indexArgs = [keyRange];\r\n\r\n const transaction = db.transaction(table, modifyObj ? transactionModes.readwrite : transactionModes.readonly);\r\n transaction.onerror = e => reject(e);\r\n transaction.onabort = e => reject(e);\r\n transaction.oncomplete = () => resolve(results);\r\n\r\n const store = transaction.objectStore(table); // if bad, db.transaction will reject first\r\n const index = typeof indexName === 'string' ? store.index(indexName) : store;\r\n\r\n if (cursorType !== 'count') {\r\n indexArgs.push(direction || 'next');\r\n }\r\n\r\n // Create a function that will set in the modifyObj properties into\r\n // the passed record.\r\n const modifyKeys = modifyObj ? Object.keys(modifyObj) : [];\r\n\r\n const modifyRecord = function (record) {\r\n modifyKeys.forEach(key => {\r\n let val = modifyObj[key];\r\n if (typeof val === 'function') { val = val(record); }\r\n record[key] = val;\r\n });\r\n return record;\r\n };\r\n\r\n index[cursorType](...indexArgs).onsuccess = function (e) { // indexArgs are already validated\r\n const cursor = e.target.result;\r\n if (typeof cursor === 'number') {\r\n results = cursor;\r\n } else if (cursor) {\r\n if (limitRange !== null && limitRange[0] > counter) {\r\n counter = limitRange[0];\r\n cursor.advance(limitRange[0]); // Will throw on 0, but condition above prevents since counter always 0+\r\n } else if (limitRange !== null && counter >= (limitRange[0] + limitRange[1])) {\r\n // Out of limit range... skip\r\n } else {\r\n let matchFilter = true;\r\n let result = 'value' in cursor ? cursor.value : cursor.key;\r\n\r\n try {\r\n filters.forEach(function (filter) {\r\n if (typeof filter[0] === 'function') {\r\n matchFilter = matchFilter && filter[0](result);\r\n } else {\r\n matchFilter = matchFilter && (result[filter[0]] === filter[1]);\r\n }\r\n });\r\n } catch (err) { // Could be filter on non-object or error in filter function\r\n reject(err);\r\n return;\r\n }\r\n\r\n if (matchFilter) {\r\n counter++;\r\n // If we're doing a modify, run it now\r\n if (modifyObj) {\r\n try {\r\n result = modifyRecord(result);\r\n cursor.update(result); // `result` should only be a \"structured clone\"-able object\r\n } catch (err) {\r\n reject(err);\r\n return;\r\n }\r\n }\r\n try {\r\n results.push(mapper(result));\r\n } catch (err) {\r\n reject(err);\r\n return;\r\n }\r\n }\r\n cursor.continue();\r\n }\r\n }\r\n };\r\n });\r\n };\r\n\r\n const Query = function (type, args, queuedError) {\r\n const filters = [];\r\n let direction = 'next';\r\n let cursorType = 'openCursor';\r\n let limitRange = null;\r\n let mapper = defaultMapper;\r\n let unique = false;\r\n let error = preexistingError || queuedError;\r\n\r\n const execute = function () {\r\n if (error) {\r\n return Promise.reject(error);\r\n }\r\n return runQuery(type, args, cursorType, unique ? direction + 'unique' : direction, limitRange, filters, mapper);\r\n };\r\n\r\n const count = function () {\r\n direction = null;\r\n cursorType = 'count';\r\n\r\n return {\r\n execute\r\n };\r\n };\r\n\r\n const keys = function () {\r\n cursorType = 'openKeyCursor';\r\n\r\n return {\r\n desc,\r\n distinct,\r\n execute,\r\n filter,\r\n limit,\r\n map\r\n };\r\n };\r\n\r\n const limit = function (start, end) {\r\n limitRange = !end ? [0, start] : [start, end];\r\n error = limitRange.some(val => typeof val !== 'number') ? new Error('limit() arguments must be numeric') : error;\r\n\r\n return {\r\n desc,\r\n distinct,\r\n filter,\r\n keys,\r\n execute,\r\n map,\r\n modify\r\n };\r\n };\r\n\r\n const filter = function (prop, val) {\r\n filters.push([prop, val]);\r\n\r\n return {\r\n desc,\r\n distinct,\r\n execute,\r\n filter,\r\n keys,\r\n limit,\r\n map,\r\n modify\r\n };\r\n };\r\n\r\n const desc = function () {\r\n direction = 'prev';\r\n\r\n return {\r\n distinct,\r\n execute,\r\n filter,\r\n keys,\r\n limit,\r\n map,\r\n modify\r\n };\r\n };\r\n\r\n const distinct = function () {\r\n unique = true;\r\n return {\r\n count,\r\n desc,\r\n execute,\r\n filter,\r\n keys,\r\n limit,\r\n map,\r\n modify\r\n };\r\n };\r\n\r\n const modify = function (update) {\r\n modifyObj = update && typeof update === 'object' ? update : null;\r\n return {\r\n execute\r\n };\r\n };\r\n\r\n const map = function (fn) {\r\n mapper = fn;\r\n\r\n return {\r\n count,\r\n desc,\r\n distinct,\r\n execute,\r\n filter,\r\n keys,\r\n limit,\r\n modify\r\n };\r\n };\r\n\r\n return {\r\n count,\r\n desc,\r\n distinct,\r\n execute,\r\n filter,\r\n keys,\r\n limit,\r\n map,\r\n modify\r\n };\r\n };\r\n\r\n ['only', 'bound', 'upperBound', 'lowerBound'].forEach((name) => {\r\n this[name] = function () {\r\n return Query(name, arguments);\r\n };\r\n });\r\n\r\n this.range = function (opts) {\r\n let error;\r\n let keyRange = [null, null];\r\n try {\r\n keyRange = mongoDBToKeyRangeArgs(opts);\r\n } catch (e) {\r\n error = e;\r\n }\r\n return Query(...keyRange, error);\r\n };\r\n\r\n this.filter = function (...args) {\r\n const query = Query(null, null);\r\n return query.filter(...args);\r\n };\r\n\r\n this.all = function () {\r\n return this.filter();\r\n };\r\n };\r\n\r\n const Server = function (db, name, version, noServerMethods) {\r\n let closed = false;\r\n\r\n this.getIndexedDB = () => db;\r\n this.isClosed = () => closed;\r\n\r\n this.query = function (table, index) {\r\n const error = closed ? new Error('Database has been closed') : null;\r\n return new IndexQuery(table, db, index, error); // Does not throw by itself\r\n };\r\n\r\n this.add = function (table, ...args) {\r\n return new Promise(function (resolve, reject) {\r\n if (closed) {\r\n reject(new Error('Database has been closed'));\r\n return;\r\n }\r\n\r\n const records = args.reduce(function (records, aip) {\r\n return records.concat(aip);\r\n }, []);\r\n\r\n const transaction = db.transaction(table, transactionModes.readwrite);\r\n transaction.onerror = e => {\r\n // prevent throwing a ConstraintError and aborting (hard)\r\n // https://bugzilla.mozilla.org/show_bug.cgi?id=872873\r\n e.preventDefault();\r\n reject(e);\r\n };\r\n transaction.onabort = e => reject(e);\r\n transaction.oncomplete = () => resolve(records);\r\n\r\n const store = transaction.objectStore(table);\r\n records.some(function (record) {\r\n let req, key;\r\n if (isObject(record) && hasOwn.call(record, 'item')) {\r\n key = record.key;\r\n record = record.item;\r\n if (key != null) {\r\n try {\r\n key = mongoifyKey(key);\r\n } catch (e) {\r\n reject(e);\r\n return true;\r\n }\r\n }\r\n }\r\n\r\n try {\r\n // Safe to add since in readwrite\r\n if (key != null) {\r\n req = store.add(record, key);\r\n } else {\r\n req = store.add(record);\r\n }\r\n } catch (e) {\r\n reject(e);\r\n return true;\r\n }\r\n\r\n req.onsuccess = function (e) {\r\n if (!isObject(record)) {\r\n return;\r\n }\r\n const target = e.target;\r\n let keyPath = target.source.keyPath;\r\n if (keyPath === null) {\r\n keyPath = '__id__';\r\n }\r\n if (hasOwn.call(record, keyPath)) {\r\n return;\r\n }\r\n Object.defineProperty(record, keyPath, {\r\n value: target.result,\r\n enumerable: true\r\n });\r\n };\r\n });\r\n });\r\n };\r\n\r\n this.update = function (table, ...args) {\r\n return new Promise(function (resolve, reject) {\r\n if (closed) {\r\n reject(new Error('Database has been closed'));\r\n return;\r\n }\r\n\r\n const records = args.reduce(function (records, aip) {\r\n return records.concat(aip);\r\n }, []);\r\n\r\n const transaction = db.transaction(table, transactionModes.readwrite);\r\n transaction.onerror = e => {\r\n // prevent throwing aborting (hard)\r\n // https://bugzilla.mozilla.org/show_bug.cgi?id=872873\r\n e.preventDefault();\r\n reject(e);\r\n };\r\n transaction.onabort = e => reject(e);\r\n transaction.oncomplete = () => resolve(records);\r\n\r\n const store = transaction.objectStore(table);\r\n\r\n records.some(function (record) {\r\n let req, key;\r\n if (isObject(record) && hasOwn.call(record, 'item')) {\r\n key = record.key;\r\n record = record.item;\r\n if (key != null) {\r\n try {\r\n key = mongoifyKey(key);\r\n } catch (e) {\r\n reject(e);\r\n return true;\r\n }\r\n }\r\n }\r\n try {\r\n // These can throw DataError, e.g., if function passed in\r\n if (key != null) {\r\n req = store.put(record, key);\r\n } else {\r\n req = store.put(record);\r\n }\r\n } catch (err) {\r\n reject(err);\r\n return true;\r\n }\r\n\r\n req.onsuccess = function (e) {\r\n if (!isObject(record)) {\r\n return;\r\n }\r\n const target = e.target;\r\n let keyPath = target.source.keyPath;\r\n if (keyPath === null) {\r\n keyPath = '__id__';\r\n }\r\n if (hasOwn.call(record, keyPath)) {\r\n return;\r\n }\r\n Object.defineProperty(record, keyPath, {\r\n value: target.result,\r\n enumerable: true\r\n });\r\n };\r\n });\r\n });\r\n };\r\n\r\n this.put = function (...args) {\r\n return this.update(...args);\r\n };\r\n\r\n this.remove = function (table, key) {\r\n return new Promise(function (resolve, reject) {\r\n if (closed) {\r\n reject(new Error('Database has been closed'));\r\n return;\r\n }\r\n try {\r\n key = mongoifyKey(key);\r\n } catch (e) {\r\n reject(e);\r\n return;\r\n }\r\n\r\n const transaction = db.transaction(table, transactionModes.readwrite);\r\n transaction.onerror = e => {\r\n // prevent throwing and aborting (hard)\r\n // https://bugzilla.mozilla.org/show_bug.cgi?id=872873\r\n e.preventDefault();\r\n reject(e);\r\n };\r\n transaction.onabort = e => reject(e);\r\n transaction.oncomplete = () => resolve(key);\r\n\r\n const store = transaction.objectStore(table);\r\n try {\r\n store.delete(key);\r\n } catch (err) {\r\n reject(err);\r\n }\r\n });\r\n };\r\n\r\n this.delete = function (...args) {\r\n return this.remove(...args);\r\n };\r\n\r\n this.clear = function (table) {\r\n return new Promise(function (resolve, reject) {\r\n if (closed) {\r\n reject(new Error('Database has been closed'));\r\n return;\r\n }\r\n const transaction = db.transaction(table, transactionModes.readwrite);\r\n transaction.onerror = e => reject(e);\r\n transaction.onabort = e => reject(e);\r\n transaction.oncomplete = () => resolve();\r\n\r\n const store = transaction.objectStore(table);\r\n store.clear();\r\n });\r\n };\r\n\r\n this.close = function () {\r\n return new Promise(function (resolve, reject) {\r\n if (closed) {\r\n reject(new Error('Database has been closed'));\r\n return;\r\n }\r\n db.close();\r\n closed = true;\r\n delete dbCache[name][version];\r\n resolve();\r\n });\r\n };\r\n\r\n this.get = function (table, key) {\r\n return new Promise(function (resolve, reject) {\r\n if (closed) {\r\n reject(new Error('Database has been closed'));\r\n return;\r\n }\r\n try {\r\n key = mongoifyKey(key);\r\n } catch (e) {\r\n reject(e);\r\n return;\r\n }\r\n\r\n const transaction = db.transaction(table);\r\n transaction.onerror = e => {\r\n // prevent throwing and aborting (hard)\r\n // https://bugzilla.mozilla.org/show_bug.cgi?id=872873\r\n e.preventDefault();\r\n reject(e);\r\n };\r\n transaction.onabort = e => reject(e);\r\n\r\n const store = transaction.objectStore(table);\r\n\r\n let req;\r\n try {\r\n req = store.get(key);\r\n } catch (err) {\r\n reject(err);\r\n }\r\n req.onsuccess = e => resolve(e.target.result);\r\n });\r\n };\r\n\r\n this.count = function (table, key) {\r\n return new Promise((resolve, reject) => {\r\n if (closed) {\r\n reject(new Error('Database has been closed'));\r\n return;\r\n }\r\n try {\r\n key = mongoifyKey(key);\r\n } catch (e) {\r\n reject(e);\r\n return;\r\n }\r\n\r\n const transaction = db.transaction(table);\r\n transaction.onerror = e => {\r\n // prevent throwing and aborting (hard)\r\n // https://bugzilla.mozilla.org/show_bug.cgi?id=872873\r\n e.preventDefault();\r\n reject(e);\r\n };\r\n transaction.onabort = e => reject(e);\r\n\r\n const store = transaction.objectStore(table);\r\n let req;\r\n try {\r\n req = key == null ? store.count() : store.count(key);\r\n } catch (err) {\r\n reject(err);\r\n }\r\n req.onsuccess = e => resolve(e.target.result);\r\n });\r\n };\r\n\r\n this.addEventListener = function (eventName, handler) {\r\n if (!serverEvents.includes(eventName)) {\r\n throw new Error('Unrecognized event type ' + eventName);\r\n }\r\n if (eventName === 'error') {\r\n db.addEventListener(eventName, function (e) {\r\n e.preventDefault(); // Needed by Firefox to prevent hard abort with ConstraintError\r\n handler(e);\r\n });\r\n return;\r\n }\r\n db.addEventListener(eventName, handler);\r\n };\r\n\r\n this.removeEventListener = function (eventName, handler) {\r\n if (!serverEvents.includes(eventName)) {\r\n throw new Error('Unrecognized event type ' + eventName);\r\n }\r\n db.removeEventListener(eventName, handler);\r\n };\r\n\r\n serverEvents.forEach(function (evName) {\r\n this[evName] = function (handler) {\r\n this.addEventListener(evName, handler);\r\n return this;\r\n };\r\n }, this);\r\n\r\n if (noServerMethods) {\r\n return;\r\n }\r\n\r\n let err;\r\n [].some.call(db.objectStoreNames, storeName => {\r\n if (this[storeName]) {\r\n err = new Error('The store name, \"' + storeName + '\", which you have attempted to load, conflicts with db.js method names.\"');\r\n this.close();\r\n return true;\r\n }\r\n this[storeName] = {};\r\n const keys = Object.keys(this);\r\n keys.filter(key => !(([...serverEvents, 'close', 'addEventListener', 'removeEventListener']).includes(key)))\r\n .map(key =>\r\n this[storeName][key] = (...args) => this[key](storeName, ...args)\r\n );\r\n });\r\n return err;\r\n };\r\n\r\n const createSchema = function (e, request, schema, db, server, version) {\r\n if (!schema || schema.length === 0) {\r\n return;\r\n }\r\n\r\n for (let i = 0; i < db.objectStoreNames.length; i++) {\r\n const name = db.objectStoreNames[i];\r\n if (!hasOwn.call(schema, name)) {\r\n // Errors for which we are not concerned and why:\r\n // `InvalidStateError` - We are in the upgrade transaction.\r\n // `TransactionInactiveError` (as by the upgrade having already\r\n // completed or somehow aborting) - since we've just started and\r\n // should be without risk in this loop\r\n // `NotFoundError` - since we are iterating the dynamically updated\r\n // `objectStoreNames`\r\n db.deleteObjectStore(name);\r\n }\r\n }\r\n\r\n let ret;\r\n Object.keys(schema).some(function (tableName) {\r\n const table = schema[tableName];\r\n let store;\r\n if (db.objectStoreNames.contains(tableName)) {\r\n store = request.transaction.objectStore(tableName); // Shouldn't throw\r\n } else {\r\n // Errors for which we are not concerned and why:\r\n // `InvalidStateError` - We are in the upgrade transaction.\r\n // `ConstraintError` - We are just starting (and probably never too large anyways) for a key generator.\r\n // `ConstraintError` - The above condition should prevent the name already existing.\r\n //\r\n // Possible errors:\r\n // `TransactionInactiveError` - if the upgrade had already aborted,\r\n // e.g., from a previous `QuotaExceededError` which is supposed to nevertheless return\r\n // the store but then abort the transaction.\r\n // `SyntaxError` - if an invalid `table.key.keyPath` is supplied.\r\n // `InvalidAccessError` - if `table.key.autoIncrement` is `true` and `table.key.keyPath` is an\r\n // empty string or any sequence (empty or otherwise).\r\n try {\r\n store = db.createObjectStore(tableName, table.key);\r\n } catch (err) {\r\n ret = err;\r\n return true;\r\n }\r\n }\r\n\r\n Object.keys(table.indexes || {}).some(function (indexKey) {\r\n try {\r\n store.index(indexKey);\r\n } catch (err) {\r\n let index = table.indexes[indexKey];\r\n index = index && typeof index === 'object' ? index : {};\r\n // Errors for which we are not concerned and why:\r\n // `InvalidStateError` - We are in the upgrade transaction and store found above should not have already been deleted.\r\n // `ConstraintError` - We have already tried getting the index, so it shouldn't already exist\r\n //\r\n // Possible errors:\r\n // `TransactionInactiveError` - if the upgrade had already aborted,\r\n // e.g., from a previous `QuotaExceededError` which is supposed to nevertheless return\r\n // the index object but then abort the transaction.\r\n // `SyntaxError` - If the `keyPath` (second argument) is an invalid key path\r\n // `InvalidAccessError` - If `multiEntry` on `index` is `true` and\r\n // `keyPath` (second argument) is a sequence\r\n try {\r\n store.createIndex(indexKey, index.keyPath || index.key || indexKey, index);\r\n } catch (err2) {\r\n ret = err2;\r\n return true;\r\n }\r\n }\r\n });\r\n });\r\n return ret;\r\n };\r\n\r\n const open = function (e, server, version, noServerMethods) {\r\n const db = e.target.result;\r\n dbCache[server][version] = db;\r\n\r\n const s = new Server(db, server, version, noServerMethods);\r\n return s instanceof Error ? Promise.reject(s) : Promise.resolve(s);\r\n };\r\n\r\n const db = {\r\n version: '0.15.0',\r\n open: function (options) {\r\n let server = options.server;\r\n let version = options.version || 1;\r\n let schema = options.schema;\r\n let noServerMethods = options.noServerMethods;\r\n\r\n if (!dbCache[server]) {\r\n dbCache[server] = {};\r\n }\r\n return new Promise(function (resolve, reject) {\r\n if (dbCache[server][version]) {\r\n open({\r\n target: {\r\n result: dbCache[server][version]\r\n }\r\n }, server, version, noServerMethods)\r\n .then(resolve, reject);\r\n } else {\r\n if (typeof schema === 'function') {\r\n try {\r\n schema = schema();\r\n } catch (e) {\r\n reject(e);\r\n return;\r\n }\r\n }\r\n const request = indexedDB.open(server, version);\r\n\r\n request.onsuccess = e => open(e, server, version, noServerMethods).then(resolve, reject);\r\n request.onerror = e => {\r\n // Prevent default for `BadVersion` and `AbortError` errors, etc.\r\n // These are not necessarily reported in console in Chrome but present; see\r\n // https://bugzilla.mozilla.org/show_bug.cgi?id=872873\r\n // http://stackoverflow.com/questions/36225779/aborterror-within-indexeddb-upgradeneeded-event/36266502\r\n e.preventDefault();\r\n reject(e);\r\n };\r\n request.onupgradeneeded = e => {\r\n let err = createSchema(e, request, schema, e.target.result, server, version);\r\n if (err) {\r\n reject(err);\r\n }\r\n };\r\n request.onblocked = e => {\r\n const resume = new Promise(function (res, rej) {\r\n // We overwrite handlers rather than make a new\r\n // open() since the original request is still\r\n // open and its onsuccess will still fire if\r\n // the user unblocks by closing the blocking\r\n // connection\r\n request.onsuccess = (ev) => {\r\n open(ev, server, version, noServerMethods)\r\n .then(res, rej);\r\n };\r\n request.onerror = e => rej(e);\r\n });\r\n e.resume = resume;\r\n reject(e);\r\n };\r\n }\r\n });\r\n },\r\n\r\n delete: function (dbName) {\r\n return new Promise(function (resolve, reject) {\r\n const request = indexedDB.deleteDatabase(dbName); // Does not throw\r\n\r\n request.onsuccess = e => resolve(e);\r\n request.onerror = e => reject(e); // No errors currently\r\n request.onblocked = e => {\r\n // The following addresses part of https://bugzilla.mozilla.org/show_bug.cgi?id=1220279\r\n e = e.newVersion === null || typeof Proxy === 'undefined' ? e : new Proxy(e, {get: function (target, name) {\r\n return name === 'newVersion' ? null : target[name];\r\n }});\r\n const resume = new Promise(function (res, rej) {\r\n // We overwrite handlers rather than make a new\r\n // delete() since the original request is still\r\n // open and its onsuccess will still fire if\r\n // the user unblocks by closing the blocking\r\n // connection\r\n request.onsuccess = ev => {\r\n // The following are needed currently by PhantomJS: https://github.com/ariya/phantomjs/issues/14141\r\n if (!('newVersion' in ev)) {\r\n ev.newVersion = e.newVersion;\r\n }\r\n\r\n if (!('oldVersion' in ev)) {\r\n ev.oldVersion = e.oldVersion;\r\n }\r\n\r\n res(ev);\r\n };\r\n request.onerror = e => rej(e);\r\n });\r\n e.resume = resume;\r\n reject(e);\r\n };\r\n });\r\n },\r\n\r\n cmp: function (param1, param2) {\r\n return new Promise(function (resolve, reject) {\r\n try {\r\n resolve(indexedDB.cmp(param1, param2));\r\n } catch (e) {\r\n reject(e);\r\n }\r\n });\r\n }\r\n };\r\n\r\n if (typeof module !== 'undefined' && typeof module.exports !== 'undefined') {\r\n module.exports = db;\r\n } else if (typeof define === 'function' && define.amd) {\r\n define(function () { return db; });\r\n } else {\r\n local.db = db;\r\n }\r\n}(self));\r\n"]} \ No newline at end of file +{"version":3,"sources":["../src/db.js"],"names":["local","IDBKeyRange","webkitIDBKeyRange","transactionModes","readonly","readwrite","hasOwn","Object","prototype","hasOwnProperty","defaultMapper","x","indexedDB","webkitIndexedDB","mozIndexedDB","oIndexedDB","msIndexedDB","shimIndexedDB","Error","dbCache","serverEvents","isObject","item","mongoDBToKeyRangeArgs","opts","keys","sort","length","key","val","name","inclusive","TypeError","y","pattern","join","mongoifyKey","type","args","IndexQuery","table","db","indexName","preexistingError","modifyObj","runQuery","cursorType","direction","limitRange","filters","mapper","Promise","resolve","reject","keyRange","e","results","counter","indexArgs","transaction","onerror","onabort","oncomplete","store","objectStore","index","push","modifyKeys","modifyRecord","record","forEach","onsuccess","cursor","target","result","advance","matchFilter","value","filter","err","update","continue","Query","queuedError","unique","error","execute","count","desc","distinct","limit","map","start","end","some","modify","prop","fn","arguments","range","query","all","Server","version","noServerMethods","closed","getIndexedDB","isClosed","add","records","reduce","aip","concat","preventDefault","req","call","keyPath","source","defineProperty","enumerable","put","remove","delete","clear","close","get","addEventListener","eventName","handler","includes","h","removeEventListener","evName","objectStoreNames","storeName","createSchema","request","schema","server","i","deleteObjectStore","ret","tableName","contains","createObjectStore","indexes","indexKey","createIndex","err2","open","s","options","then","onupgradeneeded","onblocked","resume","res","rej","ev","dbName","deleteDatabase","newVersion","Proxy","oldVersion","cmp","param1","param2","module","exports","define","amd","self","_typeof","_mongoDBToKeyRangeArg","_slicedToArray","_mongoDBToKeyRangeArg2","apply","_toConsumableArray","_this","this","undefined","_len","Array","_key","_len2","_key2","_this2","_len3","_key3","_open"],"mappings":"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","file":"db.min.js","sourcesContent":["(function (local) {\n 'use strict';\n\n const IDBKeyRange = local.IDBKeyRange || local.webkitIDBKeyRange;\n const transactionModes = {\n readonly: 'readonly',\n readwrite: 'readwrite'\n };\n const hasOwn = Object.prototype.hasOwnProperty;\n const defaultMapper = x => x;\n\n const indexedDB = local.indexedDB || local.webkitIndexedDB ||\n local.mozIndexedDB || local.oIndexedDB || local.msIndexedDB ||\n local.shimIndexedDB || (function () {\n throw new Error('IndexedDB required');\n }());\n\n const dbCache = {};\n const serverEvents = ['abort', 'error', 'versionchange'];\n\n function isObject (item) {\n return item && typeof item === 'object';\n }\n\n function mongoDBToKeyRangeArgs (opts) {\n const keys = Object.keys(opts).sort();\n if (keys.length === 1) {\n const key = keys[0];\n const val = opts[key];\n let name, inclusive;\n switch (key) {\n case 'eq': name = 'only'; break;\n case 'gt':\n name = 'lowerBound';\n inclusive = true;\n break;\n case 'lt':\n name = 'upperBound';\n inclusive = true;\n break;\n case 'gte': name = 'lowerBound'; break;\n case 'lte': name = 'upperBound'; break;\n default: throw new TypeError('`' + key + '` is not a valid key');\n }\n return [name, [val, inclusive]];\n }\n const x = opts[keys[0]];\n const y = opts[keys[1]];\n const pattern = keys.join('-');\n\n switch (pattern) {\n case 'gt-lt': case 'gt-lte': case 'gte-lt': case 'gte-lte':\n return ['bound', [x, y, keys[0] === 'gt', keys[1] === 'lt']];\n default: throw new TypeError(\n '`' + pattern + '` are conflicted keys'\n );\n }\n }\n function mongoifyKey (key) {\n if (key && typeof key === 'object' && !(key instanceof IDBKeyRange)) {\n let [type, args] = mongoDBToKeyRangeArgs(key);\n return IDBKeyRange[type](...args);\n }\n return key;\n }\n\n const IndexQuery = function (table, db, indexName, preexistingError) {\n let modifyObj = null;\n\n const runQuery = function (type, args, cursorType, direction, limitRange, filters, mapper) {\n return new Promise(function (resolve, reject) {\n let keyRange;\n try {\n keyRange = type ? IDBKeyRange[type](...args) : null;\n } catch (e) {\n reject(e);\n return;\n }\n filters = filters || [];\n limitRange = limitRange || null;\n\n let results = [];\n let counter = 0;\n const indexArgs = [keyRange];\n\n const transaction = db.transaction(table, modifyObj ? transactionModes.readwrite : transactionModes.readonly);\n transaction.onerror = e => reject(e);\n transaction.onabort = e => reject(e);\n transaction.oncomplete = () => resolve(results);\n\n const store = transaction.objectStore(table); // if bad, db.transaction will reject first\n const index = typeof indexName === 'string' ? store.index(indexName) : store;\n\n if (cursorType !== 'count') {\n indexArgs.push(direction || 'next');\n }\n\n // Create a function that will set in the modifyObj properties into\n // the passed record.\n const modifyKeys = modifyObj ? Object.keys(modifyObj) : [];\n\n const modifyRecord = function (record) {\n modifyKeys.forEach(key => {\n let val = modifyObj[key];\n if (typeof val === 'function') { val = val(record); }\n record[key] = val;\n });\n return record;\n };\n\n index[cursorType](...indexArgs).onsuccess = function (e) { // indexArgs are already validated\n const cursor = e.target.result;\n if (typeof cursor === 'number') {\n results = cursor;\n } else if (cursor) {\n if (limitRange !== null && limitRange[0] > counter) {\n counter = limitRange[0];\n cursor.advance(limitRange[0]); // Will throw on 0, but condition above prevents since counter always 0+\n } else if (limitRange !== null && counter >= (limitRange[0] + limitRange[1])) {\n // Out of limit range... skip\n } else {\n let matchFilter = true;\n let result = 'value' in cursor ? cursor.value : cursor.key;\n\n try {\n filters.forEach(function (filter) {\n if (typeof filter[0] === 'function') {\n matchFilter = matchFilter && filter[0](result);\n } else {\n matchFilter = matchFilter && (result[filter[0]] === filter[1]);\n }\n });\n } catch (err) { // Could be filter on non-object or error in filter function\n reject(err);\n return;\n }\n\n if (matchFilter) {\n counter++;\n // If we're doing a modify, run it now\n if (modifyObj) {\n try {\n result = modifyRecord(result);\n cursor.update(result); // `result` should only be a \"structured clone\"-able object\n } catch (err) {\n reject(err);\n return;\n }\n }\n try {\n results.push(mapper(result));\n } catch (err) {\n reject(err);\n return;\n }\n }\n cursor.continue();\n }\n }\n };\n });\n };\n\n const Query = function (type, args, queuedError) {\n const filters = [];\n let direction = 'next';\n let cursorType = 'openCursor';\n let limitRange = null;\n let mapper = defaultMapper;\n let unique = false;\n let error = preexistingError || queuedError;\n\n const execute = function () {\n if (error) {\n return Promise.reject(error);\n }\n return runQuery(type, args, cursorType, unique ? direction + 'unique' : direction, limitRange, filters, mapper);\n };\n\n const count = function () {\n direction = null;\n cursorType = 'count';\n\n return {\n execute\n };\n };\n\n const keys = function () {\n cursorType = 'openKeyCursor';\n\n return {\n desc,\n distinct,\n execute,\n filter,\n limit,\n map\n };\n };\n\n const limit = function (start, end) {\n limitRange = !end ? [0, start] : [start, end];\n error = limitRange.some(val => typeof val !== 'number') ? new Error('limit() arguments must be numeric') : error;\n\n return {\n desc,\n distinct,\n filter,\n keys,\n execute,\n map,\n modify\n };\n };\n\n const filter = function (prop, val) {\n filters.push([prop, val]);\n\n return {\n desc,\n distinct,\n execute,\n filter,\n keys,\n limit,\n map,\n modify\n };\n };\n\n const desc = function () {\n direction = 'prev';\n\n return {\n distinct,\n execute,\n filter,\n keys,\n limit,\n map,\n modify\n };\n };\n\n const distinct = function () {\n unique = true;\n return {\n count,\n desc,\n execute,\n filter,\n keys,\n limit,\n map,\n modify\n };\n };\n\n const modify = function (update) {\n modifyObj = update && typeof update === 'object' ? update : null;\n return {\n execute\n };\n };\n\n const map = function (fn) {\n mapper = fn;\n\n return {\n count,\n desc,\n distinct,\n execute,\n filter,\n keys,\n limit,\n modify\n };\n };\n\n return {\n count,\n desc,\n distinct,\n execute,\n filter,\n keys,\n limit,\n map,\n modify\n };\n };\n\n ['only', 'bound', 'upperBound', 'lowerBound'].forEach((name) => {\n this[name] = function () {\n return Query(name, arguments);\n };\n });\n\n this.range = function (opts) {\n let error;\n let keyRange = [null, null];\n try {\n keyRange = mongoDBToKeyRangeArgs(opts);\n } catch (e) {\n error = e;\n }\n return Query(...keyRange, error);\n };\n\n this.filter = function (...args) {\n const query = Query(null, null);\n return query.filter(...args);\n };\n\n this.all = function () {\n return this.filter();\n };\n };\n\n const Server = function (db, name, version, noServerMethods) {\n let closed = false;\n\n this.getIndexedDB = () => db;\n this.isClosed = () => closed;\n\n this.query = function (table, index) {\n const error = closed ? new Error('Database has been closed') : null;\n return new IndexQuery(table, db, index, error); // Does not throw by itself\n };\n\n this.add = function (table, ...args) {\n return new Promise(function (resolve, reject) {\n if (closed) {\n reject(new Error('Database has been closed'));\n return;\n }\n\n const records = args.reduce(function (records, aip) {\n return records.concat(aip);\n }, []);\n\n const transaction = db.transaction(table, transactionModes.readwrite);\n transaction.onerror = e => {\n // prevent throwing a ConstraintError and aborting (hard)\n // https://bugzilla.mozilla.org/show_bug.cgi?id=872873\n e.preventDefault();\n reject(e);\n };\n transaction.onabort = e => reject(e);\n transaction.oncomplete = () => resolve(records);\n\n const store = transaction.objectStore(table);\n records.some(function (record) {\n let req, key;\n if (isObject(record) && hasOwn.call(record, 'item')) {\n key = record.key;\n record = record.item;\n if (key != null) {\n try {\n key = mongoifyKey(key);\n } catch (e) {\n reject(e);\n return true;\n }\n }\n }\n\n try {\n // Safe to add since in readwrite\n if (key != null) {\n req = store.add(record, key);\n } else {\n req = store.add(record);\n }\n } catch (e) {\n reject(e);\n return true;\n }\n\n req.onsuccess = function (e) {\n if (!isObject(record)) {\n return;\n }\n const target = e.target;\n let keyPath = target.source.keyPath;\n if (keyPath === null) {\n keyPath = '__id__';\n }\n if (hasOwn.call(record, keyPath)) {\n return;\n }\n Object.defineProperty(record, keyPath, {\n value: target.result,\n enumerable: true\n });\n };\n });\n });\n };\n\n this.update = function (table, ...args) {\n return new Promise(function (resolve, reject) {\n if (closed) {\n reject(new Error('Database has been closed'));\n return;\n }\n\n const records = args.reduce(function (records, aip) {\n return records.concat(aip);\n }, []);\n\n const transaction = db.transaction(table, transactionModes.readwrite);\n transaction.onerror = e => {\n // prevent throwing aborting (hard)\n // https://bugzilla.mozilla.org/show_bug.cgi?id=872873\n e.preventDefault();\n reject(e);\n };\n transaction.onabort = e => reject(e);\n transaction.oncomplete = () => resolve(records);\n\n const store = transaction.objectStore(table);\n\n records.some(function (record) {\n let req, key;\n if (isObject(record) && hasOwn.call(record, 'item')) {\n key = record.key;\n record = record.item;\n if (key != null) {\n try {\n key = mongoifyKey(key);\n } catch (e) {\n reject(e);\n return true;\n }\n }\n }\n try {\n // These can throw DataError, e.g., if function passed in\n if (key != null) {\n req = store.put(record, key);\n } else {\n req = store.put(record);\n }\n } catch (err) {\n reject(err);\n return true;\n }\n\n req.onsuccess = function (e) {\n if (!isObject(record)) {\n return;\n }\n const target = e.target;\n let keyPath = target.source.keyPath;\n if (keyPath === null) {\n keyPath = '__id__';\n }\n if (hasOwn.call(record, keyPath)) {\n return;\n }\n Object.defineProperty(record, keyPath, {\n value: target.result,\n enumerable: true\n });\n };\n });\n });\n };\n\n this.put = function (...args) {\n return this.update(...args);\n };\n\n this.remove = function (table, key) {\n return new Promise(function (resolve, reject) {\n if (closed) {\n reject(new Error('Database has been closed'));\n return;\n }\n try {\n key = mongoifyKey(key);\n } catch (e) {\n reject(e);\n return;\n }\n\n const transaction = db.transaction(table, transactionModes.readwrite);\n transaction.onerror = e => {\n // prevent throwing and aborting (hard)\n // https://bugzilla.mozilla.org/show_bug.cgi?id=872873\n e.preventDefault();\n reject(e);\n };\n transaction.onabort = e => reject(e);\n transaction.oncomplete = () => resolve(key);\n\n const store = transaction.objectStore(table);\n try {\n store.delete(key);\n } catch (err) {\n reject(err);\n }\n });\n };\n\n this.delete = function (...args) {\n return this.remove(...args);\n };\n\n this.clear = function (table) {\n return new Promise(function (resolve, reject) {\n if (closed) {\n reject(new Error('Database has been closed'));\n return;\n }\n const transaction = db.transaction(table, transactionModes.readwrite);\n transaction.onerror = e => reject(e);\n transaction.onabort = e => reject(e);\n transaction.oncomplete = () => resolve();\n\n const store = transaction.objectStore(table);\n store.clear();\n });\n };\n\n this.close = function () {\n return new Promise(function (resolve, reject) {\n if (closed) {\n reject(new Error('Database has been closed'));\n return;\n }\n db.close();\n closed = true;\n delete dbCache[name][version];\n resolve();\n });\n };\n\n this.get = function (table, key) {\n return new Promise(function (resolve, reject) {\n if (closed) {\n reject(new Error('Database has been closed'));\n return;\n }\n try {\n key = mongoifyKey(key);\n } catch (e) {\n reject(e);\n return;\n }\n\n const transaction = db.transaction(table);\n transaction.onerror = e => {\n // prevent throwing and aborting (hard)\n // https://bugzilla.mozilla.org/show_bug.cgi?id=872873\n e.preventDefault();\n reject(e);\n };\n transaction.onabort = e => reject(e);\n\n const store = transaction.objectStore(table);\n\n let req;\n try {\n req = store.get(key);\n } catch (err) {\n reject(err);\n }\n req.onsuccess = e => resolve(e.target.result);\n });\n };\n\n this.count = function (table, key) {\n return new Promise((resolve, reject) => {\n if (closed) {\n reject(new Error('Database has been closed'));\n return;\n }\n try {\n key = mongoifyKey(key);\n } catch (e) {\n reject(e);\n return;\n }\n\n const transaction = db.transaction(table);\n transaction.onerror = e => {\n // prevent throwing and aborting (hard)\n // https://bugzilla.mozilla.org/show_bug.cgi?id=872873\n e.preventDefault();\n reject(e);\n };\n transaction.onabort = e => reject(e);\n\n const store = transaction.objectStore(table);\n let req;\n try {\n req = key == null ? store.count() : store.count(key);\n } catch (err) {\n reject(err);\n }\n req.onsuccess = e => resolve(e.target.result);\n });\n };\n\n this.addEventListener = function (eventName, handler) {\n if (!serverEvents.includes(eventName)) {\n throw new Error('Unrecognized event type ' + eventName);\n }\n if (eventName === 'error') {\n var h = function (e) {\n e.preventDefault(); // Needed by Firefox to prevent hard abort with ConstraintError\n handler(e);\n };\n // On Safari of iOS 8.* or 9.*, IDBDatabase doesn't have the method: addEventListener\n if (db.addEventListener) {\n db.addEventListener(eventName, h);\n } else {\n db['on' + eventName] = h;\n }\n return;\n }\n // On Safari of iOS 8.* or 9.*, IDBDatabase doesn't have the method: addEventListener\n if (db.addEventListener) {\n db.addEventListener(eventName, handler);\n } else {\n db['on' + eventName] = handler;\n }\n };\n\n this.removeEventListener = function (eventName, handler) {\n if (!serverEvents.includes(eventName)) {\n throw new Error('Unrecognized event type ' + eventName);\n }\n // On Safari of iOS 8.* or 9.*, IDBDatabase doesn't have the method: removeEventListener\n if (db.removeEventListener) {\n db.removeEventListener(eventName, handler);\n } else {\n db['on' + eventName] = null;\n }\n };\n\n serverEvents.forEach(function (evName) {\n this[evName] = function (handler) {\n this.addEventListener(evName, handler);\n return this;\n };\n }, this);\n\n if (noServerMethods) {\n return;\n }\n\n let err;\n [].some.call(db.objectStoreNames, storeName => {\n if (this[storeName]) {\n err = new Error('The store name, \"' + storeName + '\", which you have attempted to load, conflicts with db.js method names.\"');\n this.close();\n return true;\n }\n this[storeName] = {};\n const keys = Object.keys(this);\n keys.filter(key => !(([...serverEvents, 'close', 'addEventListener', 'removeEventListener']).includes(key)))\n .map(key =>\n this[storeName][key] = (...args) => this[key](storeName, ...args)\n );\n });\n return err;\n };\n\n const createSchema = function (e, request, schema, db, server, version) {\n if (!schema || schema.length === 0) {\n return;\n }\n\n for (let i = 0; i < db.objectStoreNames.length; i++) {\n const name = db.objectStoreNames[i];\n if (!hasOwn.call(schema, name)) {\n // Errors for which we are not concerned and why:\n // `InvalidStateError` - We are in the upgrade transaction.\n // `TransactionInactiveError` (as by the upgrade having already\n // completed or somehow aborting) - since we've just started and\n // should be without risk in this loop\n // `NotFoundError` - since we are iterating the dynamically updated\n // `objectStoreNames`\n db.deleteObjectStore(name);\n }\n }\n\n let ret;\n Object.keys(schema).some(function (tableName) {\n const table = schema[tableName];\n let store;\n if (db.objectStoreNames.contains(tableName)) {\n store = request.transaction.objectStore(tableName); // Shouldn't throw\n } else {\n // Errors for which we are not concerned and why:\n // `InvalidStateError` - We are in the upgrade transaction.\n // `ConstraintError` - We are just starting (and probably never too large anyways) for a key generator.\n // `ConstraintError` - The above condition should prevent the name already existing.\n //\n // Possible errors:\n // `TransactionInactiveError` - if the upgrade had already aborted,\n // e.g., from a previous `QuotaExceededError` which is supposed to nevertheless return\n // the store but then abort the transaction.\n // `SyntaxError` - if an invalid `table.key.keyPath` is supplied.\n // `InvalidAccessError` - if `table.key.autoIncrement` is `true` and `table.key.keyPath` is an\n // empty string or any sequence (empty or otherwise).\n try {\n store = db.createObjectStore(tableName, table.key);\n } catch (err) {\n ret = err;\n return true;\n }\n }\n\n Object.keys(table.indexes || {}).some(function (indexKey) {\n try {\n store.index(indexKey);\n } catch (err) {\n let index = table.indexes[indexKey];\n index = index && typeof index === 'object' ? index : {};\n // Errors for which we are not concerned and why:\n // `InvalidStateError` - We are in the upgrade transaction and store found above should not have already been deleted.\n // `ConstraintError` - We have already tried getting the index, so it shouldn't already exist\n //\n // Possible errors:\n // `TransactionInactiveError` - if the upgrade had already aborted,\n // e.g., from a previous `QuotaExceededError` which is supposed to nevertheless return\n // the index object but then abort the transaction.\n // `SyntaxError` - If the `keyPath` (second argument) is an invalid key path\n // `InvalidAccessError` - If `multiEntry` on `index` is `true` and\n // `keyPath` (second argument) is a sequence\n try {\n store.createIndex(indexKey, index.keyPath || index.key || indexKey, index);\n } catch (err2) {\n ret = err2;\n return true;\n }\n }\n });\n });\n return ret;\n };\n\n const open = function (e, server, version, noServerMethods) {\n const db = e.target.result;\n dbCache[server][version] = db;\n\n const s = new Server(db, server, version, noServerMethods);\n return s instanceof Error ? Promise.reject(s) : Promise.resolve(s);\n };\n\n const db = {\n version: '0.15.0',\n open: function (options) {\n let server = options.server;\n let version = options.version || 1;\n let schema = options.schema;\n let noServerMethods = options.noServerMethods;\n\n if (!dbCache[server]) {\n dbCache[server] = {};\n }\n return new Promise(function (resolve, reject) {\n if (dbCache[server][version]) {\n open({\n target: {\n result: dbCache[server][version]\n }\n }, server, version, noServerMethods)\n .then(resolve, reject);\n } else {\n if (typeof schema === 'function') {\n try {\n schema = schema();\n } catch (e) {\n reject(e);\n return;\n }\n }\n const request = indexedDB.open(server, version);\n\n request.onsuccess = e => open(e, server, version, noServerMethods).then(resolve, reject);\n request.onerror = e => {\n // Prevent default for `BadVersion` and `AbortError` errors, etc.\n // These are not necessarily reported in console in Chrome but present; see\n // https://bugzilla.mozilla.org/show_bug.cgi?id=872873\n // http://stackoverflow.com/questions/36225779/aborterror-within-indexeddb-upgradeneeded-event/36266502\n e.preventDefault();\n reject(e);\n };\n request.onupgradeneeded = e => {\n let err = createSchema(e, request, schema, e.target.result, server, version);\n if (err) {\n reject(err);\n }\n };\n request.onblocked = e => {\n const resume = new Promise(function (res, rej) {\n // We overwrite handlers rather than make a new\n // open() since the original request is still\n // open and its onsuccess will still fire if\n // the user unblocks by closing the blocking\n // connection\n request.onsuccess = (ev) => {\n open(ev, server, version, noServerMethods)\n .then(res, rej);\n };\n request.onerror = e => rej(e);\n });\n e.resume = resume;\n reject(e);\n };\n }\n });\n },\n\n delete: function (dbName) {\n return new Promise(function (resolve, reject) {\n const request = indexedDB.deleteDatabase(dbName); // Does not throw\n\n request.onsuccess = e => resolve(e);\n request.onerror = e => reject(e); // No errors currently\n request.onblocked = e => {\n // The following addresses part of https://bugzilla.mozilla.org/show_bug.cgi?id=1220279\n e = e.newVersion === null || typeof Proxy === 'undefined' ? e : new Proxy(e, {get: function (target, name) {\n return name === 'newVersion' ? null : target[name];\n }});\n const resume = new Promise(function (res, rej) {\n // We overwrite handlers rather than make a new\n // delete() since the original request is still\n // open and its onsuccess will still fire if\n // the user unblocks by closing the blocking\n // connection\n request.onsuccess = ev => {\n // The following are needed currently by PhantomJS: https://github.com/ariya/phantomjs/issues/14141\n if (!('newVersion' in ev)) {\n ev.newVersion = e.newVersion;\n }\n\n if (!('oldVersion' in ev)) {\n ev.oldVersion = e.oldVersion;\n }\n\n res(ev);\n };\n request.onerror = e => rej(e);\n });\n e.resume = resume;\n reject(e);\n };\n });\n },\n\n cmp: function (param1, param2) {\n return new Promise(function (resolve, reject) {\n try {\n resolve(indexedDB.cmp(param1, param2));\n } catch (e) {\n reject(e);\n }\n });\n }\n };\n\n if (typeof module !== 'undefined' && typeof module.exports !== 'undefined') {\n module.exports = db;\n } else if (typeof define === 'function' && define.amd) {\n define(function () { return db; });\n } else {\n local.db = db;\n }\n}(self));\n"]} \ No newline at end of file diff --git a/src/db.js b/src/db.js index 05e8e75..2f66337 100644 --- a/src/db.js +++ b/src/db.js @@ -611,20 +611,36 @@ throw new Error('Unrecognized event type ' + eventName); } if (eventName === 'error') { - db.addEventListener(eventName, function (e) { + var h = function (e) { e.preventDefault(); // Needed by Firefox to prevent hard abort with ConstraintError handler(e); - }); + }; + // On Safari of iOS 8.* or 9.*, IDBDatabase doesn't have the method: addEventListener + if (db.addEventListener) { + db.addEventListener(eventName, h); + } else { + db['on' + eventName] = h; + } return; } - db.addEventListener(eventName, handler); + // On Safari of iOS 8.* or 9.*, IDBDatabase doesn't have the method: addEventListener + if (db.addEventListener) { + db.addEventListener(eventName, handler); + } else { + db['on' + eventName] = handler; + } }; this.removeEventListener = function (eventName, handler) { if (!serverEvents.includes(eventName)) { throw new Error('Unrecognized event type ' + eventName); } - db.removeEventListener(eventName, handler); + // On Safari of iOS 8.* or 9.*, IDBDatabase doesn't have the method: removeEventListener + if (db.removeEventListener) { + db.removeEventListener(eventName, handler); + } else { + db['on' + eventName] = null; + } }; serverEvents.forEach(function (evName) { diff --git a/tests/test-worker.js.map b/tests/test-worker.js.map index cecd634..5b10cef 100644 --- a/tests/test-worker.js.map +++ b/tests/test-worker.js.map @@ -1 +1 @@ -{"version":3,"sources":["../src/test-worker.js"],"names":["importScripts","self","onmessage","e","dbName","data","msg","message","version","db","open","server","then","result","close","postMessage","ports"],"mappings":"cACA,WAEIA,cAAc,iDACdA,cAAc,mBACdC,KAAKC,UAAY,SAAUC,GACvB,GAAIC,GAASD,EAAEE,KAAKD,OAChBE,EAAMH,EAAEE,KAAKE,QACbC,EAAUL,EAAEE,KAAKG,OACrB,QAAQF,GACR,IAAK,kBACDG,GAAGC,MACCC,OAAQP,EACRI,QAASA,IACVI,KAAK,SAAUD,GACd,GAAIE,GAA2B,mBAAXF,EACpBA,GAAOG,QAFeC,YAGVF,IAEhB,MAVJ,KAWK,sBACDJ,GAAGC,MACCC,OAAQP,EACRI,QAASA,IACVI,KAAK,SAAUD,GACd,GAAIE,GAA2B,mBAAXF,EACpBA,GAAOG,QAFeX,EAGpBa,MAAM,GAAGD,YAAYF;;;AA1BvC,CAAC,YAAY;AACT,iBADS;;AAET,kBAAc,+CAAd,EAFS;AAGT,kBAAc,iBAAd,EAHS;AAIT,SAAK,SAAL,GAAiB,UAAU,CAAV,EAAa;AAC1B,YAAI,SAAS,EAAE,IAAF,CAAO,MAAP,CADa;AAE1B,YAAI,MAAM,EAAE,IAAF,CAAO,OAAP,CAFgB;AAG1B,YAAI,UAAU,EAAE,IAAF,CAAO,OAAP,CAHY;AAI1B,gBAAQ,GAAR;AACA,iBAAK,iBAAL;AACI,mBAAG,IAAH,CAAQ;AACJ,4BAAQ,MAAR;AACA,6BAAS,OAAT;iBAFJ,EAGG,IAHH,CAGQ,UAAU,MAAV,EAAkB;AACtB,wBAAI,SAAS,OAAO,MAAP,KAAkB,WAAlB,CADS;AAEtB,2BAAO,KAAP;AAFsB,+BAGtB,CAAY,MAAZ,EAHsB;iBAAlB,CAHR,CADJ;AASI,sBATJ;AADA,iBAWK,qBAAL;AACI,mBAAG,IAAH,CAAQ;AACJ,4BAAQ,MAAR;AACA,6BAAS,OAAT;iBAFJ,EAGG,IAHH,CAGQ,UAAU,MAAV,EAAkB;AACtB,wBAAI,SAAS,OAAO,MAAP,KAAkB,WAAlB,CADS;AAEtB,2BAAO,KAAP;AAFsB,qBAGtB,CAAE,KAAF,CAAQ,CAAR,EAAW,WAAX,CAAuB,MAAvB,EAHsB;iBAAlB,CAHR,CADJ;AASI,sBATJ;AAXA,SAJ0B;KAAb,CAJR;CAAZ,GAAD","file":"test-worker.js","sourcesContent":["/*global importScripts, db */\r\n(function () {\r\n 'use strict';\r\n importScripts('/node_modules/babel-polyfill/dist/polyfill.js');\r\n importScripts('/dist/db.min.js');\r\n self.onmessage = function (e) {\r\n var dbName = e.data.dbName;\r\n var msg = e.data.message;\r\n var version = e.data.version;\r\n switch (msg) {\r\n case 'web worker open':\r\n db.open({\r\n server: dbName,\r\n version: version\r\n }).then(function (server) {\r\n let result = typeof server !== 'undefined';\r\n server.close(); // Prevent subsequent blocking\r\n postMessage(result);\r\n });\r\n break;\r\n case 'service worker open':\r\n db.open({\r\n server: dbName,\r\n version: version\r\n }).then(function (server) {\r\n let result = typeof server !== 'undefined';\r\n server.close(); // Prevent subsequent blocking\r\n e.ports[0].postMessage(result);\r\n });\r\n break;\r\n }\r\n };\r\n}());\r\n"]} \ No newline at end of file +{"version":3,"sources":["../src/test-worker.js"],"names":["importScripts","self","onmessage","e","dbName","data","msg","message","version","db","open","server","then","result","close","postMessage","ports"],"mappings":"cACC,WAEGA,cAAc,iDACdA,cAAc,mBACdC,KAAKC,UAAY,SAAUC,GACvB,GAAIC,GAASD,EAAEE,KAAKD,OAChBE,EAAMH,EAAEE,KAAKE,QACbC,EAAUL,EAAEE,KAAKG,OACrB,QAAQF,GACR,IAAK,kBACDG,GAAGC,MACCC,OAAQP,EACRI,QAASA,IACVI,KAAK,SAAUD,GACd,GAAIE,GAA2B,mBAAXF,EACpBA,GAAOG,QACPC,YAAYF,IAEhB,MACJ,KAAK,sBACDJ,GAAGC,MACCC,OAAQP,EACRI,QAASA,IACVI,KAAK,SAAUD,GACd,GAAIE,GAA2B,mBAAXF,EACpBA,GAAOG,QACPX,EAAEa,MAAM,GAAGD,YAAYF;;AA3BvC;AACC,aAAY;AACT;;AACAb,kBAAc,+CAAd;AACAA,kBAAc,iBAAd;AACAC,SAAKC,SAAL,GAAiB,UAAUC,CAAV,EAAa;AAC1B,YAAIC,SAASD,EAAEE,IAAF,CAAOD,MAApB;AACA,YAAIE,MAAMH,EAAEE,IAAF,CAAOE,OAAjB;AACA,YAAIC,UAAUL,EAAEE,IAAF,CAAOG,OAArB;AACA,gBAAQF,GAAR;AACA,iBAAK,iBAAL;AACIG,mBAAGC,IAAH,CAAQ;AACJC,4BAAQP,MADJ;AAEJI,6BAASA;AAFL,iBAAR,EAGGI,IAHH,CAGQ,UAAUD,MAAV,EAAkB;AACtB,wBAAIE,SAAS,OAAOF,MAAP,KAAkB,WAA/B;AACAA,2BAAOG,KAAP,GAFsB,CAEN;AAChBC,gCAAYF,MAAZ;AACH,iBAPD;AAQA;AACJ,iBAAK,qBAAL;AACIJ,mBAAGC,IAAH,CAAQ;AACJC,4BAAQP,MADJ;AAEJI,6BAASA;AAFL,iBAAR,EAGGI,IAHH,CAGQ,UAAUD,MAAV,EAAkB;AACtB,wBAAIE,SAAS,OAAOF,MAAP,KAAkB,WAA/B;AACAA,2BAAOG,KAAP,GAFsB,CAEN;AAChBX,sBAAEa,KAAF,CAAQ,CAAR,EAAWD,WAAX,CAAuBF,MAAvB;AACH,iBAPD;AAQA;AApBJ;AAsBH,KA1BD;AA2BH,CA/BA,GAAD","file":"test-worker.js","sourcesContent":["/*global importScripts, db */\n(function () {\n 'use strict';\n importScripts('/node_modules/babel-polyfill/dist/polyfill.js');\n importScripts('/dist/db.min.js');\n self.onmessage = function (e) {\n var dbName = e.data.dbName;\n var msg = e.data.message;\n var version = e.data.version;\n switch (msg) {\n case 'web worker open':\n db.open({\n server: dbName,\n version: version\n }).then(function (server) {\n let result = typeof server !== 'undefined';\n server.close(); // Prevent subsequent blocking\n postMessage(result);\n });\n break;\n case 'service worker open':\n db.open({\n server: dbName,\n version: version\n }).then(function (server) {\n let result = typeof server !== 'undefined';\n server.close(); // Prevent subsequent blocking\n e.ports[0].postMessage(result);\n });\n break;\n }\n };\n}());\n"]} \ No newline at end of file