signal-desktop/js/modules/migrations/run_migrations.js
2018-04-02 12:17:36 -04:00

48 lines
1.4 KiB
JavaScript

/* eslint-env browser */
const isFunction = require('lodash/isFunction');
const isObject = require('lodash/isObject');
const isString = require('lodash/isString');
const { deferredToPromise } = require('../deferred_to_promise');
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 (!isObject(database) || !isString(database.id) ||
!Array.isArray(database.migrations)) {
throw new TypeError('"database" is required');
}
const migrationCollection = new (Backbone.Collection.extend({
database,
storeName: 'items',
}))();
await deferredToPromise(migrationCollection.fetch());
await closeDatabase(database.id);
};