1818import { ProtocolMapping } from 'devtools-protocol/types/protocol-mapping' ;
1919import { Protocol } from 'devtools-protocol' ;
2020import { EventEmitter } from 'events' ;
21- import { IConnectionCallback } from '@secret-agent/puppet-interfaces/IConnectionCallback' ;
2221import { CanceledPromiseError } from '@secret-agent/commons/interfaces/IPendingWaitEvent' ;
2322import { TypedEventEmitter } from '@secret-agent/commons/eventUtils' ;
23+ import IResolvablePromise from '@secret-agent/core-interfaces/IResolvablePromise' ;
24+ import { createPromise } from '@secret-agent/commons/utils' ;
2425import ProtocolError from './ProtocolError' ;
2526import { Connection } from './Connection' ;
2627import RemoteObject = Protocol . Runtime . RemoteObject ;
@@ -39,7 +40,10 @@ export class CDPSession extends EventEmitter {
3940
4041 private readonly sessionId : string ;
4142 private readonly targetType : string ;
42- private readonly pendingMessages : Map < number , IConnectionCallback > = new Map ( ) ;
43+ private readonly pendingMessages : Map <
44+ number ,
45+ { resolvable : IResolvablePromise < any > ; method : string }
46+ > = new Map ( ) ;
4347
4448 constructor ( connection : Connection , targetType : string , sessionId : string ) {
4549 super ( ) ;
@@ -54,7 +58,7 @@ export class CDPSession extends EventEmitter {
5458 sendInitiator ?: object ,
5559 ) : Promise < ProtocolMapping . Commands [ T ] [ 'returnType' ] > {
5660 if ( ! this . isConnected ( ) ) {
57- throw new CanceledPromiseError ( `Session closed before api call (${ method } )` ) ;
61+ throw new CanceledPromiseError ( `${ method } called after session closed (${ this . sessionId } )` ) ;
5862 }
5963
6064 const message = {
@@ -71,28 +75,29 @@ export class CDPSession extends EventEmitter {
7175 } ,
7276 sendInitiator ,
7377 ) ;
78+ const resolvable = createPromise < ProtocolMapping . Commands [ T ] [ 'returnType' ] > ( ) ;
7479
75- return await new Promise ( ( resolve , reject ) => {
76- this . pendingMessages . set ( id , { resolve, reject, error : new CanceledPromiseError ( ) , method } ) ;
77- } ) ;
80+ this . pendingMessages . set ( id , { resolvable, method } ) ;
81+ return await resolvable . promise ;
7882 }
7983
8084 onMessage ( object : ICDPSendResponseMessage & ICDPEventMessage ) : void {
8185 this . messageEvents . emit ( 'receive' , { ...object } ) ;
8286 if ( ! object . id ) {
83- setImmediate ( ( ) => this . emit ( object . method , object . params ) ) ;
87+ this . emit ( object . method , object . params ) ;
8488 return ;
8589 }
8690
87- const callback = this . pendingMessages . get ( object . id ) ;
88- if ( ! callback ) return ;
91+ const pending = this . pendingMessages . get ( object . id ) ;
92+ if ( ! pending ) return ;
93+
94+ const { resolvable, method } = pending ;
8995
9096 this . pendingMessages . delete ( object . id ) ;
9197 if ( object . error ) {
92- const protocolError = new ProtocolError ( callback . error . stack , callback . method , object . error ) ;
93- setImmediate ( ( ) => callback . reject ( protocolError ) ) ;
98+ resolvable . reject ( new ProtocolError ( resolvable . stack , method , object . error ) ) ;
9499 } else {
95- setImmediate ( ( ) => callback . resolve ( object . result ) ) ;
100+ resolvable . resolve ( object . result ) ;
96101 }
97102 }
98103
@@ -105,10 +110,13 @@ export class CDPSession extends EventEmitter {
105110 }
106111
107112 onClosed ( ) : void {
108- for ( const callback of this . pendingMessages . values ( ) ) {
109- const error = callback . error ;
110- error . message = `Cancel Pending Promise (${ callback . method } ): Target closed.` ;
111- callback . reject ( error ) ;
113+ for ( const { resolvable, method } of this . pendingMessages . values ( ) ) {
114+ const error = new CanceledPromiseError ( `Cancel Pending Promise (${ method } ): Target closed.` ) ;
115+ error . stack += `\n${ '------DEVTOOLS' . padEnd (
116+ 50 ,
117+ '-' ,
118+ ) } \n${ `------DEVTOOLS-SESSION-ID =${ this . sessionId } ` . padEnd ( 50 , '-' ) } \n${ resolvable . stack } `;
119+ resolvable . reject ( error ) ;
112120 }
113121 this . pendingMessages . clear ( ) ;
114122 this . connection = null ;
0 commit comments