55 lines
1.5 KiB
Rust
55 lines
1.5 KiB
Rust
use crate::context::RequestContext;
|
|||
|
|
use axum::extract::ws::{Message, WebSocket, WebSocketUpgrade};
|
||
|
|
use axum::extract::Extension;
|
||
|
|
use axum::response::Response;
|
||
|
|
use futures_util::StreamExt;
|
||
|
|
use serde_json::json;
|
||
|
|
|
||
|
|
pub async fn socket(
|
||
|
|
ws: WebSocketUpgrade,
|
||
|
|
Extension(context): Extension<RequestContext>,
|
||
|
|
) -> Response {
|
||
|
|
ws.on_upgrade(move |socket| handle_socket(socket, context))
|
||
|
|
}
|
||
|
|
|
||
|
|
async fn handle_socket(mut socket: WebSocket, context: RequestContext) {
|
||
|
|
let payload = json!({
|
||
|
|
"kind": "ws_placeholder",
|
||
|
|
"requestId": context.trace.request_id,
|
||
|
|
"traceId": context.trace.trace_id,
|
||
|
|
"workspaceId": context.workspace.workspace_id,
|
||
|
|
"notes": [
|
||
|
|
"当前为 task-062 最小骨架,后续可承接协作推送和运行态事件。"
|
||
|
|
]
|
||
|
|
});
|
||
|
|
|
||
|
|
let _ = socket
|
||
|
|
.send(Message::Text(payload.to_string().into()))
|
||
|
|
.await;
|
||
|
|
|
||
|
|
while let Some(message) = socket.next().await {
|
||
|
|
let Ok(message) = message else {
|
||
|
|
break;
|
||
|
|
};
|
||
|
|
|
||
|
|
match message {
|
||
|
|
Message::Text(text) => {
|
||
|
|
let echo = json!({
|
||
|
|
"kind": "ws_echo",
|
||
|
|
"traceId": context.trace.trace_id,
|
||
|
|
"text": text.to_string(),
|
||
|
|
});
|
||
|
|
if socket
|
||
|
|
.send(Message::Text(echo.to_string().into()))
|
||
|
|
.await
|
||
|
|
.is_err()
|
||
|
|
{
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
Message::Close(_) => break,
|
||
|
|
_ => {}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|