MCPcopy
hub / github.com/nodejs/undici / createFrame

Method createFrame

lib/web/websocket/frame.js:31–79  ·  view source on GitHub ↗
(opcode)

Source from the content-addressed store, hash-verified

29 }
30
31 createFrame (opcode) {
32 const frameData = this.frameData
33 const maskKey = generateMask()
34 const bodyLength = frameData?.byteLength ?? 0
35
36 /** @type {number} */
37 let payloadLength = bodyLength // 0-125
38 let offset = 6
39
40 if (bodyLength > maxUnsigned16Bit) {
41 offset += 8 // payload length is next 8 bytes
42 payloadLength = 127
43 } else if (bodyLength > 125) {
44 offset += 2 // payload length is next 2 bytes
45 payloadLength = 126
46 }
47
48 const buffer = Buffer.allocUnsafe(bodyLength + offset)
49
50 // Clear first 2 bytes, everything else is overwritten
51 buffer[0] = buffer[1] = 0
52 buffer[0] |= 0x80 // FIN
53 buffer[0] = (buffer[0] & 0xF0) + opcode // opcode
54
55 /*! ws. MIT License. Einar Otto Stangvik <einaros@gmail.com> */
56 buffer[offset - 4] = maskKey[0]
57 buffer[offset - 3] = maskKey[1]
58 buffer[offset - 2] = maskKey[2]
59 buffer[offset - 1] = maskKey[3]
60
61 buffer[1] = payloadLength
62
63 if (payloadLength === 126) {
64 buffer.writeUInt16BE(bodyLength, 2)
65 } else if (payloadLength === 127) {
66 // Clear extended payload length
67 buffer[2] = buffer[3] = 0
68 buffer.writeUIntBE(bodyLength, 4, 6)
69 }
70
71 buffer[1] |= 0x80 // MASK
72
73 // mask body
74 for (let i = 0; i < bodyLength; ++i) {
75 buffer[offset + i] = frameData[i] ^ maskKey[i & 3]
76 }
77
78 return buffer
79 }
80
81 /**
82 * @param {Uint8Array} buffer

Callers 7

parseControlFrameMethod · 0.95
closeWebSocketConnectionFunction · 0.95
pingMethod · 0.95
#writeMethod · 0.95
createFrameFunction · 0.80
frame.jsFile · 0.80

Calls 1

generateMaskFunction · 0.85

Tested by

no test coverage detected