├── .eslintrc.yml ├── .github └── dependabot.yml ├── .gitignore ├── .npmrc ├── .travis.yml ├── History.md ├── Readme.md ├── example.js ├── index.js ├── package.json └── test ├── .eslintrc.yml └── index.js /.eslintrc.yml: -------------------------------------------------------------------------------- 1 | extends: koa -------------------------------------------------------------------------------- /.github/dependabot.yml: -------------------------------------------------------------------------------- 1 | version: 2 2 | updates: 3 | - package-ecosystem: npm 4 | directory: "/" 5 | schedule: 6 | interval: daily 7 | open-pull-requests-limit: 5 8 | versioning-strategy: increase-if-necessary 9 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | package-lock.json 3 | -------------------------------------------------------------------------------- /.npmrc: -------------------------------------------------------------------------------- 1 | package-lock=false 2 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | node_js: 2 | - 12 3 | - 14 4 | - 16 5 | sudo: false 6 | language: node_js 7 | script: "npm run-script test" 8 | -------------------------------------------------------------------------------- /History.md: -------------------------------------------------------------------------------- 1 | 2 | 2.1.0 / 2018-11-27 3 | ================== 4 | 5 | * use hrtime to support nano time and improve performance (#10) 6 | * add eslint 7 | * add tests 8 | * add travis 9 | 10 | 2.0.0 / 2016-03-23 11 | ================== 12 | 13 | * update to koa v2 middleware signature 14 | 15 | 1.0.1 / 2013-12-21 16 | ================== 17 | 18 | * update to new middleware signature 19 | -------------------------------------------------------------------------------- /Readme.md: -------------------------------------------------------------------------------- 1 | 2 | # koa-response-time 3 | 4 | [![Greenkeeper badge](https://badges.greenkeeper.io/koajs/response-time.svg)](https://greenkeeper.io/) 5 | 6 | X-Response-Time middleware for [koa](https://github.com/koajs/koa). Compatible with [request-received](https://github.com/cabinjs/request-received). 7 | 8 | ## Installation 9 | 10 | ```js 11 | $ npm install koa-response-time 12 | ``` 13 | 14 | ## Usage 15 | 16 | Basic usage: 17 | 18 | ```js 19 | const Koa = require('koa'); 20 | const responseTime = require('koa-response-time'); 21 | const app = new Koa(); 22 | 23 | app.use(responseTime()); 24 | ``` 25 | 26 | If you need response high resolution in nano time, set `hrtime` option to `true`: 27 | 28 | ```js 29 | app.use(responseTime({ hrtime: true })); 30 | ``` 31 | 32 | 33 | Sample response header with `hrtime = false` (default): 34 | 35 | ``` 36 | X-Response-Time: 153ms 37 | ``` 38 | 39 | Sample response header with `hrtime = true`: 40 | 41 | ``` 42 | X-Response-Time: 153.123581ms 43 | ``` 44 | 45 | ## Note 46 | 47 | Best to `.use()` at the _top_ before any other middleware, 48 | to wrap all subsequent middleware. 49 | 50 | ## License 51 | 52 | MIT 53 | -------------------------------------------------------------------------------- /example.js: -------------------------------------------------------------------------------- 1 | 2 | const responseTime = require('./'); 3 | const Koa = require('koa'); 4 | const app = new Koa(); 5 | 6 | app.use(responseTime({ hrtime: true })); 7 | 8 | app.use((ctx, next) => { 9 | return next().then(() => { 10 | return sleep(150); 11 | }).then(() => { 12 | ctx.body = 'Hello'; 13 | }); 14 | }); 15 | 16 | function sleep(ms) { 17 | return new Promise((resolve, reject) => { 18 | setTimeout(() => { 19 | resolve(); 20 | }, ms); 21 | }); 22 | } 23 | 24 | app.listen(3000); 25 | 26 | console.log('listening on port 3000'); 27 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Expose `responseTime()`. 3 | */ 4 | 5 | module.exports = responseTime; 6 | 7 | const defaultProps = { hrtime: false }; 8 | 9 | /** 10 | * @typedef {import("koa").Middleware} Middleware 11 | */ 12 | 13 | /** 14 | * Add X-Response-Time header field. 15 | * @param {Object} options options dictionary. { hrtime } 16 | * @param {boolean} options.hrtime 17 | * - `true` to use time in nanoseconds. 18 | * - `false` to use time in milliseconds. 19 | * Default is `false` to keep back compatible. 20 | * @return {Middleware} Koa Middleware 21 | * @api public 22 | */ 23 | function responseTime(options = defaultProps) { 24 | const hrtime = options && options.hrtime; 25 | const header = (options && options.header) || 'X-Response-Time'; 26 | return function responseTime(ctx, next) { 27 | const start = ctx[Symbol.for('request-received.startAt')] 28 | ? ctx[Symbol.for('request-received.startAt')] 29 | : process.hrtime(); 30 | return next().then(() => { 31 | let delta = process.hrtime(start); 32 | // Format to high resolution time with nano time 33 | delta = delta[0] * 1000 + delta[1] / 1000000; 34 | if (!hrtime) { 35 | // truncate to milliseconds. 36 | delta = Math.round(delta); 37 | } 38 | ctx.set(header, delta + 'ms'); 39 | }); 40 | }; 41 | } 42 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "koa-response-time", 3 | "description": "X-Repsonse-Time middleware for koa", 4 | "repository": "koajs/response-time", 5 | "version": "2.1.0", 6 | "scripts": { 7 | "lint": "eslint . --fix", 8 | "test": "mocha --exit" 9 | }, 10 | "keywords": [ 11 | "koa", 12 | "middleware", 13 | "response", 14 | "duration" 15 | ], 16 | "files": [ 17 | "index.js" 18 | ], 19 | "devDependencies": { 20 | "eslint": "^6.0.0", 21 | "eslint-config-koa": "^2.0.2", 22 | "eslint-config-standard": "^14.0.0", 23 | "eslint-plugin-import": "^2.14.0", 24 | "eslint-plugin-node": "^11.0.0", 25 | "eslint-plugin-promise": "^4.0.1", 26 | "eslint-plugin-standard": "^4.0.0", 27 | "koa": "^2.6.2", 28 | "mocha": "^7.0.1", 29 | "supertest": "^4.0.1" 30 | }, 31 | "license": "MIT" 32 | } 33 | -------------------------------------------------------------------------------- /test/.eslintrc.yml: -------------------------------------------------------------------------------- 1 | env: 2 | mocha: true 3 | -------------------------------------------------------------------------------- /test/index.js: -------------------------------------------------------------------------------- 1 | 2 | const request = require('supertest'); 3 | const responseTime = require('..'); 4 | const Koa = require('koa'); 5 | 6 | describe('Test koa response time', () => { 7 | it('hrtime: false', () => { 8 | const app = new Koa(); 9 | 10 | app.use(responseTime()); 11 | 12 | return request(app.listen()) 13 | .get('/') 14 | .expect('x-response-time', /^[0-9]{1,3}ms$/) 15 | .expect(404); 16 | }); 17 | 18 | it('hrtime: true', () => { 19 | const app = new Koa(); 20 | 21 | app.use(responseTime({ 22 | hrtime: true 23 | })); 24 | 25 | return request(app.listen()) 26 | .get('/') 27 | .expect('x-response-time', /^[0-9]{1,3}.[0-9]{3,6}ms$/) 28 | .expect(404); 29 | }); 30 | 31 | it('custom header name', () => { 32 | const app = new Koa(); 33 | 34 | app.use(responseTime({ 35 | header: "Response-Time" 36 | })); 37 | 38 | return request(app.listen()) 39 | .get('/') 40 | .expect('response-time', /^[0-9]{1,3}ms$/) 41 | .expect(404); 42 | }); 43 | }); 44 | --------------------------------------------------------------------------------