Skip to content

Commit

Permalink
Add WebSocketEngine(WebSocket.Factory) and fix documentation
Browse files Browse the repository at this point in the history
See #5862
  • Loading branch information
martinbonnin committed Jul 23, 2024
1 parent 29434df commit 899cb4a
Show file tree
Hide file tree
Showing 2 changed files with 35 additions and 17 deletions.
40 changes: 28 additions & 12 deletions docs/source/advanced/experimental-websockets.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -111,19 +111,35 @@ The above uses the default retry algorithm:
* Wait until the network is available if you configured a [NetworkMonitor](network-connectivity).
* Or use exponential backoff else.

To customize the retry logic more, use `addRetryOnErrorInterceptor`:
To customize the retry logic more, use `retryOnErrorInterceptor`:

```kotlin
val apolloClient = ApolloClient.Builder()
.subscriptionNetworkTransport(
WebSocketNetworkTransport.Builder()
.serverUrl(url)
.build()
)
.addRetryOnErrorInterceptor { exception, attempt ->
// retry logic here

// return true to retry or false to terminate the Flow
true
}
.retryOnErrorInterceptor(MyRetryOnErrorInterceptor())
.build()

class MyRetryOnErrorInterceptor : ApolloInterceptor {
object RetryException : Exception()

override fun <D : Operation.Data> intercept(request: ApolloRequest<D>, chain: ApolloInterceptorChain): Flow<ApolloResponse<D>> {
var attempt = 0
return request.ensureUniqueUuid()
.flatMapConcat { chain.proceed(it) }.onEach {
if (request.retryOnError == true && it.exception != null && it.exception is ApolloNetworkException) {
throw RetryException
} else {
attempt = 0
}
}.retryWhen { cause, _ ->
if (cause is RetryException) {
attempt++
delay(2.0.pow(attempt).seconds)
true
} else {
// Not a RetryException, probably a programming error, pass it through
false
}
}
}
}
```
Original file line number Diff line number Diff line change
@@ -1,10 +1,9 @@
package com.apollographql.apollo.network.websocket

import com.apollographql.apollo.annotations.ApolloExperimental
import com.apollographql.apollo.api.http.HttpHeader
import com.apollographql.apollo.exception.ApolloNetworkException
import com.apollographql.apollo.network.defaultOkHttpClientBuilder
import com.apollographql.apollo.network.websocket.WebSocket
import com.apollographql.apollo.network.websocket.WebSocketListener
import okhttp3.Headers
import okhttp3.OkHttpClient
import okhttp3.Request
Expand All @@ -16,9 +15,9 @@ import java.util.concurrent.atomic.AtomicReference
import okhttp3.WebSocket as PlatformWebSocket
import okhttp3.WebSocketListener as PlatformWebSocketListener

internal class JvmWebSocketEngine(private val okHttpClient: OkHttpClient) : WebSocketEngine {
internal class JvmWebSocketEngine(private val webSocketFactory: PlatformWebSocket.Factory) : WebSocketEngine {
override fun newWebSocket(url: String, headers: List<HttpHeader>, listener: WebSocketListener): WebSocket {
return JvmWebSocket(okHttpClient, url, headers, listener)
return JvmWebSocket(webSocketFactory, url, headers, listener)
}

override fun close() {
Expand Down Expand Up @@ -107,4 +106,7 @@ internal class JvmWebSocket(
}


actual fun WebSocketEngine(): WebSocketEngine = JvmWebSocketEngine(defaultOkHttpClientBuilder.build())
actual fun WebSocketEngine(): WebSocketEngine = JvmWebSocketEngine(defaultOkHttpClientBuilder.build())

@ApolloExperimental
fun WebSocketEngine(webSocketFactory: PlatformWebSocket.Factory): WebSocketEngine = JvmWebSocketEngine(webSocketFactory)

0 comments on commit 899cb4a

Please sign in to comment.