From 4b350860282bc6fe32c4a6dca2cbd7bc1c45f9e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Damir=20Jeli=C4=87?= Date: Wed, 11 Mar 2020 11:27:00 +0100 Subject: [PATCH] electron-main: Reindex the event index if it indicates that this is needed. --- src/electron-main.js | 41 ++++++++++++++++++++++++++++++++++------- 1 file changed, 34 insertions(+), 7 deletions(-) diff --git a/src/electron-main.js b/src/electron-main.js index 5fae176..33c6acf 100644 --- a/src/electron-main.js +++ b/src/electron-main.js @@ -43,10 +43,19 @@ const Store = require('electron-store'); const fs = require('fs'); const afs = fs.promises; -let Seshat = null; +let seshatSupported = false; +let Seshat; +let SeshatRecovery; +let ReindexError; + +const seshatPassphrase = "DEFAULT_PASSPHRASE"; try { - Seshat = require('matrix-seshat'); + seshatModule = require('matrix-seshat'); + Seshat = seshatModule.Seshat; + SeshatRecovery = seshatModule.SeshatRecovery; + ReindexError = seshatModule.ReindexError; + seshatSupported = true; } catch (e) { if (e.code === "MODULE_NOT_FOUND") { console.log("Seshat isn't installed, event indexing is disabled."); @@ -349,18 +358,36 @@ ipcMain.on('seshat', async function(ev, payload) { switch (payload.name) { case 'supportsEventIndexing': - if (Seshat === null) ret = false; - else ret = true; + ret = seshatSupported; break; case 'initEventIndex': if (eventIndex === null) { try { await afs.mkdir(eventStorePath, {recursive: true}); - eventIndex = new Seshat(eventStorePath, {passphrase: "DEFAULT_PASSPHRASE"}); + eventIndex = new Seshat(eventStorePath, {passphrase: seshatPassphrase}); } catch (e) { - sendError(payload.id, e); - return; + if (e instanceof ReindexError) { + // If this is a reindex error, the index schema + // changed. Try to open the database in recovery mode, + // reindex the database and finally try to open the + // database again. + try { + recoveryIndex = new SeshatRecovery(eventStorePath, { + passphrase: seshatPassphrase + }); + await recoveryIndex.reindex(); + eventIndex = new Seshat(eventStorePath, { + passphrase: seshatPassphrase + }); + } catch (e) { + sendError(payload.id, e); + return; + } + } else { + sendError(payload.id, e); + return; + } } } break;