summaryrefslogtreecommitdiff
path: root/common/rust/src/nats.rs
blob: c61aa4c789f4d764aab9144d79d3c26dd359cab5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
use nats::{Connection, Options};
use serde::Deserialize;

#[derive(Clone, Debug, Deserialize)]
pub struct NatsConfigurationClientCert {
    pub cert: String,
    pub key: String,
}
#[derive(Clone, Debug, Deserialize)]
pub struct NatsConfigurationTls {
    pub mtu: Option<usize>,
}

#[derive(Clone, Debug, Deserialize)]
pub struct NatsConfiguration {
    pub client_cert: Option<NatsConfigurationClientCert>,
    pub root_cert: Option<Vec<String>>,
    pub jetstream_api_prefix: Option<String>,
    pub max_reconnects: Option<usize>,
    pub reconnect_buffer_size: Option<usize>,
    pub tls: Option<NatsConfigurationTls>,
    pub client_name: Option<String>,
    pub tls_required: Option<bool>,
    pub host: String,
}

// Allows the configuration to directly create a nats connection
impl Into<Connection> for NatsConfiguration {
    fn into(self) -> Connection {
        let mut options = Options::new();

        if let Some(client_cert) = self.client_cert {
            options = options.client_cert(client_cert.cert, client_cert.key);
        }

        if let Some(root_certs) = self.root_cert {
            for root_cert in root_certs {
                options = options.add_root_certificate(root_cert);
            }
        }

        if let Some(jetstream_api_prefix) = self.jetstream_api_prefix {
            options = options.jetstream_api_prefix(jetstream_api_prefix)
        }

        options = options.max_reconnects(self.max_reconnects);
        options = options.no_echo();
        options = options.reconnect_buffer_size(self.reconnect_buffer_size.unwrap_or(64 * 1024));
        options = options.tls_required(self.tls_required.unwrap_or(false));
        options = options.with_name(&self.client_name.unwrap_or("Nova".to_string()));

        if let Some(tls) = self.tls {
            let mut config = nats::rustls::ClientConfig::new();
            config.set_mtu(&tls.mtu);
            // todo: more options?
            options = options.tls_client_config(config);
        }

        options.connect(&self.host).unwrap()
    }
}