vapour_protocol/transport/
websocket.rs1use 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}