From 6b39de04d7e834dfd4776fdf8245e3c3c05f7689 Mon Sep 17 00:00:00 2001 From: codytseng Date: Mon, 17 Mar 2025 22:25:35 +0800 Subject: [PATCH] Fix auth() not returning on consecutive calls --- abstract-relay.ts | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/abstract-relay.ts b/abstract-relay.ts index 031f422..322ba6b 100644 --- a/abstract-relay.ts +++ b/abstract-relay.ts @@ -35,6 +35,7 @@ export class AbstractRelay { private incomingMessageQueue = new Queue() private queueRunning = false private challenge: string | undefined + private authPromise: Promise | undefined private serial: number = 0 private verifyEvent: Nostr['verifyEvent'] @@ -77,6 +78,7 @@ export class AbstractRelay { if (this.connectionPromise) return this.connectionPromise this.challenge = undefined + this.authPromise = undefined this.connectionPromise = new Promise((resolve, reject) => { this.connectionTimeoutHandle = setTimeout(() => { reject('connection timed out') @@ -220,6 +222,7 @@ export class AbstractRelay { return case 'AUTH': { this.challenge = data[1] as string + this.authPromise = undefined this._onauth?.(data[1] as string) return } @@ -239,8 +242,9 @@ export class AbstractRelay { public async auth(signAuthEvent: (evt: EventTemplate) => Promise): Promise { if (!this.challenge) throw new Error("can't perform auth, no challenge was received") + if (this.authPromise) return this.authPromise const evt = await signAuthEvent(makeAuthEvent(this.url, this.challenge)) - const ret = new Promise((resolve, reject) => { + this.authPromise = new Promise((resolve, reject) => { const timeout = setTimeout(() => { const ep = this.openEventPublishes.get(evt.id) as EventPublishResolver if (ep) { @@ -251,7 +255,7 @@ export class AbstractRelay { this.openEventPublishes.set(evt.id, { resolve, reject, timeout }) }) this.send('["AUTH",' + JSON.stringify(evt) + ']') - return ret + return this.authPromise } public async publish(event: Event): Promise {