Skip to main content

wasmtime_wasi/p2/host/
tcp_create_socket.rs

1use crate::p2::bindings::{sockets::network::IpAddressFamily, sockets::tcp_create_socket};
2use crate::p2::{SocketResult, TcpSocket};
3use crate::sockets::{SocketAddressFamily, TcpSocket as P3Socket, WasiSocketsCtxView};
4use wasmtime::component::Resource;
5
6impl tcp_create_socket::Host for WasiSocketsCtxView<'_> {
7    fn create_tcp_socket(
8        &mut self,
9        address_family: IpAddressFamily,
10    ) -> SocketResult<Resource<TcpSocket>> {
11        let socket = P3Socket::new(self.ctx, address_family.into())?;
12        let socket = self.table.push(TcpSocket::new(socket))?;
13        Ok(socket)
14    }
15}
16
17impl From<IpAddressFamily> for SocketAddressFamily {
18    fn from(family: IpAddressFamily) -> SocketAddressFamily {
19        match family {
20            IpAddressFamily::Ipv4 => Self::Ipv4,
21            IpAddressFamily::Ipv6 => Self::Ipv6,
22        }
23    }
24}
25
26mod named {
27    use crate::p2::SocketError;
28    use crate::p2::bindings::named_imports::wasi::sockets::tcp_create_socket;
29    use crate::p2::bindings::sockets::network::ErrorCode;
30    use crate::p2::bindings::sockets::network::IpAddressFamily;
31    use crate::p2::{SocketResult, TcpSocket};
32    use crate::sockets::WasiSocketsNamedView;
33    use crate::{NamedId, WasiCtxNamedView};
34    use wasmtime::component::Resource;
35
36    impl<T> tcp_create_socket::Host for WasiCtxNamedView<'_, T>
37    where
38        T: WasiSocketsNamedView,
39    {
40        fn convert_error_code(&mut self, err: SocketError) -> wasmtime::Result<ErrorCode> {
41            err.downcast()
42        }
43
44        fn create_tcp_socket(
45            &mut self,
46            id: NamedId,
47            address_family: IpAddressFamily,
48        ) -> SocketResult<Resource<TcpSocket>> {
49            super::tcp_create_socket::Host::create_tcp_socket(
50                &mut self.0.sockets(id),
51                address_family,
52            )
53        }
54    }
55}