cap_async_std/net/
pool.rs1use crate::net::{TcpListener, TcpStream, ToSocketAddrs, UdpSocket};
2use async_std::{io, net};
3use cap_primitives::net::no_socket_addrs;
4use cap_primitives::{ipnet, AmbientAuthority};
5
6#[derive(Clone, Default)]
22pub struct Pool {
23 cap: cap_primitives::net::Pool,
24}
25
26impl Pool {
27 pub fn new() -> Self {
29 Self {
30 cap: cap_primitives::net::Pool::new(),
31 }
32 }
33
34 pub async fn insert<A: ToSocketAddrs>(
40 &mut self,
41 addrs: A,
42 ambient_authority: AmbientAuthority,
43 ) -> io::Result<()> {
44 for addr in addrs.to_socket_addrs().await? {
45 self.cap.insert(addr, ambient_authority)?;
46 }
47 Ok(())
48 }
49
50 pub fn insert_socket_addr(
56 &mut self,
57 addr: net::SocketAddr,
58 ambient_authority: AmbientAuthority,
59 ) {
60 self.cap.insert_socket_addr(addr, ambient_authority)
61 }
62
63 pub fn insert_ip_net_port_any(
72 &mut self,
73 ip_net: ipnet::IpNet,
74 ambient_authority: AmbientAuthority,
75 ) {
76 self.cap.insert_ip_net_port_any(ip_net, ambient_authority)
77 }
78
79 pub fn insert_ip_net_port_range(
89 &mut self,
90 ip_net: ipnet::IpNet,
91 ports_start: u16,
92 ports_end: Option<u16>,
93 ambient_authority: AmbientAuthority,
94 ) {
95 self.cap
96 .insert_ip_net_port_range(ip_net, ports_start, ports_end, ambient_authority)
97 }
98
99 pub fn insert_ip_net(
105 &mut self,
106 ip_net: ipnet::IpNet,
107 port: u16,
108 ambient_authority: AmbientAuthority,
109 ) {
110 self.cap.insert_ip_net(ip_net, port, ambient_authority)
111 }
112
113 #[doc(alias = "bind")]
118 #[inline]
119 pub async fn bind_tcp_listener<A: ToSocketAddrs>(&self, addr: A) -> io::Result<TcpListener> {
120 let addrs = addr.to_socket_addrs().await?;
121
122 let mut last_err = None;
123 for addr in addrs {
124 self.cap.check_addr(&addr)?;
125 match net::TcpListener::bind(addr).await {
127 Ok(tcp_listener) => return Ok(TcpListener::from_std(tcp_listener)),
128 Err(e) => last_err = Some(e),
129 }
130 }
131 match last_err {
132 Some(e) => Err(e),
133 None => Err(no_socket_addrs()),
134 }
135 }
136
137 #[doc(alias = "connect")]
141 #[inline]
142 pub async fn connect_tcp_stream<A: ToSocketAddrs>(&self, addr: A) -> io::Result<TcpStream> {
143 let addrs = addr.to_socket_addrs().await?;
144
145 let mut last_err = None;
146 for addr in addrs {
147 self.cap.check_addr(&addr)?;
148 match net::TcpStream::connect(addr).await {
150 Ok(tcp_stream) => return Ok(TcpStream::from_std(tcp_stream)),
151 Err(e) => last_err = Some(e),
152 }
153 }
154 match last_err {
155 Some(e) => Err(e),
156 None => Err(no_socket_addrs()),
157 }
158 }
159
160 #[doc(alias = "bind")]
166 #[inline]
167 pub async fn bind_udp_socket<A: ToSocketAddrs>(&self, addr: A) -> io::Result<UdpSocket> {
168 let addrs = addr.to_socket_addrs().await?;
169
170 let mut last_err = None;
171 for addr in addrs {
172 self.cap.check_addr(&addr)?;
173 match net::UdpSocket::bind(addr).await {
174 Ok(udp_socket) => return Ok(UdpSocket::from_std(udp_socket)),
175 Err(e) => last_err = Some(e),
176 }
177 }
178 match last_err {
179 Some(e) => Err(e),
180 None => Err(no_socket_addrs()),
181 }
182 }
183
184 #[doc(alias = "send_to")]
188 #[inline]
189 pub async fn send_to_udp_socket_addr<A: ToSocketAddrs>(
190 &self,
191 udp_socket: &UdpSocket,
192 buf: &[u8],
193 addr: A,
194 ) -> io::Result<usize> {
195 let mut addrs = addr.to_socket_addrs().await?;
196
197 let addr = match addrs.next() {
199 None => return Err(no_socket_addrs()),
200 Some(addr) => addr,
201 };
202 self.cap.check_addr(&addr)?;
203 udp_socket.std.send_to(buf, addr).await
204 }
205
206 #[doc(alias = "connect")]
210 #[inline]
211 pub async fn connect_udp_socket<A: ToSocketAddrs>(
212 &self,
213 udp_socket: &UdpSocket,
214 addr: A,
215 ) -> io::Result<()> {
216 let addrs = addr.to_socket_addrs().await?;
217
218 let mut last_err = None;
219 for addr in addrs {
220 self.cap.check_addr(&addr)?;
221 match udp_socket.std.connect(addr).await {
222 Ok(()) => return Ok(()),
223 Err(e) => last_err = Some(e),
224 }
225 }
226 match last_err {
227 Some(e) => Err(e),
228 None => Err(no_socket_addrs()),
229 }
230 }
231}