@kartotherian/server
Version:
Serves Kartotherian maps
46 lines (38 loc) • 1.42 kB
JavaScript
const infoHeaders = {};
const util = require('util');
const Err = require('@kartotherian/err');
const Promise = require('bluebird');
let core;
/**
* Web server (express) route handler to get requested tile or info
* @param req request object
* @param res response object
* @param next will be called if request is not handled
*/
function requestHandler(req, res, next) {
const start = Date.now();
let source;
return Promise.try(() => {
source = core.getPublicSource(req.params.src);
// check for optional parameter publicinfo
if (source.publicinfo === false) {
throw new Err('Source info is not public').metrics('err.req.sourceinfo');
}
return source.getHandler().getInfoAsync().then(info => [info, infoHeaders]);
}).spread((data, dataHeaders) => {
core.setResponseHeaders(res, source, dataHeaders);
if (req.query && req.query.format) {
const escapedText = JSON.stringify(data, null, ' ').replace(/&/g, '&').replace(/</g, '<');
res.send(`<pre>${escapedText}</pre>`);
} else {
res.json(data);
}
const mx = util.format('req.%s.info', req.params.src);
core.metrics.endTiming(mx, start);
}).catch(err => core.reportRequestError(err, res)).catch(next);
}
module.exports = function info(cor, router) {
core = cor;
// get source info (json)
router.get(`/:src(${core.Sources.sourceIdReStr})/info.json`, requestHandler);
};