feat(ws): 新增WebSocket实时通信支持与SSE独立服务
重构中间件结构,新增ws模块实现WebSocket流程执行实时推送 将SSE服务拆分为独立端口监听,默认8866 优化前端流式模式切换,支持WS/SSE协议选择 统一流式事件处理逻辑,完善错误处理与取消机制 更新Cargo.toml依赖,添加WebSocket相关库 调整代码组织结构,规范导入分组与注释
This commit is contained in:
@ -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
|
||||
}
|
||||
Reference in New Issue
Block a user