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