diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 97ef9be2041..a1c2bc167f1 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -17,8 +17,8 @@ jobs: mv gradle.properties.tmp gradle.properties - name: Build run: ./gradlew build - - name: Publish + - name: Publish to InmoNexus continue-on-error: true - run: ./gradlew publishAllPublicationsToGiteaRepository + run: ./gradlew publishAllPublicationsToInmoNexusRepository env: GITEA_TOKEN: ${{ secrets.GITEA_TOKEN }} diff --git a/CHANGELOG.md b/CHANGELOG.md index eb4e1809d3e..889df70f702 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,23 @@ # Changelog +## 0.23.0 + +**THIS UPDATE MAY CONTAINS SOME BREAKING CHANGES (INCLUDING BREAKING CHANGES IN BYTECODE LAYER) RELATED TO UPDATE OF +KTOR DEPENDENCY** + +**THIS UPDATE CONTAINS CHANGES ACCORDING TO MIGRATION [GUIDE FROM KTOR](https://ktor.io/docs/migrating-3.html)** + +* `Versions`: + * `Ktor`: `2.3.12` -> `3.0.1` +* `Ktor`: + * `Common`: + * Extension `Input.downloadToTempFile` has changed its receiver to `Source`. Its API can be broken + * `Client`: + * Extension `HttpClient.tempUpload` has changed type of `onUpload` argument from `OnUploadCallback` to `ProgressListener` + * All extensions `HttpClient.uniUpload` have changed type of `onUpload` argument from `OnUploadCallback` to `ProgressListener` + * `Server`: + * Remove redundant `ApplicationCall.respond` extension due to its presence in the ktor library + ## 0.22.9 * `Repos`: diff --git a/gradle.properties b/gradle.properties index 9977ba0db90..8cad02a585c 100644 --- a/gradle.properties +++ b/gradle.properties @@ -15,5 +15,5 @@ crypto_js_version=4.1.1 # Project data group=dev.inmo -version=0.22.9 -android_code_version=275 +version=0.23.0 +android_code_version=276 diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index d4e846e8f23..88f7d79de3a 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -15,7 +15,7 @@ sqlite = "3.46.1.3" korlibs = "5.4.0" uuid = "0.8.4" -ktor = "2.3.12" +ktor = "3.0.1" gh-release = "2.5.2" @@ -23,7 +23,7 @@ koin = "4.0.0" okio = "3.9.1" -ksp = "2.0.21-1.0.25" +ksp = "2.0.21-1.0.26" kotlin-poet = "1.18.1" versions = "0.51.0" diff --git a/ktor/client/src/commonMain/kotlin/dev/inmo/micro_utils/ktor/client/TemporalUpload.kt b/ktor/client/src/commonMain/kotlin/dev/inmo/micro_utils/ktor/client/TemporalUpload.kt index ab0d0de9ab7..d23a292d54f 100644 --- a/ktor/client/src/commonMain/kotlin/dev/inmo/micro_utils/ktor/client/TemporalUpload.kt +++ b/ktor/client/src/commonMain/kotlin/dev/inmo/micro_utils/ktor/client/TemporalUpload.kt @@ -3,9 +3,10 @@ package dev.inmo.micro_utils.ktor.client import dev.inmo.micro_utils.common.MPPFile import dev.inmo.micro_utils.ktor.common.* import io.ktor.client.HttpClient +import io.ktor.client.content.* expect suspend fun HttpClient.tempUpload( fullTempUploadDraftPath: String, file: MPPFile, - onUpload: OnUploadCallback = { _, _ -> } + onUpload: ProgressListener = ProgressListener { _, _ -> } ): TemporalFileId diff --git a/ktor/client/src/commonMain/kotlin/dev/inmo/micro_utils/ktor/client/UniUpload.kt b/ktor/client/src/commonMain/kotlin/dev/inmo/micro_utils/ktor/client/UniUpload.kt index 38f6cc8aea0..8e5bdc87045 100644 --- a/ktor/client/src/commonMain/kotlin/dev/inmo/micro_utils/ktor/client/UniUpload.kt +++ b/ktor/client/src/commonMain/kotlin/dev/inmo/micro_utils/ktor/client/UniUpload.kt @@ -4,8 +4,8 @@ import dev.inmo.micro_utils.common.FileName import dev.inmo.micro_utils.common.MPPFile import dev.inmo.micro_utils.ktor.common.LambdaInputProvider import io.ktor.client.HttpClient +import io.ktor.client.content.* import io.ktor.http.Headers -import io.ktor.utils.io.core.Input import kotlinx.serialization.DeserializationStrategy import kotlinx.serialization.StringFormat import kotlinx.serialization.json.Json @@ -31,7 +31,7 @@ expect suspend fun HttpClient.uniUpload( resultDeserializer: DeserializationStrategy, headers: Headers = Headers.Empty, stringFormat: StringFormat = Json, - onUpload: OnUploadCallback = { _, _ -> } + onUpload: ProgressListener = ProgressListener { _, _ -> } ): T? /** @@ -46,7 +46,7 @@ suspend fun HttpClient.uniUpload( additionalData: Map = emptyMap(), headers: Headers = Headers.Empty, stringFormat: StringFormat = Json, - onUpload: OnUploadCallback = { _, _ -> } + onUpload: ProgressListener = ProgressListener { _, _ -> } ): T? = uniUpload( url, additionalData + ("bytes" to file), @@ -68,7 +68,7 @@ suspend fun HttpClient.uniUpload( additionalData: Map = emptyMap(), headers: Headers = Headers.Empty, stringFormat: StringFormat = Json, - onUpload: OnUploadCallback = { _, _ -> } + onUpload: ProgressListener = ProgressListener { _, _ -> } ): T? = uniUpload( url, additionalData + ("bytes" to info), @@ -93,7 +93,7 @@ suspend fun HttpClient.uniUpload( additionalData: Map = emptyMap(), headers: Headers = Headers.Empty, stringFormat: StringFormat = Json, - onUpload: OnUploadCallback = { _, _ -> } + onUpload: ProgressListener = ProgressListener { _, _ -> } ): T? = uniUpload( url, UniUploadFileInfo(fileName, mimeType, inputAllocator), diff --git a/ktor/client/src/jsMain/kotlin/dev/inmo/micro_utils/ktor/client/ActualTemporalUpload.kt b/ktor/client/src/jsMain/kotlin/dev/inmo/micro_utils/ktor/client/ActualTemporalUpload.kt index 35a9f89a6eb..74c34e3414a 100644 --- a/ktor/client/src/jsMain/kotlin/dev/inmo/micro_utils/ktor/client/ActualTemporalUpload.kt +++ b/ktor/client/src/jsMain/kotlin/dev/inmo/micro_utils/ktor/client/ActualTemporalUpload.kt @@ -5,16 +5,15 @@ import dev.inmo.micro_utils.coroutines.LinkedSupervisorJob import dev.inmo.micro_utils.coroutines.launchSafelyWithoutExceptions import dev.inmo.micro_utils.ktor.common.TemporalFileId import io.ktor.client.HttpClient +import io.ktor.client.content.* import kotlinx.coroutines.* -import org.w3c.dom.mediasource.ENDED -import org.w3c.dom.mediasource.ReadyState import org.w3c.xhr.* import org.w3c.xhr.XMLHttpRequest.Companion.DONE suspend fun tempUpload( fullTempUploadDraftPath: String, file: MPPFile, - onUpload: OnUploadCallback + onUpload: ProgressListener ): TemporalFileId { val formData = FormData() val answer = CompletableDeferred(currentCoroutineContext().job) @@ -28,7 +27,7 @@ suspend fun tempUpload( val request = XMLHttpRequest() request.responseType = XMLHttpRequestResponseType.TEXT request.upload.onprogress = { - subscope.launchSafelyWithoutExceptions { onUpload(it.loaded.toLong(), it.total.toLong()) } + subscope.launchSafelyWithoutExceptions { onUpload.onProgress(it.loaded.toLong(), it.total.toLong()) } } request.onload = { if (request.status == 200.toShort()) { @@ -60,5 +59,5 @@ suspend fun tempUpload( actual suspend fun HttpClient.tempUpload( fullTempUploadDraftPath: String, file: MPPFile, - onUpload: OnUploadCallback + onUpload: ProgressListener ): TemporalFileId = dev.inmo.micro_utils.ktor.client.tempUpload(fullTempUploadDraftPath, file, onUpload) diff --git a/ktor/client/src/jsMain/kotlin/dev/inmo/micro_utils/ktor/client/ActualUniUpload.kt b/ktor/client/src/jsMain/kotlin/dev/inmo/micro_utils/ktor/client/ActualUniUpload.kt index 92bd078fb47..bf1889a949f 100644 --- a/ktor/client/src/jsMain/kotlin/dev/inmo/micro_utils/ktor/client/ActualUniUpload.kt +++ b/ktor/client/src/jsMain/kotlin/dev/inmo/micro_utils/ktor/client/ActualUniUpload.kt @@ -1,10 +1,10 @@ package dev.inmo.micro_utils.ktor.client import dev.inmo.micro_utils.common.MPPFile -import dev.inmo.micro_utils.common.Progress import dev.inmo.micro_utils.coroutines.LinkedSupervisorJob import dev.inmo.micro_utils.coroutines.launchSafelyWithoutExceptions import io.ktor.client.HttpClient +import io.ktor.client.content.* import io.ktor.http.Headers import io.ktor.utils.io.core.readBytes import kotlinx.coroutines.CompletableDeferred @@ -36,7 +36,7 @@ actual suspend fun HttpClient.uniUpload( resultDeserializer: DeserializationStrategy, headers: Headers, stringFormat: StringFormat, - onUpload: OnUploadCallback + onUpload: ProgressListener ): T? { val formData = FormData() val answer = CompletableDeferred(currentCoroutineContext().job) @@ -66,7 +66,7 @@ actual suspend fun HttpClient.uniUpload( } request.responseType = XMLHttpRequestResponseType.TEXT request.upload.onprogress = { - subscope.launchSafelyWithoutExceptions { onUpload(it.loaded.toLong(), it.total.toLong()) } + subscope.launchSafelyWithoutExceptions { onUpload.onProgress(it.loaded.toLong(), it.total.toLong()) } } request.onload = { if (request.status == 200.toShort()) { diff --git a/ktor/client/src/jvmMain/kotlin/dev/inmo/micro_utils/ktor/client/ActualTemporalUpload.kt b/ktor/client/src/jvmMain/kotlin/dev/inmo/micro_utils/ktor/client/ActualTemporalUpload.kt index 3341ef88b83..b55791da76f 100644 --- a/ktor/client/src/jvmMain/kotlin/dev/inmo/micro_utils/ktor/client/ActualTemporalUpload.kt +++ b/ktor/client/src/jvmMain/kotlin/dev/inmo/micro_utils/ktor/client/ActualTemporalUpload.kt @@ -4,6 +4,7 @@ import dev.inmo.micro_utils.common.MPPFile import dev.inmo.micro_utils.common.filename import dev.inmo.micro_utils.ktor.common.TemporalFileId import io.ktor.client.HttpClient +import io.ktor.client.content.* import io.ktor.client.plugins.onUpload import io.ktor.client.request.forms.formData import io.ktor.client.request.forms.submitFormWithBinaryData @@ -18,7 +19,7 @@ internal val MPPFile.mimeType: String actual suspend fun HttpClient.tempUpload( fullTempUploadDraftPath: String, file: MPPFile, - onUpload: OnUploadCallback + onUpload: ProgressListener ): TemporalFileId { val inputProvider = file.inputProvider() val fileId = submitFormWithBinaryData( diff --git a/ktor/client/src/jvmMain/kotlin/dev/inmo/micro_utils/ktor/client/ActualUniUpload.kt b/ktor/client/src/jvmMain/kotlin/dev/inmo/micro_utils/ktor/client/ActualUniUpload.kt index 085e59f179a..0d9d7d25c25 100644 --- a/ktor/client/src/jvmMain/kotlin/dev/inmo/micro_utils/ktor/client/ActualUniUpload.kt +++ b/ktor/client/src/jvmMain/kotlin/dev/inmo/micro_utils/ktor/client/ActualUniUpload.kt @@ -1,8 +1,7 @@ package dev.inmo.micro_utils.ktor.client -import dev.inmo.micro_utils.common.Progress import io.ktor.client.HttpClient -import io.ktor.client.engine.mergeHeaders +import io.ktor.client.content.* import io.ktor.client.plugins.onUpload import io.ktor.client.request.HttpRequestBuilder import io.ktor.client.request.forms.InputProvider @@ -20,7 +19,6 @@ import kotlinx.serialization.DeserializationStrategy import kotlinx.serialization.InternalSerializationApi import kotlinx.serialization.SerializationStrategy import kotlinx.serialization.StringFormat -import kotlinx.serialization.encodeToString import kotlinx.serialization.serializer import java.io.File @@ -39,7 +37,7 @@ actual suspend fun HttpClient.uniUpload( resultDeserializer: DeserializationStrategy, headers: Headers, stringFormat: StringFormat, - onUpload: OnUploadCallback + onUpload: ProgressListener ): T? { val withBinary = data.values.any { it is File || it is UniUploadFileInfo } @@ -76,7 +74,7 @@ actual suspend fun HttpClient.uniUpload( appendAll(headers) } onUpload { bytesSentTotal, contentLength -> - onUpload(bytesSentTotal, contentLength) + onUpload.onProgress(bytesSentTotal, contentLength) } } diff --git a/ktor/client/src/linuxArm64Main/kotlin/ActualTemporalUpload.kt b/ktor/client/src/linuxArm64Main/kotlin/ActualTemporalUpload.kt index 8dc14e5f7c0..59771977727 100644 --- a/ktor/client/src/linuxArm64Main/kotlin/ActualTemporalUpload.kt +++ b/ktor/client/src/linuxArm64Main/kotlin/ActualTemporalUpload.kt @@ -5,6 +5,7 @@ import dev.inmo.micro_utils.common.filename import dev.inmo.micro_utils.ktor.common.TemporalFileId import dev.inmo.micro_utils.mime_types.getMimeTypeOrAny import io.ktor.client.HttpClient +import io.ktor.client.content.* import io.ktor.client.plugins.onUpload import io.ktor.client.request.forms.formData import io.ktor.client.request.forms.submitFormWithBinaryData @@ -18,7 +19,7 @@ internal val MPPFile.mimeType: String actual suspend fun HttpClient.tempUpload( fullTempUploadDraftPath: String, file: MPPFile, - onUpload: OnUploadCallback + onUpload: ProgressListener ): TemporalFileId { val inputProvider = file.inputProvider() val fileId = submitFormWithBinaryData( diff --git a/ktor/client/src/linuxArm64Main/kotlin/ActualUniUpload.kt b/ktor/client/src/linuxArm64Main/kotlin/ActualUniUpload.kt index 4da3d874f80..f7074058e82 100644 --- a/ktor/client/src/linuxArm64Main/kotlin/ActualUniUpload.kt +++ b/ktor/client/src/linuxArm64Main/kotlin/ActualUniUpload.kt @@ -1,9 +1,8 @@ package dev.inmo.micro_utils.ktor.client import dev.inmo.micro_utils.common.MPPFile -import dev.inmo.micro_utils.common.Progress import io.ktor.client.HttpClient -import io.ktor.client.engine.mergeHeaders +import io.ktor.client.content.* import io.ktor.client.plugins.onUpload import io.ktor.client.request.HttpRequestBuilder import io.ktor.client.request.forms.InputProvider @@ -21,7 +20,6 @@ import kotlinx.serialization.DeserializationStrategy import kotlinx.serialization.InternalSerializationApi import kotlinx.serialization.SerializationStrategy import kotlinx.serialization.StringFormat -import kotlinx.serialization.encodeToString import kotlinx.serialization.serializer /** @@ -39,7 +37,7 @@ actual suspend fun HttpClient.uniUpload( resultDeserializer: DeserializationStrategy, headers: Headers, stringFormat: StringFormat, - onUpload: OnUploadCallback + onUpload: ProgressListener ): T? { val withBinary = data.values.any { it is MPPFile || it is UniUploadFileInfo } @@ -75,9 +73,7 @@ actual suspend fun HttpClient.uniUpload( headers { appendAll(headers) } - onUpload { bytesSentTotal, contentLength -> - onUpload(bytesSentTotal, contentLength) - } + onUpload(onUpload) } val response = if (withBinary) { diff --git a/ktor/client/src/linuxX64Main/kotlin/ActualTemporalUpload.kt b/ktor/client/src/linuxX64Main/kotlin/ActualTemporalUpload.kt index 8dc14e5f7c0..59771977727 100644 --- a/ktor/client/src/linuxX64Main/kotlin/ActualTemporalUpload.kt +++ b/ktor/client/src/linuxX64Main/kotlin/ActualTemporalUpload.kt @@ -5,6 +5,7 @@ import dev.inmo.micro_utils.common.filename import dev.inmo.micro_utils.ktor.common.TemporalFileId import dev.inmo.micro_utils.mime_types.getMimeTypeOrAny import io.ktor.client.HttpClient +import io.ktor.client.content.* import io.ktor.client.plugins.onUpload import io.ktor.client.request.forms.formData import io.ktor.client.request.forms.submitFormWithBinaryData @@ -18,7 +19,7 @@ internal val MPPFile.mimeType: String actual suspend fun HttpClient.tempUpload( fullTempUploadDraftPath: String, file: MPPFile, - onUpload: OnUploadCallback + onUpload: ProgressListener ): TemporalFileId { val inputProvider = file.inputProvider() val fileId = submitFormWithBinaryData( diff --git a/ktor/client/src/linuxX64Main/kotlin/ActualUniUpload.kt b/ktor/client/src/linuxX64Main/kotlin/ActualUniUpload.kt index 4da3d874f80..f7074058e82 100644 --- a/ktor/client/src/linuxX64Main/kotlin/ActualUniUpload.kt +++ b/ktor/client/src/linuxX64Main/kotlin/ActualUniUpload.kt @@ -1,9 +1,8 @@ package dev.inmo.micro_utils.ktor.client import dev.inmo.micro_utils.common.MPPFile -import dev.inmo.micro_utils.common.Progress import io.ktor.client.HttpClient -import io.ktor.client.engine.mergeHeaders +import io.ktor.client.content.* import io.ktor.client.plugins.onUpload import io.ktor.client.request.HttpRequestBuilder import io.ktor.client.request.forms.InputProvider @@ -21,7 +20,6 @@ import kotlinx.serialization.DeserializationStrategy import kotlinx.serialization.InternalSerializationApi import kotlinx.serialization.SerializationStrategy import kotlinx.serialization.StringFormat -import kotlinx.serialization.encodeToString import kotlinx.serialization.serializer /** @@ -39,7 +37,7 @@ actual suspend fun HttpClient.uniUpload( resultDeserializer: DeserializationStrategy, headers: Headers, stringFormat: StringFormat, - onUpload: OnUploadCallback + onUpload: ProgressListener ): T? { val withBinary = data.values.any { it is MPPFile || it is UniUploadFileInfo } @@ -75,9 +73,7 @@ actual suspend fun HttpClient.uniUpload( headers { appendAll(headers) } - onUpload { bytesSentTotal, contentLength -> - onUpload(bytesSentTotal, contentLength) - } + onUpload(onUpload) } val response = if (withBinary) { diff --git a/ktor/client/src/mingwX64Main/kotlin/ActualTemporalUpload.kt b/ktor/client/src/mingwX64Main/kotlin/ActualTemporalUpload.kt index 8dc14e5f7c0..59771977727 100644 --- a/ktor/client/src/mingwX64Main/kotlin/ActualTemporalUpload.kt +++ b/ktor/client/src/mingwX64Main/kotlin/ActualTemporalUpload.kt @@ -5,6 +5,7 @@ import dev.inmo.micro_utils.common.filename import dev.inmo.micro_utils.ktor.common.TemporalFileId import dev.inmo.micro_utils.mime_types.getMimeTypeOrAny import io.ktor.client.HttpClient +import io.ktor.client.content.* import io.ktor.client.plugins.onUpload import io.ktor.client.request.forms.formData import io.ktor.client.request.forms.submitFormWithBinaryData @@ -18,7 +19,7 @@ internal val MPPFile.mimeType: String actual suspend fun HttpClient.tempUpload( fullTempUploadDraftPath: String, file: MPPFile, - onUpload: OnUploadCallback + onUpload: ProgressListener ): TemporalFileId { val inputProvider = file.inputProvider() val fileId = submitFormWithBinaryData( diff --git a/ktor/client/src/mingwX64Main/kotlin/ActualUniUpload.kt b/ktor/client/src/mingwX64Main/kotlin/ActualUniUpload.kt index 4da3d874f80..f7074058e82 100644 --- a/ktor/client/src/mingwX64Main/kotlin/ActualUniUpload.kt +++ b/ktor/client/src/mingwX64Main/kotlin/ActualUniUpload.kt @@ -1,9 +1,8 @@ package dev.inmo.micro_utils.ktor.client import dev.inmo.micro_utils.common.MPPFile -import dev.inmo.micro_utils.common.Progress import io.ktor.client.HttpClient -import io.ktor.client.engine.mergeHeaders +import io.ktor.client.content.* import io.ktor.client.plugins.onUpload import io.ktor.client.request.HttpRequestBuilder import io.ktor.client.request.forms.InputProvider @@ -21,7 +20,6 @@ import kotlinx.serialization.DeserializationStrategy import kotlinx.serialization.InternalSerializationApi import kotlinx.serialization.SerializationStrategy import kotlinx.serialization.StringFormat -import kotlinx.serialization.encodeToString import kotlinx.serialization.serializer /** @@ -39,7 +37,7 @@ actual suspend fun HttpClient.uniUpload( resultDeserializer: DeserializationStrategy, headers: Headers, stringFormat: StringFormat, - onUpload: OnUploadCallback + onUpload: ProgressListener ): T? { val withBinary = data.values.any { it is MPPFile || it is UniUploadFileInfo } @@ -75,9 +73,7 @@ actual suspend fun HttpClient.uniUpload( headers { appendAll(headers) } - onUpload { bytesSentTotal, contentLength -> - onUpload(bytesSentTotal, contentLength) - } + onUpload(onUpload) } val response = if (withBinary) { diff --git a/ktor/common/src/jvmMain/kotlin/dev/inmo/micro_utils/ktor/common/CreateTempFileFromInput.kt b/ktor/common/src/jvmMain/kotlin/dev/inmo/micro_utils/ktor/common/CreateTempFileFromInput.kt index 5c7b97f888f..738be8f77b4 100644 --- a/ktor/common/src/jvmMain/kotlin/dev/inmo/micro_utils/ktor/common/CreateTempFileFromInput.kt +++ b/ktor/common/src/jvmMain/kotlin/dev/inmo/micro_utils/ktor/common/CreateTempFileFromInput.kt @@ -1,13 +1,12 @@ package dev.inmo.micro_utils.ktor.common -import io.ktor.utils.io.core.Input -import io.ktor.utils.io.core.copyTo -import io.ktor.utils.io.streams.asOutput +import io.ktor.utils.io.streams.* +import kotlinx.io.Source +import kotlinx.io.readTo import java.io.File -import java.io.InputStream import java.util.UUID -fun Input.downloadToTempFile( +fun Source.downloadToTempFile( fileName: String = UUID.randomUUID().toString(), fileExtension: String? = ".temp", folder: File? = null @@ -17,7 +16,7 @@ fun Input.downloadToTempFile( folder ).apply { outputStream().use { - copyTo(it.asOutput()) + it.writePacket(this@downloadToTempFile) } deleteOnExit() } diff --git a/ktor/server/src/jvmMain/kotlin/dev/inmo/micro_utils/ktor/server/ApplicationCallRespondWithTypeInfo.kt b/ktor/server/src/jvmMain/kotlin/dev/inmo/micro_utils/ktor/server/ApplicationCallRespondWithTypeInfo.kt deleted file mode 100644 index 207dde73a63..00000000000 --- a/ktor/server/src/jvmMain/kotlin/dev/inmo/micro_utils/ktor/server/ApplicationCallRespondWithTypeInfo.kt +++ /dev/null @@ -1,15 +0,0 @@ -package dev.inmo.micro_utils.ktor.server - -import io.ktor.server.application.ApplicationCall -import io.ktor.server.response.responseType -import io.ktor.util.InternalAPI -import io.ktor.util.reflect.TypeInfo - -@InternalAPI -suspend fun ApplicationCall.respond( - message: T, - typeInfo: TypeInfo -) { - response.responseType = typeInfo - response.pipeline.execute(this, message as Any) -} diff --git a/ktor/server/src/jvmMain/kotlin/dev/inmo/micro_utils/ktor/server/DownloadFileItem.kt b/ktor/server/src/jvmMain/kotlin/dev/inmo/micro_utils/ktor/server/DownloadFileItem.kt index 998fef99797..ba5b67becfd 100644 --- a/ktor/server/src/jvmMain/kotlin/dev/inmo/micro_utils/ktor/server/DownloadFileItem.kt +++ b/ktor/server/src/jvmMain/kotlin/dev/inmo/micro_utils/ktor/server/DownloadFileItem.kt @@ -4,13 +4,13 @@ import com.benasher44.uuid.uuid4 import io.ktor.http.content.PartData import io.ktor.utils.io.copyTo import io.ktor.utils.io.core.copyTo -import io.ktor.utils.io.jvm.javaio.copyTo -import io.ktor.utils.io.streams.asOutput +import io.ktor.utils.io.jvm.javaio.* +import io.ktor.utils.io.streams.* import java.io.File fun PartData.FileItem.download(target: File) { - provider().use { input -> - target.outputStream().asOutput().use { + provider().toInputStream().use { input -> + target.outputStream().use { input.copyTo(it) } } @@ -25,9 +25,9 @@ fun PartData.FileItem.downloadToTemporalFile(): File { } fun PartData.BinaryItem.download(target: File) { - provider().use { input -> + provider().inputStream().use { input -> target.outputStream().use { - input.copyTo(it.asOutput()) + input.copyTo(it) } } } diff --git a/ktor/server/src/jvmMain/kotlin/dev/inmo/micro_utils/ktor/server/StartServer.kt b/ktor/server/src/jvmMain/kotlin/dev/inmo/micro_utils/ktor/server/StartServer.kt index 821403521f6..8ad61980db2 100644 --- a/ktor/server/src/jvmMain/kotlin/dev/inmo/micro_utils/ktor/server/StartServer.kt +++ b/ktor/server/src/jvmMain/kotlin/dev/inmo/micro_utils/ktor/server/StartServer.kt @@ -1,7 +1,7 @@ package dev.inmo.micro_utils.ktor.server 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.CIOApplicationEngine import io.ktor.server.engine.* @@ -11,20 +11,22 @@ fun , host: String = "localhost", port: Int = Random.nextInt(1024, 65535), - additionalEngineEnvironmentConfigurator: ApplicationEngineEnvironmentBuilder.() -> Unit = {}, + additionalEngineEnvironmentConfigurator: EngineConnectorBuilder.() -> Unit = {}, additionalConfigurationConfigurator: TConfiguration.() -> Unit = {}, + environment: ApplicationEnvironment = applicationEnvironment(), block: Application.() -> Unit -): TEngine = embeddedServer( +): EmbeddedServer = embeddedServer( engine, - applicationEngineEnvironment { - module(block) + environment, + { connector { this.host = host this.port = port + additionalEngineEnvironmentConfigurator() } - additionalEngineEnvironmentConfigurator() + additionalConfigurationConfigurator() }, - additionalConfigurationConfigurator + module = block ) /** @@ -35,15 +37,17 @@ fun Unit = {}, + additionalEngineEnvironmentConfigurator: EngineConnectorBuilder.() -> Unit = {}, additionalConfigurationConfigurator: CIOApplicationEngine.Configuration.() -> Unit = {}, + environment: ApplicationEnvironment = applicationEnvironment(), block: Application.() -> Unit -): CIOApplicationEngine = createKtorServer( +): EmbeddedServer = createKtorServer( CIO, host, port, additionalEngineEnvironmentConfigurator, additionalConfigurationConfigurator, + environment, block ) @@ -51,15 +55,17 @@ fun , host: String = "localhost", port: Int = Random.nextInt(1024, 65535), - additionalEngineEnvironmentConfigurator: ApplicationEngineEnvironmentBuilder.() -> Unit = {}, + additionalEngineEnvironmentConfigurator: EngineConnectorBuilder.() -> Unit = {}, additionalConfigurationConfigurator: TConfiguration.() -> Unit = {}, + environment: ApplicationEnvironment = applicationEnvironment(), configurators: List -): TEngine = createKtorServer( +): EmbeddedServer = createKtorServer( engine, host, port, additionalEngineEnvironmentConfigurator, - additionalConfigurationConfigurator + additionalConfigurationConfigurator, + environment, ) { configurators.forEach { it.apply { configure() } } } @@ -73,6 +79,7 @@ fun createKtorServer( host: String = "localhost", port: Int = Random.nextInt(1024, 65535), configurators: List, - additionalEngineEnvironmentConfigurator: ApplicationEngineEnvironmentBuilder.() -> Unit = {}, + additionalEngineEnvironmentConfigurator: EngineConnectorBuilder.() -> Unit = {}, additionalConfigurationConfigurator: CIOApplicationEngine.Configuration.() -> Unit = {}, -): ApplicationEngine = createKtorServer(CIO, host, port, additionalEngineEnvironmentConfigurator, additionalConfigurationConfigurator, configurators) + environment: ApplicationEnvironment = applicationEnvironment(), +): EmbeddedServer = createKtorServer(CIO, host, port, additionalEngineEnvironmentConfigurator, additionalConfigurationConfigurator, environment, configurators) diff --git a/ktor/server/src/jvmMain/kotlin/dev/inmo/micro_utils/ktor/server/TemporalFilesRoutingConfigurator.kt b/ktor/server/src/jvmMain/kotlin/dev/inmo/micro_utils/ktor/server/TemporalFilesRoutingConfigurator.kt index dd45d06741a..08a85af4a04 100644 --- a/ktor/server/src/jvmMain/kotlin/dev/inmo/micro_utils/ktor/server/TemporalFilesRoutingConfigurator.kt +++ b/ktor/server/src/jvmMain/kotlin/dev/inmo/micro_utils/ktor/server/TemporalFilesRoutingConfigurator.kt @@ -17,6 +17,7 @@ import io.ktor.server.response.respondText import io.ktor.server.routing.Route import io.ktor.server.routing.post import kotlinx.coroutines.* +import kotlinx.coroutines.channels.BufferOverflow import kotlinx.coroutines.flow.* import kotlinx.coroutines.sync.Mutex import kotlinx.coroutines.sync.withLock @@ -26,7 +27,10 @@ import java.nio.file.attribute.FileTime class TemporalFilesRoutingConfigurator( 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 { interface TemporalFilesUtilizer { fun start(filesMap: MutableMap, filesMutex: Mutex, onNewFileFlow: Flow): Job @@ -74,7 +78,11 @@ class TemporalFilesRoutingConfigurator( private val temporalFilesMap = mutableMapOf() private val temporalFilesMutex = Mutex() - private val filesFlow = MutableSharedFlow() + private val filesFlow = MutableSharedFlow( + replay = filesFlowReplay, + extraBufferCapacity = filesFlowExtraBufferCapacity, + onBufferOverflow = filesFlowOnBufferOverflow + ) val utilizerJob = temporalFilesUtilizer.start(temporalFilesMap, temporalFilesMutex, filesFlow.asSharedFlow()) override fun Route.invoke() { @@ -111,7 +119,7 @@ class TemporalFilesRoutingConfigurator( temporalFilesMap[fileId] = file } call.respondText(fileId.string) - launchSafelyWithoutExceptions { filesFlow.emit(fileId) } + filesFlow.emit(fileId) } ?: call.respond(HttpStatusCode.BadRequest) } } diff --git a/ktor/server/src/jvmMain/kotlin/dev/inmo/micro_utils/ktor/server/UniloadMultipart.kt b/ktor/server/src/jvmMain/kotlin/dev/inmo/micro_utils/ktor/server/UniloadMultipart.kt index 7898092e54d..0bf7828a49b 100644 --- a/ktor/server/src/jvmMain/kotlin/dev/inmo/micro_utils/ktor/server/UniloadMultipart.kt +++ b/ktor/server/src/jvmMain/kotlin/dev/inmo/micro_utils/ktor/server/UniloadMultipart.kt @@ -6,6 +6,7 @@ import dev.inmo.micro_utils.ktor.common.downloadToTempFile import io.ktor.http.content.* import io.ktor.server.application.ApplicationCall import io.ktor.server.request.receiveMultipart +import io.ktor.utils.io.* import io.ktor.utils.io.core.* import kotlinx.coroutines.currentCoroutineContext import kotlinx.coroutines.isActive @@ -47,7 +48,7 @@ suspend fun ApplicationCall.uniloadMultipart( onBinaryChannelItem ) { when (it.name) { - "bytes" -> resultInput = it.provider() + "bytes" -> resultInput = it.provider().readBuffer() else -> onCustomFileItem(it) } } diff --git a/ktor/server/src/jvmMain/kotlin/dev/inmo/micro_utils/ktor/server/configurators/ApplicationRoutingConfigurator.kt b/ktor/server/src/jvmMain/kotlin/dev/inmo/micro_utils/ktor/server/configurators/ApplicationRoutingConfigurator.kt index 3c008d79b87..844d669c1a4 100644 --- a/ktor/server/src/jvmMain/kotlin/dev/inmo/micro_utils/ktor/server/configurators/ApplicationRoutingConfigurator.kt +++ b/ktor/server/src/jvmMain/kotlin/dev/inmo/micro_utils/ktor/server/configurators/ApplicationRoutingConfigurator.kt @@ -2,8 +2,7 @@ package dev.inmo.micro_utils.ktor.server.configurators import dev.inmo.micro_utils.ktor.server.configurators.ApplicationRoutingConfigurator.Element import io.ktor.server.application.* -import io.ktor.server.routing.Route -import io.ktor.server.routing.Routing +import io.ktor.server.routing.* import kotlinx.serialization.Contextual import kotlinx.serialization.Serializable @@ -19,9 +18,7 @@ class ApplicationRoutingConfigurator( } override fun Application.configure() { - pluginOrNull(Routing) ?.apply { - rootInstaller.apply { invoke() } - } ?: install(Routing) { + routing { rootInstaller.apply { invoke() } } } diff --git a/ktor/server/src/jvmMain/kotlin/dev/inmo/micro_utils/ktor/server/configurators/KtorApplicationConfigurator.kt b/ktor/server/src/jvmMain/kotlin/dev/inmo/micro_utils/ktor/server/configurators/KtorApplicationConfigurator.kt index a75503b323a..4c3f73393df 100644 --- a/ktor/server/src/jvmMain/kotlin/dev/inmo/micro_utils/ktor/server/configurators/KtorApplicationConfigurator.kt +++ b/ktor/server/src/jvmMain/kotlin/dev/inmo/micro_utils/ktor/server/configurators/KtorApplicationConfigurator.kt @@ -23,9 +23,7 @@ interface KtorApplicationConfigurator { } override fun Application.configure() { - pluginOrNull(io.ktor.server.routing.Routing) ?.apply { - rootInstaller.apply { invoke() } - } ?: install(io.ktor.server.routing.Routing) { + routing { rootInstaller.apply { invoke() } } } diff --git a/repos/ktor/client/src/commonMain/kotlin/dev/inmo/micro_utils/repos/ktor/client/key/value/KtorWriteKeyValueRepoClient.kt b/repos/ktor/client/src/commonMain/kotlin/dev/inmo/micro_utils/repos/ktor/client/key/value/KtorWriteKeyValueRepoClient.kt index 12de3b5538a..04548c751ba 100644 --- a/repos/ktor/client/src/commonMain/kotlin/dev/inmo/micro_utils/repos/ktor/client/key/value/KtorWriteKeyValueRepoClient.kt +++ b/repos/ktor/client/src/commonMain/kotlin/dev/inmo/micro_utils/repos/ktor/client/key/value/KtorWriteKeyValueRepoClient.kt @@ -8,7 +8,7 @@ import dev.inmo.micro_utils.repos.ktor.common.key_value.* import io.ktor.client.HttpClient import io.ktor.client.request.post 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 kotlinx.coroutines.flow.Flow diff --git a/repos/ktor/client/src/commonMain/kotlin/dev/inmo/micro_utils/repos/ktor/client/key/values/KtorWriteKeyValuesRepoClient.kt b/repos/ktor/client/src/commonMain/kotlin/dev/inmo/micro_utils/repos/ktor/client/key/values/KtorWriteKeyValuesRepoClient.kt index 5fe28f0a7af..50225e60d9d 100644 --- a/repos/ktor/client/src/commonMain/kotlin/dev/inmo/micro_utils/repos/ktor/client/key/values/KtorWriteKeyValuesRepoClient.kt +++ b/repos/ktor/client/src/commonMain/kotlin/dev/inmo/micro_utils/repos/ktor/client/key/values/KtorWriteKeyValuesRepoClient.kt @@ -8,7 +8,7 @@ import dev.inmo.micro_utils.repos.ktor.common.one_to_many.* import io.ktor.client.HttpClient import io.ktor.client.request.post 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 kotlinx.coroutines.flow.Flow diff --git a/repos/ktor/common/src/jvmTest/kotlin/KtorCRUDRepoTests.kt b/repos/ktor/common/src/jvmTest/kotlin/KtorCRUDRepoTests.kt index 0ed2b98eba3..0426e0e6aca 100644 --- a/repos/ktor/common/src/jvmTest/kotlin/KtorCRUDRepoTests.kt +++ b/repos/ktor/common/src/jvmTest/kotlin/KtorCRUDRepoTests.kt @@ -25,7 +25,7 @@ import kotlin.test.Test import kotlin.test.assertEquals class KtorCRUDRepoTests : CommonCRUDRepoTests() { - private var engine: ApplicationEngine? = null + private var engine: EmbeddedServer<*, *>? = null @BeforeTest fun beforeTest() { diff --git a/repos/ktor/common/src/jvmTest/kotlin/KtorKeyValueRepoTests.kt b/repos/ktor/common/src/jvmTest/kotlin/KtorKeyValueRepoTests.kt index 80942cba6a8..781c15c764d 100644 --- a/repos/ktor/common/src/jvmTest/kotlin/KtorKeyValueRepoTests.kt +++ b/repos/ktor/common/src/jvmTest/kotlin/KtorKeyValueRepoTests.kt @@ -27,7 +27,7 @@ import kotlinx.serialization.json.Json import kotlin.test.* class KtorKeyValueRepoTests : CommonKeyValueRepoTests() { - private var engine: ApplicationEngine? = null + private var engine: EmbeddedServer<*, *>? = null override val repoCreator: suspend () -> KeyValueRepo = { KtorKeyValueRepoClient( @@ -77,7 +77,7 @@ class KtorKeyValueRepoTests : CommonKeyValueRepoTests() { repo, Int.serializer(), ComplexData.serializer(), - Json {} + Json ) } }.start(false) diff --git a/repos/ktor/common/src/jvmTest/kotlin/KtorKeyValuesRepoTests.kt b/repos/ktor/common/src/jvmTest/kotlin/KtorKeyValuesRepoTests.kt index a5f7214fafa..2b932e84d63 100644 --- a/repos/ktor/common/src/jvmTest/kotlin/KtorKeyValuesRepoTests.kt +++ b/repos/ktor/common/src/jvmTest/kotlin/KtorKeyValuesRepoTests.kt @@ -23,7 +23,7 @@ import kotlinx.serialization.json.Json import kotlin.test.* class KtorKeyValuesRepoTests : CommonKeyValuesRepoTests() { - private var engine: ApplicationEngine? = null + private var engine: EmbeddedServer<*, *>? = null override val testSequencesSize: Int get() = 100 diff --git a/repos/ktor/common/src/jvmTest/kotlin/KtorRepoTestsHelper.kt b/repos/ktor/common/src/jvmTest/kotlin/KtorRepoTestsHelper.kt index d50cd7fca5d..ea814a58119 100644 --- a/repos/ktor/common/src/jvmTest/kotlin/KtorRepoTestsHelper.kt +++ b/repos/ktor/common/src/jvmTest/kotlin/KtorRepoTestsHelper.kt @@ -13,7 +13,7 @@ import io.ktor.server.websocket.* import kotlinx.serialization.json.Json object KtorRepoTestsHelper { - fun beforeTest(routingConfigurator: Routing.() -> Unit): ApplicationEngine { + fun beforeTest(routingConfigurator: Routing.() -> Unit): EmbeddedServer { return embeddedServer( CIO, 23456, @@ -28,7 +28,7 @@ object KtorRepoTestsHelper { routing(routingConfigurator) }.start(false) } - fun afterTest(engine: ApplicationEngine) { + fun afterTest(engine: EmbeddedServer<*, *>) { engine.stop() } fun client(): HttpClient = HttpClient { diff --git a/repos/ktor/server/src/jvmMain/kotlin/dev/inmo/micro_utils/repos/ktor/server/key/value/KtorReadKeyValueRepoRoutes.kt b/repos/ktor/server/src/jvmMain/kotlin/dev/inmo/micro_utils/repos/ktor/server/key/value/KtorReadKeyValueRepoRoutes.kt index 418d87cae7e..6ee55d25edb 100644 --- a/repos/ktor/server/src/jvmMain/kotlin/dev/inmo/micro_utils/repos/ktor/server/key/value/KtorReadKeyValueRepoRoutes.kt +++ b/repos/ktor/server/src/jvmMain/kotlin/dev/inmo/micro_utils/repos/ktor/server/key/value/KtorReadKeyValueRepoRoutes.kt @@ -16,7 +16,7 @@ import io.ktor.server.application.call import io.ktor.server.response.respond import io.ktor.server.routing.Route import io.ktor.server.routing.get -import io.ktor.util.InternalAPI +import io.ktor.utils.io.InternalAPI import io.ktor.util.reflect.typeInfo import kotlinx.serialization.* diff --git a/repos/ktor/server/src/jvmMain/kotlin/dev/inmo/micro_utils/repos/ktor/server/key/values/KtorReadKeyValuesRepoRoutes.kt b/repos/ktor/server/src/jvmMain/kotlin/dev/inmo/micro_utils/repos/ktor/server/key/values/KtorReadKeyValuesRepoRoutes.kt index 0953465cd60..6d365b054fc 100644 --- a/repos/ktor/server/src/jvmMain/kotlin/dev/inmo/micro_utils/repos/ktor/server/key/values/KtorReadKeyValuesRepoRoutes.kt +++ b/repos/ktor/server/src/jvmMain/kotlin/dev/inmo/micro_utils/repos/ktor/server/key/values/KtorReadKeyValuesRepoRoutes.kt @@ -14,7 +14,7 @@ import io.ktor.server.application.call import io.ktor.server.response.respond import io.ktor.server.routing.Route import io.ktor.server.routing.get -import io.ktor.util.InternalAPI +import io.ktor.utils.io.InternalAPI import io.ktor.util.reflect.typeInfo import kotlinx.serialization.* diff --git a/serialization/typed_serializer/src/commonTest/kotlin/dev/inmo/micro_utils/serialization/typed_serializer/TypedSerializerTests.kt b/serialization/typed_serializer/src/commonTest/kotlin/dev/inmo/micro_utils/serialization/typed_serializer/TypedSerializerTests.kt index cf14169be80..40e74155be5 100644 --- a/serialization/typed_serializer/src/commonTest/kotlin/dev/inmo/micro_utils/serialization/typed_serializer/TypedSerializerTests.kt +++ b/serialization/typed_serializer/src/commonTest/kotlin/dev/inmo/micro_utils/serialization/typed_serializer/TypedSerializerTests.kt @@ -11,7 +11,7 @@ class TypedSerializerTests { interface Example { val number: Number } - val serialFormat = Json { } + val serialFormat = Json @Serializable data class Example1(override val number: Long) : Example