pub mod address_probe;
pub mod address_registry;
pub mod backoff;
pub mod connection;
pub mod dedup;
pub mod discovery;
pub mod frame_transport;
pub mod gateway_connection;
pub mod health;
pub mod heartbeat;
pub mod multi;
pub mod queue;
pub mod rate_limit;
pub mod receive_limiter;
pub mod router;
pub mod routing;
#[cfg(feature = "server")]
pub mod server;
pub mod tunnel;
#[cfg(test)]
mod tests;
#[cfg(test)]
mod tunneling_test;
#[cfg(test)]
mod integration_tests;
use crate::protocol::address::IndividualAddress;
use std::net::{IpAddr, SocketAddr};
use std::time::Duration;
pub use address_probe::{auto_select_address, probe_address};
pub use address_registry::AddressRegistry;
pub use backoff::JitteredBackoff;
pub use connection::{Connection, ConnectionState};
pub use discovery::{GatewayCapabilities, GatewayInfo, GatewayScanner, ServiceType};
pub use frame_transport::{FrameTransport, TcpFrameTransport, TransportKind, UdpFrameTransport};
pub use gateway_connection::GatewayConnection;
pub use health::{ConnectionHealth, GatewayConnectionState};
pub use multi::MultiConnection;
pub use queue::{QueueConfig, QueueStats, TelegramQueue};
pub use rate_limit::{RateLimitConfig, RateLimiter};
pub use receive_limiter::{ReceiveLimitConfig, ReceiveRateLimiter, ReceiveResult, ReceiveStats};
pub use router::FrameRouter;
pub use routing::RoutingConnection;
#[cfg(feature = "server")]
pub use server::TunnelServer;
pub use tunnel::{SequenceValidationResult, Tunnel};
#[derive(Debug, Clone)]
pub struct ConnectionConfig {
pub connection_type: ConnectionType,
pub gateway_ip: Option<IpAddr>,
pub gateway_port: Option<u16>,
pub local_ip: Option<IpAddr>,
pub individual_address: IndividualAddress,
pub security: Option<SecurityConfig>,
pub timeout_ms: u64,
pub auto_reconnect: bool,
pub reconnect_backoff: BackoffConfig,
pub tcp_config: TcpConfig,
}
impl Default for ConnectionConfig {
fn default() -> Self {
Self {
connection_type: ConnectionType::Tunneling,
gateway_ip: None,
gateway_port: Some(3671), local_ip: None,
individual_address: IndividualAddress::new(1, 1, 240), security: None,
timeout_ms: 5000,
auto_reconnect: true,
reconnect_backoff: BackoffConfig::default(),
tcp_config: TcpConfig::default(),
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum ConnectionType {
Tunneling,
TcpTunneling,
Routing,
SecureTunneling,
SecureRouting,
}
#[derive(Debug, Clone)]
pub struct SecurityConfig {
pub device_auth_password: String,
pub user_password: Option<String>,
pub keyring_path: Option<String>,
pub session_timeout: u32,
}
#[derive(Debug, Clone)]
pub struct BackoffConfig {
pub initial_delay_ms: u64,
pub max_delay_ms: u64,
pub multiplier: f64,
pub max_attempts: u32,
}
impl Default for BackoffConfig {
fn default() -> Self {
Self {
initial_delay_ms: 1000,
max_delay_ms: 30000,
multiplier: 2.0,
max_attempts: 10,
}
}
}
#[derive(Debug, Clone)]
pub struct TcpConfig {
pub connect_timeout_ms: u64,
pub read_timeout_ms: u64,
pub write_timeout_ms: u64,
pub keep_alive_enabled: bool,
pub keep_alive_interval_ms: u64,
pub tcp_nodelay: bool,
}
impl Default for TcpConfig {
fn default() -> Self {
Self {
connect_timeout_ms: 5000,
read_timeout_ms: 10000,
write_timeout_ms: 5000,
keep_alive_enabled: true,
keep_alive_interval_ms: 30000,
tcp_nodelay: true, }
}
}
#[derive(Debug, Clone)]
pub struct GatewayConfig {
pub address: SocketAddr,
pub name: Option<String>,
pub priority: u8,
pub connection_type: ConnectionType,
pub individual_address: Option<IndividualAddress>,
}
#[derive(Debug, Clone)]
pub struct MultiConnectionConfig {
pub gateways: Vec<GatewayConfig>,
pub backoff: BackoffConfig,
pub rate_limit: RateLimitConfig,
pub deduplication_window: Duration,
pub individual_address: IndividualAddress,
pub heartbeat: heartbeat::HeartbeatConfig,
}
impl Default for MultiConnectionConfig {
fn default() -> Self {
Self {
gateways: Vec::new(),
backoff: BackoffConfig::default(),
rate_limit: RateLimitConfig::default(),
deduplication_window: Duration::from_secs(2),
individual_address: IndividualAddress::new(1, 1, 240),
heartbeat: heartbeat::HeartbeatConfig::default(),
}
}
}