Files
ai-agent/workflow/service/flow/ws_server.go
T

42 lines
1.5 KiB
Go

package flow
import (
"context"
sessionDao "ai-agent/workflow/dao/session"
sessionDto "ai-agent/workflow/model/dto/session"
wsCommon "gitea.redpowerfuture.com/red-future/common/websocket"
"github.com/gogf/gf/v2/net/ghttp"
)
// SessionWsService 会话 WebSocket 服务器:普通对话与工作流共用一条连接,
// 首次连接仅升级,后续按消息 type 路由到对话/工作流处理器
// (对话处理器在 react_ws_exec.go 注册,工作流处理器在 flow_ws_exec.go 注册)。
var SessionWsService = wsCommon.NewWsServer(
wsCommon.WithConnKeyPrefix("ws:session:"),
)
// WsConnect 控制器统一入口:升级 WebSocket(普通对话/工作流均由消息 type 区分,此处不区分)
func WsConnect(ctx context.Context, r *ghttp.Request, req *sessionDto.WebSocketConnectReq) error {
_, err := SessionWsService.Upgrade(ctx, r, req.SessionId)
return err
}
// ensureSession 解析前端 sessionId 并确保会话存在:命中已存在会话则复用其 id,否则按 name 新建。
// 普通对话(react_ws_exec.go)与工作流(flow_ws_exec.go)共用。
func ensureSession(ctx context.Context, sessionId string, name string) error {
exist, err := sessionDao.SessionDao.GetById(ctx, sessionId)
if err != nil {
return err
}
if exist != nil {
return nil
}
if r := []rune(name); len(r) > 128 { // session_name VARCHAR(128)
name = string(r[:128])
}
_, err = sessionDao.SessionDao.Insert(ctx, &sessionDto.CreateSessionReq{SessionId: sessionId, SessionName: name})
return err
}