radrootsd

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

session_authorize.rs (2079B)


      1 #![forbid(unsafe_code)]
      2 
      3 use anyhow::Result;
      4 use jsonrpsee::server::RpcModule;
      5 use serde::{Deserialize, Serialize};
      6 
      7 use nostr::nips::nip46::NostrConnectMessage;
      8 
      9 use crate::transport::jsonrpc::{MethodRegistry, RpcContext, RpcError};
     10 use radroots_nostr::prelude::RadrootsNostrEventBuilder;
     11 
     12 #[derive(Debug, Deserialize)]
     13 struct Nip46SessionAuthorizeParams {
     14     session_id: String,
     15 }
     16 
     17 #[derive(Clone, Debug, Serialize)]
     18 struct Nip46SessionAuthorizeResponse {
     19     authorized: bool,
     20     replayed: bool,
     21 }
     22 
     23 pub fn register(m: &mut RpcModule<RpcContext>, registry: &MethodRegistry) -> Result<()> {
     24     registry.track("nip46.session.authorize");
     25     m.register_async_method("nip46.session.authorize", |params, ctx, _| async move {
     26         let Nip46SessionAuthorizeParams { session_id } = params
     27             .parse()
     28             .map_err(|e| RpcError::InvalidParams(e.to_string()))?;
     29         let outcome = ctx
     30             .state
     31             .nip46_sessions
     32             .authorize(&session_id)
     33             .await
     34             .ok_or_else(|| RpcError::InvalidParams("unknown session".to_string()))?;
     35         let mut replayed = false;
     36         if let Some(pending) = outcome.pending {
     37             let response = crate::transport::nostr::listener::handle_request(
     38                 &ctx.state,
     39                 &pending.client_pubkey,
     40                 &pending.request_id,
     41                 pending.request,
     42             )
     43             .await;
     44             let message = NostrConnectMessage::response(pending.request_id, response);
     45             let response_event = RadrootsNostrEventBuilder::nostr_connect(
     46                 &ctx.state.keys,
     47                 pending.client_pubkey,
     48                 message,
     49             )
     50             .map_err(|err| RpcError::Other(format!("nip46 response build failed: {err}")))?;
     51             let _ = ctx.state.client.send_event_builder(response_event).await;
     52             replayed = true;
     53         }
     54         Ok::<Nip46SessionAuthorizeResponse, RpcError>(Nip46SessionAuthorizeResponse {
     55             authorized: true,
     56             replayed,
     57         })
     58     })?;
     59     Ok(())
     60 }