vapour-protocol 0.4.0

Steam client protocol implementation for native Rust applications
Documentation
use tokio::net::TcpStream;
use tokio_tungstenite::tungstenite::http::StatusCode;
use tokio_tungstenite::{MaybeTlsStream, WebSocketStream, connect_async};

use crate::{
    error::{Error, Result},
    serverlist::CmServer,
};

pub type SteamWebSocket = WebSocketStream<MaybeTlsStream<TcpStream>>;

#[derive(Debug, Clone, PartialEq, Eq)]
pub struct WebSocketEndpoint {
    pub url: String,
}

impl WebSocketEndpoint {
    pub fn from_cm_server(server: &CmServer) -> Self {
        Self {
            url: server.websocket_url(),
        }
    }
}

pub async fn connect(url: &str) -> Result<SteamWebSocket> {
    let (socket, response) = connect_async(url).await?;

    if response.status() != StatusCode::SWITCHING_PROTOCOLS {
        return Err(Error::Transport(format!(
            "Steam CM websocket upgrade failed with status {}",
            response.status()
        )));
    }

    Ok(socket)
}