From 597ebddf82997d131ad46cf4a2e812e790abc881 Mon Sep 17 00:00:00 2001 From: Jon Staab Date: Thu, 10 Oct 2024 17:09:01 -0700 Subject: [PATCH] Improve relay access checks, content loading --- src/app/commands.ts | 55 +++++++++++-------- src/app/components/PeopleItem.svelte | 2 +- src/app/components/RelayDescription.svelte | 2 +- src/app/components/SpaceCheck.svelte | 2 +- src/app/components/Toast.svelte | 8 +-- src/app/state.ts | 26 ++++----- src/lib/html.ts | 1 + src/routes/+layout.svelte | 4 +- src/routes/discover/+page.svelte | 55 ++++++++++--------- src/routes/home/network/+page.svelte | 2 +- src/routes/home/people/+page.svelte | 2 +- src/routes/spaces/[nrelay]/+layout.svelte | 13 +++-- .../spaces/[nrelay]/calendar/+page.svelte | 21 +++++-- .../spaces/[nrelay]/threads/+page.svelte | 38 +++++++------ 14 files changed, 127 insertions(+), 104 deletions(-) diff --git a/src/app/commands.ts b/src/app/commands.ts index ce4bef9ca..11dff46fd 100644 --- a/src/app/commands.ts +++ b/src/app/commands.ts @@ -189,39 +189,42 @@ export const setInboxRelayPolicy = (url: string, enabled: boolean) => { // Relay access -export const requestRelayAccess = (url: string, claim = "") => - publishThunk({ +export const checkRelayAccess = async (url: string, claim = "") => { + await ctx.net.pool.get(url).ensureAuth() + + const result = await publishThunk({ event: createEvent(28934, {tags: [["claim", claim]]}), relays: [url], }) -export const attemptRelayAccess = async (url: string, claim = "") => { - const relay = await loadRelay(url) - - // Make sure the relay has a profile - if (!relay?.profile) { - return "Sorry, we weren't able to find that relay." - } - - const connection = ctx.net.pool.get(url) - - // Check connection status - await connection.ensureConnected() - - if (![ConnectionStatus.Ok, ConnectionStatus.Slow].includes(connection.meta.getStatus())) { - return `Failed to connect: "${connection.meta.getDescription()}"` - } - - // Attempt to publish a join request - const result = await requestRelayAccess(url, claim) - if (result[url].status !== PublishStatus.Success) { const message = result[url].message?.replace(/^.*: /, '') || "join request rejected" return `Failed to join relay: ${message}` } +} + +export const checkRelayProfile = async (url: string) => { + const relay = await loadRelay(url) + + if (!relay?.profile) { + return "Sorry, we weren't able to find that relay." + } +} + +export const checkRelayConnection = async (url: string) => { + const connection = ctx.net.pool.get(url) + + await connection.ensureConnected() + + if (![ConnectionStatus.Ok, ConnectionStatus.Slow].includes(connection.meta.getStatus())) { + return `Failed to connect: "${connection.meta.getDescription()}"` + } +} + +export const checkRelayAuth = async (url: string) => { + const connection = ctx.net.pool.get(url) - // Check auth status await connection.ensureAuth() if (![AuthStatus.Ok, AuthStatus.Pending].includes(connection.meta.authStatus)) { @@ -229,6 +232,12 @@ export const attemptRelayAccess = async (url: string, claim = "") => { } } +export const attemptRelayAccess = async (url: string, claim = "") => + await checkRelayProfile(url) || + await checkRelayConnection(url) || + await checkRelayAccess(url, claim) || + await checkRelayAuth(url) + // Actions export const sendWrapped = async ({ diff --git a/src/app/components/PeopleItem.svelte b/src/app/components/PeopleItem.svelte index f9ec9aca4..6493df9f5 100644 --- a/src/app/components/PeopleItem.svelte +++ b/src/app/components/PeopleItem.svelte @@ -48,7 +48,7 @@ {@const following = getPubkeyTagValues(getListTags($userFollows)).includes(pubkey)}
- diff --git a/src/app/components/Toast.svelte b/src/app/components/Toast.svelte index aabd9807a..d1a7daf3e 100644 --- a/src/app/components/Toast.svelte +++ b/src/app/components/Toast.svelte @@ -5,8 +5,8 @@ {#if $toast} {@const theme = $toast.theme || "info"} - {#key $toast.id} -
+
+ {#key $toast.id} -
- {/key} + {/key} +
{/if} diff --git a/src/app/state.ts b/src/app/state.ts index 5a259d849..5ee7d26b5 100644 --- a/src/app/state.ts +++ b/src/app/state.ts @@ -209,6 +209,16 @@ export const deriveEvent = (idOrAddress: string, hints: string[] = []) => { ) } +export const deriveEventsForUrl = (url: string, kinds: number[]) => + derived(trackerStore, $tracker => + sortBy( + e => -e.created_at, + Array.from($tracker.getIds(url)) + .map(id => repository.eventsById.get(id)!) + .filter(e => kinds.includes(e?.kind)), + ) + ) + // Membership export const getMembershipUrls = (list?: List) => sort(getRelayTagValues(getListTags(list))) @@ -375,22 +385,6 @@ export const chatSearch = derived(chats, $chats => }), ) -// Calendar events - -export const events = deriveEvents(repository, {filters: [{kinds: [EVENT_DATE, EVENT_TIME]}]}) - -export const eventsByUrl = derived([trackerStore, events], ([$tracker, $events]) => { - const eventsByUrl = new Map() - - for (const event of $events) { - for (const url of $tracker.getRelays(event.id)) { - pushToMapKey(eventsByUrl, url, event) - } - } - - return eventsByUrl -}) - // Rooms export const roomsByUrl = derived(channels, $channels => { diff --git a/src/lib/html.ts b/src/lib/html.ts index b70ba3899..5dbcfea66 100644 --- a/src/lib/html.ts +++ b/src/lib/html.ts @@ -32,6 +32,7 @@ export const createScroller = ({ reverse = false, }: ScrollerOpts) => { let done = false + const check = async () => { // While we have empty space, fill it const {scrollY, innerHeight} = window diff --git a/src/routes/+layout.svelte b/src/routes/+layout.svelte index a0d1493aa..9c3f6ce1e 100644 --- a/src/routes/+layout.svelte +++ b/src/routes/+layout.svelte @@ -25,6 +25,8 @@ storageAdapters, tracker, } from "@welshman/app" + import * as lib from "@welshman/lib" + import * as util from "@welshman/util" import * as app from "@welshman/app" import ModalBox from "@lib/components/ModalBox.svelte" import Drawer from "@lib/components/Drawer.svelte" @@ -71,7 +73,7 @@ } onMount(async () => { - Object.assign(window, {get, ...app, ...state}) + Object.assign(window, {get, ...lib, ...util, ...app, ...state}) const getScoreEvent = () => { const ALWAYS_KEEP = Infinity diff --git a/src/routes/discover/+page.svelte b/src/routes/discover/+page.svelte index acd5c7472..b62d685be 100644 --- a/src/routes/discover/+page.svelte +++ b/src/routes/discover/+page.svelte @@ -23,7 +23,7 @@ onMount(() => { const sub = discoverRelays() const scroller = createScroller({ - element: element.closest(".max-h-screen")!, + element: element.closest(".overflow-auto")!, onScroll: () => { limit += 20 }, @@ -54,36 +54,37 @@ idKey="url" let:item={relay}>
diff --git a/src/routes/home/network/+page.svelte b/src/routes/home/network/+page.svelte index 3843c46b8..87a1fc90e 100644 --- a/src/routes/home/network/+page.svelte +++ b/src/routes/home/network/+page.svelte @@ -56,7 +56,7 @@ load({filters: [notesFilter, reactionsFilter], timeout: 30_000}) const scroller = createScroller({ - element: element.closest(".max-h-screen")!, + element: element.closest(".overflow-auto")!, onScroll: () => { const seen = new Set(events.map(e => e.id)) const eligible = sortBy( diff --git a/src/routes/home/people/+page.svelte b/src/routes/home/people/+page.svelte index 1ad961b2a..e8b4d0e84 100644 --- a/src/routes/home/people/+page.svelte +++ b/src/routes/home/people/+page.svelte @@ -18,7 +18,7 @@ onMount(() => { const scroller = createScroller({ - element: element.closest(".max-h-screen")!, + element: element.closest(".overflow-auto")!, onScroll: () => { limit += 10 }, diff --git a/src/routes/spaces/[nrelay]/+layout.svelte b/src/routes/spaces/[nrelay]/+layout.svelte index 94bcbe4e3..1172d1b31 100644 --- a/src/routes/spaces/[nrelay]/+layout.svelte +++ b/src/routes/spaces/[nrelay]/+layout.svelte @@ -26,7 +26,9 @@ GENERAL, MESSAGE, } from "@app/state" + import {checkRelayConnection, checkRelayAuth} from "@app/commands" import {pushModal} from "@app/modal" + import {pushToast} from "@app/toast" import {makeSpacePath} from "@app/routes" const openMenu = () => { @@ -60,13 +62,12 @@ $: rooms = getMembershipRoomsByUrl(url, $userMembership) $: otherRooms = ($roomsByUrl.get(url) || []).filter(room => !rooms.concat(GENERAL).includes(room)) - onMount(() => { - const filter = {kinds: [NOTE, REACTION, MESSAGE, EVENT_DATE, EVENT_TIME, CLASSIFIED]} - const sub = subscribe({filters: [{...filter, since: ago(30)}]}) + onMount(async () => { + const error = await checkRelayConnection(url) || await checkRelayAuth(url) - pullConservatively({filters: [filter], relays: [url]}) - - return () => sub.close() + if (error) { + pushToast({theme: "error", message: error}) + } }) diff --git a/src/routes/spaces/[nrelay]/calendar/+page.svelte b/src/routes/spaces/[nrelay]/calendar/+page.svelte index 70f9974b4..baa7cde0f 100644 --- a/src/routes/spaces/[nrelay]/calendar/+page.svelte +++ b/src/routes/spaces/[nrelay]/calendar/+page.svelte @@ -1,8 +1,10 @@ -
+
Threads
-
- {#each events.slice(0, limit) as event (event.id)} - +
+ {#each $events.slice(0, limit) as event (event.id)} + {#if !event.tags.some(nthEq(0, "e"))} + + {/if} {/each}

{#if loading} Looking for threads... - {:else if events.length === 0} + {:else if $events.length === 0} No threads found. {/if}