From 505e9666535e081ac4ca750e43841ebba7fcb048 Mon Sep 17 00:00:00 2001 From: Mitchell Syer Date: Sat, 9 May 2026 18:15:33 -0400 Subject: [PATCH 1/3] Fix Polyglot (#2011) --- server/build.gradle.kts | 1 + 1 file changed, 1 insertion(+) diff --git a/server/build.gradle.kts b/server/build.gradle.kts index 4e11d4a8..3ed22bbe 100644 --- a/server/build.gradle.kts +++ b/server/build.gradle.kts @@ -171,6 +171,7 @@ tasks { "Implementation-Vendor" to "The Suwayomi Project", "Specification-Version" to getTachideskVersion(), "Implementation-Version" to getTachideskRevision(), + "Multi-Release" to true, // needed for polyglot ) } archiveBaseName.set(rootProject.name) From 6fef27bb569c1200aa735f294be915387c010612 Mon Sep 17 00:00:00 2001 From: Mitchell Syer Date: Sat, 9 May 2026 18:15:43 -0400 Subject: [PATCH 2/3] Wait until WebUI is ready to open in browser (#2010) * Wait until WebUI is ready * Changelog * Move openInBrowser out of timeout --- CHANGELOG.md | 1 + .../kotlin/suwayomi/tachidesk/server/JavalinSetup.kt | 11 ++++++++++- .../tachidesk/server/util/WebInterfaceManager.kt | 7 ++++--- 3 files changed, 15 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3d4f5235..54e24186 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/). ### Fixed - (WebUI) Handle serving non-default webui with "bundled" +- (WebUI) Wait until WebUI is ready to open in browser ## [v2.2.2100] + [WebUI: v20260508.01] - 2026-05-08 diff --git a/server/src/main/kotlin/suwayomi/tachidesk/server/JavalinSetup.kt b/server/src/main/kotlin/suwayomi/tachidesk/server/JavalinSetup.kt index fa11e9cd..3cca3236 100644 --- a/server/src/main/kotlin/suwayomi/tachidesk/server/JavalinSetup.kt +++ b/server/src/main/kotlin/suwayomi/tachidesk/server/JavalinSetup.kt @@ -27,7 +27,10 @@ import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.SupervisorJob import kotlinx.coroutines.flow.combine +import kotlinx.coroutines.flow.first import kotlinx.coroutines.future.future +import kotlinx.coroutines.launch +import kotlinx.coroutines.withTimeoutOrNull import org.eclipse.jetty.server.ServerConnector import suwayomi.tachidesk.global.GlobalAPI import suwayomi.tachidesk.graphql.GraphQL @@ -51,6 +54,7 @@ import java.util.concurrent.CompletableFuture import kotlin.concurrent.thread import kotlin.text.get import kotlin.time.Duration.Companion.days +import kotlin.time.Duration.Companion.seconds object JavalinSetup { private val logger = KotlinLogging.logger {} @@ -132,7 +136,12 @@ object JavalinSetup { config.events.serverStarted { if (serverConfig.initialOpenInBrowserEnabled.value) { - Browser.openInBrowser() + scope.launch { + withTimeoutOrNull(10.seconds) { + WebInterfaceManager.isSetupComplete.first { it } + } + Browser.openInBrowser() + } } } } diff --git a/server/src/main/kotlin/suwayomi/tachidesk/server/util/WebInterfaceManager.kt b/server/src/main/kotlin/suwayomi/tachidesk/server/util/WebInterfaceManager.kt index ba3ae653..cc0f6d83 100644 --- a/server/src/main/kotlin/suwayomi/tachidesk/server/util/WebInterfaceManager.kt +++ b/server/src/main/kotlin/suwayomi/tachidesk/server/util/WebInterfaceManager.kt @@ -27,6 +27,7 @@ import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.SupervisorJob import kotlinx.coroutines.delay import kotlinx.coroutines.flow.MutableSharedFlow +import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.sample @@ -90,7 +91,7 @@ object WebInterfaceManager { private val preferences = Injekt.get().getSharedPreferences("server_util", Context.MODE_PRIVATE) private var currentUpdateTaskId: String = "" - private var isSetupComplete = false + val isSetupComplete = MutableStateFlow(false) private val json: Json by injectLazy() private val network: NetworkHelper by injectLazy() @@ -196,7 +197,7 @@ object WebInterfaceManager { @OptIn(DelicateCoroutinesApi::class) GlobalScope.launchIO { setupWebUI() - isSetupComplete = true + isSetupComplete.value = true } } @@ -260,7 +261,7 @@ object WebInterfaceManager { val lastAutomatedUpdate = preferences.getLong(LAST_WEBUI_UPDATE_CHECK_KEY, System.currentTimeMillis()) val task = { - if (isSetupComplete) { + if (isSetupComplete.value) { val log = KotlinLogging.logger( "${logger.name}::scheduleWebUIUpdateCheck(" + From dff66547b427668e19ba55bc726d42f25dad7def Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sat, 9 May 2026 18:16:05 -0400 Subject: [PATCH 3/3] Update jackson monorepo (#1906) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- gradle/libs.versions.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 2c98da29..13c45dbe 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -6,7 +6,7 @@ jvmTarget = "21" okhttp = "5.3.2" # Major version is locked by Tachiyomi extensions javalin = "7.2.0" jte = "3.2.4" -jackson = "3.1.2" # jackson version locked by javalin, ref: `io.javalin.core.util.OptionalDependency` +jackson = "3.1.3" # jackson version locked by javalin, ref: `io.javalin.core.util.OptionalDependency` exposed = "0.61.0" dex2jar = "2.4.36" polyglot = "25.0.3" @@ -54,7 +54,7 @@ javalin-openapi = { module = "io.javalin:javalin-openapi", version.ref = "javali javalin-rendering = { module = "io.javalin:javalin-rendering-jte", version.ref = "javalin" } jackson-databind = { module = "tools.jackson.core:jackson-databind", version.ref = "jackson" } jackson-kotlin = { module = "tools.jackson.module:jackson-module-kotlin", version.ref = "jackson" } -jackson-annotations = "com.fasterxml.jackson.core:jackson-annotations:2.20" +jackson-annotations = "com.fasterxml.jackson.core:jackson-annotations:2.21" jte = { module = "gg.jte:jte", version.ref = "jte" } kte = { module = "gg.jte:jte-kotlin", version.ref = "jte" }