From 3636064f256a4a3c26c4ce348ac719cde1579191 Mon Sep 17 00:00:00 2001 From: Jon Staab Date: Thu, 24 Apr 2025 17:10:41 -0700 Subject: [PATCH] Move getRelayUrls to getRelaysFromList --- packages/app/src/relaySelections.ts | 44 +++++------------------------ packages/router/package.json | 3 +- packages/router/src/index.ts | 22 ++++++++++----- packages/util/src/List.ts | 16 +++++++++-- packages/util/src/Relay.ts | 6 ++++ pnpm-lock.yaml | 3 ++ 6 files changed, 46 insertions(+), 48 deletions(-) diff --git a/packages/app/src/relaySelections.ts b/packages/app/src/relaySelections.ts index bcc4eeb..3fd99af 100644 --- a/packages/app/src/relaySelections.ts +++ b/packages/app/src/relaySelections.ts @@ -5,34 +5,15 @@ import { normalizeRelayUrl, asDecryptedEvent, readList, - getListTags, - getRelayTags, - getRelayTagValues, + getRelaysFromList, } from "@welshman/util" -import {TrustedEvent, PublishedList, List} from "@welshman/util" +import {TrustedEvent, PublishedList, RelayMode, List} from "@welshman/util" import {request} from "@welshman/net" import {deriveEventsMapped} from "@welshman/store" -import {Router, RelayMode} from "@welshman/router" +import {Router} from "@welshman/router" import {repository} from "./core.js" import {collection} from "./collection.js" -export const getRelayUrls = (list?: List): string[] => - uniq(getRelayTagValues(getListTags(list)).map(normalizeRelayUrl)) - -export const getReadRelayUrls = (list?: List): string[] => - uniq( - getRelayTags(getListTags(list)) - .filter((t: string[]) => !t[2] || t[2] === "read") - .map((t: string[]) => normalizeRelayUrl(t[1])), - ) - -export const getWriteRelayUrls = (list?: List): string[] => - uniq( - getRelayTags(getListTags(list)) - .filter((t: string[]) => !t[2] || t[2] === "write") - .map((t: string[]) => normalizeRelayUrl(t[1])), - ) - export type OutboxLoaderRequest = { pubkey: string relays: string[] @@ -78,21 +59,10 @@ export const { load: makeOutboxLoader(RELAYS), }) -export const getPubkeyRelays = (pubkey: string, mode?: string) => { - const $relaySelections = relaySelectionsByPubkey.get() - const $inboxSelections = inboxRelaySelectionsByPubkey.get() - - switch (mode) { - case RelayMode.Read: - return getReadRelayUrls($relaySelections.get(pubkey)) - case RelayMode.Write: - return getWriteRelayUrls($relaySelections.get(pubkey)) - case RelayMode.Inbox: - return getRelayUrls($inboxSelections.get(pubkey)) - default: - return getRelayUrls($relaySelections.get(pubkey)) - } -} +export const getPubkeyRelays = (pubkey: string, mode?: string) => + mode === RelayMode.Inbox + ? getRelaysFromList(inboxRelaySelectionsByPubkey.get().get(pubkey)) + : getRelaysFromList(relaySelectionsByPubkey.get().get(pubkey), mode) export const inboxRelaySelections = deriveEventsMapped(repository, { filters: [{kinds: [INBOX_RELAYS]}], diff --git a/packages/router/package.json b/packages/router/package.json index 8f3306d..f01d298 100644 --- a/packages/router/package.json +++ b/packages/router/package.json @@ -21,7 +21,8 @@ }, "dependencies": { "@welshman/lib": "workspace:*", - "@welshman/util": "workspace:*" + "@welshman/util": "workspace:*", + "@welshman/relay": "workspace:*" }, "devDependencies": { "rimraf": "~6.0.0", diff --git a/packages/router/src/index.ts b/packages/router/src/index.ts index 06a8e9d..80ae22a 100644 --- a/packages/router/src/index.ts +++ b/packages/router/src/index.ts @@ -1,4 +1,5 @@ import { + uniq, intersection, mergeLeft, first, @@ -29,7 +30,12 @@ import { normalizeRelayUrl, TrustedEvent, Filter, + readList, + asDecryptedEvent, + getRelaysFromList, + RelayMode, } from "@welshman/util" +import {Repository} from "@welshman/relay" export const INDEXED_KINDS = [PROFILE, RELAYS, INBOX_RELAYS, FOLLOWS] @@ -38,12 +44,6 @@ export type RelaysAndFilters = { filters: Filter[] } -export enum RelayMode { - Read = "read", - Write = "write", - Inbox = "inbox", -} - export type RouterOptions = { /** * Retrieves the user's public key. @@ -114,7 +114,15 @@ export const addMaximalFallbacks = (count: number, limit: number) => limit - cou // Router class -export const routerContext: RouterOptions = {} +export const routerContext: RouterOptions = { + getPubkeyRelays: (pubkey: string, mode?: RelayMode) => { + return uniq( + Repository.get() + .query([{kinds: [RELAYS], authors: [pubkey]}]) + .flatMap(event => getRelaysFromList(readList(asDecryptedEvent(event)), mode)) + ) + } +} export class Router { readonly options: RouterOptions diff --git a/packages/util/src/List.ts b/packages/util/src/List.ts index 075e486..7dfbc98 100644 --- a/packages/util/src/List.ts +++ b/packages/util/src/List.ts @@ -1,7 +1,7 @@ -import {parseJson, nthEq} from "@welshman/lib" +import {parseJson, uniq, nthEq} from "@welshman/lib" import {Address} from "./Address.js" -import {uniqTags} from "./Tags.js" -import {isRelayUrl} from "./Relay.js" +import {uniqTags, getRelayTags} from "./Tags.js" +import {isRelayUrl, normalizeRelayUrl} from "./Relay.js" import {Encryptable, DecryptedEvent} from "./Encryptable.js" import type {EncryptableUpdates} from "./Encryptable.js" @@ -88,3 +88,13 @@ export const addToListPrivately = (list: List, ...tags: string[][]) => { content: JSON.stringify(uniqTags([...list.privateTags, ...tags])), }) } + +export const getRelaysFromList = (list?: List, mode?: string): string[] => { + let tags = getRelayTags(getListTags(list)) + + if (mode) { + tags = tags.filter((t: string[]) => !t[2] || t[2] === mode) + } + + return uniq(tags.map(t => normalizeRelayUrl(t[1]))) +} diff --git a/packages/util/src/Relay.ts b/packages/util/src/Relay.ts index 1c38910..672294a 100644 --- a/packages/util/src/Relay.ts +++ b/packages/util/src/Relay.ts @@ -2,6 +2,12 @@ import {last, normalizeUrl, stripProtocol} from "@welshman/lib" // Constants and types +export enum RelayMode { + Read = "read", + Write = "write", + Inbox = "inbox", +} + export type RelayProfile = { url: string icon?: string diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c88b5aa..09a26d2 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -310,6 +310,9 @@ importers: '@welshman/lib': specifier: workspace:* version: link:../lib + '@welshman/relay': + specifier: workspace:* + version: link:../relay '@welshman/util': specifier: workspace:* version: link:../util