import { nextTuesdayDeparture } from "@transportationer/shared"; import { getRoutingQueue, getRoutingQueueEvents, getRoutingTransitQueue, getRoutingTransitQueueEvents } from "./queue"; export interface IsochroneOpts { lng: number; lat: number; travelMode: string; contourMinutes: number[]; citySlug: string; polygons?: boolean; } const ISOCHRONE_TIMEOUT_MS = 35_000; /** * Dispatch an isochrone job to the appropriate valhalla routing queue and wait. * Road modes (walking/cycling/driving) → routing queue (valhalla container). * Transit → routing-transit queue (valhalla-transit container). */ export async function fetchIsochrone(opts: IsochroneOpts): Promise { const { lng, lat, travelMode, contourMinutes, citySlug } = opts; const isTransit = travelMode === "transit"; const departureDate = isTransit ? nextTuesdayDeparture() : null; const queue = isTransit ? getRoutingTransitQueue() : getRoutingQueue(); const events = isTransit ? getRoutingTransitQueueEvents() : getRoutingQueueEvents(); const job = await queue.add("isochrone", { type: "isochrone", lng, lat, travelMode, contourMinutes, citySlug, departureDate, }); return job.waitUntilFinished(events, ISOCHRONE_TIMEOUT_MS) as Promise; }