use ws_reconnect_client::{WebSocketClient, WebSocketClientBuilder};
use super::{SubscribeRequest, Subscription, RtdsMessage};
use crate::Result;
pub struct RtdsWebSocket {
client: WebSocketClient<RtdsMessage>,
}
impl RtdsWebSocket {
pub fn new(rtds_url: impl Into<String>) -> Self {
let client = WebSocketClientBuilder::new(rtds_url)
.ping_interval(5)
.auto_reconnect(true)
.max_retries(20)
.build();
Self { client }
}
pub fn with_client(client: WebSocketClient<RtdsMessage>) -> Self {
Self { client }
}
pub async fn listen<F>(&self, subscriptions: Vec<Subscription>, mut handler: F) -> Result<()>
where
F: FnMut(RtdsMessage) -> Result<()>,
{
let subscribe_request = SubscribeRequest::new(subscriptions);
self.client
.listen(Some(subscribe_request), |msg| {
handler(msg).map_err(|e| ws_reconnect_client::WebSocketError::HandlerError(e.to_string()))
})
.await?;
Ok(())
}
}