From 16c57fcd6aabae896b807cfe715ab13bce11f0f1 Mon Sep 17 00:00:00 2001 From: InsanusMokrassar Date: Fri, 4 Mar 2022 15:17:36 +0600 Subject: [PATCH 1/6] start 0.9.10 --- CHANGELOG.md | 2 ++ gradle.properties | 4 ++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 994767b69b1..925a1618e4f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,7 @@ # Changelog +## 0.9.10 + ## 0.9.9 * `Versions`: diff --git a/gradle.properties b/gradle.properties index 5a55491619f..3d8807e8e4a 100644 --- a/gradle.properties +++ b/gradle.properties @@ -45,5 +45,5 @@ dokka_version=1.6.10 # Project data group=dev.inmo -version=0.9.9 -android_code_version=99 +version=0.9.10 +android_code_version=100 From 771aed0f0f7e5f5af5edc93ef4eb2b5242750c49 Mon Sep 17 00:00:00 2001 From: InsanusMokrassar Date: Fri, 4 Mar 2022 15:20:10 +0600 Subject: [PATCH 2/6] UnifiedRequester#createStandardWebsocketFlow(String,DeserializationStrategy) --- CHANGELOG.md | 4 ++++ .../micro_utils/ktor/client/StandardHttpClientGetPost.kt | 7 ++++++- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 925a1618e4f..457bd88e9d5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,10 @@ ## 0.9.10 +* Ktor: + * Client: + * New function `UnifiedRequester#createStandardWebsocketFlow` without `checkReconnection` arg + ## 0.9.9 * `Versions`: diff --git a/ktor/client/src/commonMain/kotlin/dev/inmo/micro_utils/ktor/client/StandardHttpClientGetPost.kt b/ktor/client/src/commonMain/kotlin/dev/inmo/micro_utils/ktor/client/StandardHttpClientGetPost.kt index 0cc8af023aa..dc3d88a235f 100644 --- a/ktor/client/src/commonMain/kotlin/dev/inmo/micro_utils/ktor/client/StandardHttpClientGetPost.kt +++ b/ktor/client/src/commonMain/kotlin/dev/inmo/micro_utils/ktor/client/StandardHttpClientGetPost.kt @@ -85,9 +85,14 @@ class UnifiedRequester( fun createStandardWebsocketFlow( url: String, - checkReconnection: (Throwable?) -> Boolean = { true }, + checkReconnection: (Throwable?) -> Boolean, deserializer: DeserializationStrategy ) = client.createStandardWebsocketFlow(url, checkReconnection, deserializer, serialFormat) + + fun createStandardWebsocketFlow( + url: String, + deserializer: DeserializationStrategy + ) = createStandardWebsocketFlow(url, { true }, deserializer) } val defaultRequester = UnifiedRequester() From 14ebe01fc61cab110cfe9df8d418fb6260206c30 Mon Sep 17 00:00:00 2001 From: InsanusMokrassar Date: Fri, 4 Mar 2022 15:31:32 +0600 Subject: [PATCH 3/6] improvements in includeWebsocketHandling --- CHANGELOG.md | 3 ++ .../micro_utils/ktor/server/FlowsWebsocket.kt | 29 ++++++++++++++----- .../ktor/server/ServerRoutingShortcuts.kt | 6 ++-- 3 files changed, 29 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 457bd88e9d5..48edbd27042 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,9 @@ * Ktor: * Client: * New function `UnifiedRequester#createStandardWebsocketFlow` without `checkReconnection` arg + * Server: + * Now it is possible to filter data in `Route#includeWebsocketHandling` + * Callback in `Route#includeWebsocketHandling` is `suspend` since now ## 0.9.9 diff --git a/ktor/server/src/jvmMain/kotlin/dev/inmo/micro_utils/ktor/server/FlowsWebsocket.kt b/ktor/server/src/jvmMain/kotlin/dev/inmo/micro_utils/ktor/server/FlowsWebsocket.kt index d26cd03cb08..0a47a932fc4 100644 --- a/ktor/server/src/jvmMain/kotlin/dev/inmo/micro_utils/ktor/server/FlowsWebsocket.kt +++ b/ktor/server/src/jvmMain/kotlin/dev/inmo/micro_utils/ktor/server/FlowsWebsocket.kt @@ -7,6 +7,7 @@ import io.ktor.application.install import io.ktor.http.cio.websocket.* import io.ktor.routing.Route import io.ktor.routing.application +import io.ktor.websocket.WebSocketServerSession import io.ktor.websocket.webSocket import kotlinx.coroutines.flow.Flow import kotlinx.serialization.SerializationStrategy @@ -14,7 +15,7 @@ import kotlinx.serialization.SerializationStrategy fun Route.includeWebsocketHandling( suburl: String, flow: Flow, - converter: (T) -> StandardKtorSerialInputData + converter: suspend WebSocketServerSession.(T) -> StandardKtorSerialInputData? ) { application.apply { featureOrNull(io.ktor.websocket.WebSockets) ?: install(io.ktor.websocket.WebSockets) @@ -22,7 +23,9 @@ fun Route.includeWebsocketHandling( webSocket(suburl) { safely { flow.collect { - send(converter(it)) + converter(it) ?.let { data -> + send(data) + } } } } @@ -32,10 +35,22 @@ fun Route.includeWebsocketHandling( suburl: String, flow: Flow, serializer: SerializationStrategy, - serialFormat: StandardKtorSerialFormat = standardKtorSerialFormat + serialFormat: StandardKtorSerialFormat = standardKtorSerialFormat, + filter: (suspend WebSocketServerSession.(T) -> Boolean)? = null ) = includeWebsocketHandling( suburl, - flow -) { - serialFormat.encodeDefault(serializer, it) -} + flow, + converter = if (filter == null) { + { + serialFormat.encodeDefault(serializer, it) + } + } else { + { + if (filter(it)) { + serialFormat.encodeDefault(serializer, it) + } else { + null + } + } + } +) diff --git a/ktor/server/src/jvmMain/kotlin/dev/inmo/micro_utils/ktor/server/ServerRoutingShortcuts.kt b/ktor/server/src/jvmMain/kotlin/dev/inmo/micro_utils/ktor/server/ServerRoutingShortcuts.kt index fac6c49af08..eec3976f64e 100644 --- a/ktor/server/src/jvmMain/kotlin/dev/inmo/micro_utils/ktor/server/ServerRoutingShortcuts.kt +++ b/ktor/server/src/jvmMain/kotlin/dev/inmo/micro_utils/ktor/server/ServerRoutingShortcuts.kt @@ -18,6 +18,7 @@ import io.ktor.util.asStream import io.ktor.util.cio.writeChannel import io.ktor.util.pipeline.PipelineContext import io.ktor.utils.io.core.* +import io.ktor.websocket.WebSocketServerSession import kotlinx.coroutines.flow.Flow import kotlinx.serialization.* import java.io.File @@ -30,8 +31,9 @@ class UnifiedRouter( fun Route.includeWebsocketHandling( suburl: String, flow: Flow, - serializer: SerializationStrategy - ) = includeWebsocketHandling(suburl, flow, serializer, serialFormat) + serializer: SerializationStrategy, + filter: (suspend WebSocketServerSession.(T) -> Boolean)? = null + ) = includeWebsocketHandling(suburl, flow, serializer, serialFormat, filter) suspend fun PipelineContext<*, ApplicationCall>.unianswer( answerSerializer: SerializationStrategy, From 88854020aca52442b62d9f0a9d30326878d510e1 Mon Sep 17 00:00:00 2001 From: InsanusMokrassar Date: Fri, 4 Mar 2022 20:16:59 +0600 Subject: [PATCH 4/6] extend functionality of websockets --- CHANGELOG.md | 3 ++- .../inmo/micro_utils/ktor/client/FlowsWebsockets.kt | 10 +++++++--- .../ktor/client/StandardHttpClientGetPost.kt | 10 ++++++---- .../dev/inmo/micro_utils/ktor/server/FlowsWebsocket.kt | 9 ++++++--- .../micro_utils/ktor/server/ServerRoutingShortcuts.kt | 6 +++--- 5 files changed, 24 insertions(+), 14 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 48edbd27042..8799b74afa2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,7 +7,8 @@ * New function `UnifiedRequester#createStandardWebsocketFlow` without `checkReconnection` arg * Server: * Now it is possible to filter data in `Route#includeWebsocketHandling` - * Callback in `Route#includeWebsocketHandling` is `suspend` since now + * Callback in `Route#includeWebsocketHandling` and dependent methods is `suspend` since now + * Add `URLProtocol` support in `Route#includeWebsocketHandling` and dependent methods ## 0.9.9 diff --git a/ktor/client/src/commonMain/kotlin/dev/inmo/micro_utils/ktor/client/FlowsWebsockets.kt b/ktor/client/src/commonMain/kotlin/dev/inmo/micro_utils/ktor/client/FlowsWebsockets.kt index 567d87e5b01..048c92dae3d 100644 --- a/ktor/client/src/commonMain/kotlin/dev/inmo/micro_utils/ktor/client/FlowsWebsockets.kt +++ b/ktor/client/src/commonMain/kotlin/dev/inmo/micro_utils/ktor/client/FlowsWebsockets.kt @@ -4,6 +4,7 @@ import dev.inmo.micro_utils.coroutines.safely import dev.inmo.micro_utils.ktor.common.* import io.ktor.client.HttpClient import io.ktor.client.features.websocket.ws +import io.ktor.client.request.HttpRequestBuilder import io.ktor.http.cio.websocket.Frame import io.ktor.http.cio.websocket.readBytes import kotlinx.coroutines.flow.Flow @@ -17,6 +18,7 @@ import kotlinx.serialization.DeserializationStrategy inline fun HttpClient.createStandardWebsocketFlow( url: String, crossinline checkReconnection: (Throwable?) -> Boolean = { true }, + noinline requestBuilder: HttpRequestBuilder.() -> Unit = {}, crossinline conversation: suspend (StandardKtorSerialInputData) -> T ): Flow { val correctedUrl = url.asCorrectWebSocketUrl @@ -26,7 +28,7 @@ inline fun HttpClient.createStandardWebsocketFlow( do { val reconnect = try { safely { - ws(correctedUrl) { + ws(correctedUrl, requestBuilder) { for (received in incoming) { when (received) { is Frame.Binary -> producerScope.send(conversation(received.readBytes())) @@ -65,10 +67,12 @@ inline fun HttpClient.createStandardWebsocketFlow( url: String, crossinline checkReconnection: (Throwable?) -> Boolean = { true }, deserializer: DeserializationStrategy, - serialFormat: StandardKtorSerialFormat = standardKtorSerialFormat + serialFormat: StandardKtorSerialFormat = standardKtorSerialFormat, + noinline requestBuilder: HttpRequestBuilder.() -> Unit = {}, ) = createStandardWebsocketFlow( url, - checkReconnection + checkReconnection, + requestBuilder ) { serialFormat.decodeDefault(deserializer, it) } diff --git a/ktor/client/src/commonMain/kotlin/dev/inmo/micro_utils/ktor/client/StandardHttpClientGetPost.kt b/ktor/client/src/commonMain/kotlin/dev/inmo/micro_utils/ktor/client/StandardHttpClientGetPost.kt index dc3d88a235f..c7922e312ac 100644 --- a/ktor/client/src/commonMain/kotlin/dev/inmo/micro_utils/ktor/client/StandardHttpClientGetPost.kt +++ b/ktor/client/src/commonMain/kotlin/dev/inmo/micro_utils/ktor/client/StandardHttpClientGetPost.kt @@ -86,13 +86,15 @@ class UnifiedRequester( fun createStandardWebsocketFlow( url: String, checkReconnection: (Throwable?) -> Boolean, - deserializer: DeserializationStrategy - ) = client.createStandardWebsocketFlow(url, checkReconnection, deserializer, serialFormat) + deserializer: DeserializationStrategy, + requestBuilder: HttpRequestBuilder.() -> Unit = {}, + ) = client.createStandardWebsocketFlow(url, checkReconnection, deserializer, serialFormat, requestBuilder) fun createStandardWebsocketFlow( url: String, - deserializer: DeserializationStrategy - ) = createStandardWebsocketFlow(url, { true }, deserializer) + deserializer: DeserializationStrategy, + requestBuilder: HttpRequestBuilder.() -> Unit = {}, + ) = createStandardWebsocketFlow(url, { true }, deserializer, requestBuilder) } val defaultRequester = UnifiedRequester() diff --git a/ktor/server/src/jvmMain/kotlin/dev/inmo/micro_utils/ktor/server/FlowsWebsocket.kt b/ktor/server/src/jvmMain/kotlin/dev/inmo/micro_utils/ktor/server/FlowsWebsocket.kt index 0a47a932fc4..01aaaf2952f 100644 --- a/ktor/server/src/jvmMain/kotlin/dev/inmo/micro_utils/ktor/server/FlowsWebsocket.kt +++ b/ktor/server/src/jvmMain/kotlin/dev/inmo/micro_utils/ktor/server/FlowsWebsocket.kt @@ -4,23 +4,24 @@ import dev.inmo.micro_utils.coroutines.safely 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.cio.websocket.* import io.ktor.routing.Route import io.ktor.routing.application -import io.ktor.websocket.WebSocketServerSession -import io.ktor.websocket.webSocket +import io.ktor.websocket.* import kotlinx.coroutines.flow.Flow import kotlinx.serialization.SerializationStrategy fun Route.includeWebsocketHandling( suburl: String, flow: Flow, + protocol: URLProtocol = URLProtocol.WS, converter: suspend WebSocketServerSession.(T) -> StandardKtorSerialInputData? ) { application.apply { featureOrNull(io.ktor.websocket.WebSockets) ?: install(io.ktor.websocket.WebSockets) } - webSocket(suburl) { + webSocket(suburl, protocol.name) { safely { flow.collect { converter(it) ?.let { data -> @@ -36,10 +37,12 @@ fun Route.includeWebsocketHandling( flow: Flow, serializer: SerializationStrategy, serialFormat: StandardKtorSerialFormat = standardKtorSerialFormat, + protocol: URLProtocol = URLProtocol.WS, filter: (suspend WebSocketServerSession.(T) -> Boolean)? = null ) = includeWebsocketHandling( suburl, flow, + protocol, converter = if (filter == null) { { serialFormat.encodeDefault(serializer, it) diff --git a/ktor/server/src/jvmMain/kotlin/dev/inmo/micro_utils/ktor/server/ServerRoutingShortcuts.kt b/ktor/server/src/jvmMain/kotlin/dev/inmo/micro_utils/ktor/server/ServerRoutingShortcuts.kt index eec3976f64e..f2c06bc5e52 100644 --- a/ktor/server/src/jvmMain/kotlin/dev/inmo/micro_utils/ktor/server/ServerRoutingShortcuts.kt +++ b/ktor/server/src/jvmMain/kotlin/dev/inmo/micro_utils/ktor/server/ServerRoutingShortcuts.kt @@ -5,8 +5,7 @@ import dev.inmo.micro_utils.coroutines.safely import dev.inmo.micro_utils.ktor.common.* import io.ktor.application.ApplicationCall import io.ktor.application.call -import io.ktor.http.ContentType -import io.ktor.http.HttpStatusCode +import io.ktor.http.* import io.ktor.http.content.PartData import io.ktor.http.content.forEachPart import io.ktor.request.receive @@ -32,8 +31,9 @@ class UnifiedRouter( suburl: String, flow: Flow, serializer: SerializationStrategy, + protocol: URLProtocol = URLProtocol.WS, filter: (suspend WebSocketServerSession.(T) -> Boolean)? = null - ) = includeWebsocketHandling(suburl, flow, serializer, serialFormat, filter) + ) = includeWebsocketHandling(suburl, flow, serializer, serialFormat, protocol, filter) suspend fun PipelineContext<*, ApplicationCall>.unianswer( answerSerializer: SerializationStrategy, From b29f37a2513479ed8dca31bf02905e4b79bb5024 Mon Sep 17 00:00:00 2001 From: InsanusMokrassar Date: Fri, 4 Mar 2022 20:20:17 +0600 Subject: [PATCH 5/6] update klock --- CHANGELOG.md | 2 ++ gradle.properties | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8799b74afa2..b6da15f1b28 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,8 @@ ## 0.9.10 +* `Versions`: + * `Klock`: `2.5.2` -> `2.5.3` * Ktor: * Client: * New function `UnifiedRequester#createStandardWebsocketFlow` without `checkReconnection` arg diff --git a/gradle.properties b/gradle.properties index 3d8807e8e4a..f34e11a73e9 100644 --- a/gradle.properties +++ b/gradle.properties @@ -14,7 +14,7 @@ kotlin_exposed_version=0.37.3 ktor_version=1.6.7 -klockVersion=2.5.2 +klockVersion=2.5.3 github_release_plugin_version=2.2.12 From aefaf4a8cccb8b72839f606effaf62a535e49156 Mon Sep 17 00:00:00 2001 From: InsanusMokrassar Date: Sun, 6 Mar 2022 16:07:56 +0600 Subject: [PATCH 6/6] update klock (again) --- CHANGELOG.md | 2 +- gradle.properties | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b6da15f1b28..f3fa7da9067 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,7 +3,7 @@ ## 0.9.10 * `Versions`: - * `Klock`: `2.5.2` -> `2.5.3` + * `Klock`: `2.5.2` -> `2.6.1` * Ktor: * Client: * New function `UnifiedRequester#createStandardWebsocketFlow` without `checkReconnection` arg diff --git a/gradle.properties b/gradle.properties index f34e11a73e9..70dce9a6f40 100644 --- a/gradle.properties +++ b/gradle.properties @@ -14,7 +14,7 @@ kotlin_exposed_version=0.37.3 ktor_version=1.6.7 -klockVersion=2.5.3 +klockVersion=2.6.1 github_release_plugin_version=2.2.12