diff --git a/src/server/instrumentation.ts b/src/server/instrumentation.ts index 12dd0776c4..bed754656f 100644 --- a/src/server/instrumentation.ts +++ b/src/server/instrumentation.ts @@ -72,37 +72,17 @@ export interface InstrumentationListener { onAfterAction?(result: ActionResult, sdkObject: SdkObject, metadata: CallMetadata): Promise; } -export class InstrumentationMultiplexer implements Instrumentation { - private _listeners: InstrumentationListener[]; - - constructor(listeners: InstrumentationListener[]) { - this._listeners = listeners; - } - - async onContextCreated(context: BrowserContext): Promise { - for (const listener of this._listeners) - await listener.onContextCreated?.(context); - } - - async onContextWillDestroy(context: BrowserContext): Promise { - for (const listener of this._listeners) - await listener.onContextWillDestroy?.(context); - } - - async onContextDidDestroy(context: BrowserContext): Promise { - for (const listener of this._listeners) - await listener.onContextDidDestroy?.(context); - } - - async onActionCheckpoint(name: string, sdkObject: SdkObject, metadata: CallMetadata): Promise { - for (const listener of this._listeners) - await listener.onActionCheckpoint?.(name, sdkObject, metadata); - } - - async onAfterAction(result: ActionResult, sdkObject: SdkObject, metadata: CallMetadata): Promise { - for (const listener of this._listeners) - await listener.onAfterAction?.(result, sdkObject, metadata); - } +export function multiplexInstrumentation(listeners: InstrumentationListener[]): Instrumentation { + return new Proxy({}, { + get: (obj: any, prop: string) => { + if (!prop.startsWith('on')) + return obj[prop]; + return async (...params: any[]) => { + for (const listener of listeners) + await (listener as any)[prop]?.(...params); + }; + }, + }); } export function internalCallMetadata(): CallMetadata { diff --git a/src/server/playwright.ts b/src/server/playwright.ts index 8901d58f26..33a7d633f9 100644 --- a/src/server/playwright.ts +++ b/src/server/playwright.ts @@ -27,7 +27,7 @@ import { HarTracer } from './supplements/har/harTracer'; import { InspectorController } from './supplements/inspectorController'; import { WebKit } from './webkit/webkit'; import { Registry } from '../utils/registry'; -import { InstrumentationMultiplexer, SdkObject } from './instrumentation'; +import { InstrumentationListener, multiplexInstrumentation, SdkObject } from './instrumentation'; export class Playwright extends SdkObject { readonly selectors: Selectors; @@ -39,11 +39,13 @@ export class Playwright extends SdkObject { readonly options: PlaywrightOptions; constructor(isInternal: boolean) { - const instrumentation = new InstrumentationMultiplexer(isInternal ? [] : [ - new InspectorController(), - new Tracer(), - new HarTracer() - ]); + const listeners: InstrumentationListener[] = []; + if (!isInternal) { + listeners.push(new Tracer()); + listeners.push(new HarTracer()); + listeners.push(new InspectorController()); + } + const instrumentation = multiplexInstrumentation(listeners); super({ attribution: {}, instrumentation } as any); this.options = { isInternal, diff --git a/src/server/supplements/har/harTracer.ts b/src/server/supplements/har/harTracer.ts index de657e3f3f..40f5671a4c 100644 --- a/src/server/supplements/har/harTracer.ts +++ b/src/server/supplements/har/harTracer.ts @@ -42,8 +42,6 @@ export class HarTracer implements InstrumentationListener { await contextTracer.flush(); } } - - async onContextDidDestroy(context: BrowserContext): Promise { } } type HarOptions = { diff --git a/src/server/supplements/inspectorController.ts b/src/server/supplements/inspectorController.ts index 8a96d5a129..cdf96f21b5 100644 --- a/src/server/supplements/inspectorController.ts +++ b/src/server/supplements/inspectorController.ts @@ -28,6 +28,4 @@ export class InspectorController implements InstrumentationListener { }); } } - async onContextWillDestroy(context: BrowserContext): Promise {} - async onContextDidDestroy(context: BrowserContext): Promise {} } diff --git a/src/trace/tracer.ts b/src/trace/tracer.ts index 4e68f009a1..36b041e7c8 100644 --- a/src/trace/tracer.ts +++ b/src/trace/tracer.ts @@ -47,8 +47,6 @@ export class Tracer implements InstrumentationListener { this._contextTracers.set(context, contextTracer); } - async onContextWillDestroy(context: BrowserContext): Promise {} - async onContextDidDestroy(context: BrowserContext): Promise { const contextTracer = this._contextTracers.get(context); if (contextTracer) {