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

commonMain.com.apollographql.apollo.interceptor.NetworkRequestInterceptor.kt Maven / Gradle / Ivy

package com.apollographql.apollo.interceptor

import com.apollographql.apollo.ApolloError
import com.apollographql.apollo.ApolloException
import com.apollographql.apollo.api.ApolloExperimental
import com.apollographql.apollo.api.Response
import com.apollographql.apollo.network.GraphQLRequest
import com.apollographql.apollo.network.GraphQLResponse
import com.apollographql.apollo.network.NetworkTransport
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.flatMapLatest
import kotlinx.coroutines.flow.flow
import kotlinx.coroutines.flow.map

@ApolloExperimental
@ExperimentalCoroutinesApi
class NetworkRequestInterceptor(
    private val networkTransport: NetworkTransport
) : ApolloRequestInterceptor {

  override fun  intercept(request: ApolloRequest, interceptorChain: ApolloInterceptorChain): Flow> {
    return flow { emit(request.toNetworkRequest()) }
        .flatMapLatest { networkRequest -> networkTransport.execute(networkRequest) }
        .map { networkResponse -> networkResponse.parse(request) }
  }

  private fun  GraphQLResponse.parse(request: ApolloRequest): Response {
    val response = try {
      request.operation.parse(
          source = body,
          scalarTypeAdapters = request.scalarTypeAdapters
      )
    } catch (e: Exception) {
      throw ApolloException(
          message = "Failed to parse GraphQL network response",
          error = ApolloError.ParseError,
          executionContext = request.executionContext,
          cause = e
      )
    } finally {
      body.close()
    }
    return response.copy(executionContext = request.executionContext + response.executionContext)
  }

  private fun ApolloRequest<*>.toNetworkRequest(): GraphQLRequest {
    return try {
      GraphQLRequest(
          operationName = operation.name().name(),
          operationId = operation.operationId(),
          document = operation.queryDocument(),
          variables = operation.variables().marshal(scalarTypeAdapters)
      )
    } catch (e: Exception) {
      throw ApolloException(
          message = "Failed to compose GraphQL network request",
          error = ApolloError.SerializationError,
          executionContext = executionContext,
          cause = e
      )
    }
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy