im-core 0.1.0

Rust IM SDK for Awiki clients built on Agent Network Protocol (ANP)
Documentation
use std::time::Duration;

#[derive(Debug, Clone, PartialEq, Eq)]
pub(crate) struct RuntimeTimeouts {
    connect_timeout: Duration,
    request_timeout: Duration,
    websocket_idle_timeout: Duration,
    websocket_ping_timeout: Duration,
    attachment_transfer_timeout: Duration,
    db_request_timeout: Duration,
}

impl RuntimeTimeouts {
    pub(crate) fn new(
        connect_timeout: Duration,
        request_timeout: Duration,
        websocket_idle_timeout: Duration,
        websocket_ping_timeout: Duration,
        attachment_transfer_timeout: Duration,
        db_request_timeout: Duration,
    ) -> Self {
        Self {
            connect_timeout,
            request_timeout,
            websocket_idle_timeout,
            websocket_ping_timeout,
            attachment_transfer_timeout,
            db_request_timeout,
        }
    }

    pub(crate) fn connect_timeout(&self) -> Duration {
        self.connect_timeout
    }

    pub(crate) fn request_timeout(&self) -> Duration {
        self.request_timeout
    }

    pub(crate) fn websocket_idle_timeout(&self) -> Duration {
        self.websocket_idle_timeout
    }

    pub(crate) fn websocket_ping_timeout(&self) -> Duration {
        self.websocket_ping_timeout
    }

    pub(crate) fn attachment_transfer_timeout(&self) -> Duration {
        self.attachment_transfer_timeout
    }

    pub(crate) fn db_request_timeout(&self) -> Duration {
        self.db_request_timeout
    }
}

impl Default for RuntimeTimeouts {
    fn default() -> Self {
        Self::new(
            Duration::from_secs(10),
            Duration::from_secs(30),
            Duration::from_secs(90),
            Duration::from_secs(15),
            Duration::from_secs(60 * 30),
            Duration::from_secs(30),
        )
    }
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn runtime_timeout_default_values_are_stable() {
        let timeouts = RuntimeTimeouts::default();

        assert_eq!(timeouts.connect_timeout(), Duration::from_secs(10));
        assert_eq!(timeouts.request_timeout(), Duration::from_secs(30));
        assert_eq!(timeouts.websocket_idle_timeout(), Duration::from_secs(90));
        assert_eq!(timeouts.websocket_ping_timeout(), Duration::from_secs(15));
        assert_eq!(
            timeouts.attachment_transfer_timeout(),
            Duration::from_secs(60 * 30)
        );
        assert_eq!(timeouts.db_request_timeout(), Duration::from_secs(30));
    }

    #[test]
    fn runtime_timeouts_can_be_overridden() {
        let timeouts = RuntimeTimeouts::new(
            Duration::from_secs(1),
            Duration::from_secs(2),
            Duration::from_secs(3),
            Duration::from_secs(4),
            Duration::from_secs(5),
            Duration::from_secs(6),
        );

        assert_eq!(timeouts.connect_timeout(), Duration::from_secs(1));
        assert_eq!(timeouts.request_timeout(), Duration::from_secs(2));
        assert_eq!(timeouts.websocket_idle_timeout(), Duration::from_secs(3));
        assert_eq!(timeouts.websocket_ping_timeout(), Duration::from_secs(4));
        assert_eq!(
            timeouts.attachment_transfer_timeout(),
            Duration::from_secs(5)
        );
        assert_eq!(timeouts.db_request_timeout(), Duration::from_secs(6));
    }
}