Improve cold start performance

This commit is contained in:
Josh Perez 2021-03-04 16:44:57 -05:00 committed by Josh Perez
parent c73e35b1b6
commit d82ce07942
39 changed files with 911 additions and 628 deletions

53
main.js
View file

@ -19,6 +19,8 @@ const electron = require('electron');
const packageJson = require('./package.json');
const GlobalErrors = require('./app/global_errors');
const { setup: setupSpellChecker } = require('./app/spell_check');
const { redactAll } = require('./js/modules/privacy');
const removeUserConfig = require('./app/user_config').remove;
GlobalErrors.addHandler();
@ -30,6 +32,7 @@ const getRealPath = pify(fs.realpath);
const {
app,
BrowserWindow,
clipboard,
dialog,
ipcMain: ipc,
Menu,
@ -1058,12 +1061,37 @@ app.on('ready', async () => {
loadingWindow.loadURL(prepareURL([__dirname, 'loading.html']));
});
const success = await sqlInitPromise;
if (!success) {
try {
await sqlInitPromise;
} catch (error) {
console.log('sql.initialize was unsuccessful; returning early');
const buttonIndex = dialog.showMessageBoxSync({
buttons: [
locale.messages.copyErrorAndQuit.message,
locale.messages.deleteAndRestart.message,
],
defaultId: 0,
detail: redactAll(error.stack),
message: locale.messages.databaseError.message,
noLink: true,
type: 'error',
});
if (buttonIndex === 0) {
clipboard.writeText(
`Database startup error:\n\n${redactAll(error.stack)}`
);
} else {
await sql.removeDB();
removeUserConfig();
app.relaunch();
}
app.exit(1);
return;
}
// eslint-disable-next-line more/no-then
appStartInitialSpellcheckSetting = await getSpellCheckSetting();
await sqlChannels.initialize();
@ -1075,10 +1103,10 @@ app.on('ready', async () => {
await sql.removeIndexedDBFiles();
await sql.removeItemById(IDB_KEY);
}
} catch (error) {
} catch (err) {
console.log(
'(ready event handler) error deleting IndexedDB:',
error && error.stack ? error.stack : error
err && err.stack ? err.stack : err
);
}
@ -1113,10 +1141,10 @@ app.on('ready', async () => {
try {
await attachments.clearTempPath(userDataPath);
} catch (error) {
} catch (err) {
logger.error(
'main/ready: Error deleting temp dir:',
error && error.stack ? error.stack : error
err && err.stack ? err.stack : err
);
}
await attachmentChannel.initialize({
@ -1458,6 +1486,17 @@ ipc.on('locale-data', event => {
event.returnValue = locale.messages;
});
// Used once to initialize SQL in the renderer process
ipc.once('user-config-key', event => {
// eslint-disable-next-line no-param-reassign
event.returnValue = userConfig.get('key');
});
ipc.on('get-user-data-path', event => {
// eslint-disable-next-line no-param-reassign
event.returnValue = app.getPath('userData');
});
function getDataFromMainWindow(name, callback) {
ipc.once(`get-success-${name}`, (_event, error, value) =>
callback(error, value)