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