feat(ws): 新增WebSocket实时通信支持与SSE独立服务

重构中间件结构,新增ws模块实现WebSocket流程执行实时推送
将SSE服务拆分为独立端口监听,默认8866
优化前端流式模式切换,支持WS/SSE协议选择
统一流式事件处理逻辑,完善错误处理与取消机制
更新Cargo.toml依赖,添加WebSocket相关库
调整代码组织结构,规范导入分组与注释
This commit is contained in:
2025-09-21 22:15:33 +08:00
parent dd7857940f
commit 30716686ed
23 changed files with 805 additions and 101 deletions

View File

@ -1,11 +1,27 @@
use axum::{Router, routing::{post, get}, extract::{State, Path, Query}, Json};
use crate::{db::Db, response::ApiResponse, services::{flow_service, log_service}, error::AppError};
use serde::Deserialize;
use tracing::{info, error};
use crate::middlewares::jwt::AuthUser;
// axum
use axum::extract::{Path, Query, State, ws::WebSocketUpgrade};
use axum::http::HeaderMap;
use axum::response::Response;
use axum::routing::{get, post};
use axum::{Json, Router};
// std
use std::collections::HashMap;
// third-party
use serde::Deserialize;
use tracing::{error, info};
// crate
use crate::middlewares::jwt::AuthUser;
// 新增:引入通用 SSE 组件
use crate::middlewares::sse;
use crate::{
db::Db,
error::AppError,
response::ApiResponse,
services::{flow_service, log_service},
};
pub fn router() -> Router<Db> {
Router::new()
@ -14,6 +30,14 @@ pub fn router() -> Router<Db> {
.route("/flows/{id}/run", post(run))
// 新增流式运行SSE端点
.route("/flows/{id}/run/stream", post(run_stream))
// 新增WebSocket 实时输出端点GET 握手)
.route("/flows/{id}/run/ws", get(run_ws))
}
// 新增:仅包含 WS 路由的精简 router便于在单独端口挂载
pub fn ws_router() -> Router<Db> {
Router::new()
.route("/flows/{id}/run/ws", get(run_ws))
}
#[derive(Deserialize)]
@ -106,4 +130,16 @@ async fn run_stream(State(db): State<Db>, user: AuthUser, Path(id): Path<String>
// 由通用组件把 Receiver 包装为 SSE 响应
Ok(sse::from_mpsc(rx))
}
// ================= WebSocket 模式:路由仅做转发 =================
async fn run_ws(
State(db): State<Db>,
Path(id): Path<String>,
Query(q): Query<HashMap<String, String>>,
headers: HeaderMap,
ws: WebSocketUpgrade,
) -> Result<Response, AppError> {
crate::middlewares::ws::run_ws(State(db), Path(id), Query(q), headers, ws).await
}