42 lines
1.1 KiB
TypeScript
42 lines
1.1 KiB
TypeScript
/**
|
|
* External dependencies
|
|
*/
|
|
import type { Page } from 'puppeteer';
|
|
|
|
export async function getLoadingDurations(): Promise<
|
|
ReturnType< Page[ 'evaluate' ] >
|
|
> {
|
|
return await page.evaluate( () => {
|
|
const [
|
|
{
|
|
requestStart,
|
|
responseStart,
|
|
responseEnd,
|
|
domContentLoadedEventEnd,
|
|
loadEventEnd,
|
|
},
|
|
] = performance.getEntriesByType(
|
|
'navigation'
|
|
) as PerformanceNavigationTiming[];
|
|
|
|
const paintTimings = performance.getEntriesByType( 'paint' );
|
|
return {
|
|
// Server side metric.
|
|
serverResponse: responseStart - requestStart,
|
|
// For client side metrics, consider the end of the response (the
|
|
// browser receives the HTML) as the start time (0).
|
|
firstPaint:
|
|
paintTimings.find( ( { name } ) => name === 'first-paint' )
|
|
.startTime - responseEnd,
|
|
domContentLoaded: domContentLoadedEventEnd - responseEnd,
|
|
loaded: loadEventEnd - responseEnd,
|
|
firstContentfulPaint:
|
|
paintTimings.find(
|
|
( { name } ) => name === 'first-contentful-paint'
|
|
).startTime - responseEnd,
|
|
// This is evaluated right after Puppeteer found the block selector.
|
|
firstBlock: performance.now() - responseEnd,
|
|
};
|
|
} );
|
|
}
|