// Cloudflare Worker: reverse-proxy для Supabase // Разворачивается на api.qveryx.space (или любом поддомене на вашем Cloudflare-домене) // и прозрачно пересылает все запросы на реальный проект Supabase. // // Зачем: некоторые мобильные операторы блокируют по DNS домен *.supabase.co. // Через этот прокси клиент обращается к вашему домену (не заблокирован), // а Worker уже сам стучится в Supabase. const SUPABASE_PROJECT_HOST = "vudpaeodsuqdphxjlaje.supabase.co"; export default { async fetch(request) { const url = new URL(request.url); // Меняем хост на настоящий Supabase, путь и query оставляем как есть const targetUrl = new URL(request.url); targetUrl.hostname = SUPABASE_PROJECT_HOST; targetUrl.port = ""; targetUrl.protocol = "https:"; // Копируем заголовки запроса (авторизация, apikey и т.д.) const proxyHeaders = new Headers(request.headers); proxyHeaders.set("Host", SUPABASE_PROJECT_HOST); const proxyRequest = new Request(targetUrl.toString(), { method: request.method, headers: proxyHeaders, body: ["GET", "HEAD"].includes(request.method) ? undefined : request.body, redirect: "follow", }); const response = await fetch(proxyRequest); // Прокидываем ответ обратно как есть, добавляя CORS-заголовки на случай // обращения с других доменов/локальной разработки. const responseHeaders = new Headers(response.headers); responseHeaders.set("Access-Control-Allow-Origin", "*"); responseHeaders.set("Access-Control-Allow-Methods", "GET,POST,PUT,PATCH,DELETE,OPTIONS"); responseHeaders.set("Access-Control-Allow-Headers", "*"); if (request.method === "OPTIONS") { return new Response(null, { headers: responseHeaders, status: 204 }); } return new Response(response.body, { status: response.status, statusText: response.statusText, headers: responseHeaders, }); }, };