use std::thread;
use std::time::{Duration, SystemTime};
use crate::client::RpcClient;
use crate::err::{ZbusErr, ZbusResult};
use crate::message::{Message, Request, Response};
use crate::wsocket::WsClientHandler;
pub struct WsRpcHandler {
pub handler: WsClientHandler,
}
impl RpcClient for WsRpcHandler {
fn deliver(&self, req: Request) -> ZbusResult<Response> {
match req.id() {
Some(msg_id) => {
let msg_id = String::from(msg_id);
self.handler.send(Message::Request(req))?;
let timeout = 10 * 1000;
self.response_timeout(msg_id, timeout)
}
None => Err(ZbusErr::validate("request id not found")),
}
}
}
impl WsRpcHandler {
fn response_timeout(&self, msg_id: String, timeout: u64) -> ZbusResult<Response> {
let time = SystemTime::now();
loop {
let resp = self.handler.response(msg_id.clone());
if resp.is_ok() {
return resp;
} else {
let current = match SystemTime::now().duration_since(time) {
Ok(n) => n.as_millis(),
Err(_) => break,
};
if current > timeout as u128 {
break;
}
}
};
Err(ZbusErr::time_out(" is not found response", timeout as i32))
}
}