Close database after migration

This is not 100% reliable as database connections are closed in a separate
thread according to the documentation:
- https://developer.mozilla.org/en-US/docs/Web/API/IDBDatabase/close
- https://stackoverflow.com/a/18639298
- 80c7a06d5c/backbone-indexeddb.js (L558-L565)
This commit is contained in:
Daniel Gasienica 2018-03-26 15:34:36 -04:00
parent c765422fa1
commit fcd30cd919
4 changed files with 18 additions and 11 deletions

View file

@ -85,11 +85,14 @@
console.log('Start IndexedDB migrations');
console.log('Migrate database with attachments');
await Migrations0DatabaseWithAttachmentData.run({ Backbone });
const closeDatabase = () =>
Whisper.Database.close();
await Migrations0DatabaseWithAttachmentData.run({ Backbone, closeDatabase });
console.log('Migrate database without attachments');
await Migrations1DatabaseWithoutAttachmentData.run({
Backbone,
closeDatabase,
Database: Whisper.Database,
});

View file

@ -146,5 +146,5 @@ const database = {
migrations,
};
exports.run = ({ Backbone } = {}) =>
runMigrations({ Backbone, database });
exports.run = ({ Backbone, closeDatabase } = {}) =>
runMigrations({ Backbone, closeDatabase, database });

View file

@ -11,5 +11,5 @@ exports.migrations = [
},
];
exports.run = ({ Backbone, Database } = {}) =>
runMigrations({ Backbone, database: Database });
exports.run = ({ Backbone, closeDatabase, Database } = {}) =>
runMigrations({ Backbone, closeDatabase, database: Database });

View file

@ -2,13 +2,19 @@ const isFunction = require('lodash/isFunction');
const isObject = require('lodash/isObject');
const isString = require('lodash/isString');
const { deferredToPromise } = require('../deferred_to_promise');
exports.runMigrations = ({ Backbone, database } = {}) => {
exports.runMigrations = async ({ Backbone, closeDatabase, 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');
@ -19,9 +25,7 @@ exports.runMigrations = ({ Backbone, database } = {}) => {
storeName: 'items',
}))();
return new Promise((resolve) => {
// NOTE: This `then` refers to a jQuery `Deferred`:
// eslint-disable-next-line more/no-then
migrationCollection.fetch().then(() => resolve());
});
await deferredToPromise(migrationCollection.fetch());
await closeDatabase();
return;
};