#![allow(dead_code)]
#![cfg(not(target_arch = "wasm32"))]
use serde_json::{json, Value};
use pmcp::shared::{Transport, TransportMessage};
use pmcp::types::jsonrpc::JSONRPCResponse;
use pmcp::types::protocol::Request;
use pmcp::types::{Implementation, InitializeResult, RequestId, ServerCapabilities};
use crate::duplex::DuplexTransport;
pub async fn recv_request_id(t: &mut DuplexTransport) -> RequestId {
loop {
if let TransportMessage::Request { id, .. } = t.receive().await.expect("recv request") {
return id;
}
}
}
pub async fn recv_response(t: &mut DuplexTransport) -> JSONRPCResponse {
loop {
if let TransportMessage::Response(r) = t.receive().await.expect("recv response") {
return r;
}
}
}
pub async fn send_success(t: &mut DuplexTransport, id: RequestId, result: Value) {
t.send(TransportMessage::Response(JSONRPCResponse::success(
id, result,
)))
.await
.expect("send response");
}
pub fn init_result_value() -> Value {
serde_json::to_value(InitializeResult::new(
Implementation::new("fake-server", "1.0.0"),
ServerCapabilities::tools_only(),
))
.unwrap()
}
pub async fn inject_and_capture(
server_t: &mut DuplexTransport,
inbound_id: RequestId,
inbound: Request,
) -> JSONRPCResponse {
let init_id = recv_request_id(server_t).await;
send_success(server_t, init_id, init_result_value()).await;
let call_id = recv_request_id(server_t).await;
server_t
.send(TransportMessage::Request {
id: inbound_id,
request: inbound,
})
.await
.expect("send inbound request");
let response = recv_response(server_t).await;
send_success(server_t, call_id, json!({ "tools": [] })).await;
response
}