diff --git a/source/index.ts b/source/index.ts index ba3c0dd..b9847d7 100644 --- a/source/index.ts +++ b/source/index.ts @@ -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, @@ -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!; diff --git a/test.ts b/test.ts index 385e03f..e4b6536 100644 --- a/test.ts +++ b/test.ts @@ -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; @@ -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(); +});