5
5
JSONStringify,
6
6
StringPrototypeSplit,
7
7
ArrayPrototypePush,
8
- ReflectApply,
9
8
Symbol,
10
9
TypedArrayPrototypeSubarray,
11
10
} = primordials ;
@@ -15,7 +14,6 @@ const v8 = require('v8');
15
14
const { isArrayBufferView } = require ( 'internal/util/types' ) ;
16
15
const assert = require ( 'internal/assert' ) ;
17
16
const { streamBaseState, kLastWriteWasAsync } = internalBinding ( 'stream_wrap' ) ;
18
- const { readUInt32BE } = require ( 'internal/buffer' ) ;
19
17
20
18
const kMessageBuffer = Symbol ( 'kMessageBuffer' ) ;
21
19
const kMessageBufferSize = Symbol ( 'kMessageBufferSize' ) ;
@@ -71,7 +69,12 @@ const advanced = {
71
69
while ( messageBufferHead . length >= 4 ) {
72
70
// We call `readUInt32BE` manually here, because this is faster than first converting
73
71
// 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 ;
75
78
76
79
if ( channel [ kMessageBufferSize ] < fullMessageSize ) break ;
77
80
@@ -100,20 +103,27 @@ const advanced = {
100
103
101
104
writeChannelMessage ( channel , req , message , handle ) {
102
105
const ser = new ChildProcessSerializer ( ) ;
106
+ // Add 4 bytes, to later populate with message length
107
+ ser . writeRawBytes ( Buffer . allocUnsafe ( 4 ) ) ;
103
108
ser . writeHeader ( ) ;
104
109
ser . writeValue ( message ) ;
110
+
105
111
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
+
114
123
// Mirror what stream_base_commons.js does for Buffer retention.
115
124
if ( streamBaseState [ kLastWriteWasAsync ] )
116
- req . buffer = buffer ;
125
+ req . buffer = serializedMessage ;
126
+
117
127
return result ;
118
128
} ,
119
129
} ;
0 commit comments