perf(local-first): always follow up with remote for articles and titles

This commit is contained in:
Gigi
2025-10-12 23:00:23 +02:00
parent 6d58d6e7f3
commit ea1046fe13
2 changed files with 25 additions and 20 deletions

View File

@@ -103,7 +103,7 @@ export async function fetchArticleByNaddr(
? pointer.relays ? pointer.relays
: RELAYS : RELAYS
const orderedRelays = prioritizeLocalRelays(baseRelays) const orderedRelays = prioritizeLocalRelays(baseRelays)
const { local: localRelays } = partitionRelays(orderedRelays) const { local: localRelays, remote: remoteRelays } = partitionRelays(orderedRelays)
// Fetch the article event // Fetch the article event
const filter = { const filter = {
@@ -112,7 +112,7 @@ export async function fetchArticleByNaddr(
'#d': [pointer.identifier] '#d': [pointer.identifier]
} }
// Local-first: try local relays quickly, then fallback to remote if no result // Local-first: try local relays quickly, then ALWAYS query remote to merge
let events = [] as NostrEvent[] let events = [] as NostrEvent[]
if (localRelays.length > 0) { if (localRelays.length > 0) {
try { try {
@@ -131,18 +131,23 @@ export async function fetchArticleByNaddr(
} }
} }
if (events.length === 0) { // Always query remote to ensure we have the latest from the wider network
// Fallback: query all relays, but still time-box if (remoteRelays.length > 0) {
events = await lastValueFrom( try {
relayPool const remoteEvents = await lastValueFrom(
.req(orderedRelays, filter) relayPool
.pipe( .req(remoteRelays, filter)
onlyEvents(), .pipe(
take(1), onlyEvents(),
takeUntil(timer(6000)), take(1),
toArray() takeUntil(timer(6000)),
) toArray()
) )
)
events = events.concat(remoteEvents)
} catch {
// ignore
}
} }
if (events.length === 0) { if (events.length === 0) {

View File

@@ -30,7 +30,7 @@ export async function fetchArticleTitle(
? pointer.relays ? pointer.relays
: RELAYS : RELAYS
const orderedRelays = prioritizeLocalRelays(baseRelays) const orderedRelays = prioritizeLocalRelays(baseRelays)
const { local: localRelays } = partitionRelays(orderedRelays) const { local: localRelays, remote: remoteRelays } = partitionRelays(orderedRelays)
// Fetch the article event // Fetch the article event
const filter = { const filter = {
@@ -52,14 +52,14 @@ export async function fetchArticleTitle(
events = [] events = []
} }
} }
// Fallback to all relays if nothing from local quickly // Always follow up with remote relays to ensure we have latest network data
if (events.length === 0) { if (remoteRelays.length > 0) {
const fallbackEvents = await lastValueFrom( const remoteEvents = await lastValueFrom(
relayPool relayPool
.req(orderedRelays, filter) .req(remoteRelays, filter)
.pipe(onlyEvents(), take(1), takeUntil(timer(5000)), toArray()) .pipe(onlyEvents(), take(1), takeUntil(timer(5000)), toArray())
) )
events = fallbackEvents as { created_at: number }[] events = events.concat(remoteEvents as unknown as { created_at: number }[])
} }
if (events.length === 0) { if (events.length === 0) {