ping.rs (1816B)
1 use anyhow::Result; 2 use jsonrpsee::server::RpcModule; 3 use serde::{Deserialize, Serialize}; 4 5 use crate::core::nip46::Nip46Session; 6 use crate::transport::jsonrpc::nip46::{client, session}; 7 use crate::transport::jsonrpc::{MethodRegistry, RpcContext, RpcError}; 8 use nostr::nips::nip46::{NostrConnectMethod, NostrConnectRequest, ResponseResult}; 9 10 #[derive(Debug, Deserialize)] 11 struct Nip46PingParams { 12 session_id: String, 13 } 14 15 #[derive(Clone, Debug, Serialize)] 16 struct Nip46PingResponse { 17 result: String, 18 } 19 20 pub fn register(m: &mut RpcModule<RpcContext>, registry: &MethodRegistry) -> Result<()> { 21 registry.track("nip46.ping"); 22 m.register_async_method("nip46.ping", |params, ctx, _| async move { 23 let Nip46PingParams { session_id } = params 24 .parse() 25 .map_err(|e| RpcError::InvalidParams(e.to_string()))?; 26 let session = session::get_session(ctx.as_ref(), &session_id).await?; 27 Ok::<Nip46PingResponse, RpcError>(Nip46PingResponse { 28 result: request_ping(&session).await?, 29 }) 30 })?; 31 Ok(()) 32 } 33 34 async fn request_ping(session: &Nip46Session) -> Result<String, RpcError> { 35 let req = NostrConnectRequest::Ping; 36 let response = client::request(session, req, "ping").await?; 37 let response = response 38 .to_response(NostrConnectMethod::Ping) 39 .map_err(|e| RpcError::Other(format!("nip46 ping failed: {e}")))?; 40 41 if let Some(error) = response.error { 42 return Err(RpcError::Other(format!("nip46 ping error: {error}"))); 43 } 44 45 match response.result { 46 Some(ResponseResult::Pong) => Ok("pong".to_string()), 47 Some(_) => Err(RpcError::Other( 48 "nip46 ping unexpected response".to_string(), 49 )), 50 None => Err(RpcError::Other("nip46 ping missing response".to_string())), 51 } 52 }