import type { Event } from 'nostr-tools' import { SimplePool } from 'nostr-tools' import type { Article } from '@/types/nostr' import { parseArticleFromEvent } from './nostrEventParsing' const RELAY_URL = process.env.NEXT_PUBLIC_NOSTR_RELAY_URL || 'wss://relay.damus.io' /** * Subscribe to events with timeout */ export async function subscribeWithTimeout( pool: SimplePool, filters: any[], 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() } sub.on('event', (event: Event) => { if (resolved.value) return resolved.value = true const result = parser(event) cleanup() resolve(result) }) sub.on('eose', () => { if (resolved.value) return resolved.value = true cleanup() resolve(null) }) timeoutId = setTimeout(() => { if (!resolved.value) { resolved.value = true cleanup() resolve(null) } }, timeout) }) }