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 }