network_protocol/utils/
timeout.rs

1use crate::error::{ProtocolError, Result};
2use std::time::Duration;
3use tokio::time;
4
5/// Default timeout duration for network operations (5 seconds)
6pub const DEFAULT_TIMEOUT: Duration = Duration::from_secs(5);
7
8/// Default timeout duration for handshake operations (10 seconds)
9pub const HANDSHAKE_TIMEOUT: Duration = Duration::from_secs(10);
10
11/// Default timeout duration for graceful shutdown (30 seconds)
12pub const SHUTDOWN_TIMEOUT: Duration = Duration::from_secs(30);
13
14/// Default keep-alive interval (15 seconds)
15pub const KEEPALIVE_INTERVAL: Duration = Duration::from_secs(15);
16
17/// Default time to wait before considering a connection dead (60 seconds)
18pub const DEAD_CONNECTION_TIMEOUT: Duration = Duration::from_secs(60);
19
20/// Wrap an async operation with a timeout
21///
22/// # Errors
23/// Returns `tokio::time::error::Elapsed` if the operation does not complete within the specified duration
24pub async fn with_timeout<T>(
25    operation: impl std::future::Future<Output = T>,
26    duration: Duration,
27) -> std::result::Result<T, time::error::Elapsed> {
28    time::timeout(duration, operation).await
29}
30
31/// Wrap an async operation with a timeout, converting Elapsed errors to ProtocolError::Timeout
32///
33/// # Errors
34/// Returns `ProtocolError::Timeout` if the operation times out, otherwise propagates any error from the operation
35pub async fn with_timeout_error<T>(
36    operation: impl std::future::Future<Output = Result<T>>,
37    duration: Duration,
38) -> Result<T> {
39    match time::timeout(duration, operation).await {
40        Ok(result) => result,
41        Err(_) => Err(ProtocolError::Timeout),
42    }
43}