/** * Configuration for Nostr services * Handles environment variables and defaults */ const DEFAULT_RELAYS = [ 'wss://theforest.nostr1.com', 'wss://thecitadel.nostr1.com', 'wss://nostr.land' ]; const PROFILE_RELAYS = [ 'wss://relay.damus.io', 'wss://aggr.nostr.land', 'wss://profiles.nostr1.com', 'wss://relay.primal.net', 'wss://nostr.wine', 'wss://nostr21.com' ]; const THREAD_PUBLISH_RELAYS = [ 'wss://thecitadel.nostr1.com' ]; const GIF_RELAYS = [ "wss://relay.damus.io", "wss://relay.primal.net", "wss://relay.gifbuddy.lol", "wss://thecitadel.nostr1.com" ]; const RELAY_TIMEOUT = 10000; // Fetch limits const FEED_LIMIT = 100; // Standard limit for feed events per kind const SINGLE_EVENT_LIMIT = 1; // For fetching a single event const SMALL_BATCH_LIMIT = 20; // For small batches (interactions, etc.) const MEDIUM_BATCH_LIMIT = 50; // For medium batches const LARGE_BATCH_LIMIT = 200; // For large batches (comments, etc.) const VERY_LARGE_BATCH_LIMIT = 500; // For very large batches // Fetch timeouts (in milliseconds) const SHORT_TIMEOUT = 2000; // Short timeout for cache-heavy operations const STANDARD_TIMEOUT = 3000; // Standard timeout for most operations const MEDIUM_TIMEOUT = 5000; // Medium timeout for profile/standard operations const LONG_TIMEOUT = 10000; // Long timeout for important operations const SINGLE_RELAY_TIMEOUT = 15000; // Timeout for single relay operations export interface NostrConfig { defaultRelays: string[]; profileRelays: string[]; threadTimeoutDays: number; threadPublishRelays: string[]; relayTimeout: number; gifRelays: string[]; // Fetch limits feedLimit: number; singleEventLimit: number; smallBatchLimit: number; mediumBatchLimit: number; largeBatchLimit: number; veryLargeBatchLimit: number; // Fetch timeouts shortTimeout: number; standardTimeout: number; mediumTimeout: number; longTimeout: number; singleRelayTimeout: number; } function parseRelays(envVar: string | undefined, fallback: string[]): string[] { if (!envVar) return fallback; const relays = envVar .split(',') .map((r) => r.trim()) .filter((r) => r.length > 0); return relays.length > 0 ? relays : fallback; } function parseIntEnv(envVar: string | undefined, fallback: number, min: number = 0): number { if (!envVar) return fallback; const parsed = parseInt(envVar, 10); if (isNaN(parsed) || parsed < min) return fallback; return parsed; } export function getConfig(): NostrConfig { return { defaultRelays: parseRelays(import.meta.env.VITE_DEFAULT_RELAYS, DEFAULT_RELAYS), profileRelays: PROFILE_RELAYS, threadTimeoutDays: parseIntEnv(import.meta.env.VITE_THREAD_TIMEOUT_DAYS, 30), threadPublishRelays: THREAD_PUBLISH_RELAYS, relayTimeout: RELAY_TIMEOUT, gifRelays: GIF_RELAYS, // Fetch limits feedLimit: parseIntEnv(import.meta.env.VITE_FEED_LIMIT, FEED_LIMIT, 1), singleEventLimit: SINGLE_EVENT_LIMIT, smallBatchLimit: SMALL_BATCH_LIMIT, mediumBatchLimit: MEDIUM_BATCH_LIMIT, largeBatchLimit: LARGE_BATCH_LIMIT, veryLargeBatchLimit: VERY_LARGE_BATCH_LIMIT, // Fetch timeouts shortTimeout: SHORT_TIMEOUT, standardTimeout: STANDARD_TIMEOUT, mediumTimeout: MEDIUM_TIMEOUT, longTimeout: LONG_TIMEOUT, singleRelayTimeout: SINGLE_RELAY_TIMEOUT }; } export const config = getConfig();