radrootsd

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

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 }