tileserver-gl/src/serve_font.js
2017-10-23 10:01:43 -06:00

66 lines
1.8 KiB
JavaScript

'use strict';
var clone = require('clone'),
express = require('express'),
fs = require('fs'),
path = require('path');
var utils = require('./utils');
module.exports = function(options, allowedFonts) {
var app = express().disable('x-powered-by');
var lastModified = new Date().toUTCString();
var fontPath = options.paths.fonts;
var existingFonts = {};
var fontListingPromise = new Promise(function(resolve, reject) {
fs.readdir(options.paths.fonts, function(err, files) {
if (err) {
reject(err);
return;
}
files.forEach(function(file) {
fs.stat(path.join(fontPath, file), function(err, stats) {
if (err) {
reject(err);
return;
}
if (stats.isDirectory() &&
fs.existsSync(path.join(fontPath, file, '0-255.pbf'))) {
existingFonts[path.basename(file)] = true;
}
});
});
resolve();
});
});
app.get('/fonts/:fontstack/:range([\\d]+-[\\d]+).pbf',
function(req, res, next) {
var fontstack = decodeURI(req.params.fontstack);
var range = req.params.range;
utils.getFontsPbf(options.serveAllFonts ? null : allowedFonts,
fontPath, fontstack, range, existingFonts).then(function(concated) {
res.header('Content-type', 'application/x-protobuf');
res.header('Last-Modified', lastModified);
return res.send(concated);
}, function(err) {
return res.status(400).send(err);
}
);
});
app.get('/fonts.json', function(req, res, next) {
res.header('Content-type', 'application/json');
return res.send(
Object.keys(options.serveAllFonts ? existingFonts : allowedFonts).sort()
);
});
return fontListingPromise.then(function() {
return app;
});
};