feat: favor WebTransport over WebSocket

This commit ensures that when there are multiple possible upgrades
(like WebSocket and WebTransport), then the WebTransport is favored and
the other upgrades are delayed.

Following 7195c0f305
This commit is contained in:
Damien Arrachequesne
2023-06-16 08:19:55 +02:00
parent 13d08bc0ac
commit 9d37b16e6a
2 changed files with 38 additions and 2 deletions

View File

@@ -257,7 +257,7 @@ export class Socket extends Emitter<
public writeBuffer: Packet[] = [];
private prevBufferLen: number;
private upgrades;
private upgrades: string[];
private pingInterval: number;
private pingTimeout: number;
private pingTimeoutTimer: NodeJS.Timer;
@@ -601,7 +601,19 @@ export class Socket extends Emitter<
this.once("close", onclose);
this.once("upgrading", onupgrade);
transport.open();
if (
this.upgrades.indexOf("webtransport") !== -1 &&
name !== "webtransport"
) {
// favor WebTransport
this.setTimeoutFn(() => {
if (!failed) {
transport.open();
}
}, 200);
} else {
transport.open();
}
}
/**

View File

@@ -115,6 +115,30 @@ describe("WebTransport", () => {
);
});
it("should favor WebTransport over WebSocket", (done) => {
setup(
{
transports: ["polling", "websocket", "webtransport"],
},
({ engine, h3Server, certificate }) => {
const httpServer = createServer();
engine.attach(httpServer);
httpServer.listen(h3Server.port);
const socket = createSocket(h3Server.port, certificate, {
transports: ["polling", "websocket", "webtransport"],
});
socket.on("upgrade", (transport) => {
expect(transport.name).to.eql("webtransport");
httpServer.close();
success(engine, h3Server, done);
});
}
);
});
it("should send ping/pong packets", (done) => {
setup(
{