beyondcode / laravel-websockets

Websockets for Laravel. Done right.
https://beyondco.de/docs/laravel-websockets
MIT License
5.08k stars 628 forks source link

Support WebSocket Ping/Pong #765

Closed zek closed 1 year ago

zek commented 3 years ago

Bug Explanation

I was testing websockets on an iOS application and noticed after 2 minutes events stopped cuz connection is marked as idle and removed due to lastPongedAt

However ping sent from iOS client and it receives pong response successfully. However it doesn't send pusher:ping instead it send ping message in TCP layer.

So ping messages were captured by Ratchet WsServer while laravel-websockets expects ping message differently.

image

Solution

I override onControlFrame as following and it works like a charm.

image

image

If you check https://pusher.com/docs/channels/library_auth_reference/pusher-websockets-protocol#ping-and-pong-messages they mention

In protocol versions 5 and above, when using an old version of the WebSocket protocol, Pusher Channels will send pusher:ping event

So it could be nice if we can support this functionality.

mpociot commented 3 years ago

Can you send a PR that adds support for Pushers ping/pong implementation?

mdprotacio commented 3 years ago

I have almost similar issue on the lastPongedAt. Whenever the client receives an event, ping is not issued until 30seconds of inactivity. In a very busy client-server scenario where almost always we get events from channel, ping/pong is not being triggered as it is not idle for 30seconds (pusher default). Hence, connections are not updated with lastPongedAt and are treated as obsolete connections and are removed. #778 adds an update to mark the connections as ponged whenever we send messages to subscribers.

lucadegasperi commented 3 years ago

I find myself having long running web pages (days or months) timeout after a while. Is there any progress on this issue? Is this something that needs to be implemented on the Ratchet side of things?