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 代理再次尝试更新
- 编辑非激活订阅的时候不在触发当前订阅配置重载
- 改进核心功能防止主进程阻塞、改进MihomoManager实现以及优化窗口创建流程。减少应用程序可能出现的主进程卡死情况
- 优化系统代理设置更新逻辑
## v2.2.3

View File

@ -17,6 +17,7 @@ import { EditRounded } from "@mui/icons-material";
import {
Autocomplete,
Button,
CircularProgress,
InputAdornment,
List,
ListItem,
@ -79,6 +80,7 @@ export const SysproxyViewer = forwardRef<DialogRef>((props, ref) => {
const [open, setOpen] = useState(false);
const [editorOpen, setEditorOpen] = useState(false);
const [saving, setSaving] = useState(false);
const { verge, patchVerge } = useVerge();
const [hostOptions, setHostOptions] = useState<string[]>([]);
@ -224,80 +226,87 @@ export const SysproxyViewer = forwardRef<DialogRef>((props, ref) => {
return;
}
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;
}
setSaving(true);
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);
// 更新系统代理状态以便UI立即反映变化
await new Promise((resolve) => setTimeout(resolve, 100));
await mutate("getSystemProxy");
await mutate("getAutotemProxy");
await Promise.all([mutate("getSystemProxy"), mutate("getAutotemProxy")]);
// 如果系统代理当前已开启,则重新应用系统代理设置以便立即生效
const currentSysProxy = await getSystemProxy();
const currentAutoProxy = await getAutotemProxy();
// 只有在修改了影响系统代理的配置且系统代理当前启用时,才重置系统代理
if (needResetProxy) {
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, 200));
// 等待一小段时间
await new Promise((resolve) => setTimeout(resolve, 300));
// 重新开启系统代理
await patchVergeConfig({ enable_system_proxy: true });
// 重新开启系统代理
await patchVergeConfig({ enable_system_proxy: currentState });
// 更新UI状态
await mutate("getSystemProxy");
await mutate("getAutotemProxy");
// 更新UI状态
await Promise.all([mutate("getSystemProxy"), mutate("getAutotemProxy")]);
}
}
setOpen(false);
} catch (err: any) {
Notice.error(err.message || err.toString());
} finally {
setSaving(false);
}
});
@ -311,6 +320,8 @@ export const SysproxyViewer = forwardRef<DialogRef>((props, ref) => {
onClose={() => setOpen(false)}
onCancel={() => setOpen(false)}
onOk={onSave}
loading={saving}
disableOk={saving}
>
<List>
<BaseFieldset label={t("Current System Proxy")} padding="15px 10px">