UNPKG

readme-metric-reporter-express

Version:
119 lines 5.07 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.report = void 0; const crypto_1 = require("crypto"); const os_1 = require("os"); const url_1 = require("url"); const serialize_1 = require("./utils/serialize"); // eslint-disable-next-line @typescript-eslint/no-var-requires const { name, version } = require('../package.json'); const comment = `${(0, os_1.type)()}/${(0, os_1.release)()}`.toLowerCase(); const EXPLORER_HEADER = 'x-readme-api-explorer'; const LOG_URL_HEADER = 'x-documentation-url'; function report({ collector, reporter, createUUID = () => (0, crypto_1.randomUUID)(), baseUrl }) { return (req, res, next) => { const start = new Date(); const _id = createUUID(req, res); const isExplorer = typeof req.header(EXPLORER_HEADER) === 'string'; /** * Capture outgoing response body */ let _body; const _send = res.send; res.send = function send(body) { _body = body; res.send = _send; return res.send(body); }; if (isExplorer && typeof baseUrl === 'string') { const url = new url_1.URL(baseUrl); url.pathname = `/logs/${_id}`; res.setHeader(LOG_URL_HEADER, url.toString()); } res.once('finish', async () => { try { const end = new Date(); const elapsed = end.getTime() - start.getTime(); const url = req.protocol + '://' + req.get('host') + req.originalUrl; const httpVersion = `${req.protocol.toUpperCase()}/${req.httpVersion}`; const queryString = Object.entries(req.query).reduce((arr, [name, value]) => { if (value) { arr.push({ name, value: value.toString(), }); } return arr; }, []); const requestHeaders = Object.entries(req.headers).reduce((arr, [name, value]) => { if (value) { arr.push({ name, value: value.toString(), }); } return arr; }, []); const responseHeaders = Object.entries(res.getHeaders()).reduce((arr, [name, value]) => { if (value) { arr.push({ name, value: value.toString(), }); } return arr; }, []); await reporter.report(collector.collect(req, res, { _id, group: { id: req.ip, }, clientIPAddress: req.ip, request: { log: { creator: { name, version, comment, }, entries: [ { startedDateTime: end.toISOString(), time: elapsed, pageref: url, request: { url, method: req.method, headers: requestHeaders, httpVersion: httpVersion, queryString: queryString, postData: { mimeType: req.header('content-type')?.toString(), text: (0, serialize_1.serialize)(req.body), }, }, response: { status: res.statusCode, statusText: res.statusMessage, headers: responseHeaders, content: { mimeType: req.header('content-type')?.toString(), size: req.socket.bytesWritten, text: (0, serialize_1.serialize)(_body), }, }, }, ], }, }, })); } catch { /* istanbul ignore next */ } }); next(); }; } exports.report = report; //# sourceMappingURL=report.js.map