socketio / socket.io

Realtime application framework (Node.JS server)
https://socket.io
MIT License
61.05k stars 10.11k forks source link

Disabling reconnection while reconnecting isn't working #5126

Open uncaught opened 7 months ago

uncaught commented 7 months ago

Describe the bug

I'm trying to disable reconnection while my site is in maintenance mode. But socket.io keeps trying to reconnect.

Basically I'm doing this (those are redux selectors, not important for the issue):

onSelectorChange(isInMaintenanceSelector, (inMaintenance) => {
  socket.io.reconnection(!inMaintenance);
  if (!inMaintenance) {
    socket.connect();
  }
});

But calling socket.io.reconnection(boolean) doesn't seem to have any effect.

To Reproduce

Socket.IO client version: 4.7.4

Client

import { io } from "socket.io-client";

window.socket = io("ws://localhost:3000/", {});

//Now stop your server and then after you see the reconnection attempts, try to disable the reconnections with:

window.socket.io.reconnection(false);

Expected behavior

socket.io.reconnection(false); should stop the reconnection loop until I activate it again, as described in the docs.

Platform:

Additional context

I've noticed earlier that socket.io.reconnectionDelay(number) also seems to have no effect on an ongoing reconnection, however this is harder to tell due to the random factor.

And yes, I could call disconnect explicitly, but the maintenance mode doesn't necessarily mean that the websocket server is gone. I just want to prevent reconnections if it is gone, too.

darrachequesne commented 7 months ago

I could indeed reproduce the issue, thanks.

As a workaround, updating the skipReconnect attribute of the manager should work:

window.socket.io.skipReconnect = true;

And shouldn't interfere with subsequent reconnections.