perf: optimize system proxy settings update logic

This commit is contained in:
wonfen 2025-04-30 23:09:19 +08:00
parent 32b6821b8a
commit dbfcc80afe
2 changed files with 75 additions and 63 deletions

View File

@ -40,6 +40,7 @@
- 重构更新失败回退机制,使用后端完成更新失败后回退到使用 Clash 代理再次尝试更新 - 重构更新失败回退机制,使用后端完成更新失败后回退到使用 Clash 代理再次尝试更新
- 编辑非激活订阅的时候不在触发当前订阅配置重载 - 编辑非激活订阅的时候不在触发当前订阅配置重载
- 改进核心功能防止主进程阻塞、改进MihomoManager实现以及优化窗口创建流程。减少应用程序可能出现的主进程卡死情况 - 改进核心功能防止主进程阻塞、改进MihomoManager实现以及优化窗口创建流程。减少应用程序可能出现的主进程卡死情况
- 优化系统代理设置更新逻辑
## v2.2.3 ## v2.2.3

View File

@ -17,6 +17,7 @@ import { EditRounded } from "@mui/icons-material";
import { import {
Autocomplete, Autocomplete,
Button, Button,
CircularProgress,
InputAdornment, InputAdornment,
List, List,
ListItem, ListItem,
@ -79,6 +80,7 @@ export const SysproxyViewer = forwardRef<DialogRef>((props, ref) => {
const [open, setOpen] = useState(false); const [open, setOpen] = useState(false);
const [editorOpen, setEditorOpen] = useState(false); const [editorOpen, setEditorOpen] = useState(false);
const [saving, setSaving] = useState(false);
const { verge, patchVerge } = useVerge(); const { verge, patchVerge } = useVerge();
const [hostOptions, setHostOptions] = useState<string[]>([]); const [hostOptions, setHostOptions] = useState<string[]>([]);
@ -224,80 +226,87 @@ export const SysproxyViewer = forwardRef<DialogRef>((props, ref) => {
return; return;
} }
const patch: Partial<IVergeConfig> = {}; setSaving(true);
if (value.guard !== enable_proxy_guard) {
patch.enable_proxy_guard = value.guard;
}
if (value.duration !== proxy_guard_duration) {
patch.proxy_guard_duration = value.duration;
}
if (value.bypass !== system_proxy_bypass) {
patch.system_proxy_bypass = value.bypass;
}
if (value.pac !== proxy_auto_config) {
patch.proxy_auto_config = value.pac;
}
if (value.use_default !== use_default_bypass) {
patch.use_default_bypass = value.use_default;
}
let pacContent = value.pac_content;
if (pacContent) {
pacContent = pacContent.replace(/%proxy_host%/g, value.proxy_host);
}
if (pacContent !== pac_file_content) {
patch.pac_file_content = pacContent;
}
// 处理IPv6地址如果是IPv6地址但没有被方括号包围则添加方括号
let proxyHost = value.proxy_host;
if (
ipv6Regex.test(proxyHost) &&
!proxyHost.startsWith("[") &&
!proxyHost.endsWith("]")
) {
proxyHost = `[${proxyHost}]`;
}
if (proxyHost !== proxy_host) {
patch.proxy_host = proxyHost;
}
try { try {
const patch: Partial<IVergeConfig> = {};
if (value.guard !== enable_proxy_guard) {
patch.enable_proxy_guard = value.guard;
}
if (value.duration !== proxy_guard_duration) {
patch.proxy_guard_duration = value.duration;
}
if (value.bypass !== system_proxy_bypass) {
patch.system_proxy_bypass = value.bypass;
}
if (value.pac !== proxy_auto_config) {
patch.proxy_auto_config = value.pac;
}
if (value.use_default !== use_default_bypass) {
patch.use_default_bypass = value.use_default;
}
let pacContent = value.pac_content;
if (pacContent) {
pacContent = pacContent.replace(/%proxy_host%/g, value.proxy_host);
}
if (pacContent !== pac_file_content) {
patch.pac_file_content = pacContent;
}
// 处理IPv6地址如果是IPv6地址但没有被方括号包围则添加方括号
let proxyHost = value.proxy_host;
if (
ipv6Regex.test(proxyHost) &&
!proxyHost.startsWith("[") &&
!proxyHost.endsWith("]")
) {
proxyHost = `[${proxyHost}]`;
}
if (proxyHost !== proxy_host) {
patch.proxy_host = proxyHost;
}
// 判断是否需要重置系统代理
const needResetProxy =
value.pac !== proxy_auto_config ||
proxyHost !== proxy_host ||
pacContent !== pac_file_content ||
value.bypass !== system_proxy_bypass ||
value.use_default !== use_default_bypass;
await patchVerge(patch); await patchVerge(patch);
// 更新系统代理状态以便UI立即反映变化 // 更新系统代理状态以便UI立即反映变化
await new Promise((resolve) => setTimeout(resolve, 100)); await Promise.all([mutate("getSystemProxy"), mutate("getAutotemProxy")]);
await mutate("getSystemProxy");
await mutate("getAutotemProxy");
// 如果系统代理当前已开启,则重新应用系统代理设置以便立即生效 // 只有在修改了影响系统代理的配置且系统代理当前启用时,才重置系统代理
const currentSysProxy = await getSystemProxy(); if (needResetProxy) {
const currentAutoProxy = await getAutotemProxy(); const currentSysProxy = await getSystemProxy();
const currentAutoProxy = await getAutotemProxy();
if (value.pac ? currentAutoProxy?.enable : currentSysProxy?.enable) {
// 如果系统代理已开启,则通过临时切换代理状态来触发系统代理重新应用
const currentState = enabled ?? false;
// 临时关闭系统代理 if (value.pac ? currentAutoProxy?.enable : currentSysProxy?.enable) {
await patchVergeConfig({ enable_system_proxy: false }); // 临时关闭系统代理
await patchVergeConfig({ enable_system_proxy: false });
// 等待一小段时间
await new Promise((resolve) => setTimeout(resolve, 300)); // 减少等待时间
await new Promise((resolve) => setTimeout(resolve, 200));
// 重新开启系统代理
await patchVergeConfig({ enable_system_proxy: currentState }); // 重新开启系统代理
await patchVergeConfig({ enable_system_proxy: true });
// 更新UI状态
await mutate("getSystemProxy"); // 更新UI状态
await mutate("getAutotemProxy"); await Promise.all([mutate("getSystemProxy"), mutate("getAutotemProxy")]);
}
} }
setOpen(false); setOpen(false);
} catch (err: any) { } catch (err: any) {
Notice.error(err.message || err.toString()); Notice.error(err.message || err.toString());
} finally {
setSaving(false);
} }
}); });
@ -311,6 +320,8 @@ export const SysproxyViewer = forwardRef<DialogRef>((props, ref) => {
onClose={() => setOpen(false)} onClose={() => setOpen(false)}
onCancel={() => setOpen(false)} onCancel={() => setOpen(false)}
onOk={onSave} onOk={onSave}
loading={saving}
disableOk={saving}
> >
<List> <List>
<BaseFieldset label={t("Current System Proxy")} padding="15px 10px"> <BaseFieldset label={t("Current System Proxy")} padding="15px 10px">