diff --git a/index.html b/index.html index c32c6ed..7801d09 100644 --- a/index.html +++ b/index.html @@ -101,6 +101,18 @@ + +
+

+ To relays + +

+
diff --git a/js/nostr-broadcast.js b/js/nostr-broadcast.js index 58f4e2e..573a468 100644 --- a/js/nostr-broadcast.js +++ b/js/nostr-broadcast.js @@ -18,7 +18,7 @@ const fetchAndBroadcast = async () => { } // parse pubkey ('npub' or hexa) - const relaySet = parseRelaySet($('#relaySet').val()) + const relaySet = parseRelaySet($('#relaySet').val(), allAvailableRelays) const pubkey = parsePubkey($('#pubkey').val()) if (!pubkey) return // disable button (will be re-enable at the end of the process) @@ -28,7 +28,7 @@ const fetchAndBroadcast = async () => { $('#fetching-status').text(txt.fetching) // show and update fetching progress bar $('#fetching-progress').css('visibility', 'visible') - $('#fetching-progress').prop('max', relays.length) + $('#fetching-progress').prop('max', relaySet.length) $('#checking-relays-header-box').css('display', 'flex') $('#checking-relays-box').css('display', 'flex') @@ -52,7 +52,7 @@ const fetchAndBroadcast = async () => { // inform user fetching is done $('#fetching-status').html(txt.fetching + checkMark) - $('#fetching-progress').val(relays.length) + $('#fetching-progress').val(relaySet.length) const latestKind3 = data.filter((it) => it.kind == 3 && it.pubkey === pubkey)[0] @@ -64,14 +64,15 @@ const fetchAndBroadcast = async () => { downloadFile(data, 'nostr-backup.json') if (latestKind3) { - const myRelaySet = JSON.parse(latestKind3.content) - relays = Object.keys(myRelaySet).filter(url => myRelaySet[url].write).map(url => url) + const parsedRelaySet = JSON.parse(latestKind3.content) + const kind3RelaySet = Object.keys(parsedRelaySet).filter(url => parsedRelaySet[url].write).map(url => url) + const relaySetBroadcast = parseRelaySet($('#relaySetBroadcast').val(), kind3RelaySet) // inform user that app is broadcasting events to relays $('#broadcasting-status').html(txt.broadcasting) // show and update broadcasting progress bar $('#broadcasting-progress').css('visibility', 'visible') - $('#broadcasting-progress').prop('max', relays.length) + $('#broadcasting-progress').prop('max', relaySetBroadcast.length) $('#checking-relays-header').html("") $('#checking-relays').html("") @@ -80,14 +81,14 @@ const fetchAndBroadcast = async () => { $('#checking-relays-box').css('display', 'flex') $('#checking-relays-header').html("RelayStatusEventsMessage") - await broadcastEvents(data) - } + await broadcastEvents(data, relaySetBroadcast) - // inform user that broadcasting is done - $('#broadcasting-status').html(txt.broadcasting + checkMark) - $('#broadcasting-progress').val(relays.length) - // re-enable broadcast button - $('#fetch-and-broadcast').prop('disabled', false) + // inform user that broadcasting is done + $('#broadcasting-status').html(txt.broadcasting + checkMark) + $('#broadcasting-progress').val(relaySetBroadcast.length) + // re-enable broadcast button + $('#fetch-and-broadcast').prop('disabled', false) + } } const getFromExtension = async () => { @@ -116,7 +117,6 @@ const justBroadcast = async (fileName) => { } const broadcast = async (data) => { - console.log(data) // reset UI $('#fetching-status').html('') $('#fetching-progress').css('visibility', 'hidden') @@ -133,20 +133,22 @@ const broadcast = async (data) => { fetching: 'Loading from file... ', download: `Downloading Backup file... ${checkMark}`, } + + const latestKind3 = data.filter((it) => it.kind == 3)[0] + const parsedRelaySet = JSON.parse(latestKind3.content) + const kind3RelaySet = Object.keys(parsedRelaySet).filter(url => parsedRelaySet[url].write).map(url => url) + const relaySetBroadcast = parseRelaySet($('#relaySetBroadcast').val(), kind3RelaySet) + // disable button (will be re-enable at the end of the process) $('#fetch-and-broadcast').prop('disabled', true) $('#just-broadcast').prop('disabled', true) // show and update fetching progress bar $('#fetching-progress').css('visibility', 'visible') - $('#fetching-progress').prop('max', relays.length) + $('#fetching-progress').prop('max', relaySetBroadcast.length) // inform user fetching is done $('#fetching-status').html(txt.fetching + checkMark) - $('#fetching-progress').val(relays.length) - - const latestKind3 = data.filter((it) => it.kind == 3)[0] - const myRelaySet = JSON.parse(latestKind3.content) - relays = Object.keys(myRelaySet).filter(url => myRelaySet[url].write).map(url => url) + $('#fetching-progress').val(relaySetBroadcast.length) $('#checking-relays-header-box').css('display', 'none') $('#checking-relays-box').css('display', 'none') @@ -155,17 +157,17 @@ const broadcast = async (data) => { $('#broadcasting-status').html(txt.broadcasting) // show and update broadcasting progress bar $('#broadcasting-progress').css('visibility', 'visible') - $('#broadcasting-progress').prop('max', relays.length) + $('#broadcasting-progress').prop('max', relaySetBroadcast.length) $('#checking-relays-header-box').css('display', 'flex') $('#checking-relays-box').css('display', 'flex') $('#checking-relays-header').html("RelayStatusEventsMessage") - await broadcastEvents(data) + await broadcastEvents(data, relaySetBroadcast) // inform user that broadcasting is done $('#broadcasting-status').html(txt.broadcasting + checkMark) - $('#broadcasting-progress').val(relays.length) + $('#broadcasting-progress').val(relaySetBroadcast.length) // re-enable broadcast button $('#fetch-and-broadcast').prop('disabled', false) } \ No newline at end of file diff --git a/js/nostr-utils.js b/js/nostr-utils.js index 51b67a3..50a52e3 100644 --- a/js/nostr-utils.js +++ b/js/nostr-utils.js @@ -37,13 +37,13 @@ const hexa2npub = (hex) => { const parsePubkey = (pubkey) => pubkey.match('npub1') ? npub2hexa(pubkey) : pubkey -const parseRelaySet = (commaSeparatedRelayString) => { +const parseRelaySet = (commaSeparatedRelayString, defaultSet) => { let list = commaSeparatedRelayString.split(",") - - if (list.length == 0) return undefined - if (list.length == 1 && list[0].trim() === "") return undefined - return list + if (list && list.length > 0 && list[0] !== "") + return list.map((it) => it.trim()) + else + return defaultSet } // download js file @@ -110,7 +110,7 @@ const displayRelayStatus = (relayStatusAndCount) => { const relayName = it.replace("wss://", "").replace("ws://", "") const line = "" + relayName + "" + relayStatusAndCount[it].status + "" + untilStr + "" + relayStatusAndCount[it].count + "" + "" + msg + "" - const elemId = relayName.replaceAll(".", "-") + const elemId = relayName.replaceAll(".", "") if ($('#' + elemId).length > 0) { $('#' + elemId).html(line) @@ -322,15 +322,8 @@ const getEvents = async (filters, addedFilters, pubkey, relaySet) => { // events hash const events = {} - let myRelaySet = null - - if (relaySet && relaySet.length > 0) - myRelaySet = relaySet - else - myRelaySet = relays - // batch processing of 10 relays - await processInPool(myRelaySet, (relay, poolStatus) => fetchFromRelay(relay, filters, addedFilters, pubkey, events, poolStatus), 10, (progress) => $('#fetching-progress').val(progress)) + await processInPool(relaySet, (relay, poolStatus) => fetchFromRelay(relay, filters, addedFilters, pubkey, events, poolStatus), 10, (progress) => $('#fetching-progress').val(progress)) displayRelayStatus({}) @@ -339,10 +332,10 @@ const getEvents = async (filters, addedFilters, pubkey, relaySet) => { } // broadcast events to list of relays -const broadcastEvents = async (data) => { - const poolStatus = await processInPool(relays, (relay, poolStatus) => sendToRelay(relay, data, poolStatus), 10, (progress) => $('#broadcasting-progress').val(progress)) +const broadcastEvents = async (data, relaySet) => { + const poolStatus = await processInPool(relaySet, (relay, poolStatus) => sendToRelay(relay, data, poolStatus), 10, (progress) => $('#broadcasting-progress').val(progress)) - displayRelayStatus(relayStatus) + displayRelayStatus(poolStatus) } const processInPool = async (items, processItem, poolSize, onProgress) => { @@ -427,6 +420,25 @@ const sendToRelay = async (relay, data, relayStatus) => } else { console.log(relay, event.data) } + + if (msgType === 'AUTH') { + signNostrAuthEvent(relay, subscriptionId).then( + (event) => { + if (event) { + ws.send(JSON.stringify(['AUTH', event])) + } else { + updateRelayStatus(relay, "AUTH Req", 0, undefined, undefined, relayStatus) + ws.close() + reject(relay) + } + }, + (reason) => { + updateRelayStatus(relay, "AUTH Req", 0, undefined, undefined, relayStatus) + ws.close() + reject(relay) + }, + ) + } } ws.onerror = (err) => { updateRelayStatus(relay, "Error", 0, undefined, undefined, undefined, relayStatus) diff --git a/js/relays.js b/js/relays.js index d08c9f6..315cc2f 100644 --- a/js/relays.js +++ b/js/relays.js @@ -54,8 +54,8 @@ const fixedRelays = [ 'wss://relay.nostr.band' ] -var relays = [] +var allAvailableRelays = [] fetch("https://api.nostr.watch/v1/online") .then(response => response.json()) - .then(json => relays = [... new Set(fixedRelays.concat(json))] ); + .then(json => allAvailableRelays = [... new Set(fixedRelays.concat(json))] ); diff --git a/style.css b/style.css index 2f51b81..8abe030 100644 --- a/style.css +++ b/style.css @@ -240,6 +240,26 @@ h2 { } +#relaySetBroadcast { + width: 450px !important; +} + +@media screen and (max-width: 1080px) { + #relaySetBroadcast { + width: 450px !important; + } +} +@media screen and (max-width: 800px) { + #relaySetBroadcast { + width: 350px !important; + } +} +@media screen and (max-width: 600px) { + #relaySetBroadcast { + width: 250px !important; + } +} +