Optimize feeds a bit more, push local relay url up a layer to avoid opting in when we don't want it

This commit is contained in:
Jon Staab
2024-11-08 15:29:11 -08:00
parent 07b439eef2
commit 2878aeec64
5 changed files with 23 additions and 10 deletions
+4 -2
View File
@@ -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<NetContext> = {}) => ({
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)
}
}
+6 -6
View File
@@ -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<string, Filter>()
const scenariosById = new Map<string, RouterScenario[]>()
@@ -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
+9
View File
@@ -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
}
}
+3 -1
View File
@@ -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)
}
}
+1 -1
View File
@@ -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