From 86470cec22a35c6f1b938bcf457c9f3c1a93e5e6 Mon Sep 17 00:00:00 2001 From: My-Name-Is-Jeff <37018278+My-Name-Is-Jeff@users.noreply.github.com> Date: Thu, 23 May 2024 18:10:35 -0400 Subject: [PATCH] chore: split the ktor client used for http and ws --- .../kotlin/gg/skytils/skytilsmod/Skytils.kt | 50 +++++++------------ .../gg/skytils/skytilsws/client/WSClient.kt | 36 ++++++++++++- 2 files changed, 53 insertions(+), 33 deletions(-) diff --git a/src/main/kotlin/gg/skytils/skytilsmod/Skytils.kt b/src/main/kotlin/gg/skytils/skytilsmod/Skytils.kt index fed9022f9..e137637b8 100644 --- a/src/main/kotlin/gg/skytils/skytilsmod/Skytils.kt +++ b/src/main/kotlin/gg/skytils/skytilsmod/Skytils.kt @@ -76,20 +76,15 @@ import gg.skytils.skytilsmod.utils.* import gg.skytils.skytilsmod.utils.graphics.ScreenRenderer import gg.skytils.skytilsmod.utils.graphics.colors.CustomColor import gg.skytils.skytilsws.client.WSClient -import gg.skytils.skytilsws.shared.SkytilsWS import io.ktor.client.* import io.ktor.client.engine.cio.* import io.ktor.client.plugins.* import io.ktor.client.plugins.cache.* import io.ktor.client.plugins.compression.* import io.ktor.client.plugins.contentnegotiation.* -import io.ktor.client.plugins.websocket.* import io.ktor.http.* -import io.ktor.serialization.kotlinx.* import io.ktor.serialization.kotlinx.json.* -import io.ktor.websocket.* import kotlinx.coroutines.* -import kotlinx.serialization.ExperimentalSerializationApi import kotlinx.serialization.json.Json import kotlinx.serialization.modules.SerializersModule import net.minecraft.client.Minecraft @@ -127,7 +122,6 @@ import java.security.KeyStore import java.util.* import java.util.concurrent.Executors import java.util.concurrent.ThreadPoolExecutor -import java.util.zip.Deflater import javax.net.ssl.TrustManagerFactory import javax.net.ssl.X509TrustManager import kotlin.coroutines.CoroutineContext @@ -220,6 +214,23 @@ class Skytils { } } + val trustManager by lazy { + val backingManager = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()).apply { + init(null as KeyStore?) + }.trustManagers.first { it is X509TrustManager } as X509TrustManager + + val ourManager = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()).apply { + Skytils::class.java.getResourceAsStream("/skytilscacerts.jks").use { + val ourKs = KeyStore.getInstance(KeyStore.getDefaultType()).apply { + load(it, "skytilsontop".toCharArray()) + } + init(ourKs) + } + }.trustManagers.first { it is X509TrustManager } as X509TrustManager + + UnionX509TrustManager(backingManager, ourManager) + } + val client = HttpClient(CIO) { install(ContentEncoding) { customEncoder(BrotliEncoder, 1.0F) @@ -249,32 +260,7 @@ class Skytils { socketTimeout = 10000 } https { - val backingManager = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()).apply { - init(null as KeyStore?) - }.trustManagers.first { it is X509TrustManager } as X509TrustManager - - val ourManager = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()).apply { - Skytils::class.java.getResourceAsStream("/skytilscacerts.jks").use { - val ourKs = KeyStore.getInstance(KeyStore.getDefaultType()).apply { - load(it, "skytilsontop".toCharArray()) - } - init(ourKs) - } - }.trustManagers.first { it is X509TrustManager } as X509TrustManager - - trustManager = UnionX509TrustManager(backingManager, ourManager) - } - } - - install(WebSockets) { - pingInterval = 5_000L - @OptIn(ExperimentalSerializationApi::class) - contentConverter = KotlinxWebsocketSerializationConverter(SkytilsWS.packetSerializer) - extensions { - install(WebSocketDeflateExtension) { - compressionLevel = Deflater.DEFAULT_COMPRESSION - compressIfBiggerThan(bytes = 4 * 1024) - } + trustManager = Skytils.trustManager } } } diff --git a/src/main/kotlin/gg/skytils/skytilsws/client/WSClient.kt b/src/main/kotlin/gg/skytils/skytilsws/client/WSClient.kt index c7fb57257..22a027524 100644 --- a/src/main/kotlin/gg/skytils/skytilsws/client/WSClient.kt +++ b/src/main/kotlin/gg/skytils/skytilsws/client/WSClient.kt @@ -19,16 +19,50 @@ package gg.skytils.skytilsws.client import gg.skytils.skytilsmod.Skytils -import gg.skytils.skytilsmod.Skytils.Companion.client import gg.skytils.skytilsws.shared.SkytilsWS import gg.skytils.skytilsws.shared.packet.C2SPacketConnect import gg.skytils.skytilsws.shared.packet.Packet +import io.ktor.client.* +import io.ktor.client.engine.cio.* +import io.ktor.client.plugins.* import io.ktor.client.plugins.websocket.* +import io.ktor.serialization.kotlinx.* import io.ktor.websocket.* import kotlinx.coroutines.channels.ClosedReceiveChannelException +import kotlinx.serialization.ExperimentalSerializationApi +import java.util.zip.Deflater object WSClient { var session: DefaultClientWebSocketSession? = null + val wsClient by lazy { + HttpClient(CIO) { + install(UserAgent) { + agent = "Skytils/${Skytils.VERSION} SkytilsWS/${SkytilsWS.version}" + } + + install(WebSockets) { + pingInterval = 59_000L + @OptIn(ExperimentalSerializationApi::class) + contentConverter = KotlinxWebsocketSerializationConverter(SkytilsWS.packetSerializer) + extensions { + install(WebSocketDeflateExtension) { + compressionLevel = Deflater.DEFAULT_COMPRESSION + compressIfBiggerThan(bytes = 4 * 1024) + } + } + } + + engine { + endpoint { + connectTimeout = 10000 + keepAliveTime = 60000 + } + https { + trustManager = Skytils.trustManager + } + } + } + } suspend fun openConnection() { if (session != null) error("Session already open")