Skip to content

Commit

Permalink
chore: split the ktor client used for http and ws
Browse files Browse the repository at this point in the history
  • Loading branch information
My-Name-Is-Jeff committed May 23, 2024
1 parent 47f35fb commit 86470ce
Show file tree
Hide file tree
Showing 2 changed files with 53 additions and 33 deletions.
50 changes: 18 additions & 32 deletions src/main/kotlin/gg/skytils/skytilsmod/Skytils.kt
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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
}
}
}
Expand Down
36 changes: 35 additions & 1 deletion src/main/kotlin/gg/skytils/skytilsws/client/WSClient.kt
Original file line number Diff line number Diff line change
Expand Up @@ -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")
Expand Down

0 comments on commit 86470ce

Please sign in to comment.