sign_event.rs (1370B)
1 use anyhow::Result; 2 use jsonrpsee::server::RpcModule; 3 use serde::{Deserialize, Serialize}; 4 5 use crate::transport::jsonrpc::nip46::{client, session}; 6 use crate::transport::jsonrpc::{MethodRegistry, RpcContext, RpcError}; 7 use nostr::UnsignedEvent; 8 9 #[derive(Debug, Deserialize)] 10 struct Nip46SignEventParams { 11 session_id: String, 12 event: UnsignedEvent, 13 } 14 15 #[derive(Clone, Debug, Serialize)] 16 struct Nip46SignEventResponse { 17 event: nostr::Event, 18 } 19 20 pub fn register(m: &mut RpcModule<RpcContext>, registry: &MethodRegistry) -> Result<()> { 21 registry.track("nip46.sign_event"); 22 m.register_async_method("nip46.sign_event", |params, ctx, _| async move { 23 let Nip46SignEventParams { session_id, event } = 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 session::require_sign_event_permission(&session, u32::from(event.kind.as_u16()))?; 28 if event.pubkey != session.remote_signer_pubkey { 29 return Err(RpcError::InvalidParams( 30 "event pubkey does not match remote signer".to_string(), 31 )); 32 } 33 let event = client::sign_event(&session, event, "sign_event").await?; 34 Ok::<Nip46SignEventResponse, RpcError>(Nip46SignEventResponse { event }) 35 })?; 36 Ok(()) 37 }