Skip to content

Commit f86b95f

Browse files
fix(eio): clean up resources upon WebTransport handshake failure
1 parent 4276e59 commit f86b95f

1 file changed

Lines changed: 22 additions & 7 deletions

File tree

packages/engine.io/lib/server.ts

Lines changed: 22 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -548,6 +548,7 @@ export abstract class BaseServer extends EventEmitter {
548548
const result = await streamReader.read();
549549

550550
if (result.done) {
551+
clearTimeout(timeout);
551552
debug("session is closed");
552553
return;
553554
}
@@ -559,18 +560,32 @@ export abstract class BaseServer extends EventEmitter {
559560
);
560561
const reader = stream.readable.pipeThrough(transformStream).getReader();
561562

563+
const closeSession = async () => {
564+
try {
565+
await reader.cancel();
566+
} catch (e) {
567+
debug(
568+
"error while canceling WebTransport stream reader: %s",
569+
e.message,
570+
);
571+
}
572+
reader.releaseLock();
573+
session.close();
574+
};
575+
562576
// reading the first packet of the stream
563577
const { value, done } = await reader.read();
578+
clearTimeout(timeout);
579+
564580
if (done) {
565581
debug("stream is closed");
582+
reader.releaseLock();
566583
return;
567584
}
568585

569-
clearTimeout(timeout);
570-
571586
if (value.type !== "open") {
572587
debug("invalid WebTransport handshake");
573-
return session.close();
588+
return closeSession();
574589
}
575590

576591
if (value.data === undefined) {
@@ -598,20 +613,20 @@ export abstract class BaseServer extends EventEmitter {
598613

599614
if (!sid || !hasOwn(this.clients, sid)) {
600615
debug("invalid WebTransport handshake");
601-
return session.close();
616+
return closeSession();
602617
}
603618

604619
const client = this.clients[sid];
605620

606621
if (!client) {
607622
debug("upgrade attempt for closed client");
608-
session.close();
623+
return closeSession();
609624
} else if (client.upgrading) {
610625
debug("transport has already been trying to upgrade");
611-
session.close();
626+
return closeSession();
612627
} else if (client.upgraded) {
613628
debug("transport had already been upgraded");
614-
session.close();
629+
return closeSession();
615630
} else {
616631
debug("upgrading existing transport");
617632

0 commit comments

Comments
 (0)