From 2878aeec6489396d58ed86664c7703545885c1f8 Mon Sep 17 00:00:00 2001 From: Jon Staab Date: Fri, 8 Nov 2024 15:29:11 -0800 Subject: [PATCH] Optimize feeds a bit more, push local relay url up a layer to avoid opting in when we don't want it --- packages/app/src/context.ts | 6 ++++-- packages/app/src/router.ts | 12 ++++++------ packages/feeds/src/controller.ts | 9 +++++++++ packages/net/src/Subscribe.ts | 4 +++- packages/util/src/Filters.ts | 2 +- 5 files changed, 23 insertions(+), 10 deletions(-) diff --git a/packages/app/src/context.ts b/packages/app/src/context.ts index 4cd5aa7..347c594 100644 --- a/packages/app/src/context.ts +++ b/packages/app/src/context.ts @@ -1,7 +1,7 @@ import {partition} from "@welshman/lib" import {defaultOptimizeSubscriptions, getDefaultNetContext as originalGetDefaultNetContext} from "@welshman/net" import type {Subscription, RelaysAndFilters, NetContext} from "@welshman/net" -import {WRAP, isEphemeralKind, isDVMKind, unionFilters} from "@welshman/util" +import {WRAP, LOCAL_RELAY_URL, isEphemeralKind, isDVMKind, unionFilters} from "@welshman/util" import type {TrustedEvent, StampedEvent} from "@welshman/util" import {tracker, repository} from './core' import {makeRouter, getFilterSelections} from './router' @@ -38,8 +38,10 @@ export const getDefaultNetContext = (overrides: Partial = {}) => ({ const filters = unionFilters(withoutRelays.flatMap(sub => sub.request.filters)) const selections: RelaysAndFilters[] = defaultOptimizeSubscriptions(withRelays) + selections.push({relays: [LOCAL_RELAY_URL], filters}) + if (filters.length > 0) { - for (const selection of getFilterSelections(filters)) { + for (const selection of getFilterSelections(filters)) { selections.push(selection) } } diff --git a/packages/app/src/router.ts b/packages/app/src/router.ts index 9a1326e..aa96c45 100644 --- a/packages/app/src/router.ts +++ b/packages/app/src/router.ts @@ -25,10 +25,10 @@ import { RELAYS, INBOX_RELAYS, FOLLOWS, - LOCAL_RELAY_URL, WRAP, getAncestorTags, - getPubkeyTagValues + getPubkeyTagValues, + normalizeRelayUrl, } from "@welshman/util" import type {TrustedEvent, Filter} from "@welshman/util" import type {RelaysAndFilters} from "@welshman/net" @@ -103,7 +103,8 @@ export type Selection = { relays: string[], } -const makeSelection = (relays: string[], weight = 1): Selection => ({relays, weight}) +const makeSelection = (relays: string[], weight = 1): Selection => + ({relays: relays.map(normalizeRelayUrl), weight}) // Fallback policies @@ -427,7 +428,7 @@ export const defaultFilterSelectionRules = [ export const getFilterSelections = ( filters: Filter[], - rules: FilterSelectionRule[] = defaultFilterSelectionRules + rules: FilterSelectionRule[] = defaultFilterSelectionRules ): RelaysAndFilters[] => { const filtersById = new Map() const scenariosById = new Map() @@ -445,9 +446,8 @@ export const getFilterSelections = ( for (const [id, filter] of filtersById.entries()) { const scenario = ctx.app.router.merge(scenariosById.get(id) || []) - const relays = scenario.getUrls().concat(LOCAL_RELAY_URL) - result.push({filters: [filter], relays}) + result.push({filters: [filter], relays: scenario.getUrls()}) } return result diff --git a/packages/feeds/src/controller.ts b/packages/feeds/src/controller.ts index e4d6b94..6730864 100644 --- a/packages/feeds/src/controller.ts +++ b/packages/feeds/src/controller.ts @@ -81,11 +81,18 @@ export class FeedController { const minSince = sinces.length === filters.length ? min(sinces) : EPOCH const initialDelta = guessFilterDelta(filters) + let loading = false let delta = initialDelta let since = useWindowing ? maxUntil - delta : minSince let until = maxUntil return async (limit: number) => { + if (loading) { + return + } + + loading = true + const requestFilters = filters! // Remove filters that don't fit our window .filter((filter: Filter) => { @@ -129,6 +136,8 @@ export class FeedController { } else if (count === 0) { onExhausted?.() } + + loading = false } } diff --git a/packages/net/src/Subscribe.ts b/packages/net/src/Subscribe.ts index 43f046b..2b97f60 100644 --- a/packages/net/src/Subscribe.ts +++ b/packages/net/src/Subscribe.ts @@ -166,7 +166,9 @@ export const optimizeSubscriptions = (subs: Subscription[]) => { mergedSub.emitter.on(SubscriptionEvent.Event, (url: string, event: TrustedEvent) => { for (const sub of group) { - if (!sub.tracker.track(event.id, url) && matchFilters(sub.request.filters, event)) { + const seen = sub.tracker.track(event.id, url) + + if (!seen && matchFilters(sub.request.filters, event)) { sub.emitter.emit(SubscriptionEvent.Event, url, event) } } diff --git a/packages/util/src/Filters.ts b/packages/util/src/Filters.ts index edc35c1..490be0c 100644 --- a/packages/util/src/Filters.ts +++ b/packages/util/src/Filters.ts @@ -226,7 +226,7 @@ export const getFilterGenerality = (filter: Filter) => { return 1 } -export const guessFilterDelta = (filters: Filter[], max = 60 * 60 * 24 * 7) => +export const guessFilterDelta = (filters: Filter[], max = 60 * 60 * 24) => Math.round(max * Math.max(0.01, 1 - avg(filters.map(getFilterGenerality)))) // If a filter is specifying ids, we know how many results to expect