fix: don't crash the server on processing issues

Use a try/catch for async functions

Signed-off-by: boldtrn <boldtrn@gmail.com>
This commit is contained in:
boldtrn 2023-09-26 10:10:00 +02:00
parent 775ea74a2a
commit c3be560fa2

View file

@ -889,148 +889,156 @@ export const serve_rendered = {
app.get( app.get(
util.format(staticPattern, centerPattern), util.format(staticPattern, centerPattern),
async (req, res, next) => { async (req, res, next) => {
try {
const item = repo[req.params.id];
if (!item) {
return res.sendStatus(404);
}
const raw = req.params.raw;
const z = +req.params.z;
let x = +req.params.x;
let y = +req.params.y;
const bearing = +(req.params.bearing || '0');
const pitch = +(req.params.pitch || '0');
const w = req.params.width | 0;
const h = req.params.height | 0;
const scale = getScale(req.params.scale);
const format = req.params.format;
if (z < 0) {
return res.status(404).send('Invalid zoom');
}
const transformer = raw
? mercator.inverse.bind(mercator)
: item.dataProjWGStoInternalWGS;
if (transformer) {
const ll = transformer([x, y]);
x = ll[0];
y = ll[1];
}
const paths = extractPathsFromQuery(req.query, transformer);
const markers = extractMarkersFromQuery(
req.query,
options,
transformer,
);
const overlay = await renderOverlay(
z,
x,
y,
bearing,
pitch,
w,
h,
scale,
paths,
markers,
req.query,
);
return respondImage(
item,
z,
x,
y,
bearing,
pitch,
w,
h,
scale,
format,
res,
next,
overlay,
'static',
);
} catch (e) {
next(e);
}
},
);
const serveBounds = async (req, res, next) => {
try {
const item = repo[req.params.id]; const item = repo[req.params.id];
if (!item) { if (!item) {
return res.sendStatus(404); return res.sendStatus(404);
} }
const raw = req.params.raw; const raw = req.params.raw;
const z = +req.params.z; const bbox = [
let x = +req.params.x; +req.params.minx,
let y = +req.params.y; +req.params.miny,
const bearing = +(req.params.bearing || '0'); +req.params.maxx,
const pitch = +(req.params.pitch || '0'); +req.params.maxy,
];
let center = [(bbox[0] + bbox[2]) / 2, (bbox[1] + bbox[3]) / 2];
const transformer = raw
? mercator.inverse.bind(mercator)
: item.dataProjWGStoInternalWGS;
if (transformer) {
const minCorner = transformer(bbox.slice(0, 2));
const maxCorner = transformer(bbox.slice(2));
bbox[0] = minCorner[0];
bbox[1] = minCorner[1];
bbox[2] = maxCorner[0];
bbox[3] = maxCorner[1];
center = transformer(center);
}
const w = req.params.width | 0; const w = req.params.width | 0;
const h = req.params.height | 0; const h = req.params.height | 0;
const scale = getScale(req.params.scale); const scale = getScale(req.params.scale);
const format = req.params.format; const format = req.params.format;
if (z < 0) { const z = calcZForBBox(bbox, w, h, req.query);
return res.status(404).send('Invalid zoom'); const x = center[0];
} const y = center[1];
const bearing = 0;
const transformer = raw const pitch = 0;
? mercator.inverse.bind(mercator)
: item.dataProjWGStoInternalWGS;
if (transformer) {
const ll = transformer([x, y]);
x = ll[0];
y = ll[1];
}
const paths = extractPathsFromQuery(req.query, transformer); const paths = extractPathsFromQuery(req.query, transformer);
const markers = extractMarkersFromQuery( const markers = extractMarkersFromQuery(
req.query, req.query,
options, options,
transformer, transformer,
); );
const overlay = await renderOverlay( const overlay = await renderOverlay(
z, z,
x, x,
y, y,
bearing, bearing,
pitch, pitch,
w, w,
h, h,
scale, scale,
paths, paths,
markers, markers,
req.query, req.query,
); );
return respondImage( return respondImage(
item, item,
z, z,
x, x,
y, y,
bearing, bearing,
pitch, pitch,
w, w,
h, h,
scale, scale,
format, format,
res, res,
next, next,
overlay, overlay,
'static', 'static',
); );
}, } catch (e) {
); next(e);
const serveBounds = async (req, res, next) => {
const item = repo[req.params.id];
if (!item) {
return res.sendStatus(404);
} }
const raw = req.params.raw;
const bbox = [
+req.params.minx,
+req.params.miny,
+req.params.maxx,
+req.params.maxy,
];
let center = [(bbox[0] + bbox[2]) / 2, (bbox[1] + bbox[3]) / 2];
const transformer = raw
? mercator.inverse.bind(mercator)
: item.dataProjWGStoInternalWGS;
if (transformer) {
const minCorner = transformer(bbox.slice(0, 2));
const maxCorner = transformer(bbox.slice(2));
bbox[0] = minCorner[0];
bbox[1] = minCorner[1];
bbox[2] = maxCorner[0];
bbox[3] = maxCorner[1];
center = transformer(center);
}
const w = req.params.width | 0;
const h = req.params.height | 0;
const scale = getScale(req.params.scale);
const format = req.params.format;
const z = calcZForBBox(bbox, w, h, req.query);
const x = center[0];
const y = center[1];
const bearing = 0;
const pitch = 0;
const paths = extractPathsFromQuery(req.query, transformer);
const markers = extractMarkersFromQuery(
req.query,
options,
transformer,
);
const overlay = await renderOverlay(
z,
x,
y,
bearing,
pitch,
w,
h,
scale,
paths,
markers,
req.query,
);
return respondImage(
item,
z,
x,
y,
bearing,
pitch,
w,
h,
scale,
format,
res,
next,
overlay,
'static',
);
}; };
const boundsPattern = util.format( const boundsPattern = util.format(
@ -1070,97 +1078,101 @@ export const serve_rendered = {
app.get( app.get(
util.format(staticPattern, autoPattern), util.format(staticPattern, autoPattern),
async (req, res, next) => { async (req, res, next) => {
const item = repo[req.params.id]; try {
if (!item) { const item = repo[req.params.id];
return res.sendStatus(404); if (!item) {
return res.sendStatus(404);
}
const raw = req.params.raw;
const w = req.params.width | 0;
const h = req.params.height | 0;
const bearing = 0;
const pitch = 0;
const scale = getScale(req.params.scale);
const format = req.params.format;
const transformer = raw
? mercator.inverse.bind(mercator)
: item.dataProjWGStoInternalWGS;
const paths = extractPathsFromQuery(req.query, transformer);
const markers = extractMarkersFromQuery(
req.query,
options,
transformer,
);
// Extract coordinates from markers
const markerCoordinates = [];
for (const marker of markers) {
markerCoordinates.push(marker.location);
}
// Create array with coordinates from markers and path
const coords = [].concat(paths.flat()).concat(markerCoordinates);
// Check if we have at least one coordinate to calculate a bounding box
if (coords.length < 1) {
return res.status(400).send('No coordinates provided');
}
const bbox = [Infinity, Infinity, -Infinity, -Infinity];
for (const pair of coords) {
bbox[0] = Math.min(bbox[0], pair[0]);
bbox[1] = Math.min(bbox[1], pair[1]);
bbox[2] = Math.max(bbox[2], pair[0]);
bbox[3] = Math.max(bbox[3], pair[1]);
}
const bbox_ = mercator.convert(bbox, '900913');
const center = mercator.inverse([
(bbox_[0] + bbox_[2]) / 2,
(bbox_[1] + bbox_[3]) / 2,
]);
// Calculate zoom level
const maxZoom = parseFloat(req.query.maxzoom);
let z = calcZForBBox(bbox, w, h, req.query);
if (maxZoom > 0) {
z = Math.min(z, maxZoom);
}
const x = center[0];
const y = center[1];
const overlay = await renderOverlay(
z,
x,
y,
bearing,
pitch,
w,
h,
scale,
paths,
markers,
req.query,
);
return respondImage(
item,
z,
x,
y,
bearing,
pitch,
w,
h,
scale,
format,
res,
next,
overlay,
'static',
);
} catch (e) {
next(e);
} }
const raw = req.params.raw;
const w = req.params.width | 0;
const h = req.params.height | 0;
const bearing = 0;
const pitch = 0;
const scale = getScale(req.params.scale);
const format = req.params.format;
const transformer = raw
? mercator.inverse.bind(mercator)
: item.dataProjWGStoInternalWGS;
const paths = extractPathsFromQuery(req.query, transformer);
const markers = extractMarkersFromQuery(
req.query,
options,
transformer,
);
// Extract coordinates from markers
const markerCoordinates = [];
for (const marker of markers) {
markerCoordinates.push(marker.location);
}
// Create array with coordinates from markers and path
const coords = [].concat(paths.flat()).concat(markerCoordinates);
// Check if we have at least one coordinate to calculate a bounding box
if (coords.length < 1) {
return res.status(400).send('No coordinates provided');
}
const bbox = [Infinity, Infinity, -Infinity, -Infinity];
for (const pair of coords) {
bbox[0] = Math.min(bbox[0], pair[0]);
bbox[1] = Math.min(bbox[1], pair[1]);
bbox[2] = Math.max(bbox[2], pair[0]);
bbox[3] = Math.max(bbox[3], pair[1]);
}
const bbox_ = mercator.convert(bbox, '900913');
const center = mercator.inverse([
(bbox_[0] + bbox_[2]) / 2,
(bbox_[1] + bbox_[3]) / 2,
]);
// Calculate zoom level
const maxZoom = parseFloat(req.query.maxzoom);
let z = calcZForBBox(bbox, w, h, req.query);
if (maxZoom > 0) {
z = Math.min(z, maxZoom);
}
const x = center[0];
const y = center[1];
const overlay = await renderOverlay(
z,
x,
y,
bearing,
pitch,
w,
h,
scale,
paths,
markers,
req.query,
);
return respondImage(
item,
z,
x,
y,
bearing,
pitch,
w,
h,
scale,
format,
res,
next,
overlay,
'static',
);
}, },
); );
} }