Compare commits

...

5 Commits

Author SHA1 Message Date
Zakaria e4d0d3b55c Fix definition request timeout
CI / regression (push) Successful in 1m56s
2026-09-22 07:59:30 -04:00
Zakaria a6f3ef8c82 fixing the definition api issue & webhook trigger - always put the dokploy deploment on dokcerfile
CI / regression (push) Successful in 3m7s
2026-08-24 12:21:37 -04:00
Zakaria 4f3fb8e46e fixing the definition api issue & webhook trigger
CI / regression (push) Successful in 2m20s
2026-08-24 02:16:07 -04:00
Zakaria 00166e9012 Merge branch 'testing'
CI / regression (push) Successful in 2m11s
# Conflicts:
#	fancy-wordle-modern.html
#	index.html
2026-08-24 01:49:35 -04:00
Zakaria 436849f4c7 Fix: Into reload issue 2026-06-06 14:11:39 -04:00
2 changed files with 31 additions and 13 deletions
+15 -13
View File
@@ -29,7 +29,7 @@ const STATS_KEY = "fancy-wordle-stats-v2"
const LOCAL_ROUND_KEY = "fancy-wordle-hourly-round-v1"
const DEFINITION_CACHE_KEY = "fancy-wordle-definitions-v1"
const DEFINITION_CACHE_LIMIT = 200
const DEFINITION_RETRY_DELAY_MS = 1500
const DEFINITION_REQUEST_TIMEOUT_MS = 5000
const PLAY_INTERVAL_MS = 60 * 60 * 1000
const GUESS_TIMEOUT_MS = 10000
const INTRO_SEEN_KEY = "fancy-wordle-intro-seen-v1"
@@ -1400,7 +1400,7 @@ function stripDefinitionHtml(value) {
}
async function fetchDictionaryApiDefinition(word) {
const response = await fetch(`https://api.dictionaryapi.dev/api/v2/entries/en/${encodeURIComponent(word)}`)
const response = await fetchDefinition(`https://api.dictionaryapi.dev/api/v2/entries/en/${encodeURIComponent(word)}`)
if (!response.ok) {
const error = new Error(`API request failed: ${response.status}`)
error.status = response.status
@@ -1422,7 +1422,7 @@ async function fetchDictionaryApiDefinition(word) {
}
async function fetchWiktionaryDefinition(word) {
const response = await fetch(`https://en.wiktionary.org/api/rest_v1/page/definition/${encodeURIComponent(word)}`)
const response = await fetchDefinition(`https://en.wiktionary.org/api/rest_v1/page/definition/${encodeURIComponent(word)}`)
if (!response.ok) {
const error = new Error(`Wiktionary request failed: ${response.status}`)
error.status = response.status
@@ -1445,8 +1445,18 @@ async function fetchWiktionaryDefinition(word) {
}
}
function waitForDuration(duration) {
return new Promise(resolve => setTimeout(resolve, duration))
async function fetchDefinition(url) {
const controller = new AbortController()
const timeoutId = setTimeout(() => controller.abort(), DEFINITION_REQUEST_TIMEOUT_MS)
try {
return await fetch(url, { signal: controller.signal })
} catch (error) {
if (error.name === "AbortError") throw new Error("Definition request timed out")
throw error
} finally {
clearTimeout(timeoutId)
}
}
async function loadWordDefinition(word, isWin = true) {
@@ -1463,14 +1473,6 @@ async function loadWordDefinition(word, isWin = true) {
definitionEntry = await fetchDictionaryApiDefinition(word)
} catch (error) {
console.info("Primary definition lookup failed:", error)
if (error.status !== 404) {
await waitForDuration(DEFINITION_RETRY_DELAY_MS)
try {
definitionEntry = await fetchDictionaryApiDefinition(word)
} catch (retryError) {
console.info("Primary definition retry failed:", retryError)
}
}
}
if (!definitionEntry) {
+16
View File
@@ -100,3 +100,19 @@ test("stats and leaderboard modals open", async ({ page }) => {
await page.locator("#leaderboard-button").click()
await expect(page.locator("#leaderboard-modal")).toBeVisible()
})
test("definition lookup leaves loading state when a provider times out", async ({ page }) => {
await page.route("https://api.dictionaryapi.dev/**", () => new Promise(() => {}))
await page.route("https://en.wiktionary.org/**", route => route.abort())
await openApp(page)
await skipIntro(page)
await page.evaluate(() => {
lastResult = { won: true, guesses: 1, word: "apple" }
loadWordDefinition("apple", true)
})
await expect(page.locator("#stats-definition")).toContainText("Definition not available at the moment.", {
timeout: 6500
})
})