perf: cache following favorite relays
This commit is contained in:
@@ -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 {
|
||||
}
|
||||
|
||||
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) {
|
||||
|
||||
Reference in New Issue
Block a user