import { instanceUrl } from "./transport" type Settings = { API_BASE_URL?: string; ENCRYPTION_KEY?: string; FEDEO_PUBLIC_URL?: string; FEDEO_FEDERATION_URL?: string; FEDEO_FEDERATION_ENABLED?: string; } /** Existing deployment settings are sufficient; extra URLs are optional overrides. */ export function collaborationConfig(settings: Settings) { const configuredApi = settings.API_BASE_URL?.trim() || "" let apiUrl = (settings.FEDEO_FEDERATION_URL?.trim() || configuredApi).replace(/\/+$/, "") let publicUrl = settings.FEDEO_PUBLIC_URL?.trim().replace(/\/+$/, "") || "" if (!publicUrl) { try { publicUrl = new URL(configuredApi || apiUrl).origin } catch { /* Local development may have no public URL. */ } } const mode = settings.FEDEO_FEDERATION_ENABLED?.trim().toLowerCase() || "auto" if (!["auto", "true", "false"].includes(mode)) throw new Error("FEDEO_FEDERATION_ENABLED muss auto, true oder false sein") if (mode === "false") return { apiUrl, publicUrl, enabled: false, disabledReason: "Die Föderation wurde vom Betreiber deaktiviert." } let disabledReason: string | undefined try { apiUrl = instanceUrl(apiUrl) } catch { disabledReason = "Föderation benötigt eine gültige öffentliche HTTPS-API_BASE_URL auf Port 443." } if (!disabledReason && !/^[a-f0-9]{64}$/i.test(settings.ENCRYPTION_KEY || "")) { disabledReason = "Föderation benötigt einen gültigen ENCRYPTION_KEY mit 64 Hex-Zeichen." } if (mode === "true" && disabledReason) throw new Error(disabledReason) return { apiUrl, publicUrl, enabled: !disabledReason, disabledReason } }