Ping relays on resume, if there's an error then try to reconnect

This is an attempt to fix the fail-to-reconnect issues. Let's see if it works.
This commit is contained in:
William Casarin
2023-05-07 10:28:36 -07:00
parent f78eeb1f22
commit 84174ef9ad
4 changed files with 49 additions and 4 deletions

View File

@@ -42,6 +42,7 @@ final class RelayConnection {
private(set) var isConnecting = false
private(set) var last_connection_attempt: TimeInterval = 0
private(set) var last_pong: Date? = nil
private(set) var backoff: TimeInterval = 1.0
private lazy var socket = WebSocket(url.url)
private var subscriptionToken: AnyCancellable?
@@ -54,6 +55,18 @@ final class RelayConnection {
self.handleEvent = handleEvent
}
func ping() {
socket.ping { err in
if let err {
self.isConnecting = false
self.isConnected = false
self.reconnect_with_backoff()
} else {
self.last_pong = .now
}
}
}
func connect(force: Bool = false) {
if !force && (isConnected || isConnecting) {
return
@@ -111,15 +124,14 @@ final class RelayConnection {
DispatchQueue.main.async {
self.isConnected = false
self.isConnecting = false
self.reconnect()
self.reconnect_with_backoff()
}
case .error(let error):
print("⚠️ Warning: RelayConnection (\(self.url)) error: \(error)")
DispatchQueue.main.async {
self.isConnected = false
self.isConnecting = false
self.backoff *= 1.5
self.reconnect_in(after: self.backoff)
self.reconnect_with_backoff()
}
}
DispatchQueue.main.async {
@@ -127,6 +139,11 @@ final class RelayConnection {
}
}
func reconnect_with_backoff() {
self.backoff *= 1.5
self.reconnect_in(after: self.backoff)
}
func reconnect() {
guard !isConnecting else {
return // we're already trying to connect

View File

@@ -79,7 +79,13 @@ class RelayPool {
self.handlers = handlers.filter { $0.sub_id != sub_id }
print("removing \(sub_id) handler, current: \(handlers.count)")
}
func ping() {
for relay in relays {
relay.connection.ping()
}
}
func register_handler(sub_id: String, handler: @escaping (String, NostrConnectionEvent) -> ()) {
for handler in handlers {
// don't add duplicate handlers

View File

@@ -32,6 +32,10 @@ final class WebSocket: NSObject, URLSessionWebSocketDelegate {
self.session = session
}
func ping(receiveHandler: @escaping (Error?) -> Void) {
self.webSocketTask.sendPing(pongReceiveHandler: receiveHandler)
}
func connect() {
resume()
}