42 lines
1.5 KiB
Go
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
|
|
}
|