From fe35b2dfa1460e361e767c94b180eaea5af2f689 Mon Sep 17 00:00:00 2001 From: Laan Tungir Date: Fri, 26 Jun 2026 09:46:35 -0400 Subject: [PATCH] =?UTF-8?q?Phase=205:=20Add=20discovered=20relays=20(outbo?= =?UTF-8?q?x)=20table=20to=20relays.html=20=E2=80=94=20collapsible=20secti?= =?UTF-8?q?on=20showing=20temporary=20outbox=20relays=20with=20connection?= =?UTF-8?q?=20status,=20serving=20follow=20count,=20and=20sample=20npubs?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- www/js/version.json | 6 ++-- www/relays.html | 85 ++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 87 insertions(+), 4 deletions(-) diff --git a/www/js/version.json b/www/js/version.json index ee028e2..6c405d2 100644 --- a/www/js/version.json +++ b/www/js/version.json @@ -1,5 +1,5 @@ { - "VERSION": "v0.7.42", - "VERSION_NUMBER": "0.7.42", - "BUILD_DATE": "2026-06-26T13:44:56.791Z" + "VERSION": "v0.7.43", + "VERSION_NUMBER": "0.7.43", + "BUILD_DATE": "2026-06-26T13:46:35.892Z" } diff --git a/www/relays.html b/www/relays.html index d7c7741..3cb1093 100644 --- a/www/relays.html +++ b/www/relays.html @@ -257,6 +257,10 @@ ================================================================ -->
Loading relays...
+
+
▸ Discovered Relays (Outbox)
+ +
@@ -333,7 +337,7 @@ /* ================================================================ IMPORTS ================================================================ */ - import { initNDKPage, getPubkey, injectHeaderAvatar, disconnect, getRelayData, getRelayStats, reconnectRelay, publishEvent, getVersion, updateVersionDisplay, ndkFetchEvents, setRelayEventLogging } from './js/init-ndk.mjs'; + import { initNDKPage, getPubkey, injectHeaderAvatar, disconnect, getRelayData, getRelayStats, reconnectRelay, publishEvent, getVersion, updateVersionDisplay, ndkFetchEvents, setRelayEventLogging, getDiscoveredRelays } from './js/init-ndk.mjs'; import { HamburgerMorphing } from "./hamburger_morphing/hamburger.mjs"; import { initFooterRelayStatus, updateFooterRelayStatus, initSidenavRelaySection, updateSidenavRelaySection, setRelayActivityState } from './js/relay-ui.mjs'; @@ -1331,12 +1335,88 @@ const versionInfo = await getVersion(); } }; + const shortNpub = (hex) => { + if (!hex || hex.length < 16) return hex || '-'; + return `${hex.slice(0, 8)}…${hex.slice(-4)}`; + }; + + let discoveredRelaysExpanded = false; + + const renderDiscoveredRelays = (relays) => { + const container = document.getElementById('divDiscoveredRelays'); + const title = document.getElementById('divDiscoveredRelaysTitle'); + if (!container || !title) return; + + if (!discoveredRelaysExpanded) { + container.style.display = 'none'; + title.textContent = `▸ Discovered Relays (Outbox)${relays.length > 0 ? ` (${relays.length})` : ''}`; + return; + } + + title.textContent = `▾ Discovered Relays (Outbox) (${relays.length})`; + container.style.display = ''; + + if (relays.length === 0) { + container.innerHTML = '
No discovered relays. Load the feed page to populate outbox relays from your follows.
'; + return; + } + + let html = ''; + html += ''; + html += ''; + html += ''; + html += ''; + html += ''; + html += ''; + + for (const relay of relays) { + const connected = relay.connected ? SVG_CHECKED : SVG_UNCHECKED; + const servingCount = Array.isArray(relay.servingPubkeys) ? relay.servingPubkeys.length : 0; + const sampleFollows = Array.isArray(relay.servingPubkeys) + ? relay.servingPubkeys.slice(0, 3).map(shortNpub).join(', ') + : '-'; + const rowClass = relay.connected ? 'tblRowConnected' : ''; + + html += ``; + html += ``; + html += ``; + html += ``; + html += ``; + html += ''; + } + + html += '
RelayConnectedServingSample Follows
${relay.url}${connected}${servingCount}${sampleFollows}
'; + container.innerHTML = html; + }; + + const refreshDiscoveredRelays = async () => { + try { + const relays = await getDiscoveredRelays(); + renderDiscoveredRelays(Array.isArray(relays) ? relays : []); + } catch (error) { + console.warn('[relays.html] Failed to fetch discovered relays:', error?.message || error); + renderDiscoveredRelays([]); + } + }; + + const initDiscoveredRelaysToggle = () => { + const title = document.getElementById('divDiscoveredRelaysTitle'); + if (!title) return; + title.addEventListener('click', () => { + discoveredRelaysExpanded = !discoveredRelaysExpanded; + refreshDiscoveredRelays(); + }); + }; + const refreshRelayData = async () => { console.log('[relay2.html] Refreshing relay data...'); try { const relays = await getRelayData(); await createRelayTable(relays); + // Refresh discovered relays (outbox) table + void refreshDiscoveredRelays(); + // Keep relay debug history stable between polls; live updates are appended via ndkRelayEvent. } catch (error) { console.error('[relay2.html] Error getting relay data:', error); @@ -1494,6 +1574,9 @@ const versionInfo = await getVersion(); await loadCurrentDmInboxRelayList(); + // Initialize discovered relays (outbox) collapsible toggle + initDiscoveredRelaysToggle(); + // Get initial relay data await refreshRelayData();