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.
		
		
		
		
		
			
		
			
				
	
	
		
			83 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			JavaScript
		
	
			
		
		
	
	
			83 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			JavaScript
		
	
| const { isObject, isString } = require('lodash');
 | |
| 
 | |
| const ITEMS_STORE_NAME = 'items';
 | |
| const LAST_PROCESSED_INDEX_KEY = 'attachmentMigration_lastProcessedIndex';
 | |
| const IS_MIGRATION_COMPLETE_KEY = 'attachmentMigration_isComplete';
 | |
| 
 | |
| // Public API
 | |
| exports.READ_RECEIPT_CONFIGURATION_SYNC = 'read-receipt-configuration-sync';
 | |
| 
 | |
| exports.getAttachmentMigrationLastProcessedIndex = connection =>
 | |
|   exports._getItem(connection, LAST_PROCESSED_INDEX_KEY);
 | |
| 
 | |
| exports.setAttachmentMigrationLastProcessedIndex = (connection, value) =>
 | |
|   exports._setItem(connection, LAST_PROCESSED_INDEX_KEY, value);
 | |
| 
 | |
| exports.deleteAttachmentMigrationLastProcessedIndex = connection =>
 | |
|   exports._deleteItem(connection, LAST_PROCESSED_INDEX_KEY);
 | |
| 
 | |
| exports.isAttachmentMigrationComplete = async connection =>
 | |
|   Boolean(await exports._getItem(connection, IS_MIGRATION_COMPLETE_KEY));
 | |
| 
 | |
| exports.markAttachmentMigrationComplete = connection =>
 | |
|   exports._setItem(connection, IS_MIGRATION_COMPLETE_KEY, true);
 | |
| 
 | |
| // Private API
 | |
| exports._getItem = (connection, key) => {
 | |
|   if (!isObject(connection)) {
 | |
|     throw new TypeError("'connection' is required");
 | |
|   }
 | |
| 
 | |
|   if (!isString(key)) {
 | |
|     throw new TypeError("'key' must be a string");
 | |
|   }
 | |
| 
 | |
|   const transaction = connection.transaction(ITEMS_STORE_NAME, 'readonly');
 | |
|   const itemsStore = transaction.objectStore(ITEMS_STORE_NAME);
 | |
|   const request = itemsStore.get(key);
 | |
|   return new Promise((resolve, reject) => {
 | |
|     request.onerror = event => reject(event.target.error);
 | |
| 
 | |
|     request.onsuccess = event =>
 | |
|       resolve(event.target.result ? event.target.result.value : null);
 | |
|   });
 | |
| };
 | |
| 
 | |
| exports._setItem = (connection, key, value) => {
 | |
|   if (!isObject(connection)) {
 | |
|     throw new TypeError("'connection' is required");
 | |
|   }
 | |
| 
 | |
|   if (!isString(key)) {
 | |
|     throw new TypeError("'key' must be a string");
 | |
|   }
 | |
| 
 | |
|   const transaction = connection.transaction(ITEMS_STORE_NAME, 'readwrite');
 | |
|   const itemsStore = transaction.objectStore(ITEMS_STORE_NAME);
 | |
|   const request = itemsStore.put({ id: key, value }, key);
 | |
|   return new Promise((resolve, reject) => {
 | |
|     request.onerror = event => reject(event.target.error);
 | |
| 
 | |
|     request.onsuccess = () => resolve();
 | |
|   });
 | |
| };
 | |
| 
 | |
| exports._deleteItem = (connection, key) => {
 | |
|   if (!isObject(connection)) {
 | |
|     throw new TypeError("'connection' is required");
 | |
|   }
 | |
| 
 | |
|   if (!isString(key)) {
 | |
|     throw new TypeError("'key' must be a string");
 | |
|   }
 | |
| 
 | |
|   const transaction = connection.transaction(ITEMS_STORE_NAME, 'readwrite');
 | |
|   const itemsStore = transaction.objectStore(ITEMS_STORE_NAME);
 | |
|   const request = itemsStore.delete(key);
 | |
|   return new Promise((resolve, reject) => {
 | |
|     request.onerror = event => reject(event.target.error);
 | |
| 
 | |
|     request.onsuccess = () => resolve();
 | |
|   });
 | |
| };
 |