2
2
3
3
const { maxUnsigned16Bit } = require ( './constants' )
4
4
5
+ const BUFFER_SIZE = 16386
6
+
5
7
/** @type {import('crypto') } */
6
8
let crypto
9
+ let buffer = null
10
+ let bufIdx = BUFFER_SIZE
11
+
7
12
try {
8
13
crypto = require ( 'node:crypto' )
9
14
/* c8 ignore next 3 */
10
15
} catch {
16
+ crypto = {
17
+ // not full compatibility, but minimum.
18
+ randomFillSync : function randomFillSync ( buffer , _offset , _size ) {
19
+ for ( let i = 0 ; i < buffer . length ; ++ i ) {
20
+ buffer [ i ] = Math . random ( ) * 255 | 0
21
+ }
22
+ return buffer
23
+ }
24
+ }
25
+ }
11
26
27
+ function generateMask ( ) {
28
+ if ( bufIdx === BUFFER_SIZE ) {
29
+ bufIdx = 0
30
+ crypto . randomFillSync ( ( buffer ??= Buffer . allocUnsafe ( BUFFER_SIZE ) ) , 0 , BUFFER_SIZE )
31
+ }
32
+ return [ buffer [ bufIdx ++ ] , buffer [ bufIdx ++ ] , buffer [ bufIdx ++ ] , buffer [ bufIdx ++ ] ]
12
33
}
13
34
14
35
class WebsocketFrameSend {
@@ -17,11 +38,12 @@ class WebsocketFrameSend {
17
38
*/
18
39
constructor ( data ) {
19
40
this . frameData = data
20
- this . maskKey = crypto . randomBytes ( 4 )
21
41
}
22
42
23
43
createFrame ( opcode ) {
24
- const bodyLength = this . frameData ?. byteLength ?? 0
44
+ const frameData = this . frameData
45
+ const maskKey = generateMask ( )
46
+ const bodyLength = frameData ?. byteLength ?? 0
25
47
26
48
/** @type {number } */
27
49
let payloadLength = bodyLength // 0-125
@@ -43,10 +65,10 @@ class WebsocketFrameSend {
43
65
buffer [ 0 ] = ( buffer [ 0 ] & 0xF0 ) + opcode // opcode
44
66
45
67
/*! ws. MIT License. Einar Otto Stangvik <[email protected] > */
46
- buffer [ offset - 4 ] = this . maskKey [ 0 ]
47
- buffer [ offset - 3 ] = this . maskKey [ 1 ]
48
- buffer [ offset - 2 ] = this . maskKey [ 2 ]
49
- buffer [ offset - 1 ] = this . maskKey [ 3 ]
68
+ buffer [ offset - 4 ] = maskKey [ 0 ]
69
+ buffer [ offset - 3 ] = maskKey [ 1 ]
70
+ buffer [ offset - 2 ] = maskKey [ 2 ]
71
+ buffer [ offset - 1 ] = maskKey [ 3 ]
50
72
51
73
buffer [ 1 ] = payloadLength
52
74
@@ -61,8 +83,8 @@ class WebsocketFrameSend {
61
83
buffer [ 1 ] |= 0x80 // MASK
62
84
63
85
// mask body
64
- for ( let i = 0 ; i < bodyLength ; i ++ ) {
65
- buffer [ offset + i ] = this . frameData [ i ] ^ this . maskKey [ i % 4 ]
86
+ for ( let i = 0 ; i < bodyLength ; ++ i ) {
87
+ buffer [ offset + i ] = frameData [ i ] ^ maskKey [ i & 3 ]
66
88
}
67
89
68
90
return buffer
0 commit comments