tileblaster
Version:
a quick and versatile map tile caching proxy
36 lines (28 loc) • 862 B
JavaScript
const stream = require("node:stream");
// deliver tile
module.exports = function({ res, opts, data }, next){
// do nothing if response stream has been used
if (res.used || res.headersSent || !res.writable || res.destroyed || res.finished || res.closed || res.piped) return next();
// if tile buffer is empty, return 204
if (data.tile.buffer.length === 0) {
res.statusCode = 204;
res.end();
res.used = true;
return next();
}
// set status and content-type
res.statusCode = data.tile.status;
// set headers
Object.entries({
...data.tile.headers, // tile-specific
...opts.headers, // from opts
"content-type": data.tile.mimetype,
"content-length": data.tile.buffer.length,
}).forEach(function([ k, v ]){
res.setHeader(k, v);
});
// send as stream
stream.Readable.from(data.tile.buffer).pipe(res);
res.used = true;
next();
};