Ein Aufrufer darf Organisator- und Spieler-Zugang kombinieren (Authorization + X-Player-Token). Berechtigungen prüfen jetzt einzelne Merkmale statt einer Rangstufe. In der Lobby gibt es „Selbst mitspielen?“, Teamlinks funktionieren auch im Organisator-Browser. Online-Status wird direkt nach dem Beitritt aktualisiert. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
29 lines
959 B
JavaScript
29 lines
959 B
JavaScript
export class ApiError extends Error {
|
|
constructor(message, status, code) {
|
|
super(message);
|
|
this.status = status;
|
|
this.code = code;
|
|
}
|
|
}
|
|
|
|
export async function api(path, { method = 'GET', body, token, playerToken } = {}) {
|
|
let res;
|
|
try {
|
|
res = await fetch(`/api${path}`, {
|
|
method,
|
|
headers: {
|
|
...(body ? { 'content-type': 'application/json' } : {}),
|
|
...(token ? { authorization: `Bearer ${token}` } : {}),
|
|
// Zweiter Zugang: Spieler-Token des Organisators, wenn er selbst mitspielt
|
|
...(playerToken ? { 'x-player-token': playerToken } : {}),
|
|
},
|
|
body: body ? JSON.stringify(body) : undefined,
|
|
});
|
|
} catch {
|
|
throw new ApiError('Keine Verbindung zum Server. Prüfe deine Internetverbindung.', 0, 'network');
|
|
}
|
|
const data = await res.json().catch(() => ({}));
|
|
if (!res.ok) throw new ApiError(data.error ?? `Fehler ${res.status}`, res.status, data.code);
|
|
return data;
|
|
}
|