nip_55/
client.rs

1use super::{
2    nip04_jsonrpc::{
3        jsonrpc_request_to_nip04_encrypted_event, nip04_encrypted_event_to_jsonrpc_response,
4    },
5    uds_req_res::client::{UdsClientError, UnixDomainSocketClientTransport},
6};
7use crate::json_rpc::{JsonRpcRequest, JsonRpcResponse, SingleOrBatch};
8use nostr_sdk::{Event, Keys, Kind, PublicKey};
9
10/// NIP-55 client that can make requests to a NIP-55 server.
11#[derive(Clone)]
12pub struct Nip55Client {
13    uds_client_transport: UnixDomainSocketClientTransport,
14}
15
16// TODO: Support batch requests.
17impl Nip55Client {
18    pub fn new(uds_address: impl Into<String>) -> Self {
19        Self {
20            uds_client_transport: UnixDomainSocketClientTransport::new(uds_address),
21        }
22    }
23
24    pub async fn send_request(
25        &self,
26        kind: Kind,
27        request: &SingleOrBatch<JsonRpcRequest>,
28        server_pubkey: PublicKey,
29    ) -> Result<SingleOrBatch<JsonRpcResponse>, UdsClientError> {
30        let temp_client_keypair = Keys::generate();
31
32        let request_event: Event = jsonrpc_request_to_nip04_encrypted_event(
33            kind,
34            request,
35            &temp_client_keypair,
36            server_pubkey,
37        )
38        .map_err(|_| UdsClientError::RequestSerializationError)?;
39
40        let response_event = self
41            .uds_client_transport
42            .send_request(request_event)
43            .await?;
44
45        nip04_encrypted_event_to_jsonrpc_response(&response_event, &temp_client_keypair)
46            .map_err(|e| UdsClientError::MalformedResponse(anyhow::anyhow!(e)))
47    }
48}