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

flag.FlagConfigApi.kt Maven / Gradle / Ivy

package com.amplitude.experiment.flag

import com.amplitude.experiment.LIBRARY_VERSION
import com.amplitude.experiment.evaluation.FlagConfig
import com.amplitude.experiment.evaluation.serialization.SerialFlagConfig
import com.amplitude.experiment.util.Logger
import com.amplitude.experiment.util.get
import okhttp3.HttpUrl
import okhttp3.OkHttpClient

internal interface FlagConfigApi {
    fun getFlagConfigs(): List
}

internal class HybridFlagConfigApi(
    private val directApi: FlagConfigApi,
    private val proxyApi: FlagConfigApi?,
) : FlagConfigApi {

    constructor(
        deploymentKey: String,
        directUrl: HttpUrl,
        proxyUrl: HttpUrl?,
        httpClient: OkHttpClient,
    ) : this(
        directApi = DirectFlagConfigApi(deploymentKey, directUrl, httpClient),
        proxyApi = proxyUrl?.let { ProxyFlagConfigApi(deploymentKey, proxyUrl, httpClient) },
    )

    override fun getFlagConfigs(): List {
        if (proxyApi != null) {
            try {
                return proxyApi.getFlagConfigs()
            } catch (e: Exception) {
                Logger.e("Failed to get flag configs from proxy api.", e)
            }
        }
        return directApi.getFlagConfigs()
    }
}

internal class DirectFlagConfigApi(
    private val deploymentKey: String,
    private val serverUrl: HttpUrl,
    private val httpClient: OkHttpClient,
) : FlagConfigApi {

    override fun getFlagConfigs(): List {
        val response = httpClient.get>(
            serverUrl, "sdk/v1/flags",
            headers = mapOf(
                "Authorization" to "Api-Key $deploymentKey",
                "X-Amp-Exp-Library" to "experiment-jvm-server/$LIBRARY_VERSION"
            )
        )
        return response.map { it.convert() }
    }
}

internal class ProxyFlagConfigApi(
    private val deploymentKey: String,
    private val serverUrl: HttpUrl,
    private val httpClient: OkHttpClient,
) : FlagConfigApi {

    override fun getFlagConfigs(): List {
        val response = httpClient.get>(serverUrl, "/sdk/v1/deployments/$deploymentKey/flags")
        return response.map { it.convert() }
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy