All Downloads are FREE. Search and download functionalities are using the official Maven repository.

commonMain.it.unibo.alchemist.boundary.graphql.client.DefaultGraphQLClient.kt Maven / Gradle / Ivy

The newest version!
/*
 * Copyright (C) 2010-2023, Danilo Pianini and contributors
 * listed, for each module, in the respective subproject's build.gradle.kts file.
 *
 * This file is part of Alchemist, and is distributed under the terms of the
 * GNU General Public License, with a linking exception,
 * as described in the file LICENSE in the Alchemist distribution's top directory.
 */

package it.unibo.alchemist.boundary.graphql.client

import com.apollographql.apollo3.ApolloCall
import com.apollographql.apollo3.ApolloClient
import com.apollographql.apollo3.api.Mutation
import com.apollographql.apollo3.api.Query
import com.apollographql.apollo3.api.Subscription
import com.apollographql.apollo3.network.ws.GraphQLWsProtocol
import com.apollographql.apollo3.network.ws.WebSocketNetworkTransport
import it.unibo.alchemist.boundary.graphql.utils.DefaultGraphQLSettings

/**
 * Default GraphQL client implementation.
 *
 * @param host the host of the GraphQL server
 * @param port the port of the GraphQL server
 * @param enableSubscription whether to enable subscriptions or not
 */
data class DefaultGraphQLClient(
    override val host: String = DefaultGraphQLSettings.DEFAULT_HOST,
    override val port: Int = DefaultGraphQLSettings.DEFAULT_PORT,
    private val enableSubscription: Boolean = false,
) : GraphQLClient {

    private val client: ApolloClient = ApolloClient.Builder()
        .serverUrl(serverUrl())
        .apply {
            if (enableSubscription) {
                subscriptionNetworkTransport(
                    WebSocketNetworkTransport.Builder()
                        .serverUrl(subscriptionUrl())
                        .protocol(GraphQLWsProtocol.Factory())
                        .build(),
                )
            }
        }
        .build()

    override fun subscriptionUrl(): String {
        check(enableSubscription) { "Subscription module is not enabled!" }
        return "ws://$host:$port/subscriptions"
    }

    override fun  query(query: Query): ApolloCall {
        return client.query(query)
    }

    override fun  mutation(mutation: Mutation): ApolloCall {
        return client.mutation(mutation)
    }

    override fun  subscription(subscription: Subscription): ApolloCall {
        check(enableSubscription) { "Subscription module is not enabled!" }
        return client.subscription(subscription)
    }

    override fun close() = client.close()
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy