diff --git a/libraries/apollo-runtime/api/android/apollo-runtime.api b/libraries/apollo-runtime/api/android/apollo-runtime.api index 91e5baadd28..707857bab3e 100644 --- a/libraries/apollo-runtime/api/android/apollo-runtime.api +++ b/libraries/apollo-runtime/api/android/apollo-runtime.api @@ -354,6 +354,7 @@ public final class com/apollographql/apollo/network/ws/AppSyncWsProtocol$Factory public final class com/apollographql/apollo/network/ws/DefaultWebSocketEngine : com/apollographql/apollo/network/ws/WebSocketEngine { public fun ()V + public fun (Lkotlin/jvm/functions/Function0;)V public fun (Lokhttp3/WebSocket$Factory;)V public fun open (Ljava/lang/String;Ljava/util/List;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; } diff --git a/libraries/apollo-runtime/api/jvm/apollo-runtime.api b/libraries/apollo-runtime/api/jvm/apollo-runtime.api index 91e5baadd28..707857bab3e 100644 --- a/libraries/apollo-runtime/api/jvm/apollo-runtime.api +++ b/libraries/apollo-runtime/api/jvm/apollo-runtime.api @@ -354,6 +354,7 @@ public final class com/apollographql/apollo/network/ws/AppSyncWsProtocol$Factory public final class com/apollographql/apollo/network/ws/DefaultWebSocketEngine : com/apollographql/apollo/network/ws/WebSocketEngine { public fun ()V + public fun (Lkotlin/jvm/functions/Function0;)V public fun (Lokhttp3/WebSocket$Factory;)V public fun open (Ljava/lang/String;Ljava/util/List;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; } diff --git a/libraries/apollo-runtime/src/jvmCommonMain/kotlin/com/apollographql/apollo/network/websocket/WebSocketEngine.jvm.kt b/libraries/apollo-runtime/src/jvmCommonMain/kotlin/com/apollographql/apollo/network/websocket/WebSocketEngine.jvm.kt index ca890f5606d..c1640db02f5 100644 --- a/libraries/apollo-runtime/src/jvmCommonMain/kotlin/com/apollographql/apollo/network/websocket/WebSocketEngine.jvm.kt +++ b/libraries/apollo-runtime/src/jvmCommonMain/kotlin/com/apollographql/apollo/network/websocket/WebSocketEngine.jvm.kt @@ -15,7 +15,11 @@ import java.util.concurrent.atomic.AtomicReference import okhttp3.WebSocket as PlatformWebSocket import okhttp3.WebSocketListener as PlatformWebSocketListener -internal class JvmWebSocketEngine(private val webSocketFactory: PlatformWebSocket.Factory) : WebSocketEngine { +internal class JvmWebSocketEngine(webSocketFactory: () -> PlatformWebSocket.Factory) : WebSocketEngine { + private val webSocketFactory by lazy { webSocketFactory() } + + constructor(webSocketFactory: PlatformWebSocket.Factory) : this({ webSocketFactory }) + var closed = false override fun newWebSocket(url: String, headers: List, listener: WebSocketListener): WebSocket { require(!closed) { @@ -88,11 +92,11 @@ internal class JvmWebSocket( } private fun List.toOkHttpHeaders(): Headers = - Headers.Builder().also { headers -> - this.forEach { - headers.add(it.name, it.value) - } - }.build() + Headers.Builder().also { headers -> + this.forEach { + headers.add(it.name, it.value) + } + }.build() override fun send(data: ByteArray) { platformWebSocket.get()?.send(data.toByteString()) @@ -110,7 +114,21 @@ internal class JvmWebSocket( } -actual fun WebSocketEngine(): WebSocketEngine = JvmWebSocketEngine(defaultOkHttpClientBuilder.build()) +actual fun WebSocketEngine(): WebSocketEngine = JvmWebSocketEngine { defaultOkHttpClientBuilder.build() } +/** + * Creates a new [WebSocketEngine] from [webSocketFactory] + * + * This factory function accepts a function so that OkHttp is initialized from a background thread + */ +@ApolloExperimental +fun WebSocketEngine(webSocketFactory: () -> PlatformWebSocket.Factory): WebSocketEngine = JvmWebSocketEngine(webSocketFactory) + +/** + * Creates a new [WebSocketEngine] from [webSocketFactory] + * + * Prefer using the factory function accepting a function so that OkHttp is initialized from a background thread. + * See https://github.com/square/okhttp/pull/8248 + */ @ApolloExperimental fun WebSocketEngine(webSocketFactory: PlatformWebSocket.Factory): WebSocketEngine = JvmWebSocketEngine(webSocketFactory) \ No newline at end of file diff --git a/libraries/apollo-runtime/src/jvmCommonMain/kotlin/com/apollographql/apollo/network/ws/OkHttpWebSocketEngine.kt b/libraries/apollo-runtime/src/jvmCommonMain/kotlin/com/apollographql/apollo/network/ws/OkHttpWebSocketEngine.kt index aac87493969..da06d06fae4 100644 --- a/libraries/apollo-runtime/src/jvmCommonMain/kotlin/com/apollographql/apollo/network/ws/OkHttpWebSocketEngine.kt +++ b/libraries/apollo-runtime/src/jvmCommonMain/kotlin/com/apollographql/apollo/network/ws/OkHttpWebSocketEngine.kt @@ -13,10 +13,23 @@ import okhttp3.WebSocket import okhttp3.WebSocketListener import okio.ByteString +/** + * Creates a new [DefaultWebSocketEngine] from [webSocketFactory] + * + * This constructor accepts a function so that OkHttp is initialized from a background thread + */ actual class DefaultWebSocketEngine( - private val webSocketFactory: WebSocket.Factory, + webSocketFactory: () -> WebSocket.Factory, ) : WebSocketEngine { - + private val webSocketFactory by lazy { webSocketFactory() } + + /** + * Creates a new [DefaultWebSocketEngine] from [webSocketFactory] + * + * Prefer using the factory function accepting a function so that OkHttp is initialized from a background thread. + * See https://github.com/square/okhttp/pull/8248 + */ + constructor(webSocketFactory: WebSocket.Factory): this({webSocketFactory}) actual constructor() : this( webSocketFactory = defaultOkHttpClientBuilder.build() )