diff --git a/backend/internal/ws/handler.go b/backend/internal/ws/handler.go index 52f90e5..eb84af9 100644 --- a/backend/internal/ws/handler.go +++ b/backend/internal/ws/handler.go @@ -220,7 +220,7 @@ func serveWS(c *gin.Context, sessionMgr session.Manager, orch orchestrator.Orche DetailLevel: msg.Payload.DetailLevel, Language: msg.Payload.Language, } - if err := sessionMgr.UpdateConfig(context.Background(), sessionID, patch); err != nil { + if err := client.sessionMgr.UpdateConfig(context.Background(), sessionID, patch); err != nil { errors.SendWSError(client, errors.CodeInternalError, "", err) continue } @@ -229,11 +229,16 @@ func serveWS(c *gin.Context, sessionMgr session.Manager, orch orchestrator.Orche case "interrupt": logger.Log.Infow("interrupt received", "session", sessionID) - // 获取活跃请求 ID(实际 cancel 在 Phase 5 接入 orchestrator 后实现) - reqID, _ := sessionMgr.GetActiveRequestID(context.Background(), sessionID) + // 获取活跃请求 ID 并取消 + reqID, _ := client.sessionMgr.GetActiveRequestID(context.Background(), sessionID) if reqID != "" { - _ = sessionMgr.ClearActiveRequest(context.Background(), sessionID) - // TODO: 取消对应 context cancel func + client.mu.Lock() + if cancel, ok := client.cancelFuncs[reqID]; ok { + cancel() + delete(client.cancelFuncs, reqID) + } + client.mu.Unlock() + _ = client.sessionMgr.ClearActiveRequest(context.Background(), sessionID) } default: @@ -247,6 +252,15 @@ func serveWS(c *gin.Context, sessionMgr session.Manager, orch orchestrator.Orche close(done) + // 取消所有活跃请求 + client.mu.Lock() + for reqID, cancel := range client.cancelFuncs { + logger.Log.Infow("canceling active request on disconnect", "session", sessionID, "request", reqID) + cancel() + } + client.cancelFuncs = make(map[string]context.CancelFunc) + client.mu.Unlock() + // 断开连接时不销毁会话,让其自然过期(支持重连恢复) logger.Log.Infow("client disconnected", "session", sessionID) }