lean_ctx/server/
progress.rs1use rmcp::RoleServer;
2use rmcp::model::{ProgressNotificationParam, ProgressToken};
3use rmcp::service::Peer;
4
5#[derive(Clone)]
7pub struct ProgressSender {
8 peer: Peer<RoleServer>,
9 token: ProgressToken,
10}
11
12impl ProgressSender {
13 pub fn new(peer: Peer<RoleServer>, token: ProgressToken) -> Self {
14 Self { peer, token }
15 }
16
17 pub fn send(&self, progress: f64, total: Option<f64>, message: Option<String>) {
18 let mut params = ProgressNotificationParam::new(self.token.clone(), progress);
20 if let Some(total) = total {
21 params = params.with_total(total);
22 }
23 if let Some(message) = message {
24 params = params.with_message(message);
25 }
26 let peer = self.peer.clone();
27 tokio::spawn(async move {
28 if let Err(e) = peer.notify_progress(params).await {
29 tracing::debug!("[progress] notify failed: {e}");
30 }
31 });
32 }
33}
34
35pub type SharedProgressSender = std::sync::Arc<std::sync::Mutex<Option<ProgressSender>>>;