add more events

This commit is contained in:
Simon Knott 2025-01-27 16:53:48 +01:00
parent 8db16b2e6b
commit 75a8ace20e
No known key found for this signature in database
GPG key ID: 8CEDC00028084AEC
6 changed files with 93 additions and 7 deletions

View file

@ -30,15 +30,35 @@ export class MockingProxy extends ChannelOwner<channels.MockingProxyChannel> {
this._channel.on('route', async (params: channels.MockingProxyRouteEvent) => { this._channel.on('route', async (params: channels.MockingProxyRouteEvent) => {
const route = network.Route.from(params.route); const route = network.Route.from(params.route);
route._context = requestContext; route._context = requestContext;
this.emit(Events.MockingProxy.Route, route);
});
this._channel.on('request', async (params: channels.MockingProxyRequestEvent) => {
const request = network.Request.from(params.request);
if (params.correlation) { if (params.correlation) {
const browserRequest = this._browserRequests.get(params.correlation); const browserRequest = this._browserRequests.get(params.correlation);
this._browserRequests.delete(params.correlation); this._browserRequests.delete(params.correlation);
assert(browserRequest); assert(browserRequest);
route.request()._frame = browserRequest._frame; request._frame = browserRequest._frame;
} }
});
this.emit(Events.MockingProxy.Route, route); this._channel.on('requestFailed', async (params: channels.MockingProxyRequestFailedEvent) => {
const request = network.Request.from(params.request);
request._failureText = params.failureText ?? null;
request._setResponseEndTiming(params.responseEndTiming);
});
this._channel.on('requestFinished', async (params: channels.MockingProxyRequestFinishedEvent) => {
const { responseEndTiming } = params;
const request = network.Request.from(params.request);
const response = network.Response.fromNullable(params.response);
request._setResponseEndTiming(responseEndTiming);
response?._finishedPromise.resolve(null);
});
this._channel.on('response', async (params: channels.MockingProxyResponseEvent) => {
// no-op
}); });
} }

View file

@ -348,8 +348,25 @@ scheme.MockingProxyInitializer = tObject({
}); });
scheme.MockingProxyRouteEvent = tObject({ scheme.MockingProxyRouteEvent = tObject({
route: tChannel(['Route']), route: tChannel(['Route']),
});
scheme.MockingProxyRequestEvent = tObject({
request: tChannel(['Request']),
correlation: tOptional(tString), correlation: tOptional(tString),
}); });
scheme.MockingProxyRequestFailedEvent = tObject({
request: tChannel(['Request']),
failureText: tOptional(tString),
responseEndTiming: tNumber,
});
scheme.MockingProxyRequestFinishedEvent = tObject({
request: tChannel(['Request']),
response: tOptional(tChannel(['Response'])),
responseEndTiming: tNumber,
});
scheme.MockingProxyResponseEvent = tObject({
response: tChannel(['Response']),
page: tOptional(tChannel(['Page'])),
});
scheme.MockingProxySetInterceptionPatternsParams = tObject({ scheme.MockingProxySetInterceptionPatternsParams = tObject({
patterns: tArray(tObject({ patterns: tArray(tObject({
glob: tOptional(tString), glob: tOptional(tString),

View file

@ -19,7 +19,7 @@ import type { RootDispatcher } from './dispatcher';
import { Dispatcher, existingDispatcher } from './dispatcher'; import { Dispatcher, existingDispatcher } from './dispatcher';
import type * as channels from '@protocol/channels'; import type * as channels from '@protocol/channels';
import { APIRequestContextDispatcher, RequestDispatcher, RouteDispatcher } from './networkDispatchers'; import { APIRequestContextDispatcher, RequestDispatcher, RouteDispatcher } from './networkDispatchers';
import type { Route } from '../network'; import type { Request, Route } from '../network';
import { urlMatches } from '../../utils/isomorphic/urlMatch'; import { urlMatches } from '../../utils/isomorphic/urlMatch';
export class MockingProxyDispatcher extends Dispatcher<MockingProxy, channels.MockingProxyChannel, RootDispatcher> implements channels.MockingProxyChannel { export class MockingProxyDispatcher extends Dispatcher<MockingProxy, channels.MockingProxyChannel, RootDispatcher> implements channels.MockingProxyChannel {
@ -36,9 +36,12 @@ export class MockingProxyDispatcher extends Dispatcher<MockingProxy, channels.Mo
requestContext: APIRequestContextDispatcher.from(scope, mockingProxy.fetchRequest), requestContext: APIRequestContextDispatcher.from(scope, mockingProxy.fetchRequest),
}); });
this.addObjectListener(MockingProxy.Events.Route, ({ route, correlation }: {route: Route, correlation?: string }) => { this.addObjectListener(MockingProxy.Events.Route, (route: Route) => {
const requestDispatcher = RequestDispatcher.from(this as any, route.request()); const requestDispatcher = RequestDispatcher.from(this as any, route.request());
this._dispatchEvent('route', { route: RouteDispatcher.from(requestDispatcher, route), correlation }); this._dispatchEvent('route', { route: RouteDispatcher.from(requestDispatcher, route) });
});
this.addObjectListener(MockingProxy.Events.Request, ({ request, correlation }: { request: Request, correlation?: string }) => {
this._dispatchEvent('request', { request: RequestDispatcher.from(this as any, request), correlation });
}); });
} }

View file

@ -87,7 +87,7 @@ export class MockingProxy extends SdkObject implements RequestContext {
const body = await collectBody(req); const body = await collectBody(req);
const request = new Request(this, null, null, null, undefined, req.url!, '', req.method!, body, headers); const request = new Request(this, null, null, null, undefined, req.url!, '', req.method!, body, headers);
request.setRawRequestHeaders(headers); request.setRawRequestHeaders(headers);
this.emit(MockingProxy.Events.Request, request); this.emit(MockingProxy.Events.Request, { request, correlation });
const route = new Route(request, { const route = new Route(request, {
abort: async errorCode => { abort: async errorCode => {
@ -209,7 +209,7 @@ export class MockingProxy extends SdkObject implements RequestContext {
}); });
if (this._matches?.(req.url!)) if (this._matches?.(req.url!))
this.emit(MockingProxy.Events.Route, { route, correlation }); this.emit(MockingProxy.Events.Route, route);
else else
await route.continue({ isFallback: false }); await route.continue({ isFallback: false });
} }

View file

@ -586,6 +586,10 @@ export type MockingProxyInitializer = {
}; };
export interface MockingProxyEventTarget { export interface MockingProxyEventTarget {
on(event: 'route', callback: (params: MockingProxyRouteEvent) => void): this; on(event: 'route', callback: (params: MockingProxyRouteEvent) => void): this;
on(event: 'request', callback: (params: MockingProxyRequestEvent) => void): this;
on(event: 'requestFailed', callback: (params: MockingProxyRequestFailedEvent) => void): this;
on(event: 'requestFinished', callback: (params: MockingProxyRequestFinishedEvent) => void): this;
on(event: 'response', callback: (params: MockingProxyResponseEvent) => void): this;
} }
export interface MockingProxyChannel extends MockingProxyEventTarget, EventTargetChannel { export interface MockingProxyChannel extends MockingProxyEventTarget, EventTargetChannel {
_type_MockingProxy: boolean; _type_MockingProxy: boolean;
@ -593,8 +597,25 @@ export interface MockingProxyChannel extends MockingProxyEventTarget, EventTarge
} }
export type MockingProxyRouteEvent = { export type MockingProxyRouteEvent = {
route: RouteChannel, route: RouteChannel,
};
export type MockingProxyRequestEvent = {
request: RequestChannel,
correlation?: string, correlation?: string,
}; };
export type MockingProxyRequestFailedEvent = {
request: RequestChannel,
failureText?: string,
responseEndTiming: number,
};
export type MockingProxyRequestFinishedEvent = {
request: RequestChannel,
response?: ResponseChannel,
responseEndTiming: number,
};
export type MockingProxyResponseEvent = {
response: ResponseChannel,
page?: PageChannel,
};
export type MockingProxySetInterceptionPatternsParams = { export type MockingProxySetInterceptionPatternsParams = {
patterns: { patterns: {
glob?: string, glob?: string,
@ -609,6 +630,10 @@ export type MockingProxySetInterceptionPatternsResult = void;
export interface MockingProxyEvents { export interface MockingProxyEvents {
'route': MockingProxyRouteEvent; 'route': MockingProxyRouteEvent;
'request': MockingProxyRequestEvent;
'requestFailed': MockingProxyRequestFailedEvent;
'requestFinished': MockingProxyRequestFinishedEvent;
'response': MockingProxyResponseEvent;
} }
// ----------- Root ----------- // ----------- Root -----------

View file

@ -700,8 +700,29 @@ MockingProxy:
route: route:
parameters: parameters:
route: Route route: Route
request:
parameters:
request: Request
correlation: string? correlation: string?
requestFailed:
parameters:
request: Request
failureText: string?
responseEndTiming: number
requestFinished:
parameters:
request: Request
response: Response?
responseEndTiming: number
response:
parameters:
response: Response
page: Page?
Root: Root:
type: interface type: interface