diff --git a/src/main/core/manager.ts b/src/main/core/manager.ts index 3c10b19..d6d29df 100644 --- a/src/main/core/manager.ts +++ b/src/main/core/manager.ts @@ -8,12 +8,7 @@ import { mihomoWorkDir } from '../utils/dirs' import { generateProfile } from './factory' -import { - getAppConfig, - getControledMihomoConfig, - patchAppConfig, - patchControledMihomoConfig -} from '../config' +import { getAppConfig, getControledMihomoConfig, patchAppConfig } from '../config' import { dialog, safeStorage } from 'electron' import { pauseWebsockets, startMihomoTraffic } from './mihomoApi' import chokidar from 'chokidar' @@ -28,8 +23,12 @@ chokidar console.log(event, path) }) .on('unlinkDir', async () => { - await stopCore(true) - await startCore() + try { + await stopCore(true) + await startCore() + } catch (e) { + dialog.showErrorBox('内核启动出错', `${e}`) + } }) let child: ChildProcess @@ -67,28 +66,28 @@ export async function startCore(): Promise { }) return new Promise((resolve, reject) => { child.stdout?.on('data', async (data) => { + await writeFile(logPath(), data, { flag: 'a' }) if (data.toString().includes('configure tun interface: operation not permitted')) { - await patchControledMihomoConfig({ tun: { enable: false } }) - mainWindow?.webContents.send('controledMihomoConfigUpdated') - dialog.showErrorBox('虚拟网卡启动失败', '请尝试手动授予内核权限') + reject('虚拟网卡启动失败, 请尝试手动授予内核权限') } if (data.toString().includes('External controller listen error')) { if (retry) { retry-- - resolve(await startCore()) + try { + resolve(await startCore()) + } catch (e) { + reject(e) + } } else { - dialog.showErrorBox('内核连接失败', '请尝试更改外部控制端口后重启内核') - await stopCore() - reject('External controller listen error') + reject('内核连接失败, 请尝试修改外部控制端口或重启电脑') } } - if (data.toString().includes('RESTful API listening at')) { + if (data.toString().includes('Start initial Compatible provider default')) { await startMihomoTraffic() mainWindow?.webContents.send('coreRestart') retry = 10 resolve() } - await writeFile(logPath(), data, { flag: 'a' }) }) }) } @@ -111,9 +110,13 @@ export async function stopCore(force = false): Promise { } export async function restartCore(): Promise { - const recover = pauseWebsockets() - await startCore() - recover() + try { + const recover = pauseWebsockets() + await startCore() + recover() + } catch (e) { + dialog.showErrorBox('内核启动出错', `${e}`) + } } async function checkProfile(): Promise { diff --git a/src/main/index.ts b/src/main/index.ts index 7b31b0b..5b60965 100644 --- a/src/main/index.ts +++ b/src/main/index.ts @@ -97,7 +97,7 @@ app.whenReady().then(async () => { await initProfileUpdater() }, 60000) } catch (e) { - dialog.showErrorBox('内核启动失败', `${e}`) + dialog.showErrorBox('内核启动出错', `${e}`) } // Default open or close DevTools by F12 in development diff --git a/src/main/resolve/server.ts b/src/main/resolve/server.ts index 85c4209..50aa452 100644 --- a/src/main/resolve/server.ts +++ b/src/main/resolve/server.ts @@ -10,7 +10,7 @@ function FindProxyForURL(url, host) { } ` -function findAvailablePort(startPort: number): Promise { +export function findAvailablePort(startPort: number): Promise { return new Promise((resolve, reject) => { const server = net.createServer() server.unref() diff --git a/src/renderer/src/hooks/use-rules.tsx b/src/renderer/src/hooks/use-rules.tsx index 208791e..638ea1a 100644 --- a/src/renderer/src/hooks/use-rules.tsx +++ b/src/renderer/src/hooks/use-rules.tsx @@ -8,22 +8,11 @@ interface RulesContextType { } const RulesContext = createContext(undefined) -let emptyRetry = 10 export const RulesProvider: React.FC<{ children: ReactNode }> = ({ children }) => { const { data: rules, mutate } = useSWR('mihomoRules', mihomoRules, { errorRetryInterval: 200, - errorRetryCount: 10, - onSuccess: (data) => { - if (data.rules.length === 0 && emptyRetry) { - emptyRetry-- - setTimeout(() => { - mutate() - }, 200) - } else { - emptyRetry = 10 - } - } + errorRetryCount: 10 }) React.useEffect(() => {