Files
FanKarr/src/base-url.ts
T
zacharyandClaude Opus 5 804436ff70 feat: support d'un chemin de base (BASE_URL) pour reverse proxy
FanKarr supposait jusqu'ici être servi à la racine du domaine. La variable
d'environnement BASE_URL (ex. /fankarr) permet de l'héberger dans un
sous-dossier, sans reconstruire l'image : le préfixe est appliqué au démarrage.

- server/config.ts : BASE_URL normalisée et validée ('' = racine)
- server/index.ts  : toutes les routes montées sous BASE_URL via un Router,
  index.html servi avec <base href> et window.__BASE_URL__, redirection de /
- server/auth.ts   : cookie de session limité au chemin de base
- src/base-url.ts  : préfixage des appels fetch('/api/…') en un point unique,
  helpers withBase / absoluteUrl
- src/router       : createWebHistory(BASE_URL)
- vite.config.ts   : base './' (assets relatifs, résolus par <base href>)

Comportement inchangé lorsque BASE_URL n'est pas défini.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-10-03 21:57:25 +02:00

37 lines
1.5 KiB
TypeScript

// ── Chemin de base (reverse proxy en sous-dossier) ─────────────
// Injecté par le serveur dans index.html (cf. server/index.ts) : l'application
// suit le préfixe du reverse proxy sans rebuild. Vide en développement, où Vite
// sert l'application à la racine.
declare global {
interface Window { __BASE_URL__?: string }
}
export const BASE_URL: string = window.__BASE_URL__ ?? ''
// Préfixe un chemin absolu de l'application ('/api/...', '/invite/...')
export function withBase(path: string): string {
return path.startsWith('/') ? `${BASE_URL}${path}` : path
}
// URL absolue affichable (lien d'invitation, adresse de l'API publique)
export function absoluteUrl(path: string): string {
return `${window.location.origin}${withBase(path)}`
}
// Les quelque 140 appels `fetch('/api/…')` du code applicatif sont préfixés ici
// plutôt qu'un par un : un seul endroit à maintenir, et les nouveaux appels en
// bénéficient automatiquement. Les URL absolues (api.github.com, clients
// torrent distants) et les chemins ne visant pas l'API ne sont pas touchés.
export function installFetchBasePrefix(): void {
if (!BASE_URL) return
const nativeFetch = window.fetch.bind(window)
window.fetch = (input: RequestInfo | URL, init?: RequestInit) => {
if (typeof input === 'string' && input.startsWith('/api/')) {
return nativeFetch(BASE_URL + input, init)
}
return nativeFetch(input, init)
}
}