Skip to content

Commit 89f1a9b

Browse files
committed
Set request.timings and response.timings
1 parent ac9d86c commit 89f1a9b

File tree

3 files changed

+52
-1
lines changed

3 files changed

+52
-1
lines changed

README.md

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@ Yarn:
1919
2020
## Usage
2121
```js
22-
'use strict';
2322
const https = require('https');
2423
const timer = require('@szmarczak/http-timer');
2524

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

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

85+
You can also access the timings through `request.timings` or `response.timings`:
86+
87+
```js
88+
const https = require('https');
89+
const timer = require('@szmarczak/http-timer');
90+
91+
const request = https.get('https://httpbin.org/anything');
92+
const timings = timer(request);
93+
94+
console.log(request.timings === timings);
95+
// => true
96+
97+
request.on('response', response => {
98+
response.on('data', () => {}); // Consume the data somehow
99+
response.on('end', () => {
100+
console.log(response.timings === timings);
101+
// => true
102+
});
103+
});
104+
```
105+
86106
## License
87107

88108
MIT

source/index.ts

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,16 @@ export interface Timings {
2525
};
2626
}
2727

28+
declare module 'http' {
29+
interface ClientRequest {
30+
timings?: Timings;
31+
}
32+
33+
interface IncomingMessage {
34+
timings?: Timings;
35+
}
36+
}
37+
2838
const timer = (request: ClientRequest): Timings => {
2939
const timings: Timings = {
3040
start: Date.now(),
@@ -48,6 +58,8 @@ const timer = (request: ClientRequest): Timings => {
4858
}
4959
};
5060

61+
request.timings = timings;
62+
5163
const handleError = (origin: EventEmitter): void => {
5264
const emit = origin.emit.bind(origin);
5365
origin.emit = (event, ...args) => {
@@ -108,6 +120,8 @@ const timer = (request: ClientRequest): Timings => {
108120
timings.response = Date.now();
109121
timings.phases.firstByte = timings.response - timings.upload!;
110122

123+
response.timings = timings;
124+
111125
handleError(response);
112126

113127
response.prependOnceListener('end', () => {

test.ts

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -222,3 +222,20 @@ test('no `tls` phase for http requests', async t => {
222222
t.is(timings.secureConnect, undefined);
223223
t.is(timings.phases.tls, undefined);
224224
});
225+
226+
test('timings are accessible via `request.timings`', t => {
227+
const {request, timings} = makeRequest('https://google.com');
228+
request.abort();
229+
230+
t.is(request.timings, timings);
231+
});
232+
233+
test('timings are accessible via `response.timings`', async t => {
234+
const {request, timings} = makeRequest('https://google.com');
235+
236+
const response = await pEvent(request, 'response');
237+
t.is(response.timings, timings);
238+
239+
response.resume();
240+
await pEvent(response, 'end');
241+
});

0 commit comments

Comments
 (0)