|
|
|
|
@ -74,10 +74,7 @@ class ClientService extends EventTarget {
@@ -74,10 +74,7 @@ class ClientService extends EventTarget {
|
|
|
|
|
max: 2000, |
|
|
|
|
fetchMethod: this._fetchFollowListEvent.bind(this) |
|
|
|
|
}) |
|
|
|
|
private fetchFollowingFavoriteRelaysCache = new LRUCache< |
|
|
|
|
string, |
|
|
|
|
Promise<Map<string, Set<string>>> |
|
|
|
|
>({ |
|
|
|
|
private fetchFollowingFavoriteRelaysCache = new LRUCache<string, Promise<[string, string[]][]>>({ |
|
|
|
|
max: 10, |
|
|
|
|
fetchMethod: this._fetchFollowingFavoriteRelays.bind(this) |
|
|
|
|
}) |
|
|
|
|
@ -823,40 +820,54 @@ class ClientService extends EventTarget {
@@ -823,40 +820,54 @@ class ClientService extends EventTarget {
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private async _fetchFollowingFavoriteRelays(pubkey: string) { |
|
|
|
|
const followings = await this.fetchFollowings(pubkey) |
|
|
|
|
const events = await this.fetchEvents(BIG_RELAY_URLS, { |
|
|
|
|
authors: followings, |
|
|
|
|
kinds: [ExtendedKind.FAVORITE_RELAYS, kinds.Relaysets], |
|
|
|
|
limit: 1000 |
|
|
|
|
}) |
|
|
|
|
const alreadyExistsFavoriteRelaysPubkeySet = new Set<string>() |
|
|
|
|
const alreadyExistsRelaySetsPubkeySet = new Set<string>() |
|
|
|
|
const uniqueEvents: NEvent[] = [] |
|
|
|
|
events |
|
|
|
|
.sort((a, b) => b.created_at - a.created_at) |
|
|
|
|
.forEach((event) => { |
|
|
|
|
if (event.kind === ExtendedKind.FAVORITE_RELAYS) { |
|
|
|
|
if (alreadyExistsFavoriteRelaysPubkeySet.has(event.pubkey)) return |
|
|
|
|
alreadyExistsFavoriteRelaysPubkeySet.add(event.pubkey) |
|
|
|
|
} else if (event.kind === kinds.Relaysets) { |
|
|
|
|
if (alreadyExistsRelaySetsPubkeySet.has(event.pubkey)) return |
|
|
|
|
alreadyExistsRelaySetsPubkeySet.add(event.pubkey) |
|
|
|
|
} else { |
|
|
|
|
return |
|
|
|
|
} |
|
|
|
|
uniqueEvents.push(event) |
|
|
|
|
const fetchNewData = async () => { |
|
|
|
|
const followings = await this.fetchFollowings(pubkey) |
|
|
|
|
const events = await this.fetchEvents(BIG_RELAY_URLS, { |
|
|
|
|
authors: followings, |
|
|
|
|
kinds: [ExtendedKind.FAVORITE_RELAYS, kinds.Relaysets], |
|
|
|
|
limit: 1000 |
|
|
|
|
}) |
|
|
|
|
const alreadyExistsFavoriteRelaysPubkeySet = new Set<string>() |
|
|
|
|
const alreadyExistsRelaySetsPubkeySet = new Set<string>() |
|
|
|
|
const uniqueEvents: NEvent[] = [] |
|
|
|
|
events |
|
|
|
|
.sort((a, b) => b.created_at - a.created_at) |
|
|
|
|
.forEach((event) => { |
|
|
|
|
if (event.kind === ExtendedKind.FAVORITE_RELAYS) { |
|
|
|
|
if (alreadyExistsFavoriteRelaysPubkeySet.has(event.pubkey)) return |
|
|
|
|
alreadyExistsFavoriteRelaysPubkeySet.add(event.pubkey) |
|
|
|
|
} else if (event.kind === kinds.Relaysets) { |
|
|
|
|
if (alreadyExistsRelaySetsPubkeySet.has(event.pubkey)) return |
|
|
|
|
alreadyExistsRelaySetsPubkeySet.add(event.pubkey) |
|
|
|
|
} else { |
|
|
|
|
return |
|
|
|
|
} |
|
|
|
|
uniqueEvents.push(event) |
|
|
|
|
}) |
|
|
|
|
|
|
|
|
|
const relayMap = new Map<string, Set<string>>() |
|
|
|
|
uniqueEvents.forEach((event) => { |
|
|
|
|
event.tags.forEach(([tagName, tagValue]) => { |
|
|
|
|
if (tagName === 'relay' && tagValue && isWebsocketUrl(tagValue)) { |
|
|
|
|
const url = normalizeUrl(tagValue) |
|
|
|
|
relayMap.set(url, (relayMap.get(url) || new Set()).add(event.pubkey)) |
|
|
|
|
} |
|
|
|
|
const relayMap = new Map<string, Set<string>>() |
|
|
|
|
uniqueEvents.forEach((event) => { |
|
|
|
|
event.tags.forEach(([tagName, tagValue]) => { |
|
|
|
|
if (tagName === 'relay' && tagValue && isWebsocketUrl(tagValue)) { |
|
|
|
|
const url = normalizeUrl(tagValue) |
|
|
|
|
relayMap.set(url, (relayMap.get(url) || new Set()).add(event.pubkey)) |
|
|
|
|
} |
|
|
|
|
}) |
|
|
|
|
}) |
|
|
|
|
}) |
|
|
|
|
return relayMap |
|
|
|
|
const relayMapEntries = Array.from(relayMap.entries()) |
|
|
|
|
.sort((a, b) => b[1].size - a[1].size) |
|
|
|
|
.map(([url, pubkeys]) => [url, Array.from(pubkeys)]) as [string, string[]][] |
|
|
|
|
|
|
|
|
|
indexedDb.putFollowingFavoriteRelays(pubkey, relayMapEntries) |
|
|
|
|
return relayMapEntries |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
const cached = await indexedDb.getFollowingFavoriteRelays(pubkey) |
|
|
|
|
if (cached) { |
|
|
|
|
fetchNewData() |
|
|
|
|
return cached |
|
|
|
|
} |
|
|
|
|
return fetchNewData() |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
updateFollowListCache(event: NEvent) { |
|
|
|
|
|