@@ -78,7 +78,7 @@ class Sender {
78
78
*/
79
79
doPing ( data , options ) {
80
80
var mask = options && options . mask ;
81
- this . frameAndSend ( 0x9 , data || '' , true , mask ) ;
81
+ this . frameAndSend ( 0x9 , data ? Buffer . from ( data . toString ( ) ) : null , true , mask ) ;
82
82
if ( this . extensions [ PerMessageDeflate . extensionName ] ) {
83
83
this . messageHandlerCallback ( ) ;
84
84
}
@@ -104,7 +104,7 @@ class Sender {
104
104
*/
105
105
doPong ( data , options ) {
106
106
var mask = options && options . mask ;
107
- this . frameAndSend ( 0xa , data || '' , true , mask ) ;
107
+ this . frameAndSend ( 0xa , data ? Buffer . from ( data . toString ( ) ) : null , true , mask ) ;
108
108
if ( this . extensions [ PerMessageDeflate . extensionName ] ) {
109
109
this . messageHandlerCallback ( ) ;
110
110
}
@@ -129,6 +129,17 @@ class Sender {
129
129
}
130
130
if ( finalFragment ) this . firstFragment = true ;
131
131
132
+ if ( data && ! Buffer . isBuffer ( data ) ) {
133
+ if ( ( data . buffer || data ) instanceof ArrayBuffer ) {
134
+ data = getBufferFromNative ( data ) ;
135
+ } else {
136
+ if ( typeof data === 'number' ) {
137
+ data = data . toString ( ) ;
138
+ }
139
+ data = Buffer . from ( data ) ;
140
+ }
141
+ }
142
+
132
143
if ( this . extensions [ PerMessageDeflate . extensionName ] ) {
133
144
this . enqueue ( [ this . sendCompressed , [ opcode , data , finalFragment , mask , compress , cb ] ] ) ;
134
145
} else {
@@ -142,6 +153,11 @@ class Sender {
142
153
* @api private
143
154
*/
144
155
sendCompressed ( opcode , data , finalFragment , mask , compress , cb ) {
156
+ if ( data && data . length < this . extensions [ PerMessageDeflate . extensionName ] . threshold ) {
157
+ this . frameAndSend ( opcode , data , finalFragment , mask , false , cb ) ;
158
+ this . messageHandlerCallback ( ) ;
159
+ return ;
160
+ }
145
161
this . applyExtensions ( data , finalFragment , this . compress , ( err , data ) => {
146
162
if ( err ) {
147
163
if ( cb ) cb ( err ) ;
@@ -159,32 +175,13 @@ class Sender {
159
175
* @api private
160
176
*/
161
177
frameAndSend ( opcode , data , finalFragment , maskData , compressed , cb ) {
162
- var canModifyData = false ;
163
-
164
178
if ( ! data ) {
165
179
var buff = [ opcode | ( finalFragment ? 0x80 : 0 ) , 0 | ( maskData ? 0x80 : 0 ) ]
166
180
. concat ( maskData ? [ 0 , 0 , 0 , 0 ] : [ ] ) ;
167
181
sendFramedData ( this , new Buffer ( buff ) , null , cb ) ;
168
182
return ;
169
183
}
170
184
171
- if ( ! Buffer . isBuffer ( data ) ) {
172
- if ( ( data . buffer || data ) instanceof ArrayBuffer ) {
173
- data = getBufferFromNative ( data ) ;
174
- } else {
175
- canModifyData = true ;
176
- //
177
- // If people want to send a number, this would allocate the number in
178
- // bytes as memory size instead of storing the number as buffer value. So
179
- // we need to transform it to string in order to prevent possible
180
- // vulnerabilities / memory attacks.
181
- //
182
- if ( typeof data === 'number' ) data = data . toString ( ) ;
183
-
184
- data = new Buffer ( data ) ;
185
- }
186
- }
187
-
188
185
var dataLength = data . length ;
189
186
var dataOffset = maskData ? 6 : 2 ;
190
187
var secondByte = dataLength ;
@@ -197,6 +194,7 @@ class Sender {
197
194
secondByte = 126 ;
198
195
}
199
196
197
+ var canModifyData = opcode === 1 || compressed ;
200
198
var mergeBuffers = dataLength < 32768 || ( maskData && ! canModifyData ) ;
201
199
var totalLength = mergeBuffers ? dataLength + dataOffset : dataOffset ;
202
200
var outputBuffer = new Buffer ( totalLength ) ;
@@ -276,9 +274,6 @@ class Sender {
276
274
*/
277
275
applyExtensions ( data , fin , compress , callback ) {
278
276
if ( compress && data ) {
279
- if ( ( data . buffer || data ) instanceof ArrayBuffer ) {
280
- data = getBufferFromNative ( data ) ;
281
- }
282
277
this . extensions [ PerMessageDeflate . extensionName ] . compress ( data , fin , callback ) ;
283
278
} else {
284
279
callback ( null , data ) ;
0 commit comments