use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "lowercase")]
pub enum CompressionEncoding {
Gzip,
Zstd,
}
#[derive(Debug, Clone)]
pub struct LaserstreamConfig {
pub api_key: String,
pub endpoint: String,
pub max_reconnect_attempts: Option<u32>,
pub channel_options: ChannelOptions,
}
#[derive(Debug, Clone)]
pub struct ChannelOptions {
pub connect_timeout_secs: Option<u64>,
pub timeout_secs: Option<u64>,
pub max_decoding_message_size: Option<usize>,
pub max_encoding_message_size: Option<usize>,
pub http2_keep_alive_interval_secs: Option<u64>,
pub keep_alive_timeout_secs: Option<u64>,
pub keep_alive_while_idle: Option<bool>,
pub initial_stream_window_size: Option<u32>,
pub initial_connection_window_size: Option<u32>,
pub http2_adaptive_window: Option<bool>,
pub tcp_nodelay: Option<bool>,
pub tcp_keepalive_secs: Option<u64>,
pub buffer_size: Option<usize>,
pub accept_compression: Option<Vec<CompressionEncoding>>,
pub send_compression: Option<CompressionEncoding>,
}
impl Default for ChannelOptions {
fn default() -> Self {
Self {
connect_timeout_secs: None,
timeout_secs: None,
max_decoding_message_size: None,
max_encoding_message_size: None,
http2_keep_alive_interval_secs: None,
keep_alive_timeout_secs: None,
keep_alive_while_idle: None,
initial_stream_window_size: None,
initial_connection_window_size: None,
http2_adaptive_window: None,
tcp_nodelay: None,
tcp_keepalive_secs: None,
buffer_size: None,
accept_compression: None,
send_compression: None,
}
}
}
impl ChannelOptions {
pub fn with_zstd_compression(mut self) -> Self {
self.send_compression = Some(CompressionEncoding::Zstd);
self.accept_compression = Some(vec![CompressionEncoding::Zstd, CompressionEncoding::Gzip]);
self
}
pub fn with_gzip_compression(mut self) -> Self {
self.send_compression = Some(CompressionEncoding::Gzip);
self.accept_compression = Some(vec![CompressionEncoding::Gzip, CompressionEncoding::Zstd]);
self
}
}
impl Default for LaserstreamConfig {
fn default() -> Self {
Self {
api_key: String::new(),
endpoint: String::new(),
max_reconnect_attempts: None, channel_options: ChannelOptions::default(),
}
}
}
impl LaserstreamConfig {
pub fn new(endpoint: String, api_key: String) -> Self {
Self {
endpoint,
api_key,
max_reconnect_attempts: None, channel_options: ChannelOptions::default(),
}
}
pub fn with_max_reconnect_attempts(mut self, attempts: u32) -> Self {
self.max_reconnect_attempts = Some(attempts);
self
}
pub fn with_channel_options(mut self, options: ChannelOptions) -> Self {
self.channel_options = options;
self
}
}