use crate::errors::Error;
use crate::ext::NoExtProvider;
use crate::handshake::{ProtocolRegistry, UpgradedServer};
use crate::{subscribe_with, TryIntoRequest, UpgradedClient, WebSocketConfig, WebSocketStream};
use ratchet_ext::ExtensionProvider;
use std::borrow::Cow;
#[derive(Debug)]
pub struct WebSocketClientBuilder<E> {
config: Option<WebSocketConfig>,
extension: E,
subprotocols: ProtocolRegistry,
}
impl Default for WebSocketClientBuilder<NoExtProvider> {
fn default() -> Self {
WebSocketClientBuilder {
config: None,
extension: NoExtProvider,
subprotocols: ProtocolRegistry::default(),
}
}
}
impl<E> WebSocketClientBuilder<E> {
pub async fn subscribe<S, I>(
self,
stream: S,
request: I,
) -> Result<UpgradedClient<S, E::Extension>, Error>
where
S: WebSocketStream,
I: TryIntoRequest,
E: ExtensionProvider,
{
let WebSocketClientBuilder {
config,
extension,
subprotocols,
} = self;
subscribe_with(
config.unwrap_or_default(),
stream,
request,
&extension,
subprotocols,
)
.await
}
pub fn config(mut self, config: WebSocketConfig) -> Self {
self.config = Some(config);
self
}
pub fn extension<T>(self, extension: T) -> WebSocketClientBuilder<T>
where
T: ExtensionProvider,
{
let WebSocketClientBuilder {
config,
subprotocols,
..
} = self;
WebSocketClientBuilder {
config,
extension,
subprotocols,
}
}
pub fn subprotocols<I>(mut self, subprotocols: I) -> Result<Self, Error>
where
I: IntoIterator,
I::Item: Into<Cow<'static, str>>,
{
self.subprotocols = ProtocolRegistry::new(subprotocols)?;
Ok(self)
}
}
#[derive(Debug)]
pub struct WebSocketServerBuilder<E> {
config: Option<WebSocketConfig>,
subprotocols: ProtocolRegistry,
extension: E,
}
impl Default for WebSocketServerBuilder<NoExtProvider> {
fn default() -> Self {
WebSocketServerBuilder {
config: None,
extension: NoExtProvider,
subprotocols: ProtocolRegistry::default(),
}
}
}
impl<E> WebSocketServerBuilder<E> {
pub async fn accept<S>(self, stream: S) -> Result<UpgradedServer<S, E::Extension>, Error>
where
S: WebSocketStream,
E: ExtensionProvider,
{
let WebSocketServerBuilder {
config,
subprotocols,
extension,
} = self;
let upgrader =
crate::accept_with(stream, config.unwrap_or_default(), extension, subprotocols).await?;
upgrader.upgrade().await
}
pub fn config(mut self, config: WebSocketConfig) -> Self {
self.config = Some(config);
self
}
pub fn extension<T>(self, extension: T) -> WebSocketServerBuilder<T>
where
T: ExtensionProvider,
{
let WebSocketServerBuilder {
config,
subprotocols,
..
} = self;
WebSocketServerBuilder {
config,
extension,
subprotocols,
}
}
pub fn subprotocols<I>(mut self, subprotocols: I) -> Result<Self, Error>
where
I: IntoIterator,
I::Item: Into<Cow<'static, str>>,
{
self.subprotocols = ProtocolRegistry::new(subprotocols)?;
Ok(self)
}
}