Revert "Revert "migrations onto new libraries""

This reverts commit e68735d061.
This commit is contained in:
2024-08-16 19:13:16 +06:00
parent a28448c3c1
commit 1853c08323
13 changed files with 58 additions and 48 deletions

View File

@@ -1,3 +1,3 @@
package dev.inmo.micro_utils.ktor.client package dev.inmo.micro_utils.ktor.client
typealias OnUploadCallback = suspend (uploaded: Long, count: Long) -> Unit typealias OnUploadCallback = suspend (uploaded: Long, count: Long?) -> Unit

View File

@@ -1,10 +1,9 @@
package dev.inmo.micro_utils.ktor.common package dev.inmo.micro_utils.ktor.common
import io.ktor.utils.io.core.* import io.ktor.utils.io.core.Input
import kotlinx.io.asSink import kotlinx.io.asSink
import java.io.File import java.io.File
import java.util.UUID import java.util.UUID
import kotlin.io.use
fun Input.downloadToTempFile( fun Input.downloadToTempFile(
fileName: String = UUID.randomUUID().toString(), fileName: String = UUID.randomUUID().toString(),
@@ -15,8 +14,8 @@ fun Input.downloadToTempFile(
fileExtension, fileExtension,
folder folder
).apply { ).apply {
outputStream().use { output -> outputStream().use {
this@downloadToTempFile.transferTo(output.asSink()) this@downloadToTempFile.transferTo(it.asSink())
} }
deleteOnExit() deleteOnExit()
} }

View File

@@ -1,8 +1,9 @@
package dev.inmo.micro_utils.ktor.server package dev.inmo.micro_utils.ktor.server
import io.ktor.server.application.ApplicationCall import io.ktor.server.application.ApplicationCall
import io.ktor.server.http.*
import io.ktor.server.response.responseType import io.ktor.server.response.responseType
import io.ktor.util.InternalAPI import io.ktor.utils.io.InternalAPI
import io.ktor.util.reflect.TypeInfo import io.ktor.util.reflect.TypeInfo
@InternalAPI @InternalAPI
@@ -11,5 +12,5 @@ suspend fun <T : Any> ApplicationCall.respond(
typeInfo: TypeInfo typeInfo: TypeInfo
) { ) {
response.responseType = typeInfo response.responseType = typeInfo
response.pipeline.execute(this, message as Any) respond(message, typeInfo)
} }

View File

@@ -2,22 +2,19 @@ package dev.inmo.micro_utils.ktor.server
import com.benasher44.uuid.uuid4 import com.benasher44.uuid.uuid4
import io.ktor.http.content.PartData import io.ktor.http.content.PartData
import io.ktor.utils.io.copyTo import io.ktor.util.cio.*
import io.ktor.utils.io.core.copyTo import io.ktor.utils.io.*
import io.ktor.utils.io.jvm.javaio.* import io.ktor.utils.io.jvm.javaio.copyTo
import io.ktor.utils.io.streams.*
import kotlinx.io.asSink import kotlinx.io.asSink
import java.io.File import java.io.File
fun PartData.FileItem.download(target: File) { suspend fun PartData.FileItem.download(target: File) {
provider().toInputStream().asInput().use { input -> provider().copyAndClose(
target.outputStream().use { output -> target.writeChannel()
input.transferTo(output.asSink()) )
}
}
} }
fun PartData.FileItem.downloadToTemporalFile(): File { suspend fun PartData.FileItem.downloadToTemporalFile(): File {
val outputFile = File.createTempFile(uuid4().toString(), ".temp").apply { val outputFile = File.createTempFile(uuid4().toString(), ".temp").apply {
deleteOnExit() deleteOnExit()
} }
@@ -27,8 +24,8 @@ fun PartData.FileItem.downloadToTemporalFile(): File {
fun PartData.BinaryItem.download(target: File) { fun PartData.BinaryItem.download(target: File) {
provider().use { input -> provider().use { input ->
target.outputStream().use { output -> target.outputStream().use {
input.transferTo(output.asSink()) input.transferTo(it.asSink())
} }
} }
} }

View File

@@ -6,7 +6,7 @@ import io.ktor.http.URLProtocol
import io.ktor.server.application.install import io.ktor.server.application.install
import io.ktor.server.application.pluginOrNull import io.ktor.server.application.pluginOrNull
import io.ktor.server.routing.Routing import io.ktor.server.routing.Routing
import io.ktor.server.routing.* import io.ktor.server.routing.application
import io.ktor.server.websocket.* import io.ktor.server.websocket.*
import io.ktor.websocket.send import io.ktor.websocket.send
import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.Flow

View File

@@ -1,7 +1,7 @@
package dev.inmo.micro_utils.ktor.server package dev.inmo.micro_utils.ktor.server
import dev.inmo.micro_utils.ktor.server.configurators.KtorApplicationConfigurator import dev.inmo.micro_utils.ktor.server.configurators.KtorApplicationConfigurator
import io.ktor.server.application.Application import io.ktor.server.application.*
import io.ktor.server.cio.CIO import io.ktor.server.cio.CIO
import io.ktor.server.cio.CIOApplicationEngine import io.ktor.server.cio.CIOApplicationEngine
import io.ktor.server.engine.* import io.ktor.server.engine.*
@@ -11,20 +11,22 @@ fun <TEngine : ApplicationEngine, TConfiguration : ApplicationEngine.Configurati
engine: ApplicationEngineFactory<TEngine, TConfiguration>, engine: ApplicationEngineFactory<TEngine, TConfiguration>,
host: String = "localhost", host: String = "localhost",
port: Int = Random.nextInt(1024, 65535), port: Int = Random.nextInt(1024, 65535),
additionalEngineEnvironmentConfigurator: ApplicationEnvironmentBuilder.() -> Unit = {}, additionalEngineEnvironmentConfigurator: EngineConnectorBuilder.() -> Unit = {},
additionalConfigurationConfigurator: TConfiguration.() -> Unit = {}, additionalConfigurationConfigurator: TConfiguration.() -> Unit = {},
environment: ApplicationEnvironment = applicationEnvironment(),
block: Application.() -> Unit block: Application.() -> Unit
): TEngine = embeddedServer( ): EmbeddedServer<TEngine, TConfiguration> = embeddedServer<TEngine, TConfiguration>(
engine, engine,
applicationEnvironment { environment,
module(block) {
connector { connector {
this.host = host this.host = host
this.port = port this.port = port
additionalEngineEnvironmentConfigurator()
} }
additionalEngineEnvironmentConfigurator() additionalConfigurationConfigurator()
}, },
additionalConfigurationConfigurator module = block
) )
/** /**
@@ -35,15 +37,17 @@ fun <TEngine : ApplicationEngine, TConfiguration : ApplicationEngine.Configurati
fun createKtorServer( fun createKtorServer(
host: String = "localhost", host: String = "localhost",
port: Int = Random.nextInt(1024, 65535), port: Int = Random.nextInt(1024, 65535),
additionalEngineEnvironmentConfigurator: ApplicationEnvironmentBuilder.() -> Unit = {}, additionalEngineEnvironmentConfigurator: EngineConnectorBuilder.() -> Unit = {},
additionalConfigurationConfigurator: CIOApplicationEngine.Configuration.() -> Unit = {}, additionalConfigurationConfigurator: CIOApplicationEngine.Configuration.() -> Unit = {},
environment: ApplicationEnvironment = applicationEnvironment(),
block: Application.() -> Unit block: Application.() -> Unit
): CIOApplicationEngine = createKtorServer( ): EmbeddedServer<CIOApplicationEngine, CIOApplicationEngine.Configuration> = createKtorServer(
CIO, CIO,
host, host,
port, port,
additionalEngineEnvironmentConfigurator, additionalEngineEnvironmentConfigurator,
additionalConfigurationConfigurator, additionalConfigurationConfigurator,
environment,
block block
) )
@@ -51,15 +55,17 @@ fun <TEngine : ApplicationEngine, TConfiguration : ApplicationEngine.Configurati
engine: ApplicationEngineFactory<TEngine, TConfiguration>, engine: ApplicationEngineFactory<TEngine, TConfiguration>,
host: String = "localhost", host: String = "localhost",
port: Int = Random.nextInt(1024, 65535), port: Int = Random.nextInt(1024, 65535),
additionalEngineEnvironmentConfigurator: ApplicationEnvironmentBuilder.() -> Unit = {}, additionalEngineEnvironmentConfigurator: EngineConnectorBuilder.() -> Unit = {},
additionalConfigurationConfigurator: TConfiguration.() -> Unit = {}, additionalConfigurationConfigurator: TConfiguration.() -> Unit = {},
environment: ApplicationEnvironment = applicationEnvironment(),
configurators: List<KtorApplicationConfigurator> configurators: List<KtorApplicationConfigurator>
): TEngine = createKtorServer( ): EmbeddedServer<TEngine, TConfiguration> = createKtorServer(
engine, engine,
host, host,
port, port,
additionalEngineEnvironmentConfigurator, additionalEngineEnvironmentConfigurator,
additionalConfigurationConfigurator additionalConfigurationConfigurator,
environment,
) { ) {
configurators.forEach { it.apply { configure() } } configurators.forEach { it.apply { configure() } }
} }
@@ -73,6 +79,7 @@ fun createKtorServer(
host: String = "localhost", host: String = "localhost",
port: Int = Random.nextInt(1024, 65535), port: Int = Random.nextInt(1024, 65535),
configurators: List<KtorApplicationConfigurator>, configurators: List<KtorApplicationConfigurator>,
additionalEngineEnvironmentConfigurator: ApplicationEnvironmentBuilder.() -> Unit = {}, additionalEngineEnvironmentConfigurator: EngineConnectorBuilder.() -> Unit = {},
additionalConfigurationConfigurator: CIOApplicationEngine.Configuration.() -> Unit = {}, additionalConfigurationConfigurator: CIOApplicationEngine.Configuration.() -> Unit = {},
): ApplicationEngine = createKtorServer(CIO, host, port, additionalEngineEnvironmentConfigurator, additionalConfigurationConfigurator, configurators) environment: ApplicationEnvironment = applicationEnvironment(),
): EmbeddedServer<CIOApplicationEngine, CIOApplicationEngine.Configuration> = createKtorServer(CIO, host, port, additionalEngineEnvironmentConfigurator, additionalConfigurationConfigurator, environment, configurators)

View File

@@ -17,6 +17,7 @@ import io.ktor.server.response.respondText
import io.ktor.server.routing.Routing import io.ktor.server.routing.Routing
import io.ktor.server.routing.post import io.ktor.server.routing.post
import kotlinx.coroutines.* import kotlinx.coroutines.*
import kotlinx.coroutines.channels.BufferOverflow
import kotlinx.coroutines.flow.* import kotlinx.coroutines.flow.*
import kotlinx.coroutines.sync.Mutex import kotlinx.coroutines.sync.Mutex
import kotlinx.coroutines.sync.withLock import kotlinx.coroutines.sync.withLock
@@ -26,7 +27,10 @@ import java.nio.file.attribute.FileTime
class TemporalFilesRoutingConfigurator( class TemporalFilesRoutingConfigurator(
private val subpath: String = DefaultTemporalFilesSubPath, private val subpath: String = DefaultTemporalFilesSubPath,
private val temporalFilesUtilizer: TemporalFilesUtilizer = TemporalFilesUtilizer private val temporalFilesUtilizer: TemporalFilesUtilizer = TemporalFilesUtilizer,
filesFlowReplay: Int = 0,
filesFlowExtraBufferCapacity: Int = Int.MAX_VALUE,
filesFlowOnBufferOverflow: BufferOverflow = BufferOverflow.SUSPEND
) : ApplicationRoutingConfigurator.Element { ) : ApplicationRoutingConfigurator.Element {
interface TemporalFilesUtilizer { interface TemporalFilesUtilizer {
fun start(filesMap: MutableMap<TemporalFileId, MPPFile>, filesMutex: Mutex, onNewFileFlow: Flow<TemporalFileId>): Job fun start(filesMap: MutableMap<TemporalFileId, MPPFile>, filesMutex: Mutex, onNewFileFlow: Flow<TemporalFileId>): Job
@@ -74,7 +78,11 @@ class TemporalFilesRoutingConfigurator(
private val temporalFilesMap = mutableMapOf<TemporalFileId, MPPFile>() private val temporalFilesMap = mutableMapOf<TemporalFileId, MPPFile>()
private val temporalFilesMutex = Mutex() private val temporalFilesMutex = Mutex()
private val filesFlow = MutableSharedFlow<TemporalFileId>() private val filesFlow = MutableSharedFlow<TemporalFileId>(
replay = filesFlowReplay,
extraBufferCapacity = filesFlowExtraBufferCapacity,
onBufferOverflow = filesFlowOnBufferOverflow
)
val utilizerJob = temporalFilesUtilizer.start(temporalFilesMap, temporalFilesMutex, filesFlow.asSharedFlow()) val utilizerJob = temporalFilesUtilizer.start(temporalFilesMap, temporalFilesMutex, filesFlow.asSharedFlow())
override fun Routing.invoke() { override fun Routing.invoke() {
@@ -111,7 +119,7 @@ class TemporalFilesRoutingConfigurator(
temporalFilesMap[fileId] = file temporalFilesMap[fileId] = file
} }
call.respondText(fileId.string) call.respondText(fileId.string)
launchSafelyWithoutExceptions { filesFlow.emit(fileId) } filesFlow.emit(fileId)
} ?: call.respond(HttpStatusCode.BadRequest) } ?: call.respond(HttpStatusCode.BadRequest)
} }
} }

View File

@@ -6,6 +6,7 @@ import dev.inmo.micro_utils.ktor.common.downloadToTempFile
import io.ktor.http.content.* import io.ktor.http.content.*
import io.ktor.server.application.ApplicationCall import io.ktor.server.application.ApplicationCall
import io.ktor.server.request.receiveMultipart import io.ktor.server.request.receiveMultipart
import io.ktor.utils.io.*
import io.ktor.utils.io.core.* import io.ktor.utils.io.core.*
import kotlinx.coroutines.currentCoroutineContext import kotlinx.coroutines.currentCoroutineContext
import kotlinx.coroutines.isActive import kotlinx.coroutines.isActive
@@ -47,7 +48,7 @@ suspend fun ApplicationCall.uniloadMultipart(
onBinaryChannelItem onBinaryChannelItem
) { ) {
when (it.name) { when (it.name) {
"bytes" -> resultInput = it.provider() "bytes" -> resultInput = it.provider().readBuffer()
else -> onCustomFileItem(it) else -> onCustomFileItem(it)
} }
} }

View File

@@ -2,8 +2,7 @@ package dev.inmo.micro_utils.ktor.server.configurators
import dev.inmo.micro_utils.ktor.server.configurators.ApplicationRoutingConfigurator.Element import dev.inmo.micro_utils.ktor.server.configurators.ApplicationRoutingConfigurator.Element
import io.ktor.server.application.* import io.ktor.server.application.*
import io.ktor.server.routing.Routing import io.ktor.server.routing.*
import io.ktor.server.routing.Routing
import kotlinx.serialization.Contextual import kotlinx.serialization.Contextual
import kotlinx.serialization.Serializable import kotlinx.serialization.Serializable
@@ -19,9 +18,7 @@ class ApplicationRoutingConfigurator(
} }
override fun Application.configure() { override fun Application.configure() {
pluginOrNull(Routing) ?.apply { routing {
rootInstaller.apply { invoke() }
} ?: install(Routing) {
rootInstaller.apply { invoke() } rootInstaller.apply { invoke() }
} }
} }

View File

@@ -8,7 +8,7 @@ import dev.inmo.micro_utils.repos.ktor.common.key_value.*
import io.ktor.client.HttpClient import io.ktor.client.HttpClient
import io.ktor.client.request.post import io.ktor.client.request.post
import io.ktor.http.* import io.ktor.http.*
import io.ktor.util.InternalAPI import io.ktor.utils.io.InternalAPI
import io.ktor.util.reflect.TypeInfo import io.ktor.util.reflect.TypeInfo
import io.ktor.util.reflect.typeInfo import io.ktor.util.reflect.typeInfo
import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.Flow

View File

@@ -8,7 +8,7 @@ import dev.inmo.micro_utils.repos.ktor.common.one_to_many.*
import io.ktor.client.HttpClient import io.ktor.client.HttpClient
import io.ktor.client.request.post import io.ktor.client.request.post
import io.ktor.http.* import io.ktor.http.*
import io.ktor.util.InternalAPI import io.ktor.utils.io.InternalAPI
import io.ktor.util.reflect.TypeInfo import io.ktor.util.reflect.TypeInfo
import io.ktor.util.reflect.typeInfo import io.ktor.util.reflect.typeInfo
import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.Flow

View File

@@ -16,7 +16,7 @@ import io.ktor.server.application.call
import io.ktor.server.response.respond import io.ktor.server.response.respond
import io.ktor.server.routing.Routing import io.ktor.server.routing.Routing
import io.ktor.server.routing.get import io.ktor.server.routing.get
import io.ktor.util.InternalAPI import io.ktor.utils.io.InternalAPI
import io.ktor.util.reflect.typeInfo import io.ktor.util.reflect.typeInfo
import kotlinx.serialization.* import kotlinx.serialization.*

View File

@@ -14,7 +14,7 @@ import io.ktor.server.application.call
import io.ktor.server.response.respond import io.ktor.server.response.respond
import io.ktor.server.routing.Routing import io.ktor.server.routing.Routing
import io.ktor.server.routing.get import io.ktor.server.routing.get
import io.ktor.util.InternalAPI import io.ktor.utils.io.InternalAPI
import io.ktor.util.reflect.typeInfo import io.ktor.util.reflect.typeInfo
import kotlinx.serialization.* import kotlinx.serialization.*