#!/usr/bin/env node // Diagnostic ad-hoc : le gateway Météo France (WSO2) load-balance entre plusieurs // instances qui peuvent être désynchronisées sur /DPVigilance/v1/cartevigilance/encours. // Constaté 2026-05-26 (cf. vigilance.ts:84-89). Ce script déclenche N fetches // séquentiels et tabule les `update_time` distincts pour décider si le hack // MF_PARALLEL_FETCHES=3 est toujours nécessaire. // // Usage : METEOFRANCE_API_KEY=xxx node scripts/check-mf-loadbalancer.mjs [N=20] const KEY = process.env.METEOFRANCE_API_KEY; if (!KEY) { console.error('METEOFRANCE_API_KEY required'); process.exit(1); } const N = parseInt(process.argv[2] ?? '20', 10); const URL = 'https://public-api.meteofrance.fr/public/DPVigilance/v1/cartevigilance/encours'; const counts = new Map(); const failures = []; const start = Date.now(); for (let i = 0; i < N; i++) { try { const res = await fetch(URL, { headers: { apikey: KEY, Accept: 'application/json' } }); if (!res.ok) { failures.push(`#${i}: HTTP ${res.status}`); continue; } const j = await res.json(); const t = j?.product?.update_time ?? ''; counts.set(t, (counts.get(t) ?? 0) + 1); process.stdout.write(`${i + 1}/${N} → ${t}\n`); } catch (e) { failures.push(`#${i}: ${e.message}`); } } const elapsed = ((Date.now() - start) / 1000).toFixed(1); console.log(`\n=== Résumé (${N} fetches en ${elapsed}s) ===`); const sorted = [...counts.entries()].sort((a, b) => (a[0] < b[0] ? 1 : -1)); for (const [t, c] of sorted) { const bar = '█'.repeat(Math.round((c / N) * 40)); console.log(`${t} ${c.toString().padStart(3)}/${N} ${bar}`); } if (failures.length) { console.log(`\nÉchecs: ${failures.length}`); for (const f of failures) console.log(' ' + f); } console.log(`\nDistinct update_time: ${counts.size}`); if (counts.size === 1) { console.log('→ Pas de désynchro détectée sur cet échantillon. Tu peux probablement réduire MF_PARALLEL_FETCHES à 1.'); } else { const newest = sorted[0]?.[0]; const newestCount = sorted[0]?.[1] ?? 0; console.log(`→ Désynchro confirmée. Le bulletin le plus récent est ${newest} (${newestCount}/${N} = ${Math.round(newestCount/N*100)}%).`); console.log(' Mitigation actuelle (MF_PARALLEL_FETCHES=3 + sort par update_time desc) reste justifiée.'); }