diff --git a/js/background.js b/js/background.js index 7eea361d97..c03ea25622 100644 --- a/js/background.js +++ b/js/background.js @@ -11,7 +11,8 @@ /* global Whisper: false */ /* global wrapDeferred: false */ -;(async function() { + +;(/* jshint ignore:start */ async /* jshint ignore:end */function() { 'use strict'; const { IdleDetector, MessageDataMigrator } = Signal.Workflow; @@ -85,14 +86,11 @@ console.log('Start IndexedDB migrations'); console.log('Migrate database with attachments'); - const closeDatabase = () => - Whisper.Database.close(); - await Migrations0DatabaseWithAttachmentData.run({ Backbone, closeDatabase }); + await Migrations0DatabaseWithAttachmentData.run({ Backbone }); console.log('Migrate database without attachments'); await Migrations1DatabaseWithoutAttachmentData.run({ Backbone, - closeDatabase, Database: Whisper.Database, }); diff --git a/js/modules/migrations/migrations_0_database_with_attachment_data.js b/js/modules/migrations/migrations_0_database_with_attachment_data.js index d26697b341..19b9d70630 100644 --- a/js/modules/migrations/migrations_0_database_with_attachment_data.js +++ b/js/modules/migrations/migrations_0_database_with_attachment_data.js @@ -145,5 +145,5 @@ const database = { migrations, }; -exports.run = ({ Backbone, closeDatabase } = {}) => - runMigrations({ Backbone, closeDatabase, database }); +exports.run = ({ Backbone } = {}) => + runMigrations({ Backbone, database }); diff --git a/js/modules/migrations/migrations_1_database_without_attachment_data.js b/js/modules/migrations/migrations_1_database_without_attachment_data.js index 46ca5aedda..04bacb8709 100644 --- a/js/modules/migrations/migrations_1_database_without_attachment_data.js +++ b/js/modules/migrations/migrations_1_database_without_attachment_data.js @@ -11,5 +11,5 @@ exports.migrations = [ }, ]; -exports.run = ({ Backbone, closeDatabase, Database } = {}) => - runMigrations({ Backbone, closeDatabase, database: Database }); +exports.run = ({ Backbone, Database } = {}) => + runMigrations({ Backbone, database: Database }); diff --git a/js/modules/migrations/run_migrations.js b/js/modules/migrations/run_migrations.js index 878ef3badd..7296debb6b 100644 --- a/js/modules/migrations/run_migrations.js +++ b/js/modules/migrations/run_migrations.js @@ -1,3 +1,5 @@ +/* eslint-env browser */ + const isFunction = require('lodash/isFunction'); const isObject = require('lodash/isObject'); const isString = require('lodash/isString'); @@ -5,16 +7,32 @@ const isString = require('lodash/isString'); const { deferredToPromise } = require('../deferred_to_promise'); -exports.runMigrations = async ({ Backbone, closeDatabase, database } = {}) => { +const closeDatabase = name => + new Promise((resolve, reject) => { + const request = window.indexedDB.open(name); + request.onblocked = () => { + reject(new Error(`Database '${name}' blocked`)); + }; + request.onupgradeneeded = (event) => { + reject(new Error('Unexpected database upgraded needed:' + + ` oldVersion: ${event.oldVersion}, newVersion: ${event.newVersion}`)); + }; + request.onerror = (event) => { + reject(event.target.error); + }; + request.onsuccess = (event) => { + const connection = event.target.result; + connection.close(); + resolve(); + }; + }); + +exports.runMigrations = async ({ Backbone, database } = {}) => { if (!isObject(Backbone) || !isObject(Backbone.Collection) || !isFunction(Backbone.Collection.extend)) { throw new TypeError('"Backbone" is required'); } - if (!isFunction(closeDatabase)) { - throw new TypeError('"closeDatabase" is required'); - } - if (!isObject(database) || !isString(database.id) || !Array.isArray(database.migrations)) { throw new TypeError('"database" is required'); @@ -26,6 +44,5 @@ exports.runMigrations = async ({ Backbone, closeDatabase, database } = {}) => { }))(); await deferredToPromise(migrationCollection.fetch()); - await closeDatabase(); - return; + await closeDatabase(database.id); };