server-timings
Version:
Adds `Server-Timings` header
54 lines (40 loc) • 1.17 kB
JavaScript
const onHeaders = require('on-headers');
const start = timings => key => {
timings[key] = {
start: process.hrtime(),
};
return timings[key].start;
};
const end = timings => key => {
if (!timings[key] || !timings[key].start) {
return;
}
timings[key].end = process.hrtime(timings[key].start);
timings[key].delta = (timings[key].end[1]/1000000).toFixed(2);
return timings[key].delta;
}
module.exports = (req, res, next) => {
const timings = {};
res.locals.timings = {
start: start(timings),
end: end(timings),
};
res.locals.timings.start('Request');
onHeaders(res, () => {
const existingHeaders = res.getHeader('Server-Timing');
const mapping = [].concat(existingHeaders || []).concat(Object.keys(timings).map((key, i) => {
const delta = timings[key].delta || end(timings)(key);
return `${i}; dur=${delta}; desc="${key}"`
}).join(', '));
res.setHeader('Server-Timing', mapping);
});
next();
};
module.exports.start = opts => (req, res, next) => {
res.locals.timings.start(opts);
next();
};
module.exports.end = opts => (req, res, next) => {
res.locals.timings.end(opts);
next();
};