mcp_transport_rs/server/
sse.rs1use std::io;
2
3use async_trait::async_trait;
4use mcp_core_rs::protocol::message::JsonRpcMessage;
5use mcp_error_rs::{Error, Result};
6use tokio::sync::mpsc::{UnboundedReceiver, UnboundedSender};
7
8use crate::server::traits::ServerTransport;
9
10pub struct SseTransport {
12 sender: UnboundedSender<JsonRpcMessage>,
13 receiver: UnboundedReceiver<JsonRpcMessage>,
14}
15
16impl SseTransport {
17 pub fn new(
18 sender: UnboundedSender<JsonRpcMessage>,
19 receiver: UnboundedReceiver<JsonRpcMessage>,
20 ) -> Self {
21 Self { sender, receiver }
22 }
23}
24
25#[async_trait]
26impl ServerTransport for SseTransport {
27 async fn write_message(&mut self, msg: JsonRpcMessage) -> Result<()> {
28 self.sender
29 .send(msg)
30 .map_err(|_| Error::Io(io::Error::new(io::ErrorKind::BrokenPipe, "SSE send failed")))
31 }
32
33 async fn read_message(&mut self) -> Option<Result<JsonRpcMessage>> {
34 self.receiver.recv().await.map(Ok)
35 }
36}