cc-haha/src/server/ws/disconnectGraceConfig.ts
程序员阿江(Relakkes) 53d8e7ad77 feat(desktop): stabilize H5 access tokens, ports, and background sessions (#767, #764)
H5 远程访问的三处不稳定来源修复,让手机出门在外也能稳定连接、长任务不丢。

#767 令牌与端口固定:
- 令牌明文持久化到 cc-haha/settings.json,重启后二维码/令牌随时可查、可复制;
  enable 复用现有令牌、disable 保留令牌,仅 regenerate 才轮换。手改 token 字段
  即自定义固定令牌。完整令牌只经 local-trusted 面返回,远端 403。
- 新增可选固定端口 fixedPort,并在未配置时复用上次端口(desktop-server-state.json
  sticky,Electron/Tauri 双壳共享),反向代理/手机书签跨重启不失效;占用时回退随机。

#764 断连不杀正在运行的 CLI:
- 客户端断开时若该会话仍在跑一轮任务,不再 30s 后强杀子进程,而是等任务跑完;
  手机锁屏/切后台时长任务在后台跑完,重连即见结果。
- 空闲清理超时改为可配 disconnectGraceSeconds(H5 访问设置页,默认 30s),
  经 disconnectGraceConfig 同步缓存供 close 处理读取。

server / Electron / Tauri / React 四层 + 五语言 i18n + 配套单测全部覆盖。
2026-06-12 16:37:00 +08:00

38 lines
1.3 KiB
TypeScript

/**
* Cached disconnect grace period (issue #764).
*
* The WebSocket `close` handler runs synchronously, but the configured grace
* period lives in managed settings (async disk read). We cache the resolved
* value here so the hot path stays synchronous, and refresh the cache at
* server startup and whenever the H5 access settings are updated.
*/
import { H5AccessService, DEFAULT_DISCONNECT_GRACE_MS } from '../services/h5AccessService.js'
let cachedGraceMs = DEFAULT_DISCONNECT_GRACE_MS
const h5AccessService = new H5AccessService()
/** Synchronous accessor for the disconnect cleanup grace period, in ms. */
export function getDisconnectGraceMs(): number {
return cachedGraceMs
}
/** Reload the cached grace period from managed settings. Best-effort. */
export async function refreshDisconnectGraceMs(): Promise<number> {
try {
cachedGraceMs = await h5AccessService.getDisconnectGraceMs()
} catch {
// Keep the previous (or default) value on read failure.
}
return cachedGraceMs
}
/** Test hook: override the cached value directly. */
export function __setDisconnectGraceMsForTests(value: number): void {
cachedGraceMs = value
}
/** Test hook: reset to the built-in default. */
export function __resetDisconnectGraceMsForTests(): void {
cachedGraceMs = DEFAULT_DISCONNECT_GRACE_MS
}