Prevent asset compression from exhausting the thread pool
authorLanius Trolling <lanius@laniustrolling.dev>
Wed, 3 Apr 2024 22:34:40 +0000 (18:34 -0400)
committerLanius Trolling <lanius@laniustrolling.dev>
Wed, 3 Apr 2024 22:34:40 +0000 (18:34 -0400)
src/jvmMain/kotlin/info/mechyrdia/lore/asset_compression.kt

index c09ec21dc781b43219d1ac389da84562ac8a7eb2..1b2420a29dfeed2d429cfad618c693b66affe7df 100644 (file)
@@ -4,6 +4,8 @@ import io.ktor.http.*
 import io.ktor.server.application.*
 import io.ktor.server.request.*
 import io.ktor.server.response.*
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.runInterruptible
 import java.io.ByteArrayOutputStream
 import java.io.File
 import java.io.FilterOutputStream
@@ -31,7 +33,8 @@ private fun ApplicationCall.compressedCache(): CompressedCache? {
 suspend fun ApplicationCall.respondCompressedFile(file: File) {
        val cache = compressedCache() ?: return respondFile(file)
        response.header(HttpHeaders.ContentEncoding, cache.encoding)
-       respondBytes(cache.getCompressed(file))
+       val compressedBytes = runInterruptible(Dispatchers.IO) { cache.getCompressed(file) }
+       respondBytes(compressedBytes)
 }
 
 private class CompressedCache(val encoding: String, private val compressor: (ByteArray) -> ByteArray) {