Skip to main content

vapour_protocol/transport/
websocket.rs

1use tokio::net::TcpStream;
2use tokio_tungstenite::tungstenite::http::StatusCode;
3use tokio_tungstenite::{MaybeTlsStream, WebSocketStream, connect_async};
4
5use crate::{
6    error::{Error, Result},
7    serverlist::CmServer,
8};
9
10pub type SteamWebSocket = WebSocketStream<MaybeTlsStream<TcpStream>>;
11
12#[derive(Debug, Clone, PartialEq, Eq)]
13pub struct WebSocketEndpoint {
14    pub url: String,
15}
16
17impl WebSocketEndpoint {
18    pub fn from_cm_server(server: &CmServer) -> Self {
19        Self {
20            url: server.websocket_url(),
21        }
22    }
23}
24
25pub async fn connect(url: &str) -> Result<SteamWebSocket> {
26    let (socket, response) = connect_async(url).await?;
27
28    if response.status() != StatusCode::SWITCHING_PROTOCOLS {
29        return Err(Error::Transport(format!(
30            "Steam CM websocket upgrade failed with status {}",
31            response.status()
32        )));
33    }
34
35    Ok(socket)
36}