diff --git a/lib/sender.js b/lib/sender.js index 4490a623b..25df14cde 100644 --- a/lib/sender.js +++ b/lib/sender.js @@ -4,7 +4,7 @@ const net = require('net'); const tls = require('tls'); -const { randomFillSync } = require('crypto'); +const { randomBytes } = require('crypto'); const PerMessageDeflate = require('./permessage-deflate'); const { EMPTY_BUFFER } = require('./constants'); @@ -13,6 +13,22 @@ const { mask: applyMask, toBuffer } = require('./buffer-util'); const mask = Buffer.alloc(4); +const RANDOM_POOL_SIZE = 8192; +const RANDOM_POOL_REFRESH = 1024; + +let randomPool = Buffer.alloc(0); +let randomPoolIdx = 0; +let randomPending = true; + +function onRandomBytes(err, buf) { + randomPending = false; + if (!err) { + randomPool = buf; + randomPoolIdx = 0; + } +} +randomBytes(RANDOM_POOL_SIZE, onRandomBytes); + /** * HyBi Sender implementation. */ @@ -81,13 +97,24 @@ class Sender { if (!options.mask) return [target, data]; - randomFillSync(mask, 0, 4); + if (randomPool.length - randomPoolIdx < 4) { + randomPool = randomBytes(32); + randomPoolIdx = 0; + } target[1] |= 0x80; - target[offset - 4] = mask[0]; - target[offset - 3] = mask[1]; - target[offset - 2] = mask[2]; - target[offset - 1] = mask[3]; + target[offset - 4] = mask[0] = randomPool[randomPoolIdx++]; + target[offset - 3] = mask[1] = randomPool[randomPoolIdx++]; + target[offset - 2] = mask[2] = randomPool[randomPoolIdx++]; + target[offset - 1] = mask[3] = randomPool[randomPoolIdx++]; + + if ( + !randomPending && + randomPool.length - randomPoolIdx < RANDOM_POOL_REFRESH + ) { + randomPending = true; + randomBytes(RANDOM_POOL_SIZE, onRandomBytes); + } if (merge) { applyMask(data, mask, target, offset, data.length);