feature/IO-3052-Skia-Canvas-Handler: Cleanup
Signed-off-by: Dave Richer <dave@imexsystems.ca>
This commit is contained in:
25
server/middleware/validateCanvasInputMiddleware.js
Normal file
25
server/middleware/validateCanvasInputMiddleware.js
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
const { isObject } = require("lodash");
|
||||||
|
|
||||||
|
const validateCanvasInputMiddleware = (req, res, next) => {
|
||||||
|
const { values, keys, override } = req.body;
|
||||||
|
|
||||||
|
if (!Array.isArray(values) || !Array.isArray(keys)) {
|
||||||
|
return res.status(400).send("Invalid input: 'values' and 'keys' must be arrays.");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (values.some((value) => typeof value !== "number")) {
|
||||||
|
return res.status(400).send("Invalid input: 'values' must be an array of numbers.");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (keys.some((key) => typeof key !== "string")) {
|
||||||
|
return res.status(400).send("Invalid input: 'keys' must be an array of strings.");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (override && !isObject(override)) {
|
||||||
|
return res.status(400).send("Override must be an object");
|
||||||
|
}
|
||||||
|
|
||||||
|
next(); // Proceed to the next middleware or route handler
|
||||||
|
};
|
||||||
|
|
||||||
|
module.exports = validateCanvasInputMiddleware;
|
||||||
@@ -1,11 +1,9 @@
|
|||||||
const { createCanvas } = require("canvas");
|
const { createCanvas } = require("canvas");
|
||||||
const { Canvas, FontLibrary } = require("skia-canvas");
|
const { Canvas, FontLibrary } = require("skia-canvas");
|
||||||
const { performance } = require("perf_hooks");
|
|
||||||
const Chart = require("chart.js/auto");
|
const Chart = require("chart.js/auto");
|
||||||
const logger = require("../utils/logger");
|
|
||||||
|
|
||||||
const { backgroundColors, borderColors } = require("./canvas-colors");
|
const { backgroundColors, borderColors } = require("./canvas-colors");
|
||||||
const { isObject, defaultsDeep, isNumber } = require("lodash");
|
const { defaultsDeep, isNumber } = require("lodash");
|
||||||
|
|
||||||
try {
|
try {
|
||||||
FontLibrary.use("Montserrat", [
|
FontLibrary.use("Montserrat", [
|
||||||
@@ -62,45 +60,16 @@ const getChartConfiguration = (keys, values, override) => {
|
|||||||
return defaultsDeep(override || {}, defaultConfiguration);
|
return defaultsDeep(override || {}, defaultConfiguration);
|
||||||
};
|
};
|
||||||
|
|
||||||
// Utility to validate input
|
|
||||||
const validateCanvasInput = ({ values, keys, override }, res) => {
|
|
||||||
if (!Array.isArray(values) || !Array.isArray(keys)) {
|
|
||||||
res.status(400).send("Invalid input: 'values' and 'keys' must be arrays.");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (values.some((value) => typeof value !== "number")) {
|
|
||||||
res.status(400).send("Invalid input: 'values' must be an array of numbers.");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (keys.some((key) => typeof key !== "string")) {
|
|
||||||
res.status(400).send("Invalid input: 'keys' must be an array of strings.");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (override && !isObject(override)) {
|
|
||||||
res.status(400).send("Override must be an object");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
};
|
|
||||||
|
|
||||||
exports.canvastest = function (req, res) {
|
exports.canvastest = function (req, res) {
|
||||||
//console.log("Incoming test request.", req);
|
|
||||||
res.status(200).send("OK");
|
res.status(200).send("OK");
|
||||||
};
|
};
|
||||||
|
|
||||||
exports.canvas = function (req, res) {
|
exports.canvas = function (req, res) {
|
||||||
const startTime = performance.now();
|
const { logger } = req;
|
||||||
|
|
||||||
const { w, h, values, keys, override } = req.body;
|
const { w, h, values, keys, override } = req.body;
|
||||||
//console.log("Incoming Canvas Request:", w, h, values, keys, override);
|
|
||||||
logger.log("inbound-canvas-creation", "debug", "jsr", null, { w, h, values, keys, override });
|
logger.log("inbound-canvas-creation", "debug", "jsr", null, { w, h, values, keys, override });
|
||||||
|
|
||||||
if (!validateCanvasInput(req.body, res)) return;
|
|
||||||
|
|
||||||
// Set the default Width and Height
|
// Set the default Width and Height
|
||||||
let [width, height] = [500, 275];
|
let [width, height] = [500, 275];
|
||||||
|
|
||||||
@@ -122,18 +91,15 @@ exports.canvas = function (req, res) {
|
|||||||
return canvas.toDataURL();
|
return canvas.toDataURL();
|
||||||
})()
|
})()
|
||||||
);
|
);
|
||||||
console.log("Canvas generation time:", performance.now() - startTime, "ms");
|
|
||||||
};
|
};
|
||||||
|
|
||||||
exports.canvasSkia = async function (req, res) {
|
exports.canvasSkia = async function (req, res) {
|
||||||
const startTime = performance.now();
|
const { logger } = req;
|
||||||
const { w, h, values, keys, override } = req.body;
|
const { w, h, values, keys, override } = req.body;
|
||||||
|
|
||||||
// Log incoming request for debugging
|
// Log incoming request for debugging
|
||||||
logger.log("inbound-canvas-creation", "debug", "jsr", null, { w, h, values, keys, override });
|
logger.log("inbound-canvas-creation", "debug", "jsr", null, { w, h, values, keys, override });
|
||||||
|
|
||||||
if (!validateCanvasInput(req.body, res)) return;
|
|
||||||
|
|
||||||
// Default width and height
|
// Default width and height
|
||||||
const width = typeof w === "number" && w > 0 ? w : 500;
|
const width = typeof w === "number" && w > 0 ? w : 500;
|
||||||
const height = typeof h === "number" && h > 0 ? h : 275;
|
const height = typeof h === "number" && h > 0 ? h : 275;
|
||||||
@@ -154,11 +120,9 @@ exports.canvasSkia = async function (req, res) {
|
|||||||
|
|
||||||
// Send the Base64-encoded image as the response
|
// Send the Base64-encoded image as the response
|
||||||
res.status(200).send(dataURL);
|
res.status(200).send(dataURL);
|
||||||
console.log("Canvas generation time:", performance.now() - startTime, "ms");
|
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
// Log and handle rendering errors
|
// Log and handle rendering errors
|
||||||
logger.log("canvas-error", "error", "jsr", null, { error: error.message });
|
logger.log("canvas-error", "error", "jsr", null, { error: error.message });
|
||||||
console.error("Error generating chart:", error.message);
|
|
||||||
res.status(500).send("Failed to generate canvas.");
|
res.status(500).send("Failed to generate canvas.");
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -3,10 +3,11 @@ const router = express.Router();
|
|||||||
const { inlinecss } = require("../render/inlinecss");
|
const { inlinecss } = require("../render/inlinecss");
|
||||||
const validateFirebaseIdTokenMiddleware = require("../middleware/validateFirebaseIdTokenMiddleware");
|
const validateFirebaseIdTokenMiddleware = require("../middleware/validateFirebaseIdTokenMiddleware");
|
||||||
const { canvas, canvasSkia } = require("../render/canvas-handler");
|
const { canvas, canvasSkia } = require("../render/canvas-handler");
|
||||||
|
const validateCanvasInputMiddleware = require("../middleware/validateCanvasInputMiddleware");
|
||||||
|
|
||||||
// Define the route for inline CSS rendering
|
// Define the route for inline CSS rendering
|
||||||
router.post("/inlinecss", validateFirebaseIdTokenMiddleware, inlinecss);
|
router.post("/inlinecss", validateFirebaseIdTokenMiddleware, inlinecss);
|
||||||
router.post("/canvas", validateFirebaseIdTokenMiddleware, canvas);
|
router.post("/canvas", [validateFirebaseIdTokenMiddleware, validateCanvasInputMiddleware], canvas);
|
||||||
router.post("/canvas-skia", validateFirebaseIdTokenMiddleware, canvasSkia);
|
router.post("/canvas-skia", [validateFirebaseIdTokenMiddleware, validateCanvasInputMiddleware], canvasSkia);
|
||||||
|
|
||||||
module.exports = router;
|
module.exports = router;
|
||||||
|
|||||||
Reference in New Issue
Block a user