diff --git a/www/js/version.json b/www/js/version.json index a615342..c18910d 100644 --- a/www/js/version.json +++ b/www/js/version.json @@ -1,5 +1,5 @@ { - "VERSION": "v0.7.54", - "VERSION_NUMBER": "0.7.54", - "BUILD_DATE": "2026-06-27T01:33:34.109Z" + "VERSION": "v0.7.55", + "VERSION_NUMBER": "0.7.55", + "BUILD_DATE": "2026-06-27T01:51:10.342Z" } diff --git a/www/ndk-worker.js b/www/ndk-worker.js index 39f0e66..42fc92d 100644 --- a/www/ndk-worker.js +++ b/www/ndk-worker.js @@ -6453,7 +6453,7 @@ function shortHexPubkey(hex) { // adding servingNames). let discoveredRelaysCache = null; let discoveredRelaysCacheKey = ''; -const DISCOVERED_RELAYS_CACHE_VERSION = 'v2-names'; +const DISCOVERED_RELAYS_CACHE_VERSION = 'v3-names-k0'; async function handleGetDiscoveredRelays(requestId, port) { try { @@ -6537,15 +6537,17 @@ async function handleGetDiscoveredRelays(requestId, port) { // Look up profile names for all serving pubkeys from the Dexie // profiles table so we can display usernames instead of pubkeys. + // Look up profile names for all serving pubkeys. const pubkeyToName = new Map(); + const allServingPubkeys = new Set(); + for (const servingSet of relayServesPubkeys.values()) { + for (const pk of servingSet) allServingPubkeys.add(pk); + } + + // Strategy 1: Try Dexie profiles table. try { const adapter = ndk?.cacheAdapter?.adapter; if (adapter?.db?.profiles) { - const allServingPubkeys = new Set(); - for (const servingSet of relayServesPubkeys.values()) { - for (const pk of servingSet) allServingPubkeys.add(pk); - } - // Query profiles table for all serving pubkeys. for (const pk of allServingPubkeys) { try { const row = await adapter.db.profiles.get(pk); @@ -6558,6 +6560,42 @@ async function handleGetDiscoveredRelays(requestId, port) { } } catch (_) {} + // Strategy 2: If Dexie profiles didn't have names for everyone, + // query kind 0 events from the NDK cache for the missing pubkeys. + const missingPubkeys = Array.from(allServingPubkeys).filter(pk => !pubkeyToName.has(pk)); + if (missingPubkeys.length > 0) { + try { + // Query in batches of 400. + for (let i = 0; i < missingPubkeys.length; i += 400) { + const batch = missingPubkeys.slice(i, i + 400); + const k0Events = await ndk.fetchEvents( + { kinds: [0], authors: batch }, + { cacheUsage: 'ONLY_CACHE' } + ); + if (k0Events && k0Events.size > 0) { + // For each author, keep only the latest kind 0. + const latestByAuthor = new Map(); + for (const evt of k0Events) { + const existing = latestByAuthor.get(evt.pubkey); + if (!existing || (evt.created_at || 0) > (existing.created_at || 0)) { + latestByAuthor.set(evt.pubkey, evt); + } + } + for (const [pubkey, evt] of latestByAuthor) { + try { + const profile = typeof evt.content === 'string' + ? JSON.parse(evt.content) : evt.content; + const name = profile?.display_name || profile?.name || ''; + if (name) pubkeyToName.set(pubkey, name); + } catch (_) {} + } + } + } + } catch (_) {} + } + + console.log('[Worker] getDiscoveredRelays: profile names resolved for', pubkeyToName.size, 'of', allServingPubkeys.size, 'pubkeys'); + // Build the discovered relays list: relays that are NOT in the // user's own kind 10002 but ARE in follows' kind 10002. const relays = [];