start migration onto new dependencies

This commit is contained in:
2024-08-16 19:10:49 +06:00
parent 1a317f1455
commit a28448c3c1
31 changed files with 118 additions and 87 deletions

View File

@@ -11,6 +11,7 @@ kotlin {
commonMain { commonMain {
dependencies { dependencies {
api libs.klock api libs.klock
api libs.kt.io
} }
} }
jvmMain { jvmMain {

View File

@@ -1,5 +1,11 @@
package dev.inmo.micro_utils.common package dev.inmo.micro_utils.common
import kotlinx.io.Buffer
import kotlinx.io.Source
import kotlinx.io.buffered
import kotlinx.io.files.Path
import kotlinx.io.files.SystemFileSystem
import kotlinx.io.readByteArray
import kotlinx.serialization.Serializable import kotlinx.serialization.Serializable
import kotlin.jvm.JvmInline import kotlin.jvm.JvmInline
@@ -32,3 +38,17 @@ expect val MPPFile.bytesAllocator: SuspendByteArrayAllocator
fun MPPFile.bytesSync() = bytesAllocatorSync() fun MPPFile.bytesSync() = bytesAllocatorSync()
suspend fun MPPFile.bytes() = bytesAllocator() suspend fun MPPFile.bytes() = bytesAllocator()
val Path.filename: FileName
get() = FileName(name)
val Path.filesize: Long
get() = SystemFileSystem.metadataOrNull(this) ?.size ?.takeIf { it > -1 } ?: error("Path $filename does not exists or is folder")
val Path.bytesAllocatorSync: ByteArrayAllocator
get() = {
source().buffered().readByteArray()
}
val Path.bytesAllocator: SuspendByteArrayAllocator
get() = {
bytesAllocatorSync()
}
fun Path.source(): Source = SystemFileSystem.source(this).buffered()

View File

@@ -1,5 +1,6 @@
package dev.inmo.micro_utils.common package dev.inmo.micro_utils.common
import kotlinx.io.files.Path
import org.khronos.webgl.ArrayBuffer import org.khronos.webgl.ArrayBuffer
import org.w3c.dom.ErrorEvent import org.w3c.dom.ErrorEvent
import org.w3c.files.* import org.w3c.files.*

View File

@@ -4,6 +4,8 @@ kt = "2.0.10"
kt-serialization = "1.7.1" kt-serialization = "1.7.1"
kt-coroutines = "1.8.1" kt-coroutines = "1.8.1"
kt-io = "0.5.2"
kslog = "1.3.5" kslog = "1.3.5"
jb-compose = "1.7.0-alpha02" jb-compose = "1.7.0-alpha02"
@@ -15,11 +17,11 @@ sqlite = "3.46.0.1"
korlibs = "5.4.0" korlibs = "5.4.0"
uuid = "0.8.4" uuid = "0.8.4"
ktor = "2.3.11" ktor = "3.0.0-beta-2"
gh-release = "2.5.2" gh-release = "2.5.2"
koin = "3.5.6" koin = "4.0.0-RC1"
okio = "3.9.0" okio = "3.9.0"
@@ -56,6 +58,7 @@ kt-coroutines-android = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-and
kt-coroutines-test = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-test", version.ref = "kt-coroutines" } kt-coroutines-test = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-test", version.ref = "kt-coroutines" }
kt-coroutines-debug = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-debug", version.ref = "kt-coroutines" } kt-coroutines-debug = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-debug", version.ref = "kt-coroutines" }
kt-io = { module = "org.jetbrains.kotlinx:kotlinx-io-core", version.ref = "kt-io" }
ktor-io = { module = "io.ktor:ktor-io", version.ref = "ktor" } ktor-io = { module = "io.ktor:ktor-io", version.ref = "ktor" }
ktor-serialization-kotlinx-json = { module = "io.ktor:ktor-serialization-kotlinx-json", version.ref = "ktor" } ktor-serialization-kotlinx-json = { module = "io.ktor:ktor-serialization-kotlinx-json", version.ref = "ktor" }

View File

@@ -3,9 +3,10 @@ package dev.inmo.micro_utils.ktor.client
import dev.inmo.micro_utils.common.MPPFile import dev.inmo.micro_utils.common.MPPFile
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.content.*
expect suspend fun HttpClient.tempUpload( expect suspend fun HttpClient.tempUpload(
fullTempUploadDraftPath: String, fullTempUploadDraftPath: String,
file: MPPFile, file: MPPFile,
onUpload: OnUploadCallback = { _, _ -> } onUpload: ProgressListener = ProgressListener { _, _ -> }
): TemporalFileId ): TemporalFileId

View File

@@ -4,6 +4,7 @@ import dev.inmo.micro_utils.common.FileName
import dev.inmo.micro_utils.common.MPPFile import dev.inmo.micro_utils.common.MPPFile
import dev.inmo.micro_utils.ktor.common.LambdaInputProvider import dev.inmo.micro_utils.ktor.common.LambdaInputProvider
import io.ktor.client.HttpClient import io.ktor.client.HttpClient
import io.ktor.client.content.*
import io.ktor.http.Headers import io.ktor.http.Headers
import io.ktor.utils.io.core.Input import io.ktor.utils.io.core.Input
import kotlinx.serialization.DeserializationStrategy import kotlinx.serialization.DeserializationStrategy
@@ -31,7 +32,7 @@ expect suspend fun <T> HttpClient.uniUpload(
resultDeserializer: DeserializationStrategy<T>, resultDeserializer: DeserializationStrategy<T>,
headers: Headers = Headers.Empty, headers: Headers = Headers.Empty,
stringFormat: StringFormat = Json, stringFormat: StringFormat = Json,
onUpload: OnUploadCallback = { _, _ -> } onUpload: ProgressListener = ProgressListener { _, _ -> }
): T? ): T?
/** /**
@@ -46,7 +47,7 @@ suspend fun <T> HttpClient.uniUpload(
additionalData: Map<String, Any> = emptyMap(), additionalData: Map<String, Any> = emptyMap(),
headers: Headers = Headers.Empty, headers: Headers = Headers.Empty,
stringFormat: StringFormat = Json, stringFormat: StringFormat = Json,
onUpload: OnUploadCallback = { _, _ -> } onUpload: ProgressListener = ProgressListener { _, _ -> }
): T? = uniUpload( ): T? = uniUpload(
url, url,
additionalData + ("bytes" to file), additionalData + ("bytes" to file),
@@ -68,7 +69,7 @@ suspend fun <T> HttpClient.uniUpload(
additionalData: Map<String, Any> = emptyMap(), additionalData: Map<String, Any> = emptyMap(),
headers: Headers = Headers.Empty, headers: Headers = Headers.Empty,
stringFormat: StringFormat = Json, stringFormat: StringFormat = Json,
onUpload: OnUploadCallback = { _, _ -> } onUpload: ProgressListener = ProgressListener { _, _ -> }
): T? = uniUpload( ): T? = uniUpload(
url, url,
additionalData + ("bytes" to info), additionalData + ("bytes" to info),
@@ -93,7 +94,7 @@ suspend fun <T> HttpClient.uniUpload(
additionalData: Map<String, Any> = emptyMap(), additionalData: Map<String, Any> = emptyMap(),
headers: Headers = Headers.Empty, headers: Headers = Headers.Empty,
stringFormat: StringFormat = Json, stringFormat: StringFormat = Json,
onUpload: OnUploadCallback = { _, _ -> } onUpload: ProgressListener = ProgressListener { _, _ -> }
): T? = uniUpload( ): T? = uniUpload(
url, url,
UniUploadFileInfo(fileName, mimeType, inputAllocator), UniUploadFileInfo(fileName, mimeType, inputAllocator),

View File

@@ -5,16 +5,19 @@ import dev.inmo.micro_utils.coroutines.LinkedSupervisorJob
import dev.inmo.micro_utils.coroutines.launchSafelyWithoutExceptions import dev.inmo.micro_utils.coroutines.launchSafelyWithoutExceptions
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.content.*
import kotlinx.coroutines.* import kotlinx.coroutines.*
import kotlinx.io.files.SystemFileSystem
import org.w3c.dom.mediasource.ENDED import org.w3c.dom.mediasource.ENDED
import org.w3c.dom.mediasource.ReadyState import org.w3c.dom.mediasource.ReadyState
import org.w3c.files.File
import org.w3c.xhr.* import org.w3c.xhr.*
import org.w3c.xhr.XMLHttpRequest.Companion.DONE import org.w3c.xhr.XMLHttpRequest.Companion.DONE
suspend fun tempUpload( suspend fun tempUpload(
fullTempUploadDraftPath: String, fullTempUploadDraftPath: String,
file: MPPFile, file: MPPFile,
onUpload: OnUploadCallback onUpload: ProgressListener
): TemporalFileId { ): TemporalFileId {
val formData = FormData() val formData = FormData()
val answer = CompletableDeferred<TemporalFileId>(currentCoroutineContext().job) val answer = CompletableDeferred<TemporalFileId>(currentCoroutineContext().job)
@@ -28,7 +31,7 @@ suspend fun tempUpload(
val request = XMLHttpRequest() val request = XMLHttpRequest()
request.responseType = XMLHttpRequestResponseType.TEXT request.responseType = XMLHttpRequestResponseType.TEXT
request.upload.onprogress = { request.upload.onprogress = {
subscope.launchSafelyWithoutExceptions { onUpload(it.loaded.toLong(), it.total.toLong()) } subscope.launchSafelyWithoutExceptions { onUpload.onProgress(it.loaded.toLong(), it.total.toLong()) }
} }
request.onload = { request.onload = {
if (request.status == 200.toShort()) { if (request.status == 200.toShort()) {
@@ -60,5 +63,5 @@ suspend fun tempUpload(
actual suspend fun HttpClient.tempUpload( actual suspend fun HttpClient.tempUpload(
fullTempUploadDraftPath: String, fullTempUploadDraftPath: String,
file: MPPFile, file: MPPFile,
onUpload: OnUploadCallback onUpload: ProgressListener
): TemporalFileId = dev.inmo.micro_utils.ktor.client.tempUpload(fullTempUploadDraftPath, file, onUpload) ): TemporalFileId = dev.inmo.micro_utils.ktor.client.tempUpload(fullTempUploadDraftPath, file, onUpload)

View File

@@ -5,6 +5,7 @@ import dev.inmo.micro_utils.common.Progress
import dev.inmo.micro_utils.coroutines.LinkedSupervisorJob import dev.inmo.micro_utils.coroutines.LinkedSupervisorJob
import dev.inmo.micro_utils.coroutines.launchSafelyWithoutExceptions import dev.inmo.micro_utils.coroutines.launchSafelyWithoutExceptions
import io.ktor.client.HttpClient import io.ktor.client.HttpClient
import io.ktor.client.content.*
import io.ktor.http.Headers import io.ktor.http.Headers
import io.ktor.utils.io.core.readBytes import io.ktor.utils.io.core.readBytes
import kotlinx.coroutines.CompletableDeferred import kotlinx.coroutines.CompletableDeferred
@@ -36,7 +37,7 @@ actual suspend fun <T> HttpClient.uniUpload(
resultDeserializer: DeserializationStrategy<T>, resultDeserializer: DeserializationStrategy<T>,
headers: Headers, headers: Headers,
stringFormat: StringFormat, stringFormat: StringFormat,
onUpload: OnUploadCallback onUpload: ProgressListener
): T? { ): T? {
val formData = FormData() val formData = FormData()
val answer = CompletableDeferred<T?>(currentCoroutineContext().job) val answer = CompletableDeferred<T?>(currentCoroutineContext().job)
@@ -66,7 +67,7 @@ actual suspend fun <T> HttpClient.uniUpload(
} }
request.responseType = XMLHttpRequestResponseType.TEXT request.responseType = XMLHttpRequestResponseType.TEXT
request.upload.onprogress = { request.upload.onprogress = {
subscope.launchSafelyWithoutExceptions { onUpload(it.loaded.toLong(), it.total.toLong()) } subscope.launchSafelyWithoutExceptions { onUpload.onProgress(it.loaded.toLong(), it.total.toLong()) }
} }
request.onload = { request.onload = {
if (request.status == 200.toShort()) { if (request.status == 200.toShort()) {

View File

@@ -4,6 +4,7 @@ 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.content.*
import io.ktor.client.plugins.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
@@ -18,7 +19,7 @@ internal val MPPFile.mimeType: String
actual suspend fun HttpClient.tempUpload( actual suspend fun HttpClient.tempUpload(
fullTempUploadDraftPath: String, fullTempUploadDraftPath: String,
file: MPPFile, file: MPPFile,
onUpload: OnUploadCallback onUpload: ProgressListener
): TemporalFileId { ): TemporalFileId {
val inputProvider = file.inputProvider() val inputProvider = file.inputProvider()
val fileId = submitFormWithBinaryData( val fileId = submitFormWithBinaryData(

View File

@@ -2,6 +2,7 @@ package dev.inmo.micro_utils.ktor.client
import dev.inmo.micro_utils.common.Progress import dev.inmo.micro_utils.common.Progress
import io.ktor.client.HttpClient import io.ktor.client.HttpClient
import io.ktor.client.content.*
import io.ktor.client.engine.mergeHeaders import io.ktor.client.engine.mergeHeaders
import io.ktor.client.plugins.onUpload import io.ktor.client.plugins.onUpload
import io.ktor.client.request.HttpRequestBuilder import io.ktor.client.request.HttpRequestBuilder
@@ -39,7 +40,7 @@ actual suspend fun <T> HttpClient.uniUpload(
resultDeserializer: DeserializationStrategy<T>, resultDeserializer: DeserializationStrategy<T>,
headers: Headers, headers: Headers,
stringFormat: StringFormat, stringFormat: StringFormat,
onUpload: OnUploadCallback onUpload: ProgressListener
): T? { ): T? {
val withBinary = data.values.any { it is File || it is UniUploadFileInfo } val withBinary = data.values.any { it is File || it is UniUploadFileInfo }
@@ -75,9 +76,7 @@ actual suspend fun <T> HttpClient.uniUpload(
headers { headers {
appendAll(headers) appendAll(headers)
} }
onUpload { bytesSentTotal, contentLength -> onUpload(onUpload)
onUpload(bytesSentTotal, contentLength)
}
} }
val response = if (withBinary) { val response = if (withBinary) {

View File

@@ -5,6 +5,7 @@ import dev.inmo.micro_utils.common.filename
import dev.inmo.micro_utils.ktor.common.TemporalFileId import dev.inmo.micro_utils.ktor.common.TemporalFileId
import dev.inmo.micro_utils.mime_types.getMimeTypeOrAny import dev.inmo.micro_utils.mime_types.getMimeTypeOrAny
import io.ktor.client.HttpClient import io.ktor.client.HttpClient
import io.ktor.client.content.*
import io.ktor.client.plugins.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
@@ -18,7 +19,7 @@ internal val MPPFile.mimeType: String
actual suspend fun HttpClient.tempUpload( actual suspend fun HttpClient.tempUpload(
fullTempUploadDraftPath: String, fullTempUploadDraftPath: String,
file: MPPFile, file: MPPFile,
onUpload: OnUploadCallback onUpload: ProgressListener
): TemporalFileId { ): TemporalFileId {
val inputProvider = file.inputProvider() val inputProvider = file.inputProvider()
val fileId = submitFormWithBinaryData( val fileId = submitFormWithBinaryData(

View File

@@ -3,6 +3,7 @@ package dev.inmo.micro_utils.ktor.client
import dev.inmo.micro_utils.common.MPPFile import dev.inmo.micro_utils.common.MPPFile
import dev.inmo.micro_utils.common.Progress import dev.inmo.micro_utils.common.Progress
import io.ktor.client.HttpClient import io.ktor.client.HttpClient
import io.ktor.client.content.*
import io.ktor.client.engine.mergeHeaders import io.ktor.client.engine.mergeHeaders
import io.ktor.client.plugins.onUpload import io.ktor.client.plugins.onUpload
import io.ktor.client.request.HttpRequestBuilder import io.ktor.client.request.HttpRequestBuilder
@@ -39,7 +40,7 @@ actual suspend fun <T> HttpClient.uniUpload(
resultDeserializer: DeserializationStrategy<T>, resultDeserializer: DeserializationStrategy<T>,
headers: Headers, headers: Headers,
stringFormat: StringFormat, stringFormat: StringFormat,
onUpload: OnUploadCallback onUpload: ProgressListener
): T? { ): T? {
val withBinary = data.values.any { it is MPPFile || it is UniUploadFileInfo } val withBinary = data.values.any { it is MPPFile || it is UniUploadFileInfo }
@@ -75,9 +76,7 @@ actual suspend fun <T> HttpClient.uniUpload(
headers { headers {
appendAll(headers) appendAll(headers)
} }
onUpload { bytesSentTotal, contentLength -> onUpload(onUpload)
onUpload(bytesSentTotal, contentLength)
}
} }
val response = if (withBinary) { val response = if (withBinary) {

View File

@@ -5,6 +5,7 @@ import dev.inmo.micro_utils.common.filename
import dev.inmo.micro_utils.ktor.common.TemporalFileId import dev.inmo.micro_utils.ktor.common.TemporalFileId
import dev.inmo.micro_utils.mime_types.getMimeTypeOrAny import dev.inmo.micro_utils.mime_types.getMimeTypeOrAny
import io.ktor.client.HttpClient import io.ktor.client.HttpClient
import io.ktor.client.content.*
import io.ktor.client.plugins.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
@@ -18,7 +19,7 @@ internal val MPPFile.mimeType: String
actual suspend fun HttpClient.tempUpload( actual suspend fun HttpClient.tempUpload(
fullTempUploadDraftPath: String, fullTempUploadDraftPath: String,
file: MPPFile, file: MPPFile,
onUpload: OnUploadCallback onUpload: ProgressListener
): TemporalFileId { ): TemporalFileId {
val inputProvider = file.inputProvider() val inputProvider = file.inputProvider()
val fileId = submitFormWithBinaryData( val fileId = submitFormWithBinaryData(

View File

@@ -3,6 +3,7 @@ package dev.inmo.micro_utils.ktor.client
import dev.inmo.micro_utils.common.MPPFile import dev.inmo.micro_utils.common.MPPFile
import dev.inmo.micro_utils.common.Progress import dev.inmo.micro_utils.common.Progress
import io.ktor.client.HttpClient import io.ktor.client.HttpClient
import io.ktor.client.content.*
import io.ktor.client.engine.mergeHeaders import io.ktor.client.engine.mergeHeaders
import io.ktor.client.plugins.onUpload import io.ktor.client.plugins.onUpload
import io.ktor.client.request.HttpRequestBuilder import io.ktor.client.request.HttpRequestBuilder
@@ -39,7 +40,7 @@ actual suspend fun <T> HttpClient.uniUpload(
resultDeserializer: DeserializationStrategy<T>, resultDeserializer: DeserializationStrategy<T>,
headers: Headers, headers: Headers,
stringFormat: StringFormat, stringFormat: StringFormat,
onUpload: OnUploadCallback onUpload: ProgressListener
): T? { ): T? {
val withBinary = data.values.any { it is MPPFile || it is UniUploadFileInfo } val withBinary = data.values.any { it is MPPFile || it is UniUploadFileInfo }
@@ -75,9 +76,7 @@ actual suspend fun <T> HttpClient.uniUpload(
headers { headers {
appendAll(headers) appendAll(headers)
} }
onUpload { bytesSentTotal, contentLength -> onUpload(onUpload)
onUpload(bytesSentTotal, contentLength)
}
} }
val response = if (withBinary) { val response = if (withBinary) {

View File

@@ -5,6 +5,7 @@ import dev.inmo.micro_utils.common.filename
import dev.inmo.micro_utils.ktor.common.TemporalFileId import dev.inmo.micro_utils.ktor.common.TemporalFileId
import dev.inmo.micro_utils.mime_types.getMimeTypeOrAny import dev.inmo.micro_utils.mime_types.getMimeTypeOrAny
import io.ktor.client.HttpClient import io.ktor.client.HttpClient
import io.ktor.client.content.*
import io.ktor.client.plugins.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
@@ -18,7 +19,7 @@ internal val MPPFile.mimeType: String
actual suspend fun HttpClient.tempUpload( actual suspend fun HttpClient.tempUpload(
fullTempUploadDraftPath: String, fullTempUploadDraftPath: String,
file: MPPFile, file: MPPFile,
onUpload: OnUploadCallback onUpload: ProgressListener
): TemporalFileId { ): TemporalFileId {
val inputProvider = file.inputProvider() val inputProvider = file.inputProvider()
val fileId = submitFormWithBinaryData( val fileId = submitFormWithBinaryData(

View File

@@ -3,6 +3,7 @@ package dev.inmo.micro_utils.ktor.client
import dev.inmo.micro_utils.common.MPPFile import dev.inmo.micro_utils.common.MPPFile
import dev.inmo.micro_utils.common.Progress import dev.inmo.micro_utils.common.Progress
import io.ktor.client.HttpClient import io.ktor.client.HttpClient
import io.ktor.client.content.*
import io.ktor.client.engine.mergeHeaders import io.ktor.client.engine.mergeHeaders
import io.ktor.client.plugins.onUpload import io.ktor.client.plugins.onUpload
import io.ktor.client.request.HttpRequestBuilder import io.ktor.client.request.HttpRequestBuilder
@@ -39,7 +40,7 @@ actual suspend fun <T> HttpClient.uniUpload(
resultDeserializer: DeserializationStrategy<T>, resultDeserializer: DeserializationStrategy<T>,
headers: Headers, headers: Headers,
stringFormat: StringFormat, stringFormat: StringFormat,
onUpload: OnUploadCallback onUpload: ProgressListener
): T? { ): T? {
val withBinary = data.values.any { it is MPPFile || it is UniUploadFileInfo } val withBinary = data.values.any { it is MPPFile || it is UniUploadFileInfo }
@@ -75,9 +76,7 @@ actual suspend fun <T> HttpClient.uniUpload(
headers { headers {
appendAll(headers) appendAll(headers)
} }
onUpload { bytesSentTotal, contentLength -> onUpload(onUpload)
onUpload(bytesSentTotal, contentLength)
}
} }
val response = if (withBinary) { val response = if (withBinary) {

View File

@@ -1,11 +1,10 @@
package dev.inmo.micro_utils.ktor.common package dev.inmo.micro_utils.ktor.common
import io.ktor.utils.io.core.Input import io.ktor.utils.io.core.*
import io.ktor.utils.io.core.copyTo import kotlinx.io.asSink
import io.ktor.utils.io.streams.asOutput
import java.io.File import java.io.File
import java.io.InputStream
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(),
@@ -16,8 +15,8 @@ fun Input.downloadToTempFile(
fileExtension, fileExtension,
folder folder
).apply { ).apply {
outputStream().use { outputStream().use { output ->
copyTo(it.asOutput()) this@downloadToTempFile.transferTo(output.asSink())
} }
deleteOnExit() deleteOnExit()
} }

View File

@@ -4,14 +4,15 @@ 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.utils.io.copyTo
import io.ktor.utils.io.core.copyTo import io.ktor.utils.io.core.copyTo
import io.ktor.utils.io.jvm.javaio.copyTo import io.ktor.utils.io.jvm.javaio.*
import io.ktor.utils.io.streams.asOutput import io.ktor.utils.io.streams.*
import kotlinx.io.asSink
import java.io.File import java.io.File
fun PartData.FileItem.download(target: File) { fun PartData.FileItem.download(target: File) {
provider().use { input -> provider().toInputStream().asInput().use { input ->
target.outputStream().asOutput().use { target.outputStream().use { output ->
input.copyTo(it) input.transferTo(output.asSink())
} }
} }
} }
@@ -26,8 +27,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 { target.outputStream().use { output ->
input.copyTo(it.asOutput()) input.transferTo(output.asSink())
} }
} }
} }

View File

@@ -5,14 +5,14 @@ import dev.inmo.micro_utils.ktor.common.*
import io.ktor.http.URLProtocol 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.Route import io.ktor.server.routing.Routing
import io.ktor.server.routing.application import io.ktor.server.routing.*
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
import kotlinx.serialization.SerializationStrategy import kotlinx.serialization.SerializationStrategy
inline fun <reified T : Any> Route.includeWebsocketHandling( inline fun <reified T : Any> Routing.includeWebsocketHandling(
suburl: String, suburl: String,
flow: Flow<T>, flow: Flow<T>,
protocol: URLProtocol? = null, protocol: URLProtocol? = null,

View File

@@ -11,12 +11,12 @@ 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: ApplicationEngineEnvironmentBuilder.() -> Unit = {}, additionalEngineEnvironmentConfigurator: ApplicationEnvironmentBuilder.() -> Unit = {},
additionalConfigurationConfigurator: TConfiguration.() -> Unit = {}, additionalConfigurationConfigurator: TConfiguration.() -> Unit = {},
block: Application.() -> Unit block: Application.() -> Unit
): TEngine = embeddedServer( ): TEngine = embeddedServer(
engine, engine,
applicationEngineEnvironment { applicationEnvironment {
module(block) module(block)
connector { connector {
this.host = host this.host = host
@@ -35,7 +35,7 @@ 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: ApplicationEngineEnvironmentBuilder.() -> Unit = {}, additionalEngineEnvironmentConfigurator: ApplicationEnvironmentBuilder.() -> Unit = {},
additionalConfigurationConfigurator: CIOApplicationEngine.Configuration.() -> Unit = {}, additionalConfigurationConfigurator: CIOApplicationEngine.Configuration.() -> Unit = {},
block: Application.() -> Unit block: Application.() -> Unit
): CIOApplicationEngine = createKtorServer( ): CIOApplicationEngine = createKtorServer(
@@ -51,7 +51,7 @@ 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: ApplicationEngineEnvironmentBuilder.() -> Unit = {}, additionalEngineEnvironmentConfigurator: ApplicationEnvironmentBuilder.() -> Unit = {},
additionalConfigurationConfigurator: TConfiguration.() -> Unit = {}, additionalConfigurationConfigurator: TConfiguration.() -> Unit = {},
configurators: List<KtorApplicationConfigurator> configurators: List<KtorApplicationConfigurator>
): TEngine = createKtorServer( ): TEngine = createKtorServer(
@@ -73,6 +73,6 @@ 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: ApplicationEngineEnvironmentBuilder.() -> Unit = {}, additionalEngineEnvironmentConfigurator: ApplicationEnvironmentBuilder.() -> Unit = {},
additionalConfigurationConfigurator: CIOApplicationEngine.Configuration.() -> Unit = {}, additionalConfigurationConfigurator: CIOApplicationEngine.Configuration.() -> Unit = {},
): ApplicationEngine = createKtorServer(CIO, host, port, additionalEngineEnvironmentConfigurator, additionalConfigurationConfigurator, configurators) ): ApplicationEngine = createKtorServer(CIO, host, port, additionalEngineEnvironmentConfigurator, additionalConfigurationConfigurator, configurators)

View File

@@ -14,7 +14,7 @@ import io.ktor.server.application.call
import io.ktor.server.request.receiveMultipart import io.ktor.server.request.receiveMultipart
import io.ktor.server.response.respond import io.ktor.server.response.respond
import io.ktor.server.response.respondText import io.ktor.server.response.respondText
import io.ktor.server.routing.Route 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.flow.* import kotlinx.coroutines.flow.*
@@ -77,7 +77,7 @@ class TemporalFilesRoutingConfigurator(
private val filesFlow = MutableSharedFlow<TemporalFileId>() private val filesFlow = MutableSharedFlow<TemporalFileId>()
val utilizerJob = temporalFilesUtilizer.start(temporalFilesMap, temporalFilesMutex, filesFlow.asSharedFlow()) val utilizerJob = temporalFilesUtilizer.start(temporalFilesMap, temporalFilesMutex, filesFlow.asSharedFlow())
override fun Route.invoke() { override fun Routing.invoke() {
post(subpath) { post(subpath) {
val multipart = call.receiveMultipart() val multipart = call.receiveMultipart()

View File

@@ -2,7 +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.Route import io.ktor.server.routing.Routing
import io.ktor.server.routing.Routing import io.ktor.server.routing.Routing
import kotlinx.serialization.Contextual import kotlinx.serialization.Contextual
import kotlinx.serialization.Serializable import kotlinx.serialization.Serializable
@@ -11,7 +11,7 @@ import kotlinx.serialization.Serializable
class ApplicationRoutingConfigurator( class ApplicationRoutingConfigurator(
private val elements: List<@Contextual Element> private val elements: List<@Contextual Element>
) : KtorApplicationConfigurator { ) : KtorApplicationConfigurator {
fun interface Element { operator fun Route.invoke() } fun interface Element { operator fun Routing.invoke() }
private val rootInstaller = Element { private val rootInstaller = Element {
elements.forEach { elements.forEach {
it.apply { invoke() } it.apply { invoke() }

View File

@@ -2,10 +2,10 @@ package dev.inmo.micro_utils.repos.ktor.server.crud
import dev.inmo.micro_utils.ktor.common.* import dev.inmo.micro_utils.ktor.common.*
import dev.inmo.micro_utils.repos.CRUDRepo import dev.inmo.micro_utils.repos.CRUDRepo
import io.ktor.server.routing.Route import io.ktor.server.routing.Routing
import kotlinx.serialization.* import kotlinx.serialization.*
inline fun <reified ObjectType : Any, reified IdType : Any, reified InputValue : Any> Route.configureCRUDRepoRoutes( inline fun <reified ObjectType : Any, reified IdType : Any, reified InputValue : Any> Routing.configureCRUDRepoRoutes(
originalRepo: CRUDRepo<ObjectType, IdType, InputValue>, originalRepo: CRUDRepo<ObjectType, IdType, InputValue>,
noinline idDeserializer: suspend (String) -> IdType noinline idDeserializer: suspend (String) -> IdType
) { ) {
@@ -13,7 +13,7 @@ inline fun <reified ObjectType : Any, reified IdType : Any, reified InputValue :
configureWriteCRUDRepoRoutes(originalRepo) configureWriteCRUDRepoRoutes(originalRepo)
} }
inline fun <reified ObjectType : Any, reified IdType : Any, reified InputValue : Any> Route.configureCRUDRepoRoutes( inline fun <reified ObjectType : Any, reified IdType : Any, reified InputValue : Any> Routing.configureCRUDRepoRoutes(
originalRepo: CRUDRepo<ObjectType, IdType, InputValue>, originalRepo: CRUDRepo<ObjectType, IdType, InputValue>,
idsSerializer: KSerializer<IdType>, idsSerializer: KSerializer<IdType>,
serialFormat: StringFormat serialFormat: StringFormat
@@ -21,7 +21,7 @@ inline fun <reified ObjectType : Any, reified IdType : Any, reified InputValue :
serialFormat.decodeFromString(idsSerializer, it) serialFormat.decodeFromString(idsSerializer, it)
} }
inline fun <reified ObjectType : Any, reified IdType : Any, reified InputValue : Any> Route.configureCRUDRepoRoutes( inline fun <reified ObjectType : Any, reified IdType : Any, reified InputValue : Any> Routing.configureCRUDRepoRoutes(
originalRepo: CRUDRepo<ObjectType, IdType, InputValue>, originalRepo: CRUDRepo<ObjectType, IdType, InputValue>,
idsSerializer: KSerializer<IdType>, idsSerializer: KSerializer<IdType>,
serialFormat: BinaryFormat serialFormat: BinaryFormat

View File

@@ -11,11 +11,11 @@ import dev.inmo.micro_utils.repos.ktor.common.idParameterName
import io.ktor.http.HttpStatusCode import io.ktor.http.HttpStatusCode
import io.ktor.server.application.call import io.ktor.server.application.call
import io.ktor.server.response.respond import io.ktor.server.response.respond
import io.ktor.server.routing.Route import io.ktor.server.routing.Routing
import io.ktor.server.routing.get import io.ktor.server.routing.get
import kotlinx.serialization.* import kotlinx.serialization.*
inline fun <reified ObjectType, reified IdType> Route.configureReadCRUDRepoRoutes( inline fun <reified ObjectType, reified IdType> Routing.configureReadCRUDRepoRoutes(
originalRepo: ReadCRUDRepo<ObjectType, IdType>, originalRepo: ReadCRUDRepo<ObjectType, IdType>,
noinline idDeserializer: suspend (String) -> IdType noinline idDeserializer: suspend (String) -> IdType
) { ) {
@@ -65,7 +65,7 @@ inline fun <reified ObjectType, reified IdType> Route.configureReadCRUDRepoRoute
} }
} }
inline fun <reified ObjectType, reified IdType> Route.configureReadCRUDRepoRoutes( inline fun <reified ObjectType, reified IdType> Routing.configureReadCRUDRepoRoutes(
originalRepo: ReadCRUDRepo<ObjectType, IdType>, originalRepo: ReadCRUDRepo<ObjectType, IdType>,
idsSerializer: KSerializer<IdType>, idsSerializer: KSerializer<IdType>,
serialFormat: StringFormat serialFormat: StringFormat
@@ -73,7 +73,7 @@ inline fun <reified ObjectType, reified IdType> Route.configureReadCRUDRepoRoute
serialFormat.decodeFromString(idsSerializer, it) serialFormat.decodeFromString(idsSerializer, it)
} }
inline fun <reified ObjectType, reified IdType> Route.configureReadCRUDRepoRoutes( inline fun <reified ObjectType, reified IdType> Routing.configureReadCRUDRepoRoutes(
originalRepo: ReadCRUDRepo<ObjectType, IdType>, originalRepo: ReadCRUDRepo<ObjectType, IdType>,
idsSerializer: KSerializer<IdType>, idsSerializer: KSerializer<IdType>,
serialFormat: BinaryFormat serialFormat: BinaryFormat

View File

@@ -7,10 +7,10 @@ import io.ktor.http.HttpStatusCode
import io.ktor.server.application.call import io.ktor.server.application.call
import io.ktor.server.request.receive import io.ktor.server.request.receive
import io.ktor.server.response.respond import io.ktor.server.response.respond
import io.ktor.server.routing.Route import io.ktor.server.routing.Routing
import io.ktor.server.routing.post import io.ktor.server.routing.post
inline fun <reified ObjectType : Any, reified IdType : Any, reified InputValue : Any> Route.configureWriteCRUDRepoRoutes( inline fun <reified ObjectType : Any, reified IdType : Any, reified InputValue : Any> Routing.configureWriteCRUDRepoRoutes(
originalRepo: WriteCRUDRepo<ObjectType, IdType, InputValue> originalRepo: WriteCRUDRepo<ObjectType, IdType, InputValue>
) { ) {
includeWebsocketHandling( includeWebsocketHandling(

View File

@@ -3,10 +3,10 @@ package dev.inmo.micro_utils.repos.ktor.server.key.value
import dev.inmo.micro_utils.ktor.common.* import dev.inmo.micro_utils.ktor.common.*
import dev.inmo.micro_utils.repos.KeyValueRepo import dev.inmo.micro_utils.repos.KeyValueRepo
import io.ktor.http.* import io.ktor.http.*
import io.ktor.server.routing.Route import io.ktor.server.routing.Routing
import kotlinx.serialization.* import kotlinx.serialization.*
inline fun <reified Key : Any, reified Value : Any> Route.configureKeyValueRepoRoutes ( inline fun <reified Key : Any, reified Value : Any> Routing.configureKeyValueRepoRoutes (
originalRepo: KeyValueRepo<Key, Value>, originalRepo: KeyValueRepo<Key, Value>,
noinline idDeserializer: suspend (String) -> Key, noinline idDeserializer: suspend (String) -> Key,
noinline valueDeserializer: suspend (String) -> Value noinline valueDeserializer: suspend (String) -> Value
@@ -15,7 +15,7 @@ inline fun <reified Key : Any, reified Value : Any> Route.configureKeyValueRepoR
configureWriteKeyValueRepoRoutes(originalRepo) configureWriteKeyValueRepoRoutes(originalRepo)
} }
inline fun <reified Key : Any, reified Value : Any> Route.configureKeyValueRepoRoutes( inline fun <reified Key : Any, reified Value : Any> Routing.configureKeyValueRepoRoutes(
originalRepo: KeyValueRepo<Key, Value>, originalRepo: KeyValueRepo<Key, Value>,
idsSerializer: DeserializationStrategy<Key>, idsSerializer: DeserializationStrategy<Key>,
valueSerializer: DeserializationStrategy<Value>, valueSerializer: DeserializationStrategy<Value>,
@@ -30,7 +30,7 @@ inline fun <reified Key : Any, reified Value : Any> Route.configureKeyValueRepoR
} }
) )
inline fun <reified Key : Any, reified Value : Any> Route.configureKeyValueRepoRoutes( inline fun <reified Key : Any, reified Value : Any> Routing.configureKeyValueRepoRoutes(
originalRepo: KeyValueRepo<Key, Value>, originalRepo: KeyValueRepo<Key, Value>,
idsSerializer: DeserializationStrategy<Key>, idsSerializer: DeserializationStrategy<Key>,
valueSerializer: DeserializationStrategy<Value>, valueSerializer: DeserializationStrategy<Value>,

View File

@@ -14,14 +14,14 @@ import dev.inmo.micro_utils.repos.ktor.common.reversedParameterName
import io.ktor.http.* import io.ktor.http.*
import io.ktor.server.application.call import io.ktor.server.application.call
import io.ktor.server.response.respond import io.ktor.server.response.respond
import io.ktor.server.routing.Route 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.util.InternalAPI
import io.ktor.util.reflect.typeInfo import io.ktor.util.reflect.typeInfo
import kotlinx.serialization.* import kotlinx.serialization.*
@OptIn(InternalAPI::class) @OptIn(InternalAPI::class)
inline fun <reified Key, reified Value> Route.configureReadKeyValueRepoRoutes ( inline fun <reified Key, reified Value> Routing.configureReadKeyValueRepoRoutes (
originalRepo: ReadKeyValueRepo<Key, Value>, originalRepo: ReadKeyValueRepo<Key, Value>,
noinline idDeserializer: suspend (String) -> Key, noinline idDeserializer: suspend (String) -> Key,
noinline valueDeserializer: suspend (String) -> Value noinline valueDeserializer: suspend (String) -> Value
@@ -79,7 +79,7 @@ inline fun <reified Key, reified Value> Route.configureReadKeyValueRepoRoutes (
} }
} }
inline fun <reified Key, reified Value> Route.configureReadKeyValueRepoRoutes( inline fun <reified Key, reified Value> Routing.configureReadKeyValueRepoRoutes(
originalRepo: ReadKeyValueRepo<Key, Value>, originalRepo: ReadKeyValueRepo<Key, Value>,
idsSerializer: DeserializationStrategy<Key>, idsSerializer: DeserializationStrategy<Key>,
valueSerializer: DeserializationStrategy<Value>, valueSerializer: DeserializationStrategy<Value>,
@@ -94,7 +94,7 @@ inline fun <reified Key, reified Value> Route.configureReadKeyValueRepoRoutes(
} }
) )
inline fun <reified Key, reified Value> Route.configureReadKeyValueRepoRoutes( inline fun <reified Key, reified Value> Routing.configureReadKeyValueRepoRoutes(
originalRepo: ReadKeyValueRepo<Key, Value>, originalRepo: ReadKeyValueRepo<Key, Value>,
idsSerializer: DeserializationStrategy<Key>, idsSerializer: DeserializationStrategy<Key>,
valueSerializer: DeserializationStrategy<Value>, valueSerializer: DeserializationStrategy<Value>,

View File

@@ -7,11 +7,11 @@ import io.ktor.http.HttpStatusCode
import io.ktor.server.application.call import io.ktor.server.application.call
import io.ktor.server.request.receive import io.ktor.server.request.receive
import io.ktor.server.response.respond import io.ktor.server.response.respond
import io.ktor.server.routing.Route import io.ktor.server.routing.Routing
import io.ktor.server.routing.post import io.ktor.server.routing.post
import io.ktor.util.reflect.typeInfo import io.ktor.util.reflect.typeInfo
inline fun <reified Key : Any, reified Value : Any> Route.configureWriteKeyValueRepoRoutes ( inline fun <reified Key : Any, reified Value : Any> Routing.configureWriteKeyValueRepoRoutes (
originalRepo: WriteKeyValueRepo<Key, Value> originalRepo: WriteKeyValueRepo<Key, Value>
) { ) {
includeWebsocketHandling( includeWebsocketHandling(

View File

@@ -3,10 +3,10 @@ package dev.inmo.micro_utils.repos.ktor.server.key.values
import dev.inmo.micro_utils.ktor.common.* import dev.inmo.micro_utils.ktor.common.*
import dev.inmo.micro_utils.repos.* import dev.inmo.micro_utils.repos.*
import io.ktor.http.* import io.ktor.http.*
import io.ktor.server.routing.Route import io.ktor.server.routing.Routing
import kotlinx.serialization.* import kotlinx.serialization.*
inline fun <reified Key : Any, reified Value : Any> Route.configureKeyValuesRepoRoutes ( inline fun <reified Key : Any, reified Value : Any> Routing.configureKeyValuesRepoRoutes (
originalRepo: KeyValuesRepo<Key, Value>, originalRepo: KeyValuesRepo<Key, Value>,
noinline keyDeserializer: suspend (String) -> Key, noinline keyDeserializer: suspend (String) -> Key,
noinline valueDeserializer: suspend (String) -> Value noinline valueDeserializer: suspend (String) -> Value
@@ -15,7 +15,7 @@ inline fun <reified Key : Any, reified Value : Any> Route.configureKeyValuesRepo
configureWriteKeyValuesRepoRoutes(originalRepo) configureWriteKeyValuesRepoRoutes(originalRepo)
} }
inline fun <reified Key : Any, reified Value : Any> Route.configureKeyValuesRepoRoutes( inline fun <reified Key : Any, reified Value : Any> Routing.configureKeyValuesRepoRoutes(
originalRepo: KeyValuesRepo<Key, Value>, originalRepo: KeyValuesRepo<Key, Value>,
keySerializer: DeserializationStrategy<Key>, keySerializer: DeserializationStrategy<Key>,
valueSerializer: DeserializationStrategy<Value>, valueSerializer: DeserializationStrategy<Value>,
@@ -30,7 +30,7 @@ inline fun <reified Key : Any, reified Value : Any> Route.configureKeyValuesRepo
} }
) )
inline fun <reified Key : Any, reified Value : Any> Route.configureKeyValuesRepoRoutes( inline fun <reified Key : Any, reified Value : Any> Routing.configureKeyValuesRepoRoutes(
originalRepo: KeyValuesRepo<Key, Value>, originalRepo: KeyValuesRepo<Key, Value>,
keySerializer: DeserializationStrategy<Key>, keySerializer: DeserializationStrategy<Key>,
valueSerializer: DeserializationStrategy<Value>, valueSerializer: DeserializationStrategy<Value>,

View File

@@ -12,14 +12,14 @@ import dev.inmo.micro_utils.repos.ktor.common.one_to_many.*
import io.ktor.http.* import io.ktor.http.*
import io.ktor.server.application.call import io.ktor.server.application.call
import io.ktor.server.response.respond import io.ktor.server.response.respond
import io.ktor.server.routing.Route 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.util.InternalAPI
import io.ktor.util.reflect.typeInfo import io.ktor.util.reflect.typeInfo
import kotlinx.serialization.* import kotlinx.serialization.*
@OptIn(InternalAPI::class) @OptIn(InternalAPI::class)
inline fun <reified Key, reified Value> Route.configureReadKeyValuesRepoRoutes ( inline fun <reified Key, reified Value> Routing.configureReadKeyValuesRepoRoutes (
originalRepo: ReadKeyValuesRepo<Key, Value>, originalRepo: ReadKeyValuesRepo<Key, Value>,
noinline keyDeserializer: suspend (String) -> Key, noinline keyDeserializer: suspend (String) -> Key,
noinline valueDeserializer: suspend (String) -> Value noinline valueDeserializer: suspend (String) -> Value
@@ -76,7 +76,7 @@ inline fun <reified Key, reified Value> Route.configureReadKeyValuesRepoRoutes (
} }
} }
inline fun <reified Key, reified Value> Route.configureReadKeyValuesRepoRoutes( inline fun <reified Key, reified Value> Routing.configureReadKeyValuesRepoRoutes(
originalRepo: ReadKeyValuesRepo<Key, Value>, originalRepo: ReadKeyValuesRepo<Key, Value>,
keySerializer: DeserializationStrategy<Key>, keySerializer: DeserializationStrategy<Key>,
valueSerializer: DeserializationStrategy<Value>, valueSerializer: DeserializationStrategy<Value>,
@@ -91,7 +91,7 @@ inline fun <reified Key, reified Value> Route.configureReadKeyValuesRepoRoutes(
} }
) )
inline fun <reified Key, reified Value> Route.configureReadKeyValuesRepoRoutes( inline fun <reified Key, reified Value> Routing.configureReadKeyValuesRepoRoutes(
originalRepo: ReadKeyValuesRepo<Key, Value>, originalRepo: ReadKeyValuesRepo<Key, Value>,
keySerializer: DeserializationStrategy<Key>, keySerializer: DeserializationStrategy<Key>,
valueSerializer: DeserializationStrategy<Value>, valueSerializer: DeserializationStrategy<Value>,

View File

@@ -7,11 +7,11 @@ import io.ktor.http.HttpStatusCode
import io.ktor.server.application.call import io.ktor.server.application.call
import io.ktor.server.request.receive import io.ktor.server.request.receive
import io.ktor.server.response.respond import io.ktor.server.response.respond
import io.ktor.server.routing.Route import io.ktor.server.routing.Routing
import io.ktor.server.routing.post import io.ktor.server.routing.post
import io.ktor.util.reflect.typeInfo import io.ktor.util.reflect.typeInfo
inline fun <reified Key : Any, reified Value : Any> Route.configureWriteKeyValuesRepoRoutes ( inline fun <reified Key : Any, reified Value : Any> Routing.configureWriteKeyValuesRepoRoutes (
originalRepo: WriteKeyValuesRepo<Key, Value> originalRepo: WriteKeyValuesRepo<Key, Value>
) { ) {
includeWebsocketHandling( includeWebsocketHandling(