mirror of
https://github.com/CompeyDev/ruck.git
synced 2025-01-08 11:49:09 +00:00
Scaffold message passing
This commit is contained in:
parent
c6b45dea57
commit
eca6ddf3b8
3 changed files with 109 additions and 9 deletions
|
@ -21,7 +21,10 @@ pub async fn send(paths: &Vec<PathBuf>) -> Result<(), Box<dyn std::error::Error>
|
||||||
let mut buf = BytesMut::with_capacity(1024);
|
let mut buf = BytesMut::with_capacity(1024);
|
||||||
buf.put(&b[..]);
|
buf.put(&b[..]);
|
||||||
let body = buf.freeze();
|
let body = buf.freeze();
|
||||||
let m = Message { body: body };
|
let m = Message {
|
||||||
|
from_sender: true,
|
||||||
|
body: body,
|
||||||
|
};
|
||||||
stream.send(m).await.unwrap();
|
stream.send(m).await.unwrap();
|
||||||
}
|
}
|
||||||
Ok(())
|
Ok(())
|
||||||
|
|
|
@ -3,5 +3,6 @@ use serde::{Deserialize, Serialize};
|
||||||
|
|
||||||
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
|
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
|
||||||
pub struct Message {
|
pub struct Message {
|
||||||
|
pub from_sender: bool,
|
||||||
pub body: Bytes,
|
pub body: Bytes,
|
||||||
}
|
}
|
||||||
|
|
112
src/server.rs
112
src/server.rs
|
@ -1,17 +1,83 @@
|
||||||
use crate::message::Message;
|
use crate::message::Message;
|
||||||
|
|
||||||
use futures::prelude::*;
|
use futures::prelude::*;
|
||||||
|
use std::collections::HashMap;
|
||||||
|
use std::io;
|
||||||
|
use std::net::SocketAddr;
|
||||||
|
use std::sync::Arc;
|
||||||
use tokio::net::{TcpListener, TcpStream};
|
use tokio::net::{TcpListener, TcpStream};
|
||||||
use tokio_util::codec::{FramedRead, LengthDelimitedCodec};
|
use tokio::sync::{mpsc, Mutex};
|
||||||
|
use tokio_serde::SymmetricallyFramed;
|
||||||
|
use tokio_util::codec::{Framed, LengthDelimitedCodec};
|
||||||
|
|
||||||
|
type Tx = mpsc::UnboundedSender<Message>;
|
||||||
|
type Rx = mpsc::UnboundedReceiver<Message>;
|
||||||
|
|
||||||
|
type MessageStream = SymmetricallyFramed<
|
||||||
|
Framed<TcpStream, LengthDelimitedCodec>,
|
||||||
|
Message,
|
||||||
|
tokio_serde::formats::SymmetricalBincode<Message>,
|
||||||
|
>;
|
||||||
|
|
||||||
|
pub struct Shared {
|
||||||
|
rooms: HashMap<String, RoomInfo>,
|
||||||
|
}
|
||||||
|
type State = Arc<Mutex<Shared>>;
|
||||||
|
|
||||||
|
struct RoomInfo {
|
||||||
|
sender_tx: Tx,
|
||||||
|
}
|
||||||
|
|
||||||
|
struct Client {
|
||||||
|
is_sender: bool,
|
||||||
|
messages: MessageStream,
|
||||||
|
rx: Rx,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Shared {
|
||||||
|
fn new() -> Self {
|
||||||
|
Shared {
|
||||||
|
rooms: HashMap::new(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// async fn broadcast(&mut self, sender: SocketAddr, message: Message) {
|
||||||
|
// for peer in self.peers.iter_mut() {
|
||||||
|
// if *peer.0 != sender {
|
||||||
|
// let _ = peer.1.send(message.clone());
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Client {
|
||||||
|
async fn new(is_sender: bool, state: State, messages: MessageStream) -> io::Result<Client> {
|
||||||
|
let (tx, rx) = mpsc::unbounded_channel();
|
||||||
|
let room_info = RoomInfo { sender_tx: tx };
|
||||||
|
state
|
||||||
|
.lock()
|
||||||
|
.await
|
||||||
|
.rooms
|
||||||
|
.insert("abc".to_string(), room_info);
|
||||||
|
|
||||||
|
Ok(Client {
|
||||||
|
is_sender,
|
||||||
|
messages,
|
||||||
|
rx,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
pub async fn serve() -> Result<(), Box<dyn std::error::Error>> {
|
pub async fn serve() -> Result<(), Box<dyn std::error::Error>> {
|
||||||
let addr = "127.0.0.1:8080".to_string();
|
let addr = "127.0.0.1:8080".to_string();
|
||||||
let server = TcpListener::bind(&addr).await?;
|
let listener = TcpListener::bind(&addr).await?;
|
||||||
|
let state = Arc::new(Mutex::new(Shared::new()));
|
||||||
println!("Listening on: {}", addr);
|
println!("Listening on: {}", addr);
|
||||||
loop {
|
loop {
|
||||||
let (stream, _) = server.accept().await?;
|
let (stream, address) = listener.accept().await?;
|
||||||
|
let state = Arc::clone(&state);
|
||||||
tokio::spawn(async move {
|
tokio::spawn(async move {
|
||||||
match process(stream).await {
|
match handle_connection(state, stream, address).await {
|
||||||
Ok(_) => println!("ok"),
|
Ok(_) => println!("ok"),
|
||||||
Err(_) => println!("err"),
|
Err(_) => println!("err"),
|
||||||
}
|
}
|
||||||
|
@ -19,14 +85,44 @@ pub async fn serve() -> Result<(), Box<dyn std::error::Error>> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub async fn process(socket: TcpStream) -> Result<(), Box<dyn std::error::Error>> {
|
pub async fn handle_connection(
|
||||||
let length_delimited = FramedRead::new(socket, LengthDelimitedCodec::new());
|
state: Arc<Mutex<Shared>>,
|
||||||
|
socket: TcpStream,
|
||||||
|
addr: SocketAddr,
|
||||||
|
) -> Result<(), Box<dyn std::error::Error>> {
|
||||||
|
let length_delimited = Framed::new(socket, LengthDelimitedCodec::new());
|
||||||
let mut stream = tokio_serde::SymmetricallyFramed::new(
|
let mut stream = tokio_serde::SymmetricallyFramed::new(
|
||||||
length_delimited,
|
length_delimited,
|
||||||
tokio_serde::formats::SymmetricalBincode::<Message>::default(),
|
tokio_serde::formats::SymmetricalBincode::<Message>::default(),
|
||||||
);
|
);
|
||||||
while let Some(message) = stream.try_next().await? {
|
let first_message = match stream.next().await {
|
||||||
println!("GOT: {:?}", message);
|
Some(Ok(msg)) => {
|
||||||
|
println!("first msg: {:?}", msg);
|
||||||
|
msg
|
||||||
|
}
|
||||||
|
_ => {
|
||||||
|
println!("no first message");
|
||||||
|
return Ok(());
|
||||||
|
}
|
||||||
|
};
|
||||||
|
let mut client = Client::new(first_message.from_sender, state.clone(), stream).await?;
|
||||||
|
// add client to state here
|
||||||
|
loop {
|
||||||
|
tokio::select! {
|
||||||
|
Some(msg) = client.rx.recv() => {
|
||||||
|
println!("message received to client.rx {:?}", msg);
|
||||||
|
}
|
||||||
|
result = client.messages.next() => match result {
|
||||||
|
Some(Ok(msg)) => {
|
||||||
|
println!("GOT: {:?}", msg);
|
||||||
|
}
|
||||||
|
Some(Err(e)) => {
|
||||||
|
println!("Error {:?}", e);
|
||||||
|
}
|
||||||
|
None => break,
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
// client is disconnected, let's remove them from the state
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue