UNPKG

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

109 lines (95 loc) 4.23 kB
'use strict'; var R = require('ramda'); function _interopNamespaceDefault(e) { var n = Object.create(null); if (e) { Object.keys(e).forEach(function (k) { if (k !== 'default') { var d = Object.getOwnPropertyDescriptor(e, k); Object.defineProperty(n, k, d.get ? d : { enumerable: true, get: function () { return e[k]; } }); } }); } n.default = e; return Object.freeze(n); } var R__namespace = /*#__PURE__*/_interopNamespaceDefault(R); /** * * @param {Record<Number, DynamicQueueTime} queueTimes A map of POI Ids to dynamic queue times * @param {Record<Number, String>} labels A map of POI Ids to map labels * @param {*} feature A GeoJson feature * @returns feature */ const mutateSecurityCheckpointLabel = (T, queueTimes, labels) => feature => { const id = feature.properties.id; const dynamicData = queueTimes[id]; const label = labels[id]; if (dynamicData) { // should we only show this message when "timeIsReal" is true? const { queueTime, isTemporarilyClosed } = dynamicData; const secondaryText = isTemporarilyClosed ? T('ui:Closed') : T('ui:_xx_ minute wait', { count: queueTime }); feature.properties.text = `${label}\n${secondaryText}`; } return feature }; const processParkingPOIS = (poiMap) => { const idValuesMap = R__namespace.pipe( R__namespace.filter(poi => poi.category === 'parking'), R__namespace.map(poi => { const da = poi.dynamicAttributes; if (!da) throw Error(`No dynamicAttributes defined for parking POI ${poi.poiId}`) const age = (Date.now() - poi.timestamp) / 1000; // how long ago this was updated by backend (in seconds) const props = (age < da['parking.timeToLive']) // if this update is recent enough, consider it "valid" ? R__namespace.pick(['lotStatus', 'rateDay', 'rateHour', 'timeIsReal', 'timeToTerminal1', 'timeToTerminal2'], poi) : { lotStatus: da['parking.default'], rateDay: '$ -', rateHour: '$ -', timeIsReal: false }; return { ...props, lastUpdated: poi.timestamp, lotName: poi.lotName } }))(poiMap); return idValuesMap }; const processOpenClosedPois = (poiMap) => { const pathToOpenClosedData = ['dynamicData', 'openClosed']; const openClosedPois = R__namespace.filter(R__namespace.hasPath(pathToOpenClosedData), poiMap); const openClosedStatuses = R__namespace.map(R__namespace.path(pathToOpenClosedData), openClosedPois); if (R__namespace.all(R__namespace.both(R__namespace.has('isOpen'), R__namespace.has('expiration')), R__namespace.values(openClosedStatuses))) { const isExpired = R__namespace.pipe(R__namespace.prop('expiration'), R__namespace.lt(Date.now())); const idValuesMap = R__namespace.filter(isExpired, openClosedStatuses); return idValuesMap } else { throw Error('Open Closed poi status is malformed.') } }; /* API response: https://gitlab.com/locuslabs/core-data-team/json-schemas/-/blob/develop/src/api-marketplace/dynamic-queue-data.json */ const processSecurityWaitTimes = (poiMap) => { const queuePath = ['dynamicData', 'queue']; const queuePois = R__namespace.filter(R__namespace.hasPath(queuePath), poiMap); const queues = R__namespace.map(R__namespace.path(queuePath), queuePois); return R__namespace.map(queue => ({ isTemporarilyClosed: queue.isTemporarilyClosed, queueTime: queue.queueTime, timeIsReal: !queue.isQueueTimeDefault && queue.expiration > Date.now(), lastUpdated: Date.now() }), queues) }; const processRoutingPois = (poiMap) => { const now = Date.now(); return R__namespace.filter( poi => { const navGraphHidden = R__namespace.path(['dynamicData', 'dynamic-routing', 'navGraphHidden'], poi); const expiration = R__namespace.path(['dynamicData', 'dynamic-routing', 'expiration'], poi); return navGraphHidden === true && expiration > now }, poiMap ) }; exports.mutateSecurityCheckpointLabel = mutateSecurityCheckpointLabel; exports.processOpenClosedPois = processOpenClosedPois; exports.processParkingPOIS = processParkingPOIS; exports.processRoutingPois = processRoutingPois; exports.processSecurityWaitTimes = processSecurityWaitTimes;