From 5ba8b7bffa3eb8bf584e66b184990051dccc2ee3 Mon Sep 17 00:00:00 2001 From: stswangzhiping <59632378+stswangzhiping@users.noreply.github.com> Date: Fri, 20 Mar 2026 08:00:25 +0800 Subject: [PATCH] fix: fast-path hasInternet() via carrier check to avoid nmcli cache delay Made-with: Cursor --- lib/network.js | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/lib/network.js b/lib/network.js index 510df6a..a89114b 100644 --- a/lib/network.js +++ b/lib/network.js @@ -1,18 +1,35 @@ 'use strict'; const { execSync } = require('child_process'); +const fs = require('fs'); const log = require('./logger'); const AP_SSID_PREFIX = 'ClawBox-'; const AP_IP = '10.42.0.1'; const AP_PASSWORD = '12345678'; const AP_IFACE = process.env.CLAWD_WIFI_IFACE || ''; +const ETH_IFACE = process.env.CLAWD_ETH_IFACE || 'eth0'; const CON_NAME = 'clawd-hotspot'; +/** + * 检查有线网卡物理链路是否接通(读 sysfs carrier,无延迟) + */ +function hasWiredCarrier() { + try { + const carrier = fs.readFileSync(`/sys/class/net/${ETH_IFACE}/carrier`, 'utf8').trim(); + return carrier === '1'; + } catch (_) { + return false; + } +} + /** * 检测是否有互联网连接(尝试 DNS 解析 + HTTP 连通性) */ function hasInternet() { + // 物理层快检:无 WiFi STA 且有线 carrier=0 → 立即返回 false(nmcli 有缓存,不可信) + if (!isWifiStaConnected() && !hasWiredCarrier()) return false; + // 优先用 nmcli 的 connectivity check try { const out = run('nmcli networking connectivity check').trim(); @@ -208,6 +225,7 @@ function isWifiStaConnected() { module.exports = { hasInternet, + hasWiredCarrier, hasSavedWifiConnection, isWifiStaConnected, getWifiIface,