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