Send every download status change to the subscriber (#684)

Flow::stateIn has "Strong equality-based conflation" (see documentation).
Thus, it omits every value in case it's equal to the previous one.
Since the DownloadManger::getStatus function returns a status with a queue, that contains all current "DownloadChapters" by reference, the equality check was always true.
Thus, progress changes of downloads were never sent to subscribers.
Subscriber were only notified about finished downloads (size of queue changed) or downloader status changes
This commit is contained in:
schroda
2023-09-16 19:07:43 +02:00
committed by GitHub
parent 7086055ec3
commit c9423ef425
2 changed files with 10 additions and 8 deletions

View File

@@ -1,11 +1,16 @@
package suwayomi.tachidesk.graphql.queries package suwayomi.tachidesk.graphql.queries
import kotlinx.coroutines.flow.first
import suwayomi.tachidesk.graphql.types.DownloadStatus import suwayomi.tachidesk.graphql.types.DownloadStatus
import suwayomi.tachidesk.manga.impl.download.DownloadManager import suwayomi.tachidesk.manga.impl.download.DownloadManager
import suwayomi.tachidesk.server.JavalinSetup.future
import java.util.concurrent.CompletableFuture
class DownloadQuery { class DownloadQuery {
fun downloadStatus(): DownloadStatus { fun downloadStatus(): CompletableFuture<DownloadStatus> {
return DownloadStatus(DownloadManager.status.value) return future {
DownloadStatus(DownloadManager.status.first())
}
} }
} }

View File

@@ -19,12 +19,11 @@ import kotlinx.coroutines.awaitAll
import kotlinx.coroutines.channels.BufferOverflow import kotlinx.coroutines.channels.BufferOverflow
import kotlinx.coroutines.coroutineScope import kotlinx.coroutines.coroutineScope
import kotlinx.coroutines.flow.MutableSharedFlow import kotlinx.coroutines.flow.MutableSharedFlow
import kotlinx.coroutines.flow.SharingStarted
import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.launchIn
import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.map
import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.flow.onEach
import kotlinx.coroutines.flow.onStart
import kotlinx.coroutines.flow.sample import kotlinx.coroutines.flow.sample
import kotlinx.coroutines.flow.stateIn
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import kotlinx.serialization.Serializable import kotlinx.serialization.Serializable
import mu.KotlinLogging import mu.KotlinLogging
@@ -118,10 +117,8 @@ object DownloadManager {
private val notifyFlow = MutableSharedFlow<Unit>(extraBufferCapacity = 1, onBufferOverflow = BufferOverflow.DROP_OLDEST) private val notifyFlow = MutableSharedFlow<Unit>(extraBufferCapacity = 1, onBufferOverflow = BufferOverflow.DROP_OLDEST)
val status = notifyFlow.sample(1.seconds) val status = notifyFlow.sample(1.seconds)
.map { .onStart { emit(Unit) }
getStatus() .map { getStatus() }
}
.stateIn(scope, SharingStarted.Eagerly, getStatus())
init { init {
scope.launch { scope.launch {