From e4f13ddae454bcc7b6c0eb00dcc373f458443247 Mon Sep 17 00:00:00 2001 From: Peng Xiao Date: Wed, 10 May 2023 13:40:22 +0800 Subject: [PATCH] fix: try to fix updater not working (#2294) Co-authored-by: Himself65 --- .../src/handlers/__tests__/handlers.spec.ts | 3 ++ .../layers/main/src/handlers/db/ensure-db.ts | 5 +++ .../layers/main/src/handlers/dialog/dialog.ts | 2 +- .../layers/main/src/handlers/register.ts | 2 + .../main/src/handlers/updater/updater.ts | 40 ++++++++++--------- .../layers/preload/src/affine-apis.ts | 4 ++ 6 files changed, 37 insertions(+), 19 deletions(-) diff --git a/apps/electron/layers/main/src/handlers/__tests__/handlers.spec.ts b/apps/electron/layers/main/src/handlers/__tests__/handlers.spec.ts index 2c27745244..cd761b6032 100644 --- a/apps/electron/layers/main/src/handlers/__tests__/handlers.spec.ts +++ b/apps/electron/layers/main/src/handlers/__tests__/handlers.spec.ts @@ -61,6 +61,9 @@ const ipcMain = { handlers.push(callback); registeredHandlers.set(key, handlers); }, + setMaxListeners: (_n: number) => { + // noop + }, }; const nativeTheme = { diff --git a/apps/electron/layers/main/src/handlers/db/ensure-db.ts b/apps/electron/layers/main/src/handlers/db/ensure-db.ts index 40747dc4d5..fd8b4f508c 100644 --- a/apps/electron/layers/main/src/handlers/db/ensure-db.ts +++ b/apps/electron/layers/main/src/handlers/db/ensure-db.ts @@ -1,4 +1,5 @@ import { watch } from 'chokidar'; +import { app } from 'electron'; import { appContext } from '../../context'; import { subjects } from '../../events'; @@ -87,3 +88,7 @@ export async function cleanupSQLiteDBs() { dbMapping.clear(); dbWatchers.clear(); } + +app?.on('before-quit', async () => { + await cleanupSQLiteDBs(); +}); diff --git a/apps/electron/layers/main/src/handlers/dialog/dialog.ts b/apps/electron/layers/main/src/handlers/dialog/dialog.ts index be48772d7e..360d92bf9e 100644 --- a/apps/electron/layers/main/src/handlers/dialog/dialog.ts +++ b/apps/electron/layers/main/src/handlers/dialog/dialog.ts @@ -15,7 +15,7 @@ import { listWorkspaces } from '../workspace/workspace'; export async function revealDBFile(workspaceId: string) { const workspaceDB = await ensureSQLiteDB(workspaceId); - shell.showItemInFolder(workspaceDB.path); + shell.showItemInFolder(await fs.realpath(workspaceDB.path)); } // provide a backdoor to set dialog path for testing in playwright diff --git a/apps/electron/layers/main/src/handlers/register.ts b/apps/electron/layers/main/src/handlers/register.ts index 744fb06465..94ba05d870 100644 --- a/apps/electron/layers/main/src/handlers/register.ts +++ b/apps/electron/layers/main/src/handlers/register.ts @@ -36,6 +36,8 @@ export const allHandlers = { } satisfies Record; export const registerHandlers = () => { + // TODO: listen to namespace instead of individual event types + ipcMain.setMaxListeners(100); for (const [namespace, namespaceHandlers] of Object.entries(allHandlers)) { for (const [key, handler] of Object.entries(namespaceHandlers)) { const chan = `${namespace}:${key}`; diff --git a/apps/electron/layers/main/src/handlers/updater/updater.ts b/apps/electron/layers/main/src/handlers/updater/updater.ts index fec28b5b7b..f1dc31cab2 100644 --- a/apps/electron/layers/main/src/handlers/updater/updater.ts +++ b/apps/electron/layers/main/src/handlers/updater/updater.ts @@ -18,15 +18,19 @@ export const registerUpdater = async () => { // require it will cause some side effects and will break generate-main-exposed-meta, // so we wrap it in a function // eslint-disable-next-line @typescript-eslint/no-var-requires - const { autoUpdater } = await import('electron-updater'); + const { autoUpdater } = require('electron-updater'); _autoUpdater = autoUpdater; - autoUpdater.autoDownload = false; - autoUpdater.allowPrerelease = buildType !== 'stable'; - autoUpdater.autoInstallOnAppQuit = false; - autoUpdater.autoRunAppAfterInstall = true; - autoUpdater.setFeedURL({ + if (!_autoUpdater) { + return; + } + + _autoUpdater.autoDownload = false; + _autoUpdater.allowPrerelease = buildType !== 'stable'; + _autoUpdater.autoInstallOnAppQuit = false; + _autoUpdater.autoRunAppAfterInstall = true; + _autoUpdater.setFeedURL({ channel: buildType, provider: 'github', repo: 'AFFiNE', @@ -34,11 +38,11 @@ export const registerUpdater = async () => { releaseType: buildType === 'stable' ? 'release' : 'prerelease', }); - autoUpdater.autoDownload = false; - autoUpdater.allowPrerelease = buildType !== 'stable'; - autoUpdater.autoInstallOnAppQuit = false; - autoUpdater.autoRunAppAfterInstall = true; - autoUpdater.setFeedURL({ + _autoUpdater.autoDownload = false; + _autoUpdater.allowPrerelease = buildType !== 'stable'; + _autoUpdater.autoInstallOnAppQuit = false; + _autoUpdater.autoRunAppAfterInstall = true; + _autoUpdater.setFeedURL({ channel: buildType, provider: 'github', repo: 'AFFiNE', @@ -47,23 +51,23 @@ export const registerUpdater = async () => { }); if (isMacOS()) { - autoUpdater.on('update-available', () => { - autoUpdater.downloadUpdate(); + _autoUpdater.on('update-available', () => { + _autoUpdater!.downloadUpdate(); logger.info('Update available, downloading...'); }); - autoUpdater.on('download-progress', e => { + _autoUpdater.on('download-progress', e => { logger.info(`Download progress: ${e.percent}`); }); - autoUpdater.on('update-downloaded', e => { + _autoUpdater.on('update-downloaded', e => { updaterSubjects.clientUpdateReady.next({ version: e.version, }); logger.info('Update downloaded, ready to install'); }); - autoUpdater.on('error', e => { + _autoUpdater.on('error', e => { logger.error('Error while updating client', e); }); - autoUpdater.forceDevUpdateConfig = isDev; - await autoUpdater.checkForUpdatesAndNotify(); + _autoUpdater.forceDevUpdateConfig = isDev; + await _autoUpdater.checkForUpdatesAndNotify(); } }; diff --git a/apps/electron/layers/preload/src/affine-apis.ts b/apps/electron/layers/preload/src/affine-apis.ts index 64250bd719..cdd604e520 100644 --- a/apps/electron/layers/preload/src/affine-apis.ts +++ b/apps/electron/layers/preload/src/affine-apis.ts @@ -57,6 +57,10 @@ const events: MainIPCEventMap = (() => { const { events: eventsMeta, }: MainExposedMeta = require('../main/exposed-meta'); + + // NOTE: ui may try to listen to a lot of the same events, so we increase the limit... + ipcRenderer.setMaxListeners(100); + const all = eventsMeta.map(([namespace, eventNames]) => { const namespaceEvents = eventNames.map(name => { const channel = `${namespace}:${name}`;