From 411541faf5aa79f21073aea580acbb8a9a49656a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9s=20Villagr=C3=A1n?= Date: Thu, 15 Jan 2026 04:14:48 -0300 Subject: [PATCH] fix(nostr): prevent subscription leak on JSON parse failure Move resolved=true after successful parse so timeout cleanup still runs if metadata content is invalid JSON. Fixes dangling subscriptions and permanently pending pubkeys. --- app/src/main/java/com/bitchat/android/nostr/NostrIdentity.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/bitchat/android/nostr/NostrIdentity.kt b/app/src/main/java/com/bitchat/android/nostr/NostrIdentity.kt index b0f2e65f..c864862c 100644 --- a/app/src/main/java/com/bitchat/android/nostr/NostrIdentity.kt +++ b/app/src/main/java/com/bitchat/android/nostr/NostrIdentity.kt @@ -531,12 +531,12 @@ object NostrIdentityBridge { id = subscriptionId, handler = { event -> if (!resolved && event.kind == NostrKind.METADATA && event.pubkey == pubkeyHex) { - resolved = true try { val profileJson = com.google.gson.JsonParser.parseString(event.content).asJsonObject val name = profileJson.get("name")?.asString?.takeIf { it.isNotBlank() } ?: profileJson.get("display_name")?.asString?.takeIf { it.isNotBlank() } + resolved = true relayManager.unsubscribe(subscriptionId) GlobalScope.launch(Dispatchers.Main) { @@ -544,6 +544,7 @@ object NostrIdentityBridge { } } catch (e: Exception) { Log.w(TAG, "Failed to parse profile for $pubkeyHex: ${e.message}") + // Don't mark as resolved - let timeout or next event retry } } }