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