fix(client): 补提交 stats-overhaul 漏掉的 account_api/kernel_process WIP
同 device_usage:account_api.dart(deviceUsage/usage 方法)、kernel_process.dart 及对应测试一直未提交,本地有→analyze/test 过,但不在 git→Windows 构建报 「deviceUsage isn't defined」。补齐使提交树自洽可构建。 孤儿组件 device_stat_row/metric_card 已无人引用,不提交。 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -195,6 +195,22 @@ class ClashApiClient {
|
||||
return data.cast<String, int>();
|
||||
}
|
||||
|
||||
// ── 工具:从 /proxies 响应提取 URLTest/Fallback 组名 ──────────
|
||||
static List<String> extractUrltestGroups(Map<String, dynamic> proxiesResponse) {
|
||||
final proxies = proxiesResponse['proxies'];
|
||||
if (proxies is! Map) return const [];
|
||||
final groups = <String>[];
|
||||
for (final entry in proxies.entries) {
|
||||
final p = entry.value;
|
||||
if (p is! Map) continue;
|
||||
final type = (p['type'] as String?) ?? '';
|
||||
if (type == 'URLTest' || type == 'Fallback') {
|
||||
if (entry.key is String) groups.add(entry.key as String);
|
||||
}
|
||||
}
|
||||
return groups;
|
||||
}
|
||||
|
||||
// ── 工具:从 /proxies 响应提取 URLTest 延迟列表 ──────────────
|
||||
// 扫描所有类型为 URLTest 的出口组,提取成员节点的最新 history delay。
|
||||
static List<UrltestResult> extractUrltestResults(
|
||||
@@ -312,6 +328,12 @@ class DesktopKernelProcess implements KernelProcess {
|
||||
// 最新 URLTest 延迟列表(每次 stats 轮询时更新)
|
||||
List<UrltestResult> _lastUrltestResults = const [];
|
||||
|
||||
// URLTest/Fallback 组名(从 /proxies 提取),供主动触发延迟探测。
|
||||
List<String> _urltestGroups = const [];
|
||||
// 轮询计数:每 _urlTestEvery 拍主动触发一次 group/delay(补偿 urltest 惰性探测)。
|
||||
int _pollTick = 0;
|
||||
static const int _urlTestEvery = 12;
|
||||
|
||||
final _statusCtrl = StreamController<VpnStatus>.broadcast();
|
||||
final _logCtrl = StreamController<String>.broadcast();
|
||||
final _statsCtrl = StreamController<VpnStatsEvent>.broadcast();
|
||||
@@ -525,6 +547,7 @@ class DesktopKernelProcess implements KernelProcess {
|
||||
final connFuture = _clashApi!.getConnections();
|
||||
final proxiesFuture = _clashApi!.getProxies().then((p) {
|
||||
_lastUrltestResults = ClashApiClient.extractUrltestResults(p);
|
||||
_urltestGroups = ClashApiClient.extractUrltestGroups(p);
|
||||
}).catchError((_) {
|
||||
// 读取失败静默跳过,保留上次缓存值
|
||||
});
|
||||
@@ -532,6 +555,16 @@ class DesktopKernelProcess implements KernelProcess {
|
||||
final data = await connFuture;
|
||||
await proxiesFuture; // 等 URLTest 解析完再组帧
|
||||
|
||||
// 周期主动触发 group/delay 探测:sing-box urltest 默认惰性探测,
|
||||
// 仅读 /proxies 缓存会长时间拿不到 history → 延迟空白。每 _urlTestEvery
|
||||
// 拍主动打一次,fire-and-forget(不阻塞主统计帧),下一拍即读到新 history。
|
||||
if ((_pollTick++ % _urlTestEvery) == 0) {
|
||||
for (final g in _urltestGroups) {
|
||||
unawaited(_clashApi!.getGroupDelay(g).catchError(
|
||||
(_) => <String, int>{}));
|
||||
}
|
||||
}
|
||||
|
||||
final downTotal =
|
||||
(data['downloadTotal'] as num?)?.toInt() ?? _prevDownTotal;
|
||||
final upTotal =
|
||||
|
||||
Reference in New Issue
Block a user