Skip to content

Commit

Permalink
Export a ClientRequest and IncomingMessage interface with timings (#14)
Browse files Browse the repository at this point in the history
  • Loading branch information
szmarczak committed Dec 27, 2019
1 parent bbad003 commit 2aaa944
Show file tree
Hide file tree
Showing 2 changed files with 27 additions and 14 deletions.
18 changes: 8 additions & 10 deletions source/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -25,17 +25,15 @@ export interface Timings {
};
}

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

interface IncomingMessage {
timings?: Timings;
}
export interface ClientRequestWithTimings extends ClientRequest {
timings?: Timings;
}

const timer = (request: ClientRequest): Timings => {
export interface IncomingMessageWithTimings extends IncomingMessage {
timings?: Timings;
}

const timer = (request: ClientRequestWithTimings): Timings => {
const timings: Timings = {
start: Date.now(),
socket: undefined,
Expand Down Expand Up @@ -116,7 +114,7 @@ const timer = (request: ClientRequest): Timings => {
timings.phases.request = timings.upload - (timings.secureConnect || timings.connect!);
});

request.prependOnceListener('response', (response: IncomingMessage): void => {
request.prependOnceListener('response', (response: IncomingMessageWithTimings): void => {
timings.response = Date.now();
timings.phases.firstByte = timings.response - timings.upload!;

Expand Down
23 changes: 19 additions & 4 deletions test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import {AddressInfo} from 'net';
import util from 'util';
import pEvent from 'p-event';
import test from 'ava';
import timer, {Timings} from './source';
import timer, {Timings, ClientRequestWithTimings, IncomingMessageWithTimings} from './source';

let server: http.Server & {
url?: string;
Expand Down Expand Up @@ -227,15 +227,30 @@ test('timings are accessible via `request.timings`', t => {
const {request, timings} = makeRequest('https://google.com');
request.abort();

t.is(request.timings, timings);
const typedRequest = request as ClientRequestWithTimings;

t.is(typedRequest.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);
const response: IncomingMessage = await pEvent(request, 'response');
const typedResponse = response as IncomingMessageWithTimings;

t.is(typedResponse.timings, timings);

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

test('can extend `http.IncomingMessage`', t => {
interface Response extends IncomingMessage {
timings: boolean;
}

// eslint-disable-next-line no-unused-expressions
0 as unknown as Response;

t.pass();
});

0 comments on commit 2aaa944

Please sign in to comment.