Skip to content

Commit

Permalink
Reduce KTOR dependencies (#474)
Browse files Browse the repository at this point in the history
* Reduce KTOR dependencies

* Code Formatting

* Expose CIOEngineConfig
  • Loading branch information
ashdavies authored Aug 18, 2023
1 parent 38ac430 commit 5b40baa
Show file tree
Hide file tree
Showing 10 changed files with 36 additions and 105 deletions.
9 changes: 1 addition & 8 deletions app-check/app-check-client/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -14,14 +14,7 @@ kotlin {
implementation(httpClient)
}

with(libs.ktor.client) {
implementation(content.negotiation)
implementation(core)
implementation(json)
implementation(logging)
implementation(okhttp3)
}

implementation(libs.ktor.client.core)
implementation(libs.slf4j.simple)
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,9 @@ import com.google.firebase.appcheck.playintegrity.PlayIntegrityAppCheckProviderF
import io.ashdavies.compose.LocalFirebaseAndroidApp
import io.ashdavies.http.AppCheckToken
import io.ashdavies.http.LocalHttpClient
import io.ashdavies.http.header
import io.ktor.client.HttpClient
import io.ktor.client.plugins.DefaultRequest
import io.ktor.client.request.header
import io.ktor.http.HttpHeaders
import com.google.firebase.appcheck.AppCheckToken as FirebaseAppCheckToken

Expand All @@ -26,7 +27,11 @@ public actual fun ProvideAppCheckToken(client: HttpClient, content: @Composable
appCheck.installAppCheckProviderFactory(factory)

CompositionLocalProvider(
LocalHttpClient provides client.header(HttpHeaders.AppCheckToken, token),
LocalHttpClient provides client.config {
install(DefaultRequest) {
header(HttpHeaders.AppCheckToken, token?.token)
}
},
content = content,
)
}
Expand Down
10 changes: 0 additions & 10 deletions app-check/app-check-sdk/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -11,15 +11,5 @@ dependencies {
implementation(libs.auth.java.jwt)
implementation(libs.auth.jwks.rsa)
implementation(libs.google.guava.jre)

with(libs.ktor.client) {
implementation(auth)
implementation(content.negotiation)
implementation(core)
implementation(json)
implementation(logging)
implementation(okhttp3)
}

implementation(libs.slf4j.simple)
}
9 changes: 0 additions & 9 deletions dominion-app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -14,15 +14,6 @@ kotlin {
implementation(projects.imageLoader)

implementation(libs.essenty.parcelable)

with(libs.ktor.client) {
implementation(libs.ktor.client.content.negotiation)
implementation(libs.ktor.client.core)
implementation(libs.ktor.client.json)
implementation(libs.ktor.client.logging)
implementation(libs.ktor.client.okhttp3)
}

implementation(libs.slack.circuit.foundation)
implementation(libs.slf4j.simple)
}
Expand Down
9 changes: 0 additions & 9 deletions events-app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -20,15 +20,6 @@ kotlin {
}

implementation(libs.essenty.parcelable)

with(libs.ktor.client) {
implementation(content.negotiation)
implementation(core)
implementation(json)
implementation(logging)
implementation(okhttp3)
}

implementation(libs.paging.compose.common)
implementation(libs.paging.compose.runtime)
implementation(libs.slf4j.simple)
Expand Down
2 changes: 1 addition & 1 deletion gradle/libs.versions.toml
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,7 @@ ktor-client-content-negotiation = { module = "io.ktor:ktor-client-content-negoti
ktor-client-core = { module = "io.ktor:ktor-client-core", version.ref = "ktor" }
ktor-client-json = { module = "io.ktor:ktor-client-json", version.ref = "ktor" }
ktor-client-logging = { module = "io.ktor:ktor-client-logging", version.ref = "ktor" }
ktor-client-okhttp3 = { module = "io.ktor:ktor-client-okhttp", version.ref = "ktor" }
ktor-client-cio = { module = "io.ktor:ktor-client-cio", version.ref = "ktor" }
ktor-http = { module = "io.ktor:ktor-http", version.ref = "ktor" }
ktor-serialization-json = { module = "io.ktor:ktor-serialization-kotlinx-json", version.ref = "ktor" }
ktor-serialization-kotlinx = { module = "io.ktor:ktor-serialization-kotlinx", version.ref = "ktor" }
Expand Down
17 changes: 8 additions & 9 deletions http-client/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -17,18 +17,17 @@ kotlin {

commonMain {
dependencies {
implementation(projects.localStorage)

implementation(libs.jetbrains.kotlinx.serialization.properties)

with(libs.ktor.client) {
implementation(content.negotiation)
implementation(core)
implementation(json)
implementation(logging)
implementation(okhttp3)
api(cio)
api(core)
api(logging)
}

implementation(projects.localStorage)

implementation(libs.jetbrains.kotlinx.serialization.properties)
implementation(libs.ktor.client.content.negotiation)
implementation(libs.ktor.client.json)
implementation(libs.ktor.serialization.json)
implementation(libs.ktor.serialization.kotlinx)
implementation(libs.slf4j.simple)
Expand Down
62 changes: 19 additions & 43 deletions http-client/src/commonMain/kotlin/io/ashdavies/http/HttpClient.kt
Original file line number Diff line number Diff line change
Expand Up @@ -2,38 +2,41 @@ package io.ashdavies.http

import androidx.compose.runtime.ProvidableCompositionLocal
import androidx.compose.runtime.staticCompositionLocalOf
import io.ashdavies.playground.EventsSerializer
import io.ktor.client.HttpClient
import io.ktor.client.HttpClientConfig
import io.ktor.client.engine.cio.CIO
import io.ktor.client.engine.cio.CIOEngineConfig
import io.ktor.client.plugins.DefaultRequest
import io.ktor.client.plugins.HttpTimeout
import io.ktor.client.plugins.HttpTimeout.Plugin.INFINITE_TIMEOUT_MS
import io.ktor.client.plugins.cache.HttpCache
import io.ktor.client.plugins.contentnegotiation.ContentNegotiation
import io.ktor.client.plugins.logging.LogLevel
import io.ktor.client.plugins.logging.Logger
import io.ktor.client.plugins.logging.Logging
import io.ktor.client.request.accept
import io.ktor.client.request.header
import io.ktor.http.ContentType
import io.ktor.http.contentType
import io.ktor.http.userAgent
import io.ktor.serialization.kotlinx.json.json
import kotlinx.serialization.json.Json
import kotlinx.serialization.modules.SerializersModule
import kotlinx.serialization.modules.SerializersModuleBuilder
import kotlinx.serialization.modules.contextual

public val LocalHttpClient: ProvidableCompositionLocal<HttpClient> = staticCompositionLocalOf {
DefaultHttpClient { install(HttpCache) }
}

private val defaultUserAgent: String
get() = "${Software.clientName} (${Software.productName}; ${Software.buildVersion})"

private fun DefaultLogger(block: (message: String) -> Unit = ::println) = object : Logger {
override fun log(message: String) = block(message)
}

public fun DefaultHttpClient(configure: HttpClientConfig<*>.() -> Unit = { }): HttpClient = HttpClient {
public fun DefaultHttpClient(
logLevel: LogLevel = LogLevel.INFO,
configure: HttpClientConfig<CIOEngineConfig>.() -> Unit = { },
): HttpClient = HttpClient(CIO) {
install(ContentNegotiation) {
json(DefaultJson())
json(
Json {
ignoreUnknownKeys = true
encodeDefaults = true
},
)
}

install(DefaultRequest) {
Expand All @@ -42,41 +45,14 @@ public fun DefaultHttpClient(configure: HttpClientConfig<*>.() -> Unit = { }): H
userAgent(defaultUserAgent)
}

install(HttpTimeout) {
connectTimeoutMillis = INFINITE_TIMEOUT_MS
}

install(Logging) {
logger = DefaultLogger()
level = LogLevel.INFO
level = logLevel
}

configure()
}

private fun DefaultJson(serializers: SerializersModuleBuilder.() -> Unit = { }) = Json {
serializersModule = SerializersModule {
contextual(EventsSerializer)
serializers()
}

ignoreUnknownKeys = true
encodeDefaults = true
}

public val LocalHttpClient: ProvidableCompositionLocal<HttpClient> = staticCompositionLocalOf {
DefaultHttpClient { install(HttpCache) }
}

private fun HttpClient.defaultRequest(
configure: DefaultRequest.DefaultRequestBuilder.() -> Unit,
): HttpClient = config {
install(DefaultRequest, configure)
}

public fun HttpClient.header(
key: String,
value: Any?,
): HttpClient = defaultRequest {
header(key, value)
private fun DefaultLogger(block: (message: String) -> Unit = ::println) = object : Logger {
override fun log(message: String) = block(message)
}
3 changes: 0 additions & 3 deletions notion-client/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -24,10 +24,7 @@ kotlin {
with(libs.ktor.client) {
implementation(auth)
implementation(content.negotiation)
implementation(core)
implementation(json)
implementation(logging)
implementation(okhttp3)
}

implementation(libs.ktor.serialization.json)
Expand Down
11 changes: 0 additions & 11 deletions notion-console/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -20,23 +20,12 @@ kotlin {
}

implementation(libs.jraf.klibnotion)

with(libs.ktor.client) {
implementation(auth)
implementation(content.negotiation)
implementation(core)
implementation(json)
implementation(logging)
implementation(okhttp3)
}

implementation(libs.ktor.serialization.json)
implementation(libs.ktor.serialization.kotlinx)

with(libs.ktor.server) {
implementation(auth)
implementation(call.logging)
implementation(cio)
implementation(compression)
implementation(conditional.headers)
implementation(content.negotiation)
Expand Down

0 comments on commit 5b40baa

Please sign in to comment.