nostr_types/nip46/
request.rs1use crate::{
2 ContentEncryptionAlgorithm, Error, Event, EventKind, ParsedTag, PreEvent, PublicKey, Signer,
3 Unixtime,
4};
5use serde::{Deserialize, Serialize};
6use std::sync::Arc;
7
8#[derive(Clone, Debug, Serialize, Deserialize)]
10pub struct Nip46Request {
11 pub id: String,
13
14 pub method: String,
16
17 pub params: Vec<String>,
19}
20
21impl Nip46Request {
22 pub fn new(method: String, params: Vec<String>) -> Nip46Request {
24 Nip46Request {
25 id: textnonce::TextNonce::new().into_string(),
26 method,
27 params,
28 }
29 }
30
31 pub async fn to_event(
33 &self,
34 bunker_pubkey: PublicKey,
35 signer: Arc<dyn Signer>,
36 ) -> Result<Event, Error> {
37 let request_string = serde_json::to_string(self)?;
38
39 let content = signer
40 .encrypt(
41 &bunker_pubkey,
42 request_string.as_str(),
43 ContentEncryptionAlgorithm::Nip44v2,
44 )
45 .await?;
46
47 let pre_event = PreEvent {
48 pubkey: signer.public_key(),
49 created_at: Unixtime::now(),
50 kind: EventKind::NostrConnect,
51 tags: vec![ParsedTag::Pubkey {
52 pubkey: bunker_pubkey,
53 recommended_relay_url: None,
54 petname: None,
55 }
56 .into_tag()],
57 content,
58 };
59
60 let event = signer.sign_event(pre_event).await?;
61
62 Ok(event)
63 }
64}