zbus_lib/rpc/
handler.rs

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
9//实现了rpclient trait并且对wsClientHandler进行封装,可以实现轻量clone
10pub 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 millis = 5;
31        // let num = timeout / millis;
32        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    // async fn deliver(&self, req: Request) -> ZbusResult<Response> {
51    //     match req.id() {
52    //         Some(msg_id) => {
53    //             let msg_id = String::from(msg_id);
54    //             self.handler.send(req)?;
55    //             let timeout = 10 * 1000;
56    //             self.response_timeout(msg_id, timeout)
57    //         }
58    //         None => Err(ZbusErr::Validate("request id not found".into())),
59    //     }
60    // }
61}