feat(core+frontend): enhance SyncEvent model and integrate sync handling in BewerbViewModel
- **Core Updates:** - Expanded `SyncEvent` model with additional fields (`eventId`, `sequenceNumber`, `originNodeId`, `createdAt`, `checksum`, `schemaVersion`) for improved event tracking and validation. - Updated event classes (`PingEvent`, `PongEvent`, `DataChangedEvent`, `DataRequestEvent`) to align with the extended `SyncEvent`. - **Frontend Enhancements:** - Enhanced `BewerbViewModel` to handle sync events (`PingEvent`, `DataChangedEvent`) and observe connected peers using `SyncManager`. - Added support for
This commit is contained in:
+32
-2
@@ -2,6 +2,7 @@ package at.mocode.turnier.feature.presentation
|
||||
|
||||
import at.mocode.frontend.core.network.discovery.DiscoveredService
|
||||
import at.mocode.frontend.core.network.sync.SyncManager
|
||||
import at.mocode.frontend.core.network.sync.*
|
||||
import at.mocode.turnier.feature.domain.Bewerb
|
||||
import at.mocode.turnier.feature.domain.BewerbRepository
|
||||
import at.mocode.turnier.feature.domain.StartlistenRepository
|
||||
@@ -93,8 +94,30 @@ class BewerbViewModel(
|
||||
|
||||
private fun observeSyncEvents() {
|
||||
syncManager?.let { manager ->
|
||||
// In einer realen App würde das P2pSyncService.incomingEvents Flow genutzt
|
||||
// Hier als Demo-Verknüpfung
|
||||
scope.launch {
|
||||
manager.getIncomingEvents().collect { event ->
|
||||
when (event) {
|
||||
is DataChangedEvent -> {
|
||||
if (event.aggregateType == "Bewerb" || event.aggregateType == "Startliste") {
|
||||
load() // Bei relevanten Änderungen neu laden
|
||||
}
|
||||
}
|
||||
is PingEvent -> {
|
||||
// Optional: Heartbeat loggen oder Status anzeigen
|
||||
}
|
||||
else -> {}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Auch verbundene Peers beobachten
|
||||
scope.launch {
|
||||
manager.getConnectedPeers().collect { peers ->
|
||||
reduce { it.copy(discoveredNodes = peers.map { p ->
|
||||
at.mocode.frontend.core.network.discovery.DiscoveredService("P2P", p, 0)
|
||||
}) }
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -143,6 +166,13 @@ class BewerbViewModel(
|
||||
private fun startScan() {
|
||||
syncManager?.start(8080)
|
||||
_state.update { it.copy(isScanning = true) }
|
||||
// Nach dem Start des Servers ein Ping-Event broadcasten um Präsenz zu zeigen
|
||||
syncManager?.broadcastEvent(PingEvent(
|
||||
eventId = turnierId.toString(),
|
||||
sequenceNumber = 0,
|
||||
originNodeId = "Client-${(1000..9999).random()}",
|
||||
createdAt = 0 // In commonMain ohne Clock-Lib erst mal 0
|
||||
))
|
||||
refreshNodes()
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user