fix: OIS indisponible sur toutes les cards + transparence sur l'instrument utilisé

Le fetch /api/rate-probabilities n'avait aucun fallback cache côté client
(contrairement aux autres widgets) et pouvait planter en bloc si InvestingLive
timeoutait (fetch sans AbortController) - une seule panne coupait les 8 devises
d'un coup au lieu de dégrader devise par devise.

- route.ts : try/catch pour toujours renvoyer un JSON valide
- page.tsx : fallback localStorage si le fetch échoue
- investinglive.ts : timeout 8s sur les fetches vers investinglive.com
- fetch-rate-data.mjs / rateprobability.ts : le pipeline écrit maintenant la
  source réelle utilisée par devise (Rate Monitor USD, futures Euribor/SONIA
  pour EUR/GBP, InvestingLive pour les 5 autres) et la carte l'affiche
- CurrencyCard.tsx : SourcesPopup corrigé (CME FedWatch retiré, plus de fausse
  mention "Rate Monitor" pour les devises qui n'en ont pas)

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
caty21
2026-07-14 23:05:37 +02:00
parent 55eca6e2f0
commit 3a384eb820
6 changed files with 81 additions and 21 deletions
+11 -2
View File
@@ -516,6 +516,7 @@ function buildILFallback(ccy, il) {
return {
today: {
midpoint: rate,
source: "InvestingLive — estimation hebdomadaire analyste (pas de futures/OIS coté public pour cette devise)",
rows: [{
meeting: "Dec",
meeting_iso: yearEnd,
@@ -570,7 +571,10 @@ for (const ccy of IC_SUPPORTED) {
}
data = await fetchInvestingCom(ccy);
}
if (data) results[ccy] = data;
if (data) {
data.today.source = "Investing.com Fed Rate Monitor (CME 30-Day Fed Funds Futures)";
results[ccy] = data;
}
await new Promise(r => setTimeout(r, 600));
}
@@ -586,7 +590,12 @@ for (const ccy of Object.keys(FUTURES_STRIP_CONFIG)) {
}
data = await fetchFuturesStrip(ccy);
}
if (data) results[ccy] = data;
if (data) {
data.today.source = ccy === "EUR"
? "Investing.com — Euribor 3M Futures (Eurex)"
: "Investing.com — Three-Month SONIA Futures (ICE)";
results[ccy] = data;
}
await new Promise(r => setTimeout(r, 600));
}