|  |  |  | /* global indexedDB */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // Module for interacting with IndexedDB without Backbone IndexedDB adapter
 | 
					
						
							|  |  |  | // and using promises. Revisit use of `idb` dependency as it might cover
 | 
					
						
							|  |  |  | // this functionality.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | const { isObject, isNumber } = require('lodash'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | exports.open = (name, version, { onUpgradeNeeded } = {}) => { | 
					
						
							|  |  |  |   const request = indexedDB.open(name, version); | 
					
						
							|  |  |  |   return new Promise((resolve, reject) => { | 
					
						
							|  |  |  |     request.onblocked = () => reject(new Error('Database blocked')); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     request.onupgradeneeded = event => { | 
					
						
							|  |  |  |       const hasRequestedSpecificVersion = isNumber(version); | 
					
						
							|  |  |  |       if (!hasRequestedSpecificVersion) { | 
					
						
							|  |  |  |         return; | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       const { newVersion, oldVersion } = event; | 
					
						
							|  |  |  |       if (onUpgradeNeeded) { | 
					
						
							|  |  |  |         const { transaction } = event.target; | 
					
						
							|  |  |  |         onUpgradeNeeded({ oldVersion, transaction }); | 
					
						
							|  |  |  |         return; | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       reject( | 
					
						
							|  |  |  |         new Error( | 
					
						
							|  |  |  |           'Database upgrade required:' + | 
					
						
							|  |  |  |             ` oldVersion: ${oldVersion}, newVersion: ${newVersion}` | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  |       ); | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     request.onerror = event => reject(event.target.error); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     request.onsuccess = event => { | 
					
						
							|  |  |  |       const connection = event.target.result; | 
					
						
							|  |  |  |       resolve(connection); | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | exports.completeTransaction = transaction => | 
					
						
							|  |  |  |   new Promise((resolve, reject) => { | 
					
						
							|  |  |  |     transaction.addEventListener('abort', event => reject(event.target.error)); | 
					
						
							|  |  |  |     transaction.addEventListener('error', event => reject(event.target.error)); | 
					
						
							|  |  |  |     transaction.addEventListener('complete', () => resolve()); | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | exports.getVersion = async name => { | 
					
						
							|  |  |  |   const connection = await exports.open(name); | 
					
						
							|  |  |  |   const { version } = connection; | 
					
						
							|  |  |  |   connection.close(); | 
					
						
							|  |  |  |   return version; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | exports.getCount = async ({ store } = {}) => { | 
					
						
							|  |  |  |   if (!isObject(store)) { | 
					
						
							|  |  |  |     throw new TypeError("'store' is required"); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   const request = store.count(); | 
					
						
							|  |  |  |   return new Promise((resolve, reject) => { | 
					
						
							|  |  |  |     request.onerror = event => reject(event.target.error); | 
					
						
							|  |  |  |     request.onsuccess = event => resolve(event.target.result); | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | }; |