From 818b546817ff15e1db51fa7718fbe4f6dff8e823 Mon Sep 17 00:00:00 2001 From: xmk23333 Date: Sun, 28 Dec 2025 19:36:01 +0800 Subject: [PATCH] fix: add config write queue and prevent ipc listener accumulation --- src/main/config/app.ts | 14 +++++++++----- src/main/config/override.ts | 8 ++++++-- src/main/config/profile.ts | 8 ++++++-- src/main/resolve/tray.ts | 4 ++++ 4 files changed, 25 insertions(+), 9 deletions(-) diff --git a/src/main/config/app.ts b/src/main/config/app.ts index 884b927..443c843 100644 --- a/src/main/config/app.ts +++ b/src/main/config/app.ts @@ -5,6 +5,7 @@ import { deepMerge } from '../utils/merge' import { defaultConfig } from '../utils/template' let appConfig: IAppConfig // config.yaml +let appConfigWriteQueue: Promise = Promise.resolve() export async function getAppConfig(force = false): Promise { if (force || !appConfig) { @@ -22,9 +23,12 @@ export async function getAppConfig(force = false): Promise { } export async function patchAppConfig(patch: Partial): Promise { - if (patch.nameserverPolicy) { - appConfig.nameserverPolicy = patch.nameserverPolicy - } - appConfig = deepMerge(appConfig, patch) - await writeFile(appConfigPath(), stringify(appConfig)) + appConfigWriteQueue = appConfigWriteQueue.then(async () => { + if (patch.nameserverPolicy) { + appConfig.nameserverPolicy = patch.nameserverPolicy + } + appConfig = deepMerge(appConfig, patch) + await writeFile(appConfigPath(), stringify(appConfig)) + }) + await appConfigWriteQueue } diff --git a/src/main/config/override.ts b/src/main/config/override.ts index 2180d2c..5112e68 100644 --- a/src/main/config/override.ts +++ b/src/main/config/override.ts @@ -6,6 +6,7 @@ import * as chromeRequest from '../utils/chromeRequest' import { parse, stringify } from '../utils/yaml' let overrideConfig: IOverrideConfig // override.yaml +let overrideConfigWriteQueue: Promise = Promise.resolve() export async function getOverrideConfig(force = false): Promise { if (force || !overrideConfig) { @@ -17,8 +18,11 @@ export async function getOverrideConfig(force = false): Promise } export async function setOverrideConfig(config: IOverrideConfig): Promise { - overrideConfig = config - await writeFile(overrideConfigPath(), stringify(overrideConfig), 'utf-8') + overrideConfigWriteQueue = overrideConfigWriteQueue.then(async () => { + overrideConfig = config + await writeFile(overrideConfigPath(), stringify(overrideConfig), 'utf-8') + }) + await overrideConfigWriteQueue } export async function getOverrideItem(id: string | undefined): Promise { diff --git a/src/main/config/profile.ts b/src/main/config/profile.ts index 1429c6e..f5b4eaa 100644 --- a/src/main/config/profile.ts +++ b/src/main/config/profile.ts @@ -16,6 +16,7 @@ import { mihomoUpgradeConfig } from '../core/mihomoApi' import i18next from 'i18next' let profileConfig: IProfileConfig // profile.yaml +let profileConfigWriteQueue: Promise = Promise.resolve() // 最终选中订阅ID let targetProfileId: string | null = null @@ -29,8 +30,11 @@ export async function getProfileConfig(force = false): Promise { } export async function setProfileConfig(config: IProfileConfig): Promise { - profileConfig = config - await writeFile(profileConfigPath(), stringify(config), 'utf-8') + profileConfigWriteQueue = profileConfigWriteQueue.then(async () => { + profileConfig = config + await writeFile(profileConfigPath(), stringify(config), 'utf-8') + }) + await profileConfigWriteQueue } export async function getProfileItem(id: string | undefined): Promise { diff --git a/src/main/resolve/tray.ts b/src/main/resolve/tray.ts index 9938b88..9369405 100644 --- a/src/main/resolve/tray.ts +++ b/src/main/resolve/tray.ts @@ -390,6 +390,8 @@ export async function createTray(): Promise { if (!useDockIcon) { hideDockIcon() } + // 移除旧监听器防止累积 + ipcMain.removeAllListeners('trayIconUpdate') ipcMain.on('trayIconUpdate', async (_, png: string) => { const image = nativeImage.createFromDataURL(png).resize({ height: 16 }) image.setTemplateImage(true) @@ -435,6 +437,8 @@ export async function createTray(): Promise { triggerMainWindow() } }) + // 移除旧监听器防止累积 + ipcMain.removeAllListeners('updateTrayMenu') ipcMain.on('updateTrayMenu', async () => { await updateTrayMenu() })