diff --git a/src/components/app-body/nostr/content-creators/content-creators-list.js b/src/components/app-body/nostr/content-creators/content-creators-list.js index fa85ec2..2a1c8f0 100644 --- a/src/components/app-body/nostr/content-creators/content-creators-list.js +++ b/src/components/app-body/nostr/content-creators/content-creators-list.js @@ -31,9 +31,12 @@ function ContentCreators (props) { const [followList, setFollowList] = useState([]) + // Get the list of profiles followed by the user. + // It aggregates all the followers from all the relays. const getFollowList = useCallback(async () => { const list = await new Promise((resolve, reject) => { let list = [] + let closedRelays = 0 const { nostrKeyPair } = appData.bchWalletState const pool = RelayPool(config.nostrRelays) @@ -43,49 +46,62 @@ function ContentCreators (props) { }) pool.on('eose', relay => { - console.log('Closing Relay') relay.close() - /** This ensures to return an empty array if no records are found! - * Applies for new users that don't have a follow list - */ - resolve(list) + closedRelays++ + // Resolve list if all relays are closed + if (closedRelays === config.nostrRelays.length) { + resolve(list) + } }) pool.on('event', (relay, subId, ev) => { - console.log('Received event:', ev) - list = ev.tags - resolve(list) + // console.log('Received event:', ev) + // Merge list received from all relays + list = [...list, ...ev.tags] }) }) - console.log('Follow List', list) + // console.log('Follow List', list) setFollowList(list) }, [appData]) + // Load profile from nostr relays + // It uses multiple relays. It will exit after the first successful retrieval + // from any relay. If one relay fails, it will move on to the next one. const loadProfile = useCallback(async (pubKey) => { - return new Promise((resolve) => { - // const pool = RelayPool(config.nostrRelays) - const pool = RelayPool([config.nostrRelay]) - pool.on('open', relay => { - relay.subscribe('subid', { limit: 5, kinds: [0], authors: [pubKey] }) - }) + // Looking for the profile in each relay sequentially + for (let i = 0; i < config.nostrRelays.length; i++) { + const profile = await new Promise((resolve) => { + const relay = config.nostrRelays[i] + // const pool = RelayPool(config.nostrRelays) + const pool = RelayPool([relay]) + pool.on('open', relay => { + relay.subscribe('subid', { limit: 5, kinds: [0], authors: [pubKey] }) + }) - pool.on('eose', relay => { - console.log('Closing Relay') - relay.close() - resolve(false) - }) - - pool.on('event', (relay, subId, ev) => { - try { - const profile = JSON.parse(ev.content) - // console.log('profile', profile) - resolve(profile) - } catch (error) { + pool.on('eose', relay => { + console.log('Closing Relay') + relay.close() resolve(false) - } + }) + + pool.on('event', (relay, subId, ev) => { + try { + const profile = JSON.parse(ev.content) + // console.log('profile', profile) + console.log(`Profile found for ${pubKey} at ${relay.url}`) + resolve(profile) + } catch (error) { + resolve(false) + } + relay.close() + }) }) - }) + // Stop looking for profile if found + if (profile) { + return profile + } + } }, []) useEffect(() => {