Use the SDK's offline detection everywhere (except for restarting the sync loop). (#4472)

* Use the SDK's offline state to drive the offline indicator.

* Only use network reachability for restarting the sync loop, use the homeserver reachability for requests.

* Add a separate indicator to distinguish when the server is unreachable but the device is online.
This commit is contained in:
Doug
2025-09-08 13:18:02 +01:00
committed by GitHub
parent 20b57d0ad7
commit 90504d89c8
26 changed files with 152 additions and 127 deletions
@@ -137,6 +137,11 @@ class ClientProxy: ClientProxyProtocol {
verificationStateSubject.asCurrentValuePublisher()
}
private let homeserverReachabilitySubject = CurrentValueSubject<NetworkMonitorReachability, Never>(.reachable)
var homeserverReachabilityPublisher: CurrentValuePublisher<NetworkMonitorReachability, Never> {
homeserverReachabilitySubject.asCurrentValuePublisher()
}
private let timelineMediaVisibilitySubject = CurrentValueSubject<TimelineMediaVisibility, Never>(.always)
var timelineMediaVisibilityPublisher: CurrentValuePublisher<TimelineMediaVisibility, Never> {
timelineMediaVisibilitySubject.asCurrentValuePublisher()
@@ -218,10 +223,10 @@ class ClientProxy: ClientProxyProtocol {
})
sendQueueStatusSubject
.combineLatest(networkMonitor.reachabilityPublisher)
.combineLatest(homeserverReachabilityPublisher)
.debounce(for: 1.0, scheduler: DispatchQueue.main)
.sink { enabled, reachability in
MXLog.info("Send queue status changed to enabled: \(enabled), reachability: \(reachability)")
MXLog.info("Send queue status changed to enabled: \(enabled), homeserver reachability: \(reachability)")
if enabled == false, reachability == .reachable {
MXLog.info("Enabling all send queues")
@@ -926,12 +931,11 @@ class ClientProxy: ClientProxyProtocol {
switch state {
case .running, .terminated, .idle:
break
homeserverReachabilitySubject.send(.reachable)
case .offline:
homeserverReachabilitySubject.send(.unreachable)
case .error:
restartSync()
case .offline:
// This needs to be enabled in the client builder first to be actually used
break
}
})
}
@@ -1196,6 +1200,7 @@ private struct ClientProxyServices {
let syncService = try await client
.syncService()
.withCrossProcessLock()
.withOfflineMode()
.withSharePos(enable: true)
.finish()