-
Notifications
You must be signed in to change notification settings - Fork 9.2k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Add timeout to SSE #8565
base: master
Are you sure you want to change the base?
Add timeout to SSE #8565
Conversation
/** | ||
* Seconds elapsed between 2 events until connection failed. Doesn't timeout if null | ||
*/ | ||
open var timeout: Long? = null |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
From Call, I think there is a convention on timeout names. Such as readTimeoutMillis
. So perhaps receiveTimeoutMillis
?
I wonder if we should prefer Kotlin Duration here also?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Internally we use callTimeout in RealEventSource to track establishment, and it's obviously an existing top level think in OkHttp which extends to the end of a request.
read feel to I/O socket focused.
@@ -40,6 +44,18 @@ internal class RealEventSource( | |||
} | |||
} | |||
|
|||
private fun updateTimeout(call: Call?, duration: Duration) { | |||
if (call?.timeout() is AsyncTimeout) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I'm a bit nervous about reusing call.timeout()
here. I guess two reasons
- it isn't clear we are the owner of it, perhaps some other component or an interceptor is using it.
- the casting seems unsafe, but if we create it, we know the type and can set the duration ourselves.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
What do you suggest then ?
For the first point: currently (without the PR), we cancel this exact timeout (L69), so the point would be valid for the current state.
For the 2nd, the check prevent unsafe casting
This PR adds the possibility to timeout the SSE connection. It is now possible to fail as soon as an event-free timeout is not reached, making it easier to detect a lost connection.
For a real world example: I've an app connected to a server. It sends a ping at a keepalive interval. I've a job checking from time to time that everything works as expected (using a worker, so the period is 15min, the minimum). It happens that the connection is lost at the beginning of this interval, therefore the users are disconnected for several minutes.
With this PR we can directly catch a lost connection: https://codeberg.org/NextPush/nextpush-android/commit/f6edb178ddee8255e9de6e548ea75f5d3eb6b32a
PS: I've also added some comments, but I can remove this commit from the branch