fix: fetch profile event from user's write relays if not found in big relays

This commit is contained in:
codytseng
2025-11-03 09:22:35 +08:00
parent e4f250907f
commit e556b83f5c

View File

@@ -817,7 +817,10 @@ class ClientService extends EventTarget {
return event return event
} }
return this.tryHarderToFetchEvent(relayUrls, { ids: [id], limit: 1 }, true) return this.fetchEventFromRelays(
relayUrls.filter((url) => !BIG_RELAY_URLS.includes(url)),
{ ids: [id], limit: 1 }
)
} }
private async _fetchEvent(id: string): Promise<NEvent | undefined> { private async _fetchEvent(id: string): Promise<NEvent | undefined> {
@@ -861,7 +864,7 @@ class ClientService extends EventTarget {
if (!event && author) { if (!event && author) {
const relayList = await this.fetchRelayList(author) const relayList = await this.fetchRelayList(author)
event = await this.tryHarderToFetchEvent(relayList.write.slice(0, 5), filter) event = await this.fetchEventFromRelays(relayList.write.slice(0, 5), filter)
} }
if (event && event.id !== id) { if (event && event.id !== id) {
@@ -871,19 +874,7 @@ class ClientService extends EventTarget {
return event return event
} }
private async tryHarderToFetchEvent( private async fetchEventFromRelays(relayUrls: string[], filter: Filter) {
relayUrls: string[],
filter: Filter,
alreadyFetchedFromBigRelays = false
) {
if (!relayUrls.length && filter.authors?.length) {
const relayList = await this.fetchRelayList(filter.authors[0])
relayUrls = alreadyFetchedFromBigRelays
? relayList.write.filter((url) => !BIG_RELAY_URLS.includes(url)).slice(0, 4)
: relayList.write.slice(0, 4)
} else if (!relayUrls.length && !alreadyFetchedFromBigRelays) {
relayUrls = BIG_RELAY_URLS
}
if (!relayUrls.length) return if (!relayUrls.length) return
const events = await this.query(relayUrls, filter) const events = await this.query(relayUrls, filter)
@@ -1054,18 +1045,19 @@ class ClientService extends EventTarget {
} }
if (!relays.length) { if (!relays.length) {
return undefined const relayList = await this.fetchRelayList(pubkey)
relays = relayList.write.filter((url) => !BIG_RELAY_URLS.includes(url)).slice(0, 5)
if (!relays.length) {
return
}
} }
const profileEvent = await this.tryHarderToFetchEvent( const profileEvent = await this.fetchEventFromRelays(relays, {
relays, authors: [pubkey],
{ kinds: [kinds.Metadata],
authors: [pubkey], limit: 1
kinds: [kinds.Metadata], })
limit: 1
},
true
)
if (profileEvent) { if (profileEvent) {
this.addUsernameToIndex(profileEvent) this.addUsernameToIndex(profileEvent)