From 4dcc9c50f83cd234cb2c2ede47fb505ffb75eef2 Mon Sep 17 00:00:00 2001 From: DD Date: Thu, 11 May 2023 20:42:10 +0300 Subject: [PATCH] fix(WebSocketShard): handle initial connect being a resume (#9549) * fix(WebSocketShard): handle initial connect being a resume * chore: remove leftover --------- Co-authored-by: kodiakhq[bot] <49736102+kodiakhq[bot]@users.noreply.github.com> --- packages/ws/src/ws/WebSocketShard.ts | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/packages/ws/src/ws/WebSocketShard.ts b/packages/ws/src/ws/WebSocketShard.ts index b0c67a02f..5671a69b2 100644 --- a/packages/ws/src/ws/WebSocketShard.ts +++ b/packages/ws/src/ws/WebSocketShard.ts @@ -128,10 +128,26 @@ export class WebSocketShard extends AsyncEventEmitter { } public async connect() { - const promise = this.initialConnectResolved ? Promise.resolve() : once(this, WebSocketShardEvents.Ready); + const controller = new AbortController(); + let promise; + + if (!this.initialConnectResolved) { + // Sleep for the remaining time, but if the connection closes in the meantime, we shouldn't wait the remainder to avoid blocking the new conn + promise = Promise.race([ + once(this, WebSocketShardEvents.Ready, { signal: controller.signal }), + once(this, WebSocketShardEvents.Resumed, { signal: controller.signal }), + ]); + } + void this.internalConnect(); - await promise; + try { + await promise; + } finally { + // cleanup hanging listeners + controller.abort(); + } + this.initialConnectResolved = true; }