fifteen/apps/web/lib/valhalla.ts

39 lines
1.3 KiB
TypeScript

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<object> {
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<object>;
}