|
|
@ -52,7 +52,7 @@ pub struct Client { |
|
|
rooms: RoomMap,
|
|
|
rooms: RoomMap,
|
|
|
users: UserMap,
|
|
|
users: UserMap,
|
|
|
|
|
|
|
|
|
peers: slab::Slab<Peer, usize>,
|
|
|
|
|
|
|
|
|
peers: slab::Slab<Peer>,
|
|
|
}
|
|
|
}
|
|
|
|
|
|
|
|
|
impl Client {
|
|
|
impl Client {
|
|
|
@ -77,7 +77,7 @@ impl Client { |
|
|
rooms: RoomMap::new(),
|
|
|
rooms: RoomMap::new(),
|
|
|
users: UserMap::new(),
|
|
|
users: UserMap::new(),
|
|
|
|
|
|
|
|
|
peers: slab::Slab::new(max_peers),
|
|
|
|
|
|
|
|
|
peers: slab::Slab::with_capacity(max_peers),
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -264,20 +264,15 @@ impl Client { |
|
|
*=========================*/
|
|
|
*=========================*/
|
|
|
|
|
|
|
|
|
#[allow(dead_code)]
|
|
|
#[allow(dead_code)]
|
|
|
fn handle_peer_connection_closed(&mut self, peer_id: usize) {
|
|
|
|
|
|
let mut occupied_entry = match self.peers.entry(peer_id) {
|
|
|
|
|
|
None | Some(slab::Entry::Vacant(_)) => {
|
|
|
|
|
|
error!("Unknown peer connection {} has closed", peer_id);
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
Some(slab::Entry::Occupied(occupied_entry)) => occupied_entry,
|
|
|
|
|
|
|
|
|
fn handle_peer_connection_closed(&mut self, mut peer_id: usize) {
|
|
|
|
|
|
let Some(mut peer) = self.peers.try_remove(peer_id) else {
|
|
|
|
|
|
error!("Unknown peer connection {} has closed", peer_id);
|
|
|
|
|
|
return;
|
|
|
};
|
|
|
};
|
|
|
|
|
|
|
|
|
match occupied_entry.get_mut().state {
|
|
|
|
|
|
|
|
|
match peer.state {
|
|
|
PeerState::Open => {
|
|
|
PeerState::Open => {
|
|
|
info!("Peer connection {} has closed", peer_id);
|
|
|
info!("Peer connection {} has closed", peer_id);
|
|
|
occupied_entry.remove();
|
|
|
|
|
|
}
|
|
|
}
|
|
|
|
|
|
|
|
|
PeerState::WaitingFirewalled => {
|
|
|
PeerState::WaitingFirewalled => {
|
|
|
@ -285,7 +280,6 @@ impl Client { |
|
|
"Peer connection {} has closed, was waiting: inconsistent",
|
|
|
"Peer connection {} has closed, was waiting: inconsistent",
|
|
|
peer_id
|
|
|
peer_id
|
|
|
);
|
|
|
);
|
|
|
occupied_entry.remove();
|
|
|
|
|
|
}
|
|
|
}
|
|
|
|
|
|
|
|
|
PeerState::Opening => {
|
|
|
PeerState::Opening => {
|
|
|
@ -294,8 +288,10 @@ impl Client { |
|
|
peer_id
|
|
|
peer_id
|
|
|
);
|
|
|
);
|
|
|
|
|
|
|
|
|
let peer = occupied_entry.get_mut();
|
|
|
|
|
|
peer.state = PeerState::WaitingFirewalled;
|
|
|
peer.state = PeerState::WaitingFirewalled;
|
|
|
|
|
|
peer_id = self.peers.insert(peer);
|
|
|
|
|
|
|
|
|
|
|
|
let peer = self.peers.get(peer_id).unwrap();
|
|
|
|
|
|
|
|
|
#[allow(deprecated)]
|
|
|
#[allow(deprecated)]
|
|
|
self
|
|
|
self
|
|
|
@ -317,7 +313,6 @@ impl Client { |
|
|
peer_id
|
|
|
peer_id
|
|
|
);
|
|
|
);
|
|
|
|
|
|
|
|
|
let (peer, _) = occupied_entry.remove();
|
|
|
|
|
|
#[allow(deprecated)]
|
|
|
#[allow(deprecated)]
|
|
|
self
|
|
|
self
|
|
|
.proto_tx
|
|
|
.proto_tx
|
|
|
@ -461,40 +456,28 @@ impl Client { |
|
|
&mut self,
|
|
|
&mut self,
|
|
|
response: server::ConnectToPeerResponse,
|
|
|
response: server::ConnectToPeerResponse,
|
|
|
) {
|
|
|
) {
|
|
|
let peer = Peer {
|
|
|
|
|
|
|
|
|
if self.peers.len() == self.config.max_peers {
|
|
|
|
|
|
warn!(
|
|
|
|
|
|
"Cannot open peer connection ({}:{}): too many already open",
|
|
|
|
|
|
response.ip,
|
|
|
|
|
|
response.port,
|
|
|
|
|
|
);
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
let peer_id = self.peers.insert(Peer {
|
|
|
user_name: response.user_name,
|
|
|
user_name: response.user_name,
|
|
|
ip: response.ip,
|
|
|
ip: response.ip,
|
|
|
port: response.port,
|
|
|
port: response.port,
|
|
|
connection_type: response.connection_type,
|
|
|
connection_type: response.connection_type,
|
|
|
token: response.token,
|
|
|
token: response.token,
|
|
|
state: PeerState::OpeningFirewalled,
|
|
|
state: PeerState::OpeningFirewalled,
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
match self.peers.insert(peer) {
|
|
|
|
|
|
Ok(peer_id) => {
|
|
|
|
|
|
info!(
|
|
|
|
|
|
"Opening peer connection {} to {}:{} to pierce firewall",
|
|
|
|
|
|
peer_id, response.ip, response.port
|
|
|
|
|
|
);
|
|
|
|
|
|
/*
|
|
|
|
|
|
self
|
|
|
|
|
|
.proto_tx
|
|
|
|
|
|
.send(solstice_proto::Request::PeerConnect(
|
|
|
|
|
|
peer_id,
|
|
|
|
|
|
response.ip,
|
|
|
|
|
|
response.port,
|
|
|
|
|
|
))
|
|
|
|
|
|
.unwrap();
|
|
|
|
|
|
*/
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
Err(peer) => {
|
|
|
|
|
|
warn!(
|
|
|
|
|
|
"Cannot open peer connection {:?}: too many already open",
|
|
|
|
|
|
peer
|
|
|
|
|
|
);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
info!(
|
|
|
|
|
|
"Opening peer connection {} to {}:{} to pierce firewall",
|
|
|
|
|
|
peer_id, response.ip, response.port
|
|
|
|
|
|
);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
|
|
|
fn handle_login_response(&mut self, login: server::LoginResponse) {
|
|
|
fn handle_login_response(&mut self, login: server::LoginResponse) {
|
|
|
|