diff --git a/www/js/init-ndk.mjs b/www/js/init-ndk.mjs index f76de8e..20e484f 100644 --- a/www/js/init-ndk.mjs +++ b/www/js/init-ndk.mjs @@ -1762,6 +1762,19 @@ export function setOutboxModel(enabled) { console.log('[init-ndk] Outbox model:', enabled ? 'enabled' : 'disabled'); } +/** + * Enable or disable the broadcast relay path (kind 10088) at runtime. + * When disabled, posts only go to the user's enabled kind 10002 relays. + * @param {boolean} enabled + */ +export function setBroadcastEnabled(enabled) { + if (!ndkWorker) { + throw new Error('NDK worker not initialized. Call initNDKPage() first.'); + } + ndkWorker.port.postMessage({ type: 'setBroadcastEnabled', enabled }); + console.log('[init-ndk] Broadcast:', enabled ? 'enabled' : 'disabled'); +} + /** * Helper to disconnect worker */ diff --git a/www/js/version.json b/www/js/version.json index 4af079d..743b5ab 100644 --- a/www/js/version.json +++ b/www/js/version.json @@ -1,5 +1,5 @@ { - "VERSION": "v0.7.101", - "VERSION_NUMBER": "0.7.101", - "BUILD_DATE": "2026-08-07T14:06:51.088Z" + "VERSION": "v0.7.102", + "VERSION_NUMBER": "0.7.102", + "BUILD_DATE": "2026-08-07T19:02:39.514Z" } diff --git a/www/ndk-worker.js b/www/ndk-worker.js index 6b083e6..c02b2b7 100644 --- a/www/ndk-worker.js +++ b/www/ndk-worker.js @@ -89728,6 +89728,12 @@ let disabledRelays = new Set(); // auto-connecting to discovered outbox relays. let outboxModelEnabled = true; +// Broadcast toggle (session-level, synced from page localStorage on init). +// When false, handlePublish skips the broadcast relay path entirely and +// falls through to the normal publish path (which only publishes to +// enabled kind 10002 relays). +let broadcastEnabled = true; + /** * Check if a relay URL is temporarily disabled. * Checks both the normalized and raw form. @@ -95697,8 +95703,11 @@ async function handlePublish(requestId, event, port) { // temporary NDKRelaySet. NDK's fromRelayUrls uses pool.useTemporaryRelay // so hundreds of broadcast relays connect transiently without polluting // the read subscription pool. + // If broadcastEnabled is false, skip the broadcast path entirely and + // fall through to the normal publish path (which only publishes to + // enabled kind 10002 relays). const activeBroadcastUrls = getActiveBroadcastUrls(); - const isBroadcast = wantsBroadcastRelays(event) && activeBroadcastUrls.length > 0; + const isBroadcast = broadcastEnabled && wantsBroadcastRelays(event) && activeBroadcastUrls.length > 0; let outboxWriteUrls = []; if (isBroadcast) { @@ -97196,6 +97205,17 @@ function handleSetOutboxModel(enabled, port) { port.postMessage({ type: 'response', data: { success: true, outboxModelEnabled: outboxModelEnabled } }); } +/** + * Handle set broadcast enabled request — enable or disable the broadcast relay + * path (kind 10088). When disabled, handlePublish skips the broadcast path + * entirely and falls through to the normal publish path. + */ +function handleSetBroadcastEnabled(enabled, port) { + console.log('[Worker] Setting broadcast enabled:', enabled); + broadcastEnabled = enabled; + port.postMessage({ type: 'response', data: { success: true, broadcastEnabled: broadcastEnabled } }); +} + /** * Handle reconnect relay request */ @@ -97578,6 +97598,10 @@ self.onconnect = (event) => { handleSetOutboxModel(e.data.enabled, port); break; + case 'setBroadcastEnabled': + handleSetBroadcastEnabled(e.data.enabled, port); + break; + case 'disconnect': handleDisconnect(); break; diff --git a/www/relays.html b/www/relays.html index eca8afb..82af21b 100644 --- a/www/relays.html +++ b/www/relays.html @@ -337,7 +337,7 @@ /* ================================================================ IMPORTS ================================================================ */ - import { initNDKPage, getPubkey, injectHeaderAvatar, disconnect, getRelayData, getRelayStats, reconnectRelay, disableRelay, enableRelay, setOutboxModel, publishEvent, getVersion, updateVersionDisplay, ndkFetchEvents, setRelayEventLogging, getDiscoveredRelays } from './js/init-ndk.mjs'; + import { initNDKPage, getPubkey, injectHeaderAvatar, disconnect, getRelayData, getRelayStats, reconnectRelay, disableRelay, enableRelay, setOutboxModel, setBroadcastEnabled, 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'; @@ -447,6 +447,10 @@ const versionInfo = await getVersion(); Outbox model