From 29a07261656ba4946859d1bf656bfd432bae914a Mon Sep 17 00:00:00 2001 From: Jon Staab Date: Wed, 15 Jan 2025 09:54:19 -0800 Subject: [PATCH] Improve relay scoring --- packages/app/src/router.ts | 27 +++++++++++++++++++-------- packages/net/src/Socket.ts | 1 + packages/util/src/Relay.ts | 13 +++++++------ 3 files changed, 27 insertions(+), 14 deletions(-) diff --git a/packages/app/src/router.ts b/packages/app/src/router.ts index 5f0c360..a7bde01 100644 --- a/packages/app/src/router.ts +++ b/packages/app/src/router.ts @@ -327,19 +327,30 @@ export class RouterScenario { export const getRelayQuality = (url: string) => { const relay = relaysByUrl.get().get(url) + // Skip non-relays entirely + if (!isRelayUrl(url)) return 0 + + // If we have recent errors, skip it if (relay?.stats) { - if (relay.stats.recent_errors.filter(n => n > ago(5)).length > 0) return 0 - if (relay.stats.recent_errors.filter(n => n > ago(MINUTE)).length > 1) return 0 - if (relay.stats.recent_errors.filter(n => n > ago(HOUR)).length > 5) return 0 - if (relay.stats.recent_errors.filter(n => n > ago(DAY)).length > 20) return 0 - if (relay.stats.recent_errors.filter(n => n > ago(WEEK)).length > 100) return 0 + if (relay.stats.recent_errors.filter(n => n > ago(MINUTE)).length > 0) return 0 + if (relay.stats.recent_errors.filter(n => n > ago(HOUR)).length > 3) return 0 + if (relay.stats.recent_errors.filter(n => n > ago(DAY)).length > 10) return 0 + if (relay.stats.recent_errors.filter(n => n > ago(WEEK)).length > 50) return 0 } - if (isIPAddress(url)) { - return 0.5 + // Prefer stuff we're connected to + if (ctx.net.pool.has(url)) return 1 + + // Prefer stuff we've connected to in the past + if (relay?.stats) return 0.9 + + // If it's not weird url give it an ok score + if (!isIPAddress(url) && !isLocalUrl(url) && !isOnionUrl(url) && !url.startsWith("ws://")) { + return 0.8 } - return 1 + // Default to a "meh" score + return 0.7 } export const getPubkeyRelays = (pubkey: string, mode?: string) => { diff --git a/packages/net/src/Socket.ts b/packages/net/src/Socket.ts index 5f69fe7..fa9d45a 100644 --- a/packages/net/src/Socket.ts +++ b/packages/net/src/Socket.ts @@ -122,6 +122,7 @@ export class Socket { } } } catch (e) { + this.lastError = Date.now() this.status = SocketStatus.Invalid this.cxn.emit(ConnectionEvent.InvalidUrl) } diff --git a/packages/util/src/Relay.ts b/packages/util/src/Relay.ts index 5234813..6569970 100644 --- a/packages/util/src/Relay.ts +++ b/packages/util/src/Relay.ts @@ -35,13 +35,14 @@ export const isRelayUrl = (url: string) => { url = "wss://" + url } - if (!url.match(/^wss?:\/\//)) { - return false - } + // Skip non-ws urls + if (!url.match(/^wss?:\/\//)) return false - if (!url.match(/\./)) { - return false - } + // Skip urls with a slash before the dot + if (url.match(/\\.*\./)) return false + + // Skip urls without a dot + if (!url.match(/\./)) return false try { new URL(url)