@@ -456,16 +456,22 @@ function setupChannel(target, channel) {
456456 }
457457 chunks [ 0 ] = jsonBuffer + chunks [ 0 ] ;
458458
459+ var nextTick = false ;
459460 for ( var i = 0 ; i < numCompleteChunks ; i ++ ) {
460461 var message = JSON . parse ( chunks [ i ] ) ;
461462
462463 // There will be at most one NODE_HANDLE message in every chunk we
463464 // read because SCM_RIGHTS messages don't get coalesced. Make sure
464465 // that we deliver the handle with the right message however.
465- if ( message && message . cmd === 'NODE_HANDLE' )
466- handleMessage ( target , message , recvHandle ) ;
467- else
468- handleMessage ( target , message , undefined ) ;
466+ if ( isInternal ( message ) ) {
467+ if ( message . cmd === 'NODE_HANDLE' )
468+ handleMessage ( message , recvHandle , true , false ) ;
469+ else
470+ handleMessage ( message , undefined , true , false ) ;
471+ } else {
472+ handleMessage ( message , undefined , false , nextTick ) ;
473+ nextTick = true ;
474+ }
469475 }
470476 jsonBuffer = incompleteChunk ;
471477 this . buffering = jsonBuffer . length !== 0 ;
@@ -526,7 +532,7 @@ function setupChannel(target, channel) {
526532
527533 // Convert handle object
528534 obj . got . call ( this , message , handle , function ( handle ) {
529- handleMessage ( target , message . msg , handle ) ;
535+ handleMessage ( message . msg , handle , isInternal ( message . msg ) , false ) ;
530536 } ) ;
531537 } ) ;
532538
@@ -732,27 +738,32 @@ function setupChannel(target, channel) {
732738 process . nextTick ( finish ) ;
733739 } ;
734740
741+ function emit ( event , message , handle ) {
742+ target . emit ( event , message , handle ) ;
743+ }
744+
745+ function handleMessage ( message , handle , internal , nextTick ) {
746+ if ( ! target . channel )
747+ return ;
748+
749+ var eventName = ( internal ? 'internalMessage' : 'message' ) ;
750+ if ( nextTick )
751+ process . nextTick ( emit , eventName , message , handle ) ;
752+ else
753+ target . emit ( eventName , message , handle ) ;
754+ }
755+
735756 channel . readStart ( ) ;
736757 return control ;
737758}
738759
739-
740760const INTERNAL_PREFIX = 'NODE_' ;
741- function handleMessage ( target , message , handle ) {
742- if ( ! target . channel )
743- return ;
744-
745- var eventName = 'message' ;
746- if ( message !== null &&
747- typeof message === 'object' &&
748- typeof message . cmd === 'string' &&
749- message . cmd . length > INTERNAL_PREFIX . length &&
750- message . cmd . slice ( 0 , INTERNAL_PREFIX . length ) === INTERNAL_PREFIX ) {
751- eventName = 'internalMessage' ;
752- }
753- process . nextTick ( ( ) => {
754- target . emit ( eventName , message , handle ) ;
755- } ) ;
761+ function isInternal ( message ) {
762+ return ( message !== null &&
763+ typeof message === 'object' &&
764+ typeof message . cmd === 'string' &&
765+ message . cmd . length > INTERNAL_PREFIX . length &&
766+ message . cmd . slice ( 0 , INTERNAL_PREFIX . length ) === INTERNAL_PREFIX ) ;
756767}
757768
758769function nop ( ) { }
0 commit comments