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