feat: füge ConnectivityTracker hinzu, erweitere networkModule, aktualisiere DesktopFooterBar mit Gerätestatus und mDNS-Discovery

Signed-off-by: StefanMoCoAt <stefan.mo.co@gmail.com>
This commit is contained in:
2026-04-16 00:00:11 +02:00
parent 67d7b38d79
commit 7581f15dfb
3 changed files with 111 additions and 25 deletions
@@ -0,0 +1,48 @@
package at.mocode.frontend.core.network
import io.ktor.client.*
import io.ktor.client.request.*
import kotlinx.coroutines.*
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.asStateFlow
import org.koin.core.component.KoinComponent
import org.koin.core.component.inject
import org.koin.core.qualifier.named
/**
* Überwacht die Konnektivität zum API-Gateway.
*/
class ConnectivityTracker : KoinComponent {
private val client: HttpClient by inject(named("baseHttpClient"))
private val _isOnline = MutableStateFlow(true)
val isOnline: StateFlow<Boolean> = _isOnline.asStateFlow()
private val scope = CoroutineScope(Dispatchers.Default + SupervisorJob())
init {
startTracking()
}
private fun startTracking() {
scope.launch {
while (isActive) {
_isOnline.value = checkConnection()
delay(10_000) // Alle 10 Sekunden prüfen
}
}
}
private suspend fun checkConnection(): Boolean {
return try {
val response = client.get(NetworkConfig.baseUrl.trimEnd('/') + "/ping")
response.status.value in 200..299
} catch (e: Exception) {
false
}
}
fun stopTracking() {
scope.cancel()
}
}
@@ -1,5 +1,7 @@
package at.mocode.frontend.core.network
import at.mocode.frontend.core.network.discovery.discoveryModule
import at.mocode.frontend.core.network.sync.syncModule
import io.ktor.client.*
import io.ktor.client.plugins.*
import io.ktor.client.plugins.contentnegotiation.*
@@ -10,13 +12,13 @@ import kotlinx.serialization.json.Json
import org.koin.core.module.Module
import org.koin.core.qualifier.named
import org.koin.dsl.module
import at.mocode.frontend.core.network.discovery.discoveryModule
import at.mocode.frontend.core.network.sync.syncModule
/**
* Schnittstelle zur Token-Bereitstellung entkoppelt core-network von core-auth.
*/
interface TokenProvider { fun getAccessToken(): String? }
interface TokenProvider {
fun getAccessToken(): String?
}
/**
* Koin-Modul mit zwei HttpClient-Instanzen:
@@ -26,6 +28,8 @@ interface TokenProvider { fun getAccessToken(): String? }
val networkModule: Module = module {
includes(discoveryModule, syncModule)
single<ConnectivityTracker> { ConnectivityTracker() }
// 1. Basis-Client (für Auth-Endpunkte, ohne Bearer-Token)
single(named("baseHttpClient")) {
HttpClient {