Skip to content

Commit

Permalink
align network module with BiDi spec
Browse files Browse the repository at this point in the history
  • Loading branch information
Thiago Perrotta committed May 23, 2023
1 parent fce48df commit ca811b3
Show file tree
Hide file tree
Showing 5 changed files with 48 additions and 24 deletions.
3 changes: 2 additions & 1 deletion src/bidiMapper/domains/events/SubscriptionManager.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -451,8 +451,9 @@ describe('unroll events', () => {
it('all Network events', () => {
expect(unrollEvents([Network.AllEvents])).to.deep.equal([
Network.EventNames.BeforeRequestSentEvent,
Network.EventNames.ResponseCompletedEvent,
Network.EventNames.FetchErrorEvent,
Network.EventNames.ResponseStartedEvent,
Network.EventNames.ResponseCompletedEvent,
]);
});

Expand Down
7 changes: 4 additions & 3 deletions src/bidiMapper/domains/network/networkProcessor.ts
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ import Protocol from 'devtools-protocol';
import {CdpClient} from '../../CdpConnection.js';
import {IEventManager} from '../events/EventManager.js';
import {DefaultMap} from '../../../utils/DefaultMap.js';
import {Network} from '../../../protocol/protocol.js';

import {NetworkRequest} from './networkRequest.js';

Expand All @@ -35,11 +36,11 @@ export class NetworkProcessor {
* Map of request ID to NetworkRequest objects. Needed as long as information
* about requests comes from different events.
*/
readonly #requestMap: DefaultMap<string, NetworkRequest>;
readonly #requestMap: DefaultMap<Network.Request, NetworkRequest>;

private constructor(eventManager: IEventManager) {
this.#eventManager = eventManager;
this.#requestMap = new DefaultMap<string, NetworkRequest>(
this.#requestMap = new DefaultMap(
(requestId) => new NetworkRequest(requestId, this.#eventManager)
);
}
Expand Down Expand Up @@ -100,7 +101,7 @@ export class NetworkProcessor {
return networkProcessor;
}

#getOrCreateNetworkRequest(requestId: string): NetworkRequest {
#getOrCreateNetworkRequest(requestId: Network.Request): NetworkRequest {
return this.#requestMap.get(requestId);
}
}
29 changes: 15 additions & 14 deletions src/bidiMapper/domains/network/networkRequest.ts
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,6 @@
* @fileoverview `NetworkRequest` represents a single network request and keeps
* track of all the related CDP events.
*/

import Protocol from 'devtools-protocol';

import {Deferred} from '../../../utils/deferred.js';
Expand All @@ -29,22 +28,19 @@ import {Network} from '../../../protocol/protocol.js';

export class NetworkRequest {
static #unknown = 'UNKNOWN';
requestId: string;

requestId: Network.Request;
#eventManager: IEventManager;
#requestWillBeSentEvent: Protocol.Network.RequestWillBeSentEvent | undefined;
#requestWillBeSentExtraInfoEvent:
| Protocol.Network.RequestWillBeSentExtraInfoEvent
| undefined;
#responseReceivedEvent: Protocol.Network.ResponseReceivedEvent | undefined;

#responseReceivedExtraInfoEvent:
| Protocol.Network.ResponseReceivedExtraInfoEvent
| undefined;
#requestWillBeSentEvent?: Protocol.Network.RequestWillBeSentEvent;
#requestWillBeSentExtraInfoEvent?: Protocol.Network.RequestWillBeSentExtraInfoEvent;
#responseReceivedEvent?: Protocol.Network.ResponseReceivedEvent;
#responseReceivedExtraInfoEvent?: Protocol.Network.ResponseReceivedExtraInfoEvent;

#beforeRequestSentDeferred: Deferred<void>;
#responseReceivedDeferred: Deferred<void>;

constructor(requestId: string, eventManager: IEventManager) {
constructor(requestId: Network.Request, eventManager: IEventManager) {
this.requestId = requestId;
this.#eventManager = eventManager;
this.#beforeRequestSentDeferred = new Deferred<void>();
Expand All @@ -63,6 +59,7 @@ export class NetworkRequest {
if (this.#requestWillBeSentExtraInfoEvent !== undefined) {
this.#beforeRequestSentDeferred.resolve();
}

this.#sendBeforeRequestEvent();
}

Expand All @@ -73,6 +70,7 @@ export class NetworkRequest {
// TODO: Handle redirect event, requestId is same for the redirect chain
return;
}

this.#requestWillBeSentExtraInfoEvent = requestWillBeSentExtraInfoEvent;
if (this.#requestWillBeSentEvent !== undefined) {
this.#beforeRequestSentDeferred.resolve();
Expand All @@ -87,18 +85,21 @@ export class NetworkRequest {
return;
}
this.#responseReceivedEvent = responseReceivedEvent;

if (
!responseReceivedEvent.hasExtraInfo &&
!this.#beforeRequestSentDeferred.isFinished
) {
this.#beforeRequestSentDeferred.resolve();
}

if (
!responseReceivedEvent.hasExtraInfo ||
this.#responseReceivedExtraInfoEvent !== undefined
) {
this.#responseReceivedDeferred.resolve();
}

this.#sendResponseReceivedEvent();
}

Expand All @@ -110,6 +111,7 @@ export class NetworkRequest {
return;
}
this.#responseReceivedExtraInfoEvent = responseReceivedExtraInfoEvent;

if (this.#responseReceivedEvent !== undefined) {
this.#responseReceivedDeferred.resolve();
}
Expand Down Expand Up @@ -161,7 +163,7 @@ export class NetworkRequest {
};
}

#getBaseEventParams(): Network.BaseEventParams {
#getBaseEventParams(): Network.BaseParameters {
return {
context: this.#requestWillBeSentEvent?.frameId ?? null,
navigation: this.#requestWillBeSentEvent?.loaderId ?? null,
Expand Down Expand Up @@ -244,7 +246,7 @@ export class NetworkRequest {
}

static #getCookiesSameSite(
cdpSameSiteValue: string | undefined
cdpSameSiteValue?: string
): Network.Cookie['sameSite'] {
switch (cdpSameSiteValue) {
case 'Strict':
Expand Down Expand Up @@ -309,7 +311,6 @@ export class NetworkRequest {
fromCache:
this.#responseReceivedEvent.response.fromDiskCache ||
this.#responseReceivedEvent.response.fromPrefetchCache,
// TODO: implement.
headers: this.#getHeaders(
this.#responseReceivedEvent.response.headers
),
Expand Down
32 changes: 26 additions & 6 deletions src/protocol/protocol.ts
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ export interface EventResponse<MethodType, ParamsType> {
export type BiDiCommand =
| BrowsingContext.Command
| CDP.Command
| Network.Command
| Script.Command
| Session.Command;

Expand All @@ -51,6 +52,7 @@ export namespace Message {
export type CommandRequest = Pick<RawCommandRequest, 'id'> & BiDiCommand;
export type CommandResponse = Pick<RawCommandRequest, 'id'> & ResultData;

export type EmptyCommand = never;
export type EmptyParams = Record<string, never>;
export type EmptyResult = {result: Record<string, never>};

Expand All @@ -60,6 +62,7 @@ export namespace Message {
| BrowsingContext.Result
| CDP.Result
| ErrorResult
| Network.Result
| Script.Result
| Session.Result;
// keep-sorted end
Expand Down Expand Up @@ -1018,9 +1021,14 @@ export namespace Log {
}

export namespace Network {
export type Command = Message.EmptyCommand;

export type Result = Message.EmptyResult;

export type Event =
| BeforeRequestSentEvent
| ResponseCompletedEvent
| ResponseStartedEvent
| FetchErrorEvent;

export type BeforeRequestSentEvent = EventResponse<
Expand All @@ -1033,6 +1041,11 @@ export namespace Network {
ResponseCompletedParams
>;

export type ResponseStartedEvent = EventResponse<
EventNames.ResponseStartedEvent,
ResponseStartedParams
>;

export type FetchErrorEvent = EventResponse<
EventNames.FetchErrorEvent,
FetchErrorParams
Expand Down Expand Up @@ -1074,6 +1087,8 @@ export namespace Network {
responseEnd: number;
};

export type Request = string;

export type RequestData = {
request: string;
url: string;
Expand All @@ -1085,8 +1100,8 @@ export namespace Network {
timings: FetchTimingInfo;
};

export type BaseEventParams = {
context: string | null;
export type BaseParameters = {
context: CommonDataTypes.BrowsingContext | null;
navigation: BrowsingContext.Navigation | null;
redirectCount: number;
request: RequestData;
Expand Down Expand Up @@ -1119,24 +1134,29 @@ export namespace Network {
content: ResponseContent;
};

export type BeforeRequestSentParams = BaseEventParams & {
export type BeforeRequestSentParams = BaseParameters & {
initiator: Initiator;
};

export type ResponseCompletedParams = BaseEventParams & {
export type ResponseCompletedParams = BaseParameters & {
response: ResponseData;
};

export type FetchErrorParams = BaseEventParams & {
export type ResponseStartedParams = BaseParameters & {
response: ResponseData;
};

export type FetchErrorParams = BaseParameters & {
errorText: string;
};

export const AllEvents = 'network';

export enum EventNames {
BeforeRequestSentEvent = 'network.beforeRequestSent',
ResponseCompletedEvent = 'network.responseCompleted',
FetchErrorEvent = 'network.fetchError',
ResponseStartedEvent = 'network.responseStarted',
ResponseCompletedEvent = 'network.responseCompleted',
}
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
[response_started.py]
expected: TIMEOUT
[test_subscribe_status]
expected: FAIL

Expand Down

0 comments on commit ca811b3

Please sign in to comment.