radrootsd

JSON-RPC bridge for Radroots event publishing
git clone https://radroots.dev/git/radrootsd.git
Log | Files | Refs | README | LICENSE

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 }