mirror of
https://github.com/clash-verge-rev/clash-verge-rev
synced 2025-05-05 04:53:44 +08:00
perf: optimize system proxy settings update logic
This commit is contained in:
parent
32b6821b8a
commit
dbfcc80afe
@ -40,6 +40,7 @@
|
|||||||
- 重构更新失败回退机制,使用后端完成更新失败后回退到使用 Clash 代理再次尝试更新
|
- 重构更新失败回退机制,使用后端完成更新失败后回退到使用 Clash 代理再次尝试更新
|
||||||
- 编辑非激活订阅的时候不在触发当前订阅配置重载
|
- 编辑非激活订阅的时候不在触发当前订阅配置重载
|
||||||
- 改进核心功能防止主进程阻塞、改进MihomoManager实现,以及优化窗口创建流程。减少应用程序可能出现的主进程卡死情况
|
- 改进核心功能防止主进程阻塞、改进MihomoManager实现,以及优化窗口创建流程。减少应用程序可能出现的主进程卡死情况
|
||||||
|
- 优化系统代理设置更新逻辑
|
||||||
|
|
||||||
## v2.2.3
|
## v2.2.3
|
||||||
|
|
||||||
|
@ -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">
|
||||||
|
Loading…
x
Reference in New Issue
Block a user