import type { Event, Filter } from 'nostr-tools' import { SimplePool } from 'nostr-tools' const RELAY_URL = process.env.NEXT_PUBLIC_NOSTR_RELAY_URL ?? 'wss://relay.damus.io' /** * Subscribe to events with timeout */ export function subscribeWithTimeout( pool: SimplePool, filters: Filter[], parser: (event: Event) => T | null, timeout: number = 5000 ): Promise { return new Promise((resolve) => { const resolved = { value: false } const sub = pool.sub([RELAY_URL], filters) let timeoutId: NodeJS.Timeout | null = null const cleanup = () => { if (timeoutId) { clearTimeout(timeoutId) } sub.unsub() } const resolveOnce = (value: T | null) => { if (resolved.value) { return } resolved.value = true cleanup() resolve(value) } sub.on('event', (event: Event) => resolveOnce(parser(event))) sub.on('eose', () => resolveOnce(null)) timeoutId = setTimeout(() => resolveOnce(null), timeout) }) }