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:
@@ -59,6 +59,8 @@ struct ContentView: View {
|
|||||||
return keypair.privkey
|
return keypair.privkey
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Environment(\.scenePhase) var scenePhase
|
||||||
|
|
||||||
@State var status: String = "Not connected"
|
@State var status: String = "Not connected"
|
||||||
@State var active_sheet: Sheets? = nil
|
@State var active_sheet: Sheets? = nil
|
||||||
@State var damus_state: DamusState? = nil
|
@State var damus_state: DamusState? = nil
|
||||||
@@ -403,6 +405,22 @@ struct ContentView: View {
|
|||||||
.onReceive(handle_notify(.unmute_thread)) { notif in
|
.onReceive(handle_notify(.unmute_thread)) { notif in
|
||||||
home.filter_events()
|
home.filter_events()
|
||||||
}
|
}
|
||||||
|
.onChange(of: scenePhase) { (phase: ScenePhase) in
|
||||||
|
switch phase {
|
||||||
|
case .background:
|
||||||
|
print("📙 DAMUS BACKGROUNDED")
|
||||||
|
break
|
||||||
|
case .inactive:
|
||||||
|
print("📙 DAMUS INACTIVE")
|
||||||
|
break
|
||||||
|
case .active:
|
||||||
|
print("📙 DAMUS ACTIVE")
|
||||||
|
guard let ds = damus_state else { return }
|
||||||
|
ds.pool.ping()
|
||||||
|
@unknown default:
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
.onReceive(handle_notify(.local_notification)) { notif in
|
.onReceive(handle_notify(.local_notification)) { notif in
|
||||||
|
|
||||||
guard let local = notif.object as? LossyLocalNotification,
|
guard let local = notif.object as? LossyLocalNotification,
|
||||||
|
|||||||
@@ -42,6 +42,7 @@ final class RelayConnection {
|
|||||||
private(set) var isConnecting = false
|
private(set) var isConnecting = false
|
||||||
|
|
||||||
private(set) var last_connection_attempt: TimeInterval = 0
|
private(set) var last_connection_attempt: TimeInterval = 0
|
||||||
|
private(set) var last_pong: Date? = nil
|
||||||
private(set) var backoff: TimeInterval = 1.0
|
private(set) var backoff: TimeInterval = 1.0
|
||||||
private lazy var socket = WebSocket(url.url)
|
private lazy var socket = WebSocket(url.url)
|
||||||
private var subscriptionToken: AnyCancellable?
|
private var subscriptionToken: AnyCancellable?
|
||||||
@@ -54,6 +55,18 @@ final class RelayConnection {
|
|||||||
self.handleEvent = handleEvent
|
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) {
|
func connect(force: Bool = false) {
|
||||||
if !force && (isConnected || isConnecting) {
|
if !force && (isConnected || isConnecting) {
|
||||||
return
|
return
|
||||||
@@ -111,15 +124,14 @@ final class RelayConnection {
|
|||||||
DispatchQueue.main.async {
|
DispatchQueue.main.async {
|
||||||
self.isConnected = false
|
self.isConnected = false
|
||||||
self.isConnecting = false
|
self.isConnecting = false
|
||||||
self.reconnect()
|
self.reconnect_with_backoff()
|
||||||
}
|
}
|
||||||
case .error(let error):
|
case .error(let error):
|
||||||
print("⚠️ Warning: RelayConnection (\(self.url)) error: \(error)")
|
print("⚠️ Warning: RelayConnection (\(self.url)) error: \(error)")
|
||||||
DispatchQueue.main.async {
|
DispatchQueue.main.async {
|
||||||
self.isConnected = false
|
self.isConnected = false
|
||||||
self.isConnecting = false
|
self.isConnecting = false
|
||||||
self.backoff *= 1.5
|
self.reconnect_with_backoff()
|
||||||
self.reconnect_in(after: self.backoff)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
DispatchQueue.main.async {
|
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() {
|
func reconnect() {
|
||||||
guard !isConnecting else {
|
guard !isConnecting else {
|
||||||
return // we're already trying to connect
|
return // we're already trying to connect
|
||||||
|
|||||||
@@ -79,7 +79,13 @@ class RelayPool {
|
|||||||
self.handlers = handlers.filter { $0.sub_id != sub_id }
|
self.handlers = handlers.filter { $0.sub_id != sub_id }
|
||||||
print("removing \(sub_id) handler, current: \(handlers.count)")
|
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) -> ()) {
|
func register_handler(sub_id: String, handler: @escaping (String, NostrConnectionEvent) -> ()) {
|
||||||
for handler in handlers {
|
for handler in handlers {
|
||||||
// don't add duplicate handlers
|
// don't add duplicate handlers
|
||||||
|
|||||||
@@ -32,6 +32,10 @@ final class WebSocket: NSObject, URLSessionWebSocketDelegate {
|
|||||||
self.session = session
|
self.session = session
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func ping(receiveHandler: @escaping (Error?) -> Void) {
|
||||||
|
self.webSocketTask.sendPing(pongReceiveHandler: receiveHandler)
|
||||||
|
}
|
||||||
|
|
||||||
func connect() {
|
func connect() {
|
||||||
resume()
|
resume()
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user