get_public_key.rs (2655B)
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 Nip46GetPublicKeyParams { 12 session_id: String, 13 } 14 15 #[derive(Clone, Debug, Serialize)] 16 struct Nip46GetPublicKeyResponse { 17 pubkey: String, 18 } 19 20 pub fn register(m: &mut RpcModule<RpcContext>, registry: &MethodRegistry) -> Result<()> { 21 registry.track("nip46.get_public_key"); 22 m.register_async_method("nip46.get_public_key", |params, ctx, _| async move { 23 let Nip46GetPublicKeyParams { 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 let (pubkey, updated) = request_get_public_key(&session).await?; 28 if updated { 29 if !ctx 30 .state 31 .nip46_sessions 32 .set_user_pubkey(&session_id, pubkey.clone()) 33 .await 34 { 35 return Err(RpcError::Other("nip46 session update failed".to_string())); 36 } 37 } 38 Ok::<Nip46GetPublicKeyResponse, RpcError>(Nip46GetPublicKeyResponse { 39 pubkey: pubkey.to_hex(), 40 }) 41 })?; 42 Ok(()) 43 } 44 45 async fn request_get_public_key( 46 session: &Nip46Session, 47 ) -> Result<(radroots_nostr::prelude::RadrootsNostrPublicKey, bool), RpcError> { 48 let req = NostrConnectRequest::GetPublicKey; 49 let response = client::request(session, req, "get_public_key").await?; 50 let response = response 51 .to_response(NostrConnectMethod::GetPublicKey) 52 .map_err(|e| RpcError::Other(format!("nip46 get_public_key failed: {e}")))?; 53 54 if let Some(error) = response.error { 55 return Err(RpcError::Other(format!( 56 "nip46 get_public_key error: {error}" 57 ))); 58 } 59 60 let pubkey = match response.result { 61 Some(ResponseResult::GetPublicKey(pubkey)) => pubkey, 62 Some(_) => { 63 return Err(RpcError::Other( 64 "nip46 get_public_key unexpected response".to_string(), 65 )); 66 } 67 None => { 68 return Err(RpcError::Other( 69 "nip46 get_public_key missing response".to_string(), 70 )); 71 } 72 }; 73 74 let updated = session 75 .user_pubkey 76 .map(|existing| existing != pubkey) 77 .unwrap_or(true); 78 Ok((pubkey, updated)) 79 }