use super::registry::{PendingRequests, SharedSink};
use axum::extract::ws::Message;
use futures::SinkExt;
use objectiveai_sdk::client_objectiveai_mcp::{server_request, server_response};
use tokio::sync::oneshot;
pub async fn send_server_request(
sink: &SharedSink,
pending: &PendingRequests,
request: server_request::Request,
) -> Result<oneshot::Receiver<server_response::Response>, ()> {
let id = request.id.clone();
let (tx, rx) = oneshot::channel();
pending.insert(id.clone(), tx);
let frame = match serde_json::to_string(&request) {
Ok(s) => s,
Err(_) => {
pending.remove(&id);
return Err(());
}
};
let mut guard = sink.lock().await;
let send_result = guard.send(Message::Text(frame.into())).await;
if send_result.is_err() {
drop(guard);
pending.remove(&id);
return Err(());
}
Ok(rx)
}