From 40c02cdac7c46fa0067613c5fc1d4848d75a26a6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alejandro=20G=C3=B3mez?= Date: Fri, 20 Mar 2026 10:44:14 +0100 Subject: [PATCH] fix: track all auth events, avoid race condition --- src/services/event-log.ts | 64 ++++++++++++++++++++------------------- 1 file changed, 33 insertions(+), 31 deletions(-) diff --git a/src/services/event-log.ts b/src/services/event-log.ts index 3f980f7..f2f2b45 100644 --- a/src/services/event-log.ts +++ b/src/services/event-log.ts @@ -20,6 +20,7 @@ import publishService, { type RelayStatusUpdate, } from "./publish-service"; import pool from "./relay-pool"; +import relayAuthManager from "./relay-auth"; import type { IRelay } from "applesauce-relay"; // ============================================================================ @@ -209,6 +210,38 @@ class EventLogService { } }); }, RELAY_POLL_INTERVAL); + + // Monitor auth state transitions via centralized manager + this.subscriptions.push( + relayAuthManager.states$ + .pipe(pairwise()) + .subscribe(([prevMap, currMap]) => { + for (const [url, currState] of currMap) { + const prevState = prevMap.get(url); + const prevStatus = prevState?.status ?? "none"; + + if (currState.status === prevStatus) continue; + + if (currState.status === "authenticated") { + this.addEntry({ type: "AUTH", relay: url, status: "success" }); + } else if (currState.status === "failed") { + this.addEntry({ type: "AUTH", relay: url, status: "failed" }); + } else if (currState.status === "rejected") { + this.addEntry({ type: "AUTH", relay: url, status: "rejected" }); + } else if ( + currState.status === "challenge_received" && + currState.challenge + ) { + this.addEntry({ + type: "AUTH", + relay: url, + status: "challenge", + challenge: currState.challenge, + }); + } + } + }), + ); } /** @@ -270,37 +303,6 @@ class EventLogService { }), ); - // Track authentication events - subscription.add( - relay.authenticated$ - .pipe( - startWith(relay.authenticated), - pairwise(), - filter(([prev, curr]) => prev !== curr && curr === true), - ) - .subscribe(() => { - this.addEntry({ - type: "AUTH", - relay: url, - status: "success", - }); - }), - ); - - // Track challenges - subscription.add( - relay.challenge$ - .pipe(filter((challenge): challenge is string => !!challenge)) - .subscribe((challenge) => { - this.addEntry({ - type: "AUTH", - relay: url, - status: "challenge", - challenge, - }); - }), - ); - // Track notices — deduplicate per relay subscription.add( relay.notice$.subscribe((notice) => {