@@ -11,7 +11,7 @@ const { EMPTY_BUFFER } = require('./constants');
1111const { isValidStatusCode } = require ( './validation' ) ;
1212const { mask : applyMask , toBuffer } = require ( './buffer-util' ) ;
1313
14- const mask = Buffer . alloc ( 4 ) ;
14+ const maskBuffer = Buffer . alloc ( 4 ) ;
1515
1616/**
1717 * HyBi Sender implementation.
@@ -22,9 +22,17 @@ class Sender {
2222 *
2323 * @param {(net.Socket|tls.Socket) } socket The connection socket
2424 * @param {Object } [extensions] An object containing the negotiated extensions
25+ * @param {Function } [generateMask] The function used to generate the masking
26+ * key
2527 */
26- constructor ( socket , extensions ) {
28+ constructor ( socket , extensions , generateMask ) {
2729 this . _extensions = extensions || { } ;
30+
31+ if ( generateMask ) {
32+ this . _generateMask = generateMask ;
33+ this . _maskBuffer = Buffer . alloc ( 4 ) ;
34+ }
35+
2836 this . _socket = socket ;
2937
3038 this . _firstFragment = true ;
@@ -42,8 +50,12 @@ class Sender {
4250 * @param {Object } options Options object
4351 * @param {Boolean } [options.fin=false] Specifies whether or not to set the
4452 * FIN bit
53+ * @param {Function } [options.generateMask] The function used to generate the
54+ * masking key
4555 * @param {Boolean } [options.mask=false] Specifies whether or not to mask
4656 * `data`
57+ * @param {Buffer } [options.maskBuffer] The buffer used to store the masking
58+ * key
4759 * @param {Number } options.opcode The opcode
4860 * @param {Boolean } [options.readOnly=false] Specifies whether `data` can be
4961 * modified
@@ -81,7 +93,13 @@ class Sender {
8193
8294 if ( ! options . mask ) return [ target , data ] ;
8395
84- randomFillSync ( mask , 0 , 4 ) ;
96+ const mask = options . maskBuffer ? options . maskBuffer : maskBuffer ;
97+
98+ if ( options . generateMask ) {
99+ options . generateMask ( mask ) ;
100+ } else {
101+ randomFillSync ( mask , 0 , 4 ) ;
102+ }
85103
86104 target [ 1 ] |= 0x80 ;
87105 target [ offset - 4 ] = mask [ 0 ] ;
@@ -156,6 +174,8 @@ class Sender {
156174 rsv1 : false ,
157175 opcode : 0x08 ,
158176 mask,
177+ maskBuffer : this . _maskBuffer ,
178+ generateMask : this . _generateMask ,
159179 readOnly : false
160180 } ) ,
161181 cb
@@ -200,6 +220,8 @@ class Sender {
200220 rsv1 : false ,
201221 opcode : 0x09 ,
202222 mask,
223+ maskBuffer : this . _maskBuffer ,
224+ generateMask : this . _generateMask ,
203225 readOnly
204226 } ) ,
205227 cb
@@ -244,6 +266,8 @@ class Sender {
244266 rsv1 : false ,
245267 opcode : 0x0a ,
246268 mask,
269+ maskBuffer : this . _maskBuffer ,
270+ generateMask : this . _generateMask ,
247271 readOnly
248272 } ) ,
249273 cb
@@ -299,6 +323,8 @@ class Sender {
299323 rsv1,
300324 opcode,
301325 mask : options . mask ,
326+ maskBuffer : this . _maskBuffer ,
327+ generateMask : this . _generateMask ,
302328 readOnly : toBuffer . readOnly
303329 } ;
304330
@@ -314,6 +340,8 @@ class Sender {
314340 rsv1 : false ,
315341 opcode,
316342 mask : options . mask ,
343+ maskBuffer : this . _maskBuffer ,
344+ generateMask : this . _generateMask ,
317345 readOnly : toBuffer . readOnly
318346 } ) ,
319347 cb
@@ -331,8 +359,12 @@ class Sender {
331359 * @param {Number } options.opcode The opcode
332360 * @param {Boolean } [options.fin=false] Specifies whether or not to set the
333361 * FIN bit
362+ * @param {Function } [options.generateMask] The function used to generate the
363+ * masking key
334364 * @param {Boolean } [options.mask=false] Specifies whether or not to mask
335365 * `data`
366+ * @param {Buffer } [options.maskBuffer] The buffer used to store the masking
367+ * key
336368 * @param {Boolean } [options.readOnly=false] Specifies whether `data` can be
337369 * modified
338370 * @param {Boolean } [options.rsv1=false] Specifies whether or not to set the
0 commit comments