@@ -30,9 +30,10 @@ import { helper } from '../helper';
3030import * as network from '../network' ;
3131import { nullProgress } from '../progress' ;
3232
33+ import { Page } from '../page' ;
34+
3335import type { RegisteredListener } from '@utils/eventsHelper' ;
3436import type { APIRequestEvent , APIRequestFinishedEvent } from '../fetch' ;
35- import type { Page } from '../page' ;
3637import type { Worker } from '../page' ;
3738import type { HeadersArray , LifecycleEvent } from '../types' ;
3839import type * as har from '@trace/har' ;
@@ -102,7 +103,10 @@ export class HarTracer {
102103 ] ;
103104 if ( this . _context instanceof BrowserContext ) {
104105 this . _eventListeners . push (
105- eventsHelper . addEventListener ( this . _context , BrowserContext . Events . Page , ( page : Page ) => this . _createPageEntryIfNeeded ( page ) ) ,
106+ eventsHelper . addEventListener ( this . _context , BrowserContext . Events . Page , ( page : Page ) => {
107+ this . _addPageEventListeners ( page ) ;
108+ this . _createPageEntryIfNeeded ( page ) ;
109+ } ) ,
106110 eventsHelper . addEventListener ( this . _context , BrowserContext . Events . Request , ( request : network . Request ) => this . _onRequest ( request ) ) ,
107111 eventsHelper . addEventListener ( this . _context , BrowserContext . Events . RequestFinished , ( { request, response } ) => this . _onRequestFinished ( request , response ) . catch ( ( ) => { } ) ) ,
108112 eventsHelper . addEventListener ( this . _context , BrowserContext . Events . RequestFailed , request => this . _onRequestFailed ( request ) ) ,
@@ -111,11 +115,21 @@ export class HarTracer {
111115 eventsHelper . addEventListener ( this . _context , BrowserContext . Events . RequestFulfilled , request => this . _onRequestFulfilled ( request ) ) ,
112116 eventsHelper . addEventListener ( this . _context , BrowserContext . Events . RequestContinued , request => this . _onRequestContinued ( request ) ) ,
113117 ) ;
114- for ( const page of this . _context . pages ( ) )
118+ for ( const page of this . _context . pages ( ) ) {
119+ this . _addPageEventListeners ( page ) ;
115120 this . _createPageEntryIfNeeded ( page ) ;
121+ }
116122 }
117123 }
118124
125+ private _addPageEventListeners ( page : Page ) {
126+ if ( this . _page && page !== this . _page )
127+ return ;
128+ this . _eventListeners . push (
129+ eventsHelper . addEventListener ( page , Page . Events . WebSocket , ( webSocket : network . WebSocket ) => this . _onWebSocket ( page , webSocket ) ) ,
130+ ) ;
131+ }
132+
119133 private _shouldIncludeEntryWithUrl ( urlString : string ) {
120134 return ! this . _options . urlFilter || urlMatches ( this . _baseURL , urlString , this . _options . urlFilter ) ;
121135 }
@@ -418,6 +432,48 @@ export class HarTracer {
418432 harEntry . _wasContinued = true ;
419433 }
420434
435+ private _onWebSocket ( page : Page , webSocket : network . WebSocket ) {
436+ if ( ! this . _shouldIncludeEntryWithUrl ( webSocket . url ( ) ) )
437+ return ;
438+ const url = network . parseURL ( webSocket . url ( ) ) ;
439+ if ( ! url )
440+ return ;
441+
442+ const pageEntry = this . _createPageEntryIfNeeded ( page ) ;
443+ const harEntry = createHarEntry ( pageEntry ?. id , 'GET' , url , page . mainFrame ( ) . guid , this . _options ) ;
444+ harEntry . _resourceType = 'websocket' ;
445+ harEntry . _webSocketMessages = [ ] ;
446+
447+ // Fallbacks in case we never receive a response.
448+ harEntry . response . status = 101 ;
449+ harEntry . response . statusText = 'Switching Protocols' ;
450+
451+ if ( this . _started )
452+ this . _delegate . onEntryStarted ( harEntry ) ;
453+
454+ eventsHelper . addEventListener ( webSocket , network . WebSocket . Events . Request , ( { headers } : { headers : HeadersArray } ) => {
455+ this . _recordRequestHeadersAndCookies ( harEntry , headers ) ;
456+ } ) ;
457+ eventsHelper . addEventListener ( webSocket , network . WebSocket . Events . Response , ( { status, statusText, headers } : { status : number , statusText : string , headers : HeadersArray } ) => {
458+ harEntry . response . status = status ;
459+ harEntry . response . statusText = statusText ;
460+ this . _recordResponseHeaders ( harEntry , headers ) ;
461+ } ) ;
462+ eventsHelper . addEventListener ( webSocket , network . WebSocket . Events . FrameSent , ( { opcode, data, timestamp } : { opcode : number , data : string , timestamp : number } ) => {
463+ harEntry . _webSocketMessages ! . push ( { type : 'send' , time : timestamp , opcode, data } ) ;
464+ } ) ;
465+ eventsHelper . addEventListener ( webSocket , network . WebSocket . Events . FrameReceived , ( { opcode, data, timestamp } : { opcode : number , data : string , timestamp : number } ) => {
466+ harEntry . _webSocketMessages ! . push ( { type : 'receive' , time : timestamp , opcode, data } ) ;
467+ } ) ;
468+ eventsHelper . addEventListener ( webSocket , network . WebSocket . Events . SocketError , ( errorMessage : string ) => {
469+ harEntry . response . _failureText = errorMessage ;
470+ } ) ;
471+ eventsHelper . addEventListener ( webSocket , network . WebSocket . Events . Close , ( ) => {
472+ if ( this . _started )
473+ this . _delegate . onEntryFinished ( harEntry ) ;
474+ } ) ;
475+ }
476+
421477 private _storeResponseContent ( buffer : Buffer | undefined , content : har . Content , resourceType : string ) {
422478 if ( ! buffer ) {
423479 content . size = 0 ;
0 commit comments