1use std::thread;
2use std::time::{Duration, SystemTime};
3
4use crate::client::RpcClient;
5use crate::err::{ZbusErr, ZbusResult};
6use crate::message::{Message, Request, Response};
7use crate::wsocket::WsClientHandler;
8
9pub struct WsRpcHandler {
11 pub handler: WsClientHandler,
12}
13
14impl RpcClient for WsRpcHandler {
15 fn deliver(&self, req: Request) -> ZbusResult<Response> {
16 match req.id() {
17 Some(msg_id) => {
18 let msg_id = String::from(msg_id);
19 self.handler.send(Message::Request(req))?;
20 let timeout = 10 * 1000;
21 self.response_timeout(msg_id, timeout)
22 }
23 None => Err(ZbusErr::validate("request id not found")),
24 }
25 }
26}
27
28impl WsRpcHandler {
29 fn response_timeout(&self, msg_id: String, timeout: u64) -> ZbusResult<Response> {
30 let time = SystemTime::now();
33 loop {
34 let resp = self.handler.response(msg_id.clone());
35 if resp.is_ok() {
36 return resp;
37 } else {
38 let current = match SystemTime::now().duration_since(time) {
39 Ok(n) => n.as_millis(),
40 Err(_) => break,
41 };
42 if current > timeout as u128 {
43 break;
44 }
45 }
46 };
47 Err(ZbusErr::time_out(" is not found response", timeout as i32))
48 }
49
50 }