55  JSONStringify, 
66  StringPrototypeSplit, 
77  ArrayPrototypePush, 
8-   ReflectApply, 
98  Symbol, 
109  TypedArrayPrototypeSubarray, 
1110}  =  primordials ; 
@@ -15,7 +14,6 @@ const v8 = require('v8');
1514const  {  isArrayBufferView }  =  require ( 'internal/util/types' ) ; 
1615const  assert  =  require ( 'internal/assert' ) ; 
1716const  {  streamBaseState,  kLastWriteWasAsync }  =  internalBinding ( 'stream_wrap' ) ; 
18- const  {  readUInt32BE }  =  require ( 'internal/buffer' ) ; 
1917
2018const  kMessageBuffer  =  Symbol ( 'kMessageBuffer' ) ; 
2119const  kMessageBufferSize  =  Symbol ( 'kMessageBufferSize' ) ; 
@@ -71,7 +69,12 @@ const advanced = {
7169    while  ( messageBufferHead . length  >=  4 )  { 
7270      // We call `readUInt32BE` manually here, because this is faster than first converting 
7371      // it to a buffer and using `readUInt32BE` on that. 
74-       const  fullMessageSize  =  ReflectApply ( readUInt32BE ,  messageBufferHead ,  [ 0 ] )  +  4 ; 
72+       const  fullMessageSize  =  ( 
73+         messageBufferHead [ 0 ]  <<  24  | 
74+         messageBufferHead [ 1 ]  <<  16  | 
75+         messageBufferHead [ 2 ]  <<  8  | 
76+         messageBufferHead [ 3 ] 
77+       )  +  4 ; 
7578
7679      if  ( channel [ kMessageBufferSize ]  <  fullMessageSize )  break ; 
7780
@@ -100,20 +103,27 @@ const advanced = {
100103
101104  writeChannelMessage ( channel ,  req ,  message ,  handle )  { 
102105    const  ser  =  new  ChildProcessSerializer ( ) ; 
106+     // Add 4 bytes, to later populate with message length 
107+     ser . writeRawBytes ( Buffer . allocUnsafe ( 4 ) ) ; 
103108    ser . writeHeader ( ) ; 
104109    ser . writeValue ( message ) ; 
110+ 
105111    const  serializedMessage  =  ser . releaseBuffer ( ) ; 
106-     const  sizeBuffer  =  Buffer . allocUnsafe ( 4 ) ; 
107-     sizeBuffer . writeUInt32BE ( serializedMessage . length ) ; 
108- 
109-     const  buffer  =  Buffer . concat ( [ 
110-       sizeBuffer , 
111-       serializedMessage , 
112-     ] ) ; 
113-     const  result  =  channel . writeBuffer ( req ,  buffer ,  handle ) ; 
112+     const  serializedMessageLength  =  serializedMessage . length  -  4 ; 
113+ 
114+     serializedMessage . set ( [ 
115+       serializedMessageLength  >>  24  &  0xFF , 
116+       serializedMessageLength  >>  16  &  0xFF , 
117+       serializedMessageLength  >>  8  &  0xFF , 
118+       serializedMessageLength  &  0xFF , 
119+     ] ,  0 ) ; 
120+ 
121+     const  result  =  channel . writeBuffer ( req ,  serializedMessage ,  handle ) ; 
122+ 
114123    // Mirror what stream_base_commons.js does for Buffer retention. 
115124    if  ( streamBaseState [ kLastWriteWasAsync ] ) 
116-       req . buffer  =  buffer ; 
125+       req . buffer  =  serializedMessage ; 
126+ 
117127    return  result ; 
118128  } , 
119129} ; 
0 commit comments