@@ -18,7 +18,7 @@ use std::sync::Arc;
1818use tokio:: net:: { TcpListener , TcpStream } ;
1919use tokio:: sync:: oneshot;
2020use wasmtime:: component:: {
21- Accessor , Destination , FutureReader , Resource , ResourceTable , Source , StreamConsumer ,
21+ Access , Accessor , Destination , FutureReader , Resource , ResourceTable , Source , StreamConsumer ,
2222 StreamProducer , StreamReader , StreamResult ,
2323} ;
2424use wasmtime:: { AsContextMut as _, StoreContextMut } ;
@@ -236,23 +236,6 @@ impl<D> StreamConsumer<D> for SendStreamConsumer {
236236}
237237
238238impl HostTcpSocketWithStore for WasiSockets {
239- async fn bind < T > (
240- store : & Accessor < T , Self > ,
241- socket : Resource < TcpSocket > ,
242- local_address : IpSocketAddress ,
243- ) -> SocketResult < ( ) > {
244- let local_address = SocketAddr :: from ( local_address) ;
245- if !is_addr_allowed ( store, local_address, SocketAddrUse :: TcpBind ) . await {
246- return Err ( ErrorCode :: AccessDenied . into ( ) ) ;
247- }
248- store. with ( |mut store| {
249- let socket = get_socket_mut ( store. get ( ) . table , & socket) ?;
250- socket. start_bind ( local_address) ?;
251- socket. finish_bind ( ) ?;
252- Ok ( ( ) )
253- } )
254- }
255-
256239 async fn connect < T > (
257240 store : & Accessor < T , Self > ,
258241 socket : Resource < TcpSocket > ,
@@ -278,28 +261,26 @@ impl HostTcpSocketWithStore for WasiSockets {
278261 } )
279262 }
280263
281- async fn listen < T : ' static > (
282- store : & Accessor < T , Self > ,
264+ fn listen < T : ' static > (
265+ mut store : Access < ' _ , T , Self > ,
283266 socket : Resource < TcpSocket > ,
284267 ) -> SocketResult < StreamReader < Resource < TcpSocket > > > {
285268 let getter = store. getter ( ) ;
286- store. with ( |mut store| {
287- let socket = get_socket_mut ( store. get ( ) . table , & socket) ?;
288- socket. start_listen ( ) ?;
289- socket. finish_listen ( ) ?;
290- let listener = socket. tcp_listener_arc ( ) . unwrap ( ) . clone ( ) ;
291- let family = socket. address_family ( ) ;
292- let options = socket. non_inherited_options ( ) . clone ( ) ;
293- Ok ( StreamReader :: new (
294- & mut store,
295- ListenStreamProducer {
296- listener,
297- family,
298- options,
299- getter,
300- } ,
301- ) )
302- } )
269+ let socket = get_socket_mut ( store. get ( ) . table , & socket) ?;
270+ socket. start_listen ( ) ?;
271+ socket. finish_listen ( ) ?;
272+ let listener = socket. tcp_listener_arc ( ) . unwrap ( ) . clone ( ) ;
273+ let family = socket. address_family ( ) ;
274+ let options = socket. non_inherited_options ( ) . clone ( ) ;
275+ Ok ( StreamReader :: new (
276+ & mut store,
277+ ListenStreamProducer {
278+ listener,
279+ family,
280+ options,
281+ getter,
282+ } ,
283+ ) )
303284 }
304285
305286 async fn send < T : ' static > (
@@ -328,39 +309,52 @@ impl HostTcpSocketWithStore for WasiSockets {
328309 Ok ( ( ) )
329310 }
330311
331- async fn receive < T : ' static > (
332- store : & Accessor < T , Self > ,
312+ fn receive < T : ' static > (
313+ mut store : Access < T , Self > ,
333314 socket : Resource < TcpSocket > ,
334315 ) -> wasmtime:: Result < ( StreamReader < u8 > , FutureReader < Result < ( ) , ErrorCode > > ) > {
335- store. with ( |mut store| {
336- let socket = get_socket_mut ( store. get ( ) . table , & socket) ?;
337- match socket. start_receive ( ) {
338- Some ( stream) => {
339- let stream = Arc :: clone ( stream) ;
340- let ( result_tx, result_rx) = oneshot:: channel ( ) ;
341- Ok ( (
342- StreamReader :: new (
343- & mut store,
344- ReceiveStreamProducer {
345- stream,
346- result : Some ( result_tx) ,
347- } ,
348- ) ,
349- FutureReader :: new ( & mut store, result_rx) ,
350- ) )
351- }
352- None => Ok ( (
353- StreamReader :: new ( & mut store, iter:: empty ( ) ) ,
354- FutureReader :: new ( & mut store, async {
355- anyhow:: Ok ( Err ( ErrorCode :: InvalidState ) )
356- } ) ,
357- ) ) ,
316+ let socket = get_socket_mut ( store. get ( ) . table , & socket) ?;
317+ match socket. start_receive ( ) {
318+ Some ( stream) => {
319+ let stream = Arc :: clone ( stream) ;
320+ let ( result_tx, result_rx) = oneshot:: channel ( ) ;
321+ Ok ( (
322+ StreamReader :: new (
323+ & mut store,
324+ ReceiveStreamProducer {
325+ stream,
326+ result : Some ( result_tx) ,
327+ } ,
328+ ) ,
329+ FutureReader :: new ( & mut store, result_rx) ,
330+ ) )
358331 }
359- } )
332+ None => Ok ( (
333+ StreamReader :: new ( & mut store, iter:: empty ( ) ) ,
334+ FutureReader :: new ( & mut store, async {
335+ anyhow:: Ok ( Err ( ErrorCode :: InvalidState ) )
336+ } ) ,
337+ ) ) ,
338+ }
360339 }
361340}
362341
363342impl HostTcpSocket for WasiSocketsCtxView < ' _ > {
343+ async fn bind (
344+ & mut self ,
345+ socket : Resource < TcpSocket > ,
346+ local_address : IpSocketAddress ,
347+ ) -> SocketResult < ( ) > {
348+ let local_address = SocketAddr :: from ( local_address) ;
349+ if !( self . ctx . socket_addr_check ) ( local_address, SocketAddrUse :: TcpBind ) . await {
350+ return Err ( ErrorCode :: AccessDenied . into ( ) ) ;
351+ }
352+ let socket = get_socket_mut ( self . table , & socket) ?;
353+ socket. start_bind ( local_address) ?;
354+ socket. finish_bind ( ) ?;
355+ Ok ( ( ) )
356+ }
357+
364358 fn create ( & mut self , address_family : IpAddressFamily ) -> SocketResult < Resource < TcpSocket > > {
365359 let family = address_family. into ( ) ;
366360 let socket = TcpSocket :: new ( self . ctx , family) ?;
0 commit comments