76 lines
1.9 KiB
Rust
76 lines
1.9 KiB
Rust
#[macro_use] extern crate lazy_static;
|
|
#[macro_use] extern crate rust_util;
|
|
|
|
use std::{env, io::Error};
|
|
use std::process;
|
|
use futures_util::StreamExt;
|
|
use futures_util::stream::SplitSink;
|
|
use tokio::net::{TcpListener, TcpStream};
|
|
use rust_util::XResult;
|
|
use tokio::sync::Mutex;
|
|
use std::collections::BTreeMap;
|
|
use tokio_tungstenite::WebSocketStream;
|
|
|
|
lazy_static!{
|
|
static ref ALL_ROOMS: Mutex<BTreeMap<String, BTreeMap<String, SplitSink<WebSocketStream<TcpStream>, Message>>>> = Mutex::new(BTreeMap::new());
|
|
}
|
|
|
|
// create/enter room
|
|
// exit room
|
|
// destroy room
|
|
// list peers
|
|
// enter peer
|
|
// exit peer
|
|
// send message
|
|
// - broadcast
|
|
// - peer
|
|
|
|
// const MESSAGE_TYPE_CREATE: &str = "create";
|
|
// const MESSAGE_TYPE_MESSAGE: &str = "message";
|
|
|
|
struct Message {
|
|
ty: String,
|
|
room: Option<String>,
|
|
data: Option<String>,
|
|
}
|
|
|
|
#[tokio::main]
|
|
async fn main() -> Result<(), Error> {
|
|
let addr = env::args().nth(1).unwrap_or_else(|| "127.0.0.1:8080".to_string());
|
|
|
|
let listener = match TcpListener::bind(&addr).await {
|
|
Ok(socket) => socket,
|
|
Err(e) => {
|
|
failure!("Try listen on: {}, faield: {}", addr, e);
|
|
process::exit(-1);
|
|
},
|
|
};
|
|
success!("Listening on: {}", addr);
|
|
|
|
while let Ok((stream, _)) = listener.accept().await {
|
|
tokio::spawn(accept_connection(stream));
|
|
}
|
|
|
|
Ok(())
|
|
}
|
|
|
|
async fn accept_connection(stream: TcpStream) {
|
|
if let Err(e) = inner_accept_connection(stream).await {
|
|
failure!("Error occurred in accepting connection: {}", e);
|
|
}
|
|
}
|
|
|
|
async fn inner_accept_connection(stream: TcpStream) -> XResult<()> {
|
|
let addr = stream.peer_addr()?;
|
|
information!("Peer address: {}", addr);
|
|
let ws_stream = tokio_tungstenite::accept_async(stream).await?;
|
|
information!("New WebSocket connection: {}", addr);
|
|
|
|
let (write, mut read) = ws_stream.split();
|
|
//read.forward(write).await?;
|
|
let a = read.next().await;
|
|
|
|
|
|
Ok(())
|
|
}
|