UNPKG

3.37 kBPlain TextView Raw
1/**
2 * @license
3 * Copyright 2024 Google Inc.
4 * SPDX-License-Identifier: Apache-2.0
5 */
6import type {ProtocolMapping} from 'devtools-protocol/types/protocol-mapping.js';
7
8import type {Connection} from '../cdp/Connection.js';
9import {EventEmitter, type EventType} from '../common/EventEmitter.js';
10
11/**
12 * @public
13 */
14export type CDPEvents = {
15 [Property in keyof ProtocolMapping.Events]: ProtocolMapping.Events[Property][0];
16};
17
18/**
19 * Events that the CDPSession class emits.
20 *
21 * @public
22 */
23// eslint-disable-next-line @typescript-eslint/no-namespace
24export namespace CDPSessionEvent {
25 /** @internal */
26 export const Disconnected = Symbol('CDPSession.Disconnected');
27 /** @internal */
28 export const Swapped = Symbol('CDPSession.Swapped');
29 /**
30 * Emitted when the session is ready to be configured during the auto-attach
31 * process. Right after the event is handled, the session will be resumed.
32 *
33 * @internal
34 */
35 export const Ready = Symbol('CDPSession.Ready');
36 export const SessionAttached = 'sessionattached' as const;
37 export const SessionDetached = 'sessiondetached' as const;
38}
39
40/**
41 * @public
42 */
43export interface CDPSessionEvents
44 extends CDPEvents,
45 Record<EventType, unknown> {
46 /** @internal */
47 [CDPSessionEvent.Disconnected]: undefined;
48 /** @internal */
49 [CDPSessionEvent.Swapped]: CDPSession;
50 /** @internal */
51 [CDPSessionEvent.Ready]: CDPSession;
52 [CDPSessionEvent.SessionAttached]: CDPSession;
53 [CDPSessionEvent.SessionDetached]: CDPSession;
54}
55
56/**
57 * @public
58 */
59export interface CommandOptions {
60 timeout: number;
61}
62
63/**
64 * The `CDPSession` instances are used to talk raw Chrome Devtools Protocol.
65 *
66 * @remarks
67 *
68 * Protocol methods can be called with {@link CDPSession.send} method and protocol
69 * events can be subscribed to with `CDPSession.on` method.
70 *
71 * Useful links: {@link https://chromedevtools.github.io/devtools-protocol/ | DevTools Protocol Viewer}
72 * and {@link https://github.com/aslushnikov/getting-started-with-cdp/blob/HEAD/README.md | Getting Started with DevTools Protocol}.
73 *
74 * @example
75 *
76 * ```ts
77 * const client = await page.createCDPSession();
78 * await client.send('Animation.enable');
79 * client.on('Animation.animationCreated', () =>
80 * console.log('Animation created!'),
81 * );
82 * const response = await client.send('Animation.getPlaybackRate');
83 * console.log('playback rate is ' + response.playbackRate);
84 * await client.send('Animation.setPlaybackRate', {
85 * playbackRate: response.playbackRate / 2,
86 * });
87 * ```
88 *
89 * @public
90 */
91export abstract class CDPSession extends EventEmitter<CDPSessionEvents> {
92 /**
93 * @internal
94 */
95 constructor() {
96 super();
97 }
98
99 abstract connection(): Connection | undefined;
100
101 /**
102 * Parent session in terms of CDP's auto-attach mechanism.
103 *
104 * @internal
105 */
106 parentSession(): CDPSession | undefined {
107 return undefined;
108 }
109
110 abstract send<T extends keyof ProtocolMapping.Commands>(
111 method: T,
112 params?: ProtocolMapping.Commands[T]['paramsType'][0],
113 options?: CommandOptions,
114 ): Promise<ProtocolMapping.Commands[T]['returnType']>;
115
116 /**
117 * Detaches the cdpSession from the target. Once detached, the cdpSession object
118 * won't emit any events and can't be used to send messages.
119 */
120 abstract detach(): Promise<void>;
121
122 /**
123 * Returns the session's id.
124 */
125 abstract id(): string;
126}