diff --git a/abstract-pool.ts b/abstract-pool.ts index fb52368..74bc8a8 100644 --- a/abstract-pool.ts +++ b/abstract-pool.ts @@ -14,14 +14,17 @@ import { alwaysTrue } from './helpers.ts' export type SubCloser = { close: (reason?: string) => void } -export type AbstractPoolConstructorOptions = AbstractRelayConstructorOptions & {} +export type AbstractPoolConstructorOptions = AbstractRelayConstructorOptions & { + // automaticallyAuth takes a relay URL and should return null + // in case that relay shouldn't be authenticated against + // or a function to sign the AUTH event template otherwise (that function may still throw in case of failure) + automaticallyAuth?: (relayURL: string) => null | ((event: EventTemplate) => Promise) +} export type SubscribeManyParams = Omit & { maxWait?: number onclose?: (reasons: string[]) => void onauth?: (event: EventTemplate) => Promise - // Deprecated: use onauth instead - doauth?: (event: EventTemplate) => Promise id?: string label?: string } @@ -34,6 +37,7 @@ export class AbstractSimplePool { public verifyEvent: Nostr['verifyEvent'] public enablePing: boolean | undefined public enableReconnect: boolean | ((filters: Filter[]) => Filter[]) | undefined + public automaticallyAuth?: (relayURL: string) => null | ((event: EventTemplate) => Promise) public trustedRelayURLs: Set = new Set() private _WebSocket?: typeof WebSocket @@ -43,6 +47,7 @@ export class AbstractSimplePool { this._WebSocket = opts.websocketImplementation this.enablePing = opts.enablePing this.enableReconnect = opts.enableReconnect + this.automaticallyAuth = opts.automaticallyAuth } async ensureRelay(url: string, params?: { connectionTimeout?: number }): Promise { @@ -64,6 +69,14 @@ export class AbstractSimplePool { if (params?.connectionTimeout) relay.connectionTimeout = params.connectionTimeout this.relays.set(url, relay) } + + if (this.automaticallyAuth) { + const authSignerFn = this.automaticallyAuth(url) + if (authSignerFn) { + relay.onauth = authSignerFn + } + } + await relay.connect() return relay @@ -77,8 +90,6 @@ export class AbstractSimplePool { } subscribe(relays: string[], filter: Filter, params: SubscribeManyParams): SubCloser { - params.onauth = params.onauth || params.doauth - const request: { url: string; filter: Filter }[] = [] for (let i = 0; i < relays.length; i++) { const url = normalizeURL(relays[i]) @@ -91,8 +102,6 @@ export class AbstractSimplePool { } subscribeMany(relays: string[], filter: Filter, params: SubscribeManyParams): SubCloser { - params.onauth = params.onauth || params.doauth - const request: { url: string; filter: Filter }[] = [] const uniqUrls: string[] = [] for (let i = 0; i < relays.length; i++) { @@ -107,8 +116,6 @@ export class AbstractSimplePool { } subscribeMap(requests: { url: string; filter: Filter }[], params: SubscribeManyParams): SubCloser { - params.onauth = params.onauth || params.doauth - const grouped = new Map() for (const req of requests) { const { url, filter } = req @@ -221,10 +228,8 @@ export class AbstractSimplePool { subscribeEose( relays: string[], filter: Filter, - params: Pick, + params: Pick, ): SubCloser { - params.onauth = params.onauth || params.doauth - const subcloser = this.subscribe(relays, filter, { ...params, oneose() { @@ -237,10 +242,8 @@ export class AbstractSimplePool { subscribeManyEose( relays: string[], filter: Filter, - params: Pick, + params: Pick, ): SubCloser { - params.onauth = params.onauth || params.doauth - const subcloser = this.subscribeMany(relays, filter, { ...params, oneose() { diff --git a/abstract-relay.ts b/abstract-relay.ts index 5246202..488820d 100644 --- a/abstract-relay.ts +++ b/abstract-relay.ts @@ -32,6 +32,7 @@ export class AbstractRelay { public onclose: (() => void) | null = null public onnotice: (msg: string) => void = msg => console.debug(`NOTICE from ${this.url}: ${msg}`) + public onauth: undefined | ((evt: EventTemplate) => Promise) public baseEoseTimeout: number = 4400 public connectionTimeout: number = 4400 @@ -338,6 +339,9 @@ export class AbstractRelay { } case 'AUTH': { this.challenge = data[1] as string + if (this.onauth) { + this.auth(this.onauth) + } return } default: {