@caoruhua/open-claude-remote 1.0.4 → 1.0.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -48,7 +48,7 @@ Scan the QR code shown in your terminal with your phone. The auth token is auto-
48
48
  ### Terminal Sync
49
49
  - Real-time terminal output streamed to your phone
50
50
  - Full ANSI color rendering via xterm.js
51
- - 10K-line scrollback buffer, auto-restored on reconnect
51
+ - 50K-line scrollback buffer, auto-restored on reconnect
52
52
  - **Multi-network support** — displays all available IPs (WiFi, VPN, Ethernet) on startup
53
53
  - LAN IP change notification with new connection URL
54
54
  - Smart auto-scroll with a "scroll to bottom" floating button — respects your scroll position when browsing history
@@ -218,7 +218,7 @@ Config file: `~/.claude-remote/settings.json` (legacy `config.json` is auto-migr
218
218
  | `claudeCwd` | string \| null | null | Claude working directory; `null` = current dir |
219
219
  | `sessionTtlMs` | number | 86400000 | Session TTL in ms (default: 24h) |
220
220
  | `authRateLimit` | number | 20 | Auth rate limit (per minute per IP) |
221
- | `maxBufferLines` | number | 10000 | Output buffer max lines |
221
+ | `maxBufferLines` | number | 50000 | Output buffer max lines |
222
222
  | `instanceName` | string \| null | (working dir name) | Instance name; defaults to working directory name if not set |
223
223
  | `shortcuts` | array | see below | Quick-input buttons |
224
224
  | `commands` | array | see below | Custom command buttons |
@@ -410,7 +410,7 @@ When creating instances from the web UI, you can select a custom settings file t
410
410
 
411
411
  "sessionTtlMs": 86400000,
412
412
  "authRateLimit": 20,
413
- "maxBufferLines": 10000,
413
+ "maxBufferLines": 50000,
414
414
  "instanceName": null,
415
415
 
416
416
  "shortcuts": [
@@ -565,7 +565,7 @@ claude-remote
565
565
  ### 终端同步
566
566
  - 实时终端输出推送到手机
567
567
  - 通过 xterm.js 完整渲染 ANSI 颜色
568
- - 1万行滚动缓冲区,重连时自动恢复
568
+ - 5万行滚动缓冲区,重连时自动恢复
569
569
  - **多网络支持** — 启动时显示所有可用 IP(WiFi、VPN、以太网)
570
570
  - 局域网 IP 变更通知,附带新连接地址
571
571
  - 智能自动滚动,配有"滚动到底部"悬浮按钮 — 浏览历史时尊重你的滚动位置
@@ -735,7 +735,7 @@ claude-remote update
735
735
  | `claudeCwd` | string \| null | null | Claude 工作目录;`null` = 当前目录 |
736
736
  | `sessionTtlMs` | number | 86400000 | 会话 TTL(毫秒,默认 24 小时) |
737
737
  | `authRateLimit` | number | 20 | 认证速率限制(每分钟每 IP) |
738
- | `maxBufferLines` | number | 10000 | 输出缓冲区最大行数 |
738
+ | `maxBufferLines` | number | 50000 | 输出缓冲区最大行数 |
739
739
  | `instanceName` | string \| null | 工作目录名 | 实例名称;未设置时默认为工作目录名 |
740
740
  | `shortcuts` | array | 见下文 | 快捷输入按钮 |
741
741
  | `commands` | array | 见下文 | 自定义命令按钮 |
@@ -927,7 +927,7 @@ claude-remote update
927
927
 
928
928
  "sessionTtlMs": 86400000,
929
929
  "authRateLimit": 20,
930
- "maxBufferLines": 10000,
930
+ "maxBufferLines": 50000,
931
931
  "instanceName": null,
932
932
 
933
933
  "shortcuts": [
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../backend/src/index.ts"],"names":[],"mappings":"AAOA,OAAO,EAAuD,KAAK,YAAY,EAAE,MAAM,aAAa,CAAC;AA+BrG,wBAAsB,WAAW,CAAC,YAAY,GAAE,YAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CA+ThF"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../backend/src/index.ts"],"names":[],"mappings":"AAOA,OAAO,EAAuD,KAAK,YAAY,EAAE,MAAM,aAAa,CAAC;AA+BrG,wBAAsB,WAAW,CAAC,YAAY,GAAE,YAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAwVhF"}
@@ -19,7 +19,7 @@ import { logger, setInstanceContext } from './logger/logger.js';
19
19
  import { markGracefulShutdown } from './daemon/daemon-guard.js';
20
20
  import { getOrCreateSharedToken } from './registry/shared-token.js';
21
21
  import { IpMonitor } from './utils/ip-monitor.js';
22
- import { detectAllLocalIps, getAllNetworkInterfaces, isInCidrRange } from './utils/network.js';
22
+ import { detectAllLocalIps, getAllNetworkInterfaces, isInCidrRange, detectPreferredInterface } from './utils/network.js';
23
23
  import { printBanner } from './utils/banner.js';
24
24
  /**
25
25
  * 根据网络接口信息推断接口类型。
@@ -62,6 +62,12 @@ export async function startServer(cliOverrides = {}) {
62
62
  localIpSet.add(ip);
63
63
  }
64
64
  logger.info({ allowedHosts: [...localIpSet] }, 'CORS allowlist initialized');
65
+ // Detect preferred network interface for IP monitoring
66
+ const preferredInterface = detectPreferredInterface();
67
+ if (preferredInterface && preferredInterface.address !== config.displayIp) {
68
+ logger.info({ detectedIp: preferredInterface.address, configIp: config.displayIp, interface: preferredInterface.name }, 'Updating display IP to preferred interface');
69
+ config.displayIp = preferredInterface.address;
70
+ }
65
71
  app.use(cors({
66
72
  origin: (origin, callback) => {
67
73
  if (!origin) {
@@ -166,8 +172,16 @@ export async function startServer(cliOverrides = {}) {
166
172
  }
167
173
  }
168
174
  // 15. IP monitor
169
- const ipMonitor = new IpMonitor((newIp, oldIp) => {
170
- logger.info({ oldIp, newIp }, 'IP change detected');
175
+ // Use the detected preferred interface, or fall back to config.displayIp
176
+ const effectiveInterface = preferredInterface || {
177
+ name: 'unknown',
178
+ address: config.displayIp,
179
+ isVpn: false,
180
+ isPrivate: true,
181
+ };
182
+ const ipMonitor = new IpMonitor((event) => {
183
+ const { newIp, oldIp, interfaceName } = event;
184
+ logger.info({ oldIp, newIp, interface: interfaceName }, 'IP change detected');
171
185
  config.displayIp = newIp;
172
186
  instanceManager.updateDisplayIp(newIp);
173
187
  // Refresh CORS allowlist on NIC change
@@ -178,7 +192,7 @@ export async function startServer(cliOverrides = {}) {
178
192
  localIpSet.add(ip);
179
193
  }
180
194
  logger.info({ allowedHosts: [...localIpSet] }, 'CORS allowlist refreshed');
181
- }, 30000, 2, undefined,
195
+ }, 30000, 2,
182
196
  // Network interface change callback
183
197
  (interfaces, preferredIp) => {
184
198
  // Broadcast network change to all WebSocket clients
@@ -197,8 +211,12 @@ export async function startServer(cliOverrides = {}) {
197
211
  };
198
212
  instanceManager.broadcastAll(networkMsg);
199
213
  logger.debug({ interfaceCount: interfaces.length }, 'Network change broadcasted');
214
+ },
215
+ // Interface switch callback
216
+ (event) => {
217
+ logger.info({ oldInterface: event.previousInterface.name, newInterface: event.newInterface.name }, 'Network interface switched');
200
218
  });
201
- ipMonitor.start(config.displayIp);
219
+ ipMonitor.start(effectiveInterface);
202
220
  // 16. Unified graceful shutdown
203
221
  let shuttingDown = false;
204
222
  const shutdown = (exitCode = 0) => {
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../backend/src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../backend/src/index.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,21 @@
1
- import { type NetworkInterface } from './network.js';
2
- export type IpChangeCallback = (newIp: string, oldIp: string) => void;
1
+ import { type NetworkInterface, type PreferredInterface } from './network.js';
2
+ /**
3
+ * IP 变化回调,包含网卡信息。
4
+ */
5
+ export interface IpChangeEvent {
6
+ newIp: string;
7
+ oldIp: string;
8
+ interfaceName: string;
9
+ }
10
+ /**
11
+ * 网卡切换事件。
12
+ */
13
+ export interface InterfaceSwitchEvent {
14
+ newInterface: PreferredInterface;
15
+ previousInterface: PreferredInterface;
16
+ }
17
+ export type IpChangeCallback = (event: IpChangeEvent) => void;
3
18
  export type NetworkChangeCallback = (interfaces: NetworkInterface[], preferredIp: string) => void;
4
- export type GetIpFunction = () => string | null;
5
19
  /**
6
20
  * IP 变化监控器。
7
21
  *
@@ -10,43 +24,74 @@ export type GetIpFunction = () => string | null;
10
24
  * - 连续 stabilityThreshold 次检测到相同新 IP 才触发回调
11
25
  * - 避免短暂网络波动导致误报
12
26
  *
13
- * 增强功能:同时监控所有网络接口的变化
27
+ * 绑定特定网卡监控:
28
+ * - 启动时记录当前首选网卡
29
+ * - 只监控该网卡的 IP 变化
30
+ * - 当前网卡断开时自动切换到备用网卡
31
+ * - 高优先级网卡恢复时(如 VPN)自动切回
14
32
  */
15
33
  export declare class IpMonitor {
16
34
  private readonly onChange;
17
35
  private readonly intervalMs;
18
36
  private readonly stabilityThreshold;
19
- private readonly getIp;
20
37
  private readonly onNetworkChange?;
38
+ private readonly onInterfaceSwitch?;
21
39
  private intervalId;
22
40
  private pendingIp;
23
41
  private stabilityCount;
24
42
  private _currentIp;
43
+ private _currentInterfaceName;
44
+ private _currentInterfaceIsVpn;
45
+ private _currentInterfaceIsPrivate;
25
46
  private _currentInterfaces;
26
47
  private pendingInterfaces;
27
48
  private interfaceStabilityCount;
28
- constructor(onChange: IpChangeCallback, intervalMs?: number, stabilityThreshold?: number, getIp?: GetIpFunction, onNetworkChange?: NetworkChangeCallback | undefined);
49
+ private disconnectedCount;
50
+ private readonly disconnectThreshold;
51
+ private _disconnectHandled;
52
+ constructor(onChange: IpChangeCallback, intervalMs?: number, stabilityThreshold?: number, onNetworkChange?: NetworkChangeCallback | undefined, onInterfaceSwitch?: ((event: InterfaceSwitchEvent) => void) | undefined);
29
53
  /**
30
54
  * 启动 IP 监控。
31
- * @param initialIp 初始 IP 地址
55
+ * @param initialInterface 初始网卡信息(名称和 IP
32
56
  */
33
- start(initialIp: string): void;
57
+ start(initialInterface: PreferredInterface): void;
34
58
  /**
35
59
  * 停止 IP 监控。
36
60
  */
37
61
  stop(): void;
38
62
  /**
39
63
  * 检测 IP 变化。
64
+ * 只监控当前绑定的网卡,当前网卡断开时尝试切换。
40
65
  */
41
66
  private check;
67
+ /**
68
+ * 处理当前网卡断开的情况:切换到其他可用网卡。
69
+ * 不直接触发 onChange,让 check() 通过稳定性阈值处理 IP 变化通知。
70
+ */
71
+ private handleInterfaceDisconnect;
72
+ /**
73
+ * 切换监控目标到新网卡。
74
+ * 不直接触发 onChange — 让 check() 通过稳定性阈值处理 IP 变化。
75
+ */
76
+ private switchInterface;
42
77
  /**
43
78
  * 检测网络接口列表变化。
79
+ * 同时检查是否有更高优先级的网卡恢复(如 VPN 重连)。
44
80
  */
45
81
  private checkInterfaces;
82
+ /**
83
+ * 检查是否有更高优先级的网卡可用(VPN 恢复场景)。
84
+ * 仅在优先级更高时切换,避免在同级别间反复切换。
85
+ */
86
+ private checkPreferredInterface;
46
87
  /**
47
88
  * 获取当前 IP。
48
89
  */
49
90
  get currentIp(): string;
91
+ /**
92
+ * 获取当前监控的网卡名称。
93
+ */
94
+ get currentInterfaceName(): string;
50
95
  /**
51
96
  * 获取当前所有网络接口。
52
97
  */
@@ -1 +1 @@
1
- {"version":3,"file":"ip-monitor.d.ts","sourceRoot":"","sources":["../../../../backend/src/utils/ip-monitor.ts"],"names":[],"mappings":"AAAA,OAAO,EAA6D,KAAK,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAGhH,MAAM,MAAM,gBAAgB,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;AACtE,MAAM,MAAM,qBAAqB,GAAG,CAAC,UAAU,EAAE,gBAAgB,EAAE,EAAE,WAAW,EAAE,MAAM,KAAK,IAAI,CAAC;AAClG,MAAM,MAAM,aAAa,GAAG,MAAM,MAAM,GAAG,IAAI,CAAC;AAmBhD;;;;;;;;;GASG;AACH,qBAAa,SAAS;IAUlB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,kBAAkB;IACnC,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAC;IAbnC,OAAO,CAAC,UAAU,CAA+C;IACjE,OAAO,CAAC,SAAS,CAAuB;IACxC,OAAO,CAAC,cAAc,CAAK;IAC3B,OAAO,CAAC,UAAU,CAAc;IAChC,OAAO,CAAC,kBAAkB,CAA0B;IACpD,OAAO,CAAC,iBAAiB,CAAmC;IAC5D,OAAO,CAAC,uBAAuB,CAAK;gBAGjB,QAAQ,EAAE,gBAAgB,EAC1B,UAAU,SAAQ,EAClB,kBAAkB,SAAI,EACtB,KAAK,GAAE,aAA4B,EACnC,eAAe,CAAC,EAAE,qBAAqB,YAAA;IAG1D;;;OAGG;IACH,KAAK,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAsB9B;;OAEG;IACH,IAAI,IAAI,IAAI;IAWZ;;OAEG;IACH,OAAO,CAAC,KAAK;IAgDb;;OAEG;IACH,OAAO,CAAC,eAAe;IAiDvB;;OAEG;IACH,IAAI,SAAS,IAAI,MAAM,CAEtB;IAED;;OAEG;IACH,IAAI,iBAAiB,IAAI,gBAAgB,EAAE,CAE1C;CACF"}
1
+ {"version":3,"file":"ip-monitor.d.ts","sourceRoot":"","sources":["../../../../backend/src/utils/ip-monitor.ts"],"names":[],"mappings":"AAAA,OAAO,EAKL,KAAK,gBAAgB,EACrB,KAAK,kBAAkB,EACxB,MAAM,cAAc,CAAC;AAGtB;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,EAAE,MAAM,CAAC;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,YAAY,EAAE,kBAAkB,CAAC;IACjC,iBAAiB,EAAE,kBAAkB,CAAC;CACvC;AAED,MAAM,MAAM,gBAAgB,GAAG,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI,CAAC;AAC9D,MAAM,MAAM,qBAAqB,GAAG,CAAC,UAAU,EAAE,gBAAgB,EAAE,EAAE,WAAW,EAAE,MAAM,KAAK,IAAI,CAAC;AAYlG;;;;;;;;;;;;;GAaG;AACH,qBAAa,SAAS;IAgBlB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,kBAAkB;IACnC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAC;IACjC,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAC;IAnBrC,OAAO,CAAC,UAAU,CAA+C;IACjE,OAAO,CAAC,SAAS,CAAuB;IACxC,OAAO,CAAC,cAAc,CAAK;IAC3B,OAAO,CAAC,UAAU,CAAc;IAChC,OAAO,CAAC,qBAAqB,CAAc;IAC3C,OAAO,CAAC,sBAAsB,CAAkB;IAChD,OAAO,CAAC,0BAA0B,CAAkB;IACpD,OAAO,CAAC,kBAAkB,CAA0B;IACpD,OAAO,CAAC,iBAAiB,CAAmC;IAC5D,OAAO,CAAC,uBAAuB,CAAK;IACpC,OAAO,CAAC,iBAAiB,CAAK;IAC9B,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAK;IACzC,OAAO,CAAC,kBAAkB,CAAS;gBAGhB,QAAQ,EAAE,gBAAgB,EAC1B,UAAU,SAAQ,EAClB,kBAAkB,SAAI,EACtB,eAAe,CAAC,EAAE,qBAAqB,YAAA,EACvC,iBAAiB,CAAC,GAAE,CAAC,KAAK,EAAE,oBAAoB,KAAK,IAAI,aAAA;IAG5E;;;OAGG;IACH,KAAK,CAAC,gBAAgB,EAAE,kBAAkB,GAAG,IAAI;IAoCjD;;OAEG;IACH,IAAI,IAAI,IAAI;IAaZ;;;OAGG;IACH,OAAO,CAAC,KAAK;IAmFb;;;OAGG;IACH,OAAO,CAAC,yBAAyB;IAmBjC;;;OAGG;IACH,OAAO,CAAC,eAAe;IA0BvB;;;OAGG;IACH,OAAO,CAAC,eAAe;IAyDvB;;;OAGG;IACH,OAAO,CAAC,uBAAuB;IAmB/B;;OAEG;IACH,IAAI,SAAS,IAAI,MAAM,CAEtB;IAED;;OAEG;IACH,IAAI,oBAAoB,IAAI,MAAM,CAEjC;IAED;;OAEG;IACH,IAAI,iBAAiB,IAAI,gBAAgB,EAAE,CAE1C;CACF"}
@@ -1,11 +1,5 @@
1
- import { detectLanIp, detectNonLoopbackIp, getAllNetworkInterfaces } from './network.js';
1
+ import { getAllNetworkInterfaces, getInterfaceIp, detectSecondaryInterface, detectPreferredInterface, } from './network.js';
2
2
  import { logger } from '../logger/logger.js';
3
- /**
4
- * 默认的 IP 检测函数:优先使用 LAN IP,其次使用非回环 IP
5
- */
6
- function defaultGetIp() {
7
- return detectLanIp() ?? detectNonLoopbackIp();
8
- }
9
3
  /**
10
4
  * 序列化接口列表,用于比对变化
11
5
  */
@@ -23,37 +17,52 @@ function serializeInterfaces(interfaces) {
23
17
  * - 连续 stabilityThreshold 次检测到相同新 IP 才触发回调
24
18
  * - 避免短暂网络波动导致误报
25
19
  *
26
- * 增强功能:同时监控所有网络接口的变化
20
+ * 绑定特定网卡监控:
21
+ * - 启动时记录当前首选网卡
22
+ * - 只监控该网卡的 IP 变化
23
+ * - 当前网卡断开时自动切换到备用网卡
24
+ * - 高优先级网卡恢复时(如 VPN)自动切回
27
25
  */
28
26
  export class IpMonitor {
29
27
  onChange;
30
28
  intervalMs;
31
29
  stabilityThreshold;
32
- getIp;
33
30
  onNetworkChange;
31
+ onInterfaceSwitch;
34
32
  intervalId = null;
35
33
  pendingIp = null;
36
34
  stabilityCount = 0;
37
35
  _currentIp = '';
36
+ _currentInterfaceName = '';
37
+ _currentInterfaceIsVpn = false;
38
+ _currentInterfaceIsPrivate = false;
38
39
  _currentInterfaces = [];
39
40
  pendingInterfaces = null;
40
41
  interfaceStabilityCount = 0;
41
- constructor(onChange, intervalMs = 30000, stabilityThreshold = 2, getIp = defaultGetIp, onNetworkChange) {
42
+ disconnectedCount = 0;
43
+ disconnectThreshold = 3; // 连续 3 次检测不到认为断开
44
+ _disconnectHandled = false;
45
+ constructor(onChange, intervalMs = 30000, stabilityThreshold = 2, onNetworkChange, onInterfaceSwitch) {
42
46
  this.onChange = onChange;
43
47
  this.intervalMs = intervalMs;
44
48
  this.stabilityThreshold = stabilityThreshold;
45
- this.getIp = getIp;
46
49
  this.onNetworkChange = onNetworkChange;
50
+ this.onInterfaceSwitch = onInterfaceSwitch;
47
51
  }
48
52
  /**
49
53
  * 启动 IP 监控。
50
- * @param initialIp 初始 IP 地址
54
+ * @param initialInterface 初始网卡信息(名称和 IP
51
55
  */
52
- start(initialIp) {
56
+ start(initialInterface) {
53
57
  this.stop();
54
- this._currentIp = initialIp;
58
+ this._currentIp = initialInterface.address;
59
+ this._currentInterfaceName = initialInterface.name;
60
+ this._currentInterfaceIsVpn = initialInterface.isVpn;
61
+ this._currentInterfaceIsPrivate = initialInterface.isPrivate;
55
62
  this.pendingIp = null;
56
63
  this.stabilityCount = 0;
64
+ this.disconnectedCount = 0;
65
+ this._disconnectHandled = false;
57
66
  this._currentInterfaces = getAllNetworkInterfaces();
58
67
  this.pendingInterfaces = null;
59
68
  this.interfaceStabilityCount = 0;
@@ -65,7 +74,13 @@ export class IpMonitor {
65
74
  if (this.intervalId.unref) {
66
75
  this.intervalId.unref();
67
76
  }
68
- logger.info({ initialIp, interfaces: this._currentInterfaces.length, intervalMs: this.intervalMs }, 'IP monitor started');
77
+ logger.info({
78
+ ip: initialInterface.address,
79
+ interface: initialInterface.name,
80
+ isVpn: initialInterface.isVpn,
81
+ isPrivate: initialInterface.isPrivate,
82
+ intervalMs: this.intervalMs,
83
+ }, 'IP monitor started');
69
84
  }
70
85
  /**
71
86
  * 停止 IP 监控。
@@ -77,22 +92,46 @@ export class IpMonitor {
77
92
  }
78
93
  this.pendingIp = null;
79
94
  this.stabilityCount = 0;
95
+ this.disconnectedCount = 0;
96
+ this._disconnectHandled = false;
80
97
  this.pendingInterfaces = null;
81
98
  this.interfaceStabilityCount = 0;
82
99
  }
83
100
  /**
84
101
  * 检测 IP 变化。
102
+ * 只监控当前绑定的网卡,当前网卡断开时尝试切换。
85
103
  */
86
104
  check() {
87
- const newIp = this.getIp();
88
- // 网络断开时不处理
105
+ // 只检查当前绑定的网卡
106
+ const newIp = getInterfaceIp(this._currentInterfaceName);
89
107
  if (!newIp) {
108
+ // 当前网卡可能已断开,增加断开计数
109
+ this.disconnectedCount++;
110
+ logger.debug({
111
+ interface: this._currentInterfaceName,
112
+ disconnectCount: this.disconnectedCount,
113
+ threshold: this.disconnectThreshold,
114
+ }, 'Current interface IP not detected, counting disconnect');
115
+ // 达到断开阈值且未处理过,尝试切换到其他网卡
116
+ if (this.disconnectedCount >= this.disconnectThreshold && !this._disconnectHandled) {
117
+ this._disconnectHandled = true;
118
+ this.handleInterfaceDisconnect();
119
+ }
90
120
  return;
91
121
  }
122
+ // 网卡恢复,重置断开计数
123
+ if (this.disconnectedCount > 0) {
124
+ logger.debug({ interface: this._currentInterfaceName, ip: newIp }, 'Interface recovered');
125
+ this.disconnectedCount = 0;
126
+ this._disconnectHandled = false;
127
+ }
92
128
  // IP 未变化,重置待确认状态
93
129
  if (newIp === this._currentIp) {
94
130
  if (this.pendingIp !== null) {
95
- logger.debug('IP stabilized to original, resetting monitor state');
131
+ logger.debug({
132
+ ip: newIp,
133
+ interface: this._currentInterfaceName,
134
+ }, 'IP stabilized to original, resetting monitor state');
96
135
  }
97
136
  this.pendingIp = null;
98
137
  this.stabilityCount = 0;
@@ -104,6 +143,7 @@ export class IpMonitor {
104
143
  this.stabilityCount++;
105
144
  logger.debug({
106
145
  pendingIp: this.pendingIp,
146
+ interface: this._currentInterfaceName,
107
147
  stabilityCount: this.stabilityCount,
108
148
  threshold: this.stabilityThreshold,
109
149
  }, 'IP change detected, counting stability');
@@ -114,6 +154,7 @@ export class IpMonitor {
114
154
  this.stabilityCount = 1;
115
155
  logger.debug({
116
156
  newIp,
157
+ interface: this._currentInterfaceName,
117
158
  }, 'New IP detected, waiting for stability');
118
159
  }
119
160
  // 达到稳定性阈值,触发回调
@@ -122,17 +163,57 @@ export class IpMonitor {
122
163
  this._currentIp = newIp;
123
164
  this.pendingIp = null;
124
165
  this.stabilityCount = 0;
125
- logger.info({ oldIp, newIp }, 'IP change confirmed, triggering callback');
126
- this.onChange(newIp, oldIp);
166
+ logger.info({ oldIp, newIp, interface: this._currentInterfaceName }, 'IP change confirmed, triggering callback');
167
+ this.onChange({
168
+ newIp,
169
+ oldIp,
170
+ interfaceName: this._currentInterfaceName,
171
+ });
172
+ }
173
+ }
174
+ /**
175
+ * 处理当前网卡断开的情况:切换到其他可用网卡。
176
+ * 不直接触发 onChange,让 check() 通过稳定性阈值处理 IP 变化通知。
177
+ */
178
+ handleInterfaceDisconnect() {
179
+ logger.warn({ interface: this._currentInterfaceName, previousIp: this._currentIp }, 'Current interface disconnected, searching for alternative');
180
+ const alternative = detectSecondaryInterface(this._currentInterfaceName);
181
+ if (alternative) {
182
+ this.switchInterface(alternative);
183
+ }
184
+ else {
185
+ logger.warn({ interface: this._currentInterfaceName }, 'No alternative network interfaces available, waiting for recovery');
186
+ // _disconnectHandled = true 阻止重复触发,等 checkInterfaces 检测到新接口后重置
187
+ }
188
+ }
189
+ /**
190
+ * 切换监控目标到新网卡。
191
+ * 不直接触发 onChange — 让 check() 通过稳定性阈值处理 IP 变化。
192
+ */
193
+ switchInterface(newInterface) {
194
+ const previousInterface = {
195
+ name: this._currentInterfaceName,
196
+ address: this._currentIp,
197
+ isVpn: this._currentInterfaceIsVpn,
198
+ isPrivate: this._currentInterfaceIsPrivate,
199
+ };
200
+ this._currentInterfaceName = newInterface.name;
201
+ this._currentInterfaceIsVpn = newInterface.isVpn;
202
+ this._currentInterfaceIsPrivate = newInterface.isPrivate;
203
+ this.disconnectedCount = 0;
204
+ this._disconnectHandled = false;
205
+ this.pendingIp = null;
206
+ this.stabilityCount = 0;
207
+ logger.info({ oldInterface: previousInterface.name, newInterface: newInterface.name, newIp: newInterface.address }, 'Switched monitoring to new interface');
208
+ if (this.onInterfaceSwitch) {
209
+ this.onInterfaceSwitch({ newInterface, previousInterface });
127
210
  }
128
211
  }
129
212
  /**
130
213
  * 检测网络接口列表变化。
214
+ * 同时检查是否有更高优先级的网卡恢复(如 VPN 重连)。
131
215
  */
132
216
  checkInterfaces() {
133
- // 如果没有网络变化回调,跳过此检查
134
- if (!this.onNetworkChange)
135
- return;
136
217
  const newInterfaces = getAllNetworkInterfaces();
137
218
  const currentSerialized = serializeInterfaces(this._currentInterfaces);
138
219
  const newSerialized = serializeInterfaces(newInterfaces);
@@ -169,16 +250,47 @@ export class IpMonitor {
169
250
  this.interfaceStabilityCount = 0;
170
251
  logger.info({
171
252
  interfaces: newInterfaces.map(i => `${i.name}:${i.address}`),
172
- }, 'Network interface change confirmed, triggering callback');
173
- this.onNetworkChange(newInterfaces, this._currentIp);
253
+ }, 'Network interface change confirmed');
254
+ // 检查是否有更高优先级的网卡恢复(如 VPN 重连)
255
+ this.checkPreferredInterface();
256
+ // 重置断开处理标记,新接口可能提供替代方案
257
+ if (this._disconnectHandled) {
258
+ this._disconnectHandled = false;
259
+ }
260
+ // 通知外部
261
+ if (this.onNetworkChange) {
262
+ this.onNetworkChange(newInterfaces, this._currentIp);
263
+ }
174
264
  }
175
265
  }
266
+ /**
267
+ * 检查是否有更高优先级的网卡可用(VPN 恢复场景)。
268
+ * 仅在优先级更高时切换,避免在同级别间反复切换。
269
+ */
270
+ checkPreferredInterface() {
271
+ const preferred = detectPreferredInterface();
272
+ if (!preferred || preferred.name === this._currentInterfaceName)
273
+ return;
274
+ // 仅当新首选网卡优先级更高时才切换
275
+ const shouldSwitch = (preferred.isVpn && !this._currentInterfaceIsVpn) ||
276
+ (preferred.isPrivate && !this._currentInterfaceIsPrivate && !this._currentInterfaceIsVpn);
277
+ if (!shouldSwitch)
278
+ return;
279
+ logger.info({ currentInterface: this._currentInterfaceName, preferredInterface: preferred.name }, 'Higher-priority interface detected, switching');
280
+ this.switchInterface(preferred);
281
+ }
176
282
  /**
177
283
  * 获取当前 IP。
178
284
  */
179
285
  get currentIp() {
180
286
  return this._currentIp;
181
287
  }
288
+ /**
289
+ * 获取当前监控的网卡名称。
290
+ */
291
+ get currentInterfaceName() {
292
+ return this._currentInterfaceName;
293
+ }
182
294
  /**
183
295
  * 获取当前所有网络接口。
184
296
  */
@@ -1 +1 @@
1
- {"version":3,"file":"ip-monitor.js","sourceRoot":"","sources":["../../../../backend/src/utils/ip-monitor.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ip-monitor.js","sourceRoot":"","sources":["../../../../backend/src/utils/ip-monitor.ts"],"names":[],"mappings":"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"}
@@ -58,4 +58,29 @@ export declare function detectAllLocalIps(): string[];
58
58
  * Useful for environments with non-RFC1918 internal networks (e.g., corporate networks).
59
59
  */
60
60
  export declare function detectNonLoopbackIp(): string | null;
61
+ /**
62
+ * Result of detecting the preferred network interface.
63
+ */
64
+ export interface PreferredInterface {
65
+ name: string;
66
+ address: string;
67
+ isVpn: boolean;
68
+ isPrivate: boolean;
69
+ }
70
+ /**
71
+ * Detect the preferred network interface for monitoring.
72
+ * Priority: VPN > Private LAN > Public
73
+ * Returns null if no suitable interface found.
74
+ */
75
+ export declare function detectPreferredInterface(): PreferredInterface | null;
76
+ /**
77
+ * Detect a secondary interface when the primary one is disconnected.
78
+ * Excludes the given interface name from consideration.
79
+ */
80
+ export declare function detectSecondaryInterface(excludeInterfaceName: string): PreferredInterface | null;
81
+ /**
82
+ * Get the IP address of a specific network interface.
83
+ * Returns null if interface not found or has no IPv4 address.
84
+ */
85
+ export declare function getInterfaceIp(interfaceName: string): string | null;
61
86
  //# sourceMappingURL=network.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"network.d.ts","sourceRoot":"","sources":["../../../../backend/src/utils/network.ts"],"names":[],"mappings":"AAGA;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;IACxB,QAAQ,EAAE,OAAO,CAAC;IAClB,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,EAAE,OAAO,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAiBD;;GAEG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEpD;AAsBD;;GAEG;AACH,wBAAgB,aAAa,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAS/D;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CASpD;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,EAAE,YAAY,GAAE,MAAM,EAAO,GAAG,OAAO,CAc3F;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,IAAI,gBAAgB,EAAE,CAmC5D;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,GAAG,IAAI,CAWlD;AAED;;;GAGG;AACH,wBAAgB,WAAW,IAAI,MAAM,GAAG,IAAI,CAY3C;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,EAAE,CAW5C;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,GAAG,IAAI,CAYnD"}
1
+ {"version":3,"file":"network.d.ts","sourceRoot":"","sources":["../../../../backend/src/utils/network.ts"],"names":[],"mappings":"AAGA;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;IACxB,QAAQ,EAAE,OAAO,CAAC;IAClB,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,EAAE,OAAO,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAiBD;;GAEG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEpD;AAsBD;;GAEG;AACH,wBAAgB,aAAa,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAS/D;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CASpD;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,EAAE,YAAY,GAAE,MAAM,EAAO,GAAG,OAAO,CAc3F;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,IAAI,gBAAgB,EAAE,CAmC5D;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,GAAG,IAAI,CAWlD;AAED;;;GAGG;AACH,wBAAgB,WAAW,IAAI,MAAM,GAAG,IAAI,CAY3C;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,EAAE,CAW5C;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,GAAG,IAAI,CAYnD;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,OAAO,CAAC;IACf,SAAS,EAAE,OAAO,CAAC;CACpB;AAED;;;;GAIG;AACH,wBAAgB,wBAAwB,IAAI,kBAAkB,GAAG,IAAI,CAsBpE;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,CAAC,oBAAoB,EAAE,MAAM,GAAG,kBAAkB,GAAG,IAAI,CAwBhG;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAenE"}