partially implemented ktor utils

This commit is contained in:
000Sanya
2020-09-22 12:20:22 +10:00
parent b84367f47c
commit 1dcf17a35d
38 changed files with 541 additions and 0 deletions

16
ktor/common/build.gradle Normal file
View File

@@ -0,0 +1,16 @@
plugins {
id "org.jetbrains.kotlin.multiplatform"
id "org.jetbrains.kotlin.plugin.serialization"
}
apply from: "$mppProjectWithSerializationPresetPath"
kotlin {
sourceSets {
commonMain {
dependencies {
api "com.soywiz.korlibs.klock:klock:$klockVersion"
}
}
}
}

View File

@@ -0,0 +1,23 @@
package dev.inmo.micro_utils.ktor.common
fun buildStandardUrl(
basePart: String,
subpart: String,
parameters: QueryParams = emptyMap()
) = "$basePart/$subpart".includeQueryParams(
parameters
)
fun buildStandardUrl(
basePart: String,
subpart: String,
parameters: List<QueryParam>
) = "$basePart/$subpart".includeQueryParams(
parameters
)
fun buildStandardUrl(
basePart: String,
subpart: String,
vararg parameters: QueryParam
) = buildStandardUrl(basePart, subpart, parameters.toList())

View File

@@ -0,0 +1,6 @@
package dev.inmo.micro_utils.ktor.common
import kotlinx.serialization.builtins.SetSerializer
import kotlinx.serialization.builtins.serializer
val setIdsSerializer = SetSerializer(String.serializer())

View File

@@ -0,0 +1,3 @@
package dev.inmo.micro_utils.ktor.common
object CorrectCloseException : Exception()

View File

@@ -0,0 +1,14 @@
package dev.inmo.micro_utils.ktor.common
private val schemaRegex = Regex("[^:]*//")
val String.asCorrectWebSocketUrl: String
get() = if (startsWith("ws")) {
this
} else {
if (contains("://")) {
replace(schemaRegex, "ws://")
} else {
"ws://$this"
}
}

View File

@@ -0,0 +1,17 @@
package dev.inmo.micro_utils.ktor.common
import com.soywiz.klock.DateTime
typealias FromToDateTime = Pair<DateTime?, DateTime?>
val FromToDateTime.asFromToUrlPart: QueryParams
get() = mapOf(
"from" to first ?.unixMillis ?.toString(),
"to" to second ?.unixMillis ?.toString()
)
val QueryParams.extractFromToDateTime: FromToDateTime
get() = FromToDateTime(
get("from") ?.toDoubleOrNull() ?.let { DateTime(it) },
get("to") ?.toDoubleOrNull() ?.let { DateTime(it) }
)

View File

@@ -0,0 +1,25 @@
package dev.inmo.micro_utils.ktor.common
typealias QueryParam = Pair<String, String?>
typealias QueryParams = Map<String, String?>
val QueryParams.asUrlQuery: String
get() = keys.joinToString("&") { "${it}${get(it) ?.let { value -> "=$value" }}" }
val List<QueryParam>.asUrlQuery: String
get() = joinToString("&") { (key, value) -> "${key}${value ?.let { _ -> "=$value" }}" }
fun String.includeQueryParams(
queryParams: QueryParams
): String = "$this${if (contains("?")) "&" else "?"}${queryParams.asUrlQuery}"
fun String.includeQueryParams(
queryParams: List<QueryParam>
): String = "$this${if (contains("?")) "&" else "?"}${queryParams.asUrlQuery}"
val String.parseUrlQuery: QueryParams
get() = split("&").map {
it.split("=").let { pair ->
pair.first() to pair.getOrNull(1)
}
}.toMap()

View File

@@ -0,0 +1,5 @@
package dev.inmo.micro_utils.ktor.common
import kotlinx.serialization.cbor.Cbor
val standardKtorSerialFormat = Cbor

View File

@@ -0,0 +1,7 @@
package dev.inmo.micro_utils.ktor.common
const val clientWebsocketHelloMessage = "Start getting of updates"
const val serverWebsocketHelloMessage = "Accepted"
const val serverWebsocketNewMessageMessage = "NewMessage"
const val websocketFinalizationMessage = "Final"