refactor: invock mihomo api by use tauri-plugin-mihomo (#4926)

* feat: add tauri-plugin-mihomo

* refactor: invock mihomo api by use tauri-plugin-mihomo

* chore: todo

* chore: update

* chore: update

* chore: update

* chore: update

* fix: incorrect delay status and update pretty config

* chore: update

* chore: remove cache

* chore: update

* chore: update

* fix: app freezed when change group proxy

* chore: update

* chore: update

* chore: add rustfmt.toml to tauri-plugin-mihomo

* chore: happy clippy

* refactor: connect mihomo websocket

* chore: update

* chore: update

* fix: parse bigint to number

* chore: update

* Revert "fix: parse bigint to number"

This reverts commit 74c006522e23aa52cf8979a8fb47d2b1ae0bb043.

* chore: use number instead of bigint

* chore: cleanup

* fix: rule data not refresh when switch profile

* chore: update

* chore: cleanup

* chore: update

* fix: traffic graph data display

* feat: add ipc connection pool

* chore: update

* chore: clippy

* fix: incorrect delay status

* fix: typo

* fix: empty proxies tray menu

* chore: clippy

* chore: import tauri-plugin-mihomo by using git repo

* chore: cleanup

* fix: mihomo api

* fix: incorrect delay status

* chore: update tauri-plugin-mihomo dep

chore: update
This commit is contained in:
oomeow
2025-10-08 12:32:40 +08:00
committed by GitHub
parent 72aa56007c
commit 7fc238c27b
85 changed files with 1780 additions and 3344 deletions

View File

@@ -1,9 +1,9 @@
import { useState, useEffect, useRef, useCallback } from "react";
import useSWR from "swr";
import { useClashInfo } from "@/hooks/use-clash";
import { useVisibility } from "@/hooks/use-visibility";
import { getSystemMonitorOverviewSafe } from "@/services/cmds";
// import { useClashInfo } from "@/hooks/use-clash";
// import { useVisibility } from "@/hooks/use-visibility";
import { useTrafficData } from "./use-traffic-data";
// 增强的流量数据点接口
export interface ITrafficDataPoint {
@@ -175,14 +175,17 @@ class TrafficDataSampler {
// 全局单例
const refCounter = new ReferenceCounter();
let globalSampler: TrafficDataSampler | null = null;
let lastValidData: ISystemMonitorOverview | null = null;
// let lastValidData: ISystemMonitorOverview | null = null;
/**
* 增强的流量监控Hook - 支持数据压缩、采样和引用计数
*/
export const useTrafficMonitorEnhanced = () => {
const { clashInfo } = useClashInfo();
const pageVisible = useVisibility();
// const { clashInfo } = useClashInfo();
// const pageVisible = useVisibility();
const {
response: { data: traffic },
} = useTrafficData();
// 初始化采样器
if (!globalSampler) {
@@ -230,69 +233,87 @@ export const useTrafficMonitorEnhanced = () => {
refCounter.onCountChange(handleCountChange);
}, []);
// 只有在有引用时才启用SWR
const shouldFetch = clashInfo && pageVisible && refCounter.getCount() > 0;
// const monitorData = useRef<ISystemMonitorOverview | null>(null);
useEffect(() => {
if (globalSampler) {
// 添加到采样器
const timestamp = Date.now();
const dataPoint: ITrafficDataPoint = {
up: traffic?.up || 0,
down: traffic?.down || 0,
timestamp,
name: new Date(timestamp).toLocaleTimeString("en-US", {
hour12: false,
hour: "2-digit",
minute: "2-digit",
second: "2-digit",
}),
};
globalSampler.addDataPoint(dataPoint);
triggerUpdate();
}
}, [traffic, triggerUpdate]);
const { data: monitorData, error } = useSWR<ISystemMonitorOverview>(
shouldFetch ? "getSystemMonitorOverviewSafe" : null,
getSystemMonitorOverviewSafe,
{
refreshInterval: shouldFetch ? 1000 : 0, // 只有在需要时才刷新
keepPreviousData: true,
onSuccess: (data) => {
// console.log("[TrafficMonitorEnhanced] 获取到监控数据:", data);
// const { data: monitorData, error } = useSWR<ISystemMonitorOverview>(
// shouldFetch ? "getSystemMonitorOverviewSafe" : null,
// getSystemMonitorOverviewSafe,
// {
// refreshInterval: shouldFetch ? 1000 : 0, // 只有在需要时才刷新
// keepPreviousData: true,
// onSuccess: (data) => {
// // console.log("[TrafficMonitorEnhanced] 获取到监控数据:", data);
if (data?.traffic?.raw && globalSampler) {
// 保存最后有效数据
lastValidData = data;
// if (data?.traffic?.raw && globalSampler) {
// // 保存最后有效数据
// lastValidData = data;
// 添加到采样器
const timestamp = Date.now();
const dataPoint: ITrafficDataPoint = {
up: data.traffic.raw.up_rate || 0,
down: data.traffic.raw.down_rate || 0,
timestamp,
name: new Date(timestamp).toLocaleTimeString("en-US", {
hour12: false,
hour: "2-digit",
minute: "2-digit",
second: "2-digit",
}),
};
// // 添加到采样器
// const timestamp = Date.now();
// const dataPoint: ITrafficDataPoint = {
// up: data.traffic.raw.up_rate || 0,
// down: data.traffic.raw.down_rate || 0,
// timestamp,
// name: new Date(timestamp).toLocaleTimeString("en-US", {
// hour12: false,
// hour: "2-digit",
// minute: "2-digit",
// second: "2-digit",
// }),
// };
globalSampler.addDataPoint(dataPoint);
triggerUpdate();
}
},
onError: (error) => {
console.error(
"[TrafficMonitorEnhanced] 网络错误,使用最后有效数据. 错误详情:",
{
message: error?.message || "未知错误",
stack: error?.stack || "无堆栈信息",
},
);
// 网络错误时不清空数据,继续使用最后有效值
// 但是添加一个错误标记的数据点流量为0
if (globalSampler) {
const timestamp = Date.now();
const errorPoint: ITrafficDataPoint = {
up: 0,
down: 0,
timestamp,
name: new Date(timestamp).toLocaleTimeString("en-US", {
hour12: false,
hour: "2-digit",
minute: "2-digit",
second: "2-digit",
}),
};
globalSampler.addDataPoint(errorPoint);
triggerUpdate();
}
},
},
);
// globalSampler.addDataPoint(dataPoint);
// triggerUpdate();
// }
// },
// onError: (error) => {
// console.error(
// "[TrafficMonitorEnhanced] 网络错误,使用最后有效数据. 错误详情:",
// {
// message: error?.message || "未知错误",
// stack: error?.stack || "无堆栈信息",
// },
// );
// // 网络错误时不清空数据,继续使用最后有效值
// // 但是添加一个错误标记的数据点流量为0
// if (globalSampler) {
// const timestamp = Date.now();
// const errorPoint: ITrafficDataPoint = {
// up: 0,
// down: 0,
// timestamp,
// name: new Date(timestamp).toLocaleTimeString("en-US", {
// hour12: false,
// hour: "2-digit",
// minute: "2-digit",
// second: "2-digit",
// }),
// };
// globalSampler.addDataPoint(errorPoint);
// triggerUpdate();
// }
// },
// },
// );
// 获取指定时间范围的数据
const getDataForTimeRange = useCallback(
@@ -324,28 +345,28 @@ export const useTrafficMonitorEnhanced = () => {
}, []);
// 构建返回的监控数据优先使用当前数据fallback到最后有效数据
const currentData = monitorData || lastValidData;
const trafficMonitorData = {
traffic: currentData?.traffic || {
raw: { up: 0, down: 0, up_rate: 0, down_rate: 0 },
formatted: {
up_rate: "0B",
down_rate: "0B",
total_up: "0B",
total_down: "0B",
},
is_fresh: false,
},
memory: currentData?.memory || {
raw: { inuse: 0, oslimit: 0, usage_percent: 0 },
formatted: { inuse: "0B", oslimit: "0B", usage_percent: 0 },
is_fresh: false,
},
};
// const currentData = monitorData.current || lastValidData;
// const trafficMonitorData = {
// traffic: currentData?.traffic || {
// raw: { up: 0, down: 0, up_rate: 0, down_rate: 0 },
// formatted: {
// up_rate: "0B",
// down_rate: "0B",
// total_up: "0B",
// total_down: "0B",
// },
// is_fresh: false,
// },
// memory: currentData?.memory || {
// raw: { inuse: 0, oslimit: 0, usage_percent: 0 },
// formatted: { inuse: "0B", oslimit: "0B", usage_percent: 0 },
// is_fresh: false,
// },
// };
return {
// 监控数据
monitorData: trafficMonitorData,
// monitorData: trafficMonitorData,
// 图表数据管理
graphData: {
@@ -355,10 +376,9 @@ export const useTrafficMonitorEnhanced = () => {
},
// 状态信息
isLoading: !currentData && !error,
error,
isDataFresh: currentData?.traffic?.is_fresh || false,
hasValidData: !!lastValidData,
// isLoading: !currentData,
// isDataFresh: currentData?.traffic?.is_fresh || false,
// hasValidData: !!lastValidData,
// 性能统计
samplerStats: getSamplerStats(),
@@ -369,30 +389,28 @@ export const useTrafficMonitorEnhanced = () => {
/**
* 轻量级流量数据Hook
*/
export const useTrafficDataEnhanced = () => {
const { monitorData, isLoading, error, isDataFresh, hasValidData } =
useTrafficMonitorEnhanced();
// export const useTrafficDataEnhanced = () => {
// const { monitorData, isLoading, isDataFresh, hasValidData } =
// useTrafficMonitorEnhanced();
return {
traffic: monitorData.traffic,
memory: monitorData.memory,
isLoading,
error,
isDataFresh,
hasValidData,
};
};
// return {
// traffic: monitorData.traffic,
// memory: monitorData.memory,
// isLoading,
// isDataFresh,
// hasValidData,
// };
// };
/**
* 图表数据Hook
*/
export const useTrafficGraphDataEnhanced = () => {
const { graphData, isDataFresh, samplerStats, referenceCount } =
const { graphData, samplerStats, referenceCount } =
useTrafficMonitorEnhanced();
return {
...graphData,
isDataFresh,
samplerStats,
referenceCount,
};