From 711af02928074392c05421db8e15e4de0a874be9 Mon Sep 17 00:00:00 2001 From: zadam Date: Wed, 6 Oct 2021 20:52:23 +0200 Subject: [PATCH] fixed leaking entities into the responses and thus increased performance of e.g. create/duplicate note --- src/public/app/services/server.js | 4 +++ src/routes/routes.js | 54 ++++++++++++++++++++++++------- src/services/log.js | 4 +-- 3 files changed, 49 insertions(+), 13 deletions(-) diff --git a/src/public/app/services/server.js b/src/public/app/services/server.js index f7e229b02..1a209fef8 100644 --- a/src/public/app/services/server.js +++ b/src/public/app/services/server.js @@ -156,6 +156,10 @@ if (utils.isElectron()) { } if (arg.statusCode >= 200 && arg.statusCode < 300) { + if (arg.headers['Content-Type'] === 'application/json') { + arg.body = JSON.parse(arg.body); + } + reqResolves[arg.requestId]({ body: arg.body, headers: arg.headers diff --git a/src/routes/routes.js b/src/routes/routes.js index 6f7af21ce..6ffa5c8a0 100644 --- a/src/routes/routes.js +++ b/src/routes/routes.js @@ -57,9 +57,8 @@ const csrfMiddleware = csurf({ path: '' // nothing so cookie is valid only for current path }); -function apiResultHandler(req, res, result) { - res.setHeader('trilium-max-entity-change-id', entityChangesService.getMaxEntityChangeId()); - +/** Handling common patterns. If entity is not caught, serialization to JSON will fail */ +function convertEntitiesToPojo(result) { if (result instanceof AbstractEntity) { result = result.getPojo(); } @@ -70,22 +69,55 @@ function apiResultHandler(req, res, result) { } } } + else { + if (result && result.note instanceof AbstractEntity) { + result.note = result.note.getPojo(); + } + + if (result && result.branch instanceof AbstractEntity) { + result.branch = result.branch.getPojo(); + } + } + + return result; +} + +function apiResultHandler(req, res, result) { + res.setHeader('trilium-max-entity-change-id', entityChangesService.getMaxEntityChangeId()); + + result = convertEntitiesToPojo(result); // if it's an array and first element is integer then we consider this to be [statusCode, response] format if (Array.isArray(result) && result.length > 0 && Number.isInteger(result[0])) { const [statusCode, response] = result; - res.status(statusCode).send(response); - if (statusCode !== 200 && statusCode !== 201 && statusCode !== 204) { log.info(`${req.method} ${req.originalUrl} returned ${statusCode} with response ${JSON.stringify(response)}`); } + + return send(res, statusCode, response); } else if (result === undefined) { - res.status(204).send(); + return send(res, 204, ""); } else { - res.send(result); + return send(res, 200, result); + } +} + +function send(res, statusCode, response) { + if (typeof response === 'string') { + res.status(statusCode, response); + + return response.length; + } + else { + const json = JSON.stringify(response); + + res.setHeader("Content-Type", "application/json"); + res.status(statusCode).send(json); + + return json.length; } } @@ -115,9 +147,9 @@ function route(method, path, middleware, routeHandler, resultHandler, transactio if (result && result.then) { result .then(actualResult => { - resultHandler(req, res, actualResult); + const responseLength = resultHandler(req, res, actualResult); - log.request(req, res, Date.now() - start); + log.request(req, res, Date.now() - start, responseLength); }) .catch(e => { log.error(`${method} ${path} threw exception: ` + e.stack); @@ -126,9 +158,9 @@ function route(method, path, middleware, routeHandler, resultHandler, transactio }); } else { - resultHandler(req, res, result); + const responseLength = resultHandler(req, res, result); - log.request(req, res, Date.now() - start); + log.request(req, res, Date.now() - start, responseLength); } } } diff --git a/src/services/log.js b/src/services/log.js index c06f75167..cdbd5e7fd 100644 --- a/src/services/log.js +++ b/src/services/log.js @@ -68,7 +68,7 @@ function error(message) { const requestBlacklist = [ "/libraries", "/app", "/images", "/stylesheets" ]; -function request(req, res, timeMs) { +function request(req, res, timeMs, responseLength = "?") { for (const bl of requestBlacklist) { if (req.url.startsWith(bl)) { return; @@ -80,7 +80,7 @@ function request(req, res, timeMs) { } info((timeMs >= 10 ? "Slow " : "") + - res.statusCode + " " + req.method + " " + req.url + " took " + timeMs + "ms"); + `${res.statusCode} ${req.method} ${req.url} with ${responseLength} bytes took ${timeMs}ms`); } function pad(num) {