Skip to content

Commit

Permalink
Set request.timings and response.timings
Browse files Browse the repository at this point in the history
  • Loading branch information
szmarczak committed Nov 15, 2019
1 parent ac9d86c commit 89f1a9b
Show file tree
Hide file tree
Showing 3 changed files with 52 additions and 1 deletion.
22 changes: 21 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,6 @@ Yarn:
## Usage
```js
'use strict';
const https = require('https');
const timer = require('@szmarczak/http-timer');

Expand Down Expand Up @@ -83,6 +82,27 @@ If something has not been measured yet, it will be `undefined`.

**Note**: The time is a `number` representing the milliseconds elapsed since the UNIX epoch.

You can also access the timings through `request.timings` or `response.timings`:

```js
const https = require('https');
const timer = require('@szmarczak/http-timer');

const request = https.get('https://httpbin.org/anything');
const timings = timer(request);

console.log(request.timings === timings);
// => true

request.on('response', response => {
response.on('data', () => {}); // Consume the data somehow
response.on('end', () => {
console.log(response.timings === timings);
// => true
});
});
```

## License

MIT
14 changes: 14 additions & 0 deletions source/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,16 @@ export interface Timings {
};
}

declare module 'http' {
interface ClientRequest {
timings?: Timings;
}

interface IncomingMessage {
timings?: Timings;
}
}

const timer = (request: ClientRequest): Timings => {
const timings: Timings = {
start: Date.now(),
Expand All @@ -48,6 +58,8 @@ const timer = (request: ClientRequest): Timings => {
}
};

request.timings = timings;

const handleError = (origin: EventEmitter): void => {
const emit = origin.emit.bind(origin);
origin.emit = (event, ...args) => {
Expand Down Expand Up @@ -108,6 +120,8 @@ const timer = (request: ClientRequest): Timings => {
timings.response = Date.now();
timings.phases.firstByte = timings.response - timings.upload!;

response.timings = timings;

handleError(response);

response.prependOnceListener('end', () => {
Expand Down
17 changes: 17 additions & 0 deletions test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -222,3 +222,20 @@ test('no `tls` phase for http requests', async t => {
t.is(timings.secureConnect, undefined);
t.is(timings.phases.tls, undefined);
});

test('timings are accessible via `request.timings`', t => {
const {request, timings} = makeRequest('https://google.com');
request.abort();

t.is(request.timings, timings);
});

test('timings are accessible via `response.timings`', async t => {
const {request, timings} = makeRequest('https://google.com');

const response = await pEvent(request, 'response');
t.is(response.timings, timings);

response.resume();
await pEvent(response, 'end');
});

0 comments on commit 89f1a9b

Please sign in to comment.