From 87025d95ac2f2fa8e2d1ba41309b510f299573fb Mon Sep 17 00:00:00 2001 From: Nick Mills-Barrett Date: Fri, 3 May 2024 14:51:29 +0100 Subject: [PATCH] Retry a few times before sending transient disconnect states --- messagix/client.go | 4 +++- messagix/events.go | 5 ++++- user.go | 5 ++++- 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/messagix/client.go b/messagix/client.go index 96e4d30..1bf14fe 100644 --- a/messagix/client.go +++ b/messagix/client.go @@ -217,6 +217,7 @@ func (c *Client) Connect() error { (*oldCancel)() } go func() { + connectionAttempts := 1 reconnectIn := 2 * time.Second for { connectStart := time.Now() @@ -231,7 +232,8 @@ func (c *Client) Connect() error { c.eventHandler(&Event_PermanentError{Err: err}) return } - c.eventHandler(&Event_SocketError{Err: err}) + connectionAttempts += 1 + c.eventHandler(&Event_SocketError{Err: err, ConnectionAttempts: connectionAttempts}) if time.Since(connectStart) > 2*time.Minute { reconnectIn = 2 * time.Second } else { diff --git a/messagix/events.go b/messagix/events.go index 1687fee..3c273cb 100644 --- a/messagix/events.go +++ b/messagix/events.go @@ -168,7 +168,10 @@ type Event_PingResp struct{} func (pr *Event_PingResp) SetIdentifier(identifier uint16) {} func (e *Event_PingResp) Finish() ResponseData { return e } -type Event_SocketError struct{ Err error } +type Event_SocketError struct { + Err error + ConnectionAttempts int +} type Event_PermanentError struct{ Err error } diff --git a/user.go b/user.go index ab90329..0ec3550 100644 --- a/user.go +++ b/user.go @@ -61,6 +61,7 @@ var ( ) const MinFullReconnectInterval = 1 * time.Hour +const setDisconnectStateAfterConnectAttempts = 3 func (br *MetaBridge) GetUserByMXID(userID id.UserID) *User { return br.maybeGetUserByMXID(userID, &userID) @@ -1113,7 +1114,9 @@ func (user *User) eventHandler(rawEvt any) { StateEvent: status.StateTransientDisconnect, Error: MetaTransientDisconnect, } - user.BridgeState.Send(user.metaState) + if evt.ConnectionAttempts > setDisconnectStateAfterConnectAttempts { + user.BridgeState.Send(user.metaState) + } case *messagix.Event_Reconnected: user.log.Debug().Msg("Reconnected to Meta socket") user.metaState = status.BridgeState{StateEvent: status.StateConnected}