Skip to content

Commit af2cb8f

Browse files
KhafraDevmcollina
andcommitted
wqremove maxDecompressedMessageSize (#4891)
* remove maxDecompressedMessageSize * remove maxDecompressedMessageSize * remove maxDecompressedMessageSize * test: remove unused websocket test helpers --------- Co-authored-by: Matteo Collina <hello@matteocollina.com>
1 parent 8873c94 commit af2cb8f

File tree

6 files changed

+7
-315
lines changed

6 files changed

+7
-315
lines changed

docs/docs/api/WebSocket.md

Lines changed: 0 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@ When passing an object as the second argument, the following options are availab
2020
* **protocols** `string | string[]` (optional) - Subprotocol(s) to request the server use.
2121
* **dispatcher** `Dispatcher` (optional) - A custom [`Dispatcher`](/docs/docs/api/Dispatcher.md) to use for the connection.
2222
* **headers** `HeadersInit` (optional) - Custom headers to include in the WebSocket handshake request.
23-
* **maxDecompressedMessageSize** `number` (optional) - Maximum allowed size in bytes for decompressed messages when using the `permessage-deflate` extension. **Default:** `4194304` (4 MB).
2423

2524
### Example:
2625

@@ -45,20 +44,6 @@ import { WebSocket } from 'undici'
4544
const ws = new WebSocket('wss://echo.websocket.events', ['echo', 'chat'])
4645
```
4746

48-
### Example with custom decompression limit:
49-
50-
To protect against decompression bombs (small compressed payloads that expand to very large sizes), you can set a custom limit:
51-
52-
```mjs
53-
import { WebSocket } from 'undici'
54-
55-
const ws = new WebSocket('wss://echo.websocket.events', {
56-
maxDecompressedMessageSize: 1 * 1024 * 1024
57-
})
58-
```
59-
60-
> ⚠️ **Security Note**: The `maxDecompressedMessageSize` option protects against memory exhaustion attacks where a malicious server sends a small compressed payload that decompresses to an extremely large size. If you increase this limit significantly above the default, ensure your application can handle the increased memory usage.
61-
6247
## Read More
6348

6449
- [MDN - WebSocket](https://developer.mozilla.org/en-US/docs/Web/API/WebSocket)

lib/web/websocket/permessage-deflate.js

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,6 @@ class PerMessageDeflate {
1717

1818
#options = {}
1919

20-
/** @type {number} */
21-
#maxDecompressedSize
22-
2320
/** @type {boolean} */
2421
#aborted = false
2522

@@ -28,12 +25,10 @@ class PerMessageDeflate {
2825

2926
/**
3027
* @param {Map<string, string>} extensions
31-
* @param {{ maxDecompressedMessageSize?: number }} [options]
3228
*/
33-
constructor (extensions, options = {}) {
29+
constructor (extensions) {
3430
this.#options.serverNoContextTakeover = extensions.has('server_no_context_takeover')
3531
this.#options.serverMaxWindowBits = extensions.get('server_max_window_bits')
36-
this.#maxDecompressedSize = options.maxDecompressedMessageSize ?? kDefaultMaxDecompressedSize
3732
}
3833

3934
decompress (chunk, fin, callback) {
@@ -75,7 +70,7 @@ class PerMessageDeflate {
7570

7671
this.#inflate[kLength] += data.length
7772

78-
if (this.#inflate[kLength] > this.#maxDecompressedSize) {
73+
if (this.#inflate[kLength] > kDefaultMaxDecompressedSize) {
7974
this.#aborted = true
8075
this.#inflate.removeAllListeners()
8176
this.#inflate.destroy()

lib/web/websocket/receiver.js

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -37,23 +37,18 @@ class ByteParser extends Writable {
3737
/** @type {Map<string, PerMessageDeflate>} */
3838
#extensions
3939

40-
/** @type {{ maxDecompressedMessageSize?: number }} */
41-
#options
42-
4340
/**
4441
* @param {import('./websocket').WebSocket} ws
4542
* @param {Map<string, string>|null} extensions
46-
* @param {{ maxDecompressedMessageSize?: number }} [options]
4743
*/
48-
constructor (ws, extensions, options = {}) {
44+
constructor (ws, extensions) {
4945
super()
5046

5147
this.ws = ws
5248
this.#extensions = extensions == null ? new Map() : extensions
53-
this.#options = options
5449

5550
if (this.#extensions.has('permessage-deflate')) {
56-
this.#extensions.set('permessage-deflate', new PerMessageDeflate(extensions, options))
51+
this.#extensions.set('permessage-deflate', new PerMessageDeflate(extensions))
5752
}
5853
}
5954

lib/web/websocket/websocket.js

Lines changed: 1 addition & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -44,9 +44,6 @@ class WebSocket extends EventTarget {
4444
/** @type {SendQueue} */
4545
#sendQueue
4646

47-
/** @type {{ maxDecompressedMessageSize?: number }} */
48-
#options
49-
5047
/**
5148
* @param {string} url
5249
* @param {string|string[]} protocols
@@ -120,11 +117,6 @@ class WebSocket extends EventTarget {
120117
// 10. Set this's url to urlRecord.
121118
this[kWebSocketURL] = new URL(urlRecord.href)
122119

123-
// Store options for later use (e.g., maxDecompressedMessageSize)
124-
this.#options = {
125-
maxDecompressedMessageSize: options.maxDecompressedMessageSize
126-
}
127-
128120
// 11. Let client be this's relevant settings object.
129121
const client = environmentSettingsObject.settingsObject
130122

@@ -443,7 +435,7 @@ class WebSocket extends EventTarget {
443435
// once this happens, the connection is open
444436
this[kResponse] = response
445437

446-
const parser = new ByteParser(this, parsedExtensions, this.#options)
438+
const parser = new ByteParser(this, parsedExtensions)
447439
parser.on('drain', onParserDrain)
448440
parser.on('error', onParserError.bind(this))
449441

@@ -546,19 +538,6 @@ webidl.converters.WebSocketInit = webidl.dictionaryConverter([
546538
{
547539
key: 'headers',
548540
converter: webidl.nullableConverter(webidl.converters.HeadersInit)
549-
},
550-
{
551-
key: 'maxDecompressedMessageSize',
552-
converter: webidl.nullableConverter((V) => {
553-
V = webidl.converters['unsigned long long'](V)
554-
if (V <= 0) {
555-
throw webidl.errors.exception({
556-
header: 'WebSocket constructor',
557-
message: 'maxDecompressedMessageSize must be greater than 0'
558-
})
559-
}
560-
return V
561-
})
562541
}
563542
])
564543

0 commit comments

Comments
 (0)