mirror of
https://github.com/InsanusMokrassar/MicroUtils.git
synced 2024-11-22 16:23:50 +00:00
migration onto new ktor and other dependencies
This commit is contained in:
parent
eba44cd394
commit
8364020671
@ -21,6 +21,7 @@ allprojects {
|
|||||||
mavenLocal()
|
mavenLocal()
|
||||||
mavenCentral()
|
mavenCentral()
|
||||||
google()
|
google()
|
||||||
|
maven { url "https://maven.pkg.jetbrains.space/public/p/compose/dev" }
|
||||||
}
|
}
|
||||||
|
|
||||||
// temporal crutch until legacy tests will be stabled or legacy target will be removed
|
// temporal crutch until legacy tests will be stabled or legacy target will be removed
|
||||||
|
@ -27,13 +27,6 @@ sealed interface Either<T1, T2> {
|
|||||||
@Deprecated("Use optionalT2 instead", ReplaceWith("optionalT2"))
|
@Deprecated("Use optionalT2 instead", ReplaceWith("optionalT2"))
|
||||||
val t2: T2?
|
val t2: T2?
|
||||||
get() = optionalT2.dataOrNull()
|
get() = optionalT2.dataOrNull()
|
||||||
|
|
||||||
companion object {
|
|
||||||
fun <T1, T2> serializer(
|
|
||||||
t1Serializer: KSerializer<T1>,
|
|
||||||
t2Serializer: KSerializer<T2>,
|
|
||||||
): KSerializer<Either<T1, T2>> = EitherSerializer(t1Serializer, t2Serializer)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
class EitherSerializer<T1, T2>(
|
class EitherSerializer<T1, T2>(
|
||||||
|
@ -32,7 +32,7 @@ class DiffUtilsTests {
|
|||||||
val withIndex = oldList.withIndex()
|
val withIndex = oldList.withIndex()
|
||||||
|
|
||||||
for (count in 1 .. (floor(oldList.size.toFloat() / 2).toInt())) {
|
for (count in 1 .. (floor(oldList.size.toFloat() / 2).toInt())) {
|
||||||
for ((i, v) in withIndex) {
|
for ((i, _) in withIndex) {
|
||||||
if (i + count > oldList.lastIndex) {
|
if (i + count > oldList.lastIndex) {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
@ -55,7 +55,7 @@ class DiffUtilsTests {
|
|||||||
val withIndex = oldList.withIndex()
|
val withIndex = oldList.withIndex()
|
||||||
|
|
||||||
for (step in oldList.indices) {
|
for (step in oldList.indices) {
|
||||||
for ((i, v) in withIndex) {
|
for ((i, _) in withIndex) {
|
||||||
val mutable = oldList.toMutableList()
|
val mutable = oldList.toMutableList()
|
||||||
val changes = (
|
val changes = (
|
||||||
if (step == 0) i until oldList.size else (i until oldList.size step step)
|
if (step == 0) i until oldList.size else (i until oldList.size step step)
|
||||||
@ -104,7 +104,7 @@ class DiffUtilsTests {
|
|||||||
val withIndex = oldList.withIndex()
|
val withIndex = oldList.withIndex()
|
||||||
|
|
||||||
for (count in 1 .. (floor(oldList.size.toFloat() / 2).toInt())) {
|
for (count in 1 .. (floor(oldList.size.toFloat() / 2).toInt())) {
|
||||||
for ((i, v) in withIndex) {
|
for ((i, _) in withIndex) {
|
||||||
if (i + count > oldList.lastIndex) {
|
if (i + count > oldList.lastIndex) {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
@ -129,15 +129,20 @@ class DiffUtilsTests {
|
|||||||
val withIndex = oldList.withIndex()
|
val withIndex = oldList.withIndex()
|
||||||
|
|
||||||
for (step in oldList.indices) {
|
for (step in oldList.indices) {
|
||||||
for ((i, v) in withIndex) {
|
for ((i, _) in withIndex) {
|
||||||
val mutable = oldList.toMutableList()
|
val mutable = oldList.toMutableList()
|
||||||
val changes = (
|
|
||||||
if (step == 0) i until oldList.size else (i until oldList.size step step)
|
val newList = if (step == 0) {
|
||||||
).map { index ->
|
i until oldList.size
|
||||||
|
} else {
|
||||||
|
i until oldList.size step step
|
||||||
|
}
|
||||||
|
newList.forEach { index ->
|
||||||
IndexedValue(index, mutable[index]) to IndexedValue(index, "changed$index").also {
|
IndexedValue(index, mutable[index]) to IndexedValue(index, "changed$index").also {
|
||||||
mutable[index] = it.value
|
mutable[index] = it.value
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
val mutableOldList = oldList.toMutableList()
|
val mutableOldList = oldList.toMutableList()
|
||||||
mutableOldList.applyDiff(mutable)
|
mutableOldList.applyDiff(mutable)
|
||||||
assertEquals(
|
assertEquals(
|
||||||
|
@ -16,6 +16,7 @@ fun <T> Flow<T>.toMutableState(
|
|||||||
return state
|
return state
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Suppress("NOTHING_TO_INLINE")
|
||||||
inline fun <T> StateFlow<T>.toMutableState(
|
inline fun <T> StateFlow<T>.toMutableState(
|
||||||
scope: CoroutineScope
|
scope: CoroutineScope
|
||||||
): MutableState<T> = toMutableState(value, scope)
|
): MutableState<T> = toMutableState(value, scope)
|
||||||
|
@ -46,6 +46,8 @@ ktor-server = { module = "io.ktor:ktor-server", version.ref = "ktor" }
|
|||||||
ktor-server-cio = { module = "io.ktor:ktor-server-cio", version.ref = "ktor" }
|
ktor-server-cio = { module = "io.ktor:ktor-server-cio", version.ref = "ktor" }
|
||||||
ktor-server-host-common = { module = "io.ktor:ktor-server-host-common", version.ref = "ktor" }
|
ktor-server-host-common = { module = "io.ktor:ktor-server-host-common", version.ref = "ktor" }
|
||||||
ktor-websockets = { module = "io.ktor:ktor-websockets", version.ref = "ktor" }
|
ktor-websockets = { module = "io.ktor:ktor-websockets", version.ref = "ktor" }
|
||||||
|
ktor-server-websockets = { module = "io.ktor:ktor-server-websockets", version.ref = "ktor" }
|
||||||
|
ktor-server-statusPages = { module = "io.ktor:ktor-server-status-pages", version.ref = "ktor" }
|
||||||
|
|
||||||
|
|
||||||
klock = { module = "com.soywiz.korlibs.klock:klock", version.ref = "klock" }
|
klock = { module = "com.soywiz.korlibs.klock:klock", version.ref = "klock" }
|
||||||
|
@ -3,10 +3,10 @@ package dev.inmo.micro_utils.ktor.client
|
|||||||
import dev.inmo.micro_utils.coroutines.safely
|
import dev.inmo.micro_utils.coroutines.safely
|
||||||
import dev.inmo.micro_utils.ktor.common.*
|
import dev.inmo.micro_utils.ktor.common.*
|
||||||
import io.ktor.client.HttpClient
|
import io.ktor.client.HttpClient
|
||||||
import io.ktor.client.features.websocket.ws
|
import io.ktor.client.plugins.websocket.ws
|
||||||
import io.ktor.client.request.HttpRequestBuilder
|
import io.ktor.client.request.HttpRequestBuilder
|
||||||
import io.ktor.http.cio.websocket.Frame
|
import io.ktor.websocket.Frame
|
||||||
import io.ktor.http.cio.websocket.readBytes
|
import io.ktor.websocket.readBytes
|
||||||
import kotlinx.coroutines.flow.Flow
|
import kotlinx.coroutines.flow.Flow
|
||||||
import kotlinx.coroutines.flow.channelFlow
|
import kotlinx.coroutines.flow.channelFlow
|
||||||
import kotlinx.serialization.DeserializationStrategy
|
import kotlinx.serialization.DeserializationStrategy
|
||||||
|
@ -6,6 +6,7 @@ import dev.inmo.micro_utils.ktor.common.*
|
|||||||
import io.ktor.client.HttpClient
|
import io.ktor.client.HttpClient
|
||||||
import io.ktor.client.request.*
|
import io.ktor.client.request.*
|
||||||
import io.ktor.client.request.forms.*
|
import io.ktor.client.request.forms.*
|
||||||
|
import io.ktor.client.statement.readBytes
|
||||||
import io.ktor.http.*
|
import io.ktor.http.*
|
||||||
import io.ktor.utils.io.core.ByteReadPacket
|
import io.ktor.utils.io.core.ByteReadPacket
|
||||||
import kotlinx.serialization.*
|
import kotlinx.serialization.*
|
||||||
@ -103,10 +104,10 @@ suspend fun <ResultType> HttpClient.uniget(
|
|||||||
url: String,
|
url: String,
|
||||||
resultDeserializer: DeserializationStrategy<ResultType>,
|
resultDeserializer: DeserializationStrategy<ResultType>,
|
||||||
serialFormat: StandardKtorSerialFormat = standardKtorSerialFormat
|
serialFormat: StandardKtorSerialFormat = standardKtorSerialFormat
|
||||||
) = get<StandardKtorSerialInputData>(
|
) = get(
|
||||||
url
|
url
|
||||||
).let {
|
).let {
|
||||||
serialFormat.decodeDefault(resultDeserializer, it)
|
serialFormat.decodeDefault(resultDeserializer, it.readBytes())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -123,10 +124,12 @@ suspend fun <BodyType, ResultType> HttpClient.unipost(
|
|||||||
bodyInfo: BodyPair<BodyType>,
|
bodyInfo: BodyPair<BodyType>,
|
||||||
resultDeserializer: DeserializationStrategy<ResultType>,
|
resultDeserializer: DeserializationStrategy<ResultType>,
|
||||||
serialFormat: StandardKtorSerialFormat = standardKtorSerialFormat
|
serialFormat: StandardKtorSerialFormat = standardKtorSerialFormat
|
||||||
) = post<StandardKtorSerialInputData>(url) {
|
) = post(url) {
|
||||||
body = serialFormat.encodeDefault(bodyInfo.first, bodyInfo.second)
|
setBody(
|
||||||
|
serialFormat.encodeDefault(bodyInfo.first, bodyInfo.second)
|
||||||
|
)
|
||||||
}.let {
|
}.let {
|
||||||
serialFormat.decodeDefault(resultDeserializer, it)
|
serialFormat.decodeDefault(resultDeserializer, it.readBytes())
|
||||||
}
|
}
|
||||||
|
|
||||||
suspend fun <ResultType> HttpClient.unimultipart(
|
suspend fun <ResultType> HttpClient.unimultipart(
|
||||||
@ -139,7 +142,7 @@ suspend fun <ResultType> HttpClient.unimultipart(
|
|||||||
dataHeadersBuilder: HeadersBuilder.() -> Unit = {},
|
dataHeadersBuilder: HeadersBuilder.() -> Unit = {},
|
||||||
requestBuilder: HttpRequestBuilder.() -> Unit = {},
|
requestBuilder: HttpRequestBuilder.() -> Unit = {},
|
||||||
serialFormat: StandardKtorSerialFormat = standardKtorSerialFormat
|
serialFormat: StandardKtorSerialFormat = standardKtorSerialFormat
|
||||||
): ResultType = submitFormWithBinaryData<StandardKtorSerialInputData>(
|
): ResultType = submitFormWithBinaryData(
|
||||||
url,
|
url,
|
||||||
formData = formData {
|
formData = formData {
|
||||||
append(
|
append(
|
||||||
@ -155,7 +158,7 @@ suspend fun <ResultType> HttpClient.unimultipart(
|
|||||||
}
|
}
|
||||||
) {
|
) {
|
||||||
requestBuilder()
|
requestBuilder()
|
||||||
}.let { serialFormat.decodeDefault(resultDeserializer, it) }
|
}.let { serialFormat.decodeDefault(resultDeserializer, it.readBytes()) }
|
||||||
|
|
||||||
suspend fun <BodyType, ResultType> HttpClient.unimultipart(
|
suspend fun <BodyType, ResultType> HttpClient.unimultipart(
|
||||||
url: String,
|
url: String,
|
||||||
|
@ -4,9 +4,10 @@ import dev.inmo.micro_utils.common.MPPFile
|
|||||||
import dev.inmo.micro_utils.common.filename
|
import dev.inmo.micro_utils.common.filename
|
||||||
import dev.inmo.micro_utils.ktor.common.TemporalFileId
|
import dev.inmo.micro_utils.ktor.common.TemporalFileId
|
||||||
import io.ktor.client.HttpClient
|
import io.ktor.client.HttpClient
|
||||||
import io.ktor.client.features.onUpload
|
import io.ktor.client.plugins.onUpload
|
||||||
import io.ktor.client.request.forms.formData
|
import io.ktor.client.request.forms.formData
|
||||||
import io.ktor.client.request.forms.submitFormWithBinaryData
|
import io.ktor.client.request.forms.submitFormWithBinaryData
|
||||||
|
import io.ktor.client.statement.bodyAsText
|
||||||
import io.ktor.http.Headers
|
import io.ktor.http.Headers
|
||||||
import io.ktor.http.HttpHeaders
|
import io.ktor.http.HttpHeaders
|
||||||
import java.net.URLConnection
|
import java.net.URLConnection
|
||||||
@ -20,7 +21,7 @@ actual suspend fun HttpClient.tempUpload(
|
|||||||
onUpload: (Long, Long) -> Unit
|
onUpload: (Long, Long) -> Unit
|
||||||
): TemporalFileId {
|
): TemporalFileId {
|
||||||
val inputProvider = file.inputProvider()
|
val inputProvider = file.inputProvider()
|
||||||
val fileId = submitFormWithBinaryData<String>(
|
val fileId = submitFormWithBinaryData(
|
||||||
fullTempUploadDraftPath,
|
fullTempUploadDraftPath,
|
||||||
formData = formData {
|
formData = formData {
|
||||||
append(
|
append(
|
||||||
@ -34,6 +35,6 @@ actual suspend fun HttpClient.tempUpload(
|
|||||||
}
|
}
|
||||||
) {
|
) {
|
||||||
onUpload(onUpload)
|
onUpload(onUpload)
|
||||||
}
|
}.bodyAsText()
|
||||||
return TemporalFileId(fileId)
|
return TemporalFileId(fileId)
|
||||||
}
|
}
|
||||||
|
@ -19,7 +19,8 @@ kotlin {
|
|||||||
api libs.ktor.server
|
api libs.ktor.server
|
||||||
api libs.ktor.server.cio
|
api libs.ktor.server.cio
|
||||||
api libs.ktor.server.host.common
|
api libs.ktor.server.host.common
|
||||||
api libs.ktor.websockets
|
api libs.ktor.server.websockets
|
||||||
|
api libs.ktor.server.statusPages
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2,13 +2,13 @@ package dev.inmo.micro_utils.ktor.server
|
|||||||
|
|
||||||
import dev.inmo.micro_utils.coroutines.safely
|
import dev.inmo.micro_utils.coroutines.safely
|
||||||
import dev.inmo.micro_utils.ktor.common.*
|
import dev.inmo.micro_utils.ktor.common.*
|
||||||
import io.ktor.application.featureOrNull
|
|
||||||
import io.ktor.application.install
|
|
||||||
import io.ktor.http.URLProtocol
|
import io.ktor.http.URLProtocol
|
||||||
import io.ktor.http.cio.websocket.*
|
import io.ktor.server.application.install
|
||||||
import io.ktor.routing.Route
|
import io.ktor.server.application.pluginOrNull
|
||||||
import io.ktor.routing.application
|
import io.ktor.server.routing.Route
|
||||||
import io.ktor.websocket.*
|
import io.ktor.server.routing.application
|
||||||
|
import io.ktor.server.websocket.*
|
||||||
|
import io.ktor.websocket.send
|
||||||
import kotlinx.coroutines.flow.Flow
|
import kotlinx.coroutines.flow.Flow
|
||||||
import kotlinx.serialization.SerializationStrategy
|
import kotlinx.serialization.SerializationStrategy
|
||||||
|
|
||||||
@ -19,7 +19,7 @@ fun <T> Route.includeWebsocketHandling(
|
|||||||
converter: suspend WebSocketServerSession.(T) -> StandardKtorSerialInputData?
|
converter: suspend WebSocketServerSession.(T) -> StandardKtorSerialInputData?
|
||||||
) {
|
) {
|
||||||
application.apply {
|
application.apply {
|
||||||
featureOrNull(io.ktor.websocket.WebSockets) ?: install(io.ktor.websocket.WebSockets)
|
pluginOrNull(WebSockets) ?: install(WebSockets)
|
||||||
}
|
}
|
||||||
webSocket(suburl, protocol.name) {
|
webSocket(suburl, protocol.name) {
|
||||||
safely {
|
safely {
|
||||||
|
@ -3,25 +3,23 @@ package dev.inmo.micro_utils.ktor.server
|
|||||||
import dev.inmo.micro_utils.common.*
|
import dev.inmo.micro_utils.common.*
|
||||||
import dev.inmo.micro_utils.coroutines.safely
|
import dev.inmo.micro_utils.coroutines.safely
|
||||||
import dev.inmo.micro_utils.ktor.common.*
|
import dev.inmo.micro_utils.ktor.common.*
|
||||||
import io.ktor.application.ApplicationCall
|
|
||||||
import io.ktor.application.call
|
|
||||||
import io.ktor.http.*
|
import io.ktor.http.*
|
||||||
import io.ktor.http.content.PartData
|
import io.ktor.http.content.*
|
||||||
import io.ktor.http.content.forEachPart
|
import io.ktor.server.application.ApplicationCall
|
||||||
import io.ktor.request.receive
|
import io.ktor.server.application.call
|
||||||
import io.ktor.request.receiveMultipart
|
import io.ktor.server.request.receive
|
||||||
import io.ktor.response.respond
|
import io.ktor.server.request.receiveMultipart
|
||||||
import io.ktor.response.respondBytes
|
import io.ktor.server.response.respond
|
||||||
import io.ktor.routing.Route
|
import io.ktor.server.response.respondBytes
|
||||||
import io.ktor.util.asStream
|
import io.ktor.server.routing.Route
|
||||||
import io.ktor.util.cio.writeChannel
|
import io.ktor.server.websocket.WebSocketServerSession
|
||||||
import io.ktor.util.pipeline.PipelineContext
|
import io.ktor.util.pipeline.PipelineContext
|
||||||
import io.ktor.utils.io.core.*
|
import io.ktor.utils.io.core.Input
|
||||||
import io.ktor.websocket.WebSocketServerSession
|
import io.ktor.utils.io.core.use
|
||||||
|
import io.ktor.utils.io.streams.asInput
|
||||||
import kotlinx.coroutines.flow.Flow
|
import kotlinx.coroutines.flow.Flow
|
||||||
import kotlinx.serialization.*
|
import kotlinx.serialization.DeserializationStrategy
|
||||||
import java.io.File
|
import kotlinx.serialization.SerializationStrategy
|
||||||
import java.io.File.createTempFile
|
|
||||||
|
|
||||||
class UnifiedRouter(
|
class UnifiedRouter(
|
||||||
val serialFormat: StandardKtorSerialFormat = standardKtorSerialFormat,
|
val serialFormat: StandardKtorSerialFormat = standardKtorSerialFormat,
|
||||||
@ -134,7 +132,7 @@ suspend fun ApplicationCall.uniloadMultipart(
|
|||||||
is PartData.FormItem -> onFormItem(it)
|
is PartData.FormItem -> onFormItem(it)
|
||||||
is PartData.FileItem -> {
|
is PartData.FileItem -> {
|
||||||
when (it.name) {
|
when (it.name) {
|
||||||
"bytes" -> resultInput = it.provider()
|
"bytes" -> resultInput = it.streamProvider().asInput()
|
||||||
else -> onCustomFileItem(it)
|
else -> onCustomFileItem(it)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -156,7 +154,7 @@ suspend fun <T> ApplicationCall.uniloadMultipart(
|
|||||||
onFormItem,
|
onFormItem,
|
||||||
{
|
{
|
||||||
if (it.name == "data") {
|
if (it.name == "data") {
|
||||||
data = standardKtorSerialFormat.decodeDefault(deserializer, it.provider().readBytes()).optional
|
data = standardKtorSerialFormat.decodeDefault(deserializer, it.streamProvider().readBytes()).optional
|
||||||
} else {
|
} else {
|
||||||
onCustomFileItem(it)
|
onCustomFileItem(it)
|
||||||
}
|
}
|
||||||
@ -197,11 +195,13 @@ suspend fun <T> ApplicationCall.uniloadMultipartFile(
|
|||||||
".${name.extension}"
|
".${name.extension}"
|
||||||
).apply {
|
).apply {
|
||||||
outputStream().use { fileStream ->
|
outputStream().use { fileStream ->
|
||||||
it.provider().asStream().copyTo(fileStream)
|
it.streamProvider().use {
|
||||||
|
it.copyTo(fileStream)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
"data" -> data = standardKtorSerialFormat.decodeDefault(deserializer, it.provider().readBytes()).optional
|
"data" -> data = standardKtorSerialFormat.decodeDefault(deserializer, it.streamProvider().readBytes()).optional
|
||||||
else -> onCustomFileItem(it)
|
else -> onCustomFileItem(it)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -239,7 +239,9 @@ suspend fun ApplicationCall.uniloadMultipartFile(
|
|||||||
".${name.extension}"
|
".${name.extension}"
|
||||||
).apply {
|
).apply {
|
||||||
outputStream().use { fileStream ->
|
outputStream().use { fileStream ->
|
||||||
it.provider().asStream().copyTo(fileStream)
|
it.streamProvider().use {
|
||||||
|
it.copyTo(fileStream)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
@ -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.application.Application
|
import io.ktor.server.application.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.*
|
||||||
|
@ -7,14 +7,14 @@ import dev.inmo.micro_utils.coroutines.launchSafelyWithoutExceptions
|
|||||||
import dev.inmo.micro_utils.ktor.common.DefaultTemporalFilesSubPath
|
import dev.inmo.micro_utils.ktor.common.DefaultTemporalFilesSubPath
|
||||||
import dev.inmo.micro_utils.ktor.common.TemporalFileId
|
import dev.inmo.micro_utils.ktor.common.TemporalFileId
|
||||||
import dev.inmo.micro_utils.ktor.server.configurators.ApplicationRoutingConfigurator
|
import dev.inmo.micro_utils.ktor.server.configurators.ApplicationRoutingConfigurator
|
||||||
import io.ktor.application.call
|
|
||||||
import io.ktor.http.HttpStatusCode
|
import io.ktor.http.HttpStatusCode
|
||||||
import io.ktor.http.content.PartData
|
import io.ktor.http.content.PartData
|
||||||
import io.ktor.http.content.streamProvider
|
import io.ktor.http.content.streamProvider
|
||||||
import io.ktor.request.receiveMultipart
|
import io.ktor.server.application.call
|
||||||
import io.ktor.response.respond
|
import io.ktor.server.request.receiveMultipart
|
||||||
import io.ktor.routing.Route
|
import io.ktor.server.response.respond
|
||||||
import io.ktor.routing.post
|
import io.ktor.server.routing.Route
|
||||||
|
import io.ktor.server.routing.post
|
||||||
import kotlinx.coroutines.*
|
import kotlinx.coroutines.*
|
||||||
import kotlinx.coroutines.flow.*
|
import kotlinx.coroutines.flow.*
|
||||||
import kotlinx.coroutines.sync.Mutex
|
import kotlinx.coroutines.sync.Mutex
|
||||||
|
@ -1,14 +1,15 @@
|
|||||||
package dev.inmo.micro_utils.ktor.server.configurators
|
package dev.inmo.micro_utils.ktor.server.configurators
|
||||||
|
|
||||||
import io.ktor.application.Application
|
import io.ktor.server.application.Application
|
||||||
import io.ktor.application.install
|
import io.ktor.server.application.install
|
||||||
import io.ktor.features.CachingHeaders
|
import io.ktor.server.plugins.cachingheaders.CachingHeaders
|
||||||
|
import io.ktor.server.plugins.cachingheaders.CachingHeadersConfig
|
||||||
import kotlinx.serialization.Contextual
|
import kotlinx.serialization.Contextual
|
||||||
|
|
||||||
data class ApplicationCachingHeadersConfigurator(
|
data class ApplicationCachingHeadersConfigurator(
|
||||||
private val elements: List<@Contextual Element>
|
private val elements: List<@Contextual Element>
|
||||||
) : KtorApplicationConfigurator {
|
) : KtorApplicationConfigurator {
|
||||||
fun interface Element { operator fun CachingHeaders.Configuration.invoke() }
|
fun interface Element { operator fun CachingHeadersConfig.invoke() }
|
||||||
|
|
||||||
override fun Application.configure() {
|
override fun Application.configure() {
|
||||||
install(CachingHeaders) {
|
install(CachingHeaders) {
|
||||||
|
@ -1,8 +1,9 @@
|
|||||||
package dev.inmo.micro_utils.ktor.server.configurators
|
package dev.inmo.micro_utils.ktor.server.configurators
|
||||||
|
|
||||||
import io.ktor.application.*
|
import dev.inmo.micro_utils.ktor.server.configurators.ApplicationRoutingConfigurator.Element
|
||||||
import io.ktor.routing.Route
|
import io.ktor.server.application.*
|
||||||
import io.ktor.routing.Routing
|
import io.ktor.server.routing.Route
|
||||||
|
import io.ktor.server.routing.Routing
|
||||||
import kotlinx.serialization.Contextual
|
import kotlinx.serialization.Contextual
|
||||||
import kotlinx.serialization.Serializable
|
import kotlinx.serialization.Serializable
|
||||||
|
|
||||||
@ -18,7 +19,7 @@ class ApplicationRoutingConfigurator(
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun Application.configure() {
|
override fun Application.configure() {
|
||||||
featureOrNull(Routing) ?.apply {
|
pluginOrNull(Routing) ?.apply {
|
||||||
rootInstaller.apply { invoke() }
|
rootInstaller.apply { invoke() }
|
||||||
} ?: install(Routing) {
|
} ?: install(Routing) {
|
||||||
rootInstaller.apply { invoke() }
|
rootInstaller.apply { invoke() }
|
||||||
|
@ -1,14 +1,15 @@
|
|||||||
package dev.inmo.micro_utils.ktor.server.configurators
|
package dev.inmo.micro_utils.ktor.server.configurators
|
||||||
|
|
||||||
import io.ktor.application.Application
|
import io.ktor.server.application.Application
|
||||||
import io.ktor.application.install
|
import io.ktor.server.application.install
|
||||||
import io.ktor.sessions.Sessions
|
import io.ktor.server.sessions.Sessions
|
||||||
|
import io.ktor.server.sessions.SessionsConfig
|
||||||
import kotlinx.serialization.Contextual
|
import kotlinx.serialization.Contextual
|
||||||
|
|
||||||
class ApplicationSessionsConfigurator(
|
class ApplicationSessionsConfigurator(
|
||||||
private val elements: List<@Contextual Element>
|
private val elements: List<@Contextual Element>
|
||||||
) : KtorApplicationConfigurator {
|
) : KtorApplicationConfigurator {
|
||||||
fun interface Element { operator fun Sessions.Configuration.invoke() }
|
fun interface Element { operator fun SessionsConfig.invoke() }
|
||||||
|
|
||||||
override fun Application.configure() {
|
override fun Application.configure() {
|
||||||
install(Sessions) {
|
install(Sessions) {
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
package dev.inmo.micro_utils.ktor.server.configurators
|
package dev.inmo.micro_utils.ktor.server.configurators
|
||||||
|
|
||||||
import io.ktor.application.Application
|
import io.ktor.server.application.Application
|
||||||
|
|
||||||
interface KtorApplicationConfigurator {
|
interface KtorApplicationConfigurator {
|
||||||
fun Application.configure()
|
fun Application.configure()
|
||||||
|
@ -1,14 +1,15 @@
|
|||||||
package dev.inmo.micro_utils.ktor.server.configurators
|
package dev.inmo.micro_utils.ktor.server.configurators
|
||||||
|
|
||||||
import io.ktor.application.Application
|
import io.ktor.server.application.Application
|
||||||
import io.ktor.application.install
|
import io.ktor.server.application.install
|
||||||
import io.ktor.features.StatusPages
|
import io.ktor.server.plugins.statuspages.StatusPages
|
||||||
|
import io.ktor.server.plugins.statuspages.StatusPagesConfig
|
||||||
import kotlinx.serialization.Contextual
|
import kotlinx.serialization.Contextual
|
||||||
|
|
||||||
class StatusPagesConfigurator(
|
class StatusPagesConfigurator(
|
||||||
private val elements: List<@Contextual Element>
|
private val elements: List<@Contextual Element>
|
||||||
) : KtorApplicationConfigurator {
|
) : KtorApplicationConfigurator {
|
||||||
fun interface Element { operator fun StatusPages.Configuration.invoke() }
|
fun interface Element { operator fun StatusPagesConfig.invoke() }
|
||||||
|
|
||||||
override fun Application.configure() {
|
override fun Application.configure() {
|
||||||
install(StatusPages) {
|
install(StatusPages) {
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
import io.ktor.client.HttpClient
|
import io.ktor.client.HttpClient
|
||||||
import io.ktor.client.request.get
|
import io.ktor.client.request.get
|
||||||
|
import io.ktor.client.statement.bodyAsText
|
||||||
import kotlinx.serialization.SerialName
|
import kotlinx.serialization.SerialName
|
||||||
import kotlinx.serialization.Serializable
|
import kotlinx.serialization.Serializable
|
||||||
import kotlinx.serialization.builtins.ListSerializer
|
import kotlinx.serialization.builtins.ListSerializer
|
||||||
@ -164,7 +165,7 @@ suspend fun main(vararg args: String) {
|
|||||||
|
|
||||||
val ietfLanguageCodes = json.decodeFromString(
|
val ietfLanguageCodes = json.decodeFromString(
|
||||||
ListSerializer(LanguageCode.serializer()),
|
ListSerializer(LanguageCode.serializer()),
|
||||||
client.get(ietfLanguageCodesLink)
|
client.get(ietfLanguageCodesLink).bodyAsText()
|
||||||
).map {
|
).map {
|
||||||
it.copy(
|
it.copy(
|
||||||
title = it.title
|
title = it.title
|
||||||
@ -175,7 +176,7 @@ suspend fun main(vararg args: String) {
|
|||||||
}
|
}
|
||||||
val ietfLanguageCodesWithTagsMap = json.decodeFromString(
|
val ietfLanguageCodesWithTagsMap = json.decodeFromString(
|
||||||
ListSerializer(LanguageCodeWithTag.serializer()),
|
ListSerializer(LanguageCodeWithTag.serializer()),
|
||||||
client.get(ietfLanguageCodesAdditionalTagsLink)
|
client.get(ietfLanguageCodesAdditionalTagsLink).bodyAsText()
|
||||||
).filter { it.withSubtag != it.tag }.groupBy { it.tag }
|
).filter { it.withSubtag != it.tag }.groupBy { it.tag }
|
||||||
|
|
||||||
val tags = ietfLanguageCodes.map {
|
val tags = ietfLanguageCodes.map {
|
||||||
|
@ -1,7 +1,6 @@
|
|||||||
package dev.inmo.micro_utils.mime_types
|
package dev.inmo.micro_utils.mime_types
|
||||||
|
|
||||||
import kotlinx.serialization.KSerializer
|
import kotlinx.serialization.*
|
||||||
import kotlinx.serialization.Serializer
|
|
||||||
import kotlinx.serialization.descriptors.*
|
import kotlinx.serialization.descriptors.*
|
||||||
import kotlinx.serialization.encoding.Decoder
|
import kotlinx.serialization.encoding.Decoder
|
||||||
import kotlinx.serialization.encoding.Encoder
|
import kotlinx.serialization.encoding.Encoder
|
||||||
@ -16,6 +15,7 @@ fun mimeType(raw: String) = mimesCache.getOrPut(raw) {
|
|||||||
|
|
||||||
internal fun parseMimeType(raw: String): MimeType = CustomMimeType(raw)
|
internal fun parseMimeType(raw: String): MimeType = CustomMimeType(raw)
|
||||||
|
|
||||||
|
@Suppress("OPT_IN_USAGE")
|
||||||
@Serializer(MimeType::class)
|
@Serializer(MimeType::class)
|
||||||
object MimeTypeSerializer : KSerializer<MimeType> {
|
object MimeTypeSerializer : KSerializer<MimeType> {
|
||||||
override val descriptor: SerialDescriptor = PrimitiveSerialDescriptor("mimeType", PrimitiveKind.STRING)
|
override val descriptor: SerialDescriptor = PrimitiveSerialDescriptor("mimeType", PrimitiveKind.STRING)
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
package dev.inmo.micro_utils.pagination
|
package dev.inmo.micro_utils.pagination
|
||||||
|
|
||||||
import io.ktor.application.ApplicationCall
|
|
||||||
import io.ktor.http.Parameters
|
import io.ktor.http.Parameters
|
||||||
|
import io.ktor.server.application.ApplicationCall
|
||||||
|
|
||||||
val Parameters.extractPagination: Pagination
|
val Parameters.extractPagination: Pagination
|
||||||
get() = SimplePagination(
|
get() = SimplePagination(
|
||||||
|
@ -7,10 +7,10 @@ import dev.inmo.micro_utils.pagination.PaginationResult
|
|||||||
import dev.inmo.micro_utils.pagination.extractPagination
|
import dev.inmo.micro_utils.pagination.extractPagination
|
||||||
import dev.inmo.micro_utils.repos.ReadStandardCRUDRepo
|
import dev.inmo.micro_utils.repos.ReadStandardCRUDRepo
|
||||||
import dev.inmo.micro_utils.repos.ktor.common.crud.*
|
import dev.inmo.micro_utils.repos.ktor.common.crud.*
|
||||||
import io.ktor.application.call
|
|
||||||
import io.ktor.http.ContentType
|
import io.ktor.http.ContentType
|
||||||
import io.ktor.routing.Route
|
import io.ktor.server.application.call
|
||||||
import io.ktor.routing.get
|
import io.ktor.server.routing.Route
|
||||||
|
import io.ktor.server.routing.get
|
||||||
import kotlinx.serialization.KSerializer
|
import kotlinx.serialization.KSerializer
|
||||||
import kotlinx.serialization.builtins.serializer
|
import kotlinx.serialization.builtins.serializer
|
||||||
|
|
||||||
|
@ -6,8 +6,8 @@ import dev.inmo.micro_utils.ktor.server.UnifiedRouter
|
|||||||
import dev.inmo.micro_utils.ktor.server.standardKtorSerialFormatContentType
|
import dev.inmo.micro_utils.ktor.server.standardKtorSerialFormatContentType
|
||||||
import dev.inmo.micro_utils.repos.StandardCRUDRepo
|
import dev.inmo.micro_utils.repos.StandardCRUDRepo
|
||||||
import io.ktor.http.ContentType
|
import io.ktor.http.ContentType
|
||||||
import io.ktor.routing.Route
|
import io.ktor.server.routing.Route
|
||||||
import io.ktor.routing.route
|
import io.ktor.server.routing.route
|
||||||
import kotlinx.serialization.KSerializer
|
import kotlinx.serialization.KSerializer
|
||||||
|
|
||||||
fun <ObjectType, IdType, InputValue> Route.configureStandardCrudRepoRoutes(
|
fun <ObjectType, IdType, InputValue> Route.configureStandardCrudRepoRoutes(
|
||||||
|
@ -5,10 +5,9 @@ import dev.inmo.micro_utils.ktor.common.standardKtorSerialFormat
|
|||||||
import dev.inmo.micro_utils.ktor.server.*
|
import dev.inmo.micro_utils.ktor.server.*
|
||||||
import dev.inmo.micro_utils.repos.WriteStandardCRUDRepo
|
import dev.inmo.micro_utils.repos.WriteStandardCRUDRepo
|
||||||
import dev.inmo.micro_utils.repos.ktor.common.crud.*
|
import dev.inmo.micro_utils.repos.ktor.common.crud.*
|
||||||
import io.ktor.application.call
|
|
||||||
import io.ktor.http.ContentType
|
import io.ktor.http.ContentType
|
||||||
import io.ktor.routing.Route
|
import io.ktor.server.routing.Route
|
||||||
import io.ktor.routing.post
|
import io.ktor.server.routing.post
|
||||||
import kotlinx.serialization.KSerializer
|
import kotlinx.serialization.KSerializer
|
||||||
import kotlinx.serialization.builtins.*
|
import kotlinx.serialization.builtins.*
|
||||||
|
|
||||||
|
@ -6,8 +6,8 @@ import dev.inmo.micro_utils.ktor.server.UnifiedRouter
|
|||||||
import dev.inmo.micro_utils.ktor.server.standardKtorSerialFormatContentType
|
import dev.inmo.micro_utils.ktor.server.standardKtorSerialFormatContentType
|
||||||
import dev.inmo.micro_utils.repos.StandardKeyValueRepo
|
import dev.inmo.micro_utils.repos.StandardKeyValueRepo
|
||||||
import io.ktor.http.ContentType
|
import io.ktor.http.ContentType
|
||||||
import io.ktor.routing.Route
|
import io.ktor.server.routing.Route
|
||||||
import io.ktor.routing.route
|
import io.ktor.server.routing.route
|
||||||
import kotlinx.serialization.KSerializer
|
import kotlinx.serialization.KSerializer
|
||||||
|
|
||||||
fun <K, V> Route.configureStandardKeyValueRepoRoutes(
|
fun <K, V> Route.configureStandardKeyValueRepoRoutes(
|
||||||
@ -43,4 +43,4 @@ fun <K, V> Route.configureStandartKeyValueRepoRoutes(
|
|||||||
valueNullableSerializer: KSerializer<V?>,
|
valueNullableSerializer: KSerializer<V?>,
|
||||||
serialFormat: StandardKtorSerialFormat = standardKtorSerialFormat,
|
serialFormat: StandardKtorSerialFormat = standardKtorSerialFormat,
|
||||||
serialFormatContentType: ContentType = standardKtorSerialFormatContentType
|
serialFormatContentType: ContentType = standardKtorSerialFormatContentType
|
||||||
) = configureStandardKeyValueRepoRoutes(baseSubpart, originalRepo, keySerializer, valueSerializer, valueNullableSerializer, UnifiedRouter(serialFormat, serialFormatContentType))
|
) = configureStandardKeyValueRepoRoutes(baseSubpart, originalRepo, keySerializer, valueSerializer, valueNullableSerializer, UnifiedRouter(serialFormat, serialFormatContentType))
|
||||||
|
@ -8,10 +8,10 @@ import dev.inmo.micro_utils.pagination.extractPagination
|
|||||||
import dev.inmo.micro_utils.repos.ReadStandardKeyValueRepo
|
import dev.inmo.micro_utils.repos.ReadStandardKeyValueRepo
|
||||||
import dev.inmo.micro_utils.repos.ktor.common.key_value.*
|
import dev.inmo.micro_utils.repos.ktor.common.key_value.*
|
||||||
import dev.inmo.micro_utils.repos.ktor.common.valueParameterName
|
import dev.inmo.micro_utils.repos.ktor.common.valueParameterName
|
||||||
import io.ktor.application.call
|
|
||||||
import io.ktor.http.ContentType
|
import io.ktor.http.ContentType
|
||||||
import io.ktor.routing.Route
|
import io.ktor.server.application.call
|
||||||
import io.ktor.routing.get
|
import io.ktor.server.routing.Route
|
||||||
|
import io.ktor.server.routing.get
|
||||||
import kotlinx.serialization.KSerializer
|
import kotlinx.serialization.KSerializer
|
||||||
import kotlinx.serialization.builtins.serializer
|
import kotlinx.serialization.builtins.serializer
|
||||||
|
|
||||||
|
@ -6,8 +6,8 @@ import dev.inmo.micro_utils.ktor.server.*
|
|||||||
import dev.inmo.micro_utils.repos.WriteStandardKeyValueRepo
|
import dev.inmo.micro_utils.repos.WriteStandardKeyValueRepo
|
||||||
import dev.inmo.micro_utils.repos.ktor.common.key_value.*
|
import dev.inmo.micro_utils.repos.ktor.common.key_value.*
|
||||||
import io.ktor.http.ContentType
|
import io.ktor.http.ContentType
|
||||||
import io.ktor.routing.Route
|
import io.ktor.server.routing.Route
|
||||||
import io.ktor.routing.post
|
import io.ktor.server.routing.post
|
||||||
import kotlinx.serialization.KSerializer
|
import kotlinx.serialization.KSerializer
|
||||||
import kotlinx.serialization.builtins.*
|
import kotlinx.serialization.builtins.*
|
||||||
|
|
||||||
|
@ -6,8 +6,8 @@ import dev.inmo.micro_utils.ktor.server.UnifiedRouter
|
|||||||
import dev.inmo.micro_utils.ktor.server.standardKtorSerialFormatContentType
|
import dev.inmo.micro_utils.ktor.server.standardKtorSerialFormatContentType
|
||||||
import dev.inmo.micro_utils.repos.OneToManyKeyValueRepo
|
import dev.inmo.micro_utils.repos.OneToManyKeyValueRepo
|
||||||
import io.ktor.http.ContentType
|
import io.ktor.http.ContentType
|
||||||
import io.ktor.routing.Route
|
import io.ktor.server.routing.Route
|
||||||
import io.ktor.routing.route
|
import io.ktor.server.routing.route
|
||||||
import kotlinx.serialization.KSerializer
|
import kotlinx.serialization.KSerializer
|
||||||
|
|
||||||
fun <Key, Value> Route.configureOneToManyKeyValueRepoRoutes(
|
fun <Key, Value> Route.configureOneToManyKeyValueRepoRoutes(
|
||||||
@ -32,4 +32,4 @@ fun <Key, Value> Route.configureOneToManyKeyValueRepoRoutes(
|
|||||||
serialFormatContentType: ContentType = standardKtorSerialFormatContentType
|
serialFormatContentType: ContentType = standardKtorSerialFormatContentType
|
||||||
) = configureOneToManyKeyValueRepoRoutes(
|
) = configureOneToManyKeyValueRepoRoutes(
|
||||||
baseSubpart, originalRepo, keySerializer, valueSerializer, UnifiedRouter(serialFormat, serialFormatContentType)
|
baseSubpart, originalRepo, keySerializer, valueSerializer, UnifiedRouter(serialFormat, serialFormatContentType)
|
||||||
)
|
)
|
||||||
|
@ -6,15 +6,14 @@ import dev.inmo.micro_utils.ktor.server.*
|
|||||||
import dev.inmo.micro_utils.pagination.PaginationResult
|
import dev.inmo.micro_utils.pagination.PaginationResult
|
||||||
import dev.inmo.micro_utils.pagination.extractPagination
|
import dev.inmo.micro_utils.pagination.extractPagination
|
||||||
import dev.inmo.micro_utils.repos.ReadOneToManyKeyValueRepo
|
import dev.inmo.micro_utils.repos.ReadOneToManyKeyValueRepo
|
||||||
import dev.inmo.micro_utils.repos.ktor.common.*
|
|
||||||
import dev.inmo.micro_utils.repos.ktor.common.keyParameterName
|
import dev.inmo.micro_utils.repos.ktor.common.keyParameterName
|
||||||
import dev.inmo.micro_utils.repos.ktor.common.one_to_many.*
|
import dev.inmo.micro_utils.repos.ktor.common.one_to_many.*
|
||||||
import dev.inmo.micro_utils.repos.ktor.common.valueParameterName
|
import dev.inmo.micro_utils.repos.ktor.common.valueParameterName
|
||||||
import dev.inmo.micro_utils.repos.ktor.common.reversedParameterName
|
import dev.inmo.micro_utils.repos.ktor.common.reversedParameterName
|
||||||
import io.ktor.application.call
|
|
||||||
import io.ktor.http.ContentType
|
import io.ktor.http.ContentType
|
||||||
import io.ktor.routing.Route
|
import io.ktor.server.application.call
|
||||||
import io.ktor.routing.get
|
import io.ktor.server.routing.Route
|
||||||
|
import io.ktor.server.routing.get
|
||||||
import kotlinx.serialization.KSerializer
|
import kotlinx.serialization.KSerializer
|
||||||
import kotlinx.serialization.builtins.serializer
|
import kotlinx.serialization.builtins.serializer
|
||||||
|
|
||||||
|
@ -5,10 +5,9 @@ import dev.inmo.micro_utils.ktor.common.standardKtorSerialFormat
|
|||||||
import dev.inmo.micro_utils.ktor.server.*
|
import dev.inmo.micro_utils.ktor.server.*
|
||||||
import dev.inmo.micro_utils.repos.WriteOneToManyKeyValueRepo
|
import dev.inmo.micro_utils.repos.WriteOneToManyKeyValueRepo
|
||||||
import dev.inmo.micro_utils.repos.ktor.common.one_to_many.*
|
import dev.inmo.micro_utils.repos.ktor.common.one_to_many.*
|
||||||
import io.ktor.application.call
|
|
||||||
import io.ktor.http.ContentType
|
import io.ktor.http.ContentType
|
||||||
import io.ktor.routing.Route
|
import io.ktor.server.routing.Route
|
||||||
import io.ktor.routing.post
|
import io.ktor.server.routing.post
|
||||||
import kotlinx.serialization.KSerializer
|
import kotlinx.serialization.KSerializer
|
||||||
import kotlinx.serialization.builtins.*
|
import kotlinx.serialization.builtins.*
|
||||||
|
|
||||||
|
@ -1,3 +1,9 @@
|
|||||||
|
pluginManagement {
|
||||||
|
repositories {
|
||||||
|
gradlePluginPortal()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
rootProject.name='micro_utils'
|
rootProject.name='micro_utils'
|
||||||
|
|
||||||
String[] includes = [
|
String[] includes = [
|
||||||
|
Loading…
Reference in New Issue
Block a user