From 8b6364c53a7fd488a33580fed7b633ecd8ef1ac8 Mon Sep 17 00:00:00 2001 From: GuavaPopper Date: Fri, 5 Jun 2026 13:21:37 +0700 Subject: [PATCH] Aktifkan fallback proxy paralel publikasi --- groups/RODA/index.html | 51 +++++++++++++++++++++++------------------- 1 file changed, 28 insertions(+), 23 deletions(-) diff --git a/groups/RODA/index.html b/groups/RODA/index.html index dfcf655..71a8e09 100644 --- a/groups/RODA/index.html +++ b/groups/RODA/index.html @@ -78,7 +78,9 @@ dashboardRuntimeFetch: 'always', dashboardTargetUrl: 'https://dashboard.informatika.untan.ac.id/index.php?penelitian', dashboardProxyTemplates: [ - 'https://api.codetabs.com/v1/proxy?quest={{url}}' + 'https://api.codetabs.com/v1/proxy?quest={{url}}', + 'https://api.allorigins.win/get?url={{url}}&ts={{ts}}', + 'https://thingproxy.freeboard.io/fetch/{{rawUrl}}' ] }; @@ -1631,6 +1633,22 @@ updateStatPub(newData.length); } + async function fetchProxyRows(proxyUrl) { + const controller = new AbortController(); + const timeoutId = setTimeout(() => controller.abort(), 15000); + + try { + const response = await fetch(proxyUrl, { signal: controller.signal }); + if (!response.ok) throw new Error(`HTTP_ERROR_${response.status}`); + + const responseData = await response.text(); + const html = extractDashboardHtml(responseData); + return parseDashboardRows(html); + } finally { + clearTimeout(timeoutId); + } + } + async function fetchDashboardData() { const grid = document.getElementById('riset-grid'); if (grid) { @@ -1681,28 +1699,15 @@ return; } - for (const getProxyUrl of proxyServers) { - const controller = new AbortController(); - const timeoutId = setTimeout(() => controller.abort(), 15000); - - try { - const proxyUrl = getProxyUrl(targetUrl); - - const response = await fetch(proxyUrl, { signal: controller.signal }); - clearTimeout(timeoutId); - - if (!response.ok) throw new Error(`HTTP_ERROR_${response.status}`); - - const responseData = await response.text(); - const html = extractDashboardHtml(responseData); - const rows = parseDashboardRows(html); - applyDashboardRows(rows); - return; // Berhasil! Keluar dari loop - } catch (error) { - clearTimeout(timeoutId); - lastError = error; - // Lanjut ke proxy berikutnya... - } + try { + const proxyUrls = proxyServers.map((getProxyUrl) => getProxyUrl(targetUrl)); + const rows = await Promise.any(proxyUrls.map((proxyUrl) => fetchProxyRows(proxyUrl))); + applyDashboardRows(rows); + return; + } catch (error) { + lastError = error instanceof AggregateError && error.errors?.length + ? error.errors[error.errors.length - 1] + : error; } // Jika semua proxy gagal