"""Runtime config the frontend reads from /features to follow --comfy-api-base. For a non-prod comfy.org backend (staging or an ephemeral preview env), "/features" exposes the api and platform base so the frontend talks to it without a rebuild; the frontend picks the Firebase project from the api base. Prod bases are left alone and keep their build-time defaults. """ from typing import Any from urllib.parse import urlparse from comfy.cli_args import args # Staging and the ephemeral preview envs ("testenvs") are one tier: same dev Firebase project and platform. _STAGING_API_HOST = "stagingapi.comfy.org" _TESTENV_HOST_SUFFIX = ".testenvs.comfy.org" _STAGING_PLATFORM_BASE_URL = "https://stagingplatform.comfy.org" def _is_staging_tier(host: str) -> bool: return host == _STAGING_API_HOST or host.endswith(_TESTENV_HOST_SUFFIX) def normalize_comfy_api_base(url: str) -> str: """Rewrite a testenv's friendly main host to its comfy-api '-registry' sibling.""" parsed = urlparse(url) host = parsed.hostname or "" if not host.endswith(_TESTENV_HOST_SUFFIX): return url label = host[: -len(_TESTENV_HOST_SUFFIX)] if label.endswith("-registry"): return url return f"{parsed.scheme or 'https'}://{label}-registry{_TESTENV_HOST_SUFFIX}" def frontend_config_for_base(base_url: str) -> dict[str, Any] | None: """The /features overrides for a staging-tier base, or None for prod.""" if not _is_staging_tier(urlparse(base_url).hostname or ""): return None return { "comfy_api_base_url": normalize_comfy_api_base(base_url).rstrip("/"), "comfy_platform_base_url": _STAGING_PLATFORM_BASE_URL, } def get_frontend_config() -> dict[str, Any] | None: return frontend_config_for_base(getattr(args, "comfy_api_base", "") or "")