View raw

1 export async function fetchJson(url, options = {}) { 2 const response = await fetch(url, options); 3 4 if (!response.ok) { 5 throw new Error(`HTTP ${response.status}`); 6 } 7 8 return response.json(); 9 } 10 11 export async function fetchLatestStatuses() { 12 const payload = await fetchJson("/api/status"); 13 return payload.statuses || {}; 14 } 15 16 export async function fetchLatestReading(probe) { 17 const params = new URLSearchParams({ limit: "1" }); 18 const payload = await fetchJson(`/api/readings/${probe}?${params}`); 19 const readings = payload.readings || []; 20 21 return readings.length ? readings[readings.length - 1] : null; 22 } 23 24 export async function fetchProbeData(probe, timeframe, range, includeReadings = false, signal = null) { 25 const seriesParams = new URLSearchParams({ 26 timeframe, 27 range: String(range) 28 }); 29 const readingsParams = new URLSearchParams({ limit: "10" }); 30 const options = signal ? { signal } : {}; 31 const readingsRequest = includeReadings 32 ? fetchJson(`/api/readings/${probe}?${readingsParams}`, options) 33 : Promise.resolve({ readings: [] }); 34 const [series, readings] = await Promise.all([ 35 fetchJson(`/api/readings/${probe}/series?${seriesParams}`, options), 36 readingsRequest 37 ]); 38 39 return { 40 points: series.points || [], 41 readings: readings.readings || [] 42 }; 43 } 44 45 export async function fetchWeatherHourly(hours, signal = null) { 46 const params = new URLSearchParams({ hours: String(hours) }); 47 const options = signal ? { signal } : {}; 48 return fetchJson(`/api/weather/hourly?${params}`, options); 49 } 50 51 export async function fetchWeatherForecast(signal = null) { 52 const options = signal ? { signal } : {}; 53 return fetchJson("/api/weather/forecast", options); 54 } 55 56 export async function fetchInsightStability(hours, signal = null) { 57 const params = new URLSearchParams({ hours: String(hours) }); 58 const options = signal ? { signal } : {}; 59 return fetchJson(`/api/insights/stability?${params}`, options); 60 } 61 62 export async function fetchInsightDerivatives(hours, signal = null) { 63 const params = new URLSearchParams({ hours: String(hours) }); 64 const options = signal ? { signal } : {}; 65 return fetchJson(`/api/insights/derivatives?${params}`, options); 66 } 67 68 export async function fetchInsightDiurnal(probe, days, signal = null) { 69 const params = new URLSearchParams({ days: String(days) }); 70 const options = signal ? { signal } : {}; 71 return fetchJson(`/api/insights/diurnal/${probe}?${params}`, options); 72 } 73