@@ -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 _mask = Buffer . alloc ( 4 ) ;
1515
1616/**
1717 * HyBi Sender implementation.
@@ -22,9 +22,12 @@ 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+ this . _generateMask = generateMask ;
2831 this . _socket = socket ;
2932
3033 this . _firstFragment = true ;
@@ -42,6 +45,8 @@ class Sender {
4245 * @param {Object } options Options object
4346 * @param {Boolean } [options.fin=false] Specifies whether or not to set the
4447 * FIN bit
48+ * @param {Function } [options.generateMask] The function used to generate the
49+ * masking key
4550 * @param {Boolean } [options.mask=false] Specifies whether or not to mask
4651 * `data`
4752 * @param {Number } options.opcode The opcode
@@ -81,7 +86,13 @@ class Sender {
8186
8287 if ( ! options . mask ) return [ target , data ] ;
8388
84- randomFillSync ( mask , 0 , 4 ) ;
89+ let mask = _mask ;
90+
91+ if ( options . generateMask ) {
92+ mask = options . generateMask ( ) ;
93+ } else {
94+ randomFillSync ( _mask , 0 , 4 ) ;
95+ }
8596
8697 target [ 1 ] |= 0x80 ;
8798 target [ offset - 4 ] = mask [ 0 ] ;
@@ -156,6 +167,7 @@ class Sender {
156167 rsv1 : false ,
157168 opcode : 0x08 ,
158169 mask,
170+ generateMask : this . _generateMask ,
159171 readOnly : false
160172 } ) ,
161173 cb
@@ -200,6 +212,7 @@ class Sender {
200212 rsv1 : false ,
201213 opcode : 0x09 ,
202214 mask,
215+ generateMask : this . generateMask ,
203216 readOnly
204217 } ) ,
205218 cb
@@ -244,6 +257,7 @@ class Sender {
244257 rsv1 : false ,
245258 opcode : 0x0a ,
246259 mask,
260+ generateMask : this . _generateMask ,
247261 readOnly
248262 } ) ,
249263 cb
@@ -299,6 +313,7 @@ class Sender {
299313 rsv1,
300314 opcode,
301315 mask : options . mask ,
316+ generateMask : this . _generateMask ,
302317 readOnly : toBuffer . readOnly
303318 } ;
304319
@@ -314,6 +329,7 @@ class Sender {
314329 rsv1 : false ,
315330 opcode,
316331 mask : options . mask ,
332+ generateMask : this . _generateMask ,
317333 readOnly : toBuffer . readOnly
318334 } ) ,
319335 cb
@@ -331,6 +347,8 @@ class Sender {
331347 * @param {Number } options.opcode The opcode
332348 * @param {Boolean } [options.fin=false] Specifies whether or not to set the
333349 * FIN bit
350+ * @param {Function } [options.generateMask] The function used to generate the
351+ * masking key
334352 * @param {Boolean } [options.mask=false] Specifies whether or not to mask
335353 * `data`
336354 * @param {Boolean } [options.readOnly=false] Specifies whether `data` can be
0 commit comments