Skip to content

Commit 9d37b16

Browse files
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 7195c0f
1 parent 13d08bc commit 9d37b16

File tree

2 files changed

+38
-2
lines changed

2 files changed

+38
-2
lines changed

lib/socket.ts

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -257,7 +257,7 @@ export class Socket extends Emitter<
257257
public writeBuffer: Packet[] = [];
258258

259259
private prevBufferLen: number;
260-
private upgrades;
260+
private upgrades: string[];
261261
private pingInterval: number;
262262
private pingTimeout: number;
263263
private pingTimeoutTimer: NodeJS.Timer;
@@ -601,7 +601,19 @@ export class Socket extends Emitter<
601601
this.once("close", onclose);
602602
this.once("upgrading", onupgrade);
603603

604-
transport.open();
604+
if (
605+
this.upgrades.indexOf("webtransport") !== -1 &&
606+
name !== "webtransport"
607+
) {
608+
// favor WebTransport
609+
this.setTimeoutFn(() => {
610+
if (!failed) {
611+
transport.open();
612+
}
613+
}, 200);
614+
} else {
615+
transport.open();
616+
}
605617
}
606618

607619
/**

test/webtransport.mjs

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,30 @@ describe("WebTransport", () => {
115115
);
116116
});
117117

118+
it("should favor WebTransport over WebSocket", (done) => {
119+
setup(
120+
{
121+
transports: ["polling", "websocket", "webtransport"],
122+
},
123+
({ engine, h3Server, certificate }) => {
124+
const httpServer = createServer();
125+
engine.attach(httpServer);
126+
httpServer.listen(h3Server.port);
127+
128+
const socket = createSocket(h3Server.port, certificate, {
129+
transports: ["polling", "websocket", "webtransport"],
130+
});
131+
132+
socket.on("upgrade", (transport) => {
133+
expect(transport.name).to.eql("webtransport");
134+
135+
httpServer.close();
136+
success(engine, h3Server, done);
137+
});
138+
}
139+
);
140+
});
141+
118142
it("should send ping/pong packets", (done) => {
119143
setup(
120144
{

0 commit comments

Comments
 (0)