refactor: note list component
This commit is contained in:
@@ -27,6 +27,7 @@ import {
|
||||
} from 'nostr-tools'
|
||||
import { AbstractRelay } from 'nostr-tools/abstract-relay'
|
||||
import indexedDb from './indexed-db.service'
|
||||
import { isSafari } from '@/lib/utils'
|
||||
|
||||
type TTimelineRef = [string, number]
|
||||
|
||||
@@ -1180,6 +1181,55 @@ class ClientService extends EventTarget {
|
||||
async updateBlossomServerListEventCache(evt: NEvent) {
|
||||
await this.updateReplaceableEventCache(evt)
|
||||
}
|
||||
|
||||
// ================= Utils =================
|
||||
|
||||
async generateSubRequestsForPubkeys(pubkeys: string[], myPubkey?: string | null) {
|
||||
// If many websocket connections are initiated simultaneously, it will be
|
||||
// very slow on Safari (for unknown reason)
|
||||
if (isSafari()) {
|
||||
let urls = BIG_RELAY_URLS
|
||||
if (myPubkey) {
|
||||
const relayList = await this.fetchRelayList(myPubkey)
|
||||
urls = relayList.read.concat(BIG_RELAY_URLS).slice(0, 5)
|
||||
}
|
||||
return [{ urls, filter: { authors: pubkeys } }]
|
||||
}
|
||||
|
||||
const relayLists = await this.fetchRelayLists(pubkeys)
|
||||
const group: Record<string, Set<string>> = {}
|
||||
relayLists.forEach((relayList, index) => {
|
||||
relayList.write.slice(0, 4).forEach((url) => {
|
||||
if (!group[url]) {
|
||||
group[url] = new Set()
|
||||
}
|
||||
group[url].add(pubkeys[index])
|
||||
})
|
||||
})
|
||||
|
||||
const relayCount = Object.keys(group).length
|
||||
const coveredCount = new Map<string, number>()
|
||||
Object.entries(group)
|
||||
.sort(([, a], [, b]) => b.size - a.size)
|
||||
.forEach(([url, pubkeys]) => {
|
||||
if (
|
||||
relayCount > 10 &&
|
||||
pubkeys.size < 10 &&
|
||||
Array.from(pubkeys).every((pubkey) => (coveredCount.get(pubkey) ?? 0) >= 2)
|
||||
) {
|
||||
delete group[url]
|
||||
} else {
|
||||
pubkeys.forEach((pubkey) => {
|
||||
coveredCount.set(pubkey, (coveredCount.get(pubkey) ?? 0) + 1)
|
||||
})
|
||||
}
|
||||
})
|
||||
|
||||
return Object.entries(group).map(([url, authors]) => ({
|
||||
urls: [url],
|
||||
filter: { authors: Array.from(authors) }
|
||||
}))
|
||||
}
|
||||
}
|
||||
|
||||
const instance = ClientService.getInstance()
|
||||
|
||||
Reference in New Issue
Block a user