relay: don't reconnect when we don't have to

We are reconnecting multiple times for two separate reasons:

1. On a cancellation "error" which does not warrant a reconnect

2. In our reconnection backoff it doesn't check If we are already
   connecting or connected. We check this so we don't reconnect multiple
   times.

This fixes many reconnection issues and makes Damus feel wayyy snappier.

Signed-off-by: William Casarin <jb55@jb55.com>
This commit is contained in:
William Casarin
2024-09-19 12:41:31 -07:00
parent 2a61440aed
commit 6639c002ed

View File

@@ -141,6 +141,10 @@ final class RelayConnection: ObservableObject {
// ignore socket not connected? // ignore socket not connected?
return return
} }
if nserr.domain == NSURLErrorDomain && nserr.code == -999 {
// these aren't real error, it just means task was cancelled
return
}
DispatchQueue.main.async { DispatchQueue.main.async {
self.isConnected = false self.isConnected = false
self.isConnecting = false self.isConnecting = false
@@ -157,14 +161,21 @@ final class RelayConnection: ObservableObject {
} }
func reconnect_with_backoff() { func reconnect_with_backoff() {
self.backoff *= 1.5 self.backoff *= 2.0
self.reconnect_in(after: self.backoff) self.reconnect_in(after: self.backoff)
} }
func reconnect() { func reconnect() {
guard !isConnecting && !isDisabled else { guard !isConnecting && !isDisabled else {
self.log?.add("Cancelling reconnect, already connecting")
return // we're already trying to connect or we're disabled return // we're already trying to connect or we're disabled
} }
guard !self.isConnected else {
self.log?.add("Cancelling reconnect, already connected")
return
}
disconnect() disconnect()
connect() connect()
log?.add("Reconnecting...") log?.add("Reconnecting...")