equal
deleted
inserted
replaced
16 use mio_extras::timer; |
16 use mio_extras::timer; |
17 use netbuf; |
17 use netbuf; |
18 use slab::Slab; |
18 use slab::Slab; |
19 |
19 |
20 use crate::{ |
20 use crate::{ |
21 core::{server::HwServer, types::ClientId}, |
21 core::types::ClientId, |
22 handlers, |
22 handlers, |
23 handlers::{IoResult, IoTask}, |
23 handlers::{IoResult, IoTask, ServerState}, |
24 protocol::{messages::HwServerMessage::Redirect, messages::*, ProtocolDecoder}, |
24 protocol::{messages::HwServerMessage::Redirect, messages::*, ProtocolDecoder}, |
25 utils, |
25 utils, |
26 }; |
26 }; |
27 |
27 |
28 #[cfg(feature = "official-server")] |
28 #[cfg(feature = "official-server")] |
315 |
315 |
316 struct TimerData(TimeoutEvent, ClientId); |
316 struct TimerData(TimeoutEvent, ClientId); |
317 |
317 |
318 pub struct NetworkLayer { |
318 pub struct NetworkLayer { |
319 listener: TcpListener, |
319 listener: TcpListener, |
320 server: HwServer, |
320 server_state: ServerState, |
321 clients: Slab<NetworkClient>, |
321 clients: Slab<NetworkClient>, |
322 pending: HashSet<(ClientId, NetworkClientState)>, |
322 pending: HashSet<(ClientId, NetworkClientState)>, |
323 pending_cache: Vec<(ClientId, NetworkClientState)>, |
323 pending_cache: Vec<(ClientId, NetworkClientState)>, |
324 #[cfg(feature = "tls-connections")] |
324 #[cfg(feature = "tls-connections")] |
325 ssl: ServerSsl, |
325 ssl: ServerSsl, |
423 if response.is_empty() { |
423 if response.is_empty() { |
424 return; |
424 return; |
425 } |
425 } |
426 |
426 |
427 debug!("{} pending server messages", response.len()); |
427 debug!("{} pending server messages", response.len()); |
428 let output = response.extract_messages(&mut self.server); |
428 let output = response.extract_messages(&mut self.server_state.server); |
429 for (clients, message) in output { |
429 for (clients, message) in output { |
430 debug!("Message {:?} to {:?}", message, clients); |
430 debug!("Message {:?} to {:?}", message, clients); |
431 let msg_string = message.to_raw_protocol(); |
431 let msg_string = message.to_raw_protocol(); |
432 for client_id in clients { |
432 for client_id in clients { |
433 if let Some(client) = self.clients.get_mut(client_id) { |
433 if let Some(client) = self.clients.get_mut(client_id) { |
523 response.add(Redirect(self.ssl.listener.local_addr().unwrap().port()).send_self()) |
523 response.add(Redirect(self.ssl.listener.local_addr().unwrap().port()).send_self()) |
524 } |
524 } |
525 |
525 |
526 if let IpAddr::V4(addr) = self.clients[client_id].peer_addr.ip() { |
526 if let IpAddr::V4(addr) = self.clients[client_id].peer_addr.ip() { |
527 handlers::handle_client_accept( |
527 handlers::handle_client_accept( |
528 &mut self.server, |
528 &mut self.server_state, |
529 client_id, |
529 client_id, |
530 &mut response, |
530 &mut response, |
531 addr.octets(), |
531 addr.octets(), |
532 addr.is_loopback(), |
532 addr.is_loopback(), |
533 ); |
533 ); |
592 |
592 |
593 match messages { |
593 match messages { |
594 Ok((messages, state)) => { |
594 Ok((messages, state)) => { |
595 for message in messages { |
595 for message in messages { |
596 debug!("Handling message {:?} for client {}", message, client_id); |
596 debug!("Handling message {:?} for client {}", message, client_id); |
597 handlers::handle(&mut self.server, client_id, &mut response, message); |
597 handlers::handle(&mut self.server_state, client_id, &mut response, message); |
598 } |
598 } |
599 match state { |
599 match state { |
600 NetworkClientState::NeedsRead => { |
600 NetworkClientState::NeedsRead => { |
601 self.pending.insert((client_id, state)); |
601 self.pending.insert((client_id, state)); |
602 } |
602 } |
647 let pending_close = self.clients[client_id].pending_close; |
647 let pending_close = self.clients[client_id].pending_close; |
648 self.deregister_client(poll, client_id, true); |
648 self.deregister_client(poll, client_id, true); |
649 |
649 |
650 if !pending_close { |
650 if !pending_close { |
651 let mut response = handlers::Response::new(client_id); |
651 let mut response = handlers::Response::new(client_id); |
652 handlers::handle_client_loss(&mut self.server, client_id, &mut response); |
652 handlers::handle_client_loss(&mut self.server_state, client_id, &mut response); |
653 self.handle_response(response, poll); |
653 self.handle_response(response, poll); |
654 } |
654 } |
655 |
655 |
656 Ok(()) |
656 Ok(()) |
657 } |
657 } |
728 context: builder.build(), |
728 context: builder.build(), |
729 } |
729 } |
730 } |
730 } |
731 |
731 |
732 pub fn build(self) -> NetworkLayer { |
732 pub fn build(self) -> NetworkLayer { |
733 let server = HwServer::new(self.clients_capacity, self.rooms_capacity); |
733 let server_state = ServerState::new(self.clients_capacity, self.rooms_capacity); |
|
734 |
734 let clients = Slab::with_capacity(self.clients_capacity); |
735 let clients = Slab::with_capacity(self.clients_capacity); |
735 let pending = HashSet::with_capacity(2 * self.clients_capacity); |
736 let pending = HashSet::with_capacity(2 * self.clients_capacity); |
736 let pending_cache = Vec::with_capacity(2 * self.clients_capacity); |
737 let pending_cache = Vec::with_capacity(2 * self.clients_capacity); |
737 let timer = timer::Builder::default().build(); |
738 let timer = timer::Builder::default().build(); |
738 |
739 |
739 NetworkLayer { |
740 NetworkLayer { |
740 listener: self.listener.expect("No listener provided"), |
741 listener: self.listener.expect("No listener provided"), |
741 server, |
742 server_state, |
742 clients, |
743 clients, |
743 pending, |
744 pending, |
744 pending_cache, |
745 pending_cache, |
745 #[cfg(feature = "tls-connections")] |
746 #[cfg(feature = "tls-connections")] |
746 ssl: Self::create_ssl_context( |
747 ssl: Self::create_ssl_context( |