readme-metric-reporter-express
Version:
Report Express.js usage metrics to README.com
119 lines • 5.07 kB
JavaScript
"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