mirror of
https://github.com/puppeteer/puppeteer
synced 2024-06-14 14:02:48 +00:00
refactor: implement core/Connection
on BidiConnection
(#11700)
This commit is contained in:
parent
0abede9a5f
commit
afb7d9eb58
@ -9,11 +9,17 @@ import type * as Bidi from 'chromium-bidi/lib/cjs/protocol/protocol.js';
|
|||||||
import {CallbackRegistry} from '../common/CallbackRegistry.js';
|
import {CallbackRegistry} from '../common/CallbackRegistry.js';
|
||||||
import type {ConnectionTransport} from '../common/ConnectionTransport.js';
|
import type {ConnectionTransport} from '../common/ConnectionTransport.js';
|
||||||
import {debug} from '../common/Debug.js';
|
import {debug} from '../common/Debug.js';
|
||||||
|
import type {EventsWithWildcard} from '../common/EventEmitter.js';
|
||||||
import {EventEmitter} from '../common/EventEmitter.js';
|
import {EventEmitter} from '../common/EventEmitter.js';
|
||||||
import {debugError} from '../common/util.js';
|
import {debugError} from '../common/util.js';
|
||||||
import {assert} from '../util/assert.js';
|
import {assert} from '../util/assert.js';
|
||||||
|
|
||||||
import {type BrowsingContext, cdpSessions} from './BrowsingContext.js';
|
import {cdpSessions, type BrowsingContext} from './BrowsingContext.js';
|
||||||
|
import type {
|
||||||
|
BidiEvents,
|
||||||
|
Commands as BidiCommands,
|
||||||
|
Connection,
|
||||||
|
} from './core/Connection.js';
|
||||||
|
|
||||||
const debugProtocolSend = debug('puppeteer:webDriverBiDi:SEND ►');
|
const debugProtocolSend = debug('puppeteer:webDriverBiDi:SEND ►');
|
||||||
const debugProtocolReceive = debug('puppeteer:webDriverBiDi:RECV ◀');
|
const debugProtocolReceive = debug('puppeteer:webDriverBiDi:RECV ◀');
|
||||||
@ -21,107 +27,7 @@ const debugProtocolReceive = debug('puppeteer:webDriverBiDi:RECV ◀');
|
|||||||
/**
|
/**
|
||||||
* @internal
|
* @internal
|
||||||
*/
|
*/
|
||||||
export interface Commands {
|
export interface Commands extends BidiCommands {
|
||||||
'script.evaluate': {
|
|
||||||
params: Bidi.Script.EvaluateParameters;
|
|
||||||
returnType: Bidi.Script.EvaluateResult;
|
|
||||||
};
|
|
||||||
'script.callFunction': {
|
|
||||||
params: Bidi.Script.CallFunctionParameters;
|
|
||||||
returnType: Bidi.Script.EvaluateResult;
|
|
||||||
};
|
|
||||||
'script.disown': {
|
|
||||||
params: Bidi.Script.DisownParameters;
|
|
||||||
returnType: Bidi.EmptyResult;
|
|
||||||
};
|
|
||||||
'script.addPreloadScript': {
|
|
||||||
params: Bidi.Script.AddPreloadScriptParameters;
|
|
||||||
returnType: Bidi.Script.AddPreloadScriptResult;
|
|
||||||
};
|
|
||||||
'script.removePreloadScript': {
|
|
||||||
params: Bidi.Script.RemovePreloadScriptParameters;
|
|
||||||
returnType: Bidi.EmptyResult;
|
|
||||||
};
|
|
||||||
|
|
||||||
'browser.close': {
|
|
||||||
params: Bidi.EmptyParams;
|
|
||||||
returnType: Bidi.EmptyResult;
|
|
||||||
};
|
|
||||||
|
|
||||||
'browsingContext.activate': {
|
|
||||||
params: Bidi.BrowsingContext.ActivateParameters;
|
|
||||||
returnType: Bidi.EmptyResult;
|
|
||||||
};
|
|
||||||
'browsingContext.create': {
|
|
||||||
params: Bidi.BrowsingContext.CreateParameters;
|
|
||||||
returnType: Bidi.BrowsingContext.CreateResult;
|
|
||||||
};
|
|
||||||
'browsingContext.close': {
|
|
||||||
params: Bidi.BrowsingContext.CloseParameters;
|
|
||||||
returnType: Bidi.EmptyResult;
|
|
||||||
};
|
|
||||||
'browsingContext.getTree': {
|
|
||||||
params: Bidi.BrowsingContext.GetTreeParameters;
|
|
||||||
returnType: Bidi.BrowsingContext.GetTreeResult;
|
|
||||||
};
|
|
||||||
'browsingContext.navigate': {
|
|
||||||
params: Bidi.BrowsingContext.NavigateParameters;
|
|
||||||
returnType: Bidi.BrowsingContext.NavigateResult;
|
|
||||||
};
|
|
||||||
'browsingContext.reload': {
|
|
||||||
params: Bidi.BrowsingContext.ReloadParameters;
|
|
||||||
returnType: Bidi.BrowsingContext.NavigateResult;
|
|
||||||
};
|
|
||||||
'browsingContext.print': {
|
|
||||||
params: Bidi.BrowsingContext.PrintParameters;
|
|
||||||
returnType: Bidi.BrowsingContext.PrintResult;
|
|
||||||
};
|
|
||||||
'browsingContext.captureScreenshot': {
|
|
||||||
params: Bidi.BrowsingContext.CaptureScreenshotParameters;
|
|
||||||
returnType: Bidi.BrowsingContext.CaptureScreenshotResult;
|
|
||||||
};
|
|
||||||
'browsingContext.handleUserPrompt': {
|
|
||||||
params: Bidi.BrowsingContext.HandleUserPromptParameters;
|
|
||||||
returnType: Bidi.EmptyResult;
|
|
||||||
};
|
|
||||||
'browsingContext.setViewport': {
|
|
||||||
params: Bidi.BrowsingContext.SetViewportParameters;
|
|
||||||
returnType: Bidi.EmptyResult;
|
|
||||||
};
|
|
||||||
'browsingContext.traverseHistory': {
|
|
||||||
params: Bidi.BrowsingContext.TraverseHistoryParameters;
|
|
||||||
returnType: Bidi.EmptyResult;
|
|
||||||
};
|
|
||||||
|
|
||||||
'input.performActions': {
|
|
||||||
params: Bidi.Input.PerformActionsParameters;
|
|
||||||
returnType: Bidi.EmptyResult;
|
|
||||||
};
|
|
||||||
'input.releaseActions': {
|
|
||||||
params: Bidi.Input.ReleaseActionsParameters;
|
|
||||||
returnType: Bidi.EmptyResult;
|
|
||||||
};
|
|
||||||
|
|
||||||
'session.end': {
|
|
||||||
params: Bidi.EmptyParams;
|
|
||||||
returnType: Bidi.EmptyResult;
|
|
||||||
};
|
|
||||||
'session.new': {
|
|
||||||
params: Bidi.Session.NewParameters;
|
|
||||||
returnType: Bidi.Session.NewResult;
|
|
||||||
};
|
|
||||||
'session.status': {
|
|
||||||
params: object;
|
|
||||||
returnType: Bidi.Session.StatusResult;
|
|
||||||
};
|
|
||||||
'session.subscribe': {
|
|
||||||
params: Bidi.Session.SubscriptionRequest;
|
|
||||||
returnType: Bidi.EmptyResult;
|
|
||||||
};
|
|
||||||
'session.unsubscribe': {
|
|
||||||
params: Bidi.Session.SubscriptionRequest;
|
|
||||||
returnType: Bidi.EmptyResult;
|
|
||||||
};
|
|
||||||
'cdp.sendCommand': {
|
'cdp.sendCommand': {
|
||||||
params: Bidi.Cdp.SendCommandParameters;
|
params: Bidi.Cdp.SendCommandParameters;
|
||||||
returnType: Bidi.Cdp.SendCommandResult;
|
returnType: Bidi.Cdp.SendCommandResult;
|
||||||
@ -135,17 +41,10 @@ export interface Commands {
|
|||||||
/**
|
/**
|
||||||
* @internal
|
* @internal
|
||||||
*/
|
*/
|
||||||
export type BidiEvents = {
|
export class BidiConnection
|
||||||
[K in Bidi.ChromiumBidi.Event['method']]: Extract<
|
extends EventEmitter<BidiEvents>
|
||||||
Bidi.ChromiumBidi.Event,
|
implements Connection
|
||||||
{method: K}
|
{
|
||||||
>['params'];
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @internal
|
|
||||||
*/
|
|
||||||
export class BidiConnection extends EventEmitter<BidiEvents> {
|
|
||||||
#url: string;
|
#url: string;
|
||||||
#transport: ConnectionTransport;
|
#transport: ConnectionTransport;
|
||||||
#delay: number;
|
#delay: number;
|
||||||
@ -153,6 +52,7 @@ export class BidiConnection extends EventEmitter<BidiEvents> {
|
|||||||
#closed = false;
|
#closed = false;
|
||||||
#callbacks = new CallbackRegistry();
|
#callbacks = new CallbackRegistry();
|
||||||
#browsingContexts = new Map<string, BrowsingContext>();
|
#browsingContexts = new Map<string, BrowsingContext>();
|
||||||
|
#emitters: Array<EventEmitter<any>> = [];
|
||||||
|
|
||||||
constructor(
|
constructor(
|
||||||
url: string,
|
url: string,
|
||||||
@ -178,6 +78,20 @@ export class BidiConnection extends EventEmitter<BidiEvents> {
|
|||||||
return this.#url;
|
return this.#url;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pipeTo<Events extends BidiEvents>(emitter: EventEmitter<Events>): void {
|
||||||
|
this.#emitters.push(emitter);
|
||||||
|
}
|
||||||
|
|
||||||
|
override emit<Key extends keyof EventsWithWildcard<BidiEvents>>(
|
||||||
|
type: Key,
|
||||||
|
event: EventsWithWildcard<BidiEvents>[Key]
|
||||||
|
): boolean {
|
||||||
|
for (const emitter of this.#emitters) {
|
||||||
|
emitter.emit(type, event);
|
||||||
|
}
|
||||||
|
return super.emit(type, event);
|
||||||
|
}
|
||||||
|
|
||||||
send<T extends keyof Commands>(
|
send<T extends keyof Commands>(
|
||||||
method: T,
|
method: T,
|
||||||
params: Commands[T]['params']
|
params: Commands[T]['params']
|
||||||
|
@ -9,11 +9,11 @@ import type * as Bidi from 'chromium-bidi/lib/cjs/protocol/protocol.js';
|
|||||||
import {EventEmitter} from '../../common/EventEmitter.js';
|
import {EventEmitter} from '../../common/EventEmitter.js';
|
||||||
import {debugError} from '../../common/util.js';
|
import {debugError} from '../../common/util.js';
|
||||||
import {throwIfDisposed} from '../../util/decorators.js';
|
import {throwIfDisposed} from '../../util/decorators.js';
|
||||||
import type {BidiEvents} from '../Connection.js';
|
|
||||||
|
|
||||||
import {Browser} from './Browser.js';
|
import {Browser} from './Browser.js';
|
||||||
import type {Connection} from './Connection.js';
|
import type {Connection} from './Connection.js';
|
||||||
import type {Commands} from './Connection.js';
|
import type {Commands} from './Connection.js';
|
||||||
|
import type {BidiEvents} from './Connection.js';
|
||||||
|
|
||||||
const MAX_RETRIES = 5;
|
const MAX_RETRIES = 5;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user