|
1 | 1 | import { Buffer } from 'node:buffer'; |
2 | 2 | import { once } from 'node:events'; |
| 3 | +import type { IncomingMessage } from 'node:http'; |
3 | 4 | import { clearInterval, clearTimeout, setInterval, setTimeout } from 'node:timers'; |
4 | 5 | import { setTimeout as sleep } from 'node:timers/promises'; |
5 | 6 | import { URLSearchParams } from 'node:url'; |
@@ -252,21 +253,25 @@ export class WebSocketShard extends AsyncEventEmitter<WebSocketShardEventsMap> { |
252 | 253 |
|
253 | 254 | connection.binaryType = 'arraybuffer'; |
254 | 255 |
|
255 | | - connection.onmessage = (event) => { |
256 | | - void this.onMessage(event.data, event.data instanceof ArrayBuffer); |
257 | | - }; |
| 256 | + connection.on('message', (event) => { |
| 257 | + void this.onMessage(event, event instanceof ArrayBuffer); |
| 258 | + }); |
258 | 259 |
|
259 | | - connection.onerror = (event) => { |
260 | | - this.onError(event.error); |
261 | | - }; |
| 260 | + connection.on('error', (event) => { |
| 261 | + this.onError(event); |
| 262 | + }); |
262 | 263 |
|
263 | | - connection.onclose = (event) => { |
264 | | - void this.onClose(event.code); |
265 | | - }; |
| 264 | + connection.on('close', (code) => { |
| 265 | + void this.onClose(code); |
| 266 | + }); |
266 | 267 |
|
267 | | - connection.onopen = () => { |
| 268 | + connection.on('open', () => { |
268 | 269 | this.sendRateLimitState = getInitialSendRateLimitState(); |
269 | | - }; |
| 270 | + }); |
| 271 | + |
| 272 | + connection.on('unexpected-response', (_, response) => { |
| 273 | + this.onUnexpectedResponse(response); |
| 274 | + }); |
270 | 275 |
|
271 | 276 | this.connection = connection; |
272 | 277 |
|
@@ -800,6 +805,19 @@ export class WebSocketShard extends AsyncEventEmitter<WebSocketShardEventsMap> { |
800 | 805 | this.emit(WebSocketShardEvents.Error, error); |
801 | 806 | } |
802 | 807 |
|
| 808 | + private onUnexpectedResponse(response: IncomingMessage) { |
| 809 | + if (response.statusCode && response.statusCode >= 500) { |
| 810 | + this.debug(['Received a 5xx response from the server, retrying']); |
| 811 | + this.failedToConnectDueToNetworkError = true; |
| 812 | + return; |
| 813 | + } |
| 814 | + |
| 815 | + this.emit( |
| 816 | + WebSocketShardEvents.Error, |
| 817 | + new Error(`Unexpected response from the server: ${response.statusCode ?? 'unknown'}`), |
| 818 | + ); |
| 819 | + } |
| 820 | + |
803 | 821 | private async onClose(code: number) { |
804 | 822 | this.emit(WebSocketShardEvents.Closed, code); |
805 | 823 |
|
|
0 commit comments