leyline/core/config/
socket.rs1use std::net::{IpAddr, Ipv4Addr, Ipv6Addr};
2use std::time::Duration;
3
4use crate::tls::HappyEyeballsConfig;
5
6#[derive(Debug, Clone, PartialEq, Eq)]
7#[non_exhaustive]
8pub struct SocketConfig {
9 pub(crate) local_address: Option<IpAddr>,
10 pub(crate) local_ipv4: Option<Ipv4Addr>,
11 pub(crate) local_ipv6: Option<Ipv6Addr>,
12 pub(crate) tcp_nodelay: Option<bool>,
13 pub(crate) tcp_keepalive: Option<Duration>,
14 pub(crate) tcp_keepalive_interval: Option<Duration>,
15 pub(crate) tcp_keepalive_retries: Option<u32>,
16 pub(crate) tcp_user_timeout: Option<Duration>,
17 pub(crate) send_buffer_size: Option<usize>,
18 pub(crate) recv_buffer_size: Option<usize>,
19 pub(crate) strict: bool,
20 pub(crate) happy_eyeballs: Option<HappyEyeballsConfig>,
21}
22
23impl Default for SocketConfig {
24 fn default() -> Self {
25 Self {
26 local_address: None,
27 local_ipv4: None,
28 local_ipv6: None,
29 tcp_nodelay: None,
30 tcp_keepalive: Some(Duration::from_secs(60)),
31 tcp_keepalive_interval: Some(Duration::from_secs(30)),
32 tcp_keepalive_retries: Some(3),
33 tcp_user_timeout: None,
34 send_buffer_size: None,
35 recv_buffer_size: None,
36 strict: false,
37 happy_eyeballs: None,
38 }
39 }
40}
41
42impl SocketConfig {
43 pub fn new() -> Self {
44 Self::default()
45 }
46
47 pub fn local_address(mut self, addr: impl Into<Option<IpAddr>>) -> Self {
48 self.local_address = addr.into();
49 self
50 }
51
52 pub fn local_ipv4(mut self, addr: impl Into<Option<Ipv4Addr>>) -> Self {
53 self.local_ipv4 = addr.into();
54 self
55 }
56
57 pub fn local_ipv6(mut self, addr: impl Into<Option<Ipv6Addr>>) -> Self {
58 self.local_ipv6 = addr.into();
59 self
60 }
61
62 pub fn tcp_nodelay(mut self, on: impl Into<Option<bool>>) -> Self {
63 self.tcp_nodelay = on.into();
64 self
65 }
66
67 pub fn tcp_keepalive(mut self, d: impl Into<Option<Duration>>) -> Self {
68 self.tcp_keepalive = d.into();
69 self
70 }
71
72 pub fn tcp_keepalive_interval(mut self, d: impl Into<Option<Duration>>) -> Self {
73 self.tcp_keepalive_interval = d.into();
74 self
75 }
76
77 pub fn tcp_keepalive_retries(mut self, n: impl Into<Option<u32>>) -> Self {
78 self.tcp_keepalive_retries = n.into();
79 self
80 }
81
82 pub fn tcp_user_timeout(mut self, d: impl Into<Option<Duration>>) -> Self {
83 self.tcp_user_timeout = d.into();
84 self
85 }
86
87 pub fn send_buffer_size(mut self, n: impl Into<Option<usize>>) -> Self {
88 self.send_buffer_size = n.into();
89 self
90 }
91
92 pub fn recv_buffer_size(mut self, n: impl Into<Option<usize>>) -> Self {
93 self.recv_buffer_size = n.into();
94 self
95 }
96
97 pub fn strict(mut self, on: bool) -> Self {
98 self.strict = on;
99 self
100 }
101
102 pub fn happy_eyeballs(mut self, config: impl Into<Option<HappyEyeballsConfig>>) -> Self {
103 self.happy_eyeballs = config.into();
104 self
105 }
106}