require fewer router options fixes #3

This commit is contained in:
Jon Staab
2024-05-08 10:10:09 -07:00
parent 8b8775d2a0
commit 6e57fa57e6
+28 -28
View File
@@ -15,67 +15,67 @@ export type RouterOptions = {
* Retrieves the user's public key. * Retrieves the user's public key.
* @returns The user's public key as a string, or null if not available. * @returns The user's public key as a string, or null if not available.
*/ */
getUserPubkey: () => string | null getUserPubkey?: () => string | null
/** /**
* Retrieves the group relays for the specified address. * Retrieves group relays for the specified community.
* @param address - The address to retrieve group relays for. * @param address - The address to retrieve group relays for.
* @returns An array of group relay URLs as strings. * @returns An array of group relay URLs as strings.
*/ */
getGroupRelays: (address: string) => string[] getGroupRelays?: (address: string) => string[]
/** /**
* Retrieves the community relays for the specified address. * Retrieves relays for the specified community.
* @param address - The address to retrieve community relays for. * @param address - The address to retrieve community relays for.
* @returns An array of community relay URLs as strings. * @returns An array of community relay URLs as strings.
*/ */
getCommunityRelays: (address: string) => string[] getCommunityRelays?: (address: string) => string[]
/** /**
* Retrieves the relays for the specified public key and mode. * Retrieves relays for the specified public key and mode.
* @param pubkey - The public key to retrieve relays for. * @param pubkey - The public key to retrieve relays for.
* @param mode - The relay mode (optional). * @param mode - The relay mode (optional).
* @returns An array of relay URLs as strings. * @returns An array of relay URLs as strings.
*/ */
getPubkeyRelays: (pubkey: string, mode?: RelayMode) => string[] getPubkeyRelays?: (pubkey: string, mode?: RelayMode) => string[]
/** /**
* Retrieves the static relays. These are used as fallbacks. * Retrieves fallback relays, for use when no other relays can be selected.
* @returns An array of relay URLs as strings. * @returns An array of relay URLs as strings.
*/ */
getStaticRelays: () => string[] getFallbackRelays: () => string[]
/** /**
* Retrieves relays likely to return results for kind 0, 3, and 10002. * Retrieves relays likely to return results for kind 0, 3, and 10002.
* @returns An array of relay URLs as strings. * @returns An array of relay URLs as strings.
*/ */
getIndexerRelays: () => string[] getIndexerRelays?: () => string[]
/** /**
* Retrieves relays likely to support NIP-50 search. * Retrieves relays likely to support NIP-50 search.
* @returns An array of relay URLs as strings. * @returns An array of relay URLs as strings.
*/ */
getSearchRelays: () => string[] getSearchRelays?: () => string[]
/** /**
* Retrieves the quality of the specified relay. * Retrieves the quality of the specified relay.
* @param url - The URL of the relay to retrieve quality for. * @param url - The URL of the relay to retrieve quality for.
* @returns The quality of the relay as a number between 0 and 1 inclusive. * @returns The quality of the relay as a number between 0 and 1 inclusive.
*/ */
getRelayQuality: (url: string) => number getRelayQuality?: (url: string) => number
/** /**
* Retrieves the redundancy setting, which is how many relays to use per selection value. * Retrieves the redundancy setting, which is how many relays to use per selection value.
* @returns The redundancy setting as a number. * @returns The redundancy setting as a number.
*/ */
getRedundancy: () => number getRedundancy?: () => number
/** /**
* Retrieves the limit setting, which is the maximum number of relays that should be * Retrieves the limit setting, which is the maximum number of relays that should be
* returned from getUrls and getSelections. * returned from getUrls and getSelections.
* @returns The limit setting as a number. * @returns The limit setting as a number.
*/ */
getLimit: () => number getLimit?: () => number
} }
export type ValuesByRelay = Map<string, string[]> export type ValuesByRelay = Map<string, string[]>
@@ -98,18 +98,18 @@ export class Router {
// Utilities derived from options // Utilities derived from options
getPubkeySelection = (pubkey: string, mode?: RelayMode) => getPubkeySelection = (pubkey: string, mode?: RelayMode) =>
this.selection(pubkey, this.options.getPubkeyRelays(pubkey, mode)) this.selection(pubkey, this.options.getPubkeyRelays?.(pubkey, mode) || [])
getPubkeySelections = (pubkeys: string[], mode?: RelayMode) => getPubkeySelections = (pubkeys: string[], mode?: RelayMode) =>
pubkeys.map(pubkey => this.getPubkeySelection(pubkey, mode)) pubkeys.map(pubkey => this.getPubkeySelection(pubkey, mode))
getUserSelections = (mode?: RelayMode) => getUserSelections = (mode?: RelayMode) =>
this.getPubkeySelections([this.options.getUserPubkey()].filter(identity) as string[], mode) this.getPubkeySelections([this.options.getUserPubkey?.()].filter(identity) as string[], mode)
getContextSelections = (tags: Tags) => { getContextSelections = (tags: Tags) => {
return [ return [
...tags.communities().mapTo(t => this.selection(t.value(), this.options.getCommunityRelays(t.value()))).valueOf(), ...tags.communities().mapTo(t => this.selection(t.value(), this.options.getCommunityRelays?.(t.value()) || [])).valueOf(),
...tags.groups().mapTo(t => this.selection(t.value(), this.options.getGroupRelays(t.value()))).valueOf(), ...tags.groups().mapTo(t => this.selection(t.value(), this.options.getGroupRelays?.(t.value()) || [])).valueOf(),
] ]
} }
@@ -133,7 +133,7 @@ export class Router {
) )
scoreRelaySelection = ({values, relay}: RelayValues) => scoreRelaySelection = ({values, relay}: RelayValues) =>
values.length * this.options.getRelayQuality(relay) values.length * (this.options.getRelayQuality?.(relay) || 1)
sortRelaySelections = (relaySelections: RelayValues[]) => { sortRelaySelections = (relaySelections: RelayValues[]) => {
const scores = new Map<string, number>() const scores = new Map<string, number>()
@@ -197,10 +197,10 @@ export class Router {
const communities = tags.communities().values().valueOf() const communities = tags.communities().values().valueOf()
const groups = tags.groups().values().valueOf() const groups = tags.groups().values().valueOf()
const relays = uniq([ const relays = uniq([
...this.options.getPubkeyRelays(event.pubkey, RelayMode.Read), ...this.options.getPubkeyRelays?.(event.pubkey, RelayMode.Read) || [],
...pubkeys.flatMap((k: string) => this.options.getPubkeyRelays(k, RelayMode.Write)), ...pubkeys.flatMap((k: string) => this.options.getPubkeyRelays?.(k, RelayMode.Write) || []),
...communities.flatMap((a: string) => this.options.getCommunityRelays(a)), ...communities.flatMap((a: string) => this.options.getCommunityRelays?.(a) || []),
...groups.flatMap((a: string) => this.options.getGroupRelays(a)), ...groups.flatMap((a: string) => this.options.getGroupRelays?.(a) || []),
...ancestors.relays().valueOf(), ...ancestors.relays().valueOf(),
]) ])
@@ -261,10 +261,10 @@ export class Router {
this.merge(addresses.map(this.WithinContext)) this.merge(addresses.map(this.WithinContext))
Search = (term: string, relays: string[] = []) => Search = (term: string, relays: string[] = []) =>
this.product([term], uniq(this.options.getSearchRelays().concat(relays))) this.product([term], uniq(relays.concat(this.options.getSearchRelays?.() || [])))
Indexers = (relays: string[] = []) => Indexers = (relays: string[] = []) =>
this.fromRelays(uniq(this.options.getIndexerRelays().concat(relays))) this.fromRelays(uniq(relays.concat(this.options.getIndexerRelays?.() || [])))
// Fallback policies // Fallback policies
@@ -322,11 +322,11 @@ export class RouterScenario {
limit = (limit: number) => this.clone({limit}) limit = (limit: number) => this.clone({limit})
getRedundancy = () => this.options.redundancy || this.router.options.getRedundancy() getRedundancy = () => this.options.redundancy || this.router.options.getRedundancy?.() || 3
getPolicy = () => this.options.policy || this.router.addMaximalFallbacks getPolicy = () => this.options.policy || this.router.addMaximalFallbacks
getLimit = () => this.options.limit || this.router.options.getLimit() getLimit = () => this.options.limit || this.router.options.getLimit?.() || 10
getSelections = () => { getSelections = () => {
const allValues = new Set() const allValues = new Set()
@@ -366,7 +366,7 @@ export class RouterScenario {
} }
} }
const fallbacks = shuffle(this.router.options.getStaticRelays()) const fallbacks = shuffle(this.router.options.getFallbackRelays())
const fallbackPolicy = this.getPolicy() const fallbackPolicy = this.getPolicy()
for (const {value} of this.selections) { for (const {value} of this.selections) {
const timesSeen = seen.get(value) || 0 const timesSeen = seen.get(value) || 0