Files
playwish/server/app/static/turnstile.js
T
99admandClaude Opus 5.5 fc15f2b933 Umbenennung: Audiofy heißt jetzt Playwish
Name, Seitentitel, Dienste (playwish-web, playwish-controller), Dienst-Benutzer
(playwish), Pfade (/opt/playwish, /usr/local/src/playwish), Vorlagen und
Repository-Adresse. „Audiofy“ war bereits von mehreren Produkten belegt.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-17 20:27:59 +01:00

74 lines
2.5 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// Playwish – Cloudflare Turnstile (Bot-Schutz). Lädt das Widget nur, wenn der Server einen Site-Key liefert.
"use strict";
window.PlaywishTurnstile = (() => {
let ladeVersprechen = null;
function skriptLaden() {
if (!ladeVersprechen) {
ladeVersprechen = new Promise((fertig, fehler) => {
const s = document.createElement("script");
s.src = "https://challenges.cloudflare.com/turnstile/v0/api.js?render=explicit";
s.async = true;
s.onload = () => fertig(window.turnstile);
s.onerror = () => fehler(new Error("Turnstile konnte nicht geladen werden"));
document.head.append(s);
});
}
return ladeVersprechen;
}
const LEER = { token: async () => null, reset() {}, bereit: () => true };
// Liefert {token(): Promise<string|null>, reset(), bereit()} – ohne Site-Key ein "leerer" Schutz.
async function einrichten(container, aktion) {
// Site-Key und Cloudflare-Skript gleichzeitig holen (spart einen Umlauf)
const skript = skriptLaden().catch(() => null);
let siteKey = null;
try {
siteKey = (await (await fetch("/api/turnstile", { credentials: "same-origin" })).json()).site_key;
} catch (_) { /* ohne Site-Key weiter */ }
if (!siteKey) return LEER;
let aktuell = null;
let warten = [];
const melden = (wert) => { aktuell = wert; warten.forEach((f) => f(wert)); warten = []; };
let ts = null;
let id = null;
try {
ts = await skript;
if (!ts) return LEER; // Skript nicht ladbar → Server entscheidet
id = ts.render(container, {
sitekey: siteKey,
action: aktion,
appearance: "interaction-only", // nur sichtbar, wenn Cloudflare eine Bestätigung braucht
language: "de",
callback: (t) => melden(t),
"expired-callback": () => { aktuell = null; },
"error-callback": () => { melden(null); },
});
} catch (_) {
return LEER; // Server entscheidet dann
}
return {
bereit: () => !!aktuell,
// wartet bis zu 15 s auf ein Token
token() {
if (aktuell) return Promise.resolve(aktuell);
return new Promise((fertig) => {
warten.push(fertig);
setTimeout(() => fertig(null), 15000);
});
},
// jedes Token gilt nur einmal → nach jeder Anfrage ein neues holen
reset() {
aktuell = null;
try { ts.reset(id); } catch (_) { /* egal */ }
},
};
}
return { einrichten };
})();