UNPKG

lighthouse

Version:

Automated auditing, performance metrics, and best practices for the web.

91 lines (73 loc) 3.09 kB
/** * @license * Copyright 2018 Google LLC * SPDX-License-Identifier: Apache-2.0 */ import {ProtocolMapping as CrdpMappings} from 'devtools-protocol/types/protocol-mapping.js'; type CrdpEvents = CrdpMappings.Events; type CrdpCommands = CrdpMappings.Commands; declare module Protocol { type TargetType = 'page' | 'iframe' | 'worker'; /** * An intermediate type, used to create a record of all possible Crdp raw event * messages, keyed on method. e.g. { * 'Domain.method1Name': {method: 'Domain.method1Name', params: EventPayload1}, * 'Domain.method2Name': {method: 'Domain.method2Name', params: EventPayload2}, * } */ type RawEventMessageRecord = { [K in keyof CrdpEvents]: { method: K, // Drop [] for `undefined` (so a JS value is valid). params: CrdpEvents[K] extends [] ? undefined: CrdpEvents[K][number] targetType: TargetType; // If sessionId is not set, it means the event was from the root target. sessionId?: string; }; } /** * Union of raw (over the wire) message format of all possible Crdp events, * of the form `{method: 'Domain.event', params: eventPayload}`. */ type RawEventMessage = RawEventMessageRecord[keyof RawEventMessageRecord]; /** * Raw (over the wire) message format of all possible Crdp command responses. */ type RawCommandMessage = { id: number; result: CrdpCommands[keyof CrdpCommands]['returnType']; error: { code: number, message: string }; } /** * Raw (over the wire) message format of all possible Crdp events and command * responses. */ type RawMessage = RawCommandMessage | RawEventMessage; /** * A more strictly-typed EventEmitter interface that checks the association * of event name and listener payload. TEventRecord should be a record mapping * event names to tuples that can contain zero or more items, which will * serve as the arguments to event listener callbacks. * Inspired by work from https://github.com/bterlson/strict-event-emitter-types. */ type StrictEventEmitter<TEventRecord extends Record<keyof TEventRecord, unknown[]>> = { on<E extends keyof TEventRecord>(event: E, listener: (...args: TEventRecord[E]) => void): void; off<E extends keyof TEventRecord>(event: E, listener: Function): void; addListener<E extends keyof TEventRecord>(event: E, listener: (...args: TEventRecord[E]) => void): void; removeListener<E extends keyof TEventRecord>(event: E, listener: Function): void; removeAllListeners<E extends keyof TEventRecord>(event?: E): void; once<E extends keyof TEventRecord>(event: E, listener: (...args: TEventRecord[E]) => void): void; emit<E extends keyof TEventRecord>(event: E, ...request: TEventRecord[E]): void; listenerCount<E extends keyof TEventRecord>(event: E): number; } /** * A constructable StrictEventEmitter. */ interface StrictEventEmitterClass<TEventRecord extends Record<keyof TEventRecord, unknown[]>> { new(): StrictEventEmitter<TEventRecord>; } } export default Protocol;