use std::time::Duration;
#[derive(Debug, Clone)]
pub struct KalamLinkTimeouts {
pub connection_timeout: Duration,
pub receive_timeout: Duration,
pub send_timeout: Duration,
pub subscribe_timeout: Duration,
pub auth_timeout: Duration,
pub initial_data_timeout: Duration,
pub idle_timeout: Duration,
pub keepalive_interval: Duration,
pub pong_timeout: Duration,
}
impl Default for KalamLinkTimeouts {
fn default() -> Self {
Self {
connection_timeout: Duration::from_secs(10),
receive_timeout: Duration::from_secs(30),
send_timeout: Duration::from_secs(10),
subscribe_timeout: Duration::from_secs(5),
auth_timeout: Duration::from_secs(5),
initial_data_timeout: Duration::from_secs(30),
idle_timeout: Duration::ZERO, keepalive_interval: Duration::from_secs(10),
pong_timeout: Duration::from_secs(5),
}
}
}
impl KalamLinkTimeouts {
pub fn builder() -> KalamLinkTimeoutsBuilder {
KalamLinkTimeoutsBuilder::new()
}
pub fn fast() -> Self {
Self {
connection_timeout: Duration::from_secs(2),
receive_timeout: Duration::from_secs(5),
send_timeout: Duration::from_secs(2),
subscribe_timeout: Duration::from_secs(2),
auth_timeout: Duration::from_secs(2),
initial_data_timeout: Duration::from_secs(10),
idle_timeout: Duration::ZERO,
keepalive_interval: Duration::from_secs(15),
pong_timeout: Duration::from_secs(5),
}
}
pub fn relaxed() -> Self {
Self {
connection_timeout: Duration::from_secs(30),
receive_timeout: Duration::from_secs(120),
send_timeout: Duration::from_secs(30),
subscribe_timeout: Duration::from_secs(15),
auth_timeout: Duration::from_secs(15),
initial_data_timeout: Duration::from_secs(120),
idle_timeout: Duration::ZERO,
keepalive_interval: Duration::from_secs(30),
pong_timeout: Duration::from_secs(10),
}
}
pub fn for_testing(subscription_timeout_secs: u64) -> Self {
Self {
connection_timeout: Duration::from_secs(5),
receive_timeout: Duration::from_secs(10),
send_timeout: Duration::from_secs(5),
subscribe_timeout: Duration::from_secs(3),
auth_timeout: Duration::from_secs(3),
initial_data_timeout: Duration::from_secs(subscription_timeout_secs),
idle_timeout: Duration::from_secs(subscription_timeout_secs),
keepalive_interval: Duration::from_secs(5),
pong_timeout: Duration::from_secs(3),
}
}
pub fn is_no_timeout(duration: Duration) -> bool {
duration.is_zero() || duration > Duration::from_secs(86400 * 365) }
}
#[derive(Debug, Clone)]
pub struct KalamLinkTimeoutsBuilder {
timeouts: KalamLinkTimeouts,
}
impl KalamLinkTimeoutsBuilder {
fn new() -> Self {
Self {
timeouts: KalamLinkTimeouts::default(),
}
}
pub fn connection_timeout(mut self, timeout: Duration) -> Self {
self.timeouts.connection_timeout = timeout;
self
}
pub fn connection_timeout_secs(self, secs: u64) -> Self {
self.connection_timeout(Duration::from_secs(secs))
}
pub fn receive_timeout(mut self, timeout: Duration) -> Self {
self.timeouts.receive_timeout = timeout;
self
}
pub fn receive_timeout_secs(self, secs: u64) -> Self {
self.receive_timeout(Duration::from_secs(secs))
}
pub fn send_timeout(mut self, timeout: Duration) -> Self {
self.timeouts.send_timeout = timeout;
self
}
pub fn send_timeout_secs(self, secs: u64) -> Self {
self.send_timeout(Duration::from_secs(secs))
}
pub fn subscribe_timeout(mut self, timeout: Duration) -> Self {
self.timeouts.subscribe_timeout = timeout;
self
}
pub fn subscribe_timeout_secs(self, secs: u64) -> Self {
self.subscribe_timeout(Duration::from_secs(secs))
}
pub fn auth_timeout(mut self, timeout: Duration) -> Self {
self.timeouts.auth_timeout = timeout;
self
}
pub fn auth_timeout_secs(self, secs: u64) -> Self {
self.auth_timeout(Duration::from_secs(secs))
}
pub fn initial_data_timeout(mut self, timeout: Duration) -> Self {
self.timeouts.initial_data_timeout = timeout;
self
}
pub fn initial_data_timeout_secs(self, secs: u64) -> Self {
self.initial_data_timeout(Duration::from_secs(secs))
}
pub fn idle_timeout(mut self, timeout: Duration) -> Self {
self.timeouts.idle_timeout = timeout;
self
}
pub fn idle_timeout_secs(self, secs: u64) -> Self {
self.idle_timeout(Duration::from_secs(secs))
}
pub fn keepalive_interval(mut self, interval: Duration) -> Self {
self.timeouts.keepalive_interval = interval;
self
}
pub fn keepalive_interval_secs(self, secs: u64) -> Self {
self.keepalive_interval(Duration::from_secs(secs))
}
pub fn pong_timeout(mut self, timeout: Duration) -> Self {
self.timeouts.pong_timeout = timeout;
self
}
pub fn pong_timeout_secs(self, secs: u64) -> Self {
self.pong_timeout(Duration::from_secs(secs))
}
pub fn build(self) -> KalamLinkTimeouts {
self.timeouts
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_default_timeouts() {
let timeouts = KalamLinkTimeouts::default();
assert_eq!(timeouts.connection_timeout, Duration::from_secs(10));
assert_eq!(timeouts.receive_timeout, Duration::from_secs(30));
assert_eq!(timeouts.subscribe_timeout, Duration::from_secs(5));
assert!(timeouts.idle_timeout.is_zero());
}
#[test]
fn test_builder() {
let timeouts = KalamLinkTimeouts::builder()
.connection_timeout_secs(60)
.receive_timeout_secs(120)
.idle_timeout_secs(300)
.build();
assert_eq!(timeouts.connection_timeout, Duration::from_secs(60));
assert_eq!(timeouts.receive_timeout, Duration::from_secs(120));
assert_eq!(timeouts.idle_timeout, Duration::from_secs(300));
}
#[test]
fn test_fast_preset() {
let timeouts = KalamLinkTimeouts::fast();
assert!(timeouts.connection_timeout <= Duration::from_secs(5));
assert!(timeouts.subscribe_timeout <= Duration::from_secs(5));
}
#[test]
fn test_relaxed_preset() {
let timeouts = KalamLinkTimeouts::relaxed();
assert!(timeouts.connection_timeout >= Duration::from_secs(30));
assert!(timeouts.receive_timeout >= Duration::from_secs(60));
}
#[test]
fn test_for_testing() {
let timeouts = KalamLinkTimeouts::for_testing(10);
assert_eq!(timeouts.initial_data_timeout, Duration::from_secs(10));
assert_eq!(timeouts.idle_timeout, Duration::from_secs(10));
}
#[test]
fn test_is_no_timeout() {
assert!(KalamLinkTimeouts::is_no_timeout(Duration::ZERO));
assert!(!KalamLinkTimeouts::is_no_timeout(Duration::from_secs(1)));
assert!(!KalamLinkTimeouts::is_no_timeout(Duration::from_secs(3600)));
}
}