diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/relayClient/reqCommand/user/watchers/FilterUserMetadataForKey.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/relayClient/reqCommand/user/watchers/FilterUserMetadataForKey.kt index e2d58bcb58..efbca44733 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/relayClient/reqCommand/user/watchers/FilterUserMetadataForKey.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/relayClient/reqCommand/user/watchers/FilterUserMetadataForKey.kt @@ -56,9 +56,20 @@ fun filterUserMetadataForKey( val perRelayUsers = mapOfSet { authors.forEach { key -> + val outbox = key.outboxRelays() val relays = - key.outboxRelays() - ?: (key.allUsedRelays() + LocalCache.relayHints.hintsForKey(key.pubkeyHex) + indexRelays) + when { + outbox == null -> + key.allUsedRelays() + LocalCache.relayHints.hintsForKey(key.pubkeyHex) + indexRelays + // Outbox is published but exhausted (every relay either EOSE'd + // or is known-unreachable) and metadata is still missing — + // widen to indexers so a misconfigured outbox doesn't strand + // the user's profile. + key.metadataOrNull()?.flow?.value == null && + outbox.all { it in cannotConnectRelays || since.since(key)?.get(it) != null } -> + outbox + indexRelays + else -> outbox + } (relays - cannotConnectRelays).forEach { add(it, key) diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/relayClient/reqCommand/user/watchers/UserWatcherSubAssembler.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/relayClient/reqCommand/user/watchers/UserWatcherSubAssembler.kt index 3210d70cf4..6d8f7efb23 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/relayClient/reqCommand/user/watchers/UserWatcherSubAssembler.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/relayClient/reqCommand/user/watchers/UserWatcherSubAssembler.kt @@ -59,6 +59,9 @@ class UserWatcherSubAssembler( } } } + // Re-evaluate filters: filterUserMetadataForKey may widen to indexer + // relays once a user's outbox is exhausted without yielding metadata. + invalidateFilters() } val sub =