import { unprocessable } from "../errors.js"; const PROBE_CACHE_MAX_ENTRIES = 1024; /** * Process-lifetime cache of Gitea/Forgejo probe results. * Keyed by lowercased hostname. Positive and negative results are both cached * to avoid re-probing the same host on every import. FIFO-evicted at * PROBE_CACHE_MAX_ENTRIES to bound memory. */ export const giteaHostProbeCache = new Map(); function evictProbeCacheIfFull() { if (giteaHostProbeCache.size > PROBE_CACHE_MAX_ENTRIES) { const oldestKey = giteaHostProbeCache.keys().next().value; if (oldestKey !== undefined) giteaHostProbeCache.delete(oldestKey); } } export function setGiteaHostProbe(hostname: string, isGitea: boolean) { giteaHostProbeCache.set(hostname.toLowerCase(), isGitea); evictProbeCacheIfFull(); } export function getGiteaHostProbe(hostname: string): boolean | undefined { return giteaHostProbeCache.get(hostname.toLowerCase()); } /** * Gitea/Forgejo API base. There is no dotcom short-circuit — every host uses * the same /api/v1 path, including the public gitea.com instance. */ export function giteaApiBase(hostname: string) { return `https://${hostname}/api/v1`; } /** * Canonical raw-content URL for Gitea/Forgejo ≥ 1.18. * Modern format: `https://{host}/{owner}/{repo}/raw/branch/{ref}/{path}`. */ export function resolveRawGiteaUrl( hostname: string, owner: string, repo: string, ref: string, filePath: string, ) { const p = filePath.replace(/^\/+/, ""); return `https://${hostname}/${owner}/${repo}/raw/branch/${ref}/${p}`; } /** * Legacy raw-content URL for Gitea < 1.18 and some Forgejo setups. * Format: `https://{host}/{owner}/{repo}/raw/{ref}/{path}`. */ export function resolveRawGiteaUrlLegacy( hostname: string, owner: string, repo: string, ref: string, filePath: string, ) { const p = filePath.replace(/^\/+/, ""); return `https://${hostname}/${owner}/${repo}/raw/${ref}/${p}`; } export async function giteaFetch(url: string, init?: RequestInit): Promise { try { return await fetch(url, init); } catch { throw unprocessable( `Could not connect to ${new URL(url).hostname} — ensure the URL points to a Gitea/Forgejo instance`, ); } }