From bd02fc3287987287c796edc6bab7ea038858946d Mon Sep 17 00:00:00 2001 From: fiatjaf Date: Mon, 20 Jul 2026 13:01:28 -0300 Subject: [PATCH] pass the relay URL to verifyEvent() so trusted-relay policies can be implemented. --- abstract-pool.ts | 8 +++----- abstract-relay.ts | 8 ++++---- benchmarks.ts | 3 +-- helpers.ts | 6 ------ 4 files changed, 8 insertions(+), 17 deletions(-) delete mode 100644 helpers.ts diff --git a/abstract-pool.ts b/abstract-pool.ts index e12d6fb..9b5a65c 100644 --- a/abstract-pool.ts +++ b/abstract-pool.ts @@ -8,9 +8,8 @@ import { } from './abstract-relay.ts' import { normalizeURL } from './utils.ts' -import type { Event, EventTemplate, Nostr, VerifiedEvent } from './core.ts' +import type { Event, EventTemplate, VerifiedEvent } from './core.ts' import { type Filter } from './filter.ts' -import { alwaysTrue } from './helpers.ts' import { getCountManyFilter, hllDecode, hllEncode, mergeHll, type CountManyDirective } from './nip45.ts' import { Relay } from './relay.ts' @@ -46,12 +45,11 @@ export class AbstractSimplePool { public seenOn: Map> = new Map() public trackRelays: boolean = false - public verifyEvent: Nostr['verifyEvent'] + public verifyEvent: (event: Event, url: string) => boolean public enablePing: boolean | undefined public enableReconnect: boolean public idleTimeout: number = 20000 public automaticallyAuth?: (relayURL: string) => null | ((event: EventTemplate) => Promise) - public trustedRelayURLs: Set = new Set() public onRelayConnectionFailure?: (url: string) => void public onRelayConnectionSuccess?: (url: string) => void public allowConnectingToRelay?: (url: string, operation: ['read', Filter[]] | ['write', Event]) => boolean @@ -84,7 +82,7 @@ export class AbstractSimplePool { let relay = this.relays.get(url) if (!relay) { relay = new AbstractRelay(url, { - verifyEvent: this.trustedRelayURLs.has(url) ? alwaysTrue : this.verifyEvent, + verifyEvent: this.verifyEvent, websocketImplementation: this._WebSocket, enablePing: this.enablePing, enableReconnect: this.enableReconnect, diff --git a/abstract-relay.ts b/abstract-relay.ts index b351061..81cf690 100644 --- a/abstract-relay.ts +++ b/abstract-relay.ts @@ -1,6 +1,6 @@ /* global WebSocket */ -import type { Event, EventTemplate, VerifiedEvent, Nostr, NostrEvent } from './core.ts' +import type { Event, EventTemplate, VerifiedEvent, NostrEvent } from './core.ts' import { matchFilters, type Filter } from './filter.ts' import { getHex64, getSubscriptionId } from './fakejson.ts' import { normalizeURL } from './utils.ts' @@ -12,7 +12,7 @@ type RelayWebSocket = WebSocket & { } export type AbstractRelayConstructorOptions = { - verifyEvent: Nostr['verifyEvent'] + verifyEvent: (event: Event, url: string) => boolean websocketImplementation?: typeof WebSocket enablePing?: boolean enableReconnect?: boolean @@ -58,7 +58,7 @@ export class AbstractRelay { private challenge: string | undefined private authPromise: Promise | undefined private serial: number = 0 - private verifyEvent: Nostr['verifyEvent'] + private verifyEvent: (event: Event, url: string) => boolean private _WebSocket: typeof WebSocket @@ -485,7 +485,7 @@ export class AbstractRelay { case 'EVENT': { const so = this.openSubs.get(data[1] as string) as Subscription const event = data[2] as NostrEvent - if (this.verifyEvent(event) && matchFilters(so.filters, event)) { + if (matchFilters(so.filters, event) && this.verifyEvent(event, this.url)) { so.onevent(event) } else { so.oninvalidevent?.(event) diff --git a/benchmarks.ts b/benchmarks.ts index d76a634..d7e2e66 100644 --- a/benchmarks.ts +++ b/benchmarks.ts @@ -5,7 +5,6 @@ import { finalizeEvent, generateSecretKey } from './pure.ts' import { setNostrWasm, verifyEvent } from './wasm.ts' import { AbstractRelay } from './abstract-relay.ts' import { Relay as PureRelay } from './relay.ts' -import { alwaysTrue } from './helpers.ts' // benchmarking relay reads with verifyEvent const EVENTS = 200 @@ -28,7 +27,7 @@ for (let i = 0; i < EVENTS; i++) { setNostrWasm(await initNostrWasm()) const pureRelay = new PureRelay('wss://pure.com/') -const trustedRelay = new AbstractRelay('wss://trusted.com/', { verifyEvent: alwaysTrue }) +const trustedRelay = new AbstractRelay('wss://trusted.com/', { verifyEvent: () => true }) const wasmRelay = new AbstractRelay('wss://wasm.com/', { verifyEvent }) const runWith = (relay: AbstractRelay) => async () => { diff --git a/helpers.ts b/helpers.ts deleted file mode 100644 index b509c79..0000000 --- a/helpers.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { verifiedSymbol, type Event, type Nostr, VerifiedEvent } from './core.ts' - -export const alwaysTrue: Nostr['verifyEvent'] = (t: Event): t is VerifiedEvent => { - t[verifiedSymbol] = true - return true -}