use std::time::Duration;
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct WsConfig {
pub heartbeat_interval: Duration,
pub broadcast_capacity: usize,
pub max_connections: usize,
pub allowed_origins: Vec<String>,
}
impl Default for WsConfig {
fn default() -> Self {
Self {
heartbeat_interval: Duration::from_secs(30),
broadcast_capacity: 1024,
max_connections: 1000,
allowed_origins: Vec::new(),
}
}
}
impl WsConfig {
pub fn new() -> Self {
Self::default()
}
pub fn builder() -> WsConfigBuilder {
WsConfigBuilder::default()
}
}
#[derive(Debug, Clone)]
pub struct WsConfigBuilder {
heartbeat_interval: Duration,
broadcast_capacity: usize,
max_connections: usize,
allowed_origins: Vec<String>,
}
impl Default for WsConfigBuilder {
fn default() -> Self {
let d = WsConfig::default();
Self {
heartbeat_interval: d.heartbeat_interval,
broadcast_capacity: d.broadcast_capacity,
max_connections: d.max_connections,
allowed_origins: d.allowed_origins,
}
}
}
impl WsConfigBuilder {
pub fn heartbeat_interval(mut self, v: Duration) -> Self {
self.heartbeat_interval = v;
self
}
pub fn broadcast_capacity(mut self, v: usize) -> Self {
self.broadcast_capacity = v;
self
}
pub fn max_connections(mut self, v: usize) -> Self {
self.max_connections = v;
self
}
pub fn allowed_origins(mut self, origins: Vec<String>) -> Self {
self.allowed_origins = origins;
self
}
pub fn allow_origin(mut self, origin: impl Into<String>) -> Self {
self.allowed_origins.push(origin.into());
self
}
pub fn build(self) -> WsConfig {
WsConfig {
heartbeat_interval: self.heartbeat_interval,
broadcast_capacity: self.broadcast_capacity,
max_connections: self.max_connections,
allowed_origins: self.allowed_origins,
}
}
}
#[allow(
clippy::unwrap_used,
clippy::expect_used,
clippy::indexing_slicing,
clippy::panic
)]
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn defaults() {
let c = WsConfig::default();
assert_eq!(c.heartbeat_interval, Duration::from_secs(30));
assert_eq!(c.broadcast_capacity, 1024);
assert_eq!(c.max_connections, 1000);
}
#[test]
fn builder_overrides() {
let c = WsConfig::builder()
.heartbeat_interval(Duration::from_secs(10))
.broadcast_capacity(512)
.max_connections(10)
.build();
assert_eq!(c.heartbeat_interval, Duration::from_secs(10));
assert_eq!(c.broadcast_capacity, 512);
assert_eq!(c.max_connections, 10);
}
#[test]
fn builder_default_equals_config_default() {
let via_builder = WsConfig::builder().build();
assert_eq!(via_builder, WsConfig::default());
}
#[test]
fn req_wskit_201_default_allowed_origins_empty_allows_all() {
assert!(WsConfig::default().allowed_origins.is_empty());
assert!(WsConfig::builder().build().allowed_origins.is_empty());
}
#[test]
fn req_wskit_200_builder_sets_allowed_origins() {
let c = WsConfig::builder()
.allow_origin("https://app.example.com")
.allow_origin("https://staging.example.com")
.build();
assert_eq!(
c.allowed_origins,
vec![
"https://app.example.com".to_string(),
"https://staging.example.com".to_string()
]
);
let c2 = WsConfig::builder()
.allow_origin("https://a.dev")
.allowed_origins(vec!["https://b.dev".to_string()])
.build();
assert_eq!(c2.allowed_origins, vec!["https://b.dev".to_string()]);
}
}