- Add retry logic when sending events

- Check if error message contains tor port to show a better message
This commit is contained in:
greenart7c3
2025-04-21 16:39:41 -03:00
parent e2e6e6d7e5
commit d321bd7f1d
3 changed files with 37 additions and 13 deletions
@@ -19,24 +19,31 @@ import kotlinx.coroutines.launch
object AmberListenerSingleton {
var accountStateViewModel: AccountStateViewModel? = null
private var listener: AmberClientListener? = null
val latestErrorMessages = mutableListOf<String>()
fun setListener(
context: Context,
accountStateViewModel: AccountStateViewModel?,
) {
listener = AmberClientListener(context, accountStateViewModel)
listener = AmberClientListener(context)
}
fun getListener(): AmberClientListener? {
return listener
}
fun showErrorMessage() {
if (latestErrorMessages.isEmpty()) return
if (latestErrorMessages.last().isBlank()) return
accountStateViewModel?.toast("Error", latestErrorMessages.last())
latestErrorMessages.clear()
}
}
class AmberClientListener(
val context: Context,
val accountStateViewModel: AccountStateViewModel?,
) : NostrClient.Listener {
val scope = CoroutineScope(Dispatchers.IO + SupervisorJob())
override fun onAuth(relay: Relay, challenge: String) {
scope.launch {
LocalPreferences.currentAccount(context)?.let { account ->
@@ -85,9 +92,9 @@ class AmberClientListener(
}
if (!success) {
if (msg.isNotBlank()) {
accountStateViewModel?.toast("Error", "Failed to send event.\n$msg")
AmberListenerSingleton.latestErrorMessages.add("Failed to send event.\n$msg")
} else {
accountStateViewModel?.toast("Error", "Failed to send event. Try again.")
AmberListenerSingleton.latestErrorMessages.add("Failed to send event. Try again.")
}
}
}
@@ -108,7 +115,7 @@ class AmberClientListener(
}
if (!success) {
accountStateViewModel?.toast("Error", message)
AmberListenerSingleton.latestErrorMessages.add(message)
}
}
@@ -127,8 +134,11 @@ class AmberClientListener(
)
}
}
accountStateViewModel?.toast("Error", error.message ?: "Unknown error")
if (NostrSigner.instance.settings.useProxy && error.message?.contains("(port ${NostrSigner.instance.settings.proxyPort})") == true) {
AmberListenerSingleton.latestErrorMessages.add("Failed to connect to Tor/Orbot")
} else {
AmberListenerSingleton.latestErrorMessages.add(error.message ?: "Unknown error")
}
}
override fun onEvent(event: Event, subscriptionId: String, relay: Relay, afterEOSE: Boolean) {
@@ -4,7 +4,6 @@ import android.content.Context
import android.content.Intent
import android.util.Log
import androidx.compose.runtime.mutableStateOf
import com.fasterxml.jackson.databind.ObjectMapper
import com.greenart7c3.nostrsigner.LocalPreferences
import com.greenart7c3.nostrsigner.NostrSigner
import com.greenart7c3.nostrsigner.database.LogEntity
@@ -27,6 +26,7 @@ import com.vitorpamplona.quartz.nip46RemoteSigner.BunkerResponse
import com.vitorpamplona.quartz.utils.TimeUtils
import java.util.concurrent.ConcurrentHashMap
import kotlinx.coroutines.channels.Channel
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
object BunkerRequestUtils {
@@ -84,7 +84,6 @@ object BunkerRequestUtils {
}
AmberListenerSingleton.setListener(
context,
AmberListenerSingleton.accountStateViewModel,
)
NostrSigner.instance.client.subscribe(
AmberListenerSingleton.getListener()!!,
@@ -97,7 +96,7 @@ object BunkerRequestUtils {
id = 0,
url = relay.url,
type = "bunker response",
message = ObjectMapper().writeValueAsString(bunkerResponse),
message = EventMapper.mapper.writeValueAsString(bunkerResponse),
time = System.currentTimeMillis(),
),
)
@@ -164,12 +163,26 @@ object BunkerRequestUtils {
)
}
val success = NostrSigner.instance.client.sendAndWaitForResponse(it, relayList = relays)
var success = false
var errorCount = 0
while (!success && errorCount < 3) {
success = NostrSigner.instance.client.sendAndWaitForResponse(it, relayList = relays)
if (!success) {
errorCount++
}
relays.forEach {
if (NostrSigner.instance.client.getRelay(it.url)?.isConnected() == false) {
NostrSigner.instance.client.getRelay(it.url)?.connect()
}
}
delay(1000)
}
if (success) {
Log.d("IntentUtils", "Success response to relays ${relays.map { it.url }} type ${bunkerRequest?.method}")
onDone(true)
} else {
onDone(false)
AmberListenerSingleton.showErrorMessage()
Log.d("IntentUtils", "Failed response to relays ${relays.map { it.url }} type ${bunkerRequest?.method}")
}
AmberListenerSingleton.getListener()?.let {
@@ -343,7 +343,7 @@ suspend fun onAddRelay(
}
event?.let { signedEvent ->
AmberListenerSingleton.setListener(context, accountStateViewModel)
AmberListenerSingleton.setListener(context)
val socket = factory
val client = NostrClient(
socket,
@@ -399,6 +399,7 @@ suspend fun onAddRelay(
count++
}
} else {
AmberListenerSingleton.showErrorMessage()
filterResult = true
}