@@ -81,6 +81,7 @@ let HTTPParser;
81
81
const MAX_HANDLE_RETRANSMISSIONS = 3 ;
82
82
const kChannelHandle = Symbol ( 'kChannelHandle' ) ;
83
83
const kIsUsedAsStdio = Symbol ( 'kIsUsedAsStdio' ) ;
84
+ const kPendingMessages = Symbol ( 'kPendingMessages' ) ;
84
85
85
86
// This object contain function to convert TCP objects to native handle objects
86
87
// and back again.
@@ -528,6 +529,7 @@ class Control extends EventEmitter {
528
529
constructor ( channel ) {
529
530
super ( ) ;
530
531
this . #channel = channel ;
532
+ this [ kPendingMessages ] = [ ] ;
531
533
}
532
534
533
535
// The methods keeping track of the counter are being used to track the
@@ -701,6 +703,24 @@ function setupChannel(target, channel, serializationMode) {
701
703
} ) ;
702
704
} ) ;
703
705
706
+ target . on ( 'newListener' , function ( ) {
707
+
708
+ process . nextTick ( ( ) => {
709
+ if ( ! target . channel || ! target . listenerCount ( 'message' ) )
710
+ return ;
711
+
712
+ const messages = target . channel [ kPendingMessages ] ;
713
+ const { length } = messages ;
714
+ if ( ! length ) return ;
715
+
716
+ for ( let i = 0 ; i < length ; i ++ ) {
717
+ ReflectApply ( target . emit , target , messages [ i ] ) ;
718
+ }
719
+
720
+ target . channel [ kPendingMessages ] = [ ] ;
721
+ } ) ;
722
+ } ) ;
723
+
704
724
target . send = function ( message , handle , options , callback ) {
705
725
if ( typeof handle === 'function' ) {
706
726
callback = handle ;
@@ -914,7 +934,15 @@ function setupChannel(target, channel, serializationMode) {
914
934
} ;
915
935
916
936
function emit ( event , message , handle ) {
917
- target . emit ( event , message , handle ) ;
937
+ if ( 'internalMessage' === event || target . listenerCount ( 'message' ) ) {
938
+ target . emit ( event , message , handle ) ;
939
+ return ;
940
+ }
941
+
942
+ ArrayPrototypePush (
943
+ target . channel [ kPendingMessages ] ,
944
+ [ event , message , handle ]
945
+ ) ;
918
946
}
919
947
920
948
function handleMessage ( message , handle , internal ) {
0 commit comments