export function normalizeBaseUrl(url: string) { return url.trim().replace(/\/+$/, ''); } export function resolveOAuthApiBase(settings: Record, fallback = 'http://localhost:3000') { const publicApi = settings.PUBLIC_API_URL?.trim(); if (publicApi) { return normalizeBaseUrl(publicApi); } const domain = settings.PROJECT_DOMAIN?.trim(); if (domain) { if (domain.startsWith('http://') || domain.startsWith('https://')) { return normalizeBaseUrl(domain); } return `https://${domain.replace(/^\/+/, '')}`; } return normalizeBaseUrl(fallback); } export interface OAuthEndpoints { issuer: string; authorizationEndpoint: string; tokenEndpoint: string; userInfoEndpoint: string; openIdConfigurationUrl: string; jwksUrl: string; } export function buildOAuthEndpoints(apiBase: string): OAuthEndpoints { const base = normalizeBaseUrl(apiBase); return { issuer: base, authorizationEndpoint: `${base}/oauth/authorize`, tokenEndpoint: `${base}/oauth/token`, userInfoEndpoint: `${base}/oauth/userinfo`, openIdConfigurationUrl: `${base}/.well-known/openid-configuration`, jwksUrl: `${base}/.well-known/jwks.json` }; }