@@ -223,9 +223,8 @@ class Http2Transport implements Transport {
223223 ) ;
224224
225225 session . once ( 'error' , error => {
226- /* Do nothing here. Any error should also trigger a close event, which is
227- * where we want to handle that. */
228226 this . trace ( 'connection closed with error ' + ( error as Error ) . message ) ;
227+ this . handleDisconnect ( ) ;
229228 } ) ;
230229
231230 if ( logging . isTracerEnabled ( TRACER_NAME ) ) {
@@ -383,6 +382,9 @@ class Http2Transport implements Transport {
383382 * Handle connection drops, but not GOAWAYs.
384383 */
385384 private handleDisconnect ( ) {
385+ if ( this . disconnectHandled ) {
386+ return ;
387+ }
386388 this . clearKeepaliveTimeout ( ) ;
387389 this . reportDisconnectToOwner ( false ) ;
388390 /* Give calls an event loop cycle to finish naturally before reporting the
@@ -768,6 +770,7 @@ export class Http2SubchannelConnector implements SubchannelConnector {
768770 ) ;
769771 this . session = session ;
770772 let errorMessage = 'Failed to connect' ;
773+ let reportedError = false ;
771774 session . unref ( ) ;
772775 session . once ( 'connect' , ( ) => {
773776 session . removeAllListeners ( ) ;
@@ -778,12 +781,19 @@ export class Http2SubchannelConnector implements SubchannelConnector {
778781 this . session = null ;
779782 // Leave time for error event to happen before rejecting
780783 setImmediate ( ( ) => {
781- reject ( `${ errorMessage } (${ new Date ( ) . toISOString ( ) } )` ) ;
784+ if ( ! reportedError ) {
785+ reportedError = true ;
786+ reject ( `${ errorMessage } (${ new Date ( ) . toISOString ( ) } )` ) ;
787+ }
782788 } ) ;
783789 } ) ;
784790 session . once ( 'error' , error => {
785791 errorMessage = ( error as Error ) . message ;
786792 this . trace ( 'connection failed with error ' + errorMessage ) ;
793+ if ( ! reportedError ) {
794+ reportedError = true ;
795+ reject ( `${ errorMessage } (${ new Date ( ) . toISOString ( ) } )` ) ;
796+ }
787797 } ) ;
788798 } ) ;
789799 }
0 commit comments