2   function FOSSGISValhallaEngine(modeId, costing) {
 
   4       "straight", // kNone = 0;
 
   5       "start", // kStart = 1;
 
   6       "start", // kStartRight = 2;
 
   7       "start", // kStartLeft = 3;
 
   8       "destination", // kDestination = 4;
 
   9       "destination", // kDestinationRight = 5;
 
  10       "destination", // kDestinationLeft = 6;
 
  11       "straight", // kBecomes = 7;
 
  12       "straight", // kContinue = 8;
 
  13       "slight-right", // kSlightRight = 9;
 
  14       "right", // kRight = 10;
 
  15       "sharp-right", // kSharpRight = 11;
 
  16       "u-turn-right", // kUturnRight = 12;
 
  17       "u-turn-left", // kUturnLeft = 13;
 
  18       "sharp-left", // kSharpLeft = 14;
 
  19       "left", // kLeft = 15;
 
  20       "slight-left", // kSlightLeft = 16;
 
  21       "straight", // kRampStraight = 17;
 
  22       "exit-right", // kRampRight = 18;
 
  23       "exit-left", // kRampLeft = 19;
 
  24       "exit-right", // kExitRight = 20;
 
  25       "exit-left", // kExitLeft = 21;
 
  26       "straight", // kStayStraight = 22;
 
  27       "slight-right", // kStayRight = 23;
 
  28       "slight-left", // kStayLeft = 24;
 
  29       "merge-left", // kMerge = 25;
 
  30       "roundabout", // kRoundaboutEnter = 26;
 
  31       "roundabout", // kRoundaboutExit = 27;
 
  32       "ferry", // kFerryEnter = 28;
 
  33       "straight", // kFerryExit = 29;
 
  34       null, // kTransit = 30;
 
  35       null, // kTransitTransfer = 31;
 
  36       null, // kTransitRemainOn = 32;
 
  37       null, // kTransitConnectionStart = 33;
 
  38       null, // kTransitConnectionTransfer = 34;
 
  39       null, // kTransitConnectionDestination = 35;
 
  40       null, // kPostTransitConnectionDestination = 36;
 
  41       "merge-right", // kMergeRight = 37;
 
  42       "merge-left" // kMergeLeft = 38;
 
  45     function _processDirections(tripLegs) {
 
  51       for (const leg of tripLegs) {
 
  52         const legLine = L.PolylineUtil.decode(leg.shape, {
 
  56         const legSteps = leg.maneuvers.map(function (manoeuvre, idx) {
 
  57           const num = `<b>${idx + 1}.</b> `;
 
  58           const lineseg = legLine
 
  59             .slice(manoeuvre.begin_shape_index, manoeuvre.end_shape_index + 1)
 
  60             .map(([lat, lng]) => ({ lat, lng }));
 
  63             INSTR_MAP[manoeuvre.type],
 
  64             num + manoeuvre.instruction,
 
  65             manoeuvre.length * 1000,
 
  70         line = line.concat(legLine);
 
  71         steps = steps.concat(legSteps);
 
  72         distance += leg.summary.length;
 
  73         time += leg.summary.time;
 
  79         distance: distance * 1000,
 
  86       provider: "fossgis_valhalla",
 
  88       "<a href='https://gis-ops.com/global-open-valhalla-server-online/' target='_blank'>Valhalla (FOSSGIS)</a>",
 
  91       getRoute: function (points, signal) {
 
  92         const query = new URLSearchParams({
 
  93           json: JSON.stringify({
 
  94             locations: points.map(function (p) {
 
  95               return { lat: p.lat, lon: p.lng, radius: 5 };
 
 100               language: OSM.i18n.locale
 
 104         return fetch(OSM.FOSSGIS_VALHALLA_URL + "?" + query, { signal })
 
 105           .then(response => response.json())
 
 106           .then(({ trip }) => {
 
 107             if (trip.status !== 0) throw new Error();
 
 108             return _processDirections(trip.legs);
 
 114   OSM.Directions.addEngine(new FOSSGISValhallaEngine("car", "auto"), true);
 
 115   OSM.Directions.addEngine(new FOSSGISValhallaEngine("bicycle", "bicycle"), true);
 
 116   OSM.Directions.addEngine(new FOSSGISValhallaEngine("foot", "pedestrian"), true);