use std::time::Duration;
use crate::error::KrakenError;
use crate::spot::ws::stream::KrakenStream;
pub mod endpoints {
pub const WS_PUBLIC: &str = "wss://ws.kraken.com/v2";
pub const WS_AUTH: &str = "wss://ws-auth.kraken.com/v2";
}
#[derive(Debug, Clone)]
pub struct WsConfig {
pub initial_backoff: Duration,
pub max_backoff: Duration,
pub max_reconnect_attempts: Option<u32>,
pub ping_interval: Duration,
pub pong_timeout: Duration,
}
impl Default for WsConfig {
fn default() -> Self {
Self {
initial_backoff: Duration::from_secs(1),
max_backoff: Duration::from_secs(60),
max_reconnect_attempts: None, ping_interval: Duration::from_secs(30),
pong_timeout: Duration::from_secs(10),
}
}
}
impl WsConfig {
pub fn builder() -> WsConfigBuilder {
WsConfigBuilder::new()
}
}
#[derive(Debug, Clone, Default)]
pub struct WsConfigBuilder {
config: WsConfig,
}
impl WsConfigBuilder {
pub fn new() -> Self {
Self {
config: WsConfig::default(),
}
}
pub fn reconnect_backoff(mut self, initial: Duration, max: Duration) -> Self {
self.config.initial_backoff = initial;
self.config.max_backoff = max;
self
}
pub fn max_reconnect_attempts(mut self, attempts: u32) -> Self {
self.config.max_reconnect_attempts = Some(attempts);
self
}
pub fn ping_interval(mut self, interval: Duration) -> Self {
self.config.ping_interval = interval;
self
}
pub fn build(self) -> WsConfig {
self.config
}
}
#[derive(Debug, Clone)]
pub struct SpotWsClient {
public_url: String,
auth_url: String,
config: WsConfig,
}
impl SpotWsClient {
pub fn new() -> Self {
Self::with_config(WsConfig::default())
}
pub fn with_config(config: WsConfig) -> Self {
Self {
public_url: endpoints::WS_PUBLIC.to_string(),
auth_url: endpoints::WS_AUTH.to_string(),
config,
}
}
pub fn with_urls(public_url: impl Into<String>, auth_url: impl Into<String>) -> Self {
Self {
public_url: public_url.into(),
auth_url: auth_url.into(),
config: WsConfig::default(),
}
}
pub fn public_url(&self) -> &str {
&self.public_url
}
pub fn auth_url(&self) -> &str {
&self.auth_url
}
pub fn config(&self) -> &WsConfig {
&self.config
}
pub async fn connect_public(&self) -> Result<KrakenStream, KrakenError> {
KrakenStream::connect_public(&self.public_url, self.config.clone()).await
}
pub async fn connect_public_with_config(
&self,
config: WsConfig,
) -> Result<KrakenStream, KrakenError> {
KrakenStream::connect_public(&self.public_url, config).await
}
pub async fn connect_private(&self, token: impl Into<String>) -> Result<KrakenStream, KrakenError> {
KrakenStream::connect_private(&self.auth_url, self.config.clone(), token.into()).await
}
pub async fn connect_private_with_config(
&self,
token: impl Into<String>,
config: WsConfig,
) -> Result<KrakenStream, KrakenError> {
KrakenStream::connect_private(&self.auth_url, config, token.into()).await
}
}
impl Default for SpotWsClient {
fn default() -> Self {
Self::new()
}
}