/** * env.ts * Wo das Spiel läuft (Issue #68): auf der eigenen Domain (/play/) oder als eigenständige Fassung (itch.io, Desktop, * Apps – Vite-Modus „portable“, gebaut von scripts/build-portable.mjs). Alles, was davon abhängt, geht hier durch: * Server-Adresse für API und WebSocket, Pfade zu Sprites und Musik, Links auf Website, Leitfaden und Feedback. */ /** Eigenständige Fassung statt der eigenen Domain */ export const PORTABLE = import.meta.env.MODE === 'portable'; /** Server der Online-Funktionen; leer = gleiche Herkunft (Web) */ export const API_ORIGIN = PORTABLE ? __API_ORIGIN__ : ''; /** Öffentliche Seite (Website, Leitfaden, Roadmap, Feedback, Rechtliches) – im Web relativ, sonst absolut */ export function siteUrl(path: string): string { return PORTABLE ? __API_ORIGIN__ + path : path; } /** Datei aus public/ (Sprites, Musik): im Web ab der Wurzel, eigenständig relativ zur Seite */ export function assetUrl(path: string): string { return import.meta.env.BASE_URL + path.replace(/^\//, ''); } /** * Unterprotokolle des WebSockets: die eigenständige Fassung meldet sich mit ihrem Token an (Issue #69) – ein * Browser-WebSocket kann keine eigenen Kopfzeilen schicken. Web: keine (Cookie). */ export function wsProtocols(token: string | null): string[] | undefined { return PORTABLE && token ? ['ninelands', `auth.${token}`] : undefined; } /** WebSocket der Online-Duelle und der Freunde-Lobby */ export function wsUrl(path: string): string { if (PORTABLE) return __API_ORIGIN__.replace(/^http/, 'ws') + path; return `${location.protocol === 'https:' ? 'wss' : 'ws'}://${location.host}${path}`; } /** Grundlage für Teilen- und Einladungslinks: immer das Spiel auf der eigenen Domain */ export function gameUrl(): string { return PORTABLE ? `${__API_ORIGIN__}/play/` : location.href; }