You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
	
	
		
			69 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			JavaScript
		
	
			
		
		
	
	
			69 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			JavaScript
		
	
| /* 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);
 | |
|   });
 | |
| };
 |