lighthouse
Version:
Automated auditing, performance metrics, and best practices for the web.
146 lines (125 loc) • 6.34 kB
TypeScript
/**
* @license
* Copyright 2018 Google LLC
* SPDX-License-Identifier: Apache-2.0
*/
import {Protocol as Crdp} from 'devtools-protocol/types/protocol.js';
import {ProtocolMapping as CrdpMappings} from 'devtools-protocol/types/protocol-mapping.js';
import {ExecutionContext} from '../core/gather/driver/execution-context.js';
import {NetworkMonitor} from '../core/gather/driver/network-monitor.js';
import {Fetcher} from '../core/gather/fetcher.js';
import {ArbitraryEqualityMap} from '../core/lib/arbitrary-equality-map.js';
import {Artifacts, BaseArtifacts, GathererArtifacts, DevtoolsLog, Trace} from './artifacts.js';
import Config from './config.js';
import Result from './lhr/lhr.js';
import Protocol from './protocol.js';
import Puppeteer from './puppeteer.js';
import * as Lantern from '../core/lib/lantern/lantern.js';
type CrdpEvents = CrdpMappings.Events;
type CrdpCommands = CrdpMappings.Commands;
declare module Gatherer {
/** The Lighthouse wrapper around a raw CDP session. */
interface ProtocolSession {
setTargetInfo(targetInfo: Crdp.Target.TargetInfo): void;
hasNextProtocolTimeout(): boolean;
getNextProtocolTimeout(): number;
setNextProtocolTimeout(ms: number): void;
on<TEvent extends keyof CrdpEvents>(event: TEvent, callback: (...args: CrdpEvents[TEvent]) => void): void;
once<TEvent extends keyof CrdpEvents>(event: TEvent, callback: (...args: CrdpEvents[TEvent]) => void): void;
off<TEvent extends keyof CrdpEvents>(event: TEvent, callback: (...args: CrdpEvents[TEvent]) => void): void;
sendCommand<TMethod extends keyof CrdpCommands>(method: TMethod, ...params: CrdpCommands[TMethod]['paramsType']): Promise<CrdpCommands[TMethod]['returnType']>;
sendCommandAndIgnore<TMethod extends keyof CrdpCommands>(method: TMethod, ...params: CrdpCommands[TMethod]['paramsType']): Promise<void>;
dispose(): Promise<void>;
onCrashPromise(): Promise<never>;
}
interface Driver {
defaultSession: ProtocolSession;
executionContext: ExecutionContext;
fetcher: Fetcher;
url: () => Promise<string>;
targetManager: {
rootSession(): ProtocolSession;
mainFrameExecutionContexts(): Array<Crdp.Runtime.ExecutionContextDescription>;
on(event: 'protocolevent', callback: (payload: Protocol.RawEventMessage) => void): void
off(event: 'protocolevent', callback: (payload: Protocol.RawEventMessage) => void): void
};
networkMonitor: NetworkMonitor;
}
interface Context<TDependencies extends DependencyKey = DefaultDependenciesKey> {
/** The gather mode Lighthouse is currently in. */
gatherMode: GatherMode;
/** The connection to the page being analyzed. */
driver: Driver;
/** The Puppeteer page handle. */
page: Puppeteer.Page;
/** The set of base artifacts that are always collected. */
baseArtifacts: BaseArtifacts;
/** The cached results of computed artifacts. */
computedCache: Map<string, ArbitraryEqualityMap>;
/** The set of available dependencies requested by the current gatherer. */
dependencies: Pick<GathererArtifacts, Exclude<TDependencies, DefaultDependenciesKey>>;
/** The settings used for gathering. */
settings: Config.Settings;
}
interface GatherResult {
artifacts: Artifacts;
runnerOptions: {
resolvedConfig: Config.ResolvedConfig;
computedCache: Map<string, ArbitraryEqualityMap>
}
}
interface LoadData {
networkRecords: Array<Artifacts.NetworkRequest>;
devtoolsLog: DevtoolsLog;
trace?: Trace;
}
type PhaseResultNonPromise = void | GathererArtifacts[keyof GathererArtifacts];
type PhaseResult = PhaseResultNonPromise | Promise<PhaseResultNonPromise>
type GatherMode = Result.GatherMode;
type DefaultDependenciesKey = '__none__'
type DependencyKey = keyof GathererArtifacts | DefaultDependenciesKey
interface GathererMetaNoDependencies {
/**
* Used to validate the dependency requirements of gatherers.
* If this property is not defined, this gatherer cannot be the dependency of another. */
symbol?: Symbol;
/** Lists the modes in which this gatherer can run. */
supportedModes: Array<GatherMode>;
}
interface GathererMetaWithDependencies<
TDependencies extends Exclude<DependencyKey, DefaultDependenciesKey>
> extends GathererMetaNoDependencies {
/**
* The set of required dependencies that this gatherer needs before it can compute its results.
*/
dependencies: Record<TDependencies, Symbol>;
}
type GathererMeta<TDependencies extends DependencyKey = DefaultDependenciesKey> =
[TDependencies] extends [DefaultDependenciesKey] ?
GathererMetaNoDependencies :
GathererMetaWithDependencies<Exclude<TDependencies, DefaultDependenciesKey>>;
type GatherPhase = keyof Omit<Gatherer.GathererInstance, 'name'|'meta'>
interface GathererInstance<TDependencies extends DependencyKey = DefaultDependenciesKey> {
meta: GathererMeta<TDependencies>;
startInstrumentation(context: Context<DefaultDependenciesKey>): Promise<void>|void;
startSensitiveInstrumentation(context: Context<DefaultDependenciesKey>): Promise<void>|void;
stopSensitiveInstrumentation(context: Context<DefaultDependenciesKey>): Promise<void>|void;
stopInstrumentation(context: Context<DefaultDependenciesKey>): Promise<void>|void;
getArtifact(context: Context<TDependencies>): PhaseResult;
}
type GathererInstanceExpander<TDependencies extends Gatherer.DependencyKey> =
// Lack of brackets intentional here to convert to the union of all individual dependencies.
TDependencies extends Gatherer.DefaultDependenciesKey ?
GathererInstance<Gatherer.DefaultDependenciesKey> :
GathererInstance<Exclude<TDependencies, DefaultDependenciesKey>>
type AnyGathererInstance = GathererInstanceExpander<Gatherer.DependencyKey>
namespace Simulation {
type GraphNode = Lantern.Graph.Node<Artifacts.NetworkRequest>;
type GraphNetworkNode = Lantern.Graph.NetworkNode<Artifacts.NetworkRequest>;
type GraphCPUNode = Lantern.Graph.CPUNode<Artifacts.NetworkRequest>;
type Simulator = Lantern.Simulation.Simulator<Artifacts.NetworkRequest>;
type NodeTiming = Lantern.Types.Simulation.NodeTiming;
type Result = Lantern.Simulation.Result<Artifacts.NetworkRequest>;
}
}
export default Gatherer;