From 0ecc69a86138e7ad50f65841de3306ddbf73e405 Mon Sep 17 00:00:00 2001 From: Misode Date: Sat, 7 Jan 2023 11:55:28 +0100 Subject: [PATCH] Retry fetching from jsdelivr if github fails --- src/app/services/DataFetcher.ts | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/app/services/DataFetcher.ts b/src/app/services/DataFetcher.ts index 2c3a1a9d..8d062f9a 100644 --- a/src/app/services/DataFetcher.ts +++ b/src/app/services/DataFetcher.ts @@ -309,9 +309,22 @@ async function cachedFetch(url: string, { decode = (r => r.json()), } } +const RAWGITHUB_REGEX = /^https:\/\/raw\.githubusercontent\.com\/([^\/]+)\/([^\/]+)\/([^\/]+)\/(.*)$/ + async function fetchAndCache(cache: Cache, url: string, decode: (r: Response) => Promise) { console.debug(`[cachedFetch] Fetching data ${url}`) - const fetchResponse = await fetch(url) + let fetchResponse + try { + fetchResponse = await fetch(url) + } catch (e) { + if (url.startsWith('https://raw.githubusercontent.com/')) { + const backupUrl = url.replace(RAWGITHUB_REGEX, 'https://cdn.jsdelivr.net/gh/$1/$2@$3/$4') + console.debug(`[cachedFetch] Retrying using ${backupUrl}`) + fetchResponse = await fetch(backupUrl) + } else { + throw e + } + } const fetchClone = fetchResponse.clone() const fetchData = await decode(fetchResponse) await cache.put(url, fetchClone)