const LOCAL_EXPLORER_API_FALLBACK = 'http://localhost:8080' function normalizeApiBase(value: string | null | undefined): string { return (value || '').trim().replace(/\/$/, '') } function preferBrowserOriginForSameHost(explicitBase: string, browserOrigin: string): string { if (!explicitBase || !browserOrigin) return explicitBase try { const explicitUrl = new URL(explicitBase) const browserUrl = new URL(browserOrigin) if (explicitUrl.hostname === browserUrl.hostname && explicitUrl.protocol !== browserUrl.protocol) { return browserOrigin } } catch { return explicitBase } return explicitBase } export function resolveExplorerApiBase(options: { envValue?: string | null browserOrigin?: string | null serverFallback?: string } = {}): string { const explicitBase = normalizeApiBase(options.envValue ?? process.env.NEXT_PUBLIC_API_URL ?? '') const browserOrigin = normalizeApiBase( options.browserOrigin ?? (typeof window !== 'undefined' ? window.location.origin : '') ) if (explicitBase) { return preferBrowserOriginForSameHost(explicitBase, browserOrigin) } if (browserOrigin) { return browserOrigin } return normalizeApiBase(options.serverFallback ?? LOCAL_EXPLORER_API_FALLBACK) }