nostr_types/nip46/
request.rs

1use crate::{
2    ContentEncryptionAlgorithm, Error, Event, EventKind, ParsedTag, PreEvent, PublicKey, Signer,
3    Unixtime,
4};
5use serde::{Deserialize, Serialize};
6use std::sync::Arc;
7
8/// A NIP-46 request, found stringified in the content of a kind 24133 event
9#[derive(Clone, Debug, Serialize, Deserialize)]
10pub struct Nip46Request {
11    /// The Request ID
12    pub id: String,
13
14    /// The Request Method (See NIP-46)
15    pub method: String,
16
17    /// The Request parameters
18    pub params: Vec<String>,
19}
20
21impl Nip46Request {
22    /// Create a new request object
23    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    /// Create a NIP-46 request event from this request
32    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}