feat(fetch): expose .timing()
make responseEnd optional make it more similar to existing types missed one!
This commit is contained in:
parent
751b939d3a
commit
8de8383165
|
|
@ -110,3 +110,26 @@ Returns the text representation of response body.
|
|||
- returns: <[string]>
|
||||
|
||||
Contains the URL of the response.
|
||||
|
||||
## method: APIResponse.timing
|
||||
* since: v1.48
|
||||
- returns: <[Object]>
|
||||
- `startTime` <[float]> Request start time in milliseconds elapsed since January 1, 1970 00:00:00 UTC
|
||||
- `domainLookupStart` <[float]> Time immediately before the client starts the domain name lookup for the
|
||||
resource. The value is given in milliseconds relative to `startTime`, -1 if not available.
|
||||
- `domainLookupEnd` <[float]> Time immediately after the client ends the domain name lookup for the resource.
|
||||
The value is given in milliseconds relative to `startTime`, -1 if not available.
|
||||
- `connectStart` <[float]> Time immediately before the client starts establishing the connection to the server
|
||||
to retrieve the resource. The value is given in milliseconds relative to `startTime`, -1 if not available.
|
||||
- `secureConnectionStart` <[float]> Time immediately before the client starts the handshake process to secure the
|
||||
current connection. The value is given in milliseconds relative to `startTime`, -1 if not available.
|
||||
- `connectEnd` <[float]> Time immediately before the client starts establishing the connection to the server
|
||||
to retrieve the resource. The value is given in milliseconds relative to `startTime`, -1 if not available.
|
||||
- `requestStart` <[float]> Time immediately before the client starts requesting the resource from the server. The value is given in milliseconds relative to `startTime`, -1 if not available.
|
||||
- `responseStart` <[float]> Time immediately after the client receives the first byte of the response from the server. The value is given in milliseconds relative to `startTime`, -1 if not available.
|
||||
- `responseEnd` <[float]> Time immediately after the client receives the last byte of the resource or immediately
|
||||
before the transport connection is closed, whichever comes first. The value is given in milliseconds relative to
|
||||
`startTime`, -1 if not available.
|
||||
|
||||
Returns resource timing information for given response. Find more information at
|
||||
[Resource Timing API](https://developer.mozilla.org/en-US/docs/Web/API/PerformanceResourceTiming).
|
||||
|
|
|
|||
|
|
@ -314,7 +314,7 @@ Returns resource size information for given request.
|
|||
- `startTime` <[float]> Request start time in milliseconds elapsed since January 1, 1970 00:00:00 UTC
|
||||
- `domainLookupStart` <[float]> Time immediately before the browser starts the domain name lookup for the
|
||||
resource. The value is given in milliseconds relative to `startTime`, -1 if not available.
|
||||
- `domainLookupEnd` <[float]> Time immediately after the browser starts the domain name lookup for the resource.
|
||||
- `domainLookupEnd` <[float]> Time immediately after the browser ends the domain name lookup for the resource.
|
||||
The value is given in milliseconds relative to `startTime`, -1 if not available.
|
||||
- `connectStart` <[float]> Time immediately before the user agent starts establishing the connection to the server
|
||||
to retrieve the resource. The value is given in milliseconds relative to `startTime`, -1 if not available.
|
||||
|
|
|
|||
|
|
@ -332,6 +332,13 @@ export class APIResponse implements api.APIResponse {
|
|||
return this._headers.headersArray();
|
||||
}
|
||||
|
||||
timing() {
|
||||
return {
|
||||
...this._initializer.timing,
|
||||
responseEnd: this._initializer.responseEndTiming,
|
||||
};
|
||||
}
|
||||
|
||||
async body(): Promise<Buffer> {
|
||||
try {
|
||||
const result = await this._request._channel.fetchResponseBody({ fetchUid: this._fetchUid() });
|
||||
|
|
|
|||
|
|
@ -224,6 +224,8 @@ scheme.APIResponse = tObject({
|
|||
status: tNumber,
|
||||
statusText: tString,
|
||||
headers: tArray(tType('NameValue')),
|
||||
timing: tType('ResourceTiming'),
|
||||
responseEndTiming: tNumber,
|
||||
});
|
||||
scheme.LifecycleEvent = tEnum(['load', 'domcontentloaded', 'networkidle', 'commit']);
|
||||
scheme.LocalUtilsInitializer = tObject({
|
||||
|
|
|
|||
|
|
@ -212,7 +212,9 @@ export class APIRequestContextDispatcher extends Dispatcher<APIRequestContext, c
|
|||
status: fetchResponse.status,
|
||||
statusText: fetchResponse.statusText,
|
||||
headers: fetchResponse.headers,
|
||||
fetchUid: fetchResponse.fetchUid
|
||||
fetchUid: fetchResponse.fetchUid,
|
||||
timing: fetchResponse.timing,
|
||||
responseEndTiming: fetchResponse.responseEndTiming,
|
||||
}
|
||||
};
|
||||
}
|
||||
|
|
|
|||
|
|
@ -422,6 +422,20 @@ export abstract class APIRequestContext extends SdkObject {
|
|||
|
||||
const chunks: Buffer[] = [];
|
||||
const notifyBodyFinished = () => {
|
||||
const endAt = monotonicTime();
|
||||
// spec: https://developer.mozilla.org/en-US/docs/Web/API/PerformanceResourceTiming
|
||||
const timing: channels.ResourceTiming = {
|
||||
startTime: startAt,
|
||||
domainLookupStart: dnsLookupAt ? 0 : -1,
|
||||
domainLookupEnd: dnsLookupAt ? dnsLookupAt! - startAt : -1,
|
||||
connectStart: dnsLookupAt ? dnsLookupAt! - startAt : 0,
|
||||
secureConnectionStart: dnsLookupAt ? dnsLookupAt! - startAt : 0,
|
||||
connectEnd: (tlsHandshakeAt ?? tcpConnectionAt!) - startAt,
|
||||
requestStart: (tlsHandshakeAt ?? tcpConnectionAt!) - startAt,
|
||||
responseStart: responseAt - startAt,
|
||||
};
|
||||
const responseEndTiming = endAt - startAt;
|
||||
|
||||
const body = Buffer.concat(chunks);
|
||||
notifyRequestFinished(body);
|
||||
fulfill({
|
||||
|
|
@ -429,7 +443,9 @@ export abstract class APIRequestContext extends SdkObject {
|
|||
status: response.statusCode || 0,
|
||||
statusText: response.statusMessage || '',
|
||||
headers: toHeadersArray(response.rawHeaders),
|
||||
body
|
||||
body,
|
||||
timing,
|
||||
responseEndTiming,
|
||||
});
|
||||
};
|
||||
|
||||
|
|
|
|||
64
packages/playwright-core/types/types.d.ts
vendored
64
packages/playwright-core/types/types.d.ts
vendored
|
|
@ -17366,6 +17366,66 @@ export interface APIResponse {
|
|||
*/
|
||||
text(): Promise<string>;
|
||||
|
||||
/**
|
||||
* Returns resource timing information for given response. Find more information at
|
||||
* [Resource Timing API](https://developer.mozilla.org/en-US/docs/Web/API/PerformanceResourceTiming).
|
||||
*/
|
||||
timing(): {
|
||||
/**
|
||||
* Request start time in milliseconds elapsed since January 1, 1970 00:00:00 UTC
|
||||
*/
|
||||
startTime: number;
|
||||
|
||||
/**
|
||||
* Time immediately before the client starts the domain name lookup for the resource. The value is given in
|
||||
* milliseconds relative to `startTime`, -1 if not available.
|
||||
*/
|
||||
domainLookupStart: number;
|
||||
|
||||
/**
|
||||
* Time immediately after the client ends the domain name lookup for the resource. The value is given in milliseconds
|
||||
* relative to `startTime`, -1 if not available.
|
||||
*/
|
||||
domainLookupEnd: number;
|
||||
|
||||
/**
|
||||
* Time immediately before the client starts establishing the connection to the server to retrieve the resource. The
|
||||
* value is given in milliseconds relative to `startTime`, -1 if not available.
|
||||
*/
|
||||
connectStart: number;
|
||||
|
||||
/**
|
||||
* Time immediately before the client starts the handshake process to secure the current connection. The value is
|
||||
* given in milliseconds relative to `startTime`, -1 if not available.
|
||||
*/
|
||||
secureConnectionStart: number;
|
||||
|
||||
/**
|
||||
* Time immediately before the client starts establishing the connection to the server to retrieve the resource. The
|
||||
* value is given in milliseconds relative to `startTime`, -1 if not available.
|
||||
*/
|
||||
connectEnd: number;
|
||||
|
||||
/**
|
||||
* Time immediately before the client starts requesting the resource from the server. The value is given in
|
||||
* milliseconds relative to `startTime`, -1 if not available.
|
||||
*/
|
||||
requestStart: number;
|
||||
|
||||
/**
|
||||
* Time immediately after the client receives the first byte of the response from the server. The value is given in
|
||||
* milliseconds relative to `startTime`, -1 if not available.
|
||||
*/
|
||||
responseStart: number;
|
||||
|
||||
/**
|
||||
* Time immediately after the client receives the last byte of the resource or immediately before the transport
|
||||
* connection is closed, whichever comes first. The value is given in milliseconds relative to `startTime`, -1 if not
|
||||
* available.
|
||||
*/
|
||||
responseEnd: number;
|
||||
};
|
||||
|
||||
/**
|
||||
* Contains the URL of the response.
|
||||
*/
|
||||
|
|
@ -19307,8 +19367,8 @@ export interface Request {
|
|||
domainLookupStart: number;
|
||||
|
||||
/**
|
||||
* Time immediately after the browser starts the domain name lookup for the resource. The value is given in
|
||||
* milliseconds relative to `startTime`, -1 if not available.
|
||||
* Time immediately after the browser ends the domain name lookup for the resource. The value is given in milliseconds
|
||||
* relative to `startTime`, -1 if not available.
|
||||
*/
|
||||
domainLookupEnd: number;
|
||||
|
||||
|
|
|
|||
|
|
@ -398,6 +398,8 @@ export type APIResponse = {
|
|||
status: number,
|
||||
statusText: string,
|
||||
headers: NameValue[],
|
||||
timing: ResourceTiming,
|
||||
responseEndTiming: number,
|
||||
};
|
||||
|
||||
export type LifecycleEvent = 'load' | 'domcontentloaded' | 'networkidle' | 'commit';
|
||||
|
|
|
|||
|
|
@ -353,6 +353,8 @@ APIResponse:
|
|||
headers:
|
||||
type: array
|
||||
items: NameValue
|
||||
timing: ResourceTiming
|
||||
responseEndTiming: number
|
||||
|
||||
|
||||
LifecycleEvent:
|
||||
|
|
|
|||
|
|
@ -52,6 +52,17 @@ it('fetch should work', async ({ context, server }) => {
|
|||
expect(response.ok()).toBeTruthy();
|
||||
expect(response.headers()['content-type']).toBe('application/json; charset=utf-8');
|
||||
expect(response.headersArray()).toContainEqual({ name: 'Content-Type', value: 'application/json; charset=utf-8' });
|
||||
expect(response.timing()).toEqual({
|
||||
connectEnd: expect.any(Number),
|
||||
connectStart: expect.any(Number),
|
||||
domainLookupEnd: expect.any(Number),
|
||||
domainLookupStart: expect.any(Number),
|
||||
requestStart: expect.any(Number),
|
||||
responseStart: expect.any(Number),
|
||||
responseEnd: expect.any(Number),
|
||||
secureConnectionStart: expect.any(Number),
|
||||
startTime: expect.any(Number),
|
||||
});
|
||||
expect(await response.text()).toBe('{"foo": "bar"}\n');
|
||||
});
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue