Files
mnote/rust/crates/mnote-web/src/routes/ws.rs
T

55 lines
1.5 KiB
Rust
Raw Normal View History

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,
_ => {}
}
}
}