Skip to content

Don't treat code 1000 as special - #6880

Merged
SteffenDE merged 4 commits into
mainfrom
sd-code-1000
Oct 20, 2026
Merged

SteffenDE merged 4 commits into
mainfrom
sd-code-1000

Conversation

@SteffenDE

Copy link
Copy Markdown
Member

Originally introduced in #2832, the close code 1000 was treated as a way to make the documented "disconnect" broadcast not reconnect in the browser.

See also #3161 (comment)

The problem is that code 1000 is not always in our control. A middleware might close a WebSocket connection with code 1000, leaving the browser permanently disconnected. So using code 1000 is not a realiable meachnism for this.

Additionally, we recently changed "disconnect" to send 1001 instead, circumventing the whole thing: #6678

With all that in mind, I propose to remove special casing of 1000 completely. I see two ways we can go forward:

  1. Use a custom code, e.g. in 4000-4999 for "disconnect" and document that the socket will not reconnect. LiveView can still handle this code specially, but instead of reloading with jitter, we can immediately reload, as it is most commonly used when disconnecting a single user.
  2. Keep "disconnect" reconnecting, as it does now and introduce a new "permanent_disconnect" or however it would be called that is documented to not reconnect.

Relates to: #2832
Relates to: #3327
Relates to: 470337d
Relates to: phoenixframework/phoenix_live_view@302833c
Relates to: phoenixframework/phoenix_live_view@953a862
Relates to: phoenixframework/phoenix_live_view#2421
Relates to: mtrudel/bandit#582
Relates to: #6678

Originally introduced in #2832, the close code 1000 was treated as a way to
make the documented "disconnect" broadcast not reconnect in the browser.

See also #3161 (comment)

The problem is that code 1000 is not always in our control. A middleware
might close a WebSocket connection with code 1000, leaving the browser
permanently disconnected. So using code 1000 is not a realiable meachnism
for this.

Additionally, we recently changed "disconnect" to send 1001 instead,
circumventing the whole thing: #6678

With all that in mind, I propose to remove special casing of 1000 completely.
I see two ways we can go forward:

1. Use a custom code, e.g. in 4000-4999 for "disconnect" and document
   that the socket will not reconnect. LiveView can still handle this
   code specially, but instead of reloading with jitter, we can immediately
   reload, as it is most commonly used when disconnecting a single user.
2. Keep "disconnect" reconnecting, as it does now and introduce a new
   "permanent_disconnect" or however it would be called that is documented
   to not reconnect.

Relates to: #2832
Relates to: #3327
Relates to: 470337d
Relates to: phoenixframework/phoenix_live_view@302833c
Relates to: phoenixframework/phoenix_live_view@953a862
Relates to: phoenixframework/phoenix_live_view#2421
Relates to: mtrudel/bandit#582
Relates to: #6678

@josevalim josevalim left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

r

@josevalim

Copy link
Copy Markdown
Member

We should revert this now, as it hardcodes a status code on the socket that only makes sense for websocket: #6678

@SteffenDE
SteffenDE marked this pull request as ready for review October 20, 2026 09:33
@SteffenDE

Copy link
Copy Markdown
Member Author

So I think we keep things as is and revisit if someone requests a "permanent disconnect" kind of thing. If a channel is joined, people can always push a disconnect on that channel and then call disconnect in their app.js!

This reverts commit b6a4e31.

Now that phoenix.js reconnects after any close by the server, the close code is
no longer needed to make the client reconnect after "disconnect".

Bandit now closes normally and waits for the client, so channels exit
with {:shutdown, :peer_closed} after a "disconnect" broadcast.
@SteffenDE
SteffenDE merged commit 1783345 into main Oct 20, 2026
32 checks passed
@SteffenDE
SteffenDE deleted the sd-code-1000 branch October 20, 2026 10:00
SteffenDE added a commit that referenced this pull request Oct 20, 2026
* Don't treat code 1000 as special

Originally introduced in #2832, the close code 1000 was treated as a way to
make the documented "disconnect" broadcast not reconnect in the browser.

See also #3161 (comment)

The problem is that code 1000 is not always in our control. A middleware
might close a WebSocket connection with code 1000, leaving the browser
permanently disconnected. So using code 1000 is not a realiable meachnism
for this.

Additionally, we recently changed "disconnect" to send 1001 instead,
circumventing the whole thing: #6678

With all that in mind, I propose to remove special casing of 1000 completely.
I see two ways we can go forward:

1. Use a custom code, e.g. in 4000-4999 for "disconnect" and document
   that the socket will not reconnect. LiveView can still handle this
   code specially, but instead of reloading with jitter, we can immediately
   reload, as it is most commonly used when disconnecting a single user.
2. Keep "disconnect" reconnecting, as it does now and introduce a new
   "permanent_disconnect" or however it would be called that is documented
   to not reconnect.

Relates to: #2832
Relates to: #3327
Relates to: 470337d
Relates to: phoenixframework/phoenix_live_view@302833c
Relates to: phoenixframework/phoenix_live_view@953a862
Relates to: phoenixframework/phoenix_live_view#2421
Relates to: mtrudel/bandit#582
Relates to: #6678

* update tests and comments

* Revert "Make websocket disconnect codes explicit (#6678)"

This reverts commit b6a4e31.

Now that phoenix.js reconnects after any close by the server, the close code is
no longer needed to make the client reconnect after "disconnect".

Bandit now closes normally and waits for the client, so channels exit
with {:shutdown, :peer_closed} after a "disconnect" broadcast.

* Accept local_closed when Bandit handles a disconnect broadcast
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants