lighthouse
Version:
Automated auditing, performance metrics, and best practices for the web.
290 lines • 13.3 kB
TypeScript
export type TraceNavigationTimesForFrame = Omit<LH.Artifacts.NavigationTraceTimes, "firstContentfulPaintAllFrames" | "traceEnd">;
export type TimeOriginDeterminationMethod = "lastNavigationStart" | "firstResourceSendRequest" | "lighthouseMarker" | "auto";
export type FrameCommittedEvent = Omit<LH.TraceEvent, "name" | "args"> & {
name: "FrameCommittedInBrowser";
args: {
data: {
frame: string;
url: string;
parent?: string;
};
};
};
export type LCPEvent = Omit<LH.TraceEvent, "name" | "args"> & {
name: "largestContentfulPaint::Invalidate" | "largestContentfulPaint::Candidate";
args: {
data?: {
size?: number;
};
frame: string;
};
};
export type LCPCandidateEvent = Omit<LH.TraceEvent, "name" | "args"> & {
name: "largestContentfulPaint::Candidate";
args: {
data: {
size: number;
};
frame: string;
};
};
export type ToplevelEvent = {
start: number;
end: number;
duration: number;
};
export class TraceProcessor {
static get TIMESPAN_MARKER_ID(): string;
/**
* @return {Error}
*/
static createNoNavstartError(): Error;
/**
* @return {Error}
*/
static createNoResourceSendRequestError(): Error;
/**
* @return {Error}
*/
static createNoTracingStartedError(): Error;
/**
* @return {Error}
*/
static createNoFirstContentfulPaintError(): Error;
/**
* @return {Error}
*/
static createNoLighthouseMarkerError(): Error;
/**
* Returns true if the event is a navigation start event of a document whose URL seems valid.
*
* @param {LH.TraceEvent} event
* @return {boolean}
*/
static _isNavigationStartOfInterest(event: LH.TraceEvent): boolean;
/**
* This method sorts a group of trace events that have the same timestamp. We want to...
*
* 1. Put E events first, we finish off our existing events before we start new ones.
* 2. Order B/X events by their duration, we want parents to start before child events.
* 3. If we don't have any of this to go on, just use the position in the original array (stable sort).
*
* Note that the typical group size with the same timestamp will be quite small (<10 or so events),
* and the number of groups typically ~1% of total trace, so the same ultra-performance-sensitive consideration
* given to functions that run on entire traces does not necessarily apply here.
*
* @param {number[]} tsGroupIndices
* @param {number[]} timestampSortedIndices
* @param {number} indexOfTsGroupIndicesStart
* @param {LH.TraceEvent[]} traceEvents
* @return {number[]}
*/
static _sortTimestampEventGroup(tsGroupIndices: number[], timestampSortedIndices: number[], indexOfTsGroupIndicesStart: number, traceEvents: LH.TraceEvent[]): number[];
/**
* Sorts and filters trace events by timestamp and respecting the nesting structure inherent to
* parent/child event relationships.
*
* @param {LH.TraceEvent[]} traceEvents
* @param {(e: LH.TraceEvent) => boolean} filter
*/
static filteredTraceSort(traceEvents: LH.TraceEvent[], filter: (e: LH.TraceEvent) => boolean): import("../..").TraceEvent[];
/**
* There should *always* be at least one top level event, having 0 typically means something is
* drastically wrong with the trace and we should just give up early and loudly.
*
* @param {LH.TraceEvent[]} events
*/
static assertHasToplevelEvents(events: LH.TraceEvent[]): void;
/**
* Calculate duration at specified percentiles for given population of
* durations.
* If one of the durations overlaps the end of the window, the full
* duration should be in the duration array, but the length not included
* within the window should be given as `clippedLength`. For instance, if a
* 50ms duration occurs 10ms before the end of the window, `50` should be in
* the `durations` array, and `clippedLength` should be set to 40.
* @see https://docs.google.com/document/d/1b9slyaB9yho91YTOkAQfpCdULFkZM9LqsipcX3t7He8/preview
* @param {!Array<number>} durations Array of durations, sorted in ascending order.
* @param {number} totalTime Total time (in ms) of interval containing durations.
* @param {!Array<number>} percentiles Array of percentiles of interest, in ascending order.
* @param {number=} clippedLength Optional length clipped from a duration overlapping end of window. Default of 0.
* @return {!Array<{percentile: number, time: number}>}
* @private
*/
private static _riskPercentiles;
/**
* Calculates the maximum queueing time (in ms) of high priority tasks for
* selected percentiles within a window of the main thread.
* @see https://docs.google.com/document/d/1b9slyaB9yho91YTOkAQfpCdULFkZM9LqsipcX3t7He8/preview
* @param {Array<ToplevelEvent>} events
* @param {number} startTime Start time (in ms relative to timeOrigin) of range of interest.
* @param {number} endTime End time (in ms relative to timeOrigin) of range of interest.
* @param {!Array<number>=} percentiles Optional array of percentiles to compute. Defaults to [0.5, 0.75, 0.9, 0.99, 1].
* @return {!Array<{percentile: number, time: number}>}
*/
static getRiskToResponsiveness(events: Array<ToplevelEvent>, startTime: number, endTime: number, percentiles?: Array<number> | undefined): Array<{
percentile: number;
time: number;
}>;
/**
* Provides durations in ms of all main thread top-level events
* @param {Array<ToplevelEvent>} topLevelEvents
* @param {number} startTime Optional start time (in ms relative to timeOrigin) of range of interest. Defaults to 0.
* @param {number} endTime Optional end time (in ms relative to timeOrigin) of range of interest. Defaults to trace end.
* @return {{durations: Array<number>, clippedLength: number}}
*/
static getMainThreadTopLevelEventDurations(topLevelEvents: Array<ToplevelEvent>, startTime?: number, endTime?: number): {
durations: Array<number>;
clippedLength: number;
};
/**
* Provides the top level events on the main thread with timestamps in ms relative to timeOrigin.
* start.
* @param {LH.Artifacts.ProcessedTrace} trace
* @param {number=} startTime Optional start time (in ms relative to timeOrigin) of range of interest. Defaults to 0.
* @param {number=} endTime Optional end time (in ms relative to timeOrigin) of range of interest. Defaults to trace end.
* @return {Array<ToplevelEvent>}
*/
static getMainThreadTopLevelEvents(trace: LH.Artifacts.ProcessedTrace, startTime?: number | undefined, endTime?: number | undefined): Array<ToplevelEvent>;
/**
* @param {LH.TraceEvent[]} events
* @return {{startingPid: number, frameId: string}}
*/
static findMainFrameIds(events: LH.TraceEvent[]): {
startingPid: number;
frameId: string;
};
/**
* If there were any cross-origin navigations, there'll be more than one pid returned
* @param {{startingPid: number, frameId: string}} mainFrameInfo
* @param {LH.TraceEvent[]} keyEvents
* @return {Map<number, number>} Map where keys are process IDs and their values are thread IDs
*/
static findMainFramePidTids(mainFrameInfo: {
startingPid: number;
frameId: string;
}, keyEvents: LH.TraceEvent[]): Map<number, number>;
/**
* @param {LH.TraceEvent} evt
* @return {boolean}
*/
static isScheduleableTask(evt: LH.TraceEvent): boolean;
/**
* @param {LH.TraceEvent} evt
* @return {evt is LCPEvent}
*/
static isLCPEvent(evt: LH.TraceEvent): evt is LCPEvent;
/**
* @param {LH.TraceEvent} evt
* @return {evt is LCPCandidateEvent}
*/
static isLCPCandidateEvent(evt: LH.TraceEvent): evt is LCPCandidateEvent;
/**
* The associated frame ID is set in different locations for different trace events.
* This function checks all known locations for the frame ID and returns `undefined` if it's not found.
*
* @param {LH.TraceEvent} evt
* @return {string|undefined}
*/
static getFrameId(evt: LH.TraceEvent): string | undefined;
/**
* Returns the maximum LCP event across all frames in `events`.
* Sets `invalidated` flag if LCP of every frame is invalidated.
*
* LCP's trace event was first introduced in m78. We can't surface an LCP for older Chrome versions.
* LCP comes from a frame's latest `largestContentfulPaint::Candidate`, but it can be invalidated by a `largestContentfulPaint::Invalidate` event.
*
* @param {LH.TraceEvent[]} events
* @param {LH.TraceEvent} timeOriginEvent
* @return {{lcp: LCPEvent | undefined, invalidated: boolean}}
*/
static computeValidLCPAllFrames(events: LH.TraceEvent[], timeOriginEvent: LH.TraceEvent): {
lcp: LCPEvent | undefined;
invalidated: boolean;
};
/**
* @param {Array<{id: string, url: string, parent?: string}>} frames
* @return {Map<string, string>}
*/
static resolveRootFrames(frames: Array<{
id: string;
url: string;
parent?: string;
}>): Map<string, string>;
/**
* Finds key trace events, identifies main process/thread, and returns timings of trace events
* in milliseconds since the time origin in addition to the standard microsecond monotonic timestamps.
* @param {LH.Trace} trace
* @param {{timeOriginDeterminationMethod?: TimeOriginDeterminationMethod}} [options]
* @return {LH.Artifacts.ProcessedTrace}
*/
static processTrace(trace: LH.Trace, options?: {
timeOriginDeterminationMethod?: TimeOriginDeterminationMethod;
}): LH.Artifacts.ProcessedTrace;
/**
* Finds key navigation trace events and computes timings of events in milliseconds since the time
* origin in addition to the standard microsecond monotonic timestamps.
* @param {LH.Artifacts.ProcessedTrace} processedTrace
* @return {LH.Artifacts.ProcessedNavigation}
*/
static processNavigation(processedTrace: LH.Artifacts.ProcessedTrace): LH.Artifacts.ProcessedNavigation;
/**
* Computes the last observable timestamp in a set of trace events.
*
* @param {Array<LH.TraceEvent>} events
* @param {LH.TraceEvent} timeOriginEvt
* @return {{timing: number, timestamp: number}}
*/
static computeTraceEnd(events: Array<LH.TraceEvent>, timeOriginEvt: LH.TraceEvent): {
timing: number;
timestamp: number;
};
/**
* Computes the time origin using the specified method.
*
* - firstResourceSendRequest
* Uses the time that the very first network request is sent in the main frame.
* Eventually should be used in place of lastNavigationStart as the default for navigations.
* This method includes the cost of all redirects when evaluating a navigation (which matches lantern behavior).
* The only difference between firstResourceSendRequest and the first `navigationStart` is
* the unload time of `about:blank` (which is a Lighthouse implementation detail and shouldn't be included).
*
* - lastNavigationStart
* Uses the time of the last `navigationStart` event in the main frame.
* The historical time origin of Lighthouse from 2016-Present.
* This method excludes the cost of client-side redirects when evaluating a navigation.
* Can also be skewed by several hundred milliseconds or even seconds when the browser takes a long
* time to unload `about:blank`.
*
* @param {{keyEvents: Array<LH.TraceEvent>, frameEvents: Array<LH.TraceEvent>, mainFrameInfo: {frameId: string}}} traceEventSubsets
* @param {TimeOriginDeterminationMethod} method
* @return {LH.TraceEvent}
*/
static computeTimeOrigin(traceEventSubsets: {
keyEvents: Array<LH.TraceEvent>;
frameEvents: Array<LH.TraceEvent>;
mainFrameInfo: {
frameId: string;
};
}, method: TimeOriginDeterminationMethod): LH.TraceEvent;
/**
* Computes timings of trace events of key trace events in milliseconds since the time origin
* in addition to the standard microsecond monotonic timestamps.
* @param {Array<LH.TraceEvent>} frameEvents
* @param {{timeOriginEvt: LH.TraceEvent}} options
*/
static computeNavigationTimingsForFrame(frameEvents: Array<LH.TraceEvent>, options: {
timeOriginEvt: LH.TraceEvent;
}): {
timings: TraceNavigationTimesForFrame;
timestamps: TraceNavigationTimesForFrame;
timeOriginEvt: import("../..").TraceEvent;
firstPaintEvt: import("../..").TraceEvent | undefined;
firstContentfulPaintEvt: import("../..").TraceEvent;
largestContentfulPaintEvt: LCPEvent | undefined;
loadEvt: import("../..").TraceEvent | undefined;
domContentLoadedEvt: import("../..").TraceEvent | undefined;
lcpInvalidated: boolean;
};
}
//# sourceMappingURL=trace-processor.d.ts.map