fix(messages): acknowledge stored private messages, and disconnect cleanly
Two bugs an e2e test found the moment one existed for this path. A private message the server held while we were offline arrives with new_message false, and the handler only acknowledged the ones flagged new — so exactly the messages that need an ack never got one and the server re-delivered them at every login, forever. Every delivery is now acknowledged. A dropped Client also left its server connection open, so the session lived on: mail addressed to us went to a socket nobody was reading and a later login collided with our own ghost. Client::disconnect closes the server and peer connections, and Drop calls it. Also covers two features that were never driven end to end: an offline message delivered once and not again, and a wishlist search answered like any other.
This commit is contained in:
@@ -202,6 +202,24 @@ impl PeerRegistry {
|
||||
None
|
||||
}
|
||||
|
||||
/// Stop every peer actor and empty the registry, closing the connections
|
||||
/// they hold. Used when the client shuts down.
|
||||
pub fn stop_all(&self) {
|
||||
let handles = match self.peers.lock_safe() {
|
||||
Ok(mut peers) => peers
|
||||
.drain()
|
||||
.map(|(_, (_, handle))| handle)
|
||||
.collect::<Vec<_>>(),
|
||||
Err(e) => {
|
||||
error!("[peer_registry] stop_all: {}", e);
|
||||
return;
|
||||
}
|
||||
};
|
||||
for handle in handles {
|
||||
let _ = handle.stop();
|
||||
}
|
||||
}
|
||||
|
||||
#[must_use]
|
||||
pub fn contains(&self, username: &str) -> bool {
|
||||
match self.peers.lock_safe() {
|
||||
|
||||
Reference in New Issue
Block a user