# 2026-06-10 — RDP Guacamole Client.State 常量修复 ## 摘要 修复浏览器 RDP 已收到 `sync` 但 UI 永远停在「连接中」:`guacamole-common-js` 1.5 运行时使用 `Client.State.CONNECTED`,而非错误的 `STATE_CONNECTED`(undefined)。 ## 动机 Playwright E2E 与 WS 抓包显示 sync 已到达,但 Pinia 状态未变为 `connected`;根因是 `onstatechange` 与 `undefined` 比较永远不成立。 ## 涉及文件 - `frontend/src/composables/rdp/useRdpSession.ts` — 使用 `Client.State` / `Tunnel.State`;connect 序号防竞态 - `frontend/src/pages/RdpPage.vue` — `mounted` 守卫避免重复 connect - `frontend/src/types/guacamole.d.ts` — 类型与运行时对齐 - `frontend/e2e/pages/rdp-connect.spec.mjs` — JWT 注入登录、nav 侧栏、canvas `.first()` - `frontend/e2e/helpers.mjs` — `loginWithAccessToken`、`/rdp` 导航 - `scripts/rdp_ws_probe.py`、`scripts/guacd_rdp_probe.py` — 生产 WS/guacd 探针 ## 迁移 / 重启 - 仅前端热更新(`web/app` sync 到容器) ## 验证 ```bash cd frontend && npx vite build # 生产 Playwright(需 NEXUS_E2E_ACCESS_TOKEN 由容器 mint JWT) NEXUS_E2E_ACCESS_TOKEN=... npx playwright test e2e/pages/rdp-connect.spec.mjs ``` 生产 E2E:约 12s 内出现「已连接」+ 1024×768 画布。