mirror of
https://github.com/caty21/forex-dashboard.git
synced 2026-07-27 20:37:45 +00:00
3a384eb820
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>
36 lines
1.5 KiB
TypeScript
36 lines
1.5 KiB
TypeScript
import { NextResponse } from "next/server";
|
|
import { fetchAllCBPaths } from "@/lib/rateprobability";
|
|
import type { RateProbData } from "@/lib/rateprobability";
|
|
|
|
export const dynamic = "force-dynamic";
|
|
export const preferredRegion = ["fra1", "lhr1", "cdg1"]; // Europe (Frankfurt / London / Paris)
|
|
|
|
export type { RateProbData, CBRatePath, RateProbMeeting } from "@/lib/rateprobability";
|
|
|
|
export interface RateProbabilitiesResponse {
|
|
data: RateProbData;
|
|
fetchedAt: string;
|
|
}
|
|
|
|
export async function GET() {
|
|
try {
|
|
const data = await fetchAllCBPaths();
|
|
const currencies = Object.keys(data);
|
|
console.log(`[rate-prob] fetched ${currencies.length} CBs: ${currencies.join(", ")}`);
|
|
return NextResponse.json(
|
|
{ data, fetchedAt: new Date().toISOString() } satisfies RateProbabilitiesResponse,
|
|
{ headers: { "Cache-Control": "no-store" } }
|
|
);
|
|
} catch (e) {
|
|
// Ne jamais laisser une exception (ex: timeout InvestingLive) faire planter la route
|
|
// entière — ça faisait échouer le fetch() client pour les 8 devises d'un coup au lieu
|
|
// de dégrader currency par currency. On renvoie un JSON valide (vide) : le client bascule
|
|
// sur son cache localStorage plutôt que de rester bloqué sur "Données OIS indisponibles".
|
|
console.error(`[rate-prob] fatal error: ${e instanceof Error ? e.message : e}`);
|
|
return NextResponse.json(
|
|
{ data: {}, fetchedAt: new Date().toISOString() } satisfies RateProbabilitiesResponse,
|
|
{ headers: { "Cache-Control": "no-store" } }
|
|
);
|
|
}
|
|
}
|