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
115 lines (101 loc) • 4.28 kB
JavaScript
;
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;