From 5bebd51ac4dff4a0410d5e1dffcdff43bc8b2839 Mon Sep 17 00:00:00 2001 From: chris Date: Tue, 5 May 2026 15:15:40 -0400 Subject: [PATCH] fix: log OSRM failure reason and URL instead of silent fallback Co-Authored-By: Claude Sonnet 4.6 --- estore/src/lib/delivery.ts | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/estore/src/lib/delivery.ts b/estore/src/lib/delivery.ts index 5e5d908..ac712ab 100644 --- a/estore/src/lib/delivery.ts +++ b/estore/src/lib/delivery.ts @@ -57,6 +57,7 @@ export async function drivingInfo( // Self-hosted gets a generous timeout; public demo gets a short one const timeoutMs = process.env.OSRM_URL ? 10_000 : 6_000 + let lastErr = 'unknown' for (let attempt = 0; attempt < 3; attempt++) { try { const controller = new AbortController() @@ -67,19 +68,20 @@ export async function drivingInfo( signal: controller.signal, }) clearTimeout(timer) - if (!res.ok) throw new Error(`OSRM ${res.status}`) + if (!res.ok) throw new Error(`HTTP ${res.status}`) const data = await res.json() - if (data.code !== 'Ok' || !data.routes?.length) throw new Error('No route found') + if (data.code !== 'Ok' || !data.routes?.length) throw new Error(`bad response: code=${data.code}`) const miles = (data.routes[0].distance as number) / 1609.344 const minutes = Math.ceil((data.routes[0].duration as number) / 60) return { miles, minutes } - } catch { + } catch (err) { + lastErr = err instanceof Error ? err.message : String(err) if (attempt < 2) await new Promise((r) => setTimeout(r, 500 * (attempt + 1))) } } // Fallback: straight-line distance × 1.3 road overhead, ~25 mph average - console.warn('[delivery] OSRM unavailable — using haversine fallback') + console.warn(`[delivery] OSRM unavailable (${url}) — last error: ${lastErr} — using haversine fallback`) const miles = haversineMiles(lat1, lng1, lat2, lng2) * 1.3 const minutes = Math.ceil((miles / 25) * 60) return { miles, minutes }