socketio / engine.io-client

The engine used in the Socket.IO JavaScript client, which manages the low-level transports such as HTTP long-polling, WebSocket and WebTransport.

Home Page:https://socket.io

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

[Browser] Doesn't switch to polling when WebSocket is undefined.

hassansin opened this issue · comments

I have set my transports to use WebSocket first and then fallback to polling e.g. transports: ["websocket", "polling"].

To test if the fallback transport really works, I used TamperMonkey browser extension to disable Websocket by setting WebSocket = void 0.

Instead of switching to polling, I keep getting connect_error with the message timeout from websocket transport.

Tried to investigate and it looks like transport switching only works if createTransport method throws here:

try {
transport = this.createTransport(transport);
} catch (e) {
debug("error while creating transport: %s", e);
this.transports.shift();
this.open();
return;
}

But the method always returns a transport wrapper class, even when WebSocket is not defined.

To Reproduce

Engine.IO server version: 6.5.2

Server

const engine = require("engine.io");
const server = engine.listen(3000, {
  transports: ["polling", "websocket"]
});

server.on("connection", (socket) => {
  console.log("connection");

  socket.on("message", (data) => {
    console.log("data", data);
  });

  socket.on("close", () => {
    console.log("close");
  });
});

Engine.IO client version: 6.5.2

Client

const socket = require("engine.io-client")("ws://localhost:3000", {
transports: ["websocket", "polling"]
});

socket.on("open", () => {
  console.log("open");

  socket.on("message", (data) => {
    console.log("data", data);
  });

  socket.on("close", () => {
    console.log("close");
  });
});

Expected behavior

Should be able to fallback to polling transport when WebSocket transport is disabled on the browser.

Platform:

  • Device: Chrome 119.0.6045
  • OS: Windows

Additional context
Add any other context about the problem here.