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