76 lines
2 KiB
JavaScript
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();
|
|
});
|
|
};
|