tileserver-gl/src/server.js
2016-03-02 17:51:50 +01:00

76 lines
2 KiB
JavaScript

#!/usr/bin/env node
'use strict';
process.env.UV_THREADPOOL_SIZE =
Math.ceil(Math.max(4, require('os').cpus().length * 1.5));
var fs = require('fs'),
path = require('path');
var async = require('async'),
clone = require('clone'),
cors = require('cors'),
express = require('express'),
morgan = require('morgan');
var serve_raster = require('./serve_raster'),
serve_vector = require('./serve_vector'),
utils = require('./utils');
module.exports = function(opts, callback) {
var app = express().disable('x-powered-by'),
maps = {};
app.enable('trust proxy');
callback = callback || function() {};
if (process.env.NODE_ENV !== 'production') {
app.use(morgan('dev'));
}
var configPath = path.resolve(opts.config),
config = require(configPath);
Object.keys(config).forEach(function(prefix) {
if (config[prefix].cors !== false) {
app.use(prefix, cors());
}
if (config[prefix].style) {
app.use(prefix, serve_raster(maps, config[prefix], prefix));
} else {
app.use(prefix, serve_vector(maps, config[prefix], prefix));
}
});
// serve index.html on the root
app.use('/', express.static(path.join(__dirname, '../public')));
// aggregate index.json on root for multiple sources
app.get('/index.json', function(req, res, next) {
var queue = [];
Object.keys(config).forEach(function(prefix) {
var map = maps[prefix];
queue.push(function(callback) {
var info = clone(map.tileJSON);
info.tiles = utils.getTileUrls(
req.protocol, config[prefix].domains, req.headers.host,
prefix, '/{z}/{x}/{y}.{format}', info.format, req.query.key);
callback(null, info);
});
});
return async.parallel(queue, function(err, results) {
return res.send(results);
});
});
app.listen(process.env.PORT || opts.port, function() {
console.log('Listening at http://%s:%d/',
this.address().address, this.address().port);
return callback();
});
};