66 lines
2.2 KiB
Rust
66 lines
2.2 KiB
Rust
// NOTE: websockets are not currently in use for PeachCloud but may be in the
|
|
// future.
|
|
|
|
use std::io;
|
|
use std::thread;
|
|
|
|
use log::{debug, info};
|
|
use websocket::sync::Server;
|
|
use websocket::{Message, OwnedMessage};
|
|
|
|
pub fn websocket_server(address: String) -> io::Result<()> {
|
|
// start listening for WebSocket connections
|
|
let ws_server = Server::bind(address)?;
|
|
|
|
info!("Listening for WebSocket connections.");
|
|
for connection in ws_server.filter_map(Result::ok) {
|
|
// spawn a new thread for each connection
|
|
thread::spawn(move || {
|
|
if !connection
|
|
.protocols()
|
|
.contains(&"rust-websocket".to_string())
|
|
{
|
|
connection.reject().unwrap();
|
|
return;
|
|
}
|
|
|
|
let mut client = connection.use_protocol("rust-websocket").accept().unwrap();
|
|
|
|
let client_ip = client.peer_addr().unwrap();
|
|
|
|
debug!("Websocket connection from {}.", client_ip);
|
|
|
|
let msg_text = "Websocket successfully connected.".to_string();
|
|
let message = Message::text(msg_text);
|
|
client.send_message(&message).unwrap();
|
|
|
|
let (mut receiver, mut sender) = client.split().unwrap();
|
|
|
|
for message in receiver.incoming_messages() {
|
|
let message = message.unwrap();
|
|
|
|
match message {
|
|
OwnedMessage::Close(_) => {
|
|
debug!("Received close message.");
|
|
let message = Message::close();
|
|
sender.send_message(&message).unwrap();
|
|
debug!("Websocket client {} disconnected.", client_ip);
|
|
return;
|
|
}
|
|
OwnedMessage::Ping(data) => {
|
|
debug!("Received ping message.");
|
|
let message = Message::pong(data);
|
|
sender.send_message(&message).unwrap();
|
|
}
|
|
_ => {
|
|
sender.send_message(&message).unwrap();
|
|
debug!("Received unknown message: {:?}", message);
|
|
}
|
|
}
|
|
}
|
|
});
|
|
}
|
|
|
|
Ok(())
|
|
}
|