39 lines
1.3 KiB
TypeScript
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>;
|
|
}
|