server/
server.rs

1use std::net::SocketAddr;
2
3use hydra::Application;
4use hydra::ExitReason;
5use hydra::GenServer;
6use hydra::GenServerOptions;
7use hydra::Pid;
8use hydra::Process;
9
10use hydra_websockets::WebsocketCommands;
11use hydra_websockets::WebsocketHandler;
12use hydra_websockets::WebsocketMessage;
13use hydra_websockets::WebsocketRequest;
14use hydra_websockets::WebsocketResponse;
15use hydra_websockets::WebsocketServer;
16use hydra_websockets::WebsocketServerConfig;
17
18struct MyWebsocketHandler;
19
20impl WebsocketHandler for MyWebsocketHandler {
21    type Message = ();
22
23    fn accept(
24        _address: SocketAddr,
25        _request: &WebsocketRequest,
26        response: WebsocketResponse,
27    ) -> Result<(WebsocketResponse, Self), ExitReason> {
28        // You can extract any header information from `request` and pass it to the handler.
29        Ok((response, MyWebsocketHandler))
30    }
31
32    async fn websocket_handle(
33        &mut self,
34        message: WebsocketMessage,
35    ) -> Result<Option<WebsocketCommands>, ExitReason> {
36        match message {
37            WebsocketMessage::Text(text) => {
38                tracing::info!(handler = ?Process::current(), message = ?text.as_str(), "Got message");
39
40                // Echo the command back to the client.
41                Ok(Some(WebsocketCommands::with_send(text.as_str())))
42            }
43            _ => {
44                // Hydra websockets automatically responds to ping requests.
45                Ok(None)
46            }
47        }
48    }
49}
50
51struct MyWebsocketApplication;
52
53impl Application for MyWebsocketApplication {
54    async fn start(&self) -> Result<Pid, ExitReason> {
55        let address: SocketAddr = "127.0.0.1:1337".parse().unwrap();
56        let config = WebsocketServerConfig::new(address);
57
58        WebsocketServer::<MyWebsocketHandler>::new(config)
59            .start_link(GenServerOptions::new())
60            .await
61    }
62}
63
64fn main() {
65    Application::run(MyWebsocketApplication)
66}