use std::sync::{Arc, Mutex};
use crate::sip::SipTransport;
pub struct HeartbeatTransaction {
state: Arc<Mutex<bool>>,
pub transport: Arc<SipTransport>,
transport_function: Box<dyn Fn(&Arc<SipTransport>, Vec<u8>) -> bool + Send + Sync + 'static>,
callback: Box<dyn Fn(bool) + Send + Sync>,
}
impl HeartbeatTransaction {
pub fn new<F, C>(transport: &Arc<SipTransport>, f: F, c: C) -> HeartbeatTransaction
where
F: Fn(&Arc<SipTransport>, Vec<u8>) -> bool + Send + Sync + 'static,
C: Fn(bool) + Send + Sync + 'static,
{
HeartbeatTransaction {
state: Arc::new(Mutex::new(false)),
transport: Arc::clone(&transport),
transport_function: Box::new(f),
callback: Box::new(c),
}
}
pub fn start(&self) {
(self.transport_function)(&self.transport, b"\r\n".to_vec());
}
pub fn on_response(&self) {
{
let mut guard = self.state.lock().unwrap();
if *guard {
return;
}
*guard = true;
}
(self.callback)(true);
}
pub fn on_timeout(&self) {
{
let mut guard = self.state.lock().unwrap();
if *guard {
return;
}
*guard = true;
}
(self.callback)(false);
}
}