const Message = require('../../types/message'); exports.run = async (transaction) => { const messagesStore = transaction.objectStore('messages'); console.log('Initialize messages schema version'); const numUpgradedMessages = await _initializeMessageSchemaVersion(messagesStore); console.log('Complete messages schema version initialization', { numUpgradedMessages }); console.log('Create index from attachment schema version to attachment'); messagesStore.createIndex('schemaVersion', 'schemaVersion', { unique: false }); }; const _initializeMessageSchemaVersion = messagesStore => new Promise((resolve, reject) => { const messagePutOperations = []; const cursorRequest = messagesStore.openCursor(); cursorRequest.onsuccess = async (event) => { const cursor = event.target.result; const hasMoreData = Boolean(cursor); if (!hasMoreData) { await Promise.all(messagePutOperations); return resolve(messagePutOperations.length); } const message = cursor.value; const messageWithSchemaVersion = Message.initializeSchemaVersion(message); messagePutOperations.push(putItem( messagesStore, messageWithSchemaVersion, messageWithSchemaVersion.id )); return cursor.continue(); }; cursorRequest.onerror = event => reject(event.target.error); }); // putItem :: IDBObjectStore -> Item -> Key -> Promise Item const putItem = (store, item, key) => new Promise((resolve, reject) => { try { const request = store.put(item, key); request.onsuccess = event => resolve(event.target.result); request.onerror = event => reject(event.target.error); } catch (error) { reject(error); } });