fix(websocket): 修复 app.py 不可导入并新增真实链路验证

- 将 /api/sessions/{sid}/ws 端点移入 create_app(此前置于模块级导致整模块 import NameError,回归被验证拦截)
- register_loop + subscribe 调整至 accept 之前,缩小连接已开但未订阅期间的进度丢失窗口
- 新增 tests/test_verify_ws_real_flow.py:驱动真实 HTTP 聊天流程断言 WS 收到 agent 实际发射的 parse/impact 进度
- 同步 WebSocket 计划文档 Task 3 代码片段(标注端点必须位于 create_app 内)
- 全量 pytest 实测 583 passed / 99.03% 达标
This commit is contained in:
lhl
2026-08-29 14:36:12 +08:00
parent 9f5342e2be
commit 80daadcd31
11 changed files with 383 additions and 39 deletions
@@ -299,19 +299,22 @@ Expected: FAIL404 / 路由不存在)
`create_app` 内新增端点:
```python
@app.websocket("/api/sessions/{sid}/ws")
async def session_progress_ws(ws: WebSocket, sid: str):
await ws.accept()
hub.register_loop(asyncio.get_running_loop())
q = hub.subscribe(sid)
try:
while True:
event = await q.get()
await ws.send_json(event)
except WebSocketDisconnect:
pass
finally:
hub.unsubscribe(sid, q)
# 注意:端点必须定义在 create_app 函数体内(缩进),因为 app 是局部变量;
# 若误置于模块级,@app.websocket 引用未定义的 app 会导致整模块 import 即 NameError。
@app.websocket("/api/sessions/{sid}/ws")
async def session_progress_ws(ws: WebSocket, sid: str):
# 先注册循环并订阅,再 accept,缩小「连接已开但尚未订阅」期间的进度丢失窗口
hub.register_loop(asyncio.get_running_loop())
q = hub.subscribe(sid)
await ws.accept()
try:
while True:
event = await q.get()
await ws.send_json(event)
except WebSocketDisconnect:
pass
finally:
hub.unsubscribe(sid, q)
```
`asyncio` 已在 app.py 导入;若未导入则补 `import asyncio`。)