Browse Source

fix default/fallback relays

imwald
Silberengel 3 days ago
parent
commit
e2102e0e4a
  1. 9
      src/constants.ts
  2. 26
      src/services/client.service.ts

9
src/constants.ts

@ -104,11 +104,13 @@ export const FAST_WRITE_RELAY_URLS = [
'wss://relay.damus.io', 'wss://relay.damus.io',
'wss://relay.primal.net', 'wss://relay.primal.net',
'wss://thecitadel.nostr1.com', 'wss://thecitadel.nostr1.com',
'wss://bevo.nostr1.com' 'wss://bevo.nostr1.com',
'wss://nos.lol'
] ]
export const SEARCHABLE_RELAY_URLS = [ export const SEARCHABLE_RELAY_URLS = [
'wss://relay.nostr.band', 'wss://nostr.sovbit.host',
'wss://freelay.sovbit.host',
'wss://search.nos.today', 'wss://search.nos.today',
'wss://nostr.wine', 'wss://nostr.wine',
'wss://orly-relay.imwald.eu', 'wss://orly-relay.imwald.eu',
@ -123,7 +125,8 @@ export const SEARCHABLE_RELAY_URLS = [
] ]
export const PROFILE_RELAY_URLS = [ export const PROFILE_RELAY_URLS = [
'wss://purplepag.es', 'wss://nos.lol',
'wss://relay.damus.io',
'wss://profiles.nostr1.com' 'wss://profiles.nostr1.com'
] ]

26
src/services/client.service.ts

@ -86,6 +86,14 @@ class ClientService extends EventTarget {
await indexedDb.iterateProfileEvents((profileEvent) => this.addUsernameToIndex(profileEvent)) await indexedDb.iterateProfileEvents((profileEvent) => this.addUsernameToIndex(profileEvent))
} }
/**
* Determine which relays to publish an event to.
* Fallbacks (used when user relay list is empty or fetch fails):
* - General events (reactions, notes, etc.): FAST_WRITE_RELAY_URLS
* - Relay list / cache relays / contacts: BIG_RELAY_URLS + PROFILE_RELAY_URLS (added to additional)
* - Favorite relays: FAST_WRITE_RELAY_URLS (added to additional)
* - Report events: FAST_WRITE_RELAY_URLS when no user/seen relays
*/
async determineTargetRelays( async determineTargetRelays(
event: NEvent, event: NEvent,
{ specifiedRelayUrls, additionalRelayUrls }: TPublishOptions = {} { specifiedRelayUrls, additionalRelayUrls }: TPublishOptions = {}
@ -192,7 +200,16 @@ class ClientService extends EventTarget {
kind: event.kind kind: event.kind
}) })
} }
const relayList = await this.fetchRelayList(event.pubkey) let relayList: TRelayList | undefined
try {
relayList = await this.fetchRelayList(event.pubkey)
} catch (err) {
logger.warn('[DetermineTargetRelays] fetchRelayList failed, using fallback relays', {
pubkey: event.pubkey?.substring(0, 8),
error: err instanceof Error ? err.message : String(err)
})
relayList = { write: [], read: [], originalRelays: [] }
}
if (event.kind === kinds.RelayList || event.kind === ExtendedKind.FAVORITE_RELAYS) { if (event.kind === kinds.RelayList || event.kind === ExtendedKind.FAVORITE_RELAYS) {
logger.debug('[DetermineTargetRelays] User relay list fetched', { logger.debug('[DetermineTargetRelays] User relay list fetched', {
hasRelayList: !!relayList, hasRelayList: !!relayList,
@ -215,8 +232,13 @@ class ClientService extends EventTarget {
} }
} }
// Fallback for all publishing when no relays (e.g. after cache clear or fetch failure).
// Use FAST_WRITE_RELAY_URLS so writes always have known-good write relays.
if (!relays.length) { if (!relays.length) {
relays.push(...BIG_RELAY_URLS) relays = [...FAST_WRITE_RELAY_URLS]
logger.info('[DetermineTargetRelays] Using default write relays (no user/extra relays)', {
count: relays.length
})
} }
return relays return relays

Loading…
Cancel
Save