diff --git a/package-lock.json b/package-lock.json index 95e0f71..ed96156 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6422,9 +6422,9 @@ } }, "node_modules/svelte": { - "version": "5.37.2", - "resolved": "https://registry.npmjs.org/svelte/-/svelte-5.37.2.tgz", - "integrity": "sha512-SAakJiy04/OvXRAUnGxRACGzw6GB9kmxYIjuMO/zTcTL6psqc54Y0O/yR6I3OLqFqn79EPd23qsCGkKozvYYbQ==", + "version": "5.37.3", + "resolved": "https://registry.npmjs.org/svelte/-/svelte-5.37.3.tgz", + "integrity": "sha512-7t/ejshehHd+95z3Z7ebS7wsqHDQxi/8nBTuTRwpMgNegfRBfuitCSKTUDKIBOExqfT2+DhQ2VLG8Xn+cBXoaQ==", "dev": true, "license": "MIT", "dependencies": { diff --git a/src/lib/utils/websocket_utils.ts b/src/lib/utils/websocket_utils.ts index ab6ef5b..c95001e 100644 --- a/src/lib/utils/websocket_utils.ts +++ b/src/lib/utils/websocket_utils.ts @@ -1,6 +1,8 @@ import { WebSocketPool } from "../data_structures/websocket_pool.ts"; import { error } from "@sveltejs/kit"; import { naddrDecode, neventDecode } from "../utils.ts"; +import { activeInboxRelays, activeOutboxRelays } from "../ndk.ts"; +import { get } from "svelte/store"; export interface NostrEvent { id: string; @@ -25,8 +27,9 @@ export interface NostrFilter { type ResolveCallback = (value: T | PromiseLike) => void; type RejectCallback = (reason?: any) => void; type EventHandler = (ev: Event) => void; +type MessageEventHandler = (ev: MessageEvent) => void; type EventHandlerReject = (reject: RejectCallback) => EventHandler; -type EventHandlerResolve = (resolve: ResolveCallback) => EventHandlerReject; +type EventHandlerResolve = (resolve: ResolveCallback) => (reject: RejectCallback) => MessageEventHandler; function handleMessage( ev: MessageEvent, @@ -67,14 +70,31 @@ function handleError( } export async function fetchNostrEvent(filter: NostrFilter): Promise { - // TODO: Improve relay selection when relay management is implemented. - const ws = await WebSocketPool.instance.acquire("wss://thecitadel.nostr1.com"); + // AI-NOTE: Updated to use active relay stores instead of hardcoded relay URL + // This ensures the function uses the user's configured relays and can find events + // across multiple relays rather than being limited to a single hardcoded relay. + + // Get available relays from the active relay stores + const inboxRelays = get(activeInboxRelays); + const outboxRelays = get(activeOutboxRelays); + + // Combine all available relays, prioritizing inbox relays + const availableRelays = [...inboxRelays, ...outboxRelays]; + + if (availableRelays.length === 0) { + throw new Error("[WebSocket Utils]: No relays available for fetching events"); + } + + // Select a relay - prefer inbox relays if available, otherwise use any available relay + const selectedRelay = inboxRelays.length > 0 ? inboxRelays[0] : availableRelays[0]; + + const ws = await WebSocketPool.instance.acquire(selectedRelay); const subId = crypto.randomUUID(); // AI-NOTE: Currying is used here to abstract the internal handler logic away from the WebSocket // handling logic. The message and error handlers themselves can be refactored without affecting // the WebSocket handling logic. - const curriedMessageHandler: (subId: string) => EventHandlerResolve = + const curriedMessageHandler: (subId: string) => (resolve: ResolveCallback) => (reject: RejectCallback) => MessageEventHandler = (subId) => (resolve) => (reject) => @@ -87,7 +107,7 @@ export async function fetchNostrEvent(filter: NostrFilter): Promise // AI-NOTE: These variables store references to partially-applied handlers so that the `finally` // block receives the correct references to clean up the listeners. - let messageHandler: EventHandler; + let messageHandler: MessageEventHandler; let errorHandler: EventHandler; const res = new Promise((resolve, reject) => { diff --git a/tests/e2e/my_notes_layout.pw.spec.ts b/tests/e2e/my_notes_layout.pw.spec.ts index 0a17d75..23db168 100644 --- a/tests/e2e/my_notes_layout.pw.spec.ts +++ b/tests/e2e/my_notes_layout.pw.spec.ts @@ -1,8 +1,8 @@ -import { test, expect } from '@playwright/test'; +import { test, expect, type Page } from '@playwright/test'; // Utility to check for horizontal scroll bar -async function hasHorizontalScroll(page, selector) { - return await page.evaluate((sel) => { +async function hasHorizontalScroll(page: Page, selector: string) { + return await page.evaluate((sel: string) => { const el = document.querySelector(sel); if (!el) return false; return el.scrollWidth > el.clientWidth;