1 use crate::wasi::clocks::monotonic_clock; 2 use crate::wasi::io::error::Error as IoError; 3 use crate::wasi::io::streams::StreamError; 4 use crate::wasi::tls::types::{ClientConnection, ClientHandshake, InputStream, OutputStream}; 5 6 const TIMEOUT_NS: u64 = 1_000_000_000; 7 8 impl ClientHandshake { blocking_finish(self) -> Result<(ClientConnection, InputStream, OutputStream), IoError>9 pub fn blocking_finish(self) -> Result<(ClientConnection, InputStream, OutputStream), IoError> { 10 let future = ClientHandshake::finish(self); 11 let timeout = monotonic_clock::subscribe_duration(TIMEOUT_NS * 200); 12 let pollable = future.subscribe(); 13 14 loop { 15 match future.get() { 16 None => pollable.block_until(&timeout).expect("timed out"), 17 Some(Ok(r)) => return r, 18 Some(Err(e)) => { 19 eprintln!("{e:?}"); 20 unimplemented!() 21 } 22 } 23 } 24 } 25 } 26 27 impl ClientConnection { blocking_close_output( &self, output: &OutputStream, ) -> Result<(), crate::wasi::io::error::Error>28 pub fn blocking_close_output( 29 &self, 30 output: &OutputStream, 31 ) -> Result<(), crate::wasi::io::error::Error> { 32 let timeout = monotonic_clock::subscribe_duration(TIMEOUT_NS); 33 let pollable = output.subscribe(); 34 35 self.close_output(); 36 37 loop { 38 match output.check_write() { 39 Ok(0) => pollable.block_until(&timeout).expect("timed out"), 40 Ok(_) => unreachable!( 41 "After calling close_output, the output stream should never accept new writes again." 42 ), 43 Err(StreamError::Closed) => return Ok(()), 44 Err(StreamError::LastOperationFailed(e)) => return Err(e), 45 } 46 } 47 } 48 } 49