Skip to content

Commit

Permalink
Merge pull request #211 from jiftechnify/fix-relay-list
Browse files Browse the repository at this point in the history
Fix issues related to user relay list detection
  • Loading branch information
jiftechnify authored Oct 12, 2024
2 parents eea8eaf + 4686a8b commit eab6171
Show file tree
Hide file tree
Showing 2 changed files with 16 additions and 16 deletions.
10 changes: 5 additions & 5 deletions src/nostr.ts
Original file line number Diff line number Diff line change
Expand Up @@ -46,25 +46,25 @@ const parseRelayListInKind10002 = (ev: NostrEvent): RelayList | undefined => {
for (const t of getTagsByName(ev, "r")) {
const [, url, usage] = t;
if (url === undefined) {
return;
continue;
}
switch (usage) {
case undefined:
case "":
res[url] = { read: true, write: true };
return;
break;

case "read":
res[url] = { read: true, write: false };
return;
break;

case "write":
res[url] = { read: false, write: true };
return;
break;

default:
console.warn("invalid relay type in kind 10002 event:", usage);
return;
break;
}
}

Expand Down
22 changes: 11 additions & 11 deletions src/states/nostr.ts
Original file line number Diff line number Diff line change
Expand Up @@ -258,9 +258,8 @@ const defaultBootstrapRelays = ["wss://relay.nostr.band", "wss://directory.yabu.

const fallbackRelayList: RelayList = {
"wss://relay.nostr.band": { read: true, write: true },
"wss://relayable.org": { read: true, write: true },
"wss://relay.damus.io": { read: false, write: true },
"wss://yabu.me": { read: true, write: false },
"wss://nos.lol": { read: true, write: true },
"wss://yabu.me": { read: true, write: true },
};

// first, get read relays from NIP-07 extension if available. if no relays found, use default relays.
Expand All @@ -274,18 +273,19 @@ const getBootstrapRelays = async (): Promise<[string[], boolean]> => {
return nostrExtReadRelays.length > 0 ? [nostrExtReadRelays, false] : [defaultBootstrapRelays, true];
};

const extractRelayListOrDefault = (evs: (NostrEvent | undefined)[]): RelayList => {
const relayListEvs = evs.filter((ev): ev is NostrEvent => ev !== undefined && [3, 10002].includes(ev.kind));
const extractRelayListOrDefault = ({
k10002,
k3,
}: { k10002: NostrEvent | undefined; k3: NostrEvent | undefined }): RelayList => {
// kind 10002 take precedence over kind 3
const relayListEvs = [k10002, k3].filter((ev): ev is NostrEvent => ev !== undefined && [3, 10002].includes(ev.kind));

if (relayListEvs.length === 0) {
console.warn("failed to fetch events that have relay list; using fallback relays");
return fallbackRelayList;
}

// 1. try newer one out of kind:3 and kind:10002
// 2. if fails, try older one
// 3. if both fail, return default
const evsLatestOrder = relayListEvs.sort((a, b) => b.created_at - a.created_at);
for (const ev of evsLatestOrder) {
for (const ev of relayListEvs) {
const res = parseRelayListInEvent(ev);
if (res !== undefined) {
console.log("extracted relay list from kind %d: %O", ev.kind, res);
Expand Down Expand Up @@ -319,7 +319,7 @@ export const fetchAccountData = async (pubkey: string): Promise<AccountMetadata>

const profile = k0 !== undefined ? UserProfile.fromEvent(k0) : { srcEventId: "undefined", pubkey };
const followings = k3 !== undefined ? getTagValuesByName(k3, "p") : [];
const relayList = extractRelayListOrDefault([k3, k10002]);
const relayList = extractRelayListOrDefault({ k10002, k3 });
return { profile, followings, relayList, lastFetchedAt: currUnixtime() };
};

Expand Down

0 comments on commit eab6171

Please sign in to comment.