get_public_key.rs (2604B)
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 && !ctx 30 .state 31 .nip46_sessions 32 .set_user_pubkey(&session_id, pubkey) 33 .await 34 { 35 return Err(RpcError::Other("nip46 session update failed".to_string())); 36 } 37 Ok::<Nip46GetPublicKeyResponse, RpcError>(Nip46GetPublicKeyResponse { 38 pubkey: pubkey.to_hex(), 39 }) 40 })?; 41 Ok(()) 42 } 43 44 async fn request_get_public_key( 45 session: &Nip46Session, 46 ) -> Result<(crate::host_nostr::PublicKey, bool), RpcError> { 47 let req = NostrConnectRequest::GetPublicKey; 48 let response = client::request(session, req, "get_public_key").await?; 49 let response = response 50 .to_response(NostrConnectMethod::GetPublicKey) 51 .map_err(|e| RpcError::Other(format!("nip46 get_public_key failed: {e}")))?; 52 53 if let Some(error) = response.error { 54 return Err(RpcError::Other(format!( 55 "nip46 get_public_key error: {error}" 56 ))); 57 } 58 59 let pubkey = match response.result { 60 Some(ResponseResult::GetPublicKey(pubkey)) => pubkey, 61 Some(_) => { 62 return Err(RpcError::Other( 63 "nip46 get_public_key unexpected response".to_string(), 64 )); 65 } 66 None => { 67 return Err(RpcError::Other( 68 "nip46 get_public_key missing response".to_string(), 69 )); 70 } 71 }; 72 73 let updated = session 74 .user_pubkey 75 .map(|existing| existing != pubkey) 76 .unwrap_or(true); 77 Ok((pubkey, updated)) 78 }