@@ -11,7 +11,7 @@ const { EMPTY_BUFFER } = require('./constants');
11
11
const { isValidStatusCode } = require ( './validation' ) ;
12
12
const { mask : applyMask , toBuffer } = require ( './buffer-util' ) ;
13
13
14
- const mask = Buffer . alloc ( 4 ) ;
14
+ const maskBuffer = Buffer . alloc ( 4 ) ;
15
15
16
16
/**
17
17
* HyBi Sender implementation.
@@ -22,9 +22,17 @@ class Sender {
22
22
*
23
23
* @param {(net.Socket|tls.Socket) } socket The connection socket
24
24
* @param {Object } [extensions] An object containing the negotiated extensions
25
+ * @param {Function } [generateMask] The function used to generate the masking
26
+ * key
25
27
*/
26
- constructor ( socket , extensions ) {
28
+ constructor ( socket , extensions , generateMask ) {
27
29
this . _extensions = extensions || { } ;
30
+
31
+ if ( generateMask ) {
32
+ this . _generateMask = generateMask ;
33
+ this . _maskBuffer = Buffer . alloc ( 4 ) ;
34
+ }
35
+
28
36
this . _socket = socket ;
29
37
30
38
this . _firstFragment = true ;
@@ -42,8 +50,12 @@ class Sender {
42
50
* @param {Object } options Options object
43
51
* @param {Boolean } [options.fin=false] Specifies whether or not to set the
44
52
* FIN bit
53
+ * @param {Function } [options.generateMask] The function used to generate the
54
+ * masking key
45
55
* @param {Boolean } [options.mask=false] Specifies whether or not to mask
46
56
* `data`
57
+ * @param {Buffer } [options.maskBuffer] The buffer used to store the masking
58
+ * key
47
59
* @param {Number } options.opcode The opcode
48
60
* @param {Boolean } [options.readOnly=false] Specifies whether `data` can be
49
61
* modified
@@ -81,7 +93,13 @@ class Sender {
81
93
82
94
if ( ! options . mask ) return [ target , data ] ;
83
95
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
+ }
85
103
86
104
target [ 1 ] |= 0x80 ;
87
105
target [ offset - 4 ] = mask [ 0 ] ;
@@ -156,6 +174,8 @@ class Sender {
156
174
rsv1 : false ,
157
175
opcode : 0x08 ,
158
176
mask,
177
+ maskBuffer : this . _maskBuffer ,
178
+ generateMask : this . _generateMask ,
159
179
readOnly : false
160
180
} ) ,
161
181
cb
@@ -200,6 +220,8 @@ class Sender {
200
220
rsv1 : false ,
201
221
opcode : 0x09 ,
202
222
mask,
223
+ maskBuffer : this . _maskBuffer ,
224
+ generateMask : this . _generateMask ,
203
225
readOnly
204
226
} ) ,
205
227
cb
@@ -244,6 +266,8 @@ class Sender {
244
266
rsv1 : false ,
245
267
opcode : 0x0a ,
246
268
mask,
269
+ maskBuffer : this . _maskBuffer ,
270
+ generateMask : this . _generateMask ,
247
271
readOnly
248
272
} ) ,
249
273
cb
@@ -299,6 +323,8 @@ class Sender {
299
323
rsv1,
300
324
opcode,
301
325
mask : options . mask ,
326
+ maskBuffer : this . _maskBuffer ,
327
+ generateMask : this . _generateMask ,
302
328
readOnly : toBuffer . readOnly
303
329
} ;
304
330
@@ -314,6 +340,8 @@ class Sender {
314
340
rsv1 : false ,
315
341
opcode,
316
342
mask : options . mask ,
343
+ maskBuffer : this . _maskBuffer ,
344
+ generateMask : this . _generateMask ,
317
345
readOnly : toBuffer . readOnly
318
346
} ) ,
319
347
cb
@@ -331,8 +359,12 @@ class Sender {
331
359
* @param {Number } options.opcode The opcode
332
360
* @param {Boolean } [options.fin=false] Specifies whether or not to set the
333
361
* FIN bit
362
+ * @param {Function } [options.generateMask] The function used to generate the
363
+ * masking key
334
364
* @param {Boolean } [options.mask=false] Specifies whether or not to mask
335
365
* `data`
366
+ * @param {Buffer } [options.maskBuffer] The buffer used to store the masking
367
+ * key
336
368
* @param {Boolean } [options.readOnly=false] Specifies whether `data` can be
337
369
* modified
338
370
* @param {Boolean } [options.rsv1=false] Specifies whether or not to set the
0 commit comments