60 lines
1.5 KiB
Rust
60 lines
1.5 KiB
Rust
mod components;
|
|
mod config;
|
|
mod systems;
|
|
|
|
use crate::config::Settings;
|
|
use env_logger::Env;
|
|
use futures_util::StreamExt;
|
|
use log::info;
|
|
use shipyard::World;
|
|
use std::io::Error;
|
|
use tokio::net::{TcpListener, TcpStream};
|
|
|
|
#[tokio::main]
|
|
async fn main() -> Result<(), Error> {
|
|
let env = Env::default().filter_or("LOG_LEVEL", "trace");
|
|
env_logger::init_from_env(env);
|
|
|
|
let settings = Settings::new().unwrap();
|
|
|
|
// Create world
|
|
let world = World::default();
|
|
|
|
// Create workload
|
|
world.add_workload("update").build();
|
|
|
|
// Create the event loop and TCP listener we'll accept connections on.
|
|
tokio::spawn(listen_websocket(settings.bind));
|
|
|
|
loop {
|
|
world.run_workload("update");
|
|
}
|
|
}
|
|
|
|
async fn listen_websocket(bind: String) {
|
|
let try_socket = TcpListener::bind(&bind).await;
|
|
let mut listener = try_socket.expect("Failed to bind");
|
|
info!("Listening on: {}", bind);
|
|
|
|
while let Ok((stream, _)) = listener.accept().await {
|
|
tokio::spawn(accept_connection(stream));
|
|
}
|
|
}
|
|
|
|
async fn accept_connection(stream: TcpStream) {
|
|
let addr = stream
|
|
.peer_addr()
|
|
.expect("connected streams should have a peer address");
|
|
info!("Peer address: {}", addr);
|
|
|
|
let ws_stream = tokio_tungstenite::accept_async(stream)
|
|
.await
|
|
.expect("Error during the websocket handshake occurred");
|
|
info!("New WebSocket connection: {}", addr);
|
|
|
|
let (write, read) = ws_stream.split();
|
|
read.forward(write)
|
|
.await
|
|
.expect("Failed to forward message")
|
|
}
|