Source

classes/captcha.ts

import Config from "./config";

interface TokenValidateResponse {
    "error-codes": string[];
    success: boolean;
    action: string;
    cdata: string;
}

/**
 * Validates captcha code
 * @param {string} token
 * @return {Promise<{ success: boolean, error: string? }>}
 */
export async function validateCaptcha(token: string) {
    const response = await fetch(
        "https://challenges.cloudflare.com/turnstile/v0/siteverify",
        {
            method: "POST",
            headers: {
                "content-type": "application/json"
            },
            body: JSON.stringify({
                response: token,
                secret: Config.captcha.secret
            })
        }
    );

    const data: TokenValidateResponse = await response.json();

    return {
        // Return the status
        success: data.success,

        // Return the first error if it exists
        error: data["error-codes"]?.length ? data["error-codes"][0] : null
    };
}