diff --git a/src/constants.ts b/src/constants.ts index 2f521eec..b8955d87 100644 --- a/src/constants.ts +++ b/src/constants.ts @@ -104,11 +104,13 @@ export const FAST_WRITE_RELAY_URLS = [ 'wss://relay.damus.io', 'wss://relay.primal.net', 'wss://thecitadel.nostr1.com', - 'wss://bevo.nostr1.com' + 'wss://bevo.nostr1.com', + 'wss://nos.lol' ] export const SEARCHABLE_RELAY_URLS = [ - 'wss://relay.nostr.band', + 'wss://nostr.sovbit.host', + 'wss://freelay.sovbit.host', 'wss://search.nos.today', 'wss://nostr.wine', 'wss://orly-relay.imwald.eu', @@ -123,7 +125,8 @@ export const SEARCHABLE_RELAY_URLS = [ ] export const PROFILE_RELAY_URLS = [ - 'wss://purplepag.es', + 'wss://nos.lol', + 'wss://relay.damus.io', 'wss://profiles.nostr1.com' ] diff --git a/src/services/client.service.ts b/src/services/client.service.ts index 7cb15b0b..d7110939 100644 --- a/src/services/client.service.ts +++ b/src/services/client.service.ts @@ -86,6 +86,14 @@ class ClientService extends EventTarget { 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( event: NEvent, { specifiedRelayUrls, additionalRelayUrls }: TPublishOptions = {} @@ -192,7 +200,16 @@ class ClientService extends EventTarget { 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) { logger.debug('[DetermineTargetRelays] User relay list fetched', { 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) { - 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