Skip to content

Commit d5a1a46

Browse files
committed
websocket: improve performance of generate mask
1 parent 5d54543 commit d5a1a46

File tree

2 files changed

+34
-9
lines changed

2 files changed

+34
-9
lines changed
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
import { randomFillSync, randomBytes } from 'node:crypto'
2+
import { bench, group, run } from 'mitata'
3+
4+
const BUFFER_SIZE = 16384
5+
6+
const buf = randomFillSync(Buffer.allocUnsafe(BUFFER_SIZE), 0, BUFFER_SIZE)
7+
let bufIdx = 0
8+
9+
function generateMask () {
10+
if (bufIdx + 4 > BUFFER_SIZE) {
11+
bufIdx = 0
12+
randomFillSync(buf, 0, BUFFER_SIZE)
13+
}
14+
return [buf[bufIdx++], buf[bufIdx++], buf[bufIdx++], buf[bufIdx++]]
15+
}
16+
17+
group('generate', () => {
18+
bench('generateMask', () => generateMask())
19+
bench('crypto.randomBytes(4)', () => randomBytes(4))
20+
})
21+
22+
await run()

lib/web/websocket/websocket.js

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
const { webidl } = require('../fetch/webidl')
44
const { URLSerializer } = require('../fetch/data-url')
5-
const { getGlobalOrigin } = require('../fetch/global')
5+
const { environmentSettingsObject } = require('../fetch/util')
66
const { staticPropertyDescriptors, states, sentCloseFrameState, opcodes, emptyBuffer } = require('./constants')
77
const {
88
kWebSocketURL,
@@ -29,6 +29,8 @@ const { kEnumerableProperty, isBlobLike } = require('../../core/util')
2929
const { getGlobalDispatcher } = require('../../global')
3030
const { types } = require('node:util')
3131

32+
const FastBuffer = Buffer[Symbol.species]
33+
3234
let experimentalWarned = false
3335

3436
// https://websockets.spec.whatwg.org/#interface-definition
@@ -67,7 +69,7 @@ class WebSocket extends EventTarget {
6769
protocols = options.protocols
6870

6971
// 1. Let baseURL be this's relevant settings object's API base URL.
70-
const baseURL = getGlobalOrigin()
72+
const baseURL = environmentSettingsObject.settingsObject.baseUrl
7173

7274
// 1. Let urlRecord be the result of applying the URL parser to url with baseURL.
7375
let urlRecord
@@ -323,7 +325,7 @@ class WebSocket extends EventTarget {
323325
// increase the bufferedAmount attribute by the length of the
324326
// ArrayBuffer in bytes.
325327

326-
const value = Buffer.from(data)
328+
const value = new FastBuffer(data)
327329
const frame = new WebsocketFrameSend(value)
328330
const buffer = frame.createFrame(opcodes.BINARY)
329331

@@ -344,7 +346,7 @@ class WebSocket extends EventTarget {
344346
// not throw an exception must increase the bufferedAmount attribute
345347
// by the length of data’s buffer in bytes.
346348

347-
const ab = Buffer.from(data, data.byteOffset, data.byteLength)
349+
const ab = new FastBuffer(data, data.byteOffset, data.byteLength)
348350

349351
const frame = new WebsocketFrameSend(ab)
350352
const buffer = frame.createFrame(opcodes.BINARY)
@@ -368,7 +370,7 @@ class WebSocket extends EventTarget {
368370
const frame = new WebsocketFrameSend()
369371

370372
data.arrayBuffer().then((ab) => {
371-
const value = Buffer.from(ab)
373+
const value = new FastBuffer(ab)
372374
frame.frameData = value
373375
const buffer = frame.createFrame(opcodes.BINARY)
374376

@@ -505,9 +507,7 @@ class WebSocket extends EventTarget {
505507
set binaryType (type) {
506508
webidl.brandCheck(this, WebSocket)
507509

508-
if (type !== 'blob' && type !== 'arraybuffer') {
509-
this[kBinaryType] = 'blob'
510-
} else {
510+
if (type === 'blob' || type === 'arraybuffer') {
511511
this[kBinaryType] = type
512512
}
513513
}
@@ -644,7 +644,10 @@ webidl.converters.WebSocketSendData = function (V) {
644644
}
645645
}
646646

647-
return webidl.converters.USVString(V)
647+
// This is done with `Buffer.from`.
648+
// "To convert a string into a scalar value string, replace any surrogates
649+
// with U+FFFD."
650+
return webidl.converters.DOMString(V)
648651
}
649652

650653
module.exports = {

0 commit comments

Comments
 (0)