mirror of
https://github.com/InsanusMokrassar/MicroUtils.git
synced 2026-09-13 11:44:20 +00:00
Revert "Revert "migrations onto new libraries""
This reverts commit e68735d061.
This commit is contained in:
@@ -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
|
||||||
|
|||||||
@@ -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()
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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() }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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.*
|
||||||
|
|
||||||
|
|||||||
@@ -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.*
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user