From ca9e74ece40dfc0af06ac709d85d8574194b2e09 Mon Sep 17 00:00:00 2001 From: KernelDeimos Date: Tue, 14 Jan 2025 13:43:50 -0500 Subject: [PATCH] dev: measure request transfer amount --- src/backend/src/middleware/measure.js | 48 +++++++++++++++++++ .../src/modules/web/WebServerService.js | 4 ++ 2 files changed, 52 insertions(+) create mode 100644 src/backend/src/middleware/measure.js diff --git a/src/backend/src/middleware/measure.js b/src/backend/src/middleware/measure.js new file mode 100644 index 000000000..2956d09f3 --- /dev/null +++ b/src/backend/src/middleware/measure.js @@ -0,0 +1,48 @@ +const express = require('express'); +const { PassThrough } = require('stream'); +const { pausing_tee } = require('../util/streamutil'); + +function measure () { + return async (req, res, next) => { + if ( ! req.readable ) { + return next(); + } + + let sz_incoming = 0; + // let sz_outgoing = 0; // future + + try { + const [req_monitor, req_pass] = pausing_tee(req, 2); + + req_monitor.on('data', (chunk) => { + sz_incoming += chunk.length; + }); + + const replaces = ['readable', 'pipe', 'on', 'once', 'removeListener']; + for ( const replace of replaces ) { + const replacement = req_pass[replace] + Object.defineProperty(req, replace, { + get () { + if ( typeof replacement === 'function' ) { + return replacement.bind(req_pass); + } + return replacement; + } + }); + } + } catch (e) { + console.error(e); + return next(); + } + + // Wait for the request to finish processing + res.on('finish', () => { + console.log(`Incoming Data: ${sz_incoming} bytes`); + // console.log(`Outgoing Data: ${sz_outgoing} bytes`); // future + }); + + next(); + }; +} + +module.exports = measure; diff --git a/src/backend/src/modules/web/WebServerService.js b/src/backend/src/modules/web/WebServerService.js index 3f910ba9e..a47192ddc 100644 --- a/src/backend/src/modules/web/WebServerService.js +++ b/src/backend/src/modules/web/WebServerService.js @@ -26,6 +26,7 @@ const config = require('../../config.js'); var http = require('http'); const fs = require('fs'); const auth = require('../../middleware/auth.js'); +const measure = require('../../middleware/measure.js'); const { surrounding_box, es_import_promise } = require('../../fun/dev-console-ui-utils.js'); const relative_require = require; @@ -330,6 +331,9 @@ class WebServerService extends BaseService { next(); }); + // Measure data transfer amounts + app.use(measure()); + // Instrument logging to use our log service { const morgan = require('morgan');