Compare commits

...

3 Commits

4 changed files with 39 additions and 15 deletions

View File

@ -7,5 +7,6 @@
},
"[json]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
}
},
"terminal.integrated.defaultProfile.windows": "PowerShell"
}

View File

@ -48,8 +48,8 @@ export async function addOverrideItem(item: Partial<IOverrideItem>): Promise<voi
await updateOverrideItem(newItem)
} else {
config.items.push(newItem)
await setOverrideConfig(config)
}
await setOverrideConfig(config)
}
export async function removeOverrideItem(id: string): Promise<void> {

View File

@ -134,7 +134,7 @@ interface CoreConfig {
}
// 准备核心配置
async function prepareCore(detached: boolean): Promise<CoreConfig> {
async function prepareCore(detached: boolean, skipStop = false): Promise<CoreConfig> {
const [appConfig, mihomoConfig] = await Promise.all([
getAppConfig(),
getControledMihomoConfig()
@ -144,8 +144,7 @@ async function prepareCore(detached: boolean): Promise<CoreConfig> {
core = 'mihomo',
autoSetDNS = true,
diffWorkDir = false,
mihomoCpuPriority = 'PRIORITY_NORMAL',
testProfileOnStart = true
mihomoCpuPriority = 'PRIORITY_NORMAL'
} = appConfig
const { 'log-level': logLevel = 'info' as LogLevel, tun } = mihomoConfig
@ -168,10 +167,10 @@ async function prepareCore(detached: boolean): Promise<CoreConfig> {
// generateProfile 返回实际使用的 current
const current = await generateProfile()
if (testProfileOnStart) {
await checkProfile(current, core, diffWorkDir)
await checkProfile(current, core, diffWorkDir)
if (!skipStop) {
await stopCore()
}
await stopCore()
await cleanupSocketFile()
// 设置 DNS
@ -323,8 +322,8 @@ function setupCoreListeners(
}
// 启动核心
export async function startCore(detached = false): Promise<Promise<void>[]> {
const config = await prepareCore(detached)
export async function startCore(detached = false, skipStop = false): Promise<Promise<void>[]> {
const config = await prepareCore(detached, skipStop)
child = spawnCoreProcess(config)
if (detached) {
@ -377,11 +376,34 @@ export async function restartCore(): Promise<void> {
}
isRestarting = true
let retryCount = 0
const maxRetries = 3
try {
await startCore()
} catch (e) {
managerLogger.error('restart core failed', e)
throw e
// 先显式停止核心,确保状态干净
await stopCore()
// 尝试启动核心,失败时重试
while (retryCount < maxRetries) {
try {
// skipStop=true 因为我们已经在上面停止了核心
await startCore(false, true)
return // 成功启动,退出函数
} catch (e) {
retryCount++
managerLogger.error(`restart core failed (attempt ${retryCount}/${maxRetries})`, e)
if (retryCount >= maxRetries) {
throw e
}
// 重试前等待一段时间
await new Promise((resolve) => setTimeout(resolve, 1000 * retryCount))
// 确保清理干净再重试
await stopCore()
await cleanupSocketFile()
}
}
} finally {
isRestarting = false
}

View File

@ -76,6 +76,7 @@ async function createFloatingWindow(): Promise<void> {
})
// IPC 监听器
ipcMain.removeAllListeners('updateFloatingWindow')
ipcMain.on('updateFloatingWindow', () => {
if (floatingWindow) {
floatingWindow.webContents.send('controledMihomoConfigUpdated')
@ -130,8 +131,8 @@ export async function triggerFloatingWindow(): Promise<void> {
export async function closeFloatingWindow(): Promise<void> {
if (floatingWindow) {
ipcMain.removeAllListeners('updateFloatingWindow')
floatingWindow.close()
floatingWindow.destroy()
floatingWindow = null
}
await showTrayIcon()