1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87
use async_tungstenite::{ tokio::{connect_async, TokioAdapter}, WebSocketStream, }; use futures::Future; use serde::{de::DeserializeOwned, Serialize}; use tokio::net::TcpStream; use auth::AuthHandler; use message::listener::RequestMetadata; use resource::listener::WebsocketAuthToken; use tungstenite::{handshake::client::Request, Message}; mod auth; pub mod bus; mod common; pub mod message; pub mod resource; pub mod server; pub mod service; pub type WebsocketConnection = WebSocketStream<TokioAdapter<TcpStream>>; pub async fn connect(url: String) -> Result<WebsocketConnection, tungstenite::Error> { let tuple = connect_async(url).await?; Ok(tuple.0) } pub async fn connect_authorized( url: String, token: String, ) -> Result<WebsocketConnection, tungstenite::Error> { let request = Request::builder() .uri(url) .header("Authorization", token.trim()) .body(())?; let (stream, _resp) = connect_async(request).await?; Ok(stream) } pub async fn bind( tcp: TcpStream, auth_token: WebsocketAuthToken, request_metadata: lifeline::request::Request<(), RequestMetadata>, ) -> Result<WebsocketConnection, tungstenite::Error> { let auth = AuthHandler::with_metadata(auth_token, Some(request_metadata)); async_tungstenite::tokio::accept_hdr_async(tcp, auth).await } pub fn decode<T: DeserializeOwned>( message: Result<tungstenite::Message, tungstenite::Error>, ) -> anyhow::Result<T> { let message = message?; let data = bincode::deserialize::<T>(message.into_data().as_slice())?; Ok(data) } pub fn encode<T: Serialize>(message: T) -> anyhow::Result<tungstenite::Message> { let message = bincode::serialize(&message)?; Ok(Message::Binary(message)) } pub fn encode_or_close<T: Serialize, F: FnOnce(&T) -> bool>( message: T, close_test: F, ) -> anyhow::Result<tungstenite::Message> { if close_test(&message) { return Ok(Message::Close(None)); } let message = bincode::serialize(&message)?; Ok(Message::Binary(message)) } pub fn encode_with<T: Serialize>( message: T, ) -> impl Future<Output = anyhow::Result<tungstenite::Message>> { futures::future::ready(encode(message)) } pub fn decode_with<T: DeserializeOwned>( message: Result<tungstenite::Message, tungstenite::Error>, ) -> impl Future<Output = anyhow::Result<T>> { futures::future::ready(decode(message)) }