можно ли в этом коде воркера сделать так чтобы домены резолвились через 9.9.9.9
async function handleRequest(request, event) {
    //const url = new URL(request.url);
    const requestUrl = new URL(request.url);
    const query = requestUrl.search;
    const urlParam = query.match(/(?<=\?url=).*$/);
    if (urlParam) {
        const targetUrl = decodeURIComponent(urlParam[0]);
        // Теперь вы можете использовать targetUrl для вашего запроса
        console.log("Полный URL: ", targetUrl);
        const cache = caches.default;
        const cachedResponse = await cache.match(request);
        if (cachedResponse) {
            return cachedResponse; // Возврат закэшированного ответа, если он есть
        }
        // Проверяем, содержит ли домен нужные ключевые слова
        const allowedDomains = /cub|kinopoisk|imagetmdb|filmix|tmdb|themoviedb|radiorecord|ndst|skaz/;
        const targetDomain = new URL(targetUrl).hostname;
        
        if (!allowedDomains.test(targetDomain)) {
            return new Response("Domain not allowed", { status: 403 });
        }
        // Создаем новый запрос к целевому URL
        const modifiedRequest = new Request(normalizeUrl(targetUrl), {
            method: request.method,
            headers: request.headers,
            body: request.method === 'GET' ? null : await request.blob(),
        });
        // Получаем ответ от целевого URL
        try {
            const response = await fetch(modifiedRequest);
            if (!response.ok) {
                const errorText = await response.text();
                return new Response(`Error fetching target URL: ${response.statusText} (${response.status}). Target URL: ${targetUrl}. Error details: ${errorText}`, {
                    status: response.status
                });
            }
        
            // Создаем новый ответ и добавляем необходимые заголовки CORS
            const newResponse = new Response(response.body, response);
            const allHeaders = Array.from(modifiedRequest.headers.entries())
            .map(([key]) => key)
            .join(', ');
            newResponse.headers.set("Access-Control-Allow-Origin", "*");
            newResponse.headers.set("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS");
            newResponse.headers.set("Access-Control-Allow-Headers", allHeaders || "Accept, realip, x-cookie, Authorization, X-Signalr-User-Agent, Keep-Alive, Origin, DNT, User-Agent, X-Requested-With, If-Modified-Since, Cache-Control, Content-Type, Range");
            newResponse.headers.set("Cache-Control", "public, max-age=604800");
            // Сохраняем ответ в кэш
            event.waitUntil(cache.put(request, newResponse.clone()));
            return newResponse;
        } catch (error) {
            return new Response("Network Error: " + error.message, { status: 500 });
        }
        // Далее ваша логика кода для выполнения запроса
    } else {
        return new Response("Missing 'url' query parameter", { status: 400 });
    }
  }
  function normalizeUrl(url) {
    // Создаем объект URL для парсинга
    const parsedUrl = new URL(url);
    // Убираем все лишние слэши (//) в пути
    parsedUrl.pathname = parsedUrl.pathname.replace(/\/+/g, '/');
    // Если нужно, можно убрать лишние слэши в параметрах
    // parsedUrl.search = parsedUrl.search.replace(/&+/g, '&');
    // Возвращаем нормализованный URL как строку
    return parsedUrl.toString();
    }

  // Измените здесь, чтобы Worker отвечал на ваши запросы
  addEventListener("fetch", event => {
    const { request } = event;
    // Если это запрос OPTIONS, обрабатываем его здесь
    if (request.method === 'OPTIONS') {
        const requestedHeaders = request.headers.get("Access-Control-Request-Headers");
        const requestedMethod = request.headers.get("Access-Control-Request-Method");
        const responseHeaders = {
            "Access-Control-Allow-Origin": "*",
            "Access-Control-Allow-Methods": requestedMethod || "GET, POST, PUT, DELETE, OPTIONS",
            "Access-Control-Allow-Headers": requestedHeaders || "Accept, realip, x-cookie, Authorization, X-Signalr-User-Agent, Keep-Alive, Origin, DNT, User-Agent, X-Requested-With, If-Modified-Since, Cache-Control, Content-Type, Range",
        };
        // Возвращаем 204 No Content для OPTIONS
        return event.respondWith(new Response(null, {
            status: 204,
            headers: responseHeaders,
        }));
    }
    if (event.request.url.startsWith("https://apn.ndst.pw/v1")) {
        event.respondWith(handleRequest(event.request, event));
    } else {
        event.respondWith(new Response("Not Found", { status: 404 }));
    }
  });