Merge pull request #834 from vector-im/feature/fga/avoid_multiple_sync_loops

Feature/fga/avoid multiple sync loops
This commit is contained in:
ganfra 2023-07-10 13:37:35 +02:00 committed by GitHub
commit d3982e447c

View file

@ -24,23 +24,30 @@ import kotlinx.coroutines.flow.SharingStarted
import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.distinctUntilChanged
import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.map
import kotlinx.coroutines.flow.onEach
import kotlinx.coroutines.flow.stateIn import kotlinx.coroutines.flow.stateIn
import org.matrix.rustcomponents.sdk.RoomListService import org.matrix.rustcomponents.sdk.RoomListService
import org.matrix.rustcomponents.sdk.RoomListServiceState import org.matrix.rustcomponents.sdk.RoomListServiceState
import timber.log.Timber
import java.util.concurrent.atomic.AtomicBoolean
class RustSyncService( class RustSyncService(
private val roomListService: RoomListService, private val roomListService: RoomListService,
sessionCoroutineScope: CoroutineScope sessionCoroutineScope: CoroutineScope
) : SyncService { ) : SyncService {
private val isSyncing = AtomicBoolean(false)
override fun startSync() = runCatching { override fun startSync() = runCatching {
if (!roomListService.isSyncing()) { if (isSyncing.compareAndSet(false, true)) {
Timber.v("Start sync")
roomListService.sync() roomListService.sync()
} }
} }
override fun stopSync() = runCatching { override fun stopSync() = runCatching {
if (roomListService.isSyncing()) { if (isSyncing.compareAndSet(true, false)) {
Timber.v("Stop sync")
roomListService.stopSync() roomListService.stopSync()
} }
} }
@ -49,6 +56,10 @@ class RustSyncService(
roomListService roomListService
.stateFlow() .stateFlow()
.map(RoomListServiceState::toSyncState) .map(RoomListServiceState::toSyncState)
.onEach { state ->
Timber.v("Sync state=$state")
isSyncing.set(state == SyncState.Syncing)
}
.distinctUntilChanged() .distinctUntilChanged()
.stateIn(sessionCoroutineScope, SharingStarted.WhileSubscribed(), SyncState.Idle) .stateIn(sessionCoroutineScope, SharingStarted.Eagerly, SyncState.Idle)
} }