1+ #[ cfg( target_env = "p2" ) ]
12use wasip2:: sockets:: tcp:: { IpAddressFamily , TcpSocket } ;
3+ #[ cfg( target_env = "p3" ) ]
4+ use wasip3:: {
5+ sockets:: types:: { IpAddressFamily , TcpSocket } ,
6+ wit_bindgen:: StreamReader ,
7+ } ;
28
39use crate :: io;
410use crate :: iter:: AsyncIterator ;
511use std:: net:: SocketAddr ;
612
7- use super :: { TcpStream , sockaddr_from_wasi, sockaddr_to_wasi, to_io_err} ;
13+ use super :: { TcpStream , create_tcp_socket, sockaddr_from_wasi, sockaddr_to_wasi, to_io_err} ;
14+ #[ cfg( target_env = "p2" ) ]
815use crate :: runtime:: AsyncPollable ;
916
1017/// A TCP socket server, listening for connections.
1118#[ derive( Debug ) ]
1219pub struct TcpListener {
1320 // Field order matters: must drop this child before parent below
21+ #[ cfg( target_env = "p2" ) ]
1422 pollable : AsyncPollable ,
23+ #[ cfg( target_env = "p3" ) ]
24+ connections : StreamReader < TcpSocket > ,
1525 socket : TcpSocket ,
1626}
1727
@@ -27,31 +37,42 @@ impl TcpListener {
2737 SocketAddr :: V4 ( _) => IpAddressFamily :: Ipv4 ,
2838 SocketAddr :: V6 ( _) => IpAddressFamily :: Ipv6 ,
2939 } ;
30- let socket =
31- wasip2:: sockets:: tcp_create_socket:: create_tcp_socket ( family) . map_err ( to_io_err) ?;
32- let network = wasip2:: sockets:: instance_network:: instance_network ( ) ;
33-
40+ let socket = create_tcp_socket ( family) . map_err ( to_io_err) ?;
3441 let local_address = sockaddr_to_wasi ( addr) ;
3542
36- socket
37- . start_bind ( & network, local_address)
38- . map_err ( to_io_err) ?;
39- let pollable = AsyncPollable :: new ( socket. subscribe ( ) ) ;
40- pollable. wait_for ( ) . await ;
41- socket. finish_bind ( ) . map_err ( to_io_err) ?;
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) ?;
4252
43- socket. start_listen ( ) . map_err ( to_io_err) ?;
44- pollable. wait_for ( ) . await ;
45- socket. finish_listen ( ) . map_err ( to_io_err) ?;
46- Ok ( Self { pollable, socket } )
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+ }
4767 }
4868
4969 /// Returns the local socket address of this listener.
5070 pub fn local_addr ( & self ) -> io:: Result < std:: net:: SocketAddr > {
51- self . socket
52- . local_address ( )
53- . map_err ( to_io_err)
54- . map ( sockaddr_from_wasi)
71+ #[ cfg( target_env = "p2" ) ]
72+ let addr = self . socket . local_address ( ) ;
73+ #[ cfg( target_env = "p3" ) ]
74+ let addr = self . socket . get_local_address ( ) ;
75+ addr. map_err ( to_io_err) . map ( sockaddr_from_wasi)
5576 }
5677
5778 /// Returns an iterator over the connections being received on this listener.
@@ -69,6 +90,7 @@ pub struct Incoming<'a> {
6990impl < ' a > AsyncIterator for Incoming < ' a > {
7091 type Item = io:: Result < TcpStream > ;
7192
93+ #[ cfg( target_env = "p2" ) ]
7294 async fn next ( & mut self ) -> Option < Self :: Item > {
7395 self . listener . pollable . wait_for ( ) . await ;
7496 let ( socket, input, output) = match self . listener . socket . accept ( ) . map_err ( to_io_err) {
@@ -77,4 +99,14 @@ impl<'a> AsyncIterator for Incoming<'a> {
7799 } ;
78100 Some ( Ok ( TcpStream :: new ( input, output, socket) ) )
79101 }
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+ }
80112}
0 commit comments