nostr_sdk/client/
builder.rs

1// Copyright (c) 2022-2023 Yuki Kishimoto
2// Copyright (c) 2023-2025 Rust Nostr Developers
3// Distributed under the MIT software license
4
5//! Client builder
6
7use std::sync::Arc;
8
9use nostr::signer::{IntoNostrSigner, NostrSigner};
10use nostr_database::memory::MemoryDatabase;
11use nostr_database::{IntoNostrDatabase, NostrDatabase};
12use nostr_relay_pool::monitor::Monitor;
13use nostr_relay_pool::policy::AdmitPolicy;
14use nostr_relay_pool::transport::websocket::{
15    DefaultWebsocketTransport, IntoWebSocketTransport, WebSocketTransport,
16};
17
18use crate::client::options::ClientOptions;
19use crate::client::Client;
20
21/// Client builder
22#[derive(Debug, Clone)]
23pub struct ClientBuilder {
24    /// Nostr Signer
25    pub signer: Option<Arc<dyn NostrSigner>>,
26    /// WebSocket transport
27    pub websocket_transport: Arc<dyn WebSocketTransport>,
28    /// Admission policy
29    pub admit_policy: Option<Arc<dyn AdmitPolicy>>,
30    /// Database
31    pub database: Arc<dyn NostrDatabase>,
32    /// Relay monitor
33    pub monitor: Option<Monitor>,
34    /// Client options
35    pub opts: ClientOptions,
36}
37
38impl Default for ClientBuilder {
39    fn default() -> Self {
40        Self {
41            signer: None,
42            websocket_transport: Arc::new(DefaultWebsocketTransport),
43            admit_policy: None,
44            database: Arc::new(MemoryDatabase::default()),
45            monitor: None,
46            opts: ClientOptions::default(),
47        }
48    }
49}
50
51impl ClientBuilder {
52    /// New default client builder
53    #[inline]
54    pub fn new() -> Self {
55        Self::default()
56    }
57
58    /// Set signer
59    ///
60    /// # Example
61    /// ```rust,no_run
62    /// use nostr_sdk::prelude::*;
63    ///
64    /// // Signer with private keys
65    /// let keys = Keys::generate();
66    /// let client = ClientBuilder::new().signer(keys).build();
67    /// ```
68    #[inline]
69    pub fn signer<T>(mut self, signer: T) -> Self
70    where
71        T: IntoNostrSigner,
72    {
73        self.signer = Some(signer.into_nostr_signer());
74        self
75    }
76
77    /// Set custom WebSocket transport
78    ///
79    /// By default [`DefaultWebsocketTransport`] is used.
80    #[inline]
81    pub fn websocket_transport<T>(mut self, transport: T) -> Self
82    where
83        T: IntoWebSocketTransport,
84    {
85        self.websocket_transport = transport.into_transport();
86        self
87    }
88
89    /// Set an admission policy
90    #[inline]
91    pub fn admit_policy<T>(mut self, policy: T) -> Self
92    where
93        T: AdmitPolicy + 'static,
94    {
95        self.admit_policy = Some(Arc::new(policy));
96        self
97    }
98
99    /// Set database
100    #[inline]
101    pub fn database<D>(mut self, database: D) -> Self
102    where
103        D: IntoNostrDatabase,
104    {
105        self.database = database.into_nostr_database();
106        self
107    }
108
109    /// Set monitor
110    #[inline]
111    pub fn monitor(mut self, monitor: Monitor) -> Self {
112        self.monitor = Some(monitor);
113        self
114    }
115
116    /// Set opts
117    #[inline]
118    pub fn opts(mut self, opts: ClientOptions) -> Self {
119        self.opts = opts;
120        self
121    }
122
123    /// Build [`Client`]
124    #[inline]
125    pub fn build(self) -> Client {
126        Client::from_builder(self)
127    }
128}