From f398e3564d14ba2445133b230ae2fed626dce0cb Mon Sep 17 00:00:00 2001 From: Faye Duxovni Date: Thu, 29 Sep 2022 16:25:19 -0400 Subject: [PATCH] Calculate IndexedDB versions automatically to reduce repeated information and possibilities for error (#2713) --- .../store/indexeddb-crypto-store-backend.ts | 63 +++++++++-------- src/store/indexeddb-local-backend.ts | 68 +++++++------------ 2 files changed, 57 insertions(+), 74 deletions(-) diff --git a/src/crypto/store/indexeddb-crypto-store-backend.ts b/src/crypto/store/indexeddb-crypto-store-backend.ts index 32539305d..51cd62a1e 100644 --- a/src/crypto/store/indexeddb-crypto-store-backend.ts +++ b/src/crypto/store/indexeddb-crypto-store-backend.ts @@ -34,7 +34,6 @@ import { IRoomEncryption } from "../RoomList"; import { InboundGroupSessionData } from "../OlmDevice"; import { IEncryptedPayload } from "../aes"; -export const VERSION = 11; const PROFILE_TRANSACTIONS = false; /** @@ -950,45 +949,34 @@ export class Backend implements CryptoStore { } } -export function upgradeDatabase(db: IDBDatabase, oldVersion: number): void { - logger.log( - `Upgrading IndexedDBCryptoStore from version ${oldVersion}` - + ` to ${VERSION}`, - ); - if (oldVersion < 1) { // The database did not previously exist. - createDatabase(db); - } - if (oldVersion < 2) { - db.createObjectStore("account"); - } - if (oldVersion < 3) { +type DbMigration = (db: IDBDatabase) => void; +const DB_MIGRATIONS: DbMigration[] = [ + (db) => { createDatabase(db); }, + (db) => { db.createObjectStore("account"); }, + (db) => { const sessionsStore = db.createObjectStore("sessions", { keyPath: ["deviceKey", "sessionId"], }); sessionsStore.createIndex("deviceKey", "deviceKey"); - } - if (oldVersion < 4) { + }, + (db) => { db.createObjectStore("inbound_group_sessions", { keyPath: ["senderCurve25519Key", "sessionId"], }); - } - if (oldVersion < 5) { - db.createObjectStore("device_data"); - } - if (oldVersion < 6) { - db.createObjectStore("rooms"); - } - if (oldVersion < 7) { + }, + (db) => { db.createObjectStore("device_data"); }, + (db) => { db.createObjectStore("rooms"); }, + (db) => { db.createObjectStore("sessions_needing_backup", { keyPath: ["senderCurve25519Key", "sessionId"], }); - } - if (oldVersion < 8) { + }, + (db) => { db.createObjectStore("inbound_group_sessions_withheld", { keyPath: ["senderCurve25519Key", "sessionId"], }); - } - if (oldVersion < 9) { + }, + (db) => { const problemsStore = db.createObjectStore("session_problems", { keyPath: ["deviceKey", "time"], }); @@ -997,18 +985,29 @@ export function upgradeDatabase(db: IDBDatabase, oldVersion: number): void { db.createObjectStore("notified_error_devices", { keyPath: ["userId", "deviceId"], }); - } - if (oldVersion < 10) { + }, + (db) => { db.createObjectStore("shared_history_inbound_group_sessions", { keyPath: ["roomId"], }); - } - if (oldVersion < 11) { + }, + (db) => { db.createObjectStore("parked_shared_history", { keyPath: ["roomId"], }); - } + }, // Expand as needed. +]; +export const VERSION = DB_MIGRATIONS.length; + +export function upgradeDatabase(db: IDBDatabase, oldVersion: number): void { + logger.log( + `Upgrading IndexedDBCryptoStore from version ${oldVersion}` + + ` to ${VERSION}`, + ); + DB_MIGRATIONS.forEach((migration, index) => { + if (oldVersion <= index) migration(db); + }); } function createDatabase(db: IDBDatabase): void { diff --git a/src/store/indexeddb-local-backend.ts b/src/store/indexeddb-local-backend.ts index 7e4bd7673..0ab50db35 100644 --- a/src/store/indexeddb-local-backend.ts +++ b/src/store/indexeddb-local-backend.ts @@ -23,36 +23,31 @@ import { ISavedSync } from "./index"; import { IIndexedDBBackend, UserTuple } from "./indexeddb-backend"; import { IndexedToDeviceBatch, ToDeviceBatchWithTxnId } from "../models/ToDeviceMessage"; -const VERSION = 4; +type DbMigration = (db: IDBDatabase) => void; +const DB_MIGRATIONS: DbMigration[] = [ + (db) => { + // Make user store, clobber based on user ID. (userId property of User objects) + db.createObjectStore("users", { keyPath: ["userId"] }); -function createDatabase(db: IDBDatabase): void { - // Make user store, clobber based on user ID. (userId property of User objects) - db.createObjectStore("users", { keyPath: ["userId"] }); + // Make account data store, clobber based on event type. + // (event.type property of MatrixEvent objects) + db.createObjectStore("accountData", { keyPath: ["type"] }); - // Make account data store, clobber based on event type. - // (event.type property of MatrixEvent objects) - db.createObjectStore("accountData", { keyPath: ["type"] }); - - // Make /sync store (sync tokens, room data, etc), always clobber (const key). - db.createObjectStore("sync", { keyPath: ["clobber"] }); -} - -function upgradeSchemaV2(db: IDBDatabase): void { - const oobMembersStore = db.createObjectStore( - "oob_membership_events", { - keyPath: ["room_id", "state_key"], - }); - oobMembersStore.createIndex("room", "room_id"); -} - -function upgradeSchemaV3(db: IDBDatabase): void { - db.createObjectStore("client_options", - { keyPath: ["clobber"] }); -} - -function upgradeSchemaV4(db: IDBDatabase): void { - db.createObjectStore("to_device_queue", { autoIncrement: true }); -} + // Make /sync store (sync tokens, room data, etc), always clobber (const key). + db.createObjectStore("sync", { keyPath: ["clobber"] }); + }, + (db) => { + const oobMembersStore = db.createObjectStore( + "oob_membership_events", { + keyPath: ["room_id", "state_key"], + }); + oobMembersStore.createIndex("room", "room_id"); + }, + (db) => { db.createObjectStore("client_options", { keyPath: ["clobber"] }); }, + (db) => { db.createObjectStore("to_device_queue", { autoIncrement: true }); }, + // Expand as needed. +]; +const VERSION = DB_MIGRATIONS.length; /** * Helper method to collect results from a Cursor and promiseify it. @@ -172,20 +167,9 @@ export class LocalIndexedDBStoreBackend implements IIndexedDBBackend { logger.log( `LocalIndexedDBStoreBackend.connect: upgrading from ${oldVersion}`, ); - if (oldVersion < 1) { // The database did not previously exist. - this._isNewlyCreated = true; - createDatabase(db); - } - if (oldVersion < 2) { - upgradeSchemaV2(db); - } - if (oldVersion < 3) { - upgradeSchemaV3(db); - } - if (oldVersion < 4) { - upgradeSchemaV4(db); - } - // Expand as needed. + DB_MIGRATIONS.forEach((migration, index) => { + if (oldVersion <= index) migration(db); + }); }; req.onblocked = () => {