@@ -208,31 +208,56 @@ export class Chromium extends AbstractBrowserType<CRBrowser> {
208
208
}
209
209
}
210
210
211
+ type SessionData = {
212
+ socket : ws ,
213
+ children : Set < string > ,
214
+ isBrowserSession : boolean ,
215
+ parent ?: string ,
216
+ } ;
217
+
211
218
function wrapTransportWithWebSocket ( transport : ConnectionTransport , logger : InnerLogger , port : number ) : WebSocketWrapper {
212
219
const server = new ws . Server ( { port } ) ;
213
220
const guid = helper . guid ( ) ;
214
221
215
222
const awaitingBrowserTarget = new Map < number , ws > ( ) ;
216
- const sessionToSocket = new Map < string , ws > ( ) ;
223
+ const sessionToData = new Map < string , SessionData > ( ) ;
217
224
const socketToBrowserSession = new Map < ws , { sessionId ?: string , queue ?: ProtocolRequest [ ] } > ( ) ;
218
- const browserSessions = new Set < string > ( ) ;
219
225
let lastSequenceNumber = 1 ;
220
226
227
+ function addSession ( sessionId : string , socket : ws , parentSessionId ?: string ) {
228
+ sessionToData . set ( sessionId , {
229
+ socket,
230
+ children : new Set ( ) ,
231
+ isBrowserSession : ! parentSessionId ,
232
+ parent : parentSessionId
233
+ } ) ;
234
+ if ( parentSessionId )
235
+ sessionToData . get ( parentSessionId ) ! . children . add ( sessionId ) ;
236
+ }
237
+
238
+ function removeSession ( sessionId : string ) {
239
+ const data = sessionToData . get ( sessionId ) ! ;
240
+ for ( const child of data . children )
241
+ removeSession ( child ) ;
242
+ if ( data . parent )
243
+ sessionToData . get ( data . parent ) ! . children . delete ( sessionId ) ;
244
+ sessionToData . delete ( sessionId ) ;
245
+ }
246
+
221
247
transport . onmessage = message => {
222
248
if ( typeof message . id === 'number' && awaitingBrowserTarget . has ( message . id ) ) {
223
249
const freshSocket = awaitingBrowserTarget . get ( message . id ) ! ;
224
250
awaitingBrowserTarget . delete ( message . id ) ;
225
251
226
252
const sessionId = message . result . sessionId ;
227
253
if ( freshSocket . readyState !== ws . CLOSED && freshSocket . readyState !== ws . CLOSING ) {
228
- sessionToSocket . set ( sessionId , freshSocket ) ;
229
254
const { queue } = socketToBrowserSession . get ( freshSocket ) ! ;
230
255
for ( const item of queue ! ) {
231
256
item . sessionId = sessionId ;
232
257
transport . send ( item ) ;
233
258
}
234
259
socketToBrowserSession . set ( freshSocket , { sessionId } ) ;
235
- browserSessions . add ( sessionId ) ;
260
+ addSession ( sessionId , freshSocket ) ;
236
261
} else {
237
262
transport . send ( {
238
263
id : ++ lastSequenceNumber ,
@@ -248,16 +273,16 @@ function wrapTransportWithWebSocket(transport: ConnectionTransport, logger: Inne
248
273
if ( ! message . sessionId )
249
274
return ;
250
275
251
- const socket = sessionToSocket . get ( message . sessionId ) ;
252
- if ( socket && socket . readyState !== ws . CLOSING ) {
276
+ const data = sessionToData . get ( message . sessionId ) ;
277
+ if ( data && data . socket . readyState !== ws . CLOSING ) {
253
278
if ( message . method === 'Target.attachedToTarget' )
254
- sessionToSocket . set ( message . params . sessionId , socket ) ;
279
+ addSession ( message . params . sessionId , data . socket , message . sessionId ) ;
255
280
if ( message . method === 'Target.detachedFromTarget' )
256
- sessionToSocket . delete ( message . params . sessionId ) ;
281
+ removeSession ( message . params . sessionId ) ;
257
282
// Strip session ids from the browser sessions.
258
- if ( browserSessions . has ( message . sessionId ) )
283
+ if ( data . isBrowserSession )
259
284
delete message . sessionId ;
260
- socket . send ( JSON . stringify ( message ) ) ;
285
+ data . socket . send ( JSON . stringify ( message ) ) ;
261
286
}
262
287
} ;
263
288
@@ -311,8 +336,7 @@ function wrapTransportWithWebSocket(transport: ConnectionTransport, logger: Inne
311
336
const session = socketToBrowserSession . get ( socket ) ;
312
337
if ( ! session || ! session . sessionId )
313
338
return ;
314
- sessionToSocket . delete ( session . sessionId ) ;
315
- browserSessions . delete ( session . sessionId ) ;
339
+ removeSession ( session . sessionId ) ;
316
340
socketToBrowserSession . delete ( socket ) ;
317
341
transport . send ( {
318
342
id : ++ lastSequenceNumber ,
@@ -324,7 +348,7 @@ function wrapTransportWithWebSocket(transport: ConnectionTransport, logger: Inne
324
348
325
349
const address = server . address ( ) ;
326
350
const wsEndpoint = typeof address === 'string' ? `${ address } /${ guid } ` : `ws://127.0.0.1:${ address . port } /${ guid } ` ;
327
- return new WebSocketWrapper ( wsEndpoint , [ awaitingBrowserTarget , sessionToSocket , socketToBrowserSession , browserSessions ] ) ;
351
+ return new WebSocketWrapper ( wsEndpoint , [ awaitingBrowserTarget , sessionToData , socketToBrowserSession ] ) ;
328
352
}
329
353
330
354
0 commit comments