@@ -16,40 +16,27 @@ import (
1616 tcpcreatesocket "internal/wasi/sockets/v0.2.0/tcp-create-socket"
1717)
1818
19+ type wasip2TcpSocket struct {
20+ tcpcreatesocket.TCPSocket
21+ tcp.Pollable
22+ * streams.InputStream
23+ * streams.OutputStream
24+ }
25+
1926func createTCPSocket (af network.IPAddressFamily ) (wasip2Socket , error ) {
2027 res := tcpcreatesocket .CreateTCPSocket (af )
2128 if res .IsErr () {
2229 return nil , fmt .Errorf ("failed to create TCP socket: %s" , res .Err ().String ())
2330 }
2431
2532 sock := res .OK ()
26- return tcpServerSocket {
27- TCPSocket : sock ,
33+ return & wasip2TcpSocket {
34+ TCPSocket : * sock ,
2835 Pollable : sock .Subscribe (),
2936 }, nil
3037}
3138
32- type tcpServerSocket struct {
33- * tcpcreatesocket.TCPSocket
34- tcp.Pollable
35- }
36-
37- func (s tcpServerSocket ) Recv (buf []byte , flags int , deadline time.Time ) (int , error ) {
38- fmt .Println ("TODO server Recv" ) ///
39- return 0 , nil
40- }
41-
42- func (s tcpServerSocket ) Send (buf []byte , flags int , deadline time.Time ) (int , error ) {
43- fmt .Println ("TODO server Send" ) ///
44- return 0 , nil
45- }
46-
47- func (s tcpServerSocket ) Close () error {
48- fmt .Println ("TODO server Close" ) ///
49- return nil
50- }
51-
52- func (s tcpServerSocket ) Bind (globalNetwork instancenetwork.Network , addr network.IPSocketAddress ) error {
39+ func (s * wasip2TcpSocket ) Bind (globalNetwork instancenetwork.Network , addr network.IPSocketAddress ) error {
5340 res := s .StartBind (globalNetwork , addr )
5441 if res .IsErr () {
5542 return fmt .Errorf ("failed to start binding socket: %s" , res .Err ().String ())
@@ -63,7 +50,7 @@ func (s tcpServerSocket) Bind(globalNetwork instancenetwork.Network, addr networ
6350 return nil
6451}
6552
66- func (s tcpServerSocket ) Listen (backlog int ) error {
53+ func (s * wasip2TcpSocket ) Listen (backlog int ) error {
6754 res := s .StartListen ()
6855 if res .IsErr () {
6956 return fmt .Errorf ("failed to start listening on socket: %s" , res .Err ().String ())
@@ -77,7 +64,7 @@ func (s tcpServerSocket) Listen(backlog int) error {
7764 return nil
7865}
7966
80- func (s tcpServerSocket ) Accept () (wasip2Socket , * network.IPSocketAddress , error ) {
67+ func (s * wasip2TcpSocket ) Accept () (wasip2Socket , * network.IPSocketAddress , error ) {
8168 var clientSocket * tcpcreatesocket.TCPSocket
8269 var inStream * streams.InputStream
8370 var outStream * streams.OutputStream
@@ -112,26 +99,45 @@ func (s tcpServerSocket) Accept() (wasip2Socket, *network.IPSocketAddress, error
11299 return nil , nil , fmt .Errorf ("failed to get remote address: %s" , raddrRes .Err ().String ())
113100 }
114101
115- sock := tcpSocket {
116- TCPSocket : clientSocket ,
102+ return & wasip2TcpSocket {
103+ TCPSocket : * clientSocket ,
104+ Pollable : clientSocket .Subscribe (),
117105 InputStream : inStream ,
118106 OutputStream : outStream ,
107+ }, raddrRes .OK (), nil
108+ }
109+
110+ func (s * wasip2TcpSocket ) Connect (globalNetwork instancenetwork.Network , host string , ip network.IPSocketAddress ) error {
111+ res := s .StartConnect (globalNetwork , ip )
112+ if res .IsErr () {
113+ return fmt .Errorf ("failed to start connecting socket: %s" , res .Err ().String ())
119114 }
120115
121- return sock , raddrRes .OK (), nil
122- }
116+ for {
117+ connRes := s .FinishConnect ()
118+ if connRes .IsOK () {
119+ s .InputStream , s .OutputStream = & connRes .OK ().F0 , & connRes .OK ().F1
120+ return nil
121+ }
123122
124- type tcpSocket struct {
125- * tcpcreatesocket.TCPSocket
126- * streams.InputStream
127- * streams.OutputStream
123+ if * connRes .Err () == network .ErrorCodeWouldBlock {
124+ s .Block ()
125+ continue
126+ }
127+
128+ return fmt .Errorf ("failed to finish connecting socket: %s" , connRes .Err ().String ())
129+ }
128130}
129131
130- func (c tcpSocket ) Send (buf []byte , flags int , deadline time.Time ) (int , error ) {
132+ func (c wasip2TcpSocket ) Send (buf []byte , flags int , deadline time.Time ) (int , error ) {
131133 if flags != 0 {
132134 fmt .Println ("wasip2 TCP send flags TODO:" , flags ) ///
133135 }
134136
137+ if c .OutputStream == nil {
138+ return - 1 , fmt .Errorf ("send called on a socket without open streams" )
139+ }
140+
135141 res := c .BlockingWriteAndFlush (cm .ToList ([]uint8 (buf )))
136142 if res .IsErr () {
137143 return - 1 , fmt .Errorf ("failed to write to output stream: %s" , res .Err ().String ())
@@ -140,11 +146,15 @@ func (c tcpSocket) Send(buf []byte, flags int, deadline time.Time) (int, error)
140146 return len (buf ), nil
141147}
142148
143- func (c tcpSocket ) Recv (buf []byte , flags int , deadline time.Time ) (int , error ) {
149+ func (c wasip2TcpSocket ) Recv (buf []byte , flags int , deadline time.Time ) (int , error ) {
144150 if flags != 0 {
145151 fmt .Println ("wasip2 TCP recv flags TODO:" , flags ) ///
146152 }
147153
154+ if c .InputStream == nil {
155+ return - 1 , fmt .Errorf ("recv called on a socket without open streams" )
156+ }
157+
148158 res := c .BlockingRead (uint64 (len (buf )))
149159 if res .IsErr () {
150160 return - 1 , fmt .Errorf ("failed to read from input stream: %s" , res .Err ().String ())
@@ -153,28 +163,20 @@ func (c tcpSocket) Recv(buf []byte, flags int, deadline time.Time) (int, error)
153163 return copy (buf , res .OK ().Slice ()), nil
154164}
155165
156- func (c tcpSocket ) Close () error {
166+ func (c wasip2TcpSocket ) Close () error {
157167 res := c .TCPSocket .Shutdown (tcp .ShutdownTypeBoth )
158168 if res .IsErr () {
159169 return fmt .Errorf ("failed to shutdown client socket: %s" , res .Err ().String ())
160170 }
161171
162- c .InputStream .ResourceDrop ()
163- c .OutputStream .ResourceDrop ()
172+ if c .InputStream != nil {
173+ c .InputStream .ResourceDrop ()
174+ }
175+ if c .OutputStream != nil {
176+ c .OutputStream .ResourceDrop ()
177+ }
178+ c .Pollable .ResourceDrop ()
164179 c .TCPSocket .ResourceDrop ()
165180
166181 return nil
167182}
168-
169- func (s tcpSocket ) Bind (globalNetwork instancenetwork.Network , addr network.IPSocketAddress ) error {
170- fmt .Println ("TODO client Bind" ) ///
171- return nil
172- }
173- func (s tcpSocket ) Listen (backlog int ) error {
174- fmt .Println ("TODO client Listen" ) ///
175- return nil
176- }
177- func (s tcpSocket ) Accept () (wasip2Socket , * network.IPSocketAddress , error ) {
178- fmt .Println ("TODO client Accept" ) ///
179- return nil , nil , nil
180- }
0 commit comments