2026-04-05 01:23:25 -07:00
|
|
|
const LOCAL_EXPLORER_API_FALLBACK = 'http://localhost:8080'
|
|
|
|
|
|
|
|
|
|
function normalizeApiBase(value: string | null | undefined): string {
|
|
|
|
|
return (value || '').trim().replace(/\/$/, '')
|
|
|
|
|
}
|
|
|
|
|
|
2026-05-22 17:58:27 -07:00
|
|
|
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
|
|
|
|
|
}
|
|
|
|
|
|
2026-04-05 01:23:25 -07:00
|
|
|
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 : '')
|
|
|
|
|
)
|
2026-05-22 17:58:27 -07:00
|
|
|
if (explicitBase) {
|
|
|
|
|
return preferBrowserOriginForSameHost(explicitBase, browserOrigin)
|
|
|
|
|
}
|
|
|
|
|
|
2026-04-05 01:23:25 -07:00
|
|
|
if (browserOrigin) {
|
|
|
|
|
return browserOrigin
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return normalizeApiBase(options.serverFallback ?? LOCAL_EXPLORER_API_FALLBACK)
|
|
|
|
|
}
|