Detect and recycle WebSockets stuck in connecting state.

This commit is contained in:
Cody Henthorne
2025-05-16 13:13:32 -04:00
committed by GitHub
parent b6c033b075
commit a2f7afcb68
8 changed files with 57 additions and 14 deletions

View File

@@ -60,7 +60,11 @@ import kotlin.time.Duration.Companion.seconds
* This class is responsible for keeping the authenticated websocket open based on the app's state for incoming messages and
* observing new inbound messages received over the websocket.
*/
class IncomingMessageObserver(private val context: Application, private val authWebSocket: SignalWebSocket.AuthenticatedWebSocket) {
class IncomingMessageObserver(
private val context: Application,
private val authWebSocket: SignalWebSocket.AuthenticatedWebSocket,
private val unauthWebSocket: SignalWebSocket.UnauthenticatedWebSocket
) {
companion object {
private val TAG = Log.tag(IncomingMessageObserver::class.java)
@@ -89,18 +93,21 @@ class IncomingMessageObserver(private val context: Application, private val auth
private val connectionNecessarySemaphore = Semaphore(0)
private var previousProxyInfo: ProxyInfo? = null
private val networkConnectionListener = NetworkConnectionListener(
context,
{ isNetworkUnavailable ->
context = context,
onNetworkLost = { isNetworkUnavailable ->
lock.withLock {
AppDependencies.libsignalNetwork.onNetworkChange()
if (isNetworkUnavailable()) {
Log.w(TAG, "Lost network connection. Resetting the drained state.")
decryptionDrained = false
authWebSocket.disconnect()
// TODO [no-more-rest] Move the connection listener to a neutral location so this isn't passed in
unauthWebSocket.disconnect()
}
connectionNecessarySemaphore.release()
}
},
{ proxyInfo ->
onProxySettingsChanged = { proxyInfo ->
if (proxyInfo != previousProxyInfo) {
val networkReset = AppDependencies.onSystemHttpProxyChange(proxyInfo?.host, proxyInfo?.port)
if (networkReset) {

View File

@@ -42,25 +42,25 @@ class NetworkConnectionListener(private val context: Context, private val onNetw
override fun onBlockedStatusChanged(network: Network, blocked: Boolean) {
super.onBlockedStatusChanged(network, blocked)
Log.d(TAG, "ConnectivityManager.NetworkCallback onBlockedStatusChanged()")
Log.d(TAG, "ConnectivityManager.NetworkCallback onBlockedStatusChanged($network, $blocked)")
onNetworkLost { blocked }
}
override fun onAvailable(network: Network) {
super.onAvailable(network)
Log.d(TAG, "ConnectivityManager.NetworkCallback onAvailable()")
Log.d(TAG, "ConnectivityManager.NetworkCallback onAvailable($network)")
onNetworkLost { false }
}
override fun onLost(network: Network) {
super.onLost(network)
Log.d(TAG, "ConnectivityManager.NetworkCallback onLost()")
Log.d(TAG, "ConnectivityManager.NetworkCallback onLost($network)")
onNetworkLost { true }
}
override fun onLinkPropertiesChanged(network: Network, linkProperties: LinkProperties) {
super.onLinkPropertiesChanged(network, linkProperties)
Log.d(TAG, "ConnectivityManager.NetworkCallback onLinkPropertiesChanged()")
Log.d(TAG, "ConnectivityManager.NetworkCallback onLinkPropertiesChanged($network)")
onProxySettingsChanged(linkProperties.httpProxy)
}
}