atriusmaps-node-sdk
Version:
This project provides an API to Atrius Personal Wayfinder maps within a Node environment. See the README.md for more information
2 lines (1 loc) • 2.99 kB
JavaScript
import t from"flexsearch";import{DateTime as a}from"luxon";import*as e from"ramda";import{FlightType as r,mapFlightDetails as i,mapFlightListItem as n,flightComparator as o}from"./flightDetailsMapper.js";import{searchFlights as s}from"./utils.js";function l(l,p){const g=()=>new t.Index({tokenize:"forward"}),c={lastUpdated:0,flights:{dep:{},arr:{}},index:{dep:g(),arr:g()},gates:null,apiError:!1},u=(t,a)=>{c.index[t]=g(),c.flights[t]={},a.forEach(a=>{c.index[t].add(a.flightId,f(a)),c.flights[t][a.flightId]=a})},d=[["flightNumber"],["airline","iata"],["airline","name"],["arrivalAirport","iata"],["arrivalAirport","city"],["departureAirport","iata"],["departureAirport","city"]],f=t=>d.map(a=>e.path(a,t)).filter(t=>"string"==typeof t&&t.length>0).join(" "),h=async()=>{if(null===c.gates){const t=await l.bus.get("poi/getByCategoryId",{categoryId:"gate"}),a=({name:t})=>e.tail(t.replace(",","").split(" ")),r=Object.values(t).flatMap(t=>a(t).map(a=>[a,t]));c.gates=e.fromPairs(r)}return c},m=async()=>{await h();const t=await l.bus.get("venueData/getVenueData"),a=new URLSearchParams,i=l.i18n?.().language;if(i&&a.append("locale",i),p?.timeRange){const t=Date.now();a.append("startDate",new Date(t-p.timeRange.beforeNowMs).toISOString()),a.append("endDate",new Date(t+p.timeRange.afterNowMs).toISOString())}const n=`https://marketplace.locuslabs.com/venueId/${t.baseVenueId}/flight-status`,o=a.toString()?`${n}?${a.toString()}`:n;try{const t=await fetch(o),a=await t.json();[r.ARRIVAL,r.DEPARTURE].forEach(t=>{const i=t===r.DEPARTURE?"departures":"arrivals",{airports:n,airlines:o}=a.data[i].appendix;u(t,((t,a,i,n)=>{const o=a.reduce((t,a)=>({...t,[a.iata]:a}),{}),s=i.flatMap(t=>[{code:t.iata,airline:t},{code:t.icao,airline:t}]).filter(t=>Boolean(t.code)).reduce((t,{code:a,airline:e})=>({...t,[a]:e}),{});return t.map(t=>{const a=n===r.DEPARTURE?e.pathOr("",["airportResources","departureGate"],t):e.pathOr("",["airportResources","arrivalGate"],t),i=c.gates?.[String(a)];return{...t,flightType:n,gatePoi:i,airline:s[t.carrierFsCode],departureAirport:o[t.departureAirportFsCode],arrivalAirport:o[t.arrivalAirportFsCode]}})})(a.data[i].flightStatuses,n,o,t))}),c.apiError=!1}catch(t){c.apiError=!0,console.error("Error from flight status api call",t),[r.ARRIVAL,r.DEPARTURE].forEach(t=>u(t,[]))}finally{c.lastUpdated=Date.now()}return c},R=async()=>{Date.now()-c.lastUpdated>6e4&&await m()};return l.bus.on("flightStatus/query",async({term:t=null,type:a=r.DEPARTURE}={})=>(await R(),s(t,a,c))),l.bus.on("flightStatus/getFlight",async({flightId:t})=>(await R(),c.flights.dep[t]||c.flights.arr[t])),l.bus.on("flightStatus/mapFlightDetails",async({flight:t})=>i(a.local(),t,l.gt(),c.tz,l.i18n?.().language??"en-US")),l.bus.on("flightStatus/mapFlightListItems",async({flights:t})=>t.map(t=>n(a.local(),t,l.gt(),c.tz,l.i18n?.().language??"en-US")).sort(o)),{init:async()=>{c.tz=await l.bus.get("venueData/getVenueTimezone")},internal:{updateFlights:m,indexGatePois:h}}}export{l as create};