rust/hedgewars-server/src/server/network.rs
author alfadur
Tue, 01 Feb 2022 20:58:35 +0300
changeset 15832 a4d505a32879
parent 15831 7d0f747afcb8
child 15936 c5c53ebb2d91
permissions -rw-r--r--
add back client timeouts
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
15831
7d0f747afcb8 move server network to tokio
alfadur
parents: 15804
diff changeset
     1
use bytes::{Buf, Bytes};
7d0f747afcb8 move server network to tokio
alfadur
parents: 15804
diff changeset
     2
use log::*;
7d0f747afcb8 move server network to tokio
alfadur
parents: 15804
diff changeset
     3
use slab::Slab;
13414
28b314ad566d handle edge polling properly
alfadur
parents: 13119
diff changeset
     4
use std::{
15831
7d0f747afcb8 move server network to tokio
alfadur
parents: 15804
diff changeset
     5
    iter::Iterator,
15832
a4d505a32879 add back client timeouts
alfadur
parents: 15831
diff changeset
     6
    net::{IpAddr, SocketAddr},
15800
6af892a0a4b8 update mio
alfadur
parents: 15531
diff changeset
     7
    time::Duration,
13414
28b314ad566d handle edge polling properly
alfadur
parents: 13119
diff changeset
     8
};
15831
7d0f747afcb8 move server network to tokio
alfadur
parents: 15804
diff changeset
     9
use tokio::{
7d0f747afcb8 move server network to tokio
alfadur
parents: 15804
diff changeset
    10
    io::AsyncReadExt,
14457
98ef2913ec73 Apply rustfmt to all files
unc0rr
parents: 14415
diff changeset
    11
    net::{TcpListener, TcpStream},
15831
7d0f747afcb8 move server network to tokio
alfadur
parents: 15804
diff changeset
    12
    sync::mpsc::{channel, Receiver, Sender},
13414
28b314ad566d handle edge polling properly
alfadur
parents: 13119
diff changeset
    13
};
13119
1e39b8749072 separated the server logic from all the async io mess.
alfadur
parents:
diff changeset
    14
13666
09f4a30e50cc Rust 2018 conversion
alfadur
parents: 13524
diff changeset
    15
use crate::{
15800
6af892a0a4b8 update mio
alfadur
parents: 15531
diff changeset
    16
    core::{
6af892a0a4b8 update mio
alfadur
parents: 15531
diff changeset
    17
        events::{TimedEvents, Timeout},
6af892a0a4b8 update mio
alfadur
parents: 15531
diff changeset
    18
        types::ClientId,
6af892a0a4b8 update mio
alfadur
parents: 15531
diff changeset
    19
    },
15074
c5a6e8566425 shuffle server files
alfadur
parents: 14916
diff changeset
    20
    handlers,
15520
fd3a20e9d095 move the anteroom out of the server
alfadur <mail@none>
parents: 15517
diff changeset
    21
    handlers::{IoResult, IoTask, ServerState},
15832
a4d505a32879 add back client timeouts
alfadur
parents: 15831
diff changeset
    22
    protocol::{self, ProtocolDecoder, ProtocolError},
13666
09f4a30e50cc Rust 2018 conversion
alfadur
parents: 13524
diff changeset
    23
    utils,
13414
28b314ad566d handle edge polling properly
alfadur
parents: 13119
diff changeset
    24
};
15831
7d0f747afcb8 move server network to tokio
alfadur
parents: 15804
diff changeset
    25
use hedgewars_network_protocol::{
7d0f747afcb8 move server network to tokio
alfadur
parents: 15804
diff changeset
    26
    messages::HwServerMessage::Redirect, messages::*, parser::server_message,
7d0f747afcb8 move server network to tokio
alfadur
parents: 15804
diff changeset
    27
};
7d0f747afcb8 move server network to tokio
alfadur
parents: 15804
diff changeset
    28
use tokio::io::AsyncWriteExt;
14779
f43ab2bd76ae add a thread for internal server IO and implement account checking with it
alfadur
parents: 14697
diff changeset
    29
15832
a4d505a32879 add back client timeouts
alfadur
parents: 15831
diff changeset
    30
const PING_TIMEOUT: Duration = Duration::from_secs(15);
a4d505a32879 add back client timeouts
alfadur
parents: 15831
diff changeset
    31
15831
7d0f747afcb8 move server network to tokio
alfadur
parents: 15804
diff changeset
    32
enum ClientUpdateData {
7d0f747afcb8 move server network to tokio
alfadur
parents: 15804
diff changeset
    33
    Message(HwProtocolMessage),
7d0f747afcb8 move server network to tokio
alfadur
parents: 15804
diff changeset
    34
    Error(String),
7d0f747afcb8 move server network to tokio
alfadur
parents: 15804
diff changeset
    35
}
7d0f747afcb8 move server network to tokio
alfadur
parents: 15804
diff changeset
    36
7d0f747afcb8 move server network to tokio
alfadur
parents: 15804
diff changeset
    37
struct ClientUpdate {
7d0f747afcb8 move server network to tokio
alfadur
parents: 15804
diff changeset
    38
    client_id: ClientId,
7d0f747afcb8 move server network to tokio
alfadur
parents: 15804
diff changeset
    39
    data: ClientUpdateData,
7d0f747afcb8 move server network to tokio
alfadur
parents: 15804
diff changeset
    40
}
13414
28b314ad566d handle edge polling properly
alfadur
parents: 13119
diff changeset
    41
15831
7d0f747afcb8 move server network to tokio
alfadur
parents: 15804
diff changeset
    42
struct ClientUpdateSender {
7d0f747afcb8 move server network to tokio
alfadur
parents: 15804
diff changeset
    43
    client_id: ClientId,
7d0f747afcb8 move server network to tokio
alfadur
parents: 15804
diff changeset
    44
    sender: Sender<ClientUpdate>,
7d0f747afcb8 move server network to tokio
alfadur
parents: 15804
diff changeset
    45
}
13119
1e39b8749072 separated the server logic from all the async io mess.
alfadur
parents:
diff changeset
    46
15831
7d0f747afcb8 move server network to tokio
alfadur
parents: 15804
diff changeset
    47
impl ClientUpdateSender {
7d0f747afcb8 move server network to tokio
alfadur
parents: 15804
diff changeset
    48
    async fn send(&mut self, data: ClientUpdateData) -> bool {
7d0f747afcb8 move server network to tokio
alfadur
parents: 15804
diff changeset
    49
        self.sender
7d0f747afcb8 move server network to tokio
alfadur
parents: 15804
diff changeset
    50
            .send(ClientUpdate {
7d0f747afcb8 move server network to tokio
alfadur
parents: 15804
diff changeset
    51
                client_id: self.client_id,
7d0f747afcb8 move server network to tokio
alfadur
parents: 15804
diff changeset
    52
                data,
7d0f747afcb8 move server network to tokio
alfadur
parents: 15804
diff changeset
    53
            })
7d0f747afcb8 move server network to tokio
alfadur
parents: 15804
diff changeset
    54
            .await
7d0f747afcb8 move server network to tokio
alfadur
parents: 15804
diff changeset
    55
            .is_ok()
7d0f747afcb8 move server network to tokio
alfadur
parents: 15804
diff changeset
    56
    }
7d0f747afcb8 move server network to tokio
alfadur
parents: 15804
diff changeset
    57
}
7d0f747afcb8 move server network to tokio
alfadur
parents: 15804
diff changeset
    58
7d0f747afcb8 move server network to tokio
alfadur
parents: 15804
diff changeset
    59
struct NetworkClient {
7d0f747afcb8 move server network to tokio
alfadur
parents: 15804
diff changeset
    60
    id: ClientId,
7d0f747afcb8 move server network to tokio
alfadur
parents: 15804
diff changeset
    61
    socket: TcpStream,
7d0f747afcb8 move server network to tokio
alfadur
parents: 15804
diff changeset
    62
    receiver: Receiver<Bytes>,
7d0f747afcb8 move server network to tokio
alfadur
parents: 15804
diff changeset
    63
    peer_addr: SocketAddr,
7d0f747afcb8 move server network to tokio
alfadur
parents: 15804
diff changeset
    64
    decoder: ProtocolDecoder,
13414
28b314ad566d handle edge polling properly
alfadur
parents: 13119
diff changeset
    65
}
28b314ad566d handle edge polling properly
alfadur
parents: 13119
diff changeset
    66
15831
7d0f747afcb8 move server network to tokio
alfadur
parents: 15804
diff changeset
    67
impl NetworkClient {
7d0f747afcb8 move server network to tokio
alfadur
parents: 15804
diff changeset
    68
    fn new(
7d0f747afcb8 move server network to tokio
alfadur
parents: 15804
diff changeset
    69
        id: ClientId,
7d0f747afcb8 move server network to tokio
alfadur
parents: 15804
diff changeset
    70
        socket: TcpStream,
7d0f747afcb8 move server network to tokio
alfadur
parents: 15804
diff changeset
    71
        peer_addr: SocketAddr,
7d0f747afcb8 move server network to tokio
alfadur
parents: 15804
diff changeset
    72
        receiver: Receiver<Bytes>,
7d0f747afcb8 move server network to tokio
alfadur
parents: 15804
diff changeset
    73
    ) -> Self {
7d0f747afcb8 move server network to tokio
alfadur
parents: 15804
diff changeset
    74
        Self {
7d0f747afcb8 move server network to tokio
alfadur
parents: 15804
diff changeset
    75
            id,
7d0f747afcb8 move server network to tokio
alfadur
parents: 15804
diff changeset
    76
            socket,
7d0f747afcb8 move server network to tokio
alfadur
parents: 15804
diff changeset
    77
            peer_addr,
7d0f747afcb8 move server network to tokio
alfadur
parents: 15804
diff changeset
    78
            receiver,
15832
a4d505a32879 add back client timeouts
alfadur
parents: 15831
diff changeset
    79
            decoder: ProtocolDecoder::new(PING_TIMEOUT),
15831
7d0f747afcb8 move server network to tokio
alfadur
parents: 15804
diff changeset
    80
        }
7d0f747afcb8 move server network to tokio
alfadur
parents: 15804
diff changeset
    81
    }
13119
1e39b8749072 separated the server logic from all the async io mess.
alfadur
parents:
diff changeset
    82
15832
a4d505a32879 add back client timeouts
alfadur
parents: 15831
diff changeset
    83
    async fn read(
a4d505a32879 add back client timeouts
alfadur
parents: 15831
diff changeset
    84
        socket: &mut TcpStream,
a4d505a32879 add back client timeouts
alfadur
parents: 15831
diff changeset
    85
        decoder: &mut ProtocolDecoder,
a4d505a32879 add back client timeouts
alfadur
parents: 15831
diff changeset
    86
    ) -> protocol::Result<HwProtocolMessage> {
a4d505a32879 add back client timeouts
alfadur
parents: 15831
diff changeset
    87
        let result = decoder.read_from(socket).await;
a4d505a32879 add back client timeouts
alfadur
parents: 15831
diff changeset
    88
        if matches!(result, Err(ProtocolError::Timeout)) {
a4d505a32879 add back client timeouts
alfadur
parents: 15831
diff changeset
    89
            if Self::write(socket, Bytes::from(HwServerMessage::Ping.to_raw_protocol())).await {
a4d505a32879 add back client timeouts
alfadur
parents: 15831
diff changeset
    90
                decoder.read_from(socket).await
a4d505a32879 add back client timeouts
alfadur
parents: 15831
diff changeset
    91
            } else {
a4d505a32879 add back client timeouts
alfadur
parents: 15831
diff changeset
    92
                Err(ProtocolError::Eof)
a4d505a32879 add back client timeouts
alfadur
parents: 15831
diff changeset
    93
            }
a4d505a32879 add back client timeouts
alfadur
parents: 15831
diff changeset
    94
        } else {
a4d505a32879 add back client timeouts
alfadur
parents: 15831
diff changeset
    95
            result
a4d505a32879 add back client timeouts
alfadur
parents: 15831
diff changeset
    96
        }
15831
7d0f747afcb8 move server network to tokio
alfadur
parents: 15804
diff changeset
    97
    }
7d0f747afcb8 move server network to tokio
alfadur
parents: 15804
diff changeset
    98
15832
a4d505a32879 add back client timeouts
alfadur
parents: 15831
diff changeset
    99
    async fn write(socket: &mut TcpStream, mut data: Bytes) -> bool {
a4d505a32879 add back client timeouts
alfadur
parents: 15831
diff changeset
   100
        !data.has_remaining() || matches!(socket.write_buf(&mut data).await, Ok(n) if n > 0)
15831
7d0f747afcb8 move server network to tokio
alfadur
parents: 15804
diff changeset
   101
    }
13799
c8fd12db6215 Add TLS support
alfadur
parents: 13666
diff changeset
   102
15831
7d0f747afcb8 move server network to tokio
alfadur
parents: 15804
diff changeset
   103
    async fn run(mut self, sender: Sender<ClientUpdate>) {
7d0f747afcb8 move server network to tokio
alfadur
parents: 15804
diff changeset
   104
        use ClientUpdateData::*;
7d0f747afcb8 move server network to tokio
alfadur
parents: 15804
diff changeset
   105
        let mut sender = ClientUpdateSender {
7d0f747afcb8 move server network to tokio
alfadur
parents: 15804
diff changeset
   106
            client_id: self.id,
7d0f747afcb8 move server network to tokio
alfadur
parents: 15804
diff changeset
   107
            sender,
7d0f747afcb8 move server network to tokio
alfadur
parents: 15804
diff changeset
   108
        };
7d0f747afcb8 move server network to tokio
alfadur
parents: 15804
diff changeset
   109
7d0f747afcb8 move server network to tokio
alfadur
parents: 15804
diff changeset
   110
        loop {
7d0f747afcb8 move server network to tokio
alfadur
parents: 15804
diff changeset
   111
            tokio::select! {
7d0f747afcb8 move server network to tokio
alfadur
parents: 15804
diff changeset
   112
                server_message = self.receiver.recv() => {
7d0f747afcb8 move server network to tokio
alfadur
parents: 15804
diff changeset
   113
                    match server_message {
15832
a4d505a32879 add back client timeouts
alfadur
parents: 15831
diff changeset
   114
                        Some(message) => if !Self::write(&mut self.socket, message).await {
15831
7d0f747afcb8 move server network to tokio
alfadur
parents: 15804
diff changeset
   115
                            sender.send(Error("Connection reset by peer".to_string())).await;
7d0f747afcb8 move server network to tokio
alfadur
parents: 15804
diff changeset
   116
                            break;
7d0f747afcb8 move server network to tokio
alfadur
parents: 15804
diff changeset
   117
                        }
7d0f747afcb8 move server network to tokio
alfadur
parents: 15804
diff changeset
   118
                        None => {
7d0f747afcb8 move server network to tokio
alfadur
parents: 15804
diff changeset
   119
                            break;
7d0f747afcb8 move server network to tokio
alfadur
parents: 15804
diff changeset
   120
                        }
7d0f747afcb8 move server network to tokio
alfadur
parents: 15804
diff changeset
   121
                    }
7d0f747afcb8 move server network to tokio
alfadur
parents: 15804
diff changeset
   122
                }
15832
a4d505a32879 add back client timeouts
alfadur
parents: 15831
diff changeset
   123
                client_message = Self::read(&mut self.socket, &mut self.decoder) => {
15831
7d0f747afcb8 move server network to tokio
alfadur
parents: 15804
diff changeset
   124
                     match client_message {
15832
a4d505a32879 add back client timeouts
alfadur
parents: 15831
diff changeset
   125
                        Ok(message) => {
15831
7d0f747afcb8 move server network to tokio
alfadur
parents: 15804
diff changeset
   126
                            if !sender.send(Message(message)).await {
7d0f747afcb8 move server network to tokio
alfadur
parents: 15804
diff changeset
   127
                                break;
7d0f747afcb8 move server network to tokio
alfadur
parents: 15804
diff changeset
   128
                            }
7d0f747afcb8 move server network to tokio
alfadur
parents: 15804
diff changeset
   129
                        }
15832
a4d505a32879 add back client timeouts
alfadur
parents: 15831
diff changeset
   130
                        Err(e) => {
a4d505a32879 add back client timeouts
alfadur
parents: 15831
diff changeset
   131
                            sender.send(Error(format!("{}", e))).await;
a4d505a32879 add back client timeouts
alfadur
parents: 15831
diff changeset
   132
                            if matches!(e, ProtocolError::Timeout) {
a4d505a32879 add back client timeouts
alfadur
parents: 15831
diff changeset
   133
                                Self::write(&mut self.socket, Bytes::from(HwServerMessage::Bye("Ping timeout".to_string()).to_raw_protocol())).await;
a4d505a32879 add back client timeouts
alfadur
parents: 15831
diff changeset
   134
                            }
15831
7d0f747afcb8 move server network to tokio
alfadur
parents: 15804
diff changeset
   135
                            break;
7d0f747afcb8 move server network to tokio
alfadur
parents: 15804
diff changeset
   136
                        }
7d0f747afcb8 move server network to tokio
alfadur
parents: 15804
diff changeset
   137
                    }
7d0f747afcb8 move server network to tokio
alfadur
parents: 15804
diff changeset
   138
                }
7d0f747afcb8 move server network to tokio
alfadur
parents: 15804
diff changeset
   139
            }
13799
c8fd12db6215 Add TLS support
alfadur
parents: 13666
diff changeset
   140
        }
c8fd12db6215 Add TLS support
alfadur
parents: 13666
diff changeset
   141
    }
c8fd12db6215 Add TLS support
alfadur
parents: 13666
diff changeset
   142
}
c8fd12db6215 Add TLS support
alfadur
parents: 13666
diff changeset
   143
15831
7d0f747afcb8 move server network to tokio
alfadur
parents: 15804
diff changeset
   144
pub struct NetworkLayer {
7d0f747afcb8 move server network to tokio
alfadur
parents: 15804
diff changeset
   145
    listener: TcpListener,
7d0f747afcb8 move server network to tokio
alfadur
parents: 15804
diff changeset
   146
    server_state: ServerState,
7d0f747afcb8 move server network to tokio
alfadur
parents: 15804
diff changeset
   147
    clients: Slab<Sender<Bytes>>,
13119
1e39b8749072 separated the server logic from all the async io mess.
alfadur
parents:
diff changeset
   148
}
1e39b8749072 separated the server logic from all the async io mess.
alfadur
parents:
diff changeset
   149
15831
7d0f747afcb8 move server network to tokio
alfadur
parents: 15804
diff changeset
   150
impl NetworkLayer {
7d0f747afcb8 move server network to tokio
alfadur
parents: 15804
diff changeset
   151
    pub async fn run(&mut self) {
7d0f747afcb8 move server network to tokio
alfadur
parents: 15804
diff changeset
   152
        let (update_tx, mut update_rx) = channel(128);
13119
1e39b8749072 separated the server logic from all the async io mess.
alfadur
parents:
diff changeset
   153
15831
7d0f747afcb8 move server network to tokio
alfadur
parents: 15804
diff changeset
   154
        loop {
7d0f747afcb8 move server network to tokio
alfadur
parents: 15804
diff changeset
   155
            tokio::select! {
7d0f747afcb8 move server network to tokio
alfadur
parents: 15804
diff changeset
   156
                Ok((stream, addr)) = self.listener.accept() => {
7d0f747afcb8 move server network to tokio
alfadur
parents: 15804
diff changeset
   157
                    if let Some(client) = self.create_client(stream, addr).await {
7d0f747afcb8 move server network to tokio
alfadur
parents: 15804
diff changeset
   158
                        tokio::spawn(client.run(update_tx.clone()));
7d0f747afcb8 move server network to tokio
alfadur
parents: 15804
diff changeset
   159
                    }
7d0f747afcb8 move server network to tokio
alfadur
parents: 15804
diff changeset
   160
                }
7d0f747afcb8 move server network to tokio
alfadur
parents: 15804
diff changeset
   161
                client_message = update_rx.recv(), if !self.clients.is_empty() => {
7d0f747afcb8 move server network to tokio
alfadur
parents: 15804
diff changeset
   162
                    use ClientUpdateData::*;
7d0f747afcb8 move server network to tokio
alfadur
parents: 15804
diff changeset
   163
                    match client_message {
7d0f747afcb8 move server network to tokio
alfadur
parents: 15804
diff changeset
   164
                        Some(ClientUpdate{ client_id, data: Message(message) } ) => {
7d0f747afcb8 move server network to tokio
alfadur
parents: 15804
diff changeset
   165
                            self.handle_message(client_id, message).await;
7d0f747afcb8 move server network to tokio
alfadur
parents: 15804
diff changeset
   166
                        }
15832
a4d505a32879 add back client timeouts
alfadur
parents: 15831
diff changeset
   167
                        Some(ClientUpdate{ client_id, data: Error(e) } ) => {
15831
7d0f747afcb8 move server network to tokio
alfadur
parents: 15804
diff changeset
   168
                            let mut response = handlers::Response::new(client_id);
15832
a4d505a32879 add back client timeouts
alfadur
parents: 15831
diff changeset
   169
                            info!("Client {} error: {:?}", client_id, e);
a4d505a32879 add back client timeouts
alfadur
parents: 15831
diff changeset
   170
                            response.remove_client(client_id);
15831
7d0f747afcb8 move server network to tokio
alfadur
parents: 15804
diff changeset
   171
                            handlers::handle_client_loss(&mut self.server_state, client_id, &mut response);
7d0f747afcb8 move server network to tokio
alfadur
parents: 15804
diff changeset
   172
                            self.handle_response(response).await;
7d0f747afcb8 move server network to tokio
alfadur
parents: 15804
diff changeset
   173
                        }
7d0f747afcb8 move server network to tokio
alfadur
parents: 15804
diff changeset
   174
                        None => unreachable!()
7d0f747afcb8 move server network to tokio
alfadur
parents: 15804
diff changeset
   175
                    }
7d0f747afcb8 move server network to tokio
alfadur
parents: 15804
diff changeset
   176
                }
13802
24fe56d3c6a2 improve error handling for TLS handshake
alfadur
parents: 13799
diff changeset
   177
            }
24fe56d3c6a2 improve error handling for TLS handshake
alfadur
parents: 13799
diff changeset
   178
        }
24fe56d3c6a2 improve error handling for TLS handshake
alfadur
parents: 13799
diff changeset
   179
    }
24fe56d3c6a2 improve error handling for TLS handshake
alfadur
parents: 13799
diff changeset
   180
15831
7d0f747afcb8 move server network to tokio
alfadur
parents: 15804
diff changeset
   181
    async fn create_client(
7d0f747afcb8 move server network to tokio
alfadur
parents: 15804
diff changeset
   182
        &mut self,
7d0f747afcb8 move server network to tokio
alfadur
parents: 15804
diff changeset
   183
        stream: TcpStream,
7d0f747afcb8 move server network to tokio
alfadur
parents: 15804
diff changeset
   184
        addr: SocketAddr,
7d0f747afcb8 move server network to tokio
alfadur
parents: 15804
diff changeset
   185
    ) -> Option<NetworkClient> {
7d0f747afcb8 move server network to tokio
alfadur
parents: 15804
diff changeset
   186
        let entry = self.clients.vacant_entry();
7d0f747afcb8 move server network to tokio
alfadur
parents: 15804
diff changeset
   187
        let client_id = entry.key();
7d0f747afcb8 move server network to tokio
alfadur
parents: 15804
diff changeset
   188
        let (tx, rx) = channel(16);
7d0f747afcb8 move server network to tokio
alfadur
parents: 15804
diff changeset
   189
        entry.insert(tx);
7d0f747afcb8 move server network to tokio
alfadur
parents: 15804
diff changeset
   190
7d0f747afcb8 move server network to tokio
alfadur
parents: 15804
diff changeset
   191
        let client = NetworkClient::new(client_id, stream, addr, rx);
13414
28b314ad566d handle edge polling properly
alfadur
parents: 13119
diff changeset
   192
15831
7d0f747afcb8 move server network to tokio
alfadur
parents: 15804
diff changeset
   193
        info!("client {} ({}) added", client.id, client.peer_addr);
7d0f747afcb8 move server network to tokio
alfadur
parents: 15804
diff changeset
   194
7d0f747afcb8 move server network to tokio
alfadur
parents: 15804
diff changeset
   195
        let mut response = handlers::Response::new(client_id);
7d0f747afcb8 move server network to tokio
alfadur
parents: 15804
diff changeset
   196
7d0f747afcb8 move server network to tokio
alfadur
parents: 15804
diff changeset
   197
        let added = if let IpAddr::V4(addr) = client.peer_addr.ip() {
7d0f747afcb8 move server network to tokio
alfadur
parents: 15804
diff changeset
   198
            handlers::handle_client_accept(
7d0f747afcb8 move server network to tokio
alfadur
parents: 15804
diff changeset
   199
                &mut self.server_state,
7d0f747afcb8 move server network to tokio
alfadur
parents: 15804
diff changeset
   200
                client_id,
7d0f747afcb8 move server network to tokio
alfadur
parents: 15804
diff changeset
   201
                &mut response,
7d0f747afcb8 move server network to tokio
alfadur
parents: 15804
diff changeset
   202
                addr.octets(),
7d0f747afcb8 move server network to tokio
alfadur
parents: 15804
diff changeset
   203
                addr.is_loopback(),
7d0f747afcb8 move server network to tokio
alfadur
parents: 15804
diff changeset
   204
            )
7d0f747afcb8 move server network to tokio
alfadur
parents: 15804
diff changeset
   205
        } else {
7d0f747afcb8 move server network to tokio
alfadur
parents: 15804
diff changeset
   206
            todo!("implement something")
15800
6af892a0a4b8 update mio
alfadur
parents: 15531
diff changeset
   207
        };
6af892a0a4b8 update mio
alfadur
parents: 15531
diff changeset
   208
15831
7d0f747afcb8 move server network to tokio
alfadur
parents: 15804
diff changeset
   209
        self.handle_response(response).await;
13414
28b314ad566d handle edge polling properly
alfadur
parents: 13119
diff changeset
   210
15831
7d0f747afcb8 move server network to tokio
alfadur
parents: 15804
diff changeset
   211
        if added {
7d0f747afcb8 move server network to tokio
alfadur
parents: 15804
diff changeset
   212
            Some(client)
14779
f43ab2bd76ae add a thread for internal server IO and implement account checking with it
alfadur
parents: 14697
diff changeset
   213
        } else {
f43ab2bd76ae add a thread for internal server IO and implement account checking with it
alfadur
parents: 14697
diff changeset
   214
            None
f43ab2bd76ae add a thread for internal server IO and implement account checking with it
alfadur
parents: 14697
diff changeset
   215
        }
f43ab2bd76ae add a thread for internal server IO and implement account checking with it
alfadur
parents: 14697
diff changeset
   216
    }
f43ab2bd76ae add a thread for internal server IO and implement account checking with it
alfadur
parents: 14697
diff changeset
   217
15831
7d0f747afcb8 move server network to tokio
alfadur
parents: 15804
diff changeset
   218
    async fn handle_message(&mut self, client_id: ClientId, message: HwProtocolMessage) {
7d0f747afcb8 move server network to tokio
alfadur
parents: 15804
diff changeset
   219
        debug!("Handling message {:?} for client {}", message, client_id);
7d0f747afcb8 move server network to tokio
alfadur
parents: 15804
diff changeset
   220
        let mut response = handlers::Response::new(client_id);
7d0f747afcb8 move server network to tokio
alfadur
parents: 15804
diff changeset
   221
        handlers::handle(&mut self.server_state, client_id, &mut response, message);
7d0f747afcb8 move server network to tokio
alfadur
parents: 15804
diff changeset
   222
        self.handle_response(response).await;
13119
1e39b8749072 separated the server logic from all the async io mess.
alfadur
parents:
diff changeset
   223
    }
1e39b8749072 separated the server logic from all the async io mess.
alfadur
parents:
diff changeset
   224
15831
7d0f747afcb8 move server network to tokio
alfadur
parents: 15804
diff changeset
   225
    async fn handle_response(&mut self, mut response: handlers::Response) {
14830
8ddb5842fe0b allow running plaintext and tls servers in parallel
alfadur
parents: 14807
diff changeset
   226
        if response.is_empty() {
8ddb5842fe0b allow running plaintext and tls servers in parallel
alfadur
parents: 14807
diff changeset
   227
            return;
8ddb5842fe0b allow running plaintext and tls servers in parallel
alfadur
parents: 14807
diff changeset
   228
        }
8ddb5842fe0b allow running plaintext and tls servers in parallel
alfadur
parents: 14807
diff changeset
   229
14672
6e6632068a33 Server action refactoring part 3 of N
alfadur <mail@none>
parents: 14671
diff changeset
   230
        debug!("{} pending server messages", response.len());
15520
fd3a20e9d095 move the anteroom out of the server
alfadur <mail@none>
parents: 15517
diff changeset
   231
        let output = response.extract_messages(&mut self.server_state.server);
14672
6e6632068a33 Server action refactoring part 3 of N
alfadur <mail@none>
parents: 14671
diff changeset
   232
        for (clients, message) in output {
13419
81e0ed105f5d implementation of team related messages
alfadur
parents: 13416
diff changeset
   233
            debug!("Message {:?} to {:?}", message, clients);
15831
7d0f747afcb8 move server network to tokio
alfadur
parents: 15804
diff changeset
   234
            Self::send_message(&mut self.clients, message, clients.iter().cloned()).await;
13414
28b314ad566d handle edge polling properly
alfadur
parents: 13119
diff changeset
   235
        }
14696
8a45c90f4580 fix client removal
alfadur
parents: 14693
diff changeset
   236
8a45c90f4580 fix client removal
alfadur
parents: 14693
diff changeset
   237
        for client_id in response.extract_removed_clients() {
15831
7d0f747afcb8 move server network to tokio
alfadur
parents: 15804
diff changeset
   238
            if self.clients.contains(client_id) {
7d0f747afcb8 move server network to tokio
alfadur
parents: 15804
diff changeset
   239
                self.clients.remove(client_id);
14803
92225a708bda add client timeouts
alfadur
parents: 14796
diff changeset
   240
            }
15831
7d0f747afcb8 move server network to tokio
alfadur
parents: 15804
diff changeset
   241
            info!("Client {} removed", client_id);
15517
abd5eb807166 add ip ban check
alfadur <mail@none>
parents: 15176
diff changeset
   242
        }
14835
57ed3981db20 add redirect message
alfadur
parents: 14830
diff changeset
   243
    }
57ed3981db20 add redirect message
alfadur
parents: 14830
diff changeset
   244
15831
7d0f747afcb8 move server network to tokio
alfadur
parents: 15804
diff changeset
   245
    async fn send_message<I>(
7d0f747afcb8 move server network to tokio
alfadur
parents: 15804
diff changeset
   246
        clients: &mut Slab<Sender<Bytes>>,
7d0f747afcb8 move server network to tokio
alfadur
parents: 15804
diff changeset
   247
        message: HwServerMessage,
7d0f747afcb8 move server network to tokio
alfadur
parents: 15804
diff changeset
   248
        to_clients: I,
7d0f747afcb8 move server network to tokio
alfadur
parents: 15804
diff changeset
   249
    ) where
7d0f747afcb8 move server network to tokio
alfadur
parents: 15804
diff changeset
   250
        I: Iterator<Item = ClientId>,
7d0f747afcb8 move server network to tokio
alfadur
parents: 15804
diff changeset
   251
    {
7d0f747afcb8 move server network to tokio
alfadur
parents: 15804
diff changeset
   252
        let msg_string = message.to_raw_protocol();
7d0f747afcb8 move server network to tokio
alfadur
parents: 15804
diff changeset
   253
        let bytes = Bytes::copy_from_slice(msg_string.as_bytes());
7d0f747afcb8 move server network to tokio
alfadur
parents: 15804
diff changeset
   254
        for client_id in to_clients {
7d0f747afcb8 move server network to tokio
alfadur
parents: 15804
diff changeset
   255
            if let Some(client) = clients.get_mut(client_id) {
7d0f747afcb8 move server network to tokio
alfadur
parents: 15804
diff changeset
   256
                if !client.send(bytes.clone()).await.is_ok() {
7d0f747afcb8 move server network to tokio
alfadur
parents: 15804
diff changeset
   257
                    clients.remove(client_id);
13414
28b314ad566d handle edge polling properly
alfadur
parents: 13119
diff changeset
   258
                }
14457
98ef2913ec73 Apply rustfmt to all files
unc0rr
parents: 14415
diff changeset
   259
            }
13119
1e39b8749072 separated the server logic from all the async io mess.
alfadur
parents:
diff changeset
   260
        }
13414
28b314ad566d handle edge polling properly
alfadur
parents: 13119
diff changeset
   261
    }
13119
1e39b8749072 separated the server logic from all the async io mess.
alfadur
parents:
diff changeset
   262
}
14830
8ddb5842fe0b allow running plaintext and tls servers in parallel
alfadur
parents: 14807
diff changeset
   263
8ddb5842fe0b allow running plaintext and tls servers in parallel
alfadur
parents: 14807
diff changeset
   264
pub struct NetworkLayerBuilder {
8ddb5842fe0b allow running plaintext and tls servers in parallel
alfadur
parents: 14807
diff changeset
   265
    listener: Option<TcpListener>,
8ddb5842fe0b allow running plaintext and tls servers in parallel
alfadur
parents: 14807
diff changeset
   266
    clients_capacity: usize,
8ddb5842fe0b allow running plaintext and tls servers in parallel
alfadur
parents: 14807
diff changeset
   267
    rooms_capacity: usize,
8ddb5842fe0b allow running plaintext and tls servers in parallel
alfadur
parents: 14807
diff changeset
   268
}
8ddb5842fe0b allow running plaintext and tls servers in parallel
alfadur
parents: 14807
diff changeset
   269
8ddb5842fe0b allow running plaintext and tls servers in parallel
alfadur
parents: 14807
diff changeset
   270
impl Default for NetworkLayerBuilder {
8ddb5842fe0b allow running plaintext and tls servers in parallel
alfadur
parents: 14807
diff changeset
   271
    fn default() -> Self {
8ddb5842fe0b allow running plaintext and tls servers in parallel
alfadur
parents: 14807
diff changeset
   272
        Self {
8ddb5842fe0b allow running plaintext and tls servers in parallel
alfadur
parents: 14807
diff changeset
   273
            clients_capacity: 1024,
8ddb5842fe0b allow running plaintext and tls servers in parallel
alfadur
parents: 14807
diff changeset
   274
            rooms_capacity: 512,
8ddb5842fe0b allow running plaintext and tls servers in parallel
alfadur
parents: 14807
diff changeset
   275
            listener: None,
8ddb5842fe0b allow running plaintext and tls servers in parallel
alfadur
parents: 14807
diff changeset
   276
        }
8ddb5842fe0b allow running plaintext and tls servers in parallel
alfadur
parents: 14807
diff changeset
   277
    }
8ddb5842fe0b allow running plaintext and tls servers in parallel
alfadur
parents: 14807
diff changeset
   278
}
8ddb5842fe0b allow running plaintext and tls servers in parallel
alfadur
parents: 14807
diff changeset
   279
8ddb5842fe0b allow running plaintext and tls servers in parallel
alfadur
parents: 14807
diff changeset
   280
impl NetworkLayerBuilder {
8ddb5842fe0b allow running plaintext and tls servers in parallel
alfadur
parents: 14807
diff changeset
   281
    pub fn with_listener(self, listener: TcpListener) -> Self {
8ddb5842fe0b allow running plaintext and tls servers in parallel
alfadur
parents: 14807
diff changeset
   282
        Self {
8ddb5842fe0b allow running plaintext and tls servers in parallel
alfadur
parents: 14807
diff changeset
   283
            listener: Some(listener),
8ddb5842fe0b allow running plaintext and tls servers in parallel
alfadur
parents: 14807
diff changeset
   284
            ..self
8ddb5842fe0b allow running plaintext and tls servers in parallel
alfadur
parents: 14807
diff changeset
   285
        }
8ddb5842fe0b allow running plaintext and tls servers in parallel
alfadur
parents: 14807
diff changeset
   286
    }
8ddb5842fe0b allow running plaintext and tls servers in parallel
alfadur
parents: 14807
diff changeset
   287
15831
7d0f747afcb8 move server network to tokio
alfadur
parents: 15804
diff changeset
   288
    pub fn build(self) -> NetworkLayer {
15520
fd3a20e9d095 move the anteroom out of the server
alfadur <mail@none>
parents: 15517
diff changeset
   289
        let server_state = ServerState::new(self.clients_capacity, self.rooms_capacity);
fd3a20e9d095 move the anteroom out of the server
alfadur <mail@none>
parents: 15517
diff changeset
   290
14830
8ddb5842fe0b allow running plaintext and tls servers in parallel
alfadur
parents: 14807
diff changeset
   291
        let clients = Slab::with_capacity(self.clients_capacity);
8ddb5842fe0b allow running plaintext and tls servers in parallel
alfadur
parents: 14807
diff changeset
   292
8ddb5842fe0b allow running plaintext and tls servers in parallel
alfadur
parents: 14807
diff changeset
   293
        NetworkLayer {
8ddb5842fe0b allow running plaintext and tls servers in parallel
alfadur
parents: 14807
diff changeset
   294
            listener: self.listener.expect("No listener provided"),
15520
fd3a20e9d095 move the anteroom out of the server
alfadur <mail@none>
parents: 15517
diff changeset
   295
            server_state,
14830
8ddb5842fe0b allow running plaintext and tls servers in parallel
alfadur
parents: 14807
diff changeset
   296
            clients,
8ddb5842fe0b allow running plaintext and tls servers in parallel
alfadur
parents: 14807
diff changeset
   297
        }
8ddb5842fe0b allow running plaintext and tls servers in parallel
alfadur
parents: 14807
diff changeset
   298
    }
8ddb5842fe0b allow running plaintext and tls servers in parallel
alfadur
parents: 14807
diff changeset
   299
}