Skip to content

Commit 0c4125f

Browse files
committed
Switch to sys modules
1 parent eae3955 commit 0c4125f

7 files changed

Lines changed: 561 additions & 273 deletions

File tree

‎src/net/mod.rs‎

Lines changed: 38 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,44 @@ use wasip3::sockets::types::{
1212
ErrorCode, IpAddressFamily, IpSocketAddress, Ipv4SocketAddress, Ipv6SocketAddress, TcpSocket,
1313
};
1414

15-
mod tcp_listener;
16-
mod tcp_stream;
17-
mod udp;
15+
mod tcp_listener {
16+
mod sys {
17+
#[cfg(target_env = "p2")]
18+
pub(super) mod p2;
19+
#[cfg(target_env = "p3")]
20+
pub(super) mod p3;
21+
}
22+
#[cfg(target_env = "p2")]
23+
pub use sys::p2::*;
24+
#[cfg(target_env = "p3")]
25+
pub use sys::p3::*;
26+
}
27+
28+
mod tcp_stream {
29+
mod sys {
30+
#[cfg(target_env = "p2")]
31+
pub(super) mod p2;
32+
#[cfg(target_env = "p3")]
33+
pub(super) mod p3;
34+
}
35+
#[cfg(target_env = "p2")]
36+
pub use sys::p2::*;
37+
#[cfg(target_env = "p3")]
38+
pub use sys::p3::*;
39+
}
40+
41+
mod udp {
42+
mod sys {
43+
#[cfg(target_env = "p2")]
44+
pub(super) mod p2;
45+
#[cfg(target_env = "p3")]
46+
pub(super) mod p3;
47+
}
48+
#[cfg(target_env = "p2")]
49+
pub use sys::p2::*;
50+
#[cfg(target_env = "p3")]
51+
pub use sys::p3::*;
52+
}
1853

1954
pub use tcp_listener::*;
2055
pub use tcp_stream::*;
Lines changed: 12 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,10 @@
1-
#[cfg(target_env = "p2")]
21
use wasip2::sockets::tcp::{IpAddressFamily, TcpSocket};
3-
#[cfg(target_env = "p3")]
4-
use wasip3::{
5-
sockets::types::{IpAddressFamily, TcpSocket},
6-
wit_bindgen::StreamReader,
7-
};
82

93
use crate::io;
104
use crate::iter::AsyncIterator;
115
use std::net::SocketAddr;
126

13-
use super::{TcpStream, create_tcp_socket, sockaddr_from_wasi, sockaddr_to_wasi, to_io_err};
14-
#[cfg(target_env = "p2")]
7+
use crate::net::{TcpStream, create_tcp_socket, sockaddr_from_wasi, sockaddr_to_wasi, to_io_err};
158
use crate::runtime::AsyncPollable;
169

1710
/// A TCP socket server, listening for connections.
@@ -20,8 +13,6 @@ pub struct TcpListener {
2013
// Field order matters: must drop this child before parent below
2114
#[cfg(target_env = "p2")]
2215
pollable: AsyncPollable,
23-
#[cfg(target_env = "p3")]
24-
connections: StreamReader<TcpSocket>,
2516
socket: TcpSocket,
2617
}
2718

@@ -40,30 +31,18 @@ impl TcpListener {
4031
let socket = create_tcp_socket(family).map_err(to_io_err)?;
4132
let local_address = sockaddr_to_wasi(addr);
4233

43-
#[cfg(target_env = "p2")]
44-
{
45-
let network = wasip2::sockets::instance_network::instance_network();
46-
socket
47-
.start_bind(&network, local_address)
48-
.map_err(to_io_err)?;
49-
let pollable = AsyncPollable::new(socket.subscribe());
50-
pollable.wait_for().await;
51-
socket.finish_bind().map_err(to_io_err)?;
34+
let network = wasip2::sockets::instance_network::instance_network();
35+
socket
36+
.start_bind(&network, local_address)
37+
.map_err(to_io_err)?;
38+
let pollable = AsyncPollable::new(socket.subscribe());
39+
pollable.wait_for().await;
40+
socket.finish_bind().map_err(to_io_err)?;
5241

53-
socket.start_listen().map_err(to_io_err)?;
54-
pollable.wait_for().await;
55-
socket.finish_listen().map_err(to_io_err)?;
56-
Ok(Self { pollable, socket })
57-
}
58-
#[cfg(target_env = "p3")]
59-
{
60-
socket.bind(local_address).map_err(to_io_err)?;
61-
let connections = socket.listen().map_err(to_io_err)?;
62-
Ok(Self {
63-
connections,
64-
socket,
65-
})
66-
}
42+
socket.start_listen().map_err(to_io_err)?;
43+
pollable.wait_for().await;
44+
socket.finish_listen().map_err(to_io_err)?;
45+
Ok(Self { pollable, socket })
6746
}
6847

6948
/// Returns the local socket address of this listener.
@@ -90,7 +69,6 @@ pub struct Incoming<'a> {
9069
impl<'a> AsyncIterator for Incoming<'a> {
9170
type Item = io::Result<TcpStream>;
9271

93-
#[cfg(target_env = "p2")]
9472
async fn next(&mut self) -> Option<Self::Item> {
9573
self.listener.pollable.wait_for().await;
9674
let (socket, input, output) = match self.listener.socket.accept().map_err(to_io_err) {
@@ -99,14 +77,4 @@ impl<'a> AsyncIterator for Incoming<'a> {
9977
};
10078
Some(Ok(TcpStream::new(input, output, socket)))
10179
}
102-
103-
#[cfg(target_env = "p3")]
104-
async fn next(&mut self) -> Option<Self::Item> {
105-
self.listener.connections.next().await.map(|socket| {
106-
let (input, _receive_result) = socket.receive();
107-
let (output, receiver) = wasip3::wit_stream::new();
108-
let _send_result = socket.send(receiver);
109-
Ok(TcpStream::new(input, output, socket))
110-
})
111-
}
11280
}

‎src/net/tcp_listener/sys/p3.rs‎

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
use wasip3::{
2+
sockets::types::{IpAddressFamily, TcpSocket},
3+
wit_bindgen::StreamReader,
4+
};
5+
6+
use crate::io;
7+
use crate::iter::AsyncIterator;
8+
use std::net::SocketAddr;
9+
10+
use crate::net::{TcpStream, create_tcp_socket, sockaddr_from_wasi, sockaddr_to_wasi, to_io_err};
11+
12+
/// A TCP socket server, listening for connections.
13+
#[derive(Debug)]
14+
pub struct TcpListener {
15+
connections: StreamReader<TcpSocket>,
16+
socket: TcpSocket,
17+
}
18+
19+
impl TcpListener {
20+
/// Creates a new TcpListener which will be bound to the specified address.
21+
///
22+
/// The returned listener is ready for accepting connections.
23+
pub async fn bind(addr: &str) -> io::Result<Self> {
24+
let addr: SocketAddr = addr
25+
.parse()
26+
.map_err(|_| io::Error::other("failed to parse string to socket addr"))?;
27+
let family = match addr {
28+
SocketAddr::V4(_) => IpAddressFamily::Ipv4,
29+
SocketAddr::V6(_) => IpAddressFamily::Ipv6,
30+
};
31+
let socket = create_tcp_socket(family).map_err(to_io_err)?;
32+
let local_address = sockaddr_to_wasi(addr);
33+
34+
socket.bind(local_address).map_err(to_io_err)?;
35+
let connections = socket.listen().map_err(to_io_err)?;
36+
Ok(Self {
37+
connections,
38+
socket,
39+
})
40+
}
41+
42+
/// Returns the local socket address of this listener.
43+
pub fn local_addr(&self) -> io::Result<std::net::SocketAddr> {
44+
let addr = self.socket.get_local_address();
45+
addr.map_err(to_io_err).map(sockaddr_from_wasi)
46+
}
47+
48+
/// Returns an iterator over the connections being received on this listener.
49+
pub fn incoming(&mut self) -> Incoming<'_> {
50+
Incoming { listener: self }
51+
}
52+
}
53+
54+
/// An iterator that infinitely accepts connections on a TcpListener.
55+
#[derive(Debug)]
56+
pub struct Incoming<'a> {
57+
listener: &'a mut TcpListener,
58+
}
59+
60+
impl<'a> AsyncIterator for Incoming<'a> {
61+
type Item = io::Result<TcpStream>;
62+
63+
async fn next(&mut self) -> Option<Self::Item> {
64+
self.listener.connections.next().await.map(|socket| {
65+
let (input, _receive_result) = socket.receive();
66+
let (output, receiver) = wasip3::wit_stream::new();
67+
let _send_result = socket.send(receiver);
68+
Ok(TcpStream::new(input, output, socket))
69+
})
70+
}
71+
}
Lines changed: 9 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
use std::io::ErrorKind;
22
use std::net::{SocketAddr, ToSocketAddrs};
33

4-
#[cfg(target_env = "p2")]
54
use wasip2::{
65
io::streams::{InputStream, OutputStream},
76
sockets::{
@@ -11,16 +10,8 @@ use wasip2::{
1110
},
1211
};
1312

14-
#[cfg(target_env = "p3")]
15-
use wasip3::sockets::types::{IpAddressFamily, IpSocketAddress, Ipv4SocketAddress, TcpSocket};
16-
#[cfg(target_env = "p3")]
17-
type InputStream = wasip3::wit_bindgen::StreamReader<u8>;
18-
#[cfg(target_env = "p3")]
19-
type OutputStream = wasip3::wit_bindgen::StreamWriter<u8>;
20-
21-
use super::{create_tcp_socket, to_io_err};
2213
use crate::io::{self, AsyncInputStream, AsyncOutputStream};
23-
#[cfg(target_env = "p2")]
14+
use crate::net::{create_tcp_socket, to_io_err};
2415
use crate::runtime::AsyncPollable;
2516

2617
/// A TCP stream between a local and a remote socket.
@@ -79,53 +70,36 @@ impl TcpStream {
7970
}
8071
SocketAddr::V6(_) => todo!("IPv6 not yet supported in `wstd::net::TcpStream`"),
8172
};
82-
#[cfg(target_env = "p2")]
83-
{
84-
let network = instance_network();
85-
socket
86-
.start_connect(&network, remote_address)
87-
.map_err(to_io_err)?;
88-
let pollable = AsyncPollable::new(socket.subscribe());
89-
pollable.wait_for().await;
90-
let (input, output) = socket.finish_connect().map_err(to_io_err)?;
91-
Ok(TcpStream::new(input, output, socket))
92-
}
93-
#[cfg(target_env = "p3")]
94-
{
95-
socket.connect(remote_address).await.map_err(to_io_err)?;
96-
let (input, _receive_result) = socket.receive();
97-
let (output, receiver) = wasip3::wit_stream::new();
98-
let _send_result = socket.send(receiver);
99-
Ok(TcpStream::new(input, output, socket))
100-
}
73+
let network = instance_network();
74+
socket
75+
.start_connect(&network, remote_address)
76+
.map_err(to_io_err)?;
77+
let pollable = AsyncPollable::new(socket.subscribe());
78+
pollable.wait_for().await;
79+
let (input, output) = socket.finish_connect().map_err(to_io_err)?;
80+
Ok(TcpStream::new(input, output, socket))
10181
}
10282

10383
/// Returns the socket address of the remote peer of this TCP connection.
10484
pub fn peer_addr(&self) -> io::Result<String> {
105-
#[cfg(target_env = "p2")]
10685
let addr = self.socket.remote_address().map_err(to_io_err)?;
107-
#[cfg(target_env = "p3")]
108-
let addr = self.socket.get_remote_address().map_err(to_io_err)?;
10986
Ok(format!("{addr:?}"))
11087
}
11188

11289
pub fn split(&mut self) -> (ReadHalf<'_>, WriteHalf<'_>) {
11390
(
11491
ReadHalf {
11592
stream: &mut self.input,
116-
#[cfg(target_env = "p2")]
11793
socket: &self.socket,
11894
},
11995
WriteHalf {
12096
stream: &mut self.output,
121-
#[cfg(target_env = "p2")]
12297
socket: &self.socket,
12398
},
12499
)
125100
}
126101
}
127102

128-
#[cfg(target_env = "p2")]
129103
impl Drop for TcpStream {
130104
fn drop(&mut self) {
131105
let _ = self
@@ -160,11 +134,9 @@ impl io::AsyncWrite for TcpStream {
160134

161135
pub struct ReadHalf<'a> {
162136
stream: &'a mut AsyncInputStream,
163-
#[cfg(target_env = "p2")]
164137
socket: &'a TcpSocket,
165138
}
166139

167-
#[cfg(target_env = "p2")]
168140
impl<'a> Drop for ReadHalf<'a> {
169141
fn drop(&mut self) {
170142
let _ = self
@@ -185,7 +157,6 @@ impl<'a> io::AsyncRead for ReadHalf<'a> {
185157

186158
pub struct WriteHalf<'a> {
187159
stream: &'a mut AsyncOutputStream,
188-
#[cfg(target_env = "p2")]
189160
socket: &'a TcpSocket,
190161
}
191162

@@ -203,7 +174,6 @@ impl<'a> io::AsyncWrite for WriteHalf<'a> {
203174
}
204175
}
205176

206-
#[cfg(target_env = "p2")]
207177
impl<'a> Drop for WriteHalf<'a> {
208178
fn drop(&mut self) {
209179
let _ = self

0 commit comments

Comments
 (0)