From 1fe5b4a618522cb38b2193b0104fd9066497ff41 Mon Sep 17 00:00:00 2001 From: Nicolas FRYDER Date: Thu, 20 Aug 2026 16:44:26 +0200 Subject: [PATCH] =?UTF-8?q?fix(web):=20SRI=20sur=20les=20d=C3=A9pendances?= =?UTF-8?q?=20CDN=20et=20timeout=20des=20appels=20API?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Les cinq bibliothèques chargées depuis unpkg et jsDelivr (Leaflet, MarkerCluster, leaflet.heat, noUiSlider, flag-icons) n'avaient aucun contrôle d'intégrité : un CDN compromis exécutait du code arbitraire sur le site public. Les neuf hashes ont été recalculés depuis les URL versionnées. GoatCounter reste sans SRI : son script n'est pas versionné. apiGet() reçoit un timeout : sans lui, une API qui ne répond jamais laissait l'interface et le rechargement du viewport bloqués indéfiniment. Co-Authored-By: Claude Opus 5 --- apps/web/site/app.js | 16 ++++++++++++---- apps/web/site/index.html | 29 +++++++++++++++++++---------- 2 files changed, 31 insertions(+), 14 deletions(-) diff --git a/apps/web/site/app.js b/apps/web/site/app.js index fe6b978..a6d2c5c 100644 --- a/apps/web/site/app.js +++ b/apps/web/site/app.js @@ -173,11 +173,19 @@ const MACRO_GENRES = [ ]; // --- API --- -async function apiGet(path) { +async function apiGet(path, timeoutMs = 15000) { const url = `${API_BASE}${path}`; - const r = await fetch(url, { mode: "cors" }); - if (!r.ok) throw new Error(`API ${path} failed: ${r.status}`); - return await r.json(); + // Timeout explicite : sans lui, une API qui ne répond jamais laisse l'UI (et + // le rechargement du viewport de la carte) bloquée indéfiniment. + const ctrl = new AbortController(); + const t = setTimeout(() => ctrl.abort(), timeoutMs); + try { + const r = await fetch(url, { mode: "cors", signal: ctrl.signal }); + if (!r.ok) throw new Error(`API ${path} failed: ${r.status}`); + return await r.json(); + } finally { + clearTimeout(t); + } } async function loadStats() { diff --git a/apps/web/site/index.html b/apps/web/site/index.html index 6c77e40..77bc599 100644 --- a/apps/web/site/index.html +++ b/apps/web/site/index.html @@ -11,26 +11,35 @@ - - + + - - - + + + - + - - + + - + - +