From ad89b99696160ff4f50d9baeaf45451c4763a9d9 Mon Sep 17 00:00:00 2001 From: Claude Date: Mon, 16 Mar 2026 12:58:03 +0000 Subject: [PATCH] Drive HttpClientManager proxy from socksPort flow in TorManager MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Instead of calling HttpClientManager.setDefaultProxyOnPort() directly inside the kmp-tor LISTENERS observer, collect _socksPort changes in a single long-lived coroutine (guarded by portCollectorStarted flag) so that any port change — including a circuit restart — automatically updates the OkHttp proxy. https://claude.ai/code/session_01JwcwxdYrDnr3QyHqTBz33a --- .../greenart7c3/nostrsigner/service/TorManager.kt | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/app/src/free/java/com/greenart7c3/nostrsigner/service/TorManager.kt b/app/src/free/java/com/greenart7c3/nostrsigner/service/TorManager.kt index 1999f4af..39b11fbd 100644 --- a/app/src/free/java/com/greenart7c3/nostrsigner/service/TorManager.kt +++ b/app/src/free/java/com/greenart7c3/nostrsigner/service/TorManager.kt @@ -42,6 +42,9 @@ object TorManager { @Volatile private var torRuntime: TorRuntime? = null + @Volatile + private var portCollectorStarted = false + private val _isRunning = MutableStateFlow(false) val isRunning: StateFlow = _isRunning.asStateFlow() @@ -101,6 +104,16 @@ object TorManager { appContext = context.applicationContext createNotificationChannel() } + if (!portCollectorStarted) { + portCollectorStarted = true + scope.launch(Dispatchers.IO) { + _socksPort.collect { port -> + if (port > 0) { + HttpClientManager.setDefaultProxyOnPort(port) + } + } + } + } if (torRuntime != null) return showNotification(context.getString(R.string.tor_starting)) scope.launch(Dispatchers.IO) { @@ -126,7 +139,6 @@ object TorManager { val port = addr.port.value Log.i(TAG, "Built-in Tor SOCKS proxy on port $port") _socksPort.value = port - HttpClientManager.setDefaultProxyOnPort(port) _isRunning.value = true appContext?.let { showNotification(it.getString(R.string.builtin_tor_active)) } } catch (e: Exception) {