3 * Copyright(c) 2011 TJ Holowaychuk
4 * Copyright(c) 2014 Jonathan Ong
5 * Copyright(c) 2014-2015 Douglas Christopher Wilson
16 var deprecate = require('depd')('response-time')
17 var onHeaders = require('on-headers')
23 module.exports = responseTime
28 * Adds the `X-Response-Time` header displaying the response
29 * duration in milliseconds.
31 * @param {object} [options]
32 * @param {number} [options.digits=3]
37 function responseTime (options) {
38 var opts = options || {}
40 if (typeof options === 'number') {
41 // back-compat single number argument
42 deprecate('number argument: use {digits: ' + JSON.stringify(options) + '} instead')
43 opts = { digits: options }
46 // get the function to invoke
47 var fn = typeof opts !== 'function'
48 ? createSetHeader(opts)
51 return function responseTime (req, res, next) {
52 var startAt = process.hrtime()
54 onHeaders(res, function onHeaders () {
55 var diff = process.hrtime(startAt)
56 var time = diff[0] * 1e3 + diff[1] * 1e-6
66 * Create function to set respoonse time header.
70 function createSetHeader (options) {
71 // response time digits
72 var digits = options.digits !== undefined
77 var header = options.header || 'X-Response-Time'
80 var suffix = options.suffix !== undefined
81 ? Boolean(options.suffix)
84 return function setResponseHeader (req, res, time) {
85 if (res.getHeader(header)) {
89 var val = time.toFixed(digits)
95 res.setHeader(header, val)